OmniAICreator/Qiita-1.07M huggingface dataset:
BLEnano Nordic nRF51 UARTで受け取った文字を、HIDキーボードとして、タイプする。

![Qiita-BLENano_HidKeyboard01.jpg](https://qiita-image-store.s3.amazonaws.com/0/75594/48c907ff-eb22-8afb-7b46-e5a980f98b5b.jpeg)

- TeraTermにタイプすると、iPhoneに文字が出るよ。
- Terminalに打てる文字、なので、特殊キー対応できてない。(Enter, ESC, BSあたりはOK。PgUpとか、Fxxはだめ)
    - 直接、キーコードをとって、シリアルに投げるプログラムを書けば...

## 概要
- BLE HIDキーボードしてiPhoneに接続、Windowsのシリアルターミナルで打った文字をタイプ(転送)する。
- Nordic のサンプルコード(ble_peripheral/ble_app_hids_keyboard)ベースに、
    - UART通信、と
    - ASCIIからKeyScanコード変換
    <br>をすればできるだろうと。
- @Biaccoさんの記事「[ErgoDox BT の設計・実装に試行錯誤した話あらため試行錯誤している話](http://qiita.com/Biacco/items/259c36cfb36f4ee8dd49)」への[コメント](http://qiita.com/Biacco/items/259c36cfb36f4ee8dd49#comment-b3ad7f41e148241af904)
    - Windowsメモ帳に、`hello`とタイプされていくやつ。<br>![Qiita-BLENano-HID-Test01.png](https://qiita-image-store.s3.amazonaws.com/0/75594/2adeb0e7-081d-b451-91c7-8af34885efcf.png)<br>のつづき。


## 環境
- Windows 7 (64bit)
- TeraTerm - 38400bps設定
- BLENano(NRF51822/RAM:32KB) + MK20 USB Board
- Keil MDK-ARM v5.20 Lite(無料版コードサイズ32KB制限) 
- Nordic SDK v10 (SoftDevice S110 v8.0.0)
- サンプルコード:<br>
`nRF51_SDK_10.0.0_dc26b5e\examples\ble_peripheral\ble_app_hids_keyboard\pca10028\s110\arm5_no_packs\ble_app_hids_keyboard_s110_pca10028.uvprojx`

## とりあえず...
- ソースコード: https://github.com/mt08xx/ble_app_hids_keyboard_uart
- HEXファイル: [`ble_app_hids_keyboard_uart_mt08qiita.hex`](https://raw.githubusercontent.com/mt08xx/ble_app_hids_keyboard_uart/master/pca10028/s110/arm5_no_packs/ble_app_hids_keyboard_uart_mt08qiita.hex)<br>これをBLENanoに焼けばよい。
- BLENanoをMK20にくっつけて、PCに挿したまま、Teraterm起動して、
    - `mbed Serial Port`選択 
    - 通信速度38400bpsに設定(ALT+S,E)

## 手順
1. nRF51 SDK v10を解凍
2. `examples\ble_peripheral\ble_app_hids_keyboard_uart\` となるように、<br>`git clone https://github.com/mt08xx/ble_app_hids_keyboard_uart.git`
3. プロジェクトファイルをダブルクリック(MDK-ARMがひらく):<br>`pca10028\s110\arm5_no_packs\ble_app_hids_keyboard_s110_pca10028.uvprojx`
4. MDK-ARMでビルド(F7)<br>`nrf51422_xxac_s110.hex`ができる。(`pca10028\s110\arm5_no_packs\_build\`の中)
5. SoftDeviceと合体させる(srec_cat.exe使用)
6. 5.のHEXを、`mbed`ドライブに放り込む。

## 説明
- `ble_app_hids_keyboard_uart\usr_uart.c`
    - Nordic API: `APP_UART_FIFO_INIT()`、UART周りの設定、コールバック関数の登録
    - Nordic API: `app_uart_get()`で、1文字受信
    - Nordic API: `app_uart_put()`で、1文字送信
Carthageを使っていて"$(SRCROOT)/Carthage/Build/iOS/*.framework"を打ち飽きた方へ

# 作ったもの

`Carthage/Build/[Platform]/`内のframeworkを`Run Script`の`Input Files`に書き込みます。

* [ken0nek/CarthageInputFiles](https://github.com/ken0nek/CarthageInputFiles)

![usage.gif](https://qiita-image-store.s3.amazonaws.com/0/58141/910c208b-fa83-5623-3fbc-585bb151c50a.gif)

## Ver 0.3

- 差分機能
- プレビュー機能
- 選択機能
- 出力の色付け

を付けました

## Ver 0.4

- ターゲット一覧から処理したいターゲットを選択できるようにしました。

Carthageを使うときに`$(SRCROOT)/Carthage/Build/iOS/*.framework`などと毎回書くのがめんどくさかったので作りました。
1年前くらいからpythonでは作ってあったのですが折角なのでSwiftで作ってみました。

## 実行結果

![Screen Shot 2017-01-02 at 11.57.09 AM.png](https://qiita-image-store.s3.amazonaws.com/0/58141/7f89f9e1-764b-7735-b6e1-456f5ef5a1bf.png)

# 使い方

1. `Cartfile`を作成
`Cartfile`を作成し、その中にライブラリを追加してください。

1. `carthage update`
まずはビルドしてframeworkを生成します。

2. `Run Script`を追加
Xcode -> Targets -> Build Phasesの左上の`+`ボタンを押して`Run Script`を追加します。
`/usr/local/bin/carthage copy-framework`

3. `carthage-input-files YourXcodeProject.xcodeproj`
このコマンドで`Input Files`のところにframeworkが書き込まれます。
~~現在は`$(SRCROOT)/Carthage/Build/[Platform]/`内のframeworkを全て書き込んでしまうので、~~
~~もし余計なものが入ってしまった場合は、実行後に`Input Files`のところの`-`を押して消していただきたいです。~~（Ver 0.3で修正）

4. diffをなくす
現状コマンドを実行したままだと、`project.pbxproj`のフォーマットの違いから大量のdiffが発生してしまいます。
それを解消するために、実行結果を確認するついでに、`Input Files`の`+`を一度押して、その後、`-`を押していただきたいです。
そうすると、いままで通りのフォーマットになって実際の差分だけを取り出すことができます。

![work-around.gif](https://qiita-image-store.s3.amazonaws.com/0/58141/eac44446-fffe-c625-3c58-a715e425a693.gif)

# インストール方法

```zsh

git clone git@github.com:ken0nek/CarthageInputFiles.git // or git clone https://github.com/ken0nek/CarthageInputFiles.git
cd CarthageInputFiles
make install
```

で、`/usr/local/bin`に`carthage-input-files`というコマンドが置かれます

# 展望

- [x] frameworkの選択 （Ver 0.3）
- [x] targetごとに設定 （Ver 0.4）
- [ ] `Run Script`ごと追加 <- keyをどうやって決めればいいのかが分からないです

# 免責

`project.pbxproj`をいじるものなので、最悪プロジェクトが開けなくなってしまう場合が起きてしまうかもしれませんが、ご自身の責任でご利用ください。

バグや改善点がありましたらプルリクなどお待ちしております、、

# 参考

* [Swift Package Manager (SwiftPM) で作るコマンドラインツール - Qiita](http://qiita.com/mono0926/items/e8fdd97115780204f797)
* [JohnSundell/SwiftPlate: Easily generate cross platform Swift framework projects from the command line](https://github.com/JohnSundell/SwiftPlate)

---

* [0xced/xcproj: Command line tool for manipulating Xcode project files](https://github.com/0xced/xcproj)
* [tomlokhorst/Xcode.swift: Swift library for reading and writing Xcode project files in OpenStep format](https://github.com/tomlokhorst/Xcode.swift)
* [venmo/synx: A command-line tool that reorganizes your Xcode project folder to match your Xcode groups](https://github.com/venmo/synx)
* [.xcodeproj/project.pbxproj を解読する - Qiita](http://qiita.com/yokomotod/items/02e395e99bb891d27f67)
Python, Selenium, PhantomJSを使ってルータを再起動する

# 概要

Python, Selenium, PhantomJSを使ってルータを再起動、並びに、ルータからWAN側IPアドレスを取得します。

# 経緯

自宅がまだ固定IPアドレスではないため外部から自宅へ接続しようとすると、その都度自宅に設置しているルータのWAN側IPアドレスを調べる必要があります。これまでは外部サーバを利用して自宅LANからWAN側IPアドレスを取得する方法を採用していました。このとき、ルータの問題なのかプロバイダの問題なのかは不明なのですが、時々外部との通信ができなくなる場合がありました。これはルータを再起動することで回復することは分かっていました。ただ、外出中に自宅との通信ができなくなった場合、外部から再起動することができず、自宅に帰るまで復旧不可に陥っていました。この状況では自宅から数日間離れる場合に大きな問題になっていました。

この問題を解消するために、可能な限り今ある環境で安くできればと今回ご紹介する方法を採用しました。すなわち、Selenium, PhantomJSを使用して通信障害発生時にルータを再起動させるようにしました。もっと良い方法があるかと思われますが、この方法でルータを再起動し、さらにルータから直接WAN側IPアドレスを取得することができるようになり、LAN内だけで完結できるようになりました。
本内容が他の方々のお役に立てることができればと投稿させていただきました。

# 準備

このスクリプトが対象としているルータはNTTからお借りしているONUとルーターが一体型の三菱電機社製 PR-500MIです。他のルータをご使用の場合はそれぞれの環境に合わせてご変更をお願いします。スクリプトを使用するために必要なものは次の通りです。

1. Python

2. Selenium（pip install selenium でインストールします。）

3. PhantomJS（npm install -g phantomjs でインストールするかあるいは[http://phantomjs.org/download.html](http://phantomjs.org/download.html)からダウンロード、解凍してパスを通します。）

4. beautifulsoup4（pip install beautifulsoup4 でインストールします。）

ルータへアクセスするためのURLは次の通りです。PR-500MIはBasic認証のため、ログインして情報を取得するために下記のように入力します。

```text:
http://ユーザ名:パスワード@ルータのIPアドレス
```

ユーザ名、パスワードはルータへログインする際のアカウントです。ルータのIPアドレスは設定した際のものです。いつもログインする際のアドレスでも問題ありません。そのあとに続けて取得したい情報があるURLを付け加えます。


# スクリプト

```python:
from bs4 import BeautifulSoup
from selenium import webdriver


class pr500mi(object):
    """This is for PR-500MI."""

    def __init__(self):
        self.baseurl = 'http://ユーザ名:パスワード@ルータのIPアドレス'
        self.driver = webdriver.PhantomJS()

    def getip(self):
        getipurl = self.baseurl + '/ntt/information/fifth/current/'
        self.driver.get(getipurl)
        html = self.driver.page_source.encode('utf-8')
        soup = BeautifulSoup(html, 'lxml')
        ip = soup.findAll(class_='section')[6].findAll('td')
        return (ip[1].get_text(), ip[21].get_text()) # ipv4, ipv6

    def reboot(self):
        rebooturl = self.baseurl + '/ntt/userMaintenance/reboot/'
        self.driver.get(rebooturl)
        self.driver.find_element_by_id('REBOOT').click()
```

getip()でWAN側のipv4, ipv6のipアドレスの取得、reboot()でルータを再起動させます。URLの'/ntt/information/fifth/current/', '/ntt/userMaintenance/reboot/'、並びにスクリプト最後の２行（ip, ipv4, ipv6）はファームウェアのアップデートで変化する可能性がありますので、ファームウェアがアップデートして動作しなくなった場合にはご確認下さい。

ルータを再起動させる際は、再起動後にWAN側IPアドレスを取得する必要がありますのでsleepを使って再起動完了まで待つように設定した後（2分程度）にIPアドレスの取得を行ってください。

私はメールで上記スクリプトを実行しています。メール受信をトリガーとしてIPアドレスの通知やルータの再起動を行っています。また、今の段階ではWAN側IP取得と再起動が主な目的でしたが、上記のスクリプトへ付け加えることで切断や再接続、NAT設定、ログ参照なども行うことが可能になります。今後はルータの電源をオン、オフするための設備追加を行うことで、２段階で再起動ができるようにしたいと思っています。

需要があるかどうかはわかりませんが、機種ごとにコマンドラインから制御するためのライブラリを作成してもよいかもしれませんね。
Golangの暗号化パッケージのベンチマーク

# 暗号化パッケージのベンチマーク

データをハッシュ化して、同一性の確認のためだけに使う目的で暗号化パッケージを使うことになり、パスワードや個人情報などとは違い。解読されても問題がなく、単純に早さだけを知りたかったので、色々な暗号化パッケージでスピードテストをしてみました。

## 暗号形式
- scrypt
- bcrypt
- sha256
- sha512
- sha3-256s
- Ripemd
- MD5

# 結論
MD5とsha256が安定して速い。
ただ、MD5は脆弱性が発見されて、推奨されていない暗号形式なので、解読されるとまずいデータには使わない方がいいです。
[APOPのぜい弱性で見えてきたMD5の「ご臨終」](http://itpro.nikkeibp.co.jp/article/OPINION/20070521/271639/?rt=nocnt)

## テスト結果

ベンチマークのコードを一応貼っておきます。
[tikasan/encryptionBenchmark](https://github.com/tikasan/encryptionBenchmark)

### 1st time

- scrypt: 73.621115ms
- bcrypt: 52.998518ms
- sha256: 3.253µs
- sha512: 4.276µs
- sha3-256: 5.999µs
- Ripemd: 5.323µs
- MD5: 2.669µs

### 2nd time

- scrypt: 74.315378ms
- bcrypt: 51.524798ms
- sha256: 2.514µs
- sha512: 2.339µs
- sha3-256: 7.625µs
- Ripemd: 9.218µs
- MD5: 2.625µs

### 3rd time

- scrypt: 79.316009ms
- bcrypt: 50.530978ms
- sha256: 2.305µs
- sha512: 3.291µs
- sha3-256: 8.048µs
- Ripemd: 4.314µs
- MD5: 3.104µs

### 4th time

- scrypt: 73.314786ms
- bcrypt: 49.949264ms
- sha256: 2.296µs
- sha512: 3.083µs
- sha3-256: 7.453µs
- Ripemd: 8.307µs
- MD5: 1.775µs

### 5th time

- scrypt: 77.01785ms
- bcrypt: 50.199802ms
- sha256: 3.272µs
- sha512: 3.321µs
- sha3-256: 6.446µs
- Ripemd: 3.99µs
- MD5: 2.759µs
【Mac】【Git】OSをmacOS Sierra、XcodeをXcode8にバージョンアップした際に起こる事象と解決方法


MacのアップデートとXcodeのアップデートを行った際に
Git周りで発生した事象について纏めました。


## 事象

gitコマンドを実行した際に以下のメッセージが出力し、
gitコマンドが実行出来ませんでした。


```
$ git branch

Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
```

## メッセージ内容

Xcode のライセンスに同意をする必要がある。
(意訳です...)


## 対応

### 1.ターミナル上で「sudo xcrun cc」と実行し、ライセンスに同意する旨のメッセージを出力させる


ターミナル上で「sudo xcrun cc」と実行します。
そうするとライセンスに同意する旨のメッセージが出力されます。

```

$ sudo xcrun cc

You have not agreed to the Xcode license agreements. You must agree to both license agreements below in order to use Xcode.

Hit the Enter key to view the license agreements at '/Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf'

Apple Inc.

Xcode and Apple SDKs Agreement

```

その後は、

以下のメッセージが表示されるまでspaceキーを押し続けます。

```

By typing 'agree' you are agreeing to the terms of the software license agreements. Type 'print' to print them or anything else to cancel, [agree, print, cancel]

```

### 2.ターミナル上で「agree」と入力し、出力が完了することを確認する

手順1を最後まで行うと以下のメッセージが出力されているかと思います。

```

By typing 'agree' you are agreeing to the terms of the software license agreements. Type 'print' to print them or anything else to cancel, [agree, print, cancel]

```

その状態のままターミナル上で「agree」と入力します。

以下のメッセージが出力すれば成功です。

```
You can view the license agreements in Xcode's About Box, or at /Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf

```

上記を実行するとgitコマンドが以前同様に使えるようになります。

```
$ git branch
* master
  test
  update_readme
```
MacVimをインストールしたらまずやること

## カラースキーマの設定

https://github.com/w0ng/vim-hybrid

~/.vim/colors/ 以下に hybrid.vim をコピー。

~/.gvimrc に以下を記述

※ .vimrc は MacVim には適用されないらしい

```
set background=dark
colorscheme hybrid
```

## ウィンドウサイズの設定

~/.gvimrc に以下を記述。

```
set lines=40
set columns=160
```

## タブの設定

```
set expandtab
set tabstop=2
set shiftwidth=2   
```

## バックアップファイル、スワップファイルを作らない

~/.vimrc に以下を記述。

```
set nobackup
set noswapfile
```

## 行番号表示

```
set number
```

## 現在行をハイライト

```
set cursorline
```

## NeoBundle をインストール

```
curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh | sh
```

## NERD Tree をインストール

上記 NeoBundle のインストール時に .vimrc に追加した設定の

```
" Add or remove your Bundles here:
```

の下に

```
NeoBundle 'scrooloose/nerdtree'
```

を追記。

その後 vim を再起動すると、インストールが実行される。

## vim-rails をインストール

上記と同様に、

```
NeoBundle 'tpope/vim-rails'
```

## BufExplorer

```
NeoBundle 'jlanzarotta/bufexplorer'
```

<img width="704" alt="スクリーンショット 2017-01-03 7.56.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/1668/01fccc8e-74ac-73b9-ded4-e03d92766814.png">

### キーバインドを設定

```
noremap <C-l> :BufExplorer<C-m>
```

## 各種 syntax highlight

```
NeoBundle 'slim-template/vim-slim'
NeoBundle 'kchmck/vim-coffee-script'
NeoBundle 'pangloss/vim-javascript'
NeoBundle 'mxw/vim-jsx'
```
Laravel Blade で@include @yield @section を使いこなそう

よくあるbladeの親テンプレートと子テンプレートの例です。

```php:resources/views/layouts/master.blade.php
<html>
<head>
    <title>Laravel | @yield('title', 'Home')</title>
</head>
<body>
    <div id='container'>
        @yield('content')
    </div>

    @section('footer')
        <script src="app"></script>
    @show
</body>
</html>
```

```php:resources/views/dashboard.blade.php
@extends('layouts.master')

@section('title', 'Dashboard')

@include
    <h1>Dashboard</h1>
    @include('common.error', ['text' => 'エラー'])
    ...
@endsection

@section('footer')
    @parent
    
    <script src="dashboard.js"></script>
@endsection
```

```php:resources/views/common/error.blade.php
<div class="alert alert-error">
    {{ $text }}
    ...
</div>
```

`@include` と `@yield` と `@section` どれも指定の場所にコンテンツを挿入するという意味では同じような機能です。

## `@include()`
`@include` は **継承ができません**。
デフォルト値の設定もできません。
**変数を渡すことができます**。

## `@yield()`
`@yield` は **継承ができません**。
デフォルト値の設定ができます。


## `@section()`
`@section()〜@endsection` は **継承することができます**。
例にあるように `@parent` と書くと親テンプレートの `@section()` の内容が展開されます。

scriptの追加記述の他、サイドバーをページによって出し分け or 追加等をしたい場合にも便利に使えそうです。

ちなみに `@section` の閉じタグですが、親テンプレートの場合は `@show` で終わり、 子テンプレートの場合は `@endsection` もしくは `@stop` で終わります。間違えずに覚えて使い分けましょう。

## まとめ

|  **タグ** | **外部読み込み** | **変数渡し** | **デフォルト値設定** | **継承** |
|  :------: | :------: | :------: | :------: | :------: |
|  @include | ○ | ○ | ☓ | ☓ |
|  @yield | ○ | ☓ | ○ | ☓ |
|  @section | ○ | ☓ | ○ | ○ |
メモ: うるう秒の時刻同期メッセージ

* 前日と当日に以下ログ

```rb:/var/log/messages
Dec 31 09:10:23 srv1 ntpd[2837]: kernel time sync disabled 0011
Jan  1 09:04:49 srv1 ntpd[2837]: kernel time sync disabled 0001
```

別のサーバーでは以下

```rb:logwatchで検知
 Time Reset 1 times (total: -1.001468 s  average: -1.001468 s)
 
 Total synchronizations 3 (hosts: 2)
```

* なお登録していた3つのNTP Serverのうち2つが1秒挿入でした。多数決の様子。
* 1秒がゆっくりになるNTP Serverの場合 messages に出力なし ?
concrete5 のフォームを Mautic と連携させる無償アドオンmy_mitsu_mautic

concrete5 のフォームを Mautic と連携させるアドオン [my_mitsu_mautic](https://github.com/ounziw/my_mitsu_mautic) を作成しました。

## アドオンの概要
+ jQueryでMautic用のトラッキングコードを作成する
+ フォーム送信時にトラッキングコードを出力することで、Mauticにデータを送信する
+ concrete5のブロック編集画面でjQueryの設定ができる(jQueryの動的生成)

※　マーケティングオートメーションツール Mautic には、フォームを作成する機能が用意されています。Mautic のフォームを使う場合は、このアドオンは必要ありません。

## Mauticにデータを送るコード
下記のようなコードを、フォームページに貼り付ければ、Mauticへデータ送信ができます。jQueryを利用します。

    <script>
    $(function() {
        $('.btn-primary').click(function (e) {
            var imgsrc = 'https://my-mitsu.mautic.net' + '/mtracking.gif?page_url=' + encodeURIComponent(window.location.href);
            var imgsrc = imgsrc + encodeURIComponent('#sent');
            var firstname = $('#Question7').val();
            var imgsrc = imgsrc + '&firstname=' + encodeURIComponent(firstname);
            var mail = $('#Question8').val();
            var imgsrc = imgsrc + '&email=' + encodeURIComponent(mail);
            var mauticimg = $('<img id="mauticimg">');
            mauticimg.attr('src', imgsrc);
            mauticimg.attr("width", 1).attr("height", 1).css("display", "none");
            mauticimg.appendTo('body');
        });
    });
    </script>

トラッキング画像をjQueryで出力する、そのときにフォームのデータを付加しておく、という方式です。特定のボタン(上のコードでは、btn-primaryクラスのボタン)を押したときに、トラッキング画像を出力することで、フォーム送信時のみデータをMauticに送ります。[マイ見積:運営会社](https://my-mitsu.com/company)で実際に使用しています。

Mautic のトラッキングの詳細は、　https://mautic.org/docs/en/contacts/contact_monitoring.html をごらんください。

## concrete5 のブロックにする
自社のウェブサイトだけで使うのであれば、javascriptをベタ書きすれば良いのですが、より多くの方に使っていただけるように、concrete5のブロックにしました。

![my-mitsu-mautic-edit.png](https://qiita-image-store.s3.amazonaws.com/0/31643/4641b53f-0ceb-3790-9cd8-a9d27dea4ba2.png)

Mauticとの連携のため、下記のデータを設定します。

+ アクションを実行する要素(ID/class) : (必須) mauticへの送信をいつ行うかを決定する。通常はフォームの送信ボタン。
+ mauticのURL : (必須) mauticのURLをhttpsから記入する。
+ URLの末尾に付けるアルファベット : （オプション） #sent のように、mautic側で識別しやすくするために記入する。

送信するデータの設定は、ver0.9では下記３つに対応しています。

+ firstname要素(ID/class) : 取得したいフォーム項目のID/classを設定する。
+ lastname要素(ID/class) : 取得したいフォーム項目のID/classを設定する。
+ email要素(ID/class) : 取得したいフォーム項目のID/classを設定する。

ID/classは、フォームの出力するHTMLを見て書き込む形になります。ひと手間かかりますが、

+ (ID/classが付与されていれば)フォームそのものは変更しなくて良い
+ 画面遷移しないフォームにも対応可能

というメリットがあります。フォーム側の要件が非常に緩くなるわけです。concrete5の標準フォームで作った場合、アドオンのフォームを使用した場合、フォームを自作した場合、など、様々なケースに対応できるようにしました。

## jQueryの動的生成とバリデーション
アドオンver0.9では、jQuery自体を動的生成しています。ID/classについては、下記でバリデーションを行っています。

    public function validate_id_class($input) {
        $start = substr($input,0,1);
        $item = substr($input,1);
        $allowed_string_attr = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-_';
        if (strlen($start) === strspn($start,'#.') && strlen($item) === strspn($item,$allowed_string_attr) ) {
            return true;
        } else {
            return false;
        }
    }

また URL については、FILTER_VALIDATE_URLを利用して検証しています。

将来のバージョンでは、json_encodeでデータを渡す実装に変更するかもしれません。

## MITライセンスで公開
このアドオンは、concrete5のライセンスと同一のMITライセンスにしました。


## 注意点
Mauticに個人情報を送信することになります。本アドオンをウェブサイトに導入する場合は、プライバシーポリシーにその旨の記載をおねがいします。
ユーザーコントロールをコンテナに Controls.Add すると Height が変わる

# ユーザーコントロールをコンテナに Controls.Add すると Height が変わる

詳しく調べられていないけれども、備忘録として対処のみ記録する。

デバッガで追いかけるとユーザコントロールのサイズが変わるのは次の行だった。

```csharp
pictureBox1.Controls.Add(userControl1);
```

ユーザーコントロールのプロパティ `AutoScaleMode` を規定値の `Font` から `None` に変更すると問題が発生しなくなった。

## 確認した環境
- OS: 日本語 Windows 10 Home 64 ビット (1607)
- コンパイラ: Visual Studio Community 2015 Update 3
Safari のWebインスペクタウィンドウの文字が小さくなってしまって困った

# Webインスペクタウィンドウ
Safariでは `Command`+`option`+`I` 同時押しでWebインスペクタ（Chromeでいう検証）を表示します。
ある日、このWebインスペクタを表示させたまま、表示中のページの縮小をしようとして、誤ってWebインスペクタウィンドウを縮小させてしまうことがありました。すごくフォントが小さくなって、マウスでポイントしにくくなってしまったのです。

そうすると、Webインスペクタにカーソルを置いていて、 `Command`+`+` で拡大しようとしてもできなくて、一生このままなのかと泣きそうになりました。

# 対処方法
Webインスペクタにカーソルを置いて、 `Command`+`0` でもとの大きさに戻りました。ありがとう神さま。

きっと困っている人がいるかと思ってメモ。
php.iniの編集

文字コードとタイムゾーンを指定するため、php.iniを編集します。

#out_handler
`outout_handler = mb_output_handler`
PHPの初期設定では、処理結果をいったん専用の領域に格納しておき、処理がすべて完了した時点でクライアントに送信する(バッファリング)ようになっています。
output_handlerを指定した場合、指定したエンコード(文字の符号化)方式で文字のエンコード処理が行われます。
つまり、バッファを出力する際に文字コード変換が行われるようになります。

#default_charset
`default_charset = "UTF-8"`
HTTPヘッダに出力するデフォルトの文字コードを指定します。
mbstring 関数で mbstring.http_input mbstring.http_output mbstring.internal_encoding が未設定の場合のデフォルトとしても用いられます。

#mbstring.language
`mbstring.language = Japanesee`
デフォルトで使用する言語を指定します。

#mbstring.encoding_translation
`mbstring.encoding_translation = off`
HTTP入力用文字エンコードの自動変換を指定します。

#mbstring.detect_order
`mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII`
PHPのソースファイルで使用される文字のエンコード方式の検出順を指定します。

#mbstring.substitute_character
`mbstring.substitute_character = none`
コードとして変換できない文字がある場合に、代替の文字を出力しないように指定します。

#date.timezone
`date.timezone = Aisa/Tokyo`
タイムゾーンを指定します。

#PHP 5.6.0　以前のバージョンの場合
PHP 5.6.0 で、以下の指定が非推奨になりました。
PHP 5.6.0 以前のバージョンを使用する場合は、php.iniを編集してください。
 
##mbstring.internal_encoding
`mbstring.internal_encoding = UTF-8`
PHPのソースファイルで使用するエンコード方式を指定します。
この機能は PHP 5.6.0 で 非推奨になります。
PHP 5.6 以降のユーザーは、これを空のままにしておいて、代わりに default_charset を設定してください。

##mbstring.http_input
`mbstring.http_input = auto`
HTTP入力用文字エンコードを自動検出させるように指定します。
この機能は PHP 5.6.0 で 非推奨になります。
PHP 5.6 以降のユーザーは、これを空のままにしておいて、代わりにdefault_charset を設定してください。

##mbstring.http_output
`mbstring.http_output = pass`
HTTP出力用文字エンコードの自動検出をパスするように指定します。
この機能は PHP 5.6.0 で 非推奨になります。
PHP 5.6 以降のユーザーは、これを空のままにしておいて、代わりに default_charset を設定してください。

#参考情報
[PHPマニュアル](http://php.net/manual/ja/mbstring.configuration.php)
Xamlメモ　Marginプロパティ

# ■均一
![margin01.png](https://qiita-image-store.s3.amazonaws.com/0/142879/60b44a44-1995-195a-ccdd-270d24af26bd.png)


# ■左右、上下
![margin02.png](https://qiita-image-store.s3.amazonaws.com/0/142879/140b3a8b-bd18-2377-afa1-e1f82ca2786c.png)

# ■左、上、右、下
![margin03.png](https://qiita-image-store.s3.amazonaws.com/0/142879/35d07d15-af7a-c965-3016-3fd787766ea5.png)


# ■参考サイト
* [FrameworkElement.Margin プロパティ (System.Windows) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.frameworkelement.margin)
* [FrameworkElement.Margin Property (Windows.UI.Xaml) - Windows UWP applications | Microsoft Docs](https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.frameworkelement.margin)
Redmine の「ウォッチャーの追加」ダイアログで検索キーワードを変えるとチェックが外れるのに対処

# 対象

* Redmine : 3.3.1
* クライアント : Linux, Firefox 50.1.0

# 問題

ウォッチャーを追加するときに、候補のユーザーを絞り込むために検索キーワードを使用できる。

検索キーワードで絞り込んで目的のユーザー (A) を見つけてチェックしたあとに、続けて他のユーザーを探そうと検索キーワードを変えると、(A) のチェックが外れる。

下の図では "test user10" のチェックが外れている。

![before.png](https://qiita-image-store.s3.amazonaws.com/0/38075/e1136386-73cb-cb37-b59d-b995dc27ae02.png)

検索キーワードの変更のたび、そのキーワードに合致する候補でリストが上書きされてチェックの有無は保持されないため。

一度に複数ユーザーを追加したい時に不便かもしれない。

# 解決策

安直。

View Customize Plugin (https://github.com/onozaty/redmine-view-customize) を使って、チェックしたらそのユーザーをコピーしておく。

JavaScript は以下の通り。

```js
// Path pattern: /issues/(\d+|new|copy)$

$(document).on("change", "#users_for_watcher input:checkbox", function() {
    if ($("#users_for_watcher_buffer").length === 0) {
        $("#users_for_watcher").after("<div id='users_for_watcher_buffer'></div>").after("<hr />");
    }

    var clone = $("#users_for_watcher_buffer input:checkbox[value='" + $(this).val() + "']");

    if ($(this).prop("checked")) {
        if (clone.length === 0) {
            $("#users_for_watcher_buffer").append($(this).parent().clone());
        } else if (!clone.prop("checked")) {
            clone.prop("checked", true);
        }
    } else {
        if (clone.length > 0) {
            clone.parent().remove();
        }
    }
});
```

CSS は以下の通り。

```css
/* Path pattern: /issues/(\d+|new|copy)$ */

#users_for_watcher_buffer {
  max-height: 200px;
  overflow: auto;
}

#users_for_watcher_buffer label {
  display: block;
}
```

下の図では "test user10" がコピーされてチェックを維持している。

![after.png](https://qiita-image-store.s3.amazonaws.com/0/38075/65346417-6db5-4cc9-3b52-a88f1e2e1302.png)
Ruby on Rails初体験備忘録

# はじめに
Ruby及びRails初心者がRails 5を使ってみたときのメモです．

# 結論
## 0. 各種ライブラリのインストール
以下を予めインストールしておきます．

- OpenSSL
- readline (BSDの場合はGNUのものではないものがOSのbaseに含まれていることが多いためインストール不要です．)
- iconv

## 1. rbenvのインストール

```
% git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
% git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

## 2. rbenvの設定 (bashの場合)

```
% [ ! -f ~/.bash_profile ] && echo '[ -f ~/.bashrc ] && . ~/.bashrc' >> ~/.bash_profile
% export PATH="$HOME/.rbenv/bin:$PATH" >> ~/.bash_profile
% eval "$(rbenv init -)" >> ~/.bash_profile
% source ~/.bash_profile
% rbenv -v
rbenv 1.1.0-2-g4f8925a
```

## 3. インストール可能なRubyのバージョンの確認

```
% rbenv install --list
(snip)
  2.3.2
  2.3.3
  2.4.0-dev
  2.4.0-preview1
(snip)
```

## 4. Rubyのインストール

```
% rbenv install 2.3.3
```

## 5. インストールされたRubyの有効化

```
% rbenv rehash
```

## 7. 現在のRubyのバージョンの確認

```
% rbenv versions
* system (set by /home/user/.rbenv/version)
   2.3.3
```

## 8. 利用するRubyの変更

```
% rbenv global 2.3.3
% rbenv versions
  system
* 2.3.3  (set by /home/user/.rbenv/version)
```

## 9. bundlerのインストール

```
% gem install bundler
% rbenv rehash
```

## 10. Railsのインストール
git cloneでRailsのアプリケーションのコードを取り出して，必要なツールをインストールする場合には本作業は不要です．

```
% gem install rails
% rbenv rehash
```

## 11. Railsアプリケーションの作成

```
% rails new hogehoge --skip-bundle
```

--skip-bundleによってrbenvの当該Rubyのインストール先にbundlerによって各種ツールがインストールされるのを防止しています．

## 12. Railsアプリケーションのための各種ツールのインストール

```
% cd hogehoge
% bundle install --path vendor/bundle --without production
```

## 13. Railsアプリケーションの動作確認
以下のコマンドを入力して開発版の簡易Webサーバを起動した後，Webブラウザで``http://localhost:3000``にアクセスして確認します．

```
% rails server -b 0
```

なお，-b 0は-b 0.0.0.0や::0を省略して書いただけです．

## 14. Railsアプリケーションの修正

以下辺りを参考に練習します．

https://railstutorial.jp

# OSのパッケージ管理システムではなくrbenvを利用する理由
- OSのパッケージ管理システムは古いRubyしかインストールできない (e.g. Cent OS 7のyum)
- gemでRailsをインストールしようとするとrubyが古過ぎると言われ，インストールできない

# rbenvとは?
- 異なるバージョンのRubyとそれに付随するツールを切り替えて使うためのもの．
- $RBENV_ROOT/以下に各種Rubyとツールをインストールする．
- $RBENV_ROOT/shims/以下にパスを通す．
- $RBENV_ROOT/shims/以下にラッパープログラムを配置し，各種バージョンを切り替える．
- $HOME/.rbenv以下を$RBENV_ROOTとすることが多い様だ． (つまり，ユーザ毎にRubyをインストールする)
- 複数人で協調して1つのサーバで作業する場合は，/usr/local/rbenvを$RBENV_ROOTが良いかもしれない．

# gemとは?
- Rubyのパッケージ管理システム(RubyGems)のコマンド(インストールされたパッケージ自体を指すこともある)．
- 最近のRuby (1.9.x以降か?)ではgemはRuby本体に取り込まれたため，gem自体を別途インストールする必要はない．

# bundlerとは?
- RubyやRailsで作成するプロジェクトのためのパッケージ管理システム．
- プロジェクトが依存しているパッケージをインストールしてくれる．
- プロジェクトのトップディレクトリにGemfileというテキストファイルに依存しているパッケージとバージョンを記述．

# Railsとは?
- RubyのWAF (Web Application Framework: Webアプリケーションを作成するためのフレームワーク)．
- Webの最先端の技術を積極的に取り入れている (様に見える)．
- QUICやHTTP2.0，SCTPといった低いレイヤの最新技術はあまり気にしていない (様に見える)．
- メジャーバージョンが上がると移行が結構しんどそう (に見える)．
javascript,Ruby,Python,シェルスクリプトで日付を二桁で取得するプログラムのメモ

サーバ管理していると、吐き出されるログを日付で取得するスクリプトを書いて、cronでバッチ処理するなどよくする。
そのときに、2桁で日付を取得する（01,02,03,...,10,...）スクリプトを書くことがよくあるのでいろいろな言語でメモしておく。

#javascript

 Date インスタンスを生成することにより、時刻を取得することができる

```
<script>
var date = new Date();
var dd = ("0"+date.getDate()).slice(-2);
</script>
```
getDate で取得した値に「0」をつけて

slice(-2)とすることで、後ろ2桁だけ取得するようにしている

なので、11日など「011」となる場合でも、後ろ2桁だけ取得するので

「11」と表示される


#Ruby

Time#nowメソッドにより現在の時刻を取得することができます。
Time::strftimeメソッドにより、時刻を指定されたフォーマットに従って変換することができます。


```
■フォーマットの形式

%c
日付と時刻
%d
日(01-31)
%H
24時間制の時(00-23)
%I
12時間制の時(01-12)
%j
年中の通算日(001-366)
%M
分(00-59)
%m
月を表す数字(01-12)
```

例

```
day = Time.now
p day.strftime("Now, %m %d") #=> "Now, 01-02"
Time.now.strftime("%Y-%m-%d %H:%M:%S") #=> "2017-01-02 00:31:21"
```

逆に一桁で表現したいとき

```
day = Time.now
p day.year #=> 2017
p day.month #=> 1
p day.day #=> 2
```

#Python

基本的にrubyと同じ

```
>>> import datetime
>>> now = datetime.datetime.now()
>>> now.strftime("%m-%d")
'01-02'
```

#シェルスクリプト

date '+フォーマット'でフォーマット指定できる

```
date '+%m'  //01
date '+%d'  //02
```
Elixirでのimmutable

**Elixirのimmutable**についてまとめます。

Elixirでは代入ではなく, 変数を右辺の値に 束縛(バインド) することです。

##Elixirのデータ構造はimmutableなのか

破壊的操作ができるmutableなデータ構造をElixirは持ちません。

Rubyではmutableなデータ構造があるので, 比較をRubyとElixirのコードで説明していきたいと思います。

まずはRubyのコードです。

```
irb(main):001:0> scores = { "Alice" => 50, "Bob" => 60, "Carol" => 90, "David" => 40 }
=> {"Alice"=>50, "Bob"=>60, "Carol"=>90, "David"=>40}
irb(main):002:0> scores.delete("Carol")
=> 90
irb(main):003:0> scores
=> {"Alice"=>50, "Bob"=>60, "David"=>40}
```

RubyではHashがmutableなデータ構造なので, scoresのKeyがCarolのKeyと値が削除されたのがわかると思います。

次はElixirのコードを見ていきます。

```
#Elixir
iex(1)> scores = %{ "Alice" => 50, "Bob" => 60, "Carol" => 90, "David" => 40 }
%{"Alice" => 50, "Bob" => 60, "Carol" => 90, "David" => 40}
iex(2)> Map.delete(scores, "Carol")
%{"Alice" => 50, "Bob" => 60, "David" => 40}
iex(3)> scores
%{"Alice" => 50, "Bob" => 60, "Carol" => 90, "David" => 40}
```

Elixir破壊的操作ができるデータ構造はないので, 変数がバインドしているデータが変わることはありません。

ガーベジコレクトされるか, スコープの範囲外になるまで。

###メリット

+ コード上で変数がバインドしているデータがimmutableなので曖昧さがない。

`scores.delete("Carol")`このようなケースで, scoresの内部表現を変更するのか, "Carol"がkeyのkeyと値を削除したHashを返すだけなのか, またはどちらもなのか と曖昧さがあるのが
Elixirではデータを変換した新しいコピーを返すだけなので起こらない。


##Elixirの変数はimmutableなのか

**変数はimmutableではない**

Elixirの変数はmutableです。

Elixirでの変数はラベルのような感覚だなと自分では思っています。
変数に値が入っているのではなく, 値の別名をつけるイメージです。

再バインドはオブジェクトの状態をまったく変えません。

```
iex(3)> scores
%{"Alice" => 50, "Bob" => 60, "Carol" => 90, "David" => 40}
iex(4)> scores = %{"Alice" => 50, "Bob" => 60, "Carol" => 90}
```

値は同じメモリの位置にあるが、変数は別のメモリの値を指すようになり、不変性が保持されます。
Erlangでは再バインドは利用できませんが、Elixirでは、Erlang VMの実装のおかげで、再バインドをすることができます。

Erlangで変数を再バインドしたい時は、パターンマッチよりもはるかに多いとjoseさんが言っており, それを考慮されこのような実装になっているのではないかと思います。

https://gist.github.com/josevalim/ce2f5871a96b6cbcf2c1


そして, Elixirで再バインドを防ぎパターンマッチをしたい場合はピン演算子を使います。

```
iex> x = 1
1
iex> y = 2
2
iex> x = y
2
iex> x
2
iex> ^x = 1
** (MatchError) no match of right hand side value: 1
```
dlibをmacで動かす時にlibpngのバージョンでエラーが出る時

[こちらの記事](http://qiita.com/naoyu822/items/7cce2f2dbad24931cc87)を参考にサンプルを実行してみると

```
dyld: Library not loaded: /usr/local/opt/libpng/lib/libpng16.16.dylib
Referenced from: /usr/local/opt/opencv/lib/libopencv_highgui.2.4.dylib
Reason: Incompatible library version: libopencv_highgui.2.4.dylib requires version 43.0.0 or later, but libpng16.16.dylib provides version 40.0.0
```
とエラーが出た。
参照しているlibpngのバージョンが古いということなので

```
brew update && brew upgrade
```
を実行するとエラーが消えた。
### 参考
[homebrewを使ってphpをインストールしたときに『libpng15.15.dylibが読み込めません』うんぬん言われてうっとおしくなった](http://kimikimi714.hatenablog.com/entry/2014/05/21/homebrew%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6php%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E3%80%8Elibpng15.15.dylib%E3%81%8C)
clojureでHello World

今年はプログラマーらしいことをしていこうと思い、前々から気になっていたclojureを始めてみることにしました。

#インストール

clofureはJava VM上で動く関数型言語です。Scalaと似ています。HomeBrewでインストールできるみたいなので、インストールしましょう。

```
brew install leiningen
```

#初めてのプロジェクト作成

`lein`コマンドが使えるようになります。これで色々やっていくわけですが、まずは`lein new`コマンドでプロジェクトを作成します。

```
lein new app helloworld
```

1つめのパラメータがプロジェクトのテンプレート。2つめがプロジェクト名になります。テンプレートを省略すると`default`テンプレートが使用されます。
`app`テンプレートはmain関数を持つ実行可能なプロジェクトを作成します。


#実行！

`lein new`コマンドを実行すると、`helloworld`ディレクトリが作成され、そこに色々とファイルが生成されています。
プロジェクトディレクトリに移動してプロジェクトの実行をしてみます。

```
cd helloworld
lein run
```

```
Hello, World!
```

一行もコードを書いていないのにHello Worldが出力されました。すごいですね。

#ソースコードをいじってみる
まだ右も左も分かっていないのでおっかなびっくりですが、出力されるメッセージを変えてみたいと思いました。正月なので新年のご挨拶を出力するようにしてみます。

```clj:src/helloworld/core.clj
(ns helloworld.core
  (:gen-class))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
;  (println "Hello, World!"))
  (println "あけましておめでとうございます！！"))
```

```
lein run
```

```
あけましておめでとうございます！
```

無事に出力されました。やりましたね。
mixで作成しているアプリを自動コンパイルする

Phoenixのような自動コンパイル機能が素のElixirプロジェクトでも欲しくて、最低限必要な部分のみ抽出してみました。

[kawakami-o3/reloader](https://github.com/kawakami-o3/reloader "github.com/kawakami-o3/reloader")

サンプルとして作ってみたものの中身は

  1. Phoenix.LiveReloaderと同様に[synrc/fs](https://github.com/synrc/fs "github.com/synrc/fs")で変更を監視して、
  2. .exファイルで変更があったときにmix compileする。

のみで、コードにしてもたったこれだけです。

```elixir
defmodule Reloader do
  def main([]) do

    path = "/path/to/this/project"
    :fs.start_link(:my_watcher, Path.absname(path))
    :fs.subscribe(:my_watcher)

    loop()
  end

  defp loop() do
    IO.puts("watching...")
    receive do
      {_watcher_process, {:fs, :file_event}, {changedFile, _type}} ->
        if match?(changedFile) do
          mix_compile()
        end
    end

    loop()
  end

  defp match?(path) do
    path = to_string(path)
    String.match?(path, ~r{\.ex$}) and !String.match?(path, ~r{(^|/)_build/})
  end

  defp mix_compile() do
    Mix.Task.reenable("compile.elixir")    
    Mix.Project.build_structure
    Mix.Task.run("compile.elixir")
  end

end
```

監視対象や実行するタスクなど適宜変えてみると使いでがあるかもしれません。


###### 参考

1. https://medium.com/@kansi/elixir-plug-unveiled-bf354e364641#.m5mahil5u
2. http://hostiledeveloper.com/2016/02/24/hey-watch-it-or-how-to-monitor-files-in-elixir.html
3. https://github.com/phoenixframework/phoenix_live_reload
ローカル・テスト・本番環境のブラウザ表示切替ブックマークレット

#url切り替えブックマークレットを作ってみました

ブラウザチェックの際、開発環境（ローカル）/テスト環境/本番環境とを頻繁に切り替えて作業しなければならない場面が多く、いちいちurl手打ちしているのも面倒なので、自分の作業用にurl切り替えブックマークレットを作ってみました。

対象となるurlは下記の通り。

本番環境(rel)

- https\://www\.foo.com
- https\://www\.bar.com
- http\://m.baz.com

テスト環境(stg)

- https\://test-www\.foo.com
- https\://test-www\.bar.com
- http\://test-m.baz.com

開発環境(dev)（ローカル）

- http\://localhost:8080
- http\://localhost:8081
- m.baz.com に対応するローカル環境なし


## 本番環境⇔テスト環境

```ruby:rel-stg
javascript:(function() {
  var url = document.location.href;
  if( url.match(/https?:\/\/test-/) ) {
    url = url.replace( /test-/, "" ) ;
  } else {
    var p = url.split('://');
    url = p[0] + '://test-' + p[1];
  }
  window.open(url, "_blank");
})();
```

## 開発環境⇔テスト環境/（本番環境）

```ruby:dev-stg/rel
javascript:(function() {
 var str = [
    { dev:"http://localhost:8080", stg:"https://test-www.foo.com", rel:"https://www.foo.com" },
    { dev:"http://localhost:8081", stg:"https://test-www.bar.com", rel:"https://www.bar.com" }
  ];
  var url = document.location.href;
  for (var i = 0; i < str.length; i++) {
    if( url.match(str[i].dev) ) {
      url = url.replace(str[i].dev, str[i].stg);
    } else if(url.match(str[i].stg)) {
      url = url.replace(str[i].stg, str[i].dev);
    } else if(url.match(str[i].rel)) {
      url = url.replace(str[i].rel, str[i].dev);
    } else {
      return false;
    }
  }
  window.open(url, "_blank");
})();
```

## 最後に

上記のコードを適当にブックマーク登録し、必要な時に呼び出せば各環境ページが別タブ（ウインドウ）で開きます。※[packer](http://dean.edwards.name/packer/)などを利用して不要なインデントや改行は削除してください。
今回は、別タブで開くよう「window.open」を使っていますが、selfで切り替えたい場合は「window.location.href」などを使用してください。
React で Tweet Button（widgets.js リロードしない版）

Qiita 上では "widgets.js" を毎回読み込まないといけないみたいな記事を良く見かけるがそんなことは無いようです。
参考→ https://dev.twitter.com/web/javascript/initialization

```html:index.html
<html>
  <head>
    ...
    <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
    ...
  </head>
  <body>
    ...
  </body>
</html>
```

```js:components/sns/TweetButton.jsx
"use strict";

import React from "react"

export default class TweetButton extends React.Component {
  componentDidMount() {
    twttr.widgets.load(this.refs.tweetButton);
  }

  render() {
    return (
      <a ref="tweetButton"
        href="https://twitter.com/share"
        className="twitter-share-button"
        data-text={this.props.text}
        data-show-count="false">Tweet</a>
    );
  }
}
```
React 界隈がわからなくて読んだドキュメント

# React の公式ドキュメントから

https://facebook.github.io/react/docs/installation.html

- **We recommend using React with Babel** なので，使い方は Babel のドキュメントを読んでね．
- **We recommend using a bundler like webpack or Browserify** なので，webpack のドキュメントを読んでね．
- webpack で babel を使うなら babel-loader のドキュメントを読んでね．

ここまでクリアすれば，ローカル環境で始められます．

# とりあえず触るなら

React Doc の installation, Hello World は何も知らない人にはハードルが高い、
別のチュートリアルで、環境を作る方がいい。

Hello, World 以降のドキュメントは、とても分かり易い。

1. https://github.com/verekia/js-stack-from-scratch の React までやる。
2. React のドキュメントを https://facebook.github.io/react/docs/rendering-elements.html からやる。

# そもそも論はこの辺りから

- ReactJS For Stupid People: http://blog.andrewray.me/reactjs-for-stupid-people/
- Flux For Stupid People: http://blog.andrewray.me/flux-for-stupid-people/
- What’s the best Flux tutorial?: https://discuss.reactjs.org/t/whats-the-best-flux-tutorial/51
- Flux Stores with ES6 Syntax: https://medium.com/@nosherwan/flux-stores-with-es6-syntax-d2182552091e#.wuf0daewr
- What is the Flux Application Architecture?: https://brigade.engineering/what-is-the-flux-application-architecture-b57ebca85b9e#.am2t59s0t
- Creating A Simple Shopping Cart with React.js and Flux: https://scotch.io/tutorials/creating-a-simple-shopping-cart-with-react-js-and-flux
- Getting To Know Flux, the React.js Architecture: https://scotch.io/tutorials/getting-to-know-flux-the-react-js-architecture

# 前提知識
- トランスパイラって何？
- babel, npm, yarn ?
- Node.js は聞いたことがある。

# ログ（愚痴）
1. React が流行っているらしい。
2. ドキュメントを見てみる
3. Tutorial をやろうとしてはまる https://facebook.github.io/react/tutorial/tutorial.html
4. Doc に Hello, World があり、こっちが最初に取り組むべきところっぽい。
5. Hello, World からわからない https://facebook.github.io/react/docs/hello-world.html , Codepen ってなんだ？
6. とりあえず installation を読む https://facebook.github.io/react/docs/installation.html
7. 挫折
8. 気を取り直して installation 内の download this HTML file https://facebook.github.io/react/downloads/single-file-example.html から始める。次に進めない
9. これをやる https://github.com/verekia/js-stack-from-scratch
10. store から reducer の流れはわかったけど、イベントから action を発火させる流れがつかめない。
11. "react シーケンス図" 検索、https://www.codeproject.com/Articles/1103559/How-Redux-works これがわかりやすそう
12. Redux は行き過ぎ、いったん React に戻る。Rendering Element を読んだところでなんとなくわかってきた。https://facebook.github.io/react/docs/rendering-elements.html
新年なのでバナー表示SQL関数を作ってみた

# はじめに
みなさん、あけましておめでとうございます。
ぬこ＠横浜です。今年も早速、PostgreSQLを使ってくだらないことをしてみます。

## 新年なので、バナー表示用のSQL関数を作ってみた。
そう、今は新年。やっぱりA HAPPY NEW YEARしたいじゃないですか。
どうせするなら、でっかく表示したい。そう、bannerコマンドのように。
以前、UNIX/Linuxには、bannerという英文字をバナー表示するようなツールがあるんだけど(*1)、なぜか(?)PostgreSQLのSQL関数にはバナー表示するSQL関数がない！(あるわけねーだろ)。

ということでないので作ってみた。

(*1) なんか最近のCentOSにはbannerコマンドが入ってないので、別途DL＆ビルドしないといけないっぽい。

## 実行例
banner()という集合を返す関数を作成する。
この関数に英字のテキストを与えると、その英字の(大文字の)バナーのテキスト集合を返却する。

新年らしく、A HAPPY NEW YEARしてみましょ。

```
[nuko@localhost banner]$ psql test -e -f test.sql
SELECT * FROM banner('a happy');
                        data                         
-----------------------------------------------------
    #       #     #    #    ######  ######  #     # 
   # #      #     #   # #   #     # #     #  #   #  
  #   #     #     #  #   #  #     # #     #   # #   
 #     #    ####### #     # ######  ######     #    
 #######    #     # ####### #       #          #    
 #     #    #     # #     # #       #          #    
 #     #    #     # #     # #       #          #    
(7 rows)

SELECT * FROM banner('new year');
                            data                             
-------------------------------------------------------------
 #     # ####### #     #    #     # #######    #    ######  
 ##    # #       #  #  #     #   #  #         # #   #     # 
 # #   # #       #  #  #      # #   #        #   #  #     # 
 #  #  # #####   #  #  #       #    #####   #     # ######  
 #   # # #       #  #  #       #    #       ####### #   #   
 #    ## #       #  #  #       #    #       #     # #    #, 
 #     # #######  ## ##        #    ####### #     # #     # 
(7 rows)

[nuko@localhost banner]$ 
```

## 実装
最初はSQLとplpgsqlだけを使って簡単にできるかと思ったけど、意外と面倒だったなあ。
9.4から追加された ROWS FROM 構文を使ったり、plpgsqlのRETURN NEXT を使ったりと、なかなか楽しめた。

### ポイント1 UNIONとORDER BY
最初、各英文字をバナー化するFUNCTIONを以下のように作成したのだが、

```
CREATE OR REPLACE FUNCTION banner_a()
 RETURNS SETOF text
 LANGUAGE sql
 -- common options:  IMMUTABLE  STABLE  STRICT  SECURITY DEFINER
AS $function$
SELECT tx FROM (
SELECT 1 as id , '   #    ' as tx  UNION
SELECT 2 as id , '  # #   ' as tx  UNION
SELECT 3 as id , ' #   #  ' as tx  UNION
SELECT 4 as id , '#     # ' as tx  UNION
SELECT 5 as id , '####### ' as tx  UNION
SELECT 6 as id , '#     # ' as tx  UNION
SELECT 7 as id , '#     # ' as tx
) AS t ORDER BY id
$function$
;
```

まあ、こんな感じの関数をbanner_aからbanner_zまで作っておく。

### ポイント2 ROWS FROM
で、この関数出力結果を横に並べるにはどうするか、というところで悩んだ。
これを解決するために、PostgreSQL 9.4から追加されたSELECT文のROWS FROM構文を利用した。
例えばこんな感じ。

```
test=# SELECT banner_a || banner_e FROM ( SELECT * FROM ROWS FROM ( banner_a(), banner_e())) as _x ;
     ?column?     
------------------
    #    ####### 
   # #   #       
  #   #  #       
 #     # #####   
 ####### #       
 #     # #       
 #     # ####### 
(7 rows)
```
さて、これを見ると分かるように、ROWS FROM () には、各バナー文字用の集合返却関数を複数書いているのだが、bannerを実装するときには、ここに全てのbanner_* 関数を書いておけばいい。
で、動的にSELECT句の文字列連結箇所を、banner関数に与えた引数によって生成すれば良い。
生成したものを専用のTEMP TABLEにINSERTして、そのTEMP TABLEをあとは検索すればOK。

コードはもうちょっと整備してから、Githubに上げる予定です。

# おわりに
ということで、年始から役に立たないPostgreSQLの使い方を書きました。
今年もこの調子で、ガンガン役に立たないPostgreSQLネタを考えてみようと思います。
checkstyle の設定ファイルに関する Tips

checkstyle を実行する際、`-c`オプションでチェック項目のフィルタリングなどを定義した設定ファイルを指定できる。

```
$ java com.puppycrawl.tools.checkstyle.Main   
Must specify a config XML file.
usage: java com.puppycrawl.tools.checkstyle.Main [options] -c <config.xml>
            file...
 -c <arg>   The check configuration file to use.
 （以下略）
```

実は、`-c`オプションには URL も指定できる。
http://checkstyle.sourceforge.net/cmdline.html#Command_line_usage
> -c configurationFile - specifies the location of the file that defines the configuration modules. The location can either be a filesystem location, **or a name passed to the ClassLoader.getResource() method**.

https://docs.oracle.com/javase/jp/6/api/java/lang/ClassLoader.html#getResource(java.lang.String)

そのため、設定ファイルを Github などのリモートリポジトリに置いておくと、
複数のプロジェクトで同じ設定を共有することができる上に、
設定の更新を自動的に反映させることができる。

例えば、Github 上に置いた設定ファイルを読み込む場合は、以下のようなコマンドになる。

```
$ java com.puppycrawl.tools.checkstyle.Main \
  -c https://raw.githubusercontent.com/[user_name]/[repo_name]/[branch_name]/[path_to_file]/checkstyle.xml
```
DKMSを使ってドライバをビルド・インストールする。

# 目的

自宅、開発環境の拡張を行う。

* ディスプレイを2台（ビルトインと外部モニター）から3台（ビルトインと外部モニターx2）

# 前提する環境

* OSは、`Ubuntu 16.04 LTS`を使用している。
* `Kernel`を最新化している。(`4.9.0-040900-generic`)
* ハードのインターフェースは、`DVI`端子1つを既に外部出力モニターとして使用している。

# 前準備

* [displaylink USB Adapter](https://www.amazon.co.jp/gp/product/B00C85ESGW/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1)を購入する。

# 作業手順

* マニュアルに従い`displaylink USB Adapter`をPCに接続する。
* `DKMS`パッケージをインストールする。
    
    ```sh
    sudo apt install dkms-dev
    ```

* `libdrm-dev`をインストールする。

  ```sh
  sudo apt install libdrm-dev
  ```

* ドライバのソースを`/home/user`に置く。(ディレクトリは任意)
  * `Github`からソースを`clone`する。

  ```sh
  sudo git clone -b devel https://github.com/DisplayLink/evdi.git
  ```

* ドライバの`module`を`/usr/src/`配下に置く。
　
  ```sh
　sudo mkdir /usr/src/evdi-1.2.65
　sudo cp /home/user/evdi/module /usr/src/evdi-1.2.65/
  ```

* `/usr/src/evdi-1.2.65`配下にある`dkms.conf`を編集する。パッケージバージョン指定を修正する。

  ```
  ## @file
  # Linux DKMS config script for the EVDI kernel modules
  #

  #
  # Copyright (c) 2015 DisplayLink (UK) Ltd.
  #

  PACKAGE_NAME="evdi"
  PACKAGE_VERSION=1.2.65
  AUTOINSTALL=yes

  MAKE[0]="make all INCLUDEDIR=/lib/modules/$kernelver/build/include            KVERSION=$kernelver DKMS_BUILD=1"
  DEST_MODULE_LOCATION[0]="/kernel/drivers/gpu/drm/evdi"
  BUILT_MODULE_NAME[0]="evdi"
  CLEAN="make clean DKMS_BUILD=1"
  ```

* ソースツリーを`dkms`に追加する。`/usr/src/evdi-1.2.65`配下で下記のコマンドを実行する。

  ```sh
  sudo dkms add -m evdi -v 1.2.65
  ```

* ビルドを実行する。

  ```sh
  sudo dkms build -m evdi -v 1.2.65
  ```

* ビルドが完了したモジュールをインストールする。

  ```sh
  sudo dkms install -m evdi -v 1.2.65
  ```

* [ドライバ実行スクリプト](http://www.displaylink.com/downloads)をダウンロードしスクリプトを実行する。

  ```sh
  unzip DisplayLink USB Graphics Software for Ubuntu 1.2.1.zip
  sudo chmod 755 displaylink-driver-1.2.65.run
  sudo ./displaylink-driver-1.2.65.run
  ```

* システム設定にて、追加した外部モニターを有効化する。

# DKMSとは？

`Dynamic Kernel Module Support`の略称です。カーネルのソースツリーの外にソースが存在する Linux カーネルモジュールの生成を可能にするプログラム/フレームワークです。

# 参考

* [Ubuntu DkmsHowTo](https://wiki.ubuntulinux.jp/UbuntuTips/Others/DkmsHowTo)
* [displaylink](http://support.displaylink.com/knowledgebase/articles/684649-how-to-install-displaylink-software-on-ubuntu)
* [evdi](https://github.com/DisplayLink/evdi)
こどもと情報について大切な１００のこと

２０１７年の目標として、表題について記事をまとめていきます。
背景としては、年末年始に中学生の甥っ子や小学生の姪っ子とふれあう中で、あまり情報に関する教育を受けていないこどもたちでもスマホやタブレットを利用しています。その際に知っていてほしい事という観点で、個人的な「こうあってほしい」というところを含めた事をまとめ、インターネット上の情報やフィードバックを得ながら改善していきたいと思います。（１００個は多すぎると感じたらタイトルも変わります）
方針としては、以下で始めていきます。

 - コンピュータそのものについて
 - インターネット上のマナーや常識、気をつけるべきことについて
 - トラブルを避けるために知っておいてほしいことについて

以下、１００個上がった時点で、それぞれの内容を精査します。
1. コンピュータ（スマホ、タブレット、PC）は「おもちゃ」ではないよ
 - 丁寧に扱うこと、画面割れの実例、
3. コンピュータ（スマホ、タブレット、PC）は「水」に弱いよ 
3. コンピュータ（スマホ、タブレット、PC）は「熱」に弱いよ
4. コンピュータ（スマホ、タブレット、PC）は「電気」で動くよ
 - 電源/電池やケーブル、
5. コンピュータ（スマホ、タブレット、PC）の使いすぎは良くないよ
 - 視力低下、ブルーライトや健康被害
6. インターネットには「入り口」があるよ
 - wifiやインターネットにつながる仕組み
7. コンピュータ（スマホ、タブレット、PC）には「鍵」が必要だよ
 - パスワード、

なるべく早く１００個のキーワードを集めていくようにします。
何か良いネタあれば是非！！
Cloud9でMojoliciousとAmon2を動かす

[Cloud9でPerl](http://qiita.com/na3ksg/items/47633e6985453039b8d2)
先日、意気揚々とCloud9でPerl環境を作ったので色々触ってみようとしたが、Mojoliciousを起動するところで躓いたのでメモ。  

## Mojolicious
```
$ mojo generate lite_app myapp.pl
$ morbo myapp.pl
```
通常通り上記のコマンドを入力すると起動しない。
[![https://gyazo.com/0f30fe6e068fc7ef0f383cf26e41f229](https://i.gyazo.com/0f30fe6e068fc7ef0f383cf26e41f229.png)](https://gyazo.com/0f30fe6e068fc7ef0f383cf26e41f229)
#### 解決法
```
 $ morbo -l "http://0.0.0.0:8080" myapp.pl
```
`-l`若しくは`--listen`オプションで起動パラメータを変更する。
下記の画面が表示されたら起動成功。


[![https://gyazo.com/9bd761eed645b0865408661443d9eaaa](https://i.gyazo.com/9bd761eed645b0865408661443d9eaaa.png)](https://gyazo.com/9bd761eed645b0865408661443d9eaaa)


## Amon2
ついでにAmon2の起動パラメータ変更もやっていく。  

```
 $ amon2-setup.pl Myapp
```
上記コマンドで雛形生成した際に`script/myapp-server`という起動用スクリプトが生成されているので変更する。

```
my $port        = 8080;
my $host        = '0.0.0.0';
```

27,28行目を上記のように変更すると起動する。
Google Chromeのユーザーが消えているときの復旧方法


どうも、stmkzaです。
さっきChromeがクラッシュして、強制終了をかけた後に、何か違和感を感じたのでよく見てみると、ユーザーのところが「ユーザー1」になっていることに気が付きました。

しかも、ほかのユーザーがすべて消えていたので、復旧をしました。これはその時のメモです。
**この情報はすべてのパターンで使えるとは限りません。自己責任でお願いします。**
**作業はChromeを終了させてから行ってください。**
# Chromeのユーザーデータが保存してある場所を開く方法
まず、Chromeのユーザーデーターが保存してある所を見つけなくてはなりません。その方法ですが、
## Windows
<kbd>[Win]</kbd>+<kbd>[R]</kbd>を同時に押して、下の通りに入力してください。

```bat
%userprofile%\AppData\Local\Google\Chrome\User Data
``` 

そして、<kbd>[OK]</kbd>を押下します。
## Mac OS X
Terminal.appを開いて、
```bash
open ~/Library/Application Support/Google/Chrome/
```
と入力します。それで<kbd>return</kbd>キーを押下します。
# 復旧方法
```Local State```というファイルがあるのですが、それを```Local State.bak```に変えて、
もう一つ```Local State```という名前に似たファイルがあるのですが、それを```Local State```にリネームします。すると、多分復旧されています。
vimで単語単位上書きコピー&ペースト

# やりたいこと
+ 1回コピーした単語を何回もコピー&ペースト
+ 特に単語を別の単語に置き換える時

# 課題
通常の設定だと`ve`で単語を選択=>`p`でコピーしておいた単語をペースト、という行動を良く行うのだが、もう一度同じ行動を行うと前回`p`で上書きされた単語(いらない)がレジスタに残っていて、それがペーストされてしまう。

# vimrcの設定
+ `cp`コマンドでカーソル下の単語を、コピーしておいた別単語で上書きする設定。
+ 使わない8番レジスタに上書きされる前の単語を格納し、直前にコピーしておいた単語をペーストする。

```vim
nnoremap cp ve"8d"0p
```

### 覚書
+ nnoremap
    - ノーマルモードでのキーマップ割当て(再割当なし)
    - nmapだと再割当ありになるが、これは基本使わない(ユーザーの割当を用いて解釈するので間違いのもと)
+ レジスタの使い方
    - `"0`から`"9`のレジスタがあって、明示的に指定しない場合はコピーされた順番に押し出し格納されていく。
    - カットの場合は`"0`レジスタは使用されないという情報もあるが、xvim(xcode用のvimプラグイン)ではそうでもなかった。
    - `:reg`でレジスタ一覧を表示できる。
    - 例えば5番レジスタを指定しての1行コピーは`"5yy`のように行う。
[automator + applescript + shell] ダイアログで名称を取得してフォルダとファイルを作る

## きっかけはtypora
[typora](http://www.typora.io/)

Markdownエディタです。最近の流行りに乗っており以下のような機能を持ってます。
- GFM
- mermaidでグラフが綺麗
- WYSIWYGエディタ（これまで使ってきたものの中では一番ストレスなく動いてくれる）
- Win/OSX/Linux

詳細は以下。
- [様々な機能を備えたMac用Markdownエディタ「Typora」がシーケンス図やフローチャートなどのダイアグラム表示をサポート。](http://applech2.com/archives/20160820-typora-markdown-support-diagrams.html)
- [Typora - 多機能でエレガントなMarkdownエディタ](http://www.moongift.jp/2016/11/typora-%E5%A4%9A%E6%A9%9F%E8%83%BD%E3%81%A7%E3%82%A8%E3%83%AC%E3%82%AC%E3%83%B3%E3%83%88%E3%81%AAmarkdown%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/)

これが設定としてjpgなどをイメージを読み込むときに、指定のフォルダにコピーを作ってくれるのだけど、いちいちディレクトリを作り、YAMLを書き込むのがめんどくさいので自動にやって欲しい。

## やったこと
"サービス"で指定したフォルダを受け取る

![newnote_1.png](https://qiita-image-store.s3.amazonaws.com/0/129283/5b09bfd4-9a79-3bd0-c51e-337093a0de19.png)

シェルスクリプトを実行して、フォルダ名とファイル名を取得
入力は引数として引き渡す。

![New Note in Yiki.workflow 2017-01-01 22-47-44.png](https://qiita-image-store.s3.amazonaws.com/0/129283/49fe3989-d60e-0ee0-8937-cc595c328f8a.png)

AppleScriptを実行
ここでダイアログを表示して、作成したいものの名前を取得
![New Note 2017-01-01 22-49-29.png](https://qiita-image-store.s3.amazonaws.com/0/129283/1a5bc4fa-29b2-28bd-bde5-6aa3f8fa4aa4.png)

![New Note in Yiki.workflow 2017-01-01 22-55-21.png](https://qiita-image-store.s3.amazonaws.com/0/129283/51907a59-065d-fe76-b5d9-5c075e7fe09c.png)

```applescript
on run {input, parameters}
	set arg2 to item 2 of input
	set dpath to arg2 & "/"
	
	set theResult to display dialog "New Note Name" & return & "in " & dpath with title "New Note" buttons {"Cancel", "Create"} default answer ""
	
	set buttonText to button returned of theResult
	set dname to text returned of theResult
	
	if buttonText is "Cancel" then
		quit me
	end if
	
	if dname is "" then
		quit me
	end if
	
	set container to {dpath, dname}
	
	return container
	
end run
```


フォルダとファイルを作成
スペースはハイフンで置換、作成したmarkdownファイルに、イメージをどこに保存するのかについて、YAMLの設定を記述しておく。

![New Note in Yiki.workflow 2017-01-01 22-56-29.png](https://qiita-image-store.s3.amazonaws.com/0/129283/d3bffa1e-f30d-d5ec-b3e1-5ab1f6072588.png)

```bash
cd $1
dname=(`echo $2 | tr -s " " "-"`)
mkdir $dname
fname="${dname}.md"
cd $dname
touch $fname
mkdir src
echo -e "---\ntypora-copy-images-to:./src\n---" >> $fname
open -a "typora" $fname
```

結果できるもの

```shell-session
.
├── src
└── test.md
```

## 今回やらなかった事
- 現在アクティブなウィンドウとディレクトリを読み込み、そこに作成する。  
OSXのファインダーの`command+shift+N`でフォルダを作れるように、指定したものをつくりたかった。

> なんで現在の状態だと、ノートを作りたいところの一個上の階層のディレクトリに対して操作を行わないと、ノートを作りたい階層を正確に取得出来ないんですよね...まぁ困ってはいませんが。
Ruby on Rails ~「ransack」で検索機能を実装（コードメモ）

◆ユーザーがイベントを登録していくアプリケーションで、イベントを「イベント名、日時」での検索できるよう実装しました。

今回は「ransack」をインストールすることで、非常に簡単に実装できました。

#1.Gemfileに追記しインストール。

```
  gem 'ransack'
```
```
$ bundle install
```

#2.コントローラーの編集。

```app/controllers/events_controller.rb
 def index
    @search = Event.search(params[:q])
    @events = @search.result.order("created_at ASC")

    respond_to do |format|
      format.html
      format.json { render json: @events }
    end
  end
```

#3.ビューファイルの編集

```app/views/events/index.html.erb
  <div>
#1.イベント名、開催場所などのキーワードで検索する場合。
    <%= search_form_for @search do |f| %>
    <%= f.label :event_name_or_event_location_cont, 'イベント名、開催場所で検索' %>
    <%= f.text_field :event_name_or_event_location_cont %>
    <%= f.submit 'SEARCH' %>
    <br />
#2.日時から検索する際は、date_selectを使用。
    <%= f.label :event_date, '開催日時から検索' %>
    <%= f.date_select :event_date_gteq, :default => Time.now - 1.month %>〜
    <%= f.date_select :event_date_lteq, :default => Time.now + 1.year %>
    <%= f.submit 'SEARCH' %>
    <br />
    <%= link_to '検索条件のクリア', request.path %>
    </div>
    <% end %>
```

```
<%= f.label :event_name_or_event_location_cont, 'イベント名、開催場所で検索' %>
```
上記のように、「カラム名_or_カラム名_cont」とすることで、条件に柔軟性を持たせることが可能。今回は、「
event_name」「event_location」のいずれかで検索に引っかかるようにしました。
また、検索条件をクリアする際は、

```
<%= link_to '検索条件のクリア', request.path %>
```
を記述し、いつでも検索前の状態に戻れるようにしています。