OmniAICreator/Qiita-1.07M huggingface dataset:
Unity スタンダードシェーダーで モデルを綺麗に半透明表示する

スタンダードシェーダーで表示していたオブジェクトを半透明にしたい時、Rendering ModeをFadeやTransparentに変えただけでは綺麗に表示してくれないことがよくあります。
![スクリーンショット 2016-11-19 19.24.18.png](https://qiita-image-store.s3.amazonaws.com/0/59911/345203ba-1225-f111-29d7-9a96f7aadb62.png)

そんな時は、スタンダードシェーダーにちょい足しするのが便利です。

まずはUnityダウンロードページからビルトインシェーダーをダウンロードします。
![スクリーンショット 2016-11-19 19.13.17.png](https://qiita-image-store.s3.amazonaws.com/0/59911/babe90a2-d209-ef13-53ec-907308ad9b74.png)

ビルトインシェーダーの中からStandardShaderを選び、StandardDepth.Shaderなど適当に名前を変えて自分のプロジェクトに追加します。
![スクリーンショット 2016-11-19 19.30.27.png](https://qiita-image-store.s3.amazonaws.com/0/59911/4836d5a6-dfdf-47be-3adb-f51013a0c8e4.png)


追加したシェーダーの以下の部分を変更します。

- 先頭行の Shader "Standard" を"StandardDepth" 等に変更
- 55行目あたりの Tags に "Queue"="Geometry+10" を追加
- そのすぐ下あたりに以下を追加

```Shader
Pass{
	ZWrite ON
	ColorMask 0
}
```
変更前
![スクリーンショット 2016-11-19 19.14.29.png](https://qiita-image-store.s3.amazonaws.com/0/59911/f9ac8d23-8983-87e1-aa0d-edf60c9fb8c7.png)

変更後
![スクリーンショット 2016-11-19 19.15.26.png](https://qiita-image-store.s3.amazonaws.com/0/59911/9cd4b633-0f63-515c-5e7b-23dc5324e605.png)

マテリアルにシェーダーを適用し、RenderingMode = Fade, Source = AlbedoAlpha にします
![スクリーンショット 2016-11-20 13.04.08.png](https://qiita-image-store.s3.amazonaws.com/0/59911/5a19b3a4-d6f3-893f-1cb5-124bb9e63411.png)


![スクリーンショット 2016-11-19 19.11.16.png](https://qiita-image-store.s3.amazonaws.com/0/59911/67344c8c-dcd6-e0bd-2550-3dbd1bb3d63a.png)

上記シェーダーを適用したものが右になります。
Passは増えますが、簡単にモデルを半透明にしたい時に使えるのではないかと思います。
IntelliJ IDEAのJVMデバッガメモリビュー

# これはなに？

**JVM Debugger Memory View**
https://plugins.jetbrains.com/plugin/8537

IntelliJ IDEAのデバッガで、ヒープメモリにあるインスタンスを一覧表示してくれるプラグインです。
安心のJetBrains社ご謹製プラグインになります。

## スクリーンショット

<img width="790" alt="スクリーンショット 2016-11-19 19.21.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/91520/08e1082d-a173-0459-af9c-f35fb5678853.png">

# インストール

ふつうにプラグインとしてインストールします。

- `Settings` -> `Plugins` -> `Install JetBrains plugin` 
- `JVM Debugger Memory View`を選択してインストール

# 使い方

デバッガを実行しながら使います。

## Viewの出し方

最初は、デバッグ実行してもいつもと何も変わらないのですが、落ち着いてビューを表示します。

- `View` -> `Tool Windows` -> `Memory View` 

<img width="444" alt="スクリーンショット 2016-11-19 19.22.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/91520/d7b0d5a0-b581-510a-8499-219f86713c4d.png">

## Viewの使い方

デバッグ実行中、`Memory View`にインスタンスが一覧表示されます。
 
<img width="790" alt="スクリーンショット 2016-11-19 19.21.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/91520/08e1082d-a173-0459-af9c-f35fb5678853.png">

ステップ実行すると、ステップ実行前後のインスタンス数の差分が、`Diff`欄に表示されます。

### フィルタ

クラス名を入力してフィルタすることもできます。
以下の例は、Stringでフィルタしたものになります。

<img width="423" alt="スクリーンショット 2016-11-19 19.22.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/91520/1188419b-5b17-66c1-c69d-0e4cb7ce1bcc.png">

## インスタンスの一覧表示

`Memory View`の`Class`欄に表示されているクラス名をダブルクリックすると、ポップアップウィンドウが表示され、選択したクラスのインスタンスが一覧表示されます。

以下の例は、Stringインスタンスを一覧表示したものになります。

<img width="674" alt="スクリーンショット 2016-11-19 19.24.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/91520/f2b620a7-58d9-400b-dc1b-61f70748b8b4.png">

### 条件を指定してフィルタ

さらに、指定した条件に合致するインスタンスだけをフィルタすることもできます。

以下の例は、「lengthが1000より大きい」という条件でフィルタリングしたものです。

```java
this.length() > 1000
```

<img width="671" alt="スクリーンショット 2016-11-19 19.23.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/91520/6151f8c3-a49e-4222-552d-46a97d86f878.png">

画面に、
> Warning: filtering may have side effects

とあるように、式によっては副作用が発生することもありますのでご注意！

# おしまい

すごく高機能なプロファイラというわけではないですが、非常に簡単に導入でき使い方も簡単ですので、お試ししてみてはいかがでしょうか。
`window.showModalDialog`を使う上での注意点

`window.showModalDialog`はモーダルウィンドウを開くためのメソッドです。
2016年11月現在、Chromeでは廃止され、Firefox50では使えますが非推奨です。
Firefoxでもそのうち廃止する予定だそうです。
https://developer.mozilla.org/ja/docs/Web/API/Window/showModalDialog

`window.showModalDialog`を使っている機能で、結構不具合がありましたので、
`window.showModalDialog`を使う上での注意点を挙げていきます。
ちなみに、今のところ全てIEです。

そもそも`window.showModalDialog`使わなければいいんですが、代替方法とか考えると、これまた不具合が出そうでして。。。


# モーダルウィンドウ上でsubmit
IE11では、 モーダルウィンドウ上でsubmitすると、別ウィンドウが開かれてしまいます。
Firefox50では起こりませんでした。

form要素のtarget属性値と、`window.name`を一致させれば、別ウィンドウは開きません。
form要素のtarget属性は、submit後の開き方を指定する属性です。

```html:modal.html
<form method="POST" action="/sample" target="modalWindow">
```

```js:modal.js
window.name="modalWindow";
```

http://hotmemin.com/blog/?p=615
http://html5.cyberlab.info/elements/forms/form-target.html

# 親ウィンドウへのアクセス
IE11では、モーダルウィンドウ内から親ウィンドウへのアクセスが、`window.opener`でできません。
Firefox50では`window.opener`でアクセスできました。
モーダルウィンドウに`window`オブジェクトを渡せば、`window.dialogArguments`でアクセスできます。

```js:parent.js
window.showModalDialog("modal.html", window, "");
```

```js:modal.js
var parent = window.opener ||  window.dialogArguments;
```

http://d.hatena.ne.jp/replication/20100117/1263694945
http://d.hatena.ne.jp/sngmr/20080729/1217319827


# optionsの`dialogWidth`,`dialogHeight`には単位が必要(IE11)

以下のコードを実行すると、Firefox50では200pxのウィンドウ幅で開かれますが、IE11では画面幅最大で開かれます。

```js:parent.js
window.showModalDialog("modal.html", window, "dialogWidth=200");
```

下記のように長さの単位を付ける必要があります。

```js:parent.js
window.showModalDialog("modal.html", window, "dialogWidth=200px");
```

# optionsの`dialogHide`,`edge`, `status`, `unadorned`はIE専用
下記サイトを参考にしてください。
http://help.dottoro.com/ljdlgxbu.php

# IE8ではウィンドウをキャッシュしている

IE8では`window.showModalDialog`で複数回ウィンドウを開いたとき、正しく動きませんでした。調べてみたら、2回ウィンドウを開いたとき、JSPの初期処理が実行されていません!
そう、キャッシュされていました。

http://axt.hatenablog.com/entry/2013/05/16/093814

キャッシュさせないよう、URLにランダム値を付与するか、metaタグでキャッシュしないよう指定すれば、解決できます。

# Seleniumで操作できない
テスト自動化できません。
対応方法は、`window.showModalDialog=window.open`を実行して、モードレスウィンドウに強制的に変更することです。

https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/284
http://stackoverflow.com/questions/4304886/webdriver-showmodaldialog
ひっこし

こんにちは。
以前は個人のブログを開設していましたがやっぱりブログ用のサイトをメンテナンスするのはドえらく面倒くさいのでこちらに引っ越すことにしました。
以前のブログでは非テックでうんこな内容も書いていましたが、こっちでは技術系の内容に限定しようと思います。

前のブログでは主にOpenIDConnectなどの認証、言語プラットフォームはnode.jsでやっていましたがここではどうなるかわかりません。

よく読まれていたエントリについては一度こちらにコピペして投稿しておきたいと思いますが、結構古いのと、当該エントリを参考にして頂けたうえさらに上質にまとめていただいたエントリが山ほどあるようなので、あくまで個人用です。
注意書きは頭にかくようにしたいと思います。
Aurelia CLI で作成したプロジェクトに linq.js を追加する

トラップに引っかかったので残しておきます。

## Aurelia にクライアントライブラリを追加する方法

[Aurelia CLI](http://aurelia.io/hub.html#/doc/article/aurelia/framework/latest/the-aurelia-cli) で作成したプロジェクトにクライアントライブラリを追加する場合、npm でインストールした後に `aurelia_project/aurelia.json` に追記する必要があります。追記することで `scripts/vender-bundle.js` に含められ、プログラムで利用できるようになります。

クライアントライブラリの仕様に応じた書き方がありますので、まずこちらを紹介します。

### 単一ファイルのモジュールを追加する方法

単一の CommonJS または AMD 形式ファイルを追加する場合はこのように書きます。

```json
"dependencies": [
  {
    "name": "library-name",
    "path": "../node_modules/library-name/dist/library-name"
  }
]
```

- `name` - プログラムにインポートする際の名前です。
- `path` - ライブラリのファイル自体のファイルパスです。 `.js` は自動的に付与されるので書かないようにしてください。

### CommonJS パッケージを追加する書き方

複数のモジュールファイルからなるライブラリの場合、ディレクトリとメインモジュールを指定します。

```json
"dependencies": [
  {
    "name": "aurelia-testing",
    "path": "../node_modules/aurelia-testing/dist/amd",
    "main": "aurelia-testing",
    "env": "dev"
  }
]
```

### 古いタイプのライブラリを追加する書き方

bootstrap は jQuery がグローバルに読み込まれていることを前提にロードされる、古いタイプのライブラリです。これを追加するには以下のように書きます。

```json
"dependencies": [
  "jquery",
  {
    "name": "bootstrap",
    "path": "../node_modules/bootstrap/dist",
    "main": "js/bootstrap.min",
    "deps": ["jquery"],
    "exports": "$"
  }
]
```

### 追加リソースを含めた書き方

bootstrap は JavaScript ライブラリだけでなく、CSS を含めた UI フレームワークです。CSS を読み込まなければ意味がないので、追加リソースとして記述することができます。

```json
"dependencies": [
  "jquery",
  {
    "name": "bootstrap",
    "path": "../node_modules/bootstrap/dist",
    "main": "js/bootstrap.min",
    "deps": ["jquery"],
    "exports": "$",
    "resources": [
      "css/bootstrap.css"
    ]
  }
]
```

`resources` 配列を追加しました。ここに追加したいファイルを記述することでバンドルに含めることができます。ここではファイルの拡張子まで含めてください。

> この方法で追加した CSS ファイルは、 View で require されるテキストリソースとしてバンドルされます。つまり View で　require しないと有効にはなりませんので、 `<require from="bootstrap/css/bootstrap.css"></require>` と書いてビューにロードさせてください。この際のモジュール名(`bootstrap`)は `name` プロパティに設定したものが使われます。

## linq.js のモジュール名は `linq` ではなく `linqjs`

結論として linq.js を追加するには以下のように記述する必要がありました。

```json
"dependencies": [
  {
    "name": "linqjs",
    "path": "../node_modules/linq",
    "main": "linq.min"
  }
]
```

これをプログラムで import するにはこのように書きます。

```js
import Enumerable from 'linqjs'

Enumerable.range(1, 5)...
```

今までは `import Enumerable from 'linq'` で読み込めていたため、かなりはまってしまいました。これは linq.js の AMD モジュール定義の仕様によるものです。
<i class="fa fa-github"></i>対象コード: https://github.com/mihaifm/linq/blob/master/linq.js#L3009 

## 出典・参考情報

[Adding Client Libraries to Your Project / Aurelia Docs](http://aurelia.io/hub.html#/doc/article/aurelia/framework/latest/the-aurelia-cli/6)
LPIC対策にVirtual Box上のCentOS7にGuest Additonsを入れる際にハマった

##対象
・LPICレベル1合格を目指す人
・エンジニア初級者
・CentOSにGuest Additonsが入れられなくて困っている人

##内容
仮想端末に入るのにいちいちCaptureされるのが面倒なのでGuest Additonsを入れようとしてハマったので解決方法の備忘録

・Guest Additionsを入れようとした時に引っかかったところ

```
Vboxadd.sh: Building Guest Additons kernel module
Failed to set up service vboxadd, please check the log file
/var/log/VBoxGuestAdditions.log for details. 
```

・VBoxGuestAdditions.logで詳細確認してくれと言われたのでcatコマンドで開いてみる

```
cat /var/log/VBoxGuestAdditions.log
以下中身
vboxadd.sh: failed: Look at /var/log/vboxadd-install.log to find out what went wrong.
vboxadd.sh: failed: Please check that you have gcc, make, the header files for your Linux kernel and possibly perl installed..
```

・vboxadd-install.logを見てくれとたらい回しにされるw

```
cat /var/log/vboxadd-install.log
以下中身
/tmp/vbox.0/Makefile.include.header:97: *** Error: unable to find the sources of your current Linux kernel. Specify KERN_DIR=<directory> and run Make again.  Stop.
Creating user for the Guest Additions.
Creating udev rule for the Guest Additions kernel module.
```

##解決方法
ネットで色々調べてなんとか解決しました。

```
yum -y install update kernel
yum -y install kernel-devel kernel-headers gcc gcc-c++
```

終了後の再起動を忘れずに!!!!
再起動後、Guest Additonsを実行すれば無事インストールできました。
Railsの導入

[Rubymine / IntelliJ Ideaを100%使いこなす！Rails開発入門!](http://qiita.com/drafts/4f293101cc618ad72fca/edit)から参照されています。
# Railsの導入
## 前置き
この章はRailsの環境構築を目的としており、
Rubymineの設定とは関係ないため、内容を知っている人は飛ばしても大丈夫です。

## homebrewのrbenvの導入
以下の記事を参照
http://qiita.com/issobero/items/e0443b79da117ed48294
＊ homebrew等は本家のgithubのreadmeに書いてある方法で導入すること

## railsプロジェクトの導入と初期設定
```shell:railsプロジェクトの雛形のclone
# git clone https://github.com/ogontaro/rails_template
```

```shell:macにruby2.3.1の導入
# rbenv install 2.3.1
```

```shell:railsのプロジェクト事前準備
# cd rails_template
# bundle install --path vendor/bundle
# bundle exec rake db:reset
```

以上。
Vagrant+webpack-dev-serverでプライベートIPに接続できない時の対処

## 概要
Vagrant+webpack-dev-server環境でVagrantfileに記述したプライベートIPを叩いても接続できずハマった。

## 対応
`webpack.config.js`に下記の記述を追記すればOK。

```
devServer: {
    contentBase: __dirname + '/public',
    host: "0.0.0.0"
}
```

## 参考
[Can't access webpack-dev-server :8080 from Vagrant](https://github.com/RickWong/react-isomorphic-starterkit/issues/27)
jQueryのtriggerHandler()の使いみち

# triggerHandler()

jQueryには[triggerHandler()](http://api.jquery.com/triggerhandler/)というメソッドがあります。
DOM要素に対してイベントを発火させるものですが、`on()`などで定義したイベントハンドラのみが実行されます。
ブラウザに組み込まれている振る舞いは実行されません。

## このtriggerHandler()の使いみちは何でしょうか？

こんなフォームを考えてみます。
チェックボックスとテキストボックスがあります。

```html
<label><input type='checkbox' id='c' checked='checked'> on</label>
<input type='text' id='t' value='' />
```
チェックボックスにチェックを入れる/外すと、テキストボックスが有効/無効になるという制御をさせたいとします。
これをjQuery使って制御するとしたら、こんな感じのコードになりますよね。

```javascript
$('#c').click(function(){
    var checked = $('#c').prop('checked');
    $('#t').prop('disabled', !checked);
});
```

## さて
ここからが問題です。

このテキストボックスの有効/無効の制御が必要になるのは、チェックボックスをクリックした時だけではありません。
そう。ページの読み込み（初期レンダリング）時です。

未チェック状態のフォームを生成する場合、テキストボックスを無効状態にしなければなりません。
これをサーバ側で面倒をみて、以下のようなHTMLを生成するのはサーバ側のコードの複雑化を招きます。

```html
<label><input type='checkbox' id='c'> on</label>
<input type='text' id='t' value='' disabled='disabled' />
```

どうせ、画面制御はクライアント側（javascript側）で面倒をみなければならないのですから、この処理もクライアント側にやらせたいところです。

## とは言え
こういうコードは嫌ですね。

```javascript
var toggle_textbox = function(){
    var checked = $('#c').prop('checked');
    $('#t').prop('disabled', !checked);
}

// ページ読み込み時
toggle_textbox();

// チェックボックスがクリックされた時のハンドラ設定
$('#c').click(toggle_textbox);
```

コードが野暮ったいし、名前も考えなきゃいけないので面倒ですよね。

## ここでtriggerHandler()登場
前置きが長くなりました。
ここで`triggerHandler()`の出番です。

要はページの読み込み時にチェックボックスの(`click`)ハンドラと同じことをやらせれば良いのですから、擬似的に`click`イベントを発生させれば良いわけです。

しかし、単純に`.click()`で`click`イベントを発生させると、ブラウザ組み込みの振る舞いが実行されてしまうので、チェック状態が反転してしまいます。

```javascript:NG
$('#c').click(function(){
    var checked = $('#c').prop('checked');
    $('#t').prop('disabled', !checked);
}).click();                                 // チェックボックスがクリックされてしまう！
```

`.triggerHandler()`であれば、ユーザが定義したイベントハンドラだけが実行されます。

```javascript:OK
$('#c').click(function(){
    var checked = $('#c').prop('checked');
    $('#t').prop('disabled', !checked);
}).triggerHandler('click');                 // チェックボックスがクリックされない！
```

これでスマートになりました。
AWS RDSをマイグレーションするLambda関数を作りました

[AWS RDS](https://aws.amazon.com/jp/rds/) データベースを、DBマイグレーションツール [Flyway](https://flywaydb.org) を使って自動的にマイグレーションする [AWS Lambda関数](https://aws.amazon.com/jp/lambda/) **「flyway-awslambda」** を作りました。

ソースコード、モジュールはGitHubで公開しています。
https://github.com/crossroad0201/flyway-awslambda

# モチベーション

インターネットからのパブリックアクセスを許可していないRDSデータベースに対してDBマイグレーション（テーブルの作成や変更など）を行う場合、わざわざ同じVPC内にEC2インスタンスを立てて、EC2にSSHして、EC2上でマイグレーションを実行して...と言う手順を踏むことが多いと思います。

単純に面倒なだけではなく、今注目されているマイクロサービス化で必要となる継続的デリバリーを実現する上での問題にもなるので、RDSのマイグレーションを自動化したいと考えました。

# flyway-awslambdaとは

`flyway-awslambda` は、RDSのマイグレーションを実行してくれるAWS Lambda関数です。

任意のS3バケットのオブジェクト作成イベントに `flyway-awslambda` を関連付けておくことで、
S3バケットにSQLファイルをアップロードすると、自動的に起動してRDSに対してSQLを実行します。

SQLファイルをS3バケットにアップロードするだけでDBマイグレーションができるので、
EC2を立てたり、手動でマイグレーションコマンドを実行したりする必要がなくなります。

# セットアップ

[GitHubのREADME](https://github.com/crossroad0201/flyway-awslambda) を参照してください。
手作業でセットアップすることも、[CloudFormation](https://aws.amazon.com/jp/cloudformation/)を使って自動的にセットアップすることも可能です。

大まかには

1. SQLファイルを置くS3バケットを作り、Flywayの設定ファイルを置く。
1. `flyway-awslambda` のLambda関数を作り、S3バケットに紐付ける。

だけです。

### 注意点

* Lambda関数からRDSにアクセスするために、Lambda関数にVPCを関連付ける必要があります。

* Lambda関数にVPCを関連付けると、こんどはLambda関数からS3バケットにアクセスできなくなります。[VPCエンドポイント](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-endpoints.html) を設定することで、S3バケットにアクセスできるようにします。

* Lambda関数をVPCをに関連付けることで、VPC Lambda用の[ENI](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-eni.html)が自動的に作成されます。（_AWS Lambda VPC ENI: ****_ と言う説明が付きます）
このENIはLambda関数を削除しても同時に削除されずに残ってしまうので、紐付いたVPCが削除できなくなる問題があります。
Lambdaが最後に実行されてから一定時間経過すると自動的に削除されるらしいのですが、VPCを削除する前にこのENIを確認して必要であれば手動でデタッチ→削除してください。

# 実行

作成したS3バケットにFlywayのルールにそって作成したSQLファイルをアップロードすると、自動的にマイグレーションが実行されます。

実行結果はS3バケットに作成される `migration-result.json` で確認できます。

# 2016/12/28追記：手動でマイグレーションを実行できるようになりました

Ver.0.2.0 で、上記の「S3にSQLファイルをアップすると自動的にマイグレーション」に加えて、「あらかじめS3にSQLファイルをアップしておいて、任意のタイミングでマイグレーションを起動する」こともできるようになりました。

実は従来の実行方法では、S3イベントの発生単位・タイミングの都合上、実質的にSQLファイルをひとつずつアップロードしてはマイグレーションが実行されるのを待つ、を繰り返すしかなく、ちょっと使いづらいところがありました。
今回追加した実行方法では、複数のSQLファイルをS3にアップしてからまとめてマイグレーションができます。

こちらの方法で起動する場合は、Lambda関数で指定するハンドラクラスが違うのと、S3イベントのトリガー設定は不要になります。
詳細は [README](https://github.com/crossroad0201/flyway-awslambda) を参照してください。
激安ArduinoをMac(Sierra)で使ってハマったこと

[Amazonでわずか408円（送料無料）で売られているArduino UNO互換ボード](https://www.amazon.co.jp/EasyWordMall-UNO-R3%E9%96%8B%E7%99%BA%E3%83%9C%E3%83%BC%E3%83%89-USB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E4%BB%98%E5%B1%9E-Arduino%E3%81%A8%E4%BA%92%E6%8F%9B/dp/B018VYJIEU/)があったので購入してみたのですが、自宅のSierraでまあまあハマったのでメモを残します。

#先に結論
同様の問題に困っている方のために先に結論を書きます。
下記ページの記事にあるリンクからドライバをインストールしてください。
[Signed Mac OS Driver for Winchiphead CH340 serial bridge](https://blog.sengotta.net/signed-mac-os-driver-for-winchiphead-ch340-serial-bridge/)

以下、詳細。

#シリアルポートを認識しない
ArduinoをUSBでMacと接続するとLEDが点灯し、初期状態で入っているLチカも問題なく動作しました。
しかしArduino IDEを立ち上げてポートを選択しようとしても「Bluetooth-Incoming-Port」しか存在しません。
ターミナルから
```
ls -l /dev/tty.*
```
とやってみてもやっぱり同様です。抜き差し、再起動、USBケーブルを変えても変わらず。
Amazonの商品説明をよく読むと「ATMega16U2からCH340Gにアップデート」とあるので、CH340Gのドライバをインストールしてみます。
すると、USB挿入した瞬間、落ちます。カーネルパニック。

#同じように困っている人がいた
Amazonのレビューにも同様の現象について書かれていましたが、世界にも困っている方がいて
https://tzapu.com/ch340-ch341-serial-adapters-macos-sierra/
こちらの記事から署名付きのドライバのリンクにたどり着くことが出来ました。

400円だしちょと入門しよう！という方が挫折してしまわないようにちょっと書き残してみました。
cgiでUSBカメラから画像を取り込む

* camera: Logitec c270
* ubuntu 16.04

## fswebcamをinstall

* fswebcam をインストール

```
$ apt-get install fswebcam
$ fswebcam /tmp/foo.jpg
```

## cgiを作る

```perl:capture.cgi
#!/usr/bin/perl

$ENV{'TZ'} = "JST-9";
print "Content-type: image/jpeg\n\n";
system("/usr/bin/fswebcam /tmp/tmp_capture.jpg");
open(FH, "</tmp/tmp_capture.jpg");
binmode FH;
print <FH>
#close (FH);
```

apacheのCGIの設定は[こちら参照](http://qiita.com/kummn/items/f6bd0f3e643595ed077a#cgi%E3%81%A7poweroff%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B-root%E6%A8%A9%E9%99%90%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B)
fsusbcamを使う

## パーミッションの設定

/dev/videoがアクセスできないと怒られる．
cgiを動かすのは www-data になるので，fswebcamが動くように，videoグループにユーザを追加する.

```shell-session
$ gpasswd -a www-data video
```

#### 参考

videoデバイスなどの詳細なパーミッションは，udevがaclを使って設定している．https://wiki.archlinuxjp.org/index.php/Udev

```
echo 'SUBSYSTEM=="video0", GROUP="video", MODE="0660"' > /etc/udev/rules.d/10-webcam.rules
```

## 呼び出し

htmlでリロードされるたびに表示

```
<img src="/cgi-bin/capture.cgi"> 
```

ボタンclickで表示

```javascript
<script language="javascript" type="text/javascript">
    function OnCameraBtnClick() {
        $('#camera_image').attr('src', "/cgi-bin/capture.cgi?" + new Date().getTime());
    }
</script>
<input type="button" value="Capture" onclick="OnCameraBtnClick();">
<img id="camera_image">

```
VSCODEでUnityの.metaファイルを表示しないようにする方法


# はじめに
UnityはVSCODE(VisualStudio Code)をScript編集Editorに設定することができますが、デフォルトの設定だと.metaファイルだらけで見づらいです。
この記事で紹介をする設定を施して.metaファイルを消してしまいましょう。

# 手順
手順はとても簡単です。

1. ユーザー設定を開く
	メニューの「Code - 基本設定 - ユーザー設定」を選択する。
	![スクリーンショット 2016-11-19 18.30.00.png](https://qiita-image-store.s3.amazonaws.com/0/41552/19ea71f2-1a28-69b8-8ee4-0939c0401603.png "スクリーンショット 2016-11-19 18.30.00.png")

1. 右側のユーザー設定に以下のコードを追加する。
	
	```
	"files.exclude": {
        "**/.git": true,
        "**/.svn": true,
        "**/.hg": true,
        "**/.DS_Store": true,
        "**/*.meta": true
    }
	```
	
	保存すると.metaファイルが消えます。
	
	「.git .svn .hg .DS_Store」はDefault設定なので表示してもよければ上記コードから消してしまいましょう。
raspberry pi で USBカメラ(c270)から画像/音声入力/出力


## USBカメラ画像入力
* fswebcam をインストール

```
$ apt-get install fswebcam
```

* 外から確認するため, sambaをmount ([参考](http://qiita.com/wbh/items/90288f44b62a36d24f0a))

```shell-session
$ apt-get install cifs-util
$ sudo mount -t cifs //192.168.1.XX/share /mnt -o iocharset=utf8
```

* jpeg取得

```js
$ fswebcam /mnt/foo.jpg
```

# USBカメラのマイクから音を入力
カードとデバイス番号を確認する

```shell-session
$ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: U0x46d0x825 [USB Device 0x46d:0x825], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
```

録音する (-D plughw:(カード番号),(デバイス番号), -d dulation秒数)

```shell-session
$ arecord -D plughw:1,0 -d 1 -f cd test.wav
```

マイクボリューム確認 (-c でカード番号を指定), 必要に応じて ssetで調整

```shell-session
$ amixer sget Mic -c 1
Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined
  Capture channels: Mono
  Limits: Capture 0 - 16
  Mono: Capture 12 [75%] [24.00dB] [on]
```


# raspberrypi から音を出す (ヘッドフォン端子)

mixierを1に設定する(2=HDMI) ([参考](http://qiita.com/linyixian/items/147d8476d808c84a09e0))
スピーカだと音が小さくて気が付きにくいので注意

```shell-session
$ sudo amixer cset numid=3 1
$ aplay /usr/share/sounds/alsa/Front_Center.wav
```

mixerの状態などの確認方法は下記
```shell-session
$ aimixer controls
numid=3,iface=MIXER,name='PCM Playback Route'
numid=2,iface=MIXER,name='PCM Playback Switch'
numid=1,iface=MIXER,name='PCM Playback Volume'
numid=5,iface=PCM,name='IEC958 Playback Con Mask'
numid=4,iface=PCM,name='IEC958 Playback Default'

$ aimixer cget numid=3
numid=3,iface=MIXER,name='PCM Playback Route'
  ; type=INTEGER,access=rw------,values=1,min=0,max=2,step=0
  : values=1

$ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
  サブデバイス: 8/8
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
  サブデバイス #4: subdevice #4
  サブデバイス #5: subdevice #5
  サブデバイス #6: subdevice #6
  サブデバイス #7: subdevice #7
カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
```
Serverlessでnode-configを使う


## v1.2から環境変数設定ができるようです（2016/11/22 追記）

コメントにもあるように、Lambdaが環境変数をサポートしました。
[Serverlessでも環境変数をサポートし](https://github.com/serverless/serverless/pull/2748)、以下のような設定ができます。

```yaml:serverless.yml
service: environment-variables

provider:
  environment:
    provider_level: provider
  name: aws
  runtime: nodejs4.3
  cfLogs: true

functions:
  hello:
    environment:
      FUNCTION_LEVEL: function
    handler: handler.hello
    events:
      - http:
          integration: lambda
          path: hello
          method: get
```

<del>現時点ではまだこの機能はリリースされていません。v1.2でサポートされるようです。</del>

（2016/11/23 1:12 追記）
[v1.2.0がリリースされました](https://github.com/serverless/serverless/releases/tag/v1.2.0):tada: 
v1.2.0から[環境変数サポート](https://serverless.com/framework/docs/providers/aws/guide/functions/#environment-variables)されたのでdotenvを利用する必要はなくなりました。


## 結論

- [dotenv](https://github.com/motdotla/dotenv)で`NODE_ENV`を設定する
- [node-config](https://github.com/lorenwest/node-config)より先にdotenvをrequireする

## 設定方法

dev環境での実行を想定します。

### 1. [dotenv](https://github.com/motdotla/dotenv)を使って`NODE_ENV`を設定する


`.env`に`NODE_ENV=dev`を設定します。

```.env
NODE_ENV=dev
```

### 2. [node-config](https://github.com/lorenwest/node-config)で利用する環境ごとのファイルを用意する

node-configでdevの設定を利用するために`./config/dev.js`を用意します

```js:./config/dev.js
module.exports = {
  db: {
    host: "dev.example.com",
    user: "dev_user",
    pass: "dev_pass",
  }
};
```

### 3. dotenvとconfigをrequireする

`require("dotenv").config`をすると`NODE_ENV=dev`が環境変数に設定されます。
設定後にnode-configを呼び出すことでdevの設定が利用できるようになります。

```js:sample.js
require("dotenv").config;

const config = require("config");

const db = require("db");
db.connect({
  host: config.db.host,
  username: config.db.user,
  password: config.db.pass
});
```
Laravelのアセットに関するTips

## css, js, 画像などの読み込みはassetヘルパーを使う
`asset('ファイルパス')`はpublicディレクトリのパスを返す関数。
僕は以下のような構成にしてます。

```
public 
  |__ css
  |__ js
  |__ img
  |__ html
```

###各ファイルの読み込み方

```html:index.blade.php
<!-- css -->
<link rel="stylesheet" href="{{ asset('/css/bootstrap.min.css') }}">

<!-- js -->
<script src="{{ asset('/js/jquery-3.1.1.min.js') }}"></script>

<!-- img -->
<img alt="ロゴ" src="{{ asset('/img/logo.png') }}">

```

### セキュアな通信しかしないよって場合はsecure_assetを使う

HTTPSオンリーな本番環境の場合は、asset()の代わりにsecure_assset()を使います。
で、一つここに問題が。ローカルの開発環境ではSSLでつなげないので、環境ごとに読み込み方を変えます。

```html:index.blade.php
@if(app('env')=='local')
    <link rel="stylesheet" href="{{ asset('/css/bootstrap.min.css') }}">
    <script src="{{ asset('/js/jquery-3.1.1.min.js') }}"></script>
@endif
@if(app('env')=='production')
    <link rel="stylesheet" href="{{ secure_asset('/css/bootstrap.min.css') }}">
    <script src="{{ secure_asset('/js/jquery-3.1.1.min.js') }}"></script>
@endif
```

## レスポンスでHTMLファイルを返したい時

```php:routes.php
Route::get('/hoge', function() {
    return File::get(public_path() . '/html/hoge.html');
});
```

public_path( )はpulicディレクトリのパスを返す関数。
HTMLファイルはpulic/html下に置きます。

## CSSで画像を読み込みたい時

```css
.hoge::before {
  content: '';
  height: 16px;
  width: 16px;
  background: url("../img/hoge.svg") no-repeat center center;
 }
```

url( )は、指定されたパスへ、アプリのルートからドメインを含めた完全なURLを生成してくれる関数。
ちなみにsecure_url( )もあります。
Rubymine / IntelliJ Ideaの導入＆プラグイン＆設定

[Topへ](http://qiita.com/ogontaro/items/4f293101cc618ad72fca)
## インストール
以下からインストーラをダウンロードしましょう。
Ideaは臆してCommunityを選んではいけません。Ultimateを選びましょう。
そうでないとRuby・Railsプラグインが使えません。
[Intellij Idea](https://www.jetbrains.com/idea/download/)
[Rubymine](https://www.jetbrains.com/ruby/download/)

## ライセンス認証
インストールして起動したらライセンスを求められます。アカウントをまだ買っていない人は以下のように
評価版として使いましょう。
![スクリーンショット 2016-11-25 2.00.12.png](https://qiita-image-store.s3.amazonaws.com/0/12759/006b7d23-2686-bbf5-661f-b418ad39d262.png)

次にデフォルトのキーマップですが、以下の通り標準で問題ないでしょう。
ただ、Enable opening...のところはチェックを入れておきましょう。
ターミナルで```$ mine```と入力することで起動できます。
![スクリーンショット 2016-11-25 2.00.47.png](https://qiita-image-store.s3.amazonaws.com/0/12759/d3855759-1763-89fc-731f-73f415a4f553.png)

## 初期設定
そのままでも使うことができますが、より使いやすくするために設定を変えていきましょう。
まずは設定画面を開きます。
![step1.gif](https://qiita-image-store.s3.amazonaws.com/0/12759/3314523c-0a2d-7270-d788-10166d77e4b9.gif)
なお、設定ファイルはsettings.jarとしてエクスポートできます。
以下の設定を実施する人が面倒な人はこちらからダウンロードしてインポートできます。

### テーマをDarculaにして黒ベースに
```
Appearance ＆ Behavior -> Appearance -> Thema: Darculaを選択
```

### Rubymine起動時に自動でプロジェクトを開かないように
```
Appearance ＆ Behavior -> System Settings -> Startup/Shutdown -> Reopen Last project on startupのチェックを外す
```

### Rubymineを閉じるときに確認ウィンドウを開かないように
```
Appearance ＆ Behavior -> System Settings -> Startup/Shutdown -> Confirm application exitのチェックを外す
```

### 行番号表示
```
Preferences -> Editor -> General -> Appearance -> Show line numbersにチェック
```

### ファイル保存時に最後の行に改行追加
最後に改行がないテキストファイルのコミットを防止。
```
Preferences -> Editor -> General -> Ensure line feed at file end on Saveにチェック
```

### メモリインジケータ表示
Rubymineがどのくらいメモリ食ってるか教えてくれる。
```
Preferences -> Appearance Behavior -> Appearance -> Show memory indicator にチェック
```

## プラグイン導入
Welcome画面からConfigure -> Pluginを選択
Browse repositories...を選択しPluginを追加する。
* Railways
* NodeJS
* Markdown Navigator
* (注)Rubocop
* LiveEdit
* Ruby※Intellij ideaの場合
* Slim※Intellij ideaの場合

ただし、Rubocopは現在バグ持ち＆作者が治す気がないため、
以下からPluginををDLし、プラグイン画面で
```Install plugin from disk... -> DLしたディスクを指定 -> Rubocopプラグインを有効```
という順で導入すること。
https://github.com/sirlantis/rubocop-for-rubymine/releases
Sublime Text設定


Sublime Textをインストールし直したので、設定をまとめてみた。
他にも色々設定していた気がするのだが、設定を変更したら記録を残していく。

## Japanize
日本語化するパッケージ。
## SideBarEnhancements
サイドバー右クリックのメニューを拡張
## ConvertToUTF8
様々な文字コードに対応する。
## BracketHighlighter
ブラケット（かっこ）`{}, = , <>, (), [], "", ''`をハイライトする。
## Abacus
プログラミングで変数や連想配列を定義する際に`=`の位置をそろえるパッケージ。
## Sublime Files
`Ctrl＋Alt＋Nキー（Win）／Control＋Command＋Nキー（Mac）`で、パレットが開き、ディレクトリの移動やファイルの操作、ターミナルの起動が行える。

## All Autocomplete
標準の自動補完（オートコンプリート）機能を強化し、マッチする文字列があればサジェストする。
## SublimeCodeIntel
ユーザー定義変数/関数の補完や定義元ジャンプができるようになる。
定義元ジャンプ: `Command + F3 または Alt押しながらクリック`
ジャンプ前の場所に戻る: `Command + Alt + Ctrl + ←`
## SublimeLinter
文法チェックをリアルタイムでしてくれる。言語ごとに必要な Linter もインストールする必要がある。
### SublimeLinter-cppcheck
C++文法チェックは外部ツールcppcheckを利用。
## C++ Snippets
C++スニペット。
## OmniMarkup Previewer
Markdownのリアルタイムプレビュー。
Debian8.6 ThinkPadX200 Wirelessドライバインストール方法

ネット上のThinkPadX200 Wirelessドライバインストール方法の情報は古い


Debian8(Jessie)以降ではシンプル。

以下からパッケージをDL
https://packages.debian.org/jessie/firmware-iwlwifi

- # dpkg -i firmware-iwlwifi_x.x.x.deb
WindowsでPATHをサクッと設定する方法とWindowsのPATHは時々地獄

# 発端

Windows上でPhpStormでなんやかんやしようとしたら、gitへのPATHが通ってなくてエラーになった。
Git for windowsも入れてるしなんでかなーと思ったけど、とりあえずPATHを通すことにした。

## Windowsのパスを通すの面倒ですよね

コンピュータのプロパティからシステムのなんやらで環境変数がどうこうで、
ちっっっっさいテキストボックスに打つの大変だし間違えそう。Linuxみたいにコマンドで設定してすぐに反映してくれよ。

## コマンドで通す方法あった

```bat
SETX /M PATH "%PATH%;C:\Program Files\Git\cmd"
```

めっちゃ楽。

# なんか警告が

```
警告: 保存されたデータは 1024 文字に切り捨てられました。

成功: 指定した値は保存されました。
```

1024文字…？そんなに入ってんの？

```
C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x64;C:\Program Files\Common Files\Lenovo;C:\Program Files (x86)\Common Files\Ulead Systems\MPEG;C:\Program Files (x86)\Windows Live\Shared;C:\SWTOOLS\ReadyApps;C:\Program Files (x86)\Symantec\VIP Access Client\;C:\Program Files (x86)\Common Files\Lenovo;C:\HashiCorp\Vagrant\bin;C:\Program Files\nodejs\;C:\Program Files\TortoiseGit\bin;C:\Users\sa
```

**入ってました**(右にスクロールできます)
いや、ていうか、切り捨てんなよ、成功してないよそれ！

某メーカー製のノートPCのなんだけど、いろいろデフォルトで入ってるみたいですね…。
とりあえず、某メーカー系とかIntelのなんかとかWindowsのLiveうんたらとか、不具合起こっても構わないぜ~~死ね~~、とざっくり消して解決。

```bat
SETX /M PATH "C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\HashiCorp\Vagrant\bin;C:\Program Files\nodejs\;C:\Program Files\TortoiseGit\bin;C:\Program Files\Git\cmd"
```

```
成功: 指定した値は保存されました。
```
DB2で個人的によく使うコマンド  


##DBの作成
	db2 => CREATE DB test_db
	
##DBの削除
	db2 => DROP DB test_db

##DBの一覧表示
	
	db2 => LIST DATABASE DIRECTORY
	
	または(上記と結果は同じ)
	
	db2 => LIST DB DIRECTORY
	
	
##DBへの接続
	
	db2 => CONNECT TO test_table
	
	
##TABLEの作成
	db2 => CREATE TABLE test_table (
  	           id INTEGER NOT NULL,
               name VARCHAR(40) NOT NULL,
               address VARCHAR(60),
               tel VARCHAR(20),
               created_at timestamp,
               deleted_at timestamp,
               updated_at timestamp,
               PRIMARY KEY (id)
           )

##TABLEの削除
	db2 => DROP TABLE test_table
	

##既存TABLE定義の変更
	// カラムの追加
	db2 => ALTER TABLE test_table ADD COLUMN test_column VARCHAR(256)
	
	// カラムの削除
	db2 => ALTER TABLE test_table DROP COLUMN test_column	
	
	// 属性の付与
	db2 => ALTER TABLE test_table ALTER test_column SET NOT NULL
	
	// 属性の削除
	db2 => ALTER TABLE test_table ALTER test_column DROP NOT NULL  

##既存TABLE定義の確認
	db2 => DESCRIBE TABLE test_table  
  
##終わりに
毎度調べるのがめんどくさいので、個人的によく使うものをまとめました、他にもコマンドはあるので随時追加していきたいと思います！
オプションなども追加したいですね！

##参考
[http://db2watch.com/wiki/index.php?title=%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8](http://db2watch.com/wiki/index.php?title=%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)
C# > Visual Studio 2017 RC 型スイッチを試してみた

ついにVisual Studio 2017 RCがリリースされた。
この記事では型スイッチについて試してみたことを述べる。

# 環境
[Visual Studio 2017 RC](https://www.visualstudio.com/vs/visual-studio-2017-rc/)

# 試してみたこと
ユーザーが入力した文字列をParseし、intであればそれをint型変数に代入する。
そうでなければintでない旨のメッセージを表示する。

```Program.cs
using System;

namespace ConsoleTestPetternMatch
{
    class Program
    {
        static void Main(string[] args)
        {
            string s;
            while((s = Console.ReadLine()) != "")
            {
                // C#6までの書き方
                int n1 = 0;
                if (int.TryParse(s, out n1))
                {
                    Console.WriteLine($"入力した数字は{n1}です。");
                }
                else
                {
                    Console.WriteLine($"数字ではありません");
                }

                // C#7ではパターンマッチングと拡張メソッドでこのように書ける
                if (s.Parse() is int n2)
                {
                    Console.WriteLine($"入力した数字は{n2}です。");
                }
                else
                {
                    Console.WriteLine($"数字ではありません");
                }
            }
        }
    }

    static class StringExtension
    {
        public static int? Parse(this string s)
        {
            int n;
            return int.TryParse(s, out n) ? (int?)n : null;
        }
    }
}
```

# 参考にしたサイト
[型スイッチ](http://ufcpp.net/study/csharp/datatype/typeswitch/)
[次期C# 7： 式の新機能 ― throw式＆never型／式形式のswitch（match式）／宣言式／シーケンス式
](http://www.buildinsider.net/column/iwanaga-nobuyuki/002)

# 思ったこと
- 型スイッチはis演算子による型の調査と型宣言を同時に行えるところが便利！
- 型スイッチとは直接関係ないが宣言式が未だに実装されてないのが不便！

# 宣言式について
宣言式とは「変数を宣言すると同時に変数の値をそのまま返す」ものである。
例えば

```Program.cs
            string s;
            while((s = Console.ReadLine()) != "")
            {
            }
```

と書いているところを

```Program.cs
            while((string s = Console.ReadLine()) != "")
            {
            }
```

のように書けるのである。つまり、```(string s = Console.ReadLine())```が式として評価され、その評価結果としてsの値が使えるのである。

# 未だに残る違和感
私はC++の経験があるのでこのような書き方に慣れていたが、C#では実装されていない事に違和感を感じている。

```for(int i = 0; i < 10; i++)```のようにfor文では宣言できるのに、while文ではなぜ宣言できないのか？
そういう意味ではif文も```if((string s = Console.ReadLine()) != "")```のように書けないのだが、型スイッチの導入により幾分緩和された気はする。
python2系でのcsv出力文字化け

python2系でcsv形式で保存したファイルをexelなどを使って表示しようとするとよく文字化けが起きるのでその時の対策メモ

これだと文字化ける

```
# -*-coding: utf-8 -*-
import csv

with open('test.csv', 'w') as f:
  writer = csv.writer(f, lineterminator='\n')
  writer.writerow(['日本語でおｋ？', 'ダメ？'])
```



色々なサイト見るとどうやらエクセルで読み込むには`BOM`という情報付きの`utf-8`にする必要があるらしく、簡単には`utf-8-sig`でエンコードしてやれば良いらしい。

ので`import codecs`を加えてやってみる

```
# -*-coding: utf-8 -*-
import csv
import codecs
with codecs.open('test.csv', 'w', 'utf-8-sig') as f:
  writer = csv.writer(f, lineterminator='\n')
  writer.writerow([u'日本語でおｋ？',u'ダメ？'])
```
だが怒られる

```
Traceback (most recent call last):
  File "text.py", line 25, in <module>
    writer.writerow([u'日本語でおｋ？',u'ダメ？'])
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)
```
こうするともっとひどい

```
# -*-coding: utf-8 -*-
import codecs
with codecs.open('test.csv', 'w', 'utf-8-sig') as f:
  writer = csv.writer(f, lineterminator='\n')
  writer.writerow(['日本語でおｋ？', 'ダメ？'])
```

```
Traceback (most recent call last):
  File "text.py", line 25, in <module>
    writer.writerow(['日本語でおｋ？','ダメ？'])
  File "/usr/lib/python2.7/codecs.py", line 688, in write
    return self.writer.write(data)
  File "/usr/lib/python2.7/codecs.py", line 351, in write
    data, consumed = self.encode(object, self.errors)
  File "/usr/lib/python2.7/encodings/utf_8_sig.py", line 82, in encode
    return encode(input, errors)
  File "/usr/lib/python2.7/encodings/utf_8_sig.py", line 15, in encode
    return (codecs.BOM_UTF8 + codecs.utf_8_encode(input, errors)[0], len(input))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)

```


結局以下のようにして`csv`を外すしかありませんでした。

```
# -*-coding: utf-8 -*-
import codecs
f = codecs.open('test.csv', 'w', 'utf-8-sig')
f.write(u'日本語でおｋ？,ダメ？')
f.close()
```

こんなサイトもあるぐらいだし、ホントの所が知りたい…
[csvモジュールがUnicode入力をサポートしていない罠 - bonlife](http://d.hatena.ne.jp/bonlife/20070831/1188564822)
gitの設定 (ssh認証失敗, gitweb, ...)


## git serverの構築 (remote repository)

* (参考) [gitサーバのセットアップ](https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97) 
* (参考) [Git リポジトリサーバの構築と、セキュリティを考慮したアカウント管理方法](https://blog.apar.jp/linux/2300/)

* 公式の通り，remote repositoryは /opt に置く．
  * 大きくなったら外付けに逃がす．/home/gitは使わない．

* **gitユーザでsshが鍵認証されない**  ([参考](http://takuya-1st.hatenablog.jp/entry/20090216/1234742055))
 * /home/xxx と /home/xxx/.ssh のパーミッションを755にする
 * .ssh/authorized_keysのパーミッションを700にする

* Gitのリポジトリの説明(Description)を記述する
http://d.hatena.ne.jp/perlcodesample/20120505/1336451808

* Remote Repositoryは --bare で初期化する．(workを作成)
``$git init --bare test.git``

これで ssh://git@xxx/opt/git/xxxx.git でアクセスできるようになる．

* git:// を有効にするためには [git daemon](https://git-scm.com/book/ja/v2/Git%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-Git-%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3)
* http:// を有効にするためには [smart HTTP](https://git-scm.com/book/ja/v2/Git%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-Smart-HTTP)

## gitwebをインストール
(参考)[【Ubuntu 16.04 LTS Server】gitwebを使う](http://jr4qpv.hatenablog.com/entry/2016/06/11/103946)

* /etc/gitweb.conf を修正
``$projectroot="/opt/git"``
* apacheにgitへのアクセス権付与
``sudo gpasswd -a www-data git``
* apachにgitwebの設定を追加
```
$ vi /etc/apache2/conf-available/gitweb.conf
$ a2enconf gitweb
```
gitwebは、/usr/lib/cgi-bin/gitweb のCGIを実行している
(実体は、/usr/lib/share/gitweb/ にある）


## windows側でgitをセットアップ

* msysgitをinstall
* TortoiseGitをinstall
* TortoiseGit の ssh clientをmsysgitのものに変更する(putty不要)
  * Settings -> Network -> SSH client = c:\devel\git\usr\bin\ssh.exe

* msysgitのgit bashを立ち上げて鍵を作成 
 ``$ ssh-keygen.exe -t rsa -C "user@hostname"``

* ~/.ssh/id_rsa.pub の内容を，git server の /home/git/.ssh/authorized_keys に追加する
* ``git clone ssh://git@hostname/opt/git/xxxxx.git``


## git の branch model の確認

(参考) ぼくが実際に運用していたGitブランチモデルについて
https://havelog.ayumusato.com/develop/git/e513-git_branch_model.html

* master : 完全に動作するとき入れる
* develop : とりあえず適当に入れる

1. local側にdevelop branchを作成する
2. develop branchにswitchして，ローカルで作業
3. push 時に remote のbranchにdevelopを指定してpushすると，remote側にbranchがそのままできる．

※うまく作れたらcloneしなおしたほうが良いかも

## web serverへのdeployの自動化

(参考) [gitでシンプルなデプロイ環境を作る](http://qiita.com/zaburo/items/8886be1a733aaf581045)

server側でclone
```shell-session
$ cd /var/www
$ git clone /opt/git/xxxx.git
$ git pull origin develop
```

hook/post-receiveを作成.  chown git:git, chmod a+x
```shell-session:xxxx.git/hooks/post-receive
#!/bin/sh
cd /var/www/xxxx
git --git-dir=.git pull origin develop
```
【PHP】スーパーグローバル変数　SERVER編


## はじめに
前回に続きPHPスーパーグローバル変数の記事を書いていきます。
今回は`$_SERVER`の勉強です。

## $_SERVER
`$_SERVER`にはヘッダ情報が配列型式で格納されています。
ヘッダ情報はフィールドと値のペアとして「フィールド名：値」のように扱われます。

### リクエストヘッダのフィールド

| ヘッダフィールド|内容|
|---|---|
| Host| リクエスト先のサーバー名。|
| User-Agent| Webブラウザの情報。|
| Accept| 利用可能なアプリケーションやメディアタイプ。|
| Accept-Language| クライアントが利用可能な言語。複数指定し、優先度をつけることが可能。|
| Accept-Encoding| 利用可能なエンコーディング型式。|
| Accept-Charset| 利用可能な文字セット。|
| Referer| 直前にリンクされていたURL。|
| Cookie| クライアントに保存されているクッキーデータ。|

### レスポンスヘッダのフィールド

| ヘッダフィールド|内容|
|---|---|
| Location| リダイレクト先のURL。クライアントに別のURLへの移動を促す。|
| Server| サーバーアプリケーションの種類。|
| WWW-Authenticate| クライアントに認証を要求。|
| Etag| エンティティタグ。リソースを特定するための情報。|

### エンティティヘッダのフィールド

| ヘッダフィールド|内容|
|---|---|
| Content-Type| リソースのタイプ。|
| Content-Encoding| リソースコンテンツのエンコード方法。|
| Content-Length| コンテンツのサイズ。単位はバイト。|
| Expiires| コンテンツの有効期限。|
| Last-Modified| コンテンツの最終更新日時。|

### 一般ヘッダのフィールド

|ヘッダフィールド|内容|
|---|---|
|Cache-Control| キャッシュの取扱に必要な指示や情報。|
| Connection| 接続の永続性情報。|
| Date| コンテンツの作成日時。|
| Transfer-Encoding| コンテンツの転送エンコーディング型式。|

## リクエストメッセージからヘッダー情報を抜き出す

#### mb_strpos()関数
文字列の中に指定した文字列が最初に現れる位置を返します。

構文

```
mb_strpos ($haystack, $needle [$offset, $encoding])
```

|パラメーター|内容 |
---|---
$haystack(string型)|調べたい文字列。
$needle(string型)|検索する文字列。
$offset(int型)|検索オフセット。省略した場合0。
$encoding(string型)|文字エンコーディング。省略した場合、内部で使用されている文字エンコーディングを使用する。

戻り値：int型の値
文字列の中で検索文字列が最初に現れる位置を数値で返す。
見つからない場合はFALSEを返す。

### サンプルプログラム

``` RequestHeader.php
<!DOCTYPE HTML>
<html>
	<head>
	    <meta charset="utf-8" />
	    <title>sample</title>
	</head>
	<body>
		<table border="1">
		    <?php require_once 'Escape.php'; ?>
		    <?php
		    foreach ($_SERVER as $key => $value) {
		        if (mb_stripos($key, 'HTTP_') === 0 ) {
		    ?>
	           <tr>
	               <th align="left"><?php es($key); ?></th?
	               <td align="left"><?php es($value); ?></td>
	           </tr>
		    <?php
		        }
		    }
		    ?>
		</table>
	</body>
</html>
```

上記で作成たページへアクセスするとリクエストヘッダーの情報が表示されます。

## レスポンスヘッダーを設定して別のURLへリダイレクトさせる

リダイレクトの流れ
![リダイレクト.png](https://qiita-image-store.s3.amazonaws.com/0/136533/f89e98c8-c72a-0bc4-2ca8-b1a0abc4e497.png "リダイレクト.png")

#### header()関数
HTTPヘッダーを送信します。

構文

```
header ($str[,$replace, $http_response_code])
```

|パラメーター|内容 |
---|---
$str(string型)|ヘッダーフィールドとその値を「フィールド名：値」の型式で指定する。
$replace(boolean型)|オプション。前に送信された類似のヘッダーを置換するか、同じ形式の二番目のヘッダーを追加するか指定する。<br>デフォルトはTRUEで置換を行う。
$http_response_code(int型)|オプション。ステータスコードを強制的に指定する。



サンプルコード

``` location.php
<?php
	header('Location: http://localhost/sample/RequestHeader.php');
?>
```
`location.php`へアクセスするとリダイレクト先の`RequestHeader.php`が表示されます。
(header()のパラメータは自身の環境に合わせてください)

## 最後に
`MANP`では正常に動作しませんでした。
私は`IntelliJ`の`PHP Built-in Web Server`で動作確認をしました。
参考：[IntelliJですばやくPHP開発環境を構築する](http://qiita.com/master-of-sugar/items/64955c57f95bc89dedcd)
Webアプリケーションを使ってPythonのmysql.connectorでDBにアクセスするときにハマったのでメモ

#使用環境
- CentOS 6.5上にWebサーバと、Mysql 5.6のDBサーバを構築。
- 同一LAN内のクライアントPC（Mac）から上記のwebアプリケーションを利用
- MysqlへのアクセスにはPythonのmysql.connectorを利用

#ハマったこと
```python:test.py
mysql.connector.connect(user='root', password='pass', host='127.0.0.1', database='hoge', charset='utf8')
```
みたいな感じでDBにブラウザからアクセスした際に
`[2003] Can’t connect to MySQL server on ‘127.0.0.1’ (13)`
って感じで怒られる

#対処法
CentOS上で
`sudo setsebool -P httpd_can_network_connect=1`
するとうまく行った。
こうするとhttpdのアクセスを許可するらしい。

よくわかんないけどとりあえず動くようになったのでよしw
何かを入力するまで終了出来ない bash スクリプト（read コマンドを使った永遠の入力待ち）

どうも、星野源です。

[こちら](http://inokara.hateblo.jp/entry/2016/11/19/153100) からの転載です。

## サンプル

```sh
#!/usr/bin/env bash

oreno_input() {
  while true;do
    echo "何か入力して下さい"
      trap 'continue' 2
      read key
      case $key in
        [a-zA-Z]*)      # 英数字
          echo -e "$key"
          break
          ;;
        [^\x01-\x7E]*) # 2 バイト文字
          echo -e "$key"
          break
          ;;
      esac
  done
}

oreno_input
```

## 実行

```sh
bash-3.2$ ./sample.sh
何か入力して下さい

何か入力して下さい

何か入力して下さい

何か入力して下さい
```

Enter だけ叩いても永遠に「何か入力して下さい」が...

```sh
何か入力して下さい
^C^C^C^C^C^C^C
何か入力して下さい
^C^C^C^C
何か入力して下さい
^C^C^C^C
何か入力して下さい
```

Ctrl + c で抜けようとしてもダメよダメダメ。

```sh
何か入力して下さい
真田丸
真田丸
bash-3.2$
```

仕方無いので「真田丸」を入力したら抜け出すことが出来た。

## なんで作ったの？

キーボードからの入力は `read` を使えば取得出来るけど、何かを入力するまでは入力は促したいという要件が自分の中で発生した為。

抜け道が無いか調査中。
GitLab情報オレオレまとめ

# [概要]
## GitLabとは
GitLabは、GitLab社が開発しているソフトウェア開発支援ソフトウェアのことで、GitHubっぽいインターフェースを持っている。
リポジトリブラウザなどのリポジトリ管理機能に加えて、コードレビューやイシュートラッカー、活動履歴機能、Wikiなどの機能を持っており、GitHubと遜色ない機能を持っている。LDAPなどの認証機構との統合もできるため会社などでも利用できるだけの機能は揃えている。

GitLabはオープンソースで提供されており、下記のような種類がある。
 - Community Edition
  - オープンソースで提供されている
 - Enterprise Edition
  - 高機能かつサポート付きの有償版 

また、継続的インテグレーション（Continuous Integration、CI）機能を提供するGitLab CIというツールも提供されている。
GitLab社が管理するサーバー上で稼動するGitLabを提供するGitLab.comというホスティングサービスも用意されており、GitHubのようにアカウント作成すれば、すぐに利用できるようになる。

## 特徴
* プロジェクト
 - GitLabでは、1つのリポジトリを1つのプロジェクトとして扱われ、「Issues」や「マージリクエスト」が紐づく構成になっている。
 - プロジェクトには公開レベル設定でき、主要なリポジトリ管理サービスからのインポート機能も備わっている。

* ユーザ/グループ管理
 - ユーザ、グループにはそれぞれ名前空間が設定されており、各種アクセス権限を設定できる。

* リポジトリ管理機能
 - ブラウザ上で、リポジトリ作成、ユーザ管理、コミット管理、ブランチ管理、フォーク、プルリクエストなどの処理を行える。

* 課題管理機能「Issues」
 - 「Issue」とは、プロジェクトの課題管理機能のことで、「課題」と「ソースコード/マージリクエスト/変更履歴など」をリンクさせて管理でき、情報の一元化が可能となっている。

* コードレビュー機能
 - push時にも「Issue」と「マージリクエスト」の紐付けができる。コードに対してコメントも可能。
 - 
* マージリクエスト機能
 - 「Issues」と同じようにタイトル/概要/担当者などを入力し、その後、レビュー担当者がコード差分確認/コメントをして、レビューが通ればマージをして完了という流れになっている。

* Wiki機能
 - リポジトリに関するドキュメントをまとめて管理できる。

* マイルストン機能
 - 各種締め切りの設定/管理を行える。

* GitLab CI
 -  継続的インテグレーションツールも搭載されている。

* フック機能
 - プロジェクト、システムの両方に対してフック対応している。該当イベントが発生した時、GitLabサーバはJSONデータを使って「HTTP POSTリクエスト」を発行する。GitLabを、開発自動化ツール(CIサービス/チャットサービス/デプロイ用ツール)などと連携可能。

* 認証連携機能
 - LDAPなどの認証機構との連携も可能なため、会社などの大規模開発でも利用可能。

* クラウド対応
 - GitLabはローカルサーバに構築できるが、クラウド環境(AWS/Google Cloud Platformなど)にも構築できる。クラウドサービスごとに、インスタンスイメージ(インスタンステンプレート)が用意されている。

* ドキュメントが充実
 - 各種インストール方法などのドキュメントが充実しており、ネット上でも情報は多い。

## 依存関係
* 

## リンク
* 公式サイト
 - https://about.gitlab.com/

* 公式ドキュメント
 - http://docs.gitlab.com/ce/
* リポジトリ
 - https://gitlab.com/gitlab-org/gitlab-ce/tree/master

# [知っておくべきこと]
* 

# [目次]
* [CentOS7にGitLab8を構築](http://qiita.com/sabakan7/items/2faa6fc5f11e0410fc51)
* [CentOS7に構築したGitLab8を日本語化](http://qiita.com/sabakan7/items/4418cc4e6fa56c5bd8e0)
* [CentOS7に構築したGitLab8をSSL対応](http://qiita.com/sabakan7/items/fff1b8659fde7bedeec6)
PHPのエディタとしてNetBeansを使う

#はじめに
PHPのコーディングにIDEを使いたいけれど、phpStormは有料だしなあ…という方、ぜひ、フリーソフトのNetBeansを使ってみてください。

#環境
OS：Windows10 64bit
CPU：Corei3
メモリ：8GB

#ダウンロード
NetBeansを動作させるにはJDKが必要
下記のORALCEのサイトよりJDKをダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/index.html

「Java」のボタンをクリックしてインストーラーを取得する

![image](https://qiita-image-store.s3.amazonaws.com/0/115516/c0b1f656-9cae-11a8-9dc7-e25bb58cb40c.png)

デフォルトでは「Decline License Agreement」が選択されているので、「Accept License Agreement」を選択する

![image](https://qiita-image-store.s3.amazonaws.com/0/115516/a7a490b3-295f-5cdf-b544-dada8aefec29.png)

OSの種類に応じたものをダウンロードする（例：下記はWindowsの64bitOSの場合）

![image](https://qiita-image-store.s3.amazonaws.com/0/115516/94a615fe-36c0-a7a6-9832-4e5edfa1bc41.png)

ダウンロードしたインストーラーを起動して、JDKをインストールする
インストーラーのデフォルト通りに進んでいけばOK

#NetBeansをダウンロード

https://ja.netbeans.org/　へアクセス

「最新版(日本語版)ダウンロード」をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/115516/8af2051c-96ba-2068-1236-e48c867eea6d.png)

PHP用のNetBeansをダウンロード
「ダウンロード x64」をクリック（Windowsが32bitの方は上のx86の方をクリック)
![image](https://qiita-image-store.s3.amazonaws.com/0/115516/55f515bf-7126-0456-e84a-7ed5a8e41437.png)

ダウンロードしたインストーラーを起動して、NetBeansをインストールする
インストーラーのデフォルト通りに進んでいけばOK

#NetBeansの初期設定（PHPの実行ファイルの場所の指定）

[私の環境](http://qiita.com/RikaKawasaki/items/ab54feaa5123de3612d8)では、PHPの実行ファイルは下記にある
C:\xampp_7_0_9-1\php\php.exe　

「ツール」>「オプション」
![image](https://qiita-image-store.s3.amazonaws.com/0/115516/259ccafe-ff1f-c008-97cc-6e9d85c6d47b.png)

PHP5インタプリタを自分の環境のphp.exeがある場所に変更
![image](https://qiita-image-store.s3.amazonaws.com/0/115516/abe72a8a-91a2-a5d2-84df-d0e68b7e2645.png)
Windows環境でnpm installでエラーが発生する場合の対処法

Windows環境（と、Windowsホストの共有フォルダにVagrantなどからnpmを実行した場合）では、npm installで以下のエラーが発生することがある。

```bash
npm install express
```

```
npm ERR! EPROTO: protocol error, symlink '../mime/cli.js' -> '/home/vagrant/project/node_modules/.bin/mime'
```

この場合、`--no-bin-links`を付けてインストールする。

```bash
npm install express --no-bin-links
```
【C#】プロパティ名でプロパティにアクセスする

#はじめに
　外部ファイルのプロパティ名と値を用いてインスタンスを設定する際に、プロパティ名からプロパティにアクセスできたら便利だと思いいい方法がないか考えました。
　C#6.0で書いています。

#任意のプロパティにアクセス
　System.Reflection.PropertyInfoクラスのメソッドを用いることで、プロパティ名から値の取得と設定が行えました。

```csharp
using System;

namespace QiitaConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            var student = new Student() { ID = "0001", Name = "aiueo" };

            // プロパティ情報の取得
            var property = typeof(Student).GetProperty("Name");

            // インスタンスの値を取得
            var beforeName = property.GetValue(student);

            // インスタンスに値を設定
            property.SetValue(student, "newName");

            Console.WriteLine($"{student.ID}, {beforeName}, {student.Name}");
            // 0001, aiueo, newName
        }

        class Student
        {
            public string ID { set; get; }

            public string Name { set; get; }
        }
    }
}
```

#インデクサを用いる場合
　これをインデクサを用いてアクセスできるようにするには以下のように書きます

```csharp
using System;

namespace QiitaConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            var student = new Student() { ID = "0001", Name = "aiueo" };

            var beforeName = student["Name"];

            student["Name"] = "newName";

            Console.WriteLine($"{student.ID}, {beforeName}, {student.Name}");
            // 0001, aiueo, newName
        }

        class Student
        {
            public string ID { set; get; }

            public string Name { set; get; }

            public object this[string propertyName]
            {
                get
                {
                    return typeof(Student).GetProperty(propertyName).GetValue(this);
                }

                set
                {
                    typeof(Student).GetProperty(propertyName).SetValue(this, value);
                }
            }
        }
    }
}
```

#注意点

　リフレクションを使っているためプライベート変数までアクセスできてしまいます。使用する際は、ロジックが書かれてあるクラスを対象とせず、値の保持のみを目的とした単純なクラスのみで利用するようにしましょう。間違って他のメンバにアクセスされると危険です。

```csharp
using System;

namespace QiitaConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            var student = new Student();

            var property = typeof(Student).GetProperty("Name");

            var beforeName = property.GetValue(student);

            property.SetValue(student, "newName");

            Console.WriteLine($"{student.ID}, {beforeName}, {student.Name}");
            // 0001, aiueo, newName
        }

        class Student
        {
            public Student()
            {
                ID = "0001";
                Name = "aiueo";
            }

            public string ID { set; get; }

            public string Name { private set; get; }
        }
    }
}
```

#まとめ
　プロパティ名でプロパティにアクセスすることができました。