OmniAICreator/Qiita-1.07M huggingface dataset:
Repeaterコントロールからキャストする方法について

少し問題が解決したので自分メモ用。初投稿になります！

#やりたいこと
Repeaterコントロールを使用して繰り返し表示をしたい

#前提条件
1. ASP.NET + WebForm
2. RepeaterコントロールにはArrayListを指定
3. ArrayListにはモデルクラス(Hoge)を格納
4. モデルクラス等は別プロジェクト(hogehoge)で構成されており、本体のプロジェクトはそちらを参照する

```C#:Hoge.cs
namespace hogehoge.models

public sealed class Hoge()
{
    public string No
    {
        get;
        set;
    }
    public string Name
    {
        get;
        set;
    }
}
```

#やったこと
* aspxファイル内で名前空間を指定する

```C#:Hoge.aspx
<%@ Import Namespace="hogehoge.models" %>
```

* Hogeクラスにキャストする

```C#:Hoge.aspx
<asp:Repeater ID="repeater" runat="server">
    <ItemTemplate>
        <tbody>
            <tr>
                <td><%# ((Hoge)(Container.DataItem)).No %></td>
                <td><%# ((Hoge)(Container.DataItem)).Name %></td>
            </tr>
        </tbody>
    </ItemTemplate>
</asp:Repeater>
```

このままだと参照指定不足で警告が出るので、Web.Configに名前空間を指定する。

```C#:Web.Config
<system.web>
    <pages>
        <namespaces>
            <add namespace="hogehoge.models"/>
        </namespaces>
    </pages>
</system.web>

```

#はまった点
Google先生に教えを乞いたが、キーワードが悪いのかヒットせず苦労した。
Web.Configで指定する方法を知らなかったので、参照不足問題に悩まされた。
モデルクラスを本体側のApp_Codeフォルダに入れて試したが、CS0433エラー、ビルドアクション、コンパイルエラーに悩まされた。

昔はGridViewを使用していたので特別困ることはなかったが、今回はモックから作成したのでこのままHTML構成を変更せずに進めようとRepeaterコントロールを使用したのでした。

#おまけ
* Dictionaryの使用方法

```C#:Hoge.aspx
<asp:Repeater ID="repeater" runat="server">
    <ItemTemplate>
        <tbody>
            <tr>
                <td><%# ((Hoge)DataBinder.Eval(Container.DataItem, "value")).No %></td>
                <td><%# ((Hoge)DataBinder.Eval(Container.DataItem, "value")).Name %></td>
            </tr>
        </tbody>
    </ItemTemplate>
</asp:Repeater>
```

#課題
毎回Container.DataItemを指定せず、Hogeクラスにキャストできる気がするが、<% と <%# をうまく区別できない・・。

* イメージ

```C#:Hoge.aspx
<asp:Repeater ID="repeater" runat="server">
    <ItemTemplate>
        <%= Hoge hoge = (Hoge)Container.DataItem %>
        <tbody>
            <tr>
                <td><%# hoge.No %></td>
                <td><%# hoge.Name %></td>
            </tr>
        </tbody>
    </ItemTemplate>
</asp:Repeater>
```

#追記
テンプレート(と呼んでよいのか)側にコードの記述が増えるので(既に増えている・・)好ましくはないが、aspxファイルのソース側のcsファイルにprotected宣言した変数は参照できる様子・・。まじか。。

```C#:HogePage.cs
public partial class HogePage: Page
{
    protected ArrayList hoges;
    ・・・
    Hoge hoge = new Hoge();
    hoge.No = "100";
    hoge.Name = "ほげ";
    hoges.Add(hoge);
}
```

```C#:HogePage.aspx
<% foreach (Hoge hoge in hoges) { %>
   <tbody>
       <tr>
           <td><%# hoge.No %></td>
           <td><%# hoge.Name %></td>
       </tr>
   </tbody>
<% } %}
```

ん～、WebFormに限って言えば、コントロール使うよりこっちの方がすっきりする気がする。どうするかな・・。
ローカルファイルをサクッとHTTP配信する

Ruby ビルトインの WEBrick を使う。

## カレントディレクトリをドキュメントルートとする

ワンライナーで。

```bash
$ ruby -rwebrick -e 'WEBrick::HTTPServer.new(:DocumentRoot => "./", :Port => 3333).start'
```

## 任意の処理を差し込む

例えば「10秒スリープ」とか差し込んで遅いレスポンスをシミュレーションする。

```ruby:server.rb
require 'webrick'

WEBrick::HTTPServer.new(
  DocumentRoot: "./",
  Port: 3333,
  RequestCallback: ->(req, res) {
    sleep 10
    res.body = File.open(".#{req.path}").read
  }
).start
```

```bash
$ ruby server.rb
```

無理やりワンライナーで書けば以下。

```bash
$ ruby -rwebrick -e 'WEBrick::HTTPServer.new(DocumentRoot: "./", Port: 3333, RequestCallback: ->(req, res){sleep 10; res.body = File.open(".#{req.path}").read}).start'
```

## 注意点

上記実装の場合、ディレクトリトラバーサルとか怪しげなことが出来そうな気がしなくもない（未確認）。「個人でのちょっとしたテスト用」ぐらいに思ってください。
Availability Zoneでインスタンスが起動できないと言われた

朝、いつも通りテスト用のインスタンスを立ち上げようとしたらこんなメッセージが。

```
We currently do not have sufficient m3.large capacity in the Availability Zone you requested (ap-northeast-1c).
```

どうやら、このタイプ（今回はm3.large）のインスタンスがアベイラビリティゾーン内の上限に達しているから起動できないよ！ということらしい。

調べると解消されるまで数日かかるとか。起動したいなら、AMIを作って別のアベイラビリティゾーンで起動するしかないらしい。

ってことはサブネットも新しく作れってことか。
ってことは同じサブネット内のインスタンスも全部AMI作って起動し直せってことか。

めんどー( ﾟДﾟ)

・・・と思いながら数分後にリトライしたら、何事もなかったことのように起動できた。
Amazonの中の人が超速で対応してくれたのかたまたまのタイミングだったのか一時的な障害だったのかはわからないが、こんなこともあるらしい。
上記メッセージを目にしても諦めず、何度か起動を試しても良いかもしれない。
Webサーバ、アプリケーションサーバ、Webアプリケーションとは


##Webサーバ、アプリケーションサーバ、Webアプリケーションについてまとめた

#Webアプリケーションとは


>Webアプリケーションとは、Webの技術を利用して構築されたアプリケーションソフトのこと。利用者は操作するWebブラウザや専用のクライアントソフトなどを用いてWebサーバにアクセスし、必要なデータの処理や転送を指示する。技術的には、通信プロトコルにHTTPを、データの表現にHTMLやXMLを用いるアプリケーションソフトの総称。

引用元
http://e-words.jp/w/Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html

=>クライアントから、Webサーバ（後述）にアクセスして、Webサーバから必要な資源を転送してもらう、その時の通信にHTTPを使うのがWebアプリケーション


#Webサーバ
クライアントに対してデータや処理の結果などをHTTPという通信規約（プロトコル）を用いて提供する機能を持つコンピュータやソフトウェアのこと。

参考にさせていただいたサイト
http://e-words.jp/w/Web%E3%82%B5%E3%83%BC%E3%83%90.html


#アプリケーションサーバ

>業務の処理のの流れを制御するビジネスロジックを実装しているのがアプリケーションサーバである

実際にプログラムを処理したり（実行環境）、データベースへ接続したりする機能を持っているもの

引用元
http://e-words.jp/w/Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%90.html


---

#まとめると
* クライアントからHTTPを通じて、Webサーバにアクセスし、必要な資源をもらうのがWebアプリケーション
* クライアントと実際にやりとりするのが、Webサーバの役割
* クライアントに資源を渡す前にその資源を生成したり、処理や計算をしたり、データベースの接続を持ったりしているのがアプリケーションサーバ
* webサーバとアプリケーションサーバをまとめたものが、webアプリケーションサーバ


#参考文献
国本大悟（2014）『スッキリわかるサーブレット&JSP入門』 株式会社インプレス
UE4のクロス、その落とし穴

# これは何？
UE4(.11)でクロスをやった時にハマったというかあまりの説明不足と酷い落とし穴にブチ切れたことメモ

# UE4ではクロスにAPEX Toolsを使う

[apex toolはこの辺](https://developer.nvidia.com/gameworksdownload#?dn=physx-apex-sdk-1-3-0)にある。1.3.2以降を使おう。展開すると色々入っているがクロスで使うのは32bits版のクロスツール(PROFILE)だ。

## 一通りのやり方

クロスツールの使い方は[このへん](http://docs.nvidia.com/gameworks/content/gameworkslibrary/physx/apexsdk/APEX_Clothing/ClothingTool.html)に書いてある。

UE4へはFBXを普通に取り込み、スケルタルメッシュのアセットを開いてAPEXファイルを取り込んだらマテリアルにサブメッシュを設定する。

だが問題はそこではない。

## 最初の落とし穴

Generate Collision Volumesを押すとコライダを作る窓が開くが、何よりまず最初にサブメッシュを選択して青く選択された状態にしておく。サブメッシュが選択されていないと何かした瞬間ツールがおっ死ぬ。

## 過去(データ準備段階)からの罠

apex toolに食わせるFBXファイルを作る時点で落とし穴がある。この段階で罠を避けないと後で詰んでやり直すことになる。

### メッシュにウエイトが塗られている必要がある
塗られていないとそのボーンにはコライダを付けられない。付ける操作はできるが付かない。またたくさんのボーンに対するウエイトが塗られているとしくじるという話をどこかで読んだ気がする。

### サブメッシュは単一のメッシュである必要がある
要するに頂点が全部くっついている必要がある。これに違反しているとUE4に取り込んだ時にモデルが巨大になったりテクスチャが逝かれた配置になったりする。

### サブメッシュは一つ
UE4はいかにも複数のサブメッシュを使えるかのようなUIになっているが、この項と前項の両方に違反するとUE4のエディタがおっ死ぬ。また前項には違反していない場合でも最初のサブメッシュしか正しく反映されない。

## Blender使用時
BlenderでFBXファイルを作るとUE4に取り込んだ時にコライダを小さくできなくて困る。そんな時は一度UE4からエクスポートしなおして再インポートすれば直る。これはクロスを使っていても同じで、先にクロスの設定がなされていても問題ない。

...UE4とBlenderはFBXのスケールのようなパラメタをマトモに扱えないのかも知れない。

## その他

### APEXツールのコライダはUE4のものとは別
同じデータであっても別に設定しなければならないというアホな状態。なおボーンは共通の模様。

### クロスに触れられるのはごく一部
一緒に作ったコライダとスタティックメッシュ、他のクロスだけがクロスに触れる。他のオブジェクトはクロスには触れずに素通りする。なので無関係のキャラクタをクロスに触れさせたければそのためのボーンを仕込んでおく必要がある。

飾り以上のことをさせたければ苦労する事請け合い。
(ちょいネタ)bash on windowsのaptでIPv6を見に行かなくする方法

デフォのwindowsでaptコマンドを放っても下のようにまずIPv6をチェックしてしまい、なかなか進まないという事があります。

![image](https://qiita-image-store.s3.amazonaws.com/0/119101/e7748d8a-4134-e58f-03b7-4813f15fe717.png)

解決するには、ネットワークアダプタ->プロパティ->IPv6オフ
単純。
![image](https://qiita-image-store.s3.amazonaws.com/0/119101/452bc7a1-01f5-2e38-9cac-bb16b73ba319.png)

これで詰まることなくできました。常識ではありますがIPv6使わなければオフにしておいたほうが何かと困らずに済みますね。
![image](https://qiita-image-store.s3.amazonaws.com/0/119101/2b3c0812-76ce-8812-0b62-7e27170759f1.png)
【Swift】closureでstructがキャプチャーされるときに参照になっていた

closureのキャプチャーまわりの動きをplaygroundで確認していたところ、下記のような現象に遭遇しました。

```swift
var value: Int = 10
withUnsafePointer(to: &value) { print($0) } // 0x0000000116dabea0

let closure1 = {
    withUnsafePointer(to: &value) { print($0) } // 0x0000000116dabea0
    print("value = \(value)")
}
closure1() // value = 10 と表示

value = 20;
closure1() // value = 20 と表示 <- 値渡しになって"a = 10"になると思っていた
```

[The Swift Programming Language (Swift3) Closure](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94)を見てみると

> Closures can capture and store references to any constants and variables from the context in which they are defined. This is known as closing over those constants and variables. Swift handles all of the memory management of capturing for you. 

とのことなので、どんな定数でも変数でも参照がキャプチャされるということなのでしょうか。

`value`をCapture Listに追加してみると...

```swift
let closure2 = { [value] in
    print("value = \(value)")
}
closure2() // value = 20

value = 30
closure2() // value = 20
```

closure定義時のvalueが値渡しされているようです。
chrome拡張機能のポップアップは開いたままにできない（たぶん）

以下のイメージみたいに、ファイルのドラッグ＆ドロップ先としてchrome拡張のポップアップを開いたまま状態にしたかったけど、だめらしいですね。

![drop.png](https://qiita-image-store.s3.amazonaws.com/0/146133/279beb11-8b06-6ee6-89a8-14a920b6930f.png)

## 参考

* [javascript - How to keep Google Chrome Extension popup open? - Stack Overflow](http://stackoverflow.com/questions/4146930/how-to-keep-google-chrome-extension-popup-open)
* [Frequently Asked Questions - Google Chrome](https://developer.chrome.com/extensions/faq#faq-persist-popups)
InfluxDB Go

# InfluxDB
 - Time Series DB
 - open source
 - Golang

## [祝]version 1.0 release
https://www.influxdata.com/influxdb-1-0-ga-released-a-retrospective-and-whats-next/

## もとめていたもの
DBやKVSなどをあえてストック、フロー、ワークという分け方で考えるとすれば、フロー
 - 軽量DB(負荷が少ない)
 - DBに親和的なgraph tool
 - realTime  
   ![real-time-analytics](https://influxdata.com/wp-content/uploads/2016/01/get-started__graphic-4.jpg)
 - cloud watch的な機能

## InfluxDB install
https://docs.influxdata.com/influxdb/v1.0/introduction/installation/

## Creating a database
InfluxDBへ接続
`>influx`

DATABASE作成

```
CREATE DATABASE mydb
```

```
USE mydb
```

## gem [influxdb-ruby](https://github.com/influxdata/influxdb-ruby)
```ruby
gem 'influxdb'
```

### sample
```ruby
      data = [
        {
          series: 'cpu',
          tags:   { host: 'server_1', region: 'us' },
          values: { internal: 5, external: 0.453345 }
        },
        {
          series: 'gpu',
          values: { value: 0.9999 },
        }
      ]
      influxdb = InfluxDB::Client.new ENV['INFLUXDB_DATABASE'], ['INFLUXDB_USERNAME'], ['INFLUXDB_PASSWORD']
      influxdb.write_points(data)
```

- series  
テーブル
- tags  
インデックスみたいなもの
- values  
カラムと値(key-value?)

>Time series data refers to the composition of metrics and tags.
A metric is an arrangement of numerical data in a successive time order,
consisting of a title and several time-value pairs.
Usually time series data is enriched by tags.

> - Regular – data that is sampled at regular intervals. For example every second, or every hour.
> - Irregular – for example, data that is only recorded when an event occurs, which might happen frequently, but always at completely random times.

## [Queries](https://github.com/influxdata/influxdb/blob/master/QUERIES.md)
  - sampleデータと簡単なQuery例  
    https://docs.influxdata.com/influxdb/v1.0/query_language/data_download/  
  - [continuos](https://docs.influxdata.com/influxdb/v1.0/query_language/continuous_queries/)  
    関数やトリガーみたいなものが作れる

## graph
  - Chronograf 
![image](https://qiita-image-store.s3.amazonaws.com/0/73615/11be1e71-41b5-bf67-2573-1b14f95dd4ee.png)

  - re:dash
![image](https://qiita-image-store.s3.amazonaws.com/0/73615/11c7c211-5e8a-602f-a92f-e4f063d8f5a2.png)

## 副産物
 - [collectd](https://collectd.org/)...サーバ監視  
   https://anomaly.io/collectd-metrics-to-influxdb/

## おわりに
 - 大量ログデータのリアルタイム監視などに使えそう
 - 伝統的なファイル出力に替わる時代が来るかも
 - Time is in-out of joint

イベントに関する頻度と経過時間、
そして関連性をより細かく適切に把握できるツールを
使いこなすには意識が必要

## 余談
 - [fluentd+influxDB+Grafana](http://qiita.com/soushiy/items/8517e9ea4dd8e8d47b39)
 - [mongodbより速い!?](https://www.influxdata.com/influxdb-is-27x-faster-vs-mongodb-for-time-series-workloads)
 - [single node目安](https://docs.influxdata.com/influxdb/v1.0/guides/hardware_sizing/#general-hardware-guidelines-for-a-single-node)
 - [influxdb-haskell 1.0対応PR](https://github.com/maoe/influxdb-haskell/pull/30)
Macでフォントの格納場所

Macのフォントのファイルの格納先は3箇所に分かれています。

# システムが使用するフォルダ
- ここはシステムが使用するため、消去したり変更したりしないほうがいいです。

```
/System/Library/Fonts/
```

# 複数のユーザが利用できるフォルダ
- すべてのユーザが利用できるフォントが格納されています

```
/Library/Fonts/
```

# 個々のユーザのみが利用できるフォルダ
- フォントをインストールしたユーザのみが利用できる「Fonts」フォルダ
- FontBookでフォントをインストールすると、デフォルトではここにフォントがインストールされます

```
~/Library/Fonts/
```
Gitlab Issue/MR template

# Gitlab Issue/MR template 

今回のアップデートで使えるようになったので使ってみた。
結論から言うと個人的には使いづらい。（Githubも一緒なんだろうけど・・・）

## Issue Template

トップディレクトリに`.gitlab/issue_templates/`を作成して、中に`.md`ファイルを配置していく。
メインブランチにプッシュしとく必要があるので注意。

これはバグ報告とかのテンプレートやTODOをテンプレートにしとけばフォーマット揃うし良さそう。

## Merge Request Template

トップディレクトリに`.gitlab/merge_request_templates/`を作成して、中に`.md`ファイルを配置していく。
メインブランチにプッシュしとく必要があるので注意。
[Android] ScrollViewの中にスクロールしないListViewを持つ

表題のやり方について、いくつかのアプローチが散見されていたんだけど、以下のStackOverflowの回答がシンプルだったので、転記しておきます。

[Non-scrollable ListView inside ScrollView](http://stackoverflow.com/questions/18813296/non-scrollable-listview-inside-scrollview)


以下のカスタムListViewを作ります。

```java
public class NonScrollListView extends ListView {

    public NonScrollListView(Context context) {
        super(context);
    }
    public NonScrollListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public NonScrollListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
                    Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
            ViewGroup.LayoutParams params = getLayoutParams();
            params.height = getMeasuredHeight();    
    }
}
```


以下のようにリソースを指定

```xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fadingEdgeLength="0dp"
    android:fillViewport="true"
    android:overScrollMode="never"
    android:scrollbars="none" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <!-- com.Example Changed with your Package name -->

        <com.Example.NonScrollListView
            android:id="@+id/lv_nonscroll_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </com.Example.NonScrollListView>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/lv_nonscroll_list" >

            <!-- Your another layout in scroll view -->

        </RelativeLayout>
    </RelativeLayout>

</ScrollView>
```
シンプルにコマンド出力をとってくるAnsible Role（Unix/Linux版）

その名の通り、ターゲットとなるサーバ上で実行した標準出力をリダイレクトしたファイルをとってくるRole **"fetch-command-out"** を作ってみました。
通常少なからずAnsibleのコードを書かなければなりませんが、取得に必要なファイルが決まってさえいれば直ぐに使えるようにしています。

# fetch-command-out Role
Ansible Galaxy に上げています。
https://galaxy.ansible.com/tksarah/fetch-command-out/

# 準備
* Ansible 2.X 以上の入ったホスト（v2.1.2でテスト済み）
* とってきたいファイルのリスト

```sample_comlist.txt
'ls -l /etc','ls_l'
'hostid','hostid_out'
'cat /etc/hosts','cat_hosts'
```

# 使い方例
対象となるサーバのインベントリファイルを用意します。

```ini:hosts
[hoge]
192.168.0.1
[fuga]
192.168.0.2
```

Ansible Galaxy からロールをダウンロードします。

```shell-session
# ansible-galaxy install --roles-path ./roles tksarah.fetch-command-out
```

プレイブックを用意します。（以下そのまま使っていただくと便利です。）

```yaml:site.yml
- name: Playbook for fetching files
  hosts: "{{ target }}"
  gather_facts: no

  become: true
  become_user: root

  vars_prompt:
    - { name: "target" , prompt: "Input target host" ,  default: all , private: no }
    - { name: "inputcommand" , prompt: "Input your command list" , default: sample_comlist.txt , private: no }
    - { name: "remtemp" , prompt: "Input remote temp directory " , default: /tmp/remtemp , private: no }
    - { name: "savedir" , prompt: "Input a save directory" , default: fetched , private: no }

  roles:
    - tksarah.fetch-command-out
```


実行します。

```shell-session
# ansible-playbook -i hosts site.yml
Input target host [all]:（ターゲットホストを指定します。デフォルトはall）
Input your command list [sample_comlist.txt]:（取得したいコマンドと保存ファイル名が書かれているファイルを指定します。）
Input remote temp directory  [/tmp/remtemp]:（ターゲットサーバ上で一時的に保存するディレクトリを指定します。）
Input a save directory [fetched]:（取得したファイルを保存するディレクトリを指定します。デフォルトはカレントのfetched）
PLAY [Playbook for fetching files] *********************************************
                           :
                           :
                           :
PLAY RECAP *********************************************************************
192.168.0.1            : ok=19   changed=6    unreachable=0    failed=0
192.168.0.2            : ok=17   changed=6    unreachable=0    failed=0
```

上記サンプルのプレイブックを使った時、とってきたファイルはカレントの「fetched」ディレクトリに格納されます。

```shell-session
# tree fetched
fetched
|-- 192.168.0.1
|   |-- tmp
|   |   `-- remtemp
|   |       |-- cat_hosts
|   |       |-- hostid_out
|   |       `-- ls_l
|-- 192.168.0.2
|   |-- tmp
```

以下も合わせて使うと効果的です。
[シンプルにファイルをとってくるAnsible Role](http://qiita.com/tksarah/items/d958048c5ec50b474bc3)
[シンプルにコマンド出力をとってくるAnsible Role（Windows版）](http://qiita.com/tksarah/items/5aeabc443efbeaddee38)
Vue.js + Vuex でゼロからササッと2週間でフロントアプリ作り直してみて。

この記事は、ただのFlux的な実装してみたことの雑記です。m(_ _)m
##"なんとなく"JSのブラウザクライアント側の仕事めんどくさいなぁ〜と思ってた
巷でよくきく話

+ 「なんか、いじるの怖い〜」
+ 「なんか、少しいじったらアプリ壊れた〜」

一言でいうと、改修の影響範囲が見づらい問題ですよね。
こういうことってしばしば起こるんですが、結構

> 俗に言う"バケツリレー"たくさんある＆多岐に渡る → めんどいなぁわからんなぁ

の流れが多い気がします。

そんなこんなで、
**バケツリレー辞めたい。
→ データのフローが1方通行で、アプリの状態が1箇所にまとまるFlux的なものやりましょう。**
という流れはどこもありそう。

##やってみて
### 基本的なVuexの考え方
以下の感じですね。
![vuexのデータフロー](https://qiita-image-store.s3.amazonaws.com/0/11510/10350588-65c6-61c2-7daf-aa89755ac40a.png)
なんか、こう書いてあるとめっちゃきれいだけど多分もっとVue.jsらしさを出すとすると「Vue Components」のところを
**「Vue Component, Vue Component, Vue Component, Vue Component…」**
って書いたほうがわかりやすそう。

「なにいってんだこいつ」状態だとは思うんですが…笑

### やってみて、最初慣れず…

最初、小さめの場所から実装してよかったなと思うんですが、Component毎にバケツリレーしてたVue.jsオンリーの考え方があるとStateをなんか変にWebComponent1つの単位で考えがちになっちゃってたんですよね（Stateにもたせる情報が適切でない状態で、作り始めに行ったり来たり手戻りをちょくちょく）。

フロントアプリの作り直しだったんのでStateに必要な情報等は最初からわかってたはず。
Stateにもたせる情報を適切に準備して、色んな人にタスク分散して実装していくことも可能だったんですが…

結局一人だけでまるっと2週間作業してリプレイス。

（「Vue Component, Vue Component, Vue Component, Vue Component…」の方がいいんじゃないかは、Fluxを知らなかった僕のただのぼやきでした。）

### よかったこと

+ メンバーの声

>「基本の考え方が分かれば、追加実装しやすそう」
「なんか、楽」
などなど…

よかったよかった。

+ やっぱりStateの値の変更が一方通行なのは、問題が出ても影響範囲や場所がすぐわかる。

### 悩み(？
+ 大した事ないstateも、Fluxの値変更の流れ全部実装してます。
例） モーダル的なもの表示、非表示　かつ　そんな動作1箇所からしか使わない

→ なんか、ギプス的に全部stateに値もたせてます。
→ どのcomponentからもgetterで値を見れるので、他のcomponentとかから同じ処理やりたくなった場合はむしろ利点だから少しぐらいそこは工数かかっていいんじゃないか。。。
Vimを暗黒パワーに染めるべくdein.vimを導入してみたメモ


## はじめに

私は長年[pathogen](https://github.com/tpope/vim-pathogen)を利用しており、特に困ってはいなかった。
しかし、Vimもメジャーバージョンが上がり、プラグイン管理もそろそろ見直すべきだと感じてきた。
そのため、ひとまずQiita上でよく見かける[dein.vim](https://github.com/Shougo/dein.vim)を導入してみることにした。

## 前提: 導入前の環境

- pathogenを使用している
- 各プラグインは`git`のサブモジュールとして管理

pathogenが登場した辺りに環境を作って今まで来たという状況である。
導入しているプラグインの数もさほど多くもなく、（一度起動したVimを閉じること自体が稀なので）起動時間に不満のない状況では遅延読み込みと言ったワードにもさほど興味を持っていなかった。

## dein.vimの特徴

- コマンドはなく、関数のみで構成されている
- NeoVim及びVim8の非同期APIに対応
- [TOML](https://github.com/toml-lang/toml)で設定が書ける

今時のリッチなプラグインマネージャーを利用しているならともかく、pathogenのような最低限`$VIMRUNTIME`の中さえ整理できれば良いという極めてシンプルなプラグインを使っていた身としてはこの程度の認識となる。

## 導入手順

### 1. `.gitmodules`から設定用TOMLファイルを生成する

```
:%v/url/d
:s/^.\+\/\([^\/]\+\)\/\([^\/]\+\).git/[[plugins]]^Mrepo = '\1\/\2'
```

`^M`は`<C-v><CR>`で入力できる制御コードなので注意。

このExコマンドを実行するとTOMLっぽい形式になるので、そこから適時修正を加えてちゃんとしたTOMLファイルを仕上げる。
その際に`on_i`や`on_source`、`on_ft`と言った遅延ロードの設定も加えておくと良い。

### 2. dein.vimを適当な場所にインストールする

dein.vimのインストールすらも`.vimrc`に書いて自動化する例を見かけたが、すでに`git`で管理しているのでサブモジュールとして管理することにした。

```shell-session
$ cd /path/to/dotfile_dir
$ mkdir .vim/dein
$ git submodule add https://github.com/Shougo/dein.vim.git .vim/dein//repos/github.com/Shougo/dein.vim
```

### 3. `.vimrc`を修正する

pathogen用の設定をばっさり削除し、dein.vim用の設定に置き換える。
私は以下のように書いた。

```vim
" use dein.vim
if &compatible
  set nocompatible
endif

augroup MyAutoCmd
  autocmd!
augroup END

let s:dein_dir = $HOME . '/.vim/dein'
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'
let s:toml_file = s:dein_dir . '/config.toml'
let &rtp = &rtp .",". s:dein_repo_dir

if dein#load_state(s:dein_dir)
  call dein#begin(s:dein_dir, [$MYVIMRC, s:toml_file])
  call dein#load_toml(s:toml_file)
  call dein#end()
  call dein#save_state()

  if dein#check_install()
    call dein#install()
  endif
endif

silent! execute 'helptags' s:dein_repo_dir . '/doc/'
```

最後の`helptags`をやっておかないとdein.vimのヘルプが読めないので注意。

### 4. 既存のサブモジュールで管理しているプラグインたちを削除する

```shell-session
$ git rm -rf .vim/bundle
```

## 乗り換えてみての感想

~~今の状況だとあまり恩恵を感じられないというのが正直なところである。~~
~~遅延ロードの設定をしてみたが起動時間に違いを感じられないため、もっと設定を煮詰める必要がありそうだ。~~
`vim --startuptime`でpathogen時の起動時間とdein.vim時の起動時間を計ってみたところ、起動時間が半分近く短くなっていた。

~~また、特定環境のみ利用するプラグインがあるのだが、`dein#local()`を使ってもうまく読み込むことができなかった。
ヘルプには書いていないが恐らく`dein#begin()`ブロック内に書く必要があるのだろうが、個人的に全端末共通の設定を`.vimrc`に、端末固有の設定を`.vimrc.local`にと分けて書いているため、できれば`dein#begin()`ブロックもふたつ以上に分けたい。
しかし分けて書いてみてもロードされず、多分やり方はあるのだろうが段々億劫になってきたのでVim8標準のプラグイン管理機能を利用すべく`.vim/pack/bundle/start`に端末固有のプラグインを配置することにした。~~

~~時間を見つけて設定等を練り直そうと思うが、今の状況なら億劫になってVim8で導入された標準のパッケージ管理機能を利用する方向に進んでしまうかもしれない。~~

`vim --startuptime`の出力結果を見ながら遅延ロードにして問題なさそうなものをひたすら遅延ロードにしたところ、pathogenを使っていたころと比べて1/3の時間で立ち上がってくるようになった。
一度起動したVimを閉じること自体稀なので起動時間の恩恵はあまり感じないのだが、たまにしか使わないプラグインを標準では読み込まないようにすることでVimの動作自体が若干軽くなった気がする。

TOMLファイルを複数準備し、うちひとつに端末固有のプラグインを列挙する方法で特定環境のみ利用するプラグインを管理することが出来た。
やり方は[Vimをより暗黒パワーに染めるべくdein.vimに端末固有のプラグインをロードさせるようにするメモ](http://qiita.com/from_kyushu/items/904b2a0566a72ff0ddb5)に別途まとめたので、同じことに悩まれている方は参考にしてほしい。
【備忘録】MacでFinderからターミナルを1クリックで開く

Macを利用していて、ターミナルへの導線をスムーズに確保したいと悩んでいた時に知った小ネタの備忘録。

#### **cd to** :https://github.com/jbtule/cdto

##### できること
- Finderで開いている階層をターミナルで表示させる  
  
  
##### 使い方
- READ.MEに記載のあるDownload横のリンクをポチ。これでDownload内に圧縮ファイルが入ります。
- 解凍後はアプリケーションとかに移動しておくと便利
- cdto_?_?(ここでは2_6)内のterminal配下にあるcd to.appをFinderのツールバーにドロップしましょう。
- ⌘押しながらドラッグんドロップすると簡単

<img width="624" alt="スクリーンショット 2016-10-26 14.08.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/145861/19ab06b5-5f86-e499-33ae-c56d81a42ef4.png">


##### 初心者の感想
Download内を空にする癖があるので、アプリケーション配下にcdtoファイルを移動する前に削除してしまい、Finder内のターミナルアイコンが「?」変わったりして困りました。

これは「ツールバーを右クリック→カスタマイズ」で開いた部分にはてなをドラック&ドロップすると消えてくれます。
シンプルにファイルをとってくるAnsible Role

その名の通り、ターゲットとなるサーバ上のファイルをとってくるRole **"fetch-files"** を作ってみました。
通常少なからずAnsibleのコードを書かなければなりませんが、取得に必要なファイルが決まってさえいれば直ぐに使えるようにしています。

# fetch-files Role
Ansible Galaxy に上げています。
https://galaxy.ansible.com/tksarah/fetch-files/

> Linux/Unix , Windows に対応

# 準備
* Ansible 2.X 以上の入ったホスト（v2.1.2でテスト済み）
* とってきたいファイルのリスト

```sample_filelist.txt
/etc/ssh/sshd_config
/var/log/syslog
/etc/nsswitch.conf
```

# 使い方例
対象となるサーバのインベントリファイルを用意します。

```ini:hosts
[hoge]
192.168.0.1
[fuga]
192.168.0.2
```

Ansible Galaxy からロールをダウンロードします。

```shell-session
# ansible-galaxy install --roles-path ./roles tksarah.fetch-files
```

プレイブックを用意します。（以下そのまま使っていただくと便利です。）

```yaml:site.yml
- name: Playbook for fetching files
  hosts: "{{ target }}"
  gather_facts: no

  vars_prompt:
    - { name: "target" , prompt: "Input target host" ,  default: all , private: no }
    - { name: "inputfile" , prompt: "Input your file list" , default: sample_filelist.txt , private: no }
    - { name: "savedir" , prompt: "Input a save directory" , default: fetched , private: no }

  roles:
    - tksarah.fetch-files
```


実行します。

```shell-session
# ansible-playbook -i hosts site.yml
Input target host [all]:（ターゲットホストを指定します。デフォルトはall）
Input your file list [sample_filelist.txt]:（取得したいファイルが書かれているファイルを指定します。）
Input a save directory [fetched]:（取得したファイルを保存するディレクトリを指定します。デフォルトはカレントのfetched）
PLAY [Playbook for fetching files] *********************************************
                           :
                           :
                           :
                           :
PLAY RECAP *********************************************************************
192.168.0.1            : ok=19   changed=6    unreachable=0    failed=0
192.168.0.2            : ok=17   changed=6    unreachable=0    failed=0
```

上記サンプルのプレイブックを使った時、とってきたファイルはカレントの「fetched」ディレクトリに格納されます。

```shell-session
# tree fetched
fetched
|-- 192.168.0.1
|   |-- etc
|   |   |-- nsswitch.conf
|   |   `-- ssh
|   |       `-- sshd_config
|   `-- var
|       `-- log
|           `-- syslog
|-- 192.168.0.2
|   |-- etc
```

以下も合わせて使うと効果的です。
[シンプルにコマンド出力をとってくるAnsible Role（Unix/Linux版）](http://qiita.com/tksarah/items/f9ce59c3f888a9a36180)
[シンプルにコマンド出力をとってくるAnsible Role（Windows版）](http://qiita.com/tksarah/items/5aeabc443efbeaddee38)
所々memo

```math
P(z|{\bf w}) \propto \prod_i P(w_i|z) P(z)
```

```math
\begin{eqnarray}
 p(x) &:& \mbox{generative model} \\
 p(x|z;\theta) &:& \mbox{decoder} \\
 q(z|x;\phi) &:& \mbox{encodder}
\end{eqnarray}
```
IoT縛りの勉強会に参加した(IoTLT vol.20)

# 勉強会の基本情報

* 【日　時】2016年10月11日 19:00~22:00
* 【会　場】株式会社ウフル東京本社
* 【参加費】無料
* 【主　催】リレーションズ株式会社 土屋敬、 dotstudio株式会社 菅原のびすけ
* 【申し込み】 http://iotlt.connpass.com/event/38815/

# 概要
* いろいろな発表があるが、以下の内容が面白いと思う
    * LoRaWANとiBeaconを素敵につなげてみた 株式会社ウフル
    * Lazuriteであったかお風呂に入る 大道寺 寿文氏
    * 電気を大切にするIoT ポキオ氏

# 内容

## LoRaWANとiBeaconを素敵につなげてみた
### LoRa/LoRaWANとは
* LoRaWANは、最近注目されているLPWA(Low Power Wide Area)の一つ
* 2.4GHz帯に比べ920MHz帯は回折回折性が高く、到達距離も長い
* 低消費電力、免許不要

### LoRaWAN屋内物品管理
* LoRaWAN屋内物品管理とは
    * 病院などの施設でどこにどの機器や人が存在しているかトレースし、必要な時に既に確認できること
    * なくなった場所や時間も確認することができる

* 仕組み
    * IBeaconが部屋に近いとLoRaがそれを感知する
    * なくなった時間と場所を取得する

* LoRaWANだからできること
    * 一つでビル全体をカバーできる
    * 3G/LTEより安い


## Lazuriteであったかお風呂に入る
### 背景
* 寒暖差やばい
    * 最近は、寒くなったり暑くなったり激しい
    * シャワー流なので、お風呂入る時寒い
* 気温的に暖かいお風呂に入りたい

### 仕組み
* 温度センサーを二つ用意して、1つはお部屋において、もう1つをお風呂に
* 30秒1回に温度を確認して、結果をRaspberry Pi(gateway)に送る
* Raspberry Pi経由して、milkcocoaに送る
* 最後は、温度差を計算して、結果をslackに送る



## 電気を大切にするIoT
### 背景
* 住んでいるアパートが古い
* 去年の冬に、何度もブレーカが落ちる事案が発生

### 改善したいこと
* IoTを使って電気を監視したい

### 仕組み
* 分流盤に、クランプ電流センサーをつけて1分おきに電流を測定
* gateway経由して、情報をIFTTTに送信
* IFTTTからデータをgoogle docsに記録


# 感想
* 今回は、IoTLTに参加して、いろいろなセンサーとIoT用gatewayを知った
* LoRaWANがとても便利
    * 一台のLoRaWANを用意して、ビルにどこにも接続できる
    * 接続しているデバイスの位置が大体的に表示できる
* 温度センサーを良く知ってるが、クランプ電流センサーが初耳
* 勉強会の後に懇親会に参加して、開発者と交流できた
    * 今回にきになるセンサーの使い方などを開発者に聞いた
* 次回のIoTLTにも参加したい
Vim: 開いているタブ内で一括単語検索

#開いているタブ内での単語検索
基本的な検索の仕方はファイル内検索と変わらない。違うタブに写ったときは`*`から`n`に変わるだけ。ノーマルモードから`/word`で単語検索。`*`で次の検索候補へ。タブを変えて`n`もしくは`N`でそのタブ内のファイルの検索候補へ。vimrcに`:set hlsearch`を入れておくと検索時にヒットした候補が全てハイライトされるので意外と便利。

```
" ctrl+c to toggle highlight.
let hlstate=0
nnoremap <c-c> :if (hlstate%2 == 0) \| nohlsearch \| else \| set hlsearch \| endif \| let hlstate=hlstate+1<cr>
```

で`ctr + c`で作業中でもハイライト機能をon/offにすることも可能。

#参考にしたリンク
- [How to search the current word in all opened tabs in Vim?](http://unix.stackexchange.com/questions/60189/how-to-search-the-current-word-in-all-opened-tabs-in-vim)
- [How to toggle Vim's search highlight visibility without disabling it](http://stackoverflow.com/questions/9054780/how-to-toggle-vims-search-highlight-visibility-without-disabling-it)
- [Highlight all occurrence of a selected word?](http://stackoverflow.com/questions/3431184/highlight-all-occurrence-of-a-selected-word)
NetCDF on CentOS6.8 > undefined reference to `nf_enddef_'  の対処 > yumのパッケージでも問題なかった > ライブラリオプションに-lnetcdffを足す

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
```

```
# yum list installed | grep netcdf
netcdf.x86_64           4.1.1-3.el6.5   @epel                                   
netcdf-devel.x86_64     4.1.1-3.el6.5   @epel                                   
netcdf4-python.x86_64   1.0.2-1.el6     @epel         
```

関連 http://qiita.com/7of9/items/374323a390482a6969cf

## ことの発端

あるFortran90のソフトをコンパイルしようとしてエラーが出た。
http://qiita.com/7of9/items/193f19a750e3384c8d2e

> undefined reference to `nf_enddef_'

libnetcdf.aなどが認識できていない


## 結論

ライブラリオプションに`-lnetcdff`を足してエラーはなくなった。

以上。

## 上記を得るまでに試した/試そうとしたこと (以下、無駄話)

- yumでのパッケージをあきらめてNetCDFをソースからインストールしよう
- NetCDFをインストールしたらFortranパッケージがない
- NetCDF Fortranパッケージをインストールしよう
- NetCDF FortranパッケージインストールにはHDF5ライブラリの関連をごによごにょ
- HDF5をソースからインストールする、、、、か？
- 面倒なので、yumに戻した。

できごころで`-lnetcdff`を足して該当のFotranパッケージをビルドした。
通った。


### 心の叫び

参考 http://qiita.com/mpyw/items/a4495d476ea9ffe54e16

> ア゛ア゛ア゛ア゛ア゛ア゛ア゛ア゛ア゛ア゛も゛っ゛と゛早゛く゛知゛り゛た゛か゛っ゛た゛ア゛ア゛ア゛ア゛ア゛ア゛ア゛ア゛ア゛
([generated by 阿鼻叫喚ジェネレーター](http://azunyan.sitemix.jp/shout/shout.php))

着゛目゛点゛違゛う゛Y゛o゛。゛2゛時゛間゛前゛の゛自゛分゛。゛

## ひっかかっている点

1つだけひっかかっている点。

libnetcdf.aというファイルが上記の作業の結果`/usr/lib64`以下に見つかるようになっている。

yumしなおした結果なのか、ソースからのインストールで生成されたものかは判別できていない。

yumで`netcdf-static.x86_64`もインストールしたことと関係あるかもしれない。

試しにyum removeにてnetcdf-static.x86_64を削除した。libnetcdf.aというファイルはなくなった。
該当のソフトをコンパイルしてみた。エラーなくコンパイルできた。
備忘録としてのgit/hubを使った基本的なワークフロー

複数人でプロジェクトに関わる際には欠かせないgithubですが自分が行っている簡単な手順を備忘録として載せておこうと思います。本格的に使い始めて数ヶ月何かフィードバックがあればその都度改善していこうと思います！

#作業開始
- ブランチを切る
- publish

#作業中
- 時々コミットしてsaveとマスターとの同期を行っておくとトラブル発生時に対処しやすい。

#作業後
- マスター画面に移って同期
- ブランチ画面に戻ってcommit
- `update to master`でマスターから持ってきた変更をブランチに反映させる。
- 変更点を確認。赤は行の削除、黄色はマスターとブランチの変更にコンフリクトがあった場合

1. 両方を残す場合:

```
<<<HEAD ======== 
>>>MASTER
```
で囲まれた部分を削除

2. 同じ部分を変更していた場合:
一言を声をかけて変更点に意見の相違がないかを確認。

- コミット
- pull request

公式サイトの<a href="https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/" target="_blank">Resolving a merge conflict using the command line</a>より:

>To see the beginning of the merge conflict in your file, search the file for the conflict marker <<<<<<<. When you open the file in your text editor, you'll see the changes from the HEAD or base branch after the line <<<<<<< HEAD. Next, you'll see =======, which divides your changes from the changes in the other branch, followed by >>>>>>> BRANCH-NAME. In this example, one person wrote "open an issue" in the base or HEAD branch and another person wrote "ask your question in IRC" in the compare branch or branch-a.

```
If you have questions, please
<<<<<<< HEAD
open an issue
=======
ask your question in IRC.
>>>>>>> branch-a
```

>Decide if you want to keep only your branch's changes, keep only the other branch's changes, or make a brand new change, which may incorporate changes from both branches. Delete the conflict markers <<<<<<<, =======, >>>>>>> and make the changes you want in the final merge. In this example, both changes are incorporated into the final merge:

#Review後に変更点を加えて再度commitするときは
- 変更点を加える
- commit

#その他役に立ちそうなリンク
<a href="http://qiita.com/kozyty@github/items/87fa95a236b6142f7c10" target="_blank">Git 作業における commit と push の頻度について</a>
commitとpushする意義やタイミングはチームによって異なると思いますが、一つの例として記載されているので参考になるかと思います。
Gitblitでローカルマシンにリポジトリブラウジングのwebアプリをたてる

# どんな人向けか？

gitサーバはあるが、GitHub、bitbucketのような、管理のためのwebアプリがチーム内にはないが、それに相当するものを自分のローカルで持ちたい人向けです。

具体的には、以前にはGitHubを使っていたプロジェクトにいたが、今はそういった類を使っていないプロジェクトで、それを使うように方針転換できる立場にない人とかです。

つまるところ、チームへの導入が難しくても、自分だけでもリポジトリから効率よく情報を得たいときの代替手段です。

# [GitBlitとは？](http://gitblit.com/)

gitサーバや、リポジトリの管理・ブラウジングを提供できるオープンソースのjavaアプリです。

Gitblit GOでは、jettyつきなので、apacheなどのwebサーバを用意しなくとも単体で動かせるようになっています。

windowsのサービス化するための手順もあるので、javaがあれば比較的導入しやすいものです。

# インストール手順

細かい手順は公式サイトを参照。
http://gitblit.com/setup_go.html

1. 公式サイトよりzipをダウンロード
2. C:直下で展開
3. data/gitblit.properties でポート番号、SSL証明書のパスフレーズを指定
4. authority.cmd でSSL証明書を作成
5. installService.cmdの --StartParams` の `--storePassword;` の値を3のものに書き換える
6. installService.cmdを実行

windowsのサービス化までできます。これでマシンの起動時に、自動でたちあがってくれるようになります。

ポート番号を8888としていたら、localhost:8888にアクセスすれば表示されます。

[公式サイトのスクリーンショット](http://gitblit.com/screenshots.html) もどうぞ。

リポジトリのサマリ画面はこんな感じです。
![alt](http://gitblit.com/screenshots/03.png)

コミットdiffもわりと見やすいです。
![alt](http://gitblit.com/screenshots/07.png)

## リポジトリのミラーリング

Gitblitをgitサーバとして使うわけではないので、チームで使っているgitサーバをミラーリングすることで、Gitblitから見られるようにします。定期的にfetchする形でのミラーリングなので、即時反映にならないのはあきらめましょう。（自分の都合で勝手にやっているのだからしょうがない...）

詳細の手順は公式サイトを参照してください。
http://gitblit.com/setup_mirrors.html

概略としては

1. data/git/以下に、 `git clone --mirror <repository_url>` でミラーとしてクローン
2. data/gitblit.properties で、 `git.enableMirroring = true` としてミラーリングを有効化
3. `git.mirrorPeriod = 30 mins` で、同期する間隔を指定

# 使ってみての感想

GitHubや他のものに比べると、UIはすこし古いかなという印象はありますが、リポジトリブラウジングとしての機能はほぼ同等という印象です。

たとえば、git blameをして、特定の行のコミットのdiffを見るといったことも、ある程度シームレスにできます。

![alt](http://gitblit.com/screenshots/11.png)

リポジトリのサマリ画面ではdevelopをデフォルトにして、ちょくちょく見て、どういったのがdevelopブランチにコミットされるのかをゆるく監視したりできます。

コミットdiffもみやすいので、それをみながらレビューするとやりやすいです。

# 参考サイト

* http://qiita.com/satoshi0212/items/8924d1667a1ab980977f
* http://d.hatena.ne.jp/udagawa/20141027
* http://d.hatena.ne.jp/torutk/20130812/p1
* http://news.mynavi.jp/column/ide/154/
どこにコミットしたかわからなくなったら、 git reflog　を使うと良い

## あれ、どんな操作したっけ。。

そんな時は、`git reflog`を使いましょう。
過去のあらゆる操作のログを見ることができます。

```
$ git reflog
```

```
9f8f762 HEAD@{0}: checkout: moving from 9f8f7627cc40f35ef3c07cb5447240e46aa990f7 to xxxxx
9f8f762 HEAD@{1}: checkout: moving from xxxx to 9f8f762
9f8f762 HEAD@{2}: checkout: moving from master to xxxx
91b6ca2 HEAD@{3}: pull: Fast-forward
70ae6c6 HEAD@{4}: checkout: moving from xxxx to master
9f8f762 HEAD@{5}: commit: xxxxxxxを修正
...
```
jQuery で Form アップロード

```javascript

    var formData = new FormData($('#upload_id').get(0));
    $.ajax({
     type : "post",
     url : "https://yourhost.com/path/path",
     data : formData,
     processData: false,
     contentType: false,
     success : function(result, dataType){alert("Uploaded successfully.");},
     complete : function(json_data) {},
     error : function(result, dataType){alert("Error");}
    })

```
WHATWG Streams の Lock

# 概要

[WHATWG Streams](https://streams.spec.whatwg.org/) のことを何回かに分けて書く。[Kyoto.js #11](http://kyotojs.connpass.com/event/39462/) の『 [WHATWG Streams をためした](http://bouzuya.net/slides/2016-10-22/) 』という発表のために調べたものだ。発表だけで終わらせるのはもったいないので、再整理して共有する。

前回は『 [WHATWG Streams の Source と Sink - Qiita](http://qiita.com/bouzuya/items/3c852619e9f11e398920) 』。今回は Lock のことを書く。

## Lock

- ReadableStream (以下 RS) / WritableStream (以下 WS) には Lock 状態がある
- RS / WS の Reader / Writer が確保されているとき、Lock される
- Lock されると、他の Reader / Writer は RS / WS を読み書きできない
- RS / WS の `get locked(): boolean` で Lock されているかを確認できる
- ぼくは Node.js Stream とは大きく異なる点だと思う
  - 比較は [stream between nodejs and whatwg](https://speakerdeck.com/jxck/stream-between-nodejs-and-whatwg) を参照

## RS の読み取り操作

- `pipeTo(writable: WS): Promise<void>` …… WS に pipe
- `pipeThrough(transform: TS): RS` …… TS に pipe
- `tee(): [RS, RS]` …… RS を分岐
- `getReader(): Reader` …… 上 3 つの内部から呼ばれる低レベルな操作

**すべての読み取り操作は `getReader()` につながる。そして `getReader()` は Lock を確保する。**

## Reader

- Reader は RS の internal queue を dequeue できるもの
- `getReader()` でその RS の Reader を確保できる
- ひとつの RS につき、同時にひとつの Reader しか確保できない
    - おそらく複数 Reader での読み込みによる漏れを防ぐため
- Reader を開放することで新たな Reader を確保できる
- ぼくは「 `getXXX()` が破壊的な操作ってどうなのよ」と思う

## WS / Writer

RS と同様。

# 参考

- [WHATWG Streams](https://streams.spec.whatwg.org/)
- [WHATWG Streams をためした](http://bouzuya.net/slides/2016-10-22/)
- [stream between nodejs and whatwg](https://speakerdeck.com/jxck/stream-between-nodejs-and-whatwg)
"Error: Cannot find module '../build/Release/bson'"について調べてみた

# はじめに

Node.js+MongoDBで開発するとよく見かける

`Error: Cannot find module '../build/Release/bson`

このエラー。
一瞬こけたかと思うと普通に動作するのでやり過ごしがちですが、気持ち悪いので調べてみました。

# StackOverFlowの記事
まず検索すると以下の記事にコードを書き換えちゃえと記載されていました。

[Cannot find module '../build/Release/bson' code: 'MODULE_NOT_FOUND'  js-bson: Failed to load c++ bson extension, using pure JS version](http://stackoverflow.com/questions/28651028/cannot-find-module-build-release-bson-code-module-not-found-js-bson)

node_modules\mongodb\node_modules\bson\ext\index.js
の以下の部分を

`bson = require('../build/Release/bson');`
から
`bson = require('../browser_build/bson');`
にしろと

# 実際にコードを確認
※私が確認したコードは若干上記記事と異なり
node_modules/mongoose/node_modules/bson/ext/index.js
mongooseのversionは3.8.35
になります

以下該当ファイルの20行目まで引用

```
var bson = null;

try {
	// Load the precompiled win32 binary
	if(process.platform == "win32" && process.arch == "x64") {
	  bson = require('./win32/x64/bson');  
	} else if(process.platform == "win32" && process.arch == "ia32") {
	  bson = require('./win32/ia32/bson');  
	} else {
	  bson = require('../build/Release/bson');  
	}	
} catch(err) {
	// Attempt to load the release bson version
	try {
		bson = require('../build/Release/bson');
	} catch (err) {
		console.dir(err)
		console.error("js-bson: Failed to load c++ bson extension, using pure JS version");
		bson = require('../lib/bson/bson');
	}
}
```

雑なまとめ方をすると第一希望のbsonを探すも、存在しないので補欠のbsonを使っているが、おそらく好ましくないので
ログレベルをエラーにして
`console.error("js-bson: Failed to load c++ bson extension, using pure JS version");'
該当メッセージの出力をしているように思える

# c++ bson　と pure JS versionの違いとは？

あれこれ検索しているとmongooseの以下のissueを発見

[js-bson: Failed to load c++ bson extension, using pure JS version #2285](https://github.com/Automattic/mongoose/issues/2285)

コミッターのvkarpov15氏によると

>
Yeah I've noticed this too. Your code will still work, just you may have worse performance. I'll fix this for next version.

動作はするけどパフォーマンスがよくないらしい。

また

>
"Fixing" this in general isn't really possible, because this error message can mean one of numerous things. It can mean that you don't have a proper version of python or a proper C++ compiler installed (because of node-gyp), it can mean that you switched versions of node from when you npm installed mongoose, etc.

とあり
node-gyp(Pythonを使ったビルドシステム）を動かすためのpython環境かC++のコンパイルに問題がありC++ bson parserが入らないのも原因の模様。

ただし

>
Upgrade to mongoose >= 4.0.6 so bson doesn't use C++ extensions anymore. Either way, this message is just a warning.

mongooseのバージョンをあげればそもそもこの問題も起きないようです。

実際

aventurellaという方が利用しているライブラリのpackage.jsonを

>
"mongoose": "~4.4.16",
"mongodb": "~2.1.18",

上記のように変更したところ
現象は解決したそうです。
私も試したところ同様でした。
（もちろんライブラリ自体が上記versionと互換性があるか確認する必要がありますが）

ちなみに
mongoose/mongodbのbsonを見て見たところ、bsonが0.2と古かったので
辻褄があいますね。


# 参考
[js-bson: Failed to load c++ bson extension, using pure JS versionの解決法](http://qiita.com/DQNEO/items/9ea16f42e09c91ae8e0f)
Qiita内で類似の事象についての記事です。
各種コマンド、メソッド名など覚える方法

## iterm2のバックグラウンドimageをつかう
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/f5a476c5-c80d-8d20-3064-13128f54f481.png)

### 設定
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/5f556dbf-7bf5-caba-9812-e9ad4d6d2047.png)

### tips
googleのimage検索で〇〇cheatsheetなんて検索すると沢山でてくる

(例
- [vim cheatsheet](https://www.google.co.jp/search?tbm=isch&q=vim+cheatsheet)
- [linux cheatsheet](https://www.google.co.jp/search?tbm=isch&q=linux+cheatsheet)
- [mac cheatsheet](https://www.google.co.jp/search?tbm=isch&q=mac+cheatsheet)
- [tmux cheatshhet](https://www.google.co.jp/search?tbm=isch&q=tmux+cheatsheet)
- [ruby cheatsheet](https://www.google.co.jp/search?tbm=isch&q=ruby+cheatsheet)
- [awk cheatsheet](https://www.google.co.jp/search?tbm=isch&q=awk+cheatsheet)
- [sed cheatsheet](https://www.google.co.jp/search?tbm=isch&q=sed+cheatsheet)

vimの例↓
[![image](https://qiita-image-store.s3.amazonaws.com/0/31015/7ef107ac-1914-ee92-eea8-ae82b304cfe0.png)]
(https://www.google.co.jp/search?tbm=isch&q=vim+cheatsheet)

## リマインダーを使う
[![image](https://qiita-image-store.s3.amazonaws.com/0/31015/6d48c96c-a8a9-d967-aa45-43f8739d7e3e.png)](https://itunes.apple.com/jp/app/due-rimainda-taima-aramu/id390017969?mt=8)

###設定
↑の[due](https://itunes.apple.com/jp/app/due-rimainda-taima-aramu/id390017969?mt=8)っていうリマインダーのiphoneアプリを使ってます。
（なんでもいいとおもいますが。）

覚えたいコマンドなどを設定しておき、最初は１日おき、覚えたら３日おき、覚えたら７日おき、１ヶ月おき、
的な感じで設定して、最終的に消すという感じです。
多すぎると意味が無いので、こちらはどうしても覚えられない、使用頻度が低いコマンドだけど覚えたい的なものでやっとります。

例) vimのコマンド
`:Codic 日本語`
↑で登録、通勤時間帯など、なにもしてなさそうな時に設定しておくam8:20とか。
yum > パッケージ(例:HDF5)のインストール先の表示 > yum -ql hdf5

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
```

NetCDF関連のソースからのインストールを実施中。

HDF5を使うので、HDF5がインストールされた場所の指定が必要。
HDF5はyumでインストールされている。

yum -qaではその場所は見つからず。

以下で関連ファイルの表示がされた。

```
# rpm -ql hdf5 | less
/usr/bin/gif2h5
/usr/bin/h52gif
/usr/bin/h5copy
/usr/bin/h5debug
/usr/bin/h5diff
/usr/bin/h5dump
/usr/bin/h5import
/usr/bin/h5jam
/usr/bin/h5ls
/usr/bin/h5mkgrp
/usr/bin/h5perf_serial
/usr/bin/h5repack
/usr/bin/h5repart
/usr/bin/h5stat
/usr/bin/h5unjam
/usr/lib64/libhdf5.so.6
/usr/lib64/libhdf5.so.6.0.4
/usr/lib64/libhdf5_cpp.so.6
/usr/lib64/libhdf5_cpp.so.6.0.4
/usr/lib64/libhdf5_fortran.so.6
/usr/lib64/libhdf5_hl.so.6
/usr/lib64/libhdf5_hl.so.6.0.4
/usr/lib64/libhdf5_hl_cpp.so.6
/usr/lib64/libhdf5_hl_cpp.so.6.0.4
/usr/lib64/libhdf5hl_fortran.so.6
/usr/lib64/libhdf5hl_fortran.so.6.0.4
/usr/share/doc/hdf5-1.8.5.patch1
/usr/share/doc/hdf5-1.8.5.patch1/COPYING
/usr/share/doc/hdf5-1.8.5.patch1/HISTORY-1_0-1_8_0_rc3.txt
/usr/share/doc/hdf5-1.8.5.patch1/HISTORY-1_8.txt
/usr/share/doc/hdf5-1.8.5.patch1/MANIFEST
/usr/share/doc/hdf5-1.8.5.patch1/README.txt
/usr/share/doc/hdf5-1.8.5.patch1/RELEASE.txt
```
Golangでエラー時にスタックトレースを表示する

Golangのerrorにはスタックトレース情報はない．基本は必要ないと思うし困ったこともない．一方で新しくプロジェクトに入りかつコードベースに慣れてない場合はどこが問題かアタリをつけるためにあっても良いとも思う．[pkg/errors](https://github.com/pkg/errors)を使ってるならそれはすぐに実現できる．

`pkg/errors`の基本的な考え方についてなどは GoCon 2016 springの後に ["Golangのエラー処理とpkg/error"](http://deeeet.com/writing/2016/04/25/go-pkg-errors/)にまとめた（作者のDaveのブログ記事は ["Don’t just check errors, handle them gracefully"](http://dave.cheney.net/2016/04/27/dont-just-check-errors-handle-them-gracefully)）．ここで強調して書いたのはちゃんとエラーをアノテートする（何をしてそのエラーが発生したかの状況を付加する）ことである．特に外部のパッケージとやり取りする場合，つまりまともなエラーメッセージが返ってこないかもしれない場合，`pkg/errors`の`Wrap`を使えば最終的に表示されるエラーが理解でないものになってしまうことを防ぐことができる．例えば以下のように使う．

```golang
f, err := os.Open(path)
if err != nil {
        return errors.Wrapf(err, "failed to open %q", path)
}
```

これだけではなく`pkg/errors`は`Wrap`や`New`を呼び出すときにそのファイル名と行といったトレース情報も一緒に記録する．もともとは`Print`や`Fprint`といった関数が提供されておりそれを使うとトレース情報が表示可能だったが 0.7.0後に削除された（経緯は["Stack traces and the errors package"](http://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package)が詳しい）．現在は https://golang.org/pkg/fmt/#Formatter を実装しているので `Sprintf`や`Printf`の verbで表示の切り替えができるようになっている．

例えば以下のように`%+v`を使えばスタックトレースを含めた表示が可能になる．

```golang
func main() {
    err := errors.New("error")
    err = errors.Wrap(err, "open failed")
    err = errors.Wrap(err, "read config failed")

    fmt.Printf("%+v\n”, err)
}
```

自分は普段は鬱陶しいので表示しない．`TRACE`環境変数を準備してそこに値がセットされていれば `%+v`で出力しそれ以外の場合は `%s` で通常の表示を行うようにしている．

ちなみにデバッグ情報は以下のような関数を準備して`DEBUG`環境変数で切り替えを行ったりすると便利．

```golang
func Debugf(format string, args ...interface{}) {
     if Debug {
         fmt.Fprintf(os.Stdout, "[DEBUG] "+format+"\n", args...)
     }
}
```
NetCDF > link > netcdf.inc > netcdf-fortran-4.2 が必要

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
```

netcdf-4.4.1.tar.gzをmakeでインストールした。

`netcdf.inc`も`netcdf.a`も見つからない。

`netcdf.inc`については以下が参考になる。
http://www.unidata.ucar.edu/support/help/MailArchives/netcdf/msg11504.html

> The netcdf.inc file is used for the netCDF Fortran-77 interface, but the netcdf-4.2.1.1 software you have installed is only for the netCDF C interface and utilities.  
To build and install the netCDF Fortran library, you should download the netcdf-fortran-4.2 distribution from

NetCDFでnetcdf.incを使うFortranプログラムを使う場合、以下の流れのようだ。

1. netcdfインストール (C関連)
2. netcdf-fortran インストール (Fortranライブラリ)

http://www.unidata.ucar.edu/software/netcdf/docs/building_netcdf_fortran.html
にも書いてあるが分かりにくい。

Fotranライブラリ
http://www.unidata.ucar.edu/downloads/netcdf/index.jsp
swift 中的 enum 和 struct


在`C`或者` Objective-C` 中我们经常会遇到` Enums` 和` Structs`, 如果你并不熟悉这些语言,也许就会对他们的作用产生疑问. 在` Swift` 中同样有这两种数据结构, 而且相比它的先辈, 它还具有新的功能特定.

#Enum

`enum` 或者说` enumeration` 就是一种数据类型. 它能够允许你定义一系列可能的 **值**, 你可以把它和 web 页面里经常用到的下拉框对比理解, 一个下拉框里的所有值都是可以让你选择的, 他们为什么会在一个下拉框里, 就是他们或多或少的存在一定的类似. 一个` enum` 允许你创建数据类型,他们具有一系列的值, 这样就可以在整个 app 里统一使用. 举个例子:

```
enum Type{
	case Friend
	case Family
	case Coworker
	case Other
}
```

上面我们定义了一个` enum`, 通过` case` 将很多值组织在一起.

实例化它:

```
var type = Type.Friend
```

在 swift 中` enum` 具有了更多的功能, 你可以添加一个初始化方法,或者一个方法来扩展其功能. 如果你并不像在实例化的时候指定某个值,就可以在初始化的方法里给它一个默认的值:


```

...

	init(){
		self = .Friend
	}
	
```

这个初始化方法可以让你指定一个默认值在每次初始化的时候.

#Struct

一个结构` Struct` 它可以让你创建一个结构化的数据类型, 它可以用来存储一组资源数据或者通过方法来扩展功能.

例如一个联系人的应用, 假如你想要一个数据类型来表述一个联系人. 这个联系人应该具有三个属性, 姓, 名还有类型. 这些属性就可以组成一个我们刚才说的` enum` 类型. 而对于一个` struct` 而言,它的属性就是作为特定的值来保存的. 我们看看其基本的语法:


```
struct Contact{
	var firstName: String
	var lastName: String
	var type: Type
}
```

这里编译器以及提供了一个默认的初始化方法,我们可以直接通过下面的方法来实例化一个` struct`:

```
var contact = Contact(firstName: "wade", lastName:"watts", type: Type.other)
```

`enum`和` struct` 类似都可以通过` init` 这个方法来作为初始化方法实例一个对象.

# 值类型

对于值类型和引用类型, 可能对于理解其他语言的你已经有所了解. 对于 `enum` 和` struct` 而言他们都是`值类型`.

```
var contact1 = Contact(firstName: "Wade", lastName: "Watts", type: Type.Other)

var contact2 = contact1

contact2.firstName = "Alan"

```

在上面的代码中, 当我们` copy` Contact1 到 Contact2, 然后修改Contact2的` firstName`, 它并不会修改 Contact1的 值,因为它是另外一个拷贝存在的.

more:

- https://itunes.apple.com/us/book/swift-programming-language/id881256329
【Objective-C】NSUserDefaultsのキー名をgetter / setterを使って利用する

コーディングの際にNSUserDefaultsで以下を定義すると、コードを打ち込む時にサジェストが表示されるため、キー名をわざわざ参照しにいかなくてよい。処理の実行効率は上がらないが、生産性を上げるのに役に足ちます。

定義する関数名をキー名にしておくとよりよいと思います。

定義側

```Configuration.h

#import <Foundation/Foundation.h>

@interface Configuration : NSObject

+ (void)setOriginationWithValue:(NSString *)value;
+ (NSString *)getOrigination;
+ (void)setDestinationWithValue:(NSString *)value;
+ (NSString *)getDestination


@end

```

```Comfiguration.m
#import "Configuration.h"

@implementation Configuration

+ (void)setOriginationWithValue:(NSString *)value
{
    // キー名をセッターで指定
    [[NSUserDefaults standardUserDefaults] setObject:value forKey:@"orignation"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

+ (NSString *)getOrigination
{
    // キー名をゲッターで指定
	return [[NSUserDefaults standardUserDefaults] objectForKey:@"orignation"];
}


+ (void)setDestinationWithValue:(NSString *)value
{
    // キー名をセッターで指定
    [[NSUserDefaults standardUserDefaults] setObject:value forKey:@"destination"]; 
    [[NSUserDefaults standardUserDefaults] synchronize];
}

+ (NSString *)getDestination
{
    // キー名をゲッターで指定
	return [[NSUserDefaults standardUserDefaults] objectForKey:@"destination"];
}

@end
```

呼び出し側

```ViewController.m

	/* 値を設定 */
	[Configuration setOriginationWithValue:@"someString"];
        [Configuration setDestinationWithValue:@"anyString"];

	/* 値を取得 */
	_originationStringLabel.text = [Configuration getOrigination];
	_DestinationStringLabel.text = [Configuration getDestination];

```
raspberry pi 1 model bで、node-red　その８

#概要
raspberry pi 1 model bの、node-redで、mqttでmythingsから、アクションを受けてみた。
#開発環境
raspberry pi 1 model b
raspbian 2016_09_23 jessie lite
#写真
![ras11.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/b177db46-07b7-5d3c-5ba8-29f8fccb0f54.jpeg)
#mythingsアプリ側設定
認証
yahooIdで、認証する。
サーバー認証
idcfに設置した、IPアドレスとownerトークンで認証する。
組み合せ作成
気温が２０度以下なら、IDCFで通知する。
手動実行
#mqtt設定
Server: hoge.jp-east.compute.idcfcloud.com
Topic: action-1 uuid

username: action-1 uuid
password: action-1 token
rbenv で Ruby 2.3.1 のインストールに失敗する問題

##環境
Windows 10 Pro
Cygwin 2.6.2

##エラー内容
```
$ rbenv install 2.3.1
Downloading ruby-2.3.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.bz2
Installing ruby-2.3.1...

BUILD FAILED (CYGWIN_NT-10.0-WOW 2.6.0(0.304/5/3) using ruby-build 20160913-13-g8ef0c34)

Inspect or clean up the working tree at /tmp/ruby-build.20161025102627.5176
Results logged to /tmp/ruby-build.20161025102627.5176.log

Last 10 log lines:
 ^
In file included from /usr/include/sys/reent.h:13:0,
                 from /usr/include/math.h:5,
                 from ./include/ruby/missing.h:23,
                 from ./missing/crypt.c:37:
/usr/include/sys/unistd.h:53:6: 備考: 前の ‘encrypt’ の宣言はここです
 void _EXFUN(encrypt, (char *__block, int __edflag));
      ^
make: *** [Makefile:376: crypt.o] エラー 1
make: *** 未完了のジョブを待っています....

```

##対処方法
setup-x86(setup-x86_64).exe から以下のパッケージをインストールする。
・ libcrypt-devel
・ libcrypt0

https://github.com/rvm/rvm/issues/3706
ある型が継承元クラスを持つかを判定する　メモ

■引数の型がUnityEngine.ScriptableObjectを持つか判定

```
public static void GetStringByClassType(System.Type type) 
{
    if(type.IsSubclassOf(typeof(UnityEngine.ScriptableObject)) == true)
    {
        UnityEngine.Debug.Log("**********************************************************");
    }
}
```
Docker runで起動したコンテナにすぐログインしたい(docker psとかコピペがめんどくさい)

Docker containerのデバッグ目的でbuild -> run -> exec -> stop -> build...を繰り返すことありますよね。
いちいちdocker psでrunしたContainer IDを確認するのがめんどい時用メモです。

```
bash
cd ${PATH to Dockerfile};pwd

export DREP=<<REPOSITORY_NAME>>
export DTAG=<<TAG>>
docker build . -t ${DREP}:${DTAG}
docker run -itd ${DREP}:${DTAG}
docker exec -it $(docker ps -lq) bash
docker stop $(docker ps -lq) &
```