OmniAICreator/Qiita-1.07M huggingface dataset:
Ethereumのプライベートネットワークで送金する体験

#はじめに

Ethereumのプライベートネットワーク上で、二つのアカウント間でEtherを送金するチュートリアルを体験します。

#前提
Geth 1.5.9-stable-a07539fbがインストールされています。

#マイニング
マイニングしたEtherが入るアカウントEtherbaseにeth.accounts[0]を指定し、マイニングします。1回で4Etherくらいをマイニングできます。

```
> miner.setEtherbase(eth.accounts[0])
> miner.start()
```

accounts[0]と"s"がつきますので、ご注意ください。

Mined block云々というメッセージが表示されたら、マイニングの完了です。マイニング処理を止めます。

```
> miner.stop()
```

これで、4Ether以上が[0]に入りました。

```
> personal.getBalance(eth.accounts[0])
> personal.getBalance(eth.accounts[1])
```

で各アカウントの金額をwei単位で確認できます。

#送金

では、eth.accounts[0]から[1]に3etherを送金したいと思います。
まず、送金前にアカウントをアンロックします。(exitしたり、ターミナルを閉じるとアンロックをやり直す必要があります。)

```
> personal.unlockAccount(eth.accounts[0])
```
とすると、パスワードを聞かれますので、作成したときの値を入力します。
unLockではなく、unlockです。Accountsではなく、Accountです。

次に、送金のトランザクションを実行します。

```
> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(3, "ether")})
```

これでブロックチェーン上に送金トランザクションが登載されました。しかし、マイニングが完了しないと送金手続きが完了されません。

最後にマイニングをします。

```
> miner.start()
> miner.stop()
```

```
> personal.getBalance(eth.accounts[0])
> personal.getBalance(eth.accounts[1])
```

こうすると、残高が変動していることがわかります。[0]が元よりも増えているのは、送金した分減額されているのですが、その後にマイニングをして増額しているためです。

#感想
比喩的にはマイニングはGitのコミットのようなものだと思いました。
AWSのEC2で必要なswap領域の追加とスワップを減らす設定

EC2のnanoやmicro、smallといった小さいインスタンスを使っていると、デフォルトではswap領域がないため、nginxをコンパイルする際やElasticsearchを起動する際など、メモリを多く必要とする処理が失敗してしまうことがよくあります。
また、スワップが頻繁に発生すると処理速度も心配になるので、なるべくメモリを使って頑張ってもらう設定も一緒にすると安心です。

## スワップ領域の追加手順

512MBのswap領域を追加する手順です。作業は`root`ユーザ想定なので、適宜`sudo`は追加してください。

```
dd if=/dev/zero of=/swapfile1 bs=1M count=512
chmod 600 /swapfile1
mkswap /swapfile1
swapon /swapfile1
echo "/swapfile1  none        swap    sw              0   0" >> /etc/fstab
```

設定追加されていることを確認。

```
cat /etc/fstab
# #
# LABEL=/     /           ext4    defaults,noatime  1   1
# tmpfs       /dev/shm    tmpfs   defaults        0   0
# devpts      /dev/pts    devpts  gid=5,mode=620  0   0
# sysfs       /sys        sysfs   defaults        0   0
# proc        /proc       proc    defaults        0   0
# /swapfile1  none        swap    sw              0   0
```

`free`コマンドでもSwap領域と使用されている領域を確認できます。

```
free -m
#              total       used       free     shared    buffers     cached
# Mem:          2003       1932         70          0          0         19
# -/+ buffers/cache:       1912         90
# Swap:          511        511          0
```

## スワップ頻度の変更手順

`swappiness`でスワップの頻度を変更できます。
`AmazonLinux`ではデフォルトで60になっていました。

```
cat /proc/sys/vm/swappiness
# 60
```

`root`ユーザでの作業想定の手順。

```
echo 10 | tee /proc/sys/vm/swappiness
echo vm.swappiness = 10 | tee -a /etc/sysctl.conf
```

変更を確認します。

```
grep swappiness /etc/sysctl.conf
# vm.swappiness = 10 
```

---

AWS等でメモリ領域の小さいEC2インスタンスを使う際には設定しておくと安心です！
Git逆引きメモ

必要に迫られたGit関連の逆引きメモになります。

# Windows版Gitで認証情報の確認

1. `コントロール パネル`→`ユーザー アカウント`→`資格情報マネージャー`を起動
2. `Windows資格情報`を表示
3. `git:`で始まる認証情報を確認

# リモートリポジトリの確認

```bash
git remote -v
```

# リモートリポジトリを変更

```bash
# git remote set-url リポジトリ名 URL
# ex.
git remote set-url origin http://test.com/group/example.git
```
# git-svnでユーザをマッピング

### authors.txtを作成

```
test1 = test1 <test1@test.com>
test2 = User1 <test2@test.com>
```

## -A オプション

```
git svn clone -A authors.txt -s --prefix=svn/ svn://test.com/test/
```

# SVNからGitへの移行

## git-svn
下記コマンドで移行したいリポジトリをローカルに取得。

```
git svn clone -A authors.txt -s --prefix=svn/ svn://test.com/test/
```
※-Aオプションはユーザの紐付け。

## Gitリポジトリへ
移行先のGitリポジトリを作成して、下記のコマンドを実行。

```
git remote add origin http://test/test.git
git push origin --all # すべてのブランチをpush
git push origin --tags # すべてのタグをpush
```

# 参考
* [gitでoriginのurlを確認する。 - 僕の今さら日記](http://d.hatena.ne.jp/wats/20100910/1284261816)
* [git リモートリポジトリのURLを変更するコマンド - URAGAMI](http://blog.higty.xyz/archives/574/)
* [Windows版Gitで認証情報を消す方法 &#8211; 株式会社シーポイントラボ ｜  浜松のシステム開発会社](https://cpoint-lab.co.jp/article/201804/windows%E7%89%88git%E3%81%A7%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%82%92%E6%B6%88%E3%81%99%E6%96%B9%E6%B3%95/)
【AndroidStudio】実機（Samsung SC-04E Android 5.0.1)が認識されず、実行できない

実機（Samsung SC-04E Android 5.0.1)で実行しようと思い
USBで接続してもAndroidStudioで認識されない。
　　
というか、そもそもPCに認識されない。
なのでギャラクシー用のドライバのインストールから始める。
　　
　　
Kiesのサポートページからドライバをダウンロード、インストールする
→http://www.samsung.com/jp/support/usefulsoftware/KIES/
　　
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/169398/e23a0fed-5a85-a499-db6f-a5be864cb391.jpeg)

　　
　　
インストールしたけど、認識されない。
調べてみると、USBケーブルが充電専用らしい。
　　
USBケーブルを携帯バッテリー用から
PS4で使用しているものに変えてみたら認識された。
　　
　　
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/169398/9eee5b12-d7a3-b275-bb70-5be6c6d67fa7.jpeg)
　　
　　
ここで次の問題。
AndroidStudioが認識してくれたにも関わらず、実行できない。
（キャプチャ撮り忘れた・・・）
　　
　　
上の画像のように[6:Android Monitor]では認識されているのに、
実行ボタン押下後のデバイス選択画面に出てこない。
　　
　　
ここで試したことは以下の２つ。
　　
①Tools>Android>SDK Managerから自分が使っているVerのSDKをインストール。
（今回使用しているスマホはAndroid 5.0.1のため5.0をインストール）
　　
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/169398/e1c19313-9c8a-96af-cc95-72d4e04d77de.jpeg)
　　
②再起動
　　
　　
これでうまく認識された。
　　
ただ、SDKをインストールしたから実機で実行できたのか、
再起動したから実行できたのかは判明しておらず。
　　
結局、原因ははっきりとはわからなかった。
Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week6)

# Coursera Week6
## はじめに
CourseraのWeek6を実施しましたので、私のメモを公開します。
Courseraってなんだ？という方は[Week1](http://qiita.com/KirariGlock/items/d41bdcc6f5ec5ad255fb)から御覧ください。

## Advice for applying machine learnig
### 仮説関数の評価方法について(Evaluating a hypothesis)
仮説関数はトレーニングセットとの誤差が少ないだけだと、オーバフィットしてしまう。
オーバーフィットするとトレーニングセットに存在しない新しいサンプルの一般化に失敗してしまう。
オーバーフィットの判断として、フィーチャが１つの場合はグラフを書いてわかるが、複数のフィーチャがあると無理だったりする。
その新しいやり方として、トレーニングセットを分割して、70%をトレーニングセット、30%をテストセットとする。（ランダムに並べ替えてから。）
テストセットの線形回帰目的関数は以下のように求める。
$$
J_{test}(\theta) = \frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_\theta(x_{test}^{(i)})-y_{test}^{(i)})^2
$$
ロジスティック回帰の場合は以下。
$$
J_{test}(\theta) = -\frac{1}{m_{test}}\sum_{i=1}^{m_{test}}y_{test}^{(i)}\log h_\theta(x_{test}^{(i)})+(1-y_{test}^{(i)})\log h_\theta(x_{test}^{(i)})
$$
分類問題におけるゼロワン誤判別計量。
$$
TestError = \frac{1}{m_{test}}\sum_{i=1}^{m_{test}}err(h_\theta(x_{test}^{(i)}), (y_{test}^{(i)}))
$$

### Diagnosing Bias vs. Variance
高バイアスはアンダーフィット、高分散はオーバーフィットを表している。
ちょうどいいのはこの２つの平均を見つけること。
トレーニング誤差$J_{training}(\theta)$は多項式の次数$d$を増やすと減少する。
交差検証誤差$J_{cross-validation}(\theta)$は$d$をあるポイントまで増加させると減少し、そこを超えると上昇する。つまり、グラフにすると凸曲線を形成する。
アンダーフィットしている場合、$J_{training}(\theta)$と$J_{cross-validation}(\theta)$は両方高くなり、近似する。
オーバーフィットしている場合、$J_{training}(\theta)$は低く、$J_{cross-validation}(\theta)$は$J_{training}(\theta)$よりはるかに大きくなる。

正規化項$\lambda$に関して。
$\lambda$が大きすぎるとアンダーフィットし、０に近いとオーバフィットする。

トレーニングセットが多くなればなるほど、$J_{training}(\theta)$は大きくなる。
反対にトレーニングセットが多くなればなるほど、$J_{cross-validation}(\theta)$は小さくなる。

高バイアス(アンダーフィット)の場合、$J_{training}(\theta)$と$J_{cross-validation}(\theta)$は共に高い値に落ち着く。
また、双方の値がかなり近い値になる。
なので、トレーニングデータを増やしても有効ではない。

高分散(オーバーフィット)の場合、$J_{training}(\theta)$と$J_{cross-validation}(\theta)$はかなり大きな差が出る。
しかしトレーニングデータを増やすことでその差を縮めることができる。

層の少ない小さいニューラルネットワークの場合、相対的にアンダーフィットしやすい。
１層内にたくさんのニューロンがある場合や隠れレイヤが多い場合はオーバーフィットしやすい。
通常は少し大きめのニューラルネットワークを正規化してオーバーフィット対策をするのがベター。

### ここまでのまとめ
トレーニングセットを増やす：高分散を修正
フィーチャの数を少なくする：高分散を修正
フィーチャーを追加する：高バイアスを修正
多項式フィーチャを追加する：高バイアスを修正
$\lambda$を減少させる：高バイアスを修正
$\lambda$を大きくする：高分散を修正

## 機械学習システム設計(Machine learning system design)
### Priortizing what to work on Spam classification example
システムの設計について、スパムメールの判定をする例で説明する。
教師あり学習を実装するにあたり一番最初にやることは$X$をどう表現するか。
まず100個の単語を選ぶ。（スパムっぽい単語とかそうでない単語とか。）
※一般的には手動ではなく、トレーニングセットのメールの中で、頻出した単語の上位を選ぶ。
その単語がメールの中に登場したかどうかを0,1で表現し、Xの列ベクトルとする。
全てのXが出揃ったら、それを訓練してスパムメールの分類に使用する。

### Error Analysis
エラー分析ではシステムで間違って分類されたものを人が見て、何らかのシステムで検知できる箇所が無いか分析する。
例えばミス分類されたメールの内容を分類する。（薬を売りつけるメール、偽物を売りつけるメール、フィッシングメール、その他　など）
それぞれ何件ミス分類があるか確認することで、多いところが弱いことがわかる。
弱いところのシステム的な条件を見つけてモデルに追加する。

### Precision / Recall
予測値と結果を以下のように分類する

| 予測値 | 結果 | 分類 |
|:-:|:-:|:-:|
| Trueと予測 | True | True positive |
| Trueと予測 | False | False positive |
| Falseと予測 | True | False negative |
| Falseと予測 | False | True negative |

Precision(精度) = P
$P = \frac{TruePositive}{TruePositive + FalsePositive}$

Recall(再現率) = R
$R = \frac{TruePositive}{TruePositive + FalseNegative}$

F1Score
$F_1Score = 2\frac{PR}{P+R}$
F1Scoreが高いPとRを使用するのが良い。
Sphinx で markdown を扱う (無理やり日本語も)

- Markdown形式（そこまで複雑でないが長いもの）で書いたドキュメントを、HTMLにしてS3でホストしたりPDFで配布したい

ので[Sphinx](http://www.sphinx-doc.org/en/stable/)を試しました。
（プログラミング始め1年あまり、Pythonしか手に馴染んでる言語がない、というのもありますが……）

形にはなっているものの、少し見栄えが悪いのが難点で、最適解模索中です。

## インストール
```
pip install sphinx commonmark==0.5.4 recommonmark
```
Sphinx 本体と、Markdown（正確にはcommonmark）形式のパーサー、Sphinxで扱う形式への変換モジュールをインストールします。  
2017/3 初旬現在、commonmarkの最新版とrecomonmarkの相性が悪いため、前のバージョンを指定してインストールをします。

- 参考:[SphinxでMarkdownを使うときに注意すること](http://qiita.com/tk_wada/items/0991b1f5148b665f261d) 

## 設定
ソースディレクトリに置かれる`conf.py`に記述を追加します。

```python
from recommonmark.parser import CommonMarkParser
from recommonmark.transform import AutoStructify

...

# mdファイルがある場合はパーサー変更
source_suffix = ['.rst', '.md']
source_parsers = {
    '.md': CommonMarkParser,
}

...

# recommonmark の拡張利用
github_doc_root = 'https://github.com/rtfd/recommonmark/tree/master/doc/'
def setup(app):
    app.add_config_value('recommonmark_config', {
            'url_resolver': lambda url: github_doc_root + url,
            'auto_toc_tree_section': 'Contents',
            }, True)
    app.add_transform(AutoStructify)
```
拡張機能の詳細についてはこちら。

- [Recommonmark Document](http://recommonmark.readthedocs.io/en/latest/index.html#autostructify)

より便利に扱いたい場合こちらの記事が大変参考になります。

- [Sphinxを便利にして、みんなに使ってもらいたい](http://qiita.com/pashango2/items/d1b379b699af85b529ce)

後は、ソースディレクトリに`index.rst`のような起点になるrstファイルを配置し、そこにビルド元のmdファイルのファイル名を書き連ねればMarkdown形式からビルドを行えるはずです。

## 画像の貼り込み
~~突き当たっている課題その１です。~~
環境インストールし直しで解決しました、下記は参考まで

画像の貼り込みが
```
![title](images/image.png)
```
~~でできれば良いのですが、うまくいかなかったので~~
上手くいきました、上記で大丈夫です。

`````
```eval_rst
.. figure:: images/image.png
``` `
`````

## 日本語セクションにアンカーが貼られるようにする
突き当たってる課題その2です。
recommonmarkがacsii文字以外はエスケープしてしまうようで、そのままだとうまくリンクが貼れません。
場当たり対応ですが、URLエンコードを施すようrecommonmarkの`parser.py`を書き換え、リンクが貼られるようにしました。

```python:parser.py
from future.moves.urllib.parse import quote

...

# name = nodes.fully_normalize_name(title_node.astext())  # コメントアウト
name = quote(' '.join(block.strings))  # 2017/03/09現在pip でインストールできる0.4.0だと110行目
```

※直接触るのは怖いのでdockerを利用しています。試される場合はdockerやpyvenvをおすすめします。

ただこのやり方だと、%が-へとさらにエスケープされるために-ばかりの美しくないリンクが生成されてしまいます（もはや乱数を入れた方が良いかもしれません）。
とりあえず動いているように見えますが、副作用があるやもです。

-----

より良い方法あればご共有いただければ(_ _)
zfs snapshot で発生する ZFS WARNING (error=63)



rootからのメールを見ていたら以下の警告が発生していた。

```
ZFS WARNING: Unable to create ZVOL zroot/vm/vm0001/disk0@zfs-auto-snap_hourly-2017-03-09-10h00 (error=63).
ZFS WARNING: Unable to create ZVOL zroot/vm/vm0002/disk0@zfs-auto-snap_hourly-2017-03-09-10h00 (error=63).
ZFS WARNING: Unable to create ZVOL zroot/vm/vm0003/disk0@zfs-auto-snap_frequent-2017-03-09-10h15 (error=63).
...
```

[zfstools](https://github.com/bdrewery/zfstools)にてスナップショットを自動で取得する際にエラーが発生している。

明確にerror=63の原因がわからない。どうも、名前が長すぎるようなので、zfs-auto-snapの部分を短くしたい。ただ、コマンドのオプションでは対処できないようだ。zfstoolはrubyで書かれているため、以下のファイルを直接修正してとりあえず対処を行った。

/usr/local/lib/ruby/site_ruby/2.3/zfstools.rb

エラーは今の所止まった。
Paper Plane xUI (PPx) でサーバによって背景色を変える

コメントを頂いたので変更。


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/h0k0r0bi">@h0k0r0bi</a> *color というコマンドが増えています。ただ、一時的なので *customize コマンドが使われた時点で戻ってしまいます。</p>&mdash; TORO (@toroidj) <a href="https://twitter.com/toroidj/status/839840777190588416">2017年3月9日</a></blockquote>


ローカル、開発環境サーバ、本番環境サーバなどのファイルを PPx で扱うことがありますが、ローカルのファイルを扱っているつもりが開発環境だった、もしくは本番環境だったなんてことがあったりします。
これを防ぐために背景色を変えるようにします。

cmd より前は無視してもらって、cmd 以降で、ホスト名が demo, prod の際には、背景色を変更しています。（`*color` は Version 1.52+2 にて追加）

それ以外のパスでは、背景色をデフォルトに戻るに設定しておきます。これがないと、他のパスに移動してもそのままの背景色になってしまいます。

```
XC_dset	= { 
*	= B0000,0,0,3,-1,-1,B011111,B00000000000000000000000001,cmd:"*color back"
\\demo\	= B10110,0,0,3,-1,-1,B011111,B00000000000000000000000001,cmd:"*color back _DBLU"
\\prod\ = B10110,0,0,3,-1,-1,B011111,B00000000000000000000000001,cmd:"*color back _DRED"
}
```
Atom linter のパネルを消したい

- osx 10.12.3
- atom 1.14.4

ここ消してちょっとでも編集エリアを広くしたい
![application_rb_—___work_demo.png](https://qiita-image-store.s3.amazonaws.com/0/151309/c2223426-bce4-5182-b1ac-05aefada1196.png)

### 要素を調べる
`⌘ + option + i` で `developer tool` を開く
![スクリーンショット_2017-03-09_21_07_20.png](https://qiita-image-store.s3.amazonaws.com/0/151309/587a0f83-460b-1f27-b538-65bcf912d5b6.png)

`.linter-panel` っていうみたい

### スタイルを修正する
メニューバーから `Atom` → `Preferences...` → `Themes` → `your stylesheet`

```styles.less
# 下記を追加
linter-panel {
  display: none;
}
```

![production_rb_—___work_demo.png](https://qiita-image-store.s3.amazonaws.com/0/151309/66e629c2-fe02-aeef-abbf-256d34d4dacd.png)

消えた :relaxed::relaxed::relaxed::relaxed::relaxed:

11 インチの mac 使ってるから、画面狭すぎてここめっちゃ消したかった（Warning 箇所にカーソルあてたら詳細でてくるし）
atom でも developer tool 使えるんですね。スタイルも編集できる。スゴイ。
Oracleのメモ

※随時追記していく。かも。
SQLとかは当然で、それに加えて設定とかリストアとかそういう知識を身に着けることが「Oracle(というかDB全般)に精通する」ってことなのかなぁという感想。実際に運用していかないと身につかないことばっかりだろうし先は長そう。Oracle Masterになりたいとかではないんだけど。。。

#Archivelog
実行されたSQLを時系列順で記録しているファイル。
例えば、DBが10日前の状態に復元されたとき、昨日までのアーカイブログがあればアーカイブログを適用することで昨日までの状態に戻すことができる。
##CTLファイル
restoreの観点からだと「最後にアーカイブログを適用したタイミング」を記憶しているファイル。次にアーカイブログを適用するときにどのファイルから適用すればよいかが分かる。
#Materialized View
##Viewとの違い
ビューの実態はselect文。select文に名前をつけたものがビュー。
マテビューは「ある時点でのselect結果」を持っている。スナップショットのイメージ。
ビューは呼ばれるたびに実態であるselect文を実行する。
一方でマテビューは保持している結果を返す。よってパフォーマンス的にはマテビューが良い。ただしベースのテーブルが更新された場合、マテビューへの反映はされないため、定期的に更新処理を行う必要がある。この更新処理をrefreshという。
##refresh
###refresh complete
1からデータを取りなおす。時間がかかるが、制約などがないため簡単。
内部ではdelete→insertしている。パラメータを変えればdeleteをtruncateにできるらしいが、ちゃんとは調べていないから分からない。
###refresh fast
マテビュー取得時からの増分を取得する。速いが、制約が多く、マテビューの構成によっては実行できない場合もある。
増分を管理しているファイルをマテリアライズドビューログといい、このファイルをもとにrefresh fastが実行される。

#参考
http://www.insight-tec.com/mailmagazine/ora3/vol280.html
http://www.insight-tec.com/mailmagazine/ora3/vol281.html
VisualStudioCodeでPowerShellも開発できるようにしてみたよ

今までは、PowerShellのメンテはPowerShell ISEを使っていました。
PowerShellをVisualStudioCodeで開発している人がやたらかっこよく見えたのでマネしてみました。

# 前提要件
- OS：Windows 10
- VS：VidualStudio2015

# インストール
- 1. VSCodeダウンロード

以下のサイトがらインストーラーを入手します。
https://code.visualstudio.com/download

- 2. VSCodeインストール
ひたすらウィザードに従ってインストールしました。
![image](https://qiita-image-store.s3.amazonaws.com/0/168956/d887db6d-cba8-f9ab-e0b9-610d0a5cd375.png)

# 拡張機能の追加
ウィザード完了にしたら勝手に起動してきたので・・・
- 1.拡張機能追加画面の起動
![image](https://qiita-image-store.s3.amazonaws.com/0/168956/7165e6e5-b143-52dd-fabc-8f4212f1a57e.png)

- 2.PowerShell拡張機能インストール
![image](https://qiita-image-store.s3.amazonaws.com/0/168956/91368734-6a23-c2d7-1c5b-81528469bb78.png)

早速ps1ファイル開いてみる
![image](https://qiita-image-store.s3.amazonaws.com/0/168956/9cee833b-bef7-67e1-bc85-493d72f983be.png)

他のファイル・・・文字化け
![image](https://qiita-image-store.s3.amazonaws.com/0/168956/bdd14209-7cf5-c6b6-d353-562f29caf0cb.png)

# 文字化け回避
- 1.ユーザ設定の変更
[ファイル]>[基本設定]>[設定]と遷移
![image](https://qiita-image-store.s3.amazonaws.com/0/168956/33c10b29-5523-c0e4-6738-4b55022f8c1a.png)

- 2.SJISの追加
setting.jsonファイルが開くので「"files.encoding": "shiftjis"」を追加
![image](https://qiita-image-store.s3.amazonaws.com/0/168956/0d430b77-170f-7bdb-a921-029c79e5da1d.png)

おｋ
![image](https://qiita-image-store.s3.amazonaws.com/0/168956/c491cd13-fc30-0822-1069-84c8016b73a8.png)

# 参考文献
http://grum.hatenablog.com/entry/2016/03/22/233737
Jupyter Notebookで使うブラウザを指定する。特にMac。 （とVivaldi）

## はじめに
Jupyter notebook を、通常使うブラウザとして指定されているブラウザではなく、任意のブラウザで起動する方法について。
Linux, Windows も基本的に同じですが、Macでは**ちょっとだけ**違います。
_(2018/6/18) Vivaldiもちょっと違ったので追記。_  

## 環境
- MacOS Sierra
- Python3.5

## 手順
### １．Jupyterの設定ファイル作成
ターミナルで以下のコマンドを実行します。

```
$ jupyter notebook --generate-config

Writing default config to: /Users/(user_name)/.jupyter/jupyter_notebook_config.py
```

これにより、以下のファイルが作成されます。
（ちゃんと上記コマンド実行時に教えてくれます）
 
~/.jupyter/jupyter_notebook_config.py



### ２．設定ファイルでブラウザを指定
上記ファイルをテキストエディタで開いて、以下の項目を探します。

```py:jupyter_notebook_config.py
# c.NotebookApp.browser = ''
```
コメントを外し、以下のように変更します。

```py:jupyter_notebook_config.py
c.NotebookApp.browser = '/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome %s'
```
`%s` の後に、 `--new-window` というオプションをつけると、新しいウィンドウで起動します。

### 注意点
- **Macでは起動オプション付の指定が必要**みたいで、`/Applications/Firefox.app` のようにアプリケーションのパスを指定しただけではダメです。   
Linux, Windowsでは、ブラウザ実行ファイル自体のパスで大丈夫です。  
_(2018/6/18 追記)_  
**Mac特有の違いではないようです**  
Ubuntu上でも、**Vivaldi** だと `%s` が必要でした。仕様の詳細は調べていません。あしからず。
- Macでは、Chromeの場合アプリケーション名にスペースが入っているので、スペースを```\ ```でエスケープしてください。
- 設定ファイルはPythonスクリプトですから、Python2の環境ではブラウザのパスの頭に `'u'` をつけないといけないかも。   
```u'Applications/Google\ Chrome.app/・・・'```  

### 参考
上の設定を処理しているPythonスクリプトはこちら。
/Users/(user_name)/.pyenv/versions/anacondaX-X.X.X/lib/pythonX.X/webbrowser.py

私の環境はpyenvですが、ご自分の環境に読み替えてください。
```--new-window``` などのオプションがあるのがわかります。
アプリで言語を勉強する時代へ

# アプリで言語を勉強する時代へ

3月8日が国際女性デーということで、Apple表参道店でイベントが開催されたようです（参加したかった:sob:）。

[「いつでも誰でも学べるアプリケーション開発：女性もプログラミングを！」](http://japanese.engadget.com/2017/03/08/WomensDay/)

このイベントでは、
- 女性がプログラミングを学ぶ意義やアプリ開発でのメリット
- これから多様化していく働き方の新提案
などをテーマにお話されたらしいです

そのイベントで発表されていた`codebelle`というアプリが面白そうだったので使って見た感想を!

# インストール
[こちら](http://codebelle.manabelle.jp)がホームページのようで、こちらからインストールできます！
iOSしか出してないようですね！

# 起動
わかりやすい！（色がpopで女性や子供など若いひと向けな気がしますね）
（自分的には、ログインがないのが嬉しかったですw）
<img width="375" alt="IMG_7109.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/150615/ec57c747-933f-39b8-3449-d64e89c3f021.png">
とりあえず、`1 Swift基礎`をポチり

# 基礎
なるほど！
もう1つが階層あったとw
<img width="375" alt="IMG_7110.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/150615/9d1859ed-c013-0ab2-fca9-bcf618f0b176.png">
`01 イントロダクション`をポチります

# イントロダクション
おぉ！LI○Eのような馴染みがある見た目ですね
（無駄なボタンがなく、操作に迷わないところが良い）
<img width="375" alt="IMG_7116.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/150615/988b951b-accf-1e3b-bc47-dd0566fb2b7f.png">

タップと書いてあるからタップしてみると...
<img width="375" alt="IMG_7117.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/150615/d09c1dff-9877-a847-f51b-4f060796f862.png">
なるほど！とりあえず、`hmhm`とでもいれてみよう

<img width="375" alt="IMG_7115.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/150615/5a0a8610-511c-f429-05bf-b853a050cf53.png">
print（みなさんご存知の出力）をしてくれると！
最初からコードを書かせないのは、入りやすいのではないかと思いますね

# 1章終了
SNSに投稿できるのはよいですね
みんなに自慢できてしまいますねw
![IMG_7118.PNG](https://qiita-image-store.s3.amazonaws.com/0/150615/7e638bea-dbb7-e91d-5cc3-8989d57c1f6e.png)

コードの選択問題などありましたが、
ネタバレしてしまうので、今回は、ここら辺で！w

# 感想
最初見た時、うわーやられた感と良いアイディアだなと感じました
コードには学習するにもパソコンがないとはじめられないイメージもありますし、そこを払拭できるいいアイディアだなと！
上で紹介したイベントの記事を読んで見ると、女性がメインターゲットのように書いてあり、家事や育児のすき間時間に勉強できる&スマホなのですぐ起動できるなど、ユーザー目線でいろいろ考えられているなと....関心ばかりです
swift以外の言語もアプリで手軽に勉強できる日も近いのではないでしょうか

AppStoreに公開されているアプリなので、大丈夫かと思い、スクリーンショット等を載せましたが、ネタバレ等なにか不都合がありましたら、一言ください。
excel アドイン向けマクロ(5)選択範囲のIMEを無効化するマクロ EXCEL VBA for Addin "Japanes IME OFF"

##まずマクロ用アドインを作ります
作り方はこちらを参照
http://hamachan.info/win8/excel/addin.html
クイックアクセスツールバーに追加することでアドインのマクロが使えるようになります。

今回は選択した範囲のIMEをOFFにして数値入力の時に不用意にIMEが起動しなくなります。

##注意点
これは入力規則を使っていますので、入力規則を削除してから設定します。
なので1から入力しているときは使えますが、もうフォーマットが決まっているようなときは使わない方がいいと思います。
というのもVBAで設定する場合、入力規則は1度削除してから設定することが基本で、IMEだけ部分的に変更すると不安定になるためです。


##ソース

```vb
Private Sub SetIMEModeOff()
'Data validation データの入力規則
'This Macro can run Language Setting is Japanese or Incluede Japanese
'This Macro is for Excel Addin
'https://www.moug.net/tech/exvba/0050121.html
'https://msdn.microsoft.com/ja-jp/library/office/ff193613.aspx
'http://www.atmarkit.co.jp/ait/articles/0709/14/news139.html
'http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1349164828?__ysp=eGxJTUVNb2RlT2Zm
'Excel.XlIMEMode
'Const xlIMEModeAlpha = 8
'Const xlIMEModeAlphaFull = 7
'Const xlIMEModeDisable = 3          <-Manual IMEMode On is imopossible
'Const xlIMEModeHangul = 10          <-If Langage Setting is Korea or Included it Then Error
'Const xlIMEModeHangulFull = 9       <-If Langage Setting is Korea or Included it Then Error
'Const xlIMEModeHiragana = 4
'Const xlIMEModeKatakana = 5
'Const xlIMEModeKatakanaHalf = 6
'Const xlIMEModeNoControl = 0         < -Default
'Const xlIMEModeOff = 2               < -This Macro Change IMEMode to it
'Const xlIMEModeOn = 1
Dim rng As Range
For Each rng In Selection
With rng.Validation
.Delete
.Add Type:=xlValidateInputOnly
.IMEMode = xlIMEModeOff
End With
Next

End Sub
```

このマクロは日本語設定か、日本語がインストールかなされていないとこれは動かない。
そして、いままで不安定だったが[知恵袋](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1349164828?__ysp=eGxJTUVNb2RlT2Zm)によると
With rng.Validation
.Delete
**.Add Type:=xlValidateInputOnly**
.IMEMode = xlIMEModeOff
End With
この太字の部分が必要らしい。確かに安定して動くようだ。
単純に

```vb
With rng.Validation
.Delete
.IMEMode = xlIMEModeOff
End With
```
や

```vb

With rng.Validation
.IMEMode = xlIMEModeOff
End With
```

ではエラーになったりする。これがなぜかは謎だ。

##Excel.XlIMEMode
しかしこの定数、実はハングルも入っている。ハングルにも全角と半角があるんですね。ハングルも韓国語設定か、韓国語がインストールされていないと動かない。
Const xlIMEModeHangul = 10
Const xlIMEModeHangulFull = 9    
しかもここからすると全角のハングルと半角のハングルがあることに。でも調べても日本語ソースはあまりないようだ。
Wi-Fi安定制御機能

# 事の始まり
自宅のプリンターのインクが切れた、写真画像を紙に印刷したい、そして印刷した物が早急に必要！
選択肢はコンビニプリントか、家電量販店での写真印刷機でのプリントとなり、恐らく画質が一番良いと思われる、家電量販店に行く事になるが、この選択が、この記事を書くきっかけになる。
写真画像を印刷する物が入っているのは妻のandroid端末で、そのまま持って行きなという事で、そのまま持って家電量販店に行く。
# 写真印刷機にハマる
家電量販店に到着し、今となっては閑古鳥の写真印刷機のコーナーにて、機械の指示通りに、接続用のandroidアプリを起動して、認証キーが表示されるので、アプリに入力するが、何度もやっても認証されない認証エラーである。
機械が2台あるので変えても認証エラーが発生、店員さんを呼んで写真印刷機をリセットしてもらっても認証エラーが発生する。
店員さんが、写真印刷機のオペレーションマニュアルを読んでも対処方法が不明、30分ぐらい店員さんと、あれこれ試したが全て認証エラーでした。
途中で、microSDアダブターを使って直接写真印刷機に刺せば良いのではと思ったが、頑張って対応する店員さんを見てると言い出せなかった。
そして、店員さんは、写真印刷機のメーカーに問い合わせをすると、即座に対処方法が判明する。
**Wi-Fi安定制御機能をオフにする**
![IMG_3783.JPG](https://qiita-image-store.s3.amazonaws.com/0/77441/043ecfc5-308d-a8c7-5b03-40d33bbdb4f1.jpeg)
これをオフにすると、今まで認証エラーだったのが、嘘のように認証して先に進み、写真画像を印刷する事が出来ました。
# Wi-Fi安定制御機能とは？
これだけなら、印刷出来て良かったねで終わりです。
調べてみると、Wi-Fi安定制御機能と言うのは、android 4.2から登場した機能である。
この機能を簡単に言うと **Wi-Fiの品質が悪いと4G回線でつなげる**らしいです。
写真印刷機とandroid端末はWi-Fiでつないで写真画像を転送するのですが、今回のケースでは、写真印刷機のWi-Fiの品質が悪いと判定されて、4G回線で接続し、認証するが、写真印刷機のWi-Fiでは無いので、認証エラーとなると思われます。
恐らく店の片隅で必要最低限のWi-Fi電波を出せば良いと言う事で出力レベルを絞っているのでは無いかと想像出来る。
# プログラムによる回避方法（結論無し）
androidのプログラムでは、どのようになっているのか興味があるので確認をする。
androidのWi-Fiで、SSIDを指定してつなげる場合は、WifiConfigurationインスタンスを使い、WifiManagerを使って接続するまでは解ったのですが、そこにはWi-Fi安定制御機能関連のパラメータは存在しないし、そのような機能は無いようです。
そうなると回避方法は無いです、残念！
【Java】equalsでfalseとなるのに==でtureとなるケースに注意

同値関係について調べていたらJavaのequalsが出てきたのでメモ

 - == でfalse
 - equalsでtrue

になる場合はよく知っていると思う。
別のinstanceであり同値である場合の時です。

逆に

 - == でtrue
 - equalsでfalse

になるケースはあまり馴染みが無いと思う。

今回はその件に付いて検証。

環境:
Java1.8
Eclipse Neon.1

# 問題のソース
```java:
	@org.junit.Test
	public void test() {
		boolean b1 = 1 == 1.0;
		
		Integer i2 = 1;
		boolean b2 = i2==1.0;        //true
		boolean b3 = i2.equals(1.0); //false

		System.out.println(b2);
		System.out.println(b3);
		
		
	}
```



# 解説

double型の 1.0 をDouble型にauto boxingするためにDouble#valueOfが呼ばれます。

```java:auto-boxing
    public static Double valueOf(double d) {
        return new Double(d);
    }
```

Double型に変換された1.0とInteger型の1とのequalsを使った比較になるのでfalseになります。

```java:Integer.equals()
    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
```



# auto boxingには気をつけましょう。

auto boxing に関してはJava Puzzleでも同様の問題が出題されています。

https://www.youtube.com/watch?v=V1vQf4qyMXg&t=11m19s

>auto boxing can give you what we call the surprise left jab 

by Joshua Bloch
Cognosでレポート実行エラーに出くわした時に最後にやって欲しい事

##前ふり
最近経験したトラブルです。

あるプロジェクトで、Cognos BIがダンプを吐いてファイルシステムフルで止まってしまった後に、Cognos BIプロセスを再起動しても、OSレベルで再起動しても、レポート実行時に以下のメッセージが出てしまい、回復できない状態になりました。
Cognos Connectionの接続は普通にできる、データソースへの接続テストも問題なし、なのにレポートの実行はエラーになる、という感じです。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f846a7ea-02ba-e4cf-84b2-1978d6cecfd0.png)

OS再起動しても直らないと焦りますよね。

もはや製品のインストールパスのファイルが壊れたのだろうと、再導入も覚悟しましたが、以下の対応をやって問題を解消できました。
同じ様に、いわゆるレポート実行できない状態に陥って、OSの再起動やっても直らない、再インストールしか無いのか、と覚悟するような場面に遭遇したら、この記事を思い出してください。

##解決策
Cognosのレポート実行時には、\<CognosInstall>/temp フォルダと \<CognosInstall>/data フォルダ配下に、レポート実行のために色々なファイルを生成し、一時的なものも生成されれば、恒久的なものも生成されます。

このフォルダ配下のものは、レポート実行の機能に関わるものが多いので、これらのファイルが壊れてしまうと、レポートが実行できなくなります。
しかしながら、以下に関しては、削除してしまっても、Cognos起動時に新規に作成されてくるので、こういう時には、一か八かで思いきって消してしまいましょう。

**\<CognosInstall>/temp フォルダ配下の全フォルダ・ファイル**
※cbs.prefsファイルを削除すると、Cognosが起動できなくなったという事例がある様なので、念のためにコピーしておきましょう。
※以下のTechnoteによると、cbs.prefsの削除が問題となるのは、Tomcat/Oracle Sun JRE環境でのみ発生するとの事です。
https://www.ibm.com/support/pages/temp%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E4%B8%8B%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4%E5%BE%8C%E3%80%81cognos-10%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%AA%E3%81%84


**\<CognosInstall>/data/mfw4j/PMCs フォルダ配下の全フォルダ・ファイル**
※一応、配下のフォルダ・ファイルはコピーしてから、全消ししてしまいましょう。

この結果、今回のレポート実行できない問題は解消しました。
このメッセージに限らず、他のレポート実行できない状態でも効く可能性はあると思います。
もちろん、壊れどころによりますが、どうせCognosを入れ直さなくてはいけなくなるのであれば、最後の望みをかけてやってみましょう。
find_byはRangeが扱えない

RailsのActiveRecordsで、
Hogeテーブルっていうのがあって

| id | type | name |
|:---|:----:|:----:|
| 1  | 1 | aaa |
| 2  | 6 | bbb |
| 3  | 9 | pero |
| 4  | 12 | moga |
| 5  | 40 | ccc |

みたいなデータが入っていたとする。

見つからないときにraiseしたかったので `find_by!` を使いたいというときに

```
hoge = Hoge.find_by!(type: 1..10, name: 'pero')
```

ってやると、
期待してるデータがあるはず（id: 3）なのに見つからなくてraiseしてしまう。

```
Hoge.find_by(type: 1..10)
```

これがnilを返してしまうためっぽい。


# Arrayならいける

RangeをArrayにすれば解決

```
hoge = Hoge.find_by!(type: [*1..10], name: 'pero')
```

期待してるレコードを取得できた。
ADLとusingではどっちが優先されるか調べてみた

ADLに関して、優先度がどれくらい高いのか実際にコードを書いてみました。
ネットを探せば答えがありそう(というかwikiに答えが載ってました)ですが、自学のためにもコーディング・・・。
なお、ADLとはなんぞや？については[参考](#参考)をみてください。

## コード
結論的にはこれなんですが。。。

```C++
namespace hoge{

	struct X{
		int a[100];
	};

	int * begin(X& x) { 
		std::cout << "hoge::begin()" << std::endl;
		return x.a;
	}
	int * end(X& x) { return x.a+100; }
	
}

template < typename Container >
void f(Container && c)
{
	using std::begin;
	using std::end;

	auto iter = begin(c);
	auto enda = end(c);
}


int main(int argc, char* argv[])
{

	std::vector<int> v = { 1, 2, 3, 5 };
	std::cout << "vector" << std::endl;
	f(v);

	 
	int ar[] = { 1, 2, 3, 5 };
	std::cout << "array" << std::endl;
	f(ar);


	hoge::X  a;
	std::cout << "namespace hoge" << std::endl;
	f(a);
	
	return 0;
}
```

結果

```
vector
array
namespace hoge
hoge::begin()
```

て具合でhoge名前空間内のbeginが呼ばれてます。
つまり上記コードの関数fは、

* std名前空間で定義されているコンテナはstd::begin、std::endを使い、
* 配列のときもstd::begin、std::endを使い、
* 任意名前空間で定義したbegin、endがあれば、それを使う。
というテンプレート関数になります。

なので当然、関数f内の

```C++
	using std::begin;
	using std::end;
```
を削除すると、int ar[]が引数のときにbegin/endの未定義でエラーですし、

```C++
	auto iter = std::begin(c);
	auto enda = std::end(c);
```
と書くと、任意名前空間で定義したbegin、endは呼ばれなくなります。


## まとめ
**using で定義するよりもADLが優先される。**

## 参考
* [実引数依存の名前探索 - Wikipedia](https://ja.wikipedia.org/wiki/%E5%AE%9F%E5%BC%95%E6%95%B0%E4%BE%9D%E5%AD%98%E3%81%AE%E5%90%8D%E5%89%8D%E6%8E%A2%E7%B4%A2)
* [C++標準化委員会の文書集、2015-04 pre-Lenexa mailingsのレビュー: N4381-N4389 - 本の虫](https://cpplover.blogspot.jp/2015/05/c2015-04-pre-lenexa-mailings-n4381-n4389.html)
* [std::beginとstd::endの使い方 - Faith and Brave - C++で遊ぼう](http://faithandbrave.hateblo.jp/entry/2015/01/27/141738)
* [ADLのトンデモ挙動と対策のお話 - Qiita](http://qiita.com/rinse_/items/ba23a152a3e9ddd8f8c8)
Laravel 5.1 Seeder における DB::table()->truncate v.s. updateOrCreate 

どちらが良いのだろうか。

どちらも冪等性が保証される

# DB::table('table')->truncate ()

```php:CategoryTableSeeder.php
// 外部キー制約を一時的に無効にする
DB::statement('SET FOREIGN_KEY_CHECKS=0;');

DB::table('categories')->truncate();

$category = [
    'id' => 1,
    'name' => 'IT',
];

DB::table('categories')->insert($category);

DB::statement('SET FOREIGN_KEY_CHECKS=1;');
```

- こっちの方が多数派？
- 一時的にデータが消えるので、一瞬エラーは出そう

# updateOrCreate

```php:CategoryTableSeeder.php
$category = [
    'id' => 1,
    'name' => 'IT',
];
Category::updateOrCreate(['id' => $attributes['id']], $attributes);
```

- 一時的に消さなくて良い
- モデルに `$fillable` を設定する必要がある
- 多分性能（処理速度）は悪い
Vuexでasync/awaitを使いたい時の書き方

Vuexのactionでasync/awaitを使いたい時の書き方です。

■■■修正前■■■

```js:sample.js
import axios from 'axios'

export default {
  [FETCH_DATA] ({ commit }) {
    axios.get('/api/data1').then((response1) => {
      axios.get(`/api/data2?${response1.id}`).then((response2) => {
        commit(FETCH_DATA, response2.data)
      }).catch((error) => {
        console.log(error)
      })
    }).catch((error) => {
      console.log(error)
    })
  }
}
```

■■■修正後■■■

```js:sample.js
import axios from 'axios'

export default {
  [FETCH_DATA]: async ({ commit }) => {
    const response1 = await axios.get('/api/data1').catch((error) => {
      console.log(error)
    })
    const response2 = await axios.get(`/api/data2?${response1.id}`).catch((error) => {
      console.log(error)
    })
    commit(FETCH_DATA, response2.data)
  }
}
```

■■■1/12追記■■■
こっちの方が綺麗な書き方かも

```js
async [FETCH_DATA]({ commit }) {
・・・
}
```
レストラン「デメテルの法則」

# 例

## 第一日

とあるレストランを訪れたお客さん。

メニューにはこう書かれています。
「シェフと料理をお選びください」

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/e275086c-aad8-4f2b-9c9b-92cd2421ae35.png)

お客さんは、シェフのアリスにカレーを注文しました。

```rb
Restaurant.alice.curry

# => Yes sir! I cooked curry.
```

「これは、うまい！」
無事満腹になりました。


## 第二日目

あまりの美味しさに、今日も同じレストランを訪れたお客さん。
今度はボブにカレーを注文しました。

```rb
Restaurant.bob.curry

# => CookingError: I could not cook curry!
```

よく分かりませんが、ボブはカレーを作れないようです。
（そんなシェフがいる？ あとで聞いた話によると、ボブは慢性的カレー粉アレルギーということです）

仕方がないので、ステーキを注文することにしました。

```rb
Restaurant.bob.stake

# => Yes sir! I cooked stake.
```

カレーは食べられなかったもの、無事満腹になりました。
(ボブはカレーを作れない。じゃあ何故、シェフを選ばせるんだろう？)


## 第三日目

レストランのメニューが変わっていました。
今日からは、料理だけを選べば良いみたいです。


![image](https://qiita-image-store.s3.amazonaws.com/0/89618/65db2604-2587-847d-3b58-4993c5cf757e.png)

今日はお腹が空いているので、カレーとステーキの両方を注文しました。

```rb
Restraunt.curry 
# => Yes sir! I cooked curry.
```

```rb
Restraunt.stake
# => Yes sir! I cooked stake.
```

やったね！ どちらも美味しくいただきました。

厨房ではアリスがカレーを、ボブがステーキを作ってくれたみたいですが、お客さんはシェフまで選ぶ必要はありません。
（今後はキャロルやデイブがシェフとして雇われて、カレーやステーキを作るようになるかもしれません）

## エピローグ

こうやってお客さんもアリスもボブも幸せに暮らし、レストランも永遠に繁盛しましたとさ。

めでたしめでたし。


# コード例

## カレーを作れるアリス

```rb
class Alice
  def self.curry
    puts 'Yes sir! I cooked curry.'
  end
end
```

## ステーキを作れるボブ

```rb
class Bob
  def self.stake
    puts 'Yes sir! I cooked stake.'
  end
end
```

## 不親切なレストラン ( before )

```rb
class Restaurant
  def self.alice
    Alice
  end

  def self.bob
    Bob
  end
end
```

## 親切なレストラン ( after )

```rb
class Restaurant
  def self.curry
    Alice.curry
  end

  def self.stake
    Bob.stake
  end
end
```

# 備考

- ツッコミあれば教えてください。

# 環境

- ruby 2.4.0








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【手順】帯域制御方法（Windows7, QoSポリシー）

# QoSとは
QoS＝Quality of Service
機器やシステムが提供するサービスの品質の水準のこと。
ネットワーク関係だと、スイッチやファイアーウォールの機能でQoSが定められていることがあります。
この場合のQoSとは、通信品質のことを指します。
つまり、ほかの通信に影響がでないような機能（シェービング機能）等を、持っているかどうかです。
今回は、Windows7から新しく追加されたポリシーベースのQoSで帯域制御をしてみます。


# できること
- 出力方向の帯域を任意に制限できる（※厳密に制御はできません。。。）
- 適用対象を任意に指定できる（アプリ、プロトコル、IP、ポートなど）


# やること
リモートデスクトップ接続先のサーバーで帯域制御を行い、リモートデスクトップ接続し操作性が帯域制御前とどのくらい変わるのか調査する。


# 前提
- OS（ローカルPC）　　：　Windows7
- OS（接続先サーバー）：　Windows Server 2012 R2


# 手順
#### 帯域制御前の操作性確認！
1.接続先サーバーに接続

2.操作性確認
> 適当に操作して、タイムラグがないこと、ストレスなく操作できていることを確認！



### 【接続先サーバー内での操作】
1.gpedit.mscを実行し、ローカルポリシーグループエディターを開く
> ```Windowsキー + Rキー```→```gpedit.msc```入力→[OK]
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/168635/db493e4c-5bb1-7b69-05e5-6e3acc3560e6.jpeg)


2.新しいQoSポリシーの作成
> [Windowsの設定]→[ポリシーベースのQoS]→右クリックし、[新規ポリシーの作成]
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/168635/120af8d6-28f6-6ed2-98fb-3e00786b8582.jpeg)


3.ポリシー名作成、出力先への帯域制御を設定
> 任意の[ポリシー名]を入力、[出力方向のスロットル率を指定する]にチェック→任意の[スロットル率]入力→[次へ]押下。
> 今回は50KBpsで設定！
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/76932e7a-b785-ea44-6e71-5d9a5229e8a7.jpeg)



4.適用アプリケーションの指定
> ポリシーを適用するアプリケーションを指定し、[次へ]

5.発信元と、宛先IPの指定
> 帯域制御する発信元と、宛先IPアドレスを指定し、[次へ]

6.適用プロトコルと適用ポートの指定
> 適用プロトコルと適用ポートを指定し、[完了]

7.作成されたことを確認


### 【ローカルPC内での操作】
1.接続先サーバーに接続
※接続方法は省略（ただし、RDPの詳細設定で多少パフォーマンスは変わります！）

2.パフォーマンスチェック
> タスクバーで右クリック→[タスクマネージャー]→[パフォーマンス]タブ→[イーサネット]
> 使用帯域を数値で確認できます。
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/3e68eb20-30ad-bf3b-0064-d380d92a31f9.jpeg)


3.適当に操作して、操作性の確認！！
> 思いファイルを開いたり閉じたり、エクスプローラーをドラッグして激しく動かして操作性を確認！
> 帯域制御前に比べると、多少タイムラグがありストレス感じました！
> **しかし、制御した帯域以上も出ているので、設定した数字を厳密に体現することはできないようです。。。。**


# まとめ
帯域制御したいときは、スイッチでしっかりやりましょう！！
Sparkで配列型のデータを加工する備忘録


もっと綺麗に書けたので、記事を書き直しました
---

→[新しい記事](http://qiita.com/RyujiKawazoe/items/bd051f551cc3776c4cd3)

idだけを格納した配列があり、それをSpark上でidからvalueを引っ張ってきて、「：」でつなげる処理をしたかった。

具体的なイメージとしては

```
[1, 3, 5, 7]
```

といったデータを以下の形式に変更したかった。

```
りんご：もも：バナナ：パイナップル
```


環境
---

* spark(2.0.0)
* scala(2.11.5)

やったこと
---

* flatMapValuesで配列を展開
* 商品が載っているRDDを外部結合
* groupByKeyでキーごとに値をまとめる


具体例
---

* ユーザー購入データ

| user_id | buy_list |
| --- | --- |
| 1 | [1, 2, 3] |
| 2 | [2, 4] |

* 商品データ

| product_id | product_name |
| --- | --- |
| 1 | りんご |
| 2 | バナナ |
| 3 | レモン |
| 4 | みかん |


商品データをRDDに

~~~~
    val productRDD = productDF
      .select("product_id","product_name")
      .rdd
      .map(x => {
      	// tupleの一番目はidに！
        (x.getString(0), x.getString(1))
      })
      
~~~~

ユーザー購入データをRDDにして、商品データを外部結合

~~~~
    /**
      * 経由駅を連結して表示するため、分解
      */
    val userBuylistRDD = userBuylistRDD.select("user_id", "buy_list").rdd.map(x => {
      val id = x.getString(0)
      val codes = x.getSeq[String](1)
      (id, codes)
    }).flatMapValues(x => x) // ここで平坦にしているよ
      .map(x => (x._2, x._1))　// 外部結合するために、商品IDをtupleの一番目の引数にしているよ
      .leftOuterJoin(stationRDDCodeAndName)
      .map(x => {
      
        // なんか適当な処理
      })
      
~~~~

この時点で以下のようなデータ構造となっている

| user_id | buy_list |
| --- | --- |
| 1 |  りんご|
| 1 |  レモン|
| 1 |  バナナ|
| 2 |  バナナ|
| 2 |  みかん|

この後にgroupByKeyを使ってキーごとに値をまとめる作業をすれば、当初目的としていた「：」でつなげる処理が完成する

```
    val userBuylistRDD = userBuylistRDD.select("user_id", "buy_list").rdd.map(x => {
      val id = x.getString(0)
      val codes = x.getSeq[String](1)
      (id, codes)
    }).flatMapValues(x => x) // ここで平坦にしているよ
      .map(x => (x._2, x._1))　// 外部結合するために、商品IDをtupleの一番目の引数にしているよ
      .leftOuterJoin(stationRDDCodeAndName)
      .map(x => {
      		//さっきのところを具体的に。
        (x._2._1, x._2._2.getOrElse(""))
      }).groupByKey().map(x => (x._1, x._2.mkString(":")))
```

んでこれは最終的に以下のようなデータになる

| user_id | buy_list |
| --- | --- |
| 1 |  りんご：レモン：バナナ|
| 2 |  バナナ：みかん|



注意
---

groupByKeyでまとめる時に配列の順番は変わってるっぽい。
順番を重視するデータならば、少し違ったやり方が必要かも？
Rubyのloadの優先順位について


capistranoでdeploy.rbのディレクトリ名を`capistrano/deploy.rb`に配置したら、deploy.rbが読まれないという事件に遭遇しました。　
ディレクトリの構造的にはこんな感じ

```
$ tree
.
├── Capfile
├── Gemfile
├── Gemfile.lock
└── capistrano
    ├── deploy
    │   ├── production.rb
    │   └── staging.rb
    └── deploy.rb
```
　　　　
原因は`capistrano`というディレクトリ名が悪かったのですが、なぜcapistranoというディレクトリ名が悪いのか？
気になったので調べてみました。


## capistranoのdeploy.rbについて調べてみた

capistranoのdeploy.rbのディレクトリ名を変更する場合に、Capfileで`deploy_config_path`で変更したパスを指定すればいいのだと思います。  
例えば`cap/deploy.rb`というディレクトリ名にした場合には

``` Capfile
set :deploy_config_path, 'cap/deploy.rb'
```

と指定します。

では`deploy_config_path`は一体どのように使われているのでしょうか？
Githubのcapistranoのリポジトリで検索してみると[https://git.io/vy2L3](https://git.io/vy2L3)ここで使われていることがわかります。  
つまりloadを使ってdeploy.rbが読み込まれているわけです。  

## loadについて調べてみた

`load`はどのように読み込むファイルを決めているのか？
答えは大体ここに書かれていました。

[Rubyのロード機構について](http://48n.jp/blog/2016/07/19/ruby-load/)

しかしここを読んだ時に一つだけ疑問に思いました。  
ロードパスの優先順位はどうなっているのだろうか？

これに関しては検証用のコードを用意してみました。

https://github.com/polidog/ruby-loadtest


実験結果からロードの順番は

- `$LOAD_PATH`の上から順にロードされていく。
- `$LOAD_PATH`の中からファイルがロードされない場合は、実行しているディレクトリ以下からロードする。

ってことだと思います。(間違ってたら指摘してください）

ということでやはり`capistrano`というディレクトリ名だと[capistrano本体のdeploy.rb](https://git.io/vy2tK) がロードされてしまうためダメみたいです。
[Visual Studio Code][Linux][xdotool] タスク/コマンドラインから画面の切り替えなしで別のアプリケーションに特定キー入力を送る 

編集はVSCodeでやってるんですが、クロスビルドとリモートデバック実行のためだけに、Eclipse（の派生IDE）で実行を行わないといけなかったので、VSCodeからウィンドウを切り替えないで実行できないか調べました。

Linux環境では `xdotool` というものを使えばコマンドラインから別のアプリケーションにキー入力を送れたので実現できました。

# tasks.json 設定例

```json:tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "0.1.0",
    "command": "sh",
    "args": [
        "-c"
    ],
    "isShellCommand": true,
    "showOutput": "always",
    "tasks": [
        {
            // need 'apt-get install xdotool'
            "taskName": "Test",
            "isTestCommand": true,
            "suppressTaskName": true,
            "args": [
                "xdotool search --name 'Eclipse' windowfocus --sync %1 key 'ctrl+F11' && xdotool search --name 'Visual Studio Code' windowactivate --sync %1"
            ]
        }
    ]
}
```

# 解説

実行には `xdotool` が必要です。おそらくX11環境下では使えるんじゃないかと思います。（確認はUbuntuのUnity環境下のみ）

```bash:apt
sudo apt-get install xdotool
```

上記のタスクでは以下の２つのコマンドを実行しています。

```bash:eclipseにctrl+F11を送信後、フォーカスをVSCodeに戻す
$ xdotool search --name 'Eclipse' windowfocus --sync %1 key 'ctrl+F11'
$ xdotool search --name 'Visual Studio Code' windowactivate --sync %1
```

`--name` のところは、指定した文字列がウィンドウタイトルに含まれていれば良いです。
１つ目のコマンド実行後にフォーカスが移ってしまっているので、２つ目のコマンドでもとに戻しています。
（VSCodeを２つ立ち上げてると誤動作するかもです（未確認））

# 参考
[Ubuntu Manpage: xdotool - command-line X11 automation tool](http://manpages.ubuntu.com/manpages/trusty/man1/xdotool.1.html)
[音声と xdotool でキーボードとマウスのアクションをトリガーする](https://www.ibm.com/developerworks/jp/xml/library/x-xdotool/)
[xdotoolでシェルからブラウザをリロードするワンライナー - Qiita](http://qiita.com/yuiseki/items/5df55dd12b9312b66034)
[x11 - How to send keystrokes (F5) from terminal to a process? - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/87831/how-to-send-keystrokes-f5-from-terminal-to-a-process)
[Eclipseショートカットキー Mac & Windows 対応表 - CODESCRIBBLE](http://hutyao.hatenablog.com/entry/eclipse-shortcutkey)
htmlやJSのコーディングをする際に役立つサイト

#初めに
※過去の投稿を編集したものです。
ここ最近のフロントエンドの成長速度は計り知れない。
まだまだ若輩者の私ですら選択肢は多く、やりたいことをやれる。そんな言語がたくさん存在する。
それら様々なフレームワークなり言語なり(JQuery?なんだそれは)使うにあたってよく見るな～と感じたサイトやページをまとめる。

##Google先生
ブラウザはIEや火狐でもエンジンはGoogleなんてことは世界中で散見されるだろう。

最近、サーバ等まったく意識せずに個人用サイトを作れるようになったらしい。
ggrksは最早あいさつだ。

###Google ColorPicker
---
カラーピッカー。
カラーコード知りたいときにはこれ。
~~とあるゲームの防具の色を自分好みに変えたことがあるなら不要かもしれない。~~

エディタに搭載されている場合もあるのでその時は折り合いをつけよう。

CSS(もちろん素のCSSではない)で「whiteやred、blueなど、デフォルト以外の色を使いたい！」「自分は群青色以外認めない」と思ったことがありませんか？私はあります。

###WEB色見本 原色大辞典
---
名の通りWEBで使用できる色がカラーコードとセットでズラっとならんでいる。
一目で目星が付けることができ、コピペでホイホイ色を変えることができる。

GoogleColorPickerは優れたカラーピッカーだが、「〇〇色が欲しい！」！といった特定の色のイメージがあるのならここがおすすめ。

原色大辞典と書いてあるが、他にも「和色」「洋色」「メトロ」「モノトーン」「ビビッド」「パステルカラー」「web216」なるカテゴリーがある。

「メトロ」は地下鉄のシンボルカラーらしいので好きな人は好きかもしれない。

[リンクはこちら](https://www.colordic.org/m/)

###Google翻訳
---
英語は言わずもがなほぼ万国共通であるので、おすすめしなくても使うことになる。


###JavaScript　Samples
---
自分がJSを勉強し始めたころから使わせてもらっている、フリーのサンプルコードを多数提供してくれるサイト。
デモのページとコードがそのままあるので、書けなくてもコピペでなんとかなる。
JSのコード、JSがどういったものかの説明だけでなくHTMLリファレンスやスタイルシートについて、果てはPHPのことまで書いてある。
自分でサーバ建ててWebサイト運営したいって人にとってかなりの助力になる。
その他、ページのデザインについてのアドバイスもある。センスが皆無な私も安心だった。

[リンクはこちら](http://javascript.eweb-design.com/)

###HTMLクイックリファレンス
---
タグ名をド忘れしたり、記事とかでみた関数なんかを調べたい時にオススメ。
HTMLのタグはもちろんHTML5やCSSプロパティ、CSS3リファレンスも解説されている。
HTMLとCSSの基本についてもかいてあるしJavaScriptのこともちょこっとだけ書いてある。
これから、又はいつかこれらを勉強したいと思った人にオススメしたい。

[リンクはこちら](http://www.htmq.com/)

###Qiita
---
知らないならどうやってこの記事を見ているのか。

バグが出て困った、解決策がわからない、なんて時に特にお世話になる。
環境が多少違ってもしっかり解説してあり何回助けられたことか…。

他にも「〇〇のインストール」みたいな導入の部分でもお世話になることがある。

###企業さんが出している記事
---
調べものをしていると自然にたどり着く、中の人がブログとして掲載しているもの。
初心者にもわかりやすく解説してくれている。
個人的には「各フレームワークの特徴」「人気のあるエディタ」みたいな記事をよく見ていたので始める前の足掛かりとして出会うことになるかもしれない。


##まとめ
Webサイトで集められる情報は無料で手っ取り早いけど人によって開発環境やバグの発生状況が違ったりして結局よくわからずじまいとなることがままある。
根本的なところからやりたいってことなら本を買ったほうがいいと思います。
そうでなくても一冊くらいは持っておいて損はしません。漬物石になっちゃってもいいやくらいの気持ちで買っちゃいましょう。
力尽きたのでこの辺で。いいコーディング生活を！
ムームードメインで、独自ドメインのサブドメインを別サーバに割り当てる

独自ドメインのサブドメインだけ別のサーバーにしたい、という場合のムームードメインの設定です。
ドメインが`example.com`、サーバー1のIPアドレスが`xxx.xxx.xxx.xxx`、サーバー2のIPアドレスが`yyy.yyy.yyy.yyy`という想定です。

## ムームーDNSを利用する
サイドバーから、「ドメイン管理」→「ドメイン操作」→「ネームサーバ設定変更」へ移動。
任意のドメインの「ネームサーバ設定変更」をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/51938/ba791af4-a139-7512-d41a-f5f4e2e8d9f8.png)

「ムームードメインのネームサーバ(ムームーＤＮＳ)を使用する」にチェックを入れ、設定を保存します。

![image](https://qiita-image-store.s3.amazonaws.com/0/51938/45d9c063-e879-7706-4d24-e91683ab1b09.png)


## ムームーDNSを設定する
サイドバーから、「ドメイン管理」→「ドメイン操作」→「ムームーDNS」へ移動。
任意のドメインの「変更」をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/51938/351b71dd-9446-d628-6005-35d2b1ae89e6.png)

「設定2」のカスタム設定のところを編集して、保存します。

![image](https://qiita-image-store.s3.amazonaws.com/0/51938/1d8fbacb-8d2d-2b30-bd3e-1670807200ac.png)

ちなみに上記の画像は以下のような意味です。

1. `http://example.com`にアクセスすると、サーバー1に転送される。
2. `http://www.example.com`にアクセスすると、`http://example.com`にリダイレクトされる。
3. `http://sub1.example.com`にアクセスすると、サーバー1に転送される。
4. `http://sub2.example.com`にアクセスすると、サーバー2に転送される。


## あとはサーバの設定
* `http://example.com`にアクセスがあった場合は`/var/www/html/main`の内容を表示
* `http://sub1.example.com`にアクセスがあった場合は`/var/www/html/sub1`の内容を表示

というような設定はサーバ側でおこないます。いい感じに設定しましょう🙌

ムームードメインだからこう、というわけではなく、他のドメインサービスでも、自社のDNSを使えるところは似たような感じだと思います。
セクション分岐を見やすくしよう

## はじめに
セクションが分かれたTableViewを作成する時、
セクションのタイトルを返す `titleForHeaderInSection`
セクションの数を返す `numberOfSections`
等を使って実装します。
一方でセルの中身は、`cellForRowAt`
セルの数は`numberOfRowsInSection`
を1セクションのときと同じように実装しますが、複数セクションになると「1セクション目のときはセル5個、2セクション目のときはセル10個」、「1セクション目のときはセルの中身はhoge、2セクション目のときはセルの中身はfuga」といった分岐が必要になります。

そのまま書くならこうです。

```swift:ifelseで分岐
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if section == 0 { // 1セクション目のとき
        return animalItems.count
    } else if section == 1 { // 2セクション目のとき
        return foodItems.count
    } else {
            return 0
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         
   let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath)        
   if indexPath.section == 0 { // 1セクション目のとき
       cell.textLabel?.text = "\(animalItems[indexPath.row])"
   } else if indexPath.section == 1 { // 2セクション目のとき
       cell.textLabel?.text = "\(foodItems[indexPath.row])"
   }
   return cell
}
```

TableViewのセクション数が今回のように2個程度であれば問題ないですが、これが3,4,5・・・個のように増えていくとif elseの分岐が続いて可読性が低くなります。
この可読性の劣化を防ぐため、enum,switchを使ってセクション分岐をする方法をご紹介します。


## step.1 セクション用のenumを定義
タイトルの通りセクション用のenumを定義します。

```swift:セクション用のenumを定義
fileprivate enum Section: Int {
    case animal
    case food

    // これがセクション数になる     
    static var count: Int { return Section.food.rawValue + 1 }
}

```

## step.2 enumを使って分岐
step.1で定義したenumを使って、セクションの分岐を行います。

```swift:enumを使ってnumberOfRowsInSectionを返す
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    
    guard let section = Section(rawValue: section) else { return 0 }

    switch section {
    case .animal:
        return 5 
    case .food:
        return 10
    }
}
```

```swift:enumを使ってcellForRowAtを返す
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    guard let section = Section(rawValue: section) else { return UITableViewCell() }
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath)

    switch section {
    case .animal:
        cell.textLabel?.text = "\(animalItems[indexPath.row])"
    case .food:
        cell.textLabel?.text = "\(foodItems[indexPath.row])"
    }
    return cell
}
```

```swift:セクション数も返せます(おまけ)
func numberOfSections(in tableView: UITableView) -> Int {
    return Section.count
}
```

見比べるとどうでしょうか？
if elseで分岐を行った場合に比べ、何を表示するセクションなのかが分かる状態で分岐されるため、可読性が良くなりますね！
Elasticsearchのデータ移行ツールesigrateを試した

# 課題

運用中のサービスでElasticsearchを使っているのだけれど、基本的にRead onlyで、特定のタイミングでしか更新していません。開発環境と本番環境で同様のデータを使うのですが、Elasticsearchのindexの再構築は`rake task`に定義しており、それぞれの環境で実行していましたが、データ量がそこそこ多いせいもあるけれど、これがまた遅い！時間がかかって仕方がない。

そこで、マスタ環境からバックアップを取って、それぞれの環境にリストアできれば高速にできそうだしよさそう！と思ってバックアップの取得方法を調べたのだけれど、なさそうでした（使っているのはHerokuのアドオンのSearchboxのため）

# 調査

Searchboxを提供しているSearchlyのフォーラムに、以下の投稿がありました。

[How to backup and dowload the backup?](http://support.searchly.com/customer/portal/questions/9838978-how-to-backup-and-dowload-the-backup-)

2014年の情報ではあるのだけれど、「バックアップをDLする方法はない。esigrateを使ってSearchlyからlocalhostにマイグレートしなさい」と書かれています。

[esigrate](https://github.com/searchly/esigrate)、初めて知りました！！

# esigrateとは？

Searchlyが開発しているElasticsearchのマイグレーションツールです。

srcで指定したElasticsearchのURLとindexのデータを、destで指定したElasticsearchのURLとindexにコピーしてくれます。バックアップファイルなどの中間ファイルは生成されず、そのままコピーされる感じです。

closureで作られているようなので、環境変数に`JAVA_HOME`を設定しておく必要があるようです。

## インストール

https://github.com/searchly/esigrate/releases

上記のURLから、最新版をダウンロードします。私の場合は`esigrate-0.2.1.tar`でした。

解凍し、そのディレクトリに移動し、以下のコマンドを実行します。

```bash
bin/launcher.sh start
```

以下のようになったら起動完了です。

```
Starting esigrate...
Waiting for esigrate...
.
.
.
.
.
.
running: PID:19606
```

## 使い方

README.mdに書いてあるのですが、そのままです。curlでアクセスしてみます。

```bash
curl -XPOST http://localhost:9090/migration -d '{
        "id" :"001",
        "src": {
            "url":   "http://localhost:9200/",
            "index" :"index1"
        },
        "dest" :        {
            "url":   "http://newhost:9200/",
            "index": "index2"
        }
    }'
```

idは、依頼が完了したかどうかを確認するために利用します。
srcはデータの移行元の情報です。
destはデータの移行先の情報です。

HerokuのSearchboxからローカルのElasticsearchにデータを移行する場合は、こんな感じで書きます。

```bash
curl -XPOST http://localhost:9090/migration -d '{
                                       "id" :"001",
                                       "src": {
                                           "url":   "https://paas:XXXXXXXXXXXXXXXXXXXXX@XXXXX-us-east-1.searchly.com/",
                                           "index" :"index_production"
                                       },
                                       "dest" :        {
                                           "url":   "http://localhost:9200/",
                                           "index": "index_development"
                                       }
                                   }'

```

あとは待つだけです。処理が終了したかどうかチェックする場合は、指定したidを使って問い合わせます。

```bash
curl http://localhost:9090/migration/001
```

`[:response "running"]`が返ってきたら、まだ移行中。
`[:response "stopped"]`が返ってきたら、処理完了です。

## 結果

ローカルでrake taskを流して行うElasticsearchのindexの再構築には20分近くかかっていたのですが、esigrateでデータの移行をしてみたところ、約10分程度で終わりました。ちなみにデータ量は約400MBくらい。

めっちゃ速いってことはないですが、それでも断然速い！！

# まとめ

バックアップを手元に残そうと思えば、一旦コピーしてからローカルのElasticsearchでバックアップを取ることもできるし、落としどころとしてはまぁまぁいいんじゃないかなと思います。
Swift3 - UIImageをFacebookとTwitterにシェアするぜ！

# 環境

・Swift3
・Xcode8
・Sierra 10.12.3
・Socialフレームワーク

# 概要

９５%コピペで実装が出来ますが、それなりにSwiftが読めるという前提のもと書いていますので説明不足かもしれません、ご了承ください。

# 実装

1`import Social `します

2 `@IBAction`でButtonを生成します

3 `@IBAction`の中に下記のコードを入力します



```swift
 
        //Tweet用のViewを作成する
        let twitterPostView:SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeTwitter)!
        
        let tweetDescription1:String = "アプリだぜ！"
        let tweetDescription2:String = "ツイッターにシェアするぜ！"
        let tweetURL:NSURL = NSURL(string: "https://itunes.apple.com/jp/developer/masaki-horimoto/id1018825942")!
        
        //Tweetする文章を設定する
        twitterPostView.setInitialText("\(tweetDescription1)\n\(tweetDescription2)")
        
        //Tweetに添付するURLを設定する
        twitterPostView.add(tweetURL as URL!)
        
        //起動時にキャプチャしたスクリーンショットを添付する
        twitterPostView.add("ここにUIImageが入った変数を入れてくださいダブルクオーテーションはいりません")
        
        //上述の内容を反映したTweet画面を表示する
        self.present(twitterPostView, animated: true, completion: nil)
```

# 解説


これはTwitterバージョンですが、`SLServiceTypeTwitter`を`SLServiceTypeFacebook`にすれば、いとも簡単にFacebookに投稿出来ます。便利な世の中ですね。ちなみに`SLServiceTypeInstagram`とやってみれば動きませんでした、残念。LinkedInも動かない、残念ですぎる。TencentWeiboは動いたよ●´・ω・)(・ω・｀●

# 多重投稿

[Github Gist](https://gist.github.com/Ryosuke-Hujisawa/e29f5745443d7479e7e57c78848b1ace)

[自分のブログ](http://off.tokyo/blog/2017/03/09/swift3-uiimage-facebook/)
【iOS】課金アイテムが承認済なのに承認されてない

# 何が起きたのか
アプリと商品の審査が通過して、TestFlightから落としたアプリで新商品の購入チェックもして、ドキドキしながら公開ボタンを押しました。
数十分後、ストアにアプリが並び始めたので、改めて新商品のチェック。
しかし、なんということでしょう。新商品が参照できなくてアプリが落ちたのです。

な、何を言っているのか状態ですが、私にも何が起こっているかわからなかった。

iTunesConnect上では「承認済み」の表示になってるし、配信可否も「配信可能」になっている。
なのにStoreKitの処理を通すと無効な商品として参照できなくなっているのです！

えええええええ＼(^o^)／何その罠ああああああああ

テストアプリでは承認前の商品も購入できるので、全く気が付きませんでした。。。


# 解決策
数時間〜1日待ったら解消しました。

審査通過直後には公開せず、1日くらい寝かせたほうがいいのかもしれない。（？）
更に言えば、API等で新商品の公開/非公開の制御をできるようにしておいたほうがいいのかも。

最近こういうの多い気がするなぁ…