OmniAICreator/Qiita-1.07M huggingface dataset:
データベースさわったこと無い新人向けトランザクション入門

最近DBを初歩から学び直しているのでその中でトランザクションとは何か、今一度改めて勉強したのでメモをここに残しておきます。

自分は就職して、仕事を始めてからDBを触り始めた。
DBを触るようになって基本的な構文とかはググりながらなんとか覚えたけど先輩とかが話をしている中でどうしても謎だったのが「コミット」「ロールバック」「トランザクション」だった。
「何を言っているんだろう？どういう意味!?」って感じで最初よくわかってないない状態だった。

そんな自分のような「コミット」「ロールバック」「トランザクション」を謎に感じている新人エンジニアにとって、この記事が参考になればと思います

## トランザクションとは？
トランザクションとは簡単にいえば「データベースに対して行われる1つ以上の更新処理」のこと。
トランザクションによってデータ更新処理の確定や取り消しを管理できる。便利。

## トランザクションの作成は？
トランザクションを使用する場合は開始文を最初に宣言してから、各SQL文を書きます。そして、処理の最後にそのトランザクションを確定、または取り消す終了文を書きます。

```mysql
START TRANSACTION;

UPDATE SAMPLE_TABLE
SET NAME = 'ABC'
WHERE ID = 1;

UPDATE SAMPLE_TABLE
SET NAME = 'EFG'
WHERE ID = 2;

COMMIT;
```

上の例では2つの更新処理をトランザクションで処理しています。
開始文は`START TRANSACTION;`であり、処理を確定させるために最後に`COMMIT;`を宣言しています。

### COMMIT
COMMITはトランザクションを確定させる処理です。
一度COMMITした結果は元に戻すことはできないので注意が必要です。
特にDELETE文などをCOMMITする場合、大切なデータを消去していないか確認したほうがよろしいと思います

### ROLLBACK
ROLLBACKはトランザクションを取り消す処理です。
ROLLBACKした場合、データベースはトランザクション開始前の状態に戻ります。

## ACID特性
トランザクションには4つの特性が標準規格によって決められています。
これらは「ACID特性」と呼ばれます。

### 原子性(Atomicity)
トランザクションが終わった時に、そこに含まれていた更新処理は全て実行されるか、全て実行されない状態で終わることを保証する性質。
COMMITで更新が確定されるか、ROLLBACKで元に戻されるかの二択というイメージです。

### 一貫性(Consistency)
トランザクションに含まれる処理はそれぞれの制約を満たすという性質。
トランザクションの途中で制約違反の処理があった場合、処理を中断してトランザクション実行前に戻すことでデータの一貫性が保たれる。そのため、あるデータは更新されているが、その他のデータは更新されないというような状態を持たないということ。

### 独立性(Isolation)
あるトランザクションが実行中の場合、もう一方のその他のトランザクションの影響を受けないという性質。
トランザクション実行中に、その他のトランザクションがデータの更新を行ったとしても実行中のトランザクションはその更新結果の影響を受けないというイメージ。

### 永続性(Durability)
トランザクションが完了した後、そのデータ状態が保存され失われることは無いという性質。
この性質の保証のために、一般的にはトランザクションのログを記録しておき、障害が起きた場合はログを使用して障害発生前の状態に復旧する。
オブジェクトストレージとファイルストレージの違い

■ オブジェクトストレージとファイルストレージの違い
ファイルとは読み書きができるものを抽象化した概念
オブジェクトストレージとはローカルのコンピュータに異なる記憶領域を用意してそこを使う感覚。


● オブジェクトストレージ
・直接読み書きできない
・HTTPSプロトコルでGETとしてローカルで落としてから編集する必要がある
・データを複製したり、分散保存しやすい
・ストレージの容量を増減させるのを効率的にしやすい
⇒ 堅牢性と拡張性に繋がる? 

![bucket.png](https://qiita-image-store.s3.amazonaws.com/0/105362/41cb9ffb-e37b-bf12-76ba-9afa4d76c290.png)


![folder.png](https://qiita-image-store.s3.amazonaws.com/0/105362/1466cba6-4127-a9a1-f8d2-7c96a82e3cfc.png)
Swiftを学ぶ：変数と定数

サイトなどで見るだけだったSwiftを学んでいこうと思います。
色々と書籍やサイトで情報が載ってますが
個人の覚書と復習を兼ねて書いていきます。

いいタイミングなのか
[Google、Android用開発言語として「Swift」への移行を検討中か？！](http://gori.me/google/google-news/85695)
学んでおいて損はないですね。

ちなみに私の開発環境は
　OS X Yosemite(バージョン 10.10.5)
　Xcode 7.2.1
です。
私は主にC言語とObjective-C（最近はこちらがメイン）を使用しております。

Swiftといえば「Optional型」の事とかありますが
まずは変数と定数

**変数定義：**「var」 値の変更が可能

` var hoge = 1 `
` hoge = 2 ←代入可能`

**定数定義：**「let」 値の変更不可 （定義後に代入するとエラーになる）

` let fuga = 2 `
` fuga = 3　←エラーになる`

勝手に値を設定しても型を自動的に判断してくれます。
` var hoge = 1 ←int型`
` var hoge2 = "ぬふふ" ←String型`

もちろん型設定することも可能です。
例：
` var nufufu: Double　←nufufuをDoubleで定義`

変数名を日本語で書けるとか（制限はあるようです）もっと他の書き方あるようですが
最小限の「var」「let」の事をざっくりと書きました。


最後に：
Swiftって文末に「;」（セミコロン）要らないのですね。
ズンドコキヨシ with socket.io

socket.io で作ってみました。
特別な事はしていません。

```
var app  = require('express')();
var http = require('http').Server(app);
var io   = require('socket.io')(http);

var messages = {
  0: 'ズン',
  1: 'ドコ',
  2: 'キ・ヨ・シ！',
};

var current  = [];
var expected = [0, 0, 0, 0, 1];

function zundoko(socket) {
  var rand = Math.floor(Math.random() * 2); // 0 or 1
  if (current.push(rand) > 5) {
     current.shift();
  }
  emit(socket, rand); // zun or doko ..

  // kiyoshi ?
  if (current.toString() == expected.toString()) {
    emit(socket, 2);
  }
}

function emit(socket, index) {
  socket.emit('message', messages[index]);
}

io.on('connection', function(socket) {
  setInterval(zundoko.bind(this, socket), 1500);
});

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/index.html');
});

http.listen(3050, function() {
  console.log('listening on *:3050');
});
```

ソースは、
https://github.com/nilesflow/zundoko-socket.io
SMTPサーバをSendGridに移行した際の色々


自社SMTPサーバをSendGridに置き換えた後、経過観察を行っていましたが、その中で出てきた傾向をツラツラと記載します。

# NDR（配信不能レポート）が返ってくるもの

SendGrid移行に伴い数字上の到達率は十分な数値（99%以上）が出ている為大凡満足なのですが、やはり届かないタイプのメールは気になります。
ざっくりとNDR（SendGridポータルサイトにてStatsを見た際のBounce, Block判定となる）メールには傾向があり、下記のような状態でした。

## 携帯キャリア

docomo, au, softbank系の各携帯キャリアメール（特にdocomo）がBounce率トップです。
これらのメールの厄介な点は、キャリア側でブロックされていた場合も「550 Unknown User」でステータスが帰って来る事がある為、ブロックされているものとメールアドレス自体に問題があるもの（存在しないメールアドレス等）の見分けが付かない点があります。

docomo系キャリアメールが届かない理由としては、受信拒否設定で携帯以外からのメールがブロックする機能があるからと推測されます。
これらの受信者へ確実に届けたい場合は、受信者側でセーフリストへ送信アドレス/ドメインを登録して頂くしかありません。
また、typo防止としては地味且つ昔ながらのメールの確認入力は効果があります。

## Microsoft系

Exchange Online, hotmail, Office365といったMicrosoft系が次点で続きます。
Microsoft独自のメールチェック基準は不明点が多く、率直な感想としては届き辛いという印象です。
これらのメールはブロックが発生した場合、NDRが届きますが、それに対して解除申請を行わなければ状況が改善しません。
移行後に起きやすいことではありますので、移行から数週間はある程度マメにチェックしておいた方が良いでしょう。

# NDR（配信不能レポート）が返ってこないもの

SendGrid上のActivityではSuccess判定となっているものの、受信者側から届いてないとの報告があるタイプのものです。
これは受信サーバ側の受け取り自体は成功しているものの、スパムフィルタリングにより迷惑メールボックスへの移動、もしくは駆除されている状態となります。

こちらに関しては現状発生している受信者側としてはExchange Online, Office365が大半を占めます。
SPF, DKIM設定やブラックリストへの登録が行われていないかの確認、メール文面のスパムチェック等、色々と試しましたが、現状決め手となる解決策は見つかっていません。

Microsoftへ問い合わせも行いましたが、特に問題となるようなものは先方でも見受けられずとの事で、各会社毎のフィルタリング設定によるものではないかとのお話。
スパムフィルタリングの仕様に関しては（当然ながら）非公開の為、結局セーフリストへの登録をご案内するしかないという決着と至りました。

うーん、モヤモヤ感・・・

# まとめ

* 携帯キャリアメールとMicrosoft系は独自のチェック基準が強い
* メールが確実に届く事を保証するにはセーフリストへの登録を促すしかない（身も蓋も無い・・・）
* メールの到達率という観点でいうとメールアドレスの確認入力はtypoを結構減らす
Hyper-V上にArch LinuxでX Window Systemを使う時に入れるドライバ

#[Hyper-V - ArchWiki](https://wiki.archlinux.org/index.php/Hyper-V)
下の方に書いてあった
>
Xorg
Graphical programs can easily be run via Xorg via the **xf86-video-fbdev** package. Simply install it and the window manager or desktop environment you wish to use, and you should be able to start X without issue. 

書いてあるとおりに大人しく

```
#   pacman -S xf86-video-fbdev
```
と打ち込みドライバをインストール。
[C++] Why virtual destructors

To explain the difference of virtual destructor and normal destructor, look at this two examples.

#### Normal Destructor

**Code**

```cpp
class Enemy {
public:
    ~Enemy() { cout << "Enemy Destructor." << endl; }
};

class EnemyBoss : public Enemy {
public:
    ~EnemyBoss() { cout << "Enemy Boss Destructor." << endl; }
};

int main() {
    Enemy *e = new EnemyBoss();
    delete e; // Destroy the object
    return 0;
}
```

**Output**

```
Enemy Destructor.
```

#### Virtual destructor.

**Code**

```cpp
class Enemy {
public:
    virtual ~Enemy() { cout << "Enemy Destructor." << endl; }
};

class EnemyBoss : public Enemy {
public:
    ~EnemyBoss() { cout << "Enemy Boss Destructor." << endl; }
};

int main() {
    Enemy *e = new EnemyBoss();
    delete e;
    return 0;
}
```

**Output**

```
Enemy Boss Destructor.
Enemy Destructor.
```

#### Conclusion

The virtual destructor is very useful when delete a instance of a derived class through the pointer of parent class.

When delete a instance of a derived class through the pointer of parent class, the virtual destructor will call the parent destructor, but the non-virtual destructor will not call the parent destructor. Therefore the second situation may potentially have the problem of memory leak.
自作ライブラリをpipでインストールするまで手順

# 【注意】 本記事は古いです

本記事の情報は古くなっており現在では利用できないコマンドがいくつかあります。(2018年2月4日現在)

以下の記事を参考にしていただくことを推奨します。

> [Pythonで作成したライブラリを、PyPIに公開/アップロードする](https://qiita.com/icoxfog417/items/edba14600323df6bf5e0)

# はじめに

初めてPyPIにライブラリを登録した。
ので
やったこと、勉強したことをまとめます。

## 参考にしたサイト
* [【公式ドキュメント】Packaging and Distributing Projects](https://packaging.python.org/en/latest/distributing/)
* [Pythonの自作モジュールをパッケージ化し、pip installできるようにするまで](http://blog.akihiko.me/2015/04/05/pypi-packaging/)

### 公式のsetuptoolsの使い方サンプルレポジトリ
[サンプルレポジトリ](https://github.com/pypa/sampleproject)

### settools使い方基本
setup.pyにパッケージ情報を書く
`$ python setup.py sdist`->ソースパッケージ作成
`$ python setup.py install`->パッケージインストール

### 一般的な配布するまでのコマンド
PyPIアカウントを作成→[PyPy User profile](https://pypi.python.org/pypi?%3Aaction=register_form)
`$ python setup.py test`
`$ python setup.py register`
`$ python setup.py sdist bdist_egg upload`
`$ python setup.py upload_docs`

### 必要最小？？？
PyPIアカウントを作成→[PyPy User profile](https://pypi.python.org/pypi?%3Aaction=register_form)
```
$ python setup.py register
$ python setup.py sdist upload
```

### 更新するとき
setup.pyのversionを変更して
`$ python setup.py sdist upload`


## setup()関数の引数の意味
* **name**
  * PyPI上で示されるプロジェクト名
* **version**
  * バージョン
* description
  * プロジェクトの簡単な概要。PyPIにて示される
* url
  * プロジェクトのホームページ
* authorとauthor_email
  * 製作者について
* license
  * ライセンスのタイプ
* classifiers
  * プロジェクトのカテゴライズのリスト
* keywords
  * プロジェクトのキーワード
* **pakages**
  * 本プロジェクトで必要なパッケージのリスト。パッケージとはディレクトリ
  * `simpleapi`というディレクトリ以下にものをつくったならば、
  * `packages=['simpleapi']`となる
  * また、`from setuptools import setup, find_packages`として
  * `packages=find_packages(excluede['contrib', 'docs', tests*])`
  * とできる
  * ※ excludeは対象以下のディレクトリは除くということ
* **install_requires**
  * 依存するパッケージ(事前にpipしておく必要があるもの)
* package_data
  * 追加としてプロジェクトに必要となるパッケージ
  * 詳細はまた後日調べて書きたい
* data_files
  * さらに追加で必要となるファイル
* script
  * インストール時に実行するスクリプト
* entry_points
  * よくわからない。後日調べて書きたい
* console_scripts
  * よくわからない。後日調べて書きたい
RubyのBenchmarkモジュールを使って、sleepメソッドが効いているか確認してみる。


open-uriとnokogiriを使ってホテル予約サイトをスクレイピングしているが、sleepメソッドがきちんと効いているか気になったので、Benchmarkモジュールを使って計測してみた。
## 方法
sleepメソッドを含むメソッドと含まないメソッドを2種類作る。
## コード
```rb
Benchmark.bm(15) do |x| #sleepありの詳細ページ情報メソッド
  x.report "hotel_infor" do
    push_hotel_information_detail(row)
  end
end
Benchmark.bm(15) do |x|#sleep無しの詳細ページ情報メソッド
  x.report "hotel_infor_no" do
    push_hotel_information_detail_no_sleep(row)
  end
end
```
処理はホテル予約サイトの情報を取得して配列に入れいている。
## 結果
```ruby
                      user     system      total        real
hotel_infor       0.150000   0.010000   0.160000 (  4.790870)
                      user     system      total        real
hotel_infor_no    0.170000   0.000000   0.170000 (  1.675842)
``` 
わかりやすく3秒スリープを入れてみたが、動作を確認できた。

参考記事
[Rubyでベンチマークをとる](http://blog.ruedap.com/2011/01/20/ruby-benchmark-faster-csv)
Bootstrap2とBootstrap3でよく使う要素の比較（デザイン部分）

Webページを作る上で、Bootstrapを利用すれば綺麗で統一されたデザインを実現できると思います。現在、安定版は2、3がありますが、どちらを利用するのかいつも公式のサンプルページを巡回しています。その時間を少しでも短縮するため、v2とv3における、自身がよく利用する要素をまとめておきます。

**バージョン**
v2 Version 2.3.2
v3 Version 3.3.6
(latest version of 2016/04/10）

[Bootstrap2サンプル](http://kaikusakari.github.io/Bootstrap2.html)
[Bootstrap3サンプル](http://kaikusakari.github.io/Bootstrap3.html)

v3はフラットデザイン版を表示しました。比較してみるとHX要素も微妙に異なり、また、各機能や命名規則、コーディングルールなどを見ると、開発・公開された時のインターネット開発における流行や標準が色濃く出ていることが読み取れますね。
JRuby で開発している時に vim を開くと遅いよねという話

vim-bundler, vim-rails, vim-rake, vim-ruby プラグインなどで ruby コマンドを実行していて、.ruby-version に jruby が指定されていると、jruby が実行されることになるので遅い。jruby の立ち上がりに3秒ぐらいかかる

# 該当箇所

## vim-bundler

```
vim-bundler/plugin/bundler.vim
337:        let gem_paths = split(system(prefix.'ruby -rubygems -e '.s:shellesc('print Gem.path.join(%(;))')), ';')
340:      let abi_version = system('ruby -rrbconfig -e '.s:shellesc('print RbConfig::CONFIG["ruby_version"]'))
```

## vim-rails

```
vim-rails/autoload/rails.vim
1838:        call system("ruby -e 'Process.kill(:TERM,".pid.")'")
1841:      call system("ruby -e 'Process.kill(9,".pid.")'")
4043:  let json = system('ruby -e '.s:rquote('require %{yaml}; require %{json}; File.open(%q{'.a:file.'}) {|f| puts JSON.generate(YAML::load(f))}'))
```

## vim-rake

```
vim-rake/plugin/rake.vim
217:      let self._ruby_include_path = system('ruby -rrbconfig -e "print RbConfig::CONFIG[\"rubyhdrdir\"] || RbConfig::CONFIG[\"topdir\"]"')
```

## vim-ruby

```
78:    let path_check = prefix.'ruby -e "' . code . '"'
80:    let path_check = prefix."ruby -e '" . code . "'"
```

# 対応方法

## (0) vimrc で `let g:ruby_path = ""` のように cruby のパスを指定する

これは、この変数も見てくれないプラグインもあってダメだった。

## (1) .ruby-version を変える

rbenv shell で cruby を指定してから vim を開けば良い。

いや、それはそうなんだが、辛い。

## (2) vim プラグインの ruby パスを書き換える

(0) で述べたように、変数でパスを変えられなさそうなので、直接プラグインを改変する。
`/usr/bin/ruby` とシステム ruby を使うように書き換えてしまえば速くなる。

これは辛い。

## (3) vim 起動時に PATH を変える

/usr/bin を優先にして vim を起動すれば、システム ruby が使われるので速くなる。

```
env PATH=/usr/bin:$PATH vim foo.rb
```

のように。alias しておくとこう。

```
alias vim='env PATH=/usr/bin:$PATH \vim'
```

# まとめ

とりあえず (3) でやってるけど、もっと上手い方法あれば welcome
RxSwiftで簡単にデザインモックを作成する

#タイムラインのデザインモックをRxSwiftで簡単に作ってみた
Facebook-LikeなタイムラインをRxSwiftを使って作ってみた⇨[レポジトリーはここ](https://github.com/Ryochan/Rx-easy-design-mock)

<img width="375" alt="Screen Shot 2016-04-11 at 12.21.21 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/80383/87f7426b-5985-fd63-e117-b4bad375cc77.png">


##`struct`でモデルを作成

```swift:Timeline
struct Timeline {
    let name: String
    let profileImage: UIImage
    let bodyContent: String
}
```
`struct`を使う場面
1. 少ないデータを１つのカプセルとして保有したい時
2. 参照してデータを渡すより、値をコピーして渡したい時
3. 継承する必要がない場合

##購読可能な値を作る
```swift:viewController
override func viewDidLoad() {
        super.viewDidLoad()
        
        let elements = Driver.just([
            Timeline(name: "yuzushioh", profileImage: UIImage(named: "")!, bodyContent: ""),
            Timeline(name: "yuzushioh", profileImage: UIImage(named: "")!, bodyContent: ""),
            Timeline(name: "yuzushioh", profileImage: UIImage(named: "")!, bodyContent: ""),
            ....
        ])
}
```
前回の[Driverの記事](http://qiita.com/yuzushioh/items/0a4483502c5c8569790a)でも述べたように`Observable.just()`の代わりにUIに特化した`Driver.just`を使います。これで`[Timeline]`のストリームを作成しました。

##`TableView`につなぎこむ
```swift:viewController
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let elements = Driver.just([
             ....
        ])
        
        elements.asDriver()
            .drive(tableView.rx_itemsWithCellIdentifier("Cell", cellType: TableViewCell.self)) { _, timeline, cell in
                cell.timeline = timeline
            }
            .addDisposableTo(disposeBag)
    }
```

`Drive.just`で作ったストリームをUIに特化されている`Drive`を使って`tableView`にバインドします！

```swift:tableView
       .drive(tableView.rx_itemsWithCellIdentifier("Cell", cellType: TableViewCell.self)) { _, timeline, cell in
                cell.timeline = timeline
            }
```
上記のコードで

```swift:tableView 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! UITableViewCell
        
        ...
        
        return cell
    }
```
と同じ事ができるだけでなくitemの数をなどを自動で反映してくれるのでとても便利です！

##完成

今回はモックのデータを`Driver.just()`で作成してそれを`tableView`に`Drive`してタイムラインを実装するところまでしか行っていませんがRxには以下のようにtapしたrowのmodelを取得するメソッドも用意されているので画面遷移も簡単に作成できます！

```swift:tableView
tableView.rx_modelSelected(Timeline)
            .subscribeNext { timeline in
                ...
            }
            .addDisposableTo(disposeBag)
```
Unityでノードベースなウィンドウを簡単に作る為の「Simple node editor」の紹介


# 概要
Animator ControllerとかBehavior Designerのようにノードを作る為のFrameworkを探していたらSimpleNodeEditorを見つけたので紹介します。

[Simple Node Editor](https://github.com/Baste-RainGames/Node_Editor)

このFrameWorkには下記のようなノードエディタの為の基本的な機能が揃っています。
1. ノード作成
2. ノード同士の接続
3. ノードのSave,Load
4. ランタイム実行

また、FrameworkのNodeクラスをオーバーライドしてカスタマイズすれば、Behavior Designerのみたいな自前のAIノードエディタを作ることもできます。
[Behaviour Designer](https://www.assetstore.unity3d.com/jp/#!/content/15277)

自分は実際にこのフレームワークを拡張して、自前でBehavior Designerのようなツールを比較的簡単に作成する事が出来ました。そのツールの紹介は次回に行うとして今回は、このフレームワークの使い方の紹介をします。

## 導入方法
githabのプロジェクト一式をクローンします。
https://github.com/Baste-RainGames/Node_Editor

適当なUnityプロジェクトを作成して、Assetsディレクトリ以下にクローンしたプロジェクトを突っ込み、Unityを立ち上げます。
「Window」の一覧に「Node　Editor」が追加されているので、ここからNodeEditorWindowを開きます。
「Load Canvas」でCaluculation Canvas.assetをロードすると、下記のようなノードが表示されます。とりあえずここまで出来れば導入は完了です。

![alt](https://camo.githubusercontent.com/0871df2aa2fc458e93f8c85c3b9266e25e99bf3a/687474703a2f2f692e696d6775722e636f6d2f493372446437592e6a7067)

## プロジェクト構成の説明
重要なクラスを掻い摘んで説明します。

Editor/NodeEditorフォルダ

- NodeEditorWindow.cs
 - TOPのクラスです。 
- Resources/
 - cashファイルを管理するフォルダです。

Node_Editor/Frameworkフォルダ

- Node.cs
 - 各ノードが継承する規定クラスです。独自機能のノードクラスを作成したい場合はこのクラスを継承して作成します。 
- Node/
 - サンプルプロジェクトで使われている各個別のノードクラスが入っています。Node.csを継承して如何に独自ノードを作るのかの参考になります。

Node_Editor/Resources/Saves/フォルダ

- ノードの保存ファイルが管理されています。保存ファイルはScriptableObjectとなります。

Node_Editor/フォルダ

- RuntimeNodeEditor.cs
 -  EditorWindowではなく、Gameビューにノードエディターを表示できます。GameObjectにアタッチして使用します。Game実行中のスクリプトとノードエディタとの連携をとりたい時に利用します。

## 使用時の注意点
このフレームワークはとてもよくできていますが、まだ開発途中段階のためか幾つかのバグがみられます。実際に、自分もフレームワークを使っていく中でバグ修正を行ってプルリクを出したものもありました。
ただ、こちらの問いかけに対する作者の人の反応も結構早いので、気になる点があればUnityのフォーラムや、github上のissuesに投稿するといいと思います。

Unityフォーラム
http://forum.unity3d.com/threads/simple-node-editor.189230/page-10
SharePoint「吹き出しUI」リソース集

Callout.js にまつわる「吹き出しコントロール」についてのリソース集


# MSDN（公式）

吹き出しコントロールを使用してコンテンツを強調表示し SharePoint ホスト型の SharePoint アドインの機能を強化する
https://msdn.microsoft.com/ja-jp/library/office/dn135236.aspx


# 吹き出しコントロールにカスタムアクションを追加する２段技

Adding a custom action to a callout in SharePoint 2013
http://www.eliostruyf.com/adding-a-custom-action-to-a-callout-in-sharepoint-2013/

# Callout コントロールに取りつかれた変態さんによる基本から応用ソリューションまで

The new Hover Over\Preview\Callout Popups in SharePoint 2013
http://www.learningsharepoint.com/2012/12/30/the-new-hover-overpreviewcallout-popups-in-sharepoint-2013/

Create CalloutActions in Hover Over\Callout Popups in SharePoint 2013
http://www.learningsharepoint.com/2013/01/02/create-calloutactions-in-hover-overcallout-popups-in-sharepoint-2013/

Working with CallOut Popups in SharePoint 2013
http://www.learningsharepoint.com/2013/05/03/working-with-callout-popups-in-sharepoint-2013/

SharePoint 2013 CallOut Popup Tutorial
http://www.learningsharepoint.com/2013/05/09/sharepoint-2013-callout-popup-tutorial/

Disable CallOut Popup for a Field or Column in SharePoint 2013 List
http://www.learningsharepoint.com/2013/05/13/disable-callout-popup-for-a-field-or-column-in-sharepoint-2013-list/

Hide CallOuts in a SharePoint 2013 Task List
http://www.learningsharepoint.com/2013/05/18/hide-callouts-in-a-sharepoint-2013-task-list/

Display Item Details in a CallOut on Hover Over of Item Title in SharePoint 2013
http://www.learningsharepoint.com/2013/05/30/display-item-details-in-a-callout-on-hover-over-of-item-title-in-sharepoint-2013/

Create a Quick Contact Us or FeedBack Form in SharePoint 2013 (using CallOuts)
http://www.learningsharepoint.com/2013/06/30/create-a-quick-contact-us-or-feedback-form-in-sharepoint-2013-using-callouts/

Hide,Remove,Customize CallOut Actions in SharePoint 2013
http://www.learningsharepoint.com/2013/07/08/hideremovecustomize-callout-actions-in-sharepoint-2013/
AWS NATサーバにtcpdumpをインストールする

はじめに
---

AWSのNATサーバに対して、tcpdumpコマンド(ネットワークトラヒックの内容をキャプチャするコマンド)をインストールする例です。

AWSのNATサーバ(NATインスタンス)自体の詳細については、以下をご参照下さい。
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html

NATサーバインスタンス作成時に使用したAMI
---

AWSのNATサーバ用EC2インスタンス作成時に使用したAMIは以下になります。
コミュニティAMIに登録されている以下のAMIを使用しました。

　・amzn-ami-vpc-nat-hvm-2015.03.0.x86_64-gp2 - ami-03cf3903

NATサーバインスタンスにtcpdumpコマンドをインストールする
---

AWSのpublicサブネットに作成したNATサーバインスタンスに対して、ec2-userユーザでsshログインします。

rootユーザにスイッチして、yumパッケージをアップデートします。

```bash:yumのupdate
[ec2-user@example-test-vpc-nat-server-1a ~]$ sudo su -
[root@example-test-vpc-nat-server-1a ~]# yum -y update
```

yumでtcpdumpをインストールします。

```bash:yumでtcpdumpインストール
[root@example-test-vpc-nat-server-1a ~]# yum -y install tcpdump
　(中略)

Installed:
  tcpdump.x86_64 14:4.0.0-3.20090921gitdf3cb4.2.10.amzn1

Dependency Installed:
  libpcap.x86_64 14:1.4.0-1.20130826git2dbcaa1.10.amzn1

Complete!
[root@example-test-vpc-nat-server-1a ~]#

[root@example-test-vpc-nat-server-1a ~]# ll /usr/sbin/tcpdump
-rwxr-xr-x 1 root root 731984 Jul  3  2015 /usr/sbin/tcpdump
[root@example-test-vpc-nat-server-1a ~]#
```

tcpdumpコマンドによりNATサーバを流れるパケットを確認する例
===

以下はNATサーバインスタンスに流れるHTTP通信のパケットを確認する例です。

NATサーバインスタンスでtcpdumpコマンドを実行します。

```bash:tcpdump実行
[root@example-test-vpc-nat-server-1a ~]# tcpdump -vv port 80 -i eth0
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
```

例えば、AWSのprivateサブネットのEC2インスタンス(例示用IPアドレス:192.0.2.10)でcurlコマンドを実行し、NATサーバインスタンス経由でインターネットへHTTPアクセスします。

```bash:curl実行
[ec2-user@example-server ~]$ /sbin/ifconfig eth0 | grep "inet addr"
          inet addr:192.0.2.10  Bcast:192.168.2.255  Mask:255.255.255.0
[ec2-user@example-server ~]$

[ec2-user@example-server ~]$ curl http://httpbin.org/ip
{
  "origin": "XXX.XXX.XXX.XXX"
}
[ec2-user@example-server ~]$
```

NATサーバインスタンスのtcpdumpコマンドの実行結果に、EC2インスタンス(例示用IPアドレス:192.0.2.10)からインターネットへのHTTPアクセスのパケットが表示されます。

tcpdumpコマンドを利用する事で、NATサーバインスタンスに流れるパケットの内容を確認する事が出来ます。

```bash:tcpdump実行結果
[root@example-test-vpc-nat-server-1a ~]# tcpdump -vv port 80 -i eth0
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

　(中略)

23:35:47.772379 IP (tos 0x0, ttl 255, id 54408, offset 0, flags [DF], proto TCP (6), length 52)
    192.0.2.10.56356 > ec2-XXX-XXX-XXX-XXX.compute-1.amazonaws.com.http: Flags [.], cksum 0x2ba6 (correct), seq 79, ack 253, win 219, options [nop,nop,TS val 1077401 ecr 2983137694], length 0
```

***

以上になります。
Bash on Ubuntu on Windowsをインストールしてみる（Windows 10 build 14316）

# 注意

この記事は2016年4月6日公開のbuild 14316環境の話になります。
build 14316は現時点（2016年4月10日）では"Fast Ring"での公開ですので、不具合を含んでいる可能性があります。インストールは自己責任でお願いします。

# インストール方法

1.「スタートメニュー」→「設定」→「更新とセキュリティ」→「Windows Update」→「更新プログラムのチェック」を選択してWindows Updateをしておきます。

![Windows_1.png](https://qiita-image-store.s3.amazonaws.com/0/120915/2a0b85f4-7093-036a-fa94-a97961046b7c.png)

![Windows_2.png](https://qiita-image-store.s3.amazonaws.com/0/120915/15905d37-9fec-aba5-0bdd-4a26522f5576.png)

![Windows_3.png](https://qiita-image-store.s3.amazonaws.com/0/120915/76e7e62b-8031-6d86-9f1d-d4d5dfa5d57f.png)

2.Windows Updateの詳細オプションで「Insider Previewビルドの入手」を開始します。

![Windows_3 2.png](https://qiita-image-store.s3.amazonaws.com/0/120915/3a3f6521-b3f6-8481-dfc0-d5445f8684bf.png)

![Windows_4.png](https://qiita-image-store.s3.amazonaws.com/0/120915/9ed6a821-ac7b-63b0-bb25-9dc3f080abd2.png)

「開始する」を選ぶと、Insiderに登録済みか聞かれMicrosoftアカウントを求められます。（私は登録していなかったので、画面に従って登録しました）

3.再起動を求められるため再起動します。

4.Windows Updateの詳細オプションの「Insider Previewビルドの入手」の設定でInsiderのレベルを「ファースト」にします。

5.1日〜2日ほど待つとWindows UpdateでInsider Preview 14316がインストールできるようになるので1日〜2日ほど待ってWindows Updateをします。

![Windows.5.png](https://qiita-image-store.s3.amazonaws.com/0/120915/471d3bba-30d1-f72c-4e9e-3dac10b12827.png)

6.再起動を求められるため再起動します。

7.「スタートメニュー」→「設定」→「更新とセキュリティ」→「開発者向け」を選択し、"開発者モード"を選択する。

![Windows_6.png](https://qiita-image-store.s3.amazonaws.com/0/120915/3f91e5b5-2ec2-1ffe-ad92-70fc927405ed.png)

8.bashを使用するために「スタートメニュー」右クリック→「プログラムと機能」→「Windowsの機能の有効化または無効化」から「Windows Subsystem for Linux(Beta)」の機能を有効にします。

![Windows_7.png](https://qiita-image-store.s3.amazonaws.com/0/120915/61c91b29-7d8c-6e76-fb74-5cbfe0733769.png)

9.再起動を求められるため再起動します。

10.コマンドプロンプトを開いて、bash実行すると、インストールされます。

![Windows.8.png](https://qiita-image-store.s3.amazonaws.com/0/120915/6777cf86-7720-759f-5ff7-e15fe8780ba8.png)

以上！

# 参考サイト

* [Windows10 で「Insider ビルドの入手」を有効にしてみました。 - 私のPC自作部屋](http://blog.goo.ne.jp/hiros-pc/e/8708e3505048a6e46202bb0e95be2057)
* [Bashコマンドが打てるWindows 10最新ビルドが公開 ～Cortana/EdgeなどBuild 14316は改良点多数 - PC Watch](http://pc.watch.impress.co.jp/docs/news/20160407_752087.html)
* [windowsのbashでRails環境を構築してみる。（Windows 10 Insider Preview 14316） - Qiita](http://qiita.com/chimame/items/3787a59eca1005b89eac)
* [Change to the 'Fast Ring' for more frequent Windows 10 updates - CNET](http://www.cnet.com/how-to/change-to-the-fast-ring-for-more-frequent-windows-10-preview-updates/)
Cake Recipe

開発用のリファレンス兼アウトプット学習のためにCakePHPのコードをメモ。


## Model
path : app/Model/*.php
### 命名規則
### code
```
class Model extends AppModel {
}
```



## View
* Path app/View/*folder*/*.ctp
* Layout
### 命名規則
### code
```
```



## Controller
* Path : app/Controller/*ModelsController*.php

### 命名規則
### code
```
class ModelsController extends AppController {
  public ;

  public function method ($param) { // url is '/method/param'
    $this->autoRender = false // If not need to render
    $this->Model->find();
    if ($this->request->is('post')) {} // 'get', 'ajax'
    $this->set('variable', $variable);
    $this->set(['key'=>hash]);
    $this->render(*templateFileName*); // Not include file extra
    $this->redirect();
  }

  todo: CRUDシーケンス
  public function add() {}
  public function edit() {}
  public function delete() {
    $this->Model->delete($id);
  }
}
```

## Routing
### code
```
```

## Helper
### code
```
```

## Behavior
### code
```
```

## Component
### code
```
```

## DB

## Migration

## Cache
Path : app/tmp/cache/*
DB関連でハマったらファイル`rm app/tmp/cache/*`

## Log 
Path : app/tmp/logs/debug.log or error.log
logging : `$this->log('log', *output*);`

## Hook
* beforeFilter
* beforeRender
* afterFilter

## How to ajax
### server code
```
class ModelsController extends AppController {
  functiono method() {
    $this->autoRender = false;
    return response;
  }
}
```

### client code 
```
$.ajax({
  url:/*Controller*/method,
  type:'POST',
  data: {key:value,...},
  dataType:'json',
})
.done(function(response){})
.fail(function(){});
```


## Workflow
* UI
* DB
* Model
* View
* Controller
* Coding
* Test
* Pull Requset
* Review


## 参考文献
* http://book.cakephp.org/2.0/ja/contents.html
python3のPYTHONPATHにpython2.7のsite-packagesが紛れ込んでいた事件


### 原因

```
/Users/ユーザー名/.local/lib/python3.5/site-packages/homebrew.pth
```

内に
```
import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")
```
と，python2.7のsite-packagesが入っていた。
そのため，python3スクリプト内で一部ライブラリをimportしようとした際にpython2.7版がインポートされようとし，エラーが出ていた。

### 対処
```
import site; site.addsitedir("/usr/local/lib/python3.5/site-packages")
```
と書き換える。
LINE BOT APIで今日のランチを検索する

LINE BOT APIが公開されたのでこれは遊ぶしかない！ということで作ってみました。

**位置情報を送るとその住所周辺のランチを検索して送ってくれるボット**

<img width="320" alt="IMG_4425.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/14172/48ce0e8b-5086-a844-d567-60b2017b7545.jpeg">

LINE BOT APIの基本的な使い方は既に色々な方が書かれているのでそちらにお任せして、ざっくりと書いてきます。
登録ができれば以下が取得出来ると思います。
・Channel ID
・Channel Secret
・MID

まずは検索するためにGoogle Custom Search API を使用するのでそちらの準備をします。
[こちら](http://qiita.com/megu_ma/items/8cad39f61e35588e5476)と[こちら](http://ryutamaki.hatenablog.com/entry/2014/01/18/171640)を参考にさせて頂きました。
ここで以下の２つを取得します。
・GoogleAPIキー
・検索エンジンID

次に上記で取得したAPIキー等を以下のコードの各所に当て込んでコールバックで動かせば完成です。
※HTTPクライアントとしてGuzzleHttp\Clientを使用しているので`composer require guzzlehttp/guzzle`してください。

```php
<?php
require_once __DIR__ . '/./vendor/autoload.php';

try {
    $req = file_get_contents('php://input');
    $req = json_decode($req);
    $link = getLink($req);
    $to = $req->{"result"}[0]->{"content"}->{"from"};
    file_put_contents('tmp/req', $to, FILE_APPEND);

    $client = new \GuzzleHttp\Client();
    $client->post('https://trialbot-api.line.me/v1/events', [
        'headers' => [
            'Content-Type' => 'application/json; charset=UTF-8',
            'X-Line-ChannelID' => '[Channel ID]',
            'X-Line-ChannelSecret' => '[Channel Secret]',
            'X-Line-Trusted-User-With-ACL' => '[MID]',
        ],
        'body' => json_encode([
            'to' => [$to],
            'toChannel' => '1383378250',
            'eventType' => '138311608800106203',
            'content' => [
                "contentType" => 1,
                "toType" => 1,
                'text' => $link
            ]
        ])
    ]);
} catch (Exception $e) {
    file_put_contents('tmp/error', $e->getMessage(), FILE_APPEND);
}

function getLink($post_data)
{
    try {
        $address = mb_substr($post_data->result[0]->content->location->address, 11);
        preg_match('/([\x{3005}\x{3007}\x{303b}\x{3400}-\x{9FFF}\x{F900}-\x{FAFF}\x{20000}-\x{2FFFF}]*)/u', $address, $matches);
        $q = urlencode($matches[1] . ' ランチ');

        file_put_contents('tmp/req', $matches[1] . ' ランチ' . PHP_EOL, FILE_APPEND);
        $url = 'https://www.googleapis.com/customsearch/v1?key=[GoogleAPIキー]&cx=[検索エンジンID]&q=' . $q;

        $search_result = json_decode(file_get_contents($url));
        $result = $search_result->items[mt_rand(0, 9)];
        return $result->title . PHP_EOL . $result->link;
    } catch (Exception $e) {
        return '芋でも食っとけ';
    }
}
```

軽く試しただけなのでかなりソースは雑です。検索クエリ生成の部分とか適当なので精度もあまり高くありません。
ですが、やはりLINEでボットが作れるというのはかなり可能性感じますね。
Mac homebrew cask メモ



* caskは、状況が変わり過ぎでググッても古い情報が混在でよくわからなくなるので、メモ
 

## 状況

* phinze/cask はもう利用されてない?
* @caskroomは、2015年12月にbrew本家に移行した?
 * [caskroom/homebrew-cask: A CLI workflow for the administration of Mac applications distributed as binaries](https://github.com/caskroom/homebrew-cask)


参考: [Homebrew-Caskのインストール方法が変更された](http://rcmdnk.github.io/blog/2015/12/18/computer-homebrew-brew-file-mac/)


多分、brew updateをすると、brew cask installしたものも、同時にアップデートされる?



## 2015/12移行方法

```
$ brew uninstall --force brew-cask; brew update
```

新規からの場合

```
$ brew tap caskroom/cask
```


## 使い方

これであってる???


```
brew cask list
```




## トラブル


brew cask cleanupしたら、以下のようなことを言われた

```
$ brew cask cleanup
Error: No such file or directory - /Library/Caches/Homebrew/Casks
  Most likely, this means you have an outdated version of homebrew-cask. Please run:

      brew uninstall --force brew-cask; brew untap phinze/cask; brew update; brew cleanup; brew cask cleanup
```

以下を実行したら、解決したっぽい

```
mkdir -p '/Library/Caches/Homebrew/Casks'
```

参考:

Bug report: `brew cask cleanup` results in "No such file or directory" error · Issue #18606 · caskroom/homebrew-cask
https://github.com/caskroom/homebrew-cask/issues/18606
monit で sshd.pid に頼らない sshd監視






## 問題


なんらかの理由で sshd.pidがなくなって、alert mailを投げてくるので、sshd.pid監視じゃなくて、プロセス監視に変更する



## 設定フィル


```
#check process sshd with pidfile /var/run/sshd.pid
check process sshd matching "sshd"
    start program = "/etc/init.d/sshd start"
    stop program = "/etc/init.d/sshd stop"
    if failed port 7445 protocol ssh then restart
    if 5 restarts within 5 cycles then timeout
```
ssh tunneling/ port forwarding



すぐに忘れそうなのでメモ




## メモ

```
ssh -L ローカルポート:ターゲットアドレス:ターゲットポート リモートのSSHサーバ
```


## 参考

* [sshポートフォワーディング - Qiita](http://qiita.com/mechamogera/items/b1bb9130273deb9426f5)



* [楽しいトンネルの掘り方(オプション: -L, -R, -f, -N -g) — 京大マイコンクラブ (KMC)](https://www.kmc.gr.jp/advent-calendar/ssh/2013/12/09/tunnel2.html)
便利なショートカット作成方法

tl;dr
------
* Windowsのショートカットで認証情報入力なしでVMware/WinWCPにログインする
* ショートカットのプロパティで以下を変更する

```
リンク先（VMware）
"C:\Program Files (x86)\VMware\Infrastructure\Virtual Infrastructure Client\Launcher\VpxClient.exe" -server 192.168.137.2 -user root -p RTvmware1604 -locale ja -ignorecert

リンク先（WinSCP）
"C:\Program Files (x86)\WinSCP\WinSCP.exe" scp://"user01":"XSW""zaq1"@192.168.2.10:22
※ログインパスワードに「"」が含まれる場合は重ねる。
```

reference
----------
[vSphere Clientの小技](http://www.unix-power.net/vmware/vsphereclient.html)
[WinSCP コマンドライオプション](http://sourceforge.jp/projects/winscp/wiki/commandline)
[WinSCPで自動ログイン](http://blog.goo.ne.jp/mikami532/e/13b4a60abe6e438bdd760e8aa31acb5f)
sshの"Too many authentication failures for username"解決法




## .ssh/config

IdentitiesOnly yes を追加

```
Host 省略名
  HostName IPアドレス
  User ユーザ名
  IdentitiesOnly yes
```

## sshコマンド

>ssh username@IPAddress -o >PreferredAuthentications=password


sshで接続時の「Too many authentication failures for username」エラーの対処法 - ブログ三郎
http://d.hatena.ne.jp/kou_i/20101121/1290352589


## ssh_config

>PreferredAuthentications password
MeCab の出力を学校文法に適合する方法（古文）３

ぼちぼち、桜が散り始めています。
<hr>
申請から一ヶ月越しで漸く、拙作の古文品詞分解 iOSアプリがリリースされました。
便利で高速な Mecab ですが、漸く作者の意図（後処理で出来ることはしない）が掴めてきました。
私は「<b>文の終端などが確定していない状況で出来ないことはしない。</b>」と受け止めました。
無理をしなくても前方参照は２パスで全て解消しますが、文の終端が決まっていないと「前も後ろもない」ですね…
<hr>
近々、係結びでない文の終端の語を連体形でなく終止形にした修正版をリリースしようかと思います。
基本的に文章の終端は「次のトークンが（<b>ない|句点</b>）の場合」を想定していますが、複文などを考慮すると「次のトークンが<b>格助詞</b>の場合」もあるかとも思います。
Coherence を使ってみる (Fluid との比較)

Web 閲覧時に、確実にログインアカウントを使い分けたいという場面がある。
Cookie を残したまま、あちこちのサイトを閲覧するのは怖い。
私はそんな時、ブラウザを専用アプリ化することで、ログイン・ログアウトの手間を省略している。

OS X 上では、今まで [Fluid](http://fluidapp.com/) を使っていた。
Fluid は Webkit ベースの専用アプリを生成してくれるアプリケーションだ。

つい最近 [Coherence](https://bzg.selz.com/item/51fc0496a1416c0578013bcd) というアプリの存在を知った。これは Google Chrome ベースだ。
さっそく購入して使っている。

いい機会なので表で比較してみる。

|| [Fluid](http://fluidapp.com/) | [Coherence](https://bzg.selz.com/item/51fc0496a1416c0578013bcd) |
|:--:|:--:|:--:|
| 価格 | $4.99 | $1.00 |
| ベースのブラウザ | Safari | Google Chrome |
| 開発者 | Todd Ditchendorf | BZG Inc |
| インストール | ダウンロード ・ Homebrew Cask 可 | ダウンロードのみ (アップデート方法不明) |
| カスタマイズ | user script, user style | Chrome Extensions |

## 使用感

### Fluid
全体的に Fluid の方が使い心地が良い。

しかし Flash や Silverlight など、
プラグインを多用したサイトでは、上手く動作してくれない例があった。

- YouTube で FullScreen 再生できない
- AWS Management Console で Route 53 が開けない
- Netflix で動画が再生できない。
- Flash を多用したサイトの一部で、タブを切り替えた際にプレイヤーが反転する。
- GitHub 使用時に ZenHub が使えない (Extension が必要なため)

### Coherence

Coherence は『単に Google Chrome を別名にした』という使用感だった。

- プラグインが複雑なサイトでも Fluid のような不具合はない。 ( 嬉しい !)
- 内蔵の Google Chrome バージョンは 48.X とやや古い。
- 内蔵の Google Chrome をアップデートすると設定したアイコンがリセットされてしまう。

### まとめ

プラグインが必要なサイトでは Coherence を、それ以外は基本的に Fluid を使うと良いと思う。
HTML,CSS 勉強メモ #14 〜menuの中央配置text-arginで解決〜 

本日の勉強。

##**進度**##
<dl>
<dt>メニューの中央配置</dt>
<dd>解決</dd>
<dt>GitHub</dt>
<dd>ソースが閲覧できたほうが伝わると思い、始めてみました。</dd>
</dl>

##**メモ**##
- メニューの中央配置の件
 - よくよく見たら至って単純なミスで、menuを`inline-block`で指定していたのですが、それを一生懸命`margin: 0 auto;`で真ん中に寄せようとしていたのですね。`text-argin: center;`にしたところ無事、中央配置になりました。

- GitHub
    - ちょっと脱線しますが、ソースを見てもらったほうが状況を伝えやすいと思い始めてみました。ということでやり方はまだイマイチですが、これで良いのかサンプルを試しにやってみます。 

[sample](https://github.com/marin-takagi/tutorial/commit/c0d11cd6c6bc5f56bc3f19884e52703ced3d8092)

一応できたのでしょうか・・・

他の方の投稿とかも参考にさせていただきながら検証してみようと思います。
とりあえず、明日は娘の入園式なので本日はここまでにしておきます。
Elixir入門（３）

勉強したことをほぼ写経するだけ

# Boolean

```
iex> true
true
iex> false
false
iex> nil
nil

# これらの値は、atomでも書ける
iex> nil === :nil
true
iex> nil == :nil
true
iex> false === :false
true
iex> false == :false
true
iex> true === :true
true
iex> true == :true
true
```

# Comparison Operator

```
# 値で評価
iex> 1 == 1.0
true
iex> 1 != 1.0
false

# 型＋値で評価
iex> 1 === 1.0
false
iex> 1 !== 1.0
true

# 比較
iex> 1 < 1.0
false
iex> 1 <= 1.0
true
iex> 1 > 1.0
false
iex> 1 >= 1.0
true
```

## tips

型変換の優先順位

```
number < atom < reference < function < port < pid < tuple < map < list < binary
```

# Boolean Operator

```
# "and", "or", "not"は、の第１引数は、"true" or "false"しか受け付けない
iex> false or true
true
iex> false and true
false
iex> not false
true
iex> 0 or 1
** (ArgumentError) argument error: 0
iex> false or 1
1
```

# Relaxed Boolean Operator

```
# "||", "&&", "not"は、あらゆる型を受け付ける
iex> false || true
true
iex> 1 && nil
nil
iex> ![1, 2, 3]
false
```

# Arithmetic Operator

```
iex> 2 + 3
5
iex> 2 - 3
-1
iex> 2 * 3
6
iex> 2 / 3
0.6666666666666666
# 商のみ
iex> div(5, 3)
1
# 余りのみ
iex> rem(2, 3)
2
```

# Join Operator

```
# Binary or String用
iex> "Hello" <> "World"
"HelloWorld"
# List用
iex> [1, 2, 3] ++ [3, 4, 5]
[1, 2, 3, 3, 4, 5]
iex> [1, 2, 3] -- [3, 4, 5]
[1, 2]
iex> "Hello" ++ "World"
** (ArgumentError) argument error
```

# in Operator

```
iex> :hoge in [:hoge, :fuga]
true
iex> :bar in [:hoge, :fuga]
false
```
関数の引数にポインタを渡した時の簡単な違い

Goの勉強をしていたら再発見（というより復習）しまして、基本が抜け落ちているなぁと痛感…。
C言語を勉強した時に学んだ気がするんですが、完全に頭から抜けていたので書いておきます。
この記事では例としてC,Goで例示します。

##値渡し
まずは普通に変数の値を関数に渡してみます。

```C
#include<stdio.h>

int plus1(int x){
	x = x + 1 ;
	return x ;
}

int main(void){
	int a ;
	a = 1 ;
	
	plus1(a);
	
	printf("a = %d\n",a);//a = 1と表示される
	return 0;
}
```

```Go
package main
import "fmt"

func plus1(x int) int{
	x = x + 1
	return x
}

func main(){
	a := 1
	a1 := plus1(a)
	
	fmt.Println("a =", a)	//a = 1と表示される
	fmt.Println("a + 1 =", a1)	//a + 1 = 2と表示される
}
```

##ポインタ渡し
次にポインタを渡してみます。

```C
#include<stdio.h>

int plus1(int *x){
	*x = *x + 1 ;
	return *x ;
}

int main(void){
	int a ;
	a = 1 ;
	
	plus1(&a);
	
	printf("a = %d\n",a);//a = 2と表示される
	return 0;
}
```

```Go
package main
import "fmt"

func plus1(x *int) int{
	*x = *x + 1
	return *x
}

func main(){
	a := 1
	a1 := plus1(&a)
	
	fmt.Println("a =", a)	//a = 2と表示される
	fmt.Println("a + 1 =", a1)	//a + 1 = 2と表示される
}
```

結果が変わりました。

##まとめ
変数``a``を普通に渡すと、関数には``a``をコピーしたものが渡されます。なので、元々の``a``には変更が適応されません。
~~ポインタを渡した場合は、``a``が格納されているアドレスを直接修正しているので、「aに1を足す」という処理から「aが指しているアドレスの中の数値に1を足す」という処理に変わっています。
なので最終的に同じ場所を見ている変数``a``の値も1から2になります。~~
※ポインタを渡した場合もメモリアドレスのコピーを渡しているだけのようです。コメントにてshiracamusさんよりご指摘いただきましたので、詳しくはコメント欄を参照してください。（とても解りやすく解説して頂いてます。）

##最後に
できる人からしたら当たり前のことですが、今まで曖昧にしたままだったのでこの機会に復習しました。少しでも誰かのお役に立てばと思います。
エレメントの移動にアニメーションを付ける（setInterval）

JavaScriptでは、画面上のエレメント（Divタグなど）のCSSを更新して、表示位置を変えたり、要素の色を変えることができ、プログラム次第で移動にアニメーション効果を付けることができます。さまざまな効果をつけられるJavaScriptライブラリがリリースされていますが、考え方を整理する意味でもJavaScriptのみでアニメーションをつけたいと存じます。（自身のアニメーションはカクカクして綺麗に動かないし、ライブラリでは綺麗に動くという視点で、凄く細かく制御をしているようですね。。）

#アニメーションをつけます
**概要**
画面上に2つのエレメントを配置しました。
1つのエレメントを、ゴールに見立てたもう一方のエレメントまで動かします。

**処理の動き**
・画面上の「動かす」ボタンを押下すると、ゴールに向かって動きだします。
・移動時間0.5秒

**JavaScript概要**
ボタン押下時
　①移動回数を決める
　　（今回は0.05秒毎に1回、0.5秒で10回移動するように指定）
　②移動するエレメント、ゴールエレメントの配置座標取得
　③ゴール座標から、移動エレメント座標を引き、移動回数(10)で割って
　　移動1回における移動距離を求める
　④0.05秒毎に関数を実行するようsetIntervalで指定する

setIntervalの関数実行
　⑤移動エレメントを、上で求めた「1回の移動距離」ずつ動かす
　⑥指定回数移動が終われば、処理修理ょう

**ソースコード**

```js
//①
var limit = 10;
var time;

//②
var loc_x  = parseInt(document.getElementById("t").style.left.replace("px",""));
var loc_y  = parseInt(document.getElementById("t").style.top.replace("px",""));
var goal_x = parseInt(document.getElementById("target").style.left.replace("px",""));
var goal_y = parseInt(document.getElementById("target").style.top.replace("px",""));

//③
var sec_move_x = (goal_x - loc_x) / limit;
var sec_move_y = (goal_y - loc_y) / limit ;

//④⑤⑥
var cnt_x = loc_x;
var cnt_y = loc_y;
time = setInterval(function(){
  cnt_x += sec_move_x;
  cnt_y += sec_move_y;
  document.getElementById("t").style.left = cnt_x + "px";
  document.getElementById("t").style.top  = cnt_y + "px";
  if(cnt >= limit) {
    clearInterval(time);
  }
cnt++;
}, 50);

```

簡単な[サンプルページ](http://kaikusakari.github.io/move.html)を準備しました。いまどき、JavaScript単体で利用する機会はあまりないかもしれませんが、書き残しておきます。以上です。
MathematicaでMikuMikuDance 2

表情モーフィングの計算

# 1.モーフィング計算
まずモーフィングの計算を行う関数を定義します。

```Mathematica
Vlerp[v1_, v2_, t_] := Module[
   {vr, ret},
   vr = (1 - t) v1 + t v2;
   Return[vr];
   ];
SkinMorph[Vertex_, Skin_, Motion_] :=
  Module[{i, j, d, e, f, base, ret, Name, t, emotion},
   ret = Vertex;
   If[Length[Motion] == 0, Return[Vertex]];
   base = Skin[[1]];
   For[i = 1, i <= Length[Motion], i++,
    Name = Motion[[i, 1, 2]];
    t = Motion[[i, 3, 2]];
    j = Flatten[Position[Skin[[All, 1]], Name]];
    
    If[Length[j] == 0, Continue[]];
    j = j[[1]];
    d = Skin[[j]];
    For[j = 1, j <= d[[2]], j++,
     e = Vlerp[
       base[[4, d[[4, j, 1]] + 1, 2]],
       base[[4, d[[4, j, 1]] + 1, 2]] + d[[4, j, 2]],
       t];
     base = ReplacePart[base, {4, d[[4, j, 1]] + 1, 2} -> e];
     ret = ReplacePart[ret, {base[[4, d[[4, j, 1]] + 1, 1]] + 1} -> e];
     ];(* For j *)
    ];
   Return[ret];
   ];
```

# 2. 表情の指定
あにまさ式ミクさんのPMDファイルの表情の種類を確認するには下記コマンドを入力します。

```Mathematica
In[246]:= f["Skin_data"][[All, 1]]
Out[246]= {"base", "真面目", "困る", "にこり", "怒り", "上", "下", \
"まばたき", "笑い", "ウィンク", "ウィンク２", "ウィンク右", "ｳｨﾝｸ２右", "はぅ", \
"なごみ", "びっくり", "じと目", "なぬ！", "瞳小", "あ", "い", "う", "お", \
"\[FilledUpTriangle]", "\[And]", "\[Omega]", \
"\[Omega]\[EmptySquare]", "はんっ！", "ぺろっ", "えー", "にやり"}
```

 例えばミクさんに、にこりとウィンクしてぺろっとして頂くには下記の様なリストを作成します。

```Mathematica
g1 = {
   {{"SkinName", "ウィンク"}, {"FlameNo", 1}, {"Weight", 1.`}},
   {{"SkinName", "にこり"}, {"FlameNo", 1}, {"Weight", 1.`}},
   {{"SkinName", "ぺろっ"}, {"FlameNo", 1}, {"Weight", 1.`}}
   };
```
ShiftJISの漢字コードが上手くノートブックに入力できない場合は下記入力をしてみてください。

```Mathematica
In[23]:= g1 = {
  {{"SkinName", f["Skin_data"][[All, 1]][[10]]}, {"FlameNo", 1},
    {"Weight", 1.`}},
  {{"SkinName", f["Skin_data"][[All, 1]][[4]]}, {"FlameNo", 1},
    {"Weight", 1.`}},
  {{"SkinName", f["Skin_data"][[All, 1]][[29]]}, {"FlameNo", 1},
    {"Weight", 1.`}}
  }
Out[23]= {
{{"SkinName", "ウィンク"}, {"FlameNo", 1}, {"Weight", 1.}},
{{"SkinName", "にこり"}, {"FlameNo", 1}, {"Weight", 1.}},
{{"SkinName", "ぺろっ"}, {"FlameNo", 1}, {"Weight", 1.}}
}
```

# 3. 表情モーフィングの実行

 表情モーフィングをした頂点座標を計算します。

```Mathematica
vertex = SkinMorph[f["VertexVectors"], f["Skin_data"], g1];
```

# 4. 結果の表示

表示してみます。

```Mathematica
Graphics3D[
 Prepend[Flatten[#, 1] & /@ 
   Partition[
    Riffle[f["TextureList"][[# + 1]] & /@ f["MaterialIndices"], 
     Polygon[#[[1]], #[[2]], #[[
         3]]] & /@ ({vertex[[# + 1]], 
          VertexNormals -> f["NormalVectors"][[# + 1]], 
          VertexTextureCoordinates -> f["UVVectors"][[# + 1]]} & /@ 
        f["FaceIndices"])], 2], EdgeForm[]], 
 ViewPoint -> {0.295918150638636`, 0.295873255916524`, 3.357810516475874`}, 
 ViewCenter -> {{0.5`, 0.5`, 0.5`},
                      {0.47532409931375563`,-1.0411988335153852`}}, 
 ViewAngle -> 0.07048280598964335`, 
 ViewVertical -> 
      {0.05306019054920806`, 0.8551795243995924`, 1.5428727481287545`}
]
```
   
![名称未定義-3.png](https://qiita-image-store.s3.amazonaws.com/0/119510/daa2cb1f-108c-ae16-6a73-0c66b22bcd30.png)
  ウィンクして、にこりと笑って、ペロっとしていると思います。

# つづく

# 5 関連リンク
[MathematicaでMikuMikuDance 3](http://qiita.com/I_HaL/items/a6108380e95ec30defdb) ステージの読み込み
ニューラルネットワークを用いた手書き文字認識の個人的なメモ


[ニューラルネットワークを用いた手書き文字認識](http://nnadl-ja.github.io/nnadl_site_ja/chap1.html)がわかりやすいので、
最初〜勾配降下法を用いた学習までの個人的なメモを作成しました。

不理解により内容が異なっていることがあるかもしれません。
これをきっかけに上記サイトを見ていただければ幸いです。

##パーセプトロンとシグモイドニューロン
パーセプトロンは、複数の二進数を入力に取り、一つの二進数を出力する。

シグモイドニューロンは、複数の0から1の間のあらゆる値を入力に取り、一つの0から1の間の値を出力する。

パーセプトロンはNANDゲートを実装できる。
NANDゲートさえあればどんな計算でも構成できるから、パーセプトロンのネットワークさえあれば任意の論理関数を計算できる。
また学習アルゴリズムを使えば、従来の論理ゲートでは難しい問題も解ける。

パーセプトロンは出力が0か1のため、どちらかであるということしか表現できない。それにより、誤った学習が行われると、結果が反転し、ネットワーク内に大きな影響を与えてしまう。
シグモイドニューロンであれば、0.5という値も出力できるため、それによるルール設定により上記の影響を少なくできる。

##勾配降下法と確率的勾配降下法
ニューラルネットワーク訓練の測定のコスト関数を作成する。
上記のコスト関数は重みとバイアスの関数の最小化を行うことにより成績がよくなる。
勾配降下法は、傾き（勾配）を計算し、傾き（勾配）が負になる方向に変数を変化させる方法である。
勾配降下法は、殆どの場合、重みとバイアスの非常に強力な最小化手段であり、ネットワークの訓練に大いに役に立つ。

確率的勾配降下法は、学習の高速化のアイデアの一つである。
無作為に抽出した小さな標本を計算し、元の勾配を推測するものである。
Symantec SSLサーバ証明書に無料バンドルされている脆弱性アセスメント機能を試してみた

# Q.脆弱性アセスメントとは何ですか。
## A.
> 脆弱性アセスメントは、すべての EV (Extended Validation) またはグローバル・サーバ ID (SSL証明書の比較) を購入すると無償で利用できる機能で、Web サイトの中で最も悪用されやすい弱点をすばやく特定し、対策をとるのに役立ちます。脆弱性アセスメントには次の内容が含まれます。

>・　公開 Web サイト、Web ベースのアプリケーション、サーバーソフトウェア、およびネットワークポートの脆弱性を毎週自動スキャン
・　すぐに調査する必要がある重大な脆弱性と、危険性が低い情報項目の両方を識別する実用的なレポート
・　脆弱性が修正されたことを確認するために Web サイトを再スキャンするオプション

>※　OpenSSL1.0.1系の脆弱性 (OpenSSLHeartbleed vulnerability) や、GNU bashの脆弱性を利用した攻撃(CVE-2014-6271)も検出できます。

引用元：[無料バンドル機能｜シマンテック](https://www.symantec.com/ja/jp/page.jsp?id=ssl-resources)

# テストサーバ構成
ELB━EC2(m1.midium)←インスタンスA
   　　┗EC2(m1.midium)

# CPU負荷（インスタンスA）
![スクリーンショット 2016-04-10 18.21.35.png](https://qiita-image-store.s3.amazonaws.com/0/15297/024e6adc-908a-990e-bd8a-926a43b4bf9f.png)

# 脆弱性アセスメントレポート
Symantec User PortalにてPDFファイルでレポートが作られます。
今回の結果は。。。

>![スクリーンショット 2016-04-10 21.33.29.png](https://qiita-image-store.s3.amazonaws.com/0/15297/753302e7-2a8b-a896-835e-a79afababf4d.png)

はい、すぐに対応しますｗ

# 所感
1. 負荷は限定的とかかれていたが、負荷が思っていたより高かった。
>![脆弱性アセスメントの仕様詳細について｜シマンテック.png](https://qiita-image-store.s3.amazonaws.com/0/15297/67699828-18cd-1178-2c89-f043a6c853e2.png)
引用元：[脆弱性アセスメントの仕様詳細について｜シマンテック](https://www.symantec.com/ja/jp/page.jsp?id=ssl-vulnerability-assessment)

2. クロール時間が設定できない為、ピークタイムに来られると厄介。
3. 日本のみにアクセス許可をしている場合、アセスメントサーバはアメリカ、ドイツからリクエストしてくる為脆弱性アセスメント機能は使えない(2016/04/10時点)。使用するに当たり指定IPを許可すればいいがRoute53のGeoとかで設定していると面倒。
参考元：[脆弱性アセスメントを実施するアクセス元のグローバルIPアドレスを教えてください｜Symantec](https://knowledge.symantec.com/jp/support/mpki-for-ssl-support/index?vproductcat=V_C_M&vdomain=VERISIGN.JP&page=content&id=SO23908&locale=ja_JP&redirected=true)
x-rayを使ってgithubの草の情報を取得する

　この投稿ではnode.jsのスクレイピングライブラリ[x-ray](https://github.com/lapwinglabs/x-ray)を用いて、Githubの各ユーザーの草(Contributions)の情報を取得する方法とコードを示します。

　投稿時(2016年4月10日)では、

```
https://github.com/users/<UserName>/contributions
```

　にアクセスすると、ユーザーごとのContributionsの様子を表す、次のようなSVGが取得できます(この仕様は今後変わる可能性があります)。

　次の画像は私のGithubのContributionsです。

![Screen Shot 2016-04-10 at 9.49.33 PM.png](https://qiita-image-store.s3.amazonaws.com/0/4125/3a46ba29-e975-22b1-5c11-e7e058f27139.png)

　さて、このSVGをnode.js向けスクレイピングライブラリ[x-ray](https://github.com/lapwinglabs/x-ray)を用いて、取得・パースするコードを示します。

　コードは次の通りです。

```javascript:X-rayのContributionsを取得する
'use strict'
var Xray = require('x-ray');
var x = Xray();

var userName = 'RyotaMurohoshi';
var url = `https://github.com/users/${userName}/contributions`;
x(url, 'rect', [ { count: '@data-count', date: '@data-date' }])((error, result) => {
    if (error) {
        console.log(error);
    } else {
        console.log(result);
    }
}); 
```

　実行結果例を下記に示します。

```:実行結果例
[ { count: '0', date: '2015-04-08' },
  { count: '0', date: '2015-04-09' },
  { count: '0', date: '2015-04-10' },
  { count: '0', date: '2015-04-11' },
  { count: '0', date: '2015-04-12' },
  { count: '0', date: '2015-04-13' },
  { count: '0', date: '2015-04-14' },
〜中略〜
  { count: '8', date: '2016-03-23' },
  { count: '4', date: '2016-03-24' },
  { count: '3', date: '2016-03-25' },
  { count: '2', date: '2016-03-26' },
  { count: '2', date: '2016-03-27' },
  { count: '3', date: '2016-03-28' },
  { count: '4', date: '2016-03-29' },
  { count: '1', date: '2016-03-30' },
  { count: '7', date: '2016-03-31' },
  { count: '1', date: '2016-04-01' },
  { count: '1', date: '2016-04-02' },
  { count: '3', date: '2016-04-03' },
  { count: '3', date: '2016-04-04' },
  { count: '1', date: '2016-04-05' },
  { count: '6', date: '2016-04-06' },
  { count: '3', date: '2016-04-07' },
  { count: '3', date: '2016-04-08' },
  { count: '1', date: '2016-04-09' } ]
```

　[x-ray](https://github.com/lapwinglabs/x-ray)このように用いることで、ユーザーごとのContributionsの情報を簡潔に取得することが可能です。



* 関連コード:https://github.com/RyotaMurohoshi/x-ray_examples
* X-rayの動作確認バージョン:2.0.3
visual studioで実行が出来ない（忘れてませんか？）

　　　　#include 
<stdio.h>
void main() {
	printf("C言語実習");
}
通常これで実行するとｃ言語実習と表示されますがvisual studioでは表示されないと思います
　　　　対処方法↓
printf("Ｃ言語実習");の下の所にgets();
を付け加えてみて下さい

　　　#includ
void main() {
	printf("C言語実習");
	gets();
}

Ｃ言語実習と表示されるかと思います
是非参考にして見て下さいね！
AtCoderに挑戦

## AtCoder
[Atcodeのリンク](http://atcoder.jp/)
AtCoderとはプログラミングコンテストらしいのですが、
そこで
A - はじめてのあっとこーだー（Welcome to AtCoder）
をやってみました。

## 結果
なんというか、ガチになるとダメですね。メモリー節約！！！！！！とか必要以上に意識するのは通常する必要の無いことですのでそこまで気にしなくともいいでしょう。
ですが、とても言語仕様に詳しくなれそうです。そして問題を解くのは楽しいですね。
意外と知らない事便利な技を学べたりするのでちょうどいいかとは思います。
それと、プログラムの入力をどのようにして受け取りのかが少しややこしいですが、慣れで解決するでしょう。

因みに、練習問題の私のコードはこうなりました。

```py:
print "%d %s" % (input() + sum(map(int, raw_input().split())), raw_input())
```
お風呂でプログラミング

# お風呂でプログラミングし始めた経緯
一人暮らしでお風呂は贅沢品
もったないので入るなら長く入りたい。しかし、黙って30分もお風呂に浸かれない
iPadとXperiaをお風呂に持ち込んだがそれでも何か暇
よし、プログラミングしよう
自然な流れですね

# 必要なもの
<font color="green">iPad</font>
<font color="blue">Xperia</font>
リモートアクセスするマシン(普段使ってる開発マシン)
iPad防水ケース　http://www.amazon.co.jp/dp/B00SOEUBG2/
<font color="red">防水キーボード</font>　http://www.amazon.co.jp/dp/B00UBCLWWC/
<font color="gold">風呂ふた（重要）</font>　http://www.amazon.co.jp/dp/B001GTU1IA/

# 準備
今回は、ターミナルで開発します。

1.リモートアクセス先に開発環境・リモートアクセス受信環境を整えます。
2.iPadにターミナルアプリ（vSSH Lite）をインストールします。
3.おもむろに全裸になります。
4.お風呂に入ります。
5.各設備を設置します。
6.iPadをターミナル機器、Xperiaをブラウザ機器としてプログラミングを始めます。

■イメージ図
![huro.jpg](https://qiita-image-store.s3.amazonaws.com/0/35095/1e63acb4-d719-3561-6180-b06c980ebd8a.jpeg)

＊ TeamViewをインストールすることで、GUI環境の開発もできちゃいます。
　　ただ、マウス操作（タッチ操作）がやりづらいのでキーボード中心で行えるターミナルが良いです。
　
# 注意
Xperiaを含む全ての機器は、完璧な防水ではありません。
自己責任でよろしくです。


# 備考
世の中にはMacBookを直接風呂場に持ち込む方も。