OmniAICreator/Qiita-1.07M huggingface dataset:
ZABBIX API でユーザを追加する。

# 状況

監視用に色々なツールを使っている。
いちいちツール毎にユーザ作るのなんてやってられるか( ﾟДﾟ)ｺﾞﾙｧ!
って事なので、一個のスクリプトでいろんなツールのユーザIDを作ってしまうという至極初歩的な自動化作業。その中のZABBIXパート。

参考にしたのは [Zabbix Documentation 3.0 user.create](https://www.zabbix.com/documentation/3.0/manual/api/reference/user/create) のページ。

ZABBIX APIの利用には [pyzabbix](https://github.com/lukecyca/pyzabbix) を使います。

# 環境
* Ubuntu 14.04 LTS
* ZABBIX 3.0.3
* python3.4
* pyzabbix

# コンポーネントのインストール

```shell-session
sudo pip3 install pyzabbix
```

# ZABBIX ユーザを作成する

```py3
from pyzabbix import ZabbixAPI

ZBX_SVR_URL='http://192.168.0.1/zabbix/'
ZBX_USER='API_USER'
ZBX_PASS='API_PASS'

zapi = ZabbixAPI(ZBX_SVR_URL)
zapi.login(ZBX_USER, ZBX_PASS)

rst = zapi.user.create(
  alias   = 'Login ID',
  name    = '名前',
  surname = '苗字',
  passwd  = 'パスワード',
  usrgrps = {
    'usrgrpid': '所属させたいグループのID'
  }
)

```

# ユーザグループIDの取得

ユーザグループ名からgroupIDを探す時のコード。画面からユーザグループIDは取れるけど面倒臭いよね。なので上のユーザ作成をする前に、このコードがあれば所属させたいユーザグループIDを所得する事が出来る。

```py3
from pyzabbix import ZabbixAPI

ZBX_SVR_URL='http://192.168.0.1/zabbix/'
ZBX_USER='API_USER'
ZBX_PASS='API_PASS'

zapi = ZabbixAPI(ZBX_SVR_URL)
zapi.login(ZBX_USER, ZBX_PASS)

for group in zapi.usergroup.get( filter={'name':'探したいユーザグループ名'} ):
  if '探したいユーザグループ名' == group['name']:
    return group['usrgrpid']
```
JavaScriptでEIPとドメインを関連付ける

changeResourceRecordSets()はRoute53のホステッドゾーンIDで参照しないといけない。
なのでドメイン名からやりたいときは、listHostedZonesByName()で情報引き出してからやると良さげ。
Lambdaもpromise使えるようになったので、処理の流れはpromise使っていく。

```
var AWS = require('aws-sdk');
var route53 = new AWS.Route53({
	apiVersion: '2014-05-15',
	accessKeyId: "ACCESS_KEY_ID",
	secretAccessKey: "SECRET_ACCESS_KEY",
	region: "REGION"
});

var params = {
  DNSName: 'YOUR.DOMAIN',
  MaxItems: '1'
};
var eip = "XX.XX.XXX.XXX";
var ttl = "TTL";

route53.listHostedZonesByName(params).promise().then(
	(data) =>  {
	  console.log(data);
	  console.log(data.HostedZones[0].Id);
	  return data;
  }).then( (data) => {
	var HostedZoneId = data.HostedZones[0].Id;
	HostedZoneId = HostedZoneId.split('/')[2];

	var params = {
	  ChangeBatch: {
	    Changes: [
	      {
	        Action: 'UPSERT',
	        ResourceRecordSet: {
	          Name: data.DNSName + '.',
	          Type: 'A',
			  TTL: ttl,
			  ResourceRecords: [
				{
				  Value: eip
				}
			  ]
	        }
	      }
	    ],
	  },
	  HostedZoneId: HostedZoneId
	};
	return route53.changeResourceRecordSets(params).promise();
  }).then( (data) => {
	console.log(data);
  }).catch( (err) => {
	  console.log('Fail to add domain');
	  console.log(err);
  });
```

ちなみに成功するとこんな感じの表示が出る

```
{ ChangeInfo: 
   {
   Id: '/change/XXXXXXXXX',
   Status: 'PENDING',
   SubmittedAt: Tue Jun 07 2016 17:33:55 GMT+0900 (JST) 
   }
}
```

横着してCloudFrontもこれでやろうとしたところ、見事に怒られたのでそっちはまた後々。
javaのSimple xmlを使ってxmlをパース 


#1.Simple xml
javaで用意されている、xmlパース＆出力用の外部ライブラリ
アノテーションを使ってxmlの構造を示すことが出来る。
今回はパースするのに利用した。

公式のサイトは以下
http://simple.sourceforge.net/home.php

#2.今回表現するXML
```xml:XML
<test>
	<test2>
		<name>保険</name>
		<result>
			<total>2</total>
			<match>
				<tel>090</tel>
				<adress>2536542</adress>
			</match>
			<match>
				<tel>080</tel>
				<adress>209999936542</adress>
			</match>
		</result>
	</test2>
</test>
```
matchタグが複数出現して、出現回数をtotalに記載。
webApiかなんかで、検索したら上記のようなXMLが返ってきたことを想定
あまりストーリーに自信はないので、こんな構造のxmlという認識でお願いしたい。


#3.XMLに対応するJavaのDTOクラス

```java:DtoClass
// XMLのルート要素としてtest要素を指定
// クラス名がTestなら実は指定しなくてもよい
@Root(name="test")
public class DtoClass {

  /** シリアライズバージョン */
  private static final long serialVersionUID = 1111L;
  
  // xmlのパスで言うtest/test2配下の要素であることを明示
  @Path("test2")
  // xmlの要素であることを示す
  @Element
  private String name;

  /** 件数 */
  @Path("test2/result")
  @Element
  private String total;

  /** 一致情報 */
  @Path("test2/result")
  // 要素がふくすうある場合はElementList
  @ElementList(inline=true,required=false)
  private List<MatchDto> match = new ArrayList<>();
  
  // setter getterは省略
  
```

```java:MatchDto

@Root(name="match")
public class MatchDto {

  /** シリアライズバージョン */
  private static final long serialVersionUID = -22222L;
  
  /** 電話番号 */
  // requiredは値の必須有無を表すfalseは「必須でない」を表す
  @Element(required=false)
  private String tel;
  
  /** 住所*/
  @Element(required=false)
  private String adress;

  // setter getterは省略


```

#4.いざパース
これだけ。

```java:パースするとこ
Serializer serial = new Persister();
// fileのところはFileクラスでもよいし、ストリームでもOK
DtoClass j = serial.read(DtoClass.class, file);
```

あとは普通にsetter getterでアクセスするのみ

#5.使ってみた所感
簡単。いつの間にかxmlを操作する手段がたくさん出ているようだった。
DOM使って操作とかもうできないな。。
CentOS7でのiptablesの設定忘れるのでメモ

毎回毎回調べるのも苦痛になってきたので、ここいらでメモ残しとく。

firewalldは全然つつけてないのと、つい見慣れてるiptablesのほうを使ってしまうんです。。。

## firewalldを停止
```bash:command
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
```

## iptablesのインストール
無ければインストールする

```bash:command
yum -y install iptables-services
```

### iptablesの起動と自動起動の設定
```bash:command
systemctl start iptables
systemctl enable iptables
systemctl status iptables
```

## iptablesの設定
`vi /etc/sysconfig/iptables`

```ruby:iptables
*filter
:INPUT   DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT  ACCEPT [0:0]
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
# SSH
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# httpd
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# httpd ssl
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
```

SSHのポートを変更したら、SSHDのコンフィグも設定変更すること。
これを地味に忘れてて、1時間もハマってしまったので

`vi /etc/ssh/sshd_config`

```ruby:sshd_config
#Port 22 ← コメントアウトを解除
Port 22
```

ポート番号変更したらsshdのリロードを行う

```bash:command
systemctl reload sshd
```

ちょっとしたサーバー立てた時に設定覚えてないの。
ransackを使った複数ワードによるAND検索の実装


ransackを使って複数語でのAND検索を実装しようと思ったら、意外と情報が少なかったのでメモ。

ransackを用いた検索機能の実装としては、以下のようなものが最低構成だと思う

```rb
class EventController
  def index
    keyword = params[:q] # params[:q] = 'hello'
    @event = Event.ransack(title_cont: keyword).result
  end
end
```

上記の例では、Eventモデルのtitleカラムに対して'hello'という文字列でLIKE検索を実行している。

これに対して、キーワードを複数用いてAND検索を行いたい場合は、ransackに以下のようにパラメータを渡す

```rb
def index
  keyword = params[:q].split(' ') # params[:q] = 'hello world'
  @event = Event.ransack({ combinator: 'and', groupings: { 'a' => {title_cont: keyword[0]}, 'b' => {title_cont: keyword[1]}} })
end
```

この例では、Eventモデルのtitleカラムに対して'hello'と'world'の二つの文字列でAND検索(LIKE)を実行している。ちなみに、groupings内の'a'や'b'の部分は、ユニークな値なら何でも構わない。

さらに、ソートの条件を指定する場合は以下のように行う

```rb
@event = Event.ransack({ combinator: 'and', groupings: { 'a' => {title_cont: keyword[0]}, 'b' => {title_cont: keyword[1]}}, s: 'title desc' })
```

これらを踏まえた、最低限のAND検索の実装が以下。

```rb
def index
  key_words = params[:q].split(/[\p{blank}\s]+/) # params[:q] = 'hello world ruby'
  grouping_hash = keywords.reduce({}){|hash, word| hash.merge(word => { title_cont: word })}
  Event.ransack({ combinator: 'and', groupings: grouping_hash, s: 'title desc' }).result
end
```

params[:q]には半角スペースあるいは全角スペースで区切られた形で、複数の検索ワードが入っている(今回は'hello world ruby')。2行目では検索ワードを分割し、配列に格納している。3行目では、ransackに渡すgroupingsパラメータの中身を組み立てている。この例では、以下のようなハッシュが形成される

```rb
{
  'hello' => {title_cont: 'hello'},
  'world' => {title_cont: 'world'},
  'ruby' => {title_cont: 'ruby'}
}
```

最終的に4行目ではransackメソッドにパラメータが渡され、"titleカラムにhello、world、rubyの文字列がいずれも含まれる"という条件を満たすモデルを絞り込むことができる。
EthereumでBIP44 HDWALLETを作成する

# EthereumでBIP44 HDWALLETを作成する

ethereumでもBIP32,39,44を用いたウォレットが使えるみたいなので作ってみた

## 用意

npm で以下のモジュールをインストール

* bip39
* ethereumjs-wallet

bip39は乱数の初期化ベクトル作るだけの仕組みでビットコイン全く関係ないからビットコインのモジュールそのまま使える

## BIP仕様

* https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
* https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
* https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki

## コイン種別

* satoshilabsによるとETHは60
* https://github.com/satoshilabs/slips/blob/master/slip-0044.md

## サンプルコード

```
var bip39 = require('bip39');
var hdkey = require('ethereumjs-wallet/hdkey')

var mnemonic = 'armed bundle pudding lazy strategy impulse where identify submit weekend physical antenna flight social acoustic absurd whip snack decide blur unfold fiction pumpkin athlete';
var password = '';
var masterseed = bip39.mnemonicToSeed(mnemonic, password);
var hdnode = hdkey.fromSeedBuffer(masterseed);

var getKeyPair = function(hdnode){
    return {
        "address" : hdnode.getWallet().getAddressString(),
        "private" : hdnode.getWallet().getPrivateKeyString(),
        "public" : hdnode.getWallet().getPublicKeyString(),
    }
}

// cointype=60=eth
// m / purpose' / coin_type' / account' / change / address_index
console.log(getKeyPair(hdnode.derivePath("m/44'/60'/0'/0/0")))
console.log(getKeyPair(hdnode.derivePath("m/44'/60'/0'/0/1")))
```

# その他

* コンセンシスが作っているライブラリもbip44に対応している
* https://github.com/ConsenSys/eth-lightwallet

# 残高確認やトランザクションの送信

* GETHにつないでWEB3経由でおこなう


# PS
ethereumjs-walletを作った作者(Alex Beregszasziさん)はtrezorへのeth対応パッチをpull-requestした人なので信用できるはず
【論文シリーズ】CBOWとSkip-gramについて

## 原文
[ベクトル空間における言語特徴量の効率的推定(Efficient Estimation of Word Representations in Vector Space)](http://goo.gl/ZvBp8F)
Tomas Mikolov (2013)


## 1. 要約
* 「単語ベクトル(word vectors)」の効率的な学習方法の提示。**Word2Vec**というモデルに接続する考え方。
* 規模にして10億語超、語彙では100万語超の処理を試みる。
* 比較対象: 過去の言語処理規模では、1000万語レベルの処理が限界だった。

学習テクニックとして広く使われてきた手法は、次の3つである。
①NNLM(Neural Network Language Model)
　順伝播型NNを用いて、単語の特徴量を抽出する。教師データには、品詞タグ付けされたコーパスを用いる。
②LSA(Latent Semantic Analysis)
　精度はNNに劣る。教師なし学習で分類する。単語文書行列を特異値分解して特徴量を抽出する。
③LDA(Latent Dirichlet Allocation)
　②と同様教師なし学習モデル。LSAと異なり、単語の分布に確率分布を仮定する（ディリクレ分布およびカテゴリ分布）。文脈が類似している単語や記事を抽出できるが、計算コストが高い。


## 2. 骨子の理論
提案手法のコンセプトは、計算の複雑さの排除である。
NNLMのもつ精度を多少下げても、計算スピードの向上を狙った。
総称は、対数－線形識別器モデルという。
ポイントは、隠れ層の非線形ノードの扱いにある。

①Countinuous Bag-of-Wordsモデル(CBOW)
非線形の隠れ層を排除した。
投射(projection, 入力)層をすべてのデータ間で共有した。
言葉の由来は、投射層の共有により、語順の影響が無視され、言葉のまとまり(Bag)として、データ群を眺めることになるから。

![151126030853_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/2c6ca852-20c4-a6c6-a003-48e61beb2d95.jpeg)

②Skip-gramモデル
現前の単語データを前後の文脈ではなく、前後から離れた文中の言葉の分類に用いる。
N-gramはN文字を指示するが、接頭辞skip-との組合せから、特徴抽出の言葉のポジションが飛び飛びになっていると想像できる。

![151126030853_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/8e02227c-c5f3-4090-85fb-8fd6e5e2f23b.jpeg)

CBOWやSkip-gramは深層学習の言語モデルの基礎にもなっている。
去年出版された深層学習の総論の教科書にも説明が載っているので、参照されたい；
http://goo.gl/JTMUIv

## 3. モデル適用例
Google起因のDistBeliefというアルゴリズムを使って計算した。
NNLMに比べて、提案手法の計算時間が約1/7に減っているのが分かる。
NNの次元数は、1000を超える。
Skip-gramが高いパフォーマンスを示した。

![151126030853_3.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/5fc86dcc-3db7-c490-4ab9-eb9712ca052a.jpeg)
ローカルで開発していたnginxサイトを公開（リバースプロキシ）

理解が曖昧な部分がありますので、間違いがありましたらご指摘ください。
よろしくお願いします。

#概要
Trustにある新しいサーバーで所属部のWordPressサイトを構築(http://abc.local.kaisha.co.jp)
職場の公開サーバー(http://www.kaisha.co.jp) は管理部が管理していて、我々の部のサイトは管理部のサイトにマウントしてもらう形になる(http://www.kaisha.co.jp/ABC(公開ディレクトリ名)/)

職場の中からだと同一ネットワーク内なのでブラウザからabc.local.kaisha.co.jpに直接アクセスして所属部のWordpressを確認できるが、外部からwww.kaisha.co.jp/ABC/にアクセスしても真っ白になって上手く表示されない。
国内からではなく、海外の支所から表示されないクレームを頂いた。

***公開サーバーなのに意味ねー！！***

##確認したこと
abc.local.kaisha.co.jp でnginxのエラーログを確認する。
serverの値はwww.kaisha.co.jpだが、hostの値がオリジナル？のabc.local.kaisha.co.jpになってしまっている。

それぞれの値は考えてみれば正しいので、職場外のネットワークからabc.local.kaisha.co.jpなんて見える筈もなく真っ白なのかと思った。

##対処してみたこと
Wordpressの設定画面でサイトアドレスをwww.kaisha.co.jpに変更
Wordpressアドレスはグレーアウトしていて変更できないのでabc.local.kaisha.co.jpのまま。

Search-Replace-DB-masterツールを使ってWordpressのDB内abc.local.kaisha.co.jpをwww.kaisha.co.jpに変更
[参考Qiita](http://qiita.com/shotaro041027/items/5ee239b610809c994a60)

外部からのアクセスは管理部のFirewallを経由する。
Firewallが書き換えてしまうのか、Nignxが書き換えてしまうのか判っていないけどリクエストヘッダのHostをabc.local.kaisha.co.jpからwww.kaisha.co.jpに書き換えてしまえば良いかと思った。

[参考サイト](http://www.xmisao.com/2013/10/17/nginx-proxy-host-header.html)では

`proxy_set_header Host $host;`

になっているけど`$host`の値はログを見るとabc.local.kaisha.co.jpなので
`$server_name`を使ってみる。(こっちはwww.kaisha.co.jpになっているし）

```
location / {
    --snip--
    proxy_set_header Host $server_name;
    --snip--
}
```


ノートPCを使って、スマホテザリング経由で外部ネットワークからのアクセスを再現。
真っ白の状況が改善されログを見ても暫くエラーが吐き出されないようになった。

海外の支所は時差があるので、これで一日様子見だな・・・
WordPress移行メモ(localhost→レンタルサーバー)

# 参考にしたサイト
ローカル環境(localhost)に作ったWordPressのサイトをレンタルサーバーに移行する方法をいろいろ調べてみたところ、ここのサイトに書かれた方法が一番わかりやすかった。
http://webcre-archive.com/2012/10/04/wordpress-db-url-replace/
ここで使っている「Search Replace DB」というツール、2016年6月現在UIが多少異なっている。
というわけでその辺の変更点含めメモ。
# ドメインを書き換える
WordPressはテーブル内にドメイン名を持っており、移行先に合わせて修正する必要がある。
ただし、エクスポートしたSQL文をメモ帳で開き一括置換するだけでは問題がある。
シリアル化されたデータは「文字数:文字列」という形式のため文字数も変更する必要がある。
> 例：
> hostname:9:localhost　→　hostname:11:example.com
> img:32:http\://localhost/sample/img1.jpg　→　img:34:http\://example.com/sample/img1.jpg

一つ一つ確認しながら修正するのは時間がかかるため、Search Replace DBというツールを使った。
https://interconnectit.com/products/search-and-replace-for-wordpress-databases/

# 移行手順
- ローカル環境でMySQLのデータをエクスポートする。
- レンタルサーバーでMySQLのデータベースを新規作成し、上記のデータをインポートする。
- ローカル環境のWordPressのファイルをレンタルサーバーにアップロードする。
- wp-config.phpを開き、データベース接続に関する記述を修正する。
 
>define('DB_NAME', 'xxxxx');
>define('DB_USER', 'xxxxx');
>define('DB_PASSWORD', 'xxxxx');
>define('DB_HOST', 'xxxxx');
>自分の場合、マルチサイトを構築していたので以下の記述も修正した。
>define('DOMAIN_CURRENT_SITE', 'xxxxx');

- "Search-Replace-DB-master.zip"をダウンロードし、解凍する。
- レンタルサーバーのWordPressをインストールしたフォルダの下に"Search-Replace-DB-master"フォルダごとアップロードする。
- ブラウザから「WordPressのURL/Search-Replace-DB-master/index.php」にアクセスするとツールが起動する。冒頭に紹介した記事ではウィザード形式になっているが、version3.1.0では1画面で完結する。
- 「search for」に「localhost」、「replace with」に「レンタルサーバーのURL」を入力し、「live run」をクリックするとWordPress内のデータが置換される。
- 更新が終了したら「delete me」ボタンをクリックするとSearch-Replace-DB-masterフォルダを削除してくれる。削除し忘れて他の人にデータベースを勝手にいじられてしまうことの無いように注意。
Eclipse でショートカット(Ctrl+C) が効かなくなったときの対処方法

# 環境
OS ：Windows7 64bit
IDE：Eclipse 4.5 MARS.2 64bit （Pleiades）

# 解決する問題

突然、ソースコードのコピー(Ctrl+C)が効かなくなる現象を解決する。
右クリックでの「コピー」は効く状態。でも、Eclipseの再起動（クリーン起動）では解消しない。

# 対処方法１

Eclipse ＞ 設定 ＞ エディター ＞ テキスト・エディタ で「デフォルトを復元」を実行。

※注意：エディタの色などの設定は飛んでしまうので再設定が必要です。

# 対処方法２

パースペクティブの切替えにより、ショートカットがきかなくなる時はこちらが有効です。

パースペクティブを選択してから右クリック ＞ カスタマイズ で次のように設定

- Action Set Availability
    - SVN：ON
    - チーム：ON
- メニュー可視性
    - SVN：OFF
- ツール・バー可視性
    - SVN：OFF
    - チーム：OFF

対処方法２は、こちらを参考にしました。ありがとうございます。
[都元ダイスケ IT-PRESS | 2010-06-22 | ■[Eclipse]Eclipse 3.6 Helios × Subversive](http://d.hatena.ne.jp/daisuke-m/20100622/1277227173)
VirtualBoxでホストOSとゲストOSのフォルダを共有する。

何番煎じか分かりませんが、VirtualBox内のOS（ゲストOS）とホストOS間のフォルダ共有の方法をまとめます。
きっかけは、TensorFlowという機械学習ライブラリの利用でした。
当時（昨年の11月）、OSにWindowsを使っていたのですが、TensorFlowはLinuxおよびOSXのみで作動します。
その対策として、VirtualBoxを導入し、CentOSから動かすことにしました。

しかし、元の入力データはWindows上にあるため、ホストOSとの間でフォルダ共有する必要がありました。
そこで、フォルダ共有設定をするに至りました。

以下、操作手順です；
1.Virtual Boxを開き、設定をおす。

![151125154613_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/061a8db1-ce20-bd63-ea23-73d4b098f44f.jpeg)



2.共有フォルダから、右上のフォルダアイコンをクリック。

![151125154613_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/867d2b0e-eec4-b43b-bb8a-332592478ab5.jpeg)


3.Windows上の共有したフォルダを選ぶ。「自動マウント」にチェックをする。

4.ゲストOSを起動し、ターミナル(コマンドラインを開く)

5.ここでは、/mnt/　に、tf_outputというフォルダを共有するケースをのせる。
root権限にする。
次のようにコマンドを打つ；

```
su root
mkdir /mnt/tf_output
chmod 777 /mnt/tf_output
mount -t vboxsf tf_output /mnt/tf_output
```
※train_mnist.pyというファイルはホストOS上にあったのですが、ちゃんとVM上で共有できています。

![151125154613_3.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/2f62d813-bf70-8b0c-0d92-de549584a7a0.jpeg)
初心者向けBitcoinアプリ開発のコツ

（適宜追加していきます）

-----
# regtestモード
任意のタイミングでConfirmをするためのモード。"generate 1"とCLIから入力するだけで、瞬時にConfirmされる。

http://techmedia-think.hatenablog.com/entry/2015/05/10/123243

testnetでもテストはできるが、Confirmまでに約10分かかるため、単体テストしていると、これがなかなか不便。そんなときに使う。


# zero-confirmation
utxoが使用可能になるためには、一定回数Confirmされる必要がある。いちいち待つのが面倒なときは、min_confirmationの回数を0にしてしまう。こうすれば、Confirmationを待つことなく、utxoが使えるようになる。

ローカルでテストするときや、ローカルでトランザクション性が保証できている場合はこれでよいが、そうでないときはconfirmされずにutxoを使うと、confirmされていない怪しいutxoを使う可能性もあるので注意。
【論文シリーズ】"多接触面性識別器"について

## 原文 
[多接触面性識別器(The Manifold Tangent Classifier)](http://goo.gl/q0U8nO)
Salah Rifai, Yann N. Dauphin, Pascal Vincent, Yoshua Bengio, Xavier Muller (2011)

## 1. 要約
* 縮小自己符号化器を利用して、特徴空間の接触面を代表するベクトルを抽出する。それを利用して、識別に役立てる。
* このアルゴリズムは、次の仮説のもとに組み立てられた。
特徴空間の接触面は、多様体となる。総合的には非ユークリッド体になることもあるが、1面(chart)ずつ見れば、ユークリッド幾何が適用できる。
各層の変換と入力ベクトルの間のヤコビアンを利用して、特徴空間の接触面にまつわるベクトルをSVD（特異値分解）で抽出する。
接触面に注目するメリットは、各接触面付近は、特徴変動の感度が低いため、特徴抽出において優れている点である。



## 2. 骨子の理論
教師なし学習は、縮小自己符号化器を使って、進行する。
$$J_{CAE+H}(\theta) = \sum_{x \in D}(L(x,g(h(x))) + \lambda||J(x)||^2) + \gamma{\bf E}_{\epsilon〜N(0,\sigma^2I)}[||J(x) - J(x + \epsilon)||^2]$$

一番右の項は、このモデル特有で、入力ベクトルまわりのヤコビアンによって正則化している。
一般的な正則化は、L2正則化(重み減衰)といわれる方法で、重み行列を利用することが多い。



## 3. モデル適用例
MNISTを使ったパフォーマンスの比較が下表である。
いずれの学習データ数でもMTC(Manifold Tangent Classifier)が高い性能を発揮した。

![151125121842_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/84c8db3c-4aeb-4d59-0baf-6eadd28efd77.jpeg)
angularjsでresourceをキャンセルする方法

angularjsのngRouteを使ってシングルページWEBアプリケーションを作っていると、画面遷移した時に前画面の通信中のajaxをキャンセルしたいなと思いました。

$q.defer();

調べてみるとどうやらこのメソッドを使うとそれが実現できるようです。

で、僕はこんな感じで実装しました。

```
// ajaxのtaskを監視する変数を初期化します
$scope.ajax_tasks = null;

// 各ページで実行されるajaxを最初にscopeに入れます。
$scope.$on('$routeChangeSuccess', function(angularEvent, current, previous){
	$scope.ajax_tasks = $q.defer();
});

// resourceのtimeoutメソッドにtaskを入れます
$resource('endpoint url', {}, {save: {timeout:$scope.ajax_tasks.promise}}),

// ページ遷移のアクションが走ると前ページの通信中ajaxを全てキャンセルします
$scope.$on('$routeChangeStart', function(event, next, current){
	if($scope.ajax_tasks) $scope.ajax_tasks.resolve('cancelled');
});
```
scopeじゃなくてサービスでもOK

$httpでも同じようにtimeoutにpromise入れれば動作するみたいです。

以上、angularjsでresourceをキャンセルする方法でしたー
【論文シリーズ】自然言語処理にニューラルネットワークを適用する

## 原文
[(ほぼ)イチからの自然言語処理(Natural Language Processing (almost) from Scratch)](http://goo.gl/jh3csB
)
Ronan Collobert (2011)

## 1. 要約
* 自然言語処理の分野に、DNNを適用した論文である。



## 2. 背景
*************************************************************************
従来の自然言語処理の代表例に、POS(Part-Of-Speech tagging；品詞タグ付け), CHUNK(chunking), NER(Named Entity Recognition), SRL(Semantic Role Labeling；単語意味解析)がある。
アルゴリズムの複雑さは違えど、根本的なプロセスは4つともに同じである。
すなわち、単語をタグ付けし、入力データに変形する。

従来は、データ化した単語に対して、人の手によって特徴量を設定して、SVMなどの手法で、語順を学習させてきた。
そのため、ここでも、特徴量を自ずから抽出できるかという文脈が発生し、DNNの適用が考案された。



## 3. 骨子の理論
使っているNNの理論に、新しいものはない。
ポイントは、NNに適用するにあたっての、言語のデータ整形である。
一つの単語を入力ベクトルと捉える。単語の性質の数をdとし、各単語について、それぞれの性質に応じた数値に変換し、d次元ベクトルを作る。
文章であれば、単語分だけベクトルをつくり、これを入力ベクトルとする。
ベクトルの次元に応じて、重みを用意する。これは一般的なNNと同じ。
畳み込みをして特徴抽出をするので、CNNに近いプロセスになる。(paddingはワードで行う。)

![151125144937_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/83cd2864-bf19-f718-3ef4-d01e0caa8ac1.jpeg)


活性化関数は、HardTanhという関数を用いる(tanhがあるが、双曲線関数の形式ではない)

```math
\begin{eqnarray}
HardTanh(x)=\left\{ \begin{array}{ll}
-1 & (x \lt -1) \\
x & (-1 \leqq x \leqq 1) \\
1 & (x > 1) \\
\end{array} \right.
\end{eqnarray}
```

パターン認識は、ソフトマックス法からの対数尤度を使った推定になる。アウトプットの創出が、グラフ転送ネットワークの概念に対応している。

```math
\log p([y]_1^T|[x]_1^T, \tilde{\theta}) = s([x]_1^T, [y]_1^T ,\tilde{\theta}) - logadd_{\forall[j]_1^T}s([x]_1^T, [j]_1^T ,\tilde{\theta})
```

単語の数値化は、場合によっては正規化できない場合がある。このとき、データの分布が条件付き確率場(Conditional Random Fields)に従う点に注意する。



## 4. モデル適用例
SENNA(Semantic/syntactic Extraction using a Neural Network Architecture)という手法は、上記のNNの理論を組み込んで形成したアルゴリズムである。
SENNAと従来の方法(Benchmark)の性能比較した結果を下の表に示す。
両者とも、精度的には拮抗しており、特徴量を自ら抽出できるSENNAの方が有能である。

![151125144937_4.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/a6690fe1-905d-69b8-a617-eb66b3b703bb.jpeg)
Fastly のログを Papertrail にストリーミングする

Fastly はログをストリーミングする機能を持っています。CDN のログをほぼリアルタイムに受け取れるというのは今までにない機能ですので、これを活用したいところです。しかし、ログをストリーミングすると、受ける側の方で Syslog サーバを立てる必要があったりして手間がかかります。そんな時、ログ系のクラウドサービスを使えば、お手軽にログをストリーミングして色々な処理を行なうことができるようになります。

今回は、[Papertrail] (https://papertrailapp.com/) へログをストリーミングする設定を作ってみます。Papertrail は、Slack や AWS SNS などと連携や、リアルタイムにログを確認するビューアーもあったりして、便利なサービスです。

![EventViewer](http://help.papertrailapp.com/assets/images/search-and-tail-02_normal.png)

# 下準備

Papertrail のアカウントを持っていない場合は、メールアドレスだけで作れるようなので、[Papertrail] (https://papertrailapp.com/) にてアカウントを作成してください。

Fastly のアカウントを持っていない場合は、[5分間でCDNを試してみる](http://qiita.com/ToshiAizawa/items/6a0d22f4f26eb0b1981f)を参照しつつ、アカウントと配信設定を作成してください。

# Papertrail 側の設定

1. Papertrail にログインした状態で、「Log Destinations」を選択し、「Alternatives」をクリックします。

![papertrail-2.png](https://qiita-image-store.s3.amazonaws.com/0/39350/962be0f4-52d1-719f-cba1-a18f4622e999.png)

2. 「My system’s hostname changes」ラジオボタンをクリックし、「What should we call it?」 に後で見た時にわかるような名前を付けておきましょう。

![papertrail-3.png](https://qiita-image-store.s3.amazonaws.com/0/39350/ab6fc54a-9575-8586-3e0d-cf0e640f97d4.png)

3. 「Save」ボタンをクリックして設定を保存すると、「Address」に入力するホスト名とポート番号が表示されます。システム側の設定案内が出ますが、設定はできあがっていて、ホスト名とポート番号が表示されます。

![papertrail-4.png](https://qiita-image-store.s3.amazonaws.com/0/39350/9c84d2d4-a754-f206-af41-bd01152e8c21.png)

# Fastly 側の設定

まず、配信設定の画面に行きましょう。https://app.fastly.com にログインした状態で、画面上部メニューの「configure」を選択し、配信設定を選択します。

![configure-1.png](https://qiita-image-store.s3.amazonaws.com/0/39350/958c20f3-e58a-5e68-ae0c-6dec7dbf1709.png)

次に、「＋ Clone」をクリックして新しい配信設定のバージョンを作成しましょう。その状態で、左メニューの「Logging」を選択し、画面下の方までスクロールすると、Papertrail へのログ配信設定を見つけることができます。

![configure-4.png](https://qiita-image-store.s3.amazonaws.com/0/39350/4bd18614-d781-0813-44f4-97336845c4ff.png)

「＋ New」ボタンをクリックすると、以下のようなポップアップ画面が表示されます。

![configure-3.png](https://qiita-image-store.s3.amazonaws.com/0/39350/19625848-7a22-6327-baa7-92629e8db194.png)

「Name」は好きな名前を付けておきましょう。「Address」は、Papertrail のエンドポイントを指定する必要がありますので、Papertrail の設定画面から持ってきましょう。うすい字で、「Dedicated to Fastly」と書いてある方を使ってください。ホスト名とポート番号は Papertrail の設定を作るたびに違いますので注意してください。「Format String」はログのフォーマットを指定できるものですが、今回はそのままとしておきます。最後に「Create」をクリックすればできあがりです。

![papertrail-2.png](https://qiita-image-store.s3.amazonaws.com/0/39350/962be0f4-52d1-719f-cba1-a18f4622e999.png)

あとは、Papertrail のイベントビューアーを開いて、ログが流れてくるのを確認しましょう。テレテレと流れてくるログを見ていると、ちょっと嬉しくなります。

## 参照

Fastly のログストリーミングに関するヘルプページ（https://docs.fastly.com/guides/streaming-logs/setting-up-remote-log-streaming）

Papertrail のヘルプページ（http://help.papertrailapp.com/kb/hosting-services/fastly/）
SlackのBotkitでファイルをアップロードする方法

# 概要

Botkitで作成したSlackのBotからローカルにあるファイルをアップロードする方法です。

# 環境

```bash
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G1108
$ npm -v
3.10.9
$ node -v
v7.2.0
```

# ファイルのアップロード

Botに対して「ファイルちょうだい」と言うと特定のファイル（ここではhoge.txt）をアップロードしてもらうようにします。
Slack APIのfiles.uploadを使います。
https://api.slack.com/methods/files.upload

```js:index.js
const Botkit = require('botkit');
const fs = require('fs');

if (!process.env.token) {
  console.log('Error: Specify token in environment');
  process.exit(1);
}

const controller = Botkit.slackbot({
    debug: false
});

controller.spawn({
    token: process.env.token
}).startRTM(function(err){
    if (err) {
        throw new Error(err);
    }
});

controller.hears('ファイルちょうだい',['direct_message','direct_mention','mention'],function(bot,message) {
    const messageObj = {
        file: fs.createReadStream('./hoge.txt'),
        filename: 'hoge.txt',
        title: 'hoge.txt',
        channels: message.channel
    };

    bot.api.files.upload(messageObj, function(err, res){
        if(err){
            console.log(err);
        }
    });

});
```

messageObj.channelsは任意ですが、指定しないとアップロードしたことを発言してくれないのでダウンロードはもちろん、アップロードされたことすら気づきません。

結果はこんな感じです。

<img width="1122" alt="file-upload.png" src="https://qiita-image-store.s3.amazonaws.com/0/30447/9ff39605-eadb-4770-bfbe-d1c345304b64.png">

# 修正メモ (2016/11/29)
コメント欄で教えていただき、fs.createReadStreamを使うことによりBotkit v0.4.2で画像ファイルも正常にアップロードができることを確認。
GMOクラウドALTUSでCentOS7にAipo8をインストール

基本的には[Aipo公式サイト](http://free.aipo.com/install.html)の手順通りでいいのですが、一点だけひっかかったので備忘録もかねてメモ。

# 環境
GMOクラウドALTUS　Basic：リソースパック1つ分（1vCPU[^cpu],1GBメモリ）
OS:CentOS 7
Aipo:version 8.1.1

[^cpu]: ALTUSの方にCPUのスペックが公開されてなかったので問い合わせたら1vCPUで行けるとの回答をもらいました。ちなみに仮想サーバー立ててみたところ実際のCPUは2000MHzとの表示。

# 手順
 0. ALTUSで仮想サーバーをたてる。テンプレートは`CentOS 7.1.1503 64bit_20160223`を選択
 0. コンソール（SSHクライアントでも可）から`root`でログイン
 0. `wget` でインストールファイル取得（linux64bit）  
 0. 必要ライブラリのインストール
 0. ファイル`aipo-8.1.1-linux-x64.tar.gz`を解凍し、解凍されたディレクトリに移動
 0. インストール用スクリプトを実行(インストール先は指定しなければ【`/usr/local/aipo`】になる) 
 0. Aipoを起動してブラウザからアクセス、発行されたadminIDとPASSでログインしてブラウザから各種設定 

ログイン後のコマンド

```
wget https://osdn.jp/projects/aipo/downloads/64847/aipo-8.1.1-linux-x64.tar.gz

yum install gcc nmap lsof unzip readline-devel zlib-devel

tar -xvzf aipo-8.0-linux-x64.tar.gz
cd aipo-8.1.1-linux-x64.tar.gz

sh installer.sh /usr/local/aipo

/usr/local/aipo/bin/startup.sh
```

# 問題発生
インストールは完了して、アクセス先のURLとかも表示されるのに、いざアクセスするとタイムアウトになる。
ログイン画面に到達できないのでその後の設定も一切できない。

# 原因と対策
コミュニティとかみてると、PostgreSQLが起動していないことが原因のよう。
`startup.sh`内で`sudo`してるので、`sudo`権限で引っかかってるらしい。

`/etc/sudoers`を編集して`Defaults requiretty`を コメントアウト。

編集後に
`/usr/local/aipo/bin/startup.sh`

でログイン画面にアクセスできるようになりました。
【Analytics】カスタムセグメントで特定条件のユーザーのみを確認する方法

このページではAnalyticsのカスタムセグメント機能を用いて、特定の条件（新規/リピ、デバイス別、性別ごと）などでユーザーをセグメントして情報を抽出する方法をまとめています。

#目的

ユーザーデータを深掘りする時に、例えば
**女性で18~24歳でリピーターのスマホユーザー**
だけにセグメントしたい場合、どうデータを見ればいいかわかりません。

カスタムセグメントでは一度設定したものは
どのサイトでも共通して使えるので、しっかり勉強して設定しておきましょう

#やり方

##セグメントの場所

![a7e99da4-d9e1-badc-283e-389f65e64ef1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50485/4a6cf035-b0c1-011d-016e-52ce16410e8c.jpeg)


どのサマリー画面にもあります。
上部の[+セグメント]と書いている場所を押しましょう。

![f892b775-4304-6472-f62c-22637186b5a4.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50485/436a822b-fde6-934f-389f-a3acf59ecf27.jpeg)


セグメント選択画面が出てきます。(人によって違います)
デフォルトでもいくつかあり、この中から選んでも良いのですが
せっかくなので**女性で18~24歳でリピーターのスマホユーザー**のセグメントを作りましょう

##カスタムセグメントの作成

![スクリーンショット 2016-06-07 15.20.00.jpg](https://media.qiita.com/files/9d2141fb-87be-9537-d32c-5364ac2ee787.jpeg)

ここを押します。

![スクリーンショット 2016-06-07 15.22.06.jpg](https://media.qiita.com/files/56fcb180-f792-7210-6006-7c495eb8a826.jpeg)

先にセグメント名を入力しておきます。
カスタムセグメントは管理しやすいように各自で命名規則をしっかりつけましょう。

- [これが最強！Google アナリティクスのセグメントネーミングルールを真剣に考えて運用してみた](https://ga.ferret-plus.com/120585)

##カスタムセグメントの設定

**女性で18~24歳でリピーターのスマホユーザー**のセグメントを作る場合

- ユーザー属性　→　性別：女性
- ユーザー属性　→　年齢：20代(18~24)
- テクノロジー　→　デバイスカテゴリ：モバイル（完全一致）
- 条件　→　ユーザータイプ：Returning Visitor(完全一致)

という設定で保存します。

##完成！

![b01cb7ed-94ac-0c97-1576-6845e2673625.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50485/cb6634d2-4619-52e3-6028-5636296fd198.jpeg)


セグメントができたら色んなサマリーを見てみましょう。
セグメント別の比較も出てくるのでとても便利です！

#まとめ

- カスタムセグメント機能でどんなユーザーも抽出できる
- セグメントの命名規則はちゃんとしよう
- グラフと数値で比較できるのでとても便利
ChefTips: ohai の追いかけ方

自動でOS上のいろいろな情報を取得してきてnode変数に格納してくれる Chef Ohai は便利ですが、どのKeyにどんなValueを入れてくれているのか探すのもそれはそれで骨が折れる作業です。

ohai を実際に実行して、目を皿にしながら読んでいってもいいのですが、下記のように chef-apply を使いながらみていくと楽ですよ、というお話です。

まず最上位の Key を取得します。

```bash:Shell-Out
$ chef-apply -e 'node.keys.map {|x| puts x}'
tags
etc
current_user
lsb
kernel
(中略)
```

次に `etc` Key の下のKeyを取得します。

```bash:Shell-Out
$ chef-apply -e 'node[:etc].keys.map {|x| puts x}'
passwd
group
```

どんどん下の階層に降りていきます。

```bash:Shell-Out
$ chef-apply -e 'node[:etc][:passwd].keys.map {|x| puts x}'
root
bin
daemon
adm
lp
(中略)
```

続々。。

```bash:Shell-Out
$ chef-apply -e 'node[:etc][:passwd][:root].keys.map {|x| puts x}'
dir
gid
uid
shell
gecos
```

最下層アタリ迄ついたなー、と思ったら、直接 nodeオブジェクトを puts してください。

```bash:Shell-Out
$ chef-apply -e 'puts node[:etc][:passwd][:root][:dir]'
/root
```

お疲れ様でした。

参考/引用: [chef-solo,chef-shellより更にミニマムなchef-apply@Qiita](http://qiita.com/sawanoboly/items/770fe24058fab5ab613d)
Macに差したSDカードをBoxSyncのデフォルトフォルダにする

意外にもBoxSyncのデフォルトフォルダって変更できないのでこちらに覚え書き。
目的はMacに差したSDカードにBoxSyncディレクトリを作成して、資料をそこに置いてクラウドと同期したい。です。

###環境
OS X ElCapitan : 10.11.5 
BoxSync : 4.0.7415

やり方はこちらのURLを参考にしました。
Can An Admin Change the Default Folder Location for Box Sync?
https://community.box.com/t5/Box-Sync/Can-An-Admin-Change-the-Default-Folder-Location-for-Box-Sync/ta-p/84

##1.まずは既存のBoxSyncをアンインストール

How Do I Install or Uninstall Box Sync 4.0?
https://community.box.com/t5/Box-Sync/How-Do-I-Install-or-Uninstall-Box-Sync-4-0/ta-p/85

1) BoxSyncを既に導入済みの際はアプリを削除
2) アプリを削除してもいくつかファイルやディレクトリが残っているので削除

    Macintosh HD/Users/[username]/Library/Logs/Box/Box Sync/
    Macintosh HD/Users/[username]/Box Sync/
    Macintosh HD/Users/[username]/Library/Application Support/Box/Box Sync/ 
    Macintosh HD/Library/PrivilegedHelperTools/com.box.sync.bootstrapper
    Macintosh HD/Library/PrivilegedHelperTools/com.box.sync.iconhelper

(自分の環境では最後の com.box.sync.iconhelper は存在しませんでした)

##2. ".plist" ファイルを作成する

1) テキストエディターを使います。Mac標準のでOK
2) テキストエディターを開いて以下のテキストをコピペします。

    <!--?xml version="1.0" encoding="UTF-8"?--><plist version="1.0"><dict><key>SyncRootFolder</key><string>/Users/<Username>/Desktop/Box Sync</string></dict></plist>

3) **/Users/<Username>/Desktop/Box Sync** を変更したいディレクトリに修正します。
(作成済みのディレクトリではダメです。あとでエラーになりました。ちなみに自分のSDカードで指定したパスは /Volumes/Data/BoxSync)

4) このテキストファイルを **com.box.sync.plist** という名前で **Macintosh HD/Library/Preferences/** ディレクトリに**“プレーンテキスト”**として保存します。
（/Users/ユーザープロファイル/Library/Preferences とは違う別のディレクトリなので注意) 

##3.BoxSyncをインストールします。
.plist で指定したディレクトリがBoxSyncディレクトリとして機能するようになります。
D言語くんからの問題解説

# 問題
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">D言語くんからの問題 <a href="https://t.co/mh8p6Jjeqf">pic.twitter.com/mh8p6Jjeqf</a></p>&mdash; 井山・禿・梃子歴史館 (@__pandaman64__) <a href="https://twitter.com/__pandaman64__/status/739709393508261888">2016年6月6日</a></blockquote>

# 答え
何も出力されない．
https://dpaste.dzfl.pl/8feee9d7d046

# なぜなのか
## Range
D言語は複数の要素を持つオブジェクトをレンジ(Range)という共通のインターフェイスで扱えるように設計されています．配列やスライスといったコンテナをRangeとして扱うこともできますし，上の`iota(10)`も1から10までの整数を表すRangeの一つです．

さらにD言語では，Rangeを加工して新たなRangeを作る，ということが簡単にできます．例えば，`map!fun`[^1]はRangeを受け取って各要素に`fun`を適用した結果からなるRangeを返す関数ですし，`filter!pred`は引数のRangeの要素をそれぞれ`pred`に渡して，`true`が返ってくるような要素だけを集めたRangeを返す関数です．標準ライブラリにはこのようなアルゴリズム関数が数多く存在し，これらを入力のRangeに次々と適用して必要な情報を取得するのがD言語における標準的なコーディングスタイルです[^2]．

## 遅延評価
この問題で重要なのは，**Rangeは遅延評価される**ということです．つまり，`map`や`filter`を呼び出した段階では処理は行われず，`map`等の戻り値のRangeを評価した時点で初めて元のRangeに対しての処理を実行するということです．それでは，Rangeを評価するにはどうすればよいのでしょうか？一番典型的な方法は，`foreach`文を用いることです．

```d
void main(){
  auto range = iota(10).filter!"a % 2 == 0".map!"a + 1"; //この段階では処理は実行されない

  foreach(const v;range){ //ここで初めて処理を実行する
    wrieln(v); //出力 `1 3 5 7 9 11`
  }
}
```

`foreach`文はセミコロンの右側のRangeを初めから走査します．具体的には，`v`に`range.front`[^3]を代入してブロックを実行した後，`range.popFront()`の呼び出しによってRangeを次の要素に進めます．これを`range.empty`[^3]が`true`となるまで繰り返します．

それではアルゴリズム関数の実装はどう なっているのでしょう．アルゴリズム関数の結果のRangeは，元のRangeを保持しています．それを`inner`と書くことにしましょう．`filter!pred`の結果のRangeは`popFront()`が呼び出されたときに`inner`を空になるか`pred(inner.front) == true`となるまで進めます（`inner.popFront()`）．また`map!fun`では`front`の呼び出し[^4]に対して`fun(inner.front)`を返します．ここでは，アルゴリズム関数の結果のRangeに対して`front`や`popFront()`を呼び出して初めて元のRangeに対しての処理が行われています．これがRangeの遅延評価です．

問題に立ち返ってみましょう．`iota(10).filter!"a % 2 == 0".map!print`とRangeを生成したはいいものの，このRangeは評価されていません．ですから，遅延評価により`filter`や`map`の処理は行われず，結局何も出力されずにプログラムは終了してしまうのです．

# おまけ
この問題は友人が用意してくれた枠を使って10分で作りました．置いておくのでご自由にお使いください．

![D言語君からの問題.png](https://qiita-image-store.s3.amazonaws.com/0/11714/1b272362-17f8-1b45-5286-8938692c2401.png)



[^1]: `fun`は関数だと考えてください．問題では`filter`に文字列を渡していますが，このとき`filter`内部ではこの文字列を`a`を第一引数とする関数としてコンパイル時に解釈しています．このように柔軟なプログラムが書けるのもD言語の強力なコンパイル時処理の恩恵です．
[^2]: D言語にはUFCS(Universal Function Call Syntax)という機能があり，`a.func(b)`という式は`func(a,b)`とも解釈されます．問題で言えば，本来は`map!print(filter!"a % 2 == 0"(iota(10)))`と書く必要があるのに対し，UFCSによって`iota(10).filter!"a % 2 == 0".map!print`というメソッドチェーン形式の記述が可能になります．
[^3]: `range.front`はRangeの先頭要素，`range.empty`はRangeが終端に達したかを表す
[^4]: UFCSにより，プロパティの参照`a.prop`は0引数メンバ関数の呼び出し`a.prop()`または1引数関数の呼び出し`prop(a)`とも解釈されます．
Cordova の platforms / plugins ディレクトリーは .gitgnore に入れて良い

Apache Cordova で、`cordova platform add <platform_name>` すると生成され、`cordova build` や `cordova run` などの実行時に時々書き換わる platforms ディレクトリーと plugins ディレクトリー。
.gitignore に入れて良いのかどうか迷っていたのですが、入れて良いようです。

これらのディレクトリーは、別の環境では

```shell-session
$ cordova prepare
```

で config.xml が解釈され、再度生成されます。

※どうも世に出回っている .gitignore だと、platforms/android/ 以下の一部のディレクトリーのみリポジトリーに含めないようにしているものもあるので、少々自信がないところでありますが…
pythonでタイムアウトを簡単に実装したい

Pythonでタイムアウトが実装されていないライブラリでタイムアウトを使いたい時とかに使えそうなライブラリ

**timeout-decorator**
https://github.com/pnpnpn/timeout-decorator

**サンプル**

```python:test_timeout.py
import time
import timeout_decorator


def very_long_function():
    for i in range(100):
        print i
        time.sleep(1)


@timeout_decorator.timeout(5)
def test():
    very_long_function()


if __name__ == '__main__':
    try:
        test()
    except:
        print "test timed out :("
    else:
        print "test finished successfully :)"
```

実行結果

```
$ python test_timeoput.py
0
1
2
3
4
test timed out :(
```
【開発環境構築】ローカルWindowsPC＞Docker＞Drupal【第一章：はじめてのDocker Toolbox】

【第一章：はじめてのDocker Toolbox】　←いまここ
[【第二章：Docker上にLAMP環境を作る】](http://qiita.com/Elarneb/items/b7dc476e57e1bfdb53d6)

## 【経緯】
現場「Docker使おうぜ。つーかお前先陣切ってやれ」
俺「ウッスｗｗｗｗｗｗ（触りしか知らねえええええｗｗｗ）」

##【やること】（最終目標）
Drupal7を使ったWEBサービス（PHP5.4）を、改修するペチパーとしてのお仕事。
未来俺「Docker？バリバリっすよ任せてください。いっぱい万円ください。」

##【やること】（第一章）
今俺「あれでしょ？よく知らんけどDockerとかいうのを使えばリリースが楽になるんでしょ？ｗｗ」
来月にはAWS上に開発やらStagingやら環境作りするらしいけど、ひとまずDocker導入の実験として、手元のPC上に開発環境を作りたい。
自社の先輩が「今はVagrantよりDocker Toolboxでインストールすることが多いかもですねー」と仰っていた。
よっしゃ！よう知らんけどそれ入れてみればいいんやろ！

## 【PC】
Windows7(64bit)、メモリ16GB
![pc.png](https://qiita-image-store.s3.amazonaws.com/0/128091/07c80bc6-62ab-c9a8-248e-5ee395554947.png)

## 【Docker Toolbox】
この記事全体として、基本は　[Docker Toolbox の使い方](http://devcenter.magellanic-clouds.com/learning/docker-toolbox.html)　を参照しています。

>Docker Toolbox は、Docker 環境を簡単に構築するためのインストーラです。現在、OS X (Mac) と Windows 用に提供されています。
Docker は、Linux 上で動作するため、OS X (Mac) や Windows では、Docker が動作する Linux 仮想マシンを準備し、それを利用する形態をとります。

とりあえず脳味噌停止状態でインストーラーをポチポチしてれば・・・
目の前のWindowsPCの上にLinux仮想マシンができて、その上にDockerが乗っかった状態が作れる、らしい。
かっこよく使いこなすのは後にして、乗っけるだけ乗っけます。

## 【Docker導入】
Docker Toolboxを使ってDockerを導入する

前述の参照先の右のほう、`インストール（Windows 編）`をクリックして、そこから先を順に実行していき・・・・

しかし、
`10.ここで、Docker 仮想マシンを準備します。`
`「Docker Quickstart Terminal」をダブルクリックします。`したら・・・・

![docker_error.png](https://qiita-image-store.s3.amazonaws.com/0/128091/59db5821-2dfa-75f9-4aea-c6d8d5ef3b97.png)
`Error creating machine: Error in driver during machine creation: 
 This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is `
・・・なんとかかんとか

え？V-MAX？enabled？よし、`レイ、V-MAX発動！`

・・・どうやらBIOS設定画面でいうところの「仮想化支援機能」というやつが無効になっているのが原因でエラーらしいです。
前にも何かの時に触ったな・・・
[参考](https://engineers.weddingpark.co.jp/?p=59)

では、PCを再起動、BIOSセットアップの画面を表示します。
CPUのタブにありましたね、`VT-X`とやらが。
きっとAMDのCPUだったらAMD-vの設定をするところがあるのでしょう。

・・・Enableにしてきましたよ・・・
SAVE&EXITして、Windowsに戻ってきました。
再度、「Docker Quickstart Terminal」をダブルクリックします。
![kujira.png](https://qiita-image-store.s3.amazonaws.com/0/128091/b63d4828-46db-fe18-299e-369661bf8675.png)

くじらｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!
こいつのぬいぐるみ売ってないかな。

あとは当初のマニュアル通り、machineの作成までを実行しました。


さて、ここから何をどうすればいいんだ・・・？
まだ`LAMP環境`のうちのLの字しか出来てないんだろこれ？
・・・いや、サーバーOS選んだ覚えとかないから、さらにCentOSとかを入れるのか？
まずはそのあたりから調べなくちゃな・・・

[続く。](http://qiita.com/Elarneb/items/b7dc476e57e1bfdb53d6)
カレンダー作成関連メモ

直感的に日時を指定したい場合によく使われるカレンダー機能についていろいろ試行錯誤した結果をメモに残しておく。
各々の方法の試した結果は別記事：試行錯誤編に記載する。

日付だけでなく、時間も指定してしまいたい場合に幾つか方法がある

1 ``datepicker``と``timepicer``のあわせ技  
> [JQueryUIのdatepicker](https://jqueryui.com/datepicker/)とJQueryUIの公式サイトからは入手できないが[github](https://github.com/jonthornton/jquery-timepicker)から入手できるtimepickerを使う。
参考：[datepickerとtimepickerを使って入力しやすいフォームを作る](http://ryus.co.jp/blog/datepickertimepicker/)

2 ``datetimepicker``を使う　
=>別記事作成　[カレンダー試行錯誤編:datetimepicker](http://qiita.com/tagosaku324/items/ee6391e29405421e8056)
> [DateTimePicker](http://xdsoft.net/jqplugins/datetimepicker/)から入手。
入手ZIPを解凍した中にある、index.htmlを起動すると、ほとんどのサンプルをみることができるので便利。
参考：[日付や時間を直感的に選択できるDateTimePicker](http://ascii.jp/elem/000/000/883/883101/)

また、デザインをどうにかしたい場合は``bootstrap``を使用する方法もある模様。
>[AdminLTEのdaterangepickerをDatePickerまたはDatetimePickerとして使いたい](http://qiita.com/albyte/items/3d379b88929385742a46)
[Bootstrap 3でDatetimePickerを使いたい](http://qiita.com/albyte/items/775e92f02625bc0738a1) 

３ ``複数ヶ月のカレンダーを表示したい``
=>別記事作成　[カレンダー試行錯誤編:datepicker複数月表示](http://qiita.com/tagosaku324/items/acd9f2113fe770d341e5)
>
複数ヶ月のカレンダーを表示したい場合にはこちらが参考になりそう。
[jQueryのカレンダー・期間選択のプラグインなど、あれこれ。](http://linkerdesign.github.io/journal/2010/02/jquery-1.html)
[issue in rendering jquery datetimepicker into a modal](http://stackoverflow.com/questions/35644962/issue-in-rendering-jquery-datetimepicker-into-a-modal)

[人気ランキング - jQueryカレンダー](http://hp-html.jp/rank.cgi?kt=01_19_25)というものがあるらしい。
最近のはやりを取り入れるのに参考になるかもしれない。
S3を使っていて、CloudFront+S3に変えた時のパスの変更について

若干手間取ったのでメモ

仮にS3のパスを
`//s3-ap-northeast-1.amazonaws.com/xxxxxxxx/common/img/・・・`
だったとする。

CloudFrontのパスが
`//abcdefg.cloudfront.net/`
だったとしたら、

`//abcdefg.cloudfront.net/common/img/・・・`

こうなる。
Facebook SDK for .NETの戻り値で型付けを利用する


# 概要

[Facebook SDK for .NET](https://github.com/facebook-csharp-sdk/facebook-csharp-sdk)では、GetTaskAsync()等でユーザーのプロフィール情報等を取得できるのですが、型を何も指定しないとdynamic型で返されます。dynamic型は便利ではあるのですが、Visual StudioなどのIDEでインテリセンスが使えません。
後々のユニットテストや開発効率のことも考えると戻り値に型を持たせた方が良いため、そのように実装する方法を紹介します。

実装が終わると、下図のようにインテリセンスが効くようになります。
![IntelliSense.gif](https://qiita-image-store.s3.amazonaws.com/0/10682/707e862b-62ea-1c42-0087-cdc386dc9935.gif)



# 実装方法

Facebook Graph APIで、自分自身のプロフィール（/me）を取ってくる際に型付けを利用してみます。

## まずは戻り値を受け取るクラスを定義する

まずは戻り値を格納するクラスを定義します。
[Facebook Graph APIのリファレンス](https://developers.facebook.com/docs/graph-api) を参考に、APIの戻り値にどのようなフィールドがあるかを確認し、それに応じたクラスを定義します。
自分自身のプロフィール（/me）の場合、Graph APIからは[Userオブジェクト](https://developers.facebook.com/docs/graph-api/reference/user/)が返ってきますので、それに応じたフィールドを適宜定義します。

```csharp
public class AboutMeResult
{
    public string first_name { get; set; }
    public string last_name { get; set; }
    public string gender { get; set; }
    public string id { get; set; }
    public string name { get; set; }
    public string email { get; set; }
    public UserPicture picture { get; set; }
    public List<WorkExperience> work { get; set; } = new List<WorkExperience>();
}

public class WorkExperience
{
    public string id { get; set; }
    public string description { get; set; }
    public Page employer { get; set; }
    public Page location { get; set; }
    public string start_date { get; set; }
    public string end_date { get; set; }
    public Page position { get; set; }
}

public class UserPicture
{
    public ProfilePicture data { get; set; }
}

public class ProfilePicture
{
    public int height { get; set; }
    public int width { get; set; }
    public bool is_silhouette { get; set; }
    public string url { get; set; }
}

public class Page
{
    public string id { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public string link { get; set; }
}
```


## API呼び出し結果を定義したクラスに詰めて返す

あとは、FacebookClientでのGetTaskAsync()呼び出し時に上で定義したAboutMeResultクラスを渡してあげます。
そうすると、AboutMeResultクラスのインスタンスが返されます。

```csharp
using Facebook;
    
var client = new FacebookClient(facebookAccessToken);
var myself = await client.GetTaskAsync<AboutMeResult>(
    "/me"
    , new { fields = "first_name,last_name,gender,id,name,email,work,picture.width(999)", locale = "ja_JP" }
    );
    
// myselfはAboutMeResultのインスタンス。myself.last_name みたいにアクセス出来るし、インテリセンスも効く
```


# 参考情報

- [Facebook Graph API リファレンス](https://developers.facebook.com/docs/graph-api)
- [Get Facebook user's details and big profile picture in one call](http://stackoverflow.com/a/36679548)
- [Facebook SDK for .NET](https://github.com/facebook-csharp-sdk/facebook-csharp-sdk)
- [Graph APIリクエストの変更(日本語表記の氏名を取得するにはlocale=ja_JPを渡す)](https://developers.facebook.com/docs/graph-api/using-graph-api/#readmodifiers)
naming > 範囲 > inclusive / exclusive

関連 https://en.wikipedia.org/wiki/Interval_(mathematics)

ある数値範囲 [0,90)の0,90の値を保持する変数名の検討。

### @ Readable Code (Kindle Edition @ No.1151)
> Prefer begin and end for Inclusive/Exclusive Ranges

| a | b | c | d |  |
|:-:|:-:|:-:|:-:|:-:|
| begin  |   |   |   | end |

上記のような例で使われているが以下のようにも記載している。

> But the word end is a little ambiguous. For example, in the sentence, "I'm at the end of the book," the "end" is inclusive.

endを使うと数年後にソースリーディングしにくくなりそうだ。

### Fortran

不等号に使うものがある

参考 http://www.math.hawaii.edu/~hile/fortran/fort2.htm

> - .ge. 
  - greater than or equal to
- .lt.
  - less than

個人的にはge,ltでわかるが、Fortranを使わない人にはわからない。

### アイデア

以下だとソース内で意味がわかりやすい

- min_inclusive / max_exclusive

とりあえずこれで作りながらもう少しよい名前を検討する
EMRのログをS3/Localから追う


## 概要
諸事情でYARNやSparkのWebUIがすぐに見れない、でもEMRのStepがなんか失敗しているのでログを見たい！というときにS3から見る方法。
というかEMRのログで作られる各中身の確認

## 前提

- emr-4.7
- Spark 1.6
- Hadoop 2.7
- ログ出力先にS3の任意のフォルダを指定。

## ログディレクトリの構成

```
.
├── 
└── [cluster-id]
    ├── containers
    ├── em
    ├── node
    └── steps
```

### cluster

EMR clusterはそれぞれIDを持ちます。（例： `j-2540JQ2HFN027` ）

### containers

各Hadoopアプリケーションにおいて、分散環境上に複数のコンテナが立てられます。

各アプリケーションはIDを持ちます。（例： `application_10000032000_0001` ）
各コンテナはIDを持ちます。applicationのIDにコンテナ用の通し番号が付いた文字列になります。（例： `container_10000032000_0001_02_000001` ）

```
物理マシン : コンテナ = 1 : N
アプリケーション : コンテナ = 1 : N
```

の関係です。

このコンテナの中に各コンテナ上での実行ログが残されます。

### em

EMRでチェックしているクラスタのメトリクスを保持しているっぽい。
が、ちゃんと調べてない。。。

### node

各物理ノードのHadoop関係のプロセスのログが出ている。

- bootstrap-action
- yarn/hdfs

など。

### steps

EMRでStep実行をした際のjarのプロセスログが表示される。
※ここでのログはあくまで実行するときのjarのログなので、Masterノードで動くプロセスのはず。たぶん。。。

stepはIDを持つ（例： `s-10BFSXA1JCMAD`）

## Sparkのログの追い方

1. まずEMRのコンソール画面から、あるstepの実行がFailしていることを見つけます。
2. 該当stepの実行ログ（上記stepsフォルダか、画面上のstderrなど）を確認する。
3. applicationの起動以前であれば、ここで何かエラになっているはず。
4. Application自体は立ち上がっている場合、applicationのIDが見つかる。
5. そのApplicationのIDを元に、上記containersの該当Applicationを探す。
6. 各containerのログを漁り、問題を特定する。

という流れになります。

（※S3上にログが置かれるのは５分間隔のようで、実行して直ぐだとまだログがS3に届いていない場合があります。）


## localのファイルを読む場合

まだ実行中のStepや、今すぐにlogを見たい場合はS3でなくローカルに吐かれるファイルを見る必要がある。

### MasterNode

sshログイン。

- `/mnt/var/log/hadoop/`
  - どうやってspark-submitされているかとかわかる。

### Driver/ExecutorNode

SparkUIからDriver/ExecutorNodeのIPを探る。

sshで入った後、以下を調べる

- `/mnt/var/log/hadoop-yarn/containers/＜対象のコンテナID＞`
  - Sparkアプリのログが吐かれる。
FuelphpのProfilerを一部のページだけ有効・無効にする方法

ソース内でプロファイラの有効・無効を設定する方法

```php:無効にする
Fuel\Core\Fuel::$profiling = false;
```

```php:有効にする
Fuel\Core\Fuel::$profiling = true;
```

割りと忘れがちなので、ここに記す。

【参考】
http://blog.livedoor.jp/erscape/archives/7084229.html
FuelPHPのoilコマンドで既存テーブルからmodelを作成

### ORMモデルの場合
```bash:
$ php oil r fromdb:model (テーブル名)
```
### CRUDモデルの場合
```bash:
$ php oil r fromdb:model (テーブル名) --crud
```

※一度実行するとファイルが作成されるので、上書きしたい場合は、
コマンド「php oil r fromdb:model」の後にオプション「-f」を付ける必要がある
OpenCV2.xでMat型の平均値や最大値を求めた時の話

#はじめに

　ここ最近はC/C++のOpenCVを用いて画像処理を行っているが、はまってしまったところがあったのでメモとしてここに残す。
　今回はMat型の最大値や最小値、平均を求めるときにどうやって求めるかという所とその時に起こった問題について示す。

#手法

　最大値や最小値を求めるには早い話OpenCVにある関数を使えば簡単にコーディングできる。reduce関数というものでMat型の列または行ごとの平均や最大値、最小値を求めることができる。これを行、列に行うことによってMat型全体での値を求めることができる。

#問題

　実行速度に問題があった。自作のフィルタを作成していた時に発覚した。各要素にアクセスしその近傍で部分行列(5*5のフィルタを掛けるため)を作成しそこで最大値や最小値を求めていたのだが秒単位の実行速度になっていた。たかだか最大値を求めたりするのに時間がかかるのは正直画像処理や物体認識等をする上で厄介なものだと考えられる。

#解決策

ポインタによる要素のアクセス
コードの可読性は落ちたが速度はおおよそ4倍となった。

#終わりに
　思い立って書いた記事であり実際のコードはまだ用意していない。準備出来次第追記を行っていく。
VMWare→XenServer移行時にXenServerToolsのインストールで引っかかった

引っかかったので自分用メモ。

【環境】
サーバ
・適当なマシン
・（旧）VMWareServer 2.0　→　（新）XenServer 6.5 SP1

VMイメージ
・CentOS 5.3(x64)
・VMWare環境で稼働中

#やってみる

(1)XenCenterからXenServerが稼働しているサーバを選んでファイル＞インポート。

(2)適当に設定してインポート。

(3)XenServer Toolsのインストール

```bash
$ mkdir /mnt/xs-tools
$ mount /mnt/cdrom /mnt/xs-tools       #環境によっては/mnt/xvddの場合もあり。
$ cd /mnt/xs-tools/Linux
$ ./install.sh

（中略）

$ unmount /mnt
$ reboot
```

ここで

```bash
$rpm -qa | grep xe-
xe-guest-utilities-zenstore-6.5.0-1436
xe-guest-utilities-6.5.0-1436
```

とかなってるのにXenCenter上からは「XenServer Toolsが未インストール」とかなんとか怒られる。

#解決策

至って単純。VMWare Toolsが悪さをしていたっぽい。
[After convert from VMware the XenServer tools show up as not installed](http://discussions.citrix.com/topic/308391-after-convert-from-vmware-the-xenserver-tools-show-up-as-not-installed/)

Xen上で無理やり消したりするとめんどくさいことになる（なった）ので、
インポート前の.vmdkをVMWare上で動かして、VMWare Toolsを消した後、
もう一回インポート～XenServer Toolsインストールで解決しました。
ChefTips: ファイルのパーミッションを変更する

既存ファイルのパーミッションを変更したい時に。
もちろんオーナー・グループの変更にも使用可能です。

ちなみに、既存ディレクトリのパーミッションは 普通に directory リソースを使います。

```rb:例
file "/tmp/foobar" do
  mode '0644'
  action :create
  only_if { ::File.exists?("/tmp/foobar") } # ファイルが無い時には作成しない
end
```

```rb:テスト
# cat <<_EOL_ | chef-apply -s -W
> file "/tmp/foobar" do
>   mode '0644'
>   action :create
>   only_if { ::File.exists?("/tmp/foobar") }
> end
> _EOL_
Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * file[/tmp/foobar] action create
    - Would change mode from '0755' to '0644'
```

参考/引用: [chef でファイルのパーミッションを設定するメモ@Qiita](http://qiita.com/ryochin/items/fb88281063e3355c9f85)
［iOS］[デバッグ用］コメントのソース切り替えする方法

###コメントのソース切り替えの方法

デバッグする時に、たまにこのパターンとこのパターンと切り替えたい時に使う　ソース切り替え をご案内したいと思います。

//ソースの切り替え例(1) /**/の時

```objective-c:Debug.m
//ソースの切り替え例
/*TODO:ソース切り替えの方法*//**/ //コメント切り替え　←  （スラッシュ*スラッシュとじ） と （スラッシュ**スラッシュとじ）で切り替えが可能
NSInteger hoge1 = [hogehoge[@"hoge1"] integerValue];
NSInteger hoge2 = [hogehoge[@"hoge2"] integerValue];

// 処理1

/*/
NSString *hoge = hogehoge[@"hoge"];

if (hogehoge != nil && [hoge intValue] > 0) {

// 処理2

//TODO:ソース切り替えの方法
/*/if (hogehoge != nil && ( hoge1 > 0 || hoge2 > 0)) {//*/

  //共通処理
  
}
```

//ソースの切り替え例(2) /*/の時

```objective-c:Debug.m
//ソースの切り替え例
/*TODO:ソース切り替えの方法*//*/ //コメント切り替え　←  （スラッシュ*スラッシュとじ） と （スラッシュ**スラッシュとじ）で切り替えが可能
NSInteger hoge1 = [hogehoge[@"hoge1"] integerValue];
NSInteger hoge2 = [hogehoge[@"hoge2"] integerValue];

// 処理1

/*/
NSString *hoge = hogehoge[@"hoge"];

if (hogehoge != nil && [hoge intValue] > 0) {

// 処理2

//TODO:ソース切り替えの方法
/*/if (hogehoge != nil && ( hoge1 > 0 || hoge2 > 0)) {//*/

  //共通処理
  
}
```

こうすることで、次のリリースする時、もしこの値位だったらなど、コメントだけで処理が切り替わります。

※ 書き方は様々ですが、多用すると混乱するので徐々にコードを決めていきましょう。

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/
Playgroundでcocoapods使う方法


まずは普通にxcodeでworkspace作る

ターミナルで作ったworkspaceのディレクトリに移動して

```
pod setup
pod init
```

Podfileにplaygroundで使いたいpodを書いて

```
pod install
```

ここまではPodをインストールする手順


ここからはPodを使えるplaygroundを作成する手順

```
gem install cocoapods-playgrounds
pod playgrounds 使いたいpod名
```

使いたいpodが複数ある場合は

```
pod playgrounds 使いたいpod名 & 使いたいpod名
```

ここからがよくわかんないけど、そのままでは使いたいpodをimportしても、No such Moduleって怒られる。なので、一度ターゲットを使いたいpodに変えてbuildすると怒られずに動くようになった。ここらへんはもうちょっとしっかり調査する。
Archive upload completed with warnings WARNING ITMS-90080

いつもどおりArchiveをvalidateしてuploadしたらなんかでてきた。。

iTunes Connect側のバグじゃないのか？って感じらしいんだけど

WARNING ITMS-90080を解決するほうがいいのかバグの修正を待っている方がいいのか

[同じようにWARNING ITMS-90080に困ってる人達](https://github.com/CocoaPods/CocoaPods/issues/5453)

私もこの人と同じ↓
Same problem! Build still working in testflight, but will it be rejected from app submission?

testflightもできて問題なく動作してるんだけど
これ審査だしたらリジェクトされちゃうのかな？

こういうことを言ってる人もいるし↓
As it’s been said, this is a bug in iTunes connect.

The iTMS team must understand that and stop checking for the PIE flag in frameworks…

みんなどうやってこれに対応してるんだろう？
cocoapods1.0.0以降を使ってるからなってるのかな？

ツイッターで検索しても同じようなトラブル抱えてる人いるし

あんまり話題になってないから自分の設定とかが間違ってるのかな

とりあえず続報待ちます


Carthageを使ってもおなじようなことが起きてるみたいなのでitunes connect側のバグっぽいんですね

2016/06/09
WARNING ITMS-90080出なくなりました
apple対応したっぽいですね