OmniAICreator/Qiita-1.07M huggingface dataset:
Go言語のtablewriterでWindowsのコマンドプロンプトに色付きのASCIIテーブルを出力する

ちょっとしたツールを作ったときに、ちょっとだけ見やすく表示したい、みたいなことありますよね。

ポイントは以下の4点です。

* Windowsの場合、[mattn/go\-colorable](https://github.com/mattn/go-colorable)を一緒に使う
    * 使わないとANSIエスケープシーケンスが文字列でそのまま表示される
* ヘッダ部分で色を付けるには、`SetAutoFormatHeaders(false)` を指定する
    * 指定しないとエスケープシーケンスの分だけテーブルが崩れ、色がつかない
* ボディ部分の文字列に半角スペースを含む場合、`SetAutoWrapText(false)`を指定する
    * ASCIIエスケープシーケンス分長くなった分だけ折り返されてしまうので
* Windowsのコマンドプロンプトで使う場合、文字用にはHiがついてる方を使う(e.g. `color.FgHiRed`)
    * `color.FgRed`だと暗くてちょっと見づらい(気がします)

サンプルです。

```table.go
package main

import (
  "github.com/olekukonko/tablewriter"
  "github.com/fatih/color"
  "github.com/mattn/go-colorable"
)

func main() {
  fgRed := color.New(color.FgHiRed).SprintFunc()
  fgGreen := color.New(color.FgHiGreen).SprintFunc()
  fgYellow := color.New(color.FgHiYellow).SprintFunc()
  fgBlue := color.New(color.FgHiBlue).SprintFunc()
  fgMagenta := color.New(color.FgHiMagenta).SprintFunc()
  fgCyan := color.New(color.FgHiCyan).SprintFunc()
  fgWhite := color.New(color.FgHiWhite).SprintFunc()

  bgRed := color.New(color.BgRed).SprintFunc()
//  bgGreen := color.New(color.BgHiGreen).SprintFunc()
//  bgYellow := color.New(color.BgHiYellow).SprintFunc()
//  bgBlue := color.New(color.BgHiBlue).SprintFunc()
//  bgMagenta := color.New(color.BgHiMagenta).SprintFunc()
//  bgCyan := color.New(color.BgHiCyan).SprintFunc()
//  bgWhite := color.New(color.BgHiWhite).SprintFunc()

  table := tablewriter.NewWriter(colorable.NewColorableStdout())
  table.SetAutoFormatHeaders(false)
  table.SetAutoWrapText(false)

  table.SetHeader([]string{
    fgCyan("Title 1"), fgCyan("Title 2"), fgCyan("Title 3"),
  })

  text := fgGreen("foo") + fgYellow("bar") + fgBlue("baz")
  table.Append([]string{"foo", fgWhite("bar"), fgRed("baz")})
  table.Append([]string{ fgMagenta("foo"), bgRed(fgYellow("bar")), text})

  table.Render()
}

```

実行するとこんな感じになります。


![無題.png](https://qiita-image-store.s3.amazonaws.com/0/50184/4cce29c6-6242-128f-a866-33389d455b00.png)


既にリクエスト出てるので、そのうち、もっとスマートにできるようになりそうですが…

[Feature request: coloured output · Issue \#37 · olekukonko/tablewriter](https://github.com/olekukonko/tablewriter/issues/37)
Swift 3 での UITableView.dequeueReusableCell の使い方

毎回忘れるのでメモとして書いた
`dequeueReusableCell` のところで `CustomCell` に変換する綺麗な書き方は今のところ調べてないのでコピペは危険です

```swift
class VideoViewController: UIViewController {
  let cellClasses:[AnyClass] = [CustomCell.self]
  let comments:[String] = ["ほげ", "ふが"]

  override func viewDidLoad() {
    for clz in cellClasses {
      commentTableView.register(
        UINib(nibName: String(describing: clz), bundle: nil),
        forCellReuseIdentifier: String(describing: clz))
    }
  }
}

extension ViewController: UITableViewDataSource {
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: CustomCell.self)) as! CustomCell? else {
      fatalError("UITableView.dequeueReusableCell Error")
    }
    cell.textLabel.text = comments[indexPath.row]
    return cell
  }
}
```

めんどくさいですね 
`UITableView.register` と `UITableView.dequeueReusableCell` の作業
ReactをREPLで動かしてみる

```sh
$ mkdir react-repl
$ cd react-repl
$ npm i react react-dom
```

```sh
$ node
> var React = require('react')
undefined

> React
{ Children:
   { map: [Function: mapChildren],
     forEach: [Function: forEachChildren],
     count: [Function: countChildren],
     toArray: [Function: toArray],
     only: [Function: onlyChild] },
  Component: [Function: ReactComponent],
  PureComponent: [Function: ReactPureComponent],
  createElement: [Function: createElement],
...

> var ReactDOM = require('react-dom')
undefined

> ReactDOM
{ findDOMNode: [Function: findDOMNode],
  render: [Function: render],
  unmountComponentAtNode: [Function: unmountComponentAtNode],
  version: '15.4.2',
  unstable_batchedUpdates: [Function: batchedUpdates],
  unstable_renderSubtreeIntoContainer: [Function: renderSubtreeIntoContainer] }


> var ReactDOMServer = require('react-dom/server');
undefined

> ReactDOMServer
{ renderToString: [Function: renderToString],
  renderToStaticMarkup: [Function: renderToStaticMarkup],
  version: '15.4.2' }
```

```sh
# https://facebook.github.io/react/docs/react-without-jsx.html
> class Hello extends React.Component {
...   render() {
.....     return React.createElement('div', null, `Hello ${this.props.toWhat}`);
.....   }
... }
[Function: Hello]

> var element = React.createElement(Hello, {toWhat: 'World'}, null);
undefined

> element
{ '$$typeof': Symbol(react.element),
  type: [Function: Hello],
  key: null,
  ref: null,
  props: { toWhat: 'World', children: null },
  _owner: null,
  _store: {} }

> ReactDOM.render(element, document.getElementById('root'));
ReferenceError: document is not defined
    at repl:1:26
    at sigintHandlersWrap (vm.js:22:35)
    at sigintHandlersWrap (vm.js:96:12)
    at ContextifyScript.Script.runInThisContext (vm.js:21:12)
    at REPLServer.defaultEval (repl.js:313:29)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.<anonymous> (repl.js:513:10)
    at emitOne (events.js:101:20)
    at REPLServer.emit (events.js:188:7)

> ReactDOMServer.renderToString(element)
'<div data-reactroot="" data-reactid="1" data-react-checksum="999625590">Hello World</div>'

> ReactDOMServer.renderToStaticMarkup(element)
'<div>Hello World</div>'
```
hadoop で ‘container [pid=..,containerID=..] is running beyond physical memory limits. current usage..’を解決する

# error

```
17/01/20 08:22:36 INFO mapreduce.Job: Task Id : attempt_<>, Status : FAILED
Container [pid=<pid>,containerID=container_<id>] is running beyond physical memory limits. Current usage: 2.0 GB of 2 GB physical memory used; 6.2 GB of 4.2 GB virtual memory used. Killing container.
Dump of the process-tree for container_<id> :
        |- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE
        |- 70327 70251 70246 70246 (python) 3778 502 510001152 89480 /usr/bin/python mr_test.py reducer
        |- 70246 70244 70246 70246 (bash) 0 0 13598720 712 /bin/bash -c /path/to/java -XX:-UseGCOverheadLimit -Xmx4000m -

Container killed on request. Exit code is 143
Container exited with a non-zero exit code 143
```

# 解決方法：Memoryを大きくしてあげる

```
-Dmapreduce.reduce.memory.mb=5120
```

これをJarのあとに追加するだけ！
HTMLをスクレイピングする際、複数行にわたるタグ（要素）をPHPの処理で正規表現を用いて置換する

#どういう時にこの方法を使用したのか
既存のWebページからヘッダーとフッター以外のメインコンテンツ部分をごっそり抜き出して、
タグを正規表現で置換処理をしてから新しくhtmlを書き出す、という作業を行う際に、
タグ（要素）をまるごと（'\<div class="aaa">～～～\</div>'の範囲）置換したいというときに使いました。

#正規表現＆置換
※$textDataにはスクレイピングで取得した要素が入っているという想定です

```php:html_change.php

$textData = '
 <p class="AAA">
 たとえば<br />
 こんな感じに<br />
 複数行にわたる要素まるごと<br />
 取得できるので<br />
 別の要素を入れたりできてすごい便利<br />
 というかもっと早く知りたかった。
 </p>
';

$textData = preg_replace('/<p class="AAA">[\s\S]*?<\/p>/', '<div class="CCC">$0</div>'."\n", $textData);
//$0にはクラスの中の文(<p class="AAA">～</p>)が入る
//ちなみに閉じタグ部分の/は上記みたいなエスケープが必要

echo $textData;
```

★実行結果

```html:html_change.php
<div class="CCC">
<p class="AAA">
 たとえば<br />
 こんな感じに<br />
 複数行にわたる要素まるごと<br />
 取得できるので<br />
 別の要素を入れたりできてすごい便利<br />
 というかもっと早く知りたかった。
 </p>
</div>
```

これで要素を追加したり削除したり別の要素に置換できたりします。
よかったよかった


#正規表現チェッカーでの実行結果
```html:scraping.html
<p class="AAA">
たとえば<br />
こんな感じに<br />
複数行にわたる要素まるごと<br />
取得できるので<br />
別の要素を入れたりできてすごい便利<br />
というかもっと早く知りたかった。
</p>
```

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/85815/03fa7c92-84bd-db2b-f9d9-d06a7d6b2c33.jpeg)



#参考サイト

[正規表現で改行を含む複数行でマッチングさせたい: 脱力系備忘録BloG](http://d2b6.seesaa.net/article/431363743.html)
【Swift3.0】Swift初心者がAPIクライアント作ってみた

#はじめに
新卒入社し1年半ほどObjective-Cをやってきたのですが、ついにSwiftを触り始めました。
そしてとりあえず「APIクライアント」の雛形みたいなもの作ってみました。
しかしこれが本当に「Swiftっぽいのか」「お作法に則った書き方を出来ているのか」わからない・・・
「こんなやり方がある」「ここがなってない」「きもい」なんでも良いのでボソッとコメントして行って頂ければと思います。

#意識したこと
・Swiftっぽさ
・APIクライアント的な使い方が出来る

#作ったもの

基底となるプロトコル

```swift:APIProtocol.swift
import AFNetworking

protocol APIParameterProtocol: class {
    var url: String { get }
    var errorType: Int { set get }
    var errorMessage: String { set get }
    var requestParameter: Dictionary<String, Any> { get }
    func setResponseParameter(responseObject: Dictionary<String, Any>)
}

extension APIParameterProtocol {

    /// POST通信
    ///
    /// - Parameter closure: レスポンスを呼び出し側に返すためのクロージャ
    func postRequest(closure: @escaping (_ responseObject: Self) -> ()) {
        
        let manager:AFHTTPRequestOperationManager = AFHTTPRequestOperationManager()
        let serializer:AFJSONRequestSerializer = AFJSONRequestSerializer()
        
        manager.requestSerializer = serializer
        
        manager.post(url,
                     parameters: requestParameter,
                     success: { (operation: AFHTTPRequestOperation, responsobject: Any) in
                        let responseDic: Dictionary<String, Any> = responsobject as! Dictionary<String, Any>
                        self.setResponseParameter(responseObject: responseDic)
                        closure(self)
        },
                     failure: { (operation: AFHTTPRequestOperation?, error: Error) in
                        self.errorType = 1
                        self.errorMessage = "えらー"
                        closure(self)
        })

        
    }
}
```

各APIクラス

```swift:LoginAPI.swift
class LoginAPI: APIParameterProtocol {
    // リクエストパラメータ
    private var requestId: String?
    private var requestPassword: String?
    
    // レスポンスパラメータ
    var responseIsLogin: Bool = false
    
    // 各API共通のパラメータ
    // プロトコルで定義している
    let url: String = "https://LoginAPI"
    var errorType: Int = 0
    var errorMessage: String = ""
    var requestParameter: Dictionary<String, Any> = Dictionary<String, Any>()
    
    /// リクエストパラメータをセット
    ///
    /// - Parameters:
    ///   - id: ID
    ///   - pass: PASSWORD
    func setRequestParameter(id: String, pass: String) {
        requestId = id
        requestPassword = pass
        requestParameter = ["id": requestId ?? "", "pass": requestPassword ?? ""]
    }
    
    /// レスポンスパラメータをセット
    ///
    /// - Parameter responseObject: APIのレスポンスで返ってきたもの
    func setResponseParameter(responseObject: Dictionary<String, Any>) {
        responseIsLogin = responseObject["isLogin"] as! Bool? ?? false
    }
}
```

呼び出すVC

```swift:ViewController.swift
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 呼び出すAPIのパラメータを生成
        let login = LoginAPI()
        // リクエストパラメータを詰める
        login.setRequestParameter(id: "あいでぃ", pass: "ぱす")
        // POST通信を行う
        login.postRequest { (responseObject: LoginAPI) in
            dump(responseObject)
        }
    }

}
```

いかがでしょうか。
とりあえずプロトコルってSwiftっぽいだろという気持ちで作ってみました。
Raspberry Pi のカメラモジュール設定→静止画・動画とる

【2020/1/29更新】
ネットで検索すると古い情報が上に来るので、よろしくないと思い、本記事も更新します。
今や(少なくとも私のRPi4では)下記で実行できます。
```$ sudo apt install motion```
```$ sudo motion```
以上です。

---------昔は下記でした----------

```sudo raspi-config```でカメラを利用可に
```raspistill -o a.png``` で静止画がもう撮れる

```wget https://www.dropbox.com/s/xdfcxm5hu71s97d/motion-mmal.tar.gz
tar -zxvf motion-mmal.tar.gz```
motion-mmalを持ってきて解凍

```sudo nano /home/pi/motion-mmalcam.conf```
で、内容を下記の通り書き換える。
```stream_localhost off
stream_auth_method 1
stream_authentication username:password
output_pictures off
ffmpeg_output_movies off```


```sudo ./motion -n -c motion-mmalcam.conf```
実行しブラウザに下記URLを入れる。（IPはhostname -Iで見る）
http://192.168.1.15:8081/

↑のstream_authenticationを弄ってないなら、”username”、”password”と入力する。

RPiカメラが見ているものがブラウザに表示されます。
[Rails 5 + device 4.2] ユーザー登録時に、確認メールが送信されない

# 環境

- Rails: 5.0.0
- [devise](https://github.com/plataformatec/devise): 4.2.0

# 問題

- Railsとdeviseのバージョンを上げてテストしたところ、ユーザ登録時に確認メールが送信されなくなってしまった。

# 原因

Userモデルに、`after_create`を実装していたのが原因だった。

```rb
# models/user.rb:

class User < ActiveRecord::Base
  after_create { |record|
    hoge
  }
end
```

深く調べていないが、DeviseのConfirmableモジュールの`after_commit`で定義した内容が、`after_create`によって上書きされたのかなと思っている。

```rb
# devise/lib/devise/models/confirmable.rb:

    module Confirmable
      extend ActiveSupport::Concern

      included do
        before_create :generate_confirmation_token, if: :confirmation_required?
        after_create :skip_reconfirmation_in_callback!, if: :send_confirmation_notification?
        if respond_to?(:after_commit) # ActiveRecord
          after_commit :send_on_create_confirmation_instructions, on: :create, if: :send_confirmation_notification?
```

https://github.com/plataformatec/devise/blob/88724e10adaf9ffd1d8dbfbaadda2b9d40de756a/lib/devise/models/confirmable.rb#L48

# 対応方法

Userモデル内で`after_create`の代わりに`after_create_commit`を使うようにしたら、確認メールが送信されるようになった。

```rb
# models/user.rb:

class User < ActiveRecord::Base
  after_create_commit :hoge
end
```
branchの名前が強制的に大文字になってしまったときの対処法

# はじめに
タイトルそのままだが、Gitのブランチを新規作成する際、小文字を指定しているのに大文字に変換されてしまう状況に遭遇した。この記事はその時の備忘録。

# 状況の詳細
というよりも再現方法。下記コマンドを実行する。

```
git branch HOGE/000
git branch hoge/001
git branch
>  HOGE/000
>  HOGE/001

git branch -D HOGE/000
git branch -D HOGE/001
git branch
>

git branch hoge/001
git branch
>  HOGE/001
```

コマンドを実行したら「HOGE/000」「HOGE/001」という名前を持つブランチができてしまった。
職場のブランチ命名規則は原則小文字を使用する事になっており、１番目のコマンドは間違って実行したものである。
出来上がった２個のブランチを両方削除しても、どこかにキャッシュが残っているのか、再度小文字を指定してブランチを作成しても大文字のままとなってしまった。
ちなみに「hoge/」と指定しなければ小文字の名前を持つブランチを作成できた。Gitは便利だがたまに深みにはまってしまう事がある。勉強不足。

# 結論
下記手順を実行する事により、無事「hoge/001」ブランチを作成できるようになった。かなり力技を使ったので、あるべき作業手順ではないと思う。
ちなみに私は力技が嫌いだ。このブログを記述した理由はそのあるべき作業手順を誰かが教えてくれることを期待してというところもある。
いろいろやったので、余計なことまでやっている可能性があるが、全ての作業を記載しておく。

【手順】
1. ./.git/logs/refs/heads/　以下の「HOGE」フォルダを削除
2. ./.git/refs/heads/　以下の「HOGE」フォルダを削除
3. .git/refs/remotes/origin/　以下の「HOGE」フォルダを削除
4. tmpという名前のブランチを作成する
5. tmpブランチでcommitを行う

# 補足
3の時点で「git branch hoge/001」とコマンドを実行すると、
```
fatal: Not a valid object name:hoge/001
```
というエラーが発生し、commitができなくなってしまった。やはり力技はやるべきではない。
どうやら適当なブランチでcommitを実行するといいらしい(なにも理解していない。。。)のでそれを実行。
[参考](http://kuwasa.hatenablog.com/entry/2015/04/27/120842)

さらに「hoge/001」ブランチで「git push」ができない(厳密にいうと、commitしているのに「Everything up-to-date」と表示されてしまう)状況になってしまった。これは代わりに「git push --set-upstream origin hoge/001」と実行することで可能となった。
The 力技

# 補足
OS Xの標準のファイルシステムは大文字小文字を区別しないらしいので、その影響もあるかもしれない。。。

#最後に
そんな弊社ですが、もし興味がありましたら、[Qiitaの弊社技術者ブログトップページの下の方](http://qiita.com/organizations/techbureau)から連絡いただけましたら嬉しいです。お待ちしています！
Beansの内容をtextareaにもってくると空白が入るアレをなんとかした

### 始めに  

Beansの内容をtextareaに持ってくると空白が入る・・・・！
具体的に言うと

ユーザーが編集できるtextareaとかにデフォルトでDBにもともと
保存されいてた内容を表示させておきたい・・・。

こんなとき

せや！普通に突っ込んどけばええやんけ！

```jsp
<testaera name="profile">
    <jsp:getProperty property="profile" name="user_db/>
</textarea>
```

これでよし・・・。

でこのままで実行すると・・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160598/74bbd939-c83d-0e6c-8c83-4a5e05e7fdb3.png)

・・・・？？？空白が！？！？！
ソースをいじっていたらなおった

上のコードをこうした

```jsp
<textarea name="profile"><jsp:getProperty property="profile" name="user_db"/><textarea>
```

もしかしてこれ・・・インデントで空白はいってたのか・・・・・。
Goでmackerel-agent-pluginのデータをサービスメトリックに表示させるラッパーを作った

# ※追記
@a-know さんよりコメント頂いた通り、mackerel-agentの新しい方だと`custom_identifier`を使えばカスタムメトリックとして投稿出来ました！
このラッパーの意味がもう(ry
ただカスタムメトリックとして投稿するには、mackerel-agentが動いてる監視用サーバが必要になるので、現状serverlessで監視しようとすると、このラッパーを使うしかないと思います。

# MackerelでAuroraを監視する際に困ったこと
* 例えばMackerelでAuroraの監視をするとき、**Mackerel AWS Integrationを使おう**ってなります
* しかし、現状Mackerel AWS Integrationは**[Auroraのメトリックに対応してないです](https://mackerel.io/ja/docs/entry/integrations/aws/rds)**
* （「いやいや対応してるよ！」「この方法でいけるぜ！」があれば是非！）

# じゃぁ監視用サーバ建てるか
* `general:watch-server`っていう監視用のサーバ建てて、`mackerel-plugin-aws-rds -engine=aurora`コマンドを発行させます
* そうすると、**監視用サーバのサービス名とホスト情報として**メトリックスが集約されます
<br><br>

* `example.com`ってサービス名のAuroraなのに、`general:watch-server`にメトリックスが表示されて<br>~~**非常に見づらい**~~
* 追記：`custom_identifier`を使えば別サービス名のカスタムメトリックとして表示させれます
* その際は`custom_identifier`がついたホストを事前にcurlか何かで作ってあげてください

# mackerel-cast-service-metricというのをGoで作った
* https://github.com/sioncojp/mackerel-cast-service-metric

# 使い方
## ①releaseから対応してるOSをダウンロードして解凍 or build
* READMEを見てもらえば大体わかるかなと思いますが、こちらは日本語版で紹介

## ②config.toml書く
* 今回はテストでmackerel-plugin-linux、mackerel-plugin-uptimeを打たせます
<br>

* api_keyにmackerelのAPI_Keyを打ち込んでください
* cmdがmackerel-agent-pluginのコマンドです
* service_nameが、Servicesに登録されてる部分
* metric_nameは表示するメトリックの名前の先頭に何かつけたい時つけてください

```bash
$ vim /tmp/config.toml
api_key = "xxxxxxxxxxxxx"

[[rule]]
cmd = "mackerel-plugin-linux"
service_name = "web"
metric_name = ""

[[rule]]
cmd = "mackerel-plugin-uptime"
service_name = "web"
metric_name = "test"
```

## ③実行
```bash
./mackerel-cast-service-metric -c /tmp/config.toml
```

## ④結果
* `Services->service_nameで設定したやつ->サービスメトリック`でご覧ください

### mackerel-plugin-linux
![mackerel-plugin-linux.png](https://qiita-image-store.s3.amazonaws.com/0/29405/16e7c532-7eae-c839-342d-0844e2b8fb43.png)

### mackerel-plugin-uptime
* 先頭にtestってついてる
![mackerel-plugin-uptime.png](https://qiita-image-store.s3.amazonaws.com/0/29405/ad865398-d6be-e5ea-fc67-d766519e592c.png)


# 最後に
* これをlambdaでコマンド発行し、監視させようと実験中です。Serverless!
Python3で同じ画像ファイルを探す方法


画像ファイルをmd5のハッシュにして、比較するという簡単な方法です。

`imgs`フォルダに入っている画像達で、`hoge.jpg`と全く同じものが存在するか確認する方法です

```python
import hashlib
from glob import glob
target = open("hoge.jpg", "rb").read()
target_md5 = hashlib.md5(target).hexdigest() 

files = glob("imgs/*.jpg")

for file in files:
    with open(file, 'rb') as image:
        image_data = image.read()
        image_md5 = hashlib.md5(image_data).hexdigest()
        if md5 == target:
            print("👀", end="")
```

結果

```
👀👀👀👀👀👀👀👀👀👀👀👀👀👀👀👀👀👀👀
```
兄弟階層にあるセレクトボックスの選択値を取得する

セレクトボックスたくさんあって、まとめてだったり個別にだったり、値をとるときのやりかた。
JSもjQueryもまだ全然慣れてないので、１ステップずつ進む感じで残しとく。
未来の自分へのポエム風。


セレクトボックスのサンプルおいとく。

```
<div id=selectbox>
	<div id="selectbox-1-2-3">
		<select>
			<option value="1">one</option>
			<option value="2">two</option>
			<option value="3">three</option>
		</select>
	</div>
	<div id="selectbox-4-5-6">
		<select>
			<option value="4">four</option>
			<option value="5">five</option>
			<option value="6">six</option>
		</select>
	</div>
<div>
```

## id大事
div配下にセレクトボックス配置して、divにidふったある。
セレクトボックスに直接idふったパターンもあると思うけど、兄弟まとめてとるやったら親/先祖のdivのを使うんがえぇやろ、という思い。
特に、テスト自動化したいなら、えぇ感じにid指定しといた方がよろしい。


## 個別にセレクトボックス要素とってみる
個々のselect要素の値を取りたい。
”親のIDがコレでセレクトボックスとってや”って感じで指定する。

```
$("#selectbox-1-2-3 select").text()
```

これで選択リストの"one"、"two"、"three"がごっそりとれる。

## 選択した値だけ欲しいYO!
option:selectedをつけるがよい。

```
$("#selectbox-1-2-3 option:selected").text()
```
そん時選んだやつだけ取れるで。

## 兄弟階層まとめて取るのはよ
もひとつ親のdiv使うんやで。

```
$("#selectbox option:selected").text()
```
兄弟のセレクトボックスの選択値がくっついてとれる。

## 一個ずつばらしてぇなぁ
each使えばいけるで。

```
$("#selectbox option:selected").each(function(i, value){
    $(value).text()
});
```
ようけあるセレクトボックスの選択値だけが、バラバラにゲットできよるで。
TortoiseSVN リポジトリブラウザでフォルダ数の多いリポジトリを開くのが遅い（というか固まる）

現象
----------------------------------------------------------------------

サーバ側の Subversion リポジトリにディレクトリが多い場合、TortoiseSVN のリポジトリブラウザで表示しようとすると、ダイアログが固まったまま反応しなくなる.


原因
----------------------------------------------------------------------

TortoiseSVN のリポジトリブラウザは表示を高速化させるために、ディレクトリの先読みを行う. しかし、先読みするディレクトリが多すぎると逆にそれが悪影響を及ぼす模様.

対策
----------------------------------------------------------------------

TortoiseSVN の Settings > General > Dialogs3 の、「Pre-fetch folders for faster browsing」のチェックを外す. ディレクトリを開くたび情報取得のリクエストが飛ぶが、先読みで固まることはなくなる.

![tortoisesvn.jpg](https://qiita-image-store.s3.amazonaws.com/0/156330/2fd98ad1-ecd8-5333-acbe-6ad01dbdc2a8.jpeg)

備考
----------------------------------------------------------------------

この現象は TortoiseSVN の問題であって、Subversion 自体は問題ない. ただ、リポジトリブラウザは便利なので、できればこのような状況にならないように、コミットするディレクトリの配置は工夫した方がいいかも.
gulpから巣立つときがきた

ほんの数週間前まではいかに[gulp](http://gulpjs.com/)をこき使って開発するかに心を砕いていましたが、  
最近になって「実は無くても結構イケるんじゃね?」と思ったので色々いじってたらpackage.jsonからgulp-hogeがみるみるうちに消えていった。そんなお話です。

# gulpとは

みんな大好き、おなじみの[gulp](http://gulpjs.com/)。  
まず初めに「gulpとは何なのか、彼はどこから来てどこへ行くのか」という哲学的な思考に耽ってみましょう。

公式によると

> gulpとは
- 自動化 - gulpを使うと開発フローにおけるダルい作業を簡単に自動化できます
- 非依存型プラットフォーム - メジャーなIDEには全部対応してるし、色んなプラットフォームで使えますよ
- 強力なエコシステム - 大量のnpmモジュールを駆使すればなんでもできますよ
- シンプル - 使い方も簡単ですよ

([githubリポジトリ](https://github.com/gulpjs/gulp)のREADMEより適当に翻訳)

要するにダルいことはなんでも任せられるわけですね。

* AltJSやscssなどのトランスパイル
* テスト実行
* ブラウザの自動リロード

などなど。

そんなgulpのプラグイン、その数なんと約9000。

![search_gulp.JPG](https://qiita-image-store.s3.amazonaws.com/0/116434/cdcc05f4-8a27-5fd6-b9e2-e64218630546.jpeg)


一昔前までは[grunt](http://gruntjs.com/)と覇権を争ってましたが、githubのフォーク数やスター数を見る限りでは、両者の争いはgulpに軍配が上がったと見て良さそうです。

# なぜ私はgulp離れを決意したか

そんなgulpからなぜ離れようとしたかというと、色々理由があるわけです。

## 1. おや...公式の様子が...?

2017-01-20時点で、最新が2016-02-09にリリースされたv3.9.1。  
それまでのリリースの頻度と比べると明らかにペースが落ちてます。  
コミットグラフを見ても、開発自体がだいぶ下火になっているようですので、このまま使い続けるのはリスクかと思われます。

![commits.JPG](https://qiita-image-store.s3.amazonaws.com/0/116434/5deb3dcb-6037-0e6a-5152-fe0f8b798fef.jpeg)


## 2. プラグイン多すぎ問題

基本的にgulpには何らかのプラグインが必要になります。  
ていうか何らかのツールを導入するたびに、それに対応したgulpのプラグインが要求されます。

すると、package.jsonに「gulp-hoge」がズラッと並ぶわけです。  
npm(あるいはyarn)で管理しているとはいえ、パッケージが増えすぎるのは考えものです。  
それぞれのプラグインのメンテが続いてるか追いかけるのもダルいですしね。
しかも、例えばtypescriptを導入しようとしたらgulp-typescriptも必要になるという感じで、ダブってる感が凄まじいです。


## 3. 何でもできるけど...

これは個人的に結構大きな理由です。
確かにgulpはプラグインも駆使すれば大抵のことは自動化できます。
しかし、**gulpじゃないとできないことは皆無に近いです**。

極論するとgulp自体はただのラッパーみたいなものなので、  
gulpで定義できるタスクはだいたいnpm scriptsにshellで書けます。

例えばPhantomJSを使ったテストの実行ですが

こんなのが

```js:task.js
const gulp = require('gulp');
const mochaPhantom = require('gulp-mocha-phantomjs');

gulp.task('test-client', () => {
    return gulp.src(['tests/client/test_runner.html'], {read:false})
        .pipe(mochaPhantom({reporter: 'spec'}))
        .on('error', (error) => {
            console.error(error);
        });
});
```

これで済んじゃうんです。

```json:package.json
{
  //省略
  "scripts": {
    "test-client": "mocha-phantomjs -R spec tests/client/test_runner.html"
  }
  //省略
}
```

ん?こっちのほうが簡単じゃね?

(当然、gulpで定義したほうが楽なときもあるかと思います)


## 4. 強力すぎるライバルの出現

はい、[webpack](https://webpack.js.org/)です。
詳しい話はここでは避けますが、webpack自身がかなり機能が豊富ですので色々できます。
Qiitaやネット上でもwebpackの記事が増えてきたような気がします。

ちなみにwebpackは予め設定ファイル作っておけば簡単にnpm scriptsから呼び出せるのもいい感じです。

個人的にはそう遠くないうちにwebpackが覇権を握るのではないかと思ってます。

# そして巣立ちの時が来た

というわけで、プロジェクト内からgulp-hogeを極力排除したわけですが
以下の点が良かったかなと思ってます。

* node_modulesがスリムになった
* パッケージごとの役割分担の明確化(何でもかんでもgulp一人にやらせるのはよくないね)
* `npm run` の可能性に目覚めた

まあ、Node.jsのサーバサイドの開発用に「nodemonで起動してソースの変更を検知してNode.jsの再起動をかけてbrowser-syncを使ってブラウザもリロード」という辺りはnpm scriptsで実現するのは果てしなくめんどくさそうなので未だにgulpに頼ってるわけですが...

というわけで結論としては

1. gulpにやらせてることはだいたいnpm scriptsでもっと簡単に実現できる
2. 複数のパッケージを組み合わせたり、処理が複雑になるとnpm scriptsだと辛くなるのでgulpみたいなラッパー使ったほうが楽

巣立つときがきたといいながら巣立ちきれてないのはご愛嬌ということで...
cakephp3で暗号化したパスワードで認証する方法「絶対やるなよ！」

| cake version | 3.3.11 |
|:-:|:-:|

ここに絶対やるなよ！って書いてありますが、どうしてもやりたい人のために記載しておきます。
https://book.cakephp.org/3.0/ja/core-libraries/security.html

### ハッシュでの比較をしない（絶対やるなよ！）パスワードハッシャを作成。

```php:src/Auth/NonPasswordHasher.php
<?php
namespace App\Auth;

use Cake\Auth\AbstractPasswordHasher;

class NonPasswordHasher extends AbstractPasswordHasher
{

    public function hash($password)
    {
           return $password;
    }

    public function check($password, $hashedPassword)
    {
         return $password === $hashedPassword;
    }
}
```

### ユーザマスタのEntityにパスワード暗号・復号化のSetterとGetterを書く。

※Usersテーブルのpasswordフィールドは、大きめのvarcharかtextで。

```php:src/Model/Entity/User.php
<?php

use Cake\Utility\Security;
..
class User extends Entity{
    private $passwordKey = '33 Keta Ijou No Mojiretu Wo Iretene';
//configに宣言してもOK。ほんとはレコード毎に用意しなくちゃ偉い人に怒られます！
    ....
    protected function _getPassword($value)
    {
        if ($value) {
            //↓これ大切！！
            return $this->dirty('password') ?
              $value :
              Security::decrypt(hex2bin($value), $this->passwordKey);
        }
    }
    protected function _setPassword($value)
    {
        if ($value) {
	    return bin2hex(Security::encrypt($value, $this->passwordKey))
        }
    }
}
```
### APPコントローラに認証設定
```php:src/Controller/AppController.php
class AppController extends Controller
{
    public function initialize() {

        $this->loadComponent('Auth', [
            'loginAction' => [
                'controller' => 'Users',
                'action' => 'login'
            ],
            'loginRedirect' => [
                'controller' => 'Users',
                'action' => 'index'
            ],
            'authenticate' => [
                'Form' => [
                    'userModel' => 'Users',
                    'fields' => [
                        'username' => 'username',
                        'password' => 'password'
                    ],
                    'passwordHasher' => [
                        'className' => 'Non',//NonPasswordHasherを指定
                    ]
                ]
            ]
        ]);
        $this->Auth->sessionKey = 'Auth.User';
        $this->Auth->allow(['login','logout']);
    }
}
```
### ご注意！！
テーブル挿入・更新時などsetterが呼ばれた後にまさかgetterが呼ばれているとは気づかず、生パスでDB登録されることがわかりましたorz

とりあえずgetterでdirty判定をつけてやれば、登録できましたが、本当にこんなんでいいのか分からないです。
たとえばテーブル挿入・更新時にserializeして、取り出す時はunserializeする時とか正しい方法はどうやるんでしょうね。
詳しい方教えてください。

```php:
class UsersController extends AppController
  ...
  public function edit($id = null)
  {
    $user = $this->Users->get($id);
    $user = $this->Users->patchEntity($users, $this->request->data);
    //↑ここでは、ちゃんとUser::_setPasswordが呼ばれて暗号化されてる
    if(!$user->errors()) {
      if ($this->Users->save($user)) {
        //↑ここで$entity->extractからのUser::_getPasswordが呼ばれて復号化されてupdate実行..orz
        ...
      }
    }
  }
}
```
統計学入門演習12.10を解きながら、pandasでの散布図の書き方を確認する。

# 概要
12-10の問題は、
自民得票率と持ち家比率の相関係数を検定する問題です。
資料はかなり古い(1983年の総選挙！！)ですが、持ち家を持っているほど自民党が有利になるように見えて面白いです。

そこで、単に解くだけでなく、pandas, matplotlibあたりを使って、グラフも表示することにしました。

# 環境
- windows10 64bit
- python3.5
- jupyter-notebook

必要なライブラリなどは、http://www.lfd.uci.edu/~gohlke/pythonlibs/ からダウンロードしました。pip installで入れると動かないこともありました。

# ライブラリ
```
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
```

# データ作成
p.65 表3.13からコツコツとcsvにデータを入れこみます。
出来上がったcsvファイル(table_3_13.csvと名付けました。）を下記のようにして、dataframeに読みこみます

```
df = pd.read_csv('table_3_13.csv', encoding='shift-jis') 
#結果が文字化けするようであれば、encodeを確認します。
df
```
こんな感じで、読み込むことができました。
![table_3_13.png](https://qiita-image-store.s3.amazonaws.com/0/33670/c9801584-b3ef-052c-ec05-dc9bc08a7f0d.png)


# グラフ作成
単純なグラフは下記のようにして表示します。

```
d = df[0:47] #北海道から沖縄だけの結果だけにしぼりました。
#グラフを見るとなんとなく相関があるように見える。
plt.xlabel(d.columns[1])
plt.ylabel(d.columns[2])
plt.scatter(d[[1]], d[[2]])
plt.show()
```

![scatter_01.png](https://qiita-image-store.s3.amazonaws.com/0/33670/b8dd52c6-2b37-8e0a-36a2-661c1c01fa5f.png)

持ち家比率と自民党得票率には相関があるように見えます。

# グラフの各要素に文字をつけて、どの県のものか分かるようにする。

```
#各要素に文字をつける
fig, ax = plt.subplots(figsize=(15,15)) #グラフがある程度大きくないと、県名が見えない。
df.plot(1, 2, kind='scatter', ax=ax)
for k, v in df.iterrows():
    ax.annotate(v[0], xy=(v[1], v[2]), size=12) #v[0]に県名、v[1]が自民得票率、v[2]に持ち家比率が入っている。
plt.show()
```

![scatter_02.png](https://qiita-image-store.s3.amazonaws.com/0/33670/7bade3cf-ba11-ef3e-1a92-300fec267592.png)

ぱっとみると地方ほど持ち家比率が高そうなことが分かります。

# 相関係数を計算する
pandasは、corrメソッドを使うと簡単に計算できます。
こんな感じでした。

```
d.corr()
```
| | 自民得票率 | 持ち家比率 |
|:-----------|------------:|:------------:|
| 自民得票率 | 1.000000 | 0.638782 |
| 持ち家比率 | 0.638782 | 1.000000 |

# 相関係数はどれくらい確からしいのか？
求められた相関係数は、どれくらい確からしいのかを確認するために、検定を行います。
ここで、相関係数の検定として、フィッシャーのz変換を使います。
フィッシャーのz変換は、下記のようなものです。
## フィッシャーのz変換
2次元正規母集団があるとき、母相関係数を$\rho$, 標本相関係数を$r$とするとき、
$$
z=\frac{1}{2}\log\frac{1+r}{1-r}
$$
$$
\eta=\frac{1}{2}\log\frac{1+\rho}{1-\rho}
$$
と変換する。
このとき、$z$の標本分布が、データ数$n$が多いとき、正規分布$N(\eta,1/(n-3))$となる。
したがって、$\sqrt{n-3}(z-\eta)$は、標準正規分布$N(0,1)$に従う。

## 実際に検定してみる。
### i) 帰無仮説：母相関係数が0.0
$\rho=0.0$として、下記のようにpythonで計算します。

```
n=48 #データ数
r = 0.638782
rho = 0.0

z= 0.5*np.log((1+r)/(1-r))
eta = 0.5* np.log((1+rho)/(1-rho))

Z = np.sqrt(n-3)*(z-eta)
print("Z=",Z) #Z= 5.07216324479
```

一方、$Z_{0.025}=1.96$程度なので、明らかに$Z_{0.025} < Z$なので、仮説は棄却される。
よって相関がないとは言えない（有意水準0.05)


### i) 帰無仮説：母相関係数が0.5
$\rho=0.5$として、i)と同じようにpythonで書いたらこんな感じです。

```
n=48 #データ数
r = 0.638782
rho = 0.5

z= 0.5*np.log((1+r)/(1-r))
eta = 0.5* np.log((1+rho)/(1-rho))

Z = np.sqrt(n-3)*(z-eta)
print("Z=",Z)
```

得られた、$z=1.39$について、$Z_{0.025}=1.96>1.39$より、帰無仮説を棄却しない。よって、母相関係数は0.5であるとしてよい。（有意水準0.05)


# 課題
本当は、geopandasとかを使って、日本地図に色を塗ったりしたかったのですが、win10でのインストールに失敗しました。
やり方が分かったら、再度挑戦します。

# cf)正規標準分布のZをpythonではどう求める？

分布関数の面積が、$a$になるときの$Z$の値は、下記の関数で求めることができる
```
stats.norm.ppf(a)
```

今回は、両肩の優位水準0.05なので、下記のように求める。
```
stats.norm.ppf(1-0.025) #1.959963984540054
```

$Z_{0.025}=1.96$というのは、よく知られていると思いますが、上記の結果と同じぐらいですね。
Rubyのバージョンが`rbenv global 2.3.X`で切り替わらない


```
$ rbenv global 2.3.3
$ rbenv versions
  2.1.5
  2.1.6
* 2.1.8 (set by /Users/hoge/.ruby-version)
  2.2.4
  2.2.5
  2.3.1
  2.3.2
  2.3.3
```

うん何故だ。
何がいけないのだーと色々調べてみると、[@DriftwoodJP](https://twitter.com/DriftwoodJP)さんのブログに助けてもらいました。

[[Ruby] rbenv global 2.3.0 でバージョンが切り替わらない](https://www.d-wood.com/blog/2016/02/02_7781.html)


原因は、何故かホームディレクトリ直下に`.ruby-version`がある。
これを削除したら直った。

```
$ more .ruby-version 
2.1.8
$ rm .ruby-version 
$ rbenv versions
  2.1.5
  2.1.6
  2.1.8
  2.2.4
  2.2.5
  2.3.1
  2.3.2
* 2.3.3 (set by /Users/hoge/.rbenv/version)
```
Windows 7 でアップデートができない場合の対処方法

Windows のトラブルでだいぶ時間を取られたのでメモです。

## 症状

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/3d9233bc-a3c2-7f3f-d79c-690c4dd1d9e9.png)

Windows Update でアップデートしようとすると、上のように「更新プログラムを確認しています」のまま進まないことがあります。

## 対処方法

### 1. Windows Update のクリーンアップ

以下の内容を WindowsUpdateReset.bat として保存します。

```bat
net stop wuauserv
net stop cryptSvc
net stop bits
net stop msiserver
rmdir /s /q %systemroot%\SoftwareDistribution
rmdir /s /q %systemroot%\System32\catroot2
del "%ALLUSERSPROFILE%\Microsoft\Network\Downloader\qmgr0.dat" 
del "%ALLUSERSPROFILE%\Microsoft\Network\Downloader\qmgr1.dat"
net start wuauserv
net start cryptSvc
net start bits
net start msiserver
wuauclt /resetauthorization /detectnow%                 
```

コマンドプロンプトを管理者権限で起動し実行します。

### 2. ディスクのクリーンアップ

C ドライブ→プロパティ→ディスクのクリーンアップ
項目全部を選択してクリーンアップを実行します。

### 3. オフラインインストール

下記サイトからツールの最新版を入手します。
http://download.wsusoffline.net/

コマンドプロンプトを管理者権限で起動し UpdateGenerator.exe を実行します。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/38501/e6b7cf72-16f9-937d-2fcd-aa25b4e33e49.png)

[Start] を押すと開始します。
これで必要なパッチを集めてローカルに保管してくれます。

パッチを適用するには client フォルダの UpdateInstaller.exe を実行します。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/38501/2b21a45f-bc0b-b2a3-5e81-840664e83616.png)

[Start] を押すと開始します。
パッチはローカルにあるはずなので、ネットワークケーブルを抜いてもオッケー。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/1d66e9cf-209d-3f5e-899d-00b47d1ff8eb.png)

詰まってる原因となってるパッチがインストールできれば、残りはすんなりとインストールできることが多いようです。

なお 1. のステップを踏んだ場合 Windows Update の最終確認結果がクリアされますので、更新プログラムの確認をもう一度おこなう必要があります。

また更新プログラムのインストール日時が上のように「なし」になってしまうことがあります。この場合はパッチを何か 1 つインストールすれば更新されます。

![windowsupdate.png](https://qiita-image-store.s3.amazonaws.com/0/38501/3ae7627b-2f92-790f-6e6f-aa78a0444d42.png)

以上です。


## 参考

Windows 7 の WindowsUpdate の不具合回避法 (進まない、終わらないなど)
http://blog.goo.ne.jp/psyna_hone/e/cf4334674dcab6634eef72c59446ad9f

Windows7 の Windows Update が終わらない、遅い、進まない問題の解決方法
http://freesoft.tvbok.com/tips/windows_update/not_proceed_update.html

WSUS Offline Update を使った Windows7 の更新
http://blog.goo.ne.jp/psyna_hone/e/f5da928d769272d75dd18b09b2805edb

Windows Update に失敗する場合に確認する項目は？
http://louisianaosc161.blogspot.jp/2012/04/winwindows-update.html
CakePHP3でログイン情報をViewに表示する方法

| cake version | 3.3.11 |
|:-:|:-:|

ViewにログインIDやアカウント名を表示したい時ってありますよね？
セッションにログイン情報が入っているので、セッションから値を表示します。
SessionHelperは使用すべきではないとのことなんで、request->session()を使った方法を載せておきます。

```php:src/Template/Layout/default.ctp
...
ログインID： <?=$this->request->session()->read('Auth.User.login_id')?>
アカウント名： <?=$this->request->session()->read('Auth.User.name')?>
...
```
Alt-JSとしてのScala.jsまとめ


JVM育ちなので、Alt-JSとしてScala.jsを使って何が出来るのか調べてます。

## ScalaでHubot
[newta/scalajs-hubot](https://github.com/newta/scalajs-hubot)
src配下はscalaファイルのみ

[k-kinzal/scalajs-hubot](https://github.com/k-kinzal/scalajs-hubot)
ロジックをscala.jsに切り出している。
通信などのインターフェース部分はjsファイル。
pingを実装。
[参考スライド](https://speakerdeck.com/kinzal/jiang-jun-suhonsaou-riip-miwaku-in-shi-kegu-geeknight-number-7-scalada-ming-falseping-cheng-wei-xin-dian-zhong-tescala)

[ara-ta3/scalajs-with-hubot](https://github.com/ara-ta3/scalajs-with-hubot)
こちらもロジックをScala.jsへ切り出しているパターン。
[参考記事](http://qiita.com/ara_ta3/items/5a222a44957ca6e29fff)

## ScalaでReact
[tastejs/todomvc](https://github.com/tastejs/todomvc/tree/master/examples/scalajs-react)
ScalaのみでReactベースのTodoアプリ。
Paraview Pythonのインストール

オープンソースのデータ解析、可視化アプリケーションであるParaviewをPythonから操作するParaview Python。インストールで、というかどうやって使うと良いかよく分からなかったので、メモ。

# Paraviewとは
http://www.paraview.org/
オープンソースのデータ解析、可視化アプリケーション。OpenFOAMなどOpen CAEの可視化でよく使われる。
PythonによるScripting、Web Browser上での表示等、できることが色々あるので今回インストール。ビルドするのも面倒なので、Binaryをダウンロードしてインストール。

# Paraview Pythonとは
http://www.paraview.org/python/
ParaviewはPythonによってスクリプトを書くことができる。Clientアプリケーション上でも書くことができるが、今回はOpenFOAMの解析結果を自動的に画像、動画にして保存したいので、端末上で開発、実行できる環境を構築したい。

# pvpython, pvbatchの設定、テスト
pvpythonは、起動するとparaviewモジュールがPYTHONPATHに含まれたシェルが起動する。pvbatchがPythonのソースコードを引数に、バッチ処理をするためのもの。基本的に、Binaryをダウンロードした時点で入っているので、Pathを通すだけでOK。

```bash:.zshrc
# Paraview python
export PATH="/Applications/ParaView-5.2.0.app/Contents/bin:$PATH"
```

これで以下の通り動作する。
#### pvpythonの起動

```bash
$ pvpython
Python 2.7.10 (default, Jul 14 2015, 19:46:27)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

#### pvbatchの起動
試しに以下のようなtest.pyを作成して実行。
(参考：http://www.paraview.org/ParaView3/Doc/Nightly/www/py-doc/paraview.simple.html)

```python:test.py
from paraview.simple import *

# Create a new sphere proxy on the active connection and register it
# in the sources group.
sphere = Sphere(ThetaResolution=16, PhiResolution=32)

# Apply a shrink filter
shrink = Shrink(sphere)

# Turn the visiblity of the shrink object on.
Show(shrink)

# Render the scene
Render()

# Save as Image
WriteImage('test.png')

```


```bash
$ pvbatch test.py
```
これで以下のような画像が生成されるはず
![U.png](https://qiita-image-store.s3.amazonaws.com/0/39632/b14c0a84-ac66-27a4-e17b-17185aaadf17.png)
CVE-2016-7117脆弱性のチェックと対応

この記事は
===

* Linuxカーネルのやばげな脆弱性[CVE-2016-7117](https://access.redhat.com/security/cve/cve-2016-7117)の対応をした時のメモです

CVE-2016-7117
===

[この辺](http://jvndb.jvn.jp/ja/contents/2016/JVNDB-2016-005186.html)によると、


> Linux Kernel の net/socket.c の __sys_recvmmsg 関数には、解放済みメモリの使用 (Use-after-free) により、任意のコードを実行される脆弱性が存在します。

で、

> 基本値: 10.0 (危険) [NVD値]
> 攻撃元区分: ネットワーク
> 攻撃条件の複雑さ: 低
> 攻撃前の認証要否: 不要
> 機密性への影響(C): 全面的
> 完全性への影響(I): 全面的
> 可用性への影響(A): 全面的
> 
> [参考] CVSS v3 による深刻度
> 基本値: 9.8 (緊急) [NVD値]
> 攻撃元区分: ネットワーク
> 攻撃条件の複雑さ: 低
> 攻撃に必要な特権レベル: 不要
> 利用者の関与: 不要
> 影響の想定範囲: 変更なし
> 機密性への影響(C): 高
> 完全性への影響(I): 高
> 可用性への影響(A): 高

なんかやばそうですね。。

再現・影響チェック
===

reproducerツール
---

* [RedhatのBugzilla](https://bugzilla.redhat.com/show_bug.cgi?id=1382268)を見ていたところ、[この投稿](https://bugzilla.redhat.com/show_bug.cgi?id=1382268#c19)にreproducerツールがついていました。
* これを使うことで、脆弱性の再現＝チェックができるようです

ツールのコンパイル
---

* 下記の手順でコンパイルします

```
# wget https://bugzilla.redhat.com/attachment.cgi?id=1227131 -O try_recvmmsg.c
# yum install -y glibc-static 
# gcc -Wall -Werror -pthread -static try_recvmmsg.c -o try_recvmmsg
```

* 若干warningが出たりしますが、try_recvmmsgという実行ファイルがカレントディレクトリに出力されます

ツールの実行
---

* 単発で実行してみます

```
# ./try_recvmmsg 
++ running!
++ no panic? got hello!.
```

* このメッセージが出た時点でだめっぽいです
* 下記のように大量実行すると、数分後にサーバがハングして謎のメッセージがたくさん出ました

```
# while true;do ./try_recvmmsg; done
```

カーネルアップデート
---

* アップデートします

```
# yum update
```

ツールの再実行
---

* 再度実行してみると何もメッセージが出なくなっていました。直ったのでしょう。

```
# ./try_recvmmsg 
(何も出ない)
```
CesiumにMapboxのStyleを適用する


こんにちはsekitakaです。

3Dのマップを作成できるCesiumでMapboxのStyleを適用する方法です。

アクセストークン、スタイルID、ユーザー名を編集してSandcastleのコードエディターに貼り付けて実行すれば動作確認できます。
		
```JavaScript
    var MAPBOX_ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN'; // アクセストークン
    var MAPBOX_STYLE_ID = 'YOUR_STYLE_ID'; // スタイル名でないので注意(乱数のようなIDを指定)
    var MAPBOX_USERNAME = 'YOUR_USERNAME'; // ユーザー名

    var viewer = new Cesium.Viewer('cesiumContainer');
    var layers = viewer.imageryLayers;
    
    // タイル画像を取得するURLのフォーマット
    var url = 'https://api.mapbox.com/styles/v1/' + MAPBOX_USERNAME + '/' + MAPBOX_STYLE_ID + '/tiles/256/{z}/{x}/{y}?access_token=' + MAPBOX_ACCESS_TOKEN;
    
    // 独自のURLからタイル画像を取得するプロバイダを作成
    var customImageryProvider = new Cesium.UrlTemplateImageryProvider({
      url : url
    });
    
    // プロバイダを表示レイヤに追加
    layers.addImageryProvider(customImageryProvider);
```

`Cesium.MapboxImageryProvider`というクラスはあるのですが、これは現在のMapboxのStyleで使えるものではないようです。
Styleは基本的にベクターデータのようですが、[ドキュメント][mapbox]によるとコード中に示したフォーマットのURLにアクセスすることでラスタライズされたタイル画像が取得できます。
これをImageryProviderから利用することで地図上に描画される仕組みです。

CesiumでMapboxのスタイルが表示できることで、Cesiumの表現の幅が大きく広がりますね。

以下はアウトドアスタイルを適用した富士山付近の地図です。
![outdoor.jpg](https://qiita-image-store.s3.amazonaws.com/0/18273/bb4d75d4-286b-a02f-f139-c7da047ba55e.jpeg "outdoor.jpg")


[mapbox]:https://www.mapbox.com/api-documentation/#retrieve-raster-tiles-from-styles
MySQLで4byteになるUTF-8文字列を検索する

## utf8mb4

MySQL 5.5.4からデータベースの文字コードに`utf8mb4`を指定できる

* [漢(オトコ)のコンピュータ道 - MySQLコミュニティ騒然！MySQL 5.5.4が与えるインパクト。](http://nippondanji.blogspot.jp/2010/04/mysqlmysql-554.html)

そもそもUTF-8って4byteあることあるんだ…という感想なのですが、ざっくりと非常用漢字、中国語および絵文字はこれに属するようです。

そこからMySQLの「[寿司ビール問題](http://blog.kamipo.net/entry/2015/03/23/093052)」が出てきたんですね、Twitterで見た。

## 問題となりそうな文字列を16進数で検索してみる

* [Shift_JIS-2004 (JIS X 0213:2004)中の文字でUTF-8にすると4バイトになる文字を調べてみた。](https://ah-2.com/2015/09/18/sjis2004_utf8_4byte_chars.html)

ここを見てみると、Shift_JIS内に収まる漢字の中で、問題になりそうなのは `0xf0` から始まる文字のようだ。検索してみよう。

```
mysql> SELECT COUNT(*) FROM target_table WHERE HEX(target_column) LIKE '%F0%';
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+
1 row in set (0.38 sec)
```

あんまりなかった。
Atomで行末にセミコロンを追加する

例えば、次のようなコードを入力していくと c を打ち終えた時点で右側の "] はエディタにより既に入力済みとなっている状況があります。
$a = ["a", "b", "c"]

後は行末にセミコロンを打って次の行の編集に移りたいのですが、このときのカーソルを行末に移動させ、セミコロンを打ち、改行するといった動作が手間に感じることがあります。行末にセミコロンが必要な言語では何度も繰り返し行う必要がある動作です。

そこで、行末にセミコロンを追加するコマンドをつくって、ショートカットキーを割り当てるようにします。

# コマンドとショートカット追加の手順

環境： Atom 1.13

行末にセミコロンを追加
ctrl + ;

行末にセミコロンを追加して改行
cmd + ;

(1) Preferences cmd-, -> 左側「Open Config Folder」ボタン

(2) 以下のファイルを編集

```init.coffee
atom.commands.add 'atom-text-editor', 'custom:semicolonize', ->
  editor = atom.workspace.getActiveTextEditor()
  editor.moveToEndOfLine()
  editor.insertText(";")

atom.commands.add 'atom-text-editor', 'custom:semicolonize-newline', ->
  editor = atom.workspace.getActiveTextEditor()
  editor.moveToEndOfLine()
  editor.insertText(";\n")
```

```keymap.cson
'atom-text-editor':
  'ctrl-;': 'custom:semicolonize'
  'cmd-;': 'custom:semicolonize-newline'
```

(3) ウィンドウをリロード (window:reload ctrl-alt-cmd-l)
 またはエディタを再起動


# あとがき
NetBeansには標準で「ctrl + ;」「ctrl + shift + ;」 があって便利に思っていた人も多いのではないかと思います。結構需要があればパッケージ化した方がいかもしれませんね。

[ATOMエディタでちょっとしたオレオレ関数をつくる](http://qiita.com/MOKYN/items/c84d6b2fd3d7798aa736)
[Atomに現在日時を挿入するコマンドを追加する](http://qiita.com/toruot/items/b26fde1a898bb52985e1)
【Django】django-debug-toolbarを利用する時のメモ

Vagrantで構築したCentOS上にてDjangoを利用したWebアプリケーションを開発をした時、django-debug-toolbarを利用しようとしたらハマったのでメモ

#環境
* CentOS 6.8
* Django 1.10.5
* Python 3.5.2
* djang-debug-toolbar 1.6

#django-debug-toolbarのインストール
```
#pip install django-debug-toolbar
```


インストール結果

```
#pip list --format=columns

Package               Version
--------------------- -------
django-debug-toolbar  1.6    
```
今回は1.6がインストールされた


#REMOTE_ADDRの確認
確認方法はいろいろとあると思うけれど、自分は以下の方法で対応


```py:example_app/view.py
from django.http import HttpResponse
from django.shortcuts import render
from app1.models import Ipaddress
	
	
def test(request):
    ip_addr = request.META['REMOTE_ADDR']
    return render(request,
        'test.html',
        {'ip_addr' : ip_addr}
        )
        
```

```html:test.html
{{ ip_addr }}
```

```py:example_app/urls.py

from django.conf.urls import url
from examle_app import views

urlpatterns = [
    url(r'^test/$', views.test, name='test'),

]
```

```py:example_project/urls.py
from django.conf.urls import include, url
from django.conf import settings
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^example_app/', include('example_app.urls', namespace = 'example_app')), #ここを追記
]
```

この状態でrunserverし、http://IPアドレス:8000/example_app/test/ にアクセスすると、REMOTE_ADDRが表示されるはず


#setting.pyの編集
setting.pyの状態を確認し、不足している部分を追記する

```setting.py
...

DEBUG = True

INTERNAL_IPS = ('127.0.0.1', 'ここにREMOTE_ADDRを書く',)

...


INSTALLED_APPS = [
    ...
    'debug_toolbar', 
    ...
]

...


MIDDLEWARE = [
    ...
    'debug_toolbar.middleware.DebugToolbarMiddleware',
	...
]

...

STATIC_URL = '/static/'

...

DEBUG_TOOLBAR_CONFIG = {
    'SHOW_TEMPLATE_CONTEXT': True,
}

```


#プロジェクト側のurls.pyを編集
プロジェクト側のurls.pyに以下を追記

```py:example_project/urls.py
from django.conf import settings

...
...

if settings.DEBUG:
    import debug_toolbar
    urlpatterns += [
        url(r'^__debug__/', include(debug_toolbar.urls)),
    ]

```

#ページを確認
WEBサーバを起動し、ページを確認すると、画面右側にdebugToolbarが表示されているはず
Stackdriver Monitoring の Uptime Checkのアクセス元IPをFirewall Rulesを作る


こんちは。
GCEのインスタンスへのアクセスをIPとかで制限したいけどUptime Checkもしたい場合、[Stackdriverからのアクセス元IPを知りたい](http://qiita.com/tora470/items/1677d742a80d35e9ec55)ってのを以前に書きました。

今回はそのFirewall Ruleをサクッと作成する物体を書きました。
一応[GitHub](https://github.com/shabutora/uptimecheck-fw)にソースコード置いときます。

**IPのリストは2017年1月20日現在のものです。将来的に変わっていても私は責任を負いません。**

```
gcloud compute firewall-rules create default-allow-uptimecheck \
    --allow=tcp \
    --description="Allow stackdriver uptime check" \
    --network=default \
    --source-ranges="146.148.119.250,146.148.41.163,146.148.59.114,23.251.144.62,54.232.81.104,54.232.88.155,54.232.88.172,54.235.161.191,54.244.253.127,54.245.81.104,54.245.81.193,54.251.48.52,54.251.48.53,54.251.48.56"
```

肝心のIPリストのテキストは[ここ](https://app.google.stackdriver.com/uptime/source-ips)から取れます。

## terraform

私はテラフォーマーなので、tfファイルも置いときますね。

```

resource "google_compute_firewall" "stackdriver_uptime" {
    name = "default-allow-stackdriver"
    network = "default"
    allow {
      protocol = "tcp"
      ports = ["80", "443"]
    }
    description = "allow stackdriver uptime check."
    source_ranges = [
      "104.155.110.139",
      "104.155.77.122",
      "107.21.113.149",
      "107.21.247.114",
      "146.148.119.250",
      "146.148.41.163",
      "146.148.59.114",
      "23.251.144.62",
      "54.232.81.104",
      "54.232.88.155",
      "54.232.88.172",
      "54.235.161.191",
      "54.244.253.127",
      "54.245.81.104",
      "54.245.81.193",
      "54.251.48.52",
      "54.251.48.53",
      "54.251.48.56"
    ]
}

```

ネットワーク、ポート、タグやらは適当に変えてください。
第9回つぶやき勉強会 ~ JS がどんどん楽しくなるクラス ~

以前に ruby で書いたクラスサンプルを JS で書き直す問題を出しました。以下のようなものです。

----

```ruby:rubyの場合
class Person
  def initialize(name)
    @name = name
  end
  def greet
    "My name is #{@name}"
  end
end

person = Person.new("Terada")
person.greet # => "My name is Terada"
```

----

```js:従来のJavaScript
function Person(name){
  this.name = name
  this.greet = function(){ 
                 return "My name is " + this.name
               }
}
person = new Person("Terada");
person.greet(); // => "My name is Terada"
```


上を、ES2015からつかえる class 構文をつかって書き直してみます。

----

```js:ES2015の場合
class Person {
  constructor(name) {
    this.name = name
  }
  greet() {
    return "My name is " + this.name
  }
}
const person = new Person("Terada")
person.greet()
```

どんどん楽しくなりますね。
[CentOS] firewalldで特定のサービスを特定のIPアドレスに対して許可する

## firewalld?
[CentOS7のfirewalldをまじめに使うはじめの一歩（systemdも少し）](http://qiita.com/shrkw/items/8410e9cb65eb789a40e1)
が詳しいと思います。

## やりたいこと
デフォルトのzone(public)のルールはそのままに、特定のサービス(今回はMySQL)を特定のIPアドレスに対してのみ許可したい

## 方法
カスタムのzoneを作成してあげることで実現します

```bash:MySQLを特定のIPに許可してあげる.sh
firewall-cmd --permanent --new-zone=mysql # --permanentオプション必須 zone名は任意
firewall-cmd --reload

firewall-cmd --permanent --zone=mysql --set-target=ACCEPT
firewall-cmd --permanent --zone=mysql --add-service=mysql
firewall-cmd --permanent --zone=mysql --add-source=192.168.0.0/24 # 許可するソース
firewall-cmd --reload

firewall-cmd --get-active-zones # 追加したzone(+ソース)が表示されればOK
```
`--set-target`ってのを設定するのに苦労しました

## 参考
http://www.firewalld.org/documentation/man-pages/firewall-cmd.html
http://serverfault.com/questions/684602/how-to-open-port-for-a-specific-ip-address-with-firewall-cmd-on-centos/684739#684739
RStudioインストール(2020年 Windows)

#動機
RStduioで使いやすくしようと考え、前記事[「R言語インストール(2020年 Windows)」](http://qiita.com/FukuharaYohei/items/8e0ddd0af11132031355)に続いてRStudioもインストールしました。そのメモです。

#ダウンロード
[公式サイト](https://www.rstudio.com/products/rstudio/download/)からインストーラーをダウンロードします。ダウンロードページからFreeのRStudio Desktop Open Source Licenseを選択します。2020/5/25時点ではバージョン1.3.959です。
環境：Windows7 32bit(LinuxでもMacでも使えます)
Windows10 64bitでも同じ操作でインストールできることを確認しました。
※2020年5月に最新版でインストールし直して手順の再確認しました。一部スクリーンショットは旧バージョンインストール時のものですが、ファイルサイズ等細かい部分以外変わらなかったのでそのままにしています。

#インストール
##1. インストーラーを実行し、インストール先フォルダを選択
![RStudio_Install_01_Folder.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/fb3e92d1-528f-8946-a368-bcdff72fa017.jpeg)
##2. スタートメニューフォルダを選択
![RStudio_Install_02_Menu.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/15815ec1-4a2c-3f8a-88ca-2a1e848855f4.jpeg)
##3. 正常終了のメッセージ   
![RStudio_Install_03_Completed.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/f79fc88b-cdad-3b07-cb77-6c09faaefa36.jpeg)

#試してみた
1. メニューから起動します。
![RStudio_Start_01_Start.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/d1595971-9381-a40f-d98d-05c4f1896b30.jpeg)
2. R言語をインストールした時と同様、"plot(cars)"と試しにコマンド実行。
いい感じに実行された結果が見られます。
![RStudio_Start_02_Try.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/6d2a9971-cb33-fc3c-fa06-9616ad273a19.jpeg)
記事[「【R入門】R言語の基本的な使い方」](https://qiita.com/FukuharaYohei/items/b862bc900a9904a5d54f)で基本的な使い方に関する解説をしています。
ログイン機能の実装について、おおまかな仕組み

ログイン機能の実装について、おおまかな仕組み
======================================

はじめに
-------

ログイン機能を自前のWebアプリに実装するときに、必要になる要素技術を自分用にまとめようかと思う。コードやハウツーではなく、どの機能にどのような理論が必要になるか、など、実装以前の内容を**自分用に**まとめようかと思う。あくまで**自分用に**である。大事なことなので3回言いました。

何がしたいか
-----------

そこまで本気ではないが、ある程度のセキュリティで、自分のページにくるユーザがログインして、ログイン状態を維持したまま、継続的にサービスを利用できるようにしたい。

ユーザのする作業の流れ
-------------------

ユーザのする作業の流れ。

1. アカウント作成ページにアクセスする
2. アカウント名とメールアドレス、それと、パスワードを入力する。
        それと、CAPTCHAを入力する
3. メールを受信する
4. メールのなかのアドレスをクリックする、
      あるいは、メールで教えられた文字列を専用のページに入力する
5. 登録完了
6. ログインページにアカウント名とパスワードを入力する

使用する理論や技術
----------------

* 一方向ハッシュ関数
* クッキー
* UUID
* TLS(HTTPS)
* Googleの[reCAPTCHA](https://www.google.com/recaptcha/intro/)
* DropBoxのパスワードチェッカー([zxcvbn](https://blogs.dropbox.com/tech/2012/04/zxcvbn-realistic-password-strength-estimation/))
* データベース
* passwdフォーマット

前提
----

* 当然、接続はHTTPSのみとする。できればHSTSを利用する
* ここでの「ランダム」は暗号学的なランダムとする。
        OSの/dev/urandomあたりの使用を検討

サーバ側の動作の流れ
------------------

### アカウント作成(サインアップ)

0. アカウント作成ページでCAPTCHAを提示する
0. アカウント作成ページではユーザのパスワードの強度を監視する
1. アカウント作成ページからのユーザの入力を受けとる
1. CAPTCHAをチェックする
2. アカウント名の重復をチェックする(データベースへのアクセス)
3. メールアドレスの重復をチェックする
4. ソルトをランダムに生成する(20文字くらいか?)
5. パスワードにソルトをつけたものの
        ハッシュ(ストレッチングが必要1000回くらい?)を生成する
6. アカウント名とソルトとハッシュを保存する(データベースへ)
7. そのとき、アクチベートフラグを偽としておく
8. ランダムなUUIDと、それを含むアクチベート用アドレスをメールで送信する
9. ユーザはアクチベート用アドレスをクリックするか、
        専用のページにUUIDを入力する
10. アクチベート用のUUIDが正しければアクチベートフラグを真にする
11. 30分ごとにチェックして、
        アクチベートフラグが偽のものは偽偽として、
        偽偽のものはテーブルから削除する

### ログイン

1. ログインページの入力を受けとる
2. アカウント名からソルトとハッシュを検索
3. 入力されたパスワードとソルトからハッシュを生成する
4. 2つのハッシュが一致すれば、ランダムにUUIDを生成し、
        アカウント名とUUIDとをデータベースに保管する
5. UUIDをクッキーに保存させる
6. このとき、クッキーが他のサイトから見られないような設定にする

### ログイン状態

1. クッキーにUUIDがあれば、それを使ってデータベースから
        アカウント名を検索する
2. UUIDは毎日0時に削除候補とする。削除候補は削除する

こんな感じ
---------

こんな感じでログイン機能はつけられるかと思う。セキュリティ的にも大きな問題はないかと思うが、もうすこし調べてみよう。セキュリティ的な問題や、その他運用上に問題があったら、修正する予定。

補足
----

あまり、多人数の使用が予想されないのであれば、アカウント名、ソルト、ハッシュについては、passwdフォーマットでバックアップをとっておいたほうがいいかもしれない。システムを変更するときに、持ち運びたいだろうから。

安全性の確認
-----------

上記の仕組みが安全であることを、ざっくりと確認してみる。

### 大量のアカウント取得への防御

* キャプチャによって、あるていどは避けることが可能。
* ひとりの人がアカウントを多数取得してしまうことは
        有効なメールアドレスが必要であることで、
        あるていど回避できる

### パスワードの漏洩について

* HTTPSなので、(適切に運用されていれば)通信中の漏洩の可能性は
        無視できるくらいに低い
* サーバ側からの漏洩については、
        メモリからの漏洩とハードディスクからの漏洩に分けられる
* メモリからの漏洩については、
        ふつうの高級言語を使っていれば可能性は低い
        (C言語を使っているとありえる。Heartbleedなど)
* ハードディスクからの漏洩については、
        ソルトを使ってハッシュ化しているので、
        パスワードが適切なものであれば、
        予測される可能性は低い
* パスワードが適切でない可能性は、
        アカウント作成時のJavascriptによる監視で、
        多少は低くできるだろう

### クッキーのUUIDの漏洩・予測について

* HTTPSなので、通信中の漏洩の可能性は低い
* 他のサイトからクッキーがのぞけないようにする必要がある
* 暗号学的なランダム値を使っていればUUIDを予測することは困難

### そのほか

そのほかにもセキュリティ上、考慮する必要があることはあるか。思いつきしだい追加する予定。

また、セキュリティ上、または、その他、運用上注意する必要がある事柄がありましたら、コメントしていただけると、ありがたいです。