OmniAICreator/Qiita-1.07M huggingface dataset:
日本語テーブル名・カラム名のデータベースをLaravelで扱う

# 日本語テーブル名・カラム名のデータベースをLaravelで扱う

SQL Server+AccessのシステムをPHP+MySQLにリプレースする仕事を受けてデータベースを調査していたのですが、テーブル名もカラム名の日本語のデータベースで、苦労するかなと思いましたが、小さな動くサンプルを作って検証したところすんなり動きました。そのサンプルのメモです。

## テーブルの作成

以下のようなテーブル「顧客」を作成します。

|顧客|
|:---|
|顧客コード|
|名前|
|住所|
|電話番号|

まずマイグレーションファイルを作ります。

```
php artisan make:migration create_顧客_table --create=顧客
```

`database/migrations/xxxx_create_顧客_table.php`が出来るので、`up`メソッドにカラムを追記します。

```php
    public function up()
    {
        Schema::create('顧客', function (Blueprint $table) {
            $table->increments('顧客コード');
            $table->string('名前');
            $table->string('住所');
            $table->string('電話番号');
            $table->timestamps();
        });
    }
```

マイグレーションを実行します。

```
php artisan migrate
```

## モデルの作成

```
php artisan make:model 顧客
```

`app/顧客.php`ができるので、以下を追記します。

```php
class 顧客 extends Model
{
    protected $table = '顧客';
    protected $primaryKey = '顧客コード';
    protected $guarded = ['顧客コード']; 
}
```

デフォルトの命名規則で作るとテーブル名が「顧客s」になり不自然なので、`$table`でテーブル名を指定します。プライマリキーのデフォルトも`id`から日本語に変更します。

## ルートの作成

`routes/web.php`を書きます。

```php
<?php
use App\顧客;
Route::get('/', function () {
    return view('index', ['顧客達' => 顧客::all()]);
});
Route::post('/', function () {
    顧客::create(request()->toArray());
    return redirect('/');
});
```

一覧と新規追加のみです。

## ビューの作成

`resources/views/index.blade.php`を書きます。

```html
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>顧客管理</title>
</head>
<body>
<form method="post">
    {{ csrf_field() }}
    名前<input name="名前"><br>
    住所<input name="住所"><br>
    電話番号<input name="電話番号"><br>
    <button>登録</button>
</form>
<table>
    <tr><th>顧客コード</th><th>名前</th><th>住所</th><th>電話番号</th></tr>
    @foreach ($顧客達 as $顧客)
        <tr>
            <td>{{ $顧客->顧客コード }}</td>
            <td>{{ $顧客->名前 }}</td>
            <td>{{ $顧客->住所 }}</td>
            <td>{{ $顧客->電話番号 }}</td>
        </tr>
    @endforeach
</table>
</body>
</html>
```

これで実行すると、一覧と新規投稿が動くと思います。

## 最後に

SQL Server、MySQLともに普通に日本語のテーブル名・カラム名が使えました。
PHPでも普通に日本語の識別子が使えます。
[Cinema 4D] function of check all object in scene

A function of check all object in the scene with multiple hierarchies.

```
def GetNextObject(obj):

    if obj.GetDown():
        obj = obj.GetDown()
        return obj

    if obj.GetNext():
        obj = obj.GetNext()
        return obj
    
    while obj.GetUp():
        obj = obj.GetUp()
        if obj.GetNext():
            obj = obj.GetNext()
            return obj

    return False
```
npm link を使い、複数の JavaScript モジュールを並行で開発する

JavaScirpt を使ったアプリケーションの開発において、
依存関係のある復数のモジュールを並行で開発する状況はよくあると思います。
そのような状況の手助けをしてくれるコマンドが [`npm link`](https://docs.npmjs.com/cli/link) です。

## 例

モジュール(A, B)を並行開発中に、B が A を必要としている状況があるとします。

A を少し変更するたびに npm publish したり、A のコードを B/node_modules/A 以下にコピーするのは辛いので `npm link` でリンクを作成し解決します。


まずは、A のディレクトリに移動し `npm link` を実行します。

```sh
cat package.json | jq '{name}'    # Aのモジュール名を確認(この例では"A")
> { "name": "A" }

npm link
> /usr/local/lib/node_modules/A -> ~/workspace/A
```

これにより `~/workspace/A` が `/usr/local/lib/node_modules/A` にリンクされます。

次に、B のディレクトリに移動し `npm link A` を実行します。

```sh
npm link A
> ~/workspace/B/node_modules/A -> /usr/local/lib/node_modules/A
```

これで `~/workspace/A` が `~/workspace/B/node_modules/A` にリンクされます。

これで A と B を並行で開発できます。

## コマンドパス

また、 ~/workspace/A/package.json に `{ "bin": "./cli.js" }` といった記述(コマンドラインツールのパス等)がある場合は、こちらも一緒にリンクが作成されます。
> `~/workspace/A/cli.js` が `~/workspace/B/node_modules/.bin/cli.js` にリンクされます。

また 環境変数 PATH に `./node_modules/.bin` を追加しておくと、`./node_modules/.bin/cli` とすべきところを `cli xxx` で直接呼び出す事が可能になります(グローバルインストールされているかのように振る舞わせる事が可能になります)。

```sh
export PATH="./node_modules/.bin:$PATH"
```

PATH の追加設定は `npm link` の使用に限らず、常に設定しておくと幸せになれます。
Pythonのジェネレータのnextメソッドについて

# 問題の背景
Pythonのイテレータの一種にジェネレータなるものがあるらしい。
よし、どういう動作をするのか確かめてみよう。
参考になるページも見つけたし、早速やってみるか。

[参考にさせて頂いた記事]
[Pythonのイテレータとジェネレータ](http://qiita.com/tomotaka_ito/items/35f3eb108f587022fa09)


# エラーになったコード

``` my_generator.py

def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
gen.next()
gen.next()
gen.next()

```
・想定した結果
1
2
3

・現実の結果
AttributeError: 'generator' object has no attribute 'next'

・環境
Python3.6


# 原因
AttributeErrorってまず何やねんってレベルなのでひとまず検索。
すると早速素晴らしい記事を発見。

[参考にさせて頂いた記事]
[Pythonエラー一覧（日本語)](http://qiita.com/soutarrr7/items/84e529d87aa3b3a9adcb)

こちらの記事によると

> # Attribute系(AttributeError)
> `AttributeError: 'X' object has no attribute 'Y'`
> 'X'オブジェクト(Xにはstrやmoduleなどの型名が入ります)は'Y'という属性なんて持ってないよ！
> 本当にXはYという属性を持っているか、スペルミスしていないか確認しましょう。

そもそも**Attribute**ってPythonの文脈では**「属性」**って訳するんですねえ。

ということは　**オブジェクト'gen'　が　属性'next'　を持っていないことが原因**といえるようですね。


# 解決方法を探る
## そもそもオブジェクト'gen'って何者？
さらっと

```
gen = my_generator()
```

なんて書いてるけど、`my_generator()`って関数だよね？
じゃあ型は何やねーん、ってことで調べた。

```
gen = my_generator()
type(gen)
```

結果
`<class 'generator'>`

generatorクラス……聞いたことがなかったですね。

## generatorクラスのメソッド
[Python3.6.1のドキュメンテーション](https://docs.python.jp/3/reference/expressions.html?highlight=generator#generator.__next__)によると、generatorクラスには以下のメソッドがあるようです

> ```
> generator.__next__()
> generator.send(value)
> generator.throw(type[, value[, traceback]])
> generator.close()
> ```

`generator.next()`じゃなくて`generator.__next__()`なのか！

これで解決できそうですね


# 修正後
``` my_generator.py

def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
gen.__next__()
gen.__next__()
gen.__next__()
```

・結果(理想＝現実)
1
2
3

解決！

ちなみに**Python2系だと`next()`メソッドが正しい**ようですね。
それを知らずPython3系の環境にコピペしたのが間違いでした。


# 結論
**Python3系**において、**generatorクラスの、関数を実行するメソッドの名前は`next()`ではなく`__next__()`**


　　
　　
　　
初学者らしいつまずきを初学者らしく克服できてよかったと思います。



ここまで読んでくださってありがとうございました！
Polycom SoundPoint IP電話機 出荷時設定への戻し方

#デフォルトの「456」パスワードが機能しない場合の対処方法
微妙なところでハマったので手順を書いておきます。
（ネットオークション等でIP電話機を入手した場合、Adminパスワードはたいてい変更されており、出荷時設定にリセットしてくれている業者は少ないと思うのでメモとして残しておきます）

## Polycomの電話機の場合、パスワード456は次のような場合に有効です。

1. 電話機がブートサーバー上にあり、再起動していない場合
2. 電話機がブートサーバー上にあり、管理ポータルからプロビジョニングされていない場合
3. 電話機が自分の管理下のブートサーバーにない場合

> 456を使用してPolycomを事前に設定した場合、または新しいPolycomを購入した場合は、セキュリティのためにパスワードが更新されている可能性があります。
管理ポータルにログインすることで、Polycomパスワードを見つけることができます。
「リソース」を選択します。
対象のIP電話機のMACアドレスをクリックしてください。
そこに、対象のIP電話機にアクセスするために使用できる4桁のパスワードが表示されます

<pre>注： 使用済み電話機を購入した場合、パスワード456は、以前のユーザによって変更された設定によっては機能しない場合があります。</pre>

## 管理者パスワードを変更する場合は、次の手順を実行します。

1. 管理者パスワードをリセットしたい電話機のMACアドレス（シリアル番号）を探します。<br>（MACアドレスの例は0004F2xxxxxxです）。
<pre>注： MACアドレスは電話の背面/下部の機器ラベルにあります。
またはIP電話機のボタン操作 "Menu" => "Status" => "Platform" => "Phone" を押してMACアドレスを確認できます。</pre>

2. 電源を落として電話機を再起動します（10までカウントを外してから再び接続します）。
3. 電話機の電源がオンになっている間（この手順を完了するのに約5-10秒かかります）、Updater / BootROMのカウントダウン処理中に次のキーを同時に押し続けます。
 - SoundPoint IP 320,321,330,331,335,430,450、SoundStation IP 5000と7000、およびSoundstation Duo：[1],[3],[5],[7]のキーを押し続けます
 - SoundPoint IP 301,501,550,600,601、および650とVVX 1500の場合：[4],[6],[8],[*]キーを押し続けます
 - SoundStation IP 6000：[6],[8],[*]キーを押し続けます
 - VVX 300,310,400,410,500、および600の場合：[1],[3],[5]キーを押し続けます
<pre>注： 「アプリケーションの読み込み」が表示され、画面にカウントダウンが表示されない場合は、 「キャンセル」を選択すると、カウントダウンが表示されます。<pre>

4. 管理者パスワードの入力を求めるメッセージが表示されるまで数秒間押し続ける。
5. 電話機のMACアドレスを入力します（大文字と小文字は区別されません）。 
 この手順を実行する前に、MACアドレスを書き留めておいてください。
 アルファベットと数字を切り替えるには、次のいずれかを試してください：
 - Soundpoint IPの電話画面の[ 1/A/a ]表記のすぐ下にある機能キーまたは[ # ]ボタンを押します。
 - VVXシリーズではアルファベットと数値を切り替える"モード"を押し下げる
 <br><br>
 **SoundPint IPの `アルファベット` 入力はちょっとわかりづらいです。**<br>
 `IP331`の場合、1行目の「PASSWORD」表示の前に`123` `Abc` `abc`と表示されます。<br>
 `IP430`の場合、1行目の「PASSWORD」表示の後に`1/Ascii` `A/Ascii` `a/Ascii`と表示されます。<br>
 例えば`IP331`でパスワードに`[c]`(小文字)を入力する場合は`abc`が表示されるまで`#`を押して、`2` `2` `2`とボタンを押します。<br><br>

6. デフォルトの管理者パスワード「456」で電話にログインし、電話機を設定できるようになりました。
7. 出荷時設定に戻した後は、手動でサーバータイプとサーバーアドレスを入力する必要があります。
<pre>注： 上記のキーコードの組み合わせを使用するか、OnSIP用にすでに設定されている電話機で[デバイス設定のリセット]を使用すると、「暗号化解除の設定エラー」が発生するか、プロビジョニングが失敗する可能性があります。
電話を復旧するには、管理ポータルのリソースにアクセスし、左下のボックスで、[Factory Reset]ボックスの[Reset Key]をクリックし、電話機を再起動します。</pre>

##### IP電話機のプロビジョニング方法は以下を参照
[VoIP-Info.jp Wiki](http://www.voip-info.jp/index.php "VoIP-Info.jp Wiki")
[VoIP-Info.jp Wiki -Polycom-](http://www.voip-info.jp/index.php/有線系IP電話機#Polycom "VoIP-Info.jp Wiki -Polycom-")
[VoIP-Info.jp Wiki -Polycom プロビジョニング-](http://www.voip-info.jp/index.php/Polycom_プロビジョニング "VoIP-Info.jp Wiki -Polycom プロビジョニング-")
強引にBash On Ubuntu On Windows上でjuman++をインストールする

# juman++をBash on Ubuntu on Windowsでどうしても使いたい！
juman++とBash on Ubuntu on Windows(BoW)とは何かの細かい説明は他にまとまってる記事が存在するので省略します。

どうしてもBoW上でjuman++を動かしたい！Docker上ではやだ！という方向けです。

標準の状態でコンパイルするとセグフォして落ちるため、そのエラーが落ちる箇所を飛ばします。

ソースの改変を伴うので何らかのエラーが出る可能性があります。
多分メモリを大量に消費するか、使用するファイルサイズが大きくなるという予想ですが・・・。
修正するところは3つのファイルで計3箇所です。

* src/feature_vector.h
* src/pos.h
* src/rnnlm/rnnlmlib_dynamic.cpp

そのうち *```bip::managed_mapped_file::shrink_to_fit```* という関数を3つのファイルでそれぞれコメントアウトしてください。
この関数は[boostの説明による](http://www.boost.org/doc/libs/1_55_0/doc/html/boost/interprocess/basic_managed_mapped_file.html)と引数のファイル？変数？を縮小させます。
boostの1.64.0バージョンではBoW上でこの関数を実行しようとするとセグフォします。

変更を行ったうえでmakeするときちんとコンパイルが通るはずです。
言語別fakerまとめ

## はじめに :rocket: 
fakerはテストデータを作成する時などに使用できるライブラリです。

```rb:example.rb
Faker::Name.name      #=> "Christophe Bartell"

Faker::Internet.email #=> "kirsten.greenholt@corkeryfisher.info"
```

様々な言語でライブラリが存在するようだったので、まとめてみました。

Twitter: [@y_tsubuku](https://twitter.com/y_tsubuku)

## Ruby
[stympy/faker](https://github.com/stympy/faker)

## Python
[joke2k/faker](https://github.com/joke2k/faker)

## PHP
[fzaninotto/Faker](https://github.com/fzaninotto/Faker)

## Java
[DiUS/java-faker](https://github.com/DiUS/java-faker)

## Go
[icrowley/fake](https://github.com/icrowley/fake)

## Swift
[vadymmarkov/Fakery](https://github.com/vadymmarkov/Fakery)

## C♯
[slashdotdash/faker-cs](https://github.com/slashdotdash/faker-cs)

## JavaScript
[Marak/faker.js](https://github.com/marak/Faker.js/)

## Elixir
https://github.com/igas/faker
Gitbookを使ってみる

# もうこりごり
Wordでのドキュメント作成にもうこりごりなわけですよ。。。

# 環境
- CentOS7
- NPM 4.2.0
- Node.js v7.10.1

# 手順
## Node.jsのインストール
```shell-session:必要なパッケージのインストール
 yum install -y gcc-c++ make
```

```shell-session:Node.js7.xのリポジトリを追加
curl -sL https://rpm.nodesource.com/setup_7.x | sudo bash -
```

```shell-session:Node.jsのインストール
yum install -y nodejs
```

## GitBookのインストール
```shell-session:Gitbookのインストール
npm install gitbook-cli -g
```

## Gitbookプロジェクトの作成
```shell-session:Gitbook用のディレクトリを作成
mkdir gitbook-test
```

```shell-session:Gitbookの作成
gitbook init
```

```shell-session
tree
.
├── README.md
└── SUMMARY.md

0 directories, 2 files
```

```shell-session:Gitbookプロジェクトの起動
gitbook serve
Live reload server started on port: 35729
Press CTRL+C to quit ...

info: 7 plugins are installed
info: loading plugin "livereload"... OK
info: loading plugin "highlight"... OK
info: loading plugin "search"... OK
info: loading plugin "lunr"... OK
info: loading plugin "sharing"... OK
info: loading plugin "fontsettings"... OK
info: loading plugin "theme-default"... OK
info: found 1 pages
info: found 0 asset files
info: >> generation finished with success in 0.8s !

Starting server ...
Serving book on http://localhost:4000
```

```shell-session:起動後のファイル構成
tree
.
├── README.md
├── SUMMARY.md
└── _book
    ├── gitbook
    │   ├── fonts
    │   │   └── fontawesome
    │   │       ├── FontAwesome.otf
    │   │       ├── fontawesome-webfont.eot
    │   │       ├── fontawesome-webfont.svg
    │   │       ├── fontawesome-webfont.ttf
    │   │       ├── fontawesome-webfont.woff
    │   │       └── fontawesome-webfont.woff2
    │   ├── gitbook-plugin-fontsettings
    │   │   ├── fontsettings.js
    │   │   └── website.css
    │   ├── gitbook-plugin-highlight
    │   │   ├── ebook.css
    │   │   └── website.css
    │   ├── gitbook-plugin-livereload
    │   │   └── plugin.js
    │   ├── gitbook-plugin-lunr
    │   │   ├── lunr.min.js
    │   │   └── search-lunr.js
    │   ├── gitbook-plugin-search
    │   │   ├── lunr.min.js
    │   │   ├── search-engine.js
    │   │   ├── search.css
    │   │   └── search.js
    │   ├── gitbook-plugin-sharing
    │   │   └── buttons.js
    │   ├── gitbook.js
    │   ├── images
    │   │   ├── apple-touch-icon-precomposed-152.png
    │   │   └── favicon.ico
    │   ├── style.css
    │   └── theme.js
    ├── index.html
    └── search_index.json

11 directories, 27 files
```

## ブラウザからのアクセス
![Introduction · GitBook.png](https://qiita-image-store.s3.amazonaws.com/0/79134/025d06ed-de13-b15f-0a0f-4be2f2f47ae2.png)

# 感想
これは簡単にできてよさそう！
テンプレートやフォントも自由に変更できて、画像差し込みなども簡単にできるのでこれでドキュメント作成してGitでバージョン管理すると捗りそうだなとおもいましたはい。

# 参考
- [CentOS 7.2にNode.jsをインストールする - Qiita](http://qiita.com/te2u/items/ee8391842397da381e23)
- [Setup and Installation of GitBook](https://github.com/GitbookIO/gitbook/blob/master/docs/setup.md)
遂にFirebase Admin SDK Goが登場！

長らく待っていたFirebase公式のGo SDKが登場しました。

[Introducing Firebase Admin SDK for Go](https://firebase.googleblog.com/2017/08/introducing-firebase-admin-sdk-for-go.html)

# インストール

次のコマンドでインストールできます。

```bash
go get -u firebase.google.com/go
```

# サービスアカウントの鍵の作成

まず認証にはGCPのサービスアカウントを利用します。
https://console.cloud.google.com/iam-admin/serviceaccounts/project?project={projectID}&authuser=0 に アクセスして鍵を作成します。

<img width="1153" alt="スクリーンショット 2017-08-31 11.41.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/15818/620cdfe3-d259-8c1d-af06-edda7e640fb1.png">

ダウンロードした鍵はservice_account.jsonとして保存しました。

# セットアップ

次のコードで鍵ファイルを読み込んでFirebaseのセットアップができます。

```go
import (
	firebase "firebase.google.com/go"
	"google.golang.org/api/option"
)

opt := option.WithCredentialsFile("service_account.json")
app, err := firebase.NewApp(context.Background(), nil, opt)
```

# カスタムトークンの作成

[auth#Client.CustomToken](https://godoc.org/firebase.google.com/go/auth#Client.CustomToken) を利用してカスタムトークンを作成できます。
[カスタムトークン](https://firebase.google.com/docs/auth/admin/create-custom-tokens?hl=en)は自前の認証システムでUserを管理するための仕組みです。詳しくは[ドキュメント](https://firebase.google.com/docs/auth/web/custom-auth?hl=en)を参照してください。

```go
auth, err := app.Auth()
if err != nil {
	panic(err)
}
tok, err := auth.CustomToken("some-id")
if err != nil {
	panic(err)
}
log.Printf("tok = %v", tok)
```

また[auth#Client.CustomTokenWithClaims](https://godoc.org/firebase.google.com/go/auth#Client.CustomTokenWithClaims)を使えばカスタムトークンに任意の値(claims)を含めることができ、この値を使ってRealtimeDatabaseやStorageのセキュリティルールに利用できます。

```go
tok, err = auth.CustomTokenWithClaims("some-id", map[string]interface{}{
	"premium": true, // プランの実装とかに使える
})
if err != nil {
	panic(err)
}
log.Printf("tok = %v", tok)
```

# トークンの検証

[auth#Client.VerifyIDToken](https://godoc.org/firebase.google.com/go/auth#Client.VerifyIDToken) はトークンの検証に使います。ここで検証するトークンはクライアントSDKの[firebase.User#getIdToken](https://firebase.google.com/docs/reference/js/firebase.User#getIdToken)で発行したトークンの検証になるので、先程作成したカスタムトークンの検証はできません。

```go
// ftok is user.getIdToken() response
ftok := ``
t, err := auth.VerifyIDToken(ftok)
if err != nil {
	panic(err)
}
log.Printf("t = %#v", t)
```

# コード全体

https://github.com/k2wanko/tasting-firebase-go/blob/ae9a032/basic/basic.go

```go:basic.go
package main

import (
	"context"
	"log"

	firebase "firebase.google.com/go"
	"google.golang.org/api/option"
)

func main() {
	opt := option.WithCredentialsFile("../service_account.json")
	app, err := firebase.NewApp(context.Background(), nil, opt)
	if err != nil {
		panic(err)
	}
	auth, err := app.Auth()
	if err != nil {
		panic(err)
	}
	tok, err := auth.CustomToken("some-id")
	if err != nil {
		panic(err)
	}
	log.Printf("tok = %v", tok)

	tok, err = auth.CustomTokenWithClaims("some-id", map[string]interface{}{
		"premium": true,
	})
	if err != nil {
		panic(err)
	}
	log.Printf("tok = %v", tok)

	// ftok is user.getIdToken() response
	ftok := ``
	t, err := auth.VerifyIDToken(ftok)
	if err != nil {
		panic(err)
	}
	log.Printf("t = %#v", t)
}
```

# まとめ

現状できることはカスタムトークンを作成とFirebaseトークンの検証をできるだけですが、これからに期待してスターを付けて温かい目で見守っていきます。 :eyes: 

https://github.com/firebase/firebase-admin-go
rollup + babel でGoogle Apps Script


GASを書くのにflowを使いたかったので rollupとbabelつかってみています。(実験的)

主要な設定をメモしときます。
細かいことは他の良質な記事を参照ください。

以下のコマンドでGASのコードを更新できるようにしてます。

```
yarn deploy
```

# 必要な気がするコマンドのインストール

```
npm install -g yarn rollup gapps
```

デフォルトは src だけど srcは普段書きたいコードを起きたいので、gaaps.config.jsonのpathを変更してます。fileIdは各々違います。

```gapps.config.json
{
  "path": "dist",
  "fileId": "xxxxxxxxxxxxx"
}
```

# 設定

デプロイスクリプトの設定

```package.json
{
  "scripts": {
    "upload": "gapps upload",
    "build": "rollup -c",
    "deploy": "yarn build && yarn upload"
  }
}
```

babelってnpmをまとめて一つのファイルにするのにrollupしてみています。
rollup-plugin-gasの説明全然かいてなかったので適当につかっています。

```rollup.config.js
import babel from 'rollup-plugin-babel'
import gas from 'rollup-plugin-gas'
import nodeResolve from 'rollup-plugin-node-resolve'

export default {
  input: 'src/index.js',
  output: {
    file: "dist/index.js",
    format: 'es',
  },
  plugins: [
    nodeResolve({ jsnext: true }), // node_modulesにあるのもくっつけてくれる
    babel({
      exclude: 'node_modules/**'
    }),
    gas(),
  ],
}
```

flowの設定はお好みで。
`modules: false`はいれておかないとbabelがimportを処理してしまう。

```.babelrc
{
  "presets": [
    "flow",
    [
      "env",
      {
        "modules": false
      }
    ]
  ]
}
```

使うモジュールのインストール

```
yarn add -D babel-core babel-preset-env babel-preset-flow rollup-plugin-babel rollup-plugin-gas rollup-plugin-node-resolve
```

# サンプルコード

```src/index.js
global.helloWorld = () => {
  Logger.log("Hello, World")
};
```

# ビルド

ビルドすると`dist/index.js`が生成されます。
こんな感じ

```
var global=this;function helloWorld() {
}

global.helloWorld = function () {
  Logger.log(result);
};
```

importもつかえますが、使えるモジュールは限られるかなと思います。

確認用にis-gasってパッケージを作って公開してみてます。

* [npm is-gas](https://www.npmjs.com/package/is-gas)

# 参考程度のメモ

## Promiseを使う

GASだと同期的に動くのでPromiseを返しそうなメソッドも全部同期的に動作する。
nodeやbrowserでも動くようにコードを書こうとするとPromiseを返すwrapperを用意して挙げた方が良いが、setTimeoutがないのでPromiseの実装が動かない。

以下で適当に対処

```
global.setTimeout = setTimeout(func, time) {
  Utilities.sleep(time)
  func();
}
```

rollupのプラグインでやると使えるライブラリ増えそう (TODO)
とりあえす、es6-promiseでは動いた。

# TODO

* 一から確認してない。次のプロジェクト作る時に確認する
* flow用の型定義がみつけられてないので、なかったらかくかもしれない。
  * つくりはじめた https://www.npmjs.com/package/flow-interfaces-google-apps-script

# 感想

npmからパッケージ持ってきても使えないものが多いのでさほどメリットがなさそう。
flowを使いたいならコメントスタイルでがんばるほうが無難な可能性がたかい。

# 参考文献

* https://rollupjs.org/
* https://www.npmjs.com/package/gas-entry-generator
* http://qiita.com/cognitom/items/e3ac0da00241f427dad6
jQueryでHTMLのテキストを書き換える

書き換えたい箇所のテキストを取得して、正規表現でreplaceで書き換える。

```base.html
<a id="getText">変更前</a>
```
```jquery.js
//var txt = $('テキストを取得したいエレメントを指定').html();
//書き換えるテキストを正規表現で
var txt = $('#getText').html();
$('#getText').html(txt.replace(/変更前/g,'変更後'));
```
csv に SQL

csv ファイルの中身を SQL で検索したいときがたまにある。

[q](http://dev.classmethod.jp/server-side/language/query-textfiles-using-q/) というコマンドが開発されている。ほとんどは grep で何とかなってしまっていたので、まともに取り組んだことはなかったのだけど、気が向いて使ってみた。

そして[中身](https://github.com/harelba/q)を覗いてみたら sqlite を使っている模様。少し調べてみると、今なら [sqlite csv virtual table](https://sqlite.org/csv.html) で役目を果たしそう。ちなみに q が記事で取り上げられたのは 2015-08 で、csv extension がリポジトリに入ったのは 2016-08 ですね。

q みたいに気軽に使うには、bash の関数で環境に置いておけばいいかな。

```bash:.bash_profile
# example:
#  q "select c1 from rootname"
# where columns are "c"+number and tablename from filename "rootname.csv"
function q(){
	FS=""
	for f in *.{csv,CSV}; do
		if [[ "x${f:0:1}" != 'x*' ]]; then
			FS="$FS create virtual table temp.\`${f::-4}\` using csv(filename='$f');"
		fi
	done
	sqlite3 -init <(echo ".load csv") "" "$FS $*";
}
```

opendata でとりあえずササっと解析したいときとか、楽だわー

そのほかの方法は[こちら](http://gootara.org/library/2016/01/csvsql2016w.html)が詳しいです。

# 追記
- [textql](https://github.com/dinedal/textql) 
- [csvq解説記事](https://dev.classmethod.jp/tool/csvq-by-go/)

# 追記2
最近(2024-01-05)は csvkit の [csvsql](https://csvkit.readthedocs.io/en/latest/tutorial/3_power_tools.html#csvsql-and-sql2csv-ultimate-power) が手ごろだと思う。
IntelliJ IDEA pluginのStream Debuggerについて

# 概要

IntelliJ IDEAのStream DebuggerというStream APIのデータの流れを可視化してくれるプラグインがありましたので使用してみました。

**環境**

* Windows10 Professional
* Java 1.8.0_144
* IntelliJ IDEA Ultimate 2017.2
 * Java Stream Debugger 0.1.4

**参考**

* [Java Stream Debugger] (https://plugins.jetbrains.com/plugin/9696-java-stream-debugger)

# Java Stream Debugger

<blockquote class="twitter-tweet" data-lang="ja">
<p lang="ja" dir="ltr">Want an easy way to debug chains of Java 8’ Stream API calls? Try IntelliJ IDEA with <a href="https://t.co/LT5uif5Bsg">http://ow.ly/jT9w30bEY9i</a></p>&mdash; IntelliJ IDEA @intellijidea
<a href="https://twitter.com/intellijidea/status/862961379329888256">2017年5月12日</a>
</blockquote>

## 使い方

デバッグしたいstreamにブレークポイントを設定しdebugモードで実行します。

![s1.png](https://qiita-image-store.s3.amazonaws.com/0/22772/6053efb7-4d51-dc4d-605d-f9ae81c8caa0.png)

Debugパネルに"Trace Current Stream Chain"というアイコンが追加されているのでクリックします。

![s2.png](https://qiita-image-store.s3.amazonaws.com/0/22772/9aaffd96-810d-f198-e455-2a648ce12ada.png)

Stream Trace画面が立ち上がりデータの流れが確認できます。（データ量などによっては表示に時間がかかる場合があります）
表示モードには"Flat Mode"と"Split Mode"があり、画面下のボタンで切り替えができます。
下図は"Flat Mode"です。

```java:サンプルコード
List<String> colors = Arrays.asList(
    "pink", "red", "orange", "brown", "yellow", "green", "blue", "gray", "white", "black", "purple",
    "red", "white", "brown", "pink", "white", "orange", "yellow", "blue", "gray"
);

colors.stream()
    .peek(System.out::println)
    .distinct()
    .sorted(Comparator.comparing(String::length))
    .map(String::toUpperCase)
    .forEach(System.out::println);
```

この図のように中間処理でどのようにデータが扱われているか画面で確認することができます。

![s3.png](https://qiita-image-store.s3.amazonaws.com/0/22772/ac096a01-357b-e05b-bdcf-f08a00cadda3.png)


## インストール

Pluginsを開き、画面下の【Browse Repositories...】ボタンをクリックします。

![p1.png](https://qiita-image-store.s3.amazonaws.com/0/22772/5812caf6-2cc9-9bbb-dcf8-bfcdcd4b8c4e.png)

検索フィールドに"Stream Debugger"と入力してPluginを絞り込みます。
Stream Debuggerが見つかったら、Installボタンをクリックしてインストールします。

![p2.png](https://qiita-image-store.s3.amazonaws.com/0/22772/f08e8692-e4ae-a57c-d11a-6aa126f3f26b.png)

インストールできたらRestartします。


# [Kotlin Sequence Debugger] (https://plugins.jetbrains.com/plugin/10301-kotlin-sequence-debugger)

> A Kotlin extension for Java Stream Debugger plugin.

Stream DebuggerのKotlin拡張pluginもあります。
使い方は同じでデバッグしたいSequenceにブレークポイントを付けてdebugモードで実行し、Debugパネルの"Trace Current Stream Chain"アイコンをクリックします。

```kotlin
listOf(5, 5, 2, 1, 6, 4, 3, 2, 4, 3).asSequence()
    .filter { it % 2 == 0 }
    .distinct()
    .sorted()
    .forEach { println(it) }
```

![st.png](https://qiita-image-store.s3.amazonaws.com/0/22772/7136dab7-cf62-1ca7-8170-58e474f1904d.png)
[rails]do...end周りのエラーでありがちなこと

自分用の振り返りです。
railsで開発していると、`do...end`のブロックを作ったあとに、よくこういうエラーに遭遇します。

```/app/views/users/show.html.haml:3: syntax error, unexpected ')' )).to_s);).to_s);; _hamlout.bu... ^ /app/views/users/show.html.haml:5: syntax error, unexpected keyword_else, expecting keyword_end```

疲れていると簡単なエラーの原因も見抜くことができず、長ったらしいエラー文に辟易として、開発もストップします。
初心にかえってどんなことがエラーの原因になるのか、整理してみたいと思います。

##doがない
```
#show.html.haml
= form_for current_user.active_relationships.build |f|
  = hidden_field_tag :followed_id, @user.id
  = f.submit "Follow", class:"btn btn-primary"
```

```
/app/views/users/show.html.haml:3: syntax error, unexpected ';' ; _hamlout.buffer << ((::Haml:... 
^ /app/views/users/show.html.haml:35: syntax error, unexpected keyword_ensure, expecting end-of-input
```

doを忘れるとエラーが出ます。
##endがない
hamlだとendいらないですが、erbで書いている時は必要ですね。

##ネストさせていない

```
#show.html.haml
- if current_user.following(@user)
  = form_for current_user.active_relationships.build |f|
  = hidden_field_tag :followed_id, @user.id
  = f.submit "Follow", class:"btn btn-primary"
- else
  = form_for current_user.active_relationships.find_by(followed_id: @user.id), html: { method: :delete} do |f|
  = f.submit "Unfollow", class: "btn"
```

form_forを作ったら、きちんとネストさせましょう。

##関係ないタグにネストさせている
```
%h2 フォーム
  = form_for current_user.active_relationships.build|f|
    = hidden_field_tag :followed_id, @user.id
    = f.submit "Follow", class:"btn btn-primary"
```

```
Illegal nesting: content can't be both given on the same line as %h2 and nested within it.
```
ありがちですね……
PCL 1.8.0 (Point Cloud Library) のプロパティシート (Visual Studio 2017版)

必要だったので作りました。

タイトルのまんまです。Gistに公開してます。
https://gist.github.com/itigoore01/bfc03f3ce814ac95166a49925d0361e7

といっても、ほとんど[こちら](https://gist.github.com/UnaNancyOwen/d2c380603a4642525b5c)のPCL1.7.2版のプロパティシートを参考に、2017対応とかをいれただけですが……。

中を見てもらったらわかると思うのですが、PCLとBoostとVTKのバージョン情報をユーザーマクロとして定義しているので、適宜修正してもらったら、多分マイナーバージョンが違うくらいなら動くと思います。
(こちらで動作確認したのはVisual Studio 2017と2015、PCL 1.8.0、Boost 1.63、VTK 7.1)

プロパティシートの使い方は適当にググってください。
PCLのビルド方法は[こちら](http://unanancyowen.com/pcl18/)を参考にさせて頂きました。

---
追記. pcl::visualization周りの機能を使う場合は、VTKの初期化処理とopengl32.libのリンクが別途必要になります。

VTKの初期化処理は以下のような感じです。

```cpp:main.cpp
#include <vtkAutoInit.h>

VTK_MODULE_INIT(vtkRenderingOpenGL);
```
コサイン類似度行列？それNumPyですぐ出せるよ

# 結論

```py3
def cos_sim_matrix(matrix):
    """
    item-feature 行列が与えられた際に
    item 間コサイン類似度行列を求める関数
    """
    d = matrix @ matrix.T  # item-vector 同士の内積を要素とする行列

    # コサイン類似度の分母に入れるための、各 item-vector の大きさの平方根
    norm = (matrix * matrix).sum(axis=1, keepdims=True) ** .5
    
    # それぞれの item の大きさの平方根で割っている（なんだかスマート！）
    return d / norm / norm.T
```
* 英語でググれ (「cosine similarity matrix numpy」とかで)
* 元の数式をよく見ろ

# 導入
皆さんコサイン類似度行列は好きでしょうか？私は大好きです :innocent: 。

特に協調フィルタリングなどを行おうとすると作ってみることが多いのではないのでしょうか。

ただ残念なことに、日本語で調べると2つのベクトル間のコサイン類似度の求め方はしばしば見かけるのですが、それらがまとまったコサイン類似度行列の求め方はほとんど見かけませんでした。

もしくはもう少し numpy 力がある人にとっては自明なのであえて明記していないのかもしれません。

ですので自分のへの備忘録も兼ねてここに残しておきます。


# それまでにやってしまった過ち

これは失敗作ですので参考にしないでください :cry: 。
上記の数十倍時間かかります :poop: 。

```python3
@numba.jit('f8(f8[:],f8[:])', nopython=True)
def _cos_sim(v1, v2):
    """
    2つのベクトルのコサイン類似度を返す
    """
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

@numba.jit('f8[:, :](f8[:, :])', nopython=True)
def item_similarities(item_user_matrix):
    """
    アイテム・ユーザー行列が与えられた際に
    アイテム間類似度行列を求める関数
    """
    n = item_user_matrix.shape[0]  # n: item counts
    sims = np.identity(n)  # 同じアイテム同士の類似度は1

    for i in range(n):
        for j in range(i+1, n):
            sim = _cos_sim(item_user_matrix[i], item_user_matrix[j])
            sims[i][j] = sim
            sims[j][i] = sim
    return sims
```


# 最後に

I need more power...!! (もっと行列計算力が欲しい)
Macについてのメモ

## 概要

最近、開発でMacを使っているので、ちょっとしたことを忘れないようメモする。

## .DS_Storeファイルについて

開発で使っているので、ターミナルでの作業が多いため、.DS_Storeは邪魔になることの方が多い。
そのため、作らないようOFFに設定する。

※ 参考サイト： [.DS_Storeの仕組みと削除＆作成しないよう設定する方法](http://uxmilk.jp/48160)

## 隠しファイルをFindeに表示する

開発で使うので隠しファイルも見れないと困ることが多いので表示するよう設定する。

※ 参考サイト： [Macの隠しファイルや隠しフォルダを表示する裏技](http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-show-hidden-file-or-folder-of-macos.html)

## 圧縮ソフト
Windowsとのファイルのやり取りで文字化けせず、パスワードロックをかけられるソフトを探す。

* [ZIPANG](https://itunes.apple.com/jp/app/zipang-zip-archive-next-generation/id882655968?mt=12)

## エイリアス設定

* [Macのターミナルでよく使うコマンドにエイリアスを作りました](https://qiita.com/pugiemonn/items/da04a422cc7da548632e)

## 文字コードの変換

* [macでファイルの文字コードを変換する『nkfコマンド』の使い方とオプション一覧](http://kawatama.net/others/mac/1754)

「Homebrew」でnkfコマンドをインストール

```sh:ターミナル
$ which nkf
$ brew install nkf
$ nkf --version
```

現在の文字コードを確認する

```sh:ターミナル
$ nkf -g hoge.csv
UTF-8
```

Shift-JISに文字コード変換

```
$ nkf -s --overwrite hoge.csv
```

文字コードをUTF-8に変換

```sh:ターミナル
$ nkf -w --overwrite hoge.csv
```
Javaの`+`演算子でnullを結合してもだいじょーぶ(ヌルポで落ちない)


ログにStringの変数を`+`演算子で文字列結合して表示させたい時があるんですが、「あれ？この変数nullでも大丈夫なんだっけ？」と思うことが多いのでメモしておきます。ログ出力のためにヌルポでクラッシュさせたら本末転倒ですからね。

結論としては問題なし！！です。

# +演算子でnullを結合してもだいじょーぶ
```Java
String n = null;
System.out.println("fuga:" + n); 
// fuga:nullと出力される
```

# formatにnullを使ってもだいじょーぶ
String.formatを使っても大丈夫

```Java
String n = null;
System.out.println(String.format("hoge:%s",n)); 
// hoge:nullと表示される
System.out.println(String.format("fuga:%02d", n));
// fuga:nullと表示される
```

# +演算子でクラスのインスタンスを結合してもだいじょーぶ
```Java
import java.util.ArrayList;
public class Main {
    public static void main(String[] argv) {
        // 独自クラスもだいじょーぶ
        MyClass myClass = new MyClass();
        System.out.println("hoge:" + myClass);
        // hoge:MyClass@60e53b93 と表示(@以降は変わる)

        // ビルトインクラスもだいじょーぶ
        ArrayList<Object> arrayList = new ArrayList<>();
        System.out.println("fuga:" + arrayList);
        // fuga:[]と表示(なるほどなるほど)

        // ビルトインクラスもダイジョーブ
        Object object = new Object();
        System.out.println("piyo:" + object);
        // piyo:java.lang.Object@5e2de80c(@以降は変わる)
    }
}
class MyClass {
}
```

# formatでクラスのインスタンスを使うのはちょっと注意して！
ここまで見てきましたが、fomat演算子の`%s`以外は、変換できないクラスのインスタンスだとExceptionスローして落ちます。

```Java
public class Main {
    public static void main(String[] argv) {
        MyClass myClass = new MyClass();
        System.out.println(String.format("hoge:%s",myClass));
        // hoge:MyClass@78308db1と表示(@以降は変わる)

        System.out.println(String.format("hoge:%d",myClass));
        // java.util.IllegalFormatConversionException で落ちる
    }
}
class MyClass {
}
```

# まとめ
Java8の動作ベースでの検証でしたが、+演算子で結合している場合は大丈夫でしたね。
Java先生方からベスプラがコメントされたりしないかなぁ。
Python: 関数の引数について

# 関数の引数

## 関数を定義
引数を受取り、出力する関数を定義する

```python
def func(x, y, z):
    print(x, y, z)
```

続けて2つの引数をtupleとdictで定義する

```python
# tuple型
tuple_arg = (1, 0, 1)

# dict型
dict_arg = {'x': 1, 'y': 0, 'z': 1}
```

tupleを関数funcの引数に渡してみると

```python
func(*tuple_arg)
>>> 1, 0, 1
```

dictを関数funcの引数に渡してみると

```python
func(**dict_arg)
>>> 1, 0, 1
```

どちらの場合も渡された型から、引数を認識してくれて値を展開してくれる。
[Keepass]プロキシ認証など、よく自動入力するエントリにホットキーを設定する

# はじめに

会社PCで外部サイトを閲覧すると、同じプロキシ認証を何度も聞かれて鬱陶しいので、
特定のエントリにホットキーを割り当てできればいいのに…と思っていました。

それ自体はできなかった（方法はあるのかも？）のですが、
下記の方法で、ホットキー一発でIEのプロキシ認証を自動入力できるようになったのでメモしておきます。

# ウィンドウタイトルと照合して、IEのプロキシ認証の自動入力を行う。
`LCtrl + Alt + A`で、ウィンドウタイトルによりエントリを照合して、自動入力を実行できる。

###手順
1. エントリを新規作成
2. タイトルを、 **ウィンドウタイトル** にする
3. ユーザー名・パスワードに、プロキシの認証情報を入力
4. 登録・保存

IEを起動し、確かめる。
プロキシ認証のポップアップが表示されたら、`LCtrl + Alt + A`で自動入力される。


## 参考
[KeePass ：自動入力の公式ヘルプを和訳した](https://tabtter.jp/diary/1674)
TensorFlowでレコメンデーション

#概要
TnsorFlowでレコメンデーションやってみた。

#参考にしたページ

http://resola.ai/dev/2016/09/22/tensorflow%E3%81%A7%E3%83%AC%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0/

http://qiita.com/ynakayama/items/59beb40b7c3829cc0bf2

#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.2

#サンプルコード


```
import tensorflow as tf

#    山田 田中 佐藤 中村 川村 鈴木 下林
X = [[2.5, 3.0, 2.5,  -1, 3.0, 3.0,  -1], #'カレー'
	[ 3.5, 3.5, 3.0, 3.5, 4.0, 4.0, 4.5], #'ラーメン'
	[ 3.0, 1.5,  -1, 3.0, 2.0,  -1,  -1], #'チャーハン'
	[ 3.5, 5.0, 3.5, 4.0, 3.0, 5.0, 4.0], #'寿司'
	[ 2.5, 3.5,  -1, 2.5, 2.0, 3.5, 1.0], #'牛丼'
	[ 3.0, 3.0, 4.0, 4.5, 3.0, 3.0,  -1]] #'うどん'
Z = [[  1,   1,   1,   0,   1,   1,  0], #'カレー'
	[   1,   1,   1,   1,   1,   1,  1], #'ラーメン'
	[   1,   1,   0,   1,   1,   0,  0], #'チャーハン'
	[   1,   1,   1,   1,   1,   1,  1], #'寿司'
	[   1,   1,   0,   1,   1,   1,  1], #'牛丼'
	[   1,   1,   1,   1,   1,   1,  0]] #'うどん'

x = tf.placeholder(tf.float32, [6, 7])
y = tf.placeholder(tf.float32, [6, 7])

w1 = tf.Variable(tf.random_normal([6, 2], mean = 0.0, stddev = 0.05))
w2 = tf.Variable(tf.random_normal([7, 2], mean = 0.0, stddev = 0.05))
result = tf.matmul(w1, tf.transpose(w2))

loss = tf.square(tf.multiply(tf.matmul(w1, tf.transpose(w2)) - x, y)) + (tf.nn.l2_loss(w1) + tf.nn.l2_loss(w2)) * 0.01
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)

init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
for i in range(10000):
	sess.run(train_step, feed_dict = {
		x: X,
		y: Z
	})
	if i % 100 == 0:
		print (sess.run(loss, feed_dict = {
			x: X,
			y: Z
		}))

expected_evals = sess.run(result, feed_dict = {
	x: X,
	y: Z
})
for eval in expected_evals:
	print("%s" % eval)



```

#結果


```
#    山田         田中      佐藤         中村        川村        鈴木       下林

[ 2.63470387  2.95388412  2.56464982  3.02486849  2.52338362  3.07825279  3.26381159]#'カレー'
[ 3.37572169  3.67882395  3.33641553  3.90223742  3.23290825  3.849828    4.3096714 ]#'ラーメン'
[ 2.37158823  1.69161224  2.76956868  2.96601868  2.2697053   1.91008389  4.10669899]#'チャーハン'
[ 3.65982723  4.70319939  3.27653408  4.05092335  3.5062356   4.80988169  3.80868769]#'寿司'
[ 2.15531445  3.53876495  1.56305885  2.19226551  2.06619763  3.51690435  1.31375158]#'牛丼'
[ 3.35266995  2.84457064  3.69929171  4.07905245  3.20942688  3.10351372  5.25796843]#'うどん'

下林さんへのおすすめは　うどん　ラーメン　チャーハン　


```


#成果物

https://paiza.io/projects/Q7eOg3oxD3LiCj6gvPpRyw
CPUの処理性能を表す数値についてまとめてみた

CPUの情報は、例えばWindowsのパソコンならばシステム情報からプロセッサの記述を見ることで確認できる。
以下のような表記がされていたとする。
プロセッサ：Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz 3.30 GHz
この「3.30GHz」はクロック周波数と呼ばれており、CPUの処理性能を表す値とされる。

### クロックとは
***
複数の電子回路をタイミングよく動作させるための基準信号。この基準信号は水晶発振器などで生成され、回路集合の中で「指揮者」のような役割を担う。
水晶発振器は「水晶は電圧がかかると振動する」という原理を利用して、水晶を一定の振動を行うように加工しその振動周波数を電気信号に変える。よって、周波数の単位であるHz（ヘルツ）となる。

### クロック周波数とは
***
1秒間に扱えるクロックの周波数。周波数が大きいほど1つのクロックに掛かる時間が短くなる。
ひとつの処理に何クロック消費するかもあるので周波数が大きいからといって一概に性能が良いとは限らないが、周波数が大きいほうが性能が良いと概ね考えて良い。
「3.30GHz」の場合、「3,300,000,000Hz」つまり1秒間に33億ヘルツ処理できる性能があることになる。
水晶発振器は電圧をかけて振動させるため、多く振動させるには多くの電流が必要となり発熱量が増加する。

### CPUの性能表記におけるビット数について
***
「64bitCPU」などと表記された場合、そのCPUは「32bitCPU」よりも多くのレジスタ（内部メモリのようなもの）を持っていることになる。
このレジスタを介してメインメモリ（RAM）から命令を取り出したりするので、レジスタのサイズが大きいほうが性能が良いことになる。
ただし、「64bitCPU」を利用するには「64bit対応OS」が必要である。

### 参考になった記事
***
[どんな組み込みエンジニアになりたいですか？](http://monoist.atmarkit.co.jp/mn/articles/0609/22/news101.html)
[レジスタとは何か](http://www.yamamo10.jp/yamamoto/lecture/2004/3E/6th/html/node2.html)
[クロックとは](http://dic.nicovideo.jp/a/%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF)
[教えて！水晶デバイス](http://www.river-ele.co.jp/company/device.html)
WSLでUbuntu入れてみた

[こんな記事](http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html)があったんで試しに入れてみた。

## インストール方法

記事に書いてある通りだけど、［プログラムと機能］から［Windowsの機能の有効化または無効化］開いて［Windows Subsystem for Linux］をチェック入れてチェックを入れる。開発者モードを有効にして再起動。コマンドプロンプト開いて`bash`と打つとUbuntuがインストールされる。

## いろいろ入れてみた
インストールされたら、コマンドプロンプト立ち上げて`bash`とコマンドうてばbashの画面になる。

いろいろ入れて遊んでみた。

### PHP
```
sudo apt install php7.0-cli
```
でPHPがインストールされる

### Apach
```
sudo apt-get install apache2
```


### 結果

もうちょっとなぶって遊んでみたい
ArrayからCGRectとか(CGGeometryとUIGeometry)[swift]

[NSArrayからCGRectとか(CGGeometryとUIGeometry)](http://qiita.com/sakiyamaK/items/5f4e2e8b74c3ccb69fd6)

これのswift移植

#使い方

こういうことができるようになります

```swift

//配列を用意
let a = [1,2,3,4]

/*色んな型に変換*/
a.cgPoint // CGPoint(x:1, y:2)
a.cgSize // CGSize(width:1, height:2)
a.cgRect //CGRect(x:1, y:2, width:3, height:4)
a.cgAffineTransform //CGAffineTransform(a: 1, b: 2, c: 3, d: 4, tx: 0, ty: 0) <- 配列数が足りない部分は0になる

a.uiEdgeInsets //UIEdgeInsets(top: 1, left: 2, bottom: 3, right: 4)
a.uiOffset //UIOffset(horizontal: 1, vertical: 2)


//UIViewもこんな感じで用意できる
let v = UIView(frame: [10, 10, 100, 100].cgRect)
```

色々座標を計算し終わったあとにCGPoint(x:x, y:y)とかしなくていいのでちょっとだけ楽です

#実装
2017-08-31 
[HihuSnow](http://qiita.com/HihuSnow)のコメントを参考に修正しました
要素がCGFloat限定だとコメントの通りもっとシンプルにいけそうです

```swift
extension Array{
  
  func index(safe index:Int)->Element?{
    return index >= 0 && index < self.count ? self[index] : nil
  }

  var cgPoint:CGPoint{
    let x = CGFloat(self.index(safe: 0) as? NSNumber ?? 0)
    let y = CGFloat(self.index(safe: 1) as? NSNumber ?? 0)
    return CGPoint(x: x, y: y)
  }
  
  var cgVector:CGVector {
    let x = CGFloat(self.index(safe: 0) as? NSNumber ?? 0)
    let y = CGFloat(self.index(safe: 1) as? NSNumber ?? 0)
    return CGVector(dx: x, dy: y)
  }
  
  var cgSize:CGSize{
    let w = CGFloat(self.index(safe: 0) as? NSNumber ?? 0)
    let h = CGFloat(self.index(safe: 1) as? NSNumber ?? 0)
    return CGSize(width: w, height: h)
  }
  
  var cgRect:CGRect{
    let x = CGFloat(self.index(safe: 0) as? NSNumber ?? 0)
    let y = CGFloat(self.index(safe: 1) as? NSNumber ?? 0)
    let w = CGFloat(self.index(safe: 2) as? NSNumber ?? 0)
    let h = CGFloat(self.index(safe: 3) as? NSNumber ?? 0)
    return CGRect(x: x, y: y, width: w, height: h)
  }
  
  var cgAffineTransform:CGAffineTransform{
    let a = CGFloat(self.index(safe: 0) as? NSNumber ?? 0)
    let b = CGFloat(self.index(safe: 1) as? NSNumber ?? 0)
    let c = CGFloat(self.index(safe: 2) as? NSNumber ?? 0)
    let d = CGFloat(self.index(safe: 3) as? NSNumber ?? 0)
    let tx = CGFloat(self.index(safe: 4) as? NSNumber ?? 0)
    let ty = CGFloat(self.index(safe: 5) as? NSNumber ?? 0)
    return CGAffineTransform(a: a, b: b, c: c, d: d, tx: tx, ty: ty)
  }
  
  var uiEdgeInsets:UIEdgeInsets{
    let top = CGFloat(self.index(safe: 0) as? NSNumber ?? 0)
    let left = CGFloat(self.index(safe: 1) as? NSNumber ?? 0)
    let bottom = CGFloat(self.index(safe: 2) as? NSNumber ?? 0)
    let right = CGFloat(self.index(safe: 3) as? NSNumber ?? 0)
    return UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)
  }
  
  var uiOffset:UIOffset{
    let horizontal = CGFloat(self.index(safe: 0) as? NSNumber ?? 0)
    let vertical = CGFloat(self.index(safe: 1) as? NSNumber ?? 0)
    return UIOffset(horizontal: horizontal, vertical: vertical)
  }
}
```
iOSで正多角形を描く

#参考
[【iOS】正多角形を描く - UIBezierPathバージョン2](http://devdevdev.hatenablog.com/entry/2014/10/08/193743)

これのswift版

#ソース

##定義

```swift:PolygonView
class PolygonView:UIView{
  
  //角の数
  var polygonNumber:Int = 3{
    didSet{
      self.setNeedsDisplay()
    }
  }
  
  //図形の色
  var fillColor:UIColor = .white{
    didSet{
      self.setNeedsDisplay()
    }
  }

  override var frame: CGRect{
    didSet{
      self.setNeedsDisplay()
    }
  }

  override init(frame:CGRect){
    super.init(frame:frame)
    //色を塗らない部分を透過
    self.isOpaque = false
  }
  
  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
  
  override func draw(_ rect: CGRect) {
    let r = min(rect.width/2, rect.height/2)
    let c = CGPoint(x: rect.width/2, y: rect.height/2)
    self.drawRegularPolygon(self.polygonNumber, radius: r, center: c)
  }
  
  //図形を描く
  func drawRegularPolygon(_ p: Int, radius: CGFloat, center: CGPoint) {
    
    guard let ctx = UIGraphicsGetCurrentContext() else { return }
    ctx.clear(self.frame)
    
    var pt:[CGPoint]=[]
    for i in 0 ..< p {
      let rad: CGFloat = CGFloat(Double.pi * Double(i) * 2.0 / Double(p) + Double.pi / 2.0)
      let point = CGPoint(x: center.x + radius * cos(rad), y: center.y - radius * sin(rad))
      pt.append(point)
    }
    
    ctx.setFillColor(self.fillColor.cgColor)
    
    ctx.move(to: pt[0])
    
    for p in pt{
      ctx.addLine(to: p)
    }
    ctx.closePath()
    ctx.fillPath()
  }
}
```

##使い方
```swift
//200*200のviewにオレンジ色の６角形を描く
let polygonView = PolygonView.init(frame: CGRect(x:0, y:0, width:200, height:200))
polygonView.polygonNumber = 6
polygonView.fillColor = .orange
```

#出力
![スクリーンショット 2017-08-31 7.36.40.png](https://qiita-image-store.s3.amazonaws.com/0/105057/1a2e6e9b-bb2e-772b-da08-696e493b5ff7.png)

#補足
奇数角形の時に図形の中心がviewの中心にこないのが少し気持ち悪い
なぜFatControllerおばさんしてしまうのか

こんばんは、きょとん([@ippomihosanpo](https://twitter.com/ippomihosanpo))です。
先日はじめてRails上級者の先輩方にコードレビューしてもらいました。

[ぺーぺーの私がRailsのコードをはじめて上級者にレビューしてもらった](http://qiita.com/ippomihosanpo/items/0e9f6d9c869ddbb06753)

シンプルな仕様のコード量も少ないものだったはずなのに、コントローラ周りの指摘が多かった気がします。
いつもやりがちなんです。あたしって、ほんとバカ。
~~最初に携わったRailsの既存プロダクトがFatControllerだったせいにしたい~~

#なんで、こう、私はFatControllerおばさんと化してしまうんだ

**「デブの実装はやっぱりFatControllerなのかww」**

とディスられる前に直したいです。原因を探りました。

##よく考えると私が知ってるモデルとRailsのモデルが違かった

MVCのモデルは「データをいれる器」という認識でした。
器なので、基本的にはデータの単純な出し入れのみでロジックは色々書かない。
という考えがずっとこびりついていました。

##JavaEEの三階層アーキテクチャのしがらみ
JavaEEを習っていた時システムは三階層として勉強してきました。

```
プレゼンテーション層 <=> ビジネスロジック層 <=> データアクセス層 <-> DB
```

この各層の間でデータのやりとりをするのが「モデル」でした。
MVCに当てはめるとこんなかんじです。

```
M：モデル
V：プレゼンテーション層
C：ビジネスロジック層・データアクセス層
```

##となるとRailsでいうModelはモデル+データアクセス層
RailsのモデルはActiveRecordを継承していて、モデル自身がデータにアクセスできます。
三階層で考えてMVCに当てはめるとこんな感じになります…よね？

```
M：モデル・データアクセス層
V：プレゼンテーション層
C：ビジネスロジック層
```

**この認識の違いがあると、データアクセス周りの処理をModelに書かないといけないのに、JavaEEの三階層アーキテクチャのしがらみによりControllerに書いてしまうという過ちが生じてしまうのです…。**

#さいごに
すみません、長い言い訳になってしまいました…。
かなり当たり前のことをいってたらすみません…。
FatControllerやりがちな人で元Java畑の人でこういう人いませんか…？
いないですか…そうですか…。

Railsがんばります！！いいコードかけるようにがんばります！！
awkコマンドを使ってログファイルを見やすくした

行数の多いログファイルをcatする時に便利だったのでまとめました。

##スペース区切りのログファイルでawk

適当にログファイルを作ります。

```test.log
2017-08-30 20:00:00 id : 1 status : success
2017-08-30 21:00:00 id : 2 status : success
2017-08-30 22:00:00 id : 3 status : error
```

###普通のcatと同じように表示

```
$ cat test.log | awk '{print $0}'
```

```
2017-08-30 20:00:00 id : 1 status : success
2017-08-30 21:00:00 id : 2 status : success
2017-08-30 22:00:00 id : 3 status : error
```

###idとstatusを表示(列の操作)

```
$ cat test.log | awk '{print $5, $8}'`
```
```
1 success
2 success
3 error
```

スペース区切りで数えた番号の列を表示できます（$0は1行全部）

###errorの行だけ取得（行の操作）

```
$ cat test.log | awk '/error/{print $0}'`
```

```
2017-08-30 22:00:00 id : 3 status : error
```

awk '/検索したい文字列/{print}' で行を絞ることができます


###errorの行だけ かつ idのみ取得

```
$ cat test.log | awk '/error/{print $5}'`
```
```
3
```

行と列の操作で errorの含まれる行 かつ idのみ表示することができます


##カンマ区切りのログファイルでawk

適当にログファイルを作ります。

```test2.log
2017-08-30,20:00:00,id,:,1,status,:,success
2017-08-30,21:00:00,id,:,2,status,:,success
2017-08-30,22:00:00,id,:,3,status,:,error
```

- idとstatusを取得（セパレータ指定）

```
$ cat test2.log | awk -F "," '{print $5, $8}'`
```
```
1 success
2 success
3 error
```

-F の指定でセパレータを指定できます（デフォルトはスペース）


#まとめ

```
awkは行と列の操作ができる

awk `{print $1}` => スペース区切りで１列目を取得
awk `{print $1, $2}` => スペース区切りで１列目と2列目を取得
awk `/error/{print $0}` => 文字列'error'を含む行を取得
awk `/error/{print $1, $2}` => 文字列'error'を含む行の１列目と2列目を取得
awk -F "," `{print $0}` => 区切り文字を","に設定することもできる
```

以上、基本だけですが使えると便利そうです。
JSFでボタンの活性制御するときの注意…

#JSF(Java Server Faces)のイヤンな挙動

JSFを使用しているプロジェクトがどれほどあるか、わたくしには未知数でございますが
自分が経験したJSFのあるクセについて記しておこうと思います。

自分が直面した時のプロジェクトでは、JSFのxhtmlとJavaScript&jQueryで
フロント側を作成していました。

##ボタンの活性制御で落とし穴

例えば、必須の入力項目が埋まったのを検知して次画面に遷移させるボタンを
押せるようにする処理を組んだとします。

```html:input.html
<h:commandButton id="nextButton" value="button" 
    action="#{input.nextAction}" disabled="#{!isAllInput}"/>
```

上記のようにボタンを配置しました。

"isAllInput"はboolean型です。
初期はボタンが押せない状態にしたいためdisabledを"True"でセットしたい。

よって、isAllInputの頭に"!"をつけて「isAllInputがfalseであれば」という条件にしてあげました。
これでページ表示直後は未入力状態なので、disabledが有効になります。
（つまりボタン非活性の状態）

###ボタンを押しても無反応

必須入力項目が埋まったら、disabledを無効にしてボタンを活性状態にします。
これでボタンを押して次のページへ……

と、いきたいところですがこれだと反応がありません。
disabledを無効にしてボタン押下可能になってもactionの処理がうまく動作してくれないのです。

###<h:commandButton…タグ内のdisabled

上記の書き方ではhtmlを生成する際に、disabledを有効にする初期値の場合、
以降ボタンを押してもAction処理が走らなくなってしまうのです。
これはそういうクセがある模様です。（以下の記事参考にしました）

[JSF をめぐる話題](http://park6.wakwak.com/~hoshina/JavaEE/jsf.html#commandButton)

##JSFでボタン活性制御をするならタグ内disabledはNG

少し手間ではありますが、前述の理由からボタンの活性制御はjavascript(またはjQuery)で
制御しなければいけません。（入力チェックのロジック表記は省いてます）

```html:input.html
<script type="text/javascript">
function disable_change(){
    if (#{isAllInput}){
        document.getElementById("nextButton").disabled = "";
    } else {
        document.getElementById("nextButton").disabled = "disabled";
    }
}
</script>
・
・
・
<h:commandButton id="nextButton" value="button" action="#{input.nextAction}"/>
```

jQueryの場合：

```html:input-j.html
<script type="text/javascript">
$(function(){
    if (#{isAllInput}){
        $("#nextButton").attr('disabled', false);
    } else {
        $("#nextButton").attr('disabled', true);
    }
});
</script>
・
・
・
<h:commandButton id="nextButton" value="button" action="#{input.nextAction}"/>
```

javascriptでdisabledの制御をしてあげれば、ボタン活性状態でクリックした時に
アクション処理がしっかりと動作するようになります。


このクセを知らず当時とっても時間を費やしてしまいました……
Install Redmine on Debian

# Preparation for third party services

* MySQL
* Nginx

# Language / VM

## RVM

```bash
curl -L https://get.rvm.io | bash -s stable
```

Then try to run `rvm -v`. If no result, run `source /usr/local/rvm/scripts/rvm`.
Might it work to append this to `/etc/profile`.

## Ruby (2.3.1)

> Taobao Mirror if needed
>
> `sed -i 's!cache.ruby-lang.org/pub/ruby!ruby.taobao.org/mirrors/ruby!' $rvm_path/config/db`

```bash
rvm install 2.3.1
```

See ruby installation list `rvm list`.

See current ruby running version `ruby -v`.

## Rails

> Taobao Mirror if needed
>
> `gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/`

```bash
gem install rails -V
```

## redmine package

For example to /opt/redmine. Change your working directory to it.

## Modify the configuration files.

Follow Step 1 to 3 from official doc.
> http://www.redmine.org/projects/redmine/wiki/redmineinstall

You may need this ...

```bash
# For mysql
apt-get install libmysqlclient-dev
# For imagemagick
apt-get install imagemagick libmagickwand-dev
```

Then Step 4 to 8.

## Run

```bash
ruby /opt/redmine/redmine-3.4.2/bin/rails server webrick -e production -b 127.0.0.1 -p 3000 -d >> /var/log/redmine.log 2>&1
```

## Nginx Listenser

Set up a VHOST configuration for nginx as

```nginx
upstream local_ruby_3000_proxy {
    server 127.0.0.1:3000;
}
server { 
        listen 80;
        server_name newredmine.leqee.com;
        #access_log logs/host.access.log main; 
        
    location / {
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-FORWARDED-FOR $remote_addr;
        proxy_set_header X-Real-IP $http_x_real_ip;
        proxy_pass http://local_ruby_3000_proxy;
    }
}
```

And restart.

## Initialization

Step 9 and 10.
【MacOS】Spring Boot CLI インストール時にrubyに邪魔された

# はじめに
Spring Boot CLI を使ってGroovyアプリを動かしてみようと思ったら
”Ruby Gem”の”Spring”に邪魔され、
Spring Boot CLIのコマンド”spring run”ができなかったので
解決策をメモしておきます。


# 解決策
1. Spring Boot CLI用のパスを通す
----

.zshrc に以下の2行を追加
（お使いの環境にあわせて.zshrcは.bashrcなりに変換してください）

```
export SPRING_HOME=/Users/Y_h/spring-1.5.6.RELEASE
export PATH=$SPRING_HOME/bin/:$PATH
```
からの
```source ~/.zshrc
```で変更を反映

2. Spring Boot CLIの動作確認
----

```
$ spring
```
とTerminalに入力し…

```
usage: spring [--help] [--version]
       <command> [<args>]

Available commands are:

  run [options] <files> [--] [args]
    Run a spring groovy script

  test [options] <files> [--] [args]
    Run a spring groovy script test

  grab
    Download a spring groovy script's dependencies to ./repository

  jar [options] <jar-name> <files>
    Create a self-contained executable jar file from a Spring Groovy script

  war [options] <war-name> <files>
    Create a self-contained executable war file from a Spring Groovy script

  install [options] <coordinates>
    Install dependencies to the lib/ext directory

  uninstall [options] <coordinates>
    Uninstall dependencies from the lib/ext directory

  init [options] [location]
    Initialize a new project using Spring Initializr (start.spring.io)

  shell
    Start a nested shell

Common options:

  -d, --debug Verbose mode
    Print additional status information for the command you are running


See 'spring help <command>' for more information on a specific command.
```
と表示されればOK
おつかれさま自分

# 最後に
インストールガイドをよく見れば書いてあることなんですが
はまってしまいました…
推一個最小限度可執行的 PHP 網頁到 Heroku 上面去

### 概觀

主要有三個東西
- php 檔案
- Procfile
- composer.json

資料夾長這樣

```txt
composer.json
Procfile
web/
  - index.php
```

### 預先要裝的東西

- 自己喜歡的編輯器
- Git
- Heroku CLI

因為這邊不會用到本機上執行 php 和使用 composer 的功能，所以這邊就不列了。
想知道怎麼在 mac 上面裝 PHP 和 composer 的話可以看這篇 - [在 Mac 透過 Homebrew 裝 PHP7 和 Composer](http://qiita.com/vc7/items/cb3af907d60087f6db27)

### index.php

用喜歡的編輯器開一個檔案，加入以下程式碼並存成 `index.php`

``` php:index.php
<?php echo "hello world"; ?>
```

### composer.json

因為什麼都沒有要加，只需要建立檔案，內容空著沒關係

### Procfile

這個檔案不用副檔名，直接叫這樣就好。
檔案中的內容如下：

``` Procfile
web: vendor/bin/heroku-php-nginx web/
```

- 指定要使用用 ngix 當作是 web server
- 指定網站根目錄在 `web/` 資料夾之下。也就是剛剛 `index.php` 所放的位置

### Commit, 並推送到 heroku

如往常地把這些新增 commit 完之後。
推送的目的地，通常是會推到長得像這樣子的位置，就像是一般的 git repo 位址。

```
https://git.heroku.com/<heroku_app_id>.git
```

接著，把她加入 remote 中。

```bash
git remote add heroku https://git.heroku.com/<heroku_app_id>.git
```

加完之後可以透過 `git remote -v` 來看有沒有加成功。成功的話就可以 push 了：

```bash
git push heroku master
```

推的過程就會看到終端機裡面跳出一堆處理中的訊息。
沒有任何問題的話，就可以在資料夾處用 `heroku open` 指令直接開啟網站來看看了

#### .gitignore

目前忽略掉兩個，一個是 composer 產生的 vendor 資料夾，另外一個則是會被 monolog 用到的 `.env` ：

```
vendor/
.env
```

### 下一個

來弄弄看 MySQL ...