OmniAICreator/Qiita-1.07M huggingface dataset:
2 taitanic生存者を予測する！

#クロスバリデーション法を用いて精度を上げる！(4219位/11485人中)
```python
import numpy as np
import pandas as pd
import xgboost as xgb

from sklearn.metrics import accuracy_score
from sklearn.model_selection import StratifiedKFold

#test.csv（評価用データ）はしばらく使用しないため、ソースコードから消してあります。
df_train = pd.read_csv("train.csv")

# 欠損値を埋める
df_train["Age"] = df_train["Age"].fillna(df_train["Age"].mean())
df_train["Cabin"] = df_train["Cabin"].fillna(df_train["Cabin"].mode())
df_train["Embarked"] = df_train["Embarked"].fillna(df_train["Embarked"].mode())

# train
df_train.drop(["Name", "Ticket", "Cabin"], axis=1, inplace=True)
df_train["Sex"] = df_train["Sex"].replace({"male": 0, "female": 1})
df_train = pd.get_dummies(df_train)

train_y = df_train["Survived"]
train_x = df_train.drop("Survived", axis=1)

clf = xgb.XGBClassifier()
clf.fit(train_x, train_y)

accuracies = []
cv = StratifiedKFold(n_splits=150, shuffle=True, random_state=0)
for train_idx, test_idx in cv.split(train_x, train_y):
    trn_x = train_x.iloc[train_idx]
    val_x = train_x.iloc[test_idx]

    trn_y = train_y.iloc[train_idx]
    val_y = train_y.iloc[test_idx]

    clf = xgb.XGBClassifier()
    clf.fit(trn_x, trn_y)

    pred_y = clf.predict(val_x)
    accuracies.append(accuracy_score(val_y, pred_y))

print(np.mean(accuracies))
```
```python
#出力結果
0.8047138047138048
```

####訓練データ＝過去問
####検証データ＝そっくり模試
####テストデータ＝本番入試

#クロスバリデーション法とは？
訓練用データを訓練用データと検証用データの２つに分け、手元で精度を求められる方法
つまり、訓練用データ１つのみで精度を表せる画期的な方法！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/ebe8b407-8e4c-7b2e-853f-fa7f5fc4b0b9.png)

#なぜクロスバリデーション法の利点とは？
今までは、[曇り,83,78,なし]→した　[雨、70、96、なし]→した　....
この結果から、答えを予測するのだが、あまりにも条件を制限しすぎていることが問題となる。
つまり、テストデータがこのデータとぴったり同じであれば百発百中なのだが、実際そう厳密にぴったり同じデータになることは少ない。
しかし、クロスバリデーション法を用いると、上記の8つを訓練データ　残りの2つを検証データとすることでより汎用性の効いたclfを作ることができる！
Wordpress 開発でも静的解析したい！

## 静的解析しよう

Wordpress のプログラムを書いているときにサイトが止まるような実行エラーって怖いですよね。
それらを少しでも減らすために、プログラム公開前に自身の開発環境で、型のチェックや引数のチェックなど、静的解析を正しく行うことで、予め実行エラーに気づける環境を作りましょう。

## 環境
- Wordpress プラグイン開発
- PHP7


## ディレクトリ構成
```
.
├── RAPI_Plugin.php  # plugin main ファイル
├── composer.json
├── composer.lock
├── phpstan.neon     # phpstan 設定ファイル
├── require.php
├── src              # 静的解析したいプログラムのディレクトリ
│   ├── Controllers
│   ├── RAPI.php
│   ├── Models
│   └── Routes
├── bin
├── tests
└── vendor
```



## PHPStan

PHP 向けの静的解析ツールです。
こちらの方の説明が詳しいです。
https://qiita.com/qiita_masaharu/items/24bf34579119628eefe2


## WordPress extensions for PHPStan


szepeviktor/phpstan-wordpress を利用します。
https://github.com/szepeviktor/phpstan-wordpress


``` composer.json
{
    "require-dev": {
        "szepeviktor/phpstan-wordpress": "^0.2.0"
    },
    "scripts": {
        "post-install-cmd": "PHPStan\\WordPress\\Composer\\FixWpStubs::php73Polyfill",
        "post-update-cmd": "PHPStan\\WordPress\\Composer\\FixWpStubs::php73Polyfill"
    }
}

```

これを ``` composer install ```

## 設定ファイル(phpstan.neon)
``` phpstan.neon
includes:
    - vendor/szepeviktor/phpstan-wordpress/extension.neon
parameters:
    excludes_analyse: ['bin', 'tests', 'vendor']
    autoload_directories:
        - ./src
    bootstrap: null
    level: max
    fileExtensions:
        - php
    inferPrivatePropertyTypeFromConstructor: true
```

## 実行準備

``` 
composer update --classmap-authoritative 
```
このコマンド実行する

## 実行
```
./vendor/bin/phpstan analyse --memory-limit 256M .

 11/11 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%


 [OK] No errors
```

良さそうですね。
Ubuntsu + Docker + Gitlabを動かす

#導入
開発サーバとして運用しているUbuntsu上にDockerをインストールし、その中でGitlabを動かしたい
#やったこと
dockerのインストール

```bash:command
sudo apt-get install docker
```
gitlabのイメージでrun

```bash:command
docker run --detach `　//バックグラウンドで起動する
    --hostname gitlab.example.com `
    --publish 8080:8080 `
    --name gitlab `
    --restart always `
    --volume /srv/gitlab/config:/etc/gitlab `
    --volume /srv/gitlab/logs:/var/log/gitlab `
    --volume /srv/gitlab/data:/var/opt/gitlab `
    gitlab/gitlab-ce:latest
```
#はまりごと
どうもbad gatewayで動かない
unicornというパッケージがポート8080を使用していた

```vim:/etc/gitlab/gitlab.rb
unicorn['port'] = 8090
```
#参考
https://qiita.com/TaskeHAMANO/items/b01f2d8590c23d6b2bce
https://maku77.github.io/git/gitlab/unicorn-port.html
ある条件で行列の要素の値を変更する。

ある条件をもとに行列内の値を変更する。

```python
A = np.array([[1,2,3,4],[-1,2,-9,10],[7,6,10,-8]])

print(A)
#[[ 1  2  3  4]
#[-1  2 -9 10]
#[ 7  6 10 -8]]


#行列の要素が０以下の場合０にする
A[A <= 0] = 0

print(A)
#[[ 1  2  3  4]
#[ 0  2  0 10]
#[ 7  6 10  0]]
業務改善ツールを活用する上で、前提となる知識

Salesforceについて、識者からちょっと話を聞いたのでメモ

# そもそも
- 導入前に設計が必要。
  - ＝ 設計できる人材が必要
  - ただ単に「使えば、導入すれば解決」というツールではない 
- 既に不適切な運用がされている中でテコ入れしていくのはしんどい。

# ツール導入前
- 「個人」対「個人」のやりとり
- もしこちらの担当者が異動などで変わったら、個人単位では「はじめまして」のやり取りになる
  - 個人との関係の上ではそれでもいいが、法人としてやりとりする上では間違い
  - すでに取引がある法人に対して「はじめまして」の関係ではないため

# ツール導入後
- 「法人」対「法人」のやり取り
  - 実際は、「ツールを導入している法人」対「個人」が多い
- 個人はあくまでも法人の代理人
- 集合知がツールに集約されており、それを活用してやりとりをする
 - 担当者が変わっても、引き継いで続きからやり取りが出来る

# 化粧品会社の例
1. 担当者のYが取引先Tに化粧品Aを売った
2. 担当者Yが異動になり、新たにWが担当者になった。
3. 新たに化粧品Bが販売されることになった。
4. 担当者WはSalesforceから情報を取得し、「はじめまして」から行うことなく、取引先Tに「以前、化粧品Aをご購入いたただきましたが、このたび新たに化粧品Bを発売致しました」と、新商品の化粧品Bの提案・情報のアップデートの連絡をスムーズに行うことができる
  
# 情報分析
- たとえば「商品」の情報があり、「購買」を経て最終的に「請求」のデータになる
- 「購買」には買った人、どこで買われたか、いつ買われたかといった情報が紐付けられている
- 請求データには分析のためのカラムが追加される
  - いつ、だれが、どこでといった分析ができる
  - どこが一番売れているのか、誰が一番買っているのか、誰が作ったものが好評なのかなどが分析できる
 
→ 取引を通じて最終的に生成されるデータを分析し、新たな戦略として活用していく

最終的なデータをスムーズにトップに伝えて、新たな戦略を各部署に素早く伝えていくのが業務ツールの本質。

# アカウント管理
他社との契約書は基本的に紙ベース。それを管理するためのツールでもある。

- 法人の基本データ
- 契約書のデータ
- アカウント検索して、契約書をすばやく取り出せる

## 紙ベースのままだと
- どこにおいたっけ
- バインダーにあるんだっけ
- ファイルに挟んでるんだっけ

などが発生する

# まとめ
※集合知となる部分にデータを入れていく・入れてもらう仕組みづくりがもちろん必要

## 取引レベルだと
- 集合知から情報を取り出す
- 情報を元に、担当者が変わろうと取引先とスムーズな関係を保ち、顧客満足度を高めることが出来る

## 経営戦略レベルだと
- 成果を素早く集約し、分析することで、短い周期で新たな戦略を打ち出すことができる
Wordpress でカスタム URL を追加する

Wordpress 環境で開発をする際、新しくページ（URL）を追加したい場合があるかと思います。
ただ、ページ追加に関しては、rewrite_rules_array に URL やパラメータを追加するなどの Wordpress 独特の知識が必要となります。
そういったものを取り払い、Routing としてページ追加を実現することが記事の趣旨です。

## 環境
・Wordpress プラグイン開発
・PHP 7.2.19
・RAPI という namespace でプラグイン開発


## Route Class
このクラスはこちらのサイトから引用させていただいています。
https://firegoby.jp/archives/1213

これは、作りたい URL を wordpress の URL の取り扱いに変換させるためのクラスです。

``` Route.php
<?php

namespace RAPI\Routes;

class Route {
  private $rule     = null;
  private $query    = null;
  private $callback = null;

  public function __construct($rule, $query, $callback){
    $this->rule     = $rule;
    $this->query    = $query;
    $this->callback = $callback;
    add_filter('query_vars', array(&$this, 'query_vars'));
    add_filter('rewrite_rules_array', array(&$this, 'rewrite_rules_array'));
    add_action('init', array(&$this, 'init'));
    add_action('wp', array(&$this, 'wp'));
  }

  public function init()
  {
    global $wp_rewrite;
    $rules = $wp_rewrite->wp_rewrite_rules();
    if (!isset($rules[$this->rule])) {
      $wp_rewrite->flush_rules();
    }
  }

  public function rewrite_rules_array($rules)
  {
    global $wp_rewrite;
    $new_rules[$this->rule] = $wp_rewrite->index . '?'.$this->query.'=1';
    $rules = array_merge($new_rules, $rules);
    return $rules;
  }

  public function query_vars($vars)
  {
    $vars[] = $this->query;
    return $vars;
  }

  public function wp()
  {
    if (get_query_var($this->query)) {
      call_user_func($this->callback);
    }
  }
}

?>
```

## Router class

これは URL の登録管理のためのクラスです。
Route インスタンスを作ることで Routing を作成します
下の例であれば /rapi/api/article の URL のアクションを article_api_controller の index function にマッピングして登録しています。

``` Router.php
<?php

namespace RAPI\Routes;

use RAPI\Controllers\Api\ArticleController;

class Router {
  protected $article_api_controller;

  public function __construct() {
    $this->article_api_controller = new ArticleController();
    $this->addRoutes();
  }

  public function addRoutes() {
    new Route('rapi/api/article', 'rapi_api_article_index', [$this->article_api_controller, 'index']);
  }
}
```

## 利用方法

``` App.php
<?php

namespace RAPI;

use RAPI\Routes\Router;

class App {
  protected $router;

  public function __construct() {
    $this->router = new Router()
  }
}
```

## Controller class (参考)
上の例であれば、 /rapi/api/article の URL で、この index() メソッドが実行され、
JSON で ["id":1] が出力されるものとなります。
REST API 作るだけであれば WP REST API で良いですけどね。

``` ArticleController.php
<?php

namespace RAPI\Controllers\Api;

class ArticleController {
  public function index() {
    wp_send_json(['id' => 1]);
  }
}
```
WSLではマウントしたドライブ上のファイルにchmod効かないから気をつけろって話

# 結論
wsl上の.sshにでも鍵をコピーしてからchmodで権限を変更して使え

# wsl上でsshしたくなった
windowsも最近よく頑張っているのでpowershell上からsshするのも悪くないのだが，細かいコマンドについてはやっぱりlinuxが使いたくなる．
wslつかってssh(又はscp)しようとしたところunprotectedで起こられた

```
> ssh -i /mnt/c/Users/pengu/.ssh/hoge.pem user@host
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0777 for '.ssh/hoge.pem' are too open.
It is required that your private key files are NOT accessible by others.
```
OK, OK．権限関連で怒ってるのねわかるよ分かる

```
> ls -la .ssh/
-rwxrwxrwx 1 penguin penguin 1696 Feb  8  2019 hoge.pem
```
そりゃ怒られますね
よっと

```
> chmod 600 .ssh/hoge.prm
> ls -la .ssh
-rwxrwxrwx 1 penguin penguin 1696 Feb  8  2019 hoge.pem
```
なんで？(この後安易にsudoも試した)

# どうやらwsl上のchmodはマウントしたものに効かないらしい
https://github.com/Microsoft/WSL/issues/3181
そもそもwindowsは権限をOS上で管理しているからファイル自体での制限には無頓着なんですねわかる

# 解決策
おとなしくwsl上にコピーして権限を変更して使う

```
> cp .ssh/hoge.pem ~/.ssh/
> chmod 600 ~/.ssh/hoge.pem
> ssh -i ~/.ssh/hoge.pem user@hoge
```

**P.S MicroSoftさん「windows terminal」まだですか？？？？？？**
PcessingでopenCVを使い、顔以外を検出

processingにopenCVを入れて顔を検出する説明がネットにも本にも色々書かれているけど、口や、目だけを検出する方法が少ないので調べてみた。


例として顔検出にexampleとして入っているのは

```
import gab.opencv.*;
import java.awt.Rectangle;

OpenCV opencv;
Rectangle[] faces;

void setup() {
  opencv = new OpenCV(this, "test.jpg");
  size(1080, 720);

  opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);  
  faces = opencv.detect();
}

void draw() {
  image(opencv.getInput(), 0, 0);

  noFill();
  stroke(0, 255, 0);
  strokeWeight(3);
  for (int i = 0; i < faces.length; i++) {
    rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
  }
}

```

この中の
opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE); 

ってところで検出する対象を決めている。

opencvのことが書かれているファイルは
Documents/Processing/libraries/opencv_processing/src/gab/opencv/OpenCV.java

この中に

```
	public final static String VERSION = "0.5.4";
	public final static String CASCADE_FRONTALFACE = "haarcascade_frontalface_alt.xml";
	public final static String CASCADE_PEDESTRIANS = "hogcascade_pedestrians.xml";
	public final static String CASCADE_EYE = "haarcascade_eye.xml";
	public final static String CASCADE_CLOCK = "haarcascade_clock.xml";
	public final static String CASCADE_NOSE = "haarcascade_mcs_nose.xml";
	public final static String CASCADE_MOUTH = "haarcascade_mcs_mouth.xml";
	public final static String CASCADE_UPPERBODY = "haarcascade_upperbody.xml";
	public final static String CASCADE_LOWERBODY = "haarcascade_lowerbody.xml";
	public final static String CASCADE_FULLBODY = "haarcascade_fullbody.xml";
	public final static String CASCADE_PEDESTRIAN = "hogcascade_pedestrians.xml";

	public final static String CASCADE_RIGHT_EAR = "haarcascade_mcs_rightear.xml";
	public final static String CASCADE_PROFILEFACE = "haarcascade_profileface.xml";

```


とあるので、CASCADE_FRONTALFACEの部分をCASCADE_○○に書き換えれば使えそう


![Bad Request]()
twitterのメディアダウンロードワンライナー


## twitterの画像を一括ダウンロードする
どこか好きなtwitterのメディアアカウントに対して、
画像を抜き出す。大量にダウンロードされる場合があるから気をつけてね


```
curl -s https://twitter.com/<好きなtwitter>/media | egrep -o "img data-aria-label-part(.+)" | egrep -o 'src="(.+)" ' | sed -e 's/"//g' | sed -e 's/src=//' | while read line; do echo $line; curl -O $line;  done
```
【メモ】IBM Cloudで重要情報を確認する

# はじめに
IBM Cloudでサービス稼働に関する重要情報を確認するための手順メモ

# 手順
ダッシュボードの表示
https://cloud.ibm.com  で下記のダッシュボード画面を表示させ、メニューから「**Support**」を選びます。

![スクリーンショット 2019-08-21 16.14.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/6f7b1277-d307-bbce-0dad-3db0a9476bc7.png)

「**サポート**」の画面になったら、「**クラウド状況の表示**」リンクをクリックします。

![スクリーンショット 2019-08-21 16.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/15cf50fe-f791-0572-6699-8c8b53fa3cb4.png)

下の「**状況**」の画面になったら表示項目を絞り込むため、「**コンポーネントでフィルタ**」でマウスをクリックします。

![スクリーンショット 2019-08-21 16.14.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/50d7f425-a594-ffd4-b5b9-8da9a37ad7eb.png)

例えば**Watson Machine Learing**に関する内容に絞り込みたい場合は、``machine``と入力します。下に「**Machine Learning**」のチェックボックスが出てくるので、それを選択します。

![スクリーンショット 2019-08-21 16.15.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/2933cc7d-9e56-c10b-236f-1d9b6c2ca4b0.png)

下の図のようにWatson Machine Learingに関する重要情報の一覧が表示されます。

![スクリーンショット 2019-08-21 16.16.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/14e2d430-d95f-fdcc-172e-a3898a34a187.png)
MongoDBのORM：mongoose

#はじめに
MongoDBはBSON形式で、普段操作はJSON操作できており、とても簡単です。

コレクションのスキーマは定義不要で、自由にカラムも増減できるのも楽です。

しかし、RDBからの開発者だとスキーマがあったほうが理解しやすいという考えもあります。
また、スキーマがあると型は統一され、変なデータ生成はないので、チーム開発にはメリットです。

MongoDBに有名なORMはmongooseだと思います。
mongoose：https://mongoosejs.com/

#インストール
`npm install mongoose`

#App.js OR index.jsに起動追加
```javascript
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true});
```

#スキーマ定義
```javascript
const UsersSchema = new mongoose.Schema({
  userId: String,
  userName: String,
  age: mongoose.Schema.Types.Number,
  interests:  { type: [String] }
});
```

#モデル生成
`const Users = mongoose.model('Users', UsersSchema)`

#CURDメソッドを用意
```javascript
exports.create = async function(user) {
  return await new Users(user).save()
}

exports.update = async function(user) {
  return await user.save()
}

exports.get = async function(id) {
  return await Users.findById(id)
}

exports.find = async function(condition, options) {
  return await Users.find(condition, null, options)
}

exports.delete = async function(id) {
  return await Users.findByIdAndRemove(id)
}

...

```

#呼び出す例
```javascript

const mongoUser = require('./users')

const user = {
   userId: "10000",
   userName: "yamata",
   age: 20,
   interests: ["サッカー", "読書"] 
}

const dbUser = await mongoUser.create(user)
```

#注意点
モデルのデータにカスタマイズのカラムを追加するときは無視されるようです。

```javascript
const users = await mongoUser.find(condition, options)

users.forEach(function(user) {
  // モデル以外のカラム情報を設定
  user.newCol = "new cloumn"
});

res.json(users)
```

APIでもらったレスポンスではnewColがありません。***モデルに定義されていないカラムは無視されるのを注意***
新規、更新の場合も定義されていないカラムは無視されます。

参考記事：https://mongoosejs.com/docs/index.html

以上
Macでローカル環境構築(MAMP + MySQLWorkbench)


## 必要なもの

- [MAMP](https://www.mamp.info/en/)
- [MySQLWorkbench](https://www.mysql.com/jp/products/workbench/)

## 手順

MAMPとWorkbenchを起動

Workbench接続先追加。
**Connection Method** を **Local Socket/Pipe**
**Socket/Pipe Path** を `/Applications/MAMP/tmp/mysql/mysql.sock`
**Username** : **mamp**
**Password** : **root**
Ruby Mailで添付ファイルを付ける方法（副題：検索上位が正しいとは限らない）

#はじめに
Ruby Mailで添付ファイルを付ける方法ですが、検索してすぐに見つかる方法[^1]だとエラーが発生してしまいましたが、それを解決しました。

[^1]: 執筆時点＝2019/8/21では、2015年のQiita記事がトップヒットでした。


環境はMail 2.7.1 です。

```console
$ gem list mail
mail(2.7.1)
```


#エラーになった方法

```ruby
require 'mail' #gem install mail

mail = Mail.new do
  from    "from@example.com"
  to      "to@example.com"
  subject "testmail"
  body    "Attachment mail test."
end

# この行がエラーになる。 This code is wrong. Error!
mail.add_file = "./attachment_file.txt"

# 以下省略
```

発生したエラーは``undefined method `add_file='``です。
`Did you mean? add_file`と言われました。

ということは、add_fileはメソッド、、、？

#動作した方法
```ruby
require 'mail' #gem install mail

mail = Mail.new do
  from    "from@example.com"
  to      "to@example.com"
  subject "testmail"
  body    "Attachment mail test."
end

# これが正しい。This code is correct.
mail.add_file("./attachment_file.txt")

# 送信するところまで省略せずに記載
# 192.168.0.1にSMTPサーバがあると仮定
options = {
  address: '192.168.0.1',
  port: 25
}

mail.charset = 'utf-8'
mail.delivery_method(:smtp, options)
mail.deliver
```

いつから変更になったのか、はたまた元からメソッドが正しいのかは調べきれませんでしたが、少なくともMail 2.2.17の時点では、メソッドが正しかったようです。
https://www.rubydoc.info/gems/mail/2.2.17/Mail%2FMessage:add_file 

検索結果を鵜呑みにせず、公式ドキュメントを確認するのは大事ですね。
RHEL8でコマンド実行時に Failed to set locale, defaulting to C と表示される 

#環境
- RHEL8（AWS EC2）

#発生内容
AWS EC2でRHEL8インスタンス作成後、アップデートを実行しようとしたら行頭に**Failed to set locale, defaulting to C** と表示される。

```console
$ sudo yum update
Failed to set locale, defaulting to C
Last metadata expiration check: 1:02:55 ago on Wed Aug 21 03:56:44 2019.
Dependencies resolved.
：
：
```

#原因
- 日本語の言語パッケージがインストールされていなかった。

```console
$ sudo yum -y install langpacks-ja
```

で解決。

また、日本語の言語パッケージをインストールしたことによって、日本語のテキスト入力も可能になった。（インストール以前は文字化けしていた。）

#以下、対応経過メモ
AWS EC2でRHEL8インスタンス作成後、アップデート実行するも件の現象発生。
↓
ロケール値が正しく設定されていないとそうなるらしい。
↓
現在のロケール値確認。エラーがでている。そんなファイルないって。

```console
$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
```

↓
設定可能なロケール値も確認。**ja_JP.UTF-8**は見つからず。

```console
$ locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
C.utf8
POSIX
en_AG
en_AU
en_AU.utf8
：
：
```

↓
インストール済みの言語パッケージ確認。ja無し

```console
$ sudo yum list installed langpacks-*
langpacks-en.noarch
```

↓
インストール可能な言語パッケージ確認。ja発見

```console
$ sudo yum list langpacks-*
:
:
langpacks-ja.noarch
:
```

↓
jaのパッケージインストール実行。

```console
$ sudo yum -y install langpacks-ja
```

↓
再度、現在のロケール値確認。さきほどの**locale: Cannot set 〜云々**のエラーが表示されなくなった。

```console
$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
```

↓
アップデート実行。**Failed to set locale, defaulting to C**の表示なくなる。かつ、メッセージが日本語に置き換わる。

```console
$ sudo yum update
メタデータの期限切れの最終確認: 1:04:39 時間前の 2019年08月21日 03時56分44秒 に実施しました。
依存関係が解決しました。
：
：
```

#参考
第7章 言語パックのインストールおよび使用 - Red Hat Customer Portal
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/installing-using-langpacks
Cloud FirestoreでSubCollectionを新規作成する

# 初歩的な疑問 - Document以下にCollectionがない時ってどうやって作成するのだろう？

Cloud Firestoreで、新規でSubCollectionを作成する方法がわからなかったので、いろいろ試しました。
作成済みのSubCollectionへのドキュメント追加のコードはよく見かけるけども、SubCollectionがない場合はどうすれば良いのか？

![2019-08-21_15.22.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31208/4b201bf6-4576-9670-3d2c-c2268e246900.png)

Collection: 【 main_collections 】以下に、Documment：【 DEkclk7y41HoH4DdRG41 】がある状態。

この　DEkclk7y41HoH4DdRG41　以下に、SubCollectionを追加したいとします。

```javascript
firebase
.firestore()
.collection("main_collections")
.doc('DEkclk7y41HoH4DdRG41')
.addCollection('sub_collections');
```

こんな風にaddCollectionメソッド的なものがあれば簡単そうですが、残念ながら存在しません。

## ドキュメントに対してコレクションを単体で追加するような機能はない

ではどうするかというと、

##作成したいCollection名を指定して、同時にDocumentも一緒に作成

すれば良いようでした。

```javascript
firebase
.firestore()
.collection("main_collections")
.doc('DEkclk7y41HoH4DdRG41')
.collection('sub_collections')
.add({
  name: 'Congratulations！'
});
```
![2019-08-21_15.51.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31208/5192bed6-fefb-8186-7434-fab3b00df590.png)

無事作成できました。

## 結論
**SubCollectionを新規作成する場合は、それに紐づくDocumentと一緒に作成する**
よく使うコマンド集

#目次
[1.ファイル操作系](#1-ファイル操作系)
　　[重いファイルを見つけたいとき(TOP100)](#重いファイルを見つけたいときtop100)
　　[任意の日付をフォーマット付きで設定する](#任意の日付をフォーマット付きで設定する)
　　[カレントディレクトリ以降に下記を含むディレクトリを検索し、圧縮されたファイルを検索する方法](#カレントディレクトリ以降に下記を含むディレクトリを検索し圧縮されたファイルを検索する方法)


### 任意の日付をフォーマット付きで設定する 

```
date -j -f "%Y-%m-%d" "2020-01-01"  +"%Y-%m-%d"
```

##1. ファイル操作系
### 重いファイルを見つけたいとき(TOP100)

```
du -hS / | sort -nr | head -100
```

### 無限ループ

```
while true; do echo hoge; sleep 2; done
```


## csvの特定行抽出
「foo.csv」の中身を、カンマ区切りで8,27番目の文字を抽出し、
1-3行目を無視して、「bar.txt」に出力する

```bash
cut -d ',' -f 8,27 foo.csv >  | sed -e '1,3d' | bar.txt
```


### 容量の多いディレクト検索
カレントディレクトリから１階層目までの深さまでの容量を計測し、
10番目まで重いディレクトリとサマリー容量を表示する（若干処理が重いので巨大なディレクトリは要注意）

```
sudo du -h -d 1 ./* | sort -nr | head -10
```

### 容量の多いファイル検索
100MB 以上のファイルを抽出する

```
find / -size +100M | xargs ls -lh | awk '{print $5,$9}' | sort -n
```

### コマンドラインから、mysqlに接続する
対話式でパスワードを問い合わし、mysqlをコンソールから叩けるようにする

```
mysql -h <host_ip> -P <port> -u <user_id> -p
```


### シェルからmysqlを実行する

hogehoge.shを叩くと、1-40までループし、sqlを実行する

```hogehoge.sh
#!/bin/sh

for i in `seq 1 40`
do
  echo <sqlの書かれたファイル名>.sql $i
  mysql -uroot <user_id> < <sqlの書かれたファイル名>.sql
  sleep 3
done
```

### カレントディレクトリ以降に下記を含むディレクトリを検索し、圧縮されたファイルを検索する方法

```
find ./ -name "30-12*" | xargs zgrep "2020-07-30T12:19"
```
【python】簡単クローリング＆スクレイピングvol.1

開発案件でPythonでクローリング&スクレイピングをする機会があったので、そこで新たに学んだことを使い、簡単にクローリング＆スクレイピングをやってみます。



## 目標

[日経電子版](https://www.nikkei.com/)を対象にカテゴリー名を引数に指定カテゴリーページ１ページ分の全タイトルを返すだけの簡単なものをつくっていきます。

![クローリング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481315/06bf1eae-f2b2-a230-975c-cd3f6d1f33d2.png)


上図の青枠で囲った記事タイトルを取得します。

また今回新たに学んだこととしてエラー処理についても簡単に実装します。

## コード

```python
from typing import List
import requests
from bs4 import BeautifulSoup


def get_nikkei_news(category: str) -> List[str]:
    """
    記事カテゴリーを指定して日経電子版のホームページをクローリング

    @param category: 記事カテゴリー
    @return:記事タイトルのリスト
    """
    titles = list()
    base_url = 'https://www.nikkei.com/'
    base_url_2 = '/archive/'
    try:
        response = requests.get(base_url + category + base_url_2)
        response.raise_for_status()

        response.encoding = response.apparent_encoding
        soup = BeautifulSoup(response.text, "html.parser")

        # スクレイピング
        title_list = soup.find_all('span', class_='m-miM09_titleL')
        for title in title_list:
            title_text = title.text
            titles.append(title_text)

    except requests.exceptions.HTTPError:
        print("{}カテゴリーページへのアクセス失敗".format(category))

    except Exception as e:
        print(e)

    return titles
```

```python
title_name_list = get_nikkei_news("technology")
for title_name in title_name_list:
    print(title_name)
```

実行結果

```
オプト、ＡＩで広告分類する仕組み開発
ディーカレット、仮想通貨を電子マネーにチャージ
トレードオフ破る非常識の無線通信、軍艦島で実証中
五輪の感染症対策　ワクチン接種と防蚊準備を
自動運転バス、既に実用化　福島第１原発を走っている
日本マイクロソフト、独ＳＡＰと連携してクラウド拡販
「総合証券サービス目指す」　ＬＩＮＥ証券の一問一答
アルトア、「自撮り」の本人確認で融資可能に
[FT]逆転の発想が生んだ世界最大のＡＩ用チップ
ＬＩＮＥ、証券サービス開始　１株単位で取引可能
```



## コード解説

- `try~except`構文：発生した例外に応じたエラー処理ができる。`try`節の中でエラーが発生すると、そのエラーに対応した`except`節の処理へと移行する。
- `requests.get('url')`：指定したURLに対してHTTPリクエストを送信し、サーバから返却されるHTTPレスポンスを戻り値として返す。
- `response.raise_for_status()`：ステータスコードが200番台以外だった場合エラーを起こす

| HTTPステータスコード | 意味               |
| -------------------- | ------------------ |
| 100番台              | 処理中             |
| 200番台              | 成功               |
| 300番台              | リダイレクト       |
| 400番台              | クライアントエラー |
| 500番台              | サーバーエラー     |

- `response.encoding = response.apparent_encoding`：極力文字化けが起こらないようにコンテンツを取得できる
- `BeautifulSoup(response.text, "html.parser")`：第一引数にHTML、第二引数にHTMLパーサーを指定できる。最初から使える `html.parser` を指定している。HTMLの字句解析をして、タグなどを判断してデータ構造として取得するプログラムをHTMLパーサーという。
- `soup.find_all('span', class_='m-miM09_titleL')`：グの子孫要素を調べてフィルタにマッチする全ての子孫要素をリスト型で返す
- `except requests.exceptions.HTTPError:`：ステータスコードが200番台以外だった場合のエラー時の処理
- `except Exception as e:`：例外の内容を知る
macOS Catalina 10.15 BetaでAdobe CCのアップデートをしたかった話

**この記事はまだBeta版のソフトウェアについてのものです、正式版では仕様が変わる可能性があります**
## macOS Catalina + Adobe
macOS 10.15から、iPadをサブディスプレイとして使えるSidecar機能が実装されます。
ここでイラストレーターさんなどは大きく影響を受けるんじゃないでしょうか。

なにせ、筆圧検知にも対応するiPad Proを、フルスペック版Photoshopが動くMacのサブディスプレイにすれば、液タブとして使えるのですから。

## Mojaveで黄信号を出されていたAdobe
現行バージョンの macOS Mojave 10.14.x は「32ビットアプリをサポートする最後のmacOS」と[アナウンスされています](https://japanese.engadget.com/2018/06/06/mojave-32-macos-wwdc-2018/)

既に、PhotoshopやIllustrator、AfterEffectsなどAdobe CCに含まれる製品自体は64ビット対応を済ませていますが、それらを管理するAdobe Application Managerがまだ対応していません。
<img width="774" alt="スクリーンショット 2019-08-21 15.12.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92661/210a99cb-f299-729b-14bf-13a506764e9e.png">

そのため、製品のアップデートなどでApplication Managerを使用すると、このようなメッセージが表示されることがあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92661/c8ac9a2a-8ef2-b53e-fc25-a6b9fa3617c5.png)
※スクショ撮る前に解決したので撮れず、引用

システム環境設定
<img width="500" alt="スクリーンショット 2019-08-21 15.21.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92661/3c1e859f-0c5a-6c83-ba17-3a07c18e70c0.png">

見て分かるように、ブロックされているようです。
このままインストーラーに限って許可することもできますが、[約１時間のみ使用できる仕様になっていて](https://support.apple.com/ja-jp/guide/mac-help/mh40616/mac)、毎回システム環境設定を開くのは面倒でもあります。
ターミナルからコマンドを発行することで、32ビットのみ対応のアプリケーションに対して半永続的に許可を与えることもできます。

```shell:terminal
sudo spctl --master-disable
```

そうすることで、すべての32ビットアプリケーションに対して実行を許可することができます。
<img width="500" alt="スクリーンショット 2019-08-21 15.27.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92661/a812438a-8c69-5dc1-5439-bbe69e71bde4.png">

なお、

```shell:terminal
sudo spctl --master-enable
```

とすることで、元に戻せます。

その場しのぎで対応しましたが、どのみちAppleが32ビットの切り捨てを決断した以上、正しいアプローチとしては「64ビットに対応する」ことであることに変わりはありません。

正式公開は例年で言えば10月前後といったところでしょうか、Sidecarは本当に強いので、是非Adobeには完全な64ビット対応を済ませて欲しいところです・・・

## 出典・引用
開発元が未確認の Mac アプリケーションを開く： https://support.apple.com/ja-jp/guide/mac-help/mh40616/mac

[解決] Appleは悪意のあるソフトウェアを探すことができないため、アプリを開くことができません]：https://ja.ihowto.tips/osx-apps-download-tutorials-tips-hacks-news/solve-app-cant-be-opened-because-apple-cannot-check-it-for-malicious-software.html
エラー画像も↑より引用
Fluxアーキテクチャのメモ

この記事は`Swift`ベースで話を進めています。
iOSを普段書いている方には記事を呼んで頂きたいですが、
それ以外が主戦場の方は別の記事でFluxについての理解を深めることを推奨します。

# Fluxとは
Facebookが作成したアーキテクチャパターンでJSの文化から輸入してきた物です。
(そもそもClientの設計パターンはほとんどJSの文化で生まれた物ばかりです)

下の画像からわかることとして
**`Action`** -> **`Dispatcher`** -> **`Store`** -> **`View`**のフローがあって、
その後、
**`View`** -> **`Action`** -> **`Dispatcher`**のフローが存在します。
これによって一つのライフサイクルが作成されていることがわかります。
![flux-pattern.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176180/4ca341c2-a6a0-4a27-8da5-9b11e9379fb7.png)

Fluxの設計パターンの最大の特徴はこの**`Action`** -> **`Dispatcher`** -> **`Store`** -> **`View`**の単一方法のデータの受け渡しが行われていることにあります。逆に言えばこのパターンが逸脱したいと思った時はFluxを採用することをやめるべきとも言えます。(そのときはMVC,MVVM,Redux等を利用することを検討することになると思います)

## 他の設計パターンと比較する
すべてのアーキテクチャとの比較をすることは~~めんどくさい~~ 時間がかかってしまうので今回はいくつかある設計パターンのうち、その中でも似ている**MVVM(Model,View,ViewModel)**と比較することにしましょう。
<img width="773" alt="スクリーンショット 2019-08-21 14.27.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176180/44a57b13-d2c5-d387-c8ad-d491aeae7f7e.png">
このとき、最大の違いは**`ViewModel`**を**`Dispatcher/Store`**に書き換えてみるとわかります。
<img width="816" alt="スクリーンショット 2019-08-21 14.32.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176180/4cf11ad7-3e10-4853-139b-7dfa459e5cee.png">
図をみてわかる通り、**Flux**と**MVVM**の最大の違いは

**`View`**が一つ前の層である**`ViewModel`**をみることで変更をみることができるのが**MVVM**
**`View`**がみることができるのは2つ前の**`Dispatcher`**(StoreとActionの中継役)をみるのが**Flux**

です。なので**Flux**では値をもらう**`Store`**が中で何をしているのか全く知らない状態になるという意味です。これは**MVVMに比べてFluxの方が制約が厳しいという意味に直結**します。

# 各役割の説明
なんとなく雰囲気でわかったものの、各役職がどんなことを実際に説明していなかったので説明します。

- **`Action`**
最終的に`View`に渡したい`data`を保持している場所。

- **`Dispatcher`**
`Action`と`Store`の中継場所。
Viewで入力された値とかはここが受け取ることで再度`Store`に渡して
`View`に反映したりする。

- **`Store`**
値の状態を管理する場所。

- **`View`**
`UIViewController`や`UIView`がこれにあたる。`UIViewController`の場合、`ViewController`としてではなく、なるべく`Controller`としての役割を剥いで、`View`として利用する。


# メリット・デメリット
**メリット**
- 単一方向であることを制約に掲げているのでデータフローが役割ごとに分けられることで理解しやすくなる。
- MVCの設計よりも`UIViewController`から状態管理のためのコードが減って`ViewController`としてではなく、Viewとしての役割に近い状態になる

**デメリット**
- そもそもFluxを採用するほどの規模のアプリは少ない。（小中規模でこれほどの制約は返って開発コストが高くつきそう）

今回はこれで以上です。サンプルコードを追加した上での説明は今回は省きます（追加する予定はあります）
【Angular】カスタムパイプでドロップダウン項目を連動させる

# 実現したいこと


- 特定のリストの範囲を選択するのに、開始と終了のドロップダウンを使いたい
- 開始が選択されたら、終了のドロップダウンには**選択された開始以降の項目のみ*
*を表示したい
- 同様に、終了が選択されたら、開始のドロップダウンには**選択された終了以前の項目のみ**を表示したい

### 曜日リストの例

初期状態
<img width="192" alt="PIPE_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187787/0221d5ab-614c-63d1-a1b8-f5658982b846.png">
<img width="186" alt="PIPE_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187787/7440badd-2a56-b724-efaa-9ec16f0b6100.png">

開始に【水】を選択した場合、終了には【水、木、金、土】のみ表示される
<img width="196" alt="PIPE_03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187787/17f36951-69b3-3535-5765-2c1b751cda63.png">
終了に【金】を選択した場合、開始には【日、月、火、水、木、金】のみ表示される
<img width="183" alt="PIPE_04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187787/3e96d1f3-83fd-10fa-99c1-f3e06b48be65.png">

# 環境

### node.js

```bash
root@user:/app/my-app# node --version
v12.7.0
```

### Angular

```json:package.json
"dependencies": {
    "@angular/animations": "~8.0.0",
    "@angular/common": "~8.0.0",
    "@angular/compiler": "~8.0.0",
    "@angular/core": "~8.0.0",
    "@angular/forms": "~8.0.0",
    "@angular/platform-browser": "~8.0.0",
    "@angular/platform-browser-dynamic": "~8.0.0",
    "@angular/router": "~8.0.0"
}
```

# ソースコード

### コンポーネント

```ts:app.component.ts
import { Component, OnInit, Pipe, PipeTransform } from '@angular/core';

@Component({
  selector: 'app-dropdown',
  templateUrl: './dropdown.component.html',
  styleUrls: ['./dropdown.component.css']
})
export class DropdownComponent implements OnInit {
  days = ['日', '月', '火', '水', '木', '金', '土'];
  startDay: string;
  endDay: string;

  constructor() {}

  ngOnInit() {
    // 初期値の設定
    this.startDay = this.days[0];
    this.endDay = this.days[this.days.length - 1];
  }
}
```

### カスタムパイプ

```ts:dayfilter.pipe.ts
@Pipe({ name: 'dayFilter' })
export class DayFilterPipe implements PipeTransform {
  transform(days: string[], startDay?: string, endDay?: string) {
    if (startDay) {
      const index = days.findIndex(day => day === startDay);
      return days.slice(index);
    }
    if (endDay) {
      const index = days.findIndex(day => day === endDay);
      return days.slice(0, index + 1);
    }
    return days;
  }
}
```

### テンプレート

*ngForにカスタムパイプを設定する。

```html:app.component.html
<div>
  <label>開始</label>
  <select [(ngModel)]="startDay">
    <option
      [ngValue]="day"
      *ngFor="let day of days | dayFilter: undefined:endDay"
      >{{ day }}</option
    >
  </select>
  <label>終了</label>
  <select [(ngModel)]="endDay">
    <option
      [ngValue]="day"
      *ngFor="let day of days | dayFilter: startDay:undefined"
      >{{ day }}</option
    >
  </select>
</div>
```

### モジュール

カスタムパイプをdeclarationsに追加する。

```ts:app.module.ts
import { DayFilterPipe } from './dayfilter.pipe';

@NgModule({
  declarations: [
    // other imports ...
    DayFilterPipe
  ]
export class AppModule {}
```

# 最後に

パイプは開始用と終了用で分けたほうがいいかも。

# 参考

- [Pipes](https://angular.io/guide/pipes)
【Laravel】任意のSeedを単体実行する。

メモとして残します。
最近物忘れがひどい。


#■やり方
###全て
`database\seeds\DatabaseSeeder.php`に記載した全てのシーダーを実行。

```
php artisan db:seed
```

###単体
`--class=作成したシーダークラス名`(classオプションで実行するシーダーを指定する)

```
php artisan db:seed --class=作成したシーダークラス名
```
Laravel MixでbrowserSyncをPHPビルトインサーバーで使うときの注意点

# 背景
[以前の記事](https://qiita.com/ProjectEuropa/items/901f22b941c1b272d59c)でbrowserSyncを有効化したものの、PHPビルトインサーバーでは全然動かない場合があったので、備忘録として。

## 発生した問題

`webpack.mix.js` で以下の通りに設定し、

```js
//webpack.mix.js

mix.browserSync({
	files: [
		"public/**/*.*"
	],
	proxy: 'http://localhost:8000'
});
```

```
$ php -S localhost:8000
```

を実行しても、画面が表示されない。

## 対応

PHPビルトインサーバーを以下の通りに起動すること。

```
$ php -S 0.0.0.0:8000
```

## 参考

[ビルトインウェブサーバー(PHP公式ドキュメント)](https://www.php.net/manual/ja/features.commandline.webserver.php)
ABC138参戦記(A問題~C問題)

先日行われたABC138に参加したのでコンテスト中のあれこれをメモしておこうかと思います。使用言語はpython3、結果はABC3完で2403位(順位表情報)でした。コンテストへのリンクはこちら→https://atcoder.jp/contests/abc138

#A - Red or Not
$a$が3200以上か未満かで場合分けして"red"を出力するか$s$を出力するか決めれば良さそうです。提出コードはこちら。

```python:ABC138_A.py
a = int(input())
s = str(input())
if a < 3200:
    print("red")
else:
    print(s)
```

#B - Resistors in Parallel
$A_1, A_2, ..., A_N$の逆数を順に足していき、最後にその逆数を出力すれば良さそうです。提出コードはこちら。

``` python:ABC138_B.py
N = int(input())
A = list(map(int, input().split()))
ans = 0
for i in range(N):
    ans += 1/A[i]
print(1/ans)
```

#C - Alchemist
サンプルなどを見てみると、小さい方から順に合成していくとあまり小さくならなそうな感じがするので、そのような実装をしました。ちゃんと証明した方がいいのかなとは思いましたがサンプルが全て通ったので提出してみたらACしました

```python:ABC138_C.py
N = int(input())
v = list(map(int, input().split()))
v.sort()
tmp = (v[0] + v[1]) / 2
for i in range(2,N):
    tmp = (tmp + v[i]) / 2
print(tmp)
```

#D - Ki
本番中通すことができませんでした...
keyが根、valueがkeyを根とする頂点であるような辞書を作ってそこに含まれる全ての頂点のカウンターにいっぺんに$x$を足していくみたいなことをやったのですが当然のようにTLEしました...

```python:ABC138_D.py
from collections import defaultdict
from collections import deque
import sys
sys.setrecursionlimit(700000)

def setD(d, N):
    for i in range(N):
        d[i] = setsub(d, i)
            
def setsub(d, i):
    tmp = deque()
    for x in d[i]:
        tmp.append(x)
        if d[x] != 0:
            tmp += setsub(d, x)
    return tmp

N, Q = map(int, input().split())
d = defaultdict(deque)

for i in range(N-1):
    a, b = map(int, input().split())
    a -= 1
    b -= 1
    d[a].append(b)

setD(d, N)

ans = [0 for i in range(N)]

for i in range(Q):
    p, x = map(int, input().split())
    p -= 1
    ans[p] += x
    for i in d[p]:
        ans[i] += x


for i in range(N):
    ans[i] = str(ans[i])
print(" ".join(ans))
```

コンテスト後に[解説動画](https://youtu.be/lWETOlGiuaI)やACされてるコードなどをみて累積和のようなことをすればいいということを理解し、一応通せたのですがコンテスト後にテストケースが追加されてるのでもう一度復習してみたいところです。

#反省
今回はC問題まで通すことができました。時間配分は大体A-2分、B-3分、C-6分半という感じでした。とにかくDが通せなかったのは痛いですね...要復習です...
Autodesk Inventor API Hacking (自作Control開発の注意点)

# 0. はじめに
自作のWinFormsなControlを使おうとして、ハマることがあるよ、という記事です。
具体的なトラブルとして、VisualStudioのDesignerで自作Controlを配置できなくなる現象に遭遇することがあります。
そもそも、どういった場面で自作Controlを作る必要に迫られるかというと、例えば、[以前の記事](https://qiita.com/yamarah/items/f653e93d940917a2641d)で書いたとおり、Dockable Windowで`Enter`, `ESC`キー入力を受け取るには、標準のControlを継承して自作Controlを作る必要があります。

# 1. 失敗 その1
これは有名ですが、自作Controlは[対象プラットフォームがx64だとDesignerで表示されません](https://social.msdn.microsoft.com/Forums/ja-JP/7760b7d4-f64a-4d89-a4fd-b581f1b8cd86/x64?forum=vbgeneralja)。
なぜならば、VisualStudio自体は`x86`アプリケーションなので、`x64`向けにCompileされたAssemblyをloadできないからです。
回避するには、対象プラットフォームを一時的に`x64`から`AnyCPU`に変更します。
Debugだけ`AnyCPU`にして、Releaseは`x64`のままでも良いかもしれませんね。

`AnyCPU`でrebuildしてもDesigner画面のエラーが解消されなければ、Project内のbin, obj directoryを削除するとか、VisualStudioを再起動するとか、試してみてください。

# 2. 失敗 その2
Assemblyに対してsignしていると、Designerで読み込まないことがあるようです。
私の場合は、`AssemblyInfo.cs`で遅延署名の指定をし、`プロジェクト` → `プロパティ` → `ビルドイベント` → `ビルド後イベントのコマンドライン`にて、`sn.exe`で署名しています。
`AnyCPU`でrebuildしてもダメな場合は、一時的に署名の設定を解除してみてください。

# 99. 親の記事に戻る
[Autodesk Inventor API Hacking (概略)](https://qiita.com/yamarah/items/cee08eb8f2b7aecbda83)
BuildGradleのバージョン弄ってたらいきなりビルドエラー出てハマった時の解決法

# はじめに
buildGradleのバージョンを弄ってたらいきなり↓のようなエラーが出てきた。

```
Using multiple versions of the Android Gradle plugin in the same build is not allowed.
	'/Users/kkiuchi/AndroidProjects/MyApplication4/buildSrc/build/tmp/generatePrecompiledScriptPluginAccessors/project-6954724595293254166/schema' is using version 3.2.1
	'/Users/kkiuchi/AndroidProjects/MyApplication4/app' is using version 3.4.2
	'/Users/kkiuchi/AndroidProjects/MyApplication4/buildSrc/build/tmp/generatePrecompiledScriptPluginAccessors/project-6780808919255840816/schema' is using version 3.4.2
	'/Users/kkiuchi/AndroidProjects/MyApplication4/buildSrc/build/tmp/generatePrecompiledScriptPluginAccessors/project-6361896579835588265/schema' is using version 3.4.2
	'/Users/kkiuchi/AndroidProjects/MyApplication4/buildSrc/build/tmp/generatePrecompiledScriptPluginAccessors/project-6780808919255840816/schema' is using version 3.4.2
	'/Users/kkiuchi/AndroidProjects/MyApplication4/app' is using version 3.4.2
	'/Users/kkiuchi/AndroidProjects/MyApplication4/app' is using version 3.4.2
	'/Users/kkiuchi/AndroidProjects/MyApplication4/buildSrc/build/tmp/generatePrecompiledScriptPluginAccessors/project-6361896579835588265/schema' is using version 3.4.2
	'/Users/kkiuchi/AndroidProjects/MyApplication4/app' is using version 3.4.2
	'/Users/kkiuchi/AndroidProjects/MyApplication4/app' is using version 3.4.2
	'/Users/kkiuchi/AndroidProjects/MyApplication4/app' is using version 3.4.2
	'/Users/kkiuchi/AndroidProjects/MyApplication4/app' is using version 3.4.2
	'/Users/kkiuchi/AndroidProjects/MyApplication4/buildSrc/build/tmp/generatePrecompiledScriptPluginAccessors/project-6954724595293254166/schema' is using version 3.2.1
	'/Users/kkiuchi/AndroidProjects/MyApplication4/app' is using version 3.4.2
	'/Users/kkiuchi/AndroidProjects/MyApplication4/app' is using version 3.4.2
	'/Users/kkiuchi/AndroidProjects/MyApplication5/app' is using version 3.4.2
```

怒られている内容はそのまんまで、gradle pluginのバージョン違いはだめだよーとのこと。
あぁ、キャッシュかなーと思って消しても直らず。該当パスを見ても既に存在していないパスを見てたり、全く関係ないプロジェクトのパスを参照してたりとよくわからない状況。

# 解決法
PC再起動したら治った

# 詳細
build.gradleからbuild.gradle.ktsへ変換するため、異なるブランチでバージョン上げてみたり、お試し用のプロジェクト作って実験してた時に発生。
怒られている原因はbuild.gradleのバージョン違うよっていう単純な話なんだけど既に消えてるプロジェクトで怒られてたり、全く依存関係のないプロジェクトで怒られてたりと意味わからん状態だった。

## 試行錯誤の後
- 参照していると思しきプロジェクトを削除→変わらず
- `~/.gradle/caches`を削除→変わらず
- Android Studioを再起動→変わらず
- Android StudioのInvalidate and Restartを実施→変わらず

# 終わりに
何が本当の原因で起きているのかがさっぱりわからないので情報ある人教えて欲しいです。。。
あと、多分PC再起動以外にも簡単な方法がありそうだけど見つけられなかった・・・。
配列の繰り返し処理でのエラー

```
lines=[r1,r2,r3,r4,r5]
g1=r2-r1  #lines[1]-lines[0]
g2=r3-r2  #lines[2]-lines[1]
g3=r4-r3  #lines[3]-lines[2]
g4=r5-r4  #lines[4]-lines[3]

puts g1
puts g2
puts g3
puts g4
```
という処理があり

なんとか簡略化出来ないか試行錯誤し

```
days = [] #空の配列
  n=0  
  while n<lines.length               #配列の要素の数だけ繰り返し
  days << lines[n+1]-lines[n]        #新しく作りたい配列の要素
  n+=1
  end

  days.each do|n|
  puts n
  end
```

としたがエラーが出てしまった。

```
undefined method `-' for nil:NilClass (NoMethodError)
```

teratailで質問をしたところ
配列の要素`n<lines.length`が最大値４であり
最大値４の時`days << lines[n+1]-lines[n]`が`lines[5]`という存在しない
`nil`になっており`nil`には演算子が使えないのでエラーが出るということでした。。。

なので条件を`n<lines.length-1`とすればエラーなく実行できます。

合わせて他の方から`each_cons`というメソッドを教えていただいてこれを使うと

```
days = lines.each_cons(2).map{ |a, b| b - a }
days.each do |n|
puts n
end
```
と短く実装できます。
とても便利なものを教えていただいて感謝です。

[each_consの使い方](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/each_cons.html)
AtomでのRuby入力補完にrobeを使う

# 概要
autocomplete-rubyがいいぞということでインストールを試みたものの
- ruby2.4以降だとrsenseのサーバが起動せず利用できない
- rsenseの開発が停止して数年経過している
- 代替案としてsolargraphがあったがこちらも動作せず
というわけで他に何かないか探していたところ「robe」が出てきました。

Atomのパッケージ「robe」は現在のところ候補をリストで表示するのみのようです。
宣言へのJumpやドキュメントへのリンクなどの機能はありません。

AtomでRubyの入力補完するのにおすすめのパッケージあれば教えてください。。。

# 環境
OS：MacOS Mojave
Ruby：2.6.x
　　　anyenv下のrbenvでインストール


# robeとは
- 開発が継続中（直近2019/5に更新あり）
- Ruby1.9.3-2.6まで対応している。
- emacsでよく使われている
[Git](https://github.com/dgutov/robe)

# インストール
- robeをダウンロード

```
git clone https://github.com/dgutov/robe /任意のディレクトリ/robe
```

- Atomにパッケージ「 autocomplete-robe」をインストール

- settingにてrobeを設置したパスを設定
/任意のディレクトリ/robe

- gemのpryをbunlerでインストール
Gemfileに`gem 'pry'`を記載して`bundle update`を実行
`gem install pry`では動作しませんでした。

[公式](https://atom.io/packages/robe)に以下の記載がありました
>Please note that robe server requires pry to be installed (with bundler).




# 雑記
<font color="red">以下は、調査の過程でわかった内容です。rsenseの問題が解消するわけではないので、興味のある方だけお読みください</font>

### autocomplete-rubyが動作しない
rsenseのサーバが起動しないことが全ての原因。
補完機能が動作する仕組みとしては、rsenseがローカルでサーバを起動していてそれを利用してAtomのautocomplete-rubyが動作するようになっているために、動作しませんでした。
また、rsenseへのパスが設定できキックができていると、エラー自体はログファイルに書き込まれるために、表面上はエラーを表示しないので気付きにくかったが、そこはAtomのコンソール（Ctrl+Cmd+I）の内容を確認すると気づけます。

## Ruby2.6.1のBundlerの不具合
/tmp/rsense.logに下記の内容が記載されていたため調査

```
Bundler 2 requires Ruby 2.3 or later. Either install bundler 1 or update to a supported Ruby version.
```
以下のサイトで説明がされていますが、Ruby2.6.1ではBundlerのバージョンが正しく起動しないという不具合がありました。
[Ruby 2.6.1 の Bundler の不具合のお知らせ](https://www.hsbt.org/diary/20190205.html#p02)
[Ruby 2.6.1 に含まれる Bundler 1.17.2 に不具合があるという話](https://qiita.com/koshigoe/items/7527bd7f65c2ee33bd85)

これだ！
ということでRubyのバージョンを2.6.2と2.6.3でためしましたが、不具合自体は解消されたもののエラーそのものは改善されませんでした。。。

## どうしてもrsenseがいいという場合には
Rubyのバージョンを2.3.8にすれば動作することは確認できました。
【WordPress】年別の記事の出し分けとページネーション 

Advanced custom fieldを使用

```releases.php
<div class="releases_list">
		<?php
		$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
		$query = new WP_Query(array(
			'posts_per_page' => 4,
			'post_type' => 'releases',
			'orderby' => 'date',
			'paged' => $paged
		)); ?>
		<?php $prev_year = null; ?>
		<?php if ($query -> have_posts()): ?><?php while ($query -> have_posts()) : $query -> the_post(); ?> 
			<?php $this_year = get_the_date('Y'); ?>
			<?php if ($prev_year != $this_year):  ?>
					<div class="releases_list_year"><p><?php echo $this_year; ?></p></div>
			<?php endif; ?>
			<ul class="releases_list_news">
				<li class="releases_list_news_list">
					<dl class="releases_list_news_dl">
						<dt class="releases_list_news_ttl"><p><?php the_time('Y-n-j'); ?></p></dt>
						<dd class="releases_list_news_read">
							<a><?php the_field('news'); ?></a>
						</dd>
					</dl>
				</li>
			</ul>
		<?php $prev_year = $this_year; ?>
		<?php endwhile; ?><?php endif; ?>
	</div>		
	<div class="pagi">
		<?php custom_pagination('/releases/', $paged, $query->max_num_pages); ?>
	</div>	
```
参考サイト:
https://stackoverflow.com/questions/3397725/wordpress-how-can-i-display-post-link-group-by-year

```functions.php
function custom_pagination($uri, $current, $last, $range = 5){
    $showitems = ($range * 2)+1;
    if(preg_match('/\\?/', $uri)){
        $uri .= '&';
    } else {
        $uri .= '?';
    }
    if(1 !== (int)$last){
        $prev = $current-1;
        $next = $current+1;
        $currentPage = false;
        $beforePage = false;
        $afterNum = 0;
        $path = get_template_directory_uri();
        echo "<div class='page_nsv'>";
        // echo  "<p class=\"prev prne nav_list\"><a href=\"{$uri}paged={$prev}\">&lt;</a></p>";
		echo  "<ul class=\"nav_list nav_con_list dot_left dot_right\">";
        for ($i=1; $i <= $last; $i++){
            if($i === 1 && $current !== 1){
                 echo "<p class=\"prev prne nav_list\"><a href=\"{$uri}paged={$prev}\">&lt;</a></p>";
            }
            if($current === $i){
                echo "<li class=\"nav_con_list_li\"><a href=\"#\" onclick=\"return false;\" class=\"page-link\">{$current}</a></li>";
            } else {
                echo "<li class=\"nav_con_list_li\"><a href=\"{$uri}paged={$i}\" class=\"page-link\">{$i}</a></li>";
            }
            if($i == $last && $current != $last){
                 echo "<li class=\"nav_con_list_li\"><a class=\"page-link\" href=\"{$uri}paged={$next}\"></a></li><p class=\"next prne nav_list\"></p>";
                 echo "<p class=\"next prne nav_list\"><a href=\"{$uri}paged={$next}\">&gt;</a></p>";
            }
        }
        echo "</ul>";
        echo "<p class=\"next prne nav_list\"></p>";
        echo "</div>";  
    }
}
```
functions.phpでページネーションを設定

![スクリーンショット 2019-08-21 14.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310140/133035db-bf8a-84be-3912-ad73721ee4c7.png)
投稿すると画像のようになります
java Scannerループ入力

###この記事の目的
　いつも忘れるので自分用メモ

###内容
　JavaでScannerで入力させて、希望の数値、文字列以外が入力されるまで入力ループしたい。例外処理は考えないでとりあえず処理だけのメモ。

###コード

```rupe.java
Scanner scan = new Scanner(System.in);
while(true){
  int num = scan.nextInt();
  switch(num){
    case // 入力してほしい数値:
      // 処理内容
      break;
    default:
      continue;
  }
  break;
}
```
Google Edge TPUとは何ですか？

####Edge TPUとは何ですか？

Edge TPUは、低電力デバイス向けの高性能ML推論を提供するGoogleが設計した小さなASICです。 たとえば、MobileNet V2などの最先端のモバイルビジョンモデルを400 FPSで電力効率の高い方法で実行できます。
![1_Jryu97esXxkonWBj4t62fw.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/7f934447-c220-5594-cbf1-b4fca57e2685.jpeg)


Edge TPUビルトインを含む複数の製品を提供しています。

#### Edge TPUはどの機械学習フレームワークをサポートしていますか？

TensorFlow Liteのみ。

Edge TPUはどのタイプのニューラルネットワークをサポートしていますか？

第一世代のEdge TPUは、畳み込みニューラルネットワーク（CNN）などのディープフィードフォワードニューラルネットワーク（DFF）を実行できるため、さまざまな視覚ベースのMLアプリケーションに最適です。

サポートされているモデルアーキテクチャの詳細については、モデルの要件を参照してください。

#### Edge TPUのTensorFlow Liteモデルを作成するにはどうすればよいですか？

モデルをTensorFlow Liteに変換する必要があり、量子化に対応したトレーニング（推奨）またはトレーニング後の完全整数量子化のいずれかを使用して量子化する必要があります。 次に、Edge TPUとの互換性のためにモデルをコンパイルする必要があります。 詳細については、Edge TPUのTensorFlowモデルをご覧ください。

ただし、画像分類アプリケーションを構築している場合は、Cloud AutoML Visionを使用して、Edge TPUと互換性のあるモデルを簡単に構築することもできます。 このWebベースのツールは、独自の画像を使用してモデルをトレーニングし、モデルを最適化してからEdge TPUにエクスポートするためのグラフィカルUIを提供します。

#### Edge TPUの処理能力はどのくらいですか？

Edge TPUは、1秒あたり4兆回の操作（テラ操作）（TOPS）を実行でき、各TOPSに0.5ワット（1ワットあたり2 TOPS）を使用します。

#### 実際にどのようなパフォーマンスを提供しますか？

こちらのベンチマークをご覧ください。（https://coral.withgoogle.com/docs/edgetpu/benchmarks）

#### Edge TPUは加速MLトレーニングを実行できますか？

はい、ただし最終層のみを再トレーニングします。 TensorFlowモデルはEdge TPUで高速化するためにコンパイルする必要があるため、後ですべてのレイヤーの重みを更新することはできません。 ただし、2つの異なる方法で高速転送学習を実行するAPIを提供しています。

クロスエントロピー損失関数を使用して、最終的に完全に接続されたレイヤーだけの重みを更新する逆伝播。
新しいデータからの画像埋め込みを使用して最終層に新しい活性化ベクトルを刷り込む重み刷り込み。これにより、非常に小さな小さなデータセットで新しい分類を学習できます。

#### Dev BoardとUSB Acceleratorの違いは何ですか？

Coral Dev Boardは、SOMに統合されたSOCとEdge TPUを含むシングルボードコンピューターであるため、完全なシステムです。 SOMを削除（または個別に購入）し、3つのボード間コネクタを介して他のハードウェアと統合することもできます。このシナリオでも、SOMにはSOCとEdge TPUを備えた完全なシステムとすべてのシステムインターフェイスが含まれます（ I2C、MIPI-CSI / DSI、SPIなど）は、基板間コネクタの300ピンを介してアクセスできます。

一方、Coral USB Acceleratorは、既存のシステムにコプロセッサーとしてEdge TPUを追加するアクセサリーデバイスです。USBケーブルを使用してLinuxベースのシステムに接続するだけです（最高のパフォーマンスを得るにはUSB 3.0をお勧めします）。

#### Edge TPUチップだけを購入できますか？

いいえ、現在、スタンドアロンのEdge TPU ASICは提供していませんが、USB 3.0またはPCI-Eインターフェイスのいずれかを使用して、既存のハードウェアシステムのコプロセッサーとしてEdge TPUを簡単に統合できる2つの製品を提供しています。

しかし、あなたはここからサンゴ装置を購入することができます：https://store.gravitylink.com/global
![微信截图_20190520145825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/e11d78be-d1a3-8b33-ad48-428260a217e3.png)

![微信截图_20190520145835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/956823f1-2575-d0d4-88e1-e54da30d79af.png)
2019.0821(wed)

<div>
　<h2>HTMLとcssの勉強用ブログです。</h2>
<p>「言わずもがな」からよくわかっていないので、一つ一つアウトプットしていくしかないです。</p>
<p>pとpの空きはこれくらい。h2にすると勝手に罫線が引かれる。</p>
・文章がかけない<br>・pがないとこうなる<br>
</div>

毎日短く更新。
【C#】RSSフィードを読み込む

備忘録。
RSSフィードを読み込む。

```D01tsumaTask2.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Xml.Linq;

namespace D01tsumathTask2
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = @"http://d01tsumath.hatenablog.com/rss";
            Console.WriteLine("ブログRSS取得します！");

            try
            {
                // RSS読み込み
                XElement element = XElement.Load(url);

                // channelの取得
                XElement channelElement = element.Element("channel");

                //itemの取得
                IEnumerable<XElement> elementItems = channelElement.Elements("item");

                for (int i = 0; i < 5; i++)
                {
                    XElement item = elementItems.ElementAt(i);
                    Console.WriteLine($" タイトル : <a href='{item.Element("link").Value}'>{item.Element("title").Value}</a>");
                }

                Console.WriteLine("完了");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

```