OmniAICreator/Qiita-1.07M huggingface dataset:
xib を使って再利用可能な View を作成する

## はじめに

xib を使って色々な画面で使いまわせる汎用的な View のつくり方を紹介します。

## xib ファイルを作成する

File -> New -> File... (⌘ + N) からファイルを新規作成します。Cocoa Touch Class を選択して Next しましょう。

<img width="1280" alt="スクリーンショット 2018-01-24 20.12.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/230887/6da2005a-1f79-c9b3-1c9a-0bf2a79798d7.png">

名前は適当に CustomTableViewCell としておきます。
Also create XIB file にチェックをつけ Next をクリックし、任意のディレクトリに保存します。

<img width="1280" alt="スクリーンショット 2018-01-24 20.13.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/230887/7f8c5fc0-7869-e1fa-2f1c-8bce852ce02c.png">

作成が完了すると CustomTableViewCell.xib と CustomTableViewCell.swift の二つが Project navigator に追加されます。

<img width="268" alt="スクリーンショット 2018-01-24 19.55.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/230887/484e7af3-dd35-74cf-af8e-7f7f11abbe36.png">

## xib を編集する

Storyboard と同じ要領で編集することが可能です。取り合えず今回は backgroundColor に Twitter カラーを指定してみます。
cell identifier (画像右上) も忘れずに設定しておきましょう。

<img width="1280" alt="スクリーンショット 2018-01-24 20.32.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/230887/85d60cb0-403d-136f-9ea6-cf6378b5cffa.png">

## xib をコードから呼び出す

真っさらな何もない TableView に xib をセットしていきます。

<img width="1280" alt="スクリーンショット 2018-01-24 20.28.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/230887/ada32862-04e9-bf54-17a6-ef518808ab75.png">

```Swift:MainTableViewController
import UIKit

class MainTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // tableView に CustomTableViewCell を登録する
        self.tableView.register(UINib(nibName: "CustomTableViewCell", bundle: nil),
                                forCellReuseIdentifier: "customCell")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // ここで CustomTableViewCell を呼び出す
        return self.tableView.dequeueReusableCell(withIdentifier: "customCell") as! CustomTableViewCell
    }
}
```

## 実行結果

以下が実行結果です。

<img width="414" alt="IMG_0016.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/230887/897871a2-54bd-dab4-4ecb-3824c69c1563.png">

xib でヘッダーやボタンなどの View を作成しておくと色々な画面で使いまわすことができて便利ですね。
［Swift/iOS］StoryBoardを使わずに、UIButtonを実装する方法

## 開発環境
Swift 4
Xcode 9.2

## ポイント
### UIButtonの追加
```swift:sample.swift
let button:UIButton = UIButton(frame: CGRect(x: 0, y: 50, width: self.view.frame.width, height: self.view.frame.height / 4))
button.backgroundColor = .black
button.setTitle("sample", for: .normal)
button.setTitleColor(.white, for: .normal)
self.view.addSubview(button)
```

### UIButtonを押すと、発火するfunc
`func` の前に `@objc` を追加 

```swift:sample.swift
@objc func pushButton(sender: UIButton){
        print("button pushed.")
}
```

### UIButtonとfuncの紐付け
```swift:sample.swift
let button:UIButton = UIButton(frame: CGRect(x: 0, y: 50, width: self.view.frame.width, height: self.view.frame.height / 4))
button.backgroundColor = .black
button.setTitle("sample", for: .normal)
button.setTitleColor(.white, for: .normal)

//追加したコード
button.addTarget(self, action: #selector(pushButton), for: .touchUpInside)

self.view.addSubview(button)
```

## コード例
```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let button:UIButton = UIButton(frame: CGRect(x: 0, y: 50, width: self.view.frame.width, height: self.view.frame.height / 4))
        button.backgroundColor = .black
        button.setTitle("sample", for: .normal)
        button.setTitleColor(.white, for: .normal)
        button.addTarget(self, action: #selector(pushButton), for: .touchUpInside)
        self.view.addSubview(button)
        
    }
    
    @objc func pushButton(sender: UIButton){
        print("button pushed.")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

```
Rails5.1 + Bootstrap4でfield_with_errors

# field_with_errorsクラスとは？
Railsのバリデーションでエラーになった箇所に付与されるクラスの事です。
![Workman.png](https://qiita-image-store.s3.amazonaws.com/0/15147/f3fca9a0-e26f-383e-27ec-26c3a3064f7b.png)

# Bootstrap3
* field_with_errorsクラスに対して Bootstrap3の `.has-error` をextendすることで入力欄が赤枠で表示されていた。
 
```application.scss
.field_with_errors {
  @extend .has-error;
}
```

# Bootstrap4
* `.has-error` が無くなっているのでextendできない。
* 代わりに `input` タグに対して `.is-invalid` をextendする。

```application.scss
.field_with_errors {
  input {
    @extend .is-invalid;
  }
}
```
reveal.jsでFontAwesome5を使ったデザインをする

## 1. 何がしたいのか

`reveal.js` + `markdown`でプレゼン資料を作っていたが、素ではどうにも寂しい。
そこで、ヘッダーデザインだけでも...**`FontAwesome5`を使っておしゃれにしてみたい！**と少しだけ手を加えてみました。

## 2. 完成イメージ

こんなMarkdownを書いて...

```md:slides.md
### h3 reveal.js

content
```

このように表示したい。

`index.html`
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/227179/6fb4b5c0-d929-9dd7-7c84-5eaf2d7cd2fd.jpeg)

## 3. やり方

### 3-1. FontAwesomeと自作CSSを読み込む

```html:index.html
<!-- FontAwesome -->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.4/css/all.css">

<!-- カスタムCSS -->
<link rel="stylesheet" href="custom.css">
```

### 3-2. 自作CSSで設定を上書きする

```css:custom.css
/* Inject icon for header */

.reveal .slides h3::before {
  font-family: 'Font Awesome\ 5 Free', 'Font Awesome\ 5 Brands';
  content: '\f138';
  color: #f8ff91;
  padding-right: 10px;
}
```

コードポイントは各アイコンのページで確認ができます。
https://fontawesome.com/icons

これで完成。

## Tips. フォント

個人的に`NotoSans`が好きなので、
Google日本語フォント（アーリーアクセス版）から利用しています。

```html:index.html
<!-- Google Fonts -->
<link rel="stylesheet" href="https://fonts.googleapis.com/earlyaccess/notosansjapanese.css" />
```
```css:custom.css
/* Font settings */

.reveal .slides {
  font-family: 'Noto Sans Japanese';
  font-weight: 200;
  font-size: calc(22px + 0.25vw);
  text-align: left;
}

.reveal .slides h1,
.reveal .slides h2 {
  font-weight: 900;
  text-align: center;
}

```
ros2をdockerで試す

本家docker リポジトリはここ
https://hub.docker.com/r/osrf/ros2/

```
$ docker run -it --rm osrf/ros2:r2b3-core
```

でいろいろと試せます。が、
r2b3版だとtopicコマンド等がないのでardentの全部入りをつくってみました

https://hub.docker.com/r/atotto/ros2-core/

参考:

- https://github.com/ros2/ros2/wiki/Introspection-with-command-line-tools
- https://github.com/ros2/ros2/wiki/Linux-Install-Debians

## dockerコマンドで試す

事前準備:

```
$ docker network create -d bridge --subnet 172.1.0.0/16 ros2
```

terminal1:

```
$ docker run -it --rm --net ros2 atotto/ros2-core:latest ros2 topic pub /chatter std_msgs/String "data: Hello world"
publisher: beginning loop
publishing std_msgs.msg.String(data='Hello world')

publishing std_msgs.msg.String(data='Hello world')

publishing std_msgs.msg.String(data='Hello world')

publishing std_msgs.msg.String(data='Hello world')

publishing std_msgs.msg.String(data='Hello world')

publishing std_msgs.msg.String(data='Hello world')
```

terminal2:

```
$ docker run -it --rm --net ros2 atotto/ros2-core:latest ros2 topic echo /chatter
data: Hello world

data: Hello world

data: Hello world

data: Hello world

data: Hello world

data: Hello world
```


片付け

```
$ docker network rm ros2
```

## docker-composeで試す

上と同じことをさせた（つもり）

```yaml
version: '3'

services:
  talker:
    image: atotto/ros2-core:latest
    command: 'ros2 topic pub /chatter std_msgs/String "data: Hello world"'
    networks:
      - ros2
  listener:
    image: atotto/ros2-core:latest
    command: 'ros2 topic echo /chatter'
    networks:
      - ros2
  list:
    image: atotto/ros2-core:latest
    command: ros2 topic list
    networks:
      - ros2

networks:
  ros2:
    driver: bridge
```

が、ちゃんと動かず。なんか遅い？
CloudFlare + Azure Web Appsの環境でIP制限を掛ける時のweb.config

# はじめに
CloudFlareCDN経由でWebAppsのコンテンツ公開する際に一時的にIP制限を掛けたい場合はどうやればよいのか少し調べてみました。

# 設定内容
設定は次の通りです。
ポイントはCDNやLB等を経由すると送信元IPが書き換わるのを考慮しx-forwarded-forで判断するよう`enableProxyMode="true"`にします。

```:web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <security>
      <ipSecurity enableProxyMode="true" allowUnlisted="false" >
       <!-- Your IP -->
       <add allowed="true" ipAddress="1.2.3.4" />
       <!-- CLOUDFLARE -->
       <add allowed="true" ipAddress="199.27.128.0" subnetMask="255.255.248.0" />
       <add allowed="true" ipAddress="173.245.48.0" subnetMask="255.255.240.0" />
       <add allowed="true" ipAddress="103.21.244.0" subnetMask="255.255.252.0" />
       <add allowed="true" ipAddress="103.22.200.0" subnetMask="255.255.252.0" />
       <add allowed="true" ipAddress="103.31.4.0" subnetMask="255.255.252.0" />
       <add allowed="true" ipAddress="141.101.64.0" subnetMask="255.255.192.0" />
       <add allowed="true" ipAddress="108.162.192.0" subnetMask="255.255.192.0" />
       <add allowed="true" ipAddress="190.93.240.0" subnetMask="255.255.240.0" />
       <add allowed="true" ipAddress="188.114.96.0" subnetMask="255.255.240.0" />
       <add allowed="true" ipAddress="197.234.240.0" subnetMask="255.255.252.0" />
       <add allowed="true" ipAddress="198.41.128.0" subnetMask="255.255.128.0" />
       <add allowed="true" ipAddress="162.158.0.0" subnetMask="255.254.0.0" />
       <add allowed="true" ipAddress="104.16.0.0" subnetMask="255.240.0.0" />
      </ipSecurity>
    </security>
  </system.webServer>
</configuration>
```
過不足ありましたらご指摘くださいませ。

# 参考サイト
[Azure website IP restriction
](https://stackoverflow.com/questions/24884098/azure-website-ip-restriction)
[CloudFlare IP Ranges](https://www.cloudflare.com/ips-v4)
polyglotによる言語検出の精度を見てみる

[awesome-python](https://github.com/vinta/awesome-python)リストを確認していると、自然言語処理のカテゴリーの中にpolyglotというライブラリがあり、ドキュメントを確認してみると、言語検出ができるとのことなので精度を試して見ます。

## 環境の用意
はじめはmac上で環境構築を行なっていたのですが、iucがうまく入らなかったため、dockerに切り替えました。
docker hubで[検索](https://hub.docker.com/r/turbulent/polyglot-base/)をかけると良さそうなのがあったのでこれを使用します。

### urbulent/polyglot-baseイメージの使用・コンテナの起動

urbulent/polyglot-baseイメージを使用して以下コマンドでdokcerを立ち上げ、コンテナに入ります。

```bash
docker pull turbulent/polyglot-base    
docker run --rm -it turbulent/polyglot-base /bin/ash
```

### 日本語モデルの用意

正しく検出を行うために、日本語のモデルをインストールします。ここからの作業はdokcer内で行います。

インストールは[コマンドライン](http://polyglot.readthedocs.io/en/latest/CLI.html)から行えるためリファレンスを参考に以下のコマンドでインストールを行います。

```bash
polyglot download LANG:ja
```


## 検出を行う
少し雑ですがツイッターから取得したテキストを元に判定を行います


```bash
echo "【速報でーす！】「進撃の巨人 Season3」７月から総合テレビで放送する予定です。▼くわしくはこちら（NHKアニメワールド）" | polyglot detect
echo "ハイアット リージェンシー 東京より、いちご尽くしの「いちごのアフタヌーンティー」が登場 -https://www.fashion-press.net/news/36750 " | polyglot detect
echo "【震度・震源速報 2018年1月24日】 24日19時51分頃、青森県東方沖を震源とする地震がありました。震源の深さは約30km、地震の規模はM6.2と推定されています。この地震による津波の心配はありません。" | polyglot detect
echo "HKT48のアルバム「092」。 パッと「買ってね！」と言える価格ではないので躊躇してたんですが（正直者）秋元さんからDVD特典に「いい！」とコメントが来たそうなので今更ですが。。素敵なアルバムです。学生さん、お年玉でぜひ！" | polyglot detect
echo "IN 熱海❤️10代の頃からお世話になっている方に昨日は旅館を用意していただいて、今日はその方の別荘にお母さんと泊まらせいただきます😌✨ステキな別荘で綺麗すぎるオーシャンビュー。私だけでなくていつもお母さんも気遣ってくださるんです‥😭本当に感謝しかない。私の第2のお父さん💕" | polyglot detect
```

![dab34416839a2c093f36d39ce73de9be.png](https://qiita-image-store.s3.amazonaws.com/0/35291/bc1e0b6d-0d13-8fc1-cd5d-8c82beb26f48.png)


少しわかりづらいですが、japaneseとして認識されています。
また、日本語と中国語が判別できているかも確認します。

```bash
echo “日本”   | polyglot detect
echo 你好 日本  | polyglot detect
```

![ae8b9dcad2fce7657bf659d11a717e66.png](https://qiita-image-store.s3.amazonaws.com/0/35291/4336edcc-4069-72ad-5375-2f3227fe6092.png)


`日本`だけだと'WARNING base.py: 93 Detector is not able to detect the language reliably.'としてワーニングとちゃんと返しています。`你好 日本`では正しくChineseとして処理されています。

## まとめ
ちょっとしたデータで試しただけですが、日本語として正しく検出できており、また検出言語に自信がないものはワーニングを返すということがわかりました。このライブラリを使用することにより、web上のデータをクローリングした際に、日本語のものだけに絞り込めたらいいなと思います。
openssl で 証明書の期限を確認する

次の記事を参考にして、qiita.com でテストしてみました。
[opensslコマンドでSSL証明書の有効期限を確認する](https://qiita.com/moonphase/items/a3a0937f77494e62213c)
[curlでSSLでつないだときのSSLのヘッダを読みたいのですが、どのような方法があるでしょうか](http://q.hatena.ne.jp/1341451970)

```text
$ openssl s_client -connect qiita.com:443 -servername qiita.com < /dev/null 2> /dev/null | openssl x509 -noout -startdate -enddate
notBefore=Dec  4 00:00:00 2022 GMT
notAfter=Jan  2 23:59:59 2024 GMT
```

使った openssl のバージョンです。

```text
$ openssl version
OpenSSL 3.0.5 5 Jul 2022 (Library: OpenSSL 3.0.5 5 Jul 2022)
```
laravel Uncaught ReflectionException: Class config does not exist


# Uncaught ReflectionException: Class config does not exist

class "config" がないらしい。小文字だし。なにこれ。

## dump-autoloadすると治ることがあるらしい

```
composer dump-autoload
```

こっちでもいい

```
composer dump-autoload -o
```

## キャッシュをクリアしたら別のエラーが

```
Uncaught TypeError: Argument 2 passed to Illuminate\Routing\UrlGenerator::__construct() must be an instance of Illuminate\Http\Request
```

## 結論

こちらよりも、artisanコマンドを実行した際に出るこのエラーが問題。

```
Uncaught TypeError: Argument 2 passed to Illuminate\Routing\UrlGenerator::__construct() must be an instance of Illuminate\Http\Request
```

これが、キャッシュによって起こってた。
キャッシュ消せば解決。

composer update した直後とかだったから、謎に困った。

[Laravelのキャッシュを削除する](https://qiita.com/ryokurosu/items/1d5084215b9050bd91c6)
Uncaught TypeError: Argument 2 passed to Illuminate\Routing\UrlGenerator::__construct() must be an instance of Illuminate\Http\Request


# 原因

大きく3つ

## .envがおかしい

envに、空白があるとマズイ

before

```
APP_NAME=EXAMPLE NAME
```

after 

```
APP_NAME="EXAMPLE NAME"
```

## configにurl()かasset()がある

configフォルダを見て、パス指定を直す

## キャッシュを消す

毎回キャッシュがうざい

```
composer dump-autoload
php artisan clear-compiled
php artisan optimize
php artisan config:cache
```

これでダメなら

```
cd bootstrap/cache //laravelのrootディレクトリ
rm -rf *.php
```
二階以上の層のjsonに値を追加したい

死ぬほど詰まったので、書いた。

# 2階層以上のJSON

```json.js
var data = {
	"A" : {
		"0" : {
			"name" : "hoge",
			"foo" : "bar"
		}
	},
	"B" : {
		"0" : {
			"name" : "aaa",
			"foo" : "bar"
		}
	},
	"C" : {
		"0" : {
			"name" : "bbb",
			"foo" : "bar"
		},
		"1" : {
			"name" : "here",
			"foo" : "bar"
		}
	}
}
```
ここに新しく値を追加したい。

```json2.js
var newdata = {
	"name" : "yeah",
	"foo" : "bar"
}
```

## 仕組みは楽だが、objectの処理がだるい

仕組みは割と簡単。
AかBかCかのキーを取って、長さを取得して、最後にデータを突っ込んでやればいい。

ただ、オブジェクトだと配列みたいに上手くいかない。

```
var length = Object.keys(data["C"]).length;
data["C"][length] = newdata;
```

## foreach回すにも、Object.keysを使う

```
Object.keys(data).forEach(function(k){
	Object.keys(data[k]).forEach(function(v){
		if(newdata.name == data[k][v]){
			console.log("hello");
		});
	});
});
```

なんかあまり綺麗じゃ無さそう。もっといい方法があると信じてる。
GCE(Goole Compute Engine) CoreOS インスタンスで OpenVPN サーバを立てる

漢なら GCE で CoreOS で OpenVPN サーバ建てたいですよね!

やりましょう!

(2020 年 4 月 10 日追記): CoreOS は終了しました https://coreos.com/os/eol/
後継は Fefora CoreOS ですが, GCE ですと Fedora CoreOS には現状対応していません. Container optimized OS を選ぶとよさそうです.
 
## 前提条件

* OS のアップデート対応が面倒なので CoreOS(stable) の自動アップデートに頼りたい
  * 起動中の OpenVPN docker インスタンスも再起動してくれるはず?
* udp 1194 ポートで VPN 通信をする
* GCP ダッシュボードで設定を行う

## 手順

VPN サーバを CoreOS で立てる大まかな手順は

月 5 ドルくらいで Docker で簡単に OpenVPN 環境を手に入れる
https://qiita.com/jyane/items/95164ba6b3323723eb40

の 5, 6 を参考にしてください.

### firewall の設定

上記 URL によりますと, firewall の設定は, iptables ではなくクラウドサービス側での firewall 設定が CoreOS は推奨とのことですので, GCP のダッシュボードで firewall の設定をします.

ネットワークルール `default` で CoreOS インスタンスを建てているとしします.

以下のように `udp:1194` を許可する firewall rule を `default` に追加します. rule の名前を `vpn` にします.

<img width="890" alt="Screen Shot 2018-01-24 at 19.51.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/bcf27bfe-0a1a-2255-e313-4963ec65ebfc.png">


その後, インスタンスの設定で, `network tags` に上記で設定した rule 名 `vpn` を追加します.

<img width="557" alt="Screen Shot 2018-01-24 at 19.52.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/89ed1809-50e8-3b41-e1f8-267f9d37ad38.png">

もしくは, vpn 専用に network rule を作ってもよいでしょう.

## クライアントから接続する

CoreOS インスタンス側では

```
CONTNER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
5d5e4800a5c8        kylemanna/openvpn   "ovpn_run"          10 days ago         Up 10 days          0.0.0.0:1194->1194/udp   hopeful_mirzakhani
```

のような感じで VPN サーバが動いていることを確認し, 

クライアント側で

```
$ sudo openvpn CLIENT.ovpn
```

とすれば接続が行われます!

繋がらない場合は firewall の設定などを再確認してください.

## 自動起動する

CoreOS がリブートしたときに, openvpn コンテナが自動で再起動するようにします.

AWS+CoreOS+Dockerでコンテナの自動起動 1
https://qiita.com/aki/items/979b25ff555eb7ab96fc

を参考にし, systemd ベースで設定してみます.

```
$ sudo vi /etc/systemd/system/docker-ovpn.service
```

```
[Unit]
Description=My Service
After=docker.service
Requires=docker.service

[Service]
ExecStart=/usr/bin/docker run -v $OVPN_NAME:/etc/openvpn -d -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn

[Install]
WantedBy=multi-user.target
```

`$OVPN_NAME`は, 最初のほうで作成したボリュームの名前になります.

今動いている OpenVPN インスタンスがあれば止めておきます.

```
$ sudo systemctl enable /etc/systemd/system/docker-openvpn.service
$ sudo systemctl start docker-openvpn.service
```

journalctl などで起動していることを確認し, CoreOS をリブートして openvpn インスタンスが自動起動すれば成功です.


## クライアントに静的 ip アドレスを割り当てる

https://github.com/kylemanna/docker-openvpn/blob/master/docs/static-ips.md

## TODO

* cloud init で openvpn インスタンスの自動立ち上げを行う.
* 443 ポートに集約したほうがいいかも?
* https://github.com/kylemanna/docker-openvpn にもあるように, docker で VPN を動かすことのセキュリティを考える旅に出たい
【備忘録】クラウドサーバーを使ってみる(3)--Alibaba Cloud でLaravelを導入する（データベースの設定）

個人の学習過程を記録します。

クラウドサーバーで、Laravel5.4のmigrationを利用してデータベースを構築する過程を記録します。

クラウドサーバー:Alibaba Cloud ECS/centos7+Apache2.4+mysql5.7+php7.1




##STEP 1
ローカル環境の`.env`ファイルのデータベースの接続情報を設定し、接続できるかどうかを確認します。

```
$ php artisan migrate:install
```
成功しましたら、例としてpostsというテーブルを作ります。

```
$ php artisan make:migration create_posts_table
```

database/migrationsディレクトリの中に生成日時＋create_posts_table.phpが生成される。

`2018_01_24_103002_create_posts_table.php `

このファイルに入って、CreatePostsTableのクラスに以下のようにメソッドを追加する。




```php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts',function(Blueprint $table){
            $table->increments('id');
            $table->string('title',100)->default('');
            $table->text('content');
            $table->integer('user_id')->default(0);
            $table->timestamps();

        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //ロールバック
        Schema::dropIfExists('posts');
    }
}

```

最後にmigrationでテーブルを生成します

```
＄　php artisan migrate
```


以上のソースをgithubにpushする。

##STEP 2
クラウドサーバー上の`.env`ファイルのデータベースの接続情報を別途設定し、接続できるかどうかを確認します。

```
$ php artisan migrate:install
```
次に、git merge/fetchで最新のソースを取得し、クラウドサーバー上の`2018_01_24_103002_create_posts_table.php `を取得したら、
ローカル環境と同じく、migrationでテーブルを生成します。

```
＄　php artisan migrate
```

今回は開発・テスト用にAlibaba Cloud ECSにデータベースを設定したが、料金節約の為に、クラウドデーターベース（RDS）は利用しません。
Powershellでタスクスケジューラ登録

#Powershellでタスクスケジュールを登録するためのメモ

深夜３時にIEを起動するだけのタスクスケジュールの登録です。
※下のUserがkotetsu75になっている２か所は適宜、お使いのユーザー名に変更してください。

```powershell

$User = New-ScheduledTaskPrincipal -UserId kotetsu75 -LogonType Password
$Act = New-ScheduledTaskAction -Execute "C:\Program Files\internet explorer\iexplore.exe"
$Time = New-ScheduledTaskTrigger -Once -At 3am
$Task = New-ScheduledTask -Trigger $Time -Principal $User -Action $Act
Register-ScheduledTask -InputObject $Task -TaskName "test" -TaskPath \ -User kotetsu75
```

Linuxだとcronで超簡単にできるのに。。。

##無効化するには

```powershell
Disable-ScheduledTask test
```

##有効化するには

```powershell
Enable-ScheduledTask test
```

##実行する

```powershell
Start-ScheduledTask test
```

##終了する

```powershell
Stop-ScheduledTask test
```

#補足：タスクスケジューラに関連するコマンド一覧表示

```powershell
Get-Command | ? Name  -match "ScheduledTask"

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Disable-ScheduledTask                              1.0.0.0    ScheduledTasks
Function        Enable-ScheduledTask                               1.0.0.0    ScheduledTasks
Function        Export-ScheduledTask                               1.0.0.0    ScheduledTasks
Function        Get-ClusteredScheduledTask                         1.0.0.0    ScheduledTasks
Function        Get-ScheduledTask                                  1.0.0.0    ScheduledTasks
Function        Get-ScheduledTaskInfo                              1.0.0.0    ScheduledTasks
Function        New-ScheduledTask                                  1.0.0.0    ScheduledTasks
Function        New-ScheduledTaskAction                            1.0.0.0    ScheduledTasks
Function        New-ScheduledTaskPrincipal                         1.0.0.0    ScheduledTasks
Function        New-ScheduledTaskSettingsSet                       1.0.0.0    ScheduledTasks
Function        New-ScheduledTaskTrigger                           1.0.0.0    ScheduledTasks
Function        Register-ClusteredScheduledTask                    1.0.0.0    ScheduledTasks
Function        Register-ScheduledTask                             1.0.0.0    ScheduledTasks
Function        Set-ClusteredScheduledTask                         1.0.0.0    ScheduledTasks
Function        Set-ScheduledTask                                  1.0.0.0    ScheduledTasks
Function        Start-ScheduledTask                                1.0.0.0    ScheduledTasks
Function        Stop-ScheduledTask                                 1.0.0.0    ScheduledTasks
Function        Unregister-ClusteredScheduledTask                  1.0.0.0    ScheduledTasks
Function        Unregister-ScheduledTask                           1.0.0.0    ScheduledTasks
```
HSPでコルーチンを使った乱数ジェネレーターの実装。

[newlabの使い道を頑張って考えてみる](https://qiita.com/mjhd-devlion/items/44d1a919b5485629e7e8)

HSPにもコルーチンがあるということに衝撃を受けたので、線形合同法で簡単に乱数ジェネレーターを作ってみました。
乱数と言ったらジェネレーター、ジェネレーターっと言ったら乱数みたいな。
ちなみにコルーチンを使わない乱数ジェネレーターは以前別に実装しています。[XorShiftの実装](https://qiita.com/yosgspec/items/e4287262f8dbea2aa815)

```bash:実行例
【乱数ジェネレーター】

34
10618
34

251
8804
251

1770
61641
1770

12403
38290
12403

21299
5903
21299
```
シード値が同一な上段と下段は同じ値が取得できます。

# 線形合同法
まず、線形合同法とは。

X<sub>n</sub> = (A × X<sub>n-1</sub> + C) mod M

の式によって求まる最も簡単な乱数のひとつです。
X<sub>0</sub>・A・C・Mは初期値としてシード値として与え、
X<sub>n</sub>の値は常に変化します。

# 実装
```cpp:
#runtime "hsp3cl"

#module __RandGen Xn,A,C,M,yieId,value
	#define global RandGen(%1,%2=3,%3=7,%4=13,%5=0xFFFF) \
		dimtype %1,5 :\
		newmod %1,__RandGen,%2,%3,%4,%5
	#modinit int X0,int _A,int _C,int _M
		Xn=X0: A=_A: C=_C: M=_M
		newlab yieId,1: return
		*infLoop
			Xn=(A*Xn+C)\M
			value=Xn
			newlab yieId,1: return
		goto*infLoop
	return

	#modcfunc genNextValue
		gosub yieId
	return value
#global

#module Program
	#deffunc main
		sdim _input
		mes "【乱数ジェネレーター】"
		RandGen g1
		RandGen g2,1515
		RandGen g3
		repeat
			input _input,,1
		    mes genNextValue(g1)
		    mes genNextValue(g2)
		    mes genNextValue(g3)
		loop
		
	return
#global
main
```
複数のジェネレーターを保持するためにモジュール型変数を使用しています。
細かいコルーチン文法については元記事参照。
なお、コルーチン内のループはreturnを挟むため、cntが破綻してしまうrepeatの使用は避けています。

# 比較の実装(Node.js)
比較用にJavaScriptでジェネレーターを用いた実装を載せておきます。

```js:
function* RandGen(Xn=3,A=7,C=13,M=0xFFFF){
	for(;;){
		yield Xn=(A*Xn+C)%M
	}
}

(async function(){
	console.log("【乱数ジェネレーター】");
	const g1=RandGen();
	const g2=RandGen(1515);
	const g3=RandGen();
	for(;;){
		await new Promise(res=>process.stdin.once("data",res));
		console.log(g1.next().value);
		console.log(g2.next().value);
		console.log(g3.next().value);
	}
})();
```

# おまけ
見た目をjsとかをその他のyieldな言語に近づけてみた。

```c++:
#runtime "hsp3cl"

#module __RandGen Xn,A,C,M,yieId,value
	#define yieId(%1="__undefined__") value=%1: newlab rezume,1: return
	#modfunc genNext
		gosub rezume: return
	#modcfunc genValue
		return value
	#modcfunc genNextValue
		gosub rezume: return value

	#define global RandGen(%1,%2=3,%3=7,%4=13,%5=0xFFFF) \
		dimtype %1,5 :\
		newmod %1,__RandGen,%2,%3,%4,%5
	#modinit int seed,int _A,int _C,int _M
		Xn=seed: A=_A: C=_C: M=_M
		yieId
		*infLoop
			Xn=(A*Xn+C)\M
			yieId Xn
		goto*infLoop
	return
#global

#module Program
	#deffunc main
		sdim _input
		mes "【乱数ジェネレーター】"
		RandGen g1
		genNext g1
		RandGen g2,1515
		RandGen g3
		repeat
			input _input,,1
		    mes genNextValue(g1)
		    mes genNextValue(g2)
		    mes genNextValue(g3)
		loop
		
	return
#global
main
```

# 終わりに
結構普通のコルーチン(ジェネレーター)として使えて満足でした。
モジュールの代わりに特異な変数を埋め込んだdefineでも行けるかな?
Jupyter notebook を Gistにアップしたときに Python の matplotlib 出力 gif が動くようにする．

# 本日は

- Jupyter notebook 便利ですよね．コードを手軽に書けますし．
- Pythonのmatplotlib 便利ですよね．可視化ツールとして．
- gistって便利ですよね．簡単にコードを共有できますし．
- gif って便利ですよね．動く可視化のツールとして．

 便利そうですよね．上記が統合されると．

本日は上記の統合をやってみました．というお話です．

# どういうことができるか．

![output.gif](https://qiita-image-store.s3.amazonaws.com/0/135978/bd7f4c87-95f0-fefe-ea2d-ba8f2c6694a1.gif)

が Jupyter notebook 上で閲覧ができます．そしてgistにて共有できます．例えば下記のリンクをクリックするとみられます．

[gibbs-animate.ipynb](https://gist.github.com/terasakisatoshi/5e664cbaa051b09377b4ece5a8c03bf1)

# 環境構築
よくあるAnimationを作るサンプルを動かすときにoutput.gifではなくoutput.htmlのように変換を強要されるのが謎だったのですが，そもそもImageMagickを導入していなかったみたいなのでそこから始めます．
## Windows 
ImageMagick ([3], [4]) の導入をします．
 
1. http://www.imagemagick.org/script/download.php からバイナリーをインストールします．
2. [4] の方法に従ってmatplotlibrc に `matplotlib.matplotlib_fname()` の出力結果を付け加えます．例えば 

> `animation.convert_path:  C:\Program Files\ImageMagick-7.0.1-Q16\magick.exe`

## Mac 
こちらは簡単

```shell-session
$ brew install imagemagick
```

でOKでした．

# 実装例

とりあえず下記のようなコードを例にします．

```python

fig,ax=plt.subplots()
ax.set_xlim(-4,10)
ax.set_ylim(-4,4)

b=0.8
x=10.0
y=3.0
times=200 
    
def update(data,*fargs):
    fig,ax=fargs
    global x,y
    u1 = rand()
    u2 = rand()
    x_old=x
    x = sqrt(-2*log(u1))*cos(2*pi*u2) + b*y
    ax.plot([x_old, x], [y, y], lw=1)
    y_old = y
    y = sqrt(-2*log(u1))*sin(2*pi*u2) + b*x
    ax.plot([x, x], [y_old, y], lw=1)
    ax.set_title("{}".format(data))

ani=animation.FuncAnimation(fig,update,interval=100,fargs=(fig,ax))

outputfile="images/output.gif"

if not os.path.exists(os.path.dirname(outputfile)):
    os.mkdir(os.path.dirname(outputfile))
    
ani.save(outputfile, writer="imagemagick")
plt.close(ani._fig)
```

これでoutputfileのPath上にoutput.gifが生成されます．
これをNotebook上で表示させるようにするために生成したgifをHTMLタグに埋め込みます．

```python
import base64
from IPython.display import HTML

GIF_TAG = """<img src="data:image/gif;base64,{0}" alt="some_text">"""

def get_giftag(outputfile):
    with open(outputfile, "rb") as imagefile:
        encoded_string = base64.b64encode(imagefile.read())
        tag = GIF_TAG.format(encoded_string.decode("utf-8"))
    return tag


HTML(get_giftag(outputfile))
```

最終的な実装は
[gibbs-animate.ipynb](https://gist.github.com/terasakisatoshi/5e664cbaa051b09377b4ece5a8c03bf1)
をご覧ください．

# Julia 版

Julia移植版として作っていただきました[2] ありがとうございます．


# 参考文献

- [1] Python [zehsilva/animate-matplotlib-python.ipynb](zehsilva/animate-matplotlib-python.ipynbhttps://gist.github.com/zehsilva/18c28992796d9be99e16)

- [2] Julia http://nbviewer.jupyter.org/gist/genkuroki/b46b0a094ee232302d41780defaffd6e
- [3] [今更「ImageMagick」というモノを知った](http://neos21.hatenablog.com/entry/2017/04/01/105704)
- [4] [matplotlib のanimation を保存](http://cartman0.hatenablog.com/entry/2016/05/04/200704)
Dart2 で new や const が省略できる

らしい

https://www.youtube.com/watch?v=9FA3brRCz2Q

ということは、Flutterのコードがすっきりする。

これが

```dart
Widget build(BuildContext context) {
  return new Container(
    height: 56.0,
    padding: const EdgeInsets.symmetric(horizontal: 8.0),
    decoration: new BoxDecoration(color: Colors.blue[500]),
    child: new IconButton(
      icon: new Icon(Icons.menu),
      tooltip: 'Navigation menu',
    ),
  );
}
```

こうなる。

```dart
Widget build(BuildContext context) {
  return Container(
    height: 56.0,
    padding: const EdgeInsets.symmetric(horizontal: 8.0),
    decoration: BoxDecoration(color: Colors.blue[500]),
    child: IconButton(
      icon: const Icon(Icons.menu),
      tooltip: 'Navigation menu',
    ),
  );
}
```

※ ただし const は省略しないで書いておいたほうがよい
Electronic Hardware

Electronic hardware master distributor & supplier of Hex Standoffs, Connector hardware Captive Panel Screws in Stainless Steel, Aluminum, Brass, Nylon, and Steel.

![uploading-0]()![jet.JPG](https://qiita-image-store.s3.amazonaws.com/0/233369/58807ff6-90ef-e51d-b1f1-55bc53de945f.jpeg)

https://www.jetfitting.com/electronic-hardware
surfaceviewを使って、以前はなかった問題

surfaceviewを使って開発をしていて以前はなかった問題ですが、

#touchdownの取得が遅い

という問題、touchUpまでdownも取れてない。android studio見ると何か注意みたのがあって
performClickをオーバーライドしてないだろ。と注意を受けてる

これってコード上でクリックしたことにする関数だったと思いますが、

なぜかoverrideの必要性。extendsするのも面倒なので、

```java:a.java
glSurfaceView = new GLSurfaceView(getActivity().getApplicationContext()){
            @Override
            public boolean performClick() {
                return true;
            }
        };
```
こうすれば、touchdownもすんなりと受けれる。
でも注意消えないけど、取り急ぎ、動作できた。

あとは、galaxy s8で便利だなと思っていた、ホームなどのボタンの格納について
#画面の縦幅の取得がおかしくなる。

というのでsurfaceview関係ないのですが、自分だとタッチの位置がずれちゃっていて、s8だとホームボタンとかがユーザーの任意で表示非表示ができるのですが（他こういう端末あるのか。。）、非表示の時の縦幅がおかしかった

```java:a.java
DisplayMetrics displaymetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(displaymetrics);
height = displaymetrics.heightPixels;
```
で取得していた画面の大きさ（ステータスバーも含んだ大きさ）

でだめだったのだが、

```java:a.java
DisplayMetrics displaymetrics = new DisplayMetrics();
wm.getDefaultDisplay().getRealMetrics(displaymetrics);
height = displaymetrics.heightPixels;
```
これで取得ができる。がこれは古い端末には使えないので
関数名で前までの取得してた大きさを偽物としてしまっていますね。

```java:a.java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            wm.getDefaultDisplay().getRealMetrics(displaymetrics);
}else{
            wm.getDefaultDisplay().getMetrics(displaymetrics);
}
```
これで縦幅も取得できる。

ただ、面倒なのが、リサイズとかは
```java:a.java
_view.addOnLayoutChangeListener(new OnLayoutChangeListener() {
        @Override
        public void onLayoutChange{}
});
```
でこの度に変更が必要そう
オブジェクトを分割代入する際に、変数に別名をつける（備忘録）

オブジェクトを分割代入する際に、プロパティ名とは別の名前にできたら便利だなと思い調べた。
意外な書き方でちょっと驚いた。


## こんな感じ

```hoge.js
const itemObject = {
  id: 1,
  name: "foo",
}

const { id: itemId, name: itemName } = itemObject

console.log(itemId) // 出力される
console.log(itemName) // 出力される

console.log(id) // エラーになる
console.log(name) // エラーになる

```

## 有効な場面

様々な場面で使えると思うが、APIを複数回叩く場面で使ってみた。
APIのレスポンスをオブジェクトで受け取る際に、名前の重複を回避して分解できる。

```fuga.js
// APIレスポンスの共通オブジェクト{response, error}があるとして

const { response: res1, error: err1 } = yield apiFunction1()
const { response: res2, error: err2 } = yield apiFunction2()

if (!(err1 || err2)) {
  /* ... */
}


// 別名をつけないと、冗長でちょっと気持ち悪いと感じる時もある
const object1 = yield apiFunction1()
const object2 = yield apiFunction2()

if (!(object1.error || object2.error)) {
  /* ... */
}

```


## 締めの感想

どうしてこんな書き方なのかはよく分からないが、できる。
モチベーションが余ったら調べたい。


## 参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

ページの真ん中あたりに記述あり
Java でもa == 1 && a == 2 && a == 3でtrueって出力させたい（魔術でもなんでもない王道編）

ただのOverrideです。
さっき書いた↓のコードはProxyで「動的」に処理を変えてますが、こっちは「静的」になっただけです。

[Java でもa == 1 && a == 2 && a == 3でtrueって出力させたい（黒魔術ってほどでもないグレーな魔術編） - Qiita](https://qiita.com/momosetkn/items/48039a6c0ee84f3979fa)

```java
public class JudgeImpl2 {
	public static void main(String... args) throws Exception {
		{
			System.out.println("まずは普通に実行すると・・・");
			JudgeImpl2 judge = new JudgeImpl2();
			test(judge);
		}
		{
			System.out.println("上書きすると・・・");
			JudgeImpl2 judge = new JudgeImpl2() {
				@Override
				public boolean judge(int a ) {
					return true;
				}
			};
			test(judge);
		}
	}

	private static void test(JudgeImpl2 judge){
		System.out.println( judge.judge(1) );
		System.out.println( judge.judge(2) );
		System.out.println( judge.judge(3) );
	}

    public boolean judge(int a) {
        if (a == 1 && a == 2 && a == 3) {
            return true;
        } else {
            return false;
        }
    }
}
```

# 実行結果

```
まずは普通に実行すると・・・
false
false
false
上書きすると・・・
true
true
true
```
Laravel では env() を config 系ファイル以外の場所に書いてはいけない

説明するよりもフレームワークのコード読んでもらったほうが早いので掲載します。

[framework/LoadEnvironmentVariables.php L12-L31](https://github.com/laravel/framework/blob/197a7c3b86d24b8698c61107263b68cb737d51c8/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php#L12-L31)

```php
    /**
     * Bootstrap the given application.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public function bootstrap(Application $app)
    {
        if ($app->configurationIsCached()) {
            return;
        }

        $this->checkForSpecificEnvironmentFile($app);

        try {
            (new Dotenv($app->environmentPath(), $app->environmentFile()))->load();
        } catch (InvalidPathException $e) {
            //
        }
    }
```

**`.env` ファイルの読み込みは， `php artisan config:cache` していない場合にしか行われません！** キャッシュを有効にしてある場合， `.env` に書いてあるだけでシェルから起動する時点で定義されていない環境変数はすべて未定義になってしまうので注意しましょう。

要するに

```php:config/app.php
    'env' => env('APP_ENV', 'production'),
```

こういう使い方はOKで，

```php:app/User.php
class User extends Model
{
    public function debug(): string
    {
        if (env('APP_ENV', 'production') === 'production') {
            /* ... */
        } else {
            /* ... */
        }
    }
}
```

こういう使い方はダメだと言うことです。**環境変数で分岐させたい場合は，一度必ず`config/*.php`の中に落としましょう。**
webpack3でbabelとscssを別々のエントリーポイントからコンパイルする方法

こんにちは。初投稿です。
gulpを卒業し、webpackオンリーの開発環境を作りたいと思っている見習いフロントエンドエンジニアです。

##本題
babelとscssは別エントリーポイントで、
babelはbabel、scssはscssのファイルのままコンパイルし、
それぞれをjs, cssファイルに書き出すような最低限の設定内容です。

色々調査しても、エントリーポイント1つで、jsオンリーでやっていたり、
webpack2以下の記事しか発見できなかったりだったので書いてみました。

エントリーポイントは1つの方がきれいなんだろうなと思いつつ・・・
需要があれば、幸いですm(-ω-)m
入門的な内容だと思いますので、ツッコミどころあればバシバシお願いします。

##パッケージインストール

```
npm i -D webpack babel-core babel-loader babel-preset-env css-loader csscomb csscomb-loader node-sass sass-loader style-loader stylelint-webpack-plugin extract-text-webpack-plugin 
```
　　
##webpack.config.json
（ディレクトリ位置は適宜工夫ください。）

```js:webpack.congfig.js
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');

module.exports = [
  // js
  {
    watch: true,
    entry: {
      js: ['babel-polyfill', './src/babel/entry.js']
    },
    output: {
      path: `${__dirname}/public/js/`,
      filename: 'bundle.js'
    },
    module: {
      rules: [
        {
          test: /\.js$/,
          use: [
            {
              loader: 'babel-loader',
              options: {
                presets: [
                  ['env', {'modules': false}]
                ]
              }
            }
          ],
          exclude: /node_modules/,
        }
      ]
    },
    devtool: 'source-map'
  },

  // scss
  {
    entry: {
      'main': './src/scss/main.scss',
      // ここにscssを定義していく感じです。
    },
    output: {
      path: `${__dirname}/public/css/`,
      filename: '[name].css'
    },
    devtool: 'source-map',
    module: {
      rules: [
        {
          test: /\.scss$/,
          use: ExtractTextPlugin.extract({
              fallback: 'style-loader',
              use: [
                {
                  loader: 'css-loader',
                  options: { sourceMap: true }
                },
                {
                  loader: 'sass-loader',
                  options: { sourceMap: true }
                }
              ]
            }
          )
        }
      ]
    },
    plugins: [
      new ExtractTextPlugin('[name].css')
    ]
  }
];
```
初めてのRaspiでマイク入力して音声聞くまで

#Raspi物理セットアップ
・マイクロSDカード買う（買い忘れてて屈辱のコンビニ）
・GUIない方のイメージ落としてくる
・SDカードフォーマットしてイメージ焼く
※SDカードの裏表間違えててしばらく刺さらなかった
・RaspiにSDカード挿して、USBキーボード挿して、（使わないのに）USBマウス挿して
　Lanケーブル挿して、HMDI挿して、2Aのマイクロusb挿して…

動かなかったｗ
電源挿し直したら映った。

# ソフトウェア初期セットアップ
・アップデート、アップグレード、ファームアップデート
・音声周り必要なもの
・SSH有効化

#USBオーディオ
・usb挿す
・lsusbで確認
・録音→再生で垂れ流し
→再生されない
→usbオーディオからも、ボードからも音が出てない
→マイク音量50％
→HDMIから出力されてただけだった。

#フーチャー
・PCに送りたい
railsでrootのURLを変更する

railsってそのまま

```commandline:
$ bundle exec rails s -p 3000
```
で起動すると http://localhost:3000 で初期画面があらわれますよね。
今回はその初期画面が出るURLを変更してみたいと思います.

#準備
まずrailsのルートディレクトリにあるGemfileに以下の一文を追加

```ruby:
gem 'unicorn'
```
Gemfile に記載されているgem を全てインストールします。

```
$ bundle install --path vendor/bundle
```

#実行
今回は http://localhost:3000/hoge で初期画面を出して見ます

```
$ bundle exec unicorn_rails -p 3000 --path /hoge
```

これだけ.
Android デバイスにインストールされたアプリの APK を取得する方法（Windows版）

タイトルそのまま。Android 7.0 (Nougat) 以前と以降で手順が異なる点に注意する。
コマンドは Window コマンドプロンプトから実行する前提です。

# 謝辞
以下を参考にさせて戴きました。MacやLinuxの場合は こちらをご覧ください。
[・Android 端末からアプリ(apk)を取得する](http://nlogic.jp/?p=284)
[・Android 7.0 Nougatにおいて adb pull でapkを抽出できない問題の解決策](https://qiita.com/ComicCafeApp/items/12be4244ac2d81ab9b06)

# 方法
## Android デバイスに接続する
デバイスが USB 接続の場合は不要です。
コマンドプロンプトから次のコマンドを実行します。IPアドレスは Android デバイスで確認してください。

```cmd:cmd
adb connect 192.168.111.222
```

## アプリのパッケージ名を調べる
[Google Play Store](https://play.google.com/store/apps?hl=ja) でアプリのページを開いて、URLのidからパッケージ名を確認します。
例えば、「[Google開発者サービス](https://play.google.com/store/apps/details?id=com.google.android.gms&hl=ja)」アプリの場合、URLは

 ```text:url
https://play.google.com/store/apps/details?id=com.google.android.gms&hl=ja
``` 

ですので、パッケージ名は ```com.google.android.gms``` です。

## アプリの APK 保存先を調べる
コマンドプロンプトから次のコマンドを実行します。
パッケージ名 ```"com.google.android.gms"``` は調べたいアプリのものに変更してください。
ここでは ```/data/app/com.google.android.gms-1/base.apk``` が APK の保存先です。

```cmd:cmd
adb shell pm list packages -f | find "com.google.android.gms"
* daemon not running; starting now at tcp:5037
* daemon started successfully
package:/data/app/com.google.android.gms-1/base.apk=com.google.android.gms
```

## APK を取得する
Android 7.0 以降では APK を一度、アクセス権がある場所にコピーする必要があります。
アクセス権がある ```/storage/emulated/0/Download``` にコピーをします。
コピーはコマンドプロンプトから次のコマンドで実行します。

```cmd:cmd
adb shell cp /data/app/com.google.android.gms-1/base.apk /storage/emulated/0/Download
```

続いて、Android デバイスから APK を取得します。APK はコマンドプロンプトのカレントディレクトリに保存されます。
APK のコピーをしていない場合は、先の手順で確認した APK 保存先から そのまま取得できます。

```cmd:cmd
adb pull /storage/emulated/0/Download/base.apk
```

以上です。
Markdownのメモ

学習したらQiitaにメモる習慣をつけるですが、なんなら読みやすい文章にしたいですね。
なのでアウトプットの練習がてら、Markdown記法のメモを書きます。

#コード表現
**↓記法↓**
>
>\`\`\`ruby.qiita.rb
>puts 'hogefugabar'
>\`\`\`
>

**↓結果↓**

```ruby.qiita.rb
puts 'hogefugabar'

```
↑ファイル名としてハイライトを置ける記法


## インラインのコード表現
**↓記法↓**
>\`puts\`はオブジェクトを文字列に変換して、改行を加えて標準出力します。

**↓結果↓**
`puts`はオブジェクトを文字列に変換して、改行を加えて標準出力します。

# テキストの装飾
**↓記法↓**

```

ノーマルのhoge
イタリックの_hoge_
強調された__hoge__
打ち消し線の~~hoge~~

```

**↓結果↓**
ノーマルのhoge
イタリックの_hoge_
強調された__hoge__
打ち消し線の~~hoge~~

`_(アンダーバー)`でなく`*(アスタリスク)`も使える。

#折りたたみ
使い所は限られそうだけど、一つの記事に多くの情報をすっきり書き込めるかも。
**↓記法↓**

```

<details><summary>要約に当たる文章</summary>説明する文章達。</details>

```
**↓結果↓**

<details><summary>要約に当たる文章</summary>説明する文章達。</details>

# リスト
#### Disc型
**↓記法↓**

```

+ 項目
- 項目
* 項目 
 * 項目

```
**↓結果↓**


+ 項目
- 項目
* 項目
 * 項目

+, -, * 3つとも使えて、改行すると自動でリスト記号を敷いてくれる。

#### Decimal型
**↓記法↓**

```

1. 項目
2. 項目
3. 項目

```
改行で行頭に番号を順番に振ってくれる。

#### Definition型
**↓記法↓**


```

<dl>
  <dt>Windows</dt>
  <dd>MicrosoftのOS</dd>
  <dt>Elcapitan</dt>
  <dd>AppleのOS</dd>
</dl>

```
**↓結果↓**

<dl>
  <dt>Windows</dt>
  <dd>MicrosoftのOS</dd>
  <dt>Elcapitan</dt>
  <dd>AppleのOS</dd>
</dl>

HTMLのタグを使う。
定義する用語(dt要素) 用語に対する説明(dd要素)の事。
dlタグ内では マークダウン記法の修飾が使えない。

#### Checkbox型
**↓記法↓**

```

- [ ] hoge
- [x] huga
- [ ] bar

```
**↓結果↓**

- [ ] hoge
- [x] huga
- [ ] bar

実際にチェックはできない。

# 引用の書き方
**↓記法↓**

```

>行頭に>をつけると引用文になる。
>複数行の場合は、それぞれの行にも>をつける。
>>多重引用文は>を追加していく。

```
**↓結果↓**

>行頭に>をつけると引用文になる。
>複数行の場合は、それぞれの行にも>をつける。
>>多重引用文は>を追加していく。

# 自動リンク
```

<https://qiita.com/trend>

```
<https://qiita.com/trend>

# インラインリンク
**↓記法↓**

```

[qiitaのトレンドへ](https://qiita.com/trend qiitaのトレンド)

```
**↓結果↓**

[qiitaのトレンドへ](https://qiita.com/trend qiitaのトレンド)

タイトルはマウスオーバー時のキャプションの事。行頭に`!(エクスクラメーション)`付けると画像を貼れる。

# テーブル記法
**↓記法↓**

```

|left hoge|center hoge|right hoge|
|:--------|:---------:|---------:|
|hoge1    |hoge1      |hoge1     |
|hoge2    |hoge2      |hoge2     |

```
**↓結果↓**

|left hoge|center hoge|right hoge|
|:--------|:---------:|---------:|
|hoge1    |hoge1      |hoge1     |
|hoge2    |hoge2      |hoge2     |

`:--` 左寄せ `:--:`中央寄せ `-:`右寄せ

##テーブルの簡単な入力
> 3x2

これ入力するだけで3列2行のMarkdownが自動生成される。

# 注釈の入れ方
本文中に`[^1]`や`[^任意の文字列]`と入れると、脚注へのリンクが貼れる。[^1]
注釈の内容は`[^1]:hogehoge`と記述する。
[^1]: 注釈内容を記述する位置はどこでも良い。
***
<br>
Slackで積極的に使ってみて練習するぞー。
TrelloやPivotalTrackerでもどこでも使おう。

#参考リンク
* [Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#fn1)
* [Markdown記法入門](https://qiita.com/pkrpkrhogehoge/items/671f3b50efbca28fdbfc)
* [Markdown再入門](https://qiita.com/t_wkm2/items/372fd1c851c4d221b1f3)
Project Euler Q66 【ディオファントス方程式】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
次の形式の, $2$次のディオファントス方程式を考えよう:
$x^2 - Dy^2 = 1$

たとえば $D=13$ のとき, $x$ を最小にする解は $649^2 - 13×180^2 = 1$ である.

$D$ が平方数$(square)$のとき, 正整数のなかに解は存在しないと考えられる.

$D = {2, 3, 5, 6, 7}$ に対して $x$ を最小にする解は次のようになる:
$3^2 - 2×2^2 = 1$
$2^2 - 3×1^2 = 1$
$9^2 - 5×4^2 = 1$
$5^2 - 6×2^2 = 1$
$8^2 - 7×3^2 = 1$

したがって, $D ≤ 7$ に対して $x$ を最小にする解を考えると, $D=5$ のとき $x$ は最大である.

$D ≤ 1000$ に対する $x$ を最小にする解で, $x$ が最大になるような $D$ の値を見つけよ.

## アプローチ
答えの$D$のとき$x$は$38$桁の数になるようで、ループして計算するやり方だと到底できない。
ペル方程式というものを使用すれば解けるらしいのでやってみる。
(ちなみにペルさんが発見したものではないらしい。)

1.$\sqrt{D}$を連分数展開し、$\sqrt{D}=[a_0;(a_1,a_2,...,a_m)]$とおく。

2.$\sqrt{D}$を元に$[a_0;a_1,a_2,...,a_{m-1}]$を考えると、
これは$\sqrt{D}$の近似分数$\frac{P}{Q}$を表しているが、
実はこの$P$と$Q$が$P^2-DQ^2=±1$を満たす。

3.$m\%2=0$の場合は$P^2-DQ^2=1$であり、$(P,Q)=(x,y)$である。
$m\%2=1$の場合は$P^2-DQ^2=-1$であるがペル方程式の性質により、
$x+y\sqrt{D}=(P+Q\sqrt{D})^2$が成り立つ為、
$x=P^2+Q^2D$、$y=2PQ$となる。

連分数展開についてはこちらを参照(私の記事)。
[Project Euler Q64 【奇数周期の平方根】 - Qiita](https://qiita.com/tea63/items/78630b245c424dadec01)

## 解答

```bash
time seq 1000 |
awk '{print $1,int(sqrt($1))}' |
awk '$2!=sqrt($1)' |
awk '{a=$2;b=a;c=1;for(i=1;i<=999;i++){if(n[$1,a,b,c]!=1){print $1,a;n[$1,a,b,c]=1;c=($1-b^2)/c;a=int((b+$2)/c);b=$2-((b+$2)%c)}else{break}}}' |
awk '{if(k!=$1){printf "\n"$0" "}else{printf $2" "};k=$1}' |
awk -M 'NF{s[-1]=1;b[-1]=0;s[0]=0;b[0]=1;for(i=3;i<=NF-1;i++){s[i-2]=$i*s[i-3]+s[i-4];b[i-2]=$i*b[i-3]+b[i-4]};print $0,$2*b[NF-3]+s[NF-3],b[NF-3]}' |
awk -M 'a=(NF-4)%2==0{print $1,$(NF-1),$NF} !a{print $1,$(NF-1)^2+$NF^2*$1,2*$(NF-1)*$NF}' |
sort -k2,2n |
tail -1 |
awk '$0=$1'
661

real    0m0.624s
user    0m0.528s
sys     0m0.399s
```

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/066.html

## 参考にさせて頂いたサイト様
[Project Euler 66 _ ディオファントス方程式 - PEをMathematicaで](http://variee.hatenadiary.com/entry/2017/05/26/003000)
[ペル方程式 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%9A%E3%83%AB%E6%96%B9%E7%A8%8B%E5%BC%8F)
ssh/scp多段接続〜踏み台サーバを越えて〜

# 概要
多段接続したいと思った時、都度自前のノートからコピペしていたのでノート無しには何もできなくなってしまった。

複数サーバを経由しなければならない時、
以下のように1台づつファイルを転送するオペレーションになりがちである。

# 通常転送
![スクリーンショット 2018-01-24 18.20.23.png](https://qiita-image-store.s3.amazonaws.com/0/75761/af91876c-ad65-0871-5835-e3a1a17d2372.png)


これでは送信元サーバで転送コマンドを叩くだけでなく、
踏み台サーバでも転送コマンドを叩かなければならない。
サーバ同士の関わりが強い状態なので、cronに処理を仕込もうにも非常にやりにくい。

# 多段転送
![スクリーンショット 2018-01-24 18.02.05.png](https://qiita-image-store.s3.amazonaws.com/0/75761/e0147322-52dd-3d0e-a2e6-eede8324ab91.png)

scpのProxyCommandを使った多段接続機能を使えば
転送処理の為だけにわざわざ踏み台サーバに入る必要はない。

```
scp -r -o "ProxyCommand ssh -i ~/.ssh/key ユーザー@踏み台 -W %h:%p" testdir ユーザー@送信先:/tmp/.

もしくは

scp -r -o "ProxyCommand ssh -i ~/.ssh/key ユーザー@踏み台 nc %h %p" testdir ユーザー@送信先:/tmp/.
```

上記２つの違いは、-Wオプションを使うか、nc (netcat)を使うかの違いである。
ncオプションの場合、踏み台サーバにもncが使えるようにしておく必要がある。
一方で-Wオプションの場合は、そこを意識しなくて良い。
%h %pはそれぞれホスト、ポートを表している。


※上記コマンドは鍵認証を用いている為、パスワード認証で行う場合は -i ~/.ssh/key を適宜削除すること。

# 注意事項
sshで接続すると接続元に書かれる
.ssh/known_hostsは踏み台には書かれず、送信元に書かれる。

複数の環境を持っており、その数だけ踏み台サーバがあり、
送信先のIPが同じ（192.168.1.201）の場合、
送信元の ~/.ssh/known_hosts ファイルをメンテナンスする必要がある。
Unityからアプリダウンロード用のAppStore、GooglePlayへの遷移先URL メモ

■iOS側追記

　実際に運用してみたら・・・・・
　・・・・遷移しなかったのでiTunesConnectのマイAppの自分のアプリの**App 情報**を選択し、
　App Storeで表示で表示されるURLをそのまま張り付ける。
　**（※アプリ名に日本語名がある場合、注意しないといけない。
　%表記に変換しないと本番アプリからAppStoreへ遷移しなかった）**


■Android側

```
　https://play.google.com/store/apps/details?id=アプリID
```

　アプリIDはバンドルID

　■参考URL
　http://www.clrmemory.com/android/get-url-android/

■iOS側

```
　https://itunes.apple.com/[参照国コード]/app/[アプリ名]/[アプリid]?l=ja&ls=1&mt=8
```

　参照国コード：日本ならjp、米国ならus
　アプリ名：日本語ならアプリ名そのまま（多分）
　アプリID：iTunesConnectの該当アプリの登録情報を確認

　例）モンスターストライク
　https://itunes.apple.com/jp/app/モンスターストライク/id658511662?mt=8

　■参考URL
　https://qiita.com/akatsuki174/items/92bcf53d04a77cf293c0
　https://qiita.com/ymmtyuhei/items/9188adf4aa63f20a73ab
Table内のセレクトボックスで設定された値を取得、判定

備忘録（自分用）

eq(i)のi番目(0はじまり)の列の値を総取得する
.select は、厳密には セレクトボックスの値を取得するためのセレクタを指定

```javascript
function lock(intNo) {
	var flgUnconfirmed=false; /* NGフラグ */
	$('table.sec_'+intNo+' tr').each(function(i){
     		chflg = $('td',this).eq(0).children(".select").val();
			if(chflg==0) flgUnconfirmed = true;
	});
	if(flgUnconfirmed==true){ 
            alert('未確認があります。'); 
            $('xxxx.sec_'+intNo).focus(); return;
        }
}
```
個人利用Bitnami Remineの高速化

スモールスタートとはいえ、あまりに遅すぎるので、少々調べてみた。

# メール通知しないならチェックをすべてOFF

個人的な利用なのでメール通知は使っていないのですが、使わないならちゃんとチェックをすべて外しておかないとあかん模様（当たり前）
いままで結構な待ち時間を浪費した。。。

[追記] デフォルトのメール通知オプションも「通知しない」にすること。これら以外でも処理が走っている気がする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/202646/6cfb3473-4de6-3e97-b7af-53b03c10f6cd.png)

メール送信したい人は、追加・更新処理とメール送信を非同期する方法があるらしいですよ。

# MySQL

MySQLの設定ファイル(./redmine-3.4.3-1/mysql/my.ini)を島津製作所様の事例からまるっといただきます。

- https://www.slideshare.net/kakahane/my-sql-osaka5
- https://www.slideshare.net/kakahane/redmine-48214015
- https://gist.github.com/akahane92/771f9a52d81af9864dd8

```mysql
#================================================================
# InnoDB Paramaters
# Pre requesties
# 4GB or more memory,
# http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html
innodb_buffer_pool_size             = 3G #後述
innodb_log_file_size                = 1G
innodb_thread_concurrency           = 8
innodb_additional_mem_pool_size     = 16M
innodb_buffer_pool_dump_at_shutdown = ON
innodb_buffer_pool_load_at_startup  = ON

# MySQL Server System Variables
# http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html
join_buffer_size                    = 128M
sort_buffer_size                    = 1M
query_cache_type                    = 1
query_cache_size                    = 64M
query_cache_limit                   = 2M
tmp_table_size                      = 64M
max_heap_table_size                 = 64M
#================================================================
```

最初MySQLが起動しなくなったので、ログ(./redmine-3.4.3-1/mysql/data/mysqld.log)をみたところ、

```
[ERROR] innobase_buffer_pool_size can't be over 4GB on 32-bit systems
```

とのことですが、64bit Windowsなのに何故でしょう。

```shell
> mysql --version
mysql  Ver 14.14 Distrib 5.6.38, for Win32 (AMD64)
```

32bitでした、、、Bitnamiのコミュニティで64bit探したときは両対応って書いてあったけど、64bit windows上でも(32bit Archtectureを使って)動くようにしているという意味ですな。大人しく 4→3Gに修正した(3て)。

[Where is Bitnami redmine for windows 64 bit version?](https://community.bitnami.com/t/where-is-bitnami-redmine-for-windows-64-bit-version/37018)

# 他にも効果があったものは後で追記。
gitメモその1(初級編）


適当にまとめ。
[サルでもわかるGit入門](https://backlog.com/git-tutorial/ja/)の入門編レベルの内容を自分用に整理。

#用語的なもの
##リポジトリ
リモートリポジトリとローカルリポジトリがある。
リモートはほかのユーザとも共有している、ローカルは自PC内専用。
ローカルリポジトリのデータを更新してもリモートにはそれだけだと反映されない→ほかの人にはその更新が見えない。

既存の開発プロジェクトに途中から参画する場合なんかは、すでにリモートリポジトリが存在するはずなのでそのリポジトリをコピーしてローカルリポジトリを作成する。
新規プロジェクトに参画する場合は、リモートリポジトリの作成から行う必要あり。まあ、そういうの詳しい人が作ってくれちゃうかもですが。


##ローカルリポジトリへの操作
ファイルやディレクトリの追加、変更、削除をローカルリポジトリに反映する操作をコミットと呼ぶ。
SVNだとコミットの段階でほかの人と更新が共有されるので混同に注意。
コミットの際のメッセージは

1行目 : コミットでの変更内容の要約
2行目 : 空行
3行目以降 : 変更した理由

みたいに書くのが良いらしい。

##ワークツリーとインデックス
ローカルリポジトリの内容を（SVN的な感覚でいうと）チェックアウトした作業ディレクトリ的なものをワークツリーという。
ローカルリポジトリにコミットしたい内容を登録しておく場所をインデックスという。
なのでSVNみたいにいきなりリポジトリにコミットされるわけではなく、いったんインデックスに登録する作業がGitでは必要。

##ワークツリー、ローカルリポジトリ、リモートリポジトリ間でのファイル同期に関する用語
クローン(clone):リモートリポジトリの内容をコピーして自コンピュータにローカルリポジトリを作成する。
プッシュ(push)：ローカルリポジトリの更新内容をリモートリポジトリに反映する。競合が発生した場合はマージしないとプッシュできない。
プル(pull)：リモートリポジトリの内容をローカルリポジトリに反映する。実際はフェッチしてマージするみたいな感じらしいですが、いったんひとまずこのくらいの解釈で。
ステージ(stage)：ワークツリーでの更新内容をインデックスに登録する。gitコマンドだとaddってうっていた気がする。
フォーク(fork)：リモートリポジトリの内容をコピーしてリモートリポジトリを作る

##その他の用語
origin：しょっちゅう見かけるが要するにリモートリポジトリのことだと思えばよい。origin/masterって書いてあったらリモートリポジトリのmasterブランチってこと。

#全体像イメージ
![イメージ.png](https://qiita-image-store.s3.amazonaws.com/0/206483/e1a26f61-219b-2d39-c185-653658857121.png)