OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonでbig endianのbinaryを読み込んでndarrayに変換する

バイナリダンプされた実数値の二次元配列をPythonから読む方法を紹介します。
具体的には[ここ](http://database.rish.kyoto-u.ac.jp/arch/jmadata/gpv-original.html)にある地形データを読み込みます。
今回、対象とするのはMSMに使われている地形データです。グリッド数や緯度経度を見る限り、[このディレクトリ](http://database.rish.kyoto-u.ac.jp/arch/jmadata/data/gpv/original/etc/200709/)のデータが現状のMSMに対応していそうです。

[README](http://database.rish.kyoto-u.ac.jp/arch/jmadata/data/gpv/original/etc/200709/README_200709.txt)によると、

```
4. ファイル形式
 (1) データ形式
    4バイト実数(IEEE754)の2次元配列です。
    バイトの並びはbig endianです。
 (2) 座標系
    等緯度経度格子座標系です。

    (a) メソ数値予報モデルGPV
       格子数：  東西方向   481    南北方向   505
       格子間隔：東西方向 0.0625度  南北方向 0.05度
       先頭の格子点：北緯47.6度  東経120度 
(中略)
(3) データ格納順序
    先頭の格子点から緯度の同じ格子点を経度方向東向きに格納し，
  そのすぐ南の緯度で同様に繰り返し格納しています。
```
とのことです。

以下の例では、

```
地表ジオポテンシャル高度データ
    (a) "TOPO.MSM_5K_20071121"    メソ数値予報モデルGPV用
```
このデータを例に説明します。
まずはデータのダウンロード。

```
$ wget http://database.rish.kyoto-u.ac.jp/arch/jmadata/data/gpv/original/etc/200709/TOPO.MSM_5K_20071121
```

あとはpythonで作業します。`numpy`がインストールされているものとします。

```py3
import numpy as np
f = open("TOPO.MSM_5K_20071121",mode='rb')
topo = np.fromfile(f, dtype='>f',sep='').reshape(505,481)
```

これで、505x481のMSMと同じサイズで地形の高度データを読み込むことができます。
fromfileで`dtype='>f'`としてbigendianの4バイト浮動小数としてデータを読み込んで、1次元配列に保存して、それを`reshape`しています。
fromfileはdtypeを指定することで、1次元配列以外もとれるのですが、`dt = np.dtype(('>f',(505,481)))`こういう感じで指定しても`topo.shape = (1,505,481)`のように3次元配列になってしまいます。
dtypeのドキュメントも確認したのですが、いい感じに一発で二次元配列にはできないみたいです。

正しく読み込まれているかを確認するために可視化してみましょう。
詳細は[こちらの記事](http://qiita.com/mhangyo/items/f06debce3975a269a658)を参考にしてください。

```py3
%matplotlib inline
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import pygrib

grbs = pygrib.open('/temp/Z__C_RJTD_20170102000000_MSM_GPV_Rjp_Lsurf_FH00-15_grib2.bin')
grb = grbs.select(forecastTime=0)[0]
lats, lons = grb.latlons()
flat_lats= np.ravel(lats)
flat_lons= np.ravel(lons)
m = Basemap(llcrnrlat=lats.min(),urcrnrlat=lats.max(), llcrnrlon=lons.min(),urcrnrlon=lons.max())
m.drawcoastlines()
m.contourf(flat_lons, flat_lats, b, latlon=True, tri=True)
plt.colorbar()
plt.show()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/113628/1ff6697d-413d-9298-6368-47f572516d28.png)

ちなみに[海陸分布データ](http://database.rish.kyoto-u.ac.jp/arch/jmadata/data/gpv/original/etc/200709/LANDSEA.MSM_5K_20071121)だと以下みたいになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/113628/b8286a52-f008-d116-011b-045e5af0b9e5.png)
RStudioでVimモード使用中にキーよる移動が繰り返されない時に（MacBook）

マックブックでRStudioを使う場合、Vimモードの時に h, j, k, l キーを押しっぱなしにしても、キーが繰り返されずに一歩しか動かない場合がある。

これはアップルの設定によるものらしく、挙動を変更するには、端末から下記を実行すればよいとのこと。

```
defaults delete -g ApplePressAndHoldEnabled
defaults write -app RStudio ApplePressAndHoldEnabled -bool false
```


なんでも調べてみるものだ。

参考：[RStudio Support](https://support.rstudio.com/hc/en-us/articles/204896737-Fix-Vim-Mode-Repeating-Keys-on-Mac-OS-X)
さくらのクラウドのスタートアップスクリプトで作ったMastodonインスタンスをv1.5系にバージョンアップする際の注意事項


[ゼロからはじめるMastodonインスタンス運用編](http://knowledge.sakura.ad.jp/knowledge/8683/) や、近日発売の拙著 [「Mastodon入門ガイド」](http://amzn.to/2fleEmP) に、さくらのクラウドのスタートアップスクリプトで作成したMastodonのバージョンアップ手順を記載しておりますが、v1.4系からv1.5系へバージョンアップする際に、依存パッケージの問題で、そのままだとバージョンアップできません。

rootユーザで以下のコマンドを実行してください。
`yum install -y libidn-devel libicu-devel`

それ以降は従来の手順と同様です。

なお、2017/8/7現在、さくらのクラウドのスタートアップスクリプトを使用してMastodonインスタンスを作成するとv1.5.1がインストールされますので、新規作成に関しては意識する必要はありません。
DockerでVOLUMEファイルを試す


This is how we setup docker
[dockerのセットアップは、こちらを見て下さい](http://qiita.com/joji/items/39f5488308fc166964d8 "dockerのセットアップは、こちらを見て下さい") 

I will implemt this structure.

![スクリーンショット 2017-08-07 16.19.30.png](https://qiita-image-store.s3.amazonaws.com/0/39073/c4515699-411c-ad63-a98d-e121319db476.png "スクリーンショット 2017-08-07 16.19.30.png")

Create dockerfile for a volume

```:Dockerfile
FROM centos:latest
MAINTAINER 0.1 joji@test.com
RUN ["mkdir", "/var/log/httpd"]
VOLUME /var/log/httpd
```

Create image

```:bash
sudo docker build -t log-volume-image .
```

check it

```:bash
sudo docker images | grep log
#log-volume-image    latest              ea4362acfb12        11 minutes ago      193MB
```

Create dockerfile for Apache

```:Dockerfile
FROM centos
MAINTAINER taro yamada <taro.yamada@bibo.com.ph>
# RUN: It executes when it is built
RUN yum -y install httpd
EXPOSE 80
# CMD: It executes when it is running
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
```

```:bash
sudo docker build -t httpd-image .
```

check it

```:bash
sudo docker images | grep httpd
#httpd-image         latest              8d1d89cb6ce4        34 seconds ago      332MB
```

start container for log

```:bash
sudo docker run -it --name log-container log-volume-image
```

start container for httpd

```:bash
sudo docker run -d --name httpd-container \
                          -p 8080:80 \
                          --volumes-from log-container httpd-image
```

start another container for httpd. The difference is just name and port.

```:bash
sudo docker run -d --name httpd-container-2 \
                          -p 8081:80 \
                          --volumes-from log-container httpd-image
```

You can access here

```:browser
http://192.168.55.44:8080/
http://192.168.55.44:8081/
```

check log file. attach container

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

You can see a log file by this command

```:bash
tail -f /var/log/httpd/access_log
```

You can check also in httpd server.


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

```:bash
tail -f /var/log/httpd/access_log
```
macからsota(Edison版)にserial接続する方法

## 事前準備
macとsotaをmicro usbケーブルで接続する。

## tty接続のリスト
```sh
ls -l /dev/tty.*
```

## serial 接続
```sh
screen /dev/tty.SLAB_USBtoUART 115200
```
python3x: print functionで使えるend argment

python3ではprint関数は（おそらく）`print(arg, end='\n')` と定義されている。これは引数がアウトプットされた後に丁寧に改行してくれるように。ただそれをいじってあげることができる。簡単な例で言えば、

```
def value(l):
    for items in l:
        print(items, end=' ')

>>> val = value([el for el in range(1,11)]) #1 2 3 4 5 6 7 8 9 10
#endが指定されていないと
>>> print([el for el in range(1,11)]) 
1
2
3
4
5
6
7
8
9
10
# 改行されて表示される
RaspberrypiにインストールしたOpenFlow環境でL2スイッチを動かす

# ブリッジの作成
RaspberryPiにUSB-LANアダプタを取り付ける
ifconfigでインタフェース名を確認する

```
pi@raspberrypi:~ $ ifconfig
eth0      Link encap:イーサネット  ハードウェアアドレス b8:27:eb:37:f1:d2
          inetアドレス:192.168.3.7 ブロードキャスト:192.168.3.255  マスク:255.255.255.0
          inet6アドレス: fe80::ae56:81bc:3c70:485f/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:700 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:365 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000
          RXバイト:59202 (57.8 KiB)  TXバイト:60452 (59.0 KiB)

eth1      Link encap:イーサネット  ハードウェアアドレス 00:22:cf:f9:54:01
          UP BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)

eth2      Link encap:イーサネット  ハードウェアアドレス 00:22:cf:f9:54:10
          UP BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)

lo        Link encap:ローカルループバック
          inetアドレス:127.0.0.1 マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:65536  メトリック:1
          RXパケット:200 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:200 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1
          RXバイト:16656 (16.2 KiB)  TXバイト:16656 (16.2 KiB)

wlan0     Link encap:イーサネット  ハードウェアアドレス b8:27:eb:62:a4:87
          inet6アドレス: fe80::231b:51e:4ca9:c5ae/64 範囲:リンク
          UP BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)
```
インタフェース名はeth1からeth2であることが分かる

# ブリッジを作成する
```
ovs-vsctl add-br br0ovs-vsctl add-br br0
```

#ポートの追加
```
ovs-vsctl add-port br0 eth1
ovs-vsctl add-port br0 eth2
```
#コントローラーの追加
```
ovs-vsctl set-controller br0 tcp:127.0.0.1:6633
```

#サンプルのL2スイッチの起動
```
ryu-manager --verbose  /usr/local/lib/python2.7/dist-packages/ryu/app/simple_switch_13.py
```
Ruby初学者向けの注意点

##不等号
不等号の「<>」が使えない
→代わりに「!=」を使う

##変数展開

```rb
age = 20
puts age + "歳です"
```

上記はNGです

```rb
age = 20
puts "#{age}歳です"
```

上記のように記述します

##VBからのRubyに来た人向け
まあ、私ですｗ

```ryby
if XXX
end if
```
上記は間違いです

```ryby
if XXX
end
```
上記が正しい記述です、間違えそうですｗ
Objective-C で enum を宣言し、Extension して Swiftから利用する

# はじめに
プロジェクトが古い場合やSwiftへの書き換えが途中の場合、Objective-CとSwiftが混在していることがあります。
すでに存在するObjective-C側を少し変更して、Swift側から呼び出したいときに参考にしてください。

※ 私の場合は、Objective-Cが`Entity` or `Model`で、Swiftからその`Entity`を使用するときに利用しました。

# 内容
## 実装方法
```sample.h
typedef NS_ENUM(NSInteger, SampleEnum) {
    SampleEnumNormal = 0,
    SampleEnumFree = 1,
    SampleEnumPaid = 2
};
```

```sample+extensions.swift
extension SampleEnum {
    var title: String {
        switch self {
        case .Normal:
            return "通常"
        case .Free:
            return "無料"
        case .Paid:
            return "有料"
        }
    }
}

```

※Swiftでは以下のように変換されるらしい(参考記事より)

```sample.swift
enum SampleEnum: Int {
    case Normal
    case Free
    case Paid
}
```


## Swiftからの利用方法

```test.swift
SampleEnum(rawValue: 0)?.title
```

## Objective-Cからの利用方法
なし
※通常のEnumとしては使えますが、SwiftでExstensionした中は呼び出せないと思います。ただ、ここはイマイチ理解できていないので、利用する方法があるかもしれません。知っている方はぜひ教えてください。

### 参考記事

- http://qiita.com/yohki/items/d700d6846ce97307588a  
- https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_85
spring boot初心者にありがちなこと（@ComponentScan編）

#事象
　コントローラクラスの@RequestMappingが利かなくなり、画面が表示されなくなった。
　パッケージ構成のリファクタリング時に発生。

#原因
　@SpringBootApplicationで実行される@ComponentScanについてよく分かっていないまま、パッケージ構成を変更してしまった。

#解説
  @SpringBootApplicationで実行されるアノテーションは以下の通り。
　@Target(ElementType.TYPE)
　@Retention(RetentionPolicy.RUNTIME)
　@Documented
　@Inherited
　@SpringBootConfiguration
　@EnableAutoConfiguration
　@ComponentScan(excludeFilters = {
　    @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
　    @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

　上記のうち、@ComponentScanは@Componentのアノテーションが付いたクラスを走査し、利用できるようDIする。
　（コントローラに付加する@Controllerは、@Componentを内包している。）
　@ComponentScanは、@ComponentScanが付いたクラスのパッケージと、その配下のパッケージを走査する。
　今回はコントローラ群のリファクタリング時に、@ComponentScanを並列して存在するパッケージに移してしまった。

▼com.example
　▼application
　　▼Application.java
　▼controller
　　▼IndexController.java
　　・・・
　▼entity
　・・・

#対応
　@ComponentScanを持つApplicationクラスが最上位に来るよう、パッケージ構成をリファクタリング。

▼com.example
　▼Application.java
　▼component
　　▼controller
　　　▼IndexController.java
　　　・・・
　　▼entity
　　・・・
パネル風のTableのtdエリア全体をaタグの有効範囲にする

html/cssのTableのtdのエリア全体をaタグの有効範囲にしたかったので作業をメモ。

#パネル風のTable

テーブルを作ります。デザインはフラットな感じにしました。
とりあえず、やりたいことは２つ。

1．Tableのtdのエリア全体をaタグの有効範囲にする。
2．パネル風（文字を中央に寄せる）にする。

![スクリーンショット 2017-08-07 15.36.52.png](https://qiita-image-store.s3.amazonaws.com/0/55407/6ac41cb0-cf65-214f-09c3-5ddcd8a7e426.png)


```ruby:HTML
<table>
<tr>
<td><a href="http://#">eria1</a></td>
<td><a href="http://#">eria2</a></td>
<td><a href="http://#">eria3</a></td>
</tr>
</table>

```


```ruby:CSS
table {
   table-layout: fixed;
   border-collapse: separate;
   border-spacing: 10px;
   width:100%;
}

table td {
   background-color: #ccc;
   width:150px;
   height:150px;
   font-size:14pt;
   text-align: center;
   vertical-align:middle;
}

table td a{
   color:#fff;
   text-decoration: none;
} 

```

##エリア全体をaタグ有効範囲にする

>    display: block;
>    width: 100%;
>    height: 100%;

この三つをaタグに指定するってネット検索したら出てきたので、やってみました。

```ruby:css
table td a{
    text-decoration: none;
    color:#fff;  
 
    display: block;
    width: 100%;
    height: 100%;
} 

```

![スクリーンショット 2017-08-07 15.38.46.png](https://qiita-image-store.s3.amazonaws.com/0/55407/4b6533be-ebec-2282-bd61-6ea3733325bc.png)


aタグは、エリア全体に広がったのですが、display:block; を使ったため、vertical-align:middle;　を使えなくなってしまいました。そのため、文字が真ん中に揃っていない。


##tdの微調整 Part.１

文字を真ん中に揃えるため、まずは line-height を使ってみました。tdの高さを指定します。

```ruby:css
table td a{
    text-decoration: none;
    color:#fff;  
    display: block;
    width: 100%;
    height: 100%;

    line-height: 150px;
} 

```
aタグはエリア全体になって、文字が真ん中に揃った！

![スクリーンショット 2017-08-07 15.36.52.png](https://qiita-image-store.s3.amazonaws.com/0/55407/6ac41cb0-cf65-214f-09c3-5ddcd8a7e426.png)


けど、中の文字を二行にすると、広がってしまいます。line-heightだから、当然なんだけど・・・tdの中身が改行なしなら問題ないです。

![スクリーンショット 2017-08-07 15.39.49.png](https://qiita-image-store.s3.amazonaws.com/0/55407/444c434d-95fa-492b-41a0-a39fdc7d0640.png)



##tdの微調整 Part.２ （文字が２行になっても対応）

```ruby:css
table td a{
    text-decoration: none;
    color:#fff;      
    display: block;
    width: 100%;
    height: 100%;

    padding:50px 0;
} 

```

１行と２行だとずれてしまうけど、なんとか真ん中に寄せられる感じです。

![スクリーンショット 2017-08-07 15.35.44.png](https://qiita-image-store.s3.amazonaws.com/0/55407/e4594a83-0c22-fd2d-3d8a-47c8bad10dc3.png)


力技ではなく、調整できるといいのだけど。


##追記　Part.３ これが一番かも


「[パネル風のListのliエリアをaタグの有効範囲にする](http://qiita.com/Yoko3/items/0d10a6547100542fad77)」で、Listタグでも同じことができるか調査していたところ、発見！

table td a を幅を大きくするために、下記コードを記述。
>margin: -75px;
>padding: 75px 75px;

table td　からはみ出した部分を表示しないように、下記コードを記述。
>overflow: hidden;



```ruby:css
table {
   table-layout: fixed;
   border-collapse: separate;
   border-spacing: 10px;
}

table td {
   background-color: #ccc;
   width:150px;
   height:150px;
   font-size:14pt;
   text-align: center;
   vertical-align:middle;
   overflow: hidden;
}

table td a{
   color:#fff;
   text-decoration: none;
   margin: -75px;
   padding: 75px 75px;
} 

table td a:hover{
   background-color:#aaa;
} 
```

カーソル当てると、tdエリア全体がaタグの有効範囲に！

![スクリーンショット 2017-08-09 10.27.48.png](https://qiita-image-store.s3.amazonaws.com/0/55407/986e22c6-dde9-57c6-98a0-a5240db71baa.png)

これで完成かな。
Docker マウント場所を間違えた場合の対処方法

## 目的

- Docker 起動時にマウントする場所を間違えたのでここまで作業したコンテナをイメージで固めて再度 docker run します。(変更はできないようです。)

## Docker イメージ作成

- まず 固める元の Docker を停止します。

```
Inohana:repo inoko$ docker ps
CONTAINER ID        IMAGE                         COMMAND               CREATED             STATUS              PORTS               NAMES
aba5acb67223        centosv7                      "tail -f /dev/null"   7 minutes ago       Up 7 minutes                            test

Inohana:repo inoko$ docker stop aba5acb67223
aba5acb67223

Inohana:repo inoko$ docker ps -a
CONTAINER ID        IMAGE                         COMMAND               CREATED             STATUS                            PORTS               NAMES
aba5acb67223        centosv7                      "tail -f /dev/null"   10 minutes ago      Exited (137) About a minute ago                       test
```

- Docker commit コマンドでイメージを作成します。

```
Inohana:repo inoko$ docker commit test test2:centosv7
sha256:c897d674772a7ecc9261f8402bb038b64122aab4258a77ea27c8e71c7acf731a

Inohana:repo inoko$ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
test2                   centosv7            c897d674772a        46 seconds ago      1.04GB
centosv7                 latest              06dfd01df1d2        42 minutes ago      1.04GB
```

- 作成した test2:centosv7 を通常の手順で Docker 起動します。



[参考]
https://teratail.com/questions/60233
http://qiita.com/tubone/items/a3bad04abf4c700cae3d


- 注意点としては、保存されるのはディスクイメージで、プロセスは保存されないということですね。

[参考]
http://enakai00.hatenablog.com/entry/20140628/1403933390
AWS CloudWatchでEC2の死活監視

#CloudWatchとは

AWSで実行されているアプリケーションをリアルタイムでモニタリングするサービス。
あくまでもモニタリングサービスなので監視サービスとして完全なる役割を果たすことができるかどうかは利用の仕方によるところかと思います。
カスタムメトリクスも駆使すればzabbixの代用もある程度は可能なのかもしれません。

#EC2の死活監視をする

コンソールにログインして対象のEC2インスタンスを選択します。
タブで、ステータスチェックを選択、[ステータスチェックアラームの作成]を行います。
![CW_01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/811388ff-29ce-2aa1-6425-96e9e585eb0a.png)

アラームの通知先はあらかじめSNSで作成。
SNSの作成についてはこちら。↓
[AWS SNS(Amazon Simple Notification Service)の通知設定をしてみる](http://qiita.com/ai-2723/items/dab1df52eda4d57f7539)

![CW_02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/3a0cce8f-e6bc-9eb1-28fc-6d739c62fc32.png)

アラームの作成ポチッとして、作成が完了です！

![CW_03.png](https://qiita-image-store.s3.amazonaws.com/0/174392/7c317e41-2c4c-c31f-edc6-e68ce78ddabe.png)

CloudWatchの画面からも設定したアラームが正常に設定されたことが確認できました。

![CW_04.png](https://qiita-image-store.s3.amazonaws.com/0/174392/bdefb95e-b7a2-8acf-7215-16c90a936148.png)

以上でEC2の死活監視の設定ができました。
PHPのPOST数上限

#### 多数の項目があるフォームをPOSTした時に、全て飛んで来ずにハマった時の話。

PHPには _GET, _POST, _COOKIE それぞれのパラメータ数の上限がある様です。
設定数を越えるパラメータは無視されます。
PHP 5.3.9 以降で有効。
初期値は1000に設定されており、以下のパラメータで変更することが可能です。

```php.ini
max_input_vars 2000
```
または、

```.htaccess
php_value max_input_vars 2000
```
[php manual 実行時設定](http://php.net/manual/ja/info.configuration.php#ini.max-input-vars)
>入力変数 を最大で何個まで受け付けるかを指定します (この制限は、スーパーグローバル _GET、_POST そして _COOKIE にそれぞれ個別に適用されます)。 このディレクティブを使うと、ハッシュの衝突を悪用したサービス不能攻撃を受ける可能性を軽減できます。 このディレクティブで設定した数を超える入力変数があった場合は E_WARNING が発生し、 それ以降の入力変数はリクエストから削除されます。

PHP歴は長いですが、初めて弾かれました。
誤差の確認 > 相対誤差 | numpy histogram

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.1.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

http://qiita.com/7of9/items/02313f11d2917ed2b040
にて使用したファイル

- 学習元ファイル
- 学習結果ファイル

相対誤差のヒストグラムを作ってみた。

### code

Jupyter code.

```py:histogram_relErr_170807.ipynb
% matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

FILE_ANSWER = 'LN-IntField-Y.in'
FILE_PREDICTION = 'IntField-Y.out_170729'


def calc_relativeError(ans, prd):
    err = (ans - prd) / ans
    err = np.absolute(err) * 100  # [%]
    return err


def get_list_err(idx):
    dstlist = np.array([])
    ans = np.genfromtxt(FILE_ANSWER, delimiter=' ', skip_header=2)
    prd = np.genfromtxt(FILE_PREDICTION, delimiter=' ', skip_header=2)
    for answer, prediction in zip(ans, prd):
        exr_a = answer[idx]
        exr_p = prediction[idx]
        err = calc_relativeError(exr_a, exr_p)
        dstlist = np.append(dstlist, err)
    return dstlist


def draw_graph(fig, readIdx, locIdx, label):
    ax1 = fig.add_subplot(3, 2, locIdx)
    elist = get_list_err(readIdx)
    ax1.hist(elist, bins=30, ec='black', range=(0.0, 100.0))
    ax1.set_title(label)

# x y z |E|^2 Ex.r Ex.i Ey.r Ey.i Ez.r Ez.i
IDX_EXR, IDX_EXI = 4, 5
IDX_EYR, IDX_EYI = 6, 7
IDX_EZR, IDX_EZI = 8, 9

fig = plt.figure(figsize=(10, 10))
draw_graph(fig, readIdx=IDX_EXR, locIdx=1, label='EXR')
draw_graph(fig, readIdx=IDX_EXI, locIdx=2, label='EXI')
draw_graph(fig, readIdx=IDX_EYR, locIdx=3, label='EYR')
draw_graph(fig, readIdx=IDX_EYI, locIdx=4, label='EYI')
draw_graph(fig, readIdx=IDX_EZR, locIdx=5, label='EZR')
draw_graph(fig, readIdx=IDX_EZI, locIdx=6, label='EZI')

```

### 結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ce145a26-9341-11a2-a36c-5b3cc9e6a0e7.png)

## 参考

matplotlibのヒストグラムで分割線を表示
http://qiita.com/KYhei/items/cde00bf31bb0c9c18260


[Python]Matplotlibでヒストグラムを描画する方法
http://qiita.com/supersaiakujin/items/be4a78809e7278c065e6
AWS Lambdaでやってはいけないこと（Watson呼び出しでドハマリした）

folderを一個作ってその下にmoduleその他をまとめておいてFolderごと圧縮してはいけない。
そうではなくて、index.jsとnode_module等を複数選択して圧縮してアップロードしなければいけない。


##追記
WatsonはMacでnpm module追加してLambdaにzip化してアップロードしても動くが、GoogleはちゃんとLinuxでnpm追加しないとmoduleが最適化されていないらしく、Lambdaで`invalid ELF header`エラーが出るので、仮想環境をローカルに作って、npmでmoduleを組み込んでからアップロードする必要があります。
Android PopupMenuの背景を設定する方法

### styles.xml
- `styles.xml` に `PopupMenu`を設定
  - rippleにも対応したいときは `colorBackground` に任意のcolorを設定します
  - ripple対応しなくていいときは `itemBackground` でOK

```styles.xml
<style name="PopupMenu" parent="@android:style/Widget.PopupMenu">
        <item name="android:colorBackground">@color/my_background_color</item>
</style>
```

### Activity
- `ContextThemeWrapper` の第1引数にcontext、第2引数にスタイル `R.style.PopupMenu` を指定
- `PopupMenu` の第1引数に `ContextThemeWrapper` を指定
  

```HogeActivity.kt
val color = ContextThemeWrapper(this, R.style.PopupMenu)
val popup = PopupMenu(color, view)
```

これでPopupMenuの背景が設定できます

## 参考URL
https://stackoverflow.com/a/40017199/6098554
ファイルのタイムスタンプに依存してコンパイル結果が変わるコード

# はじめに

インクルードガードに#pragma once使っていいのか、それともダメなのかがよくわからなかったのでいろいろ試して見た。

ちなみに以下で使うGCCとclangのバージョンはそれぞれ以下の通り。

* g++ (Homebrew GCC 6.3.0_1) 6.3.0
* Apple LLVM version 8.1.0 (clang-802.0.42)

# 実験1

こんななんの変哲もないソースを書く。

```cpp:test.cpp
#include <iostream>
int
main(void){
#include "test1.hpp"
#include "test2.hpp"
#include "test3.hpp"
}
```

次に`test1.hpp`を書く。

```cpp:test1.hpp
#pragma once
std::cout << "Hello" << std::endl;
```

これをコピーする。

```shell-session
$ cp test1.hpp test2.hpp
$ cp test1.hpp test3.hpp
```

これをこのままコンパイル、実行してみよう。

```shell-session
$ g++ test.cpp; ./a.out
Hello
Hello
Hello

$ clang++ test.cpp; ./a.out  
Hello
Hello
Hello
```

それぞれ別のヘッダだと認識され、３回実行された。ここまでは想定の動作である。

次に、これらのヘッダファイルのタイムスタンプを一致させてみよう。

```shell-session
$ touch test*.hpp 
```

この状態で、同じことをやると・・・

```shell-session
$ g++ test.cpp; ./a.out  
Hello

$ clang++ test.cpp; ./a.out
Hello
Hello
Hello
```

GCCの方は一度しか表示されない。つまり「ファイル名が異なっていても、中身が同じでタイムスタンプも同じファイルは同一のファイルである」とみなしている。clangの方は「ファイル名が異なっていれば、中身に関わらず異なるファイルである」と認識している。ちなみにインテルコンパイラも後者の立場を取る。


# 実験2

一応ディレクトリも変えてやってみよう。

```cpp:test2.cpp
#include <iostream>
int
main(void){
#include "test1.hpp"
#include "dir1/dir1.hpp"
#include "dir2/dir2.hpp"
}
```

```shell-session
$ mkdir dir1; cp test1.hpp dir1/dir1.hpp
$ mkdir dir2; cp test1.hpp dir2/dir2.hpp
$ touch test1.hpp dir1/dir1.hpp dir2/dir2.hpp

$ g++ test2.cpp; ./a.out 
Hello

$ clang++ test2.cpp; ./a.out 
Hello
Hello
Hello
```

ディレクトリが違っても「同じファイル」と認識するようですね。

# 実験3

GCCでは「同じ内容、同じタイムスタンプ」であれば「#pragma once的に同じファイル」とみなされてしまう。なので、すっげーわざとらしいコードだけど、こんなコードを書いてみる。

```cpp:hoge.cpp
#include <iostream>
#include "hoge.hpp"
#include "hoge1.hpp"
#include "hoge2.hpp"

int
main(void){
  Hoge1 h1("hoge1");
  h1.sayhello();

  Hoge2 h2("hoge2");
  h2.sayhello();
}
```

```cpp:hoge.hpp
#pragma once
struct Hoge{
  virtual void sayhello(){};
};
```

```cpp:hoge1.hpp
#pragma once
struct Hoge1 : public Hoge{
  std::string name;
  Hoge1(std::string n) : name(n) {};
  #include "sayhello1.hpp"
};
```

```cpp:hoge2.hpp
#pragma once
struct Hoge2 : public Hoge{
  std::string name;
  Hoge1(std::string n) : name(n) {};
  #include "sayhello2.hpp"
};
```

```cpp:sayhello1.hpp
#pragma once
void sayhello(void){
  std::cout << "My name is " << name << std::endl;
}
```

```cpp:sayhello2.hpp
#pragma once
void sayhello(void){
  std::cout << "My name is " << name << std::endl;
}
```

どうしてこういうコードを書こうと思ったかはどうかはともかく、何か超自然的な力が働いて、`#pragma once`がついているヘッダファイルの中身が一語一句同じものが二つ(`sayhello1.hpp`と`sayhello2.hpp`)存在してしまったとしよう。プログラマは、これら二つのヘッダファイルは別のものだと思ってるし、最初に実行すると意図どおりの実行結果を得る。

```shell-session
$ g++ hoge.cpp
$ ./a.out
My name is hoge1
My name is hoge2
```

さて、このあと、なんか理由があって、彼は全部のファイルを`touch`した。そのあとコンパイルすると実行結果が変わる。

```shell-session
$ touch *.cpp *.hpp
$ g++ hoge.cpp
$ ./a.out
My name is hoge1
```

# まとめ

GCCは「ファイル内容とタイムスタンプが同じであれば、たとえファイル名が異なっていても#pragma once的に同じファイルとみなす」が、それ以外のだいたいのコンパイラはファイル名が異なっていれば違うファイルとみなす。

特にファイルスタンプを見るというのは微妙で、touchをするかしないかで実行結果が変わるようなコードを書くことができる。

・・・で、結局`#pragma once`は積極的に使っていいの？いけないの？
CFアプリ開発と管理#3 大規模アプリのデプロイ

このトピックでは、750 MBを超えるアプリケーションをデプロイするための制約と推奨される設定について説明します。

*注意事項: この記事は、Cloud Foundry Documentaion [Deploying a Large Application ](http://docs.cloudfoundry.org/devguide/deploy-apps/large-app-deploy.html)(last updated: November 9, 2016)からの独自の翻訳とコメントです。 内容を保証するものではありません。*

## デプロイに関する考慮事項と制限事項

デプロイ・プロセスには、アプリケーションのアップロード、ステージング、および起動が含まれます。 アプリケーションのアップロード、ステージング、および起動のデフォルトの時間制限の詳細については、Application Container Lifecycleトピックの「[デプロイメント(配置)](http://qiita.com/MahoTakara/items/905a61ccc56c8daef2de#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%83%A1%E3%83%B3%E3%83%88%E9%85%8D%E7%BD%AE)」セクションを参照してください。

大規模なアプリケーションをCloud Foundryに導入するには、次のことを確認してください。

* アプリ用にアップロードするファイルの合計サイズは、マニフェストのcc.packages.max_package_sizeプロパティで設定されている最大アプリファイルサイズを超えません。
* ネットワーク接続の速度は15分以内にアプリをアップロードするのに十分です。 (最小速度は874 KB/sを推奨しています。) 注：Cloud Foundryは、最低20分間有効な認証トークンを提供します。
* アプリのすべてのインスタンスに十分なメモリを割り当てます。 cf pushで-mフラグを使用するか、manifest.ymlファイルのapp memory 値を設定します。

* アプリケーションのすべてのインスタンスに十分なディスク領域を割り当てます。 cf pushで-kフラグを使用するか、manifest.ymlファイルのdisk 領域割り当て値を設定します。

* アプリケーション・マニフェストファイル manifest.yml を使用する場合は、アプリのメモリ、アプリの開始タイムアウト、ディスクスペースの割り当てなどの属性に適切な値を指定するようにしてください。

* マニフェストの使用の詳細については、「[アプリ・マニフェストによるデプロイ](http://qiita.com/MahoTakara/items/888ffdadbf34fd2033d6)」のトピックを参照してください。

* アプリケーションに必要なファイルだけをプッシュします。

* この要件を満たすには、アプリケーションのディレクトリだけをプッシュし、不要なファイルを削除するか、.cfignoreファイルを使用して[除外ファイル](http://docs.cloudfoundry.org/devguide/deploy-apps/prepare-to-deploy.html#exclude)を指定します。
* 必要に応じて、Cloud Foundry CLI（コマンドラインインターフェイス）のステージング、起動、およびタイムアウト設定を構成して、マニフェストの設定を上書きします。

     * CF_STAGING_TIMEOUT：CF CLIが、Cloud Foundryがアプリケーションを正常にアップロードしてパッケージ化した後に、アプリケーションのステージングを待つ最大時間を制御します。 値は分単位で設定します。
     * CF_STARTUP_TIMEOUT：cf CLIがアプリケーションの起動を待つ最大時間を制御します。 値は分単位で設定します。
     * cf push -t TIMEOUT：cf CLIがアプリの起動を待つ最大時間を制御します。 このフラグを使用すると、cf CLIはマニフェストまたはCF_STARTUP_TIMEOUT環境変数で設定されたアプリ開始タイムアウト値を無視します。 値は秒単位で設定されます。

cf CLIを使用してアプリケーションをデプロイする方法の詳細については、「cf CLI入門」のプッシュセクションを参照してください。

    注：cf CLIのタイムアウト設定を変更しても、アプリケーションのステージングや起動など、Cloud Foundryのサーバー側のジョブのタイムアウト制限は変更されません。 マニフェストでサーバー側のタイムアウトを変更する必要があります。 Cloud Foundryとcf CLIタイムアウト値の違いにより、cf CLIがApp failedを報告しても、アプリが正常に起動する可能性があります。 cf apps APP_NAMEを実行して、アプリの実際のステータスを確認します。


## デフォルト設定と制限のまとめ表

この表には、大規模なアプリケーションをCloud Foundryにデプロイするときに考慮する制約とデフォルト設定の概要情報が記載されています。

| Setting | 	Note |
|:--      |:--     |
| App Package Size | 	Maximum: Set in the cc.packages.max_package_size in the manifest |
|Authorization Token Grace Period | 	Default: 20 minutes, minimum |
|CF_STAGING_TIMEOUT | cf CLI environment variable Default: 15 minutes |
|CF_STARTUP_TIMEOUT |	cf CLI environment variable Default: 5 minutes |
|cf push -t TIMEOUT |	App start timeout maximum  Default: 60 seconds|
|Disk Space Allocation | 	Default: 1024 MB |
|Internet Connection Speed | Recommended Minimum: 874 KB/s |
vagrantでLAMP環境構築（バーチャルホスト）

#vagrant vhostの設定
```ruby:ターミナル
#プラグインをインストール
$ vagrant plugin install vagrant-hostsupdater
$ vagrant plugin list

vi Vagrantfile
# 好きなホスト名を入れます。
config.vm.hostname = "localhost"
# 好きなバーチャルホスト名を入れます。
config.hostsupdater.aliases = ["vagrant.test", "vagrant.test2"]
```

Macの場合、/etc/hostsが自動的に書き換わる。
/private/etc/hostsとシンボリックリンクされ、vagrant haltで自動的に破棄されるようです。

ゲストマシンのhttpd.confを設定する

```ruby:Centos
vi /etc/httpd/conf/httpd.conf

# 好きなサーバーネームを入れます。
ServerName vagrant

#コメントを外す
NameVirtualHost *:80

# ServerNameは、Vagrantfileのバーチャルホスト名に合わせます
<VirtualHost *:80>
DocumentRoot "/var/www/html/test"
ServerName vagrant.test
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "/var/www/html/test2"
ServerName vagrant.test2
</VirtualHost>
```
```ruby:Centos
#httpd.conf文法チェック
apachectl configtest
#apache再起動
service httpd restart
```
hubot-reviewer-lottoのエイリアス

ただの備忘録です。

# 何？

ご存知だとは思いますが、[Hubot](https://hubot.github.com/)とは、OSSのチャットボットでNode.JSで動作します。
[hubot-reviewer-lotto](https://github.com/sakatam/hubot-reviewer-lotto)は、HubotにGitHubのレビュアーを自動で割り振らせるプラグインのことです。

# で？

依頼するときのメッセージが`[ボット名] reviewer for [リポジトリ名] [PR番号]`になり、覚えるのもタイプするのも、少々めんどうです。
なので、このメッセージを`r? [PR番号] [リポジトリ名]`くらいに短縮したいなーと思った次第です。

# 結果

元のソースコードを変えるのはアレだなーと思って、元のメッセージをバイパスするエイリアスを作ってみました。

```coffeescript
# CoffeeScriptです
Robot = require('hubot')

module.exports = (robot) ->
  # ボット名も省略して`r? [PR番号] [リポジトリ名]`のみにする。
  # メインリポジトリの場合は、リポジトリ名も省略できる！
  robot.hear /^r\?\s+(\d+)(\s+)?(\w+)?$/i, (res) ->
    prNo       = res.match[1]
    prRepoName = res.match[3] || 'hoge'

    # hubot-reviewer-lottoへパス
    res.robot.receive new Robot.TextMessage(res.message.user, "#{res.robot.name} reviewer for #{prRepoName} #{prNo}")
```

たったこれだけです。

HubotもJavaScriptもCoffeeScriptも詳しい方ではないので、これが良いのかどうか分かりませんが、当初の目的は達成できました！
Instagram API  を使ってみた

Instagram APIを使うまでの初期設定を行ってみた。

Instagram APIは、今年の初めにAPIが変更になり、
自分の投稿しか取得できなくなったようです。
他のユーザ情報を取得するためには、
承認をしてもらう必要があるようです。

※ 2017年6月時点の情報なので、変わっていたら最新のやり方で実施ください。

以下のInstagram 管理画面から、「Register a New Client」 ボタンから
API利用設定を行う

[https://www.instagram.com/developer/clients/manage/](https://www.instagram.com/developer/clients/manage/)

### AccessToken を取得

AccessToken を発行する際に設定する CODE を取得する
下記URLにブラウザからアクセスをする

```
https://api.instagram.com/oauth/authorize/?client_id=[CLIENT ID]&redirect_uri=[REDIRECT URI]&response_type=code
```

こんなURLにリダイレクトされるので、CODＥ 部分をコピー

```
http://localhost:8000/instgram/webhook?code=[CODE]
```

CODE などの必要なパラメータをセットして、AccessToken取得コマンドを実行する

```
curl \-F 'client_id=[CLIENT ID]' \
>     -F 'client_secret=[CLIENT SECRET]' \
>     -F 'grant_type=authorization_code' \
>     -F 'redirect_uri=[REDIRECT URI]' \
>     -F 'code=[CODE]' \https://api.instagram.com/oauth/access_token
```

結果はこんな感じで帰ってくるので、access_token が取れました。

```
{"access_token": "<！！！ここ！！！>", "user": {"id": "0000000", "username": "nonochichi", "profile_picture": "https://scontent.cdninstagram.com/xxxx/xxxxxx.jpg", "full_name": "Nonoich 123", "bio": "", "website": ""}}
```
[小技] Gitの操作をインタラクティブに取り消す

Git操作を頻繁に間違えるおっちょこちょい(例: @sei40kr )な人に。

# インタラクティブフィルターを導入

[fzf](https://github.com/junegunn/fzf), [peco](https://github.com/peco/peco) などのインタラクティブなフィルターを導入しておきます。

```zsh:.zshrc
zplug 'junegunn/fzf-bin', from:gh-r, as:command, use:'*linux*amd64*', rename-to:fzf
zplug 'junegunn/fzf', use:'shell/{completion,key-bindings}.zsh'
```

# 関数を定義

```zsh:.zshrc
_git-undo-fzf() {
    git reflog 2>/dev/null | \
      perl -lpe 's/^\S+\s+HEAD@\{(\d+)\}/$1/' | \
      fzf | \
      awk -F ':' '{ print "HEAD@{" $1 "}" }' |
      xargs git reset --hard
}

zle -N _git-undo-fzf
```

fzf を使った例です。選択された項目を標準出力で返す仕様であれば、 `fzf` を書き換えるだけで応用可能です。

# キーを割り当て

```zsh:.zshrc
bindkey '^x^z' _git-undo-fzf
```

**Ctrl-X + Ctrl-Z** で...

![temp.png](https://qiita-image-store.s3.amazonaws.com/0/102243/39cc26dd-7a1f-d052-0e39-cd75c7dfdbd8.png)

おしまい。
【Django】電話番号/郵便番号に適したModelを作る

Django単体でアプリケーションを作るときはformの方でバリデーションかければいいのかもしれないけれど、Django REST FrameworkとしてAPIの提供を主とする場合、Modelの方でもバリデーションかけたい
以下は電話番号と郵便番号のフィールドに対してバリデーションをかけている例

```python:models.py
from django.db import models
from django.core.validators import RegexValidator

class SampleModel(model.model):
	tel_number_regex = RegexValidator(regex=r'^[0-9]+$', message = ("Tel Number must be entered in the format: '09012345678'. Up to 15 digits allowed."))
	tel_number = models.CharField(validators=[tel_number_regex], max_length=15, verbose_name='電話番号')
	postal_code_regex = RegexValidator(regex=r'^[0-9]+$', message = ("Postal Code must be entered in the format: '1234567'. Up to 7 digits allowed."))
	postal_code = models.CharField(validators=[postal_code_regex], max_length=7, verbose_name='郵便番号') 
```

このようにすると、正規表現でバリデーションをかけることができる
マッチしないリクエストを送信した場合、それぞれに設定したmessageが返る

ハイフンをつけてレコードを保存したい場合などは、それに適した正規表現を`regex=`のところに書くと良いです

余談としては本当はそれぞれの正規表現を定義したところでmax_lengthも設定できればよかったんだけれど、それはできなかった
Google カレンダーの予定をアイコンで登録する方法

こんちわー @wezardnet です。あっつい日が続いて溶けちゃいそうです :persevere:

> <font color="Crimson">２０１７ 年 １０ 月ごろに Google カレンダーの UI が刷新されました。本記事で書かれている方法は旧 Google カレンダーに限り有効となりますのでご注意ください。。。</font>

> * [New Google Calendar web UI to begin automatically upgrading users on January 8th, 2018](https://gsuiteupdates.googleblog.com/2018/01/new-google-calendar-web-ui-to-begin.html)

さて、弊社ではワークスタイル変革の一環で勤務時間を早出／遅出／通常から選択できる取り組みを行っています。近い将来、フレックスタイム制になる予定みたいです。

社内ルールとして勤務時間の申請は前日までに行う必要があります。申請すると、自分の Google カレンダーに「早出」、「遅出」、「通常」が終日予定で自動登録され、他の社員と共有される運用になっています。↓な感じです。

![calendar icon_00.png](https://qiita-image-store.s3.amazonaws.com/0/12023/97b98a0a-6fe7-ea1f-86ac-2cb712e66a08.png)

終日予定でカレンダーに毎日ぶっこまれると、自分としては他に予定が入っている場合、カレンダーがめっちゃ見づらくなるわけで、本音を言えば迷惑していますｗｗ

そんなわけで、その日の勤務時間が分かればいいだけなんだから、アイコンとか、マークで良いんじゃね？と思ったわけです。天気予報カレンダーみたいにアイコンで予定が登録されれば見やすくなるなぁと思って試しにやってみました。↓こんな感じになります。

![calendar icon_01.png](https://qiita-image-store.s3.amazonaws.com/0/12023/847b0825-0bf7-c097-056f-e5615811d9c0.png)

ちなみに天気予報カレンダーはこんな感じに表示されます。

![calendar_Weather.png](https://qiita-image-store.s3.amazonaws.com/0/12023/94ebc3b0-9426-1a8a-33c7-028b14f778f2.png)

アイコンにマウスカーソルを合わせれば、吹き出しで表示されるので、マニュアルも不要です。

![calendar icon_02.png](https://qiita-image-store.s3.amazonaws.com/0/12023/868b89bc-9b1b-94ff-0f1b-cb9d0e54f37f.png)

それでは登録方法について解説します。

Google カレンダーのブラウザ UI からアイコンの予定を登録することはできません。なので [Google Calendar API](https://developers.google.com/google-apps/calendar/v3/reference) を使って登録します。Go 言語で書けばサクッと実装できちゃいます♪

# コード例
コードは見づらくなるので一部省略します。（例外処理は書いてないけど、実際にはちゃんと書きまっせ :sweat_smile:）

```go
type calendar_m map[string]interface{}

// ペイロードを組み立てる
values := calendar_m {
	"start": calendar_m {
		"date": "2007-08-07", 
		"timeZone": "Asia/Tokyo", 
	}, 
	"end": calendar_m {
		"date": "2007-08-07", 
		"timeZone": "Asia/Tokyo", 
	}, 
	"summary": "{予定のタイトル}", 
	"gadget": calendar_m {
		"iconLink": "{予定に表示するアイコン画像の URL}", 
		"title": "{アイコンの吹き出しで表示する説明文 など}", 
	},
}
payload, _ := json.MarshalIndent(values, "", "    ")

req, _ := http.NewRequest(
	"POST", 
	"https://www.googleapis.com/calendar/v3/calendars/{登録先のカレンダー ID}/events", 
	bytes.NewReader(payload), 
)

req.Header.Set("Authorization", "Bearer {有効な OAuth2 アクセストークン}")
req.Header.Set("Content-Type", "application/json; charset=utf-8")

resp, err := this.Client.Do(req)
if err != nil {
}

body, _ := ioutil.ReadAll(resp.Body)
if resp.StatusCode != http.StatusOK {
}

data, err := simplejson.NewJson(body)
if err != nil {
}

// イベント ID を入手する
id := data.Get("id").MustString()
```

尚、アイコン画像はネット上に公開しておく必要があるので Google Cloud Storage(GCS) などに置いておくと良いでしょう。

# 残念なところ
モバイルアプリで見た場合は **終日予定** と同じように見えてしまいます :disappointed_relieved:

![calendar icon_03.png](https://qiita-image-store.s3.amazonaws.com/0/12023/f0111d0a-a953-6169-ace2-1657b5dad9a8.png)

# まとめ
この事例は弊社の取り組みでしたが、シフト勤務のある会社さんやアジャイル開発での朝会など、ちょっとした予定でカレンダーを ~~汚したくないときに~~ もとい見易くするのに使えるのではないかと思います。。。
日々のルーチンワークを、ただただ運用しているのではなく、面倒だな、とかこういう風にすれば便利になるのにな、とかを常に考えておくとアイデアが生まれてくると思います。

# おわりに、、、
このアイデアが採用されるか、されないかは **会社** 次第です！
Heroku で Flask を使う

Heroku の　Getting Started のサンプルは、django です。そこで、Flask のサンプルを用意してみました。

実行例です。
ブラウザーで、https://ex02.herokuapp.com/ にアクセスした様子です。
![heroku_aug0700.png](https://qiita-image-store.s3.amazonaws.com/0/179446/a9dc55bd-bd4f-e002-0b5e-34b373055203.png)


作業フォルダーに次の３つのファイルを用意します。
hello.py
Procfile
requirements.txt

```py3:hello.py
# -*- coding: utf-8 -*-
# -------------------------------------------------------------------
#
#	hello.py
#
#						Aug/07/2017
# -------------------------------------------------------------------
import os
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
	str_out = ""
	str_out += "<h2>Hello from Python!</h2>"
	str_out += "<blockquote>"
	str_out += "<p>こんにちは</p>"
	str_out += "</blockquote>"
	str_out += "Aug/07/2017 PM 12:49<br />"
#
	return str_out
#
if __name__ == "__main__":
	port = int(os.environ.get("PORT", 5000))
	app.run(host='0.0.0.0', port=port)

# -------------------------------------------------------------------
```

```text:Procfile
web: gunicorn hello:app --log-file -
```

```text:requirements.txt
Flask
gunicorn
```

まず、ローカルでサーバーを動かします。

```text:
$ python hello.py
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
```

次に、heroku にアップロードします。
ex02 はアプリの名です。

```bash:go_upload.sh
heroku login
git init
git add .
git commit -m "init"
heroku create ex02
git push heroku master
```

![heroku_aug0701.png](https://qiita-image-store.s3.amazonaws.com/0/179446/4972efb2-dcbe-9da7-b949-6a50610e9f94.png)

ソースコードを修正したら、次のループを繰り返します。

```bash:go_update.sh
git add .
git commit -m "modified"
git push heroku master
```

Arch Linux での heroku コマンドのインストール方法

```bash
yay -S heroku-cli
```

Ubuntu 22.10 での heroku コマンドのインストール方法

```bash
wget https://cli-assets.heroku.com/install-ubuntu.sh
chmod +x install-ubuntu.sh
sudo ./install-ubuntu.sh
```

アプリの一覧

```bash
heroku apps
```

アプリの削除

```bash
heroku apps:destroy -a ex02
```

heroku のバージョン

```text
$ heroku --version
heroku/7.54.0 linux-x64 node-v16.1.0
```

コードのダウンロード

```bash
heroku git:clone --app ex02
```

参考ページ
[The Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)
AnimateCC (createjs) のメモ

AnimateCCを使った、Canvas+jsの案件を受けることになった。
Flashでの作業は結構慣れたものだと思っていて、多少ブランクは有るが、まぁなんとかなるだろうと思ったけれども、やはりFlashとは別物だと感じたので、備忘録的メモ。

###大体this。
Flashだと、何も考えずに

```
stop();
```

とフレームに書くと、そのフレームでアニメが止まってくれたが、AnimateCCの場合は、

```
this.stop();
```

と、大抵thisをつける必要がある。

###rootの参照は、exportRoot。
rootと呼ばれていた部分のタイムラインにアクセスする場合は、

```
exportRoot.gotoAndStop(2);
```

rootにあるインスタンスsampleのタイムラインを制御するときは、

```
exportRoot.sample.gotoAndPlay("start");
```

###フレームナンバーが1じゃなくて0から。
Flashでは、フレーム1の場所が、フレーム0。
一個ずれてるので、タイムラインの下に見えてる数字を指定すると、ひとつ先を見るので、頭のなかで数字を一つ引く。（例：6は5）

###フレーム1に置かれてないインスタンスは以降のフレームスクリプトから呼べない。
Flash時代は忘れてしまったのだけれども、createjsでは、ステージやmovieclipの0フレーム目にインスタンス名付きオブジェクトがないと初期化してくれない。
例えば、レイヤー１の0フレーム目に空白のキーフレームを置き、1フレーム目にインスタンス"test"を置き、
1フレーム目のフレームスクリプトで、

```
this.test.gotoAndPlay(1);
```

とかしても動かない。
0フレーム目に、インスタンス"test"を置いておかないと、どうも使えないよう。
インスタンスtestにスクリプトがない状態では0フレーム目を空白にしておくか、
testを置いたmcの0フレーム目のtestにキーフレームを打ってアルファを0にすることで対応。

###連番のMCを呼ぶときは、this["obj_" + num]。
MC内に、obj_0,obj_1,obj_2... と置くことってよくあると思うんだけど、とり方がわからず嵌った。
Stage => Sample => objs => obj_n
とあるときは、

```
for(var num=0;num<10;num++){
	exportRoot.Sample.objs["obj_" + num].gotoAndPlay(1);
}
```

みたいにすれば動く。
0番だけ動かしたいときは、

```
exportRoot.Sample.objs.obj_0.gotoAndPlay(1);
```

だよ、念のため。

###子供から親を参照するときは、parent。
子供のmcから親のタイムラインにおいてあるmcをいじりたいときは、

```
this.parent.sample.gotoAndPlay(1);
```

親のタイムラインをいじる場合は、

```
this.parent.gotoAndPlay(1);
```

###addEventListenerの書き方は同じ。
AS3と同じ。
ただし、イベント名がAS3とは異なっている。
例えば、マウスダウンは、"mousedown"。

```
this.addEventListener("mousedown",mousedownHandler);
```

###関数定義するとスコープ外れる。
rootで、フレームスクリプトを書いて、関数を定義してインスタンスを呼ぼうとすると、呼べない。
具体的にはこんな感じ。
rootにインスタンスsampleを置いて、フレームをいじりたいとき。

```
this.clickbox.addEventListener("mousedown", mousedownHandler);
function mousedownHandler(event){
	this.sample.gotoAndPlay(1);
}
```

はエラーになる。

```
this.clickbox.addEventListener("mousedown", mousedownHandler);
function mousedownHandler(event){
	exportRoot.sample.gotoAndPlay(1);
}
```

で動く。
つまり、関数内に入るとスコープがずれるっぽい。

###グローバル変数の書き方。
rootに、

```
var globalvariablesint = 0;
```

みたいに書いても、どこからも参照できない。
アクションパネルの、左ペインの、グローバル、という項目があるのでそこを開くと、スクリプトという項目があり、そこに変数を定義すると動く。
何だそれ。
（こうすると、jsをパブリッシュした際に、html側に変数として書き出してくれる。なんだそれ）
あと、外部jsの呼び方は、さっきのグローバルという項目人クルードという項目があるので、そこの＋マークをクリックすると読める。
そこに定義しても大丈夫。

###キャストは、parseInt()。
キャストをする際に、

```
int(1.2);
```

みたいに書きたいのに、書けない。

```
parseInt(1.2);
```

とかかくとキャストされるっぽい。深いところはわからない。
ちなみに、ランダムっぽいことをしたいときは、Math.random()。
整数で取り出したいなーっていう印象のときは、

```
var i = parseInt(Math.random()*10);
```

みたいにすれば雑に取れる。
詳しいところはわからない。

###jsなので、型指定しなくてもいい。

```
var i = "1";
```

って、string型みたいに書いても、

```
var n = i + i;
```

は、11にならない。みたい。この辺もよくわからん。

__多分めっちゃ突っ込みたいだろうから、突っ込んで下さい。__
とりあえず、未だ調べないといけないところが結構ある…。
あと間違ってるところとかは、ビシビシ指摘してほしいです。
XDebug さんが余計なエラーを出します ― xdebug://debug-eval on line 1

時々、以下のようなエラーを見かけます。

```
Notice: Undefined variable: foobarbaz in xdebug://debug-eval on line 1
```

## 対策

このようなエラーが出るときは、IDE の「ウォッチ」ペインで余計な変数をウォッチしていないか確認しましょう。

スコープ外の変数をウォッチしていると、XDebug がそれを確認するときに「Undefined variable」になってしまいます。

## 環境

環境は以下の通りです。

PHP 5.6.x
NetBeans 8.0.2
XDebug 2.5.4

## ウォッチペインとは

ペインとは「枠」の意味で、アプリケーションによって「フローティングウィンドウ」とか「パレット」とか「サブウィンドウ」とか「ビュー」とか様々な呼称があります。

ウォッチペインというものは、ブレークポイントで停止した際にあらかじめ登録した式を評価してその結果を表示するものです。

NetBeans であればメニュー項目「ウィンドウ」->「デバッグ」->「ウォッチ」で表示されるようなやつです。

Visual Studio 2017 であればメニュー項目「デバッグ」->「ウィンドウ」->「ウォッチ」->「ウォッチ１」。

Eclipse（使ってないので詳しくないですが）は「デバッグパースペクティブ」を開いた後でメニュー項目の「ウィンドウ」->「ビュー」->「式」。

Xcode は
http://b.hatena.ne.jp/entry/tikidunpon.com/2013/03/05/xcode_watch_variable/
...で表示されるやつ（雑）。
chshがないのでlchshを使ったけど何が違うの?

Linuxにはログインシェルを変更する`chsh`というコマンドがあったのだがFedoraでは使えなくなっていた。

["chsh" Command is missing in Fedora 24 fresh install!](
https://ask.fedoraproject.org/en/question/89601/chsh-command-is-missing-in-fedora-24-fresh-install/)

# 答え
`util-linux-user`をインストールすればいい。

のだけれど、似て非なるコマンドに`lchsh`というのがあり、こちらは最初から使えるので、本来はこちらを使うべきなんだろうと思う。

Bugzillaによれば、コンテナ向けイメージで必要無かったので消した、らしい。なんと乱暴な。

# 違い

`man`によれば、機能の上では`/etc/shells`を無視するか否か (`lchsh`はShellのリストを無視する) くらいの違いしか無さそう。

どうも`chsh`はLinux由来 (`util-linux`) で、`lchsh`は`libuser`由来のようで、つまり出自が違う。

もうちょっと調べてみると、CVEが出てきて、

[libuser 脆弱性 (CVE-2015-3245 および CVE-2015-3246)](https://access.redhat.com/ja/node/1539623)

これによると

> `passwd`、`chfn`、および `chsh`などの従来のプログラムは`/etc/passwd`の一時コピーを使用して機能し、最終的には `rename()`機能を使って一時コピーの名前を変更しますが、`libuser`は`/etc/passwd`を直接変更します。

という動作の違いがあるようだ。

# 結論

え、じゃあ`chsh`のほうがよくね……?
UiPathでRPAを実践してみる(番外編) ～RPAに思う事～


### 始めに
この記事はいつもと違い、UiPathの使い方は書いてありません。個人的な思いが書いてあるだけですので、使い方のノウハウを知りたい方は読み飛ばして下さい。
### 御礼
[UiPathに関する最初の投稿](http://qiita.com/motuo/items/5176f814aa609b916f1b)のView数が1,000を超えました。
地味な内容にも拘わらず、投稿から1か月ちょっとでこの記事が読まれている所を見ると、やはり`RPA`という言葉がだいぶ浸透してきているのかな、と感じました。
拙い記事ですが、読んでくださった方々、本当にありがとうございました。

私なりに記事にはしていますが、書いてある内容については、[UiPath Academy](https://academy.uipath.com/lms/index.php?r=site/index)に網羅されているので、もっと深く知りたい方はそちらを使ってみてください。
### RPAのメリットとデメリットについて
さて、ここで一呼吸して、そもそもRPAを入れるってどういうことかを整理してみたいと思います。
下記に私自身が感じたメリットとデメリットを挙げてみます。これはUiPathに限らず、様々なRPAのツールにも言えることだと思っています。
## メリット
1. **プログラムが組めれば、**簡単に業務の自動化を行うことが出来るので、とっかかりまでの間口が広い(専門スキルが低くても組める)
2. 単純作業を自動化する事により、従業員の業務効率化を上げ、モチベーション低下に歯止めをかけることが出来る
3. 複数のシステムにデータを受渡したい時の、APIの代替手段に成り得る(APIの開発コストがカットできる)

## デメリット
1. 簡単に組めるが故に、とんでもない設計のプログラムでも動かせて実践投入出来てしまう…
2. その単純作業を、そもそも行う必要があるのか？業務全体を見直した方が、全社としては生産性の向上に繋がるのではないか？という発想をしなくなる恐れがある(部分最適化の温床になるのでは？という心配がつきまとう)

## これらを踏まえて思う事
私自身、UiPathを使って様々な業務を自動化しています。例えば…
1. 日々のサーバの稼働状況の数値をUiPathを使って抽出。自社のデータベースに記録する
2. 経営に使う会議用の数値を、様々なシステムから自動的に取り纏めてExcel化する
3. ユーザーのサポートに必要な情報を自動で抽出する。また、サポートに使うツールを自動起動する

こんな感じで使っています。プログラムがある程度わかる方であれば、簡単にこれらの機能を持つロボットを作ることが出来るでしょう。そして、個人としては非常に有用なツールとなってくれています。
ただ、一方で「何でも`RPA`で解決というのも危険だなぁ…」という危惧も抱いています。野良RPAの一人歩きや、古くはExcelマクロのRPA版が社内中にのさばってしまう事も、十分に想定できるからです。

これらを統合して管理する製品ももちろん存在しています。(UiPathでは、[UiPath Orchestrator](https://www.uipath.com/orchestrator))
ですが、そもそものRPA導入の前準備には下記の考慮が必須なのではないかと思います。
1. RPAの設計方針とコーディング規約(いつかはフレームワークとかもできるのかな…)
2. 事前の十分な業務フロー分析(社内全体を踏まえた最適化をしたい!)

最低限でも上記を踏まえたうえで、それでも発生する単純作業をRPAに置き換えていくのがベストではないかと思います。

RPAの技術は使ってみると本当に便利なのですが、便利がゆえに気を付けるべきこともあると思います。
その事を踏まえて良い自動化をしていきましょう！

# 2017年11月28日　追記
この記事「[現場力の崩壊、日本企業はロボットとAIに支配されるぞ！](http://itpro.nikkeibp.co.jp/atcl/column/14/463805/112100167/)」が割と自分の意見に近かったので参考までに紹介します。
言葉は非常に乱暴ですが、割と私の抱いている危機感と似ている気がします。
上記では書ききれていませんでしたが、
> 「導入後、数年もたてば、業務の作業手順を分かる人や、知見やノウハウを持った人はいなくなる。そこでまさかのシステム障害。誰も適切な対処ができず、システムが復旧するまで業務は完全に止まる」

というのは、まさにその通りです。「業務のブラックボックス化」というのもその通りかと思います。
だからこそ、上記で書いた「**事前の十分な業務フロー分析**」が必要なのかなと。

RPAの導入を検討される際には、ぜひ、読んでみてほしい記事です。
vagrant up するとGuestAdditions エラーが発生

### 久しぶりにvagrant upするとエラーが発生!?

```
Shared folders that Chef requires are missing on the virtual machine.
This is usually due to configuration changing after already booting the
machine. The fix is to run a `vagrant reload` so that the proper shared
folders will be prepared and mounted on the VM.

Fatal error: local() encountered an error (return code 1) while executing 'vagrant provision'

Aborting.
```

### どんなエラーが発生したのか確認するために、'vagrant provision'を実行

```
Shared folders that Chef requires are missing on the virtual machine.
This is usually due to configuration changing after already booting the
machine. The fix is to run a `vagrant reload` so that the proper shared
folders will be prepared and mounted on the VM.
```

### `vagrant reload`を実行するとさらにエラーが出た

```
[default] GuestAdditions versions on your host (5.1.26) and guest (4.2.14) do not match.
...
An error occurred during installation of VirtualBox Guest Additions 5.1.26. Some functionality may not work as intended.
In most cases it is OK that the "Window System drivers" installation failed.
```
どうやらホストとゲストでGuestAdditionsのバージョンが違うからっぽい。
そういえばVirtualBoxのバージョンを最新にしたおぼえあり。。。

### Vagrant側のGuestAdditionsのバージョンをあげればいけるっぽいからVirtualBoxと同じバージョンのGuestAdditionsのISOを探す
http://download.virtualbox.org/virtualbox/
あった↓
http://download.virtualbox.org/virtualbox/5.1.26/VBoxGuestAdditions_5.1.26.iso

##### ゲスト側を更新してみる

```
$ vagrant ssh
$ wget http://download.virtualbox.org/virtualbox/5.1.26/VBoxGuestAdditions_5.1.26.iso
$ sudo mkdir /VBoxGuestAdditions
$ sudo mount -o loop,ro VBoxGuestAdditions_5.1.26.iso /VBoxGuestAdditions
$ sudo sh /VBoxGuestAdditions/VBoxLinuxAdditions.run
$ rm VBoxGuestAdditions_5.1.26.iso
$ sudo umount /VBoxGuestAdditions
$ sudo rmdir /VBoxGuestAdditions
$ exit
```
###### ※やり方はほぼここそのまま。
https://www.vagrantup.com/docs/virtualbox/boxes.html

##### そしてvagrantをリロード

```
vagrant reload
```

いけたっぽい。
GitBucketをDockerでhttps化して簡単に運用する

[GitBucket](https://github.com/gitbucket/gitbucket) 4.15.0がリリースされましたね。
ここではDockerとLet's Encryptを用いて簡単にデプロイしましょう。

ソースはこちら
[GitBucket with SSL](https://github.com/shomatan/gitbucket-ssl-docker-compose)

## 環境
- Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-66-generic x86_64)
- Docker version 17.03.0-ce, build 60ccb22
- docker-compose version 1.15.0, build e12f3b9

## イメージ
- [jwilder/nginx-proxy](https://hub.docker.com/r/jwilder/nginx-proxy/) 簡単にバーチャルホストを実現
- [jrcs/letsencrypt-nginx-proxy-companion](https://hub.docker.com/r/jrcs/letsencrypt-nginx-proxy-companion/) Let's Encryptでの証明書発行や更新を自動でやってくれるやつ
- [shomatan/gitbucket](https://hub.docker.com/r/shomatan/gitbucket/) GitBucket本体
- [postgres](https://hub.docker.com/_/postgres/) データベース

## 手順
### git clone
    git clone https://github.com/shomatan/gitbucket-ssl-docker-compose.git gitbucket-ssl
    cd gitbucket-ssl

### ドメイン編集
`docker-compose.yml`を書き換えます。

```diff
     image: shomatan/gitbucket:4.15.0
     environment:
       # nginx-proxy
-      VIRTUAL_HOST: git.example.com
+      VIRTUAL_HOST: ドメイン名
       VIRTUAL_PORT: 8080
       # letsencrypt
-      LETSENCRYPT_HOST: git.example.com
-      LETSENCRYPT_EMAIL: git@example.com
+      LETSENCRYPT_HOST: ドメイン名
+      LETSENCRYPT_EMAIL: メールアドレス
       LETSENCRYPT_TEST: "false"
     ports:
       - 29418:29418
```

### 起動

    docker-compose up -d

しばらくすると`https://ドメイン名`でアクセスできます。
ID:`root` PASS:`root`でログイン後、システム設定の`Base URL`を変更してください。

### その他
- デフォルトでも動きますがネットワークは適宜作成しましょう
- 各データは`volumes`以下に作成されます。必要に合わせて変更してください

## 終わりに
VPS(vCPU:1 Memory:512M)でテストしましたがサックサクですね！
AWS 時刻表記の違いに注意

先日AWSから届いたRDSのメンテナンス通知で勘違いしてしまった点について備忘録としてまとめておきます。
AWSから届いた文面がこんな感じ。

```
Hello,

We are contacting you to inform you that one or more of your Amazon RDS DB instances is scheduled to receive system upgrades during your maintenance window between August xx 5:00 PM and August xx 4:00 PM PDT.
```
今回引っかかったのが、ここです！
between August xx 5:00 PM and August xx 4:00 PM **PDT**.
時間の後ろに書かれている**PDT**。

素人のわたしが触るコンソールの範囲では、時刻表記は日本時間かUTC表記がほとんど。
つい先日やっていた別のメンテナンスでも通知文はUTC表記だったので、ついつい見落としてしまっていました。

エンドユーザ向けにメンテナンス時刻を日本時間に直して調整していた際に、PDTをUTCと思い込んでいたんですね〜。痛恨のミス><

今後は時刻表記をきちんと確認しなくては、、、と良い勉強になりました。
Githubのkeywordを利用してPull Requestがマージ、クローズされたタイミングで関連するIssueも同時に閉じる

プルリクをマージしたり、クローズした後にいちいち関連するIssueをクローズしたりするのは面倒です。
GitHubではkeywordという予約語があり、その予約語のあとにIssueの番号を書くとプルリクがマージ、クローズされたタイミングでIssueもクローズしてくれます。

おすすめはプルリクのテンプレにkeywordを入れておく方法です。
[[GitHub] IssueとPull Requestのテンプレート機能を利用してフォーマットを統一する](http://tackeyy.com/blog/how-to-make-github-issue-and-pull_request-template)

この記事は個人ブログでも掲載しています。
http://tackeyy.com/blog/close-github-issue-after-pull_request-is-merged-or-closed

# プルリクの内容の書き方

` fixes #1 ` のようにkeywordとIssueの番号をセットで記載します。

[![https://gyazo.com/8d73e266e62b93ea1f3cd2cde08e9f83](https://i.gyazo.com/8d73e266e62b93ea1f3cd2cde08e9f83.png)](https://gyazo.com/8d73e266e62b93ea1f3cd2cde08e9f83)

[![https://gyazo.com/0698f5b2e3e3da1947bccfbea17ec72d](https://i.gyazo.com/0698f5b2e3e3da1947bccfbea17ec72d.png)](https://gyazo.com/0698f5b2e3e3da1947bccfbea17ec72d)

# keywords

以下の単語がkeywordとして使えます。

` This pull request fixes #1 ` の省略形の ` fixes #1 ` が自然かなあと思ってぼくは ` fixes ` を使うようにしました。（resolvesでもいいのですが、文字数が少し長い・・・w）

```
close
closes
closed
fix
fixes
fixed
resolve
resolves
resolved
```

# コミットメッセージにキーワードを入れてIssueをクローズする方法もある

` $ git commit -m "Fix screwup, fixes #12" ` のようにkeywordとIssue番号を入れると同じことができます。

# 参考

https://help.github.com/articles/closing-issues-using-keywords/
https://github.com/tiimgreen/github-cheat-sheet#closing-issues-via-commit-messages