OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript prototype まわりの備忘録

# JavasScript prototype まわりの備忘録

JavaScript を記述している際に, 他言語ではこうすればできるが JavaScript では? となったいくつかのこと.

`Object` や `prototype` について詳細なことが良くわかっていなのでご教授いただければと思います.

## 継承(みたいなもの)
以下のコードでは, `LocationMode` の関数が使用可能な `DisplayLocation` , `LO` を定義.

```JavaScript
// LocationModel が undefined の場合, || 演算子の右側が代入される.
var LocationModel = LocationModel || (function(){
  function LocationModel(x, y) {
    this.x = x;
    this.y = y;
  }
  return LocationModel;
}());
LocationModel.prototype.setX = function(x) {
  this.x = x;
  return this;
}
LocationModel.prototype.setY = function(y) {
  this.y = y;
  return this;
}


// 原点O
var LO = (function(){
  function LO() {
    LocationModel.call(this, 0, 0);
  }
  return LO;
}());
LO.prototype = Object.create(LocationModel.prototype);

// 表示位置
var DisplayLocation = DisplayLocation = (function(){
  function DisplayLocation(x, y) {
    LocationModel.call(this, x, y);
  }
  return DisplayLocation;
}());
DisplayLocation.prototype = Object.create(LocationModel.prototype);
```

## プロパティの定義 `Object.defineProperty`
`XMLHttpRequest.DONE` や `FileReader.DONE` と同じようにオブジェクト(以下の場合```LocationModel```)に対して, 新しいプロパティを定義する.
参考: [Object.defineProperty() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)
### 構文
```JavaScript
Object.defineProperty(obj, prop, descriptor)
```
### 例
```JavaScript
var LocationModel = LocationModel || (function(){
  function LocationModel(x, y) {
    this.x = x;
    this.y = y;
  }
  return LocationModel;
}());
Object.defineProperty(LocationModel, 'PROP', {
  value: 256,     // 設定する値
  writable: false // 変更不可

});
```


## 一方 TypeScript では
`TypeScript` で class を作り継承したコードを書き, `tsc` を通し生成したコードが以下の通り.
幾多の状況に対応できる `__extends` 関数を作り, 新しいオブジェクトを生成する際に即時関数の引数(`_super`)に継承元を与えている.

```javascript
var __extends = (this && this.__extends) || (function () {
  var extendStatics = function (d, b) {
    extendStatics = Object.setPrototypeOf ||
      ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
      function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return extendStatics(d, b);
  }
  return function (d, b) {
    extendStatics(d, b);
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  };
})();
var LocationModel = /** @class */ (function () {
  function LocationModel(x, y) {
    this.x = x;
    this.y = y;
  }
  LocationModel.prototype.setX = function (x) {
    this.x = x;
  };
  LocationModel.PROP = 256;
  return LocationModel;
}());
var LO = /** @class */ (function (_super) {
  __extends(LO, _super);
  function LO() {
    return _super.call(this, 0, 0) || this;
  }
  return LO;
}(LocationModel));
```
SVG形式のファイルがCSSで読み込めないとき

svg形式のファイルをcssで読み込んでも、表示されなくて困った。

## Content-Typeが怪しいので、httpリクエストを送信してヘッダを確認
※-k　ssl証明書のエラーを無視するよ

```
curl --head -k https://stg.*******
```

text/plainで返ってきている。
webサーバがsvg形式に対応できてないのかなと、想像。

```
HTTP/1.1 200 OK
Date: Fri, 09 Nov 2018 07:32:32 GMT
Server: Apache
Set-Cookie: Apache=******.1541748752550988; path=/; expires=Mon, 06-Nov-28 07:32:32 GMT
Last-Modified: Fri, 09 Nov 2018 06:48:36 GMT
ETag: "15769f-272-57a35bd93f900"
Accept-Ranges: bytes
Content-Length: 626
Vary: Accept-Encoding,User-Agent
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Origin: *
Content-Type: text/plain
```

## apacheのhttpd.confを修正
TypeとEncodingにsvgを追加する。

```
ssh ***
sudo su - 
cp /etc/httpd/conf/httpd.conf{,.20181109}
vim /etc/httpd/conf/httpd.conf
diff /etc/httpd/conf/httpd.conf{,.20181109}
140c140
< AddEncoding x-gzip gz tgz svgz
---
> AddEncoding x-gzip gz tgz
210d209
< AddType image/svg+xml svg svgz

service httpd configtest
service httpd restart
```

## 動作確認
```
curl --head -k https://****
```

Cointent-Type が image/svg+xmlになって、正常に表示された。

```

HTTP/1.1 200 OK
Date: Fri, 09 Nov 2018 07:32:32 GMT
Server: Apache
Set-Cookie: Apache=******.1541748752550988; path=/; expires=Mon, 06-Nov-28 07:32:32 GMT
Last-Modified: Fri, 09 Nov 2018 06:48:36 GMT
ETag: "15769f-272-57a35bd93f900"
Accept-Ranges: bytes
Content-Length: 626
Vary: Accept-Encoding,User-Agent
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Origin: *
Content-Type: image/svg+xml
```
Visual Studio code でHTML プレビュー


Visual Studio codeでHTMLをプレビューする機能を探したところ、[こちら](http://kukekko.hatenablog.com/entry/2016/10/30/000121)の記事を参考に[Live HTML Previewer](https://marketplace.visualstudio.com/items?itemName=hdg.live-html-previewer)を入れてみました。

インストールのサイトのUsageに記載されている「keybinding 'ctrl+q s'」だと何故か上手くプレビューが表示されず、、、 「or press 'F1' and type "Show side preview"」のほうでプレビュー表示されました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/232585/e040dbd1-3d82-5bc9-1f68-07af31a60a1d.png)
find_byとfindの違い

両者の何がどう違うのか曖昧だったので、忘備録として残します。
# findメソッド
主キー(ID)を使用して、特定のオブジェクトを検索する際に使用するメソッド。

↓例えば、`Spree::Taxon`モデルの中から`id=1`のオブジェクトを検索したい時

```find_method_example.rb
 pry(main)> test = Spree::Taxon.find(1)
  Spree::Taxon Load (0.4ms)  SELECT  `spree_taxons`.* FROM `spree_taxons` WHERE `spree_taxons`.`id` = 1 LIMIT 1
=> #<Spree::Taxon:0x00007fbaa17a7d68
 id: 1,
 parent_id: nil,
 position: 0,
 (中略)
 meta_keywords: nil,
 depth: 0>
```

↓同時に複数のレコードを検索をすることも可能です。

```find_method_example2.rb
pry(main)> test = Spree::Taxon.find(1,2) もしくは find([1,2])
  Spree::Taxon Load (0.4ms)  SELECT `spree_taxons`.* FROM `spree_taxons` WHERE `spree_taxons`.`id` IN (1, 2)
=> [#<Spree::Taxon:0x00007fbaa17c6358
  id: 1,
  parent_id: nil,
  (中略)
  meta_keywords: nil,
  depth: 0>,

 #<Spree::Taxon:0x00007fbaa17c6218
  id: 2,
  parent_id: nil,
  (中略)
  meta_keywords: nil,
  depth: 0>]
```

↓マッチするレコードが見当たらない場合、**例外**が発生します。
この例では`9999`という`id`は存在しないので`ActiveRecord::RecordNotFound`が発生します。

```find_method_example3.rb
pry(main)> test3 = Spree::Taxon.find(1,2,9999)
Spree::Taxon Load (0.5ms)  SELECT `spree_taxons`.* FROM `spree_taxons` WHERE `spree_taxons`.`id` IN (1, 2, 9999)
ActiveRecord::RecordNotFound: Couldn't find all Spree::Taxons with 'id': (1, 2, 9999) (found 2 results, but was looking for 3).
```

# find_byメソッド

検索したい条件に合うレコードから**最初に一致した１件**だけを拾ってきます。

↓例えば、`Spree::Product`モデルの中から、`promotionable: true`の条件に当てはまるオブジェクトを探す時。

```find_by_method_example.rb
pry(main)> test = Spree::Product.find_by(promotionable: true)
Spree::Product Load (0.4ms)  SELECT  `spree_products`.* FROM `spree_products` WHERE `spree_products`.`deleted_at` IS NULL AND `spree_products`.`promotionable` = TRUE LIMIT 1
=> #<Spree::Product:0x00007fbaa4008398
 id: 1,
 name: "Ruby on Rails Tote",
 (中略)
 promotionable: true,
 meta_title: nil>
```
  
↓マッチするレコードが見当たらない場合、**nil**が返ってきます。 

```find_by_method_example2.rb
pry(main)> test = Spree::Product.find_by(promotionable: false)
Spree::Product Load (0.4ms)  SELECT  `spree_products`.* FROM `spree_products` WHERE `spree_products`.`deleted_at` IS NULL AND `spree_products`.`promotionable` = FALSE LIMIT 1
=> nil
```

↓マッチするレコードが見当たらない場合で、**例外を発生させたい時**は`find_by!`で検索

```find_by_method_example3.rb
pry(main)> test = Spree::Product.find_by!(promotionable: false)
  Spree::Product Load (0.4ms)  SELECT  `spree_products`.* FROM `spree_products` WHERE `spree_products`.`deleted_at` IS NULL AND `spree_products`.`promotionable` = FALSE LIMIT 1
ActiveRecord::RecordNotFound: Couldn't find Spree::Product
```

## 使用区別
IDがわかっている場合は、`find`メソッド
IDが不明で、別の条件でレコード検索をしたい場合は、`find_by`メソッド


---

###### 参考
[RAILS GUIDES](https://railsguides.jp/active_record_querying.html)
Gitの履歴からパスワードなどを置き換える方法

Gitでパスワードなどが書かれたファイルをコミットしてしまった時に履歴の当該箇所を置き換えるには以下の例のようにコマンドを打てばいいです。今までの全てのコミットのパスワードなどの文字列を置き換えることができます。

```
git filter-branch --tree-filter "find . -type f -exec sed -i '' -e 's/password/置き換えたい文字列/g' -i '' -e 's/root_password/置き換えたい文字列/g' {} \;"
```

なお、この例の場合、複数の文字列を置き換えていますが、条件指定する時に`-i  -e`を毎回付けないといけないので注意してください。
私はこれに気づかず、何故か古い履歴の文字列が置き換えられてない現象に見舞われて半年くらい放置してました。

ちなみに私は、それまでGitHubでプライベートリポジトリだったものをパブリックにするために履歴にあるセキュリティに関わる情報は全て削除する必要があったのでこれをしました。

参考：http://blog.livedoor.jp/sasata299/archives/52053534.html
【Java】問題No.2

## 問題2
* プリミティブ型と参照型の違いは何でしょうか？

## 解答2

#### プリミティブ型  

* メモリ空間に実際の値が格納されています。  
プリミティブ型は型自体にサイズを持っています。  
そのため、int型で1桁を表すのに1桁分のサイズを持つというわけではありません。  
たとえば、int型の場合、実際の表現は下記の通りとなります。  
　整数値10の場合  
　00000000000000000000000000001010  
簡単に言うと、プリミティブ型は型によって、サイズ(=bit数)が定まっている。  
ということになります。  

#### 参照型

* メモリ空間に実際の値が保存されているのではなく、  
値が格納されているアドレス値が保存されている。
Let's 爆速 SQL Server Management Studio

##SSMSBooster
この記事はSSMSBoostというSSMSの拡張を紹介するための記事です。

[SSMSBoostはこちら](http://www.ssmsboost.com/)

１、まずはインストールしましょう

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/243544/8285c559-01f2-6f29-9556-9b4f82555564.png)

２、インストーラーの使い方は割愛

３、インストールするとSSMSにSSMSBoostというタブが増えます。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/243544/55c9d457-6390-9358-1cb4-ba8ddf524ade.png)

##LicenseのActivate
SSMSBoostはしばらくライセンス登録しなくても使えますが、しばらく経つと認証が必要になります。
以下はライセンス登録のための手順です。

１、SSMSBoost tab>About/License
２、select Activate/Re-Activate
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/243544/b7ff1877-f128-e4e0-c21c-51d3bb2f4e5b.png)

３、以下を入力(選択)
  ・Community
  ・First/Last Name
  ・E-Mail
４、Activateを選択

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/243544/d0f2502a-a023-4d22-119f-b309656480ac.png)

５、メールでKeyが届くので入力して下段のActivate

６、Let's　爆速SSMS!!!

##オススメ
SSMSのインストールが完了した時点で、様々な恩恵があるのですが、個人的なオススメは下記です。
(詳細な設定の仕方については上記のSSMSBoostに掲載されているので割愛します。)
・Autoreplacement(デフォルト設定)
・Preferred connections: "remember" favorite servers/databases
・Connection Coloring
・Important Database alert
・Auto-connect to databases at startup
・Auto-open new query window(s) at startup

このあたりの設定を行えば汎用的にSSMSが使いやすくなること間違いなし！

#Let's爆速SSMS生活！！！！
MacのVMWare Fusion 8でWindowsのログイン画面から進めなくなった

MacにてVMWare Fusion 8を使用していたのですが、久しぶりに立ち上げたらログイン画面が触れない！

メニューからCtrl+Alt+Deleteを送るとかは出来るし、ログイン画面に表示されている時刻も正常なので、
何か壊れたわけではなさそうなのに・・・

いろいろ調べていたところ、どうやらMacのOSがMojaveになったことが原因らしいことを突き止めました

その原因の解決策は・・・


VMWare Fusion 11 にアップグレードすること


7000円弱の追加投資です

仕方なくFusion 11のアップグレードを購入しインストールしたところ無事解決しました
Outlook for Macに渡すプリントプラグイン（特にeFax用）

OSXの標準印刷ダイアログには「"メール"で送信」という機能があり，これを使うと，PDFが添付されたメールが作成されます。
しかし，筆者はOutlook for Macを常用しており，標準の「"メール"で送信」は使えません。
そこで，Automatorを使って，Outlook版「"メール"で送信」を行う「プリントプラグイン」を作りました。

<details><summary>といいつつ，筆者にとって「"メール"で送信」が必要なのは，主にPDFの一部ページをeFaxで送信する場合です。</summary>たとえば，複数ページのPDFに対し，先頭ページに受領印（スタンプ）を押して先頭ページのみ返信するといった使い方です。
eFaxは，メールにPDFを添付してFAXを送受信するインターネットFAXサービスで，FAXを送信する場合は「81«FAX番号»@efaxsend.com」というアドレス（ただし«FAX番号»は冒頭の0を除外）にメールを送信することになります。</details>
そこで，単に添付ファイルとして渡すだけではなく，ダイアログでFAX番号の入力を求め，eFax送信用のアドレスをto欄に記載した状態で，新規メールを生成するようにしました。
#要件定義
- Outlook for Mac の操作にはAppleScriptを使う。
  - 現バージョンには専用のAutomatorアクションが無いため。
- メールの下書き作成にとどめ，送信は手動で行うことにする。
- 送信先のFAX番号の入力をダイアログで求め，送信先メールアドレスを生成する。
  - 桁数だけ見て，入力チェック等は行わない。（作成者の怠慢）
  - 番号を入力しない場合は，to空欄のメール下書きを生成する。

#内容
「AppleScriptを実行」アクションのみでできています。

```AppleScript:アクション「AppleScriptを実行」
on run {input, parameters}
	set InputPDFs to input
	set FAXnumber to text returned of (display dialog "FAX番号(ハイフンなし)" default answer "")
	tell application "Microsoft Outlook"
		set newMessage to make new outgoing message
		if length of FAXnumber > 9 then
			set efaxAddress to {email address:{name:"FAX" & FAXnumber, address:"81" & (text 2 thru -1 of FAXnumber) & "@efaxsend.com"}}
			make new to recipient at newMessage with properties {efaxAddress}
		end if
		tell newMessage
			repeat with aPDF in InputPDFs
				make new attachment with properties {file:aPDF}
			end repeat
		end tell
		open newMessage
		get newMessage
	end tell
	return input
end run

```
TravisCIで暗号化した環境変数を複数使用する場合

## TravisCIに環境変数を渡す
```:.travis.yml
env:
  global:
    - DB_PASSWORD='hogehoge'
```
## 暗号化したい場合

まずは、`travis`コマンドを実行できるようにgemをインスコ。

```
$ gem install travis
```

環境変数`DB_PASSWORD`を暗号化する。

```
$ travis encrypt DB_PASSWORD='hogehoge'
```

```:実行結果

Please add the following to your .travis.yml file:

  secure: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..."

Pro Tip: You can add it automatically by running with --add.
```
となるので

```:.travis.yml
env:
  global:
    -  secure: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..."
```

※ `--add`オプションを用いて暗号化すると、自動的に.travis.ymlに書き込んでくれるのおすすめ。

```
$ travis encrypt DB_PASSWORD='hogehoge' --add
```

と書き換える。

### 複数の暗号化環境変数を.travis.ymlに渡す場合。

中に複数の環境変数を用いる。

まずは、`.env`ファイルを用意する。

```:.env
DB_USERNAME=hoge
DB_PASSWORD=hogehoge
```
みたいなかんじで作成すると、

以下のコマンドで、`.env`に記述されているファイル全ての環境変数を暗号化

```
$ cat .env | travis encrypt --split
```

```

Please add the following to your .travis.yml file:

  secure: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..."
  secure: "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy..."

Pro Tip: You can add it automatically by running with --add.

```

となっていれば成功。

## 参考文献
- https://github.com/travis-ci/travis.rb#encrypt
- [TravisCIで環境変数を使いたい場合](https://qiita.com/ohsawa0515/items/e45c5935a20c3b3053f8)
- https://docs.travis-ci.com/user/encryption-keys
- https://docs.travis-ci.com/user/environment-variables
Laravel Featureテスト POST時のリクエストやセッション

Featureテスト時にハマったので備忘。


```php

post('POST先のURL','header','token')
```

POSTする先にリクエストとして配列を渡すときは第2引数として渡す。
tokenは`csrf_token()`で作成して渡す。


sessionに追加したいときは、メソッドチェーンで渡す。

```php
$this->withSession('配列')
```

繋げたらこんな感じ

```php
$this->withSession('配列')
     ->post('POST先のURL','header',$token)
     ->assertStatus(302);
```
VBでSFTP接続しファイルアップロードする方法

# VBでSFTP接続しファイルアップロードする方法

VBでは標準の機能ではSFTP接続できないようです。(FTPSならできるようですが)
ライブラリを使用してSFTP接続し処理を行います。

今回使ったライブラリは以下です。
https://www.componentpro.com/products/sftp

## Example

```.vb
Imports System.IO
Imports ComponentPro.IO
Imports ComponentPro.Net

Module Module1

    Sub Main()

        ' Create a new class instance. 
        Dim client As New Sftp()

        ' Connect to the SFTP server.
        client.Connect("XXX.XXX.XXX.XXX", 22)

        ' Authenticate user with a private key.
        client.Authenticate("USER_NAME", "C:\private.key", "password")

        ' Do something here...
        Dim fi As New FileStream("C:\image.jpg", FileMode.Open)
        client.UploadFile(fi, "/img/image.jpg")

        'Disconnect
        fi.Close()
        client.Disconnect()

    End Sub

End Module
```
相関行列


# 相関行列

<a href="https://qiita.com/maskot1977/items/453eddf5aa154c04668c">「新国民生活指標データ」</a>を例に説明します。


```python
# 数値計算やデータフレーム操作に関するライブラリをインポートする
import numpy as np
import pandas as pd
from pandas.tools import plotting # 高度なプロットを行うツールのインポート
```


```python
# 「#」（シャープ）以降の文字はプログラムに影響しません。
# 図やグラフを図示するためのライブラリをインポートする。
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
%matplotlib inline
```


```python
# URL によるリソースへのアクセスを提供するライブラリをインポートする。
# import urllib # Python 2 の場合
import urllib.request # Python 3 の場合
```


```python
url = 'https://raw.githubusercontent.com/maskot1977/ipython_notebook/master/toydata/PLIlive_dataJ.txt'
# 指定したURLからリソースをダウンロードし、名前をつける。
# urllib.urlretrieve(url, 'PLIlive_dataJ.txt') # Python 2 の場合
urllib.request.urlretrieve(url, 'PLIlive_dataJ.txt') # Python 3 の場合
```


```python
# データの読み込み
df = pd.read_csv('PLIlive_dataJ.txt', sep='\t', index_col=0) 
```


```python
df
```


```python
df.T
```


```python
# 相関行列
df.corr()
```


```python
corrcoef = df.corr()
fig = plt.figure(figsize=(12, 10))
plt.imshow(corrcoef, interpolation='nearest', cmap=plt.cm.coolwarm)
plt.colorbar()
tick_marks = np.arange(len(corrcoef))
plt.xticks(tick_marks, corrcoef.index, rotation=90)
plt.yticks(tick_marks, corrcoef.index)
plt.tight_layout()
```


```python
# 相関行列
df.T.corr()
```


```python
corrcoef = df.T.corr()
plt.figure(figsize=(12, 10))
plt.imshow(corrcoef, interpolation='nearest', cmap=plt.cm.coolwarm)
plt.colorbar()
tick_marks = np.arange(len(corrcoef))
plt.xticks(tick_marks, corrcoef.columns, rotation=90)
plt.yticks(tick_marks, corrcoef.columns)
plt.tight_layout()
```
散布図行列


# 散布図行列

<a href="https://qiita.com/maskot1977/items/453eddf5aa154c04668c">「スポーツテストデータ」</a>を例に説明します。


```python
# データフレーム操作に関するライブラリをインポートする
import pandas as pd
from pandas.tools import plotting # 高度なプロットを行うツールのインポート
```


```python
# 「#」（シャープ）以降の文字はプログラムに影響しません。
# 図やグラフを図示するためのライブラリをインポートする。
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
%matplotlib inline
```


```python
# URL によるリソースへのアクセスを提供するライブラリをインポートする。
# import urllib # Python 2 の場合
import urllib.request # Python 3 の場合
```


```python
# ウェブ上のリソースを指定する
url = 'https://raw.githubusercontent.com/maskot1977/ipython_notebook/master/toydata/sports_dataJt.txt'
# 指定したURLからリソースをダウンロードし、名前をつける。
# urllib.urlretrieve(url, 'sports_dataJt.txt') # Python 2 の場合
urllib.request.urlretrieve(url, 'sports_dataJt.txt') # Python 3 の場合
```


```python
# データの読み込み
df = pd.read_csv('sports_dataJt.txt', sep='\t', index_col=0) 
```


```python
df
```


```python
df.columns[4:14]
```


```python
# 散布図行列（左側の４列だけ）
plotting.scatter_matrix(df.dropna(axis=1)[df.columns[0:4]], figsize=(8, 8)) 
plt.show()
```


```python
# 散布図行列
plotting.scatter_matrix(df.dropna(axis=1)[df.columns[:]], figsize=(20, 20)) 
plt.show()
```
散布図


# 散布図

<a href="https://qiita.com/maskot1977/items/453eddf5aa154c04668c">「合州国の州別暴力犯罪率」</a>を例に説明します。


```python
# 「#」（シャープ）以降の文字はプログラムに影響しません。
# 図やグラフを図示するためのライブラリをインポートする。
import matplotlib.pyplot as plt
%matplotlib inline
```


```python
# データフレーム操作に関するライブラリをインポートする
import pandas as pd
from pandas.tools import plotting # 高度なプロットを行うツールのインポート
```


```python
# URL によるリソースへのアクセスを提供するライブラリをインポートする。
# import urllib # Python 2 の場合
import urllib.request # Python 3 の場合
```


```python
df2 = pd.read_csv('USArrests.txt', sep='\t', index_col=0) # データの読み込み
```


```python
df2
```


```python
# 散布図を描く
df2.plot(kind='scatter', x=df2.columns[2], y=df2.columns[0], grid=True)
```


```python
# 丸のサイズと色に意味をもたせた散布図を描く
df2.plot(kind='scatter', x=df2.columns[2], y=df2.columns[0], grid=True, c=df2.iloc[:, 3], cmap='coolwarm', 
         s=df2.iloc[:, 1], alpha=0.5)
```


```python
# 丸のサイズと色に意味をもたせた散布図を描く（別法）

names, name_label = df2.dropna().index, "States"
x_axis, x_label = df2.dropna()["UrbanPop"], "UrbanPop"
y_axis, y_label = df2.dropna()["Murder"], "Murder"
sizes, size_label = df2.dropna()["Assault"], "Assault" 
colors, color_label = df2.dropna()["Rape"], "Rape"

plt.figure(figsize=(15, 10))
for x, y, name in zip(x_axis, y_axis, names):
    plt.text(x, y, name, alpha=0.8, size=12)
plt.scatter(x_axis, y_axis, s=sizes, c=colors, alpha=0.5, cmap='coolwarm')
plt.colorbar(alpha=0.8)
plt.title("x=%s, y=%s, size=%s, color=%s" % (x_label, y_label, size_label, color_label))
plt.xlabel(x_label, size=12)
plt.ylabel(y_label, size=12)
plt.grid()
plt.show()
```
pythonで複数変数のフォーマット関数を用いる.

pythonでformat関数を用いたいときってありますよね？

あれ, 複数個の変数を挿入したいなと思いちょっと引っかかったのでメモメモ.

## 1つの変数をformat関数で挿入

i = 1~5 として, 
result_ i _(iの番号) と出力したいとき...

```python
for i in range(1, 6):
    print("result_in_ i _{0:d}" .format(i))
```

とすると, 

```python
result_in_ i _1
result_in_ i _2
result_in_ i _3
result_in_ i _4
result_in_ i _5
```

と出力されます.
""内の文字列は変えられない><と考えていたので, 非常に便利な機能です.


## 複数の変数をformat関数で挿入

例えば, 繰り返しで i = 1~5,  j = 1~5 として,  
result_ (iの番号)_(jの番号) としたいとき...

```python
for i in range(1, 6):
    for j in range(1, 6):
        print("result_{0:d}_ {1:d}" .format(i, j))
```
とすることで, 

```python
result_1_ 1
result_1_ 2
result_1_ 3
result_1_ 4
result_1_ 5
result_2_ 1
result_2_ 2
result_2_ 3
result_2_ 4
result_2_ 5
result_3_ 1
result_3_ 2
result_3_ 3
result_3_ 4
result_3_ 5
result_4_ 1
result_4_ 2
result_4_ 3
result_4_ 4
result_4_ 5
result_5_ 1
result_5_ 2
result_5_ 3
result_5_ 4
result_5_ 5
```
となります.

当たり前じゃねーか！って話になりそうですので躓いた点を以下に示します.

## 躓いた点

print("result_{0:d}_ {1:d}" .format(i, j))

の際の{**0** : d}は, フォーマット変数(i), つまり0番目の変数に対応してるわけです.

つまり, jに対応させるためには, {**1** : d} にしなければならないということです.

自分は{0:d}の0は固定というか, なんでもないものと勘違いしていました.

要は様々なことの意味を理解することの大切さを感じました！

簡単ですが, おわり！
ボックスプロットとバイオリンプロット


# ボックスプロットとバイオリンプロット

ボックスプロットとは何か？知らない人は右記参照→ http://excelshogikan.com/qc/qc03/boxplot.html

<a href="https://qiita.com/maskot1977/items/453eddf5aa154c04668c">「あやめのデータ」</a>を例に説明します。


```python
# 「#」（シャープ）以降の文字はプログラムに影響しません。
# 図やグラフを図示するためのライブラリをインポートする。
import matplotlib.pyplot as plt
%matplotlib inline
```


```python
# データフレーム操作に関するライブラリをインポートする
import pandas as pd
from pandas.tools import plotting # 高度なプロットを行うツールのインポート
```


```python
# URL によるリソースへのアクセスを提供するライブラリをインポートする。
# import urllib # Python 2 の場合
import urllib.request # Python 3 の場合
```


```python
# ウェブ上のリソースを指定する
url = 'https://raw.githubusercontent.com/maskot1977/ipython_notebook/master/toydata/iris.txt'
# 指定したURLからリソースをダウンロードし、名前をつける。
# urllib.urlretrieve(url, 'iris.txt') # Python 2 の場合
urllib.request.urlretrieve(url, 'iris.txt') # Python 3 の場合
```


```python
# データの読み込み
df1 = pd.read_csv('iris.txt', sep='\t', index_col=0) 
```


```python
df1
```


```python
# ボックスプロット（箱ひげ図）を作成する
df1.boxplot()
```


```python
# ボックスプロットの描き方（別法）
fig = plt.figure()
ax = fig.add_subplot(111)
ax.boxplot(df1.iloc[:, 0:4].as_matrix().T.tolist())
ax.set_xticklabels(df1.columns[0:4], rotation=90)
plt.grid()
plt.show()
```


```python
# バイオリンプロット
fig = plt.figure()
ax = fig.add_subplot(111)
ax.violinplot(df1.iloc[:, 0:4].as_matrix().T.tolist())
ax.set_xticks([1, 2, 3, 4]) #データ範囲のどこに目盛りが入るかを指定する
ax.set_xticklabels(df1.columns[0:4], rotation=90)
plt.grid()
plt.show()
```
Visual Studio CodeでPHPのリモートデバッグ環境を構築する

この記事は以下の条件に当てはまる人向けに書いています。

- VSCodeでPHPのステップ実行がしたい
- 開発環境が共用のリモートサーバーである
- リモートのWebサーバーはApacheだ
- リモートにXDebugがインストールされている
- リモートのApacheをバーチャルホスト運用している

# サーバー側の設定

自分が使っているバーチャルホスト用の設定ファイルに以下を追加する。

```conf
php_value session.auto_start 0
php_value xdebug.remote_autostart 1
php_value xdebug.remote_host none
php_value xdebug.remote_connect_back 1
php_value xdebug.remote_port 9009
```

`remote_host none` `remote_connect_back 1` の部分がポイント。
これを設定することで、ローカル→リモート→リモート→ローカル、という具合に接続を返してくれる。

Apacheを再起動して設定を反映させる。
念のため`phpinfo()`で確認すると良いかも。

# ローカル側の設定

## 拡張機能のインストール

PHP Debugをインストールする。`php debug`で一番上に出てきます。
<img width="448" alt="スクリーンショット 2018-11-09 14.39.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/54083/44d73d78-5f23-ba49-ba53-3badd5a124b6.png">

## デバッグ設定の追加

メニューから `デバッグ` -> `構成を追加` で `PHP`を選択する。
<img width="302" alt="スクリーンショット 2018-11-09 15.01.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/54083/f6cfaeb2-dc92-8e34-33d3-18b2fff98704.png">
<img width="508" alt="スクリーンショット 2018-11-09 14.56.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/54083/7ffbeb1e-f256-0eec-81c1-9a8ccfec25f8.png">

デフォルトで`Listen for XDebug`と`Launch currently open script`の2種類が設定されているのでXDebugの方をいじる。

```json:launch.json
{
	"name": "Listen for XDebug",
	"type": "php",
	"request": "launch",
	"port": 9002,
	"pathMappings": {
		"/home/foo/bar": "${workspaceRoot}"
	}
},
...
```

`pathMappings`のキーに、ローカルのワークスペースに対応するリモート側のディレクトリを指定する。

# 使い方

`F5`でデバッグ開始。
適当なところにブレークポイントを置いて該当ページにアクセスしてみよう。
<img width="166" alt="スクリーンショット 2018-11-09 15.16.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/54083/d95745e8-7689-d8a6-743d-6707120f45fb.png">

おしまい。

以下の記事を参考にさせていただきました。
https://qiita.com/takudo/items/35d2fd3c6e9846715bf4
2018年まとめ（未完成）

#出来事
###永住権2回目申請成功(2017/11/17-2018/10/8)
- ７月に高級人材である書類追加しまいた。

###長男は小学校に入る

###長女は幼稚園に入る

###マイホーム購入

#技術の成長
###blog開始

###github

###java

###android



#子供教育

###勉強の習慣

次は勉強の楽しさ
ヒストグラム


# ヒストグラム

<a href="https://qiita.com/maskot1977/items/453eddf5aa154c04668c">「好きなアイスクリームアンケート」</a>を例に説明します。


```python
# 「#」（シャープ）以降の文字はプログラムに影響しません。
# 図やグラフを図示するためのライブラリをインポートする。
import matplotlib.pyplot as plt
%matplotlib inline
```


```python
# データフレーム操作に関するライブラリをインポートする
import pandas as pd
from pandas.tools import plotting # 高度なプロットを行うツールのインポート
```


```python
# URL によるリソースへのアクセスを提供するライブラリをインポートする。
# import urllib # Python 2 の場合
import urllib.request # Python 3 の場合
```


```python
# ウェブ上のリソースを指定する
url = 'https://raw.githubusercontent.com/maskot1977/ipython_notebook/master/toydata/icecream_chosa.txt'
# 指定したURLからリソースをダウンロードし、名前をつける。
# urllib.urlretrieve(url, 'icecream_chosa.txt') # Python 2 の場合
urllib.request.urlretrieve(url, 'icecream_chosa.txt') # Python 3 の場合
```


```python
# データの読み込み
df1 = pd.read_csv('icecream_chosa.txt', sep=' ', index_col=0) 
```


```python
df1
```


```python
# ヒストグラムを作成する
df1.dropna(axis=1).hist(figsize=(20,20))
```


```python
# 左側４列を除外してヒストグラムを作成する
df1.dropna(axis=1).iloc[:, 4:-1].hist(figsize=(20,20))
```
折れ線グラフ


# 折れ線グラフ

<a href="https://qiita.com/maskot1977/items/453eddf5aa154c04668c">「ニューヨークの大気状態観測値」</a>を例に説明します。


```python
# 「#」（シャープ）以降の文字はプログラムに影響しません。
# 図やグラフを図示するためのライブラリをインポートする。
import matplotlib.pyplot as plt
%matplotlib inline
```


```python
# データフレーム操作に関するライブラリをインポートする
import pandas as pd
from pandas.tools import plotting # 高度なプロットを行うツールのインポート
```


```python
# URL によるリソースへのアクセスを提供するライブラリをインポートする。
# import urllib # Python 2 の場合
import urllib.request # Python 3 の場合
```


```python
# ウェブ上のリソースを指定する
url = 'https://raw.githubusercontent.com/maskot1977/ipython_notebook/master/toydata/airquality.txt'
# 指定したURLからリソースをダウンロードし、名前をつける。
# urllib.urlretrieve(url, 'airquality.txt') # Python 2 の場合
urllib.request.urlretrieve(url, 'airquality.txt') # Python 3 の場合
```


```python
# データの読み込み
df1 = pd.read_csv('airquality.txt', sep='\t', index_col=0) 
```


```python
df1
```


```python
# 折れ線グラフを作成する
df1.plot()
```


```python
# 左側４列だけを用いて折れ線グラフを作成する
df1.iloc[:, 0:4].plot()
```


```python
# 折れ線グラフの描き方（別法）
plt.figure(figsize=(8, 8))

plt.subplot(4, 1, 1)
plt.plot(df1.iloc[:, 0])
plt.xticks([])
plt.ylabel(df1.columns[0])

plt.subplot(4, 1, 2)
plt.plot(df1.iloc[:, 1])
plt.xticks([])
plt.ylabel(df1.columns[1])

plt.subplot(4, 1, 3)
plt.plot(df1.iloc[:, 2])
plt.xticks([])
plt.ylabel(df1.columns[2])

plt.subplot(4, 1, 4)
plt.plot(df1.iloc[:, 3])
plt.xticks(rotation=90)
plt.ylabel(df1.columns[3])
```
Pandas を用いた演算


# Pandas を用いた演算


```python
# データフレーム操作に関するライブラリをインポートする
import pandas as pd
```

## まずは Pandas の基本操作から


```python
df = pd.DataFrame([[100, -20, -60, -20, 100, 300, 580, 940, 1380, 1900],
 [92, -24, -60, -16, 108, 312, 596, 960, 1404, 1928],
 [84, -28, -60, -12, 116, 324, 612, 980, 1428, 1956],
 [77, -31, -59, -7, 125, 337, 629, 1001, 1453, 1985],
 [70, -34, -58, -2, 134, 350, 646, 1022, 1478, 2014],
 [62, -38, -58, 2, 142, 362, 662, 1042, 1502, 2042],
 [56, -40, -56, 8, 152, 376, 680, 1064, 1528, 2072],
 [49, -43, -55, 13, 161, 389, 697, 1085, 1553, 2101],
 [42, -46, -54, 18, 170, 402, 714, 1106, 1578, 2130],
 [36, -48, -52, 24, 180, 416, 732, 1128, 1604, 2160],
 [30, -50, -50, 30, 190, 430, 750, 1150, 1630, 2190],
 [24, -52, -48, 36, 200, 444, 768, 1172, 1656, 2220],
 [18, -54, -46, 42, 210, 458, 786, 1194, 1682, 2250],
 [13, -55, -43, 49, 221, 473, 805, 1217, 1709, 2281],
 [8, -56, -40, 56, 232, 488, 824, 1240, 1736, 2312],
 [2, -58, -38, 62, 242, 502, 842, 1262, 1762, 2342],
 [-2, -58, -34, 70, 254, 518, 862, 1286, 1790, 2374],
 [-7, -59, -31, 77, 265, 533, 881, 1309, 1817, 2405],
 [-12, -60, -28, 84, 276, 548, 900, 1332, 1844, 2436],
 [-16, -60, -24, 92, 288, 564, 920, 1356, 1872, 2468]],
                   index = list("abcdefghijklmnopqrst"),
                   columns = list("ABCDEFGHIJ"))
```


```python
df #データの中身を確認
```


```python
df.head() #最初の数レコードだけ確認
```


```python
df.iloc[10:20, 5:9] # 指定した行、指定した列だけ抜き出す
```


```python
df.iloc[:, 5:] # 指定した行、指定した列だけ抜き出す
```


```python
df.iloc[[1, 3, 5, 7, 9], [2, 4, 6, 8]] # 指定した行、指定した列だけ抜き出す
```


```python
df.T # 転置
```


```python
df.iloc[[1, 3, 5, 7, 9], [2, 4, 6, 8]].T # 指定した行・列だけ抜き出してから転置
```


```python
df.T.iloc[[1, 3, 5, 7, 9], [2, 4, 6, 8]] #　転置してから指定した行・列だけ抜き出す
```

## 簡単な統計量


```python
# 基本統計量の表示
df.describe()
```


```python
# 基本統計量の表示
df.T.describe()
```

## 行列の正規化（標準化）

正規化 (normalize) とは、異なる基準のデータを一定の基準にしたがって変形し利用しやすくすることです。


```python
# 一般的には平均 0 、分散 (及び標準偏差) が 1 になるように値を変換することを指します。
# axis=1 とすれば、列ではなく行単位で正規化します。
df.apply(lambda x: (x-x.mean())/x.std(), axis=0)
```


```python
# 最大値を1、最小値を0にするような正規化もできます。
# axis=1 とすれば、列ではなく行単位で正規化します。
df.apply(lambda x: (x-x.min())/(x.max() - x.min()), axis=0)
```


```python
# 合計値が１になるような正規化もできます。
# axis=1 とすれば、列ではなく行単位で正規化します。
df.apply(lambda x: x/x.sum(), axis=0)
```

## 相関行列

相関行列とは、各要素間の相関係数を並べたものであり、その性質から必ず対称行列である。


```python
df.corr()
```


```python
df.T.corr()
```

## ある条件でレコードをクラス分けする


```python
df['D'] < 30 # ある条件
```


```python
df[df['D'] < 30] # ある条件を満たす行だけ抜き出す
```


```python
# classという名の列を作り、ある基準を満たしていれば 1 を、そうでなければ 0 を入れる
df['class'] = [1 if i < 30 else 0 for i in df['D'].tolist()]
```


```python
df #データの中身を確認
```
Python ウォーミングアップ

「Pythonウォーミングアップ」は新しい記事を書いたので今後は <a href="https://qiita.com/maskot1977/items/0e01439e4f58fb49a4a7">こちら</a> を使ってください。

## Python ウォーミングアップ
まずはPythonで簡単な計算をしてみましょう。各自の画面中の IPython Notebook のセルに順次入力して（コピペ可）、「Shift + Enter」してください。

シャープ # を付けるとコメントと見なされ、それ以降の文字はPythonプログラムに無視されます。


```python
# 簡単な足し算をする
1 + 2
```


```python
# 数字を変数に代入する
a = 4
b = 5
```


```python
# 代入した変数同士の掛け算
a * b
```


```python
# 「リスト」というデータ構造に「data1」という名前をつけ、数字の組を代入する
data1 = [1, 2, 3, 4, 5]
```


```python
# data1 の中身を確認する
print(data1)
```

ここから先のプログラムでは、インデント（文頭の空白文字）や、文末の「:」（コロン）などを正しく記述しないと、思った通りの動作をしなくなります。注意して使ってください。


```python
# 「for文」を使って、リストの中身を１個１個取り出し、２倍して返す。
for n in data1:
    print(n * 2)
```


```python
# 上と同じことをする関数を定義する
def double(list):
    for n in list:
        print(n * 2)
```


```python
# 作った関数を呼び出して実行する。
double(data1)
```
CakePHP3のマイグレーションでMySQLのmediumtext型カラムを作る

# CakePHP3のマイグレーションでMySQLのmediumtext型のカラムを作る
どうやって書くんだとちょっと調べたのでメモです。

## 普通には書けない
```sample.php
// エラーになる
$table = $this->table('hogehoge');
$table->addColumn('column_name', 'medium_text', [
    'null' => false,
]);
```

どうやら`text`でないといけない様子。
ならどう書けばいいのか…？

[Cookbookに載ってました](https://book.cakephp.org/3.0/ja/phinx/migrations.html#mysql-limit)

## Limitオプション
どうやら`Limitオプション`を使うといけるらしいです。
具体的な書き方は

```sample.php
// OK
$table = $this->table('hogehoge');
$table->addColumn('column_name', 'text', [
	'limit' => Phinx\Db\Adapter\MysqlAdapter::TEXT_MEDIUM // ←これ
    'null' => false,
]);
```

基本的には`MysqlAdapter`を使ってより細かく型を指定できるようでした。
マイグレーションファイルに`use Phinx\Db\Adapter\MysqlAdapter;`を追加すれば、`MysqlAdapter::TEXT_MEDIUM`だけでもいけます。
あんまりMEDIUMTEXTとか大きな型を使うことはないと思うんですが、だからこそ使うときに忘れそうなので、備忘録がてらの投稿です。

## その他
試してはいませんが、

```sample.php
$this->execute('ALTER TABLE hogehoge ADD column_name mediumtext');
```
多分これでもいけるんじゃないかとは思います。

## 補足
今回は`mediumtext`でしたが、この書き方をすれば`bigint`なども書けるようになります。
(bigintは`biginteger`で普通に書けますが、念のため)
CC0 1.0S ライセンス

https://creativecommons.org/publicdomain/zero/1.0/deed.ja

本ライセンスは、CC0 1.0 をベースにしたものである．

本ライセンスに関連付けた著作物の取り扱いについては、すべてCC0 1.0に準ずる．

なお、本ライセンスに関連付けて公開された著作物を二次利用するものは、お寿司を食べて、それについて公に報告する義務を負う．報告の内容や形式は問わない．またお寿司を食べる期限や報告の期限は特に設けない．
C++ Builder > TForm > タイトルバーのないウィンドウ(サイズ変更可能)の実装 > ソフト起動時

```txt:動作環境
C++ Builder XE4
```

### 背景

多数のウィンドウを表示するソフトにおいて、タイトルバーの表示を隠したい。

### 情報

- https://stackoverflow.com/questions/13781364/how-to-remove-the-title-bar-from-a-form
- [126_コード補完ウィンドウもどき](http://mrxray.on.coocan.jp/Delphi/plSamples/126_PopUpFormTest.htm) by Mr.XRAY 様
    - `//  WS_POPUPはタイトルバーや枠を持たず，クライアント領域だけのウインドウ`

情報感謝です。

### 実装

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
	void __fastcall CreateParams(Controls::TCreateParams &Params);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	this->Position = poScreenCenter; // 画面中央に表示
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CreateParams(Controls::TCreateParams &Params)
{
	TForm::CreateParams(Params);
	Params.Style = WS_POPUP | WS_BORDER | WS_THICKFRAME;
}
``` 

### 動作例

![2018-11-09_14h45_56.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a7793c1b-b8a4-fe2d-ee3a-a6a5950d2a7f.png)

- サイズ変更可能
- 移動はできない
    - サイズ変更を工夫すると移動に近い操作は可能
        - 右を伸ばして、左を縮める、など


### 用途例

- 画面をN分割
- それぞれの位置においてサイズを適宜変更したい


### 検索用キーワード

- override
Django複数appと複数データベースの配置

下記のは、中国からのURL資料です。
①1 project 複数 appの場合
多个APP共存Django配置
https://blog.csdn.net/zengxiantao1994/article/details/72600912

②1 project 複数データベースの場合
django 多数据库配置
https://blog.csdn.net/songfreeman/article/details/70229839
Ruby mapメソッドについて

#はじめに
エンジニア1年生です。
日々の学びのメモとしてコツコツと記事を書こうと思っています。
今回はmapメソッドの使い方について書いていきます。

#mapとは？
配列の要素の数だけ繰り返し処理を行うメソッドです。

#mapメソッド
書き方は
`配列の入った変数.map {|変数名| 処理内容 }`
です。

mapは処理後に戻り値で配列を作成してくれます。
元の配列が上書きされることはありません。

例として配列の要素の文字数をmapメソッドで取得して変数に入れてみます。

```ruby:controller.rb
  animal = ["dog", "cat", "koara","bird"]
  animal.map {|a| a.length}
```

結果

```
  animalの中身は ["dog", "cat", "koara","bird"]
  戻り値は [3, 3, 5, 4]
```
  
このようにmapは戻り値で配列を作成してくれます。

#map!メソッド
配列の値を処理結果に置き換えたい場合に使用します。
map!は元の配列を戻り値に置き換えます。

```ruby:controller.rb
  animal = ["dog", "cat", "koara","bird"]
  animal.map! {|a| a.length}
```

結果

```
  animalの中身は [3, 3, 5, 4]
  戻り値は [3, 3, 5, 4]
```

このようにmap!は配列の要素を処理の結果と入れ替えます。

#eachとの違い
　戻り値が異なります。
　mapは配列を作成して返してくれるのに対して
　eachの戻り値はレシーバ自体が返ってきます。

```ruby:controller.rb
  animal = ["dog", "cat", "koara","bird"]
  animal.each {|a| a.length}
```

結果

```
  animalの中身は ["dog", "cat", "koara","bird"]
  戻り値は ["dog", "cat", "koara","bird"]
```
OCIのインスタンスをiOSから操作できるOCI Managerを使ってみる

久々の投稿なので、軽いネタでも投稿してみます。

最近はもっぱらオラクルの新しいクラウドOCI(Oracle Cloud Infrastructure)を使っています。
デモとかに使用しているインスタンスは、会社から帰るときに落としていくようにしているのですが、クラウド使っているとついつい立ち上げっぱなしで帰って翌朝しまった、ってなる時がありますよね。あとは、飲み会の途中でインスタンスを落としていないことに気づいたけど、PC開くのめんどうくさいなーと思っているうちに忘れる、とかたまにやっちゃったりします。

そんなとき、手元のスマートフォンから簡単にインスタンスを落とせたら便利だなぁ、とか考えていたところ、ちょうどいい OCI Manager というアプリがリリースされたようなので、使ってみました。

### アプリのダウンロード
OCI ManagerはiOSのアプリですので、ダウンロードします。
https://itunes.apple.com/jp/app/oci-manager/id1439011461?mt=8

作者は Richard Garsthagen という方のようです。Oracleのオフィシャルアプリではないようですので、困っても公式サポートには聞けなさそうですが、やりたいのはインスタンスの起動停止くらいなので気にせずダウンロードします。

### テナンシーのアクセス情報を入力
アプリを起動すると、まずリージョンの選択画面が出てきます。
今回は us-ashburn-1 を選んでみます。
<img width="320" alt="2018-11-09 13.43.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/117710/398378d1-b051-b2a8-8218-24dd3cc4d69f.png">


次に、右下の青い南京錠のアイコンをタップします。するとアクセス情報を入力する画面が開きます。

- Tenant OCID
- User OCID
- Fingerprint
- Region
- Private Pem Key

の5項目の入力が必要なので、入力します。
入力する情報の取得方法などは、APIやCLIを叩くときと同じです。わからない方は [OCI公式マニュアルのこのあたり](https://docs.oracle.com/cd/E97706_01/Content/API/Concepts/apisigningkey.htm) とか、[OCIのチュートリアルのこのあたり](https://community.oracle.com/docs/DOC-1019624#jive_content_id_2_Oracle_Cloud_Infrastructure_CLI) とかを参考にやってみてください。

全部を入力できたら、下の方に Connect というリンクがあるので、それを押します。
接続テストに成功すると、 Loggied in as : <テナンシー名>  と <ユーザー名> が表示されます。

![screen.png](https://qiita-image-store.s3.amazonaws.com/0/117710/3c0961dc-dca6-8bd4-7c71-f1aaeb1f8643.png)



### 実際に接続してインスタンスを操作する
フォルダのような左側のアイコンをタップします。

Compartments という画面が表示されるので、画面を下に引っ張ってリロードします。すると、アクセスできるコンパートメントの一覧が現れます。
<img width="320" alt="2018-11-09 13.54.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/117710/dfdbf69b-a455-d748-2dc4-63e746d517c3.png">


好きなコンパートメントを選択すると、その中のインスタンスが一覧で出てきます。

インスタンスをタップすると、こんなふうに下に「Stop」とか「Reset」とかボタンが出てきます。
<img width="320" alt="2018-11-09 13.58.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/117710/1e5e2a01-4300-6bc1-b7f6-4a710d22f7a9.png">



Stopを押すと、普通のSTOP(強制的にインスタンスの電源を落とす)と、SOFT STOP(ちゃんとshutdownコマンドを打ってからインスタンスを落としてくれる) が選べたりします。これはいいですね。せっかくなのでSOFT STOPを押してみます。

そうすると、インスタンスのステータスがオレンジ色のSTOPPINGになります。
定期的にvNICの情報がチカチカしているので、何秒かに1回クエリをかけて最新ステータスを取得してくれているようです。
<img width="320" alt="2018-11-09 14.00.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/117710/d7e5bad6-63ea-975b-e328-b4b026f6f5da.png">

無事にインスタンスが停止しました。これで課金の心配もいらないですね!!

### その他
普通のコンピュート・インスタンスだけでなく、Autonomous Data Warehouse(ADW)のインスタンスの操作もできるようです。あんまりやる機会はないかもしれませんが、CPUサイズのスケールアップもここからできたりするようです。
<img width="320" alt="2018-11-09 14.16.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/117710/ddfa3fd1-b47d-7c38-68d5-4b8e0bef5394.png">

### まとめ
まだまだできたばかりのアプリなので、インスタンスの情報の表示、起動停止、ADWのスケーリングぐらいしかできませんが、こういったOCI用の周辺アプリはまだまだ数が少ないので重宝しそうです。今後の機能追加にも期待しつつ使っていきたいと思います。

### 2020/3/11追記 : Android版できたっぽい
作者のrichardさんから、「俺じゃないけど友達がOCI ManagerのAndoroid版作ったんで紹介するぜ」との連絡が。
というわけで、リンク貼っておきます。
なぜか名前が微妙に違って「OCI Monitor for Android」とのこと。でも起動停止もできるっぽいです。
(私はAndroidデバイス持っていないので試しておらず。。。誰か人柱希望)

**OCI Monitor for Android**
https://oc-blog.com/2020/03/09/oci-monitor-for-android/
Ecto で MySQL の SELECT SQL_CALC_FOUND_ROWS と SELECT FOUND_ROWS() を呼び出す

MySQL で（カーソルじゃなく総ページ数を必要とするような）ページングなどを行う場合、SQL_CALC_FOUND_ROWS と FOUND_ROWS() を使うととても便利ですが、Ecto で簡潔に実現する方法がなかなかわからず、とても苦労しました。

もちろん生の SQL を書いて Ecto.Adapters.SQL.query!/2 を呼べばできないことは無いのですが、それもアレなので、queryable を使ってできる方法を実現しました。

最終的にモジュールとしてまとめましたので、もし同様のニーズがある方は使ってみてください。

- https://hex.pm/packages/tiny_ecto_helper_mysql

# TL;DR
結局 Ectoの標準（？）機能では実現できないので、

- Repo.to_sql/2 で queryable を SQL に変換し、文字列置換でその SQL に `SQL_CALC_FOUND_ROWS` を追加して、`Ecto.Adapters.SQL.query!/2` に渡す

という、とてもベタな方法で実現しています。

Select のカラムを取得するために queryable の select.expr など内部表現を使っていますが、プロダクションで使う予定なので当該モジュールの中では、念の為 AST が変わってないかのチェックや、changeset にも一応通すなど、変にバグるようなことは無いような工夫をしています。

# もうちょっと詳しい内容

例えばid:1〜100の100レコードの questions テーブルがあったとします。MySQL には

```
SELECT SQL_CALC_FOUND_ROWS id, title, body FROM questions WHERE id > 50 LIMIT 5;
SELECT FOUND_ROWS()
```
みたいに書くと、5ではなく50つまり WHERE 条件にマッチしたレコード数を LIMIT（やOFFSET）を無視して返してくれる機能があり、ページングを実現する時にとても便利です（他の RDMS に同様の機能があるかどうかは知りません）。

最初は Ecto の select に対して `select: {fragment("SQL_CALC_FOUND_ROWS"), q},` のようにできないか見てみたのですが、この場合 `SELECT SQL_CALC_FOUND_ROWS, * FROM questions` のように、余計な `,` が付与されてしまいます。

しょうがないので、[build_inject_sql/2の実装](https://github.com/hykw/tiny_ecto_helper_mysql/blob/master/lib/tiny_ecto_helper_mysql.ex#L22)のように「queryable を Repo.to_sql で SQL に変換し、文字列置換で `SQL_CALC_FOUND_ROWS` を付与する」という方法で回避しました。ただし `Ecto.Adapters.SQL.query!/2` の戻り値は `%Question{}` のような `__struct__` ではありません。

これをそのまま使えるのであれば問題ないのですが、実はこの機能は、とあるプロダクションのバックエンドで採用予定の Absinthe の resolver の中で必要になりました。absinthe ではデータを `__struct__` の形で引き回せるようにしておくと色々と楽なので、これを Repo.all/1 などと同様に `__struct__` に詰め戻すため、

- queryable.select からキーのリストを取得
    - これを利用して、キーと `Ecto.Adapters.SQL.query!/2`の結果をマージ
- `__struct__` に戻す
- （念の為）changeset で valid? = false になっていないことの確認

などの処理をするはめになりました。

最終的に、一連の処理はモジュールとしてまとめましたので、もし同様のニーズがある方はぜひ使ってみてください。

  - https://hex.pm/packages/tiny_ecto_helper_mysql
【機械学習アルゴリズム】ロジスティック回帰によるモデル構築

##ロジスティック回帰とは？
機械学習において様々なアルゴリズムが使われますが、今回紹介するロジスティック回帰も機械学習アルゴリズムの内の1つです。
ロジスティック回帰は回帰という名前がついていますが、2値分類のための学習アルゴリズムです。

パーセプトロンなどの線形モデルでは、出力を0か1のクラスとして決定していましたが、ロジスティック回帰では出力を確率として出します。
そしてその確率の値から2値分類を行います。

イメージとしては明日の天気を考える時に、降水確率が80%なら多分雨。降水確率が20%なら多分晴れ、という風な分類を行いますね。
これと同じことをロジスティック回帰ではやっています。



##オッズ比とロジット関数
ロジスティック回帰を数式的に理解するためにまずはオッズ比とロジット関数という概念について説明していきます。

###オッズ比
オッズ比とは予測したい事象が起こる確率をpとした時に、$\frac{p}{(1-p)}$という風に表されるものです。
分母の(1-p)は予測したい事象が起こらない確率のことなので、上で示したオッズ比というものは予測したい事象の起こりやすさを表しているのだと分かります。

###ロジット関数
オッズ比について説明してきましたが、このオッズ比に自然対数をとったものをロジット関数と言います。
$${\rm logit}(p) = \log{\frac{p}{(1-p)}}$$
ロジット関数は0よりも大きく、1よりも小さい入力値を受け取り、実数全範囲の値に変換します。



##ロジスティックシグモイド関数
ここでは上でした説明を踏まえて、ロジスティック回帰で使う活性化関数について説明していきます。

###シグモイド関数の性質
上で解説したロジット関数の逆関数を考えてみましょう。
ロジット関数をzとおきます。
$$z = \log{\frac{p}{(1-p)}}
\\\\\mathrm{e}^{z} = \frac{p}{(1-p)}
\\\\p = \frac{\mathrm{e}^{z}}{\mathrm{e}^{z} + 1}
\\\\p = \frac{1}{1 +  \mathrm{e}^{-z}}$$


上で導出された関数をロジスティックシグモイド関数、もしくはシグモイド関数と言います。
今、シグモイド関数を$\phi(z) = \frac{1}{1 +  \mathrm{e}^{-z}}$とおき、グラフを描くと以下のようになります。

![sigmoid.png](https://qiita-image-store.s3.amazonaws.com/0/298553/427cc593-686b-7c17-fc71-739b5c6e98c5.png)

上のグラフを見たら分かるようにシグモイド関数では、入力として実数zを受け取り、出力を0から1の範囲で出しています。

つまり、確率として出力を出す、ロジスティック回帰アルゴリズムにおいてシグモイド関数を活性化関数として用いるのが最適であるということが分かります。


###シグモイド関数による2値分類
それではシグモイド関数の入力zはどのように表されるか見ていきましょう。
zは以下のような式で表されます。
$$z=b+\sum^n_{i=1}w_ix_i$$

ここでwは重み、bはバイアス項です。
つまりzは重みと特徴量の線形結合に、バイアスを足し合わせたような値になっています。

これを入力としてシグモイド関数に入れると、0～1の値(確率)として出力されるということです。
ロジスティック回帰は2値分類のアルゴリズムなので、0.5という値を境に0と1のクラスに分類します。


$$\hat{y} = \begin{cases}
1 & (\phi(z)\geq0.5) \\\\
0 & (\phi(z)<0.5)
\end{cases}$$

![sigmoid1.png](https://qiita-image-store.s3.amazonaws.com/0/298553/eda23370-5f6e-dd50-a152-3201093db49c.png)

上のグラフを見ると分かると思いますが、以下のように書き換えることができます。

$$\hat{y} = \begin{cases}
1 & (z\geq0) \\\\
0 & (z<0)
\end{cases}$$

![sigmoid3.png](https://qiita-image-store.s3.amazonaws.com/0/298553/8bc3e6fb-29a3-20bd-6127-4b545905a3d7.png)



##ロジスティック関数の重みの学習
ここまでの説明で、重みと特徴量の線形結合を総入力としてシグモイド関数に入れれば、0～1の値が確率として得られるという話をしましたが、もちろん0～1の値が出力されているからといって、予測したい事象の確率が出力されているということにはなりません。

ここでは尤度(結果から見たところの条件のもっともらしさ)という概念をを取り入れていきます。
尤度の最大化を考えることによって、予測したい事象の確率をより正確に出力できるようにします。


尤度Lは以下のように書けます。
$$L(w)=\prod_{i=1}^n P(y^{(i)}|x^{(i)};w)=\prod_{i=1}^n (\phi(z^{(i)}))^{y^{(i)}}(1-\phi(z^{(i)}))^{1-y^{(i)}}$$


積の形から和の形にして最大化しやすくします。
$$l(w)=\log{L(w)}=\sum_{i=1}^n [y^{(i)}\log(\phi(z^{(i)}))+(1-y^{(i)})\log(1-\phi(z^{(i)}))]$$


これを対数尤度関数と言います。
この尤度関数を最大化していくことによって最適な重みを見つけるのです。


##参考文献

>[Python機械学習プログラミング―達人データサイエンティストによる理論と実装][link]
[link]:https://www.amazon.co.jp/Python-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%81%94%E4%BA%BA%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E3%81%AB%E3%82%88%E3%82%8B%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%B7%B5-impress-gear/dp/4295003379/ref=pd_lpo_sbs_14_t_0?_encoding=UTF8&psc=1&refRID=NYR1ZQ8DE1AJ40BKARKG


##機械学習をフワッと理解するのにおすすめの記事

>[機械学習を猫でもわかるように説明してみた(教師あり学習と教師なし学習)][link2]
[link2]:https://city3939.com/machine-learning/
Ubuntu 18.04 LTS / Ubuntu 20.04 LTS または Windows 10 で HHKB(pd-kb02) など古めかしいキーボードを使う設定

# この記事はなに？

『無変換』と『変換』キーはあるけど、Windowsキー（Superキー）に当該するものがないキーボード（pd-kb02とかfkb8579とか）を最近のOSで最低限不自由なく使うための設定の紹介です。

# USB to PS/2 コンバーター

個人的には RC-U2MK をお勧めしたい。多くの人は『マウス用の口要らねー』と思うかもしれないが、実はこの口にキーボードを繋いでも普通に使える。何故かは知らない。

## USB to PS/2 変換ケーブル [RC-U2MK] &raquo;  有限会社 ルートアール (Route-R)
http://route-r.co.jp/?p=334
>商品説明
>PS/2キーボードとPS/2マウスをパソコンにUSB接続で使用できます。
>
>●一部のPS/2接続のバーコードリーダーにも使用出来ます。
>●Microsoft IntelliMouse 互換スクロール機能に対応
>
>対応OS: Windows 2000，XP，Vista
>＊すべてのPS/2デバイスの動作を保証するものではございません。
>JAN：　4562143440618


# Ubuntu にて xkb でリマップして使う

## 前提
pd-kb02のスイッチは 3 に設定。
キーボードの種類は英語（US）を選択。

## xkbの設定

↓みたいな感じでお好のキーを設定する

```shell-session
to_su $ grep -n -A6 HENK /usr/share/X11/xkb/symbols/inet
108:    key <HENK>   {      [ Alt_R                 ]       };
109-    key <MUHE>   {      [ Alt_L                 ]       };
110-    key <RALT>   {      [ Super_L               ]       };
111-    key <LALT>   {      [ Alt_L                 ]       };
112-    key <KATA>   {      [ Katakana              ]       };
113-    key <HIRA>   {      [ Hiragana              ]       };
114-    key <RO>     {      [ Romaji                ]       };
to_su $ 
```

補足１：CtrlキーはControl_LとかRだったと思う。
補足２：Superを左右どちらに置くかはお好みで、リマップする必要のない記述（上記 111行目）は必要ありません。書いておいた方がわかり易いかな、という意図で記載してあるだけです。
補足３：Super_R だと反応しないので Super_L にしてあります（Ubuntu 20.04 LTS)

# Windows10 にて regedit でリマップして使う
## 前提

pd-kb02のスイッチは 3 に設定。
スイッチは 3 に設定

```powershell:レジストリキー
コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout
```
## 変更内容
- 左 Command を 左Alt
- 右 Command を 右Alt
- 右 Alt を 右 Windows-key 
![windows10_regedit_for_remap-pdkb02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20877/b9915b5e-7f80-e40c-57ea-8e8eb8e9c2d0.png)

## 参考サイト
レジストリでキー配列変更 @matsu-tk
https://qiita.com/matsu-tk/items/9059ff186fdfc716bf65

Windowsのキーボード配列を自由自在に設定する【フリーソフト不要！】｜かえるのほんだな
https://yukituna.com/2146/

MicroSoft 公式ドキュメント
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/hid/keyboard-and-mouse-class-drivers

## どなたか下記についてご存じの方はコメントくださると幸いです
- MicroSoft 謹製のリマップソフト
- 外付けキーボードのみをリマップする方法（Ubuntu, Windows 問わず）

なにとぞm(_ _)m
Link > Internet Explorer 8 > アドレスバーを非表示に

```txt:動作環境
Windows 7 Pro (32bit)
Internet Explorer 8
```

### アドレスバーを非表示に

アドレスバーを非表示にするにはレジストリをいじるようだ。
https://siwon-g.hateblo.jp/entry/20111118/1321624740

もともと「Internet Explorer」以下がなかったため、レジストリエディタで作成した。

### 元に戻す

レジストリエディタにて「Internet Explorer」以下を消す。

### 検索用キーワード

- IE8
- アドレスバー
- URL非表示
Photoshop | 表示状態のレイヤー数を求める

スクリプトでは、レイヤーを「ArtLayer」
グループを「LayerSet」と呼んでいる。

![photoshop1.png](https://qiita-image-store.s3.amazonaws.com/0/52118/95ea0efd-4055-d506-81f1-0780e45525b4.png)

このレイヤーの名前を表示してみる。

# レイヤー名を表示する

```js
#target photoshop

var doc = app.activeDocument;
for (var i = 0; i < doc.artLayers.length; i++) {
    $.writeln(doc.artLayers[i]);
}

// [ArtLayer 背景]
// と表示される
```

# グループ名を表示する

```js
#target photoshop

var doc = app.activeDocument;
for (var i = 0; i < doc.layerSets.length; i++) {
    $.writeln(doc.layerSets[i]);
}

// [LayerSet グループ 1]
// [LayerSet グループ 3]
// と表示される
```

# レイヤー名とグループ名を表示する

```js
#target photoshop

var doc = app.activeDocument;
for (var i = 0; i < doc.layers.length; i++) {
    $.writeln(doc.layers[i]);
}

// [LayerSet グループ 1]
// [LayerSet グループ 3]
// [ArtLayer 背景]
// と表示される
```

# すべてのレイヤー数を求める

今までは一番上の階層のみを対象にしていたが、
すべてのレイヤー数を求めるには、
各グループ内のレイヤー数を加算する必要がある。

```js
#target photoshop

function getArtLayerCount(doc) {
    var count = doc.artLayers.length;
    for (var i = 0; i < doc.layerSets.length; i++) {
        count += getArtLayerCount(doc.layerSets[i]);
    }
    return count;
}

var count = getArtLayerCount(doc);
$.writeln(count);

// 4
// と表示される
```

# 表示状態のレイヤー数を求める

```js
#target photoshop

var doc = app.activeDocument;

function getVisibleArtLayerCount(doc) {
    var count = 0;
    for (var i = 0; i < doc.artLayers.length; i++) {
        if (doc.artLayers[i].visible) {
            count++;
        }
    }
    for (var i = 0; i < doc.layerSets.length; i++) {
        if (doc.layerSets[i].visible) {
            count += getVisibleArtLayerCount(doc.layerSets[i]);
        }
    }
    return count;
}

var count = getVisibleArtLayerCount(doc);
$.writeln(count);

// 0
// と表示される
```
PHPのバージョン違いによるarray_mergeの速度測定

## はじめに

この記事は[PHP Advent Calender 2018](https://qiita.com/advent-calendar/2018/php)の最終日の記事です。
`PHP`の標準関数`array_merge`が昔遅かったんですが`PHP7`で速くなっていたので速度測定結果を共有します。

## 下準備

複数のバージョンを切り替えて`PHP`を実行する必要があるのでバージョン管理ツールを入れます。
今回は[phpbrew](https://github.com/phpbrew/phpbrew/blob/master/README.ja.md)を使いました。

```bash
curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
chmod +x phpbrew
sudo mv phpbrew /usr/local/bin/phpbrew
phpbrew init
source ~/.bashrc
phpbrew known
phpbrew update
```

これでコマンドが認識されてインストールされてあるバージョンが表示されたら成功です
今回は`PHP5.6`と`PHP7.2`を比べてみようと思います

```bash
phpbrew install 5.6.38 +default
phpbrew install 7.2.12 +default
phpbrew use 5.6.38
phpbrew use 7.2.12
```

## 速度測定

### 計測用コード

今回は`[0]`に`[1,2,…,100000]`をマージする処理で計測します。
10回の実行速度の平均を記録とします。

```php
<?php
// マージ対象の配列
$target = [0];
$list = range(1, 100000);

// array_mergeの計測
$total = 0;
for($i=0; $i<10; $i++){
    $start = microtime(true);
    array_merge($target, $list);
    $end = microtime(true);
    $time = $end - $start;
    echo "{$time} 秒\n";
    $total += $time;
}

$average = $total/10;
echo "平均: {$average}\n";
```

### PHP5.6での計測結果

```bash
0.0046761035919189 秒
0.0072782039642334 秒
0.0071420669555664 秒
0.0089681148529053 秒
0.0043520927429199 秒
0.010435104370117 秒
0.0072150230407715 秒
0.0099129676818848 秒
0.0066111087799072 秒
0.0091531276702881 秒
平均: 0.0075743913650513
```

### PHP7.2での計測結果

```bash
0.0034220218658447 秒
0.0037429332733154 秒
0.0030500888824463 秒
0.0031399726867676 秒
0.003079891204834 秒
0.0033450126647949 秒
0.0037591457366943 秒
0.0050110816955566 秒
0.0031650066375732 秒
0.0032458305358887 秒
平均: 0.0034960985183716
```


## 考察とまとめ

0.0075743913650513 / 0.0034960985183716 = 約2.16倍
array_mergeが速くなったというよりは配列操作全般が速くなった感じですね。
昔`PHP5系`でarray_mergeの遅さに苦しめられて自前関数を組んだことがありましたが、`PHP7系`ではその自作関数よりも速くなっていたので大変素晴らしいですね。

## おわりに

今回とりあげた`PHP5.6`は2018/12/31でセキュリティサポートが切れます（この記事の公開から6日後！）
速度的にも速い`PHP7`系にアップデートしましょう。
それではメリークリスマス！🎅