OmniAICreator/Qiita-1.07M huggingface dataset:
Tera Term > RS-232Cの文字列受信タイミングを知る > タイムスタンプ付きでログ保存

```txt:動作環境
Windows 7 pro (32bit)
Tera Term Version 4.79
```

RS-232Cで出力するセンサがどのような周期で出力しているかを知りたい。

Tera Termでできた。
参考 https://teratail.com/questions/30232

情報感謝です。

### 手順

1. [ファイル]->[ログ]を選択
2. タイムスタンプのチェックをつけて、「保存(S)」

### 結果例

最初の方は同じ時刻のタイムスタンプになっていますが、途中から正常と思われるものになっています。だいたい1秒おきになっていることが分かります。

```
[Wed Mar 22 11:47:41.989 2017] 0.00,0.00,0.00,25.37,31.30,7.17
[Wed Mar 22 11:47:41.993 2017] 0.00,0.00,0.00,25.36,31.30,7.16
[Wed Mar 22 11:47:41.993 2017] 0.00,0.00,0.00,25.37,31.30,7.17
[Wed Mar 22 11:47:41.993 2017] 0.00,0.00,0.00,25.38,31.30,7.18
[Wed Mar 22 11:47:41.993 2017] 0.00,0.00,0.00,25.38,31.30,7.18
[Wed Mar 22 11:47:41.993 2017] 0.00,0.00,0.00,25.38,31.27,7.16
[Wed Mar 22 11:47:41.993 2017] 0.00,0.00,0.00,25.38,31.20,7.13
[Wed Mar 22 11:47:41.993 2017] 0.00,0.00,0.00,25.38,31.16,7.11
[Wed Mar 22 11:47:41.993 2017] 0.00,0.00,0.00,25.39,31.13,7.11
[Wed Mar 22 11:47:41.993 2017] 0.00,0.00,0.00,25.39,31.13,7.11
[Wed Mar 22 11:47:41.993 2017] 0.00,0.00,0.00,25.38,31.13,7.10
[Wed Mar 22 11:47:42.189 2017] 0.00,0.00,0.00,25.38,31.13,7.10
[Wed Mar 22 11:47:43.185 2017] 0.00,0.00,0.00,25.39,31.16,7.12
[Wed Mar 22 11:47:44.184 2017] 0.00,0.00,0.00,25.39,31.13,7.11
[Wed Mar 22 11:47:45.185 2017] 0.00,0.00,0.00,25.39,31.13,7.11
[Wed Mar 22 11:47:46.182 2017] 0.00,0.00,0.00,25.39,31.13,7.11
[Wed Mar 22 11:47:47.183 2017] 0.00,0.00,0.00,25.37,31.06,7.05
[Wed Mar 22 11:47:48.183 2017] 0.00,0.00,0.00,25.37,31.06,7.05
[Wed Mar 22 11:47:49.182 2017] 0.00,0.00,0.00,25.36,31.02,7.03
[Wed Mar 22 11:47:50.181 2017] 0.00,0.00,0.00,25.36,30.98,7.01
[Wed Mar 22 11:47:51.180 2017] 0.00,0.00,0.00,25.37,30.98,7.02
[Wed Mar 22 11:47:52.179 2017] 0.00,0.00,0.00,25.37,31.02,7.04
[Wed Mar 22 11:47:53.179 2017] 0.00,0.00,0.00,25.35,31.05,7.04
[Wed Mar 22 11:47:54.179 2017] 0.00,0.00,0.00,25.34,31.12,7.06
[Wed Mar 22 11:47:55.177 2017] 0.00,0.00,0.00,25.35,31.12,7.07
```
PC、ネットワーク基本用語集

PC、ネットワークについて、根本的な構造がわかっていないので、調べてみました。


【サーバー】
こいつの役割はさまざまなシステムを使用したサービスを提供することです。
提供するサービスに合わせたソフトが入っているPCです。

http://www.linuxacademy.ne.jp/lablog/infrastructure/65/

基本的に構造としては、クライアントがサーバーに通信をしてある命令を出す。その命令に応じてサーバーが処理をして、それの結果をクライアント返す。

サーバーはーその提供するサービスに合わせたソフトウェアが入っている。

webサーバー：apache
Mailサーバー：　sendmail、postfix
SSHサーバー：OpenSSH

・疑問
PC内でサーバーを立ち上げるとは、特定のソフトウェアをPCにインストールして、外部から通信して、その命令を処理できるような状態にする。


【PC】
コンピュータ（英: computer）は、自動計算機、とくに計算開始後は人手を介さずに計算終了まで動作する電子式汎用計算機。 

構造

CPU：
コンピューターを構成する他のハードウェアやコンピューター全体の動作を制御します。またCPUは、データの計算・演算を行います。

主記憶：
データを一時的に保存・記憶します。コンピューターの電源を切ると電源を切るとデータは失われます。パソコンでは メモリーになります。入力されたデータは 一旦メモリーへ行き CPUで処理を行います。「CPUが直接アクセスして読み書きしているのは、このメモリーです。」すべてのデータは、一旦メモリーに行き、CPUで計算をして、またメモリーに書き出されます。

補助記憶：
データを長期的に保存・記憶します。コンピューターの電源を切ってもデータは失われません。

入力：
コンピューターにデータを入力する機器です。

出力：
コンピューターからデータを出力する機器です。
主にディスプレイ、プリンター、ヘッドフォンなどがあります。
入力されたデータは メモリー→CPU→メモリー→出力となります。

OS：
コンピューターを人が操作できるように開発されたのがOSです。




【ブラウザ】
指定された、urlのサーバーにhttp通信をして指定したファイルをダウンロードして、ブラウザで表示する。

http://127.0.0.1:8080

上のように検索窓に打ち込むということは、
"http://、"http通信で、127.0.0.1というipのサーバーに通信して、そのサーバーの8080ポートに動いているアプリケーションを指定して、通信する。

という命令を実行している。ポートについては、基本的にポート指定なしで通信すると、"80"にアクセスする。

そしてスラッシュ以下は、ファイル名を指定する。何も指定しなければindex.htmlにアクセスする。


http://minori-farm.jp/とかのドメインにアクセスするということは、一旦DNSサーバーに通信して、そこに登録されている対応するサーバーのipアドレスへ、通信する。
自分用メモ

##自分用メモ

1.何でも（コード・ドキュメント）を、自分で確認する、
そして、理解してから次のアクションを起こす。
※わからないことでも、推測する。
※わからない時は、わからない部分を消してみる。
そして動くかどうか確認して、そのコードの役割を確認。

2.なんでも「タブ」で補完する。
※ディレクトリでもなんでもタブで補完できなかったら、自分が打ち間違ってる。

3.毎日簡単でも良いから何かをアウトプット（ブログ書く）する癖をつける。
※気合い入れて書きすぎなくて良いから、さっと書く。
※こんなに？っていうぐらい小ネタでも良いから書く。

4.プロダクトは永遠に完成することはない。バグだらけでもいいからまず出して、
フィードバックを受ける、ぐらいの気持ちで。
いきなりクオリティの高いものを作れる人はいない。

5.本を読むより、手を動かす。

6.githubの使かいかた慣れる。(fetch&merege)

7.bashについて、

1.~/.bash_profileに命令が書いてある。
2.sourceで他のところに書いてある命令を拾いに行ける。
3.~/.bash_profileはターミナル起動時に読み込むため、~/.bash_profileを編集してすぐコマンドが反映される訳ではない。
4.ターミナルでecho $PATHで、コマンドが置いてあるディレクトリ一覧が表示される。初めの方のディレクトリほど優先順位が高い。
5.何か自分で命令を書けば、それで自動化ができる。
6.何かのコマンドでターミナルを再起動しなくても、コマンドが使えるようになる。

8.~はcdと同じでホームディレクトリに戻る。
9.-は一つ上の階層に戻る。
Docker Community Slackの入り方(#japanese-usersあり)

Dockerには公式Slackがあり，日本在住者向けチャネル `#japanese-users` も開設されている(というか作ってもらった)が，入り方が若干わかりにくいので紹介する．


# Docker Communityに入る

https://blog.docker.com/2016/11/introducing-docker-community-directory-docker-community-slack/ にアクセスし，"Sign up for the Docker Community Directory and Slack"ボタンをクリックする

![image](https://qiita-image-store.s3.amazonaws.com/0/90542/2c0b9993-4422-53b4-b7e7-2a80df8a620c.png)



氏名などを入力し，登録する．

# Slackに入る

登録が完了すると，Slackの招待メールが来る．


# `#japanese-users`に入る

"channels"をクリックし，~~`#japanese-users`~~ `#japanese`を選択する．

![image](https://qiita-image-store.s3.amazonaws.com/0/90542/1657bf65-ea2c-27b7-7d9b-3a963e6c11b1.png)
Riot.js のプリコンパイルを行う方法


実際のサンプル プロジェクトは以下になります。
https://github.com/Kazunori-Kimura/riot-sample-project


## はじめに

[Riot.js](http://riotjs.com/ja/) をプリコンパイルし、[browserify](https://www.npmjs.com/package/browserify) で 1ファイルに結合するために試行錯誤した内容をまとめておきます。

`npm run build` コマンドで `src/tags` ディレクトリ配下の Riot tagファイル を `src/tags/index.js` ファイルに出力します。


## 試行錯誤の経緯

*Riot.js* の tagファイルをプリコンパイルする手段として、[riotify](https://github.com/riot/riotify) が提供されていますが、これを使用して `--type es6` のオプションを設定しましたが、正しく es6 -> es5 の変換が行われませんでした。

このプロジェクトでは `riot` コマンドを使用し、`src/tags` 配下の tagファイルを jsファイルに変換・結合した後、`browserify + babelify` で `require` の解決と es6 -> es5 変換を行っています。

プリコンパイル、結合処理はタスクランナーを使用せずに `npm scripts` で定義しています。
各処理を `npm-run-all` で順次実行するように指定しています。


`package.json` は以下のようになっています。

```json:package.json
{
  "name": "riot-sample",
  "version": "1.0.0",
  "description": "riot.js sample project",
  "main": "index.js",
  "scripts": {
    "clean": "rimraf dist/bundle.js",
    "prestart": "npm run build",
    "start": "npm-run-all -p watch server",
    "build": "npm-run-all clean build:riot build:browserify",
    "build:riot": "riot -m src/tags src/tags/index.js",
    "build:browserify": "browserify src/index.js > dist/bundle.js --debug",
    "server": "browser-sync start --server --files \"*.html\" \"dist/*\"",
    "watch": "chokidar \"src/**/*\" -i \"src/tags/index.js\" -c \"npm run build\""
  },
  "keywords": [
    "riot",
    "babel",
    "browserify",
    "sample"
  ],
  "author": "kazunori.kimura.js@gmail.com",
  "license": "MIT",
  "devDependencies": {
    "babel-preset-es2015": "^6.24.0",
    "babel-preset-es2016": "^6.22.0",
    "babelify": "^7.3.0",
    "browser-sync": "^2.18.8",
    "browserify": "^14.1.0",
    "chokidar-cli": "^1.2.0",
    "npm-run-all": "^4.0.2",
    "rimraf": "^2.6.1",
    "riot": "^3.3.2"
  },
  "browserify": {
    "transform": [
      [
        "babelify",
        {
          "presets": [
            "es2015",
            "es2016"
          ]
        }
      ]
    ]
  }
}
```

### build:riot

`build:riot` が Riot.js Tagファイル のプリコンパイル処理になります。

`src/tags` 配下の `*.tag` ファイルをプリコンパイルし、`src/tags/index.js` に結合します。
`-m` は後続処理で `browserify` を使用するために必要なオプションです。


### build:browserify

`build:browserify` が `require` の解決と es6 -> es5 変換処理になります。

`src/index.js` を `dist/bundle.js` に変換しています。



## サンプルプロジェクトの使い方

### build

```
> npm run build
```

`dist` ディレクトリ内をクリアした後、`src` ディレクトリ配下をプリコンパイルし `dist/bundle.js` として出力します。

### 起動

```
> npm start
```

`build` を実施した後、プロジェクトのルートフォルダを `browser-sync` で公開します。
`src` ディレクトリ配下を監視し、変更があった場合は随時 `build` を行います。
`build` 完了後、`browser-sync` の再読込が行われます。
Windows版VSCodeとMSYS2のGitを使っていて ENOENT: no such file or directory, lstat 'C:\c' が出る場合の対処

```
ENOENT: no such file or directory, lstat 'C:\c'
```

が毎回出て、Git機能が使えなくなったときの対処。

`'C:\c'`の部分は`C:\`がVSCodeインストールドライブ、`c`がMSYS2インストールドライブになる様子。

つまり、CドライブにVSCodeをインストールして、DドライブにMSYS2をインストールしていたら、`'C:\d'`になるらしい。

前提
---

* [公式のIssueで扱われている](https://github.com/Microsoft/vscode/issues/10281)
* VSCodeではMSYSのGitはサポートしていない
    * オフィシャルな対応はGit for Windows使ってね、とのこと
* Gitを2つも入れたくない！ MSYSのGitに寄せたい！ という方に

対処
---

上記に上げたIssueの下の方にある`mklink /J`でジャンクションを張る方法で対処する。

`cmd.exe`を起動して

```
C:\Users\yourname> cd \
C:\> mklink /J "C:\c" c:
```

のようにしてジャンクションを張ることで、冒頭のエラーが出なくなり、VSCodeのGit機能が有効になります。
rails c で URL を確認する方法

コンソールで URL 確認したいですよね？！


```rb:コンソール入って
$ rails c

# よくある方法

> app.solutions_path
=> "/solutions"

> app.solution_path(id:1)
=> "/solutions/1"

> app.solution_contacts_path(solution_id:1)
=> "/solutions/1/contacts"


# polymorphic_path 使う

> solution = Solution.first

> app.polymorphic_path([:solutions])
=> "/solutions"

> app.polymorphic_path([solution])
=> "/solutions/1"

> app.polymorphic_path([solution, :contacts])
=> "/solutions/1/contacts"


# url_for 使う

> app.url_for([:solutions])
=> "http://www.example.com/solutions"

> app.url_for([solution])
=> "http://www.example.com/solutions/1"

> app.url_for([solution, :contacts])
=> "http://www.example.com/solutions/1/contacts"


# show-routes は便利です。
> show-routes -G solution_contacts
        solution_contacts POST   /solutions/:solution_id/contacts(.:format) contacts#create
```
【メモ】jQueryのアニメーションのときに使うプラグイン

数年前に作ったWEBサイトを拡充するとき、
古いブラウザも考慮しつつjQueryでアニメーションを作ることがまだまだある。

jQueryで「animate」メソッドを使うと重くなるのは
既知の事実であるので、今更ながら備忘録的な意味でメモ。
#jQueryでアニメーションを組む時に使うプラグイン
###TweenMax.js
- 対応ブラウザ：IE8～（CSSプロパティ対応状況に準ずる）
- メリット：コードが短い
<br /><br />
`TweenMax.to('ID名', 秒数, { プロパティ });`
<br />
<br />
- デメリット：課金コンテンツなどで使用する場合、ライセンス料が発生する。

###Velocity.js
- 対応ブラウザ：jQueryありだとIE8～（CSSプロパティ対応状況に準ずる）
- メリット：jQuery animateライクに書ける<br />
<br />
`$("ID名").velocity({ プロパティ }, 秒数など);`
<br />
<br />
- デメリット：javascript版だとIE8対応できない（デメリットっていうほどのデメリットではない）

###anime.js
- 対応ブラウザ：IE10～（CSSプロパティ対応状況に準ずる）
- メリット：CSSライクに書ける。かつVelocity.jsより軽量。<br />
<br />
`anime({targets: 'ID名', プロパティ});`
<br />
<br />
- デメリット：古いブラウザに対応できない

#CSS3アニメーションは？
CSS3アニメーションでいいのでは？
と思われるが、CSS3アニメーションは

- delayプロパティの管理が煩雑
- SVGアニメーションがブラウザ間で統一されない
- DOMの操作ができない

という問題点がある。また、スピードもVelocity.jsのほうが早いようだ。

参考：http://beijaflor.hatenablog.jp/entry/2014/06/18/090706

ただし、jQueryを使用するまでもない簡単なアニメーションを実装する場合は
CSS3アニメーションを使用するといいと思う。

#まとめ
TweenMax.jsはクセになると課金コンテンツ作る際困ってしまうので、

- 単純なアニメーションを動かす場合は**CSS3アニメーション**
- 古いブラウザまで対応したいのなら**Velocity.js**
- 古いブラウザ捨ててもいいなら**anime.js**

この３つがいいなと個人的に思った。
Homestead Vagrant でリモートデバッガを有効にする方法


Homestead デフォルトで xdebug が有効でないので、設定してやる必要がある。

具体的には、`/etc/php/7.1/cli/conf.d/99.xdebug.ini`とかを作成して以下の内容を書き込む

````
zend_extension=xdebug.so
xdebug.remote_enable = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9000
xdebug.max_nesting_level = 512
````

Homestead で組み込むなら `after.sh` とかに以下を追加

````
sudo touch /etc/php/7.1/cli/conf.d/99.xdebug.ini
sudo chmod 777 /etc/php/7.1/cli/conf.d/99.xdebug.ini

sudo cat << EOS > /etc/php/7.1/cli/conf.d/99.xdebug.ini
zend_extension=xdebug.so
xdebug.remote_enable = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9000
xdebug.max_nesting_level = 512
EOS
````
Terminatorで日本語によるレイアウト崩れを改善する（旧題：Terminatorでユニコードの曖昧文字幅を全角固定にする)

# 前置き

曖昧文字幅とはなんぞやという方はこちら
https://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85

端末上（には限らないけど）では曖昧文字幅が現れるとレイアウトが崩れる等の問題が起きることが多く、暫定の解決策として曖昧文字幅は全て全角幅にするという対策が取られてきた。

Terminatorやgnome-terminalなど[VTE](https://wiki.gnome.org/Apps/Terminal/VTE)を使うターミナルでは以前は環境変数`VTE_CJK_WIDTH=1`を設定することで全角固定となっていたが、どうやらこの環境変数は無効となってしまったようだ。

gnome-terminalではオプションで全角幅固定が可能だが、Terminatorにはそういったオプションはいまのところ存在しない。
そこでとりあえず強制的に全角幅固定にするプラグインを作成してみた。

https://gist.github.com/maueki/f0aa8298a6eb6d6928f7f2398ab0f883

# 手順

```bash
$ mkdir -p $HOME/.config/terminator/plugins
$ cd $HOME/.config/terminator/plugins
$ curl -O https://gist.githubusercontent.com/maueki/f0aa8298a6eb6d6928f7f2398ab0f883/raw/a8c3606efbd1c6c03e8ba5849d819121e60cf185/cjkwidthwide.py
```

Terminatorを再起動して、設定>プラグインをみると「CjkWidthWide」が現れるのでチェックを入れればOK

![terninator_cjk_width_wide.png](https://qiita-image-store.s3.amazonaws.com/0/39647/f68edfc4-d159-4c00-6dcf-b650af5b3a3c.png)
Unityのスクリプトテンプレートをカスタマイズするには

## はじめに
Unityでスクリプトファイル (e.g. C#, Javascript) を作成するときにUnityのデフォルトのスクリプトテンプレートが好みではない方もいるのではないかと思います。今回はこのスクリプトテンプレートを独自にカスタマイズする方法を紹介したいと思います。

## 確認環境
- OSはMacのOS X El Capitan (10.11.6) を使用
- UnityはVersion 5.5.0f3 を使用

## 設定方法
OSによってスクリプトテンプレートが格納されているディレクトリは異なります。

### Windows
```
Unityのインストールフォルダ\Editor\Data\Resources\ScriptTemplates
```

### Mac
```
/Applications/Unity/Unity.app/Contents/Resources/ScriptTemplates
```

このディレクトリにはC#, JavascriptやShaderのテンプレートが格納されていますが、今回はよく使われるC#のスクリプトテンプレート　(81-C# Script-NewBehaviourScript.cs.txt) を変更してみます。なお、変更する前に必ずバックアップは取っておくようにしてください。
スクリプトテンプレートの変更が完了したらUnityを再起動し、新規でスクリプトファイルを作成してみましょう。スクリプトテンプレートが正しく反映されていれば設定完了です。

## スクリプトテンプレート
実際に私が使用しているC#のスクリプトテンプレートは以下の通りです。
[Gist](https://gist.github.com/murapong/5543f720c8ca963395a4)にもアップしてあります。

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class #SCRIPTNAME# : MonoBehaviour
{
    #region enum

    #endregion

    #region const

    #endregion

    #region public property

    #endregion

    #region private property

    #endregion

    #region public method

    #endregion

    #region private method

    #endregion

    #region event

    void Start()
    {

    }

    void Update()
    {

    }

    #endregion
}

```

## 参考
- [How To Customize Unity Script Templates](https://support.unity3d.com/hc/en-us/articles/210223733-How-to-customize-Unity-script-templates)
- [個人的に使用しているスクリプトテンプレート(Gist)](https://gist.github.com/murapong/5543f720c8ca963395a4)
MNISTを使って、ドロップアウトを考える

先日投稿した[こちら](http://qiita.com/mine820/items/03e2bbd9b603383486e0)の記事を利用して、ドロップアウトについて考えます。
といっても、一言で終わってしまうのですが。

# ドロップアウトとは
Deep Learningでガリガリ学習させていくと、時に過学習が発生します。
これは学習データばかり処理しすぎて、それ専用の識別機になってしまい、別のデータに対応できなくことを意味します。

識別は、基本的に分類問題なのですが、この分類がうまくいかなくなります。
グラフで見るとわかりやすいのですが、いくつかの点があり、最初はあまり点に沿っていないのですが、やがて点に近い曲線が出来上がります。
しかし学習させすぎると、各点には近いのですが、どうみてもおかしな曲線が出来上がってしまいます。
これで分類しても、うまくいかないことはよくわかるかと思います。
![dc21319e-6fb5-aa76-34b4-b9e18891553d.png](https://qiita-image-store.s3.amazonaws.com/0/130771/6d9839cf-a765-f710-9880-deeee1887673.png)

ということで、ある程度学習したら、あまり関係がないところは無視するような処理を行います。これが「ドロップアウト」です。

Deep Learningの場合、各のノードが階層でつながっているのですが、このうちの必要がなさそうなノードを消してしまいます。
![20160714170858.jpg](https://qiita-image-store.s3.amazonaws.com/0/130771/5dd5c550-23be-cf7c-5928-0e57ea5a1dc1.jpeg)
※つながりを切るのではなく、ノードを消しちゃいます

# TensorFlowでの記述
TensorFlowでは、この「消しちゃうノード」の残す割合を設定します。
使用する関数は「tensorflow.nn.dropout()」です。
割合は第2引数で指定します。

```python
keep_prob = tensorflow.placeholder(tf.float32)
h_fc1_drop = tensorflow.nn.dropout(h_fc1, keep_prob)
```

チュートリアルでは、学習実行時に残す割合を「0.5」として指定しています。
（半分のノードを残して、半分のノードを消す）

```python
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
```

なお、テスト時にはドロップアウトは行わないようにします。
（「1.0」を設定）

```python
accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0})
```

# 値の調整
値として何がいいのかは試行錯誤するしかないのですが、値だけでなく、ドロップアウトを行う場所や回数も調整の対象となるようです。

※きっと、この値や位置、回数も、Deep Learningで調整されるときが来るんだろうなぁ（遠い目）
FortranのFFTWの使い方

FortrannのFFTWの使い方あまり書いてあるところがないので、ここに示しておく。
ここでは、実数(倍精度)から複素数(倍精度)の変換を示す。


```fortran
program main
  implicit none
  include 'fftw3.f'
  integer, parameter :: ix = 32
  real(8), dimension(ix) :: x
  real(8), dimension(ix) :: qq1,qq2
  complex(8), dimension(ix/2+1) :: fqq1,fqq2

  real(8) :: plan
  real(8) :: pi = 3.14159265359
  integer :: i
  real(8) :: xmin,xmax,dx

  xmin = 0
  xmax = 2.*pi
  dx = (xmax-xmin)/dble(ix)
  x(1) = 0.5d0*dx
  do i = 2,ix
     x(i) = x(i-1) + dx
  enddo

  do i = 1,ix
     qq1(i) = 1.d0
     qq2(i) = cos(2.d0*x(i))
  enddo

  call dfftw_plan_dft_r2c_1d(plan,ix,qq1,fqq1,FFTW_ESTIMATE)
  call dfftw_execute(plan)
  call dfftw_destroy_plan(plan)

  call dfftw_plan_dft_r2c_1d(plan,ix,qq2,fqq2,FFTW_ESTIMATE)
  call dfftw_execute(plan)
  call dfftw_destroy_plan(plan)

  do i = 1,ix/2+1
  write(*,*) fqq1(i)/dble(ix/2),fqq2(i)/dble(ix/2)
  enddo

  stop
end program main
```
xを0から2piの間で準備して、

```fortran
  xmin = 0
  xmax = 2.*pi
  dx = (xmax-xmin)/dble(ix)
  x(1) = 0.5d0*dx
  do i = 2,ix
     x(i) = x(i-1) + dx
  enddo
```

定数関数(qq1)とsin関数　(qq2)を準備する。

```fortran
  do i = 1,ix
     qq1(i) = 1.d0
     qq2(i) = cos(2.d0*x(i))
  enddo
```

FFTの実行は、
1. planを準備して(dfftw_plan_dft_r2c_1d)
2. 実行して(dfftw_execute)
3. 破壊する(dfftw_destroy_plan)
とする。

結果は、格子点数の係数がかかっているので、結果を見るときはそれを割る必要がある。
JS Binで'use esnext option'とwarningが表示される場合の対処方法

# 概要

[JS Bin](https://jsbin.com/)でES2015のシンタックスでコードを書こうとすると以下のようにwarningが表示されます。

![Kobito.TxJNd3.png](https://qiita-image-store.s3.amazonaws.com/0/43438/75b2c8e9-0e5e-500a-ae5f-ab1e7698881d.png "Kobito.TxJNd3.png")

# 対処方法

右上のAccountからPreferencesを選択します。Lintingという項目があるのでJSHintのsettingsをクリックするとフォームが開きます。

![Kobito.JEcjzr.png](https://qiita-image-store.s3.amazonaws.com/0/43438/d8e30235-548f-b4a5-b3e5-97a20a1731e3.png "Kobito.JEcjzr.png")


そこに以下の設定を追加します。

```json
{
  "esnext": true
}
```

![Kobito.KFM3h1.png](https://qiita-image-store.s3.amazonaws.com/0/43438/9e41ec68-2017-dffa-7a45-aea1cdeacad6.png "Kobito.KFM3h1.png")

これでwarningが表示されなくなります。Lintingの設定を細かく指定できるのは良いですね。

# 参考

- https://github.com/jsbin/jsbin/issues/2792
Python > sets > & / .intersection() // | (vertical bar) / .union() // - / .difference()  > setの演算のリンクを教えていただきました

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1792 / 12833)

'&'や`.intersection()`などが登場。


上陸班([away team](https://en.wikipedia.org/wiki/Away_team_(Star_Trek_term) ))で試してみた。
http://ideone.com/zxu8YP

```py
teams = {
	'away_team_1' : { '7of9', 'Janeway', 'Tuvok' },
	'away_team_2' : { '7of9', "B'Elanna Torres", 'Kim' },
	'away_team_3' : { '7of9', 'Janeway', 'Jean-Luc Picard' }
}

for name, contents in teams.items():
	print("%s %s" % (name, contents))

team1 = teams['away_team_1']
team2 = teams['away_team_2']
print(team1)
print(team2)
print("::and::")
print(team1 & team2)
print(team1.intersection(team2))
print("::or::")
print(team1 | team2)
print(team1.union(team2))
print("::difference::")
print(team1 - team2)
print(team1.difference(team2))
```

```txt:結果
Success	time: 0 memory: 23304 signal:0
away_team_1 set(['Tuvok', '7of9', 'Janeway'])
away_team_2 set(["B'Elanna Torres", '7of9', 'Kim'])
away_team_3 set(['Jean-Luc Picard', '7of9', 'Janeway'])
set(['Tuvok', '7of9', 'Janeway'])
set(["B'Elanna Torres", '7of9', 'Kim'])
::and::
set(['7of9'])
set(['7of9'])
::or::
set(["B'Elanna Torres", 'Tuvok', '7of9', 'Janeway', 'Kim'])
set(["B'Elanna Torres", 'Tuvok', '7of9', 'Janeway', 'Kim'])
::difference::
set(['Janeway', 'Tuvok'])
set(['Janeway', 'Tuvok'])
```

### 教えていただいた事項

@shiracamus さんの[コメント](http://qiita.com/7of9/items/99ee47d81dd8b045480a/#comment-6a54292bfcdc074efe13)にてsetの演算のリンクを教えていただきました。

情報感謝です。
Firebase でランディングページをホスティング [BitScheduler開発日誌]

BitScheduler開発日誌、２回目の投稿です。

前回の投稿で「いいね」が１００件集まったら開発をスタートすると宣言しましたが前言撤回です。
「いいね」は全くもらえませんでしたが、エンジニアたるもの、求めらていなくとも自分が作りたかったら作ればよいのです。

# Firebase をホスティングに使うメリット

さて、今回は要件検討も兼ねてサービスのランディングページを作成しました。

[BitSchedulerランディングページ](https://bitscheduler-fb66d.firebaseapp.com/)
<img width="480" alt="lp-sambnail.png" src="https://qiita-image-store.s3.amazonaws.com/0/25427/dd9c3670-cb50-6287-5e46-9cc6d9604f8a.png">

ホスト先はFirebaseのHostingサービスです。
Firebaseはモバイルアプリ開発用のBaaSだと思われがちですが、今回利用したHostingをはじめ、WebのAPIも充実しており、Realtime Database, Storage, Authentication などほとんどの機能をWebからも利用することができます。
ただ、残念ながら Analytics はモバイルアプリからしか利用できないので、Google Analytics を利用することになります。

費用ですが、Freeプランで容量1GB、転送量10GB/月 まで無料で利用できます。作ったサービスが流行らない限りは無料で運用できるので、ホビーユースにはなんとも嬉しいサービスですね！

# マテリアルデザイン

デザインは手軽に今っぽくしたかったのでマテリアルデザインを採用しました。Bootstrap と下記テンプレートを使うことで簡単に実現できました。

[Material Design for Bootstrap](http://fezvrasta.github.io/bootstrap-material-design/bootstrap-elements.html)

Webアプリの方のデザインもこのテンプレートを使って開発しようと思います。
このサービスを使ってみたいと思ったら「いいね」お願いします！
技術英語 / 数学英語 > with respect to > the derivative of E(W) [wrt] W

@ [Learning in Multidimensional Spaces — Neural Networks. Matrix Formulation by Andrew P Paplinski](http://users.monash.edu/~app/Lrn/LearningMDS.pdf)
March 17, 2017 のp10の「2.2 Analytical solution」の１つめの文章の後半部分。

> calculate the derivative of E(W) **wrt** W

意訳 「Wに関しての（偏）微分を計算する」

とあり、ラウンドの式が(2.4)にある。

<hr>
１2年くらい前に購入した「数・数式と図形の英語 by 銀林 浩さん、銀林 純さん」にはwrtの索引はなし。
微分のところを見ると以下は見つかった。

p117
> yのxに関する導関数
> the derivative y **with respect to** x
45分でWindows上のViutualBoxにVagrantでCentOS 7を入れて、Chefで構成管理する

ローカルのWindows10(x64) PC上のVirtualBoxにVagrantを使ってCentOS7をインストールし、Chef(knife zero)でapacheをインストールするという盛りだくさんの内容を45分で行います。
※ただし45分で終わるかどうかはネットワーク環境に依存します。

# 【1】 WindowsにVirtualBoxをインストールする (5分)
[VirtualBoxのダウンロードページ](https://www.virtualbox.org/wiki/Downloads)の｢Windows hosts｣というリンクをクリックして、Windows用のVirtualBoxのインストーラーをダウンロードします。
今回使用するVirtualBoxのバージョンは5.1.16です。
インストールはそのまま何も変更せず、進めていくだけです。

# 【2】 WindowsにVagrantをインストールする (5分)
[Vagrantのダウンロードページ](https://www.vagrantup.com/downloads.html)のWindowsのロゴの下の｢Universal (32 and 64-bit)｣をクリックして、Windows用のVagrantのインストーラーをダウンロードします。
今回使用するVagrantのバージョンは1.9.2です。
インストールはそのまま何も変更せず、進めていくだけです。

# 【3】 VagrantでVirtualBox上にCentOS 7をインストールする (20分)
コマンドプロンプトで以下のコマンドを実行して、CentOS7をインストールします。

```
vagrant box add centos72 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box
mkdir centos72
cd centos72
vagrant init centos72
```

Vagrantファイルを開いて下記の行のコメントアウトを解除します。
> config.vm.network "private_network", ip: "192.168.33.10"

ネットワークインタフェースが自動起動しないため、下記の行を追記してネットワークを再起動させます。
> config.vm.provision "shell", run: "always", inline: "systemctl restart network.service"

コマンドプロンプトで以下のコマンドを実行して、CentOS7を起動します。

```
vagrant up
````

# 【4】 WindowsにChefDKをインストールする (5分)
[ChefDKのダウンロードページ](https://downloads.chef.io/chefdk)のWindows10のArchitecture: x86_64の右にある｢Download｣をクリックして、Windows用のChefDKのインストーラーをダウンロードします。
今回使用するChefDKのバージョンは1.2.22です。
インストールはそのまま何も変更せず、進めていくだけです。

# 【5】 Knife ZeroでCentOS 7にapacheをインストールする (10分)
ショートカット｢Chef Development Kit｣を右クリックして、メニューの｢**管理者として実行**｣をクリックします。
今回はCドライブの直下にリポジトリを作成して、そこで作業します。

```
cd h:
chef generate repo chef-repo
cd chef-repo
```

apacheをインストール&起動するcookbookを作成します。

```
knife cookbook create apache -o cookbooks
```

cookbooks/apache/recipes/default.rbを開いて、apacheをインストールして起動するrecipeを作成します。

```
package "httpd" do
  action :install
end

service "httpd" do
  action [ :enable, :start ]
end
```

.chefディレクトリを作成します。

```
mkdir .chef
```

Knife Zeroをローカルモードで実行するため、.chef/knife.rbファイルを作成し、下記の内容を入力します。

```
local_mode true
```

role/example.jsonファイルを開き、run_listの部分を下記の内容に変更し、適用するrecipeを指定します。

```
    "run_list": [
        "recipe[apache]"
    ]
```

CentOS7に対して、apacheをインストール&起動するexample roleを適用します。

```
knife.bat zero bootstrap 192.168.33.10 -x vagrant -Pvagrant --sudo -r 'role[example]'
```

ローカルPCのブラウザから http://192.168.33.10/ にアクセスしてテストページが表示されれば、apacheが正常にインストールされ、起動しています。

以上で終了です。
VSCode のintegrated terminal でタブ

このステッドで議論されてます

[Tabs for integrated terminal](https://github.com/Microsoft/vscode/issues/10546)

```
@psimoneau22 this is the keybinding I use for that:

{ "key": "ctrl+shift+j",    "command": "workbench.action.terminal.focusNext" },
{ "key": "ctrl+shift+k",    "command": "workbench.action.terminal.focusPrevious" },
We're going to be looking into splitting soon.
```

キーバインドはサポートされてて動作しました。スプリットもできるといいですね
macにoctaveのインストール　書き中〜

#インストール

```
brew tap homebrew/science
brew update && brew upgrade
brew cask install xquartz
brew install octave --with-x11
```

#実行

GUI付きで起動

```
octave
```

<img width="893" alt="スクリーンショット 2017-03-22 2.45.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/a2be9859-93da-1757-42d4-ffff613f86e0.png">


CUIで起動

```
octave-cli
```



公式
http://www.gnu.org/software/octave/

guiじゃない方がいいかも？
http://www.kegamin.com/entry/20151116/1447680477


py2
https://blink1073.github.io/oct2py/index.html

本
https://book.mynavi.jp/ec/products/detail/id=52804
ソース
https://book.mynavi.jp/support/e1/RL_support/
VPS の再起動の後に読み込み専用ファイルシステムと言われました。

さくらの　VPS　に　SSH　ログインできなくなり、Apache　に繋がらなくなり困りました。

# 障害のメール
メールをみると、障害のメールが来ていました。

```text:障害情報

障害情報
 http://support.sakura.ad.jp/mainte/mainteentry.php?id=21433

                                                       2017年03月20日掲載


                   障  害  発  生  の  お  知  ら  せ


                                        さくらインターネット株式会社


 平素よりさくらインターネットをご利用いただき、誠にありがとうございます。
 本日、ご提供サービスにおきまして、以下の通り障害が発生いたしました。
 ご利用中のお客様には大変ご迷惑をおかけいたしますことを深くお詫び
 申し上げます。


                                ＜ 記 ＞


   発生日時 : 2017年03月20日21時57分 - 2017年03月20日22時15分

              略

   障害内容 : VPSに接続できなくなる障害が発生しました。
              障害によりお客様ご利用のVPSに意図しない
              再起動が発生しました。

```
なるほど、この再起動でおかしくなった可能性があります。
[さくら VPS](https://secure.sakura.ad.jp/vps/#/login)のログイン画面からログインします。
管理画面からコンソールを立ち上げてログインしました。

# 読み込み専用と言われる
そもそも　sshd や httpd が起動していないようです。

```
/etc/init.d/httpd restart
rm: cannot remove `/var/run/httpd.pid': 読み込み専用ファイルシステムです

rm: cannot remove `/var/lock/subsys/httpd': 読み込み専用ファイルシステムです
rm: cannot remove `/var/run/httpd.pid': 読み込み専用ファイルシステムです
httpd を起動中: 
(30)Read-only file system: httpd: could not open error log file /etc/httpd/logs/
error_log.
Unable to open logs
[失敗]
```
start しようとしたのですが、うまくいきません。読み込み専用ファイルシステムといわれます。

# fsckコマンドを実行する
fsck を実行しました。

```
fsck

略

/: ***** FILE SYSTEM WAS MODIFIED *****
/: ***** REBOOT LINUX *****
/: 311367/4704768 files (1.1% non-contiguous), 2667495/4703028 blocks
```
修正するかと言われるので、yes　をずっと選択しました。自動修復を全部 YES とするには `y` オプションを付けて実行すると良いみたいです。

# reboot
`REBOOT LINUX` という先程のメッセージがあったので、reboot しました。

```
reboot
```

# 確認
OS　起動時に起動設定している sshd や httpd が立ち上がり、無事　VPS　環境が動作するようになりました。
おまけですが、動作が以前よりも格段に早くなった気がします。

# 参考
http://www.cloudn-service.com/faq/4028
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230781/
OpenCVとSDLを連携させてみた

[OpenCV](http://opencv.org/)の`highgui`には簡易的な機能しかないので、[SDL](https://www.libsdl.org/index.php)と連携させてみました。
OpenCVの`cv::VideoCapture`でWebカメラの映像を取得して、SDLでレンダリングしました。

## 環境

+ OS: ArchLinux 64bit
+ 言語: C++
+ コンパイラ: clang++
+ ライブラリ: OpenCV3.2, SDL2.0.5

## どうやって連携させるか

OpenCVの`cv::Mat`クラスはピクセルデータに直接アクセスする方法を提供しています。また、SDLの`SDL_Texture`構造体はピクセルデータを書き込む方法を提供しています。
今回は`cv::VideoCapture`でカメラの映像を`cv::Mat`クラスに格納し、そのピクセルデータを`SDL_Texture`構造体に書き込んでそれをレンダリングしました。

## cv::Matクラスのピクセルデータへのアクセス

`cv::Mat`クラスのピクセルデータへのアクセス方法は、主に以下の5通りとされています。

+ `cv::Mat::at`
+ `cv::Mat::data`
+ `cv::Mat::ptr`
+ `cv::MatIterator_`
+ `cv::Point`

今回は一番高速とされる`cv::Mat::ptr`を利用しました。
以下はカラー画像の全てのピクセルの値を青・緑・赤の順に標準出力するコードです。

``` C++
for (auto row { 0 }; row < mat.rows; ++row)
{
    auto const data { mat.ptr<Vec3b>(row) };

    for (auto col { 0 }; col < mat.cols; ++col)
    {
        std::cout << data[col][0] << "," << data[col][1] << "," << data[col][2] << std::endl;
    }
}
```

## SDL_Texture構造体のピクセルデータへの書き込み

`SDL_Texture`構造体のピクセルデータへの書き込みは、`SDL_UpdateTexture`を用いる方法と`SDL_LockTexture`を用いる方法の2つがありますが、今回は速いとされる`SDL_LockTexture`を利用しました。
書き込みは以下の手順で行います。

### 書き込み可能なSDL_Texture構造体を作成する

`SDL_CreateTexture`の第3引数ではテクスチャのアクセスパターンを指定できるのですが、`SDL_TEXTUREACCESS_STREAMING`を指定することで書き込み可能な`SDL_Texture`構造体を作成できます。

``` C++
auto texture {
    SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, 640, 480)
};
```

### SDL_Texture構造体を書き込み専用にするためにロックする

`SDL_LockTexture`を用いることで、テクスチャをロックしてピクセルデータへのポインタと水平方向のバイト数を取得することができます。ピクセルデータの書き込み操作はこのポインタに対して行います。

``` C++
void *pixels;

int32_t pitch;

SDL_LockTexture(texture, nullptr, &pixels, &pitch);
```

### ポインタを介してピクセルデータを書き込む

先ほど取得したポインタを介してピクセルデータを書き込みます。ピクセルデータは1次元の配列状に並んでいるので、任意の座標のピクセルに書き込む際は水平方向のバイト数を考慮して、書き込むピクセルの位置を計算しなければなりません。
以下は1024番目のピクセルを白くするコードです。

``` C++
auto const format { SDL_AllocFormat(SDL_PIXELFORMAT_RGBA8888) };

reinterpret_cast<uint32_t *>(pixels)[1024] = SDL_MapRGB(format, 255, 255, 255);
```

### 書き込み終わったSDL_Texture構造体をアンロックする

`SDL_UnlockTexture`でテクスチャをアンロックしてピクセルデータの変更を反映します。

``` C++
SDL_UnlockTexture(texture);
```

## 参考文献

+ [画素へのアクセススピード比較](http://qiita.com/hmichu/items/0a399d9e3bbf3a2a4454)
+ [SDL 2.0 API (機能別)](http://sdl2referencejp.osdn.jp/ApiByCategory.html)
球の法線方向を音に合わせて伸ばしたりすることの素敵さ

![133818a748426c2f2155bd9bfc9b07cb.gif](https://qiita-image-store.s3.amazonaws.com/0/108368/6093957f-899c-c0d1-31e4-ec1559aa4cc1.gif)



こんな感じになります。

実際にやってみると綺麗ですよー

参考

http://simplestar-tech.hatenablog.com/entry/2017/02/04/144505


#コード


```csharp:qiita.csharp

using UnityEngine;
using System.Collections.Generic;


public class Sinus : MonoBehaviour
{
	float[] _spectrum = new float[128];
	float _lastLow = 0;
	public GameObject cube;
	[Range(0, 1)]
	public float t = 1;

	List< GameObject> cubes = new List< GameObject>();
	List< Vector3> cubess = new List< Vector3>();

	void Start()
	{
		for (int i = 0; i < 128; i++) {

				cubes.Add ((GameObject)Instantiate (cube, new Vector3 (5*Mathf.Sin(i * 15), 5*Mathf.Cos(i*20), 0), Quaternion.identity));
				cubess.Add (new Vector3 (i * 1.2f, i * 1.2f, 0));


		}

	}

	void Update()
	{
		AudioListener.GetSpectrumData(_spectrum, 0, FFTWindow.Rectangular);
		float low = 0;
		for (int i = 1; i < 3; i++)
			low += _spectrum[i];

		low = _lastLow * (1 - t) + low * t;
		transform.localScale = Vector3.one * 0.05f * low + Vector3.one;
		_lastLow = low;
	
		print (cubes.Count);

		for (int i = 0; i < cubes.Count; i++) {
			//cubes[i].transform.rotation = Quaternion.Euler (new Vector3 (1, _spectrum[i]*i, 1) * 30);
			cubes[i].GetComponent<Renderer>().material.color = new Color(0.5f+Mathf.Sin(Time.time)+_spectrum[i]*1,0.5f,0.5f+Mathf.Cos(Time.time)+_spectrum[i]*1);
			cubes [i].transform.position = new Vector3 (10*Mathf.Sin(i*100+Time.deltaTime*_spectrum[i])*Mathf.Cos(i),10*Mathf.Sin(i*100)*Mathf.Sin(i),10*Mathf.Cos(i*100));
			cubes [i].transform.localScale = new Vector3 (0.1f,0.1f,1000*_spectrum[i]);
			cubes [i].transform.LookAt(new Vector3 (100*Mathf.Sin(i*100)*Mathf.Cos(i),100*Mathf.Sin(i*100)*Mathf.Sin(i),100*Mathf.Cos((i*100))));


		}
	}

}
```

こんな感じ！！

音のデータって、128とか64らしい！

んで、配列の中に一気に音声データが入り込むらしいですね！スゴイ！知りませんでした！

ちゃんと音楽勉強したらもっと人生豊かになれるんでしょうね！

最高！

#音の周波数スペクトラムについて

参考

http://soundengine.jp/wordpress/tips/glossary/244/

まず音って、たくさんの周波数の集まりなので、それを

**AudioListener.GetSpectrumData(_spectrum, 0, FFTWindow.Rectangular);**

をつかって、高速フーリエ変換する。んででてくるたくさんの波のデータの中の重み成分が、たぶんスペクトラムの配列の中に入っていると思う。。。

a*sin(T*sita) のa の部分がスペクトラム

どういう順番で入っているのかっていうと、おそらく音の高さ（Tの大きさによる違い）がそれぞ順番として割り当てられていると思う。

フーリエ変換とかについて

参考

http://www.math.sci.hiroshima-u.ac.jp/KOUKAI/text-h18/Sound.pdf
Windows 10 Home Edition環境でDockerが動くまで

自宅のThinkPad(Win10 Home edition)にDocker-composeでJenkinsサーバ用のコンテナ作って、
Githubと連携させてみた。そのイメージをDockerHubにプッシュしてみた。
Pro Editionを購入するなんて、お財布に優しくないのでHomeでやった。

その道のりについて、これから思い出しながら、少しずつ編集していく。。。

1. DockerHubのアカウント作成
2. Docker Toolboxのインストール
3. 設定
4. Docker-ComposeでJenkinsコンテナ作成、起動
5. Jenkinsのプラグイン設定
6. GithubにプッシュしたらJenkinsがビルドされてた
7. DockerHubにJenkinsコンテナのイメージをプッシュ
iphoneアプリ実機登録

1.Xcode→Preferences→AppleIDの登録
2.GeneralのIdentity→Bundle Identifierの[com.exsample.アプリ名]を[メールアドレス(@前まで).アプリ名]に変更
3.GeneralのSigning→Teamを自分のAppleIDのアカウントに変更
4.GeneralのDeployment Info→Deployment Targetを実機のバージョンに合わせる
Webページの応答時間をPowerShellからMackerelにメトリック投稿する

特定のWEBページにアクセスしたときの応答時間を、定期的にMackerelに送信してサイトの監視を行う。
newrelicの[synthetics](https://newrelic.com/synthetics)みたいな事をやる。
プライベートIPのWEBページなどの場合は、上記のサービスは使えないので、Powershellをタスクで実行してやってみる。

下記のメトリックの投稿のAPIを使う
https://mackerel.io/ja/api-docs/entry/host-metrics

APIキーについては下記を参照
https://mackerel.io/ja/api-docs/

hostIdについては対象のサーバのmackerel-agentが
Linuxであれば、`` /var/lib/mackerel-agent/id ``を参照
Windowsであれば、`` C:\Program Files (x86)\Mackerel `` のなかにIDファイルがあるはず。

下記をタスクで５分おき等で実行。

```ps1

$url = "http://サイトのURL";

$request = New-Object System.Net.WebClient
$request.UseDefaultCredentials = $true
$request.UserAgent = Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13F69 Safari/601.1"

$start = Get-Date

$pageRequest = $request.DownloadString($url)
$timetaken = ((Get-Date) - $start).TotalMilliseconds / 1000
$request.Dispose()

$headers = @{
    "X-Api-Key" = "***********************"
    "Content-Type" = "application/json"}

$metric = '[{"hostId": "*****","name": "custom.適当なメトリック名", "time": '+$utime+', "value": '+$TimeTaken+'}]'

Invoke-RestMethod -Uri https://mackerel.io/api/v0/tsdb -Method Post -Headers $headers -Body $metric 

```
suできないユーザーに切り替える方法

## はじめに
`apache`ユーザー権限で動作するスクリプトの検証をしたい場合に、`su - apache`を実行しても、`nologin`設定がされているため、ユーザー切り替えをすることが出来ません。

```shell-session
[root@localhost ~]# su - apache
Last login: Tue Mar 21 16:02:54 UTC 2017 on pts/0
This account is currently not available.
```
このようなユーザーにsuでユーザー切り替えする方法をまとめます。

## 現状
そもそもsuできない理由は、`/sbin/nologin`とログイン禁止シェルが設定されており、この場合はメッセージが表示されて終了となります。

```shell-session
[root@localhost ~]# cat /etc/passwd | grep apache
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
```

vagrantのようなsuできるユーザーの場合ですと、`/bin/bash`とbashが指定されています。

```shell-session
[root@localhost ~]# cat /etc/passwd | grep vagrant
vagrant:x:1000:1000:vagrant:/home/vagrant:/bin/bash
```

## 手順
su には `-s, --shell <shell>             run shell if /etc/shells allows it`というオプションがありシェルを指定することができます。現状で調べたとおりsuできないのはログインできないシェルが指定されているのが原因でしたので、bashを指定することでログインできるようになります。

```shell-session
[root@localhost ~]# su -s /bin/sh apache
sh-4.2$ whoami
apache
```
java.text.NumberFormatを使用した小数点の丸め処理のデフォルト動作について

`java.text.NumberFormat`を使用して小数点を丸める時のデフォルト動作と、デフォルト動作の変更方法を紹介します。

# JDKバージョン

```
$ java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
```

# デフォルトの動作

`NumberFormat`の`setMaximumFractionDigits`メソッドに`0`を指定すると、小数点を丸めることができます。

```java
package com.example;

import java.text.NumberFormat;

import org.junit.Test;

public class NumberFormatTests {

	@Test
	public void testForDefault() {
		NumberFormat numberFormat = NumberFormat.getInstance();
		numberFormat.setMaximumFractionDigits(0); // 小数点の最大桁数を0に設定する
		System.out.println(numberFormat.format(98.5));
		System.out.println(numberFormat.format(99.5));
	}

}
```

このコードを実行すると・・・

```
98
100
```

になります。おや？？？と思った方もいるのではないでしょうか？直感的には・・・

* 切り捨て

```
98
99
```

や

* 四捨五入？

```
99
100
```

などになることを期待しそう・・・。
で・・・この動作になるのは、`NumberFormat`で管理している[`RoundingMode`](https://docs.oracle.com/javase/jp/8/docs/api/java/math/RoundingMode.html)のデフォルト値が`HALF_EVEN`のためです。
`HALF_EVEN`のJavaDocを見てみると、『「もっとも近い数字」に丸める丸めモードです(ただし、両隣りの数字が等距離の場合は偶数側に丸めます)。』とあるため、「98.5」は「99」(奇数)ではなく「98」(偶数)へ、「99.5」は「99」(奇数)ではなく「100」(偶数)へ丸められたわけです。

# `RoundingMode`の変更

`NumberFormat`の`RoundingMode`は、`setRoundingMode`メソッドで変更することができます。

```java
@Test
public void testForRoundingModeIsDown() {
	NumberFormat numberFormat = NumberFormat.getInstance();
	numberFormat.setMaximumFractionDigits(0);
	numberFormat.setRoundingMode(RoundingMode.DOWN); // RoundingModeを変更
	System.out.println(numberFormat.format(98.5));
	System.out.println(numberFormat.format(99.5));
}
```

このコードを実行すると・・・

```
98
99
```

になります。

# まとめ

へ〜って感じですね。ぶっちゃけ自分もデフォルトの動作が`HALF_EVEN`という部分は意識していませんでしたが、勉強になりました :sweat_smile: ちなみに・・・このエントリーを書いたきっかけは・・・[ThymeleafのIssue(gh-581)](https://github.com/thymeleaf/thymeleaf/issues/581)です。Thymeleafつかって丸め処理を行うと、想定外の結果になっちゃうかもしれませんね（ざっと見た感じだと、`RoundingMode`を変更する手段はなさげだったので）。
nginx をプロキシサーバとして利用していて、URL がデコードされると困る場合

ruby (+webrick や +sinatra) でウェブサーバを起動しているのですが、ポート番号をコマゴマと指定するのもメンドクなりますね。

そのため nginx をリバースプロキシサーバとして用いて、バーチャルホストとして設定し、うまく行ったかに思えました。

ところが、URL に "[" が含まれている場合に ruby 側で Bad URI 例外が発生 (ウェブブラウザ側では 400 Bad Request) したわけです。

原因としては nginx がプロキシサーバとして、要求 URL をデコードし正規化までしてしまうことにあります。

例えば ``https://localhost:9801/document/%5bMEMO%5d%20nginx.md`` が ``https://localhost:9801/[MEMO]%20nginx.md`` になってしまうわけです。

この解決のため、次の点に注意して ``nginx.conf`` を修正しました。

  * ``proxy_pass`` ディレクティブに ``$request_uri`` 組み込み変数を使う
  * ``proxy_pass`` のホスト名指定に、直接 IP アドレスを指定する (``localhost`` ですらなぜか名前解決に失敗し、502 Bad Gateway になるため)

これにより、ひとまずの解決としました (ただし副作用については未知数です)。

``` conf:nginx.conf
http {
    server {
        server_name mypc1.home;

        proxy_set_header Host $host:9801;

        location / {
            proxy_pass http://127.0.0.1:9801$request_uri;
        }
    }
}
```

- - - -

解決方法を以前から探っていたのですが、その頃は Apache (mod\_proxy) の ``nocanon`` しか情報が見当たらず、nginx は未対応としかありませんでした。

今回 (平成29年3月現在) 探ってみてようやく解決の目処がついたので、覚え書きとしてここに残します。


## 参考資料

  * <http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass>
  * <http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_uri>
Google Cloud Platform 無料枠

# 2020/02/03 追記
こちらにまとめてありました
[Google Cloud Platform の無料枠](https://cloud.google.com/free/?hl=ja)

# 以下元の記事(追記時点では以下も更新されている模様)
Google Cloud Platform の無料枠に関して、やっと公式ページを見つけたので、記念にメモ。

[Google Cloud Platform Free Tier](https://cloud.google.com/free/docs/always-free-usage-limits)

GCE はこんな感じ
> Google Compute Engine
1 f1-micro instance per month (US regions only)
30 GB-months HDD, 5 GB-months snapshot
1 GB network egress from North America to all region destinations per month (excluding China and Australia)

見積もりシステムでもちゃんと 0 円になる模様。
google の無料枠とか制限とかって、なんでこんなに探しにくいんだろ＾＾；

gmail api の費用と制限、誰か公式知ってる人、教えてください。。。
swiftでQRコードを読み取る

#使用ライブラリ
[QRCodeReader.swift](https://github.com/yannickl/QRCodeReader.swift)

#Podfile
target 'your_project' do
    pod 'QRCodeReader.swift', '~> 7.3.0'
end

#プログラム

```swift
import QRCodeReader
class HogeViewController: UIViewController,QRCodeReaderViewControllerDelegate {

    lazy var reader = QRCodeReaderViewController(builder: QRCodeReaderViewControllerBuilder {
        $0.reader          = QRCodeReader(metadataObjectTypes: [AVMetadataObjectTypeQRCode])
        $0.showTorchButton = true
    })

    @IBAction func scanAction(_ sender: AnyObject) {
        do {
            if try QRCodeReader.supportsMetadataObjectTypes() {
                reader.modalPresentationStyle = .formSheet
                reader.delegate               = self
                
                reader.completionBlock = { (result: QRCodeReaderResult?) in
                    if let result = result {
                        print("Completion with result: \(result.value) of type \(result.metadataType)")
                    }
                }
                
                present(reader, animated: true, completion: nil)
            }
        } catch let error as NSError {
            //エラー処理
        }
        
    }
    func reader(_ reader: QRCodeReaderViewController, didScanResult result: QRCodeReaderResult) {
        reader.stopScanning()
        
        dismiss(animated: true) { [weak self] in
            //読み取った後の処理
            //result.valueで取得          
        }
    }
    
    func reader(_ reader: QRCodeReaderViewController, didSwitchCamera newCaptureDevice: AVCaptureDeviceInput) {
        if let cameraName = newCaptureDevice.device.localizedName {
            print("Switching capturing to: \(cameraName)")
        }
    }
    
    func readerDidCancel(_ reader: QRCodeReaderViewController) {
        reader.stopScanning()
        
        dismiss(animated: true, completion: nil)
    }
}
[Swift 3.0]NSLayoutAnchorを用いたコードによるAuto Layout

以前、Auto Layoutをコードで書いて、その考え方を知るという記事を書きました。
http://qiita.com/shindooo/items/f0259f1be59591503dc1

そのときはSwift 2.2で書いたのですが、Swift 3.0でAPIが一部変更されています（考え方は同じです）。

Swift 3の書き方でNSLayoutAnchorの使い方を再度まとめたいと思います。

## Auto Layoutの考え方
Auto Layoutでは「制約（Constraint）」を設定することで、ビューの位置やサイズの決定します。

制約は、位置・サイズについてビュー同士の相対的な関係を定義したものです。
相対的な関係というのは

```
緑のビューの幅は、青のビューの幅を1.5倍して30pt加えた大きさである
```

というようなことです。

このことを数式で表すと次のようになります。

```
greenView.width = 1.5 × blueView.width + 30
```

さらに一般的に書くと

```
y = ax + b
```

簡単な一次関数ですね。この式は非常に重要であり、制約の本質を表しています。
制約を定義するということは、この式の各要素を指定するということになります。

###事前準備
次のようにコードでビューを追加します。

```Swift
let blueView = UIView()
blueView.backgroundColor = UIColor.blue
blueView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(blueView)
```

AutoresizingMaskをAuto Layoutに変換しないよう、translatesAutoresizingMaskIntoConstraintsをfalseにしておくとよいでしょう（このあと追加する制約とコンフリクトさせないため）。


###NSLayoutAnchorを使う
では早速、NSLayoutAnchorを使った例を見てみましょう。

```Swift
let leadingConstraint = blueView.leadingAnchor.constraint(equalTo:self.view.leadingAnchor, constant: 30.0)
```

上記は

```
青のビューの左端は、親ビューの左端から30ptの位置である
```

という制約です。

この制約を有効にするには以下のように

```Swift
leadingConstraint.isActive = true
```

とします。
これは、つぎのように1行で書くこともできます。

```Swift
blueView.leadingAnchor.constraint(equalTo:self.view.leadingAnchor, constant: 30.0).isActive = true
```

以下、簡単なサンプルを載せておきます。

```ViewController.swift
override func viewDidLoad() {
    super.viewDidLoad()
    
    let blueView = UIView()
    blueView.backgroundColor = UIColor.blue
    blueView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(blueView)
    
    let greenView = UIView()
    greenView.backgroundColor = UIColor.green
    greenView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(greenView)
    
    // 青のビューの左端は、親ビューの左端から30ptの位置
    blueView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 30.0).isActive = true
    // 青のビューの縦方向の中心は、親ビューの縦方向の中心と同じ
    blueView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true
    // 青のビューの幅は、親ビューの幅の1/4
    blueView.widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 0.25).isActive = true
    // 青のビューの高さは30pt
    blueView.heightAnchor.constraint(equalToConstant: 30.0).isActive = true
    
    // 緑のビューの左端は、青のビューの右端から20ptの位置
    greenView.leadingAnchor.constraint(equalTo: blueView.trailingAnchor, constant: 20.0).isActive = true
    // 緑のビューの上端は、青のビューの上端と同じ位置
    greenView.topAnchor.constraint(equalTo: blueView.topAnchor).isActive = true
    // 緑のビューの幅は、青のビューの幅を1.5倍して30pt加えた大きさ
    greenView.widthAnchor.constraint(equalTo: blueView.widthAnchor, multiplier: 1.5, constant: 30.0).isActive = true
    // 緑のビューの高さは、青のビューの高さと同じ大きさ
    greenView.heightAnchor.constraint(equalTo: blueView.heightAnchor).isActive = true
}

```

![ALS3.png](https://qiita-image-store.s3.amazonaws.com/0/50559/f275d80b-5723-df03-233e-bdbdf85e51fa.png)
Rails つまづき駆動投稿（TDP）

# Rails つまづき駆動投稿

Tsumaduki Driven Post
略してTDP

はい、すみません。
言ってみたかっただけです。

PHPer からRailsを利用するにあたって、
躓いたポイントをまとめて、
一次対応、恒久対応などを記録して
自分の備忘録としようと思います。

トピックとしてまとまったら切り出します。

## 環境
Mac
ruby 2.3.3
Bundler version 1.14.6
Rails 5.0.1
Heroku


## ActionMailerのテストでエラー
Rails Tutorialを参考にしたテストコードの一部で
以下のような　assert_match を使うと

```ruby:test/mailers/user_mailer_test.rb:
  test "account_activation" do
    user = users(:michael)
    user.activation_token = User.new_token
    mail = UserMailer.account_activation(user)
    assert_match user.first_name,               mail.body.encoded
```
下記のようなエラーが出力される

```ruby:
 FAIL["test_account_activation", UserMailerTest, 0.9477509999996983]
 test_account_activation#UserMailerTest (0.95s)
        Expected /Michael/ to match # encoding: US-ASCII
        "\r\n----==_mimepart_58cfdb6148a_7df93fe0b803fa247557\r\nContent-Type: text/plain;\r\n charset=UTF-8\r\nContent-Transfer-Encoding: base64\r\n\r\nRXhhbXBsZU1pY2hhZWzmp5gKCiAgUGxheWluc3RhbGzjgavjgZTnmbvpjLLj\r\ngYTjgZ/jgaDjgY3jgIHjgYLjgorjgYzjgajjgYbjgZTjgZbjgYTjgb7jgZnj\r\ngIIKI 
```

一次対応
http://easyramble.com/test-action-mailer-with-rspec.html
こちらの記事を参考に、Base64 encodeをデコードして比較するように変更

```ruby:test/mailers/user_mailer_test.rb:
assert_match user.first_name,               mail.body.encoded.split(/\r\n/).map{|i| Base64.decode64(i)}.join
```

解決。　意味をちゃんと理解しよう。


## Rails server is already running のとき

```
rails s 
=> Booting Puma
=> Rails 5.0.0.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
A server is already running. Check /Users/ココにパスがはいる/tmp/pids/server.pid.
```

pid削除するとPC再起動が必要だったので
記事を検索
http://qiita.com/blueinkinc/items/f5114cfb9ba3b0631bc0
などでは

```
ps ax | grep rails 
```

とあるが、プロセスに出てこなかったため
pumaを消した

```
 ps ax | grep puma 
37914 s006  S+     0:05.14 puma 3.4.0 (tcp://localhost:3000) [アプリ名]
38219 s006  S+     0:08.14 puma: cluster worker 0: 37914 [アプリ名]
38275 s006  S+     0:08.59 puma: cluster worker 1: 37914 [アプリ名]
kill -9 37914
```

基本的に親プロセスをKillすると子も終了しますが、
同じコマンド叩いてまだいるようなら子も消してください。


```
\w $ rails s
=> Booting Puma
=> Rails 5.0.0.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
[39809] Puma starting in cluster mode...
[39809] * Version 3.4.0 (ruby 2.3.3-p222), codename: Owl Bowl Brawl
[39809] * Min threads: 5, max threads: 5
[39809] * Environment: development
```
無事起動したのでめでたしめでたし。


## Herokuの bundler のバージョンが上がらない

HerokuのrubyのバージョンはGemfile

```ruby:Gemfile:
ruby '2.3.3'
```

などと指定しておくと、herokuへのデプロイ時に
rbenvでバージョンを変更してくれるようですが、
bundlerのバージョンに関しては、
基本的に指定できないようです。
[参考](https://devcenter.heroku.com/articles/bundler-version)

herokuでどのバージョンが使われるかは[こちら](https://devcenter.heroku.com/articles/ruby-support#libraries)
に記載されているようなので、これよりローカルのバージョンを上げないように
したほうが良いかと思われます。
GitHub 上のハードタブの表示幅を変える

# どうやるの

実は GitHub は EditorConfig の一部を[ネイティブサポートしています][4]。
（[EditorConfig][3] のサイトから辿って知りました）

ということで、リポジトリに下記のような `.editorconfig` を置くとハードタブの表示幅が変更できます。

```ini:.editorconfig
root = true

[*]
indent_style = tab
indent_size  = tab

[*.txt]
tab_width = 4

[*.rb]
tab_width = 3

[*.js]
tab_width = 2
```

[サンプルリポジトリも用意しました][5]。このような表示が確認できます。

![sample.txt.annotated.png](https://qiita-image-store.s3.amazonaws.com/0/8171/c53c3289-48ec-2e67-793e-e59463205a18.png)

![sample.rb.annotated.png](https://qiita-image-store.s3.amazonaws.com/0/8171/cc0e215a-03a2-7861-005f-8bef0e8bfda8.png)

![sample.js.annotated.png](https://qiita-image-store.s3.amazonaws.com/0/8171/fd9b2e03-b98d-6742-4600-d12a4228d100.png)

# さいごに

これは、[Rebuild][1] の [179: Rustacean (typester)][2] を聴いていたら

- GitHub でハードタブの表示幅を変えられるといいのに

といった話がでていたので **「それ、できますよ！」** といいたいだけのエントリでした :octocat: 

( :studio_microphone: 29m00s あたりの話題です）


[1]: http://rebuild.fm/
[2]: http://rebuild.fm/179/
[3]: http://editorconfig.org/
[4]: https://github.com/RReverser/github-editorconfig#readme
[5]: https://github.com/elim/sample-gh-with-editorconfig
Bash on Ubuntu on Windows で Delphi のバイナリを動かす

# Bash on Ubuntu on Windows
Windows Creators Update の目玉機能です。
Windows で Bash が動くだけではなく Windows Subsystem for Linux として Ubuntu 16.04 が構築されています。
とはいえ、ここでは詳しくは述べません！（述べられません…）

Bash on Ubuntu on Windows (以下 BoW) は既にインストール済みとします。

# ディレクトリ

BoW では普通に Windows のファイルシステムを利用できます。
具体的には

```bat
/mnt/[ドライブレター]/[ディレクトリ]
```

としてアクセスできます。

# PAServer

PAServer を BoW で実行してみます。
まず、デフォルトで下記の位置にある Linux 用 PAServer を適当なディレクトリにコピーします。
というのは、パスの途中に空白があるとめんどくさいからです。それ以上の意味はありません！

```bat
C:\Program Files (x86)\Embarcadero\Studio\19.0\PAServer\LinuxPAServer19.0.tar.gz
```

今回は

```bat
C:\Ubuntu\
```

にコピーしました。

```shell-session
tar xvf
```

で展開しても良いのですが、めんどくさいので僕は Windows から展開しました。

展開された

```bat
C:\Ubuntu\PAServer-19.0
```

に PAServer があるので、BoW で動かしてみます。

![bow.png](https://qiita-image-store.s3.amazonaws.com/0/12977/749d99ae-5289-6d69-81c9-acf08aad6921.png)

oh... 上手くいきませんでした！
なんとなく、ちょっと頑張れば動きそうな気配がしますが、今回は深追いしません。

# コンソールアプリケーション

気を取り直して[先の記事でビルドしておいた HelloUbuntu](http://qiita.com/pik/items/adb846ef7fe251002bc7) を動かしてみます。

![bow2.png](https://qiita-image-store.s3.amazonaws.com/0/12977/c5bc0a3a-2216-ca00-b89f-384445bd0ebe.png)

Delphi でビルドしたコンソールアプリケーションは無事動作しました！

# まとめ
PAServer は使えないけど、Delphi でビルドしたアプリは実行できました。

PAServer のエラーメッセージをみるとソケットのエラーが出てるので、ソケットを使ったアプリケーションは動かないかもしれません。
ASP.NET Core MVC における Server.MapPath によるコンテンツ ルート パスの取得

ASP.NET 時代には、随分とお世話になった "Server.MapPath()" メソッド
コンテンツ ルート下に配置したリソース ファイルを取得する際に多用したと思います。

しかしながら、ASP.NET Core では、"Server.MapPath()" を利用することができません。

ASP.NET Core では、コンテンツ ルートのパスを取得するには、Web ホストの情報を提供する Microsoft.AspNetCore.Hosting.IHostingEnvironment のインスタンスの "ContentRootPath" プロパティから取得します。

IHostingEnvironment のインスタンスは、各 MVC のコントローラーのコンストラクターの引数経由で取得します。

[.NET Core 環境におけるオブジェクトとファイルの JSON シリアライズ、JSON 逆シリアライズ]
http://qiita.com/hiromasa-masuda/items/d63bbc042f6b81ee08a5

上記の投稿で説明した JSON 逆シリアライズを組み合わせたサンプル コードを以下に掲載しています。

```csharp:HomeController.cs

public class HomeController : Controller
{
        /// <summary>
        /// IHostingEnvironment のインスタンスを保持
        /// </summary>
        private Microsoft.AspNetCore.Hosting.IHostingEnvironment _hostingEnvironment = null;

        /// <summary>
        /// コンストラクター経由で、IHostingEnvironment のインスタンスを取得
        /// </summary>
        /// <param name="hostingEnvironment"></param>
        public HomeController(Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment)
        {
            //IHostingEnvironment をフィールドに保持
            this._hostingEnvironment = hostingEnvironment;
        }

        public IActionResult Index()
        {
            //シリアライザーのインスタンスを生成
            DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Person));

            string filePath = Path.Combine(this._hostingEnvironment.ContentRootPath, "Files", "person.json");
            
            Person deSerializedPerson = null;

            //入力ファイル ストリームの生成
            //using (FileStream stream = new FileStream(filePath, FileMode.Open))
            using (Stream stream = System.IO.File.Open(filePath, FileMode.Open))
            {
                //逆シリアライズ
                deSerializedPerson = jsonSerializer.ReadObject(stream) as Person;
            }

            return View(deSerializedPerson);
        }
}
```

ルート以下の Files フォルダに格納された person.json ファイルをロードし、Person オブジェクトを逆シリアライズにより生成。
この JSON シリアライズ ファイルをロード時に、IHostingEnvironment.ContentRootPath を利用。

個人的には、突如としてコード上にあらわれる Server オブジェクトを利用するより、このように、各コントローラーのコンストラクターにより情報を受け渡す方が、可読性が高くて良いと考えています。