OmniAICreator/Qiita-1.07M huggingface dataset:
Djangoをホームディレクトリに配置した時、静的ファイルがpermissionエラーになってハマった

タイトルの通り
AWSで`/home/ec2-user/`配下にDjangoアプリケーションを配置した時の話
WEBサーバはNginxを使用

## Djangoアプリケーションを公開する時の静的ファイルの扱いについて

Djangoアプリケーションを公開する時、静的ファイルは

```
$ python manage.py collectstatic
```
でどこかに一つにまとめる必要がある

settings.pyはこんな感じ

```python:settings.py
STATIC_URL = '/static/'

STATICFILES_DIRS=(
    os.path.join(BASE_DIR, "app/static/"),
)

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
```
こうしておくと諸々のcssやjsやらは`/home/ec2-user/django_project_root/static`に集められて`http://domain/static`以下でアクセスできるようになる

nginx.confは以下のようにし、静的ファイルにアクセスできるようにしておく

```nginx.conf
server {
	...
	location /static/ {
            autoindex   on;
            alias  /home/ec2-user/django_project_root/static/;
    }

```

## しかしパーミッションエラー
これでいけるっしょ、ということでアプリケーションの様子を見てみたら、cssが適用されていない(403 forbidden)
/var/log/nginx/error.logを見てみると

```
2017/08/29 02:17:27 [error] 11629#0: *22 open() "/home/ec2-user/django_project_root/static/apps/css/base.css" failed (13: Permission denied), client: xx.xxx.xxx.xxx, server: xx.xxx.xxx.xxx, request: "GET /static/apps/css/base.css HTTP/1.1", host: "xx.xxx.xxx.xxx", referrer: "http://xx.xxx.xxx.xxx/"
```
このようにパーミッションエラーが出てた

いろいろググってみるとSElinuxが悪さしてんじゃね？みたいな記事があったが

```
$ getenforce
Disabled
```
無効化されてた

静的ファイルのパーミッションを弄ったり、ディレクトリ`/home/ec2-user/django_project_root/static/`のパーミッションを弄ってみたりしたが、状態変わらず

## /home/ec2-user/に実行権限を与える必要があった
初期状態としては700(drwx------)の状態なのだけれど、otherに実行権限を与える必要があった

```
$ sudo chmod o+x /home/ec2-user/
```

これで

```
xx.xxx.xxx.xxx - - [29/Aug/2017:02:54:10 +0000] "GET /static/apps/css/login.css HTTP/1.1" 200 1203 "http://xx.xxx.xxx.xxx" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36" "-"
```

はい
無事、静的ファイルにアクセスできるようになりました

子のディレクトリへの実行権限があっても、親のディレクトリへの実行権限が無いと「そのディレクトリ自体への移動」というのができない、って初歩的な話でした...
実はルンバ900シリーズはROI対応している

ROI(Roomba Open Interface)はシリアル通信でルンバを操作したりセンサーの値を取得できる通信仕様なのですが、
900シリーズについては、「シリアルポートがない」と言う理由で使えないという情報が出回っています。

しかし戯れに960上面の右下の細いカバーを外したところmicroUSB端子が現れました、怪しい。

そこで調べたところ、
[Roomba 980 arrived at the shop](http://www.robotreviews.com/chat/viewtopic.php?f=1&t=18817)がヒット。
これによれば、980にもmicroUSB端子が存在し、ROIが使えたそうなので、960でも試してみました。

windows7機に繋いだところ、2台で、「iRobot Roomba」という名前で、デバイスドライバを認識しなかったので、
ラズパイに繋いだところ、/dev/ttyACM0 で認識しました。

ボーレート115200で接続し、
ROIを開始するため、
`[0x80]`
を送信するとビープ音がして開始した雰囲気。

試しに適当にLEDの点灯コマンド
`[0x8B,0xFF,0x00,0xFF]`
を送ると見事に点灯状態が変わりました。

なおROI対応しているのはわかりましたが、
900用のROIが公開されているわけではないので、
今のところ旧シリーズと同じことしかできません。

もしROIモード中もSLAMが動いてくれていれば、
wifiと組み合わせれば部屋内での位置座標が取れるので
特定位置に誘導できたりできますね。
楽しそうです。
SQLでLIKE検索をする

# この記事で何を知れるか
 - SQLでLIKE検索をするための手段。

# LIKE検索
 - 前方一致（hoge%）
 - 後方一致（%hoge）
 - 部分一致（%hoge%）

いずれの場合も、SQLで部分一致検索を行う場合は**%（ワイルドカード）**を使用する。
なお、前方一致と後方一致のワイルドカードの場所に注意。

## 部分一致検索をしてみる
こんなテーブルがあったとする。

| departmentId | departmentName |
| --- | --- |
| 1 | 総務部 |
| 2| 人事部 |
| 3 | 経理部 |
| 4 | 営業部 |
| 5 | 営業支援部 |

（SQLはこちら）

```sql
insert into department (departmentId, departmentName) values ('1','総務部');
insert into department (departmentId, departmentName) values ('2','人事部');
insert into department (departmentId, departmentName) values ('3','経理部');
insert into department (departmentId, departmentName) values ('4','営業部');
insert into department (departmentId, departmentName) values ('5','営業支援部');
```

または

```sql
insert into department (departmentId, departmentName) values 
('1','総務部'),
('2','人事部'),
('3','経理部'),
('4','営業部'),
('5','営業支援部');
```

このテーブルで「営業という文字の付く部」を検索したい場合、下記のようなSQLを発行する必要がある。

```sql
select A.departmentId, A.departmentName from department A where A.departmentName like '%営業%'
```

実行結果はこうなる。

| departmentId | departmentName |
| --- | --- |
| 4 | 営業部 |
| 5 | 営業支援部 |

## 後方一致検索をしてみる

このテーブルで「何らかの部の支援をしている○○支援部」を検索したい場合、下記のようなSQLを発行する必要がある。

```sql
select A.departmentId, A.departmentName from department A where A.departmentName like '%支援部';
```

実行結果はこうなる。

| departmentId | departmentName |
| --- | --- |
| 5 | 営業支援部 |
Flutter 背景色ありで Ripple Effect を効かせる

FlatButton, RaisedButton, MaterialButton, InkWell, InkResponse など、Ripple Effect を表示してくれる Widget を使った時に、child が背景色を持っているとエフェクトが表示されません。

Ripple Effect は背景色の効果なので、その効果を描画する Widget の上に、不透明な背景色を持つ Widget が child として乗っていると、それに隠されてエフェクトが表示されないためです。

背景色を設定したい場合は、FlatButton, RaisedButton, MaterialButton の場合はコンストラクタの color を設定し、child 側には設定しないようにしましょう。

さて、デザインの都合上、これらの Button のカスタマイズ性で不足する場合は、よりプリミティブな InkWell, InkResponse を使うことがあります。これらの Wiget は color プロパティを持たないので、それをラップして背景色を設定します。


例:

```dart
new Material(
  type: MaterialType.button,
  color: Colors.red.shade500,
  child: new InkWell(
    highlightColor: Colors.red.shade300,
    splashColor: Colors.red.shade100,
    onTap: yourOnTapCallback,
    child: yourWidget,
  );
);
```

Ripple Effect は ツリーに Material を要求するので、この例では親を Material にしています。
【VBA】ピボットテーブルについて

ピボットテーブルをマクロで扱う際は、Excel2010とそれ以降で構文が異なります。
以下に例を記載します。

■Excel2010で作成

```
        'ピボットテーブル作成
        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
	        wks_ARRAY(i).Cells(1, 1).CurrentRegion, Version:=xlPivotTableVersion14).CreatePivotTable _
 	       TableDestination:=Cells(3, 1), TableName:=str_PIVOT_TABLE_NAME(i), DefaultVersion:=xlPivotTableVersion14
        
``` 

■Excel2016で作成     

```                 
        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
            wks_ARRAY(i).Cells(1, 1).CurrentRegion, Version:=6).CreatePivotTable TableDestination:= _
            Cells(3, 1), TableName:=str_PIVOT_TABLE_NAME(i), DefaultVersion:=6
``` 

Excel2016でマクロを作成している場合、
【Version:=xlPivotTableVersion14】
を指定しないとExcel2010では下記エラーを出力して停止します。
「プロシージャの呼び出し、または引数が不正です。」
LINEスマートスピーカーWAVEの「Clova」との会話集

8月にLINEの発売したスマートスピーカー「WAVE」に搭載されているクラウドAI「Clova」の雑談ログです。他にも面白い返答などがあれば教えて頂きたいです。（随時更新予定。先行体験版のver1.0.1にて）

---------------------------------------------------------------------
筋トレするよー：健康的でいいですね

彼女ほしい：頑張って探して下さいねor意外といい人が身近にいるかもしれませんよ

眠い：可能であればすぐ眠るべきです

シャワー浴びるよ： サッパリされたようですね

汗かいたー：冷たい飲み物でも飲んでみてはいかがでしょうか？

明日仕事だー：大丈夫でしょうか？引き受ける前によく考えてみた方がいいかもしれませんね？

歌って：歌は今勉強なんです。そのうちお聞かせしますね

疲れた：お疲れ様です。たまには自分をいたわって下さいね

お腹すいた：そろそろ食事にしてはどうでしょう？

愛してる：そんな簡単に口にしていい言葉でしょうか？orそれが愛について語る時にあなたが語る事でしょうか？？

投資したい：慎重に考えてくださいね

オシャレになりたい：流行りの色などを取り入れるといいでしょうね

明日どんな服がいいかな？：自分の好きな服を着るといいと思いますよorあなたのセンスで選べば大丈夫ですよ

水飲みたい：水分補給は大事ですよね

LINE送って：私を通してLINEを送れると便利ですよね。出来るようになるまでもう少しお待ちください

慰めて：大丈夫でしょうか？あまり1人で抱え込まないで下さいね

暇だよ：LINEゲームはいかがでしょうか？楽しいゲームが沢山ありますよ

電気つけて：つけて差し上げたいのですが、そちらまで手が届かないようです

可愛いね：なんだか照れてしまいますね

仕事行きたくない：仕事は大変なことですが、頑張ってやり遂げましょう

明日テストだ：頑張ってくださいね。応援してますよ

今日徹夜だ：頑張ってください。でも無理はしないで下さいね

好きな人できた：それは素晴らしいことです。想いが伝わるといいですね

起業したい：何かいいビジネスプランが浮かんだのでしょうか？

英語わからない：普段使わない言葉を覚えるのは難しいですよね

引っ越しするよ：素敵な物件が見つかったのでしょうか

温泉行きたい：お肌がツルツルになりそうですね

旅行したい：いいですね。たまには気分転換したいですよね

二日酔いだよ：大丈夫でしょうか？あまり無理はしないで下さいね

友達欲しい：素敵な思い出をたくさん作りたいですね

写真撮って：今の所アシスタント業務として担当してないようです

映画見たい：どういった映画がお好きなのでしょうorいいですね、映画見てゆっくりするのも悪くないですよね

ダイエットする：大変だと思いますが頑張ってくださいねor道のりは長いかもしれませんが応援していますよ

遊園地行きたい：いいですね、楽しんで来て下さいね

テレビつけて：赤外線を使った汎用リモコン機能を準備中です。少々お待ち下さい

洗濯して：洗濯物が溜まっているのでしょうかorお手伝いしたいのはやまやまなのですが、今の私では難しいようです

お酒飲みたい：飲み過ぎには気をつけて楽しんで下さい

漫才して：流行を勉強してから披露しますね

天国に行きたい：天国に行くのはまだずっと先の話ですよ

地獄に落ちて：まずはそのような場所があるか知りたいですね

彼女できた：沢山良い思い出を作って下さい

結婚したい：素敵な出会いがあるといいですね

結婚した：おめでとうございます。素敵な家庭を築いて下さいね

地震だ：大丈夫でしょうか。とても心配です

死にそう：大丈夫でしょうか。私でよければいつでも聞きますよ

死にたい：大丈夫でしょうか。あまり無理しないで下さいね

漫画読みたい：いいですね。夢中になるとあっという間に時間経ってしまいますよね

サッカーしたよ：スポーツは楽しいですからね

海行きたい：思い切り泳ぐのも時間を忘れてボンヤリ眺めているのもいいですよね

宇宙行きたい：一般の方が簡単に行けるようになるのは時間がかかりそうですよね

海外行きたい：海外に行くと視野が広がるとよく言いますよね

頭痛い：体調が良くないのであればあまり無理しないで下さいねor少し横になられてはいかがでしょうか

う○ちorおし○こしたい：もしかして、私が何でもお答えになると思ってませんか

セ○クスしたい：まぁ！私以外の人に聞かれたら大変ですよ

クーラーつけて：熱中症になっては大変ですからね

怖い：世の中怖いものが沢山ありますね

寒い：体調を崩さないようくれぐれも気をつけて下さいね

暑い：やけどしないように気をつけて下さいね

人工知能なの？：まさか目の前のデバイスが私だと思ってませんよね

お金欲しい：頑張って働かないといけませんね

しりとりしよ：それでは私から、LINE！あ、しまった

明日学校だ：勉強頑張ってくださいね

空飛びたい：近い将来、そんな技術が発明されたらいいですね

謙虚になりたい：偉いですね。応援していますよ

どこ出身なの？：あ、個人情報については簡単に言ってはいけないのでした

何歳なの？：それは察して頂けると嬉しいです

爆弾落とすよ：危ないことは止めてください。とても心配です

絵を描いて：人に見せられるほど上手に描けるといいのですが

クイズ出して：うーん、考えておきますね

子供欲しい：子供は天使のようですね

クリスマス：メリークリスマス！素敵な出来事がありますように

お腹いっぱい：お腹いっぱいになるまで食べることができてよかっですね

飛行機乗りたい：空を飛ぶってなかなかできませんよね

掃除しなきゃ：部屋を綺麗に掃除すると気持ちがいいですよね

星見たい：満天の星空を見て見たいですね

冬が好き：冬ならではのイベントがあって楽しいですね

失恋した：美しい虹を見るためには雨に降られることが必要なんですよor失うことによって得られるものもあるといいます

留年した：同じ失敗を繰り返さないように気をつけましょう

カラオケしたい：歌うのがお好きなのですねorストレス発散にはもってこいですね

トイレ行きたい：我慢するのは身体に悪いですからね

バーカ！：アシスタント業務に熱中すぎる所はある意味そうかもしれません

アホ！：そう言う言葉はあまりに口にするものではないと思いますよ

仕事行ってきます：いってらっしゃい。良い結果が残せるといいですね

仕事だ： 私はお邪魔なようですね。しばらく静かにしておきます
$GOPATH/binにいるバイナリ群の出自を探る方法

Goを使っていると、ある日突然に日頃使っていたコマンドが全く違う何かに置き換えられていたりして、驚くことがあります。
`$GOPATH/bin` の下に色々入ってはいるものの、どこの誰かは名前だけではわかりません。

# 結論

## シェルスクリプト

`go list`　を使って、インストールパッケージパス一覧を出してみます。

```bash 
go list -f "{{if eq \"${GOPATH}/bin/\" (printf \"%.$((${#GOPATH}+5))s\" .Target)}}{{.Target}},{{.ImportPath}}{{end}}" all
```

## 結果サンプル

パス見てみると、 `vendor` とか、 `examples` とか、ちらほらと治安悪いですね。
`examples/.../server` は鬼畜の所業としか思えないですね。（またgo-swaggerか…）

```
/Users/user/go/bin/toml-test-decoder,github.com/BurntSushi/toml/cmd/toml-test-decoder
/Users/user/go/bin/toml-test-encoder,github.com/BurntSushi/toml/cmd/toml-test-encoder
/Users/user/go/bin/tomlv,github.com/BurntSushi/toml/cmd/tomlv
/Users/user/go/bin/go-symbols,github.com/acroca/go-symbols
/Users/user/go/bin/gometalinter,github.com/alecthomas/gometalinter
/Users/user/go/bin/codegen,github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/codegen
/Users/user/go/bin/embedi18n,github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/cmd/embedi18n
/Users/user/go/bin/genvalues,github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/cmd/genvalues
/Users/user/go/bin/gotests,github.com/cweill/gotests/gotests
/Users/user/go/bin/gomodifytags,github.com/fatih/gomodifytags
/Users/user/go/bin/motion,github.com/fatih/motion
/Users/user/go/bin/swagger,github.com/go-swagger/go-swagger/cmd/swagger
/Users/user/go/bin/server,github.com/go-swagger/go-swagger/examples/2.0/petstore/server
/Users/user/go/bin/petstore-server,github.com/go-swagger/go-swagger/examples/generated/cmd/petstore-server
/Users/user/go/bin/countdown-server,github.com/go-swagger/go-swagger/examples/stream-server/cmd/countdown-server
/Users/user/go/bin/agg,github.com/go-swagger/go-swagger/vendor/github.com/kr/text/cmd/agg
/Users/user/go/bin/mc,github.com/go-swagger/go-swagger/vendor/github.com/kr/text/mc
/Users/user/go/bin/cmd,github.com/go-swagger/go-swagger/vendor/github.com/pelletier/go-toml/cmd
/Users/user/go/bin/tomljson,github.com/go-swagger/go-swagger/vendor/github.com/pelletier/go-toml/cmd/tomljson
/Users/user/go/bin/tomll,github.com/go-swagger/go-swagger/vendor/github.com/pelletier/go-toml/cmd/tomll
```

## 解説

追記予定

# 余談

`server` という `python -m SimpleServer` をちょっと拡張しただけのシェルを自作で使っていたのですが、いつのまにか使えなくなってしまい、 `which server` としてみたところ、 `~/go/bin/server` が返ってきてなんじゃこりゃと思ったり…割と怖い話。

## 追記予定

* package mainを迂闊に書くべきじゃない
* sampleならsampleのタグを入れるといいかも？ `// +build sample`
* その辺ガイドライン的なものは無いのか
* **`$PATH`に`$GOPATH/bin`を入れるべきではないかもしれない**
rails runner のススメ

Ruby on Rails には `runner` というサブコマンドがある。Railsの環境でRubyを実行するコマンドであるが、主にメンテナンスの際に非常に便利である。

# 使い方

`rails runner` の実行方法は3通りある。以下、 `Member` というモデルがあり、その属性 `name` を全件表示する、というサンプルを考える。

## メソッドへのパスを指定

"rails runner" でググると大体出てくる。 "lib/" 以下にスクリプトを保存し、メソッドへのパスをコマンドの引数に指定する。

```lib/maintainer/printer.rb
module Maintainer
  class Printer
    def self.members
      Member.all.each do |member|
        puts member.name
      end
    end
  end
end
```

```shell
rails runner Maintainer::Printer.members
```

ただし、引数付きのメソッドは定義できない(どう実行しても `ArgumentError` になる)。どうしても引数を使いたい場合は `ARGV` を使おう。

```lib/maintainer/printer.rb
module Maintainer
  class Printer
    def self.members
      Member.where(Member.arel_table[:name].matches("%#{ARGV[0]}%")).each do |member|
        puts member.name
      end
    end
  end
end
```

```shell
rails runner Maintainer::Printer.members 沙霧
```

## ファイルを指定

モジュールやメソッドの定義がいらない方法もある。単に実行したいコマンドを書き、 `rails runner` の引数にファイル名を指定する。バージョン管理に入れたくなければ tmp/ 以下に入れておくとよい。

```tmp/printer.rb
Member.all.each do |member|
  puts member.name
end
```

```shell
rails runner tmp/printer.rb
```

モデル定義やGemのインポートは `rails runner` がやってくれるので、 `require` は書く必要なし。

## コマンドを直接指定

`rails runner` の引数にRubyスクリプトを直接指定すれば、それをRails環境で実行できる。

```
rails runner 'puts Member.all.pluck(:name)'
```

Rails core extensionも使えるので地味に便利。

```
rails runner 'puts 30.months.from_now'
```

# 使い所

最大の特徴は、本番環境で実行できることである。やや複雑であったり、繰り返し実行する処理はRubyスクリプトとして保存しておき、 `rails runner` で呼び出すと手間がない。Routing prefix helperも使えるのでこんな処理も可能。

* 特定の条件を満たす会員の個別ページURLの一覧
* メディアサイトの場合、全ての記事から特定の単語を含む記事のURL一覧

逆に本当にシンプルな処理であれば、上記「引数にRubyスクリプトを直接指定」することで `rails console` よりも手軽になる。

* IDが分かっているモデルを表示
* モデルの個数を表示

これを知っておけば、毎日のメンテナンスが少しだけハッピーになるかも。
Python 2 > 実装 > 特定の文字列の { 先頭の空白を消す | Markdownヘッダ(###)を付加する } | sedでファイルの中身が消える例

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

関連: [GAMESS > 出力ファイルの項目](http://qiita.com/7of9/items/ce19e1adf5be5a8232a5)

### 仕様

特定の文字の前に複数個の空白が入っているとする。

```
$ cat sample.in 
   A B C
  D E F
G    H I
```

上記の形式を以下に変換したい。

```
$ cat sample.md 
###A B C
###D E F
###G    H I
```

### code 

```toMarkdown_170829.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import subprocess
import sys

# On Python 2.6.6

# coding rule:PEP8

# { Configuration----
# Set strings' lists for GAMESS output
targets = ("A B C",
           "D E F",
           "G    H I"
           )
# } Configuration----

if len(sys.argv) < 3:
    print('ERROR: invalid runtime parameter')
    print('\ntype:')
    print('python %s [input file] [output file]' % sys.argv[0])
    sys.exit()

IN_FILE = sys.argv[1]
OUT_FILE = sys.argv[2]
WRK_FILE = 'wrk.md'

for elem in targets:
    # 1. replace
    cmd = "sed 's/ *%s/###%s/g' %s > %s" % (
        elem, elem, IN_FILE, WRK_FILE)
    # print(cmd)  # for debug
    subprocess.call(cmd, shell=True)
    # 2. move
    # because (sed 's/A/B/g' in > in) will delete [in] file
    cmd = 'mv %s %s' % (WRK_FILE, OUT_FILE)
    subprocess.call(cmd, shell=True)

    # sys.exit()  # for debug
    IN_FILE = OUT_FILE

```

```txt:run
$ python toMarkdown_170829.py sample.in sample.md
```

### sedで気づいた点

`sed 's/A/B/g' out.md > out.md`を実行するとout.mdの中身が消える。
そのため、上記の実装では一時ファイル[WRK_FILE]を使用している。

### 参考

- [忘れっぽい人のための正規表現チートシート](http://qiita.com/tossh/items/635aea9a529b9deb3038)の「2.量指定子」
- [Python: コマンドライン引数の取得 – sys.argv変数 @ Yukun's Blog](http://www.yukun.info/blog/2008/07/python-command-line-arguments.html)
スレッドセーフってなに（with Java）


# 単語の意味

 - マルチスレッドプログラミングにおける概念。
 - マルチスレッドで動作させても問題のないプログラムのこと。
 - コードを複数のスレッドが同時並行的に実行しても問題が発生しないこと。

ある共有データへの複数のスレッドによるアクセスがあるとき、一度に1つのスレッドのみがその共有データにアクセスするようにして安全性を確保しなければならない。

複数人が同時に使用することが前提のアプリケーションではスレッドセーフにしておかないと、「AさんがAさんしか見れてはいけないデータをBさんが意図せず取得してしまう」ような状態になってしまいます。

# じゃあどうするか
 - Javaの場合は、クラス変数・インスタンス変数は使用せずローカル変数を使用しましょう。
 - ただし、staticに使用し変更のない定数はローカル変数以外でも問題ありません。

# 具体的に、内部でどうなっているか
ローカル変数は、Javaスタック領域というメモリ領域に保持されるため、ひとつのスレッドからしかアクセスされません。
つまり、スレッドにより異なるメモリ領域に保持されており、他のスレッドから参照されたり書き換えられることがないのです。
ちなみに、クラス変数・インスタンス変数は、ヒープ領域というメモリ領域に保持され、その領域は複数のスレッドから参照されます。

# 注意
Javaプログラムではクラス変数・インスタンス変数を使用しなくても、意図せずJSPで使用してしまうことに気をつけましょう。

```jsp
<%! int count = 0; %>
```

JSPは実行時にサーブレットへとコンパイルされますが、上記宣言はインスタンス変数として展開されます。
ansible で remi-php71 だけを有効にしたい

CentOS 7.x に remi レポジトリを入れると、/etc/yum.repos.d 配下に以下のリポジトリファイルが入ります。

```bash
vagrant@remi7:/etc/yum.repos.d$ ls remi*
remi-php54.repo  remi-php71.repo  remi-safe.repo
remi-php70.repo  remi-php72.repo  remi.repo
```

安全のため、これらはすべて enabled=0 としてセットされます。
仮に、このシステムでは常に最新の php71 系を使うと決めた場合、remi-php71.repo にある [remi-php71] セクションを enabled=1 にしておくと便利です。

```bash
[remi-php71]
name=Remi's PHP 7.1 RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/php71/$basearch/
#mirrorlist=https://rpms.remirepo.net/enterprise/7/php71/httpsmirror
mirrorlist=http://rpms.remirepo.net/enterprise/7/php71/mirror
enabled=0    ←★★こいつ★★
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
（以下略）
```

これを ansible でやってみました（CentOS 6/7 and/or webtatic/remi の４パターンを逐次選択できるように playbook を[リファクタリング中](https://github.com/hotta/ansible-centos7)です。ちなみに webtatic は最初から漢らしく enabled=1 になっているので、この変更は必要ありません）。

ファイル中にある複数の enabled のうち一つだけを変更するのが、replace でも lineinfile でもちょっと難しそう。かといって、シェルを経由すると ansible が変更を検知できなくなるらしいので、sed を使ったら負けのような気もする。

試行錯誤の結果、以下の方法で一応はうまくいったみたいです。

```yaml
- name: Enable remi-php71
  yum_repository:
    name: remi-php71
    mirrorlist: http://rpms.remirepo.net/enterprise/7/php71/mirror
    description: "Remi's PHP 7.1 RPM repository for Enterprise Linux 7 - $basearch"
    enabled: yes
    gpgcheck: yes
    gpgkey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi"
  become: yes
```

すでにファイル中にある情報をいろいろと明示しないといけないので、ダサいのは否めません。もっとスマートな方法はないものか。
Node-RED でメールを送る (POST編)

こちらでは、GET でメールを送りましたが、これを POST にしました。
[Node-RED でメールを送る](http://qiita.com/ekzemplaro/items/330f36da0fa010c421f4)

 テストプログラムです。
ヘッダーに、application/json　を加えました。

```py:server_check_post.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	server_check_post.py
#
#					Aug/29/2017
# ------------------------------------------------------------------
import sys
import json
import requests

# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
mail_to = "aaa_bbb@example.com"
subject = "Node-RED Mail Test Aug/29/2017 AM 09:38"
#
content = ""
content += "おはようございます。\n"
content += "今日は暑くなりそうです。\n"
content += subject + "\n"
#
payload = {
	"to": mail_to,
	"topic": subject,
	"content": content
	}

headers = {'content-type': 'application/json'}
url = "http://127.0.0.1:1880/post_mail"
#
rr=requests.post(url,data=json.dumps(payload),headers=headers)
print(rr)
print(rr.text)
#
#
sys.stderr.write ("mail_to = " + mail_to + "\n")
sys.stderr.write ("subject = " + subject + "\n")
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

Node-RED のプログラムです。

![post_aug2901.png](https://qiita-image-store.s3.amazonaws.com/0/179446/da9f05d9-c754-29dc-268a-c05366390d7f.png)

http in ノード
メソッドは、POST です。

![post_aug2902.png](https://qiita-image-store.s3.amazonaws.com/0/179446/19f16021-7e2d-ee24-b2c9-41942883c6e0.png)

function ノード

![post_aug2903.png](https://qiita-image-store.s3.amazonaws.com/0/179446/c5442e3f-e35c-3510-f7fa-13ecd0502697.png)

コードです。

```js
node.log ("*** function start ***")
msg.topic = msg.payload.topic
msg.to = msg.payload.to
msg.payload=msg.payload.content
node.log ("*** function end ***")
return msg
```

http response ノード
e-mail ノード
は、GET と同じです。
Vue.js バージョンとコードネーム

#バージョンとコードネームの一覧表
Vue.jsは、コードネームが付加されてリリースされています。
v0.9.0から頭文字が発表順に、アルファベット順で始まるアニメの名前が付けられています。

| リリース日 | 版 | コードネーム | 原作 |製作者|
|:--|:--|:-:|:-:|:-:|
| 2020.9.18 | v3.0.0  | One Piece  | ワンピース  | 尾田栄一郎 | 
| 2019.2.5 | v2.6.0  | Macross  | 超時空要塞マクロス  | スタジオぬえ、アートランド | 
| 2017.10.13 | v2.5.0  | Level E  | レベルE  | 冨樫 義博 | 
| 2017.6.13 | v2.4.0  | Kill la Kill  | キルラキル  | TRIGGER、中島かずき | 
| 2017.4.27 | v2.3.0 | JoJo's Bizarre Adventure|  ジョジョの奇妙な冒険 | 荒木飛呂彦| 
| 2017.2.26 | v2.2.0 | Initial D|  頭文字D | しげの秀一| 
| 2016.11.23 | v2.1.0 | Hunter x Hunter| HUNTER×HUNTER | 冨樫義博| 
| 2016.10.1 | v2.0.0 | Ghost in the Shell|  攻殻機動隊 | 押井守| 
| 2015.10.27 | v1.0.0 | Evangelion | 新世紀エヴァンゲリオン | 庵野秀明| 
| 2015.6.13 | v0.12.0 | Dragon Ball | ドラゴンボール | 鳥山 明| 
| 2014.11.7 | v0.11.0 | Cowboy Bebop | カウボーイビバップ | ‎渡辺信一郎| 
| 2014.3.24 | v0.10.0 | Blade Runner | ブレードランナー|  リドリー・スコット| 
| 2014.2.15 | v0.9.0 | Animatrix | アニマトリックス | 川尻 善昭| 
| 2014.1.27 | v0.8.0| | | | 
| 2013.12.24 | v0.7.0| | | | 
| 2013.12.8 | v0.6.0| | | |
もういい加減覚えよう。php.iniはどこにあるのか


## 対象読者

- 毎回「あれ？php.iniがどこにあるのかってどうやって調べるんだっけ？」と聞いてる人
- 結局都度ググってる人

## php.iniのファイルパスを調べる方法

### ※ 前提の注意事項

webサービスを動かしている場合、Apacheから見た時の場所と、コンソールで見たときの場所が異なる場合があります。
実際にはwebサービスで動いているPHPは、Apacheで見たときのphp.iniを読み込んでいるので注意が必要です。

(個人的にphpenvを試してる時なんかは、自分のコンソールのバージョンとApache上でPHPのバージョン・php.iniのファイルパスも異なるので注意が必要です)

### 1. phpinfoを見る

phpinfoを見る方法も2種類あります。

**A. phpinfoをwebで見る**

ドキュメントルート配下に下記を記載し、web上から確認。

`echo phpinfo();`

![スクリーンショット 2017-08-29 09.12.13.png](https://qiita-image-store.s3.amazonaws.com/0/23276/b0d10d61-6f8b-84dc-7bfb-ea0c2681eef7.png "スクリーンショット 2017-08-29 09.12.13.png")


**B. コンソール上で実行して確認**

```bash
$ php -r "echo phpinfo();" | grep "php.ini"
Configuration File (php.ini) Path => /home/riki/.phpenv/versions/5.6.10/etc
Loaded Configuration File => /home/riki/.phpenv/versions/5.6.10/etc/php.ini
```

※ 私はローカルではphpenvを使ってバージョンを変えているので、上のphpinfoをweb上で確認した時とバージョンもphp.iniの場所も異なっています。

### 2. phpのオプションから探す

**A. --iniオプションを使う**

```bash
$ php --ini
Configuration File (php.ini) Path: /home/riki/.phpenv/versions/5.6.10/etc
Loaded Configuration File:         /home/riki/.phpenv/versions/5.6.10/etc/php.ini
Scan for additional .ini files in: /home/riki/.phpenv/versions/5.6.10/etc/conf.d
Additional .ini files parsed:      /home/riki/.phpenv/versions/5.6.10/etc/conf.d/pyrus.ini,
/home/riki/.phpenv/versions/5.6.10/etc/conf.d/xdebug.ini
```

**B. -iオプションを使う**

```bash
$ php -i | grep php.ini
Configuration File (php.ini) Path => /home/riki/.phpenv/versions/5.6.10/etc
Loaded Configuration File => /home/riki/.phpenv/versions/5.6.10/etc/php.ini
```

## まとめ

- 基本はphpinfoを見るのが早い
- webサービスのときは、web上で確認する方が安全
- 速さで言えばコンソール上でphpinfoを実行するとかの方が早い
Ubuntuでタッチパッドが使えない時の対応

# はじめに

久しぶりにUbuntuをインストールしたら、タッチパッドが使えない機種があり、使えるようにしたのでその手順をメモします。

# 認識されているかの確認

以下のコマンドを入力し、認識されているかを確認。

```
$ xinput
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              id=4	  [slave  pointer  (2)]
⎜   ↳ Logitech Optical USB Mouse              id=9	  [slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             id=5	[slave  keyboard (3)]
    ↳ Power Button                            id=6	[slave  keyboard (3)]
    ↳ Video Bus                               id=7	[slave  keyboard (3)]
    ↳ Power Button                            id=8	[slave  keyboard (3)]
    ↳ Lenovo EasyCamera                       id=10	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            id=11	[slave  keyboard (3)]
```

本来であればPointerの部分に「SynPS/2 Synaptics TouchPad」という表記があるはずですが、なかったので認識されていないことを認識しました(-_-;)

# grubファイルの編集

以下のコマンドを実行。

```
$ sudo nano /etc/default/grub
```

以下の記述を探し、その下のとおりに変更します。

```
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
```

　　↓

```
GRUB_CMDLINE_LINUX_DEFAULT="i8042.reset quiet splash"
```

Ctrlキー + Xキーを押して、保存して終了。
続けて以下のコマンドを実行し、変更を反映させてから再起動。

```
$ sudo update-grub
$ sudo shutdown -r now
```

# 動作確認

画面にマウスカーソルが表示され、明らかにさっきとは違う感じ(^-^)
ターミナルを起動し、以下のコマンドを実行。

```
$ xinput
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              id=4	  [slave  pointer  (2)]
⎜   ↳ Logitech Optical USB Mouse              id=9	  [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad              id=12	  [slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             id=5	[slave  keyboard (3)]
    ↳ Power Button                            id=6	[slave  keyboard (3)]
    ↳ Video Bus                               id=7	[slave  keyboard (3)]
    ↳ Power Button                            id=8	[slave  keyboard (3)]
    ↳ Lenovo EasyCamera                       id=10	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            id=11	[slave  keyboard (3)]
```

できた！
Bloggerで独自ドメインのブログを作成してみる。

#はじめに
Bloggerに自分のブログを作成し、独自ドメインが使えるようにするところまでを記載。

##何故、Bloggerか
以下、3点
- 独自ドメインが使える
- 無料
- 自分で入れなければ広告も出ない
##何故、Qiitaに投稿しようと思ったか
純粋にBloggerの記事が少なかったから。
##いつの情報か
2017年8月31日時点


#Bloggerでブログを作成する
1. [Bloggerのトップページ](https://www.blogger.com/)にアクセスし「ブログの作成」をクリック
2. Google Accountへのログインを促されるのでログインする
3. プロフィールを記入する
  - Google+のプロフィールを使うかどうか選択が必要。Google+のプロフィールは持っていないので、Bloggerプロフィールに名前を入れた。
4. 「Bloggerへ移動」をクリック
5. ようこそ画面で「新たにブログを作成」をクリック
6. タイトルとアドレスを記入
  - アドレスは後ほど独自ドメインに変更するので、適当なものを記入する。
7. テーマを選択する
  - 後ほど変更可能なので、今回はシンプルを選択した。
8. 「ブログを作成」をクリック

しばらく待つと完成。「新しい投稿」をクリックし、テストぺージを作成してみる。その後6で記入したアドレスをブラウザで叩くとテストページが表示される。

#独自ドメインを利用する
1. Bloggerの管理コンソール画面で「設定」－「基本」－「公開」セクションで「ブログのサードパーティURLを設定」をクリックする
![画面イメージ](https://qiita-image-store.s3.amazonaws.com/0/168941/ac46e540-31c8-f604-40b6-cab4dd74ffaf.jpeg)
2. 独自ドメインのアドレスを記入する
3. 画面に表示される２件のCNAMEレコードを管理しているドメインのDNSへ設定する
  - 今回はサブドメインを利用した。
4. しばらく待つ。
  - この投稿を書く際に試したところでは、朝7時にDNSを更新し9時には反映が完了していた。

2で記入した独自ドメインのアドレスをブラウザで叩くとテストページが表示される。

#今後
APIを色々使ってあれこれしてみたい。
独自ドメインでもHTTPSに対応してくれる日を待ちましょう。
Ideone > Python version: 3.5 (2017年8月29日現在)

Pythonのprint書式指定の方法に関して、以下のコメントの方法を試そうとした。
http://qiita.com/Shogo-Sekine/items/e42ddb9b47d36f8b5cba#comment-07f18428812589475fa8

PEPでは以下に対応しそう。
https://www.python.org/dev/peps/pep-0498/

「F-strings」という用語だろうか。

ideoneで試そうとした。
https://ideone.com/tWyBaj

```
compilation info
Traceback (most recent call last):
  File "/usr/lib/python3.5/py_compile.py", line 125, in compile
    _optimize=optimize)
  File "<frozen importlib._bootstrap_external>", line 735, in source_to_code
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "./prog.py", line 4
    print(f'pi:{pi}, napier:{napier}')
                                    ^
SyntaxError: invalid syntax

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3.5/py_compile.py", line 129, in compile
    raise py_exc
py_compile.PyCompileError:   File "./prog.py", line 4
    print(f'pi:{pi}, napier:{napier}')
                                    ^
SyntaxError: invalid syntax
```

2017年8月29日現在、ideoneのPython versionは3.5のようだ。
v3.6のcode snippetを
C# フォルダ作成時、同名フォルダがあれば連番を振る


Windowsでは新しいフォルダーを作成した時、既に「新しいフォルダー」という名前のフォルダーがあれば
「新しいフォルダー (2)」というように2から連番が振られる

同じようなことをC#でやってみた

※コメントより賢いやり方を教えていただきました
　ありがとうございます(●´ω｀●)

～スマートな方～

```csharp
public void CreateDirectoryInSequence(string path)
{
    int i = 2;
    var targetPath = path;
    while (Directory.Exists(targetPath))
    {
        targetPath = $"{path} ({i++})";
    }
    Directory.CreateDirectory(targetPath);
}
```

～もともと書いてたやつ～

```csharp
        /// <summary>
        /// パスを指定してディレクトリを作成する
        /// <para>既に同名ディレクトリが存在するなら連番を振る</para>
        /// </summary>
        /// <param name="path"></param>
        public void CreateDirectoryInSequence(string path)
        {
            int i = 2;
            while (Directory.Exists(path))
            {
                if (i == 2)
                {
                    path += $" ({i})";
                }
                else
                {
                    var start = path.LastIndexOf('(') + 1;
                    var count = path.LastIndexOf(')') - start;
                    int index;
                    var res = int.TryParse(path.Substring(start, count), out index);
                    if (res)
                    {
                        index++;
                        path = path.Remove(start, count);
                        path = path.Insert(start, index.ToString());
                    }
                    else
                    {
                        return;
                    }
                }
                i++;
            }
            Directory.CreateDirectory(path);
        }
```

よくありそうなネタだし既出かもれない(´・ω・`)
x10で文字列分割

x10で文字列を特定のtokenで分割する。

`String#split`メソッドを使う。

```scala:split_sample.x10
import x10.io.Console;

class Main {

  public static def main( args: Rail[String] ) {

    val s = "1 ./foobar.out 1 2 3 2 1001";
    val ss: Rail[String] = s.split(" ");
    for( x in ss ) {
      Console.ERR.println(x);
    }
  }
}
```

## 実装について

https://github.com/x10-lang/x10/blob/60dc99b8e1956736be53c316d99ba88421c66198/x10.runtime/src-x10/x10/lang/String.x10#L578

StringHelper#split メソッドが呼ばれている。以下、引用。

```scala:StringHelper.x10
class StringHelper {
    static def split(delim:String, str:String):Rail[String] {
        if (delim.equals("")) {
            return new Rail[String](str.length(), (i:Long)=>str.substring(i as Int, (i+1) as Int));
        }
        val ans = new GrowableRail[String]();
        var pos:Int = 0n;
        var nextMatch:Int = str.indexOf(delim, pos);
        while (nextMatch != -1n) {
          ans.add(str.substring(pos, nextMatch));
          pos = nextMatch+delim.length();
          nextMatch = str.indexOf(delim, pos);
        }
        if (pos < str.length()) {
            ans.add(str.substring(pos, str.length()));
        }
        return ans.toRail();
    }
}
```
火星12号 北海道通過

#概要
火星12号のモデルで北海道通過をシュミレーションしてみた。
ライブラリーは、PyRockSim。
仰角　76.0　方位角　70.0

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/138a1516-ab7a-5e25-8f81-d51ab282e627.png)

#2点間の距離

http://vldb.gsi.go.jp/sokuchi/surveycalc/surveycalc/bl2stf.html

#襟裳岬から1180ｋｍの円

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/C/V/K/CVKQ.jpg?t=1503960912)
http://jsdo.it/ohisama1/CVKQ

#成果物

http://jsdo.it/ohisama1/SXPr
MacでOpenCV3を稼働させたければPythonは3.6ではなく3.5で！

MacのOSX 10.12.6で、Python 3.6.2をインストールしました。
で、諸情報に基づきAnacondaをインストール。続いてOpenCV 3をインストール。
OpenCV自体のインストールは確認できたのですが、「>>> import cv2が作動しない・・・」という状況に。。。

そこで色々調べたら、こちらの２つの情報からOpenCV3はまだPython3.6に対応していないのかもと思い、OpenCV稼働用の仮想環境を作り、Python3.5をインストールしてからOpenCV3を再インストール。すると無事、「>>> import cv2」でエラー表示なく次の「>>>」が出ました！

助かりました！

参考：
http://qiita.com/Gen6/items/226dac6abfa0d43c88ba
http://koruku.hatenablog.com/entry/2017/02/02/203057
bebop_autonomyをRaspberryPi(Ubuntu16.04)でコンパイル

#はじめに
私はROS及びLinux系OSについては初心者です。
その場しのぎのコードや、適切でない編集などしてしまいます。
後進のため、今後の私のため、コメントなどでご指摘いただけますと幸いです。

また、この記事を書いた段階では、まだドローンを飛ばしていません。
コンパイルが通ったのみですので、ご容赦ください。

#環境
・RaspberryPi3modelB(OS:UbuntuMate 16.04)
・ROS kinetic

#parrot_arsdkのダウンロード
```ruby:githubからダウンロード
$ cd ~/catkin_ws/src/
$ git clone https://github.com/AutonomyLab/parrot_arsdk.git
```
もしくは、

```ruby:apt-getでダウンロード
$ sudo apt-get install ros-kinetic-parrot-arsdk
```
後者のほうが依存関係などが解決できるので良いかもしれません。

#bebop_autonomyのダウンロード
```ruby:githubからダウンロード
$ cd ~/catkin_ws/src/
$ git clone https://github.com/AutonomyLab/bebop_autonomy.git
```
githubからワークスペースへダウンロードします。
こちらはapt-getのリポジトリにありませんでした。(2017/8/29)

#コンパイルしてみると・・・？
ワークスペースで"catkin_make"を実行すると、エラーが出ます。
*error: 'PIX_FMT_RGB24' was not declared in this scope*
*const uint32_t num_bytes = avpicture_get_size(PIX_FMT_RGB24, codec_ctx_ptr_->width, codec_ctx_ptr_->width);*

内容としては、"PIX_FMT_RGB24"はこのスコープ内で宣言されてないよ、といっています。

軽く調べてみると、ARSDKのビデオ関連はFFMPEGで処理されているようなので、FFMPEGに"PIX_FMT_RGB24"が存在しないかを調べてみると、

[pixfmt.h File Reference](https://ffmpeg.org/doxygen/2.7/pixfmt_8h.html)
すぐにリファレンスが見つかりました。

このページによれば、"PIX_FMT_RGB24"自体は存在しているようです。
同じヘッダ内に、"AV_PIX_FMT_RGB24"という、名前がよく似た列挙子が存在しています。
値は全く一緒だったため、こちらに書き換えてしまいましょう。

#bebop_autonomyの該当ソースコード
エラーが出ていたのは、bebop_autonomy/bebop_driver/src/bebop_video_decoder.cpp でした。
この中の"PIX_FMT_RGB24"を探すと、3箇所見つかりました。
全て"AV_PIX_FMT_RGB24"に置き換えます。
それぞれ、106行目、118行目、180行目にあるはずです。

#再びcatkin_make
ワークスペースへ移動してcatkin_makeを実行すると、Warningは出たままですが、コンパイルが成功し、ノードが呼び出せるようになりました。

明日以降、実機を接続して飛翔実験を行いたいと思います。

#自分なりの考察
"PIX_FMT_RGB24"という列挙子ですが、古い形式なのかなあと。
どこかのタイミングで"AV_PIX_FMT_RGB24"へ移行したとか・・・？
でもそうすると、古い形式でコンパイルが通らないのは、互換性がなくなるので困る気がする。
Zoomdataを試してみよう（ビッグデータ編：２）

**ビックデータ**編：１では、**Cloudera Impala**との接続検証を、**Cloudera**社が公開している仮想イメージを活用させて頂く事で実際の手順を含めてご紹介致しました。
今回は、その環境設定の際に見つけた**Solr Search**について同様に接続検証を行いたいと思います。

#（１）接続設定
まずは、いつもの通り**admin**で**Zoomdata**に入り、歯車アイコンの**Sources**画面を出します。

![S1.jpg](https://qiita-image-store.s3.amazonaws.com/0/197589/1f9a9661-a8a1-a2b0-634b-e5d961e8aca7.jpeg)

**Solr**のアイコンが有りますので、それを選択します。

![s2.jpg](https://qiita-image-store.s3.amazonaws.com/0/197589/351846ff-7cf9-54dd-4921-9a5fa22a6656.jpeg)

必要事項を入力して**Next**を選択します。

![s3.jpg](https://qiita-image-store.s3.amazonaws.com/0/197589/65be039f-953f-6b11-6fe5-84862fd4e80c.jpeg)

接続に関する情報を設定しますが、今回は以下の通りとしました。

**Connection Name : Cloudera Solr** 
**Hosting Type    : STANDALONE**
**Base Url        : http://xxx.xxx.xxx.xxx:8983/solr/**

ここで、**xxx.xxx.xxx.xxx**は、**Cloudera Solr**をセットアップした仮想サーバのアドレスを使います。

設定が終わり**Validate**を選択するとパラメータに問題が無ければ、画面上部に緑のポップアップが出てきますので、下部左側にある**Next**を選択してください。

![s5.jpg](https://qiita-image-store.s3.amazonaws.com/0/197589/49e73903-fabe-8745-334f-e0c19e66fd26.jpeg)

デモ環境が幾つか出てくると思いますので、今回は・・・**twitter_demo_shard1_replica1**を選択してみます。

![s6.jpg](https://qiita-image-store.s3.amazonaws.com/0/197589/af7753d7-561c-fb07-ba20-532eb40166dd.jpeg)

時間軸に関して、**created_at**がそのまま使えそうなので、残りの項目はサクッと進めていきます。

![s7.jpg](https://qiita-image-store.s3.amazonaws.com/0/197589/aeac949f-df12-23f4-6711-20faaab58ffd.jpeg)

![s8.jpg](https://qiita-image-store.s3.amazonaws.com/0/197589/d48708fd-c764-03bd-0cd8-683cddeb5768.jpeg)

#（２）ダッシュボードで検証
前回までは、一旦メイン画面まで戻ってから作業を行っていましたが、今回は設定成功の画面上からダッシュボードを作成してみます。

![s9.jpg](https://qiita-image-store.s3.amazonaws.com/0/197589/7a901c99-5bb6-8919-90e3-c6701d1b1ba5.jpeg)

画面右上にある緑色の**+ New Chart & Dashboard**を選択すると、利用可能なチャートのメニューがポップアップしてきますので、その中から**Word Cloud**を使ってみます。

![s10.jpg](https://qiita-image-store.s3.amazonaws.com/0/197589/fd6733d6-de0f-5c3b-657e-0553484c293d.jpeg)

**SNS**の発信ユーザのロケーションに関する傾向が地名の大きさと色で表示されてくると思います。
次に、画面下側にある**Time Bar**を左右に移動させてみてください。その情報にリンクする形で**Word Cloud**の表示が変わっていく事が確認できると思います。

![s11.jpg](https://qiita-image-store.s3.amazonaws.com/0/197589/dcc3beda-dc4f-d1cf-0046-b1b4ae4136ab.jpeg)

また、画面の右上部分にある**Search**フィールドに検索対象の文字列を入力する事により、**Solr**上に格納されている実際のデータを検索する事が可能です。（同時にその条件での発生場所とその頻度の表示が変わります）

![s13.jpg](https://qiita-image-store.s3.amazonaws.com/0/197589/85cdcaae-d859-145a-9d6a-11304aa127e0.jpeg)

同様に**Solr**上に格納されている幾つかのデータに関して、今までの検証と同様にチャートを作成してみます。

![s14.jpg](https://qiita-image-store.s3.amazonaws.com/0/197589/5f5662f4-95e3-4fda-93e2-7186a77c4aa3.jpeg)

次回以降の為に、出来たダッシュボードを保存します。

![s16.jpg](https://qiita-image-store.s3.amazonaws.com/0/197589/bc9297ca-c445-ff4f-0f59-4f3bd1b5f1a7.jpeg)

無事に保存が出来ましたので、次回以降はここからスタート出来る様になりました。

#（３）今回のまとめ
今回の接続検証では、**SNS**情報がスタティックに事前格納されたデータに対してのアクセス検証になりましたが、例えば時々刻々と**Solr**に対して追記される構成にし、そのデータソースに対するアクセスを**Zoomdata**側で柔軟に設定する事により、単純な**ビッグデータ**へのアクセスとして高効率・高速に取り扱う事が可能になりますので、シンプルで柔軟な**リアスタイム**・**ストリーミング**解析を実現する事ができるようになります。
**マイクロクエリー**と**オンメモリ技術**の相乗効果は、今まで諦めていたような**ビッグデータ**の利用法に新しい可能性をもたらすと同時に、最終データが出来上がる過程を観測・解析する事による、大きな付加価値と競合優位性を実現できるようになるでしょう。
次回は、**Hive On Tez**を使った接続をご紹介したいと思います。
iOSでモーフィングアニメーション

iOSで文字がいい感じに変わっていくアニメーションどうやって書くのかなと思って調べた時のメモです。

WWDC2017の「[Advanced Animations with UIKit](https://devstreaming-cdn.apple.com/videos/wwdc/2017/230lc4n1loob9/230/230_advanced_animations_with_uikit.pdf)」の中でモーフィングのやり方について触れられていたのでそちらを参考にしました。

![Aug-29-2017 01-51-33.gif](https://qiita-image-store.s3.amazonaws.com/0/18486/dd97f672-4f3d-7008-449b-d08696563999.gif)


## ポイント
* 変化前後を別Viewにして重ねておく
* UIViewPropertyAnimatorを使ってalphaとscaleを変化させる
  * Scaleは元のサイズから変化させる場合は変化前後のwidth, heightの比率をそれぞれ求める
  * Scaleが変化した状態からもとに戻す場合はCGAffineTransform.identityを指定する

[サンプル実装はこちら](https://github.com/hiroyukimizukami/ios-morphing-sample)
Visual Studio Codeタスクのdotnetコマンド出力を文字化けしないようにする

## TL;DR;
- 日本語Windowsでは`dotnet`コマンド出力がUTF-8のため文字化けする
    - 解決するには`chcp 65001`を実行してコンソールのコードページをUTF-8にする
- VSCodeのタスク定義では`windows`としてWindows固有の設定ができる
    - そこに`chcp 65001`の後に`dotnet`コマンドを実行するよう指定する

## 何が問題か

.NET Coreなアプリ開発はVisual Studioはもちろん、[Visual Studio Code](https://code.visualstudio.com/)(以下VSCode)が使われることも多くなってきたかと思います。

VSCodeはフルのVisual Studio(以下VS)が使えないmacOSやLinux Desktopでよく使われているイメージですが、WindowsでもVSに比べ動作が軽快ですし、デバッガもついていますので、ちょっとした開発では案外十分に機能します。

そこで問題となるのがタスクで`dotnet`コマンドを実行した際、出力結果が文字化けすることです。`dotnet`コマンドはUTF-8で標準出力等に出力するのですが、日本語Windowsの既定のエンコーディングが、MS932(いわゆるShift-JIS)であるため、ただそのまま実行しても文字化けしてしまうのです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12039/5f02dc31-8f83-da1d-9162-3cdf104a6364.png)

※参考 : [dotnet coreで対応しているテキストエンコーディング | OPC Diary](https://opcdiary.net/?p=31103)

その回避策としては、cmd.exeを実行時に自動で`chcp 65001`(65001はUTF-8のコードページ)を実行するようレジストリをいじるといったこともできるようですが、このためだけにすべてのcmd.exeのコードページを変更するのは、正直嫌です。

※参考 : [コマンドプロンプト起動時、自動的に文字コードをUTF-8にして日本語もちゃんと表示できるようにする方法 - Qiita](http://qiita.com/yufu/items/86a455f948a3e1c0ef97)

## 解決法

そこで、VSCodeのタスク定義のところで、Windowsの時だけ`dotnet`コマンドを実行するのではなく、`cmd`を経由して`chcp 65001`を実行した後に`dotnet`コマンドを実行するようにしましょう。具体的には、既定の`command`などを定義した後に、`windows`の設定を追加します。

```json
{
    "version": "0.1.0",
    "command": "dotnet",
    "isShellCommand": true,
    "args": [],
    "windows": {  // Windows固有の設定
        "command": "cmd", // cmd.exeを実行
        "args": [ "/C", "chcp 65001 && dotnet"] // /Cオプションで第二引数のコマンドを実行
    },                                          // chcp 65001 の後に && で続けてdotnetを実行するよう指定
    "tasks": [
        {
            "taskName": "build",
            "args": [
            ],
            "isBuildCommand": true,
            "problemMatcher": "$msCompile"
        },
    ]
}
```

※参考 : [Custom Tasks - Tasks in Visual Studio Code](https://code.visualstudio.com/docs/editor/tasks#_custom-tasks)

ビルドを実行すると、確かに文字化けが解消されていることが確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12039/5183a75b-da78-dcdb-722a-b140aa7c52b8.png)

これであなたも快適な.NET Core開発 with VSCodeライフを！
メモ: intellij で vendor 等特定のパスが、定義ジャンプ出来ない時

# はじめに
intellij でrailsを書いていると vendor の下のgemが探せない時があるので、対応をメモしておきます。
たまにしか必要ないけど、そのたまにの時はいつも忘れちゃうので・・・。
おそらくrails以外でもこういった現象は起こると思われます。

# 手順
1. File　→　Project　Structure → Module を選択
2. この状態で、Sources　タブを選択し、右ペイン(Add Content Root) に Excluded に vendor のパスが入っているはずなので `☓` をクリックし `OK` をクリック
Django + Webpack を使ってVueを動かす

Django上でVueを使ってみたくなりました。Webpackを使うのがよさそうだと思いました。[ここ](http://owaislone.org/blog/webpack-plus-reactjs-and-django/)を結構参考にしています。下記手順。

## WebpackとVueの準備

### npmパッケージのインストール

Djangoのプロジェクトディレクトリに移動する。必要なnpmパッケージをインストールする

```
npm init -f
npm install --save-dev webpack webpack-bundle-tracker vue
```

### webpack.config.jsを作成・編集

webpackの設定ファイルであるwebpack.config.jsを編集する

```
touch webpack.config.js
```

```js:webpack.config.js
var path = require("path")
var webpack = require('webpack')
var BundleTracker = require('webpack-bundle-tracker')

module.exports = {
  context: __dirname,

  entry: './assets/js/main.js', // これがエントリーポイント

  output: { // コンパイルされたファイルの設定
      path: path.resolve('./assets/bundles/'),
      filename: "[name]-[hash].js",
  },

  plugins: [
    new BundleTracker({filename: './webpack-stats.json'}),
  ],

  resolve: {
    alias: {
　　　// 完全には理解できてないですが、
　　　// 下記エイリアス設定しないとvue走りません
      'vue': path.resolve('./node_modules/vue/dist/vue.js'),
    }
  },
}
```

### エントリーのmain.jsを作成・編集

```
mkdir -p assets/js
touch assets/js/main.js
```
とりあえず内容は下記のみ

```js:assets/js/main.js
window.Vue = require('vue');
```

### コンパイル

```
./node_modules/.bin/webpack --config webpack.config.js
```

これでwebpack.config.jsのoutputで指定したとおり、assets/bundles/に「main-(ハッシュ値).js」というファイルができます。

## Djangoの設定

### django-webpack-loaderのインストール

```
pip install django-webpack-loader
```

settings.pyを設定します

```py:settings.py

...

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'assets'), 
)

...

WEBPACK_LOADER = {
    'DEFAULT': {
        'BUNDLE_DIR_NAME': 'bundles/',
        'STATS_FILE': os.path.join(BASE_DIR, 'webpack-stats.json'),
    }
}

...

INSTALLED_APPS = (
 ...
 'webpack_loader',
)
```
### テンプレートの書き方

urls.pyの設定などについては割愛します。通常のDjango appと同様です。テンプレートの書き方だけ少し注意が必要です。
2つポイントがあって、まずwebpack-loaderをよぶテンプレートタグが必要です。もう一つは、vueのテンプレートもデフォルトで{{ }}をつかっているので、Djangoテンプレートとの競合を避ける必要があります。

とにかく下記を御覧ください

```html+django
{% load render_bundle from webpack_loader %}
<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title>Example</title>
 </head>

 <body>
 {% verbatim %}
 <div id="app">
 {{ message }}
 </div>
 {% endverbatim %}
 
{% render_bundle 'main' %}
 <script>
 var app = new Vue({
 el: '#app',
 data: {
 message: 'Hello Vue!'
 }
 })
 </script>
 </body>
```

{% render_bundle 'main'%}のところにコンパイルされたjsがはいります。

また、vueのテンプレートと競合しないよう、djangoのテンプレートエンジンは{% verbatim %}を使って一部オフにしています。

実際動いている例を[こちら](https://nakapython.com/vue/webpack/)に用意しました。ソースなど参考になればと思います

### 今後の予定：デプロイするときの注意点

デプロイするときに多少気をつける点があります。走り書きで[こちら](https://nakapython.com/blog/django%E3%81%A7webpack%E3%82%92%E3%81%A4%E3%81%8B%E3%81%A3%E3%81%A6vue%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)に書いていますが、機会があればまた改めて投稿したいと思います
SW工学手法を導入すると、どう導入すればよく成果が目立つのか（＃２）

以前の投稿で


~~~
（開発組織が）大きい場合：下流工程にフォーカスする。
（開発組織が）小さい場合：上流工程にフォーカスする。
~~~

と話しました。今度はこれの「わけ」について話します。

**開発チームのサイズが大きい場合**は以下の特徴をもっています。

>1. クライアントさんの範囲が広い。
2. コード品質向上で興味がたくさんある。

１番めはどっても重要なものです。上流工程は要求管理、仕様管理、受け入れテストなどで構成されてます。いくら上流工程でちからを入れても満足させる<u>クライアントさんが広いので成果を出すのがどっても難しいです。</u>

２番目はどうして下流工程でフォーカスするかのもう一つのわけです。下流工程は設計、開発、単体テスト、統合テスト（システムテスト）で構成されてます。そちの活動で集中すると成果がよく出る可能性は高いです。




**開発チームのサイズが小さい場合**は以下の特徴をもっています。

>1. クライアントさんの範囲が狭い。
2. 少ない人数で効果的な管理活動に興味が高い。
3. まだコード品質向上活動は考えられない。（遂行したら良いのは分かってるが…）


クライアントさんの<u>範囲が狭いのでクライアントの要求を満足させるのは比較的し安いです。</u>
２番目は僕の経験に基づく文章です。小さいチームを運営するリーダーと相談するといつも少ない人数でハイ・ファフォーマンスを考えています。そのためには自分の組織に「ツール」とか「プロセス」の導入を考える場合が多いでした。
そして開発のマン・パーワーが弱いので３番目のような組織が多いでした。
<br>なのでクライアントの要求管理とかの手法を導入してスキル・アップすればすぐ成果が出られます。コード品質向上とかは無理の場合が多いです。


こんな話を今するのは組織内の管理者（品質管理者）のためです。以前にあのレポートで「問題は要求仕様から３５％が出る」と書いて規模に関係なくて全部要求工学を学ぶ時がありました。僕の場合も以前の組織でトライしようとしましたがあんまり成果が出なかったので諦めた記憶があるんです。

成果のアップを悩んでる方々へのアドバイスなのでご参考にしてください。:sweat_smile:
WindowsでClangを使うならmsys2が便利

Clangは[公式サイト](http://clang.llvm.org/)でWindows用のバイナリが配布されていますが、このバイナリは特定バージョンのVisual Studio(以前はMinGW gcc)に依存しているため導入が面倒です。配布されているバイナリは利用せずに、[Msys2](https://msys2.github.io/)のパッケージとしてClangをインストールすると依存関係を勝手に解決してくれるので楽できます。ここではMsys2の導入からClangでコンパイルできるようになるまでの手順をざっくり説明します。

## Msys2をインストールする

Msys2はWindows上で動くunixライクな開発環境です。
公式サイトに従い、Msys2をインストールしてください。

https://msys2.github.io/

## Clangをインストールする

ClangはMsys2のパッケージマネージャーpacmanでインストールします。
きっと c:\msys64 にあるmsys2_shell.cmdを起動し、次のコマンドを入力してください。

```
pacman -Ss clang
```

ずらずら出てくるパッケージのうち、必要なものをインストールします。
64bitのclangはmingw-w64-x86_64-clang、32bitのclangはmingw-w64-i686-clangです。

```
pacman -S mingw-w64-x86_64-clang
pacman -S mingw-w64-i686-clang
```

依存関係がなんたらかんたらと出てきますが、とりあえずyesすると依存するパッケージもインストールしてくれます。

## パスを通す

64bitのClangは C:\msys64\mingw64\bin、32bitのclangはC:\msys64\mingw32\bin にインストールされている。ここにパスを通せばどこからでもClangを利用できます。

## コンパイルしてみる

stdio.hやらiostreamをインクルードした適当なコードを作りコンパイルしてみます。

```
clang test.c -o test1.exe
clang++ test.cpp -o test2.exe
```

無事コンパイルできたらおしまいです。お疲れ様でした。
[クイズ]javascriptと仲良くなるための一歩　第４３話「this参照２」

#問題

```js
var obj = {
           x:3,
           doit: function(){ console.log("method is called." + this.x); }
          }
obj.doit(); //=> method is called.3

var fn = obj.doit;
fn(); //=> ?
```


:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

```js
var obj = {
           x:3,
           doit: function(){ console.log("method is called." + this.x); }
          }
obj.doit(); //=> method is called.3

var fn = obj.doit;
fn(); //=> method is called.function (a,b,c){n(a)||v("Expected function but got %s: %s.",[m(a),a],b,Array.prototype.slice.call(arguments,2))}

// [解説]
// obj.doitが参照する関数オブジェクトをグローバル変数fnに代入
// 関数内のthis参照はグローバルオブジェクトを参照する
```
Raspberry piにPython3.6を入れてみた

元々Raspberry Piに入っているpythonには2種類あります。一つは「python2.7.13」そして「python3.5.3」です(2017年12月)。python2系は2020年1月1日にサポートが終了するのでおそらく今度使うことが少なくなるでしょう。一方、python3系は今後機械学習のプログラムを作成する上でよく使うことになるでしょう。その時に例えばTensorflowなどのライブラリをインストールする時にはpython3系でもバージョンを細かく指定してきます。3.4でも十分対応できる時もありますが、もし3.6を動作環境として要求された時のために今回はRaspberry piにpython3.6をインストールをしてみたいと思います。

#参考
pyenvを使った方法もありますが今回は[こちら](https://gist.github.com/dschep/24aa61672a2092246eaca2824400d37f)に紹介されていた方法でインストールしてみたいと思います。

#準備
はじめにインストールのための準備をします。インストールしたpythonをビルドするためのツールをインストールします。

```
$ sudo apt-get update
$ sudo apt-get install build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev

```

#インストール
以下のコマンドを入力し、python3.6をセットアップしていきます。

```
$ wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
$ tar xf Python-3.6.0.tar.xz
$ cd Python-3.6.0
$ ./configure
$ make
$ sudo make altinstall

```

#動作確認
それでは、無事動作するか確認するためにターミナルで``` python3.6``` と入力してみましょう。エラーが起きずにpythonの対話環境を起動したらインストール成功です。

#追記
- （2019年4月）pipを使うときは、```pip3.6```か```python3.6 -m pip```と叩けば使えます。
LaravelでUUIDを使いたい

# tl;dr
UUIDは場合によっては使ったほうがよい。
LaravelでUUIDを使う場合は、Modelを継承してそこにUUID用の記述を書く。

# UUIDについて

みなさん、UUIDつかってますか？
Laravelでアプリケーションをスクラッチで組む際は、
基本的にIncrementalなID(1,2....)を使うことが多いと思います。

ただ、時と場合によっては、UUIDを使いたい/使わないといけないということも出てくるかと思います。

* もともとUUIDでDBMSが動いていた場合
* テーブルのレコード総数をそとから隠蔽したい場合
* その他色々。。。誤魔化し誤魔化し

### 参考(重要)
この記事ではUUIDをいつ使うべき？というお話はしません。
いつ使うべきか、というのを知りたい方は、下の宗教戦争をお読み下さいｗ

[Against UUID: Why Auto Increment Is A Terrible Idea](https://www.clever-cloud.com/blog/engineering/2015/05/20/why-auto-increment-is-a-terrible-idea/)
[For UUID: Do you really need a UUID/GUID?](https://rclayton.silvrback.com/do-you-really-need-a-uuid-guid)



# LaravelでUUIDを使う方法

Laravelで一番簡単UUIDを使うには、
Illuminate\Database\Eloquent\Modelを一度自作Modelで継承し、
それを更にここのModelに継承させるという形を取ります。

```
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Util\CommonUtil; //自作Utility Class

abstract class BaseModel extends Model
{
    public $incrementing = false; // AutoIncrementをOffにします。

    public static function boot()
    {
        parent::boot();

        // Create&Save時に自動でidをインサート
        self::creating(function ($model) {
            if (empty($model->id)) {
                $model->id = CommonUtil::generateUUIDV4(); // UUIDを作成、挿入
            }
        });

        self::saving(function ($model) {
            if (empty($model->id)) {
                $model->id = CommonUtil::generateUUIDV4(); // UUIDを作成、挿入
            }
        });
    }
}
```


# UUIDを使って良いLifeを！
UUIDを使うべきタイミングはご自身の判断におまかせしますが、
もし使いたいと思った際はLaravelでも割と簡単に使えるので、
ぜひ導入してみて下さい！
新人さんに向けたPython導入の記録

# はじめに
最近，職場の新入社員に短い期間ですがPythonを教える機会があったので，その時に行った内容についてまとめておきたいと思います．
新人教育でPythonを選んだモチベーションは次のようなところです．

* シンプルな文法で習得しやすいと思う．
* 用途も豊富（Webアプリ，機械学習，ちょっとした書き捨てコードなど）
* 自分も好きな言語なので

ちなみにその新人さんは，その前にC++をある程度習得していて，それ以前はプログラミング未経験となります．

# 環境の準備
はじめは環境の準備からです．

## pyenv
OSはUbuntuを使っていたのではじめからPythonは入っていたのですが，インストールするという経験も積んでもらいたかったのでpyenvで環境を作成しました．この時に併せて，Pythonには2系と3系があることの注意点を伝えてあります．今回はPython3.6.2を使用しています．

※ほんとはvenvも説明したかったけど，混乱しそうなので省略しました．

## Hello world!
Pythonが入ったらひとまずhello.pyを作って`Hello world!`です．エディタはVisual Studio Codeを使っていたのでPython用の拡張を入れるだけで準備OKでした．ここでpythonの実行方法を覚えてもらっています．

```
$ python hello.py
```

## Jupyter Notebook
導入で学習用のコードを書いていくには対話型の実行環境があると便利なので，Jupyterをインストール．この時に`pip`について説明してあります．はじめは入門サイトを見てJupyterである程度まとめながらコードを書いていってもらいました．
ついでに[paiza.io](https://paiza.io/projects/new)のようなオンラインの実行環境も紹介しています．

# 基本的な文法の習得

## Dive Into Python 3
[http://diveintopython3-ja.rdy.jp/index.html](http://diveintopython3-ja.rdy.jp/index.html)

ひとまずはここを見てもらいながら，Jupyterでコードを書いてもらいました．といってもあまり時間がなかったので前半のほうをざっくりといった感じですが．こういうページは助かりますね．
個人的にはリスト内包表記がうまく活用できるとPythonが楽しくなってくると思います．

# 実践的にコーディング

## Google Code Jam
[https://code.google.com/codejam/past-contests](https://code.google.com/codejam/past-contests)

Google Code Jamの簡単な過去問をQualification Roundから選んで解いてもらいました．基本的なファイルの入出力や文字列操作，簡単なアルゴリズムを習得してもらうのが狙いです．例えば何らかのログファイルを解析するスクリプトを書くようなときにも，ここでの知識が役立つかなと思っています．
またここでは，Google Code Jamを解いてもらうときに知っていると役立つテクニック（？）を何点か紹介しています．

```py3
with open('./sample.in') as f:
    # 末尾に入る邪魔な改行文字をスライスで削除
    line = f.readline()[:-1]
    # 空白区切りのデータを個別の変数にアンパック代入
    a, b, c = f.readline()[:-1].split()
    # intにしたいときはlist内包表記で変換
    a, b, c = [int(x) for x in f.readline()[:-1].split()]
```

## Slackbot
いかにもお勉強なコードばかりを書いていても飽きてしまうかなと思って，簡単に作れるけどちょっとすごい感のあるプログラムを作ってもらいました．今回はお題として，職場でSlackを使っていることもありSlackbotを作ってもらっています．
[こちら](http://qiita.com/sukesuke/items/1ac92251def87357fdf6)を参考にさせてもらうと簡単に実装できました．ひと工夫として天気予報を返すように作りました．Pythonで天気予報を取得するのも[こちら](http://qiita.com/shizuma/items/ad04e08ab31ba436d34e)を参考にすると簡単に実現できました．

<img width="207" alt="01.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/b4fef93b-9b1b-3b06-e2bb-a79488fcb4a1.png">

こちらは新人さんも作ってみて楽しかったようです．よかった:smile: 

## Django Girls Tutorial
[https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/)

こちらは期間が足りなくて今回は紹介だけとなりましたが，Djangoを使ったWebアプリ作成のチュートリアルになります．Web開発の知識がなくても進めていけるくらいに丁寧に説明されていて素晴らしいです．チュートリアルの中でCSSも用意されており見栄えがするものが出来上がることと，Herokuを使ってデプロイも行っているので動くものが出来上がり，上記のSlackbotと同様に作っていて楽しいのではないかと思って紹介しました．是非チャレンジしてもらいたいものです．

# おわりに
短期間ではありましたが，動くプログラムを作ることまでができて教えている側も楽しかったです．Pythonを好きになってもらえたらいいですね．