OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript フロントエンド開発環境の私的まとめ


## はじめに

* JavaScriptでのフロントエンド開発環境の概要の理解のため、記事を読みつつ、簡単にまとめています (2016/01/04 時点)。
* 元々、サーバサイドを主にやってましたが、こちら側についてもやらないといけないなぁ、という感じです。

## まとめ

### AltJS

JavaScript がいろいろと大変なので、その代替とするための言語群。他にもいろいろありますが、取り急ぎ勉強を進めるにあたっては、以下のあたりで良いかなと思っています。

#### TypeScript

静的型付け、型推論などが良く聞く特徴。Microsoft 製、良いのか、良くないのか。

* [Welcome to TypeScript](http://www.typescriptlang.org)
* [TypeScript - Wikipedia](https://ja.wikipedia.org/wiki/TypeScript)
* [TypeScriptに関する415件の投稿 - Qiita](http://qiita.com/tags/TypeScript)

#### ECMAScript6

現行 JavaScript (ES5) の進化系。ブラウザでの対応状況は見ていませんが、トランスパイラ込みの記事をよく見るので、まだもう少しなのでしょう。

* [ECMAScript](http://www.ecmascript.org)
* [ECMAScript - Wikipedia](https://ja.wikipedia.org/wiki/ECMAScript)
* [ECMAScript6に関する27件の投稿 - Qiita](http://qiita.com/tags/ECMAScript6)
* [es6に関する175件の投稿 - Qiita](http://qiita.com/tags/es6)

### トランスパイラ

#### tsc コマンド

TypeScript -> ES5

* [「tsc」の検索結果 - Qiita](http://qiita.com/search?q=tsc&sort=rel)

#### Babel

ES6 -> ES5

* [Babel · The compiler for writing next generation JavaScript](https://babeljs.io)
* [babelに関する131件の投稿 - Qiita](http://qiita.com/tags/babel)

### モジュール管理(?)

#### Browserify

* [Browserify](http://browserify.org)
* [browserifyに関する122件の投稿 - Qiita](http://qiita.com/tags/browserify)
* [Browserify: それはrequire()を使うための魔法の杖](http://qiita.com/cognitom/items/4c63969b5085c90639d4)
* [browserify の読み方｜YOMIKATA](http://yomikata.org/word/browserify)

#### Webpack

* [webpack module bundler](https://webpack.github.io)
* [webpackに関する99件の投稿 - Qiita](http://qiita.com/tags/webpack)

### タスクランナー / ビルドツール

#### Gulp.jp

* [gulp.js - the streaming build system](http://gulpjs.com)
* [gulp.js plugin registry](http://gulpjs.com/plugins/)
* [gulpに関する462件の投稿 - Qiita](http://qiita.com/tags/gulp)

* [gulp-typescript](https://www.npmjs.com/package/gulp-typescript)

* [gulp の読み方｜YOMIKATA](http://yomikata.org/word/gulp?n=1)

#### Fly

* [bucaran/fly](https://github.com/bucaran/fly)
* [Flyに関する4件の投稿 - Qiita](http://qiita.com/tags/Fly)
* [Gruntやgulp等に続くタスク自動化ツール「Fly」の導入手順](http://qiita.com/kitaro729/items/79a51e427ca6fe72d46d)

### その他 (なんか便利そう。まだよく分からない)

#### babelify

* [babel/babelify](https://github.com/babel/babelify)
* [babelifyに関する5件の投稿 - Qiita](http://qiita.com/tags/babelify)

#### watchify

* [substack/watchify](https://github.com/substack/watchify)
* [watchifyに関する12件の投稿 - Qiita](http://qiita.com/tags/watchify)

#### tsify

* [tsify](https://www.npmjs.com/package/tsify)
* [tsifyに関する1件の投稿 - Qiita](http://qiita.com/tags/tsify)

## 感想

* このあたりは、これくらいフォローしておけば大丈夫なのでしょうか。
* くらくらしますね。まだテスト環境等もいろいろあるというのに。
* 続く (?)。
snmpコマンドでipアドレス台帳を作成

#前提
取得先のサーバにsnmpがインストールされてあること
取得先のサーバのsnmpのコミュニティ名がわかること
ネットワーク内でコミュニティ名が統一されていること

#snmpwalkでホスト名を取得
ホスト名はsnmpwalkを用いて取得する事ができる
1.3.6.1.2.1.1.5というMIBでhost名を取得できる。

``` linux:command
$ snmpwalk -v 2c -c {community} {IP or host}  .1.3.6.1.2.1.1.5
SNMPv2-MIB::sysName.0 = STRING: serverA
$
```
serverAというホスト名ということがわかる。


# 台帳作成
192.168.10.0/24
192.168.11.0/24
から総当たりして接続可能なIPとhost名を取得。
ファイルに吐き出す。

（シンプルにawkで切り抜いても良かった。）


```bash:script.sh
#!/bin/sh

LOG="./ipscan.txt"
:>$LOG
for targetNW in 192.168.10. 192.168.20.;
do
        count=1
        while [ $count -le 255 ];
        do
                targetIP="$targetNW$count"
　　　　　　　　　　echo $targetIP    `snmpwalk -v 2c -c {community}  $targetIP  .1.3.6.1.2.1.1.5 | sed -e "s/SNMPv2-MIB::sysName.0 = STRING://g"`   `snmpwalk -v 2c -c {community}  $targetIP  1.3.6.1.2.1.2.2.1.6 | sed -r "s/IF-MIB::ifPhysAddress.[0-9]+ = STRING://g" | grep -E *\:*\:*\:*\:*\: | uniq` >> $LOG;
                count=`expr $count + 1`
        done
done
```




# よく使うOID情報

| MIB名      | OID         |      説明 |
|:-----------|:-----------|:------------|
| sysName    |1.3.6.1.2.1.1.5.0  |ホスト名 |
| sysDescr   |1.3.6.1.2.1.1.1.   |HW・OS等|
|ipAdEntAddr |1.3.6.1.2.1.4.20.1.1.(*1)  |IPアドレス |
|ipAdEntNetMask |1.3.6.1.2.1.4.20.1.3.(*1) |サブネットマスク   |
Linuxでtelnetコマンドで試験メール送信

#前提
telnetコマンドが使えること
接続先で25番ポートが空いていること

#コマンド
sendmailを始めとするメールサーバが起動されていると、
自身にtelnetしてメールを送る事ができる。
本手順は、簡易的な動作確認をする際に使用する。

以下のコマンドは自身にsendmailがインストールされている時に実施。
（他のサーバに変更する際は、localhost の部分を変える。）

``` command
(
  echo "HELO ";
  sleep 0.1;
  echo "MAIL FROM: from@domain.jp";
  sleep 0.1;
  echo "RCPT TO: to@domain.ne.jp";
  sleep 0.1;
  echo "DATA";
  sleep 0.1;
  echo "Date: 13 Jul 2017 01:16:15 -0400"
  sleep 0.1;  
  echo "MIME-Version: 1.0"
  echo 'Content-Type:text/plain;charset="ISO-2022-JP"'
  echo 'Content-Transfer-Encoding:7bit'
  echo "from: from@domain.jp"
  echo "to: to@domain.ne.jp"
  echo "subject: MAILTITLE"
  echo ""
  echo "NAKAMI"
  echo ".";
  sleep 0.1;
  echo "quit";
) | telnet 10.15.0.61 25

```
※2017/7/13 sendmailのversionによっては、Dateの記載がないと弾かれる為追記

以下、適宜置き換える。
from@domain.jp を送信 **元** のメールアドレスにすること。
to@domain.ne.jpを送信 **先** のメールアドレスにすること。
MAILTITLE メールタイトル
NAKAMI メール本文

#sendmailが使える通常時
普通の送り方。sendmailコマンドはたいていの場合使えるので

```comamnd 
# sendmail test@tsukada.com
From: test@from.com
To: test@tsukada.com
Subject: aaa

a
.
```
NYAGOS 4.1.0_0  と Lua のモジュール

（この記事は[ブログ記事](http://text.baldanders.info/remark/2016/01/lua-module/)とのマルチポストです）

[NYAGOS] 4.1.0_0 がリリースされた。主な変更点は `ln` コマンドが追加されたことのようだ。

- [Release 4.1.0_0 · zetamatta/nyagos](https://github.com/zetamatta/nyagos/releases/tag/4.1.0_0)

ただ，私の場合はより切実な問題があって， `-f` オプションで [Lua] のスクリプトを実行させた場合に `module()` 関数が使えなくなった。[Lua] は不案内なので知らなかったのだが `module()` 関数は [Lua] 5.2 で deprecated になっていたらしい。逆になんで今まで使えてたのかは分からない。

- [Luaのモジュールを穴が空くまで見つめてみる - プログラミングの魔物](http://p-monster.hatenablog.com/entry/2013/02/13/205419)

`module()` 関数が使えないので `require()` で外部ファイルを呼び出すとファイル内の記述がそのまま実行される。

以前なら `module1.lua` に

```lua:module1.lua
module("module1", package.seeall)

function method1()
	return "Method 1"
end

function method2()
	return "Method 2"
end
```

と定義しておけば

```lua:run1.lua
require("module1")

nyagos.write(module1.method1().."\n")
nyagos.write(module1.method2().."\n")
```

と記述できた。もし同じように機能させたいなら `module1.lua` を

```lua:module1.lua
module1 = {}

module1.method1 = function()
	return "Method 1"
end

module1.method2 = function()
	return "Method 2"
end
```

と記述するのが一番簡単なようだ。 `module1` を関数テーブルとして定義するわけだ。

あるいは `module1.lua` を

```lua:module1.lua
local module1 = {}

module1.method1 = function()
	return "Method 1"
end

module1.method2 = function()
	return "Method 2"
end

return module1
```

としておいて，呼び出し側を

```lua:run2.lua
local module1 = require("module1")

nyagos.write(module1.method1().."\n")
nyagos.write(module1.method2().."\n")
```

とすればグローバル領域を汚さずに済むだろう。

- [Lua Unofficial FAQ (uFAQ)](http://www.luafaq.org/) : “1.37.2 Life after module()?” の項が参考になる
- [c++ - Using the 'module' function in Lua 5.2? - Stack Overflow](http://stackoverflow.com/questions/16849422/using-the-module-function-in-lua-5-2)
- [その４ 会得必須！Luaの真髄「テーブル」](http://marupeke296.com/LUA_No4_Table.html)
- [第 4 回: Lua のオブジェクト指向について紹介する — WTOPIA v1.0 documentation](http://www.ie.u-ryukyu.ac.jp/~e085739/lua.hajime.4.html)

[NYAGOS]: http://www.nyaos.org/index.cgi?p=NYAGOS "NYAOS.ORG - NYAGOS"
[Lua]: http://www.lua.org/ "The Programming Language Lua"
hyperのコンパイルがopenssl絡みで失敗する場合の対処方法

## 前提
| 項目 | 説明 |
|----|-------------------------|
| OS | MacOSX 10.11.2 |
| Rust | 1.5.0 |
| 検証日時 | 2016.01.04              |

エラーの内容としては以下のようなもの。

```
$ cargo build
         :
   Compiling openssl v0.7.4
   Compiling openssl-sys-extras v0.7.4
   Compiling uuid v0.1.18
   Compiling num v0.1.29
Build failed, waiting for other jobs to finish...
failed to run custom build command for `openssl v0.7.4`
Process didn't exit successfully: `/Users/hattori/work/rust-snippets/access-http/target/debug/build/openssl-bade188098f75a08/build-script-build` (exit code: 101)
--- stdout
TARGET = Some("x86_64-apple-darwin")
OPT_LEVEL = Some("0")
PROFILE = Some("debug")
TARGET = Some("x86_64-apple-darwin")
debug=true opt-level=0
HOST = Some("x86_64-apple-darwin")
TARGET = Some("x86_64-apple-darwin")
TARGET = Some("x86_64-apple-darwin")
HOST = Some("x86_64-apple-darwin")
CC_x86_64-apple-darwin = None
CC_x86_64_apple_darwin = None
HOST_CC = None
CC = None
HOST = Some("x86_64-apple-darwin")
TARGET = Some("x86_64-apple-darwin")
HOST = Some("x86_64-apple-darwin")
CFLAGS_x86_64-apple-darwin = None
CFLAGS_x86_64_apple_darwin = None
HOST_CFLAGS = None
CFLAGS = None
running: "cc" "-O0" "-ffunction-sections" "-fdata-sections" "-g" "-m64" "-fPIC" "-o" "/Users/hattori/work/rust-snippets/access-http/target/debug/build/openssl-bade188098f75a08/out/src/c_helpers.o" "-c" "src/c_helpers.c"
ExitStatus(Code(1))


command did not execute successfully, got: exit code: 1



--- stderr
src/c_helpers.c:1:10: fatal error: 'openssl/ssl.h' file not found
#include <openssl/ssl.h>
         ^
1 error generated.
```

## 対処方法
以下を実行後に`cargo build`する。

```
$ export OPENSSL_INCLUDE_DIR=/usr/local/opt/openssl/include
$ export DEP_OPENSSL_INCLUDE=/usr/local/opt/openssl/include
```
SwiftからJSON APIを叩きたい

NSURLSessionを利用してJSON APIを叩いてみた。ひとまず取得するだけならこんな感じ。

```
// なんぞ取得してみる
let session = NSURLSession.sharedSession()
let url = NSURL(string: "https://api.github.com/search/repositories?q=example")!
let task = session.dataTaskWithURL(url) { (data, response, error) in
    // 取得したJSONから値を取り出す（SwiftyJSONを利用）
    let json = JSON(data: data!)
    let items = json["items"]
    for (_, item) in items {
        let fullName = item["full_name"]
        let url = item["html_url"]
        let watchers = item["watchers"]
        print("*** name: \(fullName), url: \(url), watchers: \(watchers)")
    }
}
task.resume()
```

Playground上ではうまく動作確認できなかったので、下記コードを適当なアプリのviewDidLoadへ埋めて動作確認すること。

また、生SwiftでJSONをいじるのは茨の道なので、JSONのパースにはSwiftyJSON ( https://github.com/SwiftyJSON/SwiftyJSON ) を利用してる。
KVM に CentOS Atomic Host を CLI でセットアップする

CentOS 6 の KVM ホストに CentOS Atomic Host を CLI でセットアップしてみました。セットアップしただけでまだなにも使っていませんが・・・

- [Project Atomic Quick Start Guide](http://www.projectatomic.io/docs/quickstart/)

----

イメージとかを置くディレクトリを作成します。

```sh
mkdir -p /path/to/atomic
cd /path/to/atomic
```

Cloudinit のための ISO を作成します。

Atomic Host のルートパーティションと Docker のストレージを別のディスクにするために `write_files` で `docker-storage-setup` に `DEVS` とか `VG` とかを書いています。

```sh
cat <<EOS> meta-data
instance-id: atomic-001
local-hostname: atomic-001.example.com
EOS

cat <<EOS> user-data
#cloud-config
ssh_authorized_keys:
$(curl -s https://github.com/ngyuki.keys | sed 's/^/  - /')
write_files:
  - path: /etc/sysconfig/docker-storage-setup
    content: |
      DEVS=/dev/vdb
      VG=docker
      DATA_SIZE=90%VG
EOS

genisoimage -output atomic-001.iso -volid cidata -joliet -rock user-data meta-data
```

ディスクイメージをダウンロードします。

```sh
curl http://cloud.centos.org/centos/7/atomic/images/CentOS-Atomic-Host-7-GenericCloud.qcow2.gz |
  gzip -dc > base.qcow2
```

ダウンロードしたディスクイメージから差分ディスクを作成します。

```sh
qemu-img create -b base.qcow2 -f qcow2 atomic-001.qcow2
```

Docker のストレージ用の LVM ボリュームを作成します。

```
lvcreate -L 20G -n vm.atomic-001 vg0
```

`virt-install` でゲストを作成します。

`--disk` で、ダウンロードしたディスクイメージ（の差分ディスク）、Cloudinit のための ISO、Docker ストレージのための LVM ボリューム、を指定します。

```sh
virt-install \
  --name atomic-001 \
  --hvm \
  --virt-type kvm \
  --ram 1024 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel7 \
  --boot hd \
  --disk path=/path/to/atomic/atomic-001.qcow2,format=qcow2 \
  --disk path=/path/to/atomic/atomic-001.iso,device=cdrom,bus=ide,perms=ro \
  --disk path=/dev/vg0/vm.atomic-001 \
  --network bridge=br0 \
  --graphics none \
  --serial pty \
  --console pty
```

自動的にゲストのコンソールにアタッチされるので、IP アドレスが表示されるまで待ってから `Ctrl + ]` で抜けて SSH で接続します。

```
ssh centos@192.0.2.123
```

`pvs` で物理ボリュームを見てみます。

```
sudo pvs
```

`atomicos` と `docker` の２つのボリュームグループが作成されています。

```
  PV         VG       Fmt  Attr PSize  PFree
  /dev/vda2  atomicos lvm2 a--   9.69g 6.75g
  /dev/vdb1  docker   lvm2 a--  20.00g 1.95g
```

`lvs` で論理ボリュームの状態を見てみます。

```
sudo lvs
```

ルートパーティションと `docker-pool` が別のボリュームグループに作成されています。

```
  LV          VG       Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root        atomicos -wi-ao----  2.94g
  docker-pool docker   twi-a-t--- 18.00g             0.32   0.20
```

`docker info` で Docker の情報を見てみます。

```
sudo docker info
```

それっぽい Pool Name になっています。

```
Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: docker-docker--pool
 Pool Blocksize: 524.3 kB
 Backing Filesystem: xfs
 Data file:
 Metadata file:
 Data Space Used: 62.39 MB
 Data Space Total: 19.32 GB
 Data Space Available: 19.26 GB
 Metadata Space Used: 49.15 kB
 Metadata Space Total: 25.17 MB
 Metadata Space Available: 25.12 MB
 :
 :
```
TypeScriptのデータ型まとめ


TypeScriptをはじめたので基本的なところをメモ。  
TypeScriptでは型注釈をすることで、静的型付けをすることができます。

# Boolean
真偽値（`true` or `false`）を扱うことができます。

```ts
var isShow: boolean = false;
```

# Number
数値を扱うことができます。

```ts
var width: number = 6;
```

# String
文字列を扱うことができます。

```ts
var name: string = "omi";
name = 'yusuke';
```

# Array
配列を扱うことができます。
２通りの書き方ができますがどちらも結果は同じになります。

型の後ろに、`[]`を付ける
```ts
var list:number[] = [1, 2, 3];
```

Arrayクラスを使用する
```ts
var list:Array<number> = [1, 2, 3];
```

# Enum
列挙型、`enum`はenumurateの略です。  
0から始まる連続する整数値が入ります。

```ts
enum Color {Red, Green, Blue};
var r: Color = Color.Red;
var g: Color = Color.Green;
var b: Color = Color.Blue;

console.log(`r: ${r}, g: ${g}, b: ${b}`); //r: 0, g: 1, b: 2
```

また代入文で値を指定することができ、代入文をしようしなかった部分に関しては、ひとつ前の次の数字が入ります。

```ts
enum Color {Red = 2, Green, Blue};
var r: Color = Color.Red;
var g: Color = Color.Green;
var b: Color = Color.Blue;

console.log(`r: ${r}, g: ${g}, b: ${b}`); //r: 2, g: 3, b: 4
```

# Any
Any型はJavaScriptと同じようにどんな型でも利用することができる型です。

```ts
var something: any = 1;
something = 'hoge';
something = true;
```

配列に型を指定すると、様々な型が混在した配列を利用することができます。

```ts
var list: any[] = [1, 'hoge', true];
list[1] = 2;
console.log(list[1]); // 2
```

# Void
TypeScriptでは関数にも型注釈をすることができますが、void型は値がないことを意味する型です。
関数の戻り値の型注釈に使用します。

```ts
var func: (val: string) => void;

func = (val: string):void => {
    console.log(val);
}
```

# 参考サイト
Handbook - Welcome to TypeScript
http://www.typescriptlang.org/Handbook

AltJS初心者必見！型注釈と関数にみるTypeScriptの魅力
https://html5experts.jp/_iwate/7650/
「星めぐり」を解いた


第2回 ESM オフラインリアルタイムどう書く( http://d.hatena.ne.jp/E_Mattsan/20151230/1451449205 )の問題
「星めぐり( https://gist.github.com/mattsan/38a752dca30423902b0a )」を解いた。

所要時間 9分。

で。

私の実装。

```ruby
M={"W"=>"AIGECA/BG/DI/FA/HC/JE",
  "R"=>"FHJBDFH/AH/CJ/EB/GD/IF" }

def solve(src)
  src.chars.drop(1).inject([src[0]]){ |acc,c|
    path=M[c]
    ix=path.index(acc.last)
    acc.push path[ix+1]
  }.join
end

DATA.map{ |line|
  src, expected = line.split(/\s+/)
  actual = solve( src )
  ok = actual==expected
  puts( "%s : %s->%s / %s" % [ (ok ? "ok" : "**NG**" ), src, actual, expected ] )
  ok
}.tap{ |x| puts( x.all? ? "all ok" : "something wrong" ) }

__END__
AW  AI
IRWWRRWWWWWRRWWR  IFAIFHCAIGEBDIGD
```

いつも通り、テストデータの大半は省略。

9分経過時点のコードそのまま。
まだリファクタリングしていない。

グラフを表現する部分が若干邪悪な感じだけど、急いでいるのでこんなもんだと思う。
ix は変数で受けなくてもよかったね。
BPMについて(改善)

BPM(分析)にて定義付けを行った理想的なプロセスに対して、実際に組織にて運用を行っていくための仕組みを作っていくことが改善である。

運用を行っていくための仕組みとは、APQC、SCOR、VRM等の業界別にフレームワークが存在すれば、自分の業種にフレームワークを適用することで一から構築するよりも早く改善活動を行うことができる。

BPMにおいては、上記改善活動を継続していくうえで、ツールを用いることは必須ではないが、「分析」、「改善」の作業を行う上でツールを上手に利用すればBPMをより効率的に行えるようになることが多い。
【OSX】利用しているアプリケーションのBundle Identifierを調べる

# 1. lsappinfoコマンドを使う

起動中のアプリはこれで見れる。

```
$ lsappinfo info -only bundleid Finder
```

# 2. Info.plistを見る

Application ディレクトリにある `*.app` ファイルの中の Info.plist を見てもよい。
ただし、たまにバイナリファイルな感じで見れない。

```
$ grep -A 1 BundleIdentifier ~/Applications/IntelliJ\ IDEA\ 15.app/Contents/Info.plist
    <key>CFBundleIdentifier</key>
    <string>com.jetbrains.intellij</string>
```

```
$ grep -A 1 BundleIdentifier /Applications/Evernote.app/Contents/Info.plist
```
KarabinerをIntelliJ IDEAだけ無効にする

KeymapをEmacs設定にすると要らなくなるので。

#### 1. private.xml を編集

環境設定の `Misc & Uninstall` より Open private.xml を選択して private.xml を編集する

```
<?xml version="1.0"?>
<root>
    <appdef>
        <appname>IntelliJ_IDEA</appname>
        <equal>com.jetbrains.intellij</equal>
    </appdef>
    <item>
        <name>Disable all settings while using IntelliJ IDEA</name>
        <identifier>private.ignore_intellij_idea</identifier>
        <only>IntelliJ_IDEA</only>
        <autogen>__PassThrough__</autogen>
    </item>
</root>
```

#### 2. xmlを再読込し、設定にチェックを入れる

設定の `Change Key` に戻り、 `Reload XML` をすると上記で設定した `Disable all settings while using IntelliJ IDEA` が一番上に表示されているのでチェックを入れる
Ubuntu 14.04 にPHP7をインストールするメモ

## インストール前

```
# php -v
PHP 5.5.9-1ubuntu4.14 (cli) (built: Oct 28 2015 01:34:46)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
```

## インストール手順

```
ダウンロード
# wget https://downloads.php.net/~ab/php-7.0.1RC1.tar.gz
入れないとダメだったので、入れる
# apt-get install libxml2-dev
インストール
# ./configure
# make 
# make install
# php -v
PHP 7.0.1RC1 (cli) (built: Jan  4 2016 04:18:11) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies

```
数独を組合せ最適で解く

# <i class='fa fa-table' /> 数独を解く
[組合せ最適化](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721)を使うと数独も簡単に解けます。

「数独」はニコリの登録商標です 
出典 ニコリhttp://www.nikoli.co.jp/ja/

# <i class='fa fa-table' /> 定式化

<table>
<tr><td>$\mbox{variables}$</td><td>$x_{ijk} \in \{0, 1\} ~ \forall i, j, k$</td><td>マスi,jが数字k+1か (1)</td></tr>
<tr><td>$\mbox{subject to}$</td><td>$\sum_k{x_{ijk}} = 1 ~ \forall i, j$</td><td>数字は1つ (2)</td></tr>
<tr><td></td><td>$\sum_k{x_{ikj}} = 1 ~ \forall i, j$</td><td>縦に同じ数字はない (3)</td></tr>
<tr><td></td><td>$\sum_k{x_{kij}} = 1 ~ \forall i, j$</td><td>横に同じ数字はない (4)</td></tr>
<tr><td></td><td colspan="2">$3 \times 3$のマスについても同様 (5)</td></tr>
<tr><td></td><td colspan="2">数字指定 (6)</td></tr>
</table>

# <i class='fa fa-table' /> Pythonで解く
[pulp](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721#%E3%82%BD%E3%83%95%E3%83%88%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)とpandasを使います。

問題は、文字列に入っているとします。

```py3:python
prob = """\
..6.....1
.7..6..5.
8..1.32..
..5.4.8..
.4.7.2.9.
..8.1.7..
..12.5..3
.6..7..8.
2.....4..
"""
```

定式化して解いてみましょう。

```py3:python
import pandas as pd, numpy as np
from more_itertools import grouper
from pulp import *
r = range(9)

m = LpProblem() # 数理モデル
a = pd.DataFrame([(i, j, k, LpVariable('x%d%d%d'%(i,j,k), cat=LpBinary))
                  for i in r for j in r for k in r],
                 columns=['縦', '横', '数', 'x']) # (定式化1)
for i in r:
    for j in r:
        m += lpSum(a[(a.縦 == i) & (a.横 == j)].x) == 1 # (定式化2)
        m += lpSum(a[(a.縦 == i) & (a.数 == j)].x) == 1 # (定式化3)
        m += lpSum(a[(a.横 == i) & (a.数 == j)].x) == 1 # (定式化4)
for i in range(0, 9, 3):
    for j in range(0, 9, 3):
        for k in r:
            m += lpSum(a[(a.縦 >= i) & (a.縦 < i+3) & # (定式化5)
                         (a.横 >= j) & (a.横 < j+3) & (a.数 == k)].x) == 1
for i, s in enumerate(prob.split('\n')):
    for j, c in enumerate(s):
        if c.isdigit():
            k = int(c)-1 # (定式化6)
            m += lpSum(a[(a.縦 == i) & (a.横 == j) & (a.数 == k)].x) == 1
m.solve() # ソルバーで求解
f = a.x.apply(lambda v: value(v) == 1) # 選ばれた数字
print(np.array(list(grouper(9, a.数[f] + 1))))
>>>
[[5 3 6 8 2 7 9 4 1]
 [1 7 2 9 6 4 3 5 8]
 [8 9 4 1 5 3 2 6 7]
 [7 1 5 3 4 9 8 2 6]
 [6 4 3 7 8 2 1 9 5]
 [9 2 8 5 1 6 7 3 4]
 [4 8 1 2 9 5 6 7 3]
 [3 6 9 4 7 1 5 8 2]
 [2 5 7 6 3 8 4 1 9]]
```

# <i class='fa fa-table' /> Docker
他のパズルも[tsutomu7/puzzle](https://hub.docker.com/r/tsutomu7/puzzle/)にあります。下記を実行してブラウザでホストのアドレスを見てください。

    docker run -d -p 80:8888 tsutomu7/puzzle

## 参考

- [数独を通して組合せ最適化を学ぼう](https://qiita.com/SaitoTsutomu/items/bd09190d8a02432b3f16)
- [組合せ最適化を使おう](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)
- [数理最適化によるパズルの解法](https://qiita.com/SaitoTsutomu/items/0c0db8d22979fc9de8f4)
- [最適化におけるPython](https://qiita.com/SaitoTsutomu/items/070ca9cb37c6b2b492f0)
- [パズルでみる組合せ最適化のテクニック](https://qiita.com/SaitoTsutomu/items/f05f4ff05d4ce6099ff3)
- [Pythonで数独](http://qiita.com/SaitoTsutomu/items/67c253a68360e477937c)

以上
Strcpyのソースコードを見比べてみる

ポインタの解説で引用が多いstrcpy()関数ですが、開発元によって違いがあるようで、興味深かったのでまとめてみました。



##[strcpy.c - opensource.apple.com](http://www.opensource.apple.com/source/Libc/Libc-167/gen.subproj/ppc.subproj/strcpy.c)

```strcpy.c:
#import <string.h>
char *
strcpy(char *s1, const char *s2)
{
    char *s = s1;
    while ((*s++ = *s2++) != 0)
	;
    return (s1);
}
```
 

##[strcpy.c - GNU glibc](http://code.metager.de/source/xref/gnu/glibc/string/strcpy.c)

```strcpy.c:
#include <stddef.h>
#include <string.h>

#ifndef STRCPY
# define STRCPY strcpy
#endif

/* Copy SRC to DEST.  */
char * 
STRCPY (char *dest, const char *src)
{
  return memcpy (dest, src, strlen (src) + 1);
}
libc_hidden_builtin_def (strcpy)
```

##[strcpy function in string.c - tovalds/linux](https://github.com/torvalds/linux/blob/master/lib/string.c)

```string.c:
char *strcpy(char *dest, const char *src)
{
	char *tmp = dest;

	while ((*dest++ = *src++) != '\0')
		/* nothing */;
	return tmp;
}
EXPORT_SYMBOL(strcpy);
```
scssの&

http://www.sassmeister.com/
で試し書きをしてみるとよい。

**SCSS**

```scss
#hoge {
  &.foo {
    height: 300px;
  }
  
  .foo {
    height: 200px;
  }
}
```

↓
**CSS**

```css
#hoge.foo {
  height: 300px;
}

#hoge .foo {
  height: 200px;
}
```

## 説明
SCSSの入れ子はHTMLの入れ子を意味するが、`&`を使った場合はHTMLの入れ子を意味しない。

`#hoge.foo`は
`<div id="hoge" class="foo">`
のことであり、`idがhogeかつclassがfooのもの`という意味だ。

`#hoge .foo`は

```html
<div id="hoge">
  <div class="foo">
```
の入れ子を表す。

## OOCSS

**SCSS**

```scss

.hoge-label{
  &.pen {
    color: red;
  }
  
  &.pencil {
    color: black;
  }
}
```

**CSS**

```css
.hoge-label.pen {
  color: red;
}

.hoge-label.pencil {
  color: black;
}
```

**HTML**

```html
<div class="hoge-label pen">
  aaa
</div>
<div class="hoge-label pencil">
  bbb
</div>
```

なるほど `&（アンパサンド）`はほんとに`かつ`の意味だ。
`class="hoge-label"`かつ`class="pen"`。

HTML側は`class="hoge-label pen"`とスペース区切りなのはやむなし....

![Screen Shot 2016-01-05 at 11.12.23 AM.png](https://qiita-image-store.s3.amazonaws.com/0/27895/0a1d38df-d9b3-c880-9870-e842a00a5770.png)
underscoreコードリーディング（intersection）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##intersectionとは


###[underscorejs.orgのintersection](http://underscorejs.org/#intersection)

こんな説明。
>####_.intersection(*arrays) 
>Computes the list of values that are the intersection of all the arrays.
>Each value in the result is present in each of the arrays.

_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2]


```javascript
_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2]
```
------------- 
arraysの共通の値を求めます。
結果の中に入っているそれぞれの値は、arraysによります。


###[underscore.intersection](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L555)
コード的にはこのあたり。

```javascript
  // Produce an array that contains every item shared between all the
  // passed-in arrays.
  _.intersection = function(array) {
    var result = [];
    var argsLength = arguments.length;
    for (var i = 0, length = getLength(array); i < length; i++) {
      var item = array[i];
      if (_.contains(result, item)) continue;
      for (var j = 1; j < argsLength; j++) {
        if (!_.contains(arguments[j], item)) break;
      }
      if (j === argsLength) result.push(item);
    }
    return result;
  };

```

返り値用にresultを定義。
第一引数以外のargumentsのlengthをargsLengthに格納。
arrayの個数だけ走査する。
i番目のarrayの値がresultの中に含まれていた場合はcontinueする。
それ以外の場合、argsLengthだけfor文を回す。
j番目のargumentsにitemが含まれていなかった場合はそこで走査を終わる。
jがargsLengthだった場合(正常にjのfor文が走査が終わっていた場合)itemがすべてのargumentsの配列に含まれていたことになるので、resultにpushする。

arrayのすべての値に対して同じ走査を行ったあと、resultを返却する。
bash/zsh　SSHでログインした時だけ実行する

Ubuntuはログインしたときこんな情報が表示されてちょっといいなと思った。

```
Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.13.0-48-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Mon Jan  4 10:22:31 UTC 2016

  System load:  0.0               Processes:           96
  Usage of /:   15.1% of 7.74GB   Users logged in:     0
  Memory usage: 5%                IP address for eth0: 10.4.1.113
  Swap usage:   0%

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud
```

これは`update-motd`という仕組みで動的にmotdを生成しているらしい。
同じことを他のディストロでもできないかと思って、とりあえずSSHでログインしたときのみ指定のコマンドを実行するように~/.profile（~/.zprofile）に書いてみた。

```~/.profile
if [ -f /proc/$PPID/cmdline ]; then
    if [ "$(command cut -d : -f1 < "/proc/$PPID/cmdline")" = "sshd" ] && [[ $- == *i* ]]; then
        echo
        command df -h | command awk '/^\/dev/ {gsub(/.[890][0-9]%/, "\x1b[1;31m&\x1b[0m"); print;}'
        echo
        command free -m
    fi
fi
```

- 親プロセスがsshdであるか、インタラクティブシェルであるかを判定している。
- aliasの影響を受けないようにcommandを使っている。
- ディスク使用量が80～100%なら赤字で強調表示するようにしている。
UE4 で C++ プログラミングではまった事のまとめ( ※随時更新 )

# 環境
UE 4.10.0
Visual Studio 2015

# 概要
Unreal Engine 4 の C++ コーディングではまった点をまとめ
※随時更新予定

# 本文
## CreateDefaultSubobject はコンストラクタでコールする
スタティックメッシュコンポーネントを追加しようとして以下のコードを BeginPlay
で以下のコードを追加したら、エディタがクラッシュした。
void AMyActor::BeginPlay()
{
  Super::BeginPlay();
  UStaticMeshComponent* sphere = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("sphere_component"));
  sphere->AttachTo(RootComponent);
}

CreateDefaultSubobject が nullptr を返しているのか？と思ったが戻り値にアクセス
しなくてもエディタがクラッシュするので調査してみたら CreateDefaultSubobject
はコンストラクタでコールするものらしい。
コンストラクタでしか呼べないならコンパイル時になんとか分からないだろうか。。。
( むずかしいけど、ビルド拡張しているなら可能な気がする )。
せめてエディタクラッシュは勘弁してほしい( nullptr 返しても良いから )。
rbenvで入れたrubyのバージョンアップ


例）いままで、2.2.3 使ってて、 2.2.4 にバージョンを上げる

```
# ~/.rbenv 配下を最新化
$ cd ~/.rbenv
$ git pull
$ cd plugins/ruby-build
$ git pull

# versionを確認
$ rbenv versions
  system
* 2.2.3 (set by /home/vagrant/.rbenv/version)
  2.2.4

# ビルド
$ rbenv install 2.2.4

# バージョン変更
$ rbenv global 2.2.4
$ rbenv rehash

# bunlerをインストールし直し
$ gem install bundler

# その他もろもろの gem をインストールし直し
$ bundle install
```

参考: [【決定版】rbenv を使った ruby のインストール](https://gist.github.com/masutaka/aad55902efc9214bf857)
[Swift] weak キーワードってなに？

swiftを学習中に **weak** キーワードが出てきましたが、どういう存在なのか理解できなかったので、
調べた内容を備忘録として記しておきます。


# weak キーワードの登場シーン

> 循環参照の解決策のひとつ。

## 循環参照とは何か？

> お互いがお互いのオブジェクトを参照してしまう状態のこと。

 つまり、この状態では、

~~~
 AとBのオブジェクトが存在するとき、
 Aに nil を設定したとしても、B→Aの参照が残ってしまっているため、
 Aのオブジェクトがメモリ上に残り続けてしまう…。
~~~
ということです。（ちなみにBも同様です）


## では、なぜweakキーワードがその循環参照を解決できるのか？

> weak キーワードは「参照用変数(プロパティ)は参照している数にカウントしない」という制限をメモリ管理に伝えます。

~~~
※ここでのメモリ管理は
 ARC (Auto Reference Counting):アーク と呼ばれており、
 誰からも参照されないオブジェクトを自動破棄する仕組みのことです。
~~~


weak を設定することで、

~~~
AとBのオブジェクトが存在するとき、
Aに nil を設定したとき、A→Bの参照だけが残るがカウントされないため、
参照数は0となり、ARCが自動破棄することになります。（＝循環参照の解消）
~~~



以上。
Xcode で Alcatraz からプラグインのインストールに失敗する

Xcode に色々便利そうなプラグインをインストールしてみようと、
プラグインマネージャの [Alcatraz](http://alcatraz.io/) をインストールしたまではすんなりいったのですが、
そこからプラグインをインストールする段階でハマりました。

散々ググッて Alcatraz の issue もかなり目を通しましたが、
結局どこにも情報はなく、自力で解決したのでここに簡単に情報を残しておきます。

## 現象

Xcode から `Windows -> Package Manager` で Alcatraz を起動した画面で、
任意のプラグインの INSTALL をクリックすると、
プログレスが下記スクリーンショットのように 25% 程度から進まず、インストールに失敗します。

<img width="912" alt="スクリーンショット 2016-01-04 18.40.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/38837/c496cefe-c1f1-5d0a-3b6c-c3bf8813c38d.png">

## 原因

.gitconfig の proxy 設定に問題があり、
git clone がタイムアウトしていました。

## 対処法

.gitconfig の proxy 設定を見直しました。

私の場合は、proxy 内環境から、proxy 外環境で移動して作業を行っていたため、
proxy 設定を削除することで解決しました。

## 補足

Alcatraz をインストールする際に curl や brew コマンドを使ったのですが、
このときは、正常に通信できていたので完全に油断していました…。
社内ネットワークで利用していると proxy でドハマリすることがありますが、逆に社外にいても一部に proxy 設定が残っていてハマることになるとは…

ちなみに、Alcatraz でプラグインのインストールにに失敗した際、画面上にはエラーログなどは一切表示されませんが、
`/var/log/system.log` を見ると git clone のタイムアウトが記録されていて、最終的にはこれで原因に気付きました。

かなり時間を無駄にして悲しい気持ちになりましたが、
環境構築面ではこうやって死んで対処法を覚えていく、スペランカースタイルになりがちなのは仕方ないかなぁとは思いました。(白目)

## 環境情報

* OS X ElCapitan 10.11.2
* Xcode 7.2
* Alcatraz 1.1.15
GlassFishの初期セットアップつまづきメモ

あけましておめでとうございます。

年が明けて、仮配属だった元の部署から異動となり別部署の業務で使うGlassFish他をセットアップ中。
インストール、設定で躓いたポイントをメモ。

- MySQLとの連携
- 
GlassFishでMySQLを使うため、JDBCドライバを管理コンソールから追加したが「HTTP Status 500 - Internal Server Error」になり出来ない。

→どうやら、GlassFish4.1.1のバグらしい。(https://teratail.com/questions/22777)
PJ的に、ver4.1は使いたかったので下記めんどくさい手順で解決。

- 4.0をインストール
- 4.0の管理コンソールからJDBCドライバ追加
- 追加した内容の実態は「domain.xml」ファイルにあるので、その内容を4.1の同ファイルに転記

これで4.1でも追加した事になり、無事動いた。

- Eclipseとの連携
- 
Eclipseのサーバ設定にGlassFishを追加したが、ビルドエラーで「GlassFish 4.0 がターゲットランタイムにありません」と出る。

→ターゲットランタイムにある名前が間違っていた。

- 誤：GlassFish 4
- 正：GlassFish 4.0

PJの設定ファイルと標準のサーバ名の違いによるものかな？
CodeIgniterで全体レイアウトとサブビューのファイルを分ける

CakePHPのような、全体のレイアウトファイルがあって、個別のViewファイルはその一部を反映するためのもの、という運用をCodeIgniterで実現する方法について。

# ビューの内容を文字列として取得する

```php
$content = $this->load->view('subview', '', true);
```

viewメソッドはそのまま使うと指定された名前のビューの内容を出力してしまいます。
しかし第3引数にtrueを与えることで、ビューの内容を出力せず文字列として取得できます。

第2引数をセットすることでデータを渡すこともできます。

```php
$content = $this->load->view('subview', $subdata, true);
```

## 参考文献
- [CodeIgniter3 Views](http://www.codeigniter.com/user_guide/general/views.html)
- [CodeIgniter2 Views](http://www.codeigniter.com/userguide2/general/views.html)

それぞれ「Returning views as data」の項を参照。

# 取得した文字列を反映して外側のビューを出力する

```php
$data['content'] = $content;
$this->load->view('layout', $data);
```

取得した文字列を別のビューに渡して反映すれば出力できます。
【Chrome Extension】Browser Actionsでcontent scriptの任意の関数を呼び出す

自作のChrome ExtensionのBrowser Actionsにて，アイコンクリック時に任意の関数の呼び出し方で躓いたのでメモ．

#やりたいこと
Browser Actionsのアイコンをクリックしたときに，content_scriptsで指定した`script.js`の関数hogehoge()を呼びたい．
マニフェストは以下の通り．

```manifest.json

{
  "manifest_version": 2,
  "name": "Test app",
  "description": "test",
  "version": "1.0",
  "icons": {
    "image": "image.png"
  },
  "content_scripts": [{
    "matches": ["<all_urls>"],
    "js": ["script.js"]
  }],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "browser_action": {
    "default_icon": "image.png",
    "default_title": "test"
  },
  "permissions": [
    "tabs",
    "background",
    "http://*/*",
    "https://*/*"
  ]
}

```

#backgraound.js
`backgraound.js`の記述．
以下のようにClick Listenerを定義する．

```.backgraound.js

chrome.browserAction.onClicked.addListener(function(tab) {
	chrome.tabs.sendMessage(tab.id, "myAction");
});

```

ポイントは，`addListener`内で

```.js

chrome.tabs.sendMessage(tab.id, "myAction");

```

として`sendMessage`関数を呼び出す．引数の文字列は何でもOK．


次に`script.js`の記述．

```script.js

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
	if (request == "myAction") {
		hogehoge();
	}
}); 

function hogehoge() {
	console.log("hogehoge");
}
```

`chrome.extension.onMessage.addListener`を定義してやって，その中で目的の関数を呼び出せばアイコンクリックと同時に実行できる．
その際に，`backgraound.js`内の`chrome.tabs.sendMessage`の第二引数の文字列をトリガーとしている．
mqttブローカーの様な事をnode-redでやる。

#概要
スマホのブラウザで位置情報を取って、ajaxでnode-redに送る。
jsdo.itでnode-redにwebsocketでつないで、マップ表示する。

#写真
スマホのブラウザで位置情報を取る。
![loc.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/153a86d9-9a24-a93b-1f86-180e55335b36.jpeg)
node-redでjsonとwebsocketをつなぐ。
![latlon.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/db8a9746-4f1e-02a6-ee40-fc4960a40039.jpeg)
websocketでマップ表示。
![map0.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/a4a5bb15-14d4-599b-fcdd-902764932ca3.jpeg)

#検出サンプルコード
```
var lat, lng, alt, accLatlng, accAlt, heading, speed;
function GetLocation(p) {
    lat = p.coords.latitude;
    lng = p.coords.longitude;
    accLatlng = p.coords.accuracy;
    alt = p.coords.altitude;
    accAlt = p.coords.altitudeAccuracy;
    heading = p.coords.heading;
    speed = p.coords.speed;
    Render();
    Publish();
}
function GetLocationError(error) {
    alert("Geolocation Error");
}
function Render() {
    if (lat !== null)
    {
        $('#lat').html(lat);
    }
    if (lng !== null)
    {
        $('#lng').html(lng);
    }
    if (accLatlng !== null)
    {
        $('#accLatlng').html(accLatlng);
    }
    if (alt !== null)
    {
        $('#alt').html(alt);
    }
    if (accAlt !== null)
    {
        $('#accAlt').html(accAlt);
    }
    if (heading !== null)
    {
        $('#heading').html(heading);
    }
    if (speed !== null)
    {
        $('#speed').html(speed); 
    }   
}
function Publish() {
    var uri = 'http://node-red /json?latlon=' + lat + ',' + lng;
    alert(uri);
    $.ajax({
        type: 'get',
        url: uri,
        success: function(res) {
            alert('success');
        },        
        error: function(res) {            
        }
    });
}
$(function() {
    if (navigator.geolocation)
    {
        navigator.geolocation.getCurrentPosition(GetLocation, GetLocationError);
    } 
    else 
    {
        alert("お使いの端末は、GeoLacation APIに対応していません。");
    }
});

```
#マップ表示サンプルコード
```
var map;
var point;
var marker;
function ido(koko) {
    eval(koko);
    latlon = a["latlon"].split(",");
    var my = new google.maps.LatLng(latlon[0], latlon[1]);
    map.setCenter(my);
    marker.setPosition(my);
};
function init() {
    point = new google.maps.LatLng(38.0, 140.0);
	var opts = {
		zoom: 10,
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		center: point
	};
    map = new google.maps.Map(document.getElementById("map"), opts);
    marker =  new google.maps.Marker({
        position: point,
        map: map
    });
}
google.maps.event.addDomListener(window, 'load', init);
var websocket;
function setup() { 
    websocket = new WebSocket("ws://node-red /test0");
    websocket.onopen = function() {
    };
    websocket.onmessage = function(e) {
        ido("a =" + e.data);
    };
    websocket.onerror = function(e) {
    };
}
setup();

```
python3.4 unpacking lists and tuplesメモ

`date, name, price = ['December 23, 2015', 'Bread Gloves', '8.51']`とするとそれぞれの変数に引き渡すことが出来るが、変数の数とリストの中身が同じ個数でないとエラーを吐き出してしまう。

そこで`first, *middle, last`の出番

```
def drop_first_last(grades):
	first, *middle, last = grades 
	# take the first item in "first", take all of them in the middle in "middle", the last goes in "last"
	avg = sum(middle) / len(middle)
	print(avg)

drop_first_last([65, 76, 98, 54, 21])
drop_first_last([65, 76, 98, 54, 45, 23, 97, 39, 86, 21])

```

こんな感じで`middle`が中間にあるものを全て引き取ってくれる。

##zipを使ってみる
`zip`を使うことによって使うことによってタプルの中に入ってる単語同士をくっつけたりすることが出来る。

```
first = ['Bucky', 'Tom', 'Taylor']
last = ['Roberts', 'Hanks', 'Swift']
# it would be kwl to tie each other together
# this is where zip method comes in
```

そこで

```
names = zip(first, last)
#zip ties them together and throw it in a tuple called "names"
# i.g. [('Bucky', 'Roberts'), ('Tom', 'Hanks'), ('Taylor', 'Swift')]...
for a, b in names:
	print(a, b)

"""
Bucky Roberts
Tom Hanks
Taylor Swift
"""

```

##minとmaxも加えてみる
[解説動画](https://www.youtube.com/watch?v=U5I-2UZBOVg&index=40&list=PL6gx4Cwl9DGAcbMi1sH6oAMk4JHw91mC_)を参考に以下の様な感じにまとめてみた。

```
stocks = {
	'GOOG': 520.54,
	'FB': 76.45,
	'YHOO': 39.28,
	'AMZN': 306.21,
	'AAPL': 99.76
}


print(min(zip(stocks.values(), stocks.keys()))) #(39.28, 'YHOO')
# the item or the list that youve thrown first is how its gonna sort it by
# if you put names first = alphabetical order
# if you put numbers first = numerical order

print(max(zip(stocks.values(), stocks.keys()))) #(520.54, 'GOOG')

print(sorted(zip(stocks.values(), stocks.keys()))) #[(39.28, 'YHOO'), (76.45, 'FB'), (99.76, 'AAPL'), (306.21, 'AMZN'), (520.54, 'GOOG')]
print(sorted(zip(stocks.keys(), stocks.values()))) #[('AAPL', 99.76), ('AMZN', 306.21), ('FB', 76.45), ('GOOG', 520.54), ('YHOO', 39.28)]
```
vagrant up失敗ーUbuntu編ー

Ubuntuのvagrant boxを`vagrant up`した時に下記のようなエラーが出た場合の対処法。


```
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

stdin: is not a tty
mount: unknown filesystem type 'vboxsf'
```

## プラグインのインストール

```
$ vagrant plugin install vagrant-vaguest
```

僕の場合はこれで解決した。

## これで解決しない場合

```
$ vagrant up; vagrant ssh
```

の後、クライアントにて

```
$ sudo ln -s /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions; exit
```


の後

```
$ vagrant reload
```

で解決するとのこと
スタイルガイドジェネレータのsc5-styleguideがいい感じそうだったので試してみた

[スタイルガイドジェネレータを比べてみた](http://qiita.com/shwld/items/d41ba36e9fd2e636c723)の続き

## [sc5-styleguide](http://styleguide.sc5.io/)を使ってみました

```
npm init
npm install sc5-styleguide --save
```

nodeは公式に書いてないけど5.2.0でやりました
インストール意外と時間かかる

## SASSスタイルシートを作ってみる
```
mkdir test
touch test/test.scss
```

``` sass:test.scss
// Button
//
// スタンダードなボタンです.
//
// :hover   - ホバーすると色が変わるよ.
//
// Markup:
// <button class="btn primary">ボタン</button>
//
// Styleguide 1.0.0
.btn.primary {
    background: steelblue;
    color: snow;
    border: 2px outset steelblue;

    &:hover {
      background: yellow;
    }
}
```

## スタイルガイドのトップページを作成する

```
touch test/overview.md
```

``` md:test/overview.md
## スタイルガイドだよ
```

### gulpfile.jsを作成する
``` js:gulpfile.js
var gulp = require('gulp');
var styleguide = require('sc5-styleguide');
var sass = require('gulp-sass');
var outputPath = 'output';

gulp.task('styleguide:generate', function() {
  return gulp.src('test/**/*.scss')
    .pipe(styleguide.generate({
        title: 'My Styleguide',
        server: true,
        rootPath: outputPath,
        overviewPath: 'test/overview.md'
      }))
    .pipe(gulp.dest(outputPath));
});

gulp.task('styleguide:applystyles', function() {
  return gulp.src('test/**/*.scss')
    .pipe(sass({
      errLogToConsole: true
    }))
    .pipe(styleguide.applyStyles())
    .pipe(gulp.dest(outputPath));
});

gulp.task('watch', ['styleguide'], function() {
  // Start watching changes and update styleguide whenever changes are detected
  // Styleguide automatically detects existing server instance
  gulp.watch(['test/**/*.scss'], ['styleguide']);
});

gulp.task('styleguide', ['styleguide:generate', 'styleguide:applystyles']);
```

公式にあるgulpfileから主にファイルパスを変更してます

### package.jsonにscriptを設定しておく
``` json:package.json
{
  "name": "test-styleguide",
  "version": "1.0.0",
  "description": "お試しスタイルガイド",
  "main": "",
  "scripts": {
    "start": "./node_modules/.bin/gulp styleguide"
  },
  "author": "",
  "license": "",
  "dependencies": {
    "gulp": "^3.9.0",
    "gulp-sass": "^2.1.1",
    "sc5-styleguide": "^0.3.41"
  }
}
```

start スクリプトを書いた

## 実行してみる
```
npm start

# ブラウザで開く
open http://localhost:3000
```


できた

![1451899252386.png](https://qiita-image-store.s3.amazonaws.com/0/51402/5bef045b-62ae-18f2-0998-8582fa33381e.png)




コメントの制約が厳しい

``` scss:example.scss
// Section with modifiers # (1)
//
// :hover - hoverすると赤くなります # (2)
//
// Markup:
// <button class="btn primary">Primary</button> # (3)
//
// Styleguide 2.0 # (4)


# (1〜4) の部分について
(1) - セクションタイトル。ヘッダメニュー名となる
(2) - :hover時や他のclassを付与した時の説明
(3) - 実際に使う時のマークアップをhtmlタグを使って記載
(4) - [Styleguide X.X] という形式で書く X.X の部分は数字で2.1.0みたいに書く。桁数は可変にできるが、同じ番号は使えないので注意

SectionやMarkup, Styleguideなどは最初を大文字にする必要もあるので注意(間違うと変換対象にしてくれない)
```


[sc5-stylgeduigeの記述方法(Qiita)](http://qiita.com/sygw/items/55e6a3916312c502bc4f)が分かりやすかったです
データベース事始め

TensorFlowのような機械学習にはデータベースは必要不可欠です。ただ、このデータベースについての知識がゼロでしたので、まずはRDBMSからNewSQLまでの初心者向けの知識を簡単にまとめてみました。データベースに関わっている人からすれば当たり前の内容です :sweat_smile: 


#RDBMS
RDBMS(リレーショナルデータベース管理システム)は、下記のMySQLなどに代表されるRDB管理のための専用ソフトウェアです。RDBは、データを「行」と「列」からなる２次元の表（テーブル）形式で表し、複数の表と表の間でデータ同士を関連付け（リレーションシップ）を行うことができます。

- MySQL
- PostgreSQL
- MariaDB
- Oracle Databasr
- SQL Server
- DB2

また、汎用的かつ高機能なSQLと呼ばれる言語が使用でき、ACIDなトランザクションが行えることが特徴です。ACIDとは、次の４つの単語の頭文字からとったもので、どの時点でもデータが必ず正しいことが保証されます。これはとくに金融システムにはなくてはならない特性です。

- 原子性（atomicity）
- 一貫性（consistency）
- 独立性（isolation）
- 永続性（durability）

ただ、RDBMSはスケールアウトがしにくく、そのためにコストが高くなる問題があります。通常、パフォーマンスを向上させるためには、スケールアップとスケールアウトの２つの方法があります。スケールアップはコンピュータの性能をハードウェアレベルで向上させるもので、コストが高くなります。スケールアウトはクラスタや大量の安価なPCによる分散処理を行うもので、とくに後者は効率が悪いものの拡張性が高く、コストも安く済みます。スケールアウトの難しさはビッグデータを扱うには非常にコストが高くつく問題です。

また、ACIDのために、１つのプロセスやトランザクションを行うデータには排他処理が行われ、ロールバックやロールフォワードの機能を持ちますが、これらがオーバーヘッドが大きくなる要因にもなってしまいます。他にもRDBMSは画像や音声、動画などの非構造化データに向かない欠点もあります。

#NoSQL
そこでNoSQL(Not Only SQL)が登場します。NoSQLはスケールアウトのしやすさや高速なデータアクセス、スキーマレスなどが特徴で、主に下記の４つにカテゴリー分けされます。

- キーバリュー型(KVS)
- ワイドカラムストア型
- ドキュメント型
- グラフ型

まず、キーバリュー型ですが、多くのNoSQLがKey（キー）を持っていることから、ベース部分はキーバリューに属しているとも言えるかもしれません。データの管理、アクセスはキーに対して行い、そのキーに対してバリューが存在します。高速なパフォーマンスとデータ分散が行えるため拡張性に優れています。とくに、データの読込がRDBと比較して高速であることが特徴です。okuyamaやRiak
、memcached、Redisなどがあります。

ワイドカラムストア型は、列指向とも言われることもありますが、データはRDBのようにレコード（行）で管理されます。アクセスはキーバリューと同じようにキーを使用した列単位となり、複数のカラムを持ます。カラムにネスト構造を持たせられるものもあります。また、テーブルやカラムのスキーマ定義が必要なものもあります。キーバリュー型と比較して検索・集計処理を得意としており、ログデータの分析などに適していると考えられます。Cassandra、HBase
Hypertableなどがあります。

ドキュメント型は、キーに対してバリューではなく、より複雑なドキュメントとしてデータを格納します。JSONやXMLといったデータ記述書式で取り扱うことが可能です。特に、複雑なデータ構造を扱うアプリケーションにおいては、生産性高く柔軟に開発できるメリットがあり、ログ分析やWebシステム、オンラインゲームなどへの利用が考えられます。MongoDBやCouchDBなどがあります。

グラフ型は、グラフ理論に基づき、相互に結びついた要素で構成され、それぞれの間に任意の数の結びつきのあるデータ同士の関係をグラフとして表すのが適切なデータを対象とするように設計されます。グラフ型はFacebookなどで利用されているようです。グラフデータベースは、従来のRDBでは不可能だった形でデータの関係をモデル化し探索するのに役立つように作られており、データをグラフ型で格納した場合、RDBと比較して高速に横断検索をすることが可能です。グラフ型には、Neo4jがあります。

## CAP定理
これらのNoSQLですが、ACID特性はなく、下記の３つのキーワードからなるBASEと呼ばれる特性を持ち、厳密な一貫性や即時反映をあきらめることで、スケーラビリティを得ています。

- Basically Available(基本的に利用可能)
- Soft-state(状態の厳密性を追求しない)
- Eventually consistent(最終的に一貫性が保たれればよい)

また、いくつもあるデータベースはCAP定理で分類されており、基本的には一台での利用を除き、下記の３つのうち２つの機能しか満たすことができません。

- Consistency（一貫性）
- Availability（可用性）
- Partition-tolerance（ネットワーク分断耐性）

例えば、CassandraはAP（可用性と分断耐性）を、MongoDBはCP（一貫性と分断耐性）を重視しています。MySQLもCPに属しています。

# NewSQL
NoSQLのスケーラビリティを持ちつつ、ACID特性も欲しいというニーズから登場したのがNewSQLです。すでにいくつものプロダクトが登場していますが、スケーラビリティとACID特性を持ち、RDBMSのようにSQLの言語も使用することができます。VoltDBはAKB48総選挙に採用されたことで話題になりました。

- VoltDB
- ScaleDB
- NuoDB
- Clustrix
- FoundationDB
- CockroachDB

なお、MySQLのようにRDBMSにNoSQLの機能を拡張するなども行われており、RDBMSとNewSQLの境界はなくなりつつあります。

#参考
[データベースの基本と最新動向](http://www.slideshare.net/after311/ss-31274396)
[会社とデータストアと私](http://time.levtech.jp/article/a-report-intelligence-talknote-griphone_20150604/3/)
Atomが”editor is not responding”になったら

#github製Editor「Atom」
環境:MacOSX 10.11.2 (El Capitan)
　　ATOM1.3.2
プロジェクトごとに開けるし、使いやすいし、
railsでの開発ではslimにも対応してるし、軽いし、
「netbeans?何それ」という感じです。

#「Editor is not responding」でinfinite loopになり開けないよ
でもgithub謹製なのに、git commitした後に再読み込みしたりすると、
「Editor is not responding」が出てinfinite loopになったりして開けないどうしようってなること、あります。
結構焦ります。

#やっても意味なかった（やっちゃダメ）
「.git」の管理ができなくなってるんでは、と思い。

```
rm -rf .git

```
してみましたが、ダメでした。

#Macやlinuxでの解決方法
ユーザーディレクトリにある
~/.atom/storage
の中にあるファイルを削除する。

※Windows版は使ったことないですが、
C:\Users\<user name>\.atom\storage
内のファイルを削除でいけるようです。

#注意点
開いていたタブとかAtom側で管理している情報が飛んでしまいます。
なので自己責任でお願いします。

#参考
[Editor is not responding when open file #7581](https://github.com/atom/atom/issues/7581)
python-160104-plotlyADvalue > v0.1 / v0.2 > UDPでESP-8266からAD取込 / plotlyへ送る

```txt:動作確認
Raspberry Pi2 + raspbian
```

http://qiita.com/7of9/items/b7e7bb05a394807fe6cc
のソフトを動かしているESP-WROOM-02にUDPで接続し、Plotlyへデータを送る。

## 実装内容

1. WiFiアクセスポイントに接続する
2. ESP-8266へUDP通信を行い、AD値文字列を取得する (応答例: `AD,34<LF>`) 
3. AD値文字列をパースする
4. (日時, AD値)が5セットそろった段階でplotlyへ送る
5. 2から繰り返す

## プログラム

[v0.1 @ github](https://github.com/yasokada/python-160104-plotlyADvalue/releases/tag/v0.1)

- 160104-plotlyADvalue.py : メインプログラム
- utilUdpRecv.py : UDPの応答受信に使用 (recvCommand()のみ使用)

UDPで取りに行く先のIPアドレスをハードコードしている。この辺り、今後、要改善。

[v0.2 @ github](https://github.com/yasokada/python-160104-plotlyADvalue/releases/tag/v0.2)

- 先頭のデータが残っていた。配列の要素1から消していたのが間違い。

## 動作

前準備として
http://qiita.com/7of9/items/345c854e8e8b2edaa83e
に記載している通り、usernameとAPI KEYの登録をしておく。

ESP-WROOM-02が動作してAD取込している状態にてRPi2にて以下を実行する。

```
$ python 160104-plotlyADvalue.py
```

ターミナルで以下のような表示になる。added at []の表記の時にplotlyへ送られている。

```
added at ['2016-01-04 17:25:55', '2016-01-04 17:25:58', '2016-01-04 17:26:01', '2016-01-04 17:26:04']
35
35
35
35
added at ['2016-01-04 17:26:11', '2016-01-04 17:26:14', '2016-01-04 17:26:17', '2016-01-04 17:26:20']
35
37
35
34
added at ['2016-01-04 17:26:27', '2016-01-04 17:26:30', '2016-01-04 17:26:33', '2016-01-04 17:26:36']
35
35
37
35
added at ['2016-01-04 17:26:43', '2016-01-04 17:26:46', '2016-01-04 17:26:49', '2016-01-04 17:26:52']
35
37
36
35
```

## 失敗
plotlyは無料での使用時、1日50回までのグラフ更新の制限があるようだ。
この制限以下で使えるように、plotlyへ送る頻度を下げないといけない。


## 結果　

制限がかかったと思ったが、数時間後に動かしたらまたプロットできた。
今度は200データごとにプロットするようにしたら、以下のグラフが取れた。

https://plot.ly/282/~7of9/

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7b0bd088-c6a7-f4f5-9122-820aa0cc4b6a.png)

- 通常は値が50程度になる。
- 値が落ちている所は、指でフォトトランジスタを隠した時
- 値が100程度になっているのは、蛍光灯に向けた時
- 左側の400近くなっているのは、フラッシュライトで斜めから照らした時
- 右側の400近くなっているのは、蛍光灯に向けて、蛍光灯に近づけた時
SENSOR01 > esp8266_160104_ADsensor > v0.2 > AD取込 / UDP送信 (ポート7000)

以下の構成品を使用
http://qiita.com/7of9/items/989d412c551bcc630546

## 実装内容

1. WiFiアクセスポイントに接続する
2. ESP-8266がAD取込を行う
3. UDP通信が来た時に、その(IP, port)にADの値を送り返す
  - 書式: `AD,325<LF>`
4. 2以降を繰り返す
 
## プログラム

[v0.2 @ github](https://github.com/yasokada/esp8266_160104_ADsensor/releases)

## 動作確認

MacOS Xのターミナルから以下を実行 (文字列 "test" の部分は任意の文字列でいい)。

```
$ echo "test" | nc -w 1 -u 192.168.10.4 7000
```

以下のような値が返る。

```
AD,34
```
plotly > 怒られた > 50/dayのグラフ更新制限を超えた

以下を実装中
- ESP-8266がAD取込をする
- RPiがESP-8266へAD値を取りに行く (UDP)
- RPiがAD値をplotlyへ送る

とりあえず動くようになった。
https://plot.ly/280/~7of9/

しかし動かしていると以下のエラーが発生した。

> plotly.exceptions.PlotlyError: Request throttled. You've created/updated more charts than your allowed limit of 50/day. You may either wait one day or upgrade your account. Visit https://plot.ly/settings/subscription/ to upgrade.

グラフのupdateは1日50回までの制限があるようだ。(いつもの通り、ヘルプを読んでいない）。

SUBSCRIPTIONを見ると `100 API calls per day`の記載がある。100回APIコールを実行したのだろうか。

有料は月19ドル。
スタイルガイドジェネレータを比べてみた

## スタイルガイドとは

Twitter Bootstrapのように、コンポーネントごとにスタイルを見やすく定義した、CSSのコーディング規約のようなものです。

Bootstrapで作るような感じでオリジナルのデザインを作ることができるようになります。

今回は、プロジェクトに導入するため、デザイナーやプロダクトオーナーも含めたメンバーが出来るだけ触りやすいものを選びたいと思います。
比べるポイントとしては、導入の簡単さ、SASSに対応しているかどうか、あとは更新頻度を主に見ました。

| 名前 | 依存 | SASS |利点 | 欠点 |
|:------|:------|:------|:------|:------|
|[KSS](https://github.com/kneath/kss) | ruby, sinatra or rails |  ○ | 利用者が多い | あまり更新されていない |
|[kss-node](https://github.com/kss-node/kss-node) | nodejs |  ○ | node版のnode-kssもある | gulpなどの周辺ツールがバージョン追随できていないためか、あまり安定しない |
|[hologram](http://trulia.github.io/hologram/) | ruby | ○ | rubyでカスタマイズできる | rubyなのでwindows環境は辛い |
|[sourcejs](https://sourcejs.com/) | nodejs | ○ | 高機能、画面上から値を変えたりできる | 機能が多く、導入の敷居が高そう。プロジェクトファイルが多くて気軽に勧めづらい |
|[styledocco](https://jacobrask.github.io/styledocco/) | nodejs | ○ | view書く必要ないためかなり敷居低い。 | あまり更新されていない, gulp-styledoccoが更新されておらずchromeで綺麗に表示できない(gulpを使わなければ問題ないらしい) | 
|[sc5-styleguide](http://styleguide.sc5.io/) | nodejs | ○ | KSS準拠。最近も更新されている | CSSに書き込むコメントのルールがちょっと厳しく、すぐエラーになる |


最初styledoccoが敷居がとてつもなく低くいいかなと思ったのですが、chromeでの表示がおかしい問題が発生し、どうやらgulp-styledoccoが本体の更新に追いついていないせいらしい事がわかりました。

最初はあまり更新頻度は気にしていなかったのですが、今後のことを考えるとやはり活発なものを選びたいということで、sc5-styleguideに落ち着きそうです。

続き
[スタイルガイドジェネレータのsc5-styleguideがいい感じそうだったので試してみた](http://qiita.com/shwld/items/188fd8495ada8e6d3125)
mysql csvファイルのデータをテーブルにimportする方法

メモ。
任意の場所にcsvファイルを置いて以下コマンド。

```lang:mysql
LOAD DATA LOCAL INFILE '/tmp/sample.csv' INTO TABLE sample_db.sample_table FIELDS TERMINATED BY ',' ENCLOSED BY '"'  LINES TERMINATED BY '\n';
```

読み込むファイル形式のデフォルト値は、データはタブ区切り（\t）、行の終端は改行文字（\r\n）なのでタブ区切りファイルは指定無しでimportできます。
（※きっちり指定はするべきかも）

```lang:mysql
LOAD DATA LOCAL INFILE '/tmp/sample.txt' INTO TABLE sample_db.sample_table;
```
NewRelicで監視対象のサーバーをAPIを使って外す

# 背景
NewRelic Serversから監視対象のサーバーを外すときにGUIの操作でどこから外せばいいかわからなかった（ちゃんと探せばあるんだろうが・・・）

# 解決策
NewRelicが公開しているAPIをたたいて監視対象のサーバーを外すことで対応

# 準備
- 【API Key】AccountSettings→IntegrationsのAPI KeysからAPI Keyを発行しメモしておく
- 【サーバーID】NewRelic Serversのサーバー単位の情報をみたときのURLの末尾の数値をメモしておく

# 実行
```
curl -X DELETE "https://api.newrelic.com/v2/servers/{サーバーID}.json" -H X-Api-Key:"{API KEY}" -i
```
という形で実行することで削除できました！
※これでレポートはされませんが、もう必要なければ別途サーバー側でNew Relicエージェントのアンインストールしましょう
https://docs.newrelic.com/docs/apm/new-relic-apm/installation-configuration/uninstall-agent