OmniAICreator/Qiita-1.07M huggingface dataset:
もう少しスマートにやる方法はないものか

idが詰まったsliceがある。(本当はidだけではないが話を簡単にするためにidのみとする)
そのsliceの要素1個1個に「なにかしらの処理」を加えつつ、処理結果を「1つのsliceに詰める」
これをx並列で行う。(とりあえずxの数は4とする)

処理中に起きてほしくないことが起きたときは、

1.最初に起きたエラーの内容を取る
2.すべての処理を即座に止める

2を完全に満たすのはこの要件である限り無理では…？と思いはしたので「ある程度はしょうがない」ものとした。してしまった。くるしい。

```go
package main

import (
	"errors"
	"fmt"
	"math/rand"
	"strconv"
	"sync"
	"time"
)

var ids = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}

func main() {
	rand.Seed(time.Now().UnixNano())
	var wg sync.WaitGroup
	var once sync.Once
	// 並列数制御用
	c := make(chan bool, 4)
	// 失敗検知用
	failC := make(chan struct{})
	// 外部に伝えたい気持ち
	ech := make(chan error, 1)
	mt := &sync.Mutex{}
	result := []string{}

	for _, id := range ids {
		wg.Add(1)
		select {
		case <-failC:
			fmt.Println("fail break")
			break
		default:
			// 渡してやらないとidの重複がでる場合がある...
			go func(id int) {
				c <- true
				fmt.Println("start id:" + strconv.Itoa(id))
				defer func() {
					<-c
					wg.Done()
				}()
				select {
				case <-failC:
					fmt.Println("fail goroutine")
					return
				default:
					r := rand.Intn(10)
					if r == 1 {
						once.Do(func() {
							fmt.Println("once id:" + strconv.Itoa(id))
							ech <- errors.New("ERROR!!")
							close(failC)
						})
						fmt.Println("rand hit id:" + strconv.Itoa(id))
						return
					}
					mt.Lock()
					result = append(result, "yes_"+strconv.Itoa(id))
					mt.Unlock()
				}

			}(id)
		}
	}
	wg.Wait()
	if len(ech) > 0 {
		err := <-ech
		fmt.Println(err.Error())
	}
	fmt.Println(result)
	fmt.Println("owari")
}
```

スマートさ云々の前に、一度も `fail break` が出力されなかった。
件数が少ないからなのか…？
流石にすべてのgoroutineを生成し終わるまでfuncの中身を処理しない、ってことはあるまい。
うーん。。
errgroupパッケージはgo funcにid渡せなかったんですよね。

```go
    eg.Go(func(id int) error {
		//しょり      
    }(id))
```

ってやったらid渡せなくて断念。
うーーーーーーん
docker-compose buildが通らなくて辛かった話

原因はよくわからないのだけどEC2で`docker-compose build`が通らなくなった


こんな感じ
```
[ec2-user]$ docker-compose build
db uses an image, skipping
Building web
ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
```


issueをみたらsudoを使えと書いてあったので使うと

```
[ec2-user]$ sudo docker-compose build
sudo: docker-compose: command not found
```

みつからないとと言われる

え？と思い他のコマンドを試すと普通に動く

```
[ec2-user]$ sudo docker up
............
```

原因はよくわからなかったが、docker-compose buildだけ通らない。

しょうがないので

```
$ which docker-compose
/usr/local/bin/docker-compose
```

でdocker-compose の場所を探して

```
$ sudo /usr/local/bin/docker-compose build
```

で直接指定したら動いた。
RaspberryPiでRS232C機器を制御した

配線が果てしなく面倒だったので、RS232Cの機器をラズパイで制御したいなーと。
Ethernetでラズパイを通してコマンドを送れれば新たに配線の必要ありませんし、どのPCからでもアクセスできたりといろいろと嬉しいことがあるかと思います。


#概要
ググったらいろいろと記事がありました。

Pythonとハードウェア　ー　PythonでRS232Cを利用する　－
https://qiita.com/nonbiri15/items/2211547da4dc9abcc321
Raspberry Pi でシリアル通信
https://hack-le.com/44765804-2/
などなどいろいろと参考にさせていただきました。ありがとうございます。

で、どうやらラズパイとRS232C機器の入出力方式には、
- GPIO (ラズパイの一般入出力インターフェイス) を用いる
- USB-RS232C変換チップを用いる
の二つのやり方があるようです。GPIOはちょっと面倒なので、後者にしました。

USB-RS232C変換チップはFTDI社FT232RLを用い、実際にはそれを実装した変換ケーブルを使います。
Windowsしかサポートされてませんが、Linuxであれば標準で認識してくれます。
このデバイスに向かってPythonのライブラリPySerialでコマンドを送るということにしました。

#用意したもの
Raspberry Pi 3
Python2.7 + PySerial
FT232 USB-シリアル変換ケーブル VE488 (FT232RLを利用するものならなんでもいいです)
http://akizukidenshi.com/catalog/g/gM-08343/

RS232C機器、外部制御用のPCなど。

#実装
ラズパイと変換ケーブルを繋ぐと、

```
/dev/ttyUSB0
```

このttyUSB0が変換チップで、ちゃんと認識されます。
変換ケーブルをさらにRS232C機器に接続して、その後ラズパイでttyUSB0に向かってコマンドを送ります。

``` serial.py
import serial    #    PySerial

dev = "/dev/ttyUSB0"    #    デバイス名
rate = 9600    #    レート (bps)
ser = serial.Serial(dev, rate, timeout=10)

string = "Hello World"
string = string + "\r\n"    #    ターミネーターを付ける
ser.write(string)    #    コマンド送信

res = ser.readline()    #    コマンド受信
res = res.encode()    #    エンコード
print res

```

こんな感じで。実行すればRS232C機器にコマンドが送られます。

pythonの文字型はpython2と3で違うようなので十分注意してください。
僕もよくわかってないのですが、とりあえず2の場合は上のような感じで送れば大丈夫かと思います。
後はsshでラズパイに接続して直接スクリプトを動かすなり、サーバーを立てるなりすればいいのではないでしょうか。

#まとめ
RS232C機器はちゃんと動いてくれました。これが万が一できなかったら30m以上の配線が必要だったのでハッピーです。IoTの息吹を感じる。
WordPressでカスタムページテンプレートを作成する

テーマは、ウェブサイト全体に適用される固定ページデザインテンプレートを提供することがよくあります。多くの場合、このテンプレートの変更はすべてのページに反映されます。しかし、異なるページに異なるデザインのウェブサイトを見るのが一般的です。

これは、WordPressページ用のカスタムページテンプレートを選択することで可能になります。このテンプレートを使用して、開発者はテーマに新しい機能を追加したり、既存の機能を拡張することができます。非常によく使用される2つのケースは、お問い合わせページへのGoogleマップスクリプトの追加と、ポートフォリオページのカスタムプレゼンテーションです。 WordPressのすべてのページレベルのテンプレートは、page.phpという名前のファイルによって処理されます

注：カスタムページテンプレートには、PHP、HTML、およびCSSに関する実務知識が必要です。このスキルセットがない場合は、WordPressの開発者に連絡することをお勧めします。

この記事では、カスタムページテンプレートを作成するプロセスの概要について説明します。このカスタムテンプレートにPagewithoutsidesideという名前を使用します。 [WordPress managed cloud hosting](https://www.cloudways.com/en/wordpress-cloud-hosting.php)の管理クラウドホスティングプロバイダを使用している場合は、テーマのフォルダ（/ wp-content / themes）に行き、pagewithoutsidebar.phpという名前のファイルを作成するだけです

この時点で、WordPress管理パネルの[ページ]セクションに移動した場合、このカスタムテンプレートを使用して新しいページを追加できます。 [ページ]> [新規追加]に移動し、右下のパネルにあるドロップダウンメニューからPagewithoutsidesideテンプレートを選択します。

[パブリッシュ]ボタンをクリックすると、新しいカスタムページがWebサイトに表示されます。ただし、カスタムテンプレートに書式設定やデザインの指示がないため、ページが空に見えることがあります。

[Custom page templates](https://www.cloudways.com/blog/creating-custom-page-template-in-wordpress/)ページテンプレートを使用すると、開発者はWordPress Webサイトの外観を大幅に変更したり、根本的に変更したりすることができます。多くの場合、これらのテンプレートは、ウェブサイト全体のデザインを変更して、特定のページのさまざまなデザインオプションに対応するのに適しています
GoでStructを動的に作る方法。

どのような使い道があるのかはさておき、`reflect`パッケージを使って動的に任意のFieldを持つStructを作ることができます。

```go
package main

import (
	"fmt"
	"reflect"
)

type StructBuilder struct {
	field []reflect.StructField
}

func NewStructBuilder() *StructBuilder {
	return &StructBuilder{}
}

func (b *StructBuilder) AddField(fname string, ftype reflect.Type) {
	b.field = append(
		b.field,
		reflect.StructField{
			Name: fname,
			Type: ftype,
		})
}

func (b *StructBuilder) Build() Struct {
	strct := reflect.StructOf(b.field)
	index := make(map[string]int)
	for i := 0; i < strct.NumField(); i++ {
		index[strct.Field(i).Name] = i
	}
	return Struct{strct, index}
}

type Struct struct {
	strct reflect.Type
	index map[string]int
}

func (s *Struct) NewInstance() *Instance {
	instance := reflect.New(s.strct).Elem()
	return &Instance{instance, s.index}
}

type Instance struct {
	internal reflect.Value
	index    map[string]int
}

func (i *Instance) Field(name string) reflect.Value {
	return i.internal.Field(i.index[name])
}

func (i *Instance) SetString(name, value string) {
	i.Field(name).SetString(value)
}

func (i *Instance) SetBool(name string, value bool) {
	i.Field(name).SetBool(value)
}

func (i *Instance) SetInt(name string, value int) {
	i.Field(name).SetInt(int64(value))
}

func (i *Instance) SetFloat(name string, value float64) {
	i.Field(name).SetFloat(value)
}

func (i *Instance) Value() interface{} {
	return i.internal.Interface()
}

func (i *Instance) Pointer() interface{} {
	return i.internal.Addr().Interface()
}

func main() {
	b := NewStructBuilder()
	b.AddField("Name", reflect.TypeOf("")) //型情報が欲しいだけなので、reflect.TypeOf()の入力値はなんでもいい。
	b.AddField("Age", reflect.TypeOf(123))
	person := b.Build()

	i := person.NewInstance()
	i.SetString("Name", "gopher")
	i.SetInt("Age", 8)

	fmt.Println(i.Value())   // -> {gopher 8}
	fmt.Println(i.Pointer()) // -> &{gopher 8}
}
```

1. `reflect.StructField{}`でFieldを定義する
2. `StructField`をSliceでまとめたものを`reflect.StructOf()`に渡すとStructが生成される
3. このStructを`reflect.New()`に渡すとインスタンスができる
4. `SetXXX`で値をつめて
5. `Interface()`か`Addr().Interface()`でおなじみの形式に変換


ORMなどのリフレクション前提のライブラリで使い道がある...かも

## 参考
1. [reflect - The Go Programming Language](https://pkg.go.dev/reflect)
1. [The Go Playground](https://go.dev/play/p/1jdl06jsXs)
Analytics Hackathon

# Analytics Hackathon<br>

## 概要

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

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

【こんな人にぜひ！】

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

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

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

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

* 回帰：ロジスティック回帰、SVMなど
* ツリー：決定木、ランダムフォレストなど
* ニューラルネットワーク：CNN、RNN、自己組織化マップ（SOM)など
* ベイズ：単純ベイズ（ナイーブベイズ)など
* 時系列：AR,MA,(S)ARIMAモデルなど
* クラスタリング：k近傍法(KNN)、階層型クラスタリング、非階層型クラスタリング（K-Means）、トピックモデル）など
* アンサンブル学習 ： ブースティング、バギングなど
* その他：アソシエーション分析、協調フィルタリング（アイテムベース、ユーザベース）など

## 審査員

![藤川 琢哉](https://app-public.ds.jp-east.idcfcloud.com/images/event/1066/39003bb2662fa1e726f1053817d2d9eb4fd67c54.jpg)
#### 藤川 琢哉
PwCコンサルティング合同会社
テクノロジーコンサルティング
データアナリティクス
ディレクター 

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




![小川 祐樹](https://app-public.ds.jp-east.idcfcloud.com/images/event/1066/1d1795ba96ae0ba1ed2f5633a0266e545207d575.png)
#### 小川 祐樹
PwCコンサルティング合同会社
テクノロジーコンサルティング
データアナリティクス
マネージャー

市場調査会社、データ分析ベンダーを経て現職。
市場調査会社にて、店頭購買行動の統計解析に携わった後、データサイエンティストとして、マーケティング領域を中心に様々なデータ・課題に係る分析の設計・エンジニアリングを多数手掛ける。PwCでは、大手航空会社におけるデータベースマーケティングの分析企画や、大手金融機関における業務効率化のためのAI・ロボティクス導入の立ち上げに関わる。

----------


## 概要

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

## 持ち物

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


## ハッシュタグ

**#PwCsAnalyticsHK**

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

## 選考のフロー

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

マイページ作成（プレエントリー）
URLはこちら 
https://goo.gl/s8mCCg 
↓ 
エントリー 
↓ 
エントリーシート提出 
↓ 
Web適性試験（12月29日　 23:59 締切) 
↓ 
ハッカソン参加！

## ご注意

このイベントは、現時点で大学・大学院に在籍し、2019年3月卒業/修了見込みかつ2019年4月/10月入社が可能な方を対象としたイベントです。
PowerShellによるAPI通信を60秒で実装する

# Workflow
1.`api.ps1（任意のファイル名）`を作成
2.`api.ps1`をSampleに従って記述
3.`api.ps1`をダブルクリックして通信完了

# Sample

```api.ps1
# APIを実行
Invoke-RestMethod -Uri "実行するAPIのURL" -Method リクエスト方法 -Body @{パラメータの変数名="パラメータの値"}
```

# Commentary

<font color="Crimson">1. 実行するAPIのURL</font>
APIを用意してくれているURLを入力します。
郵便番号から住所を割り出すAPIは、一般的に簡単なのでテストに丁度良いです。

<font color="Crimson">2. リクエスト方法</font>
大体POSTかGETです。

<font color="Crimson">3. @{パラメータの変数名="パラメータの値"}</font>
よくあるパラメータです。
郵便番号とかだと`@{zipcode="123-4567"}`みたいな感じで書きます。

# Reference

[Windowsにcurlが無い？いいえ、Invoke-RestMethodがあります。GrailsアプリへのPOSTリクエストを試す](https://qiita.com/_y_u_/items/94dd8ad6fcc8d278f433)
[PowerShell > Link > PSのバージョンを確認する > $PSVersionTable < Invoke-RestMethod と ConvertTo-Json が見つからないエラー](https://qiita.com/7of9/items/64628a21eb171e753787)
[Web APIを利用する](http://winscript.jp/powershell/306)
【AWS】S3の特定のディレクトリ配下の容量を確認する方法

バケットであれば、CloudWatchのメトリクスから確認できるのですが、
バケット内のディレクトリ単位（厳密にはディレクトリという概念ではない）ではCWでは見れません。
（自作すればCWからも見れるようになるだろうけど）

じゃあどうするかというとaws s3 コマンドにとあるオプションを追加することで取得できます。

`aws s3 ls s3://バケット名/ディレクトリ名/ --summarize --recursive --human-readable`

という形で確認できます。

これの注意点なのですが、lsコマンドをrecursiveで叩いたあとにその各オブジェクトの合計サイズをサマライズしてくれるというものなので、
lsの結果がずら～っとでてきます。

もし目に毒だと言う方は、

`aws s3 ls s3://バケット名/ディレクトリ名/ --summarize --recursive --human-readable | tail`

でお尻だけみるようにしましょう。（やらしいでぇ）

また、S3ではlistを取るだけでも確か課金がかかるため、オブジェクトの量によってはもしかしたら、
１円くらいかかってしまうかもしれません。
[ios]UINavigationとUIPageViewControllerを絡めた画面遷移を実装したら、かなり混乱した話

下記のような画面遷移を実装しようとしました。
イメージとしては、一番左のセルをタップしたらチャット画面に遷移しつつ、チャット画面を右にスワイプしたら、タップしたセルの詳細情報が見れるような仕様。
つまづきポイントは、segueでの画面遷移しかやってこなかったので、segueで繋がれていない部分（今回であれば、Slide View Controllerとその先の画面）にどうやって変数を渡すのかが、わからなかったです。
<img width="1276" alt="スクリーンショット 2017-12-11 16.46.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/175906/3d26d6fe-8051-2869-4b8b-9c114be9937d.png">

結論としては、まずタップした時に、「Slide View Controller」にsegueを利用して、変数を渡します。その後、「Slide View Controller」で、その先の２画面をインスタンス化する際に、segueで渡した変数を含ませて、画面を生成。これで、無事完了。

いろんなことを理解できていないので、一つずつやって行くしかないですね。。。
PostgreSQL 初心者向け 導入備忘録

# この記事について
Webフレームワークの勉強をするためにサックリインストールを済ませたい時のための備忘録
環境はWindows7-64 Postgres9.6

#インストール
  PostgreSQL 公式
  https://www.postgresql.org/

  公式からダウンロードしてインストールする
  基本的にデフォルトの設定のままで問題ない。パスワードを忘れないようにメモ。

# デフォルト時の基本設定

  設定ファイル：install_dir/data/postgresql.conf
  接続制限    ：install_dir/data/pg_hba.conf
  ログファイル：install_dir/data/pg_log

  管理者名のデフォルト：postgres
  ポート番号デフォルト：5432

# 概要

## 階層ツリー

データベースサーバ
　└ 1:N データベース
　　└1:N スキーマ(デフォルト:Public)
　　　└1:N テーブル、インデックス等

## postgresにおけるデータベースとは

スキーマのコンテナ。
※他にもあるけどウェブフレームワークで使う場合それほど意識する必要はない

## postgresにおけるスキーマとは

- 個々のデータベースが所有する名前空間。
- テーブル、インデックス等のオブジェクトは必ずいずれかの名前空間に所属する。デフォルトでは「Public」
- ユーザー名と同じ名前でスキーマを作ると、対象ユーザーのオブジェクト検索の優先順位が以下のようになる。

  １．自分の名前のスキーマ．オブジェクト名
  ２．Publicスキーマ．オブジェクト名

※Webフレームワークで使う場合スキーマを活用することは少ない。テストはテスト専用のデータベースを作成するのが一般的。

## 最初から知っておいた方がいいこと

・エラーメッセージについて

  一部学術的な用語が用いられており所見時は混乱する

- リレーション ＝ テーブルのこと
- タプル ＝ レコードのこと
  - 例：「リレーションがありません。」→「テーブルがありません。」の意


・データベースを横断して処理ができない

  基本的に接続したデータベース外にあるオブジェクトの操作はできない。管理者でも同じ。操作する場合はDBLINKの作成が必要となる。

・template0とは何か

  データベースの作成テンプレート。
  template0は完全デフォルト、template1は自分でカスタマイズして使うテンプレート。大体はtemplate0を使えばＯＫ．

#起動と確認

[Windowsの場合]
Windowsの場合、Postgresがサービスに登録されるのでサービスの管理から起動・停止。net start や 起動コマンドの本体である「pg_ctl」でもよい

※ネットワーク疎通確認コマンド
サーバ：netstat -a | find 5432
クライアント：telnet hostname 5432

#クライアントツール

## psql
コマンドシェル。postgresqlインストール時に同時にインストールされる。
    
コマンド例：

    psgl -U ユーザ名 -h ホスト名 -l
    	データベース一覧の表示
    
    psgl -U ユーザ名 -h ホスト名 -d DB名 
    	データベースに接続
    
    \h 
        SQLコマンドの文法ヘルプ * で全コマンドを表示
    \x 
        拡張表示ON/OFF。クエリー結果のカラムが縦に表示されて見やすくなる。
    \i [ファイルパス]
        ファイルからコマンドを読み込んで実行
    \dt
        テーブル一覧を表示
    \du
        ユーザー一覧を表示
    \c [データベース名]
        別のデータベースに接続する
        
参考：[postgres-cheatsheet](https://gist.github.com/Kartones/dd3ff5ec5ea238d4c546)
        
##pgAdmin

公式のGUIツール
https://www.pgadmin.org/

※postgresqlにバンドルされているバージョンは古いことがあるので、こちらから別途ダウンロードした方がよい。最新はpgadmin4 Ver2.0
    

オブジェクトがツリー表示され、右クリックからオブジェクトを操作できる。
基本構造を把握できるため、コマンドライン派も最初は使っておくとよい。

クエリーの結果の表示がやや重くストレスを感じる。
管理コマンド以外の操作は、別の軽いツールを使うことをおすすめする。

##その他のGUIツール

### A5:SQL Mk2	
https://a5m2.mmatsubara.com/
日本産でほぼ機能に不足はなく動作も軽快

###DBvear
https://dbeaver.jkiss.org/
現在進行形で開発中のアプリ
日本語対応していないが、SQL作成時のインテリセンスが強力
    
※他にも多くあるので、自分の好きなのを使おう。
    

#開発時の利用準備作業
インストール後に行う作業。pgadminで作業する場合。

##手順１．ユーザー作成
  
1. pgadmin起動。開発サーバがPostgreSQL X.Xの名前で登録済みになっている。
2. サーバーのアイコンを右クリックし、create⇒login/roleを選ぶ
3. 開発者アカウントの情報を入力し登録。
  
##手順２．データベース作成
  
1. 開発者アカウントと同名でデータベースを作成
2. 作成したデータベースの所有者を開発者アカウントに変更する。
3. 作成したデータベースのスキーマ「Public」の所有者を開発者アカウントに変更する

※後述するスキーマ削除を実行できるようにするため
  
##手順３．コマンドラインで接続確認
  
シェルより「psql -U 開発者アカウント」として接続を確認
  
##手順４．アプリケーションより接続確認

[Djangoでの例]
DB接続の設定ファイルを変更し、アプリケーションから接続を確認する

※Windowsは追加パッケージ psycopg2が必要。確認コマンドは「manage.py dbshell」等。
  
```py:setting.py
  
	DATABASES = {
	    'default': {
	        'ENGINE': 'django.db.backends.postgresql',
	        'NAME': 'DevUser',
	        'USER': 'DevUser',
	        'PASSWORD': 'Password',
	        'HOST': 'localhost',
	        'PORT': '',
	    }
	}
```
	
	
##TIPS:テーブル等を全削除する
	
テーブル等を全削除したいときは、スキーマを削除して再作成するのが早い

```psql
drop schema public cascade;
create schema public;
```
Pathlibチートシート

公式リファレンスは[こちら](https://docs.python.jp/3/library/pathlib.html)

こちらも参考に
[ファイル操作でよく使うモジュール[os,shutil,glob]](https://qiita.com/meznat/items/30f2be15450ecd9d503f)

ライブラリのインポート
`from pathlib import Path`

#os.path VS pathlib 早見表
|os|pathlib |
|:----:|:----:|
|os.path.abspath()|Path.resolve()|
|os.chmod()|Path.chmod()|
|os.mkdir()|Path.mkdir()|
|os.rename()|Path.rename()|
|os.replace()|Path.replace()|
|os.rmdir()|Path.rmdir()|
|os.remove(),os.unlink()|Path.unlink()|
|os.getcwd()|Path.cwd()|
|os.path.exists()|Path.exists()|
|os.path.expanduser()|Path.expanduser()および Path.home()|
|os.path.isdir()|Path.is_dir()|
|os.path.isfile()|Path.is_file()|
|os.path.islink()|Path.is_symlink()|
|os.stat()|Path.stat(),Path.owner(),Path.group()|
|os.path.isabs()|PurePath.is_absolute()|
|os.path.join()|PurePath.joinpath()|
|os.path.basename()|PurePath.name()|
|os.path.dirname()|PurePath.parent|
|os.path.samefile()|Path.samefile()|
|os.path.splitext()|Path.suffix|




#パスの生成

| パスの生成 |意味 |
|:-----------------------:|:------------|
|Path.cwd()|現在のパス|
|Path.home()|ホームディレクトリのパス|

#パスの操作

|p = Path("your own path") | 意味 |
|:---:|:---------------------------------------|
| p.parent       |   親ディレクトリ      |
| p.name|末尾の名前を取得|
| p.parents     | 親要素の配列      |
| p.exists()       | パスの存在確認        | 
| p.is_dir()| ディレクトリだったらTrue          |
| p.is_file()|ファイルだったらTrue|
|p.rmdir()|空のディレクトリなら削除|
|p.mkdir(parents=False, exist_ok=False)|ディレクトリの作成. parents=Trueなら親フォルダも作る，exist_ok=Trueならすでにディレクトリが存在していてもNo Error|
|p.glob(pattern)|patternにマッチする要素を検索|
|list(p.glob(pattern))|glob検索結果を取得|
|p.resolve()|絶対パスに変換|
|p.open()|ファイルを開く|
|str(p) | テキスト表示|


#子ディレクトリに移動 

```.py
p = Path('C:/hoge1')
p2 = p/'hoge2'/'hoge3'

p2
>>>Path('C:/hoge1/hoge2/hoge3')
```
##p.parentsの使い方

```.py
p = Path('C:/hoge1')
p2 = p/'hoge2'/'hoge3'

p2.parents[0]
>>>Path('C:/hoge1/hoge2')

p2.parents[1]
>>>Path('C:/hoge1')
```
Pythonで関数のco_varnames, co_names, co_constsを確認する

#概要
Pythonの内部動作を学ぶため、関数のco_varnames, co_names, co_constsを確認する。



|型      |属性           |説明                             |
|:------|---------------|---------------------------------|
|コード 	|co_varnames 	|引数名とローカル変数名のタプル        |
|  	|co_names 	|ローカル変数名のタプル               |
|  	|co_consts 	|バイトコード中で使用している定数のタプル|

（以上、[1]より抜粋。）

#目的

- Python3の内部動作を学ぶ準備として、関数がどのように変数・定数を保持しているか確認する。


#環境
os: maxOS Sierra Version 10.12.6
python: Python 3.6.0

#内容
`f.__code__`に、関数`f`をコンパイルしたバイトコード (bytecode) を格納するコードオブジェクトが割り当てられている。

```Python3:インタープリタ
>>> def f(a, b):
...     c = len(a)
...     d = list(range(3))
...     a + b
...
>>> for attr in ('co_varnames', 'co_names', 'co_consts'):
...     print('{0}:\t{1}'.format(attr, getattr(f.__code__, attr)))
...
co_varnames:    ('a', 'b', 'c', 'd')
co_names:       ('len', 'list', 'range')
co_consts:      (None, 3)
```

自分で定義した関数`f`について、

- 引数名とローカル変数名のタプル`co_varnames`は、('a', 'b', 'c', 'd')
- ローカル変数名のタプル`co_names`は、('len', 'list', 'range')
- バイトコード中で使用している定数のタプル`co_consts`は、(None, 3)

であることがわかった。

#疑問
`co_names`は、本当に**ローカル**変数名のタプルなのだろうか？
グローバルでなくて？

#参考文献
[1] 29.12. inspect — 活動中のオブジェクトの情報を取得する (https://docs.python.jp/3/library/inspect.html)
CPythonの各ディレクトリの役割について

#概要
CPythonのレポジトリ[1]のどのディレクトリにどのファイルが入っているのか見当がつかなかったため、調べた。

#内容
- Include - ヘッダーファイル
- Objects - `int`から`type`まで、オブジェクトの実装
- Python - インタプリタ及びバイトコード・コンパイラ、その他の重要なinfastructure
- Parser - パーサ及びレクサー、パーサ・ジェネレータ
- Modules - stdlibの拡張モジュール、及び`main.c`
- Programs - 大したものはないが、実際の`main()`関数が入っている
-  \-\-\-\-\- 
- Mac - OS Xのみで使われるコード
- PC - 古いWindowsのみで使われるコード
- PCBuild - Visual Studioを用いて現代的なWindowsでPythonをビルドするためのツール


#詳細
##レポジトリのディレクトリ構造の確認
[1]で直接見ても良いが、以下のように羅列してみた。

```bash
$ git clone https://github.com/python/cpython.git
Cloning into 'cpython'...
remote: Counting objects: 685223, done.
remote: Compressing objects: 100% (102/102), done.
Receiving objects: 100% (685223/685223), 217.87 MiB | 544.00 KiB/s, done.
remote: Total 685223 (delta 57), reused 17 (delta 10), pack-reused 685111
Resolving deltas: 100% (552011/552011), done.
Checking out files: 100% (3953/3953), done.
$ cd cpython
$ find . -maxdepth 1 -type d
.
./.git
./.github
./Doc
./Grammar
./Include
./Lib
./Mac
./Misc
./Modules
./Objects
./Parser
./PC
./PCbuild
./Programs
./Python
./Tools
```

##レポジトリの各ディレクトリの役割の確認
[2]で調べた内容を和訳し、原文を引用した。

C言語のコードの大半は、幾つかのディレクトリにまとめられている。

- Include - ヘッダーファイル
- Objects - `int`から`type`まで、オブジェクトの実装
- Python - インタプリタ及びバイトコード・コンパイラ、その他の重要なinfastructure
- Parser - パーサ及びレクサー、パーサ・ジェネレータ
- Modules - stdlibの拡張モジュール、及び`main.c`
- Programs - 大したものはないが、実際の`main()`関数が入っている

> Most of the C code is concentrated in a few directories:
>
> - Include — header files
> - Objects — object implementations, from int to type
> - Python — interpreter, bytecode compiler and other essential infrastructure
> - Parser — parser, lexer and parser generator
> - Modules — stdlib extension modules, and `main.c` 
> - Programs — not much, but has the real `main()` function

Linuxや(Mac以外の)BSD distributionを使うならば以上で十分だが（筆者はこれを勧める）、
他のプラットフォームではもう少し見るべきディレクトリがある。

- Mac - OS Xのみで使われるコード
- PC - 古いWindowsのみで使われるコード
- PCBuild - Visual Studioを用いて現代的なWindowsでPythonをビルドするためのツール

> When you’re on Linux or a BSD distribution (other than Mac) that’s all you need, and I recommend this.
>
> For other platforms there are a few more places to look:
>
>
> - Mac — OS X-specific code
> - PC — Old Windows-specific code
> - PCBuild — Tools to build Python for modern Windows using Visual Studio

#意義
CPythonレポジトリでファイルを探す/見つけた際に、意味がわかりやすくなった。

#感想
- 技術系の文章の正確な和訳は難しい。。
- 各ディレクトリの大まかな役割がわかってよかった。

#参考文献
[1] python/cpython(https://github.com/python/cpython)
[2] Yet another guided tour of CPython(https://paper.dropbox.com/doc/Yet-another-guided-tour-of-CPython-XY7KgFGn88zMNivGJ4Jzv)
【学習メモ】PCに複数のバージョンのvSphere Clientをインストールする

#はじめに
ESXiの4.1から6.0まで、vSphere Clientでアクセスできる環境を作ろうと思いました。
VMware Workstationは異なるバージョンが入らないので、vSphere Clientも同じような縛りがあり、インストールの手順に秘伝のレシピが必要だと思っていました。
また、インストールするバージョンごとにフォルダを切り分けて、ファイルの存在を確認することで、各バージョンが本当にインストールされているのか確認しようとしました。

#結論
異なるバージョンは、初回にvSphere Clientをインストールしたディレクトリに対しインストールされます。後から追加するバージョンのインストール先は変更はできません。
秘伝のレシピは不要で、必要なバージョンの最新版をインストールするだけで問題ありませんでした。
6.0、5.5、5.1、5.0、4.1の順にインストールして問題ありませんでした。

```bash:最終的にインストールしたバージョン
上から順に
vSphere Client 6.0 Update 3  / VMware-viclient-all-6.0.0-5112508.exe
vSphere Client 5.5 Update 2  / VMware-viclient-all-5.5.0-1993072.exe
vSphere Client 5.1 Update 2a / VMware-viclient-all-5.1.0-1880906.exe
vSphere Client 5.0 Update 3  / VMware-viclient-all-5.0.0-1300600.exe
vSphere Client 4.1 Update 3a / VMware-viclient-all-4.1.0-925676.exe
```

#1本目
それぞれのメジャーバージョンの、初期リリースと最終リリースの2つのインストーラーを使い、古いバージョンから順にインストールしました。
メジャーバージョンのvSphere Clientがそれぞれ共存できるか試しました。

2017/12/11現在、下記から4.1～6.0までDLできます。
日本語(6.0はないが4.1がある)
https://kb.vmware.com/s/article/2090544
英語(6.0はあるが4.1がない)
https://kb.vmware.com/s/article/2089791

```bash:環境
OS:Windows 10 Pro
Arch:x64
Ver:1709
Build:16299.64
```

###アップグレード手順
古いものからインストールしていきます。
表の「指定可否」は、インストールまたはアップグレード時に、インストール先ディレクトリを変更できるかどうかを示します。
可能な場合、メジャーバージョンのディレクトリを指定してインストールします。

```bash:5.5をインストールするとき例
C:\Program Files (x86)\VMware\Infrastructure\5.5\
```

|major|minor|やったこと|結果|指定可否|
|:-:|:-:|:-:|:-:|:-:|
|4.1|-|インストール|成功|〇| 
|4.1|U3a|4.1無印→U3a|成功|×|
|5.0|-|4.1U3a→5.0|成功|×|
|5.0|U3|5.0→5.0U3|失敗*1|-|
|5.1|-|インストール|成功|〇|
|5.1|U2a|5.1→5.1U2a|失敗*2|-|
|5.5|-|インストール|成功|〇|
|5.5|U3e|5.5→5.5U3e|失敗*1|-|
|6.0|-|インストール|成功|〇|
|6.0|U3|6.0→6.0U3|失敗*2|-| 

- 4.1、4.1U3a、5.0、5.0U3は互換モードでXPの指定が必要です。互換モードで実行しないと「この製品は、Windows XP SP2 以降にのみインストールできます。」と表示されます。
- *1 「エラー 2229。データベース:。SQLクエリのテーブル「LaunchCondition」をロードできませんでした:SELECT 'Condition', 'Description' FROM 'LaunchCondition'」と出て失敗。
- *2 アップデート時に、「Failed to install the hcmon driver.」と表示されました。[c:\windows\system32\drivers\hcmon.sys]を別名に変更すると良いそうですが、最終的にインストールできませんでした。

*2
どのプロセスかがhcmon.sysをつかんでいてそのまま削除できず、削除できてもインストールに失敗という原因不明の状態でした。
- セーフモードでhcmon.sysの削除
- [USBモニタのチェックを無効化](https://kb.vmware.com/s/article/2080698)

参考資料
[vmware document:vSphere Client 5.0 のインストールが次のエラーで失敗する： hcmon ドライバのサービスの作成に失敗しました (2096407)](https://kb.vmware.com/s/article/2096407)

###結果
結局、4.1を除いて、何かしらの理由でマイナーバージョンのアップグレードに失敗しました。
インストール・アップグレード中に、インストール先が変更できるようになっていますが、設定を変えても変えなくても、**既にvSphere clientがインストールされている場所に追加でインストールされます**。インストール場所が指定できない時と同じ挙動でした。

#2本目
初期バージョンをインストールする理由がないことに気づいて、最終版の5.0、4.1、5.1など順番を変えてインストールしてみました。
インストール先を変えられず、全部同じフォルダにインストールされることに気づいてから、うすうす今回の結論に気づいていましたが…

###結果
いずれも問題なく入りました。
マイナーバージョンのバージョンアップがあったときは(例:6.0U2 -> 6.0U2a)、古いバージョンをアンインストールして最新を入れることで(例:6.0U2をアンインストール->6.0U2aをインストール)対応できそうです。


#備考
アンインストール後、以下のレジストリ(VMwareキー)を消去しています。
Inc付きのキーはPlayer等の環境のものです。

```bash:レジストリ
5.0以降で使用
コンピューター\HKEY_USERS\(ユーザー)\Software\VMware\Virtual Infrastructure Client
4.1で使用
コンピューター\HKEY_USERS\(ユーザー)\Software\VMware\VMware\VMware Infrastructure Client
```

変な先入観があるとそれによって時間が無駄になる良い例でした。
[Swift][Obj-C]UUIDStringの使い分け

こんにちは。2018年、フィジーク入賞を目標に決めた筋肉エンジニア @kNagadou です。
今は体重80kgに向けて、増量中です。誰か合同トレーニングやりませんか？

すみません。話が筋肉にそれてしまいました。
今回の記事は、[筋肉エンジニアアドベントカレンダー2017](https://qiita.com/advent-calendar/2017/mdd)の3日目です。
もう3日を過ぎていますが、空いているので埋めます。

# UUIDString
iOSでアプリを作る際、ユニークなIDを使いたい場合があります。
その際に、下記2つの `UUIDString` を使うことが出来ます。
しかし、ユニークなIDの用途によって使い分ける必要があるので、簡単にまとめてみました。
（間違ってたらごめんなさい。正しい用途や、他のやり方など知っている方いれば教えてください。）

## UIDevice().identifierForVendor
* https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor
* **同じデバイス上で、同じアプリベンダーのアプリ** で一意となる文字列
* サーバ側でデバイス情報を管理したい場合など

## NSUUID()
* https://developer.apple.com/documentation/foundation/nsuuid
* 生成される毎に変わる文字列
* クライアントからサーバにリクエストする際、任意のIDが必要となる場合など

### Code

* Objective-C

```obj-c
// 何回呼び出しても変わらない
[[UIDevice currentDevice].identifierForVendor UUIDString];
// 生成される毎に変わる
[[NSUUID UUID] UUIDString];
```

* Swift

```swift
UIDevice().identifierForVendor?.uuidString
NSUUID().uuidString
```

---

以上です。
12/7にも記事を書く予定なので、またネタ考えなくては。
筋トレネタならたくさんあるのに。。。
Node.js → Mocha → WebDriver → Selenium → Chrome でウェブサイト自動テスト

Node.js から Chrome でウェブサイトを開いて、自動テストしてみます。

![tested.jpg](https://qiita-image-store.s3.amazonaws.com/0/12419/21049a7d-c23c-6f38-03bf-2e7de0f43de4.jpeg)

テスト実行中のウインドウは、「Chrome は自動テスト ソフトウェアによって制御されています。」という表示が入る。

----

#### （1）Selenium Standalone Server をダウンロードする

http://docs.seleniumhq.org/download/
http://selenium-release.storage.googleapis.com/3.8/selenium-server-standalone-3.8.1.jar

----

#### （2）ChromeDriver (Chrome用WebDriver) をダウンロードする

https://sites.google.com/a/chromium.org/chromedriver/
https://chromedriver.storage.googleapis.com/2.33/chromedriver_mac64.zip
ZIP ファイルから chromedriver を展開する

----

#### （3）手元の java のバージョンを確かめる

```sh
java -version
```
macOS Sierra 標準の 1.7.0_79 だと古い。

```sh
PATH=/Applications/WebStorm.app/Contents/jdk/Contents/Home/jre/bin:$PATH
PATH=/Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home/bin:$PATH
java -version
```

JetBrains 製品には 1.8.0_152 が入っているので、これを使える。

----

#### （4）Selenium Standalone Server を起動する

```sh
java -jar -Dwebdriver.chrome.driver=./chromedriver selenium-server-standalone-3.8.1.jar
```

あとで Chrome 以外のブラウザもテストしたいので Selenium を使う。

----

#### （5） webdriverio をインストールする

```sh
npm install webdriverio wdio-mocha-framework
```

----

#### （6）最低限の wdio.conf.js を書く

```js
exports.config = {
    specs: ["./test/specs/**/*.js"],
    capabilities: [{browserName: "chrome"}]
};
```

----

#### （7）./test/specs/google.js テストを書く

```js
const assert = require("assert");

describe("Test", () => {
  it("Test", () => {

    // Google を開く
    browser.url("https://www.google.com/");

    // タイトルをチェックする
    assert.equal(browser.getTitle(), "Google");

    // 検索フォームに入力する
    $("form input[name=q]").setValue("webdriver.io");

    // 検索ボタンをタップする（これではうまくいかない）
    // $("form input[type=submit]").click();

    // 検索ボタンをタップする
    browser.execute(() => {
      document.querySelector("form input[type=submit]").click();
    });

    // 検索結果画面が表示されるのを待つ
    browser.waitForExist("h3 a", 5000);

    // 検索結果１位の内容を確認
    assert.equal($("h3 a").getText(), "WebdriverIO - WebDriver bindings for Node.js");
    assert.equal($("h3 a").getAttribute("href"), "http://webdriver.io/");
  });
});
```

----

#### （８）テストを実行する

```sh
./node_modules/.bin/wdio wdio.conf.js
```

テストが成功すれば、以下のように表示される。

```
․

1 passing (9.20s)
```

テストが失敗すれば、以下のようにエラー内容が表示される。

```
F

0 passing (7.80s)
1 failing

1) Test Google:
unknown error: Element <input value="Google 検索" aria-label="Google 検索" name="btnK" 
type="submit" jsaction="sf.chk"> is not clickable at point (524, 411). 
Other element would receive the click: <div class="sbqs_c">...</div>
running
Error: An unknown server-side error occurred while processing the command.
    at Context.it (test/specs/test.js:14:34)
    at Promise.F (node_modules/core-js/library/modules/_export.js:35:28)
    at elementIdClick("0.22294089062951095-2") - click.js:20:22
```

Google ウェブサイトの検索ボタンをクリックする部分は、
`$("form input[type=submit]").click();` でも通りそうだけど、
オートコンプリートの関係か、クリックできないためにエラーになってしまう。
http://webdriver.io/api/action/click.html にも書いてある通り、
`execute()` でブラウザ側 JavaScript を実行して、検索ボタンをクリックすることで回避できる。
Project Euler Q46 【もうひとつのゴールドバッハの予想】

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


## 問題
Christian Goldbachは全ての奇合成数は平方数の$2$倍と素数の和で表せると予想した.

$9 = 7 + 2×1^2$
$15 = 7 + 2×2^2$
$21 = 3 + 2×3^2$
$25 = 7 + 2×3^2$
$27 = 19 + 2×2^2$
$33 = 31 + 2×1^2$

後に, この予想は誤りであることが分かった.

平方数の$2$倍と素数の和で表せない最小の奇合成数はいくつか?

## 解答

```bash
seq 3 2 9999 |
factor |
awk 'NF!=2{print $1*1}' |
awk '{printf $1" ";for(i=1;i<=(sqrt($1/2));i++){printf $1-2*i^2" "};print ""}' |
awk '{printf $1" "NF-1" ";for(i=2;i<=NF;i++){for(j=2;j<=sqrt($i);j++){if($i%j==0||$i==1){g[NR]+=1;break}}};print g[NR]}' |
awk '$2==$3{print $1}' |
head -1
5777
```

## 答え合わせ
こちらのサイト様と一致していればOKとした。
[Project Euler 46  Odd number not a prime plus twice a square  in C#](http://www.mathblog.dk/project-euler-46-odd-number-prime-square/)
Rubyで7桁の郵便番号を3桁+4桁に分割する方法

例えば、DBに郵便番号を7桁の文字列で保存しているけど、画面などに出力する際には分けたいときなど。
separator となる文字を挿入することで、split できるようにしています。

```ruby
zip_code = 'xxxyyyy'
zip_code.insert(3, '-').split('-')　# '-'じゃなくてもよい
```
もっと効率的な方法があれば知りたいです。
PHPでファイルダウンロードするときのファイル名（Windows）

## DBに登録してある文字列をファイル名にする
PHPで構築したWebサービスで、何らかのファイルをダウンロードするとして、ファイル名をDB（MySQL）に登録してある該当レコードのテキスト値にしたいというとき。
※MySQLの文字コードはUTF-8
その値には"ファイル名に使えない文字"が含まれているかもしれないし、改行コードが含まれているかもしれない、なんて場合は…

## コード
```php:filename.php
$file_name = DBから取ってきたテキスト;
// 改行コードを空白に変換
$file_name = str_replace(array("\r\n","\r","\n"), " ", $file_name);
// HTMLエンティティを文字に戻す
$file_name = htmlspecialchars_decode($file_name);
// ファイル名無効文字の全角化
$file_name = str_replace(array("\\","/",":",",",";","*","?","<",">","|"), array("￥","／","：","，","；","＊","？","＜","＞","｜"), $file_name);
// エンコード
$file_name = mb_convert_encoding($file_name, 'SJIS-win', 'UTF-8');
```
DBにどんな値が入り得るかによると思いますが。

あと、Windows向けです。
Macだとどうなるんでしょう？
newspicksで自分がpickしたニュースのスクレイピング

#はじめに
NewsPicksを使ってpickしたニュースを保存したくなったので、マイページ上からスクレイピングするスクリプトを書きました。javascriptが実行されているページだったので、一応後で拡張できるようにseleniumを使いました。今回は当日pickした情報のみをスクレイピングします。

集めた情報はpickしたニュースの以下のデータです。

- url
- タイトル
- 自分のコメント
- 日時が分かるモノ

#NewsPicksへのログインとマイページ情報の取得
```python3

import requests
from selenium import webdriver
import time
import datetime

class NPscraping():

    def __init__(self, user_id, password):
        self.base_url = "https://newspicks.com/"
        self.user_id = user_id
        self.password = password


    def get_today_news(self):
        driver = webdriver.PhantomJS()
        driver.set_window_size(1920, 1080)
        driver.get(self.base_url)
        driver.find_element_by_class_name("login").click()
        driver.find_element_by_id('login-username').send_keys(self.user_id)
        driver.find_element_by_id('login-password').send_keys(self.password)
        driver.find_element_by_class_name("login-btn").click()
        time.sleep(5)

        driver.find_element_by_class_name("user-header").click()

        return self.get_news_cards(driver)



    def get_news_cards(self, driver):
        news_cards = []
        today_str = datetime.date.today().strftime('%Y%m%d') #今日の日付

        for card in driver.find_elements_by_class_name('news-card'):
            if card.get_attribute('data-key')[0:8] != today_str:　#今日の日付と同じものだけ
                break

            news_cards.append({
                'url': card.find_element_by_tag_name("a").get_attribute("href"),
                'title': card.find_element_by_tag_name("a").find_element_by_class_name("title").text,
                'comment': card.find_element_by_class_name("user-comment").find_element_by_class_name("comment").text,
                'data-key': card.get_attribute('data-key')
            })

        return news_cards

```
色々機能をつけようと思ったのでクラスにしましたが、特にクラスにする必要はないと思います。

- PhantomJSを使ってNewspickのログインページに入り、"login"class要素のボタンを情報を入力してクリック。
- 続いて、"user-header"class要素がマイページに繋がる要素なのでクリック
- today_strに本日の日付をNewsPicksのフォーマットを合わせて保存
- "news-card"class要素の'data-key'要素から日付を比較
- 後は"news-card"class要素の中から必要なデータをdict変数に保存

という流れになっています。（地味にどのclass要素がマイページに繋がるのが見つけるのがしんどかったです）

```python3

user_id = <newspickのid>
password = <newspicksのpass>

np = NPscraping(user_id, password)
news_cards = np.get_today_news()
```
で本日pickしたニュースをdictのlistで入手できます。オブジェクト化した意味はないと思いますが、とりあえず入手はできます。（オブジェクト指向よく分かってないです...）

#今後
今回のスクレイピングは自分で情報を保管したり編集したり、ブログに自動で投稿できるようにするためにデータ化したものです。自分としては、はてなブログの下書きに毎日投稿して、自分のニュース閲覧を管理・公開をしたいと思っています。

#追記
上のコードだと、自分のコメントのデータを取る時画面に表示されてるコメントしか取れません。（多分）60文字以上のコメントは省略されてしまうからです。なので

```python3
'comment': card.find_element_by_class_name("user-comment").find_element_by_class_name("comment").text,
```
ではなくて

```python3
'comment': card.find_element_by_class_name("user-comment").find_element_by_class_name("comment").get_attribute("data-org")
```
にする必要があります。省略されてる場合はdata-orgというattributeが存在するようになるので、そのような場合わけをするだけで取得できます。
行の抽出

# 手順
1. `/input`
2. `:v//d`

# サンプル
https://getbootstrap.com/docs/4.0/components/forms/#form-row

```html
<form>
  <div class="form-row">
    <div class="col">
      <input type="text" class="form-control" placeholder="First name">
    </div>
    <div class="col">
      <input type="text" class="form-control" placeholder="Last name">
    </div>
  </div>
</form>
```

↓

```html
      <input type="text" class="form-control" placeholder="First name">
      <input type="text" class="form-control" placeholder="Last name">
```
Project Euler Q45 【三角数, 五角数, 六角数】

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


## 問題
三角数, 五角数, 六角数は以下のように生成される.

三角数
$T_n=\frac{1}{2}n(n+1)$
$1, 3, 6, 10, 15, ...$
五角数
$P_n=\frac{1}{2}n(3n-1)$
$1, 5, 12, 22, 35, ...$
六角数
$H_n=n(2n-1)$
$1, 6, 15, 28, 45, ...$

$T_{285} = P_{165} = H_{143} = 40755$であることが分かる.

次の三角数かつ五角数かつ六角数な数を求めよ.

## アプローチ
三角数、五角数、六角数をそれぞれ$n$について解くと、

```math
T_n=\frac{1}{2}n(n+1) \\
n^2+n-2T_n=0 \\
n=\frac{-1±\sqrt{1+8T_n}}{2}
```

```math
P_n=\frac{1}{2}n(3n-1) \\
3n^2-n-2P_n=0 \\
n=\frac{1±\sqrt{1+24P_n}}{6}
```

```math
H_n=n(2n-1) \\
2n^2-n-H_n=0 \\
n=\frac{1±\sqrt{1+8H_n}}{4}
```

※±は解の公式上記載しただけであり、実際にはこれらの値が正にならなければならない為、マイナスは考えなくてよい。


## 解答

```bash
seq 99999 |
awk '{print $1*(2*$1-1)}' |
awk '{print $1,(1+sqrt(1+24*$1))%6}' |
awk '$2==0' |
awk '{print $1,(-1+sqrt(1+8*$1))%2}' |
awk '$2==0{print $1}' |
tail -1
1533776805
```

六角数は三角数であるらしいので、三角数の判断は不要かも。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/045.html
TWE-Lite-2525Aで加速度を取得してみた

#はじめに
IoTを使った何かを作りたく、手始めとしてTWE-Lite-2525A使って加速度の値を取得してみます。

#用意するもの
・TWELITE 2525A　
・MONOSTICK
・電池(CR2032)
Amazonで購入しました。
![IMG_7912.JPG](https://qiita-image-store.s3.amazonaws.com/0/200669/a9dcc7a1-4a98-2439-c92e-6b0a28153ab5.jpeg)


#作業内容
こちらのリンクが大変参考になりました。
https://qiita.com/takahiro_itazuri/items/6061311e8fa9a47aa2e1

要点とつまずいたポイントだけ
##1.TWELITE 2525Aの設定
###1.TWELITEプログラマを使用し、OTAのファームウェアをMONOSTICKに書き込みます。
※TWELITE 2525Aと同じverが必要です。(手順4までやらないと2525Aのverが分からないためとりあえず最新版をインストール)

Windows 用 TWELITE プログラマ
https://mono-wireless.com/jp/products/TWE-APPS/LiteProg/index.html

OTAのファームウェア
https://mono-wireless.com/jp/products/TWE-APPS/App_Tag/download.html


###2.Tera termのインストール
https://ja.osdn.net/projects/ttssh2/releases/
最新版の4.97、4.96はMSがウィルス検知してしまい起動が出来ない為、4.94をインストール

###3.MONOSTICKを介してOTAでTWELITE 2525A設定
Teratermを起動し、シリアルポートの「ボー・レート」を115200に変更

![image.png](https://qiita-image-store.s3.amazonaws.com/0/200669/80bdb9d2-5d22-ad67-4224-b653469da56f.png)



Option Bitsを変更後、TWE-Lite-2525Aに電池を入れます。
ここで問題が発生
SUCCESSと出るはずがFAILUREと出てします。
どうやらTWELITE 2525AとMONOSTICKのバージョンが異なるようで最新版2.0.4ではなく、App_Tag_bin_2_0_1をMONOSTICKに再書き込み。(手順1)

トラブルシューティング
https://mono-wireless.com/jp/products/TWE-APPS/OTA/index.html

無事にSUCCESSとなりました。

###4.MONOSTICKの設定
App_Tag-Parent-BLUE-MONOSTICK.binを書き込む

シリアルを選択し、ボー・レートを115200に変更
「+」をキーボードで0.5秒間隔で3回押すと、以下の設定画面に入れます。
 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/200669/7141b261-abb0-fe6c-8c99-b7b006d23547.png)

Option Bitsの設定を0x00000001に変更
（「o」⇒「00000001」⇒「Enter」）
設定を保存する（「Shift」+「s」）
※参照先は「00000020」になっていますが、表示がおかしくなったので00000001にしてます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/200669/72b7a4c1-71c6-7775-2618-2eb3f58e2d22.png)

数字が増えていきます。

###5.加速度情報の取得


![image.png](https://qiita-image-store.s3.amazonaws.com/0/200669/bd089c4b-10a6-bad8-a929-324b04b4c310.png)

値の単位は1/100Gのようです。あやしい。。？
まぁとにかく無事に加速度の値を取得できました。

[無線タグアプリで使ってみる](https://mono-wireless.com/jp/products/TWE-Lite-2525A/manual_App_tag.html)

#参考にさせて頂きました。

[初心者がTWELITE 2525AとMONOSTICK REDで加速度を無線で取得してみたIoT](https://qiita.com/takahiro_itazuri/items/6061311e8fa9a47aa2e1)
[TWE-Lite-2525Aで開閉センサ(Twitter連携) を作ってみた](https://qiita.com/maechi/items/55afe464ef3a0ee8e578)
[TWE-Lite-2525Aを使って加速度の値を読み込む](https://qiita.com/yuji_miyano/items/6f5d34933f66b7154682
)
LSTMとEncoderDecoderを利用した異常値検知

# はじめに
この記事は<a href="https://qiita.com/advent-calendar/2017/hakusanmafia">Hakusan mafia Advent Calendar 2017</a>の11日目の記事です。
こんにちは、misogyといいます。普段は機械学習を中心に勉強していて, アルバイトでDNNを組んだり, 研究の手伝いでもDNN組んだりしています。
さて今回はDNNを利用した異常値検知について論文とともに紹介できればと思います。

# 動機
なぜ異常値検知なんてするの?という話は他の記事に譲ります。
<a href="https://qiita.com/GushiSnow/items/f032806cfa8cec046318">異常検知と変化検知のまとめ　数式なし</a>
<a href="https://research.preferred.jp/2013/01/outlier/">異常検知の世界へようこそ</a>
まず, 異常値検知を検討する時にデータとして考えられるケースとしては, <b>正解データの量(異常値)が不正解データ(正常値)に比べて極端に少ない</b>ケースが考えられると思います。
そこで、<b>不正解データ(正常値)のデータのみを学習させる</b>ことで, 異常値データを入れた時に異常な値が帰ってくるので異常と識別するということをします。

# 論文

<a href="https://arxiv.org/pdf/1607.00148.pdf">LSTM-based Encoder-Decoder for Multi-sensor Anomaly Detection</a>
今回紹介する論文はこちらです。
lstm(EncoderDecoder)を利用して, 不正解データの波のみを学習させることで, decoderサイドが正解データの波を入れた時にうまく波を再現できないことから,異常を検出します。

<img src="https://github.com/misogil0116/Enc-Dec-AD/blob/cf0ff4cbb45ba4c0e426906901694c7d2eb889e4/image/encdec.png?raw=true">
from page.2

学習に必要な損失関数は以下で定義します。簡単ですね。

```math
E = \frac{1}{2}\sum_{k=1}^{n}(x_k - x_k')^2
```

異常値のスコアリングはどうするかというと, 以下のようにガウス分布を定義し,正常値データのみで最尤推定をしてμとΣを計算した後, そのガウス分布上で以下を計算することによって各時系列での異常値を計算します。

```math
e_i = |x_i' - x_i|　\\
μ = \frac{1}{N}\sum_{k=1}^{n}e_k \\
Σ = \frac{1}{N}\sum_{k=1}^{n}(e_k - μ)(e_k - μ)^T \\
a_i = (μ-Σ)^TΣ^{-1}(μ-Σ)
```

a_iが各時間でのscoreです。これが大きいほど異常値が高くなります。

# 結果

論文に乗っている通りです。
データが手に入らなくて研究に使っているデータでしか再現していないため,載せられません。 
ご了承ください..

# ソースコード

実装をGithubで載せています。
間違いがあればPull Request歓迎しています。
<a href="https://github.com/misogil0116/Enc-Dec-AD/blob/master/EncDecAD.py">misogil0116/EncDecAD</a>
fish 導入

mac初期化からfishの設定をメモ

参考サイト
http://nonsensej.xyz/?p=741
https://qiita.com/eielh/items/8b9f86a980b08125eb93
https://www.key-p.com/blog/staff/archives/105041


## 環境
macOS high serrie 10.13.1
iTerm2
fish 2.7.0

##  fishをインストール
まずbrewをインストール（brewがすでに入ってる場合は不要）
[brewインストールページ](https://brew.sh/index_ja.html)
このページにあるスクリプトを使用してインストール。

fishをインストール。
`$ brew install fish`
確認

```
$fish -v
fish, version 2.7.0
```

fishのパスを確認

```
$which fish
/usr/local/bin/fish
```

シェル一覧に追記

```
$ sudo vi /etc/shells
```

シェルを切り替える

```
$ chsh -s /usr/local/bin/fish
```
ターミナル再起動

## fishをカスタム
oh-my-fish派なのでインストール

```
$ curl -L http://get.oh-my.fish | fish
```

これでターミナルの先頭にお魚さんが表示される
一応確認してみる

```
$ omf
```

こんな感じに帰って来ればok
![スクリーンショット 2017-12-11 15.20.37.png](https://qiita-image-store.s3.amazonaws.com/0/169137/6af10b83-d320-c6e6-db41-2e26b9a345a4.png)

## pecoの設定
peco入れないと使い勝手が悪いのでインストール

```
$ brew install peco
```
確認のため一応

```
$ peco -h
```
オプションの説明がつらつらと出てくればok

og-my-fishでpecoのプラグインをインストール

```
$ omf install peco
```
![スクリーンショット 2017-12-11 15.44.18.png](https://qiita-image-store.s3.amazonaws.com/0/169137/f71d311d-fb28-096a-c794-f2740920ee78.png)

成功

pecoの履歴を検索できるようにする

```
bind \cr 'peco_select_history (commandline -b)'
```
New Relic をバージョンアップした話

NewRelic Server Monitorが使えなくなると言うんで、
NewRelic Server Monitorの代わりにNewrelic Infrastructureを導入することになったらしい。
Azure上の仮想マシンはPowershellDSC、CloudServiceはPowershellで自動化していたインストールのScriptを書き換えてみようと思います。

#NewRelicServerMonitorのときは、、、

``` chkNRSM.ps1
$r = Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -match "New Relic Server Monitor"}
if ($r -ne $null)
{......

```

``` installNRSM.ps1

Write-Verbose "Installing NewRelic module ... Downloading ..."

# download module files
$sourceContainer = $installSourceStorageUrl + "installmodules";
C:\AzCopy\AzCopy.exe /Source:$sourceContainer /Dest:"c:\Users\newrelicusr" /Y /sourceKey:$installSourceStorageKey /Pattern:$installNewRelicFile

$package = "c:\Users\newrelicusr\$installNewRelicFile"
$license_key = "NR_LICENSE_KEY="+$installNewRelicKey

#install NewRelic
Write-Verbose "Start .. NewRelic install"
Start-Process -FilePath "msiexec.exe" -ArgumentList /i , $package,'/L*v c:\Users\newrelicusr\installNewRelic.log',/qn ,$license_key -Wait

Write-Verbose "Success."

#Delete temporary msi.
Remove-Item -Force -Recurse -Path $package -ErrorAction Ignore

```

``` unInstallNRSM.ps1

Write-Verbose "NewRelic module ... Deleting ..."

#Get NewRelic module
$r = Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -match "newrelic-infra"}
if ($r -ne $null)
{
    $r.Uninstall()
}

```

と、まぁこんな感じです。

#NewRelic Infrastructureを導入するには、、、

``` installNRI.ps1

#Downloading New Relic client
Write-Output "Downloading New Relic Client"
$File = "$env:temp\newrelic-infra.msi"

#Downloading the file
(New-Object System.Net.WebClient).DownloadFile($NewRelicClientUrl, $File)   
Write-Output "Downloaded to: $File"

#Installing client
Write-Output "Installing Client"
Start-Process msiexec.exe -Wait -ArgumentList "/I `"$File`" TARGETDIR=`"$InstallDir`" /qn"
Write-Output "Client Installed"

#Updating license file
Write-Output "Updating License file"
(Get-Content "$InstallDir\newrelic-infra\newrelic-infra.yml").Replace("<ENTER YOUR NEW RELIC KEY HERE>", $NewRelicKey) | Set-Content "$InstallDir\newrelic-infra\newrelic-infra.yml"

#Wait a bit to get the service registered properly
Start-Sleep 5

#Restarting service
Get-Service -Name newrelic-infra | Restart-Service

#Cleaning up
Write-Output "Cleaning up"
Remove-Item $File -Force

```

とまぁこんな感じで、、、

#おわり
見ての通り、まだ開発途中なんでインストールしか書いていませんが（アンインストールはなしにするかもしれませんが）、、、
とにかく、NewRelicは結構便利なのでみなさん試しに触ってみましょう。
あとできちんと記事の追記を行います。
※Azureの情報少ないなー
devise利用時の"cannot load such file -- bcrypt_ext"エラー対応

`"cannot load such file -- bcrypt_ext"`で検索するとQiita内でも結構ヒットします。
たぶんWindows環境の人は必ず一度はぶち当たるのではないでしょうか。。。

他の方の投稿で解決できないパターンに遭遇したので記事を起こしました。

# 発生環境
Windows 10 64bit
Rails 5.1.4
Ruby 2.3.3p222[i386-mingw32]
devise 4.3
bcrypt 3.1.11

# 発生手順
deviseでユーザー登録ページまで作成、メールアドレス・パスワードを入力し、サインアップした瞬間以下エラーになりました。

![devise.PNG](https://qiita-image-store.s3.amazonaws.com/0/204683/6c9310b4-4458-ffe7-0ab4-aecf11b83a3f.png)

# 発生原因
以下リンクの@scivolaさんのコメントが非常に参考になります。
https://qiita.com/totto357/items/1741da83bf642dab99df#comment-4837bb466422937d7357

`Gemfile.lock`を見ると確かに`bcrypt (3.1.11-x86-mingw32)`があるので、これではRuby2.3.3では動かないのでしょう

# 対策

## bcrypt-rubyを追加
Gemfileに`gem 'bcrypt-ruby', '~> 3.0.0'`を追記します。

```rb:Gemfile
gem 'bcrypt-ruby', '~> 3.0.0'
```

参考：https://qiita.com/uloruson/items/7b728b40a3abeb3128d0

```rb:Gemfile.lock
bcrypt (3.1.11-x86-mingw32)
bcrypt-ruby (3.0.1-x86-mingw32)
```

結果、上記2つのgemが追記されたがエラー解消せず

## bcryptを追加
`gem install bcrypt --platform=ruby`を実行した後、Gemfileに`gem 'bcrypt', '~> 3.1.11'`を追記

```rb:Gemfile
gem 'bcrypt', '~> 3.1.11'
```

参考：https://qiita.com/totto357/items/1741da83bf642dab99df

```rb:Gemfile.lock
bcrypt (3.1.11-x86-mingw32)
```

結果、追加されたbcryptは`x86-mingw32`の為エラー解消せず

## bcrypt-rubyをgitから追加
Gemfileに`gem 'bcrypt', git: 'https://github.com/codahale/bcrypt-ruby.git', require: 'bcrypt'`を追記

```rb:Gemfile
gem 'bcrypt', git: 'https://github.com/codahale/bcrypt-ruby.git', require: 'bcrypt'
```

参考：https://github.com/codahale/bcrypt-ruby/issues/142#issuecomment-350175740

```rb:Gemfile.lock
GIT
  remote: https://github.com/codahale/bcrypt-ruby.git
  revision: f2db689ba567d1a018f4dacb1ccf909adc93e887
  specs:
    bcrypt (3.1.11)
```

結果、無印のbcryptが追加され、**エラー解消しました。**

# さいごに
エラー解決に2日かかりました。
Windowsもうヤダ
git ftpを使えるようにする(Windows, Mac)

## はじめに

運営しているサイトがレンタルサーバーで自分以外SSHでアクセスが出来なかったりする環境の時になんとか、デプロイを人力の手でやることを阻止したいと考え、git-ftpを使うことにした際のメモ。
WindowsとMac両方でのアップロードが必要だったため、頑張って両方での手順を書く

## 前提

ファイルをgitで管理していることが前提になります。
gitの導入などは別記事を参照ください。

## 環境

#### Mac

* OS X 10.13.1

> brewを経由してインストールするので、brewが使えるようにしておいてください。
> [Macの方はこちら](http://ken-sayama.hateblo.jp/entry/2015/08/23/191743)を終わらせておくと手順通りに出来ます。

#### Windows

* OSバージョンはなんでもいい

[git bash](https://git-for-windows.github.io/)をインストールしてください。

## git ftpのインストール

#### Mac

ターミナルで以下を実行するだけ

```
$ brew install git-ftp
```

#### Windows

Git bashを「管理者として実行」で開く
立ち上がったら、以下を実行していく

```
$ cd ~
$ git clone http://github.com/git-ftp/git-ftp git-ftp.git
$ cd git-ftp.git && chmod +x git-ftp
$ cd /bin/
$ ln -s ~/git-ftp.git/git-ftp git-ftp
```


MacもWindowsも以下を入力してインストール出来ているかを確認

```
$ git ftp
```

上記コマンド実行後、`git-ftp <action> [<options>] <url>`という表示が出たらインストールが出来ています。


## gitftpに設定を行う

gitで管理しているフォルダまで移動する。
gitで管理されている場合は、`.git`というフォルダが存在する

Macであればターミナル、Windowsであれば、git bashで以下を行う

```
$ git config git-ftp.url ftp://ホスト名/該当するフォルダまでのパス
$ git config git-ftp.user ユーザー名
$ git config git-ftp.password パスワード
```

上記はお使いのレンタルサーバーなどを確認し、適宜変更を行なってください。

上記を行なったら、`.git`フォルダ内の`config`ファイルを確認すると設定が反映されているかと思います。

## 初期実行

上記の設定が終わったら、以下を行う

```
$ git add .
$ git commit -m "commit"
$ git push
```

git pushを行う必要は無いですが、commitまではやっておかなければエラーとなります。

そしたら最初の一回だけは以下のコマンドを実行します。

```
$ git ftp init -v
```

## init以降のアップロード方法

`git ftp init`の初回を終えるとサーバー内に`git-ftp.log`のようなログファイルが生成される。

`init`以降は以下のコマンドで随時アップロードが行える

> `git ftp push`を行う際も`git commit`までは行なっておく必要がある。penddingとなっているとエラーとなる

変更の流れは以下のようになる

1. ファイルを編集
2. 「git add .」する
3. 「git commit -m "変更内容"」する
4. 「git push」変更内容をpush
5. 上記4つが終わったら、「git ftp push」する

```
$ git ftp push
```
CSSを書くときに気をつける事

この記事は[Relux Advent Calendar](https://qiita.com/advent-calendar/2017/relux)11日目の記事です。

## CSSについて
CSSは学習コストが低いので割とすぐに書き始める事ができるのですが、構造化するための仕組みがなく意識して書かないと、すぐに影響範囲がわからなくなったりメンテナンスしにくい状態になって強引にスタイルを当てる事が多くなります。
今回はそれほど意識して来なかったCSSを書くときに意識した方がいい基本的な考え方を調べて見ました。

## 要素セレクタとid,classセレクタを同時に使わない。
たまにやってしまっているのですが、同時につかってしまうと特定の要素でしか利用できず、再利用性が下がり、同じようなコードが増える原因になります。

```css:NGパターン
div.error {
   color: #red;
   font-size: 25px;
}
div#footer {
   margin: left;
   width: 100%;
   height: 41px;
   left: 0;
   right: 0;
   bottom: 0;
   position: fixed;
}
```

```css:OKパターン
.error {
   color: #red;
   font-size: 25px;
}

#footer {
   margin: left;
   width: 100%;
   height: 41px;
   left: 0;
   right: 0;
   bottom: 0;
   position: fixed;
}
```

## スタイルの取り消しを行わない
Normalize.cssなどのブラウザ間のでデフォルトスタイルをリセットするためのCSS以外ではできるだけ取り消しさないようにした方が良いです。

```css:NGパターン

h2 {
    font-size: 2em;
    margin-bottom: 0.5em;
    padding-bottom: 0.5em;
    border-bottom: 1px solid #ccc;
}

.no-border {
    padding-bottom: 0;
    border-bottom: none;
}
```
↑は`h2`に対して、下線をつけたくないときに `no-boader`で打ち消すように書いてます、
ただ、これは以下のように書く事でコード量を少なく書き換えれます。

```css:OKパターン
h2 {
    font-size: 2em;
    margin-bottom: 0.5em;
}

.headline {
    padding-bottom: 0.5em;
    border-bottom: 1px solid #ccc;
}
```
行数が増えてきたCSSでスタイルの取り消しを頻繁に行うと、無駄にファイル数が多くなるのでロードにかかる時間が増えるので、意識していきたい所です。

## ハードコードしない。
プログラミングでハードコードは良くない事で有名ですが、CSSでも同様に良い方法ではないです。
例えばユーザーのアイコンを円形にしたい場合以下のように書く事ができます。

```css:NGパターン
account-image {
   width  : 50px;
   height : 50px;
   border-radius : 25px;
}

```
↑のように記述すると、横縦50pxの円形のスタイルを作る事ができますが、今のままだとサイズに変更が会ったとき `border-radius` の値を毎回変更する必要があります。

```css:OKパターン
account-image {
   width  : 50px;
   height : 50px;
   border-radius : 50%;
}

```
このように、設定する事で幅が変わっても値を変更する必要がなくなりました。全てをこのように書くことは難しいですが、意識しておくと変更に強いコードになります。

また、width、heightもハードコードされているのですが、そちらに関しては変数を利用できるようにする、[Sass](http://sass-lang.com/) などのCSSプリプロセッサなどで管理してあげるのが良さそうです。

## 詳細度を意識する。
CSSは基本的に後に定義されたプロパティが優先されます。ただ、適用されるスタイルはそれ以外にもルールがあります。

```css

div h1 {
    font-size: 35px;
}

h1 {
    font-size: 30px;
}

```
この場合、定義された順序は　`font-size: 30px` が後ですが実際には `font-size: 35px;` が適用されます。
理由としては、セレクタには詳細度という値が存在しており、適用される際にその数値を参照しています。自分の書いたCSSが適用されない場合などはが原因の可能性があるので、見返して見ると良いかもしれません。
詳細度の説明は[こちら](https://developer.mozilla.org/ja/docs/Web/CSS/Specificity#How_is_it_calculated.3F)

## まとめ
今までレイアウトを表現する事に重点に置いて、CSSの書き方を意識する事が少なかったのですが、OOCSS, BEMなどの有名な設計思想を学ぶ以外にも基本的な考え方を学ぶとより可読性の高いコードを書く事ができると感じました。CSS自体もどんどん新しい仕様が策定されているので、定期的に知識のアップデートをしてより便利で読みやすいコードにしていきたいです。

### 参考
- [詳細度](https://developer.mozilla.org/ja/docs/Web/CSS/Specificity#How_is_it_calculated.3F)
- [Code smells in CSS](ps://csswizardry.com/2012/11/code-smells-in-css/)
Project Euler Q44 【五角数】

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


## 問題
五角数は $P_n = \frac{1}{2}n(3n-1)$ で生成される. 最初の$10$項は
$1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...$

である.

$P_4 + P_7 = 22 + 70 = 92 = P8$ である. しかし差 $70 - 22 = 48$ は五角数ではない.

五角数のペア $P_j$ と $P_k$ について, 差と和が五角数になるものを考える. 差を $D = |P_k - P_j|$ と書く. 差 $D$ の最小値を求めよ.


## アプローチ
$P_n = \frac{1}{2}n(3n-1)$を$n$について解くと、$n=\frac{1±\sqrt{1+24P_n}}{6}$となる。
$P_k±P_j$を計算した結果を上記に代入して整数になればよい。

## 解答

```bash
seq 9999 |
awk '{print $1*(3*$1-1)/2}' |
awk '{for(i=NR-1;1<=i;i--){v=i*(3*i-1)/2;p=$1+v;m=$1-v;if((1+sqrt(1+24*p))%6==0&&(1+sqrt(1+24*m))%6==0){print m;break}}}' |
sort -k1,1n |
head -1
5482660
```

`seq 999`から始められればフィルタコマンド(といっても結局`awk`)のつなぎ合わせで求められるが、`seq 9999`からでないと求められないので`awk`で長ったらしく書いた。
`awk`の`for`の`break`大切！と思ったが、今回の場合は`if`ではじかれているだけだった様子。

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