OmniAICreator/Qiita-1.07M huggingface dataset:
Docker command


###Image command

Imageの検索

```:bash
sudo docker search centos
```

Imageのpull

```:bash
sudo docker pull centos
```

Imageのpush

```:bash
sudo docker push centos
```

Image一覧の確認

```:bash
sudo docker images
```

Imageの削除

```:bash
sudo docker rmi 36540f359ca3
```

###Container command

現在、動いているcontainerを表示

```:bash
sudo docker ps
```

過去の実行containerの最新の5件を表示。

```:bash
sudo docker ps -a -n=5
```

container削除

```:bash
sudo docker rm f51760d1a19b
```

containerをbackgroundで走らせる

```:bash
sudo docker run -d centos free -s 3
```

実行中containerのlogを見る

```:bash
sudo docker logs 99b194d003dd
```

containerをforegroundで走らせる

```:bash
sudo docker attach --sig-proxy=false 99b194d003dd
```

実行中のcontainerを停止する

```:bash
sudo docker kill 99b194d003dd
```

起動中のcontainerにアクセス

```:bash
sudo docker exec -it httpd-container /bin/bash
```

止まっているcontainerにアクセスする

```:bash
sudo docker start -ia log-container
```

containerを起動する

```:bash
sudo docker start 99b194d003dd
```

プロセスを確認する

```:bash
sudo docker top e7e5f3d83f76 ax | unexpand -t20
```

対話モードで立ち上げて、ターミナルを使う

```:bash
sudo docker run -i -t centos /bin/bash
```

containerをcommitする
 
```:bash
sudo docker commit 27663a6f8fe8 bibo/test
```

containerにloginする

```:bash
sudo docker run -i -t bibo/hello /bin/bash
```
Ext.grid.plugin.RowEditingのupdateボタンとcancelボタンの順番を変える

GridのRowEditorでは、ボタンの並びは update, cancel の順となっています。
これを cancel, update の順に変更するには
`Ext.grid.RowEditorButtons` をオーバーライドすればよさそうです。

```js:/overrides/grid/RowEditorButtons.js
Ext.define('MyApp.overrides.grid.RowEditorButtons', {
    override: 'Ext.grid.RowEditorButtons',

    initComponent: function(cfg) {
        var me = this;

        me.callParent();

        /**
         * updateボタンとcancelボタンの順番を入替え
         */
        me.items.reorder({0: 1, 1: 0});

        /**
         * updateボタンが目立つようにスタイリング
         */
        me.child('#update').setUI('default');
    }
});
```

(変更前)
![ボタンがupdate,cancelの順のキャプチャ](https://qiita-image-store.s3.amazonaws.com/0/8029/27acc035-9599-2c99-1afe-c9d9b40d8253.png)

こうなりました ↓

(変更後1)
![ボタンがcancel,updateの順だがボタン間のスペースがなくなっているキャプチャ](https://qiita-image-store.s3.amazonaws.com/0/8029/0d8aa4cd-d01b-d86e-520d-d78893cbb1dc.png)


順番は入れ替わりましたが、ボタンの間のスペースがなくなってしまっています。
これはスタイルが↓のように設定されているのが原因です。

```scss:/ext/classic/theme-neutral/sass/src/grid/plugin/RowEditing.scss
.#{$prefix}row-editor-update-button {
    margin-right: ceil($grid-row-editor-button-spacing / 2);
}
.#{$prefix}row-editor-cancel-button {
    margin-left: floor($grid-row-editor-button-spacing / 2);
}
```

なので、これも上書きするようにします。

```scss:RowEditorButtons.scss
/**
 * RowEditorのupdateボタンとcancelボタンの順番入替えに伴うスタイル変更
 */
.#{$prefix}row-editor-cancel-button {
    margin-right: ceil($grid-row-editor-button-spacing / 2);
    margin-left: auto;
}
.#{$prefix}row-editor-update-button {
    margin-left: floor($grid-row-editor-button-spacing / 2);
    margin-right: auto;
}
```
この RowEditorButtons.scss を 先程の RowEditorButtons.js と同じ場所か
{テーマディレクトリ}/sass/src/grid/ 下に置けばOKです。

最終的にはこうなりました ↓

(変更後2)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/8029/afd0663d-dd12-0cb5-9fe6-00d2c4c7f637.png)


(Ext.MessageBoxのボタンの順番を変える方法は [こちら](http://qiita.com/yamayamayamaji/items/baad5909da1a91991774 "Ext.MessageBoxのボタン(ok,yes,no,cancel)の順番を変える") を参照)
BigqueryでunixtimeをJSTに変換する

## 概要
unixtimeをJSTに変換するというよくあるやつ。
レガシーSQLの記事はちらほら見つけたけど、スタンダードSQLの記事をあまり見なかったので書いた

```sql:クエリ
#standardSQL
FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', TIMESTAMP_SECONDS(unixtime), 'Asia/Tokyo')
```
Unity5 NGUIで、NGUITools.AddChildしたものの実体を参照する



### これだとエラー

```csharp:exp.cs

GameObject prefab = (GameObject)Resources.Load("Prefabs/UI/Balloons/BtnBalloon") as GameObject;
Destroy(prefab,4f);
NGUITools.AddChild(BalloonParentObj, prefab);

```

### これだとOK

```csharp:exp.cs


GameObject prefab = (GameObject)Resources.Load("Prefabs/UI/Balloons/BtnBalloon") as GameObject;
GameObject BalloonPrefab = NGUITools.AddChild(BalloonParentObj, prefab);// NGUIに追加 帰り値で、prefabの実体を参照
Destroy(BalloonPrefab,4f); //４秒後に追加したprefabを削除

```

## NGUITools.AddChildの返り値で引数の実体を参照できる
【Xcode】pngcrushエラー対処法【iOS】


Xcodeでビルドした時、こんなエラーが出たら…
`While reading /xxxxxx/xxxxxxxx/xxxxxx/xxxxx.png pngcrush caught libpng error`


まずは、プロジェクトに同名のpngファイルが存在していないか？を確認。
存在していなければ、とりあえず、`Build Settings`の以下の2つを`NO`にしてみる。

 `Compress PNG files` -> `NO`
 `Remove Text Metadata From PNG files` -> `NO`


そしたら念のため、ビルド前に`Clean Build for...` をしておく。

ちなみに `Clean Build for...`は、Xcodeメニュー：Productを *optionを押しながら* 開くと見つけることできます。
サブドメインを指定して、featureスペックを実行する

あまり必要になることはないと思いますが、特定のサブドメインで動作するようなコードを書いている場合、feature スペックの対象サブドメインを指定したくなることがあります。
備忘録がてらまとめます。

やり方は割と簡単。

```ruby:specs/features/users_spec.rb
require "rails_helper"

feature "Users", type: :feature, js: true do
  background(:all) do
    Capybara.default_host = 'http://subdomain.lvh.me'
    Capybara.app_host = 'http://subdomain.lvh.me'
    Capybara.always_include_port = true
  end

  after(:all) do
    Capybara.default_host = 'http://www.example.com'
    Capybara.app_host = nil
    Capybara.always_include_port = false
  end
   :
```

これは `subdomain.` というサブドメインに対して feature スペックを実行したい場合。
`background` というのは `before` のエイリアスです。
`after` でデフォルトの状態に戻しているのは、こうしないと他のテストが落ちる場合があるからです。

`lvh.me` とはなんぞや？という感じですが、平たく言えば `localhost` と同じで、 127.0.0.1 に割り当てられています。

```bash
$ nslookup lvh.me
Server:		192.168.100.254
Address:	192.168.100.254#53

Non-authoritative answer:
Name:	lvh.me
Address: 127.0.0.1
```

`localhost` のままだとサブドメインつけられないし、`hosts` を変更するわけにもいかないし、となるこんな状況にまさに打ってつけですね。

プロジェクトによっては除外URLの指定が必要です。

```ruby:specs/rails_helper.rb
RSpec.configure do |config|
  Capybara::Webkit.configure do |c|
    c.block_unknown_urls
    c.allow_url("admin.lvh.me")
  end
  Capybara.default_selector  = :css
      :
```


こちらのサイトを参考にしました。
[Acceptance Tests with Subdomains](https://robots.thoughtbot.com/acceptance-tests-with-subdomains)
atomのおすすめパッケージ一覧

* file-icons
    * ファイルの横にアイコンを出してくれる。
* minimap
    * minimapを右上に出してくれる。
* autoclose-html
    * 閉じタグを自動で入れてくれる。
* remote-ftp
    * ftp接続できる
* autocomplete-paths
    * オートコンプリートにプロジェクト内のファイルパスを追加してくれるパッケージ。
* autocomplete-plus
    * 入力補完の決定版
Rails初心者はscaffoldとresourcesを使うな 

# はじめに  
この記事はRuby on RailsやWebフレームワークの勉強を始めた人を対象にしており 
別にRailsやscaffoldとresourcesをディスる目的じゃなく 
自分がRailsをはじめて触ったときに躓いた経験を元にした内容
# まずscaffoldとresourcesとは  

## scaffold  
Railsに用意されているジェネレータの1つで「足場」を意味する 
最低限のCRUDを自動で生成してくれる便利な機能 
コマンド1つで、コントローラー、モデル、ビュー、ルーティングを全て用意してくれる 
コマンドとしては

```
$ rails g scaffold モデル名 カラム名:型
```  

出来るビューはこんな感じ  
/モデル名s/index
<img width="1280" alt="スクリーンショット 2017-08-03 17.51.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/98200/a545226c-9367-0989-a1e6-d17eb56fdfa9.png">


/モデル名s/new  
<img width="1280" alt="スクリーンショット 2017-08-03 17.58.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/98200/5d10c5f4-06f9-4de3-7be7-b52b35ed216a.png">

## resources  
/config/routes.rbに記述するルーティングでresourceを用いると
こちらも自動でCRUDを用意してくれる
記述の仕方としては

```
resources :リソース名
```

1つのresourcesで以下のルーティングを全て用意してくれる
<img width="388" alt="スクリーンショット 2017-08-03 18.07.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/98200/efbc6ba8-ea21-4399-ff6a-6823ec525496.png">

正直開発をする時に使うとめっちゃ便利だったりする
だが、しかし
便利すぎるがゆえにMVCやHTTPメソッドをまだ理解してない初心者が
いきなりこの２つを使おうとするとフレームワーク内での動きを把握できず躓いてしまうとこが多々あるっぽい(経験談)  

# 躓くところ  
##  scaffold 
まずは、scaffoldを使って躓くところ
上記したとおりMVC、ルーティングの全てをコマンド１つで用意してくれる
実際に

```
$ rails g scaffold myapp name:string age:integer
```

を実行すると
app/controllers/myapps_controller.rb
app/models/myapp.rb
app/views/
|- _form.html.erb
|- _myapp.json.jbuilder
|- edit.html.erb
|- index.html.erb
|- index.json.jbuilder
|- new.html.erb
|- show.html.erb
|- show.json.jbuilder
が生成される。
でもこれが以外と初見殺し
本人が意識していないところで自動生成されてしまうため
MVCをまだ理解していない人だと
「モデル？なにそれ？コントローラー？そんなもの作った覚えないよ？？そもそも何なのそれ？？」
と言う事態に陥ってしまい理解できずに苦しむ事になったりする。

## resources
resourcesもscaffoldと同じで最低限のCRUDへのパスを自動で通してくれる
すなわち、フレームワーク初心者でHTTPメソッドをまだ理解していない人が触ると
「POST???ああ、手紙入れるやつね。GET??ポケモン？？」
や
「アクション？なにそれ美味しいの？」
なんてことになるのは必然である

# 解決策？  
この問題への解決策としては
__理解できるまでは面倒くさくても1つ1つ手動で作る__
だと思う。
モデルやコントローラーの作成も1つ１つコマンドで

```console
$ rails g model モデル名 カラム名:型
$ rails g controller コントローラー名
```

の様に作っていく
ルーティングも

```
get 'ルーティング/パス' => 'コントローラー#アクション'
post 'ルーティング/パス' => 'コントローラー#アクション'
```

の様に手書きで作っていくのがいいと思う。
# 最後に  
自分が初めてRailsを触ったときのことを思い出しながら書きました
もしこれからRailsを使ってみようという方、
他の人にRailsの使い方を教えようとしてる方の助けになれば幸いです。

ではよきRailsライフを
`id`だけほしいのに`Entity`が必要な場合は、`EntityManager#getPartialReference`を使う


## はじめに
`$userId`から、`Entity\User`がほしいケース。
副作用がないように、`setId`は実装されていないから、`UserRepository#find`などで`Entity\User`全体を読み込みます。
ただ、必要なのは`userId`であって他のプロパティは不要という場合は、何だか処理が無駄になっている気がしてきます。

## `EntityManager#getPartialReference`
そんなときは、`EntityManager#getPartialReference`を使います。

```php
// vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php

    public function getPartialReference($entityName, $identifier)
    {
        $class = $this->metadataFactory->getMetadataFor(ltrim($entityName, '\\'));

        // Check identity map first, if its already in there just return it.
        if (($entity = $this->unitOfWork->tryGetById($identifier, $class->rootEntityName)) !== false) {
            return ($entity instanceof $class->name) ? $entity : null;
        }

        if ( ! is_array($identifier)) {
            $identifier = array($class->identifier[0] => $identifier);
        }

        $entity = $class->newInstance();

        $class->setIdentifierValues($entity, $identifier);

        $this->unitOfWork->registerManaged($entity, $identifier, array());
        $this->unitOfWork->markReadOnly($entity);

        return $entity;
    }
```

`$class->setIdentifierValues`からは、下記のコードが呼び出されます。
さらに、深く追っていけば、分かりますが、アクセスできない`$id`プロパティに`Reflection`で値をセットします。

```php
// vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php

    public function setIdentifierValues($entity, array $id)
    {
        foreach ($id as $idField => $idValue) {
            $this->reflFields[$idField]->setValue($entity, $idValue);
        }
    }
```

## おわりに
`EntityManager#getPartialReference`は、それなりに使いどころありそうです。 
まずは、テストコードなどから、少しずつ使い始めて実績積んでいきたいですね。 
ではでは。

## 参考URL
- [symfony - Symfony2: establish a model relationship by id - Stack Overflow](https://stackoverflow.com/questions/16979676/symfony2-establish-a-model-relationship-by-id)
- [php - Doctrine entity remove vs delete query, performance comparison - Stack Overflow](https://stackoverflow.com/questions/11486662/doctrine-entity-remove-vs-delete-query-performance-comparison)
- [18. Partial Objects — Doctrine 2 ORM 2 documentation](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/partial-objects.html)
組合せ最適化 - 典型問題 - 組合せオークション問題

[典型問題と実行方法](0f6c1a4415d196e64314)

##組合せオークション問題

$n$個の候補(集合$M=\\{1,\dots,m\\}$の部分集合$S_j(\subseteq M), j \in N=\\{1,\dots,n\\}$)に対して金額$c_j$が与えられているとする。金額の総和が最大となるように候補から選択せよ。
集合$M$の要素を重複して選んではいけない
[集合被覆問題](http://qiita.com/SaitoTsutomu/items/b1f3a24aaf50afd93e09)で目的関数が最大化で、制約条件の不等号が逆になったものと考えることもできる。

##実行方法

```text:usage
Signature: combinatorial_auction(n, cand, limit=-1)
Docstring:
組合せオークション問題
    要素を重複売却せず、購入者ごとの候補数上限を超えないように売却金額を最大化
入力
    n: 要素数
    cand: (金額, 部分集合, 購入者ID)の候補リスト。購入者IDはなくてもよい
    limit: 購入者ごとの候補数上限。-1なら無制限。購入者IDをキーにした辞書可
出力
    選択された候補リストの番号リスト
```

```python:python
# サンプル
from ortoolpy import combinatorial_auction
cand = [
    ( 15, (0,2), 0),
    ( 10, (0,), 1),
    (  8, (1,), 1),
    ( 14, (1,2), 2),
]
combinatorial_auction(3, cand)
```

```text:結果
[1, 3]
```

```python:python
# pandas.DataFrame
from ortoolpy.optimization import CombinatorialAuction
CombinatorialAuction('data/auction.csv')
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>id</th>
      <th>price</th>
      <th>element</th>
      <th>buyer</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>2</th>
      <td>1</td>
      <td>10.0</td>
      <td>a</td>
      <td>1</td>
    </tr>
    <tr>
      <th>4</th>
      <td>3</td>
      <td>14.0</td>
      <td>b</td>
      <td>1</td>
    </tr>
    <tr>
      <th>5</th>
      <td>3</td>
      <td>NaN</td>
      <td>c</td>
      <td>1</td>
    </tr>
  </tbody>
</table>


```python:python
# pandas.DataFrame
from ortoolpy.optimization import CombinatorialAuction
CombinatorialAuction('data/auction.csv',limit=1)
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>id</th>
      <th>price</th>
      <th>element</th>
      <th>buyer</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>15.0</td>
      <td>a</td>
      <td>0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0</td>
      <td>NaN</td>
      <td>c</td>
      <td>0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>2</td>
      <td>8.0</td>
      <td>b</td>
      <td>2</td>
    </tr>
  </tbody>
</table>

##データ
- [data/auction.csv](https://www.dropbox.com/s/1yb7dmhcyxza553/auction.csv)

# 補足
- 金額に微小な乱数を足すことにより、抽選としても機能する。
Chefでuser作成時gid設定でエラー「Couldn't lookup integer GID for group name xxxx」が起きる

仕事でChefを始めました。
誤りなどあればご指摘いただけるとありがたいです...

## Chef version

### Chef Client
12.19.36

### Chef Server 
12.15.8

## recipe抜粋
```
# for hoge user primary group
group 'fuga' do
	gid '31200'
	action :create
end

# user
user 'hoge' do
	uid '31401'
	gid '31200'
	password nil
	action :create
end
```

##「chef-client」を実行すると...

```
Couldn't lookup integer GID for group name 31200...
```

とエラーが発生する

## 公式のドキュメントで調べてみたが...

[https://docs.chef.io/resource_user.html](https://docs.chef.io/resource_user.html)

グループ名じゃなくてグループIDを設定するのかと思ったんですが....

```
user 'a user' do
  comment 'A random user'
  uid '1234'
  gid '1234'
  home '/home/random'
  shell '/bin/bash'
  password '$1$JJsvHslasdfjVEroftprNn4JHtDi'
end
```
```
gid
    Ruby Types: String, Integer
    The identifier for the group.
```

## gidにグループ名を設定したら正常にchef-clientを実行できた

```
# for hoge user primary group
group 'fuga' do
	gid '31200'
	action :create
end

# user
user 'hoge' do
	uid '31401'
	gid 'fuga' ← グループ名を設定
	password nil
	action :create
end
```
プログラマが覚えておいしいFlexbox その1

社内LT資料です。

# Flexboxとは

* * *

# 柔軟なレイアウトシステム

* * *

# HTMLのレイアウト

* 古くはTable Layout
    * CSSがまともに動いてない時代があった
    * ガラケー
* `position: fixed`
* Float
    * `<br clear="all">`による回り込みの解除
    * clearfix
    * %指定によるFluid / Grid実装
* `display: table-cell`
    * 合法的に使えるTable Layout
* translate

* * *

# まさに群雄割拠

* いろんなやり方があった
* どれも機能的に足りておらず一つだけ覚えてもだめだった
* 無理くりな手法も多く、後ろ髪を引かれる思いで実装してた

* * *

# Flexible Box Layout Module

* * *

# 震えるがいい

* * *

# Flexboxの考え方

* 直接の子要素に影響を及ぼす
    * 親要素に影響を受けるpositonやfloatとは逆

* * *

# レイアウト定義

* 並び
    * 方向
    * 順序
* 位置
    * 縦横方向
    * 均等割り付け
* サイジング
    * 固定
    * フレシキブル

* * *

# サンプル

https://codepen.io/8845musign/pen/awQamg

* * *

# 今日覚えて帰ってもらいたい一つの使い道

* * *

# 中央配置のレイアウト

* * *

`.wrap` 内の `item` を左右及び垂直中央に配置

https://codepen.io/8845musign/pen/RgqZMV

* * *

```html
<div class="wrap">
  <div class="item">item</div>
</div>
```

```css
.wrap {
  display: flex;
  align-items: center;
  justify-content: center;
}

.item {
  width: 200px;
  height: 200px;
}

```

* * *

# 解説

* * *

## flex-direction

レイアウトの方向を決める、デフォルトは `row` （水平方向に左から右）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73240/d3167aec-c74e-3b72-e63a-fbfea88d0214.png)

* * *

## justify-content

`flex-direction`　で決めた軸に、子要素をどう配置するか

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73240/f2fc681c-b624-7ad7-8e46-70d809ac9463.png)

* * *

## align-items

`flex-direction`　と直交する軸に、子要素をどう配置するか

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73240/00758569-8654-58a2-6570-367d1d9f5699.png)

* * *

# つまるところ垂直中央

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73240/4e37fd11-76e9-94cb-7db6-eeb9a05f4c75.png)

* * *

* 親要素がレイアウト情報を持つのでシンプル
    * いままでのレイアウト手法は子要素と親要素のレイアウト情報が密接に絡まり合って決定されていた
* ようやく使えるようになったお手軽垂直中央
    * `table-cell` からの解放
* さらに複雑なレイアウト組を可能にする豊富なオプション
    * 学習コストをあげている原因でもある

* * *

## このレイアウトを他の手法でやると？

参考記事:

[たった4行！ CSS3 Flexboxを使った史上最短の上下中央揃え2016年版](http://qiita.com/tonkotsuboy_com/items/a5aaa4a69fecfaf546a3)

いろいろあるけど頭いたくなるょ。

* * *

## SLDSのGrid

* `.slds-grid` は `display: flex` を宣言してる
* `.slds-grid_align-center` は `justrify-content: center`
* 逆に言うと、上記のプロパティのような本当に簡単なレイアウト組は普通にCSS書いとこ？という気持ち

ひっじょーにシンプルな作り　　
https://www.lightningdesignsystem.com/utilities/grid/

* * *

# 使えるブラウザ

* IE11〜
    * ただしprefix必須
    * 古い仕様での実装のため書き方に差異がある
* postcssのAutoprefixer推奨（WSP導入済み）

* * *

# Bug

* そこそこ地雷が埋まってる
* 参考
    * [flexbugs](https://github.com/philipwalton/flexbugs)
    * [flexboxのバグに立ち向かう（flexboxバグまとめ）
](http://qiita.com/hashrock/items/189db03021b0f565ae27) 
* 一部のバグを自動修正するツール
    * [postcss-flexbugs-fixes](https://github.com/philipwalton/flexbugs)

* * *

# マルチブラウザでのチェックは必ずやろう

* * *

# To be continue.
CData API Server で作ったAPI からSwagger ドキュメントを生成する

今回は、CData API Server を使ってDB から5分で作ったAPI に対し、Swagger Editor を使って、Swagger ドキュメントとして生成する方法を紹介します。先に結論を言うと「ツールって楽ですよ」。

##CData API Server でDB からREST API およびドキュメントを生成##
前の記事を参照して下さい。
[http://qiita.com/jonathanh/items/fcd9aca3c1eb52206102](http://qiita.com/jonathanh/items/fcd9aca3c1eb52206102)

##Swagger ドキュメント生成用のJSON の生成##
API Server のドキュメントを開きます。
［/api.rsc/$swagger］をクリックして、GET メソッド［http://localhost:8387/api.rsc/$swagger］をブラウザに入力します。
![as13.png](https://qiita-image-store.s3.amazonaws.com/0/116843/724f9f49-106d-7007-3461-3ebea57c0324.png)

返ってきたJSON をそのままコピーします。

##Swagger Editor でSwagger ドキュメントを生成##
[http://editor.swagger.io/](http://editor.swagger.io/) でSwagger Editor を開きます。
左側に今コピーしたJSON をそのまま貼り付けます。
それだけでSwagger ドキュメントが右側に自動生成されます。
![as17.png](https://qiita-image-store.s3.amazonaws.com/0/116843/ff6092ad-49ea-3a62-7c37-97431723f6d4.png)

生成したSwagger エンドポイントで、Microsoft Azure Logic Apps などのSwagger エンドポイントに対応したサービスで、CData API Server のAPI を使用することができます。
DB からREST API を作るのに5分、Swagger エンドポイント化するのに1分くらいです。標準っていいですね。
iTerm2でsshの時に背景色を変える方法

ターミナルで複数タブを開いていると、ローカルなのかサーバーの中なのか、はたまた本番環境なのか開発環境なのかわからなくなることが多々あります。
今どこで作業しているのかをわかりやすくしたいなと思って調べていたところ、sshの時に背景色を変える方法を見つけたので利用してみることにしました。

## 環境
- macOS Sierra 10.12.3
- iTerm2 Build 3.1.beta.5
- zsh 5.2 (x86_64-apple-darwin16.0)

## 見た目イメージ
こんな感じになります。
色が多いせいでカーソルがどこにあるのかわかりにくくなるという副作用はありますが、どこで作業しているのかはわかりやすくなったと思います。

- ローカル 黒
- vps 赤
- 研究室鯖 青

<img width="1440" alt="スクリーンショット 2017-08-03 17.50.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/42932/6dc52507-6e33-3a24-7d0d-219def4be8b5.png">



## コード
以下のコードを適当な場所に配置し、権限を与えた上で、```alias ssh=/some/bin/ssh-background```のようにaliasを設定することでssh時に色をつけることができます。

```
#!/bin/bash
# Installation:
# 1. Save this script to /some/bin/ssh-background
# 2. chmod 755 /some/bin/ssh-background
# 3. alias ssh=/some/bin/ssh-background
# 4. Configure your host colors below.
# from https://gist.github.com/BugRoger/789887

set_color() {
  local HEX_FG=$1
  local HEX_BG=$2
  local OPACITY=$3

  local FG_R=`echo $HEX_FG | sed 's/../0x&,/g' | awk -F "," '{printf("%d",$1 * 257)}'`
  local FG_G=`echo $HEX_FG | sed 's/../0x&,/g' | awk -F "," '{printf("%d",$2 * 257)}'`
  local FG_B=`echo $HEX_FG | sed 's/../0x&,/g' | awk -F "," '{printf("%d",$3 * 257)}'`
  local BG_R=`echo $HEX_BG | sed 's/../0x&,/g' | awk -F "," '{printf("%d",$1 * 257)}'`
  local BG_G=`echo $HEX_BG | sed 's/../0x&,/g' | awk -F "," '{printf("%d",$2 * 257)}'`
  local BG_B=`echo $HEX_BG | sed 's/../0x&,/g' | awk -F "," '{printf("%d",$3 * 257)}'`

  /usr/bin/osascript <<EOF
tell application "iTerm"
   tell current session of first window
      set foreground color to {$FG_R, $FG_G, $FG_B}
      set background color to {$BG_R, $BG_G, $BG_B} 
      set transparency to "$OPACITY" 
   end tell
end tell
EOF
}

# ホストごとに色を決める
if [[ "$@" =~ host0.example.com ]]; then
   set_color ffffff 330000 0.2 
elif [[ "$@" =~ host1.example.com ]]; then
   set_color ffffff 000033 0.2
fi

ssh $@

set_color ffffff 000000 0.2
```

## さいごに
ホストごとに色を決めるところはssh/configを見て生成できるようになればなーとか思ったので今後やってみようかなと思ってます。
色がついたのはいいですがカーソルの位置がわかりづらくなったりしたのでもう少し調整必要だなーとは思いました。

## 参考HP
- http://madroom-project.blogspot.jp/2014/05/iterm.html
- https://gist.github.com/BugRoger/789887
MacでC#コンソールアプリ作成

# 前置き

WindowsじゃないとC#開発が十全にできないなぁと思っていたけれど、
Macでも `dotnet` コマンドを使えばいい感じに開発できそうだったので手順メモ。

# 基本手順

dotnet commandのインストール

- https://www.microsoft.com/net/core?WT.mc_id=Blog_CENews_Announce_CEA#macos

プロジェクトのフォルダ作成。

```
$ mkdir ConsoleSample
$ cd ConsoleSample
```

Solutionを作成。

Solutionは、iOSのworkspace, androidのrootprojectに対応するプロジェクトをまとめるプロジェクト。

```
$ dotnet new sln
```

プロジェクト本体を作成。

```
$ mkdir App
$ cd App
$ dotnet new console
$ cd ..
```

ここまででこんな構成になっているはず。

```
$ tree
.
├── App
│   ├── App.csproj
│   └── Program.cs
└── ConsoleSample.sln
```

dotnet newは色々なテンプレートがあるのだけど、ここではソリューションとコンソールアプリのテンプレを利用した。

consoleテンプレによって下記のようなProgramファイルが作成されているはず。

```csharp:App/Program.cs
using System;

namespace App
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}
```

SolutionにAppプロジェクトを依存追加する。

```
$ dotnet sln ConsoleSample.sln add App/App.csproj
```

restore & buildする

```
$ dotnet restore
$ dotnet build
```

実行

```
$ dotnet run --project App/App.csproj
Hello World!
```

# ライブラリ追加

Json.NETを追加してみる.

```
$ dotnet add App/App.csproj package Newtonsoft.Json
```

```csharp:App/Program.cs
using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace App
{
    class Program
    {
        static void Main(string[] args)
        {
            var dictionary = new Dictionary<string, string>() {{"message", "Hello World!"}};
            var serialized = JsonConvert.SerializeObject(dictionary);
            Console.WriteLine(serialized);
        }
    }
}
```

実行

```
$ dotnet run --project App/App.csproj
{"message":"Hello World!"}
```

今までMacのC#開発はだいぶつらみがあったけど、dotnetコマンド登場のおかげで楽に開発できそうです。 :smile:

# その他

作成したサンプル

- https://github.com/mattak/ConsoleSample
Dockerfile tomcat/java のWEBサービス

tomcat / java で動くWEBアプリケーション用コンテナの為のDockerfileメモ。

```:Dockerfile
FROM tomcat:6-jre8

# もろもろのアプリ用設定を載せたserver.xmlを配置
# COPYの際、FROM側のパスが絶対パスだとエラーになるので注意。
COPY ./serverconf/server.xml /usr/local/tomcat/conf/server.xml

# アプリ配置ディレクトリを掘り、
RUN mkdir /home/webapps
# リソース配置
COPY ./hogehoge /home/webapps/hogehoge

# EXPOSE 8080
```

```
docker build -t myapps/hogehoge:latest .
docker run -d -p 8080:8080 myapps/hogehoge:latest
```

```shell-session
curl http://localhost:8080/
```
Reactでループする


Code : https://codepen.io/mo4_9/pen/EvgbZM

## 事前に配列を生成する

```javascript
class LoopComponent01 extends React.Component {
  render() {
    const items = [];
    for (let i = 0; i < 10; i++) {
      items.push(
        <div class="item">item--{i}</div>
      )
    }
    return (
      <div id="list">
        {items}
      </div>
    )
  }
}
```

## mapを使用する

```javascript
class LoopComponent02 extends React.Component {
  render() {
    const items = ['Sun', 'Mon', 'Tue', 'Wed'];

    return (
      <ul>
        { items.map(d => {
          return <li>{d}</li>
        }) }
      </ul>
    );
  }
}
```

## map,keyを使用する

keyは差分計算を効率化するため（keyの重複には注意）

```javascript
class LoopComponent03 extends React.Component {
  render() {
    const items = ['Sun', 'Mon', 'Tue', 'Wed'];

    return (
      <ul>
        { items.map((d, idx) => {
          return <li key={idx}>{idx} : {d}</li>
        }) }
      </ul>
    );
  }
}
```
Kubernetesでクラスタ環境構築手順(2) - nodeの作成

## 概要
Kubernetesのnodeの構築手順です。
手順で特に指定がないものは、全てnodeサーバーで実行してください。

こちらの記事の続きです。
[Kubernetesでクラスタ環境構築手順(1) - masterの作成](http://qiita.com/Esfahan/items/db7a79816731e6aa5cf5)


## 目次
- [Kubernetesハンズオン目次](https://qiita.com/Esfahan/items/4fcf51622fed20dffb88)

 
## node環境
- CentOS7.1
- Kubernetes v1.5.2
- flanneld 0.7.1
- Docker version 1.12.6, build 88a4867/1.12.6


## host名の設定
Kubernetesは、node間通信で、マシンのホスト名を利用できるように、
/etc/hostsにIPアドレスとホスト名を登録します。

```
$ sudo vi /etc/hosts
```

```lang:/etc/hosts
192.168.33.11 node01
```

## インストール
kubernetes, docker, flannelをインストールします。

```
$ sudo yum -y install kubernetes docker flannel
```

## /etc/kubernetes/config
KUBE_MASTERにmasterのIPアドレスを設定します。

```
$ sudo vi /etc/kubernetes/config
```

```lang:/etc/kubernetes/config
KUBE_MASTER="--master=http://192.168.33.10:8080"
```

## Kubeletの設定
`KUBELET_ADDRESS` にはnodeのIPアドレス、
`KUBELET_HOSTNAME` には、nodeの `/etc/hosts` に設定したホスト名を、
`KUBELET_API_SERVER` にはAPIサーバーのIPアドレス（今回はmasterと同居しているのでmasterのIPアドレス）
をそれぞれ設定してください。

```
$ sudo vi /etc/kubernetes/kubelet
```

```lang:/etc/kubernetes/kubelet
# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=192.168.33.11"

# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=node01"

# location of the api-server
KUBELET_API_SERVER="--api-servers=http://192.168.33.10:8080"
```

## flannelの設定
MasterとNodeの通信をするために、flannelの設定をします。
etcdをインストールしたサーバーのIPアドレスを指定します。今回の場合はmasterのIPアドレスになります。

```
$ sudo vi /etc/sysconfig/flanneld
```

```lang:/etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://192.168.33.10:2379"
```

## 色々起動
設定を反映するために、色々起動します。

```
$ sudo systemctl start kubelet
$ sudo systemctl start flanneld
$ sudo systemctl start docker
$ sudo systemctl start kube-scheduler
$ sudo systemctl start kube-proxy
```

自動起動設定

```
$ sudo systemctl enable kubelet
$ sudo systemctl enable flanneld
$ sudo systemctl enable kube-scheduler
$ sudo systemctl enable kube-proxy
```

## masterがnodeを認識している確認
こちらはmasterサーバーで実行してください。
node01が認識されていることを確認できればOKです。

```
$ kubectl get nodes
NAME      STATUS    AGE
master    Ready     1h
node01    Ready     5m
```

nodeを複数作成する場合は、以上の手順をnodeの数だけ繰り返してください。

## 参考
- [kubernetesによるDockerコンテナ管理入門](http://knowledge.sakura.ad.jp/tech/3681/)
- [Docker（コンテナ型仮想化）と Kubernetes についての簡単な紹介](https://ubiteku.oinker.me/2017/02/21/docker-and-kubernetes-intro/)
- [Kubernetesクラスタ環境を構築してDashboardで見える化を試してみた](http://acro-engineer.hatenablog.com/entry/2016/10/04/120000)
- [docker-composeしか知らない私がKubernetesを触ってみたメモ](https://devalon.biz/docker-composesikazhi-ranairen-gakuberneteswohong-tutemitamemo/)
- [VagrantでKubernetesクラスタを立てる](http://qiita.com/awakia/items/fa054fd2a7c6329adac7)
- [Kubernetes Installation with Vagrant & CoreOS](https://coreos.com/kubernetes/docs/latest/kubernetes-on-vagrant.html)
- [［入門編］etcdでクラスタを構築する](http://qiita.com/coreos/items/2e4ca397031d368832c4)
awsrmを使ってALB配下のEC2インスタンスIDを取得する

ALBになってから `ALB -> ( Listener ) -> Target group -> EC2インスタンス` というつながりになりました。

「ALB配下のEC2インスタンスについてテストをしたい」というときに少し遠いです。

こういうときに [awsrm](https://github.com/k1LoW/awsrm) を使うと直感的にEC2のインスタンスIDを取得できます。


```ruby
require 'awsrm'

instance_ids = Awsrm::AlbTargetGroup.all(alb: 'my-alb-load-balancer-name').map do |target|
  target.instance_ids
end.flatten
```

これで、ALB配下の複数のTarget groupの下に紐付いているEC2インスタンスのIDを取得できます。

「ALBはTagで管理している」というときにも、

```ruby
require 'awsrm'

alb_id = Awsrm::Alb.one(tags: {Role: 'web'}).id
instance_ids = Awsrm::AlbTargetGroup.all(alb: alb_id).map do |target|
  target.instance_ids
end.flatten
```

「複数のALB（VPC内のALB全て、など）」というときにも、

```ruby
require 'awsrm'

instance_ids = Awsrm::Alb.all(vpc: 'my-vpc').map do |alb|
  Awsrm::AlbTargetGroup.all(alb: alb.id).map do |target|
    target.instance_ids
  end.flatten
end.flatten
```

と、直感的に記述できます。

インスタンスIDが取得できれば、awspecで「ALB配下のEC2インスタンスにスケジュールイベントがないこと」というテストを書くのも簡単です。

```ruby
require 'awspec'
require 'awsrm'

instance_ids = Awsrm::AlbTargetGroup.all(alb: 'my-alb-load-balancer-name').map do |target|
  target.instance_ids
end.flatten

instance_ids.each do |id|
  describe ec2(id) do
    it { should be_running }
    it { should_not have_events }
  end
end
```

awsrmはawspecとは独立していますので、テスト以外にも様々な用途で活用できると思います。

もし、awsrmに実装して欲しいリソースがありましたら、PR/Issueや[Twitterでのメンション](https://twitter.com/k1LoW)などよろしくお願いします。
kintoneプラグイン『機能拡張スタンダード All-In』を使ってレコード一括更新を行う

kintoneプラグイン[『機能拡張スタンダード All-In』](https://spica.tokyo/bluelaunch)の<strong>レコード一括更新機能</strong>についての説明です。

#使いかた

##更新開始ボタン
一覧ページに一括更新を開始するボタンを設置して使用します。
![bl_ss_1.6.0_17081701.png](https://qiita-image-store.s3.amazonaws.com/0/67365/62cd6511-a6dd-738a-ba5f-57e01cdf64bc.png)

ボタンの設置はプラグイン設定「一覧管理」で設定します。
![bl_ss_gen_005_01.png](https://qiita-image-store.s3.amazonaws.com/0/67365/5d2eb847-2684-dec0-0234-397aa5e89cc8.png)


##ボタンを設置するユーザーの制限

プラグインをインストールした初期状態では、一括更新ボタンは表示されません。<strong>全てのユーザーに表示する</strong>か、<strong>アカウントを指定して表示する</strong>かを設定します。
![bl_ss_1.6.0_17081702.png](https://qiita-image-store.s3.amazonaws.com/0/67365/a74dbdc4-369f-5442-ebbf-f72b97d1e542.png)


#一括更新の概要

更新対象レコードに一括で代入したい入力値を設定して、一括更新を行います。
更新対象は一覧ページで絞込条件にマッチするレコードです。
「一括更新」ボタンを押すと、ダイアログが表示されウィザード形式で更新内容の設定と実行を進めます。

#一括更新の手順

##1. 更新方法の選択

「直接入力する」を選択します。
![bl_ss_1.6.0_17081703a.png](https://qiita-image-store.s3.amazonaws.com/0/67365/d42786f6-ed10-8802-01c3-97e1cd6946ed.png)

##2. 更新内容の設定

複数のフィールドを同時に更新したい場合は、＋ボタンをクリックして行を増やします。

更新対象のフィールドを選択し、値を選択または入力します。
<font color="MediumBlue">文字列、数値、日時、日付、時刻、ルックアップ</font>、などのフィールドはテキストボックスに入力値を記入します。

<font color="MediumBlue">組織選択、ユーザー選択、グループ選択、複数選択、チェックボックス、ラジオボタン、ドロップダウン</font>、は入力値をチェックして選択します。
![bl_1.5_ss_04.png](https://qiita-image-store.s3.amazonaws.com/0/67365/46e25749-3916-f489-776a-f049dd5ff129.png)

##3. 更新内容の確認

入力内容を確認します。
![bl_1.5_ss_05.png](https://qiita-image-store.s3.amazonaws.com/0/67365/cfcd1568-cc14-9cd4-a610-42edbdee04fb.png)

直接入力された値については、フィールドに入力できる形式になっているかある程度自動的にチェックされます。
リンクフィールドの入力形式については自動チェックの適用外です。
![bl_1.5_ss_08.png](https://qiita-image-store.s3.amazonaws.com/0/67365/8b754f13-06d0-757f-7751-84de2a7d0f0d.png)

また、必須項目への空白入力、書き込みアクセス権、その他のイレギュラーがあり全てのエラーを未然に防ぐものではありません。

<font color="Crimson">一括更新を実行する前にCSVファイル等にバックアップをとることをおすすめします</font>

##4. 更新の実行

絞込条件にマッチしているレコードを対象に更新が開始され、進捗が表示されます。
APIコールは、レコード100件につき2回行われます。
![bl_1.5_ss_06.png](https://qiita-image-store.s3.amazonaws.com/0/67365/d52b9547-c300-7dd6-6b5b-1dd5bef84030.png)
##5. 実行結果の表示

正常に更新できると実行終了となります。
![bl_1.5_ss_07.png](https://qiita-image-store.s3.amazonaws.com/0/67365/14154c40-3bb3-a496-8938-3714c7e4623c.png)

エラーがあった場合はエラー内容が表示されます。
![bl_ss_1.6.0_17081706.png](https://qiita-image-store.s3.amazonaws.com/0/67365/78bcb3f7-8b56-c9d5-5594-47bacd443c36.png)

---
#このプラグインについて
・自動計算・自動採番 - [kintoneプラグイン『機能拡張スタンダード All-In』を使って自動採番を行う](http://qiita.com/spica/items/803af7cd540ae0b8f718)
・条件書式 - [kintoneプラグイン『機能拡張スタンダード All-In』を使って条件書式を設定。CSSも使ってみる](http://qiita.com/spica/items/24027003e9dfb9363819)
・フィールド属性 - [kintoneプラグイン『機能拡張スタンダード All-In』を使ってルックアップ編集や再利用指定などなど条件毎に設定する](http://qiita.com/spica/items/73107bda2cff4a94cf41)
・選択数制御 - [kintoneプラグイン『機能拡張スタンダード All-In』を使ってユーザー選択、複数選択などの選択数を制御する](http://qiita.com/spica/items/1c3ba3927b844b6bb72b)
四の五の言わずにRequestの中身が見たい

System.out.println("Protocol: " + request.getProtocol());
System.out.println("Scheme: " + request.getScheme());
System.out.println("Server Name: " + request.getServerName() );
System.out.println("Server Port: " + request.getServerPort());
System.out.println("Protocol: " + request.getProtocol());
System.out.println("Remote Addr: " + request.getRemoteAddr());
System.out.println("Remote Host: " + request.getRemoteHost());
System.out.println("Character Encoding: " + request.getCharacterEncoding());
System.out.println("Content Length: " + request.getContentLength());
System.out.println("Content Type: "+ request.getContentType());
System.out.println("Auth Type: " + request.getAuthType());
System.out.println("HTTP Method: " + request.getMethod());
System.out.println("Path Info: " + request.getPathInfo());
System.out.println("Path Trans: " + request.getPathTranslated());
System.out.println("Query String: " + request.getQueryString());
System.out.println("Remote User: " + request.getRemoteUser());
System.out.println("Session Id: " + request.getRequestedSessionId());
System.out.println("Request URI: " + request.getRequestURI());
System.out.println("Servlet Path: " + request.getServletPath());
System.out.println("Accept: " + request.getHeader("Accept"));
System.out.println("Host: " + request.getHeader("Host"));
System.out.println("Referer : " + request.getHeader("Referer"));
System.out.println("Accept-Language : " + request.getHeader("Accept-Language"));
System.out.println("Accept-Encoding : " + request.getHeader("Accept-Encoding"));
System.out.println("User-Agent : " + request.getHeader("User-Agent"));
System.out.println("Connection : " + request.getHeader("Connection"));
System.out.println("Cookie : " + request.getHeader("Cookie"));
PHPで文字コード「ISO-2022-JP」の機種依存文字を含めたメールを送信する

PHPファイルはUTF-8だけれどもメールはISO-2022-JPで送ろうと思ったら文字化け問題で少しハマったので備忘録がてらに公開

------

今回ハマった原因というのは`mb_encode_mimeheader`関数。

マニュアルにもあるように`mb_encode_mimeheader`関数を使うときの第一関数は…、

>エンコードする文字列。 `mb_internal_encoding()` と同じエンコーディングにしなければいけません。
>http://php.net/manual/ja/function.mb-encode-mimeheader.php

ということなので一度`mb_internal_encoding`関数でファイル内の設定をUTF-8からISO-2022-JPに一時的に変換する必要がある。


この仕様を知らずに文字化け現象にハマってしまった:head_bandage:



# サンプルコード


```php:SendMail.php(UTF-8)
<?php
/*
 * このコードの文字コード・言語の設定を取得
 */
$original_encoding = mb_internal_encoding();
$original_language = mb_language();


/*
 * メール送信処理開始
 */
mb_language( 'Japanese' );
mb_internal_encoding("ISO-2022-JP-MS"); // ここからISO-2022-JP-MS

$to       = mb_encode_mimeheader(mb_convert_encoding("㈱イーグルジャンプ","ISO-2022-JP-MS",$original_encoding), 'ISO-2022-JP-MS')." <to@example.com>";
$subject  = mb_encode_mimeheader(mb_convert_encoding("進捗どうですか♪","ISO-2022-JP-MS",$original_encoding), 'ISO-2022-JP-MS');

$body     = mb_convert_encoding("進捗だめです（ ＾ω＾）", 'ISO-2022-JP-MS',$original_encoding);

$headers  = "From: ".mb_encode_mimeheader(mb_convert_encoding("おじさん","ISO-2022-JP-MS"))." <from@example.com> \n";
$headers .= "Content-Type: text/plain; charset=ISO-2022-JP\n";

$params   = "-f return@example.com";


if(mail($to, $subject,$body, $headers,$params)){
    echo "Success!";
}else{

    echo "Fail!";
}

/*
 * 文字コード・言語設定を元に戻す
 */
mb_internal_encoding( $original_encoding );
mb_language( $original_language );

```

最後に文字コード・言語設定を元に戻すのを忘れないようにしましょ〜〜:rolling_eyes::rolling_eyes:


あとメールクライアントがブラウザでGmailだったりThunderbirdあたりだったら、文字コードの設定が甘くても自動的に変換してくれるのだが、少し古めのメールクライアントだったりすると文字化けすることが多いのでご注意
レーダーチャートを試してみる (2)

[レーダーチャート (2) | Chart.js](http://labo.project-nya.jp/chartjs/ver2/)

- ポイント表示ではなく、パーセント表示にしたい

```js
var options = {
	scale: {
		ticks: {min: 0, max: 1, stepSize: 0.2, display: false}
	}
};
```

- データの値を小数値で設定したい

```js
var data = {
	labels: ["A1", "A2", "A3", "A4", "A5"], 
	datasets: [{
		data: [0.9, 0.5, 0, 0.25, 0.7]
	}]
};

var data = {
	labels: ["B1", "B2", "B3", "B4", "B5"], 
	datasets: [{
		data: [1, 0.7, 0.25, 0.5, 0.9]
	}]
};
```
NSTextAlignment.rightなUITextFieldのスペースが表示されない

## 何が起きたか
UITextField に AlignmentRight 属性を指定した場合、テキストの末尾にスペースを入力しても入力されていないように見える。
データ上はスペースが入力されているので、続けてなにか文字を入力すると、スペースと一緒に表示される。


![ng_version.gif](https://qiita-image-store.s3.amazonaws.com/0/77522/92b74055-3d4b-391d-210b-93766c0d5a55.gif)


stackoverflow の質問もあって、どうやら iOS 7 からの現象ぽい
https://stackoverflow.com/questions/19569688/right-aligned-uitextfield-spacebar-does-not-advance-cursor-in-ios-7

## どうしたか

UITextField を編集したときに呼ばれる  `textField(_:shouldChangeCharactersIn:replacementString:)` に修正を加える
もしスペースが入力されたら、 [non-breaking space](https://en.wikipedia.org/wiki/Non-breaking_space) に置き換えて表示してやる

```ViewController.swift
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let text = textField.text!
        
        if range.location == text.characters.count && string == " " {
            textField.text = text + "\u{00a0}"
            return false
        }
        
        return true
    }
```

```ViewController.m
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if (range.location == textField.text.length && [string isEqualToString:@" "]) {
        textField.text = [textField.text stringByAppendingString:@"\u00a0"];
        return NO;
    }

    return YES;
}
```

![ok_version.gif](https://qiita-image-store.s3.amazonaws.com/0/77522/48453292-bf9e-6290-03ae-6f42f19b0932.gif)


これでよさそう
サンプルコードはこちらhttps://gist.github.com/tdrk18/bdbaabd4ba898dcbdb0d8e5c62fbabad

## 🐢
`NSTextAlignment.left` とかにすればいいんですけど、 いろいろと制約があって `NSTextAlignment.right` のままで回避したい場合に。
Python Django チュートリアル チートシート


勉強会用の資料です．
印刷して手元に置いて見るためのペラ紙です．
良い置き場所がなかったのでgithubのリポジトリに入れてます．
落書き状態なので時間とやる気があれば清書します．


# 全体像

https://github.com/usa-mimi/tutorial/raw/390b95915029536c26d42fd3734ed784d11f8795/doc/abstract.pdf

> ![Kobito.hvZhxF.png](https://qiita-image-store.s3.amazonaws.com/0/58048/c4e45740-f929-65f4-6af4-cd1498285679.png "Kobito.hvZhxF.png")


djangoのファイル構成と各ファイルの役割を示した図です．
黄色で印付けてるファイルは `startproject` `startapp` コマンドで自動で作成されるファイルです．




# コマンド

https://github.com/usa-mimi/tutorial/raw/390b95915029536c26d42fd3734ed784d11f8795/doc/command.pdf

> ![Kobito.8JuCl0.png](https://qiita-image-store.s3.amazonaws.com/0/58048/eb947340-ecc3-cac3-6d9c-528bc7b9d7d0.png "Kobito.8JuCl0.png")

manage.pyで使用する主要なコマンドです．
おまけでshellで使用するディレクトリ移動と表示のコマンドもつけてます．

# urls.py

https://github.com/usa-mimi/tutorial/raw/master/doc/url.pdf

> ![Kobito.DyjsWv.png](https://qiita-image-store.s3.amazonaws.com/0/58048/8374d0ae-9e87-5f9d-c7a8-81d1a0519b91.png "Kobito.DyjsWv.png")

urlとviewの紐付け用設定ファイル．
正規表現の知識が必要．

# views.py

https://github.com/usa-mimi/tutorial/raw/master/doc/view.pdf

> ![Kobito.y6NZdl.png](https://qiita-image-store.s3.amazonaws.com/0/58048/60172e32-f527-3078-6d05-e175f0d1234a.png "Kobito.y6NZdl.png")


# models.py

https://github.com/usa-mimi/tutorial/raw/master/doc/model.pdf

> ![Kobito.wXmZWE.png](https://qiita-image-store.s3.amazonaws.com/0/58048/75540391-6855-03ba-ef13-cd25d9ff8b09.png "Kobito.wXmZWE.png")

DBの設定用ファイル．アプリで一番重要．

# forms.py

https://github.com/usa-mimi/tutorial/raw/master/doc/model_form.pdf

> ![Kobito.zumuhN.png](https://qiita-image-store.s3.amazonaws.com/0/58048/28302d31-5fc4-67d0-0786-25745a649192.png "Kobito.zumuhN.png")

# template/

https://github.com/usa-mimi/tutorial/raw/master/doc/template.pdf

> ![Kobito.HkvVeQ.png](https://qiita-image-store.s3.amazonaws.com/0/58048/a89043b4-2553-f246-7412-af1eb5e02d09.png "Kobito.HkvVeQ.png")



<hr>

[他のチュートリアル](http://qiita.com/maisuto/items/17653f344d1f64afa019)
Twitterでリプライが飛んで来たらすぐにいいねする

#動機
- Twotter APIを触って見たかったので

#本題
1. https://apps.twitter.com/ にアクセスしてTwitterAppsを適当に作成してください、その後permissionタブで今回行うReadの許可をつけます
2. key and access tokenから`Consumer Key`と`Consumer secret`を控えてください
3. そしてpythonが入っている事が前提でいきます（私はver2.7で作りました）
4. `pip install tweepy`でTwitterを扱うライブラリをインストール
5. そしたら下のプログラムを適当なpythonファイルに貼り付けて実行してください、このとき`Consumer Key`と`Consumer secret`をそれぞれ変数に格納してください

~~~access.py
#!/usr/bin/python
#-*- coding: utf-8 -*-
import tweepy

consumer_key = ""#access https://apps.twitter.com/ and get consumer key
consumer_secret = ""
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
print("Access this URL:" + auth.get_authorization_url())
verifier = raw_input('Verifier:')
auth.get_access_token(verifier)
print "Access Token:", auth.access_token
print "Access Token Secret:", auth.access_token_secret
~~~

6.するとURLが表示されるのでそこへアクセスし表示されているコードを実行画面に打ち込んでください
7. 認証されると、`Access Token`と`Access Token Secret`が表示されるのでそれぞれまた控えてください
8. 以下のプログラムを適当なpythonファイルに貼り付けて、これまでに控えたキーをそれぞれ変数に格納してください.あと自分のTwitterIDも＠抜きで格納してください

~~~replyBot.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import tweepy
import datetime

class Listener(tweepy.StreamListener):
    def on_status(self, status):
        status.created_at += datetime.timedelta(hours=9)
        
        #favo when reply
        if str(status.in_reply_to_screen_name)==Twitter_ID and str(status.user.screen_name)!=Twitter_ID:
            print(str(datetime.datetime.today()))
            api.create_favorite(status.id)
        return True
    
    def on_error(self, status_code):
        print('Error code:' + str(status_code))
        return True
    
    def on_timeout(self):
        print('Timeout error')
        return True



consumer_key = ""#access s and get consumer key
consumer_secret = ""
access_token = ""
access_secret = ""
Twitter_ID = ""#Your TwitterID(Don't need @)

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)

listener = Listener()
stream = tweepy.Stream(auth, listener)
stream.userstream()

~~~
9.そしてあとは実行すれば完了です．ちなみに上のプログラムは自分が自分にリプライを飛ばしてもファボしないようにしてます

#終わり
- 以上ですが、APIの使用は簡単で誰でも簡単にBotを作れると思います．
Excel （エクセル）からCybozu kintone のデータを読み書き更新

CData Excel Add-in for kintone を使って、kintone データをノンプログラミングでExcel から参照・編集ができます。

##代表的なユースケース##
- マスターデータ管理（商品名・取引先）
- データの一括編集（案件リスト、担当者テーブル）
- データのクレンジング（電話番号、郵便番号、勘定項目、㈱）
- BI 利用やグラフの定期作成
- 他のSaaS との連携をExcel コピペで

##CData Excel Add-in for kintone のダウンロード##
CData Excel Add-in の30日の無償試用版がダウンロード可能です。
[http://www.cdata.com/jp/drivers/kintone/download/excel/](http://www.cdata.com/jp/drivers/kintone/download/excel/)

##Excel からkintone への接続##
Excel Add-in をインストールしたらExcel を開きます。
［CDATA］タブ*が出来ているはずです。タブをクリックするとExcel アドインが使えるデータソースがアイコンになっています。［kintone］のアイコンをクリックします。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/116843/cd8bc857-a28b-ed4f-8d75-dd47d8e43c53.png)
*タブが出来ていない場合には、［ファイル］→［オプション］→［アドイン］の管理のCOM アドインの設定でCData Excel Add-in を有効にしてください。

CData データ選択ウィザードが開きます。［編集］をクリックします。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/116843/3becf00e-f117-d347-27f7-cd56d9d8e865.png)

kintone への接続の為のプロパティが表示されます。kintone への接続の必須項目を入力します。
- Password: kintone アカウントにログインする際のパスワード
- Url: 自分のkintone のURL
- User: kintone アカウントにログインする際のユーザー名
![5.png](https://qiita-image-store.s3.amazonaws.com/0/116843/f52b929c-2485-cd3d-237d-b008f747e283.png)

［テスト接続］を押すと、項目の入力が正しければ、接続に成功した旨のメッセージが出ます。［OK］を押して、接続設定を完了させます。

##Excel からkintone アプリデータを取得##
［テーブル］ドロップダウンをクリックすると、kintone 内のアプリがテーブルとして選択できます。テーブルを選択するとアプリ内のフィールドが［列］欄にカラムとして表示されます。Excel で取得したいカラムをチェックします。
CData Excel Add-in はダイナミックにスキーマ取得を行うことができ、スキーマ設定を改めて行う必要がありません。カスタムアプリやアプリ内の追加項目を含めて取得が行われます。データ型などもそのまま取得されます。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/116843/f30e595b-c3c1-7c68-9173-76e028e91e3f.png)

［クエリー］欄にはあらかじめ、選択したテーブル・カラムを100レコード取得するSQL が書かれています。
標準SQL を書き込むことで、フィルタ、ソート、JOIN などの処理が可能です。まずはセットされた通り100レコードを取得してみます。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/116843/3b593c7d-84a7-d839-9b29-41e068a9e93f.png)

Excel のテーブルにバインドされた形でkintone データが取得されました。
普通のExcel テーブルですので、並び替えやソート、ピボットテーブル、グラフ化などのExcel 機能を使うことができます。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/116843/f7794806-c8e6-085a-6c2e-520186013b98.png)

もう一度CDATA kintone アイコンをクリックして、SQL でのフィルタリングを行ってみます。
[クエリー]欄に次のようなクエリを入力します。
 
```
SELECT * FROM Comments WHERE AppId = '1354841';
```
![9.png](https://qiita-image-store.s3.amazonaws.com/0/116843/a2137fd1-44dc-5d3a-a6b5-4c24eb53ae1a.png)

指定したHR/HM ジャンルのレコードだけが取得されました。
![10.png](https://qiita-image-store.s3.amazonaws.com/0/116843/d8e9fab1-6e77-95fc-ae8e-669d81e2597b.png)



##Excel からkintone アプリデータの更新##
Excel からkintone レコードを追加入力することも可能です。
取得したテーブルの最後の行の下の行にデータを入力します。READ Only 項目への入力はできませんので注意してください。入力された値は赤字で表示されます。
入力した行を選択して、［CDATA］タブ内の［アクション］から［行の挿入］をクリックします。
これでExcel からkintone にデータが入力されます。
![11.png](https://qiita-image-store.s3.amazonaws.com/0/116843/4148f888-de9e-cf58-9956-252bfcc0b914.png)


kintone 画面で確認してみましょう。新しいレコードが出来ているはずです。
![12.png](https://qiita-image-store.s3.amazonaws.com/0/116843/9cb72938-9bfa-7c32-cb18-42d43492196f.png)

同様にExcel 上で行を選択して、［アクション］から［行の削除］を行うとkintone のレコードを削除することができます。

更新系では、一括削除、一括入力、既存データの一括更新などはExcel 画面から行った方がブラウザから行うよりも簡単な場合が多いでしょう。Excel の置換機能などを使うと既存データのマイナーな変更などが大変便利です。
そのプログラム、遅くないですか？

二分探索ってご存知でしょうか。普段使っていますか？

カーナビなどで文字を入力するときに、ひらがなの五十音表のボタンで
文字を入力することがあります。

わらやまはなたさかあ
をり　みひにちしきい
んるゆむふぬつすくう
　れ　めへねてせけえ
　ろよもほのとそこお

この五十音表のボタンから、「ね」を探す場合、どのように探すでしょうか。
日本人なら「ね」は「な」行の４番目ということを知っています。
まず１行目から、あかさたな、と「な」行を探し、それから下に、なにぬね
と探すことが多いのではないでしょうか。

一方、あいうえおかきく・・・という順に探していくことは少ないですね。
あいうえおかきく・・・と探すと「ね」までに23文字探すことになります。
いっぽう、「な」行を探し、そこから、なにぬね、と縦に探せば、
8文字で探し出せます。

このように何かの作業を順序だてて手順化する手法を定型化したものを
アルゴリズムと言います。

コンピュータープログラムでは大量のデータからあるデータを探し出すのに
インデックスという機構を通し、二分探索やそれに準ずるアルゴリズムを
利用するのが定石です。

二分探索は大量のデータをまず半分にわけその前後どちらに目的のデータがあるかを
判別して、その半分をさらに半分に区分けして、と探す手法です。

1億件のデータから特定のデータを探し出すとき、上で書いたように、
あいうえおかきく・・、と探すと、最大1億ステップが必要になりますが、
二分探索を使うと、log2(1億)つまりたった27ステップで目的のデータに
辿りつくことができます。
1ステップ1秒だったら大変なことですね。1億ステップは3年以上かかる計算です。
二分探索なら27秒です。

残念ながら一部のプログラマはこの理屈を使いこなせない方が多いようです。
プログラマを何年もやっている人でもこのことに無頓着な方がよく見られます。
悲しいことです。

とっつきは難しいように感じられてもそれを学ぶことで業務効率は
３年かかるか27秒しかかからないかの差になることもあるということを
理解して仕事をしましょう。

コンピューターが爆速でデータを探し出せるのは二分探索を応用したアルゴリズムで
検索を実行するからです。
昨今の一般のプログラム言語・フレームワークでは検索アルゴリズムの基本は
いちいちプログラムしなくても既製のものがあふれています。すでにあるものを
使いこなせばよいだけです。

昨今のコンピューターは性能が高いため、五十音程度では、あいうえおかきく・・と
探しても瞬く間です。二分探索など必要なく思われます。しかし、大量のステップを
必要とするプログラムは、電気代もかかります。ちりもつもれば山となります。
「とりあえず動けばよい」ではなく「きちんと無駄なく動く」ことを目指しましょう。

二分探索以外にも少し勉強するだけで業務速度が爆速になることがあります。
そのような事例は日常の仕事にもあふれています。これまでやってきた仕事の方法が
劇的に効率化できないかいまいちど振り返ってみてはいかがでしょうか。
iOS - Cordovaのtwitter-connect-pluginとCrashlyticsを併用して上手くいかなかった件

Ionicのアプリ作成時に、twitter-connect-pluginを利用していて、最初通っていたビルドが、platformのrmとadd後に通らなくなってしまった。

開発環境は

```
Mac 10.12.5
Cordova 7.0.1
Ionic 3.5
Fabric.app 2.6.11
twitter-connect-plugin 0.6.0
```

# ビルドは通るものの、実機でRunが出来ない。
```
Undefined symbols for architecture arm64:
  "_FABNetworkMaximumRetryCount", referenced from:
      ___51-[CLSBetaController loadUpdateWithCompletionBlock:]_block_invoke in Crashlytics(CLSBetaController.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
Runするとこのようなエラーが出る。

# 問題になっていた（なっていなかった）経緯

色々問題の解決を試したあとに、あとで振り返ると原因となっていた経緯はこう。

1. Crashlyticsの方を最初にインストール
2. その後開発が進む中で"twitter-connect-plugin"をインストール
3. **この時点では問題ない**
4. iOSのプラットフォームを削除
5. iOSのプラットフォームを追加・Ionic(Cordova)のビルド
6. デスクトップアプリに従ってCrashlyticsの再登録、Run Scriptの登録・ビルド
7. AppDelegate.m ファイルにCrashlyticsの記述を追加
8. **エラー**

# 結局のところ問題だった箇所は2つ

## 1. Crashlyticsに提示されるAppDelegate.hの修正の内容
最初にCrashlyticsをインストールした時は、AppDelegate.mの修正内容はデスクトップアプリからこうしろと言われていた。

```objc
[Fabric with:@[[Crashlytics class]]];
```

依存関係からなのかなんなのか（詳しい人がいたら是非教えてください！）、経緯の6でCrashlyticsを再登録しようとしたときはこう言われる。

```objc
[Fabric with:@[[Twitter class], [Crashlytics class]]];
```
AppDelegate.mにはTwitterKitを読み込んでいないので、当然Twitterのところでエラーになる。
またTwitterKitを読み込んでも、キーとシークレットがないとエラーになる。

FabricがTwitter系のフレームワークを読み込んでると判断して、自動でTwitterの認証を初回に通すためにいれているのかな。
ここのところはちょっと詳しくわからなかったけど、前者のTwitterのない方で修正すると上手く通った。

ここらへんの、FabricとTwitterの依存関係は、FabricがGCPファミリーになるので修正されていって欲しい。

## 2. twitter-connect-pluginのファイルのバージョン
プラグインに含まれているFabric.frameworkのバージョンが昔のものだった。
経緯の3で問題なかったのは、Crashlytics導入時に最新版のframeworkファイルが既にXcode内に登録されていたため。
ビルド時にプラグインのファイルはコピーされなかった。

再ビルド時には、まだCrashlytics導入前だったため、プラグインのframeworkファイルがコピーされるので、8の箇所でエラーが発生。

下記の本家サイトからDLできるファイルを導入してあげると問題なくRunまでいった。

https://fabric.io/kits/ios/crashlytics/manual-install

ということで、プルリクを投げてみている。
https://github.com/ManifestWebDesign/twitter-connect-plugin/pull/61

プルリク元のフォークしたリポジトリはこちら
https://github.com/donuzium/twitter-connect-plugin
iOS11 ではフォトライブラリへ書き込むとき NSPhotoLibraryAddUsageDescription を書いてないとクラッシュする

iOS10で、フォトライブラリへのアクセスが必要なアプリは、info.plistに

```
NSPhotoLibraryUsageDescription
```

で使用用途を書かないとだめでした


iOS11ではさらにフォトライブラリへの読み込みと書き込みでパーミッションが分かれたようで、

```
NSPhotoLibraryAddUsageDescription
```

書き込みにはこちらに使用用途を書いてパーミッションを得ないとクラッシュします
読み込みだけなら iOS10でも書いた NSPhotoLibraryUsageDescription だけで問題なし  
  
　

WebViewで
UIImageWriteToSavedPhotosAlbum()
を実行したタイミングで権限を与えるかのアラートが出るようになります



# 追記（beta段階なので今後変わるかも）

- iOS11だとフォトライブラリの読み込み時にダイアログが出ない。
    - OSの設定で見ても特にパーミッション取れてなくてもフォトライブラリへのアクセスができる
- 画像保存だと NSPhotoLibraryAddUsageDescription の内容が出る。
- 一方、iOS11SDKでビルドしようが、iOS9〜10だと保存に関しても NSPhotoLibraryUsageDescription が参照される

結論としては、 
NSPhotoLibraryUsageDescription
NSPhotoLibraryAddUsageDescription
どちらも画像保存するために使うようなことを書いておくのがいいのでは。

# apple ドキュメント
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW73