OmniAICreator/Qiita-1.07M huggingface dataset:
【cocos2d-x】 libcocos2d を Static Library化した後元に戻した話

#概要
- cocos2d-xの膨大なライブラリを静的ライブラリ化していた
- http://discuss.cocos2d-x.org/t/how-to-speed-up-cocos2d-x-build-with-prebuilt-lib/23402
    - ビルド早くなったと喜んでいた
- cocos2d-xのコードのデバッグをしたくなった
    - 出来なくて泣いた
- cocos2d_libs.xcodeproj は残してあったけど、Target消してしまった
- 元に戻したくなった

#手順
- cocos new などで新しい cocos2dx プロジェクト作成
- そのプロジェクトの cocos2d_libs.xcodeproj を持ってきて戻したいプロジェクトに追加
    - 既存の cocos2d_libs.xcodeprojは削除 or 退避
- 静的ライブラリ化した libcocos2d iOS.a も 削除 or 退避
- 終わり
RailsでSqlite3を使う時

Railsで

```cl
rails generate scaffold hogehoge
```

とかした後に　あぁ〜　やっぱ消そうと思い、`git checkout .`しました。

後から

```cl
rails destroy scaffold hogehoge
```
で解決することをしった僕ですが、そんな知識無かった為、gitのコマンドを打った後に...
さっきの取り消しする必要なかった..なのでもう一度

```cl
rails generate scaffold hogehoge
```
その後に`rake db:migrate`をしたら

```
SQLite3::SQLException: table "hogehoge" already exists: CREATE TABLE "hogehoge" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL) 
```
こんなエラーがでました...

もうそのテーブルはあるよって...Gitだけではテーブルまで削除出来ませんでした..

いま創っているRailsのアプリはSqliteを使っているので

`$ sqlite3 db/development.sqlite3`

で開発用のデータベースに入ります!!

該当するテーブルを削除
`sqlite> drop table hogehoge;`

これで解決しました！！
サーバー監視ツール Hinemos

# Hinemos
Hinemos はNTTデータが開発する国産のサーバー監視ツール。

# インストール
## Firewalld の設定
```bash
yum install firewalld
systemctl start firewalld
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
```

## SELinux 無効化
```bash
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
reboot
```
SELinux を無効にしないと Hinemos マネージャおよび Hinemos エージェントのインストール自体ができず、リファレンスにも要件として記載がある。 [^slashdot] [^install.pdf]
なお、 `setenforce 0` では駄目な様子。 

[^install.pdf]: https://osdn.jp/dl/hinemos/install.pdf
[^slashdot]: http://askslashdot.srad.jp/comment/2649919

## リポジトリーの追加
```
curl http://hinemos.osdn.jp/yum/{hinemos.repo} -o /etc/yum.repos.d/#1
```

## Hinemos マネージャ

```bash
yum install java-1.7.0-openjdk rsyslog vim-common
yum install java-1.7.0-openjdk-devel net-snmp-utils sblim-wbemcli
yum install hinemos-manager
systemctl start hinemos_manager
```
自動起動設定はインストール時に自動で行われるため不要。

## Hinemos エージェント
```
yum install net-snmp net-snmp-libs
yum install tog-pegasus sblim-wbemcli sblim-cmpi-base sblim-cmpi-fsvol openlmi-storage
yum install hinemos-agent
systemctl start hinemos_agent
```
自動起動設定はインストール時に自動で行われるため不要。

## Hinemos Web クライアント
```
yum install unzip vlgothic-p-fonts
yum install hinemos-web
systemctl start hinemos_web
```
自動起動設定はインストール時に自動で行われるため不要。

![Hinemos クライアント1.png](https://qiita-image-store.s3.amazonaws.com/0/15175/c351764d-21ba-7927-5f0d-dd0f97ba3085.png)
初期ログインパスワードは `hinemos` になっている。

![Hinemos クライアント.png](https://qiita-image-store.s3.amazonaws.com/0/15175/f14a1e07-5cd7-27d5-b9eb-ae23d8086b81.png)

![Hinemos クライアント2.png](https://qiita-image-store.s3.amazonaws.com/0/15175/9dd13789-7784-0d8c-b560-7b19f75f8dfb.png)

![Hinemos クライアント3.png](https://qiita-image-store.s3.amazonaws.com/0/15175/e401a4e0-f8c9-f3e0-8508-5bde6896624f.png)

![Hinemos クライアント4.png](https://qiita-image-store.s3.amazonaws.com/0/15175/f76de886-efaf-1794-49f4-1f48bdd8d893.png)


# モニタリング関連記事
* [サーバー監視ツール Munin](http://qiita.com/bezeklik/items/c4863c4114e0c339412b)
* [サーバー監視ツール Xymon](http://qiita.com/bezeklik/items/0f1234d8c9a2b54ec986)
* [サーバー監視ツール Zabbix](http://qiita.com/bezeklik/items/1f638727d6485ce9b931)
* [サーバー監視ツール Hinemos](http://qiita.com/bezeklik/items/f24077009f730eadbab1)
* [サーバー監視ツール Sensu](http://qiita.com/bezeklik/items/d026e9db4d5305165273)
Realm をインストール（セットアップ）する　だけ　初心者向け


Realmを始めて使う人向け。手順を記載

インストール（セットアップ）方法は手動で行う方法もありますが、
cocoapods でインストール（セットアップ）すると簡単なので、
ここでは cocoapods を使った方法を記載します。

1.Xcodeでプロジェクト作成
2.Podfile作成
3.Podfile編集
4.Realm インストール（セットアップ）

これだけです。この手順を記載します。


#1.Xcodeでプロジェクト作成
これは適当にプロジェクトを作成してくれれば🆗
ここではプロジェクト名を　RealmSample01 とします

#2.Podfile作成
TerminalでRealmSample01 プロジェクトフォルダへ移動して
Podfileを起動します

```
$ cd RealmSample01
$ vim Podfile 
```

#3.Podfile編集
以下のように記載すれば🆗

```
$ cat Podfile 
platform :ios, '8.0'
use_frameworks!

target 'RealmSample01' do
  pod 'Realm'
  pod 'RealmSwift'
end
```

#4.Realm インストール（セットアップ）
それでは準備ができたのでインストール

```
$ pod install
Analyzing dependencies
Downloading dependencies
Installing Realm (1.0.2)
Installing RealmSwift (1.0.2)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `RealmSample01.xcworkspace` for this project from now on.
Sending stats
Pod installation complete! There are 2 dependencies from the Podfile and 2 total
pods installed.
```

こんなんでいいのってぐらい簡単ですね。

たまたま、ハマらなかっただけかもね。
icalendarデータから時間の使い方を集計するPythonプログラム

#パッケージインストール
まずは、pip install icalendar
です。

#次に分析に使う項目をExcelで作ります。

|会議|資料作成|メール
|------------:|:------------:|:------------:|
|朝ミーティング|会議資料準備|朝のメールチェック
|昼ミーティング|報告資料作成|昼のメールチェック
|夜ミーティング||夜のメールチェック


のように、1行目に分析したい単位の項目、2行目以降に、それぞれの分析単位の小項目を記載します。この小項目が、icalendarデータの検索キーワードになります。

項目表.xlsxとでも名付けて保存することにします。


#次に分析対象のicalendarデータを用意します。
用意の方法はいろいろあると思います。
Outlookからのエクスポートとか簡単ですね。


#次にソースです。
正直なところ、全然エレガントじゃないと思うんですが、初心者なので許してください、というか、どなたかご指導ください。

・項目表をまずは読み込んで、同じサイズのデータ集計用のdataframeを作成
・次々に、icalendarデータを読み込んで、項目表.xlsxから該当の座標を見つけて、対応する集計用のdataframeに、計算した時間を加算していっています。

メモリの無駄遣い？二重ループがエレガントじゃない、とかいろいろあると思うのでコメントください。

```.py
import numpy as np
import pandas as pd
import icalendar as ic
from datetime import timedelta


def calculate_time(event):
    start = event['DTSTART'].dt
    end = event['DTEND'].dt

    time = end -start

    return time.total_seconds() / 3600


def main():
    labels = pd.read_excel('./項目表.xlsx')
    print(labels)

    file = open('./testdata.ics', 'r', encoding='utf-8')
    cal = ic.Calendar.from_ical(file.read())

    data = pd.DataFrame(np.zeros((labels.shape[0], labels.shape[1])))
    data.columns = label.columns

    for event in cal.walk('vevent'):
        time = calculate_time(event)
        summary = str(event.get('summary'))

        for i in range(0, labels.shape[0]):
            for j in range(0, labels.shape[1]):
                if str(labels.iloc[i, j]) in summary:
                    data.iloc[i, j] = data.iloc[i, j] + time


    print(data)

if __name__ == '__main__':
    main()
```

なにやってるかわからないところあれば、御質問ください。
まだグラフ化していないですが、ここまでくれば、グラフ化は簡単なはず。

#グラフ化の一例
円グラフにすることにします。

```.py
data.sum().plot.pie(legend=False, autopct="%.1f%%", textprops={'fontproperties': fp, 'fontsize':20})
plt.axis('equal')
```
legend=Falseで邪魔な凡例が出ないようにして、パーセンテージをautopct="%.1f%%"で表示するようにしています。

日本語フォントを使うときのポイントで調べるのに時間がかかったのが、textprops={'fontproperties': fp, 'fontsize':20})　の書き方です。pythonのplotで円グラフを使うときに日本語フォントを指定するにはどうしたらいいのか全然情報が見つからず、時間かかりました。

plt.axis('equal')は、円グラフがつぶれるのを防ぎます。




#参考文献
・https://gist.github.com/lukasmartinelli/9021795
Lamveryでnodejs4.3を利用する


やってみたらいけたのでメモ。

```.lamvery.yml
profile: {{ env['AWS_PROFILE'] }}
region: {{ env['AWS_REGION'] }}
versioning: false
default_alias: null
clean_build: false
configuration:
  name: react-serverless
  runtime: nodejs4.3
  role: {{ env['AWS_LAMBDA_ROLE'] }}
  handler: lambda_function.lambda_handler
  description: This is a sample lambda function.
  timeout: 10
  memory_size: 128
```

runtimeを`nodejs4.3`にするだけなんですが、これで`lamvery deploy`するとnodejs4.3でLambdaファンクションが作られます。
MAC の　Terminal　のプロンプトを変更しようぜ


MACのTerminalのプロンプトを簡単に変更する方法です
初心者にもできるのでおためしあれ。

1. 設定ファイル作成（.bashrc)
2. 設定記載
3. 読み込み（source ~/.bashrc）

これだけでOK！
ちょろいです。

では、やってみよう

#やること
デフォルトは、以下のようになっています

```
hostname:現在のディレクトリ　ユーザ名
```
これを

```
ユーザ名：現在のディレクトリ
```

に変える。
色々やりたくなるけど、これだけに限定してやってみよう。
もっと難しいことは慣れてからやればよし。ってことで。

#設定ファイル作成
```
cd //homeディレクトリに移動
touch .bashrc //ファイル作成
vim .bashrc //vim起動
```
これだけでOK

#設定記載
vimが立ち上がっていて、設定ファイル（.bashrc)が開いているはずなので、以下を記載する

```
PS1='\u:\W\$ '
```

これを記載したらセーブしてvim終了
これだけでOK

#読み込み
```
source ~/.bashrc
```
これだけでOK

どうでしょ？できました？

#参考　次の起動時の時のために
.bashrc が再起動時に読み込まれない場合は
~/.bash_profile に以下の記載をすればいいみたい

```
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```



#参考　設定値
| 値| 意味 |
|--------|--------|
|\h        |ホスト名        |
|\W        |現在のディレクトリ名  |
|\u        |ユーザ名  |
|\$        |'$'の表示  |
bower で Bootstrap を入れたあと "couldn't find file 'bootstrap' with type 'text/css'" が表示される


```Bowerfile
asset 'bootstrap'
```

として下記の行を追加すると

```application.css
 *= require bootstrap
```

Rails で下記のエラーが表示された。

>couldn't find file 'bootstrap' with type 'text/css'

解消するには Gemfile に下記を追加する

```Gemfile
gem 'therubyracer'
gem 'less-rails'
```
カイ2乗検定と母比率の差の検定は違うのか

ABテストをしてその検定のときにどちらを使うか迷ったので比較してみた。
Rで検証してみた。


## カイ2乗検定(chisq.test)
||クリックした|クリックしなかった|
|:--:|:--:|:--:|
| 広告A | 270回 | 2608回 |
| 広告B | 344回 | 2706回 |


```r
> chisq.test(matrix(c(270, 344, 2608, 2706), nrow=2))

  Pearson's Chi-squared test with Yates' continuity correction

data:  matrix(c(270, 344, 2608, 2706), nrow = 2)
X-squared = 5.5376, df = 1, p-value = 0.01861
```



## 母比率の差の検定(prop.test)
||インプレション数|クリック数|クリック率|
|:--:|:--:|:--:|:--:|
| 広告A | 2878回 | 270回 | 49% |
| 広告B | 3050回 | 344回 | 50% |


```r
> prop.test(c(270,344),c(2878,3050))

  2-sample test for equality of proportions with continuity correction

data:  c(270, 344) out of c(2878, 3050)
X-squared = 5.5376, df = 1, p-value = 0.01861
alternative hypothesis: two.sided
95 percent confidence interval:
 -0.034785393 -0.003158079
sample estimates:
    prop 1     prop 2
0.09381515 0.11278689
```

## まとめ
出てくる結果は同じである。
自由度1のχ^2分布の確率は平方根をとれば正規分布になるからである。
なので同じ値になる。
条件に合った Gem 全てを bundle open する

基本テストを書くのに私は [RSpec](https://github.com/rspec) を使っているのですが、RSpec は本当に様々なメソッドがあるので、「あれ？このメソッドってどんな動きだったっけなあ？」と、ソースコードを読むことが頻繁にあります。

しかし、ターミナルで `gem list | grep rspec` とすると

```
$ gem list | grep rspec
guard-rspec (4.7.3, 4.7.2, 4.7.1, 4.7.0, 4.6.5, 4.6.4)
rspec (3.5.0, 3.4.0, 3.3.0, 3.2.0, 3.0.0)
rspec-collection_matchers (1.1.2)
rspec-core (3.5.2, 3.5.1, 3.5.0, 3.4.4, 3.4.1, 3.3.2, 3.2.2, 3.0.4)
rspec-expectations (3.5.0, 3.4.0, 3.3.1, 3.2.0, 3.0.4)
rspec-mocks (3.5.0, 3.4.1, 3.4.0, 3.3.2, 3.2.1, 3.0.4)
rspec-parameterized (0.3.1, 0.3.0)
rspec-rails (3.5.1, 3.5.0, 3.4.2, 3.4.0, 3.0.2)
rspec-retry (0.5.0, 0.4.5)
rspec-support (3.5.0, 3.4.1, 3.3.0, 3.2.2, 3.0.4)
spring-commands-rspec (1.0.4)
```

こんだけの RSpec 関連の Gem が出てきてしまい、毎回「どこに書いてあるんだ！！」ってなるので、もういっそのこと全部開いてしまおうと思います。

見たい RSpec は `rspec-hogehoge` って名前のはずなので、対象は `rspec-` にして、、、

```
$ gem list | grep rspec- | cut -d ' ' -f 1 | xargs -n 1 bundle open
```

できた！！
続々と開いてくる...！！

grep する対象を変えるだけで、簡単に対象変えられますね。きっと便利！
.NET Framework 4.6.1では、Windows Formsのテキストボックスが「Ctrl+A」キーで「すべて選択」できるようになりました

.NET Framework 4.6.1では、Windows Formsのテキストボックスが「Ctrl+A」キーで「すべて選択」できるようになりました。

[.NET Framework 4.6.1 list of changes](https://github.com/Microsoft/dotnet/blob/master/releases/net461/dotnet461-changes.md)
> CTRL+A works in multiline text boxes [145670]

このため、.NET Framework 4.6.1をターゲットとする場合は下記の対応が不要になります。
[C#: テキストボックスで、Ctrl+Aですべて選択できるようにする](http://qiita.com/nicklegr/items/d3e97d6910a1353ff45b)

※単一行入力のテキストボックスでは、.NET Framework 4.6.1以前から「Ctrl+A」キーで「すべて選択」が機能します。
OpenWrtで使われているファイルシステム

組み込み向けLinuxディストリビューションであるOpenWrtを触っていると、普段のLinuxではあまり見慣れない技術が使われていることに気づきます。本稿ではOpenWrtのファイルシステムで利用されているOverlayFS、SquashFS、JFFS2とその背景知識についてまとめます。

「[OpenWrt Project: Filesystems](https://openwrt.org/docs/guide-user/storage/filesystems-and-partitions)」も合わせて参照してください。


# OverlayFS

OverlayFSは2層のファイルシステムの内容を重ね合わせるようなファイルシステムで、下層は読み込み専用、上層は読み書き可能なファイルシステムを使うのが一般的です。OverlayFS全体としては上層と下層を合成したようなファイルシステムとして振る舞います。

OpenWrtの場合、`/`以下がOverlayFSにより2つのファイルシステムの重ね合わせで実現されています。

# SquashFS

OpenWrtのOverlayFSで重ね合わせているうち下側のファイルシステムにはSquashFSが採用されています。SquashFS上にはOSとして動作する上での必要最低限のファイル群が格納されています。

SquashFSは読み込み専用の圧縮ファイルシステムで、OpenWrtではLZMA圧縮が採用されています。読み込み専用であるため多くのファイルを隙間なく詰め込むことができる点がメリットで、JFFS2に対して20-30%ディスク容量を節約できるようです。

# JFFS2

OpenWrtのOverlayFSで重ね合わせているうちの上側のファイルシステムにはJFFS2が採用されています。たとえば、OSインストール後に`opkg`コマンドで各自がインストールするパッケージはJFFS2上に書き込まれます。

JFFS2は読み書き可能な圧縮ファイルシステムで、LZMA圧縮が採用されています。また、ジャーナリングおよび[ウェアレベリング](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%AC%E3%83%99%E3%83%AA%E3%83%B3%E3%82%B0)に対応しています。

SquashFS側に存在するファイルを上書きするようだとディスクの無駄遣いということになってしまいますが、そうでなければ限られたストレージ容量を有効活用できるような、組み込み向けの技術だと言えるでしょう。

# ウェアレベリング対応ファイルシステムの必要性

ウェアレベリングとは、書きかえ可能回数に制限のあるデバイスで書き換え回数を平均化してデバイスの寿命を延ばすような技術です。ざっくり言えば書き込む記憶素子をバラけさせるような技術ということです。

フラッシュメモリは書き換え回数に制限のあるデバイスであり、ウェアレベリングは必須の技術だといえます。しかし、JFFS2という名前を初めて聞いたような人も多いのではないでしょうか。メインストレージをSDカードに使う前提のRaspberry Pi OS[^raspbian]でさえext4などが採用されています。JFFS2を採用しなくても大丈夫なのでしょうか。

[^raspbian]: 旧名Raspbian。Raspberry Pi用のLinuxディストリビューション。Debianベース。


この背景には組み込み機器の特殊性があります。通常のフラッシュメモリ製品（SSDやSDカード・USBメモリなど）では、SoCとフラッシュチップの間にコントローラチップが存在し、ハードウェアでウェアレベリングを行うのが一般的です。一方、組み込み機器では多くの場合SoCとフラッシュチップが直結されているため、ソフトウェアでウェアレベリングを行う必要があるのです。

つまり、JFFS2は組み込み機器に特化したファイルシステムだと言えるでしょう。

# 使われている様子を確認

OpenWrt 15.05.1上での`mount`の結果を紹介します。

```
# mount
rootfs on / type rootfs (rw)
/dev/root on /rom type squashfs (ro,relatime)
（略）
/dev/mtdblock8 on /overlay type jffs2 (rw,noatime)
overlayfs:/overlay on / type overlay (rw,noatime,lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work)
（略）
#
```

SquashFSとJFFS2が使われているのがわかります。

# まとめ

OpenWrtでは読み込み専用の高圧縮ファイルシステムの上に読み書き可能な中圧縮の組み込み向けファイルシステムを重ね合わせることで、限られたストレージ容量を有効活用する仕組みになっています。組み込み機器に特化したOpenWrtならではの工夫で、興味深いですね。
8/29　今日の学習内容～Rubyの基礎を復習～

###今日の学習内容
***
昨日の学習ではコントローラとビューをいじって``Hello World!``とWebページに表示させました。
これでchapter1が終了したので、chapter2に入っていきます(-ω-)/
chapter2ではRubyの基礎を学習をすることが目的のようなので、一日でササッと終わらせてしまいます('ω')ノ

####数値のクラス
***
数値のクラスは~~３つあるようです(-ω-)/~~(さらにRationalクラスとComplexクラスもあるようです。scivola様、ご指摘いただきありがとうございましたm(__)m)
知らなかったので書いておきます。

1.**Fixnum**
2.**Bignum**
3.**Float**

変数に、
1.整数
2.非常に大きな整数
3.浮動小数点数
を代入すると、それぞれ対応したクラスのオブジェクトが~~生成され~~（表現が正しくありませんでした。）できます。
（整数ならFixnumクラスのオブジェクトといった風に。）

####三項演算子``?``
***
``?``は、「もし○なら△、違うなら□」という本来なら``if else``文を使うものを、一行で書くことができる演算子です。
例えば、「変数ｘが２で割り切れないなら奇数、そうでないなら偶数をmessageに代入」は、三項演算子``?``を使えば、
``message =  (x % 2 != 0 ? "奇数" : "偶数")``という書き方をすることができます。
![paiza_io.png](https://qiita-image-store.s3.amazonaws.com/0/137880/4a755863-6736-6edf-3b13-4c6bb0f108c3.png)


###あとがき
***
もう少し学習を進められればいいんですけれど...
ゆっくりしてたらなかなか進まないですね(;´д｀)

###参考にさせていただいたサイトなど
***
>[改訂３版基礎Ruby on Rails (Amazonのページ)](https://www.amazon.co.jp/dp/4844338153)
[Paiza.IO](https://paiza.io/projects/6c3oCZ6s2fdjAjD3Nqur1Q)
SourceTree で GitHub のリポジトリをローカルに clone するメモ

# GitHub 上のリポジトリから clone

![WS000024.JPG](https://qiita-image-store.s3.amazonaws.com/0/28936/cc2bf585-208b-3080-9980-54068a0bb168.jpeg)

* GitHub にあるリポジトリのページを開き、左上にある `Clone or download` ボタンをクリック
* `Clone with SSH` のテキストボックスの `git@` から始まる URL をコピー


# SourceTree 上での設定

![WS000025 - コピー.JPG](https://qiita-image-store.s3.amazonaws.com/0/28936/c256e672-fa30-3164-c173-d1948ac8ad6f.jpeg)

* SourceTree のツールバーの左端に有る `新規作成 / クローンを作成する` をクリック
* `リポジトリをクローン / 追加 / 作成` ダイアログの `リポジトリをクローン` タブを選択

| 項目                    | 説明 |
|:-----------------------|:------|
| 元のパス/URL            | リモートリポジトリのURL |
| 保存先のパス            | ここで指定したフォルダに、リモートリポジトリが clone されます |
| リポジトリをブックマーク | SourceTree の画面左側にある、リポジトリの一覧にショートカットを登録するかどうか |
| 名前                   | ブックマーク上での識別用の名前 |
| フォルダ                | ブックマーク上でのどのフォルダ上にシュートカットを作るのか |
MacにCommon Lisp環境をインストールする

# インストールする
MacにCommon Lisp環境をインストールするには、Homebrewでインストールする事ができる。
下記コマンドを入力するとインストールされる。

```zsh
% brew install clisp
```

# 試してみる
## clispを起動してみる
```zsh
% clisp
  i i i i i i i       ooooo    o        ooooooo   ooooo   ooooo
  I I I I I I I      8     8   8           8     8     o  8    8
  I  \ `+' /  I      8         8           8     8        8    8
   \  `-+-'  /       8         8           8      ooooo   8oooo
    `-__|__-'        8         8           8           8  8
        |            8     o   8           8     o     8  8
  ------+------       ooooo    8oooooo  ooo8ooo   ooooo   8

Welcome to GNU CLISP 2.49 (2010-07-07) <http://clisp.cons.org/>

Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2010

Type :h and hit Enter for context help.

[1]>
```

## 足し算をしてみる
ポーランド記法で演算する事ができる。

```
[1]> (+ 1 2)
3
[2]> (+ 1 2 3)
6
[3]>
```

以上。
ClojureScript の初期セットアップと nREPL による Hello World

## Leiningen のインストール

```shell-session
$ mkdir -p ~/bin
$ cd ~/bin
$ wget https://raw.github.com/technomancy/leiningen/stable/bin/lein
$ chmod 755 lein
$ ./lein version
Downloading Leiningen to /home/cuzic/.lein/self-installs/leiningen-2.7.0-
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  C
                                 Dload  Upload   Total   Spent    Left  S
100   605    0   605    0     0    584      0 --:--:--  0:00:01 --:--:-- 
100 14.6M  100 14.6M    0     0   239k      0  0:01:02  0:01:02 --:--:-- 
Leiningen 2.7.0 on Java 1.7.0_85 OpenJDK 64-Bit Server VM
```

## プロジェクトの開始

```shell-session
$ lein new piggieback_project
$ cd piggieback_project
```

## `project.clj` の編集

`project.clj` を下記のように編集する

```clj:project.clj
(defproject piggieback_project "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [org.clojure/clojurescript "1.7.228"]]
  :profiles {:dev {:dependencies [[com.cemerick/piggieback "0.2.1"]
                                  [org.clojure/tools.nrepl "0.2.10"]]
                   :repl-options {:nrepl-middleware
                                  [cemerick.piggieback/wrap-cljs-repl]}}})
```

* `nREPL` : リモートで Clojure のコードを評価できる Clojure のライブラリ
* `Piggieback` : `nREPL` を使ってリモートの ClojureScript 環境で評価できるようにする `nREPL` ミドルウェア


## `greet.html` の編集

```html:greet.html
<html>
<body>
<script type="text/javascript" src="out/main.js"></script>
</body>
</html>
```

## `src/piggieback_project/core.cljs` の編集


```clj:src/piggieback_project/core.cljs
(ns piggieback-project.core
  (:require [clojure.browser.repl :as repl]))

(defonce conn
  (repl/connect "http://localhost:9000/repl"))
```

## `lein repl` の開始

```clj
$ lein repl
user=> (require 'cljs.build.api)
user=> (cljs.build.api/build "src" {:main 'piggieback-project.core :output-to "out/main.js" :verbose true})
user=> (require 'cljs.repl.browser)
```

これで、 9000 番ポートで待ち受けるようになる。

## `localhost:9000` に接続

```
$ firefox http://localhost:9000/
```

## `lein repl`

```clj
cljs.user=> (js/alert "Hello World from Piggieback!")
```

これでブラウザで、 `Hello World from Piggeback!` というポップアップが表示される

## 参考文献

[Learning ClojureScript](https://www.packtpub.com/web-development/learning-clojurescript)
[piggieback_project](https://github.com/learningclojurescript/code-examples/tree/master/chapter-1/piggieback_project)
Dockerで使い捨ての開発環境を作る

自分の備忘録も兼ねつつ。

MacからWindowsに引っ越しをしたところ、ローカルで使える開発環境を作り直すことになってしまい、めんどくさい。そこで、Docker toolboxを使って手軽に開発環境をデプロイできる仕組みを考えてみました。
仮想マシンを代々引き継いでもいいですが、Dockerで1から作り直せるようにつくっておけば、環境構築に凝る時間が減って生産的です。Dockerhubが構築してくれるのもお得な感じがします。

# 仕組み

Dockerfileでtmux, fish-shell, spacemacsの環境と、golang, ruby, pythonの準備をしています。
最初の環境変数`my_xxx`, `user`, `email`と、`authorized_keys`を書き換えてもらえれば流用できます。
https://github.com/juntaki/development-container

Dockerhubでビルドすれば、指定したバージョンでのまっさらな開発環境が完成！
念のため、私の公開鍵（と設定）がはいってしまっているので、そのまま使うのはおすすめしません。
https://hub.docker.com/r/juntaki/development-container/


# 使い方

データ専用コンテナを作る。$HOME/work以外は捨てる覚悟で。
参考：[Docker でデータのポータビリティをあげ永続化しよう](http://qiita.com/mopemope/items/b05ff7f603a5ad74bf55)

~~~
docker run -t -d -v /home/juntaki/work --name my_data busybox /bin/sh
docker exec my_data chown 1000:1000 /home/juntaki/work
~~~


データ専用コンテナをマウントして、22番ポートを適当なポートで公開したら完成です。

~~~
docker run -p 3000:22 --volumes-from my_data --name dev --hostname dev -d juntaki/development-container
~~~
GitHub にリポジトリを作成する

# リポジトリの作成画面を開く

![WS000039.JPG](https://qiita-image-store.s3.amazonaws.com/0/28936/e3b0230a-677f-0830-bb32-e6e55c37fb5e.jpeg)

* ブラウザで [GitHub](https://github.com/) を開き、画面右上の `+` ボタンから `New repository` をクリック


# 新規作成するリポジトリの設定

![WS000038.JPG](https://qiita-image-store.s3.amazonaws.com/0/28936/6edf820d-5c53-a6c0-02e0-950b8b64a7b6.jpeg)

| 項目                                     | 内容 |
|:-----------------------------------------|:-------|
| Owner                                    | リポジトリの所有者となるユーザーもしくはグループ。<br/>ここで選択するオーナーが有料プランに入っていないと `Private` リポジトリは作成できない。 |
| Repository name                          | リポジトリの名前<br/>リポジトリの URL としても利用されるため、半角英数字と `-` のみが無難です。 |
| Description                              | リポジトリの説明（省略可）<br/>日本語も使える。 |
| Public, Private                          | リポジトリを公開するかどうか<br/>`Public` だと誰でも見ることができ、`Private` だと指定した人しか見ることが出来ない。<br/>有料プランでないと `Private` は選択できない。<br/>社内のソースコードなどは `Private` にする。 |
| Initialize this repository with a README | `README.md` というファイル作成してリポジトリを処理化するかどうか。<br/>チェックを入れておくと自動で `master` ブランチが生成され `README.md` ファイルが保存される。<br/>チェックを入れない場合ブランチが 0 個のリポジトリになるためチェックを入れておいた方が無難。 |
| Add .gitignore None                      | 一般的な `.gitignore` を追加するかどうか。<br/>自分のプロジェクトとちょうど合うものがあれば選ぶといい |
| Add a license None                       | 一般的なライセンス文を追加するか。<br/>自分のプロジェクトとちょうど合うものがあれば選ぶといい。<br/>社内用ソースコードの場合は `None` |


* リポジトリの設定が完了したら `Create repository` でリポジトリを新規作成する。
BASIC認証のヘッダに入れる文字列をワンライナーでサクっと作る

BASIC認証のヘッダである、`Authorization: Basic {base64の文字}` を作りたくなりました。Linuxだと改行が入ってしまうようなので、 echo に -n オプションを指定するとよい。

```
echo "Basic $(echo -n 'hoge:hoge' | base64 -w 0)"
```

とすると、`Basic aG9nZTpob2dl` になります。Macなひとは、

```
echo "Basic $(echo 'hoge:hoge' | base64)" | pbcopy
```

ってやるとクリップボードに入ります。
Subversion のリポジトリを Git のリポジトリに変換する方法 メモ

# trunk, branches, tags が正しく運用されているリポジトリの場合

* Subversion の標準的なフォルダ構成を利用して `trunk`, `branches`, `tags` が正しく運用されている場合
* [GitHub Desktop](https://desktop.github.com/) の Git Shell を利用する

1. スタートメニューの `GitHub, Inc` => `Git Shell` から Git Shell を起動
1. Git のリポジトリを作成したいフォルダへ移動する
    * `cd [移動先のディレクトリのパス]`
1. Git の `svn clone` コマンドを利用する
    * `git svn clone [Subversion のリポジトリ] -s`
    * Subversion のリポジトリを一からチェックアウトして Git にコミットするを繰り返すので、結構時間がかかる。


# 参考資料

* [SVN から Git への移行 | アトラシアン](https://www.atlassian.com/ja/git/migration#!migration-convert)
* [git-svnでSVN→Gitへの移行をやってみたログ - Qiita](http://qiita.com/hidekuro/items/4727715fbda8f10b6b11)
ChatGopsで本物のGopherを、すぐそばに...

# ChatOps

DevOpsの流れで、開発・運用における情報共有やビルド実行・通知などをコミュニケーションツールであるチャットから行うChatOpsというブームが起こりました。ChatOpsを採用することで開発チームと運用チームのリアルタイムな連携や、ビルド・デプロイの失敗に対する迅速な対応が可能となり、開発スピードの向上を図ることができるようになります。

その中核をなすのが、チャットに書き込まれたメッセージによる処理実行やチャットへの通知を管理するBotツールです。
ChatOpsの流行り始めはGithub社のHubotがデファクトスタンダートでしたが、昨今ではSlackのBotkitやMicrosoft Bot Framework、またLINEまでもBotを提供するなど、Bot / ChatOpsはシステム開発における一つの定番プラクティスとなってきました。

でも、何かが・・・何かが足りない・・

# ChatGops

そう、Gopherくんが足りない。

![bopher.gif](https://qiita-image-store.s3.amazonaws.com/0/9891/bf9f9fef-de6c-41e1-50c9-f76368da4e1b.gif)

[kaakaa/bopher](https://github.com/kaakaa/bopher)

[本物の golang を\.\.\. 本物の Gopher を、お見せしますよ。 \- Qiita](http://qiita.com/mattn/items/b7889e3c036b408ae8bd)を全面的に利用しています。
（そのためWindows Onlyです）

## 必要なもの

* Mattermost 3.3～
* [mattn/gopher](https://github.com/mattn/gopher)をビルドした`gopher.exe`
* [kaakaa/bopher: Bot \+ Gopher = Bopher](https://github.com/kaakaa/bopher)

## 手順

1. Mattermost(v3.3以降)を立てる
2. [mattn/gopher](https://github.com/mattn/gopher)eをビルドする
3. [bopher.exe](https://github.com/kaakaa/bopher/releases/tag/v0.0.1)をダウンロードする
4. [bopher/config\.json](https://github.com/kaakaa/bopher/blob/master/config.json)に設定を書いて、bopher.exeと同じディレクトリに置く
5. bopher.exeを起動する

# 注意

* Core i7, メモリ24GBを積んだマシンでもGopherくんを5,60人同時に発生させたところ操作が効かなくなりました。設定ファイルでGopherくんの最大数を設定できるようにしてあります。用法・容量を守って正しく服用ください。

# きっかけ

* Mattermost3.3から、GoでBotを書けるようになったので、なんか作ってみようと思いました
  * [mattermost/mattermost\-bot\-sample\-golang](https://github.com/mattermost/mattermost-bot-sample-golang)
iPhone実機でスマホ対応を確認するためのプロキシの設定 for Mac

## 前提条件
PC: Mac
同じWifi環境
Homebrew

## 手順

#### 1.install

```
brew install squid
```

#### 2./usr/local/etc/squid.conf

```
acl lan src PCのIPアドレス
http_access allow lan

refresh_pattern -i \.(gif|png|jpe?g|tif?f|bmp)$ 1440 25% 10080
refresh_pattern -i \.(mpe?g|avi|ra?m|wmv|mov)$ 1440 25% 10080
refresh_pattern -i \.(wav|mp3|mid)$ 1440 25% 10080
refresh_pattern -i \.(class|swf|pdf)$ 1440 25% 10080
refresh_pattern -i \.(js|css)$ 1440 25% 10080
refresh_pattern . 45 20% 4320


dns_nameservers 192.168.1.1 192.168.1.2
```

#### 3.実行方法

```
# run
/usr/local/sbin/squid

# stop
sudo /usr/local/sbin/squid -k shutdown
```

### iPhone

<img width="538" alt="2016-08-29 14 45 25" src="https://cloud.githubusercontent.com/assets/18649881/18042036/228abd50-6df9-11e6-9eb4-60c0ebe53d28.png">
rex0220 一覧権限設定プラグイン

kintone アプリで、一覧・グラフ画面を表示する権限を設定するプラグインです。

- 一覧・グラフ毎に、表示可能なユーザ・組織・グループを設定
- [一覧メニュープラグイン](http://qiita.com/rex0220/items/6c4fce3237446fdf19a6)と連動可能
- PC・モバイル対応
- ３ヶ国語対応

[rex0220 stores](https://rex0220.stores.jp/) で、販売中です。

Ver.16
・Ver.14,15 で、「一覧表示権限の無い一覧の場合、表示権限のある一覧に遷移」時、エラーになる不具合対応

Ver.15
・プラグイン設定画面のデザイン変更対応
・プラグイン設定に、「説明」設定機能を追加

# ログインユーザの設定が無い場合の一覧リスト表示

「一覧１」、「一覧テスト３」にログインユーザの設定が無い場合の表示例

![vpermission01.png](https://qiita-image-store.s3.amazonaws.com/0/100572/63a6a2ed-703d-00f2-4cad-36777f289f0f.png)

# URL指定で、表示権限のない一覧画面を表示

「一覧の表示権限がありません」のメッセージを表示します。

![vpermission02.png](https://qiita-image-store.s3.amazonaws.com/0/100572/c4487fb9-aecf-9ee0-d7e4-1add7aa3c3e4.png)


# モバイル表示

<img width="845" alt="2020-06-05_04h16_51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b84bbe2d-1a27-dced-dc8e-dcd5911bd7be.png">


# プラグインの追加

![vpermission21.png](https://qiita-image-store.s3.amazonaws.com/0/100572/dc985022-4cff-c0a0-841e-914f9c82a4c4.png)

# プラグインの設定

- 有効：　プラグインの有効／無効を指定。
- チェックボックス：　一覧・グラフに対する権限設定の有効・無効を指定
- タイプ：　view(一覧)、 report(グラフ)
- 位置：　view, report 毎の表示位置
- 一覧名：　一覧・グラフ名称
- ゲストユーザー：　カンマ区切りで、ゲストユーザを指定（emailアドレス）
- 一覧表示ユーザ：　カンマ区切りで、ユーザコードを指定
    - 一覧表示ユーザーをコピペ出来ます。
- 編集：　ボタンをクリックすると権限設定画面を表示

![2021-09-17_11h04_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/50877f40-0bf3-0bdd-ab29-ab4eb8c3eadf.png)

## ゲストスペースのプラグイン設定例

ゲストユーザーについては、実際にゲストユーザーとして登録されているかのチェックは行いません。

![2021-09-17_11h08_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/87941630-51c1-5933-6d3c-9e5ee8e429bd.png)


## コピー＆ペースト操作例

![2021-03-24_09h43_34.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b8f63bfd-6020-bbf2-c17a-3941d7b2bef1.gif)



## 権限設定画面

対象ユーザー、組織、グループをチェックして、「保存」

![2021-03-23_18h18_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d3d82324-1fb4-2cef-643b-f971d0ff588d.png)


# 一覧の名称が重複している場合のエラー対応

一覧の名称が重複していると、プラグインの設定画面でエラーとなります。
一覧の名称を変更後、プラグインの設定を行ってください。

![vpermission23.png](https://qiita-image-store.s3.amazonaws.com/0/100572/f7d5ec85-6b98-e7c0-135c-ef764420f205.png)

# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- 一覧・グラフ設定を変更した場合は、プラグインを再設定してください。
- JavaScriptで表示制御を行うしくみのため、処理中にエラーなどが発生すると一覧の表示制御ができない場合があります。
- 厳密なアクセス権限の運用が必要な場合は、レコードのアクセス権限による制御をご検討ください。
is device jail broken?


```Objective-C
char* printEnv(void)
{
    char *env = getenv("DYLD_INSERT_LIBRARIES");
    return env;
}

- (BOOL)isJailBreak
{
    if (printEnv()) {
        NSLog(@"The device is jail broken!");
        return YES;
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
}

```
～や否や 

**意味**　〜するとすぐに 

**接続**

```
V［辞書形］ ＋ や否や
``` 

#### :anchor: POINT
---
かなり**固い**表現 :necktie: 


#### :1234: 例
---
![](https://livedoor.blogimg.jp/edewakaru/imgs/f/7/f79b3950-s.jpg)
<dl>
<dd>1. えびを食べる<strong>や否や</strong>、体がかゆくなった。Vừa ăn tôm vào là bị ngứa liền.</dd>
<dd>2. 薬を飲む<strong>や否や</strong>、腹痛が治った。Vừa uống thuốc vào là bụng hết đau ngay.</dd>
<dd>3. 家に帰る<strong>や否や</strong>、ゲームを始めた 。Vừa về tới nhà là chơi game ngay.</dd>
<dd>4. 母の足音が聞きこえる<strong>や否や</strong>、愛犬は玄関までダッシュした。Vừa nghe thấy tiếng bước chân của mẹ tôi là nó (con chó) chạy ra cửa ngay.</dd>


#### :twisted_rightwards_arrows: 比較 
---
|～や否や|～が早いか|
|:-----------|:------------|
|スピーチ・小説|固い|
|A is in the process of completing, B happens→overlapping|**同時性**を強調する. A is instantaneous, triggering B to happen in a mere moment.|
|~かどうか|-|

:paperclip: ～た途端: 口語・focus on what actually happen.

|～た途端|～や否や|～が早いか|
|:-----------|:-----------|:------------|
|口語|スピーチ・小説|固い|
|Vた|Vる|普通形|
[Swift] ViewControllerのエラーハンドリングをクリーンに保つ

# はじめに
エラーハンドリングは、catchによる分岐が増えると
ソースの可読性が落ちて読みづらいですよね。

そこで、CustomStringConvertibleプロトコルを利用して、
ちょっとだけすっきりさせる方法をご紹介します。

# 今回ご説明する例
ログイン画面で、
バリデーションチェック（空文字禁止）する場合を例にご説明します。

## よくある書き方

### (1) 独自のエラーを定義する
```:LoginError.swift
import Foundation

enum LoginError: ErrorType {
    case emptyUsername
    case emptyPassword
}
```

### (2) ログインボタン押下時に、バリデーションチェックする
現状は必須入力のみですが、フォーマットチェックや文字数などチェックが増えると、
caseがどんどん増えていきます。

```:ViewController.swift
    func login() {

        do {
            let token = try loginUserWithUsername(nil, password: nil)
            print(token)

        } catch LoginError.emptyUsername {
            print("ユーザ名は必須入力です")
        } catch LoginError.emptyPassword {
            print("パスワードは必須入力です")
        } catch {
            print(error)
        }
    }

    func loginUserWithUsername(username: String?, password: String?) throws -> String{
        guard let username = username where !username.isEmpty else {
            throw LoginError.emptyUsername
        }

        guard let password = password where !password.isEmpty  else {
            throw LoginError.emptyPassword
        }

        //Do Something
        return "tokenIDを返します"
    }
```

## ご提案する方法

### (1) 独自のエラーを定義する
ここは同じです。

```:LoginError.swift
import Foundation

enum LoginError: ErrorType {
    case emptyUsername
    case emptyPassword
}
```

### (2) CustomStringConvertibleを利用し、descriptionメソッドを実装する
バリデーションチェックのパターン分追記する。

```:LoginError.swift
extension LoginError : CustomStringConvertible {
    var description: String {
        switch self {
        case .emptyUsername:
            return "ユーザ名は必須入力です"

        case .emptyPassword:
            return "パスワードは必須入力です"
        }
    }
}
```

### (3) ログインボタン押下時に、バリデーションチェックする
現状は、必須入力だけですが、書式や文字数など増えても、
ViewControllerへの影響はありません。

```:ViewController.swift
    func login() {

        do {
            let token = try loginUserWithUsername(nil, password: nil)
            print(token)

        }  catch let error as LoginError {
            print(error.description)
        } catch {
            print(error)
        }
    }

    func loginUserWithUsername(username: String?, password: String?) throws -> String{
        guard let username = username where !username.isEmpty else {
            throw LoginError.emptyUsername
        }

        guard let password = password where !password.isEmpty  else {
            throw LoginError.emptyPassword
        }

        //Do Something
        return "tokenIDを返します"
    }
```

# まとめ
catchが増えると、ソースコードがカオスになりやすいですね。
エラーメッセージだけでも、切り出すとすっきりしたような気がします。

ちなみに、Swift3ではエラーハンドリングに変更があるようです。

```:Swift3の場合
import Foundation

enum LoginError : Error {
    case emptyUsername
    case emptyPassword
}

```

Swift3版のサンプルは、[Github](https://github.com/stv-ekushida/ios-clean-error-handling)を御覧ください。


以上です。
for文を使わずに、15文字だけでpandasのDataFrameを上下反転させる

# 目標

こんな感じで日付が新しい順で入っているデータを日付順で上下反転させて取り扱いたくて、ぐぐった。日本語ソースで簡単に出てこなかったのでもちろん英語で調べざるを得なかった。。。[ソース](http://stackoverflow.com/questions/20444087/right-way-to-reverse-pandas-dataframe)はこちら

運営しているブログはこちら：[努力1mm](http://www.doryoku-1mm.tech/)


```
2016-06-13  16910  16910  16620  16630   213980    16630
2016-06-10  17280  17280  17090  17180    67270    17180
2016-06-09  17340  17390  17190  17270    59900    17270
2016-06-08  17320  17440  17180  17440    56410    17440
2016-06-07  17250  17310  17140  17260    50000    17260
...           ...    ...    ...    ...      ...      ...
2001-08-24  11200  11250  11090  11180   227960    11180
2001-08-23  11430  11430  11100  11180   228950    11180
2001-08-22  11190  11490  11170  11380   184270    11380
2001-08-21  11320  11370  11150  11280   135740    11280
2001-08-20  11300  11350  11200  11270   170890    11270
```

```
2001-08-20  11300  11350  11200  11270   170890    11270
2001-08-21  11320  11370  11150  11280   135740    11280
2001-08-22  11190  11490  11170  11380   184270    11380
2001-08-23  11430  11430  11100  11180   228950    11180
2001-08-24  11200  11250  11090  11180   227960    11180
...           ...    ...    ...    ...      ...      ...
2016-06-15  16390  16590  16330  16520    92530    16520
2016-06-16  16460  16500  15970  16010   157200    16010
2016-06-17  16240  16350  16160  16180   140830    16180
2016-06-20  16460  16630  16450  16540    84920    16540
2016-06-21  16450  16800  16350  16760   136000    16760
```


## 反転させるためのコード

```
data.iloc[::-1]
```

で終わり、笑　実際に叩いてみたら上下入れ替わってびっくりした
相変わらず **iloc**、**loc**とかその辺の仕組みがよく分からない、笑
document.documentElement.outerHTML を取得する

▼ ケース1
1. Mono.Android.Export を参照に追加する

	protected override void OnCreate(Bundle bundle)
	{
		base.OnCreate(bundle);

		SetContentView(Resource.Layout.Main);

		var webView = new Android.Webkit.WebView(this);
		webView.Settings.JavaScriptEnabled = true;
		webView.Settings.BuiltInZoomControls = true;
		webView.SetWebViewClient(new ViewSourceClient());

		webView.AddJavascriptInterface(this, "Activity");

		webView.LoadUrl("https://www.google.co.jp/");
	}

	[Java.Interop.Export]
	[Android.Webkit.JavascriptInterface]
	public void ViewSource(string src)
	{
		//
	}

	private class ViewSourceClient : Android.Webkit.WebViewClient
	{
		public override void OnPageFinished(Android.Webkit.WebView view, string url)
		{
			view.LoadUrl("javascript:window.Activity.ViewSource(document.documentElement.outerHTML);");
		}
	}

▼ ケース2

	protected override void OnCreate(Bundle bundle)
	{
		base.OnCreate(bundle);

		SetContentView(Resource.Layout.Main);

		var webView = new Android.Webkit.WebView(this);
		webView.Settings.JavaScriptEnabled = true;
		webView.Settings.BuiltInZoomControls = true;
		webView.SetWebViewClient(new ViewSourceClient());

		webView.LoadUrl("https://www.google.co.jp/");
	}

	class ValueCallback : Java.Lang.Object, Android.Webkit.IValueCallback
	{
		public void OnReceiveValue(Java.Lang.Object value)
		{
			// string html = System.Text.RegularExpressions.Regex.Unescape((string)value);
		}
	}

	private class ViewSourceClient : Android.Webkit.WebViewClient
	{
		public override void OnPageFinished(Android.Webkit.WebView view, String url)
		{
			view.EvaluateJavascript("document.documentElement.outerHTML", new ValueCallback());
		}
	}
curlで返却されるJSONを見やすく整形して表示する

Webアプリを開発していると、Rest APIを試しに叩いてJSONの構造を見ながら進めたい場合があります。

普通にcurlで取得するとJSONが１行で表示されてしまいます。

## JSONを見やすく整形する方法

パイプで`python -mjson.tool`を追加するだけで、整形して見やすく表示できます。

```terminal:terminal
$curl "http://api.example.com/hoge.json | python -mjson.tool
```



以上です。
LamveryでLambdaにCloudWatch Eventを設定する



CloudWatch Eventの設定もできるので、スケジュール実行したいLambda functionを作るときはLamvery使うと一括管理できて便利です。

##Lambdaのデプロイ設定

```.lamvery.yml
profile: {{ env['AWS_PROFILE'] }}
region: {{ env['AWS_REGION'] }}
versioning: false
default_alias: null
clean_build: false
configuration:
  name: LAMBDA_FUNCTION_NAME
  runtime: python2.7
  role: {{ env['AWS_LAMBDA_ROLE'] }}
  handler: lambda_function.lambda_handler
  description: This is example function for qiita
  timeout: 10
  memory_size: 128
```
###Lambdaのデプロイ

```
$ lamvery deploy
lamvery: [Function] Create new function "LAMBDA_FUNCTION_NAME"
lamvery: [Function] description: None -> This is example function for qiita
lamvery: [Function] handler: None -> lambda_function.lambda_handler
lamvery: [Function] memory_size: None -> 128
lamvery: [Function] timeout: None -> 10
lamvery: [Function] role: None -> arn:aws:iam::XXXXXXXX:role/XXXXXXX
lamvery: [Function] runtime: None -> python2.7
lamvery: [Function-VPC] subnets: None -> []
lamvery: [Function-VPC] security_groups: None -> []

lamvery: [Function] Capacity: 16,161,164 Bytes -> 16,165,320 Bytes

```
`-d`をつけるとドライランできます。


##CloudWatch Eventのデプロイ設定
.lamvery.event.ymlに書いた内容を使ってCloudWatch Eventが作成される。

```.lamvery.event.yml
rules:
  - name: CLOUDWATCH_EVENT_NAME
    description: This is example event for qiita
    schedule: 'rate(5 minutes)'
    targets:
      - id: LAMBDA_FUNCTION_NAME
```

###CloudWatch Eventのデプロイ
*Lambdaをデプロイせずにこっちを先に実行すると「Lambdaがねーぞ」って怒られます。

```
$ lamvery events                                                                                                                            
lamvery: [EventRule] Create new event rule "CLOUDWATCH_EVENT_NAME"
lamvery: [EventRule] CLOUDWATCH_EVENT_NAME: state: None -> ENABLED
lamvery: [EventRule] CLOUDWATCH_EVENT_NAME: description: None -> This is example event for qiita
lamvery: [EventRule] CLOUDWATCH_EVENT_NAME: schedule: None -> rate(5 minutes)
```
こっちも`-d`をつけるとドライランできます。


##余談

direnvとかで環境変数設定して使うようにすると、みんなで作業するときとかGitHubにソース上げるときとかに捗ります。

```.envrc
export AWS_PROFILE={AWS_CLI_PROFILE_NAME}
export AWS_LAMBDA_ROLE={IAM_ROLE_ARN}
export AWS_REGION=us-east-1
```
Javascriptで入力した住所から緯度経度を取得してフォームに入力する方法

前回書いたこれの続き。

http://qiita.com/qwe001/items/de4cf622cc22e49b9ada

### はじめに

* 住所、緯度、経度の入力欄があったとする

```html
<tr>
	<th>住所</th>
	<td>
		<input id="address" name="address" type="text" value="">
	</td>
</tr>

<tr>
	<th>緯度</th>
	<td>
		<input id="latitude" name="latitude" type="text" value="">
	</td>
</tr>

<tr>
	<th>経度</th>
	<td>
		<input id="longitude" name="longitude" type="text" value="">
	</td>
</tr>
```

* 緯度、経度は最大3桁と、小数点6位までである。
* 東京都庁を例にすると、緯度は35.689634、経度は139.692101である。
* しかしその値を直接入力で入れるのってなんかあほらしいですよね。
* というわけで、住所の値から緯度と経度を計算して、その値をフォームに代入するみたいなのを作ります。

### 必要なもの

* Google Map API
* jQuery(筆者環境はVer1.9.1 もっと古いやつでもいけると思います。)

### 実装

```html

<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?key={ここにAPIキーを入力}"></script>
<script type="text/javascript">
/* ========================================================================
   Attribute Latitude And Longitude From Address With Google Maps API
 ========================================================================== */
$(function(){
	function attrLatLngFromAddress(address){
		var geocoder = new google.maps.Geocoder();
		geocoder.geocode({'address': address}, function(results, status){
			if(status == google.maps.GeocoderStatus.OK) {
				var lat = results[0].geometry.location.lat();
				var lng = results[0].geometry.location.lng();
				// 小数点第六位以下を四捨五入した値を緯度経度にセット、小数点以下の値が第六位に満たない場合は0埋め
				document.getElementById("latitude").value = (Math.round(lat * 1000000) / 1000000).toFixed(6);
				document.getElementById("longitude").value = (Math.round(lat * 1000000) / 1000000).toFixed(6);
			}
		});
	}

	$('#attrLatLng').click(function(){
		var address = document.getElementById("address").value;
		attrLatLngFromAddress(address);
	});
});
</script>

<tr>
	<th>住所</th>
	<td>
		<input id="address" name="address" type="text" value="">
	</td>
</tr>


<tr>
	<th>緯度</th>
	<td>
		<input id="latitude" name="latitude" type="text" value="">
	</td>
</tr>

<tr>
	<th>経度</th>
	<td>
		<input id="longitude" name="longitude" type="text" value="">
	</td>
</tr>

<input type="button" value="住所から緯度経度を入力する" id="attrLatLng">

```

APIキーの部分には各自が持っているAPIキーの値を入力してください。
APIキーの取得方法はここらへん見たり「Google Map API キー取得」とかでググって下さい。

https://developers.google.com/maps/documentation/javascript/get-api-key?hl=ja
http://nendeb.com/276
http://design-plus1.com/tcd-w/2016/06/google-maps.html

もし超急いでいるようならば下記のように別にAPIキーの値がなくても動きます。

```html
<script src="https://maps.googleapis.com/maps/api/js"></script>
```

しかし、APIキーの入力は必須らしいので、遅かれ早かれ必ず取得して下さい。以上。
git fetch failed: A TLS packet with unexpected length was recieved.

[issue]
git fetch failed on PyCharm (Android Studio, IntelliJ IDEA, etc.)

[environment]
Ubuntu
after auto update libraries
under network proxy

[error details]
Fetch failed
fatal: unable to access
'xxxxx.git':
gnutls_handshake() failed: A TLS packet with unexpected length was recieved.
![Screenshot from 2016-08-29 18:24:16.png](https://qiita-image-store.s3.amazonaws.com/0/89172/039fe46b-6852-1f0d-79b6-93866b72744d.png)


http://komamitsu.hatenablog.com/entry/20120619/1340117644

Then got an another error.

Fetch failed
fatal: unable to acccess
'xxxxx.git'
GnuTLS recv error(-9): A TLS packet with unexpected length was received.

![Screenshot from 2016-08-29 18:47:07.png](https://qiita-image-store.s3.amazonaws.com/0/89172/732df2ca-1270-6b34-be1c-29806551182c.png)



[cause]
> Got reason of the problem, it was gnutls package. It's working weird behind a proxy.

[measure]
> we should compile git with openssl.

http://askubuntu.com/questions/186847/error-gnutls-handshake-failed-when-connecting-to-https-servers/187199#187199

[elapsed time]
It took about an hour to build the package.
[JAWS-UG CLI] AutoScaling:#6 異常インスタンスの停止


前提条件
========


AutoScalingへの権限
-------------------

AutoScalingに対してフル権限があること。


EC2への権限
-----------

EC2に対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.10.58

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.10.58 Python/2.7.11 Darwin/15.6.0 botocore/1.4.48


0. 準備
=======


0.1. リージョンの決定
---------------------

```bash:変数の設定:
AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認:
----------------

プロファイルが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

結果(例):

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       ec2as_full-prjZ-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region        ap-northeast-1        env    AWS_DEFAULT_REGION


1. 事前作業
===========


対象インスタンスの指定
----------------------

```bash:変数の設定:
EC2_INSTANCE_ID=<稼動中のインスタンスのID>
```


2. 異常インスタンスの停止
=========================

```bash:変数の設定:
AS_INSTANCE_HEALTH_STAT='Unhealthy'
```

```bash:変数の確認:
cat << ETX

        EC2_INSTANCE_ID:         ${EC2_INSTANCE_ID}
        AS_INSTANCE_HEALTH_STAT: ${AS_INSTANCE_HEALTH_STAT}

ETX
```

```bash:コマンド:
aws autoscaling set-instance-health \
        --instance-id ${EC2_INSTANCE_ID} \
        --health-status ${AS_INSTANCE_HEALTH_STAT}
```

結果(例):

      (戻り値なし)


3. 事後作業
===========

```bash:コマンド:
aws autoscaling describe-auto-scaling-instances 
```

結果(例):

      {
        "AutoScalingInstances": [
          {
              "ProtectedFromScaleIn": false,
              "AvailabilityZone": "ap-northeast-1a",
              "InstanceId": "i-xxxxxxxx",
              "AutoScalingGroupName": "asgroup-handson-20160829",
              "HealthStatus": "UNHEALTHY",
              "LifecycleState": "Terminating",
              "LaunchConfigurationName": "launchcongig-handson-20160829"
          }
        ]
      }

"HealthStatus"が"UNHEALTHY"になり、"LifecycleState"が"Terminating"になります。

しばらくすると、以下のように別のインスタンスが起動してきます。

結果(例):

      {
        "AutoScalingInstances": [
          {
              "ProtectedFromScaleIn": false,
              "AvailabilityZone": "ap-northeast-1c",
              "InstanceId": "i-xxxxxxxx",
              "AutoScalingGroupName": "asgroup-handson-20160829",
              "HealthStatus": "HEALTHY",
              "LifecycleState": "InService",
              "LaunchConfigurationName": "launchcongig-handson-20160829"
          }
        ]
      }

```bash:コマンド:
aws ec2 describe-instances \
        --filters Name=instance-state-name,Values=${EC2_INSTANCE_STATUS} \
        --query 'Reservations[].Instances[].InstanceId'
```

結果(例):

      [
        "i-xxxxxxxx"
      ]


完了
====
[JAWS-UG CLI] AutoScaling:#5 インスタンスの削減



*********************


前提条件
========


AutoScalingへの権限
-------------------

AutoScalingに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.10.58

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.10.58 Python/2.7.11 Darwin/15.6.0 botocore/1.4.48


0. 準備
=======


0.1. リージョンの決定
---------------------

```bash:変数の設定:
AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認:
----------------

プロファイルが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

結果(例):

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       ec2as_full-prjZ-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region        ap-northeast-1        env    AWS_DEFAULT_REGION


1. 事前作業
===========

```bash:変数の設定:
AS_DESIRED_CAPACITY='1'
```


2. インスタンスの削減
=====================

```bash:変数の確認:
cat << ETX

        AS_GROUP_NAME:       ${AS_GROUP_NAME}
        AS_DESIRED_CAPACITY: ${AS_DESIRED_CAPACITY}

ETX
```

```bash:コマンド:
aws autoscaling set-desired-capacity \
        --auto-scaling-group-name ${AS_GROUP_NAME} \
        --desired-capacity ${AS_DESIRED_CAPACITY}
```

結果(例):

      (戻り値なし)


3. 事後作業
===========

```bash:コマンド:
aws autoscaling describe-auto-scaling-instances 
```

結果(例):

      {
        "AutoScalingInstances": [
          {
              "ProtectedFromScaleIn": false,
              "AvailabilityZone": "ap-northeast-1a",
              "InstanceId": "i-xxxxxxxx",
              "AutoScalingGroupName": "asgroup-handson-20160829",
              "HealthStatus": "HEALTHY",
              "LifecycleState": "Terminating",
              "LaunchConfigurationName": "launchcongig-handson-20160829"
          },
          {
              "ProtectedFromScaleIn": false,
              "AvailabilityZone": "ap-northeast-1c",
              "InstanceId": "i-xxxxxxxx",
              "AutoScalingGroupName": "asgroup-handson-20160829",
              "HealthStatus": "HEALTHY",
              "LifecycleState": "InService",
              "LaunchConfigurationName": "launchcongig-handson-20160829"
          }
        ]
      }

片方のインスタンスが "LifecycleState": "Terminating" になっていれば、
インスタンスの削減が成功しています。

```bash:コマンド:
aws ec2 describe-instances \
        --filters Name=instance-state-name,Values=${EC2_INSTANCE_STATUS} \
        --query 'Reservations[].Instances[].InstanceId'
```

結果(例):

      [
        "i-xxxxxxxx"
      ]


完了
====
iOSシミュレータを同時に2台起動する方法

##シミュレータがあるディレクトリに移動
```
cd /Applications/Xcode.app/Contents/Developer/Applications
```
違うディレクトリにある場合は環境に合わせて移動。

##シミュレータを起動
```
open -n Simulator.app
```

##もう一台シミュレータを起動
```
open -n Simulator.app
```
そうすると大体怒られる。
![Unable to boot device in current state:Booted](https://qiita-image-store.s3.amazonaws.com/0/78136/5fd1b1c0-ac21-66b6-10ad-9d00d2fc0b3c.png)

> Unable to boot device in current state:Booted

「もう起動しているから起動できないよ」というエラー。

<img width="812" alt="DeviceをHardWareタブから変更する" src="https://qiita-image-store.s3.amazonaws.com/0/78136/cc599200-a760-a01e-c08b-b4de789d3cca.png">

HardWare>Divice>iOSで、**既に起動しているシミュレータと別のデバイスを選択**してやると、正常に起動する。

##その他トラブルシューティング
「片方のシミュレータにフォーカスがいってしまい、もう一台のシミュレータを操作できない！」
ことがたまにある。

そんな時は一旦シミュレータをシャットダウンして、同じ手順でもう一度起動してやると直る。
WebViewをpull-to-refreshでちょいハマった

#case:1

## 症状
ListViewなんかと同じで
WebViewを素直にSwipeRefreshLayoutで囲うだけで
pull-to-refresh対応できてたのが
レイアウトによって？　は、うまく動かなかった。

こんなメッセージが出力されて空振りする。

```
"Got ACTION_MOVE event but don't have an active pointer id."
```

落ちたりはしないんだけど
空振り　→　OK　→　空振り、を交互に繰り返すｗ

## 対処
WebViewをScrollViewで囲う

```xml:layout
前略

<android.support.v4.widget.SwipeRefreshLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <WebView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />

    </ScrollView>

</android.support.v4.widget.SwipeRefreshLayout>
```

## その他
Recyclerとか、他のViewでも同様の現象に対応できるのかも。
レイアウトの書き方によっては問題は起きないので
親とか、階層とかに原因がありそう。

とりあえず何かわかったら追記します。


# case:2

## 症状
さぁーて、次の地雷はこちら！

pull-to-refresh して、それの完了前にUI触ってViewPagerのPageを切り替えるとか
そんなタイミングでこれが出て落ちる。

nullオブジェクトさんのフィールドを参照しようとしてあぼ～んのようなので

```
java.lang.NullPointerException: Attempt to read from field 'int android.view.View.mViewFlags' on a null object reference
```

## 対処
そんなオブジェクツさんは消してしまいましょう。
onDestroy()あたりでremoveViewする。

```
    private SwipeRefreshLayout mRefresh;

    @Override
    public void onDestroy() {
        super.onDestroy();

        if(mRefresh != null) {
            mRefresh.removeAllViews();
        }
    }
```