OmniAICreator/Qiita-1.07M huggingface dataset:
ウィルスと闘ってみた。その3

#概要
開発用のXPが、どうにも調子が悪い。
ウィルスと闘ってみた。
エッセンシャルで、salityが検知、駆除できるか、実験してみた。

#きっかけは
gpsカーコンテスト事務局から、「お前のアプリ、動かないよ。」のご報告を頂いた。
android開発環境のwindows7ノートを動かして、コードを眺めてた。
sppで文字化けなんて、俺の問題じゃねえよと言ってたら、デフェンダーが、見慣れたフレーズを吐いた。
document and settings \ ** \localseting\Temp\
salityじゃね。
salityて、７にも、入るの。
ウィルスにかまっている暇は無いので、安易な方法を獲った。

#実験の趣旨
salityに侵入されたwindow7に後から、エッセンシャルを入れて、検知、駆除できたら、ラッキー。

#結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/ee8a2a77-0f2f-59ff-72db-6edf96129b05.png)


#結論
salityに侵入されたwindow7に後から、エッセンシャルを入れて、検知、駆除できる。

以上
Next.js を Firebase hosting で動かしてSSRする

いわゆるサーバーレス。

## TL;DR

すべてのリクエストを Firebase Functions に流して next.js に食わせた結果を返すとSSRになる。最高。

## 概要

Firebase Hosting は index.html を上げたら動いてくれる静的サイトホスティングだと思っていたが、 全てのルーティングを Firebase functions に全て受けさせる。こともできた 

GCP知らない人向けに 一応解説しておくと Firebase Function = Google Cloud Function ≒ AWS Lambda

そんでもって、React で SSR したいとき、スクラッチでもいいけど、一番簡単なのは next.js。next.js 公式にも exmaples があり、読んでみたら勉強になったので解説してみる。

https://github.com/zeit/next.js/tree/master/examples/with-firebase-hosting

## Firebase Hosting の設定

```json:firebase.json
{
  "functions": {
    "source": "functions"
  },
  "hosting": {
    "public": "public",
    "rewrites": [
      {
        "source": "**",
        "function": "next"
      }
    ]
  }
}
```

デフォルトだと public/index.html を返すと指定してある部分を、全部のリクエストを Function に食わせるようにする。
次に、指定された next の Function の設定。

```js:functions/index.js
const functions = require('firebase-functions')
const next = require('next')

var dev = process.env.NODE_ENV !== 'production'
var app = next({ dev, conf: { distDir: 'next' } })
var handle = app.getRequestHandler()

exports.next = functions.https.onRequest((req, res) => {
  console.log('File: ' + req.originalUrl) // log the page.js file that is being requested
  return app.prepare().then(() => handle(req, res))
})
```

これは Function の定義以外は next.js を 他の node フレームワークに食わせる部分とだいたい一緒。Google Cloud Function の req, res は node の 標準リクエスト、レスポンスオブジェクトとだいたい一緒で(厳密には違う or 互換が明言されてなかった気がするが)、next.js がこれを食えばそのまま動く。

```js:app/pages/index.js
import React from 'react'
export default () => <h1>Hello SSR</h1>
```

これで SSR しつつクライアントでReactのアプリとして状態を引き継げるわけ。

## この example のややこしかった点

https://github.com/zeit/next.js/blob/master/examples/with-firebase-hosting/app/next.config.js#L2

app/ と functions/ が別にpackage.json を持ってて別パッケージなんだけど、 app/ で `next build` すると、 functions/next にビルドされて、デプロイされた function は functions/index.js から `functions/next/*` のビルド結果を読み取って返す。

webpack などと違って外部ライブラリまではビルドされてないので、使うライブラリは両方とも npm install しておく必要があった。ちょっと面倒臭い。（し、ちゃんとスケルトン書けば解決しそうではある）

## 感想

Cloud Function で HTML 返せば書き味は普通のWebアプリに近くなる。
応答性とかは、やっぱしばらくアクセスなくてスリープしてると遅い。スケールはしそう。

認証もFirebaseに組み込まれてるし、Firestore っていう Mongo っぽい DB 生えたし(枯れてないけど)、プライシング気にしなければたぶんこれが最速サーバーレス構築だと思います。本番に耐えうるかは実測してみないと知らん。
1.2.1 エディーター、IDE (C++からのプログラミング入門

# はじめに
プログラミング言語を自分のパソコンで動かすためには、そのための環境が必要になります。例えば、プログラミング言語を機械語に変換するコンパイラーなどをご自身のパソコンにインストールしたり、プログラミング言語を書きやすくするためのエディターまたはIDEが必要になります。この環境構築はプログラミングを始めるうえで面倒な作業で、なかなか難しいものです。詰まったり、わからなくなったら諦めずこの記事にコメントを投稿するか、Googleで検索して他の記事を参考にしながら頑張っていきましょう。

# すること
今回することは２つです。
1. プログラムを記述、編集する**エディターまたはIDE**をインストールする。
2. プログラミング言語を機械語に変換（コンパイル）するための**コンパイラー**をインストールする。

## 1.エディターやIDE
エディターやIDEとは、プログラミング言語を書いたり編集したりするためのものです。つまるところプログラミング言語もただの文字の集合なのでメモ帳でも問題はありません。ですが、メモ帳では複雑なプログラムは見にくく、不便です。そのためプログラミング言語を書くため専用のメモ帳があります。一般的な機能としてシンタックスハイライト（文字に色を付けてくれる）などでプログラミング言語を見やすく書きやすくしてくれます。IDE(Integrated development environment)はただのエディターではなく他に補助的な役割がたくさんついてます。簡単な文法の間違いなどを指摘してくれたり、実際にプログラミング言語を走らせるためのコンパイラーもついています。

## 2. コンパイラー
それぞれのプログラミング言語に応じたさまざまなコンパイラーがあります。これはそのプログラミング言語を機械語の変換してくれるものです。C++にもさまざまあります。Macの方はデフォルトで用意されているので特にすることはありません。windowsもデフォルトでありそうですが、どうなんですかね...

# エディターもしくはIDE
では実際にプログラムを書いていくエディターをインストールしましょう。こちらもいろいろ種類があり甲乙付け難いですが。僕はプログラミングを始める上ではエディターの性能はかなり大事だと考えてます。なぜなら、しっかりとしたものであればエラーがあるところに線を引いてくれエラーメッセージがでます。そのためつまらなくていいところで変につまりににくく、モチベーションも著しくさがることはありません。今回紹介するのは全て無料なものですが、僕自身使ったことはないのですがお金に特にこだわらない人は先程の理由からも有料なものもかなりおすすめです。（参考 [mac](http://www.webcyou.com/?p=7142)、[windows](https://eng-entrance.com/free_texteditor_windows)）

## Xcode(Mac)
![1200x630bb.jpg](https://qiita-image-store.s3.amazonaws.com/0/114543/431981fe-ea5c-3a4d-0c4a-b5c9b53d259c.jpeg)

これはアップルがだしているIDEになります。一般にはObjective CやSwifitなどを使用してMacのアプリやiPhoneのiosアプリを開発するのに使用されますが、MacのC++の開発でも決してマイナーではありません。Appleが好き！というそんなあなたにおすすめです。本チュートリアルでは、こちらで進めていきます。

**-----------Xcodeにお前にきめた！↓-----------**
[1.2.2 Xcodeのインストールと簡単な使い方 (C++からのプログラミング入門](https://qiita.com/Naggi-Goishi/items/0f02aad433f2ce796326)
**----------------------------------------------**
Go irisで速攻Webアプリ

# ゴール
Goのweb framework irisでwebアプリを起動する。

# やりかた
## 1. Goのインストール
インストーラ: https://golang.org/dl/

## 2. irisでサーバ起動
以下コピペ

```bash
# irisを入手
go get -u github.com/kataras/iris

# プログラムを配置
cat << EOF > main.go
package main

import "github.com/kataras/iris"

func main() {
	app := iris.Default()

	app.Handle("GET", "/", func(ctx iris.Context) {
		ctx.HTML("Hello Go world!\n")
	})

	app.Run(iris.Addr(":10080"))
}
EOF

# 起動
go run main.go &

# テスト
curl http://localhost:10080/
```

# Link
[Go lang](https://golang.org)
[iris](https://iris-go.com)
PostgreSQLで優先制御

PostgreSQLプロセスの実行優先度を制御する方法のひとつに、[pg_cheat_funcs](https://github.com/MasaoFujii/pg_cheat_funcs)が提供するscheduling_priorityパラメータがある。今回は、このパラメータによるPostgreSQL上での優先制御の効果を確認する。

scheduling_priorityは、pg_cheat_funcsが提供するパラメータで、PostgreSQLプロセスの優先度(nice値)を指定する。この優先度は、SET文でセッション単位やALTER ROLE SET文でユーザ単位など、様々な単位で設定できる。scheduling_priorityの詳細については、pg_cheat_funcsのREADMEを参照すること。

優先制御の効果の確認では、以下2つの測定パターンにおけるpgbenchの測定結果を比較する。

1. 優先度が同じであるユーザfoo1とfoo2のそれぞれで同時にpgbenchを実行する
   - foo1とfoo2の優先度が同じであることから、それぞれのpgbenchの測定結果は同程度となることが推測される。
2. ユーザfoo2の優先度を下げて、優先度が異なるユーザfoo1とfoo2のそれぞれで同時にpgbenchを実行する
   - foo1がfoo2より優先度が高いことから、pgbenchの測定結果は、foo2よりfoo1のほうが高性能となることが推測される。

# pg_cheat_funcsの導入

```bash
## pg_cheat_funcsをインストール
$ wget --no-check-certificate https://github.com/MasaoFujii/pg_cheat_funcs/archive/master.zip
$ unzip master
$ rm -f master
$ cd pg_cheat_funcs-master
$ make USE_PGXS=1 PG_CONFIG=/opt/pgsql-X.Y.Z/bin/pg_config
$ make USE_PGXS=1 PG_CONFIG=/opt/pgsql-X.Y.Z/bin/pg_config install

## pg_cheat_funcsをPostgreSQLがロードするようにパラメータ設定
$ emacs $PGDATA/postgresql.conf
shared_preload_libraries = 'pg_cheat_funcs'

## 設定変更を有効化するためPostgreSQL再起動
$ pg_ctl -D $PGDATA restart
```

# 測定準備
```bash
## ユーザfoo1とfoo2の作成
$ createuser -s foo1
$ createuser -s foo2

## pgbench初期データの作成
$ pgbench -i -s100
$ psql -c "VACUUM ANALYZE"
$ psql -c "CHECKPOINT"
```

# 測定パターン1の実施
```bash
## ユーザfoo1とfoo2で同時にpgbenchを実行
### foo1とfoo2の優先度はデフォルトの0のまま
$ pgbench -c 4 -j 4 -T 30 -n -S -U foo1 postgres &
$ pgbench -c 4 -j 4 -T 30 -n -S -U foo2 postgres &
```

# 測定パターン2の実施
```bash
## ユーザfoo2の優先度を最低の19に設定
### foo1の優先度はデフォルトの0のまま
$ psql -c "ALTER ROLE foo2 SET pg_cheat_funcs.scheduling_priority TO 19"

## ユーザfoo1とfoo2で同時にpgbenchを実行
$ pgbench -c 4 -j 4 -T 30 -n -S -U foo1 postgres &
$ pgbench -c 4 -j 4 -T 30 -n -S -U foo2 postgres &
```

# 測定結果
## 測定パターン1
優先度が同じであるfoo1とfoo2では、pgbenchの測定結果が同程度となった。

| ユーザ | 優先度 | トランザクション処理件数 | 平均レイテンシ(ms) | スループット(tps) |
|:-:|:-:|:-:|:-:|:-:|
| foo1 | 0 | 247,870 | 0.488 | 8,195.2 |
| foo2 | 0 | 248,460 | 0.487 | 8,214.3 |

## 測定パターン2
優先度が高いfoo1のpgbenchの測定結果のほうがfoo2より高性能となった。

| ユーザ | 優先度 | トランザクション処理件数 | 平均レイテンシ(ms) | スループット(tps) |
|:-:|:-:|:-:|:-:|:-:|
| foo1 | 0 | 356,837 | 0.336 | 11,894.1 |
| foo2 | 19 | 136,564 | 0.879 | 4,551.3 |

## まとめ
今回の測定パターンのような条件であれば、pg_cheat_funcsのscheduling_priorityパラメータを使うことで、PostgreSQL上での優先制御をある程度期待できる。
Pythonで時刻を消して日付だけにしたいとき

## はじめに

**2017/10/19 10:54:29** みたいな日付と時刻があるデータを **2017/10/19** みたいな日付だけのデータにしたいとき、少し詰まったのでメモとしてここに残したいと思います。

## strptime()とstrftime()を使う

```.py
import datetime

date = '2017/10/19 10:54:29'
new_date = datetime.datetime.strptime(date, '%Y/%m/%d %H:%M:%S').strftime('%Y/%m/%d')
new_date #=> '2017/10/19'
```

## 追記
下記のコメントより、もっと手軽に分割する方法もあります。

```.py
date = '2017/10/19 10:54:29'
new_date, new_time = date.split()
new_date #=> '2017/10/19'
```


## 参考
[AttributeError: 'str' object has no attribute 'strftime'](https://stackoverflow.com/questions/19887353/attributeerror-str-object-has-no-attribute-strftime)
MacでDocker環境を作った際のメモ

- 1.Docker for Macのインストール
- 2.Docker IDの取得
- 3.Docker Hubよりイメージ取得
- 4.Dockerの起動
- 5.Httpdのインストール
- 6.動作確認

## 1.Docker for Macのインストール
・下記よりダウンロード(大体2分-3分くらい)
　https://docs.docker.com/docker-for-mac/install/
・インストール
## 2.Docker IDの取得
・Docker HubサイトでID取得
　https://hub.docker.com/
## 3.Docker Hubよりイメージ取得
・公開されているイメージの確認
　今回はCentOSを使用
　検索窓でCentOS指定し、Star（人気）順でソート
　今回は「tianon/centos」（上から８個目位）をDL
・イメージのダウンロード
######DockerHubへログイン

```
docker login
```
######DockerHubから好きなイメージをダウンロード
```
docker pull tianon/centos
⇒イメージ名の後に「:バージョン名」を付けると、指定のバージョンをDL
```

## 4.Dockerの起動
・コンテナの作成/起動
######イメージからコンテナを作る
```
docker run -itd --name webap -p 80:80 -p 443:443 tianon/centos
⇒webap：コンテナ名（任意の名前）
```
######コンテナに入る
```
docker exec -it webap bash
```

・コンテナの停止/起動
######コンテナを止める
```
docker stop webap
```
######コンテナを起動する
```
docker start webap
```
######コンテナ起動確認
```
docker ps
```
##5.Httpdのインストール
・コンテナに入りhttpdインストール
######コンテナに入る
```
docker exec -it webap bash
```
######httpdインストール
```
yum httpd
```
######httpd起動
```
service httpd start
```

##6.動作確認
・コンテナ起動時のポートを指定してアクセス確認
　http://localhost:ポート番号/
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第六章 ドメインオブジェクトのライフサイクル10(リポジトリ その4) 

[その1](https://qiita.com/YasuhiroKimesawa/items/54a2adbc79bfc062e3f4)、[その２](https://qiita.com/YasuhiroKimesawa/items/713d79b196424103ba62)、[その3](https://qiita.com/YasuhiroKimesawa/items/30191b32e8603f14a2b0)の続きです。

# ファクトリとリポジトリの関係

リポジトリも格納されたオブジェクトを再生成するのでファクトリとの違いに迷うことがある。
ファクトリは新しいオブジェクトを生成する。
リポジトリは古いオブジェクトを見つける。

リポジトリはクライアントからは**オブジェクトがメモリ上にあるものと錯覚させなければならない**です。
リポジトリとファクトリの責務は別なのですね。

また、リポジトリがファクトリに生成を移譲することもOKです。

# RDBに合わせてオブジェクトを設計する

RDBとオブジェクトのマッピングについて。
オブジェクトではない構成要素のうち、最も一般的なものがRDB。これにより[パラダイムの混在の問題](https://qiita.com/YasuhiroKimesawa/items/080338e0150d5dad53c9#rdb)が生じる。

> 両者の間にある不整合は、オブジェクトに対して重大な影響を及ぼす可能性がある。(第二部第六章りより)

一般的なシチュエーションは以下のようなケース
1. RDBの主な主な目的が、オブジェクトを格納することである。
2. RDBが、別のシステムのために設計されている。
3. RDBは該当のシステムのために設計されているが、オブジェクトを格納する以外の役割を果たしている。

1の場合はまだやりやすいですね。
両者に顕著な違いがあっても、MyBatisなんかのマッピングツールでなんとかなります。

２、３とかでは、モデルの豊かさを多少犠牲にする必要や、非正規化したりする必要もあるかもしれないです。
さらに、それがレガシーであったり、外部システムからなどから来ているという、嫌なケースも。
そんなときは、２つのドメインモデルが存在しているとみなせることが多いです。
こういったケースについては、第１４章「モデルの整合性を維持する」でこの問題を読んで行く予定。具体的には「腐敗防止層」とかが解決策になるかと思います。

また、性能問題でテーブル構造に変更が入るケースも。
しかし、ドメインモデルとデータモデルが乖離しすぎると大変になっていくので注意。

１つのテーブル行には１つのオブジェクトが基本。
外部キーは、別のエンティティに対する参照に変換されなければならないです。

ユビキタス言語はドメインモデルとデータモデルを結びつけるのに役立ちます。

データモデルのリファクタリングはデータ移行があるせいで、困難なことが多いです。このせいで、ドメインモデル側のリファクタリングが困難になることがあるかもしれない。

ドメインモデルとデータモデルは別物だけど、RDBにモデルを格納する以上、こういったマッピングするための考慮をしていかなければいけないのですね。
SPA を Blob Storage にあげて、Azure Functions をバックエンドにしてみる。

これは大した苦労なくできたが、自分向けへのメモ

Angular 4 で作成した、SPA をプロダクションでビルドする。ポイントは、コンテナ名がもし、`web` だったら次のようにしてビルドする。ローカルPCでテストする時は、`base href` は、`/` になるはずだ。しかし、例えばblob とかにアップロードすると、URL が `https://xxxx.blob.core.windows.net/web/index.html` とかになるだろう。そのため、本番環境では、もしそうなら、`--base-href` フラグをつけて、`base href` を指定しておく。

# プロジェクトのビルド

```
 ng b -prod --base-href /web/
```

すると`dist` ディレクトリ配下にファイルが生成される。

```
$ ng b -prod --base-href /web/
Date: 2017-10-18T15:40:25.216Z                                                t Hash: 8d4581caef41aa5fde78
Time: 16687ms
chunk {0} polyfills.d8d3d78a4deb2ab66856.bundle.js (polyfills) 66.1 kB {4} [initial] [rendered]
chunk {1} main.5c27cd4d6d08e4aeef7c.bundle.js (main) 54.9 kB {3} [initial] [rendered]
chunk {2} styles.0363122755f82fabd526.bundle.css (styles) 52.4 kB {4} [initial] [rendered]
chunk {3} vendor.0a6d7c376a3409d9df1d.bundle.js (vendor) 788 kB [initial] [rendered]
chunk {4} inline.4f1fb8581b76445ec606.bundle.js (inline) 1.45 kB [entry] [rendered]
```
# blob へのアップロード

これらのファイルを blob にアップロードする。私はコンテナ名を、`web` にして、permission は、`blob` にしている。（リードオンリー）

私は、[Azure Storage Explorer](https://azure.microsoft.com/en-us/features/storage-explorer/) を使っている。

# CORS の設定

Azure Functions 側で、CORS の設定が必要。Azure Functions の Function App から、API > CORS を選んで、blob の URL を設定してあげると、SPA から、それらのURLをコールできるようになる。

# 成果

まだ公開できないが、SPA + Azure Functions + Logic App + Cosmos DB によるデモサイトを公開できた。

# 残課題

アップロードは特に難しくなく、すんなり動いたが、いくつか残件があるが、夜遅いのでまた明日。

_TODO_

* https://xxxx.blob.core.windows.net/web/index.html ではなく、https://xxxx.blob.core.windows.net/web でアクセスしたい
* Azure Functions Proxy 経由で使いたい
* minify 化されているが、javascript のコードが読めるので、バックエンドのURLはバレてしまう。

明日はよく知っている人に上記のことを聞いてみよう。
React NativeでNativeのUI Componentを使う（Android編）

サードパーティのNative用SDKのコンポーネントをReactNativeで使いたかったので調べた。公式は英語を読めたとしても説明不足だったり、余計だったり分かりづらいと思う。
当方、Android Java初心者ですので悪しからず。プロパティの設定や、他APIの使用はさらに色々設定が必要。
[iOS編](https://qiita.com/abdonwww/items/378a5e0d841e155e8d64)はこちら。

## 公式ドキュメント
https://facebook.github.io/react-native/docs/native-components-android.html

## 一番シンプルなコード
1. Native ComponentのNameとViewインスタンスを返すManagerクラスの作成。
2. Managerクラス（と他Java module）を取りまとめるPackageの作成。
3. PackageをMainApplication.javaに登録。
4. Managerクラスでつけた名前を指定してJavaScriptから呼び出す。

```ExampleManager.java
package com.example;

import android.widget.TextView;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;

public class ExampleManager extends SimpleViewManager<TextView> {
    public static final String REACT_CLASS = "Example";

    // Component name that will be called from JavaScript
    @Override
    public String getName() {
        return REACT_CLASS;
    }

    // Return the view component instantiated with Activity context
    @Override
    public TextView createViewInstance(ThemedReactContext reactContext) {
        TextView mTextView = new TextView(reactContext.getCurrentActivity());
        return mTextView;
    }
}

```

```ExamplePackage.java
package com.example;

import java.util.Arrays;
import java.util.List;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

public class ExamplePackage implements ReactPackage {
    // Expose Java components to JavaScript
    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
      return Arrays.<ViewManager>asList(
          new ExampleManager()
      );
    }
}

```

```MainApplication.java
public class MainApplication extends Application implements ReactApplication {

    ...

    // Register the new package
    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
          new MainReactPackage(),
          new ExamplePackage() // New
      );
    }

    ...

}

```

``` App.js
import React from 'react';
import { requireNativeComponent } from 'react-native';

const Example = requireNativeComponent('Example', null);

export default class App extends React.Component {
  render() {
    return (
      <Example />
    );
  }
});
```
JavaScript(ECMAScript)での関数の書き方3種


Javascriptについてはほぼ書いてないので。

# 普通の関数

```javascript:普通の関数
function 関数名 (パラメータ, ...) {
	処理
}

```

# 無名関数

```javascript:無名関数
const f = function (パラメータ, ...) {
	処理
}

f(パラメータ)
```

# アロー関数

```javascript:アロー関数
(パラメータ, ...) => {
	処理
}
```
httpでのアクセスをhttpsにリダイレクトする.htaccess記述



```
RewriteEngine on
RewriteCond %{ENV:HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
```

こちらを参照。
https://help.sakura.ad.jp/hc/ja/articles/206054622--htaccess%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%88%B6%E5%BE%A1

こちらの記述だと、リダイレクトループに。

```
RewiteCond %{SERVER_PORT} !443
```
[Swift4] プロパティリスト(.plist)の読み書きまとめ

#はじめに
プロパティリスト(設定ファイル)の読込と書込について色々とハマったので、簡単な例を挙げてまとめた。
なお、nilチェックは省略しています。

#.plistをどこに作成するか
|| 用途 | 作成場所 |備考|
|:-:|:-:|:-:|:-:|
|A| 読取専用 | プロジェクト内 *1| **書込は不可**|
|B| 読取&書込| Documents または Library *2| XcodeからGUIで見られない|
*1 ViewController.swiftやinfo.plistと同じディレクトリ
*2 ディレクトリ構造については[こちら](https://gist.github.com/y-takagi/9f2cea659fb3f55b56aa04530bf0af39)が参考になります

#A 読取専用
1) 　info.plistと同じディレクトリに、sample.plistを作る (XcodeのGUIから)
2) 　swiftで読み込む

```swift

let filePath = Bundle.main.path(forResource: "sample", ofType:"plist" )
let plist = NSDictionary(contentsOfFile: filePath!)
```

#B 読取&書込#
例えば、Documents配下に.plistを作って読み書きする 

1) 　Documents配下にsample.plistを作る

```swift

//登録したいデータ
//NSDictionaryとして作る。 keyは必ずString。
let putData: NSDictionary = ["Name": "ジャイソン・ステイサム", "Age": 50, "isPowerful": true]

//書き込む
let manager = FileManager.default
let documentDir = manager.urls(for: .documentDirectory, in: .userDomainMask)[0]
let url = documentDir.appendingPathComponent("sample.plist")
putData.write(to:url, atomically: true)
```

2) 　読み込む

```swift

//NSDictionaryとして読み込む
let manager = FileManager.default
let documentDir = manager.urls(for: .documentDirectory, in: .userDomainMask)[0]
let url = documentDir.appendingPathComponent("sample.plist")
let plist = NSDictionary(contentsOfFile: url.path)

//値を抜き出して使う
print("名前: ", plist!["Name"])
print("年齢: ", plist!["Age"])
print("強いかどうか: ", plist!["isPowerful"])
```



#参考#
[公式 About Property Lists](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/PropertyLists/AboutPropertyLists/AboutPropertyLists.html)
[iOSでデータを永続化する方法](https://gist.github.com/y-takagi/9f2cea659fb3f55b56aa04530bf0af39)
[Swiftでプロジェクト内のplistを読み込む方法](https://qiita.com/paAr0/items/ec05ee5f3c47bb260274)
[plistを読み込む](http://aretoka-koretoka-soretoka.hatenablog.com/entry/2016/03/27/184154)
リストモナドのdo記法

do記法を使って次のように書くことができて，不思議だと思った．

```
test = do
    a <- [1,2]
    b <- [3,4]
    [(a,b)]

main = print test
```

```:実行結果
[(1,3),(1,4),(2,3),(2,4)]
```

どういうことなのか，自分なりに納得したいと思ったので，調べた．以降，次のコードの動きを説明する．

```
test = do
    [1,2]
    [3,4]

main = print test
```

```:実行結果
[3,4,3,4]
```

# do記法のルール

[Haskll 2010 Language Reportの3.14](https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-470003.14)によると，eが式のときは次の決まりになっている．

- `do {e}`は`e`になる
- `do {e;stmts}`は`e >> do {stmts}`になる

以上の決まりにより`test`は次のものと同じ

```
test = [1,2] >> [3,4]
```

# モナドの`>>`演算子

[ライブラリの説明](https://hackage.haskell.org/package/base-4.10.0.0/docs/src/GHC.Base.html)によると，`>>`は次のように定義されている．

```
class Applicative m => Monad m where
    (>>) :: m a -> m b -> m b
    m >> k = m >>= \_ -> k
```

`m`の値を文脈と呼ぶことにすると，`>>`は文脈を捨てる感じ．モナドは`>>=`(bind)と`return`しかないので，`>>`では`>>=`を使って文脈を捨てる必要があった．

この定義を使うと`test`は次のようになる．

```
test = [1,2] >>= \_ -> [3,4]
```

# リストモナドの`>>=`

[ライブラリの説明](https://hackage.haskell.org/package/base-4.10.0.0/docs/src/GHC.Base.html#%3E%3E)によると，リストの`>>=`の定義は次の通り．

```
instance Monad []  where
    xs >>= f = [y | x <- xs, y <- f x]
```

この文法はList comprehensionで，[Haskll 2010 Language Report](https://www.haskell.org/onlinereport/haskell2010/haskellch3.html)の3.11で解説されている．

この定義を使うと`test`は次のようになる．

```
test = [y | x <- [1,2], y <- [3,4]]
```

以上で`test`は`[3,4,3,4]`になる．
GitHubやBitbucketでフォーク元の変更を取り込む方法


+ 該当のプロジェクトに cd する
+ フォーク元のリポジトリを登録する

upstream のところはお好みで変更。

```
$ git remote add upstream foo@bitbucket.org:bar/hogefuga_project.git
```

その後、フォーク元からの変更を取得し

```
$ git fetch upstream
```

自分のmasterにマージする。

```
$ git merge upstream/master
```
【ionic】プルダウンリストを実装する

子育ての傍ら、ionic2で家計簿アプリを作ってます。
https://qiita.com/irohamaru/items/3df901cd7e12e3c85e9a

その中で、ionic2でプルダウンを実装したいと思ったのですが、ちょっと手間取ったのでメモしておきます。

データはFirebaseに保持されているテーブルから取得するものとします。
（テーブル：koumokuに登録された各データを取得してリスト表示する）


![スクリーンショット 2017-10-18 23.40.48.png](https://qiita-image-store.s3.amazonaws.com/0/186221/4d64980d-39da-c24f-738f-d13fb647b13b.png)

```ts:sample.ts
export class samplePage {
  koumokuList: FirebaseListObservable<any>;

  constructor(public navCtrl: NavController, afdb: AngularFireDatabase) {

    this.koumokuList = afdb.list('koumokuList', {
      query: {
        orderByChild: 'name'
      }
    });
  }
```

```html:sample.html
<ion-item>
  <ion-select [(ngModel)]="koumokuList.name" cancelText="Cancel" okText="OK">
    <ion-option *ngFor="let koumoku of koumokuList | async" [value]="koumoku.name">{{koumoku.name}}</ion-option>
  </ion-select>
</ion-item>
```

結果、こんな感じでプルダウン表示されます。

![スクリーンショット 2017-10-18 23.42.40.png](https://qiita-image-store.s3.amazonaws.com/0/186221/ef365b78-e068-e179-bcb0-254526b9dc67.png)

プルダウン表示された項目を複数選択できるようにするには、ion-selectタグにmultiple="true"をつければ良いようです。

```
<ion-select multiple="true" [(ngModel)]="test"> 
...
</ion-select>
```

項目を選択して、それを登録処理に渡す方法など、何か分かったら追記します。

参考URL
https://stackoverflow.com/questions/45558343/ionic-2-angular-2-get-values-from-ion-select-in-form-to-send-http-post
XCode9でのFastlane/Snapshotの実行

頑張ってたけど動かなくなったので一部解決したことと解決していないことのまとめ

# snapshotって
https://github.com/fastlane/fastlane/tree/master/snapshot
これですね
fastlaneのツール群の一つでアプリのスクショを自動で取ってくれてhtml化して一覧で見れるようにしてくれます。
XCode7からはXCUITestが追加されたことでそれを使ってスクショを取っています。
こちらの記事が導入の参考になります
https://qiita.com/tamaki/items/f5e9f9985a91fb6a0f06

# XCode9
2017年の9月にでました。
UITest周りにいくつか修正が入っています
詳しくはこちら
http://shashikantjagtap.net/hands-xcuitest-features-xcode-9/
その影響？でせっかく作った俺のUITestが動かなくなった！！！！

# snapshot実行すると最後のhtml化するとこでこける
XCode9からXCodeが自動で取ったスクショをテスト終了後に破棄するかどうかを選択できるようになります。
デフォルトで破棄になっています。
XCUITestを使ったスクショはXCode9から明示的にスクショを取るメソッドが用意されましたがそれまではXCodeがよしななタイミングでスクショを取っていました。
fastlane/snapshotでは画面の向きに.unknownを突っ込み強制的にスクショを撮らせるなかなかトリッキーなことをしてました
実際に撮らせていたのはこのコード
```
XCUIDevice.sharedDevice().orientation = .Unknown
```
画面の向きが変わる時にスクショを取る法則を逆手に取ったコードですね
このコードを呼ぶ直前に
```
snapshot:\(画像名)
```
というテキストを出力していましたのでスクリプトでsnapshot:を探してその直後の画像をhtmlにするみたいな仕組みだと思います。
話は戻りますがなので結局のところsnapshotを実行して取った画像もXCodeが自動で取ったスクショの一部なのでテスト実行後に削除されてsanpshotのスクリプトで失敗するという具合です。

プロジェクトのEdit Scheme>Test>Optionsに
<img width="330" alt="スクリーンショット 2017-10-18 23.21.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/162318/8d3f18d9-f185-a557-864a-2d8feb8f7e00.png">
こんな感じでチェック項目があるのでDelete when each test succeedsのチェックを外しましょう
またその上のCapture srrenshots automaticallyのチェックを外すとそれはそれでテストが失敗します。
Fastlaneのissueにもこの対応が載ってました
Fastlane/Snapshotが一刻も早く純正のsnapshotメソッドの成果物を使うように修正することを願ってます

# Viewの裏にあるボタン(Cell)はタップできない
僕の扱っているアプリでは一部部分だけ透過したViewがTableViewにかかっているレイアウト担っています。
透過部分は下にあるTableViewのセルをタップすることができます。
UITestのレコーディング機能を使ってる時はタップできます。
しかしいざUITestを実施するとタップすることができずクラッシュします。
XCode8ではこの動作が可能だったのでなにかViewの構造解析で手が加わったのかと思います。
回避策としては一度スクロールしてViewと被らない位置までタップしたいCellを移動させてからTap()すると正常に動作しました。

# iPhone2017-A~Cというsimulatorが生まれる

```
sanpshot reset_simulators
```
コマンドを実行すると
iPhone2017-A,-B,-Cという名前のsimulatorがいつのまにか作られます
fastlaneにissueが過去挙げられてました
https://github.com/fastlane/fastlane/issues/10354
reset_simulatorsコマンドは実行するとシミュレーターのリセットをした後デフォルトのシミュレーターリストにあるものの再生成を行いますがそこにその名前でそれぞれ

```
iPhone2017-A -> iPhone8
iPhone2017-B -> iPhone8 Plus
iPhone2017-C -> iPhoneX
```
で載ってるみたいです。なのでそこの名前が変わらないことにはこのままみたい
fastlaneのissueでは「それが一体何が問題なんだい？」的なスタンスで締めくくられてissueがクローズされてましたんでしばらくこのままみたい

# TabBar,ToolBarのボタンをtap()しても遷移しないことがある（未解決）
これがクッソむかつくのと頭を悩ませています。
２回に一回くらいでコレ起因でクラッシュしています。
要素がないのかと思ってブレイクポイントをうって確認するとボタンは存在しているタップも実行されているなのに画面遷移しない・・・・
しかもだいたいブレイクポイントを打っている時は正常に動くという
遅延しているだけかと思いsleepを入れても変わらず....泣きそう....
もし同様の動作になったことがある方で対応策を見つけた方がいればコメントくださいorz


# あとがき
UITest最近ちょっと力入れてやって見てますが奥が深い
アプリのUITestは探り探りな部分がまだまだ多いですね....
継続的な運用をどうすればいいのか、いい設計はこれだというものを知っている方が入ればぜひコメント等で教えてください
UITestでなく、ユニットテストについても色々教えてくださいmm
NVR700W をSIPサーバ的に使う


# はじめに

NVR700W をはじめとするネットボランチシリーズには、NTTのフレッツルーターのようにIP電話やVoIPアダプタを子機としてぶら下げる機能がありません。

電話機やFAXをルーターから離れた場所に置きたい場合、電話だけならコードレス対応のアナログ親子機を使うことで対処できますが、FAXプリンタを別の部屋に置きたい場合は割と頭を悩ませてくれる相棒です。。

# SIPが無ければカスケードを使えばいいじゃない

SIPサーバとなることは出来ませんが、NVR700W には「カスケード接続」機能が搭載されています。
カスケード接続を使用することでLAN内に複数あるルーターのうちの 1 台が他のルーターのTELポートおよびアナログ回線 / ISDN回線のアナログ通話を一括管理することができます。

別のルーターを電話子機扱いできるので、これを使うことで子機１台あたりアナログポートを２つ増設したように見せられます。

カスケード接続は、親機となる管理ルーターを含めて９台以内とする必要がありますので、子機として使えるルーターは最大８台となります。組み合わせるルーターはネットボランチシリーズに限定されますが、RT57i / RT58i / NVR500 / NVR510 / NVR700W 等の比較的古いモデルから最新のモデルまでカスケード接続することが出来ます。

※RT58i / NVR500 / NVR700W の組合せでカスケード接続できることを確認。

RT58i あたりはネットオークションで比較的安価に入手できるので、LANポートにギガが欲しい等のこだわりがなければカスケード子機用として調達してみるのも良いと思います。押入で休眠させている人はぜひ引っ張り出してみてください。

# NVR700W をカスケード親機にする

NVR700W をカスケード接続の親機にします。
ダッシュボード＞詳細設定＞IP電話＞カスケード接続　と設定画面を開いて「カスケード接続モードの設定」へ進み、接続モードを「アナログ親機モード」とします。

既にカスケード子機として設定されたルーターがLAN内にあれば、「カスケード接続している機器の一覧」に表示されてくるはずです。

※子機の設定後、必要に応じて子機毎の内線番号と外線発信のプレフィックスを設定してください。

# ネットボランチシリーズのルーターを子機にする

NVR500 を子機として設定してみます。
RT58i でも設定画面は似たり寄ったりなので、手順はほぼ同じです。

NVR500のトップ画面から、電話の設定＞TELの共通設定＞カスケード接続の設定　と設定画面を開き、次の設定を行ってください。

- 機器間アナログ通話モードの設定を「アナログ子機」に
- 通信可能なアナログ親機としてNVR700WのIPアドレスを

アナログ親機は通常「自動」の設定でIPアドレスが検出されますが、うまく検出されない場合は手動で設定してください。親機側で「カスケード接続している機器の一覧」に表示されるようになれば、動作可能な状態になっているはずです。

子機側への外線番号割り当て、外線から子機側への着信などは親機側で別途設定を行ってください（ひかり電話など）。

子機側のルーターからntpやアップデートサイトにアクセスできるようにしたければ、各ルーターにデフォルトゲート等のルーティングを追加してください。RIPプロトコルを有効にすることで解決できるかもしれませんが、当方環境だとRIPを有効にした状態でカスケード接続していると外線発着信のおかしくなることが度々あったので（親機再起動で直るがしばらくするとまた再発するような状況）RIPを使わずルーティング追加で対応しています。

# 参考情報

[カスケード接続機能の設定](http://www.rtpro.yamaha.co.jp/RT/manual/nvr700w_nvr510/cascade/cascade_chapter.html)
[RIP の設定](http://www.rtpro.yamaha.co.jp/RT/manual/nvr700w_nvr510/ip/ip_rip_concept.html)
[Rust] Ironで1ファイルWebアプリを実現する


IronでWebアプリ書いてクロスコンパイルして、ラズパイとかに送り込んで実行する際、jsやcssファイルが実行形式の中に入ってたらいいかも、ということで実際にやってみた。

~~追記：ほぼ同目的のパッケージがすでにcrate.ioに上がってました（https://crates.io/crates/include_dir）~~
後述してますが、Ironのハンドラまで含めて作ってみたので興味あれば使ってみてください。
https://crates.io/crates/embed_staticfile

# ディレクトリに対して`include_bytes!()`を実行するコンパイラプラグイン`include_dir!()`を作った

https://github.com/maueki/include_dir.rs

rust標準で[`include_bytes!()`](https://doc.rust-lang.org/std/macro.include_bytes.html)というコンパイラプラグインがある。
これは引数のファイルをコンパイル時に読み込んでバイト配列にしてくれるものである。
今回作ったマクロは引数ディレクトリ内ファイルのパスとバイト配列をHashMapに入れて返す`include_dir!()`というコンパイラプラグインである。

# 1ファイルWebアプリ実装

https://github.com/maueki/iron-onefile

```rust
#![feature(plugin)]
#![plugin(include_dir)]

extern crate iron;
extern crate router;
extern crate mount;
extern crate conduit_mime_types as mime_types;
extern crate hyper;

#[macro_use] extern crate lazy_static;

use iron::prelude::*;
use iron::status;
use mount::Mount;
use std::collections::HashMap;
use std::path::Path;
use hyper::mime::Mime;

lazy_static! {
    static ref ASSETS: HashMap<String, Vec<u8>> = include_dir!("../assets");
    static ref MIME_TYPES: mime_types::Types = mime_types::Types::new().unwrap();
}

fn request_assets(req: &mut Request) -> IronResult<Response> {
    let path:String = req.url.path().pop().unwrap().to_string();
    match ASSETS.get(&path) {
        Some(b) => {
            let mut res = Response::with((status::Ok, b.as_slice()));

            let mime_str = MIME_TYPES.mime_for_path(Path::new(&path));
            let _ = mime_str.parse().map(|mime: Mime| res.set_mut(mime));
            Ok(res)
        },
        None => {
            Ok(Response::with((status::NotFound)))
        }
    }
}

fn main() {
    let mut mount = Mount::new();

    mount.mount("/assets/", request_assets);

    Iron::new(mount).http("localhost:3000").unwrap();
}
```

`ASSETS`に`include_dir!()`で作ったパス文字列とバイト配列のHashMapが格納されている。
`request_assets()`ではリクエストのパスが`ASSETS`にあれば内容を返し、なければ404を返している。
`MIME_TYPES`はパスからContentTypeを判定するたしレスポンスにセットするために使用している。

ビルドするとassets以下が取り込まれた実行形式が作成される。

**追記(2017/10/25): 上記コードは include_dir_bytes ver0.1でのみ有効。ver0.2からは`HashMap<&'static Path, Vec<u8>>`を返すようになった。**

# 追記(2017/10/20): ハンドラ部分もlib化した

https://github.com/maueki/embed_staticfile.rs

Cargo.tomlのdependenciesを追加して

```
[dependencies]
include_dir_bytes = "0.2"
embed_staticfile = "0.2"
```

次のように書ける

```rust
#![feature(plugin)]
#![plugin(include_dir_bytes)]

extern crate iron;
extern crate mount;

extern crate embed_staticfile;

use iron::prelude::*;
use mount::Mount;
use embed_staticfile::EmbedStatic;

fn main() {
    let mut mount = Mount::new();
    mount.mount("/assets/", EmbedStatic::new(include_dir!("../assets")));

    Iron::new(mount).http("localhost:3000").unwrap();
}
```

# 課題

## `cargo build`をassets以下の変更に対応させたい
小さなプロジェクトなら[cargo-do](https://github.com/pwoolcoc/cargo-do)で`cargo do clean, build`すいればいいか
数理最適化によるパズルの解法

# 数理最適化によるパズルの解法

[PyConJP2014のTalk](https://pycon.jp/2014/schedule/presentation/23/)の内容をAzure Notebooksで簡単に実行できるように、Githubの[opt4puzzle](https://github.com/SaitoTsutomu/opt4puzzle)に公開しました。

45種類のパズルをPythonによる[組合せ最適化](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)モデルを使って解くことができます。

## 必要なもの

- インターネット環境とブラウザ
- Microsoftアカウント ([ここ](https://www.microsoft.com/ja-jp/msaccount/)から無料で作成してください)

## 実行できる45種類のパズル

カックロ | ののぐらむ | 美術館 | ナンバーリンク | 覆面算
:--|:--|:--|:--|:--
不等式 | ビルディングパズル | ウォールロジック | 波及効果 | ナンバースケルトン
スリザーリンク | 四角に切れ | ましゅ | 橋をかけろ | のりのり
ブロックパズル | タイルペイント | 因子の部屋 | 黒どこ | 推理パズル
ひとりにしてくれ | へやわけ | ペイントエリア | 数コロ | パイプリンク
クリーク | アイスバーン | サムライン | カントリーロード | カナオレ
フィルマット | シャカシャカ | ヤジリン | ぬりかべ | ホタルビーム
ステンドグラス | さとがえり | スケルトン | 数独 | OhNo!
ABCプレース | ボンバーパズル | チョコナ | フィルオミノ | スターバトル

(一部二コリの登録商標です)

## 実行方法

- [Microsoft Azure Notebooks](https://notebooks.azure.com/)をブラウザで開き、Sign inしてください。
- 上の「Libraries」をクリックし、「New Library」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13955/087b0a8b-442a-1703-7b82-2d47a8378ff8.png)

- 「From Github」を選び、Github repositoryに「SaitoTsutomu/opt4puzzle」を、Library NameとLibrary IDに「opt4puzzle」を入力し「Import」ボタンを押してください。
- 好きなパズルをクリックして開いてください。Jupyter Notebookが立ち上がります。
- 「Cell」メニューの「Run All」を実行してください。

### 実行例(ボンバーパズル: BomberPuzzle.ipynb)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13955/1fbc894c-8fd6-f196-2be2-0d5805a3bb06.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/13955/cbb52bb2-e0dd-5885-d391-96be02c06874.png)

- だいたい数十行ぐらいのプログラムで、瞬時に実行できます(一部、時間がかかるものもあります)。

## 参考

- [パズルでみる組合せ最適化のテクニック](https://qiita.com/SaitoTsutomu/items/f05f4ff05d4ce6099ff3)
- [最適化におけるPython](https://qiita.com/SaitoTsutomu/items/070ca9cb37c6b2b492f0)

以上
WebARGUS

#　__WebARGUSについて__

![image.png](https://qiita-image-store.s3.amazonaws.com/0/183599/7e554655-3a0a-02eb-987c-bb736933aae0.png)__WebARGUSとの出会い__
　とある場所で初めてWebARGUSに触れました。いろいろ操作してみて思ったことを書いてみようと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/183599/7e554655-3a0a-02eb-987c-bb736933aae0.png)__WebARGUSとは__
　[DIT社](https://www.ditgroup.jp)が開発した製品で簡単にざっくり言うと改ざんを検知すると、1秒以内にアラートを通知し、
　復旧までしてくれるソフトウェアです。
* * *
![](https://webargus-jp.ditproducts.com/user_data/packages/default/img/wagaiyou0715.jpg)
* * *

![image.png](https://qiita-image-store.s3.amazonaws.com/0/183599/7e554655-3a0a-02eb-987c-bb736933aae0.png)__ここでは他社製品と比較しない__
　改ざん検知ツールといえば、「TRIPWIRE」・「Site Keeper」・「GRED」等がありますが、
　それぞれのツールで長短があるため一概に改ざん検知ツールといえばこれというものはないです。
　改ざん検知ツールは、導入する環境と要件に合わせて選択すれば良いと思います。あとはお金・・・

![image.png](https://qiita-image-store.s3.amazonaws.com/0/183599/7e554655-3a0a-02eb-987c-bb736933aae0.png)__仕様__
　WebARGUSはManager/Agent構成となりWindowsはWindows専用Manager、LinuxはLinux専用Managerが必要となる。
　OS別でManagerが必要となるのは、致し方ないのかもしれない。。。
　性能的なところでいけば、AgentをインストールしたサーバのCPU使用率は1%未満の上昇しかなく、
　他のサービスに影響がない感じでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/183599/7e554655-3a0a-02eb-987c-bb736933aae0.png)__費用__
　1Agent、1Managerで1年ライセンス48万だそうです。高いかも知れませんが大事な情報を守るとなると程よい価格なのかも
　知れません。
　https://webargus-jp.ditproducts.com/user_data/products/price.php

![image.png](https://qiita-image-store.s3.amazonaws.com/0/183599/7e554655-3a0a-02eb-987c-bb736933aae0.png)__構築__
　ManagerとAgentを別々のサーバにインストールしてみたわけですが、すごく簡単にインストールでき、
　すごく簡単に監視設定などできました。難しく考える必要がなかったですね。
　あと良い点としては、Agentインストール時の再起動が不要だってことですね。小さなことですが本番サービス提供中の
　サーバに対してインストールする際、再起動が必要なアプリケーションはエンジニアにとって嫌な要素の一つですよね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/183599/7e554655-3a0a-02eb-987c-bb736933aae0.png)__最後に__
また触る機会がありそうなので、面白い情報(仕様)があったらQiitaに投稿してみたいと思います。
サンシャイン池崎ゲームリゾルバを作ってみた。

#TL;DR
ここで稼働しています。
https://www.saiuma.com/sunshine

#最近、サンシャイン池崎ゲームなるものが考案されたらしい。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ムスメ5歳とゲームを考えた。<br>題して「サンシャイン池崎ゲーム」。<br>ルールはシンプル。歌を歌って「い」がついたら、「イェー！」に変えるだけ。<br>ムスメ5歳「おおきなのっぽの古どけイェー！、おじイェー！さんのとけイェー！！」<br>げらげら笑った。</p>&mdash; ジウ (@ziuziu) <a href="https://twitter.com/ziuziu/status/918070729341587457?ref_src=twsrc%5Etfw">2017年10月11日</a></blockquote>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">仕事で疲れて帰ってきたら、「ムスメ5歳と遊んでいたサンシャイン池崎ゲームをサンシャイン池崎がやっている」という世にも奇妙な世界に辿り着いた。（敬称略です）</p>&mdash; ジウ (@ziuziu) <a href="https://twitter.com/ziuziu/status/918855010695254017?ref_src=twsrc%5Etfw">2017年10月13日</a></blockquote>

ゲームが出来たらリゾルバが欲しくなるのはエンジニアの性ですので、さくっと作りましょう。

#コード解説

コード全体はGithubに置いてあります。
https://github.com/nak1114/docker-sinatra-sunshine

さくっと作るため通いなれたsinatraで作りました。
RDBが無いのでRailsはお休みです。
日本語の読みかたを知るためMecabを使っています。
Mecab-Ruby間はnatto gemを使わせてもらいました。

それぞれのインストールは [Dockerfile](https://github.com/nak1114/docker-sinatra-sunshine/blob/master/Dockerfile) に書いてあります。

コードの肝は以下の部分です。
改行コードなどを除いて"い"と読める単語があったら全てカタカナに直して、最後に一括で"イェー！"に変換です。うん単純だ。
ちなみに`@refescape`はTweeter投稿用のパラメータです。

```ruby:app.rb
  post '/sunshine' do
    text=params[:text]
    ret=""
    nm = Natto::MeCab.new
    text.each_line do |line|
      nm.parse(line.chomp) do |n|
        sp=n.feature.split(",")[7]
        if sp && sp.include?("イ")
          ret+=sp
        else
          ret+=n.surface
        end
      end
      ret+="\n"
    end

    @title="サンシャイン池崎ゲームリゾルバ(結果)"
    @restext=ret.gsub("イ","イェー！")
    @refescape=URI.encode_www_form({"text"=>@restext})
    slim :sunshine
  end
```

#あとがき

こんなの誰か作るだろうと思っていたけど、くだらなすぎて誰も作っていないみたいだったので速攻で作りました。
MecabとRubyの組み合わせは初めてですが全然簡単でした。先人たちの踏破した道は楽でいいですね。
AWS　載ってそうで載ってないネタいろいろ

# こんばんは
初めまして。神谷です。インフラエンジニアとしては半年目。AWSばかり触っております。

## AWSを操作できない!!
今の職場ではAWSを自由に触れないのですが、仕事内容はAWSの調査。web情報だけが頼りです。
webだけじゃ判らない事は、家に持ち帰って、自宅で試しています。そう、意外と実機を触らないと判らない事、多いですね。
webに載ってそうで載ってない(或いは判りにくい)、そんなノウハウをメモっておきます。僕と同じ事で躓いた事がある人に向けて。未来への自分に向けて。

## AWS CLIのDefault output が None
いきなり「そんな環境あるのか」と思われるかもですが、あるんです。はい。
家に帰って「どうやってそんな環境作ろうかなー」とまず悩み。新しいOSアカウント作るのも考えたのですが、.aws/credentialの中の「output」の行を削除した後、aws configure。
Default outputの欄に何も入力せずにリターン。
で、出力した結果……Json形式でした。
ちなみにその状態でリダイレクトを保存、aws configureを再び実行しDefault outputにJsonを指定して同じコマンドをリダイレクトで保存。
２つのファイルでdiffを取ってみました。差分ゼロ。
AWSさんには、Noneとかいう状態をそもそも無くして欲しいです。None=Jsonなら、Noneとかいう状態無くしてしまってJsonに統一しときゃいいと思うんですけど。２つの状態管理するのも面倒じゃね？

## EBSのIOPSについて
汎用SSDの話です。
1GBにつき3IOPSっぽい。つまり100GBなら300IOPS。
汎用SSDは、IOPSが自動で決まってしまい、操作できない。
だから汎用SSDで作る容量が決まれば、イコールIOPSも決まっちゃう。

## aws cliに指定するパラメータについて
--queryなんですけど、公式的には''で挟むのが推奨されております。が、まぁ、シェルの動作を知っていれば「何で挟んでもええやろ」になりますわね。
[TZUser@ip-xx-xx-xx-xx ~]$ echo aws ec2 describe-instances --query "Reservations[*].Instances"
aws ec2 describe-instances --query Reservations[*].Instances
[TZUser@ip-xx-xx-xx-xx ~]$ echo aws ec2 describe-instances --query 'Reservations[*].Instances'
aws ec2 describe-instances --query Reservations[*].Instances
ダブルコーテーションで括っても、シングルコーテーションで括っても、結果変わらず。
ふむ。
ではでは。
[TZUser@ip-xx-xx-xx-xx ~]$ echo "'a'"
'a'
[TZUser@ip-xx-xx-xx-xx ~]$ echo '"a"'
"a"
にゃるほど。リソースに"が出て来る場合は'で括った方がよさげ。

## 終わりに
こんなの誰かの役に立つのか？
自分が欲しい情報だったので書いたまでですが。

未来の自分が、一度調べたんだけど忘れちゃってーみたいな時の備忘録にしかならない気がします。うん。
PSReadLine で PowerShell を bash のキーバインドにする

# PSReadLine について
Version3以上のPowerShellに対応した、GitHub上で開発されているPowerShellモジュールです。
詳細は以下のURLから確認できます。
https://github.com/lzybkr/PSReadLine

# 出来ること
* キーバインドのカスタマイズ（いわゆるbashと同じEmacs風に出来ます）
* シンタックスエラーがカーソル（>の部分）の色で分かる
* Bashっぽい補完（ちょっと違う）
* Bashっぽい履歴検索
* その他色々あるらしい

# インストール方法
1. Windows+x → a で管理者権限でPowerShellを起動
2. ```$ Install-Module PSReadlin``` を実行
3. 指示に従ってインストールを完了させる
4. 管理者権限のPowerShellのまま、 ```Set-ExecutionPolicy -ExecutionPolicy RemoteSigned```を実行する（設定ファイルの読み込みのため）。
5. ```C:\Users\[ユーザー名]\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1``` に以下の内容を記述。

```ps1
Import-Module PSReadLine # モジュールの有効化
Set-PSReadlineOption -EditMode Emacs # Emacs的なキーバーインドを有効化
```

# 使い方
通常通り PowerShell を起動すると、有効化された状態で使えます。

## キーバインドの確認
```ps1
Get-PSReadlineKeyHandler
```
で現在のキーバインドを確認する事ができます。
上記の設定ファイルの場合は、通常のbashと同じ感覚で操作できます。

## ファイル名の補完について
完全に bash 等と同じ感覚で使うことが出来ます。
たまに入力していた文字が消えることがありますが、発生条件は謎です。

## 関数・コマンドの補完について
Tabで補完候補を表示しますが、補完選択はCtrl+Spaceを使う必要があります。つまり、入力中Tabで確認し、補完候補が十分少なくなったらCtrl+Spaceを押して十字キーで補完対象を選択します。
補完対象が1つしかない場合は、Tabで完全に補完します。

## 日本語の表示
補完候補に全角文字が含まれている場合は表示が崩れるようです。

# 所感
補完機能が微妙に惜しい。しかし、通常の状態から比べると、非常に便利になるのでおすすめです。
【MySQL】コマンド一発でマイナーバージョンまで確認する

MySQLにログインした後、以下のコマンドを実行すると・・・。

```SQL
select version();
```
こんな風に:arrow_down:マイナーバージョンまでしっかり出力されます。
簡単ですね:exclamation:

| version()|
|:----------:|
| 5.7.11-log|

リリースノートに掲載されてない不具合もあるので、マイナーバージョンまでしっかり揃えておく方が無難ですよー:smiley:
（最近、こういう↑不具合にはまってたので・・・）
毎度deviceの設定とかめんどいのでテンプレ化


## はじめに
なんどdeviceの設定をしただろうか。
もう二度と同じことはしたくない。
そんな思いから作りました。

## 環境
Rails5.0.6
Ruby2.4.0
device4.3.0	

## テンプレでやったこと

- deviseの基本
- ユーザーネーム追加
- viewsカスタマイズ
- 日本語化

## ソース

https://github.com/manzen/rails-device

## 使い方

1 プロジェクトをclone
2 プロジェクト名を変更
3 application.rbを修正

```config/application.rb
require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module RailsDevice # ←ここを任意のプロジェクト名へ
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.
  end
end


```

4 session_store.rbを修正

```config/initializers/session_store.rb
# Be sure to restart your server when you modify this file.

Rails.application.config.session_store :cookie_store, key: '_rails-device_session'# アプリ名の部分を変更

```

5 database.ymlを修正

```config/database.yml
# MySQL. Versions 5.0 and up are supported.
#
# Install the MySQL driver
#   gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
#   gem 'mysql2'
#
# And be sure to use new-style password hashing:
#   http://dev.mysql.com/doc/refman/5.7/en/old-client.html
#
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password:
  host: localhost

development:
  <<: *default
  database: rails-device_development # アプリ名の部分を変更する

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: rails-device_test # アプリ名の部分を変更する

# As with config/secrets.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password as a unix environment variable when you boot
# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full rundown on how to provide these environment variables in a
# production deployment.
#
# On Heroku and other platform providers, you may have a full connection URL
# available as an environment variable. For example:
#
#   DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase"
#
# You can use this database configuration with:
#
#   production:
#     url: <%= ENV['DATABASE_URL'] %>
#
production:
  <<: *default
  database: rails-device_production # アプリ名の部分を変更する
  username: rails-device # アプリ名の部分を変更する
  password: <%= ENV['RAILS-DEVICE_DATABASE_PASSWORD']  # アプリ名の部分を変更する%>

```

6 rails s
7 http://localhost:3000/users/sign_up へアクセス

## 最後に

誤りや、追加の要望があればコメントいただけると嬉しいです。
Qiitaの記事をWordPressブログに同期できるようにしてみた

# はじめに
最近、Qiitaへの投稿が多くなった分、個人ブログへの投稿が少なくなってしまいました。
(QiitaだとブログよりもPV数が多くてコメントも付きやすい。楽しい!)

そのため、ブログをチェックしてくれている知人からは「ブログが更新されてない。投稿したものがまとまっていたら何やってるかわかりやすいのに…」と言われ。

この機会にQiitaの記事をブログ(WordPress)に同期できる仕組みを作ってみました。
主な特徴は次の2つ。

* Qiitaに投稿した記事は自動でブログのトップページ(記事一覧)に反映
* ブログでQiita記事をクリックするとQiitaへジャンプするように

やってみた結果はこんな感じ。
<img width="720px" src="https://qiita-image-store.s3.amazonaws.com/0/135313/94c21c6f-319f-ba32-2698-94b2f38c9a64.jpeg">

Qiita記事だとわかりやすいように、Qiita記事のサムネイルではなくQiitaロゴ画像をサムネイルにしました。

以下は、やり方の説明です。

# 1. Qiita記事をWordPressのDBへ同期
いろいろ調査した結果、RSS Feedの内容をWordPressに同期してくれるプラグインFeedWordPressがいい感じでした。Feedの内容をそっくりコピー、またはリンクにするなど、いろいろ高性能です。

[FeedWordPress](https://ja.wordpress.org/plugins/feedwordpress/)

設定は次のサイトを参考。
<http://it-tantou.com/361/>

基本的には、デフォルトの設定で利用できるはず。ただ、「Custom Post Type」でデフォルトと異なる項目を選択すると、投稿の種類が一般記事と異なるため、同期されたQiita記事がブログのトップ画面に表示されません。「Normal WordPress posts」を選択するようにしましょう。
<img width="600px" src="https://qiita-image-store.s3.amazonaws.com/0/135313/a361772d-79d5-3ba4-a30d-f6d5335977fd.jpeg">




## 【注意点】 WP Qiitaを利用してる場合
次の記事で紹介されているQiitaとWordPressを連携するプラグインWP Qiitaを利用している場合は要注意。
<https://qiita.com/ka215/items/5112a76df0426a5b0af1>

QiitaとWordPressを連携してくれるありがたいプラグインなのですが、このプラグインで同期するとWordPressのDBにQiita記事用テーブルが作られます。このテーブルがあるとFeedWordPressの挙動がおかしくなり、ブログのトップ画面にQiita記事が表示されない場合があります。

私は場合は、WP Qiitaをアンインストールしても、FeedWordPressを再インストールしてもダメでした。結局、DBを直接操作して、既に入ってしまったQiita記事を全て削除しました。その後、FeedWordPressで再同期するとうまくいきました。


# 2. Qiita記事のサムネイル設定
デフォルトの設定では、Qiita記事に画像が入っている場合、その画像がサムネイルとして扱われます。ただし、それだと、通常のブログ記事とQiita記事の区別がつきません。

今回は、Qiita記事には専用のサムネイル画像を表示するようにしました。

以下はSimplicityというWordPressテーマにおける変更点です。
Simplicityの場合、トップ画面の各記事表示は`entry-card.php`で行われています。各記事のサムネイル表示部分を以下のように変更。

```php
<?php else: //大きなサムネイルカードの場合 ?>
    <?php if(strpos(get_permalink(),'qiita.com') !== false): // Qiita記事の場合 ?>
        <a href="<?php the_permalink(); ?>" class="entry-image entry-image-link" title="<?php the_title(); ?>"><img src="http://blog.icchi.me/wp-content/uploads/2017/10/qiita-logo-640.png" width="320px" alt="Qiita" class="entry-thumnail" /></a>
    <?php else: // Qiita記事でない場合 ?>
        <?php if ( has_post_thumbnail() ): // サムネイルを持っているとき
            //サムネイル画像の縦横比を保存するかどうかで取得するサムネイルを変化
            $thumb = ( is_list_style_tile_thumb_cards_raw() ? 'thumb320_raw' : 'thumb320') ?>
            <a href="<?php the_permalink(); ?>" class="entry-image entry-image-link" title="<?php the_title(); ?>"><?php the_post_thumbnail($thumb , array('class' => 'entry-thumnail', 'alt' => '') ); ?></a>
        <?php else: // サムネイルを持っていないとき ?>
            <a href="<?php the_permalink(); ?>" class="entry-image entry-image-link" title="<?php the_title(); ?>"><img src="<?php echo get_template_directory_uri(); ?>/images/no-image-320.png" alt="NO IMAGE" class="entry-thumnail no-image list-no-image" /></a>
        <?php endif; ?>
    <?php endif; ?>
<?php endif; ?>
```

# 現状の問題点

* 同期したQiita記事にはカテゴリが設定できない
* 記事の概要は取得できるもののHTMLタグが含まれているため非表示
  * phpの取り除き関数でうまく処理できない

価値がありそうなら、いつかアップデートしてみます。
Scannerクラスの標準入力でハマったので記録

#hasNext()メソッドについて

Codeなんちゃらというクイズサイトに挑戦してみた。
下記はその時作った回答。
ScannerクラスでhasNext()メソッドではまってしまった。
標準入力をスキャンの対象として実行する時に、hasNext()関数は標準入力の最後にCtrl+zで入力をちゃんと終了させてあげないとfalseを返しません。よって、ちゃんと終了をしてあげないとループから抜け出ません。

これにずっと気付かないままかなり時間くった・・・。

以上

```
package questions;

import java.util.Scanner;

class Main {
	public static void main(String[] args) {
		int count = 1;
		int member = 0;
		String input = null;
		double resultAvgs[] = new double[12];

		try{
			Scanner scanner = new Scanner(System.in);

			// resultAvgs[]へ格納
			while(scanner.hasNext()){
				input = scanner.nextLine();
				resultAvgs[member] = calcAvrg(input);
				member += 1;
			}

			for(int i=0; i<member; i++){
				for(int j=0; j<member; j++){
					if(i==j){
						continue;
					}else{
						if(resultAvgs[i] >= resultAvgs[j]){
							// 少ない値があれば順位を一つ落とす
							count += 1;
						}
					}
				}
				System.out.println(count);
				// 初期化
				count = 1;
			}

			scanner.close();

		}catch(NullPointerException e){
			e.printStackTrace();
		}
	}

	// レース結果を読み込んで調和平均を算出
	static double calcAvrg(String in) {
		double total = 0;
		String[] results = in.split(" ", 0);

		for (String result : results) {
			double buff = 1 / Double.parseDouble(result);
			total += buff;
		}

		return results.length / total;
	}
}
Vsftpdの設定（FTP接続時のパスを任意のパスに変更、chroot）

#FTPとは
File Transfer Protocol(ファイル・トランスファ・プロトコル)の略で、クライアントからサーバーに対してファイルをuploadする際のプロトコルのこと。基本的に使われるポートは20番か21番。
20番では、データ転送用のコネクションを張ります。データの送受信が行われる。
21番では、コントロールコネクションを張ります。ログインや転送方法が行われる。



#FTPのモード（アクティブモード・パッシブモード）
接続の方向で、下記２つのモードで接続を行います。

##アクティブモード
サーバーからクライアントに対して、コネクションを張る。
20番と21番のみのポート開放でOK。

##パッシブモード
クライアントからサーバーに対して、コネクションを張る。
1024/TCP以上の範囲でポートを開放する必要があります。

このモードは、ファイアウォールのアウトバウンドやインバウンドの設定次第で使い分けていきます。
基本的には、パッシブモードで運用されることが多いようです。
→クライアントから接続をしに行くため、ファイアウォールに引っかからないことが多い。
※あまりアウトバウンドって制御しませんよね。


#今回vsftpdの設定でやりたいこと
①FTPで接続した際のディレクトリを任意のディレクトリに変更する
②FTPユーザーは、OSユーザーを利用
③FTPユーザーは、他のFTPユーザーのディレクトリを参照不可
④パッシブモードで設定する
⑤パッシブモードで使うポートの範囲を制限する

#Vsftpdの設定（/etc/vsftpd/vsftpd.conf）

```
# vi /etc/vsftpd/vsftpd.conf ※コメントアウトのぞいてます。
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=002
dirmessage_enable=NO
xferlog_enable=YES
connect_from_port_20=NO
xferlog_std_format=NO
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_local_user=YES　★③FTPでアップロードしたディレクトリ以外は参照不可！
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
ls_recurse_enable=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=NO
pasv_enable=YES
pasv_addr_resolve=YES
pasv_address=IPアドレス
pasv_min_port=65000　★⑤パッシブモードで使用するポートの最小値
pasv_max_port=65535　★⑤パッシブモードで使用するポートの最大値
use_localtime=YES
force_dot_files=YES
user_config_dir=/etc/vsftpd/conf　★①ユーザー毎にFTP接続先を任意の場所に変更！
userlist_file=/etc/vsftpd/user_list
allow_writeable_chroot=YES　★③chrootを設定する先に、書き込み権限を付与する場合は必要！
```

#ユーザー毎の設定(/etc/vsftpd/conf/ユーザー名)※ユーザー毎の設定ファイルパスは、vsftpd.confで指定している。

```
# vi /etc/vsftpd/conf/test
local_root=/var/ftp/test　★一行のみ記載。ここに書いたパスが、FTP接続時に接続できるパスになります。
```
Python で、switch 文のマネをする

#switch は書けないし、とはいえ if else はカッコ悪くて書きたくない！
C++を普段使っている人が遭遇しやすい状況かなと思います。
そう思う人も、そう思わない人も、まずは例を挙げてみますね。
##if else によるカッコ悪い分岐
```py3:qiita.py
from enum import Enum

class Color( Enum ):
    R = 0
    G = 1
    B = 2

def callback_r():
    print( "callback_r" )
    pass
    
def callback_g():
    print( "callback_g" )
    pass
    
def callback_b():
    print( "callback_b" )
    pass
    
def callback_default():
    print( "callback_default" )
    pass

def switcher( color ):
    if color == Color.R:
        callback_r()
    elif color == Color.G:
        callback_g()
    elif color == Color.B:
        callback_b()
    else:
        callback_default()
```
教科書通りのコードですが、これを書いてみていやな感じがしました。
どうにも冗長性を排除できず、バグが入り込む余地を多分に残しているように思えます。
switcher メソッドに少し手を加えてみます。
##関数テーブルを用いたシステマティックな分岐
```py3:qiita.py


def switcher( color ):
    tbl = {}
    tbl[ Color.R ] = callback_r
    tbl[ Color.G ] = callback_g
    tbl[ Color.B ] = callback_b
    
    for c in Color:
        if c == color:
            return tbl[ c ]
            
    return callback_default
```

分岐の条件になるキーと、実行されるべきメソッドが必ず１対１となるような構造に変更しました。
これは分岐処理の途中で関係のないコード片を挿入される心配が一切ないことを意味します。
また間違ったメソッドが対応付けされていたとしても関数テーブルを定義しているコードブロックを確認すればすぐに気づくことができます。