OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHP3でもTabでコマンド補完をしたい！

CakePHPのコンソール作業をしているときにすべてのコマンドやオプションを憶えておくのはとても難しいと思います。
自分は無理です。。。
あのコマンド何だったけ？
bakeのあのオプション何だったけ。。。等々

この問題を解決する為にCakePHP3には `Completion シェル` が実装されています。

## bash-completionのインストール

まずCakePHP3のコマンド補完を行う為に、 `bash-completion` をインストールする必要があります。

```
# epelリポジトリを有効にする必要があります。
yum install bash-completion
```

## bash-completionスクリプトの設置

以下のファイルを作成する(作成後は再ログイン等を行う必要があります)  
`/etc/bash_completion.d/cake`

```
#
# Bash completion file for CakePHP console
#

_cake()
{
    local cur prev opts cake
    COMPREPLY=()
    cake="${COMP_WORDS[0]}"
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    if [[ "$cur" == -* ]] ; then
        if [[ ${COMP_CWORD} = 1 ]] ; then
            opts=$(${cake} Completion options)
        elif [[ ${COMP_CWORD} = 2 ]] ; then
            opts=$(${cake} Completion options "${COMP_WORDS[1]}")
        else
            opts=$(${cake} Completion options "${COMP_WORDS[1]}" "${COMP_WORDS[2]}")
        fi

        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi

    if [[ ${COMP_CWORD} = 1 ]] ; then
        opts=$(${cake} Completion commands)
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi

    if [[ ${COMP_CWORD} = 2 ]] ; then
        opts=$(${cake} Completion subcommands $prev)
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        if [[ $COMPREPLY = "" ]] ; then
            _filedir
            return 0
        fi
        return 0
    fi

    opts=$(${cake} Completion fuzzy "${COMP_WORDS[@]:1}")
    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
    if [[ $COMPREPLY = "" ]] ; then
        _filedir
        return 0
    fi
    return 0;
}

complete -F _cake cake bin/cake
```

## 実行結果

これで通常コマンドと同様にTabを押すことでコマンド補完を行うことが可能です。
*自作のコマンド* も同様に補完できます。

○コマンド一覧

```
bin/cake [Tab]
bake        benchmark   cache       console     i18n        migrations  orm_cache   plugin      routes      server      whitespace
```

○サブコマンド一覧

```
bin/cake bake [Tab]
all                 cell                controller          form                loadTasks           migration           migration_snapshot  plugin              shell               startup             template            behavior            component           fixture             helper              mailer              migration_diff      model               seed                shell_helper        task                test
```

○オプション一覧

```
bin/cake bake -[Tab]
--connection  --everything  --force       --help        --plugin      --prefix      --quiet       --theme       --verbose     -c            -f            -h            -p            -q            -t            -v
```

## 参考

http://book.cakephp.org/3.0/en/console-and-shells/completion-shell.html
Salesforce APIコール数の制限と使用状況確認 + Salesforceライセンス確認

# はじめに

最近、Salesforceを触る機会が少しづつ増えてきたので、備忘録がてら、Salesforceに関する手順をまとめる事にしました。

本ページでは、24時間あたりのSalesforce APIコール数の制限、Salesforce APIコール数の使用状況、Salesforceライセンス使用状況を確認する手順について記します。

# 環境

本手順はSalesforceのDeveloper Editionで確認した手順になります。

# 参考資料

Salesforce APIコール数の制限については、以下をご参照下さい。

https://help.salesforce.com/apex/HTViewHelpDoc?id=limits_general.htm&language=ja
https://developer.salesforce.com/docs/atlas.ja-jp.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_api.htm

# 手順

## (1) SalesforceのDeveloper Editionアカウントを取得します。

以下のページを参考にして、SalesforceのDeveloper Editionアカウントを取得します。

http://salesforcedevelopersjapan.github.io/lightning-connect-tutorial/create-developer-edition.html

## (2) https://login.salesforce.com/ にログインします。

ログイン画面のユーザ名に新規作成したSalesforceユーザアカウント名、パスワードを入力して「ログイン」をクリックします。

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/8c0a817c-8b29-f320-f144-261a84dbbb67.jpeg)

## (3) ログイン後、画面上の「設定」をクリックします。

## (4) 画面左側の「管理」->「組織プロファイル」->「組織情報」をクリックします。

![WS000035.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/2b037692-7acd-b1a1-1de2-27a8980c626e.jpeg)

## (5) 組織情報画面が表示されます。24時間あたりのSalesforce APIコール数の制限、Salesforce APIコール数の状況を確認出来ます。

![WS000036.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/6da4e985-84b4-5acb-6450-6a3d64eee0cb.jpeg)

## (6) 組織情報画面を下にスクロールすると、Salesforceライセンスの使用状況を確認出来ます。

![WS000037.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/c9c675cc-ae9b-09ed-2d5e-611c7ce4d8fc.jpeg)

![WS000038.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/40bac531-1ac5-e9b4-7030-46fd5a4f9a06.jpeg)

***

以上になります。
batchWriteItemでデータ追加

# やりたいこと

DynamoDBに対してbatchWriteItemを使用して、データを追加。


# 注意点
1リクエストで25件まで
25件の登録の一部がスループットエラーの場合、UnprocessedItemsにエラーデータが格納されるのでリトライが必要。

# 実装
``` javascript
'use strict';

let util = require('util');
let aws = require('aws-sdk');

aws.config.loadFromPath('./config/credentials.json');
let dynamodb = new aws.DynamoDB({apiVersion: '2012-08-10'});

// 格納データ作成
let writeFuncs = new Array();
for (let i = 0; i < 5; i++) {
    let putRequests = [];
    for (let l = 0; l < 5; l++) {
        let id = (i + 1) * l;
        putRequests[l] = {
            PutRequest : {
                Item : {
                    'id' : {'S' : id.toString()},
                    'name' : {'S' : 'name' + id}
                }
            }
        }
    }

    function doWriteItemCall() {
        return doWriteItem({
                RequestItems : {
                    "users" : putRequests
                }
            });
    }

    writeFuncs[i] = doWriteItemCall;
}
writeFuncs[5] = function () {
    console.log('end');
}
// データ追加
console.log('start');
sequenceTasks(writeFuncs);

function doWriteItem(params) {
    console.log('doWriteItem call');

    return new Promise(function (resolve, reject) {
        let callback = batchWriteItemCallback.bind(null, resolve, reject);
        dynamodb
            .batchWriteItem(params)
            .on('complete', callback)
            .send();
    });
}


function batchWriteItemCallback(resolve, reject, response) {
    let error = response.error;
    let data = response.data;
    console.log(error, data);
    let callback = batchWriteItemCallback.bind(null, resolve,reject);

    if (error) {
        if (error.retryable) {
            dynamodb
                .batchWriteItem(response.request.param)
                .on('complete', callback)
                .send();
        } else {
            reject(error);
        }
    } else if('users' in data.UnprocessedItems) {
        let params = {};
        params.RequestItems = data.UnprocessedItems;
        dynamodb
            .batchWriteItem(params)
            .on('complete', callback)
            .send();
    } else {
        resolve();
    }
}

function sequenceTasks(tasks) {
    function recordValue(results, value) {
        results.push(value);
        return results;
    }
    // let pushValue = recordValue.bind(null, []);
    return tasks.reduce(function (promise, task) {
        console.log('reduce call');
        return promise
            .then(task)
            // .then(pushValue)
            ;
    }, Promise.resolve());
}
```
[MariaDB][外付けHDD][CentOS7]CentOS7＋MariaDB＋外付けHDD

#外付けHDDをマウント
###フォーマット
こちらのサイトで。
http://mrs.suzu841.com/mini_memo/numero_13.html
###再起動後も維持
こちらのサイトで。
http://kazmax.zpp.jp/linux_beginner/mount_hdd.html#ah_4
#MariDBのデータディレクトリの変更
データディレクトリ変更
　変更元
　　/var/lib/mysql/
　変更先
　　/data/mariadb/
###MariaDB停止
・停止実行
`systemctl stop mariadb`
・停止確認
`systemctl status mariadb`
###データコピー
`cp -pR /var/lib/mysql/* /data/mariadb/`
###設定ファイル変更
`vi /etc/my.cnf`

```
[mysqld]
#datadir=/var/lib/mysql これを下記へ変更。
datadir=/data/mariadb/
#socket=/var/lib/mysql/mysql.sock これを下記へ変更。
socket=/data/mariadb/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
```

###MariaDB起動
・起動
`systemctl start mariadb`
・起動確認
`systemctl status mariadb`
Excel メモ

# ■ ブックおよびシートのデフォルト設定となるテンプレートを作成する

下記のフォルダにテンプレートとなるエクセルファイルの保存する。
```
C:\Users\アカウント名\AppData\Roaming\Microsoft\Excel\XLSTART
```

ファイル名はそれぞれ下記のように設定する必要がある。
* ブック テンプレート：Book.xlt
* シート テンプレート：Sheet.xlt

http://office-qa.com/Excel/ex116.htm

# ■ シート名を参照する

```
=RIGHT(CELL("filename",A2),LEN(CELL("filename",A2))-FIND("]",CELL("filename",A2))) 
```

# ■ リストボックスの参照を可変にする

OFFSET関数を使って参照先セル範囲を可変にする

```
=OFFSET(基準セル,移動する行数,移動する列数,基準セルの行の大きさ,基準セルの列の大きさ)
=OFFSET(参照セル,0,0,COUNTA($参照列:$参照列)-1,1)
```

http://officetanaka.net/excel/function/function/offset.htm
https://digitalfan.jp/83663



# ■ 時間の合計を表示

1. ［セルの書式設定］ダイアログボックスの［表示形式］タブ。
2. ［分類］ボックス一覧から「ユーザー定義」。
3. ［種類］ボックスには、「[h]:mm」と入力して、［OK］ボタン

https://enterprisezine.jp/iti/detail/691


# ■ ショートカットキー

| ショートカット | 内容 |
|:-----------------|:-----------------|
| Ctrl + Shift + ＆ | 選択しているセルの外枠に罫線を描く |
| Ctrl + Shift + _ | 選択している罫線を削除 |
| Ctrl + ;       | 現在日付入力 |
| Ctrl + :       | 現在時刻入力 |
| Ctrl + 1       | セルの書式 | 
| F2             | セルの編集           |            
| F4             | 前回行った操作を行う  | 
| F12            | ファイルを名前を付けて保存 | 
| シート選択 + Ctrl + ドラッグ | シートのコピー |

# ■ VBA

## ● 画面の更新を停止

```vbnet
Application.ScreenUpdating = False
```

## ● 関数やメソッドで引数を()で囲むケース

* 括弧をつける ⇒ 返り値を返す
* 括弧をつけない ⇒  返り値なし

http://officetanaka.net/excel/vba/tips/tips92.htm

## ● 引数を省略

Optional を付ける

```vbnet
Option Explicit

Sub optinalMain()
    Dim value As Integer
    value = 10
    Debug.Print optinalFunction(value)
End Sub

Private Function optinalFunction(element As Integer, Optional optinalValue As Variant)
    If IsMissing(optinalValue) Then
        optinalFunction = element
    Else
        optinalFunction = element * optinalValue
    End If
End Function
```

## ● VBAでリスト(Collection)を使用する

```vbnet
Option Explicit

Sub listSampleMain()
    Dim list As New Collection
    Dim element As Variant

    ' 要素の追加
    list.Add "Item1"
    list.Add "Item2", "Key2"
    list.Add Item:="Item3", Key:="Key3"

    ' インデックスで参照
    Debug.Print list(2)
    Debug.Print list.Item(2)
    
    ' キーで参照
    Debug.Print list("Key2")
    Debug.Print list.Item("Key2")
    
    ' 要素の削除 : インデックスを指定して削除する
    list.Remove 2
    
    ' 要素数の表示
    Debug.Print list.count
    
    ' 全要素の表示
    For Each element In list
        Debug.Print element
    Next element
    
    ' 全要素の削除
    For Each element In list
        list.Remove 1
    Next element
End Sub
```

# ■ 参考

* [Excelを使った業務ツール](http://biztarget.nikkeibp.co.jp/atcl/special/16/090500030/index.html)

* https://itbyari.wordpress.com/2015/12/05/officeファイルexcel、wordなどを、右クリックメニューから/
html・cssでQ&Aリストを作成する

#html・cssでQ&Aリストを作成する

##環境
 - html
 - css


```html:index.html
<html>
<head>
  <link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>

<ol id="index">  

  <!-- 見出し追加用テンプレート -->
  <!--  <li><a href="#link_id">index_title</a></li> -->
</ol>

<ul class="qa">

  <!-- Q&A追加用テンプレート -->
  <!--
    <li id="link_id">
      <dl>
        <dt>Q.</dt>
        <dd>A.</dd>
      </dl>
      <p><a href="#index">ページトップに戻る↑</a></p>
    </li>
  -->
</ul>
</body>
</html>
```

```css:style.css
/* --- リストエリア --- */
ul.qa {
  margin: 0; 
  padding: 0;
  border-top: 1px #c0c0c0 dotted; /* リストエリアの上境界線 */ 
  list-style-type: none;
  font-size: 80%;
}

/* --- リスト項目 --- */
ul.qa li {
  padding: 20px 5px 14px; /* リスト項目のパディング（上、左右、下） */
  border-bottom: 1px #c0c0c0 dotted; /* リスト項目の下境界線 */
}

/* --- 項目の内容 --- */
ul.qa dl {
  margin: 0;
}

/* --- Questionエリア --- */
ul.qa dt {
  margin: 0;
  padding: 5px 0 12px 30px; /* Questionエリアのパディング（上右下左） */
  /*background: url(q6.gif) no-repeat left top; /* Questionエリアの背景 */
  font-weight: bold;
  line-height: 120%;
}

/* --- Answerエリア --- */
ul.qa dd {
  margin: 0;
  padding: 2px 0 6px 30px; /* Answerエリアのパディング（上右下左） */
  /*background: url(a5.gif) no-repeat left top; /* Answerエリアの背景 */
  line-height: 150%;
}

p {
text-align: right;
}
```
ファイル送信サービスのまとめ（P2Pとクラウドストレージ）

動画など、1GBを超えるファイルをやりとりすることがたまにあり、使えるサービスがないかを少し調べたので、そのメモ。

# P2Pとクラウドストレージの2パターンある

クラウド上にアップロードして、そこから共有リンクなどを使ってダウンロードさせる、クラウドストレージが前々からあるやり方です。Dropboxやfirestorageなどがこれにあたります。

2〜3年前くらいから、ビデオチャットなどで使われるWebRTCを使った、P2P型の方針でやりとりするサービスもでてきているようです。P2Pなので、端末間で直接やりとりするので、一旦サーバにアップする手間が省けることによるメリットが、クラウドストレージに比べてでてきます。

# クラウドストレージ

ファイルをアップロードして、ダウンロードリンクを相手に伝える形での利用になります。
サービスによっては、1ファイルのサイズに制限があったり、パスワードやダウンロードの回数制限をつけられるものがあります。

* [BitSend](https://bitsend.jp/)
* [firestorage](http://firestorage.jp/)
* [Giga File便](http://gigafile.nu/)
* [宅ファイル便](https://www.filesend.to/)

ビジネスでも使えるレベルのサービスを無料で提供している、BitSendが個人的にはおすすめです。

# P2P

P2P通信で、やりとりしたい相手の端末と直接通信することでファイルのやりとりをするサービスです。
たとえば、同じLAN内にいるなら、メールやクラウドストレージ経由でやりとりするのは、サーバにアップする分の時間が手間になります。そういうのを解消するためにでてきたサービスのようです。

* [Send Anywhere](https://send-anywhere.com/)
* [reep.io](https://reep.io/)
* [station307](https://www.station307.com/)
* [DirectSEND](https://directsend.me/)

ブラウザのWebRTCを使っている場合、ブラウザを閉じると通信が途切れるので注意が必要です。すぐ近くにいたり、電話やチャットでやりとりしている相手に、必要なキーやリンクを伝えてやりとりするような使い方になります。

Send Anywhereは日本語対応もあり、クラウドストレージ型の共有リンクを作成することもできます。P2P型では、6桁のキーを相手に伝える形になります。共有されると、相手の端末のOS、ブラウザの情報が共有履歴にでてきます。

# まとめ

メールでやりとりしている相手ならクラウドストレージ型、目の前にいる相手や電話している人ならP2P型、と場面に応じて使い分けるのが良さそうです。

## 参考サイト

* http://windowsmaster.xyz/p2pfileservice-1783
* http://www.otokuweb.jpn.org/free-s-webstorage_2.htm
ポケモンGoでポケモンが近くに出現した時に発行されるブロードキャストインテントのAction名

ポケモンが近くに出現した時に端末がバイブレーションしますが、そのときに発行されるブロードキャストAction名についてです。

```
com.google.android.gms.auth.trustagent.trustlet.ACTION_PERSONAL_NEARBY_ALERT
```

このブロードキャストをフックしてhogehogeできそうですね。
＃ローカルブロードキャストの可能性もあるのでできないかもしれませんが。

以上です。
iOSのテストを始める際の参考資料

## 最初に読みたいもの
- [Quickドキュメント](https://github.com/Quick/Quick/tree/master/Documentation)
    - Quick/XCTestに関わらず、テストの基本が書いてあります。（実際、前半のドキュメントはXCTestで書いてあります。）
    - 日本語もあります。
    - arrange / act / assert
- Testing View Controllers with Quick [English](https://realm.io/news/rachel-bobbins-testing-view-controllers-quick/) [日本語](https://realm.io/jp/news/rachel-bobbins-testing-view-controllers-quick/)
    - 関連するオブジェクトはすべてInjectする、などのことが述べられています。
- UITestについて
    - UITestの方法の違い（XCUITest / KIF）などは、次のスライドに詳しく書かれています。  
[Outside In: Using UI Tests to Start Improving Your App - UIKonf Berlin, 2016](https://speakerdeck.com/designatednerd/outside-in-using-ui-tests-to-start-improving-your-app-uikonf-berlin-2016)

## その他
- [Common Challenges & Best Practices for TDD on iOS](http://www.slideshare.net/DerekLee/common-challenges-best-practices-for-tdd-on-ios)
    - TDDの基礎から実践上の問題まで、幅広く、また深い内容です。
PythonでXMLをパースする

個人的な作業用です。

総務省APIなんかではXMLでレスポンスを取得できます。このXMLを解析する方法をまとめておきます。週明け時間が空いた時に仕事で使う予定。
総務省APIのサンプルコードに社会・人口統計を取得する方法が書いてありまして、叩くと以下の様なXMLが返ってきます。

```xml
<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<GET_STATS_DATA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://api.e-stat.go.jp/rest/2.0/schema/GetStatsData.xsd">
<RESULT>
<STATUS>0</STATUS>
<ERROR_MSG>正常に終了しました。</ERROR_MSG>
<DATE>2016-09-04T21:28:09.920+09:00</DATE>
</RESULT>
<PARAMETER>
<LANG>J</LANG>
<STATS_DATA_ID>C0020050213000</STATS_DATA_ID>
<NARROWING_COND>
<CODE_CAT01_SELECT>#A03503</CODE_CAT01_SELECT>
</NARROWING_COND>
<DATA_FORMAT>X</DATA_FORMAT>
以下省略
```

これをurllibモジュールを使って取得してきて、xmlモジュールを使って要素にアクセスするという感じ。古いAPIだとJSON出力ない場合もあるので。

# APIから取り込み

これはいろんなところに書いてありますし、公式ドキュメント見たら色々書いてあります。総務省APIのエンドポイントURLを使いますが、アプリケーションIDとかはログインして取得してください。

```py3
import urllib

url = 'http://api.e-stat.go.jp/rest/2.0/app/XXXXXXXXXXXX'
req = urllib.request.Request(url)

with urllib.request.urlopen(req) as response:
    XmlData = response.read()
```

これでXmlDataにXMLのテキストデータが格納されます。

# XMLの解析

XMLモジュールをインポートして解析開始。これも公式ドキュメントに詳しく書いてあります。

```py3
import xml.etree.ElementTree as ET

root = ET.fromstring(XmlData)
```

これだけ。

## 要素の中身を見てみる

```py3
# 最上位階層のタグと中身
print(root.tag,root.attrib)

# 子階層のタグと中身
for child in root:
    print(child.tag, child.attrib)
```

孫要素まで入れたいのならリストやディクショナリ作って書き込むのがいいんですかね。

## 要素へのアクセス

リストへのアクセスなんかと同じ感じ。

```py3
print(root[0][1].text)
```

とりあえずやりたいことはこれでできそう。
Chef Cookbook開発環境として本当に使えるWorkstation環境

この記事は、[「クラウド時代のシステム管理」の記事](http://www.takanyan.net/compare-chef-workstation/)を転記したものです。


過去3回にわたり、Chef Workstationの構築方法を書きました。（<a href="http://www.takanyan.net/chef12-workstation-cent7/" target="_blank">CentOS7編</a>、<a href="http://www.takanyan.net/chef12-workstation-windows/" target="_blank">Windows編</a>、<a href="http://www.takanyan.net/chef12-workstation-bashonwindows10/" target="_blank">Bash on Ubuntu on Windows10編</a>）これらの環境でCookbookを開発してみようとしたところ、使い勝手に差が出ましたので、今回は本当に使える環境はどれかについて書きます。

<more>

## 1. Windows環境はあまり使えない

Windows上にChef DKをインストールした環境は、Chef Clientインストールを実行する（bootstrap）ことや、ChefのWeb管理画面を見ることには使いやすいのですが、Cookbookの開発となると、問題が発生しました。それは、<a href="http://www.takanyan.net/chef12-client-cent7/" target="_blank">Chef Client導入手順</a>にあった<code>knife cookbook site install</code>コマンドが正常に動かないことです。

```Shell
C:\Users\aniku\chef-repo>knife cookbook site install chef-client
Installing chef-client to C:/Users/aniku/chef-repo/cookbooks
Checking out the master branch.
Pristine copy branch (chef-vendor-chef-client) exists, switching to it.
Downloading chef-client from Supermarket at version 5.0.0 to C:/Users/aniku/chef-repo/cookbooks/chef-client.tar.gz
Cookbook saved: C:/Users/aniku/chef-repo/cookbooks/chef-client.tar.gz
Removing pre-existing version.
Uncompressing chef-client version 5.0.0.
ERROR: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
---- Begin output of tar zxvf "C:/Users/aniku/chef-repo/cookbooks/chef-client.tar.gz" --force-local ----
STDOUT:
STDERR: tar: Option --force-local is not supported
Usage:
  List:    tar -tf <archive-filename>
  Extract: tar -xf <archive-filename>
  Create:  tar -cf <archive-filename> [filenames...]
  Help:    tar --help
---- End output of tar zxvf "C:/Users/aniku/chef-repo/cookbooks/chef-client.tar.gz" --force-local ----
Ran tar zxvf "C:/Users/aniku/chef-repo/cookbooks/chef-client.tar.gz" --force-local returned 1
```

Chef DKをインストールする際に付属していた<code>tar</code>コマンドが一部のオプションに非対応であることが原因のようです。Cookbookをコミュニティサイトからインストールできないと、開発が非効率になってしまうので、「あまり使えない」と判断しました。

## 2. CentOS 7環境は当然の使い勝手

もともとChefはLinux系OSで使われ始めただけのことはあり、CentOS 7環境で開発する分には特に不自由はありません。knifeコマンドはちゃんと動きますし、Chef Serverとの接続で苦労することもないです。

ただ、ChefのWeb管理画面を閲覧する際には、X Windowを立ち上げるか別のWindows端末から閲覧する必要があります。コマンドラインやChefに慣れている方はWeb管理画面を見て何かすることは必須ではないですが、Chefを触り始めたばかりの時期は、Web画面があるとわかりやすい場合が時々あります。学習効率という点ではちょっと手間がかかります。

## 3. Bash on Ubuntu on Windows10は良いとこ取り

Bash on Ubuntu on Windows10の環境では、<code>knife cookbook site install</code>コマンドを含めコマンドは正常に動く（ようになりました）し、WebブラウザもWindowsで起動できます。ただ、Bash内でのファイルデータをWindows側でも編集したりするためには、ちょっと工夫が必要でした。

<a href="http://www.takanyan.net/chef12-workstation-bashonwindows10/" target="_blank">以前のセットアップ手順</a>では、Bash内の<code>/home/chef-admin/chef-repo</code>以下にWorkstation環境を作りました。しかし、このディレクトリはWindowsからは参照できません。そのため、Windows側でもファイルを編集できるようにするためには、<code>/mnt/c/Users/(ユーザー名)/</code>以下の場所に<code>chef-repo</code>ディレクトリをコピーする必要があります。こうすることで、WindowsとBash on Ubuntuの間でシームレスにデータを扱うことができるようになります。


ここまで書いてきませんでしたが、「じゃあMacOS X上で環境を作ればいいじゃないか」という突込みは無しでお願いいたします。自宅に環境がないもので・・・
Null参照エラーを撲滅するために

クイックソートの発明者として知られるアントニー・ホーアは同時に、
プログラマにとっては馴染み深い Null の生みの親でもあるが、
氏は次のような後悔を口にしておられる。

>これ（Null）は、後に数え切れない過ち、脆弱性、システムクラッシュを引き起こし、
>過去40年間で10億ドル相当の苦痛と損害を引き起こしたとみられる。

そうなのである。
多分、Null参照が原因のバグは全体の１割はある気がする（適当）。

そんなわけで、この忌まわしきNull参照を撲滅するための対策を考えみた。

##その１　Nullを返さない
メソッドの戻り値としてNullを返さないようにする。
配列を返して、受け手側でループで処理しよう。
また、どうしても配列の先頭要素を取得してそれを返したい場合は、
Nullの時は空のインスタンスを返そう。
（NullObjectパタンを使ってもいいが全部のオブジェクトに対してこれを定義するのはしんどいので、重要なものだけにするのがよいと思う）

##その２　Nullを代入しない
値の初期値にNullを代入しない。
stringの場合は空文字列、数値の場合は0、オブジェクトの場合は空のインスタンス（もしくはNullObject）を設定する。
「= nil」は絶対に認めない！

##その３　Swiftを使う
人類は学んだ。Nullを代入できなければ、Null参照など発生しないことを。
Swiftはデフォルトの型でNullの代入ができない。
なので、以下のようなコードはエラーになりコンパイルできない。

```swift:default.swift
var normalStr : String = null
=> エラー
```
Nullを代入するにはオプショナル型を使わなければならない。

```swift:optional.swift
var normalStr : String? = null
```

ビルド時にオプショナル型の使用を検知するような仕組みを作っておけば、
Null参照が起こる可能性を０にできる。
素人の言語処理100本ノック:00


## はじめに

Linuxを使ったことがなく、Pythonも全く知らず、統計も大学でかじったはずが全く覚えておらず、正規表現も知らず、英語も苦手という私が、LinuxとPythonで[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)を受けてみよう、という挑戦の記録です。一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

ちなみに私のスペックですが、一応元プログラマーとしてWindows Visual C/C++畑で育ってきました。ちなみにその前は68k MacのMPWでC++。意味が分かる方は同世代か先輩ですね^^ この歳で、はたしてどこまでノックに耐えられるのか...

## 環境について
- Ubuntu 14.04 LTS
- Python 2.7.6
- gedit 3.10.4

で挑戦します。今のパソコンはMacなので、実際にはParallels Desktopで仮想化しています。

Pythonは3.xにしようか悩んだのですが、Ubuntuの素人がPythonのバージョン切り替えなどでつまづいているとノックが始まらないので、Ubuntuのデフォルトをそのまま使うことにしました。

*(2016/09/25追記)
その後、識者の方からアドバイスをいただき、[素人の言語処理100本ノック:02](http://qiita.com/segavvy/items/725b20f21951975a06fd)以降はUbuntu 16.04 LTS、Python 3.5.2 :: Anaconda 4.1.1 (64-bit)に変更しました。*

IDEもちょっと探してみたのですが、Pythonの世界にはメジャーなものがいくつもあるようですね。現時点では素人すぎて判断ができないので、まずはUbuntuのテキスト エディターで始めてみます。

## 第1章: 準備運動
###00. 文字列の逆順
>文字列"stressed"の文字を逆に（末尾から先頭に向かって）並べた文字列を得よ．

出来上がったコード：

```python:main.py
# coding: utf-8
target = u'stressed'
result = target[::-1]
print(result)
```

実行結果：

```python:端末
desserts
```

***

最終的にシンプルになったのですが、実は逆順というところにハマりました。

`[start:stop:step]`で指定できるスライスは非常に便利なのですが、stepが負の場合にちょっと混乱します。

スライスで指定するインデックスは、「そのインデックスの要素と、その1つ前の要素の『間』を指している」と考えると理解しやすいと聞いて「なるほど！」と思ったのですが、これは逆順の場合に通用しません。実際にインタプリタで試してみます。

```python:インタプリタ
>>> target = 'abcde'
>>> target[0:4:1]
'abcd'
```

stepが正の場合、stopで指定したインデックス4は'd'と'e'の間を指すから'd'までが取得できる、という理解で大丈夫です。
しかしstepが負の場合、

```python:インタプリタ
>>> target[4:0:-1]
'edcb'
```

startで指定したインデックス4で'e'が取得できてしまいます。逆にインデックス0で指定した'a'は取得できません。

スライスで指定するインデックスは、「startに指定するならそのもの、stopに指定するなら（stepで指定する方向における）1つ手前を指す」と理解するのが良さそうです。

なお、今回の問題は最初から終わりまでが対象なので、startもstopも省略すればOKでした。stepが負なら省略時もきちんと前後が入れ替わってくれます。てっきり、stepが負の場合は省略できず、自分で前後入れ替えたものを指定しないといけない！と思い込んで「stopで先頭が指定できない＞＜」とハマってしまっていました。

***

Python3.xではprint文がprint関数になって括弧が必要になったとのことなので、括弧を付けてみました。バージョンアップでここまで互換がすっ飛ぶような変更が行われるのは新鮮ですね。Pythonなかなか面白そうです^^


最初のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。

***

（次の問題へのリンクを入れようかと思ったのですが、投稿の度に1つ前の投稿を修正しないといけないため、冒頭に一覧へのリンクを追加することにしました。kisyamanさん、アドバイスありがとうございます。）
.NET で HelloWorld を Macでやってみた

.NETをやる必要がなにやらありそうなので、Macで環境構築を行った時のメモ

# .NET Core のインストール

[.NET Core](https://www.microsoft.com/net/core#macos)

brew でまずは最新の openssl をインストールするみたい

```bash
$brew update

$brew install openssl

$ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib

$ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/
```

次に最初のリンクから辿れる Official Installer よりインストール。
しかし、dotnet コマンドのパスが通っておらず使えない。
と思ったら、known Issueのページに oh-my-zsh 使うとこの問題があるよと書いてあった。

[Known issues & workarounds](https://github.com/dotnet/core/blob/master/cli/known-issues.md)

書いてある通り、シンボリックリンクを作成する。

```bash
$ln -s /usr/local/share/dotnet/dotnet /usr/local/bin

$dotnet --version
1.0.0-preview2-003121
```

よし。
書いてある通り、コマンドを実行。

```bash
$mkdir hwapp
$cd hwapp
$dotnet new
```
`dotnet new`コマンドでHello World用のファイルができるようだ。
`Program.cs`　と `project.json` ができていた。
それぞれ以下の様な感じ。

```Program.cs
using System;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}
```

```project.json
{
  "version": "1.0.0-*",
  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true
  },
  "dependencies": {},
  "frameworks": {
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.0"
        }
      },
      "imports": "dnxcore50"
    }
  }
}
```

次に`dotnet restore`コマンドを実行。

```bash
$dotnet restore
```

これで `project.lock.json` というファイルできる。

次に実行。

```bash
$dotnet run
Project hwapp (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling hwapp for .NETCoreApp,Version=v1.0

Compilation succeeded.
    0 Warning(s)
    0 Error(s)

Time elapsed 00:00:01.4154838


Hello World!
```

# Visual Studio Code をインストールする

[Visual Studio Code](https://code.visualstudio.com/b?utm_expid=101350005-27.GqBWbOBuSRqlazQC_nNSRg.1&utm_referrer=https%3A%2F%2Fdocs.asp.net%2Fen%2Flatest%2Ftutorials%2Fyour-first-mac-aspnet.html)

インストーラーがあるのでインストール。
インストールしたら起動。
拡張機能で C# をインストール。
先ほど開いたプロジェクトを開くことが出来て、編集出来たり。
rex0220 テーブル行移動プラグイン

kintone のテーブル行を移動できるプラグインです。

- 複数テーブルを指定可能
- テーブル内に、添付ファイル項目があっても移動可能
- テーブルのソート機能
- ドラッグによる行移動
- ３ヶ国語対応
- 動作環境は、PCのみ

[rex0220 stores](https://rex0220.stores.jp/)で、販売中です。

![tmove02.png](https://qiita-image-store.s3.amazonaws.com/0/100572/34205a91-6235-e956-806f-971a56eb4314.png)

# 直近の変更点

※ Ver.11
・単位指定の数値項目と計算項目（数値）のソート対応
・プラグイン設定で、「ドラッグ&ドロップ」抑止機能を追加
　「ドラッグ&ドロップ」抑止状態で、項目値のコピーが可能
 
※ Ver.10
・プラグイン設定画面のデザイン変更対応
・「詳細画面でソート有効」機能を追加

# 詳細画面の行移動開始ボタン

行移動開始ボタンをクリックすると、行移動編集画面に切り替わります。

![tmove03.png](https://qiita-image-store.s3.amazonaws.com/0/100572/77b5d3fc-edd2-aba0-4c98-2d7866a94ca5.png)

# 行移動編集画面

テーブルの右に、行移動ボタンと行番号が表示されますので、クリックすると上下に移動します。
移動しても行番号は初期表示のまま移動します。

![2021-02-10_22h04_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/6d26c7f0-e4ba-923f-4cd3-8af1d4f65aac.png)

# ドラッグで行移動

テーブル行をドラッグして、行位置を変更できます。

![2021-02-10_22h08_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d68bc63b-4965-4a07-bf87-ded4ced9abe1.png)

# ソート機能

テーブル内の項目名をクリックして、値順位にソートできます。
もう一度クリックすると、逆順にソート。

![2021-02-10_22h12_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/21c62b70-0fac-a480-02d7-f69bf61ac096.png)


#プラグインの追加

![tmove11.png](https://qiita-image-store.s3.amazonaws.com/0/100572/999eb9f4-30a0-cb75-1897-6ecf2a572180.png)

#プラグインの設定

テーブルが一覧表示されますので、対象にするテーブルを選択します。

- NOTE：　メモ欄
- プラグイン有効：　プラグインの有効／無効を指定
- 詳細画面でソート有効：　有効／無効を指定
- テーブル別チェックボックス：　行移動対象テーブルを指定
- 運用環境に反映：　チェックすると、「保存する」ボタンクリックで運用環境に反映します

![2025-01-23_16h35_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3b468430-0399-7d9c-a2dd-936ce6b19f69.png)


# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- アプリ設定を変更した場合は、プラグインを再設定してください。
powershellでパスワード付きのエクセルのパスワードチェックを行う

パスワードがかけられた大量のエクセル遺(資)産を自動処理するときにパスワードが混在していたため作成。つらいｗ
サブフォルダも含めてパスワードチェックします。

```
$passwd_str  = $args[0]
$target_path = $args[1]
$error_str=@()

$xlslist=(get-childitem ($target_path+"\*xls*") -Recurse)

foreach($xlspath in $xlslist.fullname){
$xls=New-Object -ComObject excel.application
    try{
        $wbk1=$xls.workbooks.open($xlspath,[Type]::Missing,[Type]::Missing,[Type]::Missing,$passwd_str,[Type]::Missing,[Type]::Missing,[Type]::Missing,[Type]::Missing,[Type]::Missing,[Type]::Missing,[Type]::Missing,[Type]::Missing,[Type]::Missing)
    }catch{
         $error_str+=$xlspath
    }
$xls.quit()
$xls = $null
[gc]::Collect()
}

echo ("【パスワード】" + $passwd_str)
echo ("【ターゲットパス】"+$target_path)
echo ("【開けなかったファイル】")
echo $error_str
```

下記のように呼び出すと試行したパスワードとエクセル検索したパスのルートと
与えたパスワードで開けなかったエクセルがフルパスで表示されます。

```
スクリプト名 "hoge" "c:\work\"
```

```
【パスワード】hoge
【ターゲットパス】C:\work\
【開けなかったファイル】
C:\work\hoge1.xlsx
```
sinatraなアプリケーションをminitestするための下準備

# Ruby2.3のbundler環境でsinatraをminitestするための下準備

Sinatraをテストするための情報収集をしているのですが、古い情報そのままだと動きません。

なので、いくつかメモ的に情報を残していきます。

---

## 前提

2016/9/4 に検証

環境は以下のとおり

* rbenv 1.0.0
* Ruby 2.3.1
* bundler 1.12.5

---

# 手順

1. 適当なディレクトリを作る
1. `bundle init`
1. Gemfileを編集
1. `bundle install`
1. アプリケーションを書く
1. テストを書く
1. テストを実行する

---

## Gemfile

以下をGemfileに追記

```:Gemfile
gem "sinatra"
gem "minitest"
gem "rack-test"
```

---

minitestは標準ライブラリとしてインストールされていますが、bundler環境では標準ライブラリを無視するっぽいので明示的にインストール

---

rackアプリをテストするためのツールはrackに入っていると思いきや、結構昔にrack-testに切り出されているらしいので、rack-testをインストールしてあげます。

---

以下を実行すると

```
bundle install --path=vendor/bundle
```
---

以下の様な、Gemfile.lockが生成されました。

```:Gemfile.lock
GEM
  remote: https://rubygems.org/
  specs:
    minitest (5.9.0)
    rack (1.6.4)
    rack-protection (1.5.3)
      rack
    rack-test (0.6.3)
      rack (>= 1.0)
    sinatra (1.4.7)
      rack (~> 1.5)
      rack-protection (~> 1.4)
      tilt (>= 1.3, < 3)
    tilt (2.0.5)

PLATFORMS
  ruby

DEPENDENCIES
  minitest
  rack-test
  sinatra

BUNDLED WITH
   1.12.5
```

---


## テスト対象のアプリ

app.rbに対して以下を記述

```ruby:app.rb
require "sinatra"

get "/" do
  "Hello World"
end
```

---

## テストファイルのテンプレート

test_app.rbに以下を記述

```ruby:test_app.rb

require './app'
# require "test/unit" <- 今回はminitestを使うのでコメントアウト
require 'minitest/autorun'
require 'rack/test'

ENV['RACK_ENV'] = 'test'

# class HelloWorldTest < MiniTest::Unit::TestCase <- こいつだと動くけど警告が出る
class HelloWorldTest < MiniTest::Test
  include Rack::Test::Methods

  def app
    Sinatra::Application
  end

  def test_it_says_hello_world
    get '/'
    assert last_response.ok?
    assert_equal 'Hello World', last_response.body
  end
end
```
---

## 実行

以下を実行すると

```
bundle exec ruby test_app.rb
```

---

以下のように標準出力される

```
Run options: --seed 15648

# Running:

.

Finished in 0.015177s, 65.8913 runs/s, 131.7825 assertions/s.

1 runs, 2 assertions, 0 failures, 0 errors, 0 skips
```

---

## テストを書くための参考になりそうなページ

* [MinitestのGithub](https://github.com/seattlerb/minitest)
* [Minitestのassertionのドキュメント](http://docs.seattlerb.org/minitest/Minitest/Assertions.html)
* [Rack::TestのGithub](https://github.com/brynary/rack-test)
* [Rack::Testで使いそうなメソッドの実態](https://github.com/brynary/rack-test/blob/master/lib/rack/test.rb)

---

## 参考情報

* [Rubyのテスティングフレームワークの歴史（2014年版）](http://www.clear-code.com/blog/2014/11/6.html)
* [Testing Sinatra with Rack::Test](http://www.sinatrarb.com/testing.html)
* [Sinatra Recipe Minitest](http://recipes.sinatrarb.com/p/testing/minitest)
* [load-error-rack-test](http://stackoverflow.com/questions/10369458/load-error-rack-test)
【jQuery】入力フォームのチェック

# jQueryを使った入力チェックとエラーの表示
忘れないために、よくある入力チェックとエラーの表示方法をメモ

入力フォームに入力された文字列についてチェックして結果を表示するようにする。
チェックする内容はラジオボタンで変更可能

![入力チェック1.jpg](https://qiita-image-store.s3.amazonaws.com/0/129549/3437ca66-b213-2ba7-d3ee-3af79e5e5773.jpeg)
![入力チェック2.jpg](https://qiita-image-store.s3.amazonaws.com/0/129549/cb18a54a-8faf-b5e6-afb3-c981f7801c1e.jpeg)

以下、コード

```html:index.html
<!DOCTYPE html>
<html>
<head>
  <title>jQuery チェック集</title>
  <meta charset="UTF-8" />
  <script type="text/javascript" src="jquery-3.1.0.min.js"></script>
  <script type="text/javascript">
  $(function() {
    // 空文字チェック
    $("#chk1").change(function() {
      if($("input").val() == "") {
        $("p").html('空文字です');
        $("p").css('color','red');
      } else {
        $("p").html('OK');
        $("p").css('color','green');
      }
    })
    // 全角チェック
    $("#chk2").change(function(){
      if(!$("input").val().match(/^[\u3040-\u30ff]+$/)) {
        $("p").html('全角文字のみです');
        $("p").css('color','red');
      } else {
        $("p").html('OK');
        $("p").css('color','green');
      }
    })
    // 番号チェック
    $("#chk3").change(function(){
      if(!$("input").val().match(/^\d+$/)) {
        $("p").html('数字のみです');
        $("p").css('color','red');
      } else {
        $("p").html('OK');
        $("p").css('color','green');
      }
    })
    // 英字チェック
    $("#chk4").change(function(){
        if(!$("input").val().match(/^[a-zA-Z]+$/)) {
          $("p").html('英字のみです');
          $("p").css('color','red');
        } else {
          $("p").html('OK');
          $("p").css('color','green');
        }
    })
    });
  </script>
</head>
<body>
 <p></p>
 <label>入力チェック</label>
 <input type="text" name="chkinput" size="30" maxlength="20">
 <input type="radio" name="chk_grp" id="chk1">空白チェック
 <input type="radio" name="chk_grp" id="chk2">全角チェック
 <input type="radio" name="chk_grp" id="chk3">番号チェック
 <input type="radio" name="chk_grp" id="chk4">英字チェック
</body>
</html>
```
特殊記号を使って度数からラジアンへの変換を簡潔にする (Custom Operators)

### 目的

図形描画のプログラムを書いていると、度数とラジアンどちらを使えばいいか悩むことがあります。ライブラリにはラジアンの値を渡すことが多いですが、度数表記の方が直感的で分かりやすいので、SwiftのCustom Operatorsを使って度数からラジアンに変換する演算子を作ります。
* * *
### 実装
まず、度数をラジアンに変換する演算子 ° を宣言します。

```swift
postfix operator °    // ° はMacキーボードで Option+Shift+8
```

次に、図形描画ではCGFloatをよく使うため、これを拡張します。
M_PIもCGFloat型のπとして変換するとラジアンも使いやすくなります。

```swift
let π = CGFloat(M_PI)     // π はMacキーボードで Option+p

extension CGFloat {
    static postfix func ° (_ f: CGFloat) -> CGFloat {
        return f*π/180
    }    
}
```

### 結果

```swift
π/2    //1.5707963267949
90°    //1.5707963267949
```

これで、度数とラジアンを同じ感覚で使えるようになります。
特殊記号を演算子として宣言する機能は、複雑な計算がいる分野で特に有効です。
Xcode で RealmPlugin を使う方法（初心者用）


RealmのXcodeプラグインを使うとコーディングが楽になるようなので、使ってみよう。
このXcodeプラグインをインストールするとファイル作成時（New File)の時に、iOS でRealmが選択できるようになります。

じゃやってみよう。


#手順
手順は細かいことを抜きにすれば以下のような感じ
1.Alcatrazをインストール
2.Xcodeを再起動
3.AlcatrazでRealmPluginを検索
4.AlcatrazでRealmPluginをインストール
5.NewFileでRealmファイルが選べればOK

#1.Alcatrazをインストール

```
curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
```
参考：http://alcatraz.io

#2.Xcodeを再起動

Xcodeを起動している場合は再起動しましょう

#3.AlcatrazでRealmPluginを検索
XcodeのメニューバーのWindowから、PackageManagerを選択
ダイアログが開くはずなので、そこの検索窓で、RealmPlugin　と入力
すると、RealmPlugin　が表示されるはず。


#4.AlcatrazでRealmPluginをインストール
左側のインストールボタンを押下

#5.NewFileでRealmファイルが選べればOK
NewFileしてみると、iOSにRealmが追加されていて、Realm Model Object が選択できるようになっているはず

これでOK
math > x sin^2(kx)の積分

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

そして関連ビデオを見ていると出てきた数式。

ビデオの人はネットから数式を取ってきた、と言っていたが自分で導出することにした<font color=red> (式1とする)</font>。

```math
\int{x sin^2(kx) dx} = \frac{x^2}{4} - \frac{1}{8k^2}cos(2kx) - \frac{1}{4k}xsin(2kx) 
```

上記の式を導出する。

まず、sin^2()の式は面倒なので、以下の式で次元?を落とす。

```math
sin^2\frac{x}{2} = \frac{1-cos(x)}{2}
```

上記を使うと以下が得られる (x/2 を kxにした)<font color=red> (式2とする)</font>。

```math
sin^2(kx) = \frac{1-cos(2kx)}{2}
```

式1の左辺は以下となる。

```math
\int{x sin^2(kx) dx} = \int{x \frac{1-cos(2kx)}{2}}dx
```

右辺を項ごとに分けて

```math
= \int{\frac{x}{2}}dx - \int{\frac{x}{2}cos(2kx)}dx
```

```math 
= \frac{x^2}{4} - \int{\frac{x}{2} cos(2kx)}dx
```

上記を<font color=red>(式3とする)</font>。

式3の2項目を解くには部分積分法(下記)を用いる。

```math
\int{fg'}dx = fg - \int{f'g}dx
```

式3の2項目においてfとg'を以下のようにおく。

```math
f = \frac{x}{2}
```

```math
g' = cos(2kx)
```

するとf'とgは以下のように求まる。

```math
f' = \frac{1}{2}
```

```math
g = sin(2kx) \frac{1}{2k}
```

これで式3の2項目は以下のようになる。

```math
- \int{\frac{x}{2} cos(2kx)}dx = - fg + \int{f'g}dx
```
```math
= - \frac{x}{2}sin(2kx)\frac{1}{2k}
+ \int{\frac{1}{2}sin(2kx)\frac{1}{2k}}dx 
```

式3の全部の項は

```math
\frac{x^2}{4}
- \frac{x}{2}sin(2kx)\frac{1}{2k}
+ \int{\frac{1}{2}sin(2kx)\frac{1}{2k}}dx 
```

```math
= \frac{x^2}{4}
- \frac{x}{4k}sin(2kx)
+ \int{\frac{1}{4k}sin(2kx)}dx 
```

```math
= \frac{x^2}{4}
- \frac{x}{4k}sin(2kx)
- \frac{1}{4k}cos(2kx)\frac{1}{2k}
```

```math
= \frac{x^2}{4}
- \frac{1}{4k}xsin(2kx)
- \frac{1}{8k^2}cos(2kx)
```

```math
= \frac{x^2}{4}
- \frac{1}{8k^2}cos(2kx)
- \frac{1}{4k}xsin(2kx)
```

以上で式1の形となった。
intellij ideaでmavenがjava compiler を1.5にしてしまう

pom.xmlの中で設定すればよいらしい。

```xml
<properties>
     <maven.compiler.source>1.8</maven.compiler.source>
     <maven.compiler.target>1.8</maven.compiler.target> 
</properties>
```

参考
https://intellij-support.jetbrains.com/hc/en-us/community/posts/206824355-maven-set-the-java-compiler-to-1-5?sort_by=votes#community_comment_206284755
秋到来! DNG 形式の RAW 画像を読み込む

秋到来! DNG RAW 画像をヘッダーオンリーで C++ で読み込んで芸術的な画像処理やりたいですね！

やりましょう!

できました.

https://github.com/syoyo/tinydngloader

<img width="1079" alt="tinydngloader_viewer.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/438ea300-296e-93e1-acb7-14c1613f849d.png">

BlackMagic の CinemaDNG(lossless JPEG)や, MagicLantern の RAW ツールで変換された DNG が読めます.

Viewer サンプルでは簡単な Debayer の例もあるので要チェック!

## TODO

* Android の DNG 形式がよめるか確認する.
* カラー補正とかのサンプルを入れる
* TinyDNGLoader を用いることで, 優秀な RAW 画像処理若人が, みずから切磋琢磨し RAW 画像処理を極めてくれるスキームを確立したい(特にデノイズ).
rails ことはじめ

# rails ことはじめ

#### rails チュートリアル
http://railstutorial.jp/

http://prog-8.com/lessons  

#### railsのプロジェクト作成
```
$ rails new {プロジェクト名}
$ rails new {プロジェクト名} -d mysql
$ rails new bundletest --skip-bundle
```
デフォはsqlite3

#### サーバー作成
```
$ sudo rails server
```
#### model生成
```
$ rails generate model {モデル名}
$ rails generate model {モデル名 フィールド名1:データ型1 ...}
$ rails generate scaffold {モデル名}
$ rails generate scaffold {モデル名 フィールド名1:データ型1 ...}
```
#### model削除
```
$ rails destroy model {モデル名}
```
#### controller生成
```
$ sudo rails controller {コントローラー名} {アクション名}   
```
#### 経路の確認
```
$ sudo rake routes
```
#### データベース作成
```
$ rake db:create
```
#### データベースのマイグレーション
```
$ rake db:migrate
```
#### データベースへのデータ登録(db/seeds.rb)
```
$ rake db:seed
```
### SQLite コマンドラインツール起動,終了
```
$ rails dbconsole
$ .quit
```
FPGA上で動くニューラルネットワーク・ジェネレータを作った

#概要
FPGA上で動くNeuralNetworkジェネレータを作りました．

## 機能
- FeedForwardニューラルネットワークが製作可能
- 出力は0,1のみ
- VerilogHDLで出力
- 非同期回路(クロックに依存しない)
- 任意bit幅の固定小数に対応
- 活性化関数はシグマ関数
- 推論のみ(学習はできない)

リポジトリはここ
https://github.com/kotauchisunsun/NN_FPGA

#動作環境
- Python 2.7以上3未満
- Icarus Verilog

Python2.7はジェネレータに必須ですが，Icurus Verilogはシミュレーションしなければ必須ではありません．特にライブラリは必要とせず，Python標準ライブラリのみで動きます．

#ライセンス
Affero GPL v3

#使い方
NeuralNetworkの構造部分
基本文法は

```
$ python script/main.py width input_num structure output_num
```

width : 小数のbit幅
input_num : 入力信号の数
structure : ネットワーク構造を示す．カンマ区切りで多段構造を表現することができる(後述)
output_num : 出力信号の数

例)

```
$ python script/main.py 16 2 2 2
> NN_NL_016_0002_0002_NL_016_0002_0002
> saved to generate.v
> None
```

これにより，generate.vの中に16bitの小数で動くNN_NL_016_0002_0002_NL_016_0002_0002というニューラルネットが構築されます．
これは下の図のようなニューラルネットを表します．
![image](https://qiita-image-store.s3.amazonaws.com/0/139643/50e7115b-f5f0-8007-554f-3a5602db4b4a.png)


それぞれの意味は
input* : 入力
output* : 出力
w* : 入力に対する重み係数
b* : ニューラルネットのバイアス

例えば左上のニューラルネットワークが発火する条件は

```py
if input1 * w1 + input2 * w3 + b1 > 0:
    return 1
else:
    return 0
```

となっています．

また，NN_NL_016_0002_0002_NL_016_0002_0002に渡される引数の順番ですが，
1. input*
2. w*
3. b*
4. output*
の順番です．
したがって，この場合を全部書き下すと
```
input1,input2,w1,w2,w3,w4,w5,w6,w7,w8,b1,b2,b3,b4,ouput1,output2
```
となっています．
これによりニューラルネットワークが推論された結果が，output1,output2に入ります．


また，このmain.pyは多段のニューラルネットワークを構築することも可能で，
```
$ python main.py 16 32 64,32,48 16
```

とすると，16bit幅の小数を扱うことができる，

|層|ニューラルネットのユニット数|
|:------:|:-------------------------:|
|入力層  |32                         |
|隠れ層1 |64                         |
|隠れ層2 |32                         |
|隠れ層3 |48                         |
|出力層  |16                         |

というニューラルネットワークを構成することができます．


#小数表現
今回のニューラルネットワークは一般的に使われる浮動小数点に対応していません．
そのため，重み係数や，入力を代入するにはひと手間かかります．

小数の仕様は以下のようになっています．
width = 16の場合
1～8bit: 小数部 それぞれのbitが2^(-8+i-1)を表す．(C)
9～15bit: 整数部 それぞれのbitが2^(i-8-1)を表す.(N)
16bit: 負の数のフラグ.(F)

|bit|16|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|意味|F|N|N|N|N|N|N|N|C|C|C|C|C|C|C|C|

となっています．width/2までのbitが小数部，トップのbitが負の数のフラグ，それ以外が整数部となっています．

これだけ聞くとややこしいので，スクリプトを用意しました．
```
$ python script/convert_number.py width number
``
width: 小数のbit幅
number: 変換したい値

例：

```
$ python script/convert_number.py 16 5.5
> 16b'0000010110000000
> ABS ERROR = 0.000000e+00
```

これにより，16bitの小数で5.5を表現したとき，16b'0000010110000000となることが分かります．
Verilogで構築する際にはこの値を入れれば大丈夫なことが分かります．
ここで，ABS ERRORは小数表現したときの誤差となります．10進数の小数を16bitの2進数で表したとき，どれくらい絶対誤差が生まれるかを10進法表現しています．

例：

```
$ python script/convert_number.py 16 -1.1
> 16b'1111111011100111
> ABS ERROR = 2.343750e-03
```

-1.1を16bitの固定小数で表した場合，ABS ERROR = 2.343750e-03となっているので，誤差があることが分かります．そこで，32bitの固定小数で表すと，

例：

```
$ python script/convert_number.py 32 -1.1
> 32b'11111111111111101110011001100111
> ABS ERROR = 9.155273e-06
```

ABS ERROR = 9.155273e-06となり，16bitで表現したときと比べ，誤差が減っていることが分かります．bit幅を大きくとると精度は上がりますが，回路規模が大きくなりFPGA上で動かなくなるので，バランスをとりながらチューニングしてください．

#終わりに

VerilogHDLとFPGAを始めて4カ月の拙作です．バグや間違い，拡張の方針等ありましたらご助言いただけると幸いです．
QGISで、最も近い場所を計算するメモ

各点から一番近い点を出したい。具体的には各駅から近所で一番近い駅を出したい。QGISで出す方法をメモ。

#データ読み込み
![スクリーンショット 2016-09-04 19.10.49.png](https://qiita-image-store.s3.amazonaws.com/0/39559/779528b4-3adb-8329-eca3-d47996bacc2d.png)

- csvデータを取り込む。
- デリミテッドテキストから読み込み
- ポイント座標を選択
- 経度、緯度のカラムを選択

#近い点を探す

- ベクタ>解析ツール＞距離マトリックスを選択
- 入力ユニークIDフィールドで、駅名（ユニークなデータのカラム名）を入れる。対象ユニークイDフィールドも同様。
- 線形（N*k*3)距離行列を選び、最近棒の点群のみを使う、にチェック

![スクリーンショット 2016-09-04 19.18.42.png](https://qiita-image-store.s3.amazonaws.com/0/39559/8507686e-d86a-bd4c-11c8-01f9ce883c93.png)

#データが出力される
一番近い点のラベルと距離が出力される。
![スクリーンショット 2016-09-04 19.21.42.png](https://qiita-image-store.s3.amazonaws.com/0/39559/43acfd8c-36cb-cad9-f8b3-e0e0dbf455e8.png)
プログラミング Elixir 第二章

# 概要

[プログラミング Elixir](https://www.amazon.co.jp/dp/4274219151)

Elixir の `=` の扱いを解説している章。

他のプログラミング言語と違い、Elixir にとって `=` はパターンマッチであり、代入という意味ではない。確かに、Elixir でも `a = 1` と書いた場合は a に 1 がセットさせるが、これは代入ではなく、等号を成立させるために値を「束縛」した状態である。
あくまでもマッチを成立させるために値を「束縛」しているので、例えば `[a, a] = [1, 2]` とすると同号に矛盾があるためエラーとなる。

つまり、Elixir では、`=` を見た場合、一般的なプログラミング言語の代入という意味を忘れて、本来の代数の使われ方である等号を思い出す必要がある。

# パターンマッチと束縛

左辺に変数を与えると値を束縛させることができる。

```ex
> a = 1
> a
#=> 1
```

矛盾さえなければ何度でも束縛し直すことができる。

```ex
> a = 1
> a = 2
> a
#=> 2
> [a, b] = [1, 2]
> a
#=> 1
> b
#=> 2

> [a, a] = [1, 2]
#=> ** (MatchError) no match of right hand side value: [1, 2]
```

変数を右辺に置くとパターンマッチ。

```ex
> a = 1
> 1 = a
#=> 1
> 2 = a
#=> ** (MatchError) no match of right hand side value: 1

> [1, 2] = [a, 2]
#=> [1, 2]
> [1, 3] = [a, 2]
#=> ** (MatchError) no match of right hand side value: [1, 2]
```

# `_` と `^`

パターンマッチで番う特殊な記号。

`_` (アンダースコア) は値の無視で使う。ただし、どんな値でも OK という意味なので、要素数は合わせる必要がある。

```ex
> [1, 2] = [1, 3]
#=> ** (MatchError) no match of right hand side value: [1, 3]
> [1, _] = [1, 3]
#=> [1, 3]

[1, _, _] = [1, 3]
#=> ** (MatchError) no match of right hand side value: [1, 3]
```

`^` (キャレット) はピン演算子と呼ばれるもので、新たに束縛させずに、以前に束縛させた値でマッチさせたい時に使う。

```ex
> a = 1
> ^a = 2
#=> ** (MatchError) no match of right hand side value: 2

> a = 2
> ^a = 2
#=> 2
```

以上！
luceneメモ: Analyzerの動作

AnalyzerやTokenizerのメモ。

AnalyzerはTokenStreamを提供するもの。

CharFilter: 前処理。Readerのサブクラス。
Tokenizer: 本処理。
TokenFilter: 後処理。StopWordの削除や小文字化など。

AnalyzerのtokenStream()でTokenStreamを取得する。
tokenStream()の内部でcreateComponents()を呼び出し、そこでTokenizerやTokenFilterを作っている。
修正したい場合は、以下のようにcreateComponentsを修正する。[(公式より)](https://lucene.apache.org/core/6_2_0/core/org/apache/lucene/analysis/Analyzer.html)
*AnalyzerのtokenStreamはfinal.

```java
 Analyzer analyzer = new Analyzer() {
  @Override
   protected TokenStreamComponents createComponents(String fieldName) {
     Tokenizer source = new FooTokenizer(reader);
     TokenStream filter = new FooFilter(source);
     filter = new BarFilter(filter);
     return new TokenStreamComponents(source, filter);
   }
   @Override
   protected TokenStream normalize(TokenStream in) {
     // Assuming FooFilter is about normalization and BarFilter is about
     // stemming, only FooFilter should be applied
     return new FooFilter(in);
   }
 };
```

[StandardAnalyzerの場合](https://github.com/apache/lucene-solr/blob/master/lucene/core/src/java/org/apache/lucene/analysis/standard/StandardAnalyzer.java#L101)

```java
  @Override
  protected TokenStreamComponents createComponents(final String fieldName) {
    final StandardTokenizer src = new StandardTokenizer();
    src.setMaxTokenLength(maxTokenLength);
    TokenStream tok = new StandardFilter(src);
    tok = new LowerCaseFilter(tok);
    tok = new StopFilter(tok, stopwords);
    return new TokenStreamComponents(src, tok) {
      @Override
      protected void setReader(final Reader reader) {
        src.setMaxTokenLength(StandardAnalyzer.this.maxTokenLength);
        super.setReader(reader);
      }
    };
  }
```

[JapaneseAnalyzerの場合](https://github.com/apache/lucene-solr/blob/master/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/JapaneseAnalyzer.java#L87)

```java
  @Override
  protected TokenStreamComponents createComponents(String fieldName) {
    Tokenizer tokenizer = new JapaneseTokenizer(userDict, true, mode);
    TokenStream stream = new JapaneseBaseFormFilter(tokenizer);
    stream = new JapanesePartOfSpeechStopFilter(stream, stoptags);
    stream = new CJKWidthFilter(stream);
    stream = new StopFilter(stream, stopwords);
    stream = new JapaneseKatakanaStemFilter(stream);
    stream = new LowerCaseFilter(stream);
    return new TokenStreamComponents(tokenizer, stream);
  }
```
Xcode で error: module file was created for incompatible target と言われたときの対処法


# 注意
この記事は「ビルドターゲットが合っているはずなのにエラーが消えない！」という場合の記事ですので，そもそもビルドターゲットを間違っていた場合はそれを正しく直せばこのエラーは消えると思います．

# いきさつ
[Carthage](https://github.com/Carthage/Carthage)を使ってとあるライブラリ([Result](https://github.com/antitypical/Result))を導入していざコーディング！　ってときに`import Result`している箇所でタイトルのようなエラーを吐かれ，路頭に迷っていました．

要は「(使おうとしている)モジュールファイルは互換性のないターゲット(プラットフォーム)向けにビルドされてますよ」というエラーなので，ターゲットを確認した上でもう一度モジュールをビルドし直したり，`Clean`した上で`Build`し直したりといろいろ試してみたのですが，なかなかエラーが消えませんでした．


ちなみに，このときのエラー文言全体は次の通り

`Playground execution failed:  error: module file was created for incompatible target x86_64-apple-macosx10.9`


このときはターゲットをiOSにしていたのですが，確実にiOS用のモジュールを追加しているはずだったので，「macosx10.9向けにビルドされているよ」と言われても当初は何がなんだかでした．Playgroundでやっているのは気にしないでください．


# 解決法
`/Users/hoge/Library/Developer/Xcode/DerivedData/`以下を一旦削除しましょう．

このディレクトリ以下にはXcodeによって生成されたビルドログとかバイナリとかが格納されているのですが，とりあえずこれらを全て削除しちゃいます．

全て削除しなくても，今回問題となっているプロジェクト関連のディレクトリだけ削除しても大丈夫だと思います(むしろそっちの方がいいかも)．


# 原因
おそらく，モジュールを追加する過程でiOS用を追加したり削除したり，OSX用を追加したり削除したり，はたまたビルドし直したりいろいろと変な手順を踏んでしまったため，Xcodeが混乱してしまったのだと思います(ゆるふわ表現)．
electron での日本語入力

electron で日本語入力ができなかった.
しらべてもいい感じの情報が見つからなかったけども
[tmux下でElectronがうまく動作しない](http://qiita.com/itkrt2y/items/dee87c406617d1bd45a6)
曰く 日本語以外も tmux ではうまいいこといかないらしい 
取り合えずelectron を実行するときは tmux を使わないようにするべき
JUnitでの例外テストの書き方

# アノテーション利用

```java
  @Test(expected = SampleException.class)
  public void throwsSampleException() {
    // do something
  }
```

# try/catchでの書き方

```java

  @Test
  public void throwsSampleException() {
    try {
      // do something
      ...

      fail();

    } catch (SampleException expected) {
      assertThat(expected.getMessage(), equalTo("exception message"));
    }
  }

```

# Ruleを使った書き方

```java

  @Rule
  public ExpectedException thrown = ExpectedException.none();

  @Test
  public void exceptionRule() {
    thrown.expect(SampleException.class);
    thrown.expectMessage("exception message");

    // do something
  }
```
iOS 10 Xcode-beta のシミューレータが起動しない時

## 症状

iOS シミューレータがアップルのマークから進まず、起動しない。

## 対応

Applications 内の Xcode-beta のディレクトリに日本語名があるとそのせいなのでリネームする。
それでもダメだったら古いシミュレータを削除して Xcode を入れ直す

シミュレータの場所は下記

```
/Users/onotakaaki/Library/Developer/CoreSimulator/Devices
```

自分は下記のコマンドで 10 日以上前のものを消しちゃいました。

```
cd /Users/onotakaaki/Library/Developer/CoreSimulator/Devices
find ./ -mtime +10 -depth 1 | xargs rm -rf
```

### 参考
https://forums.developer.apple.com/thread/50084
redmineのdocker imageを自分で作ってみた

# どういうものか
dockerを使用してredmineが動くcentos7のコンテナを大体20分くらいで自動で作ります。
さくらのクラウドで作っていて、*CPU:1coreメモリ:1GB* の最小プランで23分くらい、
*CPU:2coreメモリ:2GB* のプランで18分くらいで完了します。

# 注意事項
動け動けと念じながら作ったのでエラー処理は入れてません。
入れないといけなすび。。。
（コメントもつけないと。。。）

# なんで作ったのか
*docker run* するだけでredmineが動くイメージは世の中にたくさんあるけど、
dockerを触り始めたところなので、自分でも作ってみたいし
自分で作った経験がいつか生きればいいなと思ったからです。

# 作ったスクリプト
https://github.com/tomokitamaki/RMbuildForCentos7

# このスクリプトを動かすときの準備
- ホストOSにdockerのインストールが終わっていること。
- centos7:latestのdockerイメージを予めpullしておくこと。
- visudoを使用してsudoでdockerコマンドを使用する際にパスワードを求められないようにしておくこと

# どういう動作をするのか
まず、以下の二つのファイルからなります。

- buildredmine3.2forcentos7.sh  
シェルスクリプト
- redminebuild_dockerfile  
dockerfile

## 大まかな動き

1. シェルスクリプトからdocker build コマンドでコンテナを作る（自動）
1. dockerfile の内容に沿ってRUNの行を実行していく（自動）
1. dockerfile の内容を完遂したら、シェルスクリプト内の docker exec コマンドをどんどん実行する（自動）
1. docker commit でイメージを作る（自動）
1. 作ったイメージを元にして docker run する。（自動）
1. ブラウザでサーバのIPにポート2222にアクセスする。（手動）  
ex)http://192.168.1.1:2222

# 使い方

1. ファイルの用意  
*buildredmine3.2forcentos7.sh* と *redminebuild_dockerfile* の2つのファイルをダウンロードします。  
(git cloneしてもいいと思います。）  
1. 実行する  
以下のコマンドを実行したらしばし待ちます。  
```$bash buildredmine3.2forcentos7.sh```

# どうして２つのファイルに分かれているのか
シェルスクリプト内で実行しているいくつかのコマンドは、--privileged オプションと-dオプションをつけて 
かつ/sbin/initで、 *docker run* したイメージじゃないと *Failed to get D-Bus connection* と
表示されるerrorになってしまって期待した結果がでません。

- ex)```sudo docker run -d --privileged IMAGEIDorIMAGENAME /sbin/init```  

dockerfileでそれを実現する方法がわからなかったので
ホストOSからコンテナ内で実行するコマンドを発行できる方法である
docker exec で代替しました。