OmniAICreator/Qiita-1.07M huggingface dataset:
［iOS］重複した配列から重複していない配列を作成する方法

## サンプルコード
~~~Objective-C:ExArray.m
- (void)exArray
{
    NSArray *dataArray = @[@"a",@"b",@"c",@"d",@"a1",@"a2",@"a"];
    NSLog(@"before  -> \n%@",dataArray);
    // 重複した配列から重複していない配列を返す
    dataArray = [self nonDuplicateArray:dataArray];
    NSLog(@"after  -> \n%@",dataArray);
    
    // 他にも教えていただきました。
    // ソ−ト順を気にしない場合
    // NSSet を用いる方法
    dataArray = @[@"a",@"b",@"c",@"d",@"a1",@"a2",@"a"];
    NSLog(@"after  -> \n%@",[NSSet setWithArray:dataArray].allObjects);

    // @distinctUnionOfObjects.self を用いる方法
    dataArray = @[@"a",@"b",@"c",@"d",@"a1",@"a2",@"a"];
    NSLog(@"after  -> \n%@",[dataArray valueForKeyPath:@"@distinctUnionOfObjects.self"]);

    // ソ−ト順を気する場合
    // NSOrderedSet を用いる方法
    dataArray = @[@"a",@"b",@"c",@"d",@"a1",@"a2",@"a"];
    NSOrderedSet *orderedSet = [[NSOrderedSet alloc] initWithArray:dataArray];
    NSLog(@"after  -> \n%@",orderedSet.array);
}

/**
 * 重複した配列から重複していない配列を返す
 *
 * @param  NSArray duplicateArray
 * @return NSArray nonDuplicateArray
 * /
- (NSArray *)nonDuplicateArray:(NSArray *)duplicateArray
{
    NSMutableArray *sortArray = [NSMutableArray new];
    for (int i = 0; i < [duplicateArray count];i++) {
        if (![sortArray containsObject:duplicateArray[i]]) {
            [sortArray addObject:duplicateArray[i]];
        }
    }
    NSArray *nonDuplicateArray = [sortArray copy];
    return nonDuplicateArray;
}
~~~

~~~:LOG
 before -> 
(
    a,
    b,
    c,
    d,
    a1,
    a2,
    a
)
 after  -> 
(
    a,
    b,
    c,
    d,
    a1,
    a2
)

// 他にも教えていただきました。
// ソ−ト順を気にしない場合
// NSSet を用いる方法
 after ->  
(
    c,
    a2,
    d,
    a,
    a1,
    b
)

// @distinctUnionOfObjects.self を用いる方法
 after ->  
(
    c,
    a2,
    d,
    a,
    a1,
    b
)

// ソ−ト順を気にする場合
// NSOrderedSet を用いる方法
 after ->  
(
    a,
    b,
    c,
    d,
    a1,
    a2
)
~~~

## 関連記事

【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/
Zabbix3.Xのグラフを日本語で表示できるようにする

# この記事は？
- Zabbixをデフォルトで導入するとグラフ表示の際に日本語のアイテム名のものについては
文字化けしてしまう。俗に言うところの豆腐文字だ。
![000128.jpg](https://qiita-image-store.s3.amazonaws.com/0/129674/146f3bbf-fe09-ec0f-0942-fcf604b30688.jpeg)
- これはフォントとしてDejaVuSansが指定されているためであり、回避するには日本語に対応したフォントへの設定変更が必要だ。
- この記事においてはZabbix3.xにおけるフォント変更箇所を提示する。

# 変更方法
## 環境情報
| 項目 | 情報 |
|:-:|:-:|
|CentOS|CentOS Linux release 7.2.1511|
|PHP|5.5.31|
|Zabbix|3.0.2rc1 rev59391|

## 事前準備
あらかじめ使いたいフォントをダウンロードし、Frontendのfontsディレクトリ配下にttfファイルを配置しておく。

## 変更箇所
変更箇所は以下。パスは適宜読み替えてください。
DejaVuSansから使用したいフォントファイル(ttf)のファイル名に変更してあげればOK。

```php:include/defines.inc.php
define('ZBX_GRAPH_FONT_NAME',           'DejaVuSans'); // font file name
```
## 補足
ここでの設定はあくまでグラフの中のフォントのみ変更。
3.0においてはヘッダーやタブなどの文字のフォントについてはCSSにて指定されているため、
必要があればCSSにおけるbodyのfont-family設定も変更してあげると統一感が出るかも。
もちろん、場合によってはブラウザでのフォント設定の変更が必要。
デフォルトでは下記になっている。

```html:styles/blue-theme.css
body {
  font-family: Meiryo, Arial, Tahoma, Verdana, sans-serif;
  font-size: 75%;
  line-height: 1.4em;
  color: #1f2c33;
  background-color: #ebeef0;
  margin-bottom: 60px;
  min-width: 950px; }
```

#おすすめ？の変更例
##さざなみゴシック
日本語フォントとして有名どころは「さざなみゴシック」。落ち着いた印象。
[DL:さざなみゴシック](https://osdn.jp/projects/efont/)
![000129.jpg](https://qiita-image-store.s3.amazonaws.com/0/129674/1a3ec51a-168e-d507-3a93-14a09fcff690.jpeg)

##うずらフォント
まるっこくてかわいい印象を与える「うずらフォント」。
重大な障害であってもそれほど重要度が高くないような雰囲気に。
[DL:うずらフォント](http://azukifont.com/font/uzura.html)
![000131.jpg](https://qiita-image-store.s3.amazonaws.com/0/129674/fe17ac5b-6f36-e07f-8cab-2190ccc5727f.jpeg)

##殴り書きクレヨン
手書きフォントであり、幼稚園児がクレヨンを使って文字を書いたような「殴り書きクレヨン」。
障害発生などどうでも良くなるような気もしてくる。
[DL:殴り書きクレヨン](http://font.sumomo.ne.jp/font_2.html)
![000132.jpg](https://qiita-image-store.s3.amazonaws.com/0/129674/63e9d324-5395-89d3-edcb-f4ad6a14bbce.jpeg)

* * *
以上
GCEにOwncloudを立てたよ


ファイル共有と簡単なインターフェースが欲しくて作りました。
Cloud Launcherにあるやんけ、とかいうツッコミはご遠慮ください。
自前Dropboxです。

## サーバーの用意

まずはサーバーの用意から。
今回はOwncloudをdockerで動かします。

### インスタンス作成

まあ普通に作って下さい。

```pc
gcloud compute instances create "owncloud" \
    --zone "asia-east1-a" \
    --machine-type "f1-micro" \
    --network "default" \
    --maintenance-policy "MIGRATE" \
    --scopes default="https://www.googleapis.com/auth/cloud-platform" \
    --tags "http-server" \
    --image "/debian-cloud/debian-8-jessie-v20160511" \
    --boot-disk-size "10" \
    --boot-disk-type "pd-ssd" \
    --boot-disk-device-name "owncloud"
```

お金のかからない設定と言いつつもSSD使ってますが、10GB程度だと月で2ドルくらいしか変わらない割に体感速度はSSDの方がけっこういいのでSSDにしてます。
ケチりたかったらpd-standardにすると節約できます。
あと、レイテンシのコトも考えてゾーンもasia-east1-aにしてます。
us-centralにすればもうちょい安いでしょう。

作ったらdockerやらcomposeやら入れます。
startup-scriptにコンテナ起動させるスクリプトを入れとくといいです。

docker composeで動かしたんでこんな感じのファイル書きました。

```docker-compose.yml
version: '2'
services:
  owncloud:
    image: "owncloud:9.0"
    volumes:
      - /data/owncloud/www:/var/www/html
      - /data/owncloud/apps:/var/www/html/apps
      - /data/owncloud/config:/var/www/html/config
      - /data/owncloud/data:/var/www/html/data
      - /etc/localtime:/etc/localtime
    ports:
      - "80:80"
      - "443:443"
```

## Cloud Storageの設定

外部ストレージとして使うので設定が必要です。
バケット作りましょう。

バケット作ったら、GCSの設定をしてあげます。
`設定`→`相互運用`のタブで新しいキーを作成してください。
アクセスキーとシークレットを使います。
なんか日本語訳でシークレットが「非公開」ってなってるのがなんか笑えますね。

![ストレージ設定_-_ragnarok.png](https://qiita-image-store.s3.amazonaws.com/0/8637/8a3e60b9-bbe8-4aa6-f249-8029ff08e58b.png "ストレージ設定_-_ragnarok.png")


## owncloudの設定

### 外部ストレージの有効化

公式Dockerイメージ使ってると`sudo`使えないので普通に`exec`でコマンド一発ができません。
しょうがないから動いてるコンテナに入ってコマンド実行しました。


```host
docker exec -it owncloud_owncloud_1 bash
```

```container
apt-get update && apt-get install sudo -y
sudo -u www-data php occ app:enable files_external
```

これでOK。
`sudo`入った状態がイヤだったらコンテナ再起動してください。
外部ストレージは有効になったままです。

### GCS追加

owncloudの管理画面に外部ストレージって追加されてるはずです。

外部ストレージに`Amazon S3`を選びます。
バケット名はバケット名入れて下さい。
ホスト名に`storage.googleapis.com`を入れます。
ポート、リージョン、SSLを有効、パス形式を有効は空のままでOK。
最後アクセスキーとシークレットはさっきのGCSの設定画面で発行したやつを入れます。

![管理_-_ownCloud.png](https://qiita-image-store.s3.amazonaws.com/0/8637/ad937877-0e89-b6c4-a2a5-693314182e81.png "管理_-_ownCloud.png")

## まとめ

料金は今回はインスタンスのマシンタイプをg1-microにしたので、月ずっと動かしてても5〜6ドルくらいです。
まあ安いですね。
あとはGCSのストレージ料金。
自分はケチってバケットタイプをDRAにしてます。

ちなみにマイクロインスタンスだと正直遅いです。
IntelliJでメソッド定義の左側にある＠が出なくなった時の対処法


org.jetbrains.annotationsライブラリがクラスパスにあると、null値を返すことがあるメソッド定義の左側(行番号の右)に＠が表示されます。この＠を押すと、「Insert '@Contract..」のようなアノテーション挿入のサジェストと、「Hide annotations inferred from source code」という＠を非表示にするための選択肢が表示されます。

![スクリーンショット 2016-06-16 15.52.25.png](https://qiita-image-store.s3.amazonaws.com/0/21577/75eccdd5-9fd1-31b1-840e-975e978d6bc9.png "スクリーンショット 2016-06-16 15.52.25.png")


ここで「Hide annotations inferred from source code」を選択して＠を非表示にした場合、Intellijの設定項目では再び＠を表示することができません。

＠を再び表示させるには、editor.codeinsight.xmlの中の`<option name="SHOW_SOURCE_INFERRED_ANNOTATIONS" value="false" />`を削除するか`value="true"`にし、Intellijを再起動する必要があります。 

editor.codeinsight.xmlの場所はこちら。 

- MacOs: /Users/$(whoami)/Library/Preferences/IdeaIC2016.1/options/editor.codeinsight.xml
- Windows: C:\Users\[USERNAME]\.IdeaIC2016.1\config\options\editor.codeinsight.xml
[論文] Network In Network

[Network In Network](https://arxiv.org/abs/1312.4400) の紹介

## 三行
1. 特徴マップの生成に CNN ではなく micro MLP を使った
2. micro MLP は平均値プーリングとして機能し、かつ、過剰学習を防げた
3. CIFAR-10, CIFAR-100 の弁別課題と SVHN および MNIST の成績を示す

## Abstract
新しい Deep Network 「Network In Network (NIN)」を提案する。これは、受容野の中のローカルパッチの弁別性を強調する。
従来の Convolutional 層では、入力をスキャンする非線形活性化関数の後に線形フィルタを利用している。
本モデルでは、ミクロなニューラルネットワークを構築し、受容野のデータの抽象化を行うためのより複雑な構造に組み込んだ。
具体的にはミクロなニューラルネットワークとして強力な関数近似が可能な多層パーセプトロン (MLP) を利用している。
CNN と同じような方法で入力を通してミクロなネットワークを移動させることで特徴マップが得られる。得られた特徴マップを次段の入力として利用する。
Deep NIN は上記の構造を複数段積み重ねて実装することができる。
ミクロネットワークでエンハンスされたローカルモデリングを利用することで、特徴マップ全域でのグローバルな平均値プーリングを弁別層で利用できるようになり、伝統的な全結合層の過剰学習を抑止することが可能になった。
CIFAR-10 および CIFAR-100 における NIN の最先端の分類課題に対する成績および SVHN と MNIST データセットに対する妥当な成績を示す。

## 本文
### CNN -> NLP
![image](https://qiita-image-store.s3.amazonaws.com/0/3379/fb462194-4ee2-9256-ef62-5e11a11fc695.png)

### 学習方法
* 通常の誤差逆伝播法が利用可能

$f_{i,j,k_1}^1 = \max(w_{k_1}^{1　\mathrm{T}} x_{i,j} + b_{k_{1}}, 0)$
...
$f_{i,j,k_n}^n = \max(w_{k_n}^{n　\mathrm{T}} f_{i,j}^{n-1} + b_{k_{n}}, 0)$

$n$ は、 MLP の中の層の番号。活性化関数としては Relu を利用


### 成績
* MNIST で若干テストエラーが Conv. Maxout + Dropout (0.45%) に至らなかった(0.47%)とは言え、CIFAR ではもっともよい成績だった
React.jsでformのinputを使う

[前回](http://qiita.com/1-AizawaSatoshi/items/4e6a98ab851930385f90)のつづき

今回はGithubのapiを使用（https://api.github.com/users/ユーザー名）

フォームにユーザー名を入れるとユーザー情報が出る

```index.html
<!DOCTYPE html>
<html>

  <head>
    <script data-require="jquery@*" data-semver="2.2.0" src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
    <link rel="stylesheet" href="style.css" />
  </head>

  <body>
    <div id="root"></div>
    <script src="https://fb.me/react-0.13.3.js"></script>
    <script src="script.js"></script>
  </body>

</html>
```

```script.jsx
var Card = React.createClass({
  getInitialState: function(){
    return {};
  },
  componentDidMount: function(){
    var component = this;
    $.get("https://api.github.com/users/" + this.props.login, function(data){
      component.setState(data);
    });
  },
  render: function(){
    return(
      <div>
        <img src={this.state.avatar_url} width="80" />
        <h3>{this.state.login}</h3>
        <hr/>
      </div>
    );
  }
});

var Form = React.createClass({
  handleSubmit: function(e){
    e.preventDefault();
    var loginInput = React.findDOMNode(this.refs.login);
    this.props.addCard(loginInput.value);
    loginInput.value = '';
  },
  render: function(){
    return (
      <form onSubmit={this.handleSubmit}>
        <input placeholder="github login" ref="login" />
        <button>Add</button>
      </form>
    );
  }
});

var Main = React.createClass({
  getInitialState: function(){
    return {logins: []};
  },
  addCard: function(loginToAdd){
    this.setState({logins: this.state.logins.concat(loginToAdd)});
  },
  render: function(){
    var cards = this.state.logins.map(function(login){
      return (<Card login={login} />);
    });
    return (
      <div>
        <Form addCard={this.addCard} />
        {cards}
      </div>
    );
  }
});

React.render(<Main />, document.getElementById("root"));
```
E2E テストでの DatabaseCleaner の設定


設定がおかしくて盛大にハマったので、メモを残しておきます。
ついでに`javascript_driver`の設定も書いておきます。

# 環境
* Ruby: 2.2.4
* Rails: 4.2.5
* Capybara: 2.5.0
* Poltergeist: 1.9.0
* DatabaseCleaner: 1.5.2

# rails_helper.rb
各 spec が feature の時だけトランケーションを使い、それ以外の時はトランザクションを使うようにしています。

```ruby:spec/rails_helper.rb
:
:
require "capybara/poltergeist"
Capybara.javascript_driver = :poltergeist

RSpec.configure do |config|
  :
  : 
  config.use_transactional_fixtures = false
  :
  :
  config.before :each do
    DatabaseCleaner.strategy = :transaction
  end

  config.before :each, type: :feature do
    DatabaseCleaner.strategy = :truncation, {
      except: %w(some master tables)
    }
  end

  config.before :each do
    DatabaseCleaner.start
  end

  config.after :each do
    DatabaseCleaner.clean
  end
end
```

# 余談
実は`DatabaseCleaner.clean_with`の使い方を盛大に勘違いしててハマりました。

> At times you may want to do a single clean with one strategy.

> For example, you may want to start the process by truncating all the tables, but then use the faster transaction strategy the remaining time. To accomplish this you can say:

> ```ruby
> require 'database_cleaner'

> DatabaseCleaner.clean_with :truncation

> DatabaseCleaner.strategy = :transaction

> # then make the DatabaseCleaner.start and DatabaseCleaner.clean calls appropriately
> ```

> <cite>[DatabaseCleaner/database_cleaner](https://github.com/DatabaseCleaner/database_cleaner)</cite>

今考えると名前そのままの動きですね :sweat_smile:
Macでnginxを使ったRTMP配信のテスト環境を用意する

ストリーミング配信のテストをしたいので、
Macのローカルへ環境を作ることにしました。


nginxはhomebrewでインストールします。
最終的にはたったこれだけのことで終わるんですが
全然わからなくて延々と調査してました。。。

あとは`rtmp://[ipアドレス]/live`とかにNSStreamなんかで動画送ってやればいいと思います。

# homebrewのインストール
■ 【El Capitan】Mac OSX 10.11にHomebrewインストール
http://qiita.com/aoioooii/items/c14922eede6a83a750da


# nginx環境のインストール
nginx-fullを利用します。
`$ brew info nginx-full`でわかるmodule名をインストールの時に指定しないとダメなんですね。。。

```
$ brew install nginx-full --with-rtmp-module
```

`/usr/local/etc/nginx/nginx.conf`にRTMPサーバの情報を登録

```/usr/local/etc/nginx/nginx.conf
rtmp {
    server {
        listen 1935;
         application live {
            live on;
            wait_video on;
            hls on;
            hls_path /usr/local/etc/nginx/html/;
            hls_fragment 5s;
        }
    }
}
```
それぞれのパラメータに関しては以下の記事で解説されています。
■ nginxでrtmp配信サーバを構築する【完全版】
http://variedtastefinder.jp/blog/?p=1782


# 起動と終了

```
## 起動
$ nginx
## 終了
$ nginx -s stop
```

起動してるときに`http://localhost:8080`へアクセスすれば、Welcome to nginx!とか表示されると思います。
リリース予定のトピックブランチのマージコミットがあるかを確認するシェル

トピックブランチのマージ漏れや、不要なマージコミットが混ざっていないかを確認するためのシェル。

色々と強引だけど、目grepよりはマシということで。

```
#!/bin/sh

# トピックブランチのマージコミットがあるかを最新のタグ時点から抽出

REPO=""
EXPECTED_BRANCHES=("#1234" "#4567");


cd ${REPO};
git fetch;

latest_tag=$(git describe --tags `git rev-list --tags --max-count=1`);
logs=`git log --date=short --pretty=format:"%H %cd [%s] <%an>" --merges -- ${latest_tag}..origin/develop`

echo "[merging result of topic branches]";
for branch_name in ${EXPECTED_BRANCHES[@]}
do
        if echo $logs | grep -q $branch_name ; then
                echo "$branch_name OK";
        else
                echo "$branch_name NG";
        fi

done

echo "--------";
echo "[Unexpected merge commits]";

git log --date=short --pretty=format:"%H %cd [%s] <%an>" --merges --grep="into develop" ${latest_tag}..origin/develop | for branch_name in ${EXPECTED_BRANCHES[@]}
do
   grep -v $branch_name;
done
```
c++ builder XE4 > 正規表現 > `toupper`が....System.RegularExpressionsAPIから参照されています > IDE環境を変更しない対応方法

```txt:動作確認
C++ Builder XE4
```

http://qiita.com/7of9/items/8c0d1362ed2950effa57
で試した正規表現の処理を実環境で使おうとしたら以下のようなエラーが出た。

```
`toupper`が....System.RegularExpressionsAPIから参照されています
```

プロジェクトオプション > パッケージ > 実行時パッケージ > 実行時パッケージを使ってリンク をfalseにしている時に発生するようだ。

## 回避策

回避策はいくつか検索で見つかったが、IDE環境自体を変更する必要がない方法としては以下があるようだ。

https://www.c-plusplus.net/forum/325231-full

Unit1.cppに以下を追加する。実際にやってみたらエラーがなくなった。

```
#ifdef _WIN32 && !defined(_WIN64)
#pragma alias "toupper" = "_toupper"
#pragma alias "tolower" = "_tolower"
#pragma alias  "isupper" = "_isupper"
#pragma alias  "isalnum" = "_isalnum"
#pragma alias  "isalpha" = "_isalpha"
#pragma alias  "iscntrl" = "_iscntrl"
#pragma alias  "isdigit" = "_isdigit"
#pragma alias  "isgraph" = "_isgraph"
#pragma alias  "isleadbyte" = "_isleadbyte"
#pragma alias  "islower" = "_islower"
#pragma alias  "isprint" = "_isprint"
#pragma alias  "ispunct" = "_ispunct"
#pragma alias  "isspace" = "_isspace"
#pragma alias  "isxdigit" = "_isxdigit"
#pragma alias  "strchr" = "_strchr"
#pragma alias  "strncmp" = "_strncmp"
#pragma alias  "memcmp" = "_memcmp"
#pragma alias  "memmove" = "_memmove"
#endif
```

正規表現を多量に使うことになった場合にはIDE環境自体を変更するほうがいいかも含めて検討することになる。
[iOS] StoryboardのLocalizationStringsに手動で追加する方法

# 目的
Storyboardをローカライズすると自動でLocalizationStringsにObjectIDが追加されているが、それを手動で行う方法をメモ。

# 方法
まず、ObjectIDを調べるために、Xcodeのユーティリティエリア→インスペクタセレクタバー→Identityアイコンを選択します。
<img width="346" alt="スクリーンショット 2016-06-16 15.00.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/111677/913a65ef-74bf-70b2-32f3-39fea92380bd.png">

そして、Documentの中に[Object ID]の項目があります。その値をコピーします。

そして、StoryboardのLocalizationStringsに記述していきます。

```swift:LocalizationStrings
// 例: d5b-iY-KXA.text = "hogehoge";
[ObjectID].text = "適当な文章";
```

textの他にも、normalTitle, title, placeholderなどクラスによってもいろいろあるので適切なものを選択してください。
c++ builder XE4, 10.2 Tokyo > 正規表現 > P[0-9][0-9]TL[0-9]_draw の確認 > TRegEx::IsMatch()

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

860個近くあるコンポーネントの設定読込みを実装している。
その中でコンポーネント名を元にFindComponents()を使っている。

誤ったコンポーネントに対する処理を回避する一つの方法として正規表現を使ってみた。

- `#include <System.RegularExpressions.hpp>` 追加
- TRegEx::関数()を使用


```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <System.RegularExpressions.hpp>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	//

	bool res;
	String msg;

	res = TRegEx::IsMatch(L"P01TL1_draw", L"P[0-9][0-9]TL[0-9]_draw");
	msg = BoolToStr(res);
	OutputDebugString(msg.c_str());

	res = TRegEx::IsMatch(L"PABTL1_draw", L"P[0-9][0-9]TL[0-9]_draw");
	msg = BoolToStr(res);
	OutputDebugString(msg.c_str());

}
//---------------------------------------------------------------------------

```

1つめはtrue、2つめはfalseとなって意図した通りになった。

正規表現の実装方法は以下などに詳しい。色々あるようだ。
http://ht-deko.com/tech064.html

こちらではIDEの標準状態で使えるものとして上記を使用した。

- match > https://www.debuggex.com/r/HDn-eov2OboZubSy
- non-match > https://www.debuggex.com/r/8xY-XQpqFp7CsVvc


こちらでもmatchできるようだ

- `P\d{2}TL[0-9]_draw`
- https://www.debuggex.com/r/aOnrZ5stB5CN5Zoa


最終的にチェックしたかったのは以下の形式となった。

- `P\d{2}(T|B)(L|R)\d_draw`
人工知能ボットAPIを使ってSlack上で会話してみた

# はじめに
ユーザーローカル社が提供している「[人工知能ボットAPI](http://ai.userlocal.jp/)」の事前申し込みをしていたのですが、利用可能になったという連絡をいただいたので早速使ってみました。

![image](https://qiita-image-store.s3.amazonaws.com/0/37467/fc909ed7-c840-f1d7-c2f2-d061886537c6.png)

上記のように、BOTに話しかけると会話内容に応じたメッセージが返ってきます。

# 基本的な仕様
- エンドポイント
    - https://chatbot-api.userlocal.jp/api/chat
        - GET/POSTどちらも可
- 入力パラメータ
    - key: APIキー（必須）
    - message: 入力メッセージ（必須）
    - bot_name: botの名前
    - platform: プラットフォーム(line, tw, fb, slack)
    - user_id : プラットフォーム上でのユーザーID
    - user_name : ユーザー名
- 返却値
    - 下記のようなjson形式のデータが返ってくる

```sample.json
{
 "status":"success",
 "result":"えーーっ！？まるで、甲子園みたい"
}
```

# 注意
- 利用するには事前に[サイト]( http://ai.userlocal.jp/)に登録し、認証用のAPIキーを受け取っておく必要がある。
    - ただし、試用だけならAPIキー未発行でも可能
        - `key`の値を`sample`にして渡せば1時間に10リクエストまで使用可能（APIキーがある場合は、現時点で1時間で最大500リクエストまでコール可能）

## サンプルコード

```userlocal-api.coffee

# Description:
#   Let's communicate with ai bot api created by userlocal.
#
# Configration:
#   HUBOT_USERLOCAL_API_KEY

module.exports = (robot) ->

  url = "https://chatbot-api.userlocal.jp/api/chat"
  api_key = process.env.HUBOT_USERLOCAL_API_KEY

  robot.respond /(.*)/i, (msg) ->

    message = msg.match[1]
    params = {
      "message": message,
      "key": api_key
    }

    robot.http(url).query(params).get() (err, res, body) ->
      return res.send "Encountered an error :( #{err}" if err
      body = JSON.parse(body)
      msg.send "#{body.result}"

```

## 解説
- Slackとhubotがすでに連携されていることが前提。
- api_keyを環境変数としてheroku上で定義し、`process.env.XXX`で環境変数を読み込む。（hubot自体はheroku上で動かしてます。）
- APIキー、入力されたメッセージをパラメータとして渡し、リクエストを送る。
    - 返ってきたjsonデータをパースして`msg.send`でBOTから返答させる。


# その他のAPI例
上記で紹介したAPI以外にも下記のようなAPIも用意されているようです。詳しい使い方は[人工知能ボットAPI マニュアルPDF](http://www.userlocal.jp/pdf/userlocal_chatbot.pdf#pdf)をご覧ください。

- キャラクター会話変換API
    - ネコやイヌなどのキャラクターっぽい会話を実現するためのAPI
- 氏名自動識別API
    - 会話中の相手の名前をもとに性別判定したり、姓・名を切り分けることができるAPI
- 形態素解析API
    - 文章を形態素(言語で意味を持つ最小単位)に分割するためのAPI
Android Studioの「Plugin is too old, please update to ...」のエラー

#環境
Android Studio 2.1 Beta2
Mac OSX 10.11.5 El Capitan

#エラーメッセージ
Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRIDE environment variable to "xxxx"

#build.gradle(プロジェクト直下)
https://bintray.com/android/android-tools/com.android.tools.build.gradle/view
このサイトから最新のgradleのversionを選び書き換える

    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

必ずしも最新のものでうまくいくとは限らない。
自分の場合22.0-alpha3でうまく動かなかったが、一個下の2.1.2にするとうまくいった。

#build.gradle(app直下)
buildtoolVersionが古かったので、エラーメッセージに書かれているversionに書き換えた
23.02 → 23.03
といった具合
任意の日付・時間の範囲を生成

# 2016/7/1〜2016/7/3迄の10:00〜13:00を１時間毎に
select *
from (select to_char(d.d, 'YYYY-MM-DD ') || to_char(h.t, 'HH24:MI:SS') as dt
from (select * from generate_series('2016-07-01 10:00:00'::timestamp, '2016-07-01 13:00:00', '1 hour')) as h(t),
     (select * from generate_series('2016-07-01 00:00:00'::timestamp, '2016-07-03 00:00:00', '1 day')) as d(d)) asf
order by dt
-- 時間生成の方を2016/7/1で作ってるけど、1/1/1とかのほうがわかりやすかったかな

# 出力結果
'2016-07-01 10:00'
'2016-07-01 11:00'
'2016-07-01 12:00'
'2016-07-01 13:00'
'2016-07-02 10:00'
'2016-07-02 11:00'
'2016-07-02 12:00'
'2016-07-02 13:00'
'2016-07-03 10:00'
'2016-07-03 11:00'
'2016-07-03 12:00'
'2016-07-03 13:00'
JavaScriptのDateをJSON.stringify()したときの文字列変換を任意のものにする

## 事の始まり

Express + Sequelizeでシステム構築中、日付が9時間ずれる現象に遭遇した。

9時間ずれるのはSequelizeで作ったテーブルに含まれるcreatedAtとupdatedAtで、MySQLの時間はJSTかつDBに格納されている時間もJSTだった。

しかし、Expressでres.json()を使って返されたcreatedAtやupdatedAtはISO 8601形式(YYYY-MM-DDThh:mm:ddZ)に変換され、しかもUTCなので-9時間されたものになってしまっていた。

原因を調べると、JavaScriptのDateはJSON.stringify()したときにISO 8601形式で文字列にされることが分かったが、これが常にUTCでNode.jsの環境変数TZ(process.env.TZ)を指定しても何も変化がないので、非常に困ったことになった。

そこで、Dateの中でJSON.stringify()されたときに文字列変換を担当する関数を任意のものに書き換えて対応することにしたので、ここではそれについてメモを残しておく。

## 実際にやったこと

もろもろの都合で正しくはないが、今回はISO 8601形式で表示上のタイムゾーンもUTCだが、実際の表示時間はJSTにした出力を返す（本来はZを+0900にするとかあるけど今回は許して）。

```js
Date.prototype.toJSON=function(){return this.getFullYear()+'-'+('0'+(this.getMonth()+1)).slice(-2)+'-'+('0'+this.getDate()).slice(-2)+'T'+('0'+this.getHours()).slice(-2)+':'+('0'+this.getMinutes()).slice(-2)+':'+('0'+this.getSeconds()).slice(-2)+'.000Z';}
```

DateはJSON.stringify()時にtoJSON()で文字列化するので、その関数を上書きする。
ミリ秒やタイムゾーン表記は前述したように正しくはないので注意。

この上書き処理を今回であればExpressの初期化処理前に仕込んでおくことで、createdAtとupdatedAtが無事9時間ずれなくなった。

## まとめ

toJSON()にタイムゾーン指定効かせて。お願いだから。めっちゃ不便だから。誰だこの仕様にしたやつ。
BigQuery | URL直打ちで テーブル定義を見る

以下のフォーマットでアクセスすれば良い。

```
https://bigquery.cloud.google.com/table/[project_id]:[dataset_name].[table_name]
```

例えばこんな感じ。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/b8f1f075-bc20-ddf1-1b21-d7bd2f62223c.png)


# ポイント

パスが `table/` から始まっているところに注意。

BigQueryの画面によってはここが `queries/` だったり `results/` するので。
URLの後ろにテーブル名をくっつけるだけではアクセス出来ない。
 








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ExcelVBAでアルファベットの先頭文字を小文字にする

ExcelVBAでアルファベットの先頭文字を小文字にする方法

```vbnet
Dim before As String
before = "String"
after = LCase(Left(before , 1)) + Mid(before , 2, Len(before ))
' after = "string"
```

単語の先頭文字を大文字にするのであれば[StrConv 関数](https://support.office.com/ja-jp/article/StrConv-%E9%96%A2%E6%95%B0-19c3816f-dbc9-4adf-891c-fd32734c92e0)を使えばよい
Xamarin Studioのソリューションのコードフォーマッティングの設定が保存できなくなった場合の対処法

XamarinStudioでソリューションのコードフォーマッティングをカスタムして保存しても次開き直した時には全て元に戻って全く反映されなくなることがあって、その対処法が分かったのでメモしておきます。

## XamarinStudio全体の設定とソリューションの設定

XamarinStudioのPriferencesでの設定は新規作成の時に適用されるもので、ここを変えても既にあるソリューションの設定は変わりません。既存ソリューションの設定を変えるにはソリューションのオプションの方の設定を変えます。
…のはずなんですがコードフォーマッティングの設定は何故か反映されなくなることがあるみたいで（発生条件は不明）、そうなると何回設定を変えても反映されることがなくなってしまいます。

## 解決方法

ソリューションファイル（.sln）をテキストエディタで開いて
GlobalSection(MonoDevelopProperties) = preSolution
から
EndGlobalSection
までを丸ごと削除して保存

それで開き直すと一旦XamarinStudio全体の設定でリセットされて、またソリューション個別の設定も保存できるようになりました。

※ソリューションファイルを編集する前には必ずバックアップを。
MS-AccessからODBCデータベースにエクスポートするとエラーになる

MS-AccessのデータをMySQLデータベースに変更する為に、
MS-AccessのテーブルからODBCデータベースにエクスポートしようとすると
「データをエクスポートできませんでした」のダイアログが出て、エラーが発生してしまいます。

対象のテーブルは幾つかあって、他のテーブルは成功するのですが、
一つのテーブルだけが、このエラーになってしまいます。

バージョンは、
Connector/ODBC 5.3.6
を使用しています。

エラーの原因として考えられる事等、ご教授ください。
githubのリモートリポジトリを削除する


タイトルの通りです。

git/githubの練習を兼ねて、GItHub上にいくつかリポジトリを作りました。
今となっては黒歴史…
削除したいと思いましたが、なかなかそれらしき項目にたどり着けなったのでメモしておきます。


- 削除対象のリポジトリの選択
- Settingsタブを選択

![display.png](C:\Users\Administrator\Desktop\display.png)

- Delete this repositoryボタンを選択

![delete.png](C:\Users\Administrator\Desktop\delete.png)

- 削除するリポジトリ名を入れてボタンを選択

![confirm.png](C:\Users\Administrator\Desktop\confirm.png)

以上で終わりです。
古い情報とUIが違ってとまどいました。

Qiitaでの投稿練習も兼ねて
らずぱいでPC8801エミュ(XM8)

## 概要
- [PC-8801MAエミュレータ XM8](http://retropc.net/pi/)をらずぱいでやってみる
- らずぱいにはおもすぎる...<br>...気がしたのは音だけを聞いてたからかもしれないので、あとで音無しで、アクションゲームとかで確認.. (動作報告、改善方法などコメント欄へお願いします....)

## 環境
- Raspberry Pi 3
- `2016-05-27-raspbian-jessie.img`
- \# エミュレータなので、88のROMイメージが必要。(`README-XM8.txt`に記載されている)

## 手順

- Source/Source.zipを解凍した中の`README-BUILD.txt`に従う

```bash
wget http://retropc.net/pi/xm8_161.zip
unzip xm8_161.zip -d xm8
cd xm8/Source
unzip Source.zip
cd Linux

sudo apt-get install g++ build-essential libsdl2-dev
make clean
make
```
=> `xm8`が生成

- `README-XM8.txt` で指定されたROMイメージファイルを`xm8`と同じフォルダに入れる。
- ファイル名は、大文字にしないといけない。(Linuxだ)

## すくしょ

 ![sc3.png](https://qiita-image-store.s3.amazonaws.com/0/75594/28e78618-8b89-c08a-dab5-17380476b188.png)

</br ![s.png](https://qiita-image-store.s3.amazonaws.com/0/75594/53487e20-bff9-f9bf-4cb2-da97036841a8.png)>


 ![s5.png](https://qiita-image-store.s3.amazonaws.com/0/75594/41e65a54-a9b8-97ec-942f-3de1f4fcf5cf.png)

## その他
- `make`一発でとおるなんてすばらしい.
- スクショは、fbgrab使用<br>`sudo apt-get install fbcat`<br>`fbgrab -d /dev/fb0 filename.png`
- `amixier cset numid=3 1`<br>↑で、HDMIにつないでいて、Audioをイヤホン出力にできる。
mapが重かった話し

こんなリストがあってね

```
var list = [
    {id: 0, value:0},
    {id: 3, value:3},
    {id: 6, value:6}
];
```

検索しやすいようにキー配列を生成するね

```
var keyList = [];
list.map((elm, index)=>{
    keyList[elm.id] = elm;
});
```

keyListの中身こうだろう

```
console.log(keyList);
/*
[ 0: { id: 0, value: 0 },
  3: { id: 3, value: 1 },
  6: { id: 6, value: 2 } ]
 */
```


使い終わったから戻すよ

```
var _newList = [];
keyList.map((value, index) => {
    _newList.push(value);
});
```

＿人人 人人＿
＞ ここが重い ＜
￣Y^Y^Y^Y￣


解決法、mapじゃなくて`For in`な

```
for (var i in keyList) {
    _newList.push(keyList[i]);
}
```

原因（多分こうだろう）
keyListの中身、実際はIDの抜け目もちゃっかり生成されてる

```
[ { id: 0, value: 0 },
  ,
  ,
  { id: 3, value: 3 },
  ,
  ,
  { id: 6, value: 6 } ]
```

実際IDが1029378みたいな長い桁だとエライ空エレメントが生成されて重くなる
解決法としてIDをストリングにする手もある。

```
var keyList = [];
list.map((elm, index)=>{
    keyList[String(elm.id)] = elm;
});
```

※Babelでの話しどす

- - - 

コメントの指摘通りES2015は関係ないのでタイトルを変更します。

ES2015のmapが重かった話し
↓
mapが重かった話し
WordPress JetpackのOGPタグのデフォルト画像とアーカイブ系での出力

# og:image のデフォルト画像を変更する

## 優先順位
1. 投稿・固定ページ・カスタム投稿タイプの記事ページ（ is_singler ）ではアイキャッチ画像＋本文内の画像
2. 作成者別アーカイブ（ is_author ）ではそのユーザーのアイコン
3. 該当する画像がなければサイトアイコン（WordPress 4.3以降）
4. 1-3に該当する画像がなければデフォルト画像（https://s0.wp.com/i/blank.jpg）

## デフォルトの画像設定
`jetpack_open_graph_image_default` フィルターにフックする。
テーマの `functions.php` に書くかプラグインにしておく。
下記はテーマにある画像 `/images/my_open_graph_image_default.png` 利用の場合。

```php
function my_open_graph_image_default( $image ) {
	$image = get_stylesheet_directory_uri() . '/images/my_open_graph_image_default.png';
	return $image;
}
add_filter( 'jetpack_open_graph_image_default', 'my_open_graph_image_default' );
```
なお、WordPress 4.3 以降に実装されたサイトアイコンはもともと Favion や WordPress.com 関連での利用が前提なので、正方形にトリミングされてしまう。
現状、サイトアイコンを設定したうえでそれ以外の画像を og:image のデフォルト画像にしたい場合は `jetpack_open_graph_tags` フィルターにフックする。

```php
function my_jetpack_open_graph_tags( $tags ) {
	$og_image_default = get_site_icon_url( 512 );
	if ( $tags["og:image"] == $og_image_default ) {
		$tags["og:image"] = get_stylesheet_directory_uri() . '/images/my_open_graph_image_default.png';
		$tags["og:image:width"] = 600; // 画像の幅
		$tags["og:image:height"] = 400; // 画像の高さ
	}
	return $tags;
}
add_filter( 'jetpack_open_graph_tags', 'my_jetpack_open_graph_tags' );
```

# アーカイブ系で Jetpack の OGP タグを出力
デフォルトで対応しているのは、HOME（ is_front_page ）、ブログトップ（ is_home ）、作成者別アーカイブ（ is_author ）、投稿・固定ページ・カスタム投稿タイプの記事ページ（ is_singler ）の4種でアーカイブ系では出力されない。
`jetpack_open_graph_base_tags` フィルターにフックする。
カテゴリー、タグ、タクソノミーアーカイブ及びカスタム投稿タイプのアーカイブに対応したコード。日別アーカイブへの対応や og タグの中身はお好みで。

```php
function my_jetpack_open_graph_base_tags( $tags ) {
	if ( ! is_archive() )
		return $tags;

	$tags['og:type']        = 'object';
	$tags['og:title']       = get_the_archive_title();
	if ( is_category() || is_tag() || is_tax() ) {
		$object = get_queried_object();
		$tags['og:description'] = esc_attr( get_the_archive_description() );
		$tags['og:url']         = get_term_link( $object->term_id, $object->taxonomy );
	} elseif ( is_post_type_archive() ) {
		$object = get_queried_object();
		$tags['og:description'] = esc_attr( $object->description );
		$tags['og:url']         = get_post_type_archive_link( $object->name );
	}
	return $tags;
}
add_filter( 'jetpack_open_graph_base_tags', 'my_jetpack_open_graph_base_tags' );
```

## カテゴリーごとに og:image 変えたい

`jetpack_open_graph_tags` フィルターにフックする。
WPのダッシュボードからカテゴリーごとに og:image 用の画像を設定したい場合は、別途 [Advanced Custom Fields](https://ja.wordpress.org/plugins/advanced-custom-fields/) などを使ってよしなに。
ここではあくまで出力のみ。大抵の場合、カテゴリーIDが取れればなんとかなる。
例としてテーマに `/images/my_open_graph_image_category_{カテゴリーID}.png` を用意しておく。

```php
function my_category_jetpack_open_graph_tags( $tags ) {
	if ( is_category() ) {
		$object = get_queried_object();
		$tags["og:image"] = get_stylesheet_directory_uri() . '/images/my_open_graph_image_category_' . $object->term_id . '.png';
		$tags["og:image:width"] = 600; // 画像の幅
		$tags["og:image:height"] = 400; // 画像の高さ
	}
	return $tags;
}
add_filter( 'jetpack_open_graph_tags', 'my_category_jetpack_open_graph_tags' );
SharePoint Client Object Model でサイトのプロパティバッグを取得するコード

```javascript
// コンテキスト取得
var custCtx = SP.ClientContext.get_current();
 
// サイトオブジェクト取得指示
var custWeb = custCtx.get_web();

// プロパティバッグ オブジェクトの取得指示
var custProps = custWeb.get_allProperties();

// プロパティバッグ オブジェクト取得予約
custCtx.load(custProps);

// サーバーへのクエリー実行（ここまでのコンテキストに含まれる指示予約を送信）
custCtx.executeQueryAsync(
    function(sender, args) { // クエリー実行時コールバック処理

        // すべてのプロパティを列挙
        for (var val in custProps.get_fieldValues()) {
            console.log(String.format("{0} -> {1}", val, custProps.get_fieldValues()[val]));
        }

        // 特定のプロパティ値を変更するサンプル
        // custProps.set_item('CustomPropName', 'CustomPropValue');
        // custWeb.update();
        // 更新したら、サーバーに送信が必要です！
        // custCtx.executeQueryAsync(
        //     function(sender, args) { // クエリー実行時コールバック処理
        //         console.log('送信ヨシ！');
        //     },
        //     function(sender, args) { // クエリー失敗時コールバック処理
        //         console.log('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
        //     }
        // );
    },
    function(sender, args) { // クエリー失敗時コールバック処理
        console.log('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
    }
);
```
ArukasでMongoDBを動かしてみた

Dockerホスティングサービス「[Arukas]」で[MongoDB]を動かしてみました。
あまり参考になるサイトが無かったように感じたので、ここにメモしておきます。

## [Arukas]に[MongoDB]をインストール
1. [Arukas]にログインし、「新しいアプリケーションを作成」を選びます。
2. 各項目に入力していきます。
    - 「App Name」は任意。(mongo)
    - 「Image」は「mongo:latest」など。([mongo])
    - 「Instances」は1～10で任意。(1)
    - 「Memory」は任意。(256MB)
    - 「Endpoint」は任意。(空白でもOK。適当な名前がつく)
    - 「Port」は「27017」にする。(27017)
    - 「ENV」は任意。(空)
    - 「CMD」は任意。(空)
3. 「アプリケーションを作成」を選ぶ。
4. [Arukas]のホームに戻り、[MongoDB]を起動する。

以上で、[MongoDB]が正常に起動するはずです。
ポート番号を変えると起動に失敗しました。

## [mongo-express]で[MongoDB]に接続する
今回は[mongo-express]を使ってみました。

1. Node.jsの環境(nodeやnpm)を用意する。(省略)
2. 以下のコマンドを実行してインストールする。

    ```bash
    npm install -g mongo-express
    ```

3. インストール先に移動する。

    ```bash
    cd YOUR_PATH/node_modules/mongo-express/
    ```

4. 設定ファイルをコピーする。

    ```bash
    mv config.default.js config.js
    ```

5. 設定ファイルの以下の部分(20行目辺り)を修正する。

    ```js:config.js
  mongo = {
    db:       'db',
    host:     '*****.*****.arukascloud.io', // Arukasで表示される「Port」のアドレス部分(ポート番号以外)
    password: '', // 空白
    port:     00000, // Arukasで表示される「Port」のポート番号部分
    ssl:      false,
    url:      'mongodb://*****.*****.arukascloud.io/db', // Arukasで表示される「Port」のアドレス部分(ポート番号以外)
    username: '', // 空白
  };
    ```

6. 以上の設定にしたあと、起動する。

    ```bash
    node app.js
    ```

7. 起動後、ブラウザで http://localhost:8081/ を確認すると、ユーザ認証が表示されるがユーザ名とパスワードは「admin/pass」と入力すると、データベース「db」が表示される。

### 失敗？
ブラウザで表示後、データベースの作成はできなかった。
データベース「db」の中で適当なCollectionの作成はできた。

[Arukas]:https://app.arukas.io/
[MongoDB]:https://www.mongodb.com/jp
[mongo]:https://hub.docker.com/_/mongo/
[mongo-express]:https://github.com/mongo-express/mongo-express
Mac | ターミナルで単語ごとにカーソルを移動できるようにする

# 方法

「環境設定」→「キーボード」→「メタキーとして Optionキーを使用」をオンにする (画面下)

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/705a1154-9286-83ff-f97f-f8c0a93547a2.png)

# 結果

(画像だと分かりづらいが)
option + 左右キーで単語を移動できるようになり、操作が楽になった。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/7e7eca40-c84a-6ca1-6483-3d7b62a9c62c.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/afa68ee6-3844-be7f-32b8-a45b294bf7c2.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/51d73ed5-2597-3d78-4cff-387030735a0d.png)

# 環境

- OS X 10.11.4 (15E65)

# 参考

- [zshでよく使うキーバインドまとめ](http://qiita.com/takc923/items/08792b7188b5c11e0f21)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
emacsで手書きフォントを使う

windowsの[emacsでプロポーショナルフォント](http://qiita.com/styzo/items/f8855cb0f5821396e6aa)が使えるように設定できたので、手書きフォントも使えるようにしてみた。

```el:init.el
(create-fontset-from-ascii-font
 "Comic Sans MS:weight=normal:slant=normal" nil "handwritten")
(set-fontset-font "fontset-handwritten" 'japanese-jisx0208
		  (font-spec :family "S2GP海フォント"))
(add-to-list 'face-font-rescale-alist '("S2GP海フォント" . 1.09))
(defface handwritten
  '((default . (:family "Comic Sans MS"))) "手書きフォント")
;; (defface handwritten
;;   '((default . (:family "S2GP海フォント"))) "手書きフォント")
(set-face-attribute 'handwritten nil :fontset "fontset-handwritten")

(require 'face-remap)
(defun handwritten-face-mode (&optional arg)
  "handwritten-face mode.
An interface to `buffer-face-mode' which uses the `handwritten' face.
Besides the choice of face, it is the same as `buffer-face-mode'."
  (interactive (list (or current-prefix-arg 'toggle)))
  (buffer-face-mode-invoke 'handwritten arg
			   (called-interactively-p 'interactive)))
```

![comic.png](https://qiita-image-store.s3.amazonaws.com/0/40128/71e2ce84-31cf-586e-0d20-456aa0093d3f.png)

ascii文字もS2GP海フォントにすることもできるが、このフォントにはイタリック体がないのでComic Sans MSにした。ascii文字もS2GP海フォントにする場合はdeffaceの部分を変更する。

参考:
http://s2g.jp/font/index.htm
SourceTreeのターミナルが開かなくてめっちゃ困った件について

Gitはコマンド+SourceTreeを使っています。
MargeコマンドとかpushはGUIの方がわかりやすくて簡単だから。
使ってみると便利やな……。

が、今朝になってSourceTreeのターミナル先輩が動かない。
画面を開くとこんなことを言われる…！

```
Failed to fork child process: Resource temporarily unavailable.
DLL rebasing may be required. See 'rebaseall --help'.
```

なんだよ…！！

* リペア(インストールファイルについてるRepairを使用してみる)→直らぬ
* 先輩(人間)に聞く→先輩はSourceTreeのターミナルさんとはお付き合いしていない模様


最終的にGit for Windowsを入れてシステムGitに設定変更したらできました。
内蔵Gitの更新はあるファイル(名前忘れた)が解凍できなかったのでやめました。
(どうやらそれを解凍するためのツールが必要だったみたいです)
[Excel] 【あいうえお】→あいうえお、等特定の文字に囲まれた文字を取得したい場合の関数

#こんな感じで文字列取得したい

![image](https://qiita-image-store.s3.amazonaws.com/0/36476/a1b49052-a3e4-a703-9087-717382d30e41.png)


- 上記の場合は、【から】まで。通常だとよくあるのが（）で囲まれた文字列などです
- 毎回関数組むのも面倒くさくなってきたので、コピペできるように張っておきます。

#取得するための関数


```
=MID(LEFT(A1,FIND("】",A1)-1),FIND("【",A1)+1,LEN(A1))
```

変更箇所は以下のとおり。
- 【→開始文字
- 】→終了文字
- A1→対象のセル

これで、特定の文字で囲まれた文字列を取得できます。

## 解説

```
=MID(LEFT(A1,FIND("】",A1)-1),FIND("【",A1)+1,LEN(A1))
             ~~~~~~~~~~~
              】の位置
     ~~~~~~~~~~~~~~~~~~~~~~~
      取得データ→「たとえばこんな文字があって【ここからここまで
                             ~~~~~~~~~~~~~~
                              【の位置
                                            ~~~~~~~
                                             全体の長さ（MID関数の場合、指定した数値より短い場合は取得できる分だけ取得される）
```




#応用編その１（先頭から】まで）

## 関数
```
=MID(A1,FIND("】",A1)+1,LEN(A1))
```

## 解説
```
=MID(A1,FIND("】",A1)+1,LEN(A1))
        ~~~~~~~~~~~~
        】までの位置
                    ~~
                     】文字自体は要らないので1文字ずらす
                       ~~~~~~~
                        全体の長さ（MID関数の場合、指定した数値より短い場合は取得できる分だけ取得される）
```

# 応用編その２（区切り文字を1文字以上使いたい）

区切り文字を今まで1文字でやってきたが、複数文字取り扱いたい場合はこうなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36476/a445a789-b40f-7086-d401-b0b59689f933.png)

## D2の関数
```
=IFERROR(MID(LEFT(A2,FIND(C2,A2)-LEN(C2)+1),FIND(B2,A2)+LEN(B2),LEN(A2)),"-")
```

#更新履歴
- 2019/11/20 区切り文字が複数文字のパターン追加
- 2018/04/03 その１削除。その２のみ表示。
- 2016/12/08 ▲▼を【】に変更にしました。自分でも紛らわしかったので。
- 2016/12/08 タイトルを変更しました。わかりにくかったので。
CHTCollectionViewWaterfallLayout でセルの横幅取得

Pinterest風のCollectionViewを利用できるようにする
[CHTCollectionViewWaterfallLayout](https://github.com/chiahsien/CHTCollectionViewWaterfallLayout) 
で、セルの横幅を取りたかったのでメモ

## UICollectionViewLayout を拡張して実装

```swift
import Foundation
import CHTCollectionViewWaterfallLayout

extension UICollectionViewLayout {
    func getCHTItemWidth() -> CGFloat{
        guard let collectionViewRect = self.collectionView?.bounds else {
            return 0
        }
        if self is CHTCollectionViewWaterfallLayout {
            let me = self as! CHTCollectionViewWaterfallLayout
            let columnWidth = collectionViewRect.width - (me.sectionInset.left + me.sectionInset.right)
            return ( columnWidth - CGFloat(me.columnCount - 1) * me.minimumColumnSpacing ) / me.columnCount
        } else {
            return collectionViewRect.width
        }
    }
}
```

## 使用方法
  横幅:セルの横幅 縦幅:セルの横幅+60 のセルを返したい時

``` swift
extension ViewController : CHTCollectionViewDelegateWaterfallLayout {
    func collectionView(collectionView: UICollectionView!,
                        layout collectionViewLayout: UICollectionViewLayout!,
                               sizeForItemAtIndexPath indexPath: NSIndexPath!) -> CGSize {
        let w = collectionViewLayout.getCHTItemWidth()
        return CGSize(width: w, height: w + 60)
    }
}
```

セルの横幅に合わせた柔軟なレイアウトが組めて楽しいです
if文でDictionaryのContantsKeyと中身を同時に判定させた時の動きについて

備忘録代わり

Diconaryの中身の存在を確認しつつ、その値を使って、bool型を返すメソッド等を同時に判定したいときに、下記の様に書けば出来る。


**成功例：if文にて、ContainsKeyがtrueであり、dictonaryの中身を読み取れた結果を更に判定している**

```csharp
Dictionary<string, bool> dictionary = new Dictionary<string,bool>();
            dictionary.Add("a" , true);
            
            try
            {
                string key = "a";
                if (dictionary.ContainsKey(key) && dictionary[key])
                {// ここに行く
                    Console.Write("1");
                }
                else
                {
                    Console.Write("2");
                }
            }
            catch(Exception ex)
            {
                Console.Write("3");
            }
```

**成功例：if文にて、ContainsKeyがfalseであり、dictonaryの中身を読み取る前に判定している**

```csharp
Dictionary<string, bool> dictionary = new Dictionary<string,bool>();
            dictionary.Add("a" , true);
            
            try
            {
                string key = "b";
                if (dictionary.ContainsKey(key) && dictionary[key])
                {
                    Console.Write("1");
                }
                else
                {// ここに行く
                    Console.Write("2");
                }
            }
            catch(Exception ex)
            {
                Console.Write("3");
            }
```

**失敗例：if文の中で、ContainsKeyをDictionaryの中を見る処理より後に行っている為。**

if文の複数判定時には、左辺から見ている様。

```csharp
Dictionary<string, bool> dictionary = new Dictionary<string,bool>();
            dictionary.Add("b" , true);
            
            try
            {
                string key = "a";
                if (dictionary[key] && dictionary.ContainsKey(key))
                {
                    Console.Write("1");
                }
                else
                {
                    Console.Write("2");
                }
            }
            catch(Exception ex)
            {// ここに行く
                Console.Write("3");
            }
```
標準のftpよりベターなコマンドライン用FTPツール NcFTP


MacやLinuxでFTPを扱う場合、コマンドラインでは`ftp`コマンドが標準で使えます。
ただし、このコマンドは素朴すぎて、実務では少し煩雑に思えます。

一方、FileZillaなどのGUI型FTPクライアントはかなり高機能なものも無料でありますが、コマンドラインで作業を済ませたい場合にはかえって煩雑です。

そこで、標準の`ftp`コマンドよりもベターなCUI(CLI)型のFTPクライアントである`NcFTP`を紹介します。

（注意：SSH経由のFTP(SFTP)が使える場合は、`sftp`の使用を検討してください。）

### 特徴

* 接続したホストをブックマークに登録できる。
    * 初回接続時に`bookmark`コマンドで登録すれば、次回からは、ブックマークを使ってホストにアクセスできる
* get/putでワイルドカードや各種オプションが使用できる。
* 付属の`ncftpget`/`ncftpput`コマンドを使えば、Unixシェルから直接get/putができる。

### インストール

#### Macの場合(Homebrew)
    brew install ncftp
    
Linuxも、各種パッケージマネージャに入っていると思いますので、説明は割愛します。

### 使い方
#### 接続

    ncftp -u [username] [hostname]

すると、パスワードを聞かれるので入力します。次のプロンプトが出たら成功です：

    User foo logged in.
    Logged in to hogehoge.com.
    ncftp / >

#### ブックマーク
 接続できたら、その設定をブックマークに入れておきましょう。

    ncftp / > bookmark
    Enter a name for this bookmark, or hit enter for "hoge": [付けたいブックマーク名を入力]
    
    You logged into this site using a password.
    Would you like to save the password with this bookmark?
    
    Save? [no] yes ←ここでyesと入力する
    Bookmark "foo" saved.

ブックマークされた設定は、`bookmarks`コマンドで参照できます。

#### ダウンロード(get)/アップロード(put)
##### `ncftp`本体を使う場合

* リモートからローカルへファイルをダウンロードしたいとき: get
* ローカルからリモートへファイルをアップロードしたいとき: put


get/putともに、ワイルドカードが使えます。再帰的に（サブディレクトリごと）get/putしたい場合は`-R`オプションを付けます。

    get file1 file2
    get README*
    get -R *         ## ディレクトリ全体をダウンロード
    
    put xx.zip yy.zip
    put *.zip
    put -R *

##### 付属ツール`ncftpget`/`ncftpput`を使う場合
あらかじめブックマークを登録しておけば、その名前のサーバに対して、Unixシェルから直接get/putができます。

    ncftpget [options] bookmark-name local-directory remote-files...
    ncftpput [options] bookmark-name remote-directory local-files...

#### 設定

* 設定の確認は`prefs`コマンドで確認できます。
* 設定を変える場合は、`set <option> <value>`で設定できます。

自分の設定：

    set auto-resume yes
    set autosave-bookmark-changes yes
    set pager more
    set save-passwords yes
    set show-status-in-xterm-titlebar yes



具体的な設定項目はMan Page(`man ncftp`または[ncftp(1) manual page](http://www.ncftp.com/ncftp/doc/ncftp.html))の「Variable Reference」の項を参照してください。


### 参考

NcFTP Software
http://www.ncftp.com/

ncftp(1) manual page
http://www.ncftp.com/ncftp/doc/ncftp.html

Man page of NcFTP (日本語訳)
https://linuxjm.osdn.jp/html/ncftp/man1/ncftp.1.html

ncftp - 高機能 ftpクライアント - 会津大学UNIXウィキ
http://technique.sonots.com/?UNIX%2F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%2F%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%2Fncftp
Eloquentのリレーション "One To Many"


複数のテーブルがお互いに関連してる、なんてよくある話。
Eloquenがテーブル同士の関連をモデルレベルで設定する仕組みを **「リレーション」** という。


###Eloquentが扱えるリレーション
- One To One (1:1)
- **One To Many (1:多)**
- Many To Many (多:多)
- Has Many Through（多:多）
- Polymorphic Relations
- Many To Many Polymorphic Relations

今回は **One To Many** についての記事なので説明は省略。
そのうち他のも書く（予定）。

#One To Many

片方のテーブルの **１つのデータに対し** 、もう一方のテーブルの **複数のデータが紐付く** 場合。

例としてECサイトで買い物をする。
**購入者** の情報と **購入品** についての情報を別のDBに保存すると仮定。

|購入者情報（user）||購入品情報（productOrder）|
|:--:|:--:|:--:|
|id||id|
|**user_id**||**customer_id**|
|name||product_name|
|kana||category|
|email||price|
|||created_at|
|||updated_at|

１回の注文でユーザーが複数の商品を購入するとき、One **(user)** To Many **(productOrder)** となる。

#コード

```php:Controller
public function orderList(){
    $id = $this->request->get("id");
    $salesorderlines = Salesorder::find($id)->orderLine;
    // 今回は遷移前のページから受け取ったリクエストのidを使いたかったのでこうなったけど
    // 特定のユーザーのidがわかってるなら、そのままfind(1)のように直接つっこんでもOK

    return view('{{Blade}}', [
        "user" => $user,
        "productOrders" => $productOrders
    ]);
}
```

```php:Eloquent1
<?php

namespace App\Http\Model;

use Illuminate\Database\Eloquent\Model;
class User extends Model
{
    protected $table = 'user';

    public function orderLine()
    {
        return $this->hasMany(ProductOrder::class, 'customer_id', 'user_id');
        // 第２引数に'リレーション先カラム名'、第３引数に'リレーション元カラム名'を設定
        // 第２＆３引数がない場合はidがリレーションキーとなる
    }
}
```

```php:Eloquent2
<?php

namespace App\Http\Model;

use Illuminate\Database\Eloquent\Model;
class ProductOrder extends Model
{
    protected $table = 'productOrder';

}
```


```php:Blade
<table class="user">
	<tr>
		<th>氏名</th>
		<th>ふりがな</th>
		<th>メールアドレス</th>
	</tr>
    <tr>
        <td>{{ $user->name }}</td>
        <td>{{ $user->kana }}</td>
        <td>{{ $user->email }}</td>
    </tr>
</table>

<table class="productOrder">
	<tr>
		<th>商品名</th>
		<th>カテゴリー</th>
		<th>値段</th>
	</tr>
	@foreach($productOrders as $productOrder)
	<tr>
	    <td>{{ $productOrder->product_name }}</td>
	    <td>{{ $productOrder->category }}</td>
   	    <td>{{ $productOrder->price }}</td>
	</tr>
	@endforeach
</table>
```
keyhac 設定

# 基本方針
おおむね http://www49.atwiki.jp/ntemacs/pages/25.html を参考に
カスタマイズ部分だけ記載

# IME 関連
IME の切り替えの挙動が自分の PC ではなんかおかしかったので下記コメントアウト

```
    # emacs日本語入力モードを使うかどうかを指定する（True: 使う、False: 使わない）
    use_emacs_ime_mode = True ← コメントアウト
```

# ブラウザ
C-l でアドレスバー入力をしたいので以下行をコメント

```
define_key(keymap_emacs, "C-l",        reset_search(reset_undo(reset_counter(recenter))))
```

# Excel
C-Enter は値コピーにしたいので、コメントアウト
F2 でセル編集モードも手を放してしまうので C-l にする

```
    if 1:
        keymap_excel = keymap.defineWindowKeymap(class_name="EXCEL*")

        # C-Enter 押下で、「セル編集モード」に移行する
        define_key(keymap_excel, "C-Enter", reset_search(reset_undo(reset_counter(reset_mark(self_insert_command("F2")))))) ← コメントアウトする

        # C-l 押下で、「セル編集モード」に移行する
        define_key(keymap_excel, "C-l", reset_search(reset_undo(reset_counter(reset_mark(self_insert_command("F2")))))) ← 追加
```

# 全般
キーボードにファンクションキーがないので、C-[1-9] に割り当て
Windows キーもないので、無変換キーに割り当て

```
    if 1:
        keymap_global = keymap.defineWindowKeymap()

        keymap_global[ "C-1" ] = "F1"
        keymap_global[ "C-2" ] = "F2"
        keymap_global[ "C-3" ] = "F3"
        keymap_global[ "C-4" ] = "F4"
        keymap_global[ "C-5" ] = "F5"
        keymap_global[ "C-6" ] = "F6"
        keymap_global[ "C-7" ] = "F7"
        keymap_global[ "C-8" ] = "F8"
        keymap_global[ "C-9" ] = "F9"

        keymap.replaceKey(29, 91)  #無変換を Left Windows キーに割り当て
```

# その他
キーコードを調べる場合は以下が便利
[keymill](http://kts.sakaiweb.com/keymill.html)
macでsphinx使う(brew ver.)

# TL;DR
- pip入れる
- sphinx入れる
- おしまい

# pip入れる
brewでPython入れると一緒に入るとのこと。

```shell-session
# pre check
which python
#=> /usr/bin/python

# install python 2.X
brew install python

# after check
which python
#=> /usr/local/bin/python

which pip
#=> /usr/local/bin/python
```

# sphinx入れる

```shell-session
# install
pip install -U Sphinx

# version check
sphinx-build -v
#=> Sphinx v1.4.4 (with usage)
```

# 参考
- 「MacでPython使う時の最低限のメモ（Homebrew編）」 http://qiita.com/zaburo/items/fbdaf6c04151671407db

- 「Sphinxの概要(Sphinx公式)」http://www.sphinx-doc.org/ja/stable/
めざせpythonライブラリマスター （59）logbook

#【ライブラリ説明】
　ログを簡単に表示できる

#【プログラム】
```py:logbook.py
# -*- coding: utf-8 -*-

from logbook import Logger, StreamHandler
import sys
StreamHandler(sys.stdout).push_application()
log = Logger('My Awesome Logger')
log.warn('This is too cool for stdlib')
# [2016-06-16 01:23:54.994000] WARNING: My Awesome Logger: This is too cool for stdlib
```

#【参考サイト】
　[github](https://github.com/getlogbook/logbook)
　[document](http://logbook.readthedocs.io/en/stable/index.html)