OmniAICreator/Qiita-1.07M huggingface dataset:
脱獄したiPhoneが勝手に再起動する時に試した事。

iOSはシステムメモリが少なくなるとクラッシュする前に自動的に再起動する仕組みになってるそうです。
システムメモリの利用できる容量が〇〇%を下回ったら再起動する。というように設定されてるそうですが、脱獄状態のiOSデバイスでは通常のシステムに加え、脱獄システムが動作してるため、設定されたシステムメモリのボーダーラインを下回りがちになるそうです。
そこで、ボーダーラインを少しだけ低く設定し直せは、自動的に再起動するのを回避できるようです。
最近の脱獄は再起動すると入獄状態に戻ってしまうので、再起動してしまうと手動で再脱獄しなければなりません。
朝起きたら入獄状態になってるというコメントも見かけます。
知らないうちに再起動されるのはストレスなので、早速、試してみたいと思います。

# どうするの？
次のディレクトリに移動します。<br>`/System/Library/LaunchDaemons`<br>
plistファイルを開きます。<br>`com.apple.jetsamproperties.Nxx.plist`<br>（同じような名前のファイルがあれば全て書き換えます。）<br>
次のキーの値を`60`や`55`から`50`に変更します。<br>`UserReclaimableLimit`<br>
<b>:rabbit: お疲れ様でした。</b>

****************
# 参考
[Reddit](https://www.google.co.jp/amp/s/amp.reddit.com/r/jailbreak/comments/8jbtbq/help_quick_question_what_is_the_stock/)
[【Jailbreak】iOS 11.x 脱獄スレ Part12](http://fate.5ch.net/test/read.cgi/ios/1534396514/?v=pc)
[\[NEWS\] OSIRIS IS GETTING UPDATED FOR 11.3.1](https://redditposts.com/post/92wqnz/)

<details><summary><b> This permanently fixed the overnight rebooting for me: </b></summary>1. Open Filza and navigate to <br>`/System/Library/LaunchDaemons.`<br>
2. Scroll down until you see 2 entries for <br>`com.apple.jetsamproperties.(a number).plist`<br>3. Tap on the first one and navigate to <br>`Root/Version4/System/Override/Global` <br>and change the `UserReclaimableLimit` from `60` to `50 `<br>4. Now do the same for the second jetsamproperties.(a number).plist <br><b>What this does:</b> ios automatically reboots the device if the available memory drops below a certain threshold, the above lowers that threshold by 10 which accounts for the extra ram used by jailbreak tweaks and such. I did this about a week ago and have had no overnight reboots since. <br><b>To determine if this is what’s causing your reboots:</b> Go to Settings>Privacy>Analytics>Analytics Data, you should see a bunch of entries in alphabetical order. Scroll down, if there is one or more that says "SystemMemoryReset" then this fix will work for you. <br><b>Note:</b> as u/pl0323 mentions some have had success by turning off the iCloud daemons within iCleaner however the method above corrects the issue without limiting iCloud functionality. </details>
AWSのAutoScallingGroup以下のinstanceのIPアドレスをシュっと取るやつ

https://gist.github.com/chaspy/526b6fa1eec1c36bae59c3dbd5c46dc5

```bash

aws autoscaling describe-auto-scaling-groups |\ |
  jq -r '.AutoScalingGroups[].AutoScalingGroupName' |\ |
  peco |\ |
  xargs -I{} aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names {} |\ |
  jq -r '.AutoScalingGroups[]|.Instances[]|select(.LifecycleState == "InService")|select(.HealthStatus == "Healthy")|.InstanceId' |\ |
  xargs aws ec2 describe-instances --instance-ids |\ |
  jq -r '.Reservations[].Instances[]|select(.State.Name == "running")|.PrivateIpAddress' |
```

pecoいります。

AWS consoleからだとIPアドレス見れなくていちいちいinstanceのほうにいかないといけないのよねぇやだねぇで書いた。書いたら社内のチームメンバーからたくさんfeedbackもらえたので書いてよかった。
React で state/propsがjs のMap型の時に、変更してもrenderが走らない

# 起きたこと
reduxで管理しているstateの値を変更してもrenderが走らない。。

# 原因
Map型を使っている場合には変更を検知できない。?
最描画する際のoldとnewの比較で、うまくいっていないっぽい(コード追って見たわけではないので間違っていたらすみません。。)

# 対応
大人しくobjectにするかimmutable.jsのMapにする
bbc1のサンプルアプリにクライアント間のメッセージング機能を追加してみた

[前回](https://qiita.com/kichinosukey/items/3024798eedc37cf79a58)に引き続き、[プログラミングガイド](https://github.com/beyond-blockchain/bbc1/blob/develop/docs/BBc1_programming_guide_v1.0_ja.md)に基づいて機能を実装していきます。

「クライアント間のメッセージング」節から進めていきます。

# と、その前に
参考までに、作ったサンプルアプリのイメージ図だけ載せておきます。
このアプリは利用者の履歴を記録し、その履歴を検索することができます。
![サンプルアプリの利用イメージ図.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/222554/65e40bc1-70d8-a29d-e9fc-8e6e59fd58cf.jpeg)


# やったこと
大きく以下の3つです。

- コールバッククラスの定義
    - コールバックメソッドの定義
- メッセージ送信メソッドの定義
- メッセージ受信メソッドの定義

# 実装

## コールバッククラスの定義

```python
class MessageProcessor(bbc_app.Callback):
    def __init__(self):
        super(MessageProcessor, self).__init__(self)

    def proc_user_message(self, dat):
        user_message = dat[KeyType.message]
        print("Received user message: %s" % user_message)
```
ガイドに記載している内容と同様です。

## メッセージ送信メソッドの定義

```python
def send_unicast_message(id_who):
    client = connect_to_core_node()
    messeage_to_send = {"message": "registered"}
    client.send_message(messeage_to_send, id_who)
```
id_whoは送り先のuser_idとなります。バイトコードです。
このメソッドはユーザーの利用を想定しています。


## メッセージ受信メソッドの定義

```python
def wait_message():
    client = connect_to_core_node()
    callback_obj = MessageProcessor()
    client.set_callback(callback_obj)
    time.sleep(20)
```
このメソッドはオーナーの利用を想定しています。ユーザーが履歴登録時にuser_idを指定すると（デフォでオーナーのuser_idを指定しておけば良かったと今気づいた）そのid宛に任意のメッセージを送ることができます。オーナーが待機している20秒間でユーザーは記録をする必要があります。

# 実行
今回も2つのコンソールを立ち上げる必要があります。
以下の順にコマンドを実行していけば大丈夫です。

## ユーザー

```shell
$ python usage_ledger.py
type "user" or "owner"> user
user id: 04f8996da763b7a969b1028ee3007569eaf3a635486ddab211d512c85b9df8fb
domain id: 748c0b3fafa02e150928a7d3764a4bb1b16a21cb61a1d3f51ed2021933042baa
# 中略

> # 送り先のid入力を求められますが何も入力せず放置
```

## オーナー

```shell
$ python usage_ledger.py
type "user" or "owner"> owner
user id: 4c1029697ee358715d3a14a2add817c4b01651440de808371f78165ac90dc581
domain id: 748c0b3fafa02e150928a7d3764a4bb1b16a21cb61a1d3f51ed2021933042baa

command >wait
```
waitコマンドを入力したらオーナーのuser_idをコピってください。

## ユーザー

```shell
> 4c1029697ee358715d3a14a2add817c4b01651440de808371f78165ac90dc581
```
先ほどコピったidを入力します
## オーナー

```shell
Received user message: {b'message': b'registered'}
```
オーナー側にメッセージが届きました。

# まとめ
- プログラミングガイドに沿ってクライアント間のメッセージング機能をサンプルアプリに追加しました。
- 今回のような単なる送受信ではなく、受け取ったメッセージを起点にしてデバイスを動作させるなどすると活用の幅が広がる気がします。

※サンプルアプリのコードは[こちら](https://github.com/kichinosukey/bbc1_app)をご覧ください
vue.jsで@materialのscssをimportするだけで消耗した話

```vuejs
<style lang="scss">
    @import '@material/button/mdc-button';
</style>
```

これをするだけでどれだけ消耗したかをつらつらと語る。

# error1

```
File to import not found or unreadable: @material/button/mdc-button
```

どうやら、「.scss」の拡張子が解決できていないよう。
webpackを設定した。

```js:webpack.config.js
    resolve: {
      extensions: ['.js', '.json', '.vue', '.scss'],
      ...
    },
```

# error2

```
File to import not found or unreadable: @material/base/mixins.
```

どうやら、「_」から始まるファイルは、sassではpartial fileとしてimportできるようなのだが、それをsass-loaderでやるには、下記の設定が必要なそうだ。
vue-loaderの設定を追加した。

```js:webpack.config.js
    module: {
      rules: [
        // VUE
        {
          test: /\.vue$/,
          use: [{
            loader: 'vue-loader',
            options: {
              loaders: {
                scss: [
                  {
                    loader: 'sass-loader',
                    options: {
                      // ここ
                      includePaths: ['node_modules'],
                    }
                  }
                ],
              }
            }
          }],
          exclude: /(node_modules)/,
        },
...
```

# error3

```
Module parse failed: Unexpected character '@'
You may need an appropriate loader to handle this file type.
> @keyframes mdc-ripple-fg-radius-in {
|   from {
|     animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
```

sass-loaderだけでは、足りないらしい。
https://vue-loader.vuejs.org/guide/pre-processors.html#sass
ここに書いてある通り、'vue-style-loader'と'css-loader'を追加した。

```js:webpack.config.js
    module: {
      rules: [
        // VUE
        {
          test: /\.vue$/,
          use: [{
            loader: 'vue-loader',
            options: {
              loaders: {
                scss: [
                  'vue-style-loader',
                  'css-loader',
                  {
                    loader: 'sass-loader',
                    options: {
                      includePaths: ['node_modules'],
                    }
                  }
                ],
              }
            }
          }],
          exclude: /(node_modules)/,
        },
...
```

# おやすみ

```
Compiled successfully.
```
pyKNPで分かち書きしてみる

初投稿です。
卒業研究するうえで文章を分かち書きする必要があったのですがpyknpには分かち書きする機能が無く、資料もほとんどなかったので書いてみました。以下の環境が構築済みである必要があります。

###開発環境
- centOS
- Python3.x
- Juman
- Juman++
- KNP
- pyKNP

##サンプルコード
単純に分かち書きするだけのコードです。

```python:wakati.py
from pyknp import Jumanpp

def main():
  text = "これはサンプルです"
  #テキストを解析
  juman = Jumanpp()
  analysis = juman.analysis(text)

  result = ""
  #形態素が格納されているmrph_list()から見出し(midasi)を出力
  for m in analysis.mrph_list():
    #取得した各形態素の間に空白を入れる
    result += str(m.midasi) +" "

  print(result)

if __name__ == "__main__":
  main()
```

###実行結果

```
$ python3 wakati.py
これ は サンプル です
```
無事分かち書きされました。
##MeCabとの比較
適当に選んだニュース記事で比較

```
#pyknpの分かち書き
企業 の 求人 、 学生 の 求職 が 様変わり して いる 。 学生 側 から 企業 に アプローチ して いた の が 、 企業 側 から 学生 に 接近 する 「 逆 求人 」 が 広がって いる のだ 。

#mecabの分かち書き
企業 の 求人 、 学生 の 求職 が 様変わり し て いる 。 学生 側 から 企業 に アプローチ し て い た の が 、 企業 側 から 学生 に 接近 する 「 逆 求人 」 が 広がっ て いる の だ 。
```
ほぼ同じですが微妙に違いが出ていますね
Electron上でAngularを動かす。

node.jsがインストールされている前提で進めます。

@angular/cliをインストールしていない方はこちらのコマンドから。
（詳細については省略します。）

```
npm install -g @angular/cli
```

###Angularのプロジェクトを作成する

```
ng new angular-with-electron
```
大体こんなのができあがると思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/283270/967af383-380f-7863-8c09-921ed388b9ed.png)

下記ファイルを編集します。


```ruby:angular-with-electron/src/index.html
<base href="/">
```
から

```ruby:angular-with-electron/src/index.html
<base href="./">
```

に修正します。
（こうしないとうまく立ち上がらないっぽい）


###Electronをインストールする

```
cd angular-with-electron
npm install electron --save-dev
```

インストールが完了したらmain.jsを作成します。
以下、おまじないです。（よくわからん）

```ruby:angular-with-electron/main.js
const { app, BrowserWindow } = require('electron')

let win;

function createWindow () {
  // 新規ウインドウ生成
  win = new BrowserWindow({
    width: 800, 
    height: 700
  })


  win.loadURL(`file://${__dirname}/dist/angular-with-electron/index.html`)

  //// 起動時に開発者ツールを開く　（コメントアウトしてます）
  // win.webContents.openDevTools()

  // ウインドウが閉じたときのイベント
  win.on('closed', function () {
    win = null
  })
}

// Electron初期化時にウィンドウ生成
app.on('ready', createWindow)

// すべてのウインドウが閉じたときにElectronを終了する。
app.on('window-all-closed', function () {

  // macOSの場合
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', function () {
  // macOSの場合
  if (win === null) {
    createWindow()
  }
})
```

起動コマンドを入力しておきます。

``` ruby:package.json
{
// 中略
  "main": "main.js", // 追加
  "scripts": {
// 中略
    "electron": "electron .", // Electronを起動
    "electron-build": "ng build --prod && electron ." // ビルドしてからElectronを起動
  },
//  略
}
```
ここまで出来たら

``` 
npm run electron-build
```


![image.png](https://qiita-image-store.s3.amazonaws.com/0/283270/ec990899-d7b8-2f16-3d21-e44332a877e0.png)

無事起動できました。


あとは通常通りAngularを利用できると思います。


以上、初投稿でした。
超重要・超基本的なgitコマンドの使い方を間違えてどツボにはまるべからず。

#背景
さぁ、今、開発しているサービスのちょっとした部分に変更加えたから、
gitにpushして本番環境で確認してみよーっと。

…

あれっ…今まで見たことないエラーが出てきたんだけど…（ざわっ…

#問題：ローカルリポジトリからリモートリポジトリにpushしようとしたらエラーがでた。

うったコマンド

```
git push master origin
```

出現したエラー

```
fatal: 'master' does not appear to be a git repository
fatal: Could not read from remote repository.

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

masterというリポジトリがないぞ？と怒られている模様…

#解決方法
間違っていたコマンド

```
git push master origin
```

正しいコマンド

```
git push origin master
```

つまり、originとmasterの順番を間違えていました！(てへぺろ)

初歩的なつまづきに見える。
だけど、自分じゃ数分まったく気が付かない…汗

恥ずかしすぎるミスなんだけど、
これは共有しておいて、この記事を読む人が同じ轍を踏まないようにしていただきたい！！！

#今回学んだことは？
そもそもgit push origin masterというコマンドの意味はどういう意味だ？
ということを調べ直ししたわ。(恥)

origin = リモートリポジトリ名
master = ブランチ名

origin(リモートリポジトリ)っていう大きなくくりの中の、
masterっていう小さなくくり(ブランチ)を指定している。
って意味でコマンドを覚えましょう
LGTM画像を作るときのメモ

**※ 著作権の扱いには十分に注意して行ってください。**

## アップロードするところ

LGTM.in » Home
https://lgtm.in/


## 文字入れ (画像)

LGTMoon - 最もシンプルなLGTM画像ジェネレーター
https://lgtmoon.herokuapp.com/

画像のURLを指定するだけで文字入れしてくれる。すべて公開される。
Twitterの画像パスとかもいけるので便利。

ローカルの画像は一度アップローダーにアップしてからLGTMoonに投げればよい。

どっとうｐろだ.org - 使えるアップローダー、うｐろだサイト
https://dotup.org/

## 文字入れ　（Gif）

LGTMoonはGifも対応しているようだが、確認できなかった。

そのため以下のサービスを用いた。

Gifntext - Easily add animated text to a gif
http://www.gifntext.com/


## その他

iLoveIMG | 画像編集用オンラインツール
https://www.iloveimg.com/ja

画像のリサイズや圧縮ができるサービス。Gif画像にも対応しているのが強い。
特にGif画像は重いことが多いので、使い勝手を考えて小さめにしておくと良さそう。

Twitterの動画を保存しまっせ！|Twi-douga|
https://www.nurumayu.net/twidouga/gettwi.php

Twitterの動画をダウンロードするサービス
【投稿】bashが起動時〜bashrcとbash_profileについて〜　自分メモ用

記事を移転させました。
[【投稿】bashが起動時〜bashrcとbash_profileについて〜　自分メモ用](https://pick-up-tech.com/blog/bash%E3%81%8C%E8%B5%B7%E5%8B%95%E6%99%82%E3%80%9Cbashrc%E3%81%A8bash-profile%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%80%9C)
アクセス権、カプセル化

1. プロパティやメソッドの前につく`public`はアクセス権（アクセス修飾子）という
2. アクセス権をつけると、プロパティやメソッドにアクセスできる範囲を指定できる
3. クラスのメソッドやプロパティにはアクセス権を必ずつける
4. プロパティでアクセス権をつけないと、構文エラー
5. メソッドでアクセス権をつけないと、`public`とみなされる
6. アクセス権は`public`,`protected`,`private`の3つがある
7. `public`はその名の通りどこからでもアクセスできる
8. `protected`はクラスとサブクラス（継承したクラス）からアクセスできる
9. `private`はクラスからアクセスできる
10. アクセス権を使って外部からプロパティを直接操作できないようにすることをカプセル化という
11. 外部からプロパティを操作できるようにするためのメソッドをゲッターメソッド、セッターメソッドという
12. ゲッター、セッターはget〇〇、set〇〇とつけるのが習慣
13. セッターを使うと代入される値のチェックを行える
14. ゲッターだけを作れば読み取り専用にできる

>[ウェブカツ！！](https://webukatu.com/?afid=p5lxu1kvh03rayd2ctjsw4e9bgzq8nom)
Kaggle初心者が自力で回答を提出できるようになるまで

ついでに機械学習についても初心者です

#「Kaggle事始め」に従い、問題を解いて回答を提出する流れを覚える
https://qiita.com/taka4sato/items/802c494fdebeaa7f43b7

#「Submitting From A Kernel」に従い、Karnelを利用した勉強法を覚える
https://www.kaggle.com/dansbecker/submitting-from-a-kernel

#Titanicの問題の回答を改善しする
「Kaggle事始め」のプログラムをK近傍法に変更して、
ご近所さん=10にしたら精度が上がりました！

![スクリーンショット 2018-08-30 23.36.36.png](https://qiita-image-store.s3.amazonaws.com/0/188786/396a43d1-2da2-516a-5c9a-a34f288064d4.png)

ほんのちょっとの進歩が目に見えるのは嬉しい！

#日本語チュートリアルをこなす
https://www.codexa.net/what-is-kaggle/
数学と統計の基礎が無いけど、今後もそれらにがっつり時間を割く気は無いので量をこなす


/usr/local/lib/python3.6/site-packages/sklearn/ensemble/weight_boosting.py:29: DeprecationWarning: numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release.
  from numpy.core.umath_tests import inner1d
なんじゃこれえええ（続
【PHP】php-fpm環境の任意のPHP（7.2）でLaravelをインストール

公式とかに書いてるのと違う部分は
・PHPを常に指定する
・Laravelのバージョンを指定する（PHP7.2はMcryptとかで躓くため5.6を使用）
・composer.pharも展開したバージョンでのみ使用する
だけです…

# Composer インストール
https://getcomposer.org/download/


```bash
# composer インストーラをダウンロード
/usr/local/php/7.2.6/bin/php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

# composer 正しくダウンロードできたかチェック
/usr/local/php/7.2.6/bin/php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

# composer インストーラを実行
/usr/local/php/7.2.6/bin/php composer-setup.php
```
できたcomposer.pharはそのまま使います。


# Laravel インストール
https://laravel.com/docs/5.6/installation

```bash
# laravel を展開するフォルダへ移動し、
# さっきのcomposer.pharでバージョンを指定してプロジェクトを作成
# （指定した名称のディレクトリができます。下記はlaravel-demo）
/usr/local/php/7.2.6/bin/php -d memory_limit=2G /path/to/sakkino/composer.phar create-project "laravel/laravel=5.6.*" laravel-demo

// laravelサーバ起動
/usr/local/php/7.2.6/bin/php artisan serve
```
あとはアクセスして確認
http://example.com/path/to/laravel-demo/public/


# 余談
AWSで色々入れてメモリ足りなかったとき
[一時的にSwap領域を増やした](https://qiita.com/miyapei/items/6db13b142cacba0522fc)
Pythonで競プロに挑む日誌 vol.2 ~all, any 関数.  generator との出会い~

# 現在の目標
* 完了: ~~AtCoder をはじめる~~
* 今年の10月内に茶色を取得する **←イマココ**
* 年内に緑色を取得する
* [APG4b](https://beta.atcoder.jp/contests/apg4b) で C++ にも手を出す

# 本日の問題1
### ABC081A - Placing Marbles 
https://beta.atcoder.jp/contests/abs/tasks/abc081_a
**結果**

```answer.py
s = list((input()))
print(s.count("1"))
```
回答時間：たぶん15秒くらい
実行時間：17 ms
メモリ　：2940 KB
得点　　：100/100

特にコメントは不要と思います。

# 本日の問題2

### ABC081B - Shift only 
https://beta.atcoder.jp/contests/abs/tasks/abc081_b
**結果**

```answer_1st.py
# coding: utf-8
N = int(input())
lis_A = list(map(int, input().split()))
 
cnt = 0
while True:
    for i in range(N):
        if (lis_A[i] % 2) != 0:
            break
        else:
            lis_A[i] = lis_A[i] // 2
    # while 文の break 判定
    if i == N - 1:
        cnt += 1
    else:
        break
    
print(cnt)
```
回答時間：20分くらい
実行時間：18 ms
メモリ　：3060 KB
コード長：342 Byte
得点　　：200/200

愚直な実装ですね笑。while 文と for 文の break の入れ方でやや混乱したので、print 関数を使いながらコツコツと…こうやって感覚を養っていくものなのでしょう。
もっとうまいやり方がありそうに思ったのでもう少し粘ってみました↓

```answer_2nd.py
# coding: utf-8
N = int(input())
li_A = list(map(int, input().split()))
 
cnt = 0
while True:
    li_yojo = [ai % 2 for ai in li_A]   # 余剰の 0 の個数で判定
    if li_yojo.count(0) != N:
        break
    li_A = [ai / 2 for ai in li_A]
    cnt += 1

print(cnt)
```
回答時間：10分
実行時間：18 ms
メモリ　：2940 KB
コード長：281 Byte
得点　　：200/200


リスト内包表記を使用したらすっきりしました。
参考：https://qiita.com/y__sama/items/a2c458de97c4aa5a98e7
一気に余剰計算して、一気に判定することにしました。速さは変わってませんが、コードを短くできたのでよしとしましょう。内包表記は重宝しそうなので、慣れていきたいですね。


# 明日やること
[ABC087B - Coins](https://beta.atcoder.jp/contests/abs/tasks/abc087_b) を解く。
【Linux】一時的にSwap領域を増やす


```bash
# swap領域用にファイルをつくる（下記は1GB）
# bs=バッファサイズ（1024 * 1048576 = 1073741824byte = 1GB）
dd if=/dev/zero of=/var/swapfile1 bs=1024 count=1048576
chmod 600 /var/swapfile1

# swap領域作成
mkswap /var/swapfile1 1048576

# swap領域有効化
swapon /var/swapfile1
```


```bash
# 確認
swapon -s

# swap領域を外す
swapoff /var/swapfile1
```

AWSとか開発サーバとかでたまに
メモリ少ないけど[インストール時とか](https://qiita.com/miyapei/items/f7f005b549155b253dfc)だけなのでとりあえず補ったり。
（PHPとかLaravelとか入れたときの関連で…）
Docker networkについて理解する

Docker Networkについて調べてみたのでまとめ

## 概要
Docker Networkは起動時にdocker0という名前のネットワーク・インターフェースが起動する。また、三つのネットワークが生成される。

```
~ $ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
2509da118a6f        bridge              bridge              local
24b9d7c165dd        host                host                local
2580b7cd0d2f        none                null                local
```
- host: ホストマシンと同一のネットワークインターフェースを使用する
- none: ネットワーク・インターフェースを使用しない
- bridge: docker0を使用する。コンテナ起動時にネットワーク・インターフェースを指定しなければ自動的にこれが割り当てられる。

## bridgeについて
```
~ $ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "ID",
        "Created": "Created",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "Container1": {
                "Name": "nginx",
                "EndpointID": "EndpointID",
                "MacAddress": "MacAddress",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
```
Containers内でbridgeネットワークにぶら下がっているコンテナ一覧が見える。

## docker-composeについて
docker-composeコマンドで複数のコンテナを一気に立ち上げると、全てのコンテナは新たに生成されたネットワークにぶら下げられる。生成されたネットワークは何も指定しないとdocker0インターフェースを使用する。


```
~ $ docker-compose ps
     Name                    Command               State          Ports
-------------------------------------------------------------------------------
nextcloud_app_1   /entrypoint.sh apache2-for ...   Up      0.0.0.0:9000->80/tcp
nextcloud_db_1    docker-entrypoint.sh mysqld      Up      3306/tcp

~ $ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
c9608596f355        nextcloud_default   bridge              local
```

## イメージ図
まとめるとこんな感じになると思います。
※ 間違っていたらごめんなさい
![Untitled Diagram.png](https://qiita-image-store.s3.amazonaws.com/0/163803/bfd56bac-5387-7a97-a45d-fd0f9caf8399.png)

## 内部DNSについて
Docker Engineを起動するとユーザー定義ネットワーク用のDNSサーバーが起動する。同一のDockerネットワーク内においてはユーザー定義のホスト名とIPアドレスがDNSによって変換される。

## 参考
- https://docs.docker.com/network/
[swift奮闘記]ビルド時にてThread 1: signal SIGABRTと表示されたときに確認する２つのこと

## 1.ストーリーボード上にて、各部品のsegueにエラーが生じてないか確認する。

このエラーが出るとき、ストーリーボードの中の部品（ButtonとかViewControllerとか）と遷移先のViewとをつなぐところで、なんかミスってるそうです。

そのエラーの直し方はこちら↓
https://qiita.com/nasutaro211/items/b692fd695118f89170c4

## 2.identifierがちゃんと登録されているか確認する。
自分はこれでハマってた。。

TableViewをつかってたとき、cellの設定のidentifierを設定してなかったのがエラーの原因。

ちゃんと忘れず書きましょう。

##まとめ
たったこれだけに３０分くらいかけた。。
エラーが出たときは、エラー文ちゃんと読もう。うん。英語やからってにげちゃだめ。ほんとに。うん。
んで、ちゃんとぐぐろう。
Home Pricesの予測に挑戦①～量的変数に対して重回帰分析～

# kaggleの中古物件価格予測にチャレンジ

他の人のチュートリアルを見ながら理解したり、チューニングしたりは
ある程度できるようになってきたので、自分なりのやり方でkaggleの中古物件価格予測をやってみる

[課題のリンクはこちら](https://www.kaggle.com/c/house-prices-advanced-regression-techniques)

### 初見の感想・方針

変数が多い・・・
説明変数・・・80!

signateのお弁当の需要予測のように、yと各変数をプロットするのは難しい
ちょっと変数が多すぎるのでまずは量的変数だけで重回帰分析をやってみようと思う。
チューニングとか質的変数、非線形モデルの利用はまた別の機会に

### 変数選択

方針：量的変数に絞り、相関係数のヒートマップで関係ありそうな値を算出

データフレームの相関係数算出の書き方は以下
`train.corr()`

[相関係数のヒートマップの書き方]
(https://qiita.com/tmp_llc/items/db626c9e331bfdc4857a)
[相関係数のヒートマップの書き方その２](
https://note.nkmk.me/python-pandas-corr/)

ヒートマップを見ても判断できなかった・・・
純粋に相関係数の絶対値が高いものをランキングして、それらを変数に代入することとした
[絶対値の取り方](https://www.tech-tech.xyz/archives/pythonabs.html)
[データフレームのソート](https://note.nkmk.me/python-pandas-sort-values-sort-index/)


`target_var = abs(corr_mat.loc["SalePrice",:]).sort_values(ascending=[False])[1:11]`

この結果で上位10件の変数を説明変数とした

###モデル選択

今回はシンプルにscikit-learnの線形回帰を実施。
http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html

ちなみに提出ファイルを作成する際も少しはまった。sckit-learnの線形回帰の結果は配列で
出力されるので、このままでは提出ファイルにうまく結合することができな。
以下のようにデータ型をpandasデータフレーム型に変換してあげる必要がある

`sample["SalePrice"] = pd.Series(y_test)`

### 結果

RMSE(平均平方二乗誤差)のスコアは 0.73044

順位は4236/4313位

本当はデータをもっと俯瞰的に見たりしないといけないので、
チューニングについては次回以降に実施する

コードはGitHub gistに提出した。ほとんど参考にならないけど、
そもそも投稿することに意義がある（と思う）

https://gist.github.com/daisuke19891023/5bd26493e25cbe60998aa2d44e2c312f#file-home_prices_lr_1-ipynb
Monaca CLIで 'Cannot find module 'home\.cordova\node_modules\webpack' と怒られたとき

# 概要
[Monaca](https://ja.monaca.io/)でローカル開発環境をつくろうとして、ハマったのでメモ

最新のJSフレームワーク（Vue, React, Angular2）は実行前にトランスパイル処理（コード変換）を行う必要があるらしいです。

しかし、[公式ドキュメント](https://docs.monaca.io/ja/products_guide/monaca_cli/overview/)

```DOS:DOS
$ npm i -g monaca
$ monaca login
$ monaca import

$ monaca transpile
```

の通りに進めても動かず、困りました。
ので、以下対応方法です。

#手順
## 1.Monaca Cloud IDE上でプロジェクト作成
今回は「Onsen UI V2 Vue Minimum」プロジェクトを作成

## 2.Monaca CLIのインストール
インストールしたらログインしてください。

```DOS:DOS
$ npm i -g monaca
$ monaca login
```

## 3.Cloud IDEで作成したプロジェクトをインポート

```DOS:DOS
$ monaca import
```

対象のプロジェクトを選択するとインストールが開始されます。
（結構時間かかります。）

## 4.トランスパイル処理実行してみる

```DOS:DOS
$ monaca transpile

Running Transpiler...
module.js:549
    throw err;
    ^

Error: Cannot find module 'ホームディレクトリ\.cordova\node_modules\webpack'
    at Function.Module._resolveFilename (module.js:547:15)
    at Function.Module._load (module.js:474:25)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (C:\Program Files\nodejs\node_modules\monaca\node_modules\monaca-lib\src\transpile.js:4:15)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
```

こうなってしまいます。。。
.cordovaフォルダにwebpackがインストールされていませんとのこと･･･


## 5.ひと手間加える
importしたアプリのルートフォルダで、

```DOS:DOS
$ monaca reconfigure
```

その後、トランスパイルを行うと正常に動きました。
`monaca reconfigure`コマンドは
> 設定ファイルを復旧 ( 再作成 ) します。オプションを指定しない場合、該当するファイルのすべてを復旧します。該当するファイルに関しては、下記の 「 オプション 」 をご確認ください。

とのことです。
(参考) [Monaca CLI コマンド | Monaca Docs](https://docs.monaca.io/ja/products_guide/monaca_cli/cli_commands/#monaca-reconfigure)

# 感想
1晩中調べてました。
sass-loader で dart-sass を使う

## モチベーション

node-sass 、結構イライラポイントが多くて、代替手段があるなら乗り換えたいなあなんて思ってたところに dart-sass がナウでヤングだぜみたいな話を小耳に挟んだので、使ってみることにした。

ちなみに node-sass に感じていたイライラポイントは、以下の通り。

- インストールが遅い
- Node.js のバージョンが上がりたてのとき、だいたいインストールで死ぬ

dart-sass がナウでヤングな理由については、 [Feature Watch: CSS Imports and CSS Compatibility](http://sass.logdown.com/posts/7807041-feature-watchcss-imports-and-css-compatibility) とかを読んで欲しい。
要約すると、LibSass や Ruby Sass に搭載されていない機能が、先行的に積まれてるみたいなことらしい。( プレーンな CSS のインポートをサポートするとかなんとか)

モチベとしては、「 `node-sass` でコケたときに、 `node-gyp` ガー！ `python` ガー！みたいなところで消耗しなくてよくなり、なおかつ、最新の機能が使えるなら使ってみるか」みたいな感じである。

## sass-loader で dart-sass を使う

dart-sass だけためしても良かったけど、せっかくなので webpack 絡めて。

### 1. インストール

とりあえず、以下をインストールする。

```bash
$ npm i webpack webpack-cli sass sass-loader style-loader fibers --save-dev
```

sass というパッケージが dart-sass のことである。
fibers というパッケージは 処理速度を上げるために必要らしい。
その他は、おなじみのパッケージである。

### 2. webpack.config.js を書く

node-sass のときとの違いは、sass-loader の `options` で sass を指定したのと、fiber を設定したことである。

先ほども説明したとおり、 sass パッケージは dart-sass のことである。
fibers は dart-sass で `renderSync()` を実行したときに `render()` の二倍以上も処理時間がかかってしまうのを防ぐためとかなんとかって近所の猫が言ってた。(英語分からなかった、つらい)

詳しくは [Sass: Dart Sass](https://sass-lang.com/dart-sass) の 2. JAVASCRIPT LIBRARY の項を読んで欲しい。英語が読める人には正解が分かる。

```webpack.config.js
const path = require('path')
const Fiber = require('fibers')

module.exports = {
  entry: './assets/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, './dist/assets')
  },
  module: {
    rules: [{
      test: /\.scss$/,
      use: [{
        loader: 'style-loader'
      }, {
        loader: 'css-loader'
      }, {
        loader: 'sass-loader',
        options: {
          implementation: require('sass'),
          fiber: Fiber
        }
      }]
    }]
  }
}
```

## 3. 実行する

あとは `npx webpack` とかするとコンパイルできた。

## まとめ

ややこしポイントとして、`dart-sass` は `sass` というパッケージ名で npm に上がっているというのがある。気をつけて欲しい。

しばらく使ってみて、不便なところがないかなど検証してみたいと思っている。

## 参考

- [sass/dart-sass](https://github.com/sass/dart-sass)
- [webpack-contrib/sass-loader](https://github.com/webpack-contrib/sass-loader)
[C#]C#でDeferする

`golang`には`defer`という機能があります。
`defer`を使うと関数を抜けるときに処理を実行することができます。

以下にサンプルを示します。

```golang
package main

import (
	"fmt"
)

func hoge() {
	i := 1
	fmt.Printf("A:%v\n", i)
	i = i + 1
	defer fmt.Printf("B:%v\n", i)
	i = i + 1
	fmt.Printf("C:%v\n", i)
	i = i + 1
	defer fmt.Printf("D:%v\n", i)
	i = i + 1
	fmt.Printf("E:%v\n", i)
}

func main() {
	fmt.Printf("main start\n")
	hoge()
	fmt.Printf("main end\n")
}
```

```:実行結果
main start
A:1
C:3
E:5
D:4
B:2
main end
```

実行結果を見ると以下のことが分かります。

- `defer`を書いた場所では関数が呼ばれていない
- 関数の終了時に`defer`を書いた順番とは逆順に実行されている
- 変数`i`が`defer`を書いた場所での値になっている

`C++`に慣れている方ならクラスのデストラクタをイメージしていただければよいです。
これを`C#`でも実現してみます。
(先に書いておきますが実用的ではありません。あくまで同じようなことを実現するだけです。)

## 実装

```csharp
public class Deferrable
{
    private List<Action> actions = new List<Action>();

    public static void Execute(Action<Deferrable> action)
    {
        var d = new Deferrable();
        try
        {
            action(d);
        }
        finally
        {
            d.ExecuteAll();
        }
    }

    private Deferrable()
    {
    }

    public void Defer(Action action)
    {
        this.actions.Add(action);
    }

    public void Defer<T>(Action<T> action, T arg)
    {
        this.actions.Add(() => action(arg));
    }

    private void ExecuteAll()
    {
        for (var i = this.actions.Count - 1; i >= 0; i--)
        {
            this.actions[i]();
        }
    }
}
```

## 使用例

```csharp:サンプル
Deferrable.Execute(d =>
{
    var index = 1;
    Console.WriteLine($"A:{index++}");
    d.Defer(_index => Console.WriteLine($"B:{_index}"), index++);
    Console.WriteLine($"C:{index++}");
    d.Defer(_index => Console.WriteLine($"D:{_index}"), index++);
    Console.WriteLine($"E:{index}");
});
```

```:実行結果
A:1
C:3
E:5
D:4
B:2
```

## 解説

実装を見ればとてもシンプルなのであまり書くことはありませんがポイントは`Defer<T>`と`ExecuteAll`でしょうか。
`Defer<T>`は引数にアクションだけではなく引数も受け取ります。
これによって`Defer<T>`を呼び出したときの値をコピーすることができます。
`ExecuteAll`では`Defer`を呼び出した順番と逆順になるようにアクションを実行しています。

## まとめ

`C#`でも`defer`っぽいものを作成することはできました。
`Deferrable`や`List`などといった一時オブジェクトが作成されてしまうためノーコストとは呼べません。
(`golang`の`defer`も`defer`を使用せずに書いた時と比べて完全にノーコストというわけではありませんがこの実装よりかは圧倒的に低いコストです。)
Linux

#よく使うコマンド

- mkdir： 新しいディレクトリを作る
- rmdir：空のディレクトリを削除する
- cd ：移動する
- p： ファイルのコピー
- ls ：ファイル一覧
	ls -l：
- mv ：ファイル移動、ファイルの名前変更
- rm ：ファイルの削除
- touch： 新しいファイルを作る
- cat ：ファイルの中身を表示、2つのファイルを結合する
- more：ファイルの中身を表示（catより詳しい）
- diff ：2つのファイルの差分を表示
- find：ファイル検索
- grep：ファイルの中身の文字でファイルを検索
- tail：ファイルの末尾を表示する
- finger：ユーザー情報を表示する
- df：ディスクの空き領域を表示する
- lpr：ファイルや標準ファイルをプリントキューに送信する
- lprm：プリントジョブを削除する
- lpq：キュー内部の情報を表示する
- pwd：現在操作しているところを表示する
- whoami：自分が誰かを確認できる
- >：新しいファイルに出力する



cd .. で一つ上のファイルに移動できる
cd ~/　ホームディレクトリ

.test.htmlで隠しファイルにすることができる
→設定ファイルを見えないところに作ることができる
##wildcard
\*  　すべてのファイルを表現する

?　1文字に対して使えるワイルドカード

#アクセス権

|読む|書く|実行|
|:---:|:---:|:---:|
|  r  | w   |  x  |
|  4　|  2  |  1  |

数字は足して表現する

例）
読む＋書く　→6 (4+2）
これは数字でも表すことができる

ls -l  でそのファイルの権限を確認できる

-rw-r--r--

###頭文字の意味
-　ファイル
d　ディレクトリ


##権限を変更する方法

例１）
　　　    ugo
chmod　644 ファイル名
でそれぞれの権限を変更できる

例２）
chmod o+x gorillas
（gorillaファイルについて、otherにexecuteの権限を加える場合）

####chwon： ユーザーとグループを変更できる
#####使い方
chwon ユーザー：グループ　ファイル名

###rootユーザーがなにかを実行するとき

sudoを頭に付ける
例）
sudo chwon　〇〇











#home directories
https://qiita.com/munazo/items/455b30d5cc141699ca23
https://linuxsurvival.com/


最初の練習を始める前に、 "ホームディレクトリ"という概念を導入する必要があります。

マルチユーザシステムでは、各ユーザが自分のプライベートな場所にファイルを保存することが便利です。 Linuxはこのプライベートな場所を "ホームディレクトリ"と呼びます。 Linuxネットワークが安全な方法で設定されている場合は、ホームディレクトリ内のファイルにアクセスできる唯一の正規ユーザーです。つまり、あなた自身とシステム管理者以外の誰もあなたのファイルの名前を見ることはできません。ただし、他のユーザーにファイルへのアクセスを許可する場合は、「chmod」コマンドを使用してアクセスできます。

ホームディレクトリの場所は、システムによって大きく異なります。右側の図では、ホームディレクトリは "/ home"というディレクトリの下にありますが、 "/ user"というディレクトリの下に簡単に置くこともできます。あなたの所在地を調べる方法を紹介します。

Linuxシステムにログインすると、自動的にホームディレクトリに置かれます。したがって、パス名を表示したい場合は、単にログインして、 "pwd"と入力してください。この例では、出力は「/ home / keeper」になります。

ほとんどの人はホームディレクトリを定期的に参照する必要があるため、Linuxでは簡単に指定することができます。通常は "/ home / keeper"を使用するどこでもチルダ(~)を使用できます。

たとえば、 "jokes"というファイルをホームディレクトリから "/ tmp"ディレクトリにコピーする場合は、

               cp / home / keeper / jokes / tmp


ではなく、

```
               cp〜/ jokes / tmp
```

チルダを使用して別のユーザーのホームディレクトリを指定することもできます。 '〜'の直後にユーザIDが続くと、自分のホームディレクトリを参照しなくなります。ユーザーIDのホームディレクトリを参照します。たとえば、bookieのホームディレクトリに移動したい場合は、

```
cd / home / bookie
```

ではなく、

```
cd 〜bookie
```

実際には、「〜」自体は「〜keeper」の短い形式です。

'/'の後に '〜'の後に何かを置くと、Linuxはあなたが別のユーザのホームディレクトリを参照しているとみなします。したがって、上記の "cp〜/ jokes / tmp"の例では、入力した場合

                        cp〜jokes / tmp

代わりに、「jokes」と呼ばれるユーザーIDがないため、エラーメッセージが表示されます。

チルダを使用するのに最適なことの1つは、誰かのホームディレクトリの場所を知る必要がないことです。システム管理者は、ホームディレクトリを新しい場所に移動してディスクスペースの問題を緩和することがあります。常にチルダを使用する場合は、そのような動きに気付かないかもしれません。



#man
https://eng-entrance.com/linux-command-man#man


manとはマニュアルを表示するコマンド。
linuxには様々な機能やディレクトリの使い方に関するマニュアルがカタログページに格納されている。
カタログページは、標準では環境変数＄MANPATHで指定されているところに保存されている。
マニュアルのカタログページを見やすい形に表示してくれるコマンドがman。

###使い方


 man 調べる語句


例）
w コマンドのマニュアルを見る場合は、
man w


###マニュアルの種類にはセクション番号が指定されている

番号を指定しなければ一番若い番号のマニュアルを表示する

１：Linuxコマンド
２：システムコール
３：ライブラリコール
４：スペシャルファイル
５：ファイルのフォーマット
６：ゲームやデモ
７：マクロ
８：システム管理用のコマンド
９：カーネルルーチン
(windows)vs codeでrailsサーバー起動時にincompatible character encodings: UTF-8 and Windows-31J

## "rails new sample"を実行した後、"rails s"でアプリケーションサーバPuma起動　→　エラー
```
PS C:\Users\孝憲\sample> rails s
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/bootsnap-1.3.1/lib/bootsnap/load_path_cache/path.rb:101:in `start_with?': incompatible character encodings: UTF-8 and Windows-31J (Encoding::CompatibilityError)
```
エンコーディングがおかしいらしい

## 該当箇所で、"force_encoding('UTF-8')"してみた　→とりあえずサーバ起動した
- コード <br>
C:\Ruby24-x64\lib\ruby\gems\2.4.0\gems\bootsnap-1.3.1\lib\bootsnap\load_path_cache <br>
path.rb

```ruby:path.rb
def stability
    @stability ||= begin
      #if Gem.path.detect { |p| expanded_path.start_with?(p.to_s) }     ←修正前
      if Gem.path.detect { |p| expanded_path.start_with?(p.to_s.force_encoding('UTF-8')) }
          STABLE
      elsif Bootsnap.bundler? && expanded_path.start_with?(Bundler.bundle_path.to_s)
        STABLE
      elsif expanded_path.start_with?(RUBY_LIBDIR) && !expanded_path.start_with?(RUBY_SITEDIR)
        STABLE
      else
        VOLATILE
    end
  end
end
```

これでとりあえず起動

```
PS C:\Users\孝憲\sample> rails s
=> Booting Puma
=> Rails 5.2.1 application starting in development
=> Run `rails server -h` for more startup options
*** SIGUSR2 not implemented, signal based restart unavailable!
*** SIGUSR1 not implemented, signal based restart unavailable!
*** SIGHUP not implemented, signal based logs reopening unavailable!
Puma starting in single mode...
* Version 3.12.0 (ruby 2.4.4-p296), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

## でも localhost:3000 にアクセスするとエラー　→未解決
![err.png](https://qiita-image-store.s3.amazonaws.com/0/281492/c49a9273-e0d4-dfef-71c0-ac703a9c7231.png)

```
2018-08-30 22:27:59 +0900: Rack app error handling request { GET / }
#<ArgumentError: invalid multibyte character>
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/railties-5.2.1/lib/rails/backtrace_cleaner.rb:29:in `add_gem_filters'
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/railties-5.2.1/lib/rails/backtrace_cleaner.rb:20:in `initialize'
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/railties-5.2.1/lib/rails.rb:54:in `new'
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/railties-5.2.1/lib/rails.rb:54:in `backtrace_cleaner'
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/railties-5.2.1/lib/rails/application.rb:257:in `env_config'
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/railties-5.2.1/lib/rails/engine.rb:694:in `build_request'
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/railties-5.2.1/lib/rails/application.rb:592:in `build_request'
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/railties-5.2.1/lib/rails/engine.rb:523:in `call'
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/puma-3.12.0/lib/puma/configuration.rb:225:in `call'
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/puma-3.12.0/lib/puma/server.rb:658:in `handle_request'
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/puma-3.12.0/lib/puma/server.rb:472:in `process_client'
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/puma-3.12.0/lib/puma/server.rb:332:in `block in run'
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/puma-3.12.0/lib/puma/thread_pool.rb:133:in `block in spawn_thread'
```
[swift奮闘記]tableViewの余分な線を消したい！

#xcodeでtableViewいじってたときにcellの余分な線を消したくなったとき

1. tableViewを選択。（上のナビゲーションバーを押したら全体選択できる。）

2. 右のいろいろ設定できるメニューバーにて、上の６つのアイコンのうち右から３番目のAttributes inspecterを選択する。

3. いろんな設定項目の中で、Styleという場所があるので、そこをGroupedにする。


これだけ。ちょー簡単。

メモとして残しときます。

###参考サイト
https://qiita.com/edm/items/db0edf4057c2e77da308
LinuxにてCPUとカーネルのbit数の確認コマンド

LINUX　MINT　32bit　をつかっているが

もしかして64bit入れれるかもと思って調べてみました。


端末にて

実行コマンド

```
$　lscpu
```
で　自身の　CPUのop-modeが表示されます。

```
CPU 操作モード:   32-bit, 64-bit
```

もしくは

```
CPU　op-mode(s):　　32bit,64bit
```

と表示されます　上記の結果を踏まえて

更にCPUのbit数の確認をします
実行コマンド

```
$ cat /proc/cpuinfo
```
上記コマンドでマシンのCPUのbit数の確認ができます


```
flags		: ... nx lm constant_tsc arch_perfmon pebs bts cpuid aperfmperf pni dtes64 monitor .....
```
いろいろ表示されますがflgsの欄を確認してください。
上記flagsの値に　lm　があればcpuは64bitです。



次にカーネルのbit数の確認をします。
実行コマンド

```
$ uname -a
```

上記実行して

X86_64や　amd64が表示されれば

カーネルも64bitです


しかし私は、X86_64　amd64　の表示はなく…

結果

cpuは64bit　だけど　カーネルは32bitでした。。。
MacにTSSSをインストールする

例のごとくドツボりめもです．
色々あってTSSSをインストールする必要があったので，そのインストールのメモです．

---
## TSSSとは

統計数理研究所が開発したRパッケージ
時系列解析に便利なものがいっぱい入ってる．

---
## 解決した方法

- TSSSのコンパイルに必要なバージョンのgfortranがなかったっぽい
    - じゃあ，それをインストールしたらいいじゃない．
    - [ファイル配布元](https://cran.r-project.org)
        - ここからgfortran-6.1.pkg をダウンロードしてきてインストールする．

gfortran-6.1 をインストールした上でTSSSをインストールする．

```shell-session
$ R CMD INSTALL --build TSSS_1.0.1.tar.gz
```

そうしたらできた．

---
## どつぼりの記録

とりあえずふつーにインストールしてみる．

```shell-session
$ R CMD INSTALL --build TSSS_1.0.1.tar.gz
```

```shell

ld: warning: directory not found for option '-L/usr/local/gfortran/lib/gcc/x86_64-apple-darwin15/6.1.0'
ld: warning: directory not found for option '-L/usr/local/gfortran/lib'
ld: library not found for -lgfortran
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [TSSS.so] Error 1
ERROR: compilation failed for package ‘TSSS’
* removing ‘/Library/Frameworks/R.framework/Versions/3.5/Resources/library/TSSS’
```
fortran関係でエラーを吐いてる．

どつぼり．
はじめての OpenResty : ホットロード

## lua_code_cache off によるホットロード

OpenResty で lua のコードを含んだファイルを変更した場合、都度 `nginx -p $(pwd) -s reload` を実行して nginx を再起動する必要がありました。

開発段階でカジュアルに使っている場合、毎回再起動するのは面倒で、ファイルを変更後サーバーの再起動なしでアプリケーションのコードが反映されることが望ましいです。こうした機能は「ホットロード」などと呼ばれます。

OpenResty の Lua で記述されたアプリを含んだモジュールは、一度ロードされるとキャッシュされ再利用されます。これに対し `lua_code_cache off` を location ディレクティブで指定することでキャッシュが無効となり、リクエスト毎に Lua のモジュールが読み込まれます。これによってファイルの変更後のリクエストで直ちに反映されるのと同じ効果があります。ためしてみましょう。

## 現在の構成およびデフォルト時の挙動

OpenResty のインストールについては [はじめての OpenResty : Hello World](https://qiita.com/nobuh/items/40ef50dd70fdf8a580e4) などを参照してください。

今回も Windows PC 上の VirtualBox のゲストに CentOS 7 が NAT NIC でインストールされている想定です。

* ポート構成

| 用途 | ホストIP | ホストポート | ゲストIP  | ゲストポート |
-------+----------+--------------+-----------+---------------
| ssh  | 0.0.0.0  | 20022        | 10.0.2.15 | 22           |
| HTTP | 0.0.0.0  | 20080        | 10.0.2.15 | 80           |
| DEV  | 0.0.0.0  | 28080        | 10.0.2.15 | 8080         |

* ディレクトリ構成

```
../restyroot
├── conf
├── logs
└── lua
```

* conf/nginx.conf

```
worker_processes 1;
error_log logs/error.log;
events {
        worker_connections 1024;
}
http {
        server {
                listen 8080;
                location / {
                        default_type text/html;
                        content_by_lua_file ./lua/hotload.lua;
                }
        }
}
```

* lua/hotload.lua

```
ngx.say("<p><span style="color:red">RELOADED?</span></p>");
```

`nginx -p $(pwd) -c conf/nginx.conf` で nginx を起動しホストの Windows 上のブラウザから `localhost:28080` でアクセスしてみます

![red.png](https://qiita-image-store.s3.amazonaws.com/0/101020/8d276e2e-9288-482e-284b-68010c0d997c.png)


赤文字で表示されました。次にこのまま `lua/hotload.lua` の中の色を blue に変更します。

```
$ sed -i -e "s/red/blue/g" lua/hotload.lua
```

このまま再度ブラウザからアクセスしてみると。。。

![red.png](https://qiita-image-store.s3.amazonaws.com/0/101020/8d276e2e-9288-482e-284b-68010c0d997c.png)

F5 や Shift + F5 でキャッシュクリアの Reload をしても、もちろん赤文字から変更されません！

## lua_code_cache off にする

location ディレクティブを以下に変更します。

```
                location / {
                        default_type text/html;
                        lua_code_cache off;   <===== 追加
                        content_by_lua_file ./lua/hotload.lua;
                }
```

nginx を reload すると以下のように alert が出ますが問題なく再起動されています。

```
$ nginx -p $(pwd) -s reload
nginx: [alert] lua_code_cache is off; this will hurt performance in /home/restymgr/restyroot/conf/nginx.conf:11
```

これは説明どおり、リクエスト毎にファイルを読みに行くことになりますのでパフォーマンスは大きく低下します。その警告です。

まずは、`localhost:28080` にアクセスしてみましょう。reload していますので設定に関係なく青文字で表示されていると思います。

![blue.png](https://qiita-image-store.s3.amazonaws.com/0/101020/fb8ce8cd-a878-58aa-5d92-c4fb5aa0f401.png)


次に `lua/hotload.lua` の中の color 設定を green に変更し、

```
$ sed -i -e "s/blue/green/g" lua/hotload.lua
```

ブラウザでアクセスすると

![green.png](https://qiita-image-store.s3.amazonaws.com/0/101020/295352f3-b19b-8871-2ba6-e61fcaca80a2.png)

緑文字に変わりました！

## まとめ

パフォーマンスは損なうことになりますが、煩雑な nginx 再起動なしでスクリプトファイルの変更が即反映される形になります。

本番環境では使うことは出来ませんが、OpenResty であっても頻繁にコードを変更する開発段階においては必須のパラメーターと考えられます。

この設定でみなさんの OpenResty での Web アプリケーション開発が快適になれば幸いです。
val mutableList vs var List

どう違うのか？
試してみましょう

```kotlin

	val items1 = mutableListOf(1,2,3)
    println(items1.toString())  // [1, 2, 3]
    items1 = mutableListOf(10)  // Error:(9, 4) Val cannot be reassigned
    items1.add(4)
    println(items1.toString())  // [1, 2, 3, 4]

    var items2 = listOf(1,2,3)
    items2.add(4)               // Error:(10, 11) Unresolved reference: add
    println(items2.toString())  // [1, 2, 3]
    items2 = listOf(11)
    println(items2.toString())  // [11]
```

varは最代入可能な通常の変数、valはfinalに置き換わるので再代入が不可能な変数。mutableListは普通のListになるのでaddが可能、Listはイミュータブル扱いになるので、addはできない。
というふうに整理できるのですね
UbuntuにMySQL5.7をAPTでインストール

## 今回の環境
環境 -> Windows Subsystem for Linux (以下WSL)
ストアアプリ -> Ubuntu
OS -> Ubuntu 18.04.1 LTS

2018年8月30日現在、この手順でインストールされるMYSQL -> MySQL Community Server 5.7.23

## 手順

[MYSQL公式サイト](https://dev.mysql.com/downloads/repo/apt/)を参考に。

### APTセットアップ

```shell
cd ~
wget https://dev.mysql.com/get/mysql-apt-config_0.8.10-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.10-1_all.deb
```
mysql-apt-config_0.8.10-1_all.debの数字の部分は、目的のバージョンか何かで変わるようなので、注意。詳しいことはGoogle先生にお聞きください。

こんなダイアログが表示されるので、一番上の項目を選んでEnter、mysql5.7を選んで、決定。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235255/1ecd86e2-eeec-b857-a38d-fceeb947f73b.png)

### APTでインストール

```shell:インストールその２
sudo apt update
sudo apt install mysql-server -y
```

rootユーザーのお好きなパスワードを入力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235255/469299d2-9252-6f29-6da2-16245f90770a.png)

### 起動・停止の仕方

サービスコマンドで起動・停止できる。

```shell:各種コマンド
# 状態を確認
sudo service mysql status
# MySQLサーバを停止
sudo service mysql stop
# MySQLサーバを開始
sudo service mysql start
```
JSの値渡しについて

##変数

**基本型変数と参照型変数がある**

具体的に言うと、基本型変数はその値そのものの情報を別の変数に渡していて、参照型変数ではメモリ上の参照している情報を別の変数に渡している。

---

* **基本型変数：let x = 1** 　=> データ型（値）を格納。コピー品。
* **参照型変数：let x = {x:1, y:2}**　=> オブジェクトを格納。参照先をコピーしている。監視する人がもうひとり増えるイメージ。

---
参照とは、アドレス（住所）を見に行く大家のイメージ。マンションや家の住人が変わっても、見に行く住所は変わらない。


####値渡しと参照渡しの例


```js:js
//1.基本型変数
const a = 123;
let b = a;//値そのものを右辺から左辺へコピー
b++;
console.log(b);//124
console.log(a);//123


//参照型変数(オブジェクト)
//2.参照先が同じ
let a = {x:1, y:2};
let b = a;//参照をコピーしている
b.x++;
console.log(b.x); //2
console.log(a.x); //2


//3.参照先が変わるとき
let a = {x:1, y:2};//
let b = a;
a = {x:2, y:2};
console.log(b.x); //1
console.log(a.x); //2
```

1. 基本型のとき、値そのものがコピーされるので
コピー品が変わってもオリジナルは変わらない。

2. 参照型のとき、参照元（住所）がコピーされる。大家が2人になり、同じアドレス（住所）を見ているイメージ。どちらの大家も住所の住人を変更できる。

3. 参照先が変われば、見ている住所が変わる。一人の大家がマンションの売却し、別のマンションを購入したイメージ。マンションの住人を変えても、どちらにも関係ない。



##関数の値渡しついて
関数の値渡しとは、関数呼び出し式で、引数という形で、関数に値を渡すこと。
この渡し方も、値渡しと参照渡しがある。

####基本型のとき

```js:js
function(a, b) {
  return a / b;
}

f(5, 4); //引数を関数内に渡している
//1.25
```

####関数の引数のスコープを考える
引数に値を渡したとき、思った挙動にならない時がある。
たとえば、変数に10を足す関数を作ったとする

```js:js
//引数に渡された値に10を足す関数
function myFunc1(n) {
    n = n + 10;
}

var num = 10;
myFunc1(num);
console.log(num); //10
```

期待値的には12を返してほしいところだが、10を返す。
**関数の引数はローカルスコープになるからだ。**
引数nは関数内では有効になるが、グローバル変数には影響を与えない。
そのため、console.log(num)のnumはグローバル変数のnumを参照するため、値は10となる。

<br>
####参照型のとき

また渡される値がオブジェクトの場合はどうだろうか。
パターンとしては2パターンある。

```js:js
function changeArr(arr) {
    arr = new Array(1, 1, 1); 
}

var theArr = [1, 3, 5];
changeArr(theArr);
console.log(theArr); //1, 3, 5
```
これは、先ほどと同じ、ローカルスコープが効いているので関係はない。

<br>
しかし、変数の内部の値を変更するようなメソッドを実行したり、あるいはプロパティを変更すると、呼び出しもとの変数に変更が反映される。

```js:js
function changeArr(arr) {
    arr.push(9); 
}

var numArr = [1, 3, 5];
changeArr(numArr);
console.log(numArr); //1, 3, 5, 9
```
**引数arrの参照先と変数numArrの参照先が同じになる。**
このとき、同じ住所をみているので、引数arrでメソッドを使い加えた変更は
numArrでも同じように見ることができる。


####オブジェクトについて
```js:js
const obj = {x:1 , y:3};
```
objのことを**オブジェクトobj**を呼ぶとき
「オブジェクトobj」は「変数objから参照されるオブジェクト」である。
obj自身がオブジェクトなのではなく、objが消滅してもオブジェクト自身は存在することができる。



*参考リンク*
[JavaScript のスコープを理解する](http://tacamy.hatenablog.com/entry/2012/12/30/191125)
[引数の渡し方を理解しよう](https://qiita.com/makotoo2/items/50c6ee98c18f35688b17)
本番環境に影響を与えずテストを行いたい Blue-Green Deployment

#はじめに
サイバーの分野だとパッチを適用しろと言われたけどバグや不具合が怖い。ペネトレーションテストしたいけど本番環境を1秒たりとも止めたくない。とか、面倒な話しが出てきます。これをアーキテクチャ的にどのように克服してテストをしやすい環境を作るか、考えてみます。

#devops
[DevOps について改めて(社内LT用)](https://qiita.com/ichidou/items/ba8cf6c320f2a50c6f36)

結局
・積極果敢に機能を追加したい、パッチをあてたい。つまりガンガン変更したい
という要求と、
・安定したシステムに手を一切加えたくない
という相異なる要求のせめぎ合いになるわけです。

この問題に取り組むdevopsは開発と運用という相異なる思想で動くものを融合させることだと理解しています。
[【wikipedia】DevOps](https://ja.m.wikipedia.org/wiki/DevOps)

では融合させるために何が必要か？アーキテクチャ的に解決するには Blue-Green Deployment が一番わかりやすいものだと思っています。

#Blue-Green Deployment

[AWSのホワイトペーパーから学ぶブルーグリーンデプロイメント](http://blog.serverworks.co.jp/tech/2018/07/18/aws_blue_green_deployments/)

![BFB3E076-D41A-4D0C-9E08-9D88808430B0.jpeg](https://qiita-image-store.s3.amazonaws.com/0/272771/5eb6eace-9e10-f2c8-25f1-da9a97e5effb.jpeg)

冗長化したシステムを作ります。片一方をBlue、他方をGreenとして分けます。
今、Blueの方がライブです。Greenの方に開発したいものをどんどん盛り込み、テスト。本番環境にデプロイできる状態になったら、DNSで切り替えて、Greenがライブになるようにします。

今度はBlueの方に開発したいものをどんどん盛り込んで行けばいいわけです。

シンプルな考え方ですね。

![BE54A5EC-5F78-445B-BFDF-43C5EB807C61.jpeg](https://qiita-image-store.s3.amazonaws.com/0/272771/defbcc0e-8489-8531-fa26-2e49363b073f.jpeg)

BlueとGreenをパツンと切り替えるのではなく、徐々に切り替えていく方式です。
Blueが100%、Green 0%からBlue 80%、Green 20%になるようDNSを調整。するとGreenの方を徐々に本番環境でテストできるわけです。
テストで見落としがあって重大バグが発覚しても被害を最小限に、素早く切り戻せます(Blueを100%にすればよい)。

#感想
[「Blue-Green Deployment」とは何か、マーチン・ファウラー氏の解説](https://www.publickey1.jp/blog/14/blue-green_deployment.html)
巨匠マーチン・ファウラーも書いてますね。

[ステージング環境とは？開発環境、検証環境との違いと役割](http://www-creators.com/archives/780)
![565D5C71-F33A-4333-9E02-5DFFEB624E50.jpeg](https://qiita-image-store.s3.amazonaws.com/0/272771/e687adb4-fb5d-0319-bb84-839719909b16.jpeg)

開発、ステージング、本番と環境を整えていれば、わりとすぐ乗り換えられ、、、ないのかなぁ。。と思います。


#履歴
2018/08/30 初版
Watson StudioでNLC学習を行う

# はじめに
Watson StudioでNLCの学習をどうするか質問されたので、その手順をメモします。

[2020-04-25] 事前準備手順修正

# 事前準備
[無料でなんでも試せる! Watson Studioセットアップガイド](https://qiita.com/makaishi2/items/b666f847a98c2e42dfbb)
でWatson Studioのワークスペース作成までを行います。
更にこの手順書の「オプション」にあるのと同様の手順でNLCサービスの登録、連携を行います。
Watson Studio自体はライトアカウントで可能ですが、NLCはLiteプランがなく、Standardプランは登録するだけで(一切利用しなくても)月20ドル(約2000円)かかる点はご注意下さい。

登録が終わった後の、Watson Studio Project Settingsの画面は次のようになります。

![スクリーンショット 2018-08-30 19.22.36.png](https://qiita-image-store.s3.amazonaws.com/0/206130/ee08daea-e317-0874-354d-7ec5baeef627.png)

# CSVファイルの用意
学習に利用するCSVファイルを用意します。
CSVファイルは、従来と同様の ``"例文","クラス名"``の形式です。
文字コードはUTF-8にして下さい。

以下に、学習データ例の一部を添付します。

```
"しおるるは 何かあんずの 花の色","spring"
"山路来て　何やらゆかし　すみれ草","spring"
"長持に　春ぞくれ行く　更衣","summer"
"目には青葉　山ほととぎす　はつがつを","summer"
"この道や　行くひとなしに　秋の暮れ","autumn"
"枯れ枝に　烏のとまりけり　秋の暮れ","autumn"
"初時雨　猿も小蓑を　欲しげなり","winter"
"いざ子ども　はしりありかん　玉霰","winter"
```

(このデータは、以下のリンク先情報から作成しました)
[春の俳句30選](https://jpnculture.net/haiku-haru/)
[夏の俳句30選](https://jpnculture.net/haiku-natsu/)
[秋の俳句30選](https://jpnculture.net/haiku-aki/)
[冬の俳句30選](https://jpnculture.net/haiku-fuyu/)

# 新規classifierの作成

Watson Studioのプロジェクト管理画面から、「New Language Classifier model」のリンクをクリックします。

![スクリーンショット 2018-08-30 19.47.24.png](https://qiita-image-store.s3.amazonaws.com/0/206130/be7717b6-a8e4-cb52-a5f4-4e077adf81db.png)

下の画面が表示されたら、ガイドに従い、あらかじめ用意したCSVファイルをアップします。

![スクリーンショット 2018-08-30 19.47.49.png](https://qiita-image-store.s3.amazonaws.com/0/206130/9e41441f-6c62-8bde-160e-9a2c1ec82c96.png)

アップロードが完了したら、今アップしたファイルにチェックをつけた上で、「Add to model」をクリックします。

![スクリーンショット 2018-08-30 20.00.25.png](https://qiita-image-store.s3.amazonaws.com/0/206130/9e318a3a-e618-7f96-144c-f8b969b04f67.png)

CSVの書式に問題がなければ、下のような画面になるので、「Train model」をクリックします。

![スクリーンショット 2018-08-30 20.04.17.png](https://qiita-image-store.s3.amazonaws.com/0/206130/2b11f53d-9585-c845-851a-d5b30d49ab1b.png)

下のようなモデルの言語選択のパネルがでるので、「Japanese」に変更をした後で、「Train」をクリックします。

![スクリーンショット 2018-08-30 20.04.47.png](https://qiita-image-store.s3.amazonaws.com/0/206130/2ba7286d-7b4d-f61a-bbac-dbcdcc08662d.png)

学習が始まると、下のような画面となります。

![スクリーンショット 2018-08-30 20.05.00.png](https://qiita-image-store.s3.amazonaws.com/0/206130/13d7ebf3-e37e-8035-cbd9-5211c046790d.png)

正常に学習が終わると、次のような画面になるので、ガイドに従い、下記のリンク先をクリックします。

![スクリーンショット 2018-08-30 20.13.35.png](https://qiita-image-store.s3.amazonaws.com/0/206130/38c564b7-e27b-90d5-775d-04c99f5df1fb.png)

リンク先の画面は次のようになっています。

![スクリーンショット 2018-08-30 20.15.34.png](https://qiita-image-store.s3.amazonaws.com/0/206130/e3dd9e19-0f80-8760-6ba1-46206ee29be2.png)

Testタブをクリックすると、簡易テストの画面が表示されます。
テストのやりかたは簡単で、「Enter a phrase to classify」の欄に分類したい対象の文章を入力して、「Classify」ボタンをクリックします。結果は下の図のように表示されます。

![スクリーンショット 2018-08-30 20.31.17.png](https://qiita-image-store.s3.amazonaws.com/0/206130/692c200f-1d39-013f-44a8-b1007af8a0d7.png)