OmniAICreator/Qiita-1.07M huggingface dataset:
Bluemix API(Weather Company Dataサービス) 

コード

```py3
import requests 

import json

# API認証用の情報
username = ''
password = ''

# 経度・緯度情報
latArray = [35.681167] 
lonArray = [139.767052]

# 地点数回ループ
for x in range(len(latArray)):

  # エンドポイントを格納 twcservice.au-syd.mybluemix.netは認証情報のhostに相当
  weatherUrl = 'https://twcservice.au-syd.mybluemix.net/api/weather/v1/geocode/' + str(latArray[x]) + '/' + str(lonArray[x]) + '/observations.json?language=ja'

  # 本回の地点での天気情報取得
  r = requests.get(weatherUrl,auth=(username,password))

  # 結果(Unicode型)をdict型に変換
  results = json.loads(str(r.text))
    
  # resultsのキー(0:observation 1:metadata)
  for i in range(2):
    
    print('\n') 
        
    # 地点の番号とresultsのキーを表示
    print('"%s" position %d' % (results.keys()[i], x + 1))
    
    # resultsのキー(0:observation 1:metadata)に対応する各値の要素数回ループ
    for key_number in range(len(results.values()[i])):
        
        # resultsのあるキーに対応する値のキーとその値を順に表示
        print('%s %s' % (results.values()[i].keys()[key_number], results.values()[i][results.values()[i].keys()[key_number]]))      
```

実行結果(2017/01/04)

```py3
"observation" position 1
primary_wave_period None
primary_swell_direction None
terse_phrase None
expire_time_gmt 1515031200
vis 39
clds None
wx_icon 34
primary_swell_period None
min_temp 0
primary_wave_height None
uv_index 1
primary_swell_height None
precip_hrly None
uv_desc 弱い
obs_id 47662
water_temp None
pressure_desc 上昇
heat_index 6
wspd 13
rh 39
qualifier_svrty None
valid_time_gmt 1515024000
wc 3
qualifier None
blunt_phrase None
wdir 320
obs_name Tokyo
icon_extd 3400
dewPt -8
pressure 1016.6
wdir_cardinal 北西
secondary_swell_height None
key 47662
class observation
secondary_swell_period None
pressure_tend 1
temp 6
gust None
precip_total 0.0
snow_hrly None
day_ind D
secondary_swell_direction None
feels_like 3
wx_phrase 快晴
max_temp None


"metadata" position 1
language ja-JP
status_code 200
expire_time_gmt 1515031200
longitude 139.76
version 1
latitude 35.68
transaction_id 1515027125600:847700233
```

1: ダッシュボード(アプリ・サービス表示画面)に接続
https://console.bluemix.net/dashboard/apps

2: クリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104697/5d3fbfb4-1179-42e7-b0c6-d870146b3061.png)

3: 認証情報をコード中に記載(username・password・host)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104697/85633e98-ac13-8a8e-8ccb-5521e9cfa5e9.png)

Weather Company Data For IBM Bluemix APIs
https://twcservice.mybluemix.net/rest-api/#!/twc_observations_current/v2obscurrent

Weather company Data
https://console.ng.bluemix.net/catalog/services/weather-company-data/

IBM Cloudライト・アカウント(無料・期間無制限・クレジットカード登録不要)
https://www.ibm.com/cloud-computing/jp/ja/bluemix/lite-account/
MyDNSへのIP通知

# はじめに
MyDNSのIP通知用URLへBASIC認証するだけで、IP通知が出来る。
BASIC認証のUSER:PASSはMyDNSのアカウントになる。

https://www.mydns.jp/login.html

動作は最小限で「IEを立ち上げる」、「URLを開く」、「BASIC認証」でログインするスクリプトを作りました。


#スクリプト
```
Dim objIE
Set objIE = CreateObject("InternetExplorer.Application")
Dim URL
url = "https://www.mydns.jp/login.html"
objIE.navigate URL, , , , "Authorization: Basic USER:PASSWORD"
WScript.Sleep 5000
objIE.Quit
```

#解説
#### ■変数宣言 

```
Dim objIE
```
#### ■InternetExplorerオブジェクトを作成

```
Set objIE = CreateObject("InternetExplorer.Application")
```
オブジェクトなので頭にSetを付ける。

#### ■変数宣言

```
Dim URL
```

#### ■URLを代入

```
URL = "https://www.mydns.jp/login.html"
```
オブジェクトではない為、頭にSetは不要。

#### ■BASIC認証でログイン

```
objIE.navigate URL, , , , "Authorization: Basic USER:PASSWORD"
```
【Navigateメソッドの引数】
object.Navigate URL [Flags,] [TargetFrameName,] [PostData,] [Headers]

【BASIC認証のUSERとPASSWORD】
USER:PASSWORDはBASE64エンコードされたデータを入れる必要がある。

- プレーンテキスト<br>
  tanaka:123456<br>👇
- BASE64<br>
dGFuYWthOjEyMzQ1Ng==

変換サイト
https://hogehoge.tk/tool/

#### ■ウェイト5秒

```
WScript.Sleep 5000
```
ウェイトを入れないと、通知できない事があり5秒ウェイトを入れている。

#### ■objIEオブジェクトの終了

```
objIE.Quit
```
# テスト
自宅サーバー、Wi-FIスポットで接続したノートPCのグローバルIPの通知を行い、MyDNSの管理画面で反映しているか確認をする。
その後、ドメイン名でVPN接続をして接続が完了するか確認をする。

- ノートPCからIP通知
![通知1.png](https://qiita-image-store.s3.amazonaws.com/0/160993/7c48ded8-590e-6283-44b0-5e17c004748d.png)



IPアドレスが103.5.140.172で登録されたことを確認。

- 自宅サーバーからIP通知
![通知2.png](https://qiita-image-store.s3.amazonaws.com/0/160993/694fd731-f437-bcf9-0da1-ee4398036d04.png)

IPアドレスが126.66.xxx.xxxで登録されたことを確認。
nslookupでも確認。

```
サーバー:  UnKnown
Address:  103.5.140.1

権限のない回答:
名前:    xxxx.mydns.jp
Address:  126.66.xxx.xxx
```


xxxx.mydns.jpでVPN接続できることを確認。

```
PPP アダプター home:

   接続固有の DNS サフィックス . . . . .:
   IPv4 アドレス . . . . . . . . . . . .: 192.168.1.242
   サブネット マスク . . . . . . . . . .: 255.255.255.255
   デフォルト ゲートウェイ . . . . . . .:

Wireless LAN adapter Wi-Fi:

   接続固有の DNS サフィックス . . . . .: wi2.ne.jp
   リンクローカル IPv6 アドレス. . . . .: fe80::58a2:d126:ffce:5ee9%2
   IPv4 アドレス . . . . . . . . . . . .: 10.4.243.69
   サブネット マスク . . . . . . . . . .: 255.255.248.0
   デフォルト ゲートウェイ . . . . . . .: 10.4.240.1
```


#まとめ
あとはタスクスケジューラにぶっこんどけば定期的にMyDNSへIP通知を行ってくれる。

また今回のコードでは、IEは画面上に立ち上がってこない。
objIE.Visibleの値を指定しない場合は、デフォルト動作としてIEは立ち上がってこないが、裏で処理をしている状態、IEを視覚的に立ち上げる場合は、objIE.Visible = Trueとすることでブラウザが立ち上がってくる。
React Native入門 2 コンポーネントの実装

## 今回扱う範囲
前回の記事では、コードを眺めて、App.jsを解剖していきました。
今回は、React Nativeの開発においてもっとも重要な、**コンポーネント**について扱います。

## コンポーネントとは
Reactにおけるコンポーネントとは、**画面を構成するパーツ**だと思ってください。

```App.js

export default class App extends Component<{}> {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          Welcome to React Native!
        </Text>
        <Text style={styles.instructions}>
          To get started, edit App.js
        </Text>
        <Text style={styles.instructions}>
          {instructions}
        </Text>
      </View>
    );
  }
}
```
この、`class App`もコンポーネントです。また、`View`や`Text`などもコンポーネントです。ReactやReact Nativeでは、このように自分で作ったコンポーネントや、もともとあるTextなどのコンポーネントを組み上げて、画面のコンポーネントを組み立てていきます。

## 再利用性
Reactのコンポーネントの大きな特徴として、再利用可能であることが挙げられます。
たとえば、アプリにはどの画面にも共通のパーツがあると思いますが、そのパーツをコンポーネントとして一箇所で実装し、他のところから参照することで、同じコードを繰り返して書かずに済みます。
実際にコンポーネントを作って、これらを体感してみましょう。
前回は、traineeという名前でアプリを作ったので、それを利用しているものとします。

```
trainee
- __tests__
- App.js
- index.js
- ios
- android
- package.json
- app.json
- node_modules
- src (今回作る)
  - components (今回作る)
    - sample.js
...
```
こんな感じのプロジェクト構成でいきます。

```
$ mkdir src
$ cd src
$ mkdir components
```

componentsの中にsample.jsを作りSampleという名前のコンポーネントを作ってみましょう。

``` src/components/sample.js
export default class Sample extends Component{
  render() {
    return (
    <View>
      <Text>
         Hello Component
      </Text>
    </View>
    );
  }
}
```

これでコンポーネントができました。`export default` としているので、他のファイルから読み込めるようになります。`App.js`の中で呼び出してみましょう。

``` App.js
import React, { Component } from 'react';
import {
  Platform,
  StyleSheet,
  Text,
  View
} from 'react-native';
/* Sampleのコンポーネントをimportする。App内にSampleタグを追加する。*/
import Sample from './src/components/sample'

const instructions = Platform.select({
  ios: 'Press Cmd+R to reload,\n' +
    'Cmd+D or shake for dev menu',
  android: 'Double tap R on your keyboard to reload,\n' +
    'Shake or press menu button for dev menu',
});

export default class App extends Component<{}> {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          Welcome to React Native!
        </Text>
        <Text style={styles.instructions}>
          To get started, edit App.js
        </Text>
        <Sample />
        <Text style={styles.instructions}>
          {instructions}
        </Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
});
```

App.jsの中に、import文を書き、さらに`<Sample />`を書きました。
`<Sample></Sample>`と同じ意味です。タグの中身に何も書かないときはこのように書くと簡潔に済みます。

これでリロードしてみると、実際に、Sampleの中で定義したものが画面にレンダリングされていることがわかります。

## まとめ
今回は、1章で学んだことを実際にアウトプットするために、コンポーネントを別ファイルに記述し、実際に呼び出して使うということを、手を動かして学びました。
ただ、まだ複数の画面を作ったりしてないのでこの恩恵は薄いかもしれません。
というわけで、次回は複数の画面を作って、画面遷移をするために、ルーティングというものを学びます。
Font Awesome 5で変わった点とRiotからの利用

少し前に[Font Awesome 5](https://fontawesome.com/)がリリースされましたが、4以前とエコシステムから大きく変わるものでした。

## SVG+JavaScriptがメインに

Font Awesome 4まではWeb Fontで作られていましたが、Font Awesome 5では「JavaScriptで動的に`<svg>`タグを生成して、文章中に直接埋め込む」という手法がメインとして取り上げられていました。

このような形とすることで、

* WebpackやRollupのTree Shaking（`import`した分のみ読み込む）を利用して、必要なアイコンだけ組み込むことが容易に行える
* Node.jsによるサーバサイドレンダリングが可能となる
* React.jsなど、仮想DOMフレームワークとの親和性向上

などといったメリットがあります。一方で、「SVGを埋め込む」ということでいくつか気になる点がありましたが、巧妙に解消していました。

* 周りのフォントと色が合うのか…`fill="currentColor"`を使うことで、文章のフォント色をそのまま使うことが可能
* あとから`<i>`を追加した場合や、アイコンのクラスを変更した場合はどうなるのか…MutationObserverを入れることで、タイマーなしで変更を追随できるようにしてあった
* Font Awesome 4との互換性…[互換レイヤー](https://fontawesome.com/how-to-use/upgrading-from-4)があるので、名前の違うアイコンなどもそのまま使える

## Riotから使ってみる

[Vue.js](https://github.com/FortAwesome/vue-fontawesome)や[React.js](https://github.com/FortAwesome/react-fontawesome)については公式のバインディングがありますが、Riot.jsからも使いたいと思ったので、自分で[jkr2255/riot-fontawesome](https://github.com/jkr2255/riot-fontawesome)を作ってみました。

`fontawesome.icon`の結果として得られるものは、

* `html`…HTMLソース
* `node`…DOMノード
* `abstract`…VDOMの`h`に投げるのにピッタリとなる、仮想DOM的な要素の詳細

と、3つの形式があります。Riotに直接ASTを投げる方法がわからなかったのと、DOMノードが取れるのならそれを使うのが手っ取り早いということで、イベントサイクルを見計らって`appendChild`や`replaceChild`ではめ込む、という形の実装としています。

実は、これがnpm初登録だったので、環境を整えるのにも少々悪戦苦闘しました。
Docker初心者がまとめるdocker

# 概要

Dockerで開発する機会があり、普段Vagrantを使っている自分にはわからないことが多々あったのでまとめておく

# 基本コマンド
# 仮想環境立ち上げ

docker-compose "up" " run" "start" コマンド 違い

## docker-compose up
=>docker-compose.ymlで定義した<b>サービスを開始または再起動する</b>

*  デフォルトは「アタッチド」モードであり、全てのコンテナのログが画面上に表示される。
*  「デタッチド」モード（ -d ）では、Compose はコンテナを実行すると終了するが、コンテナは後ろで動き続ける 。

## docker-compose run
=> 「ワンオフ」（one-off；１つだけ、偶発的） または「アドホック」（adhoc；臨時）な<b>タスクを実行 する</b>

* 実行するにはサービス名の指定が必要であり、特定のサービス用のコンテナを起動し、かつ依存関係のあるコンテナも起動する 。
* テストの実行であったり、データ・ボリューム・コンテナに対するデータの追加・削除といった管理タスク。
*  run コマンドは実際には docker run -ti。 コンテナに対してインタラクティブなターミナルを開き、コンテナのプロセスが終了すると、その時点の該当する終了コードを返す。

##  docker-compose start
=> 既に作成済みの<b>コンテナを再起動 する</b>

* 止まっているコンテナを起動するだけであり、新しいコンテナは作成しない。
(restartとかにしてくれた方が直感的なのでは？と思っている・・・)


# 参考

[docker-compose "up" " run" "start" コマンド 違い (@mom0tomo さん)](https://qiita.com/mom0tomo/items/f536e6759d3f42d58ffc)
vue.js入門

# vue.jsとは？なぜこれを勉強しようと思ったか？

vue.jsはMVCのVの部分のフレームワークでがっつり全体を作ることもできるし、jqueryのように部分的にも使うことができる。SPA、ないしPWAが今後増えることを考え、勉強しようと思った。特徴は下記

* 双方向バインディング

# 勉強方法

公式のドキュメントから勉強するのを今回は挑戦してみる。

https://jp.vuejs.org/index.html

# vueの読み込む順番

Vueインスタンスを定義するファイルより先に読み込まないとエラーをはくのでrailsの場合、applicstion.jsに追記

```javascript:application.js
//= require rails-ujs
//= require turbolinks
//= require vue
//= require_tree .
```

# まずは事例で

## 変数を表示させたい時

なにか変数を定義してそれを表示させるという基本的な所から。

```html:index.html
<div id="app">
  {{ message }}
</div>
```

```javascript:vue.js
const app = new Vue({
  el: '#app',
  data: {
    message: 'hello'
  }
})

```

結果 hello

* vueは最初にvueオブジェクトを定義する
* vueオブジェクトは下記２つを設定
    * el:VueインスタンスがバインドするDOM要素の指定
    * data : Vueインスタンスが持つプロパティオブジェクト

## イベントで発火させて何かしたい時

```html:index.html
<div id="app">
  <button v-on:click="changeMsg">change message</button>
  <p>{{ message }}</p>
</div>
```

```javascript:例
const app = new Vue({
  el: '#app',
  data: {
    message: 'あばば'
  },
  methods: {
    changeMsg: function () {
      this.message = 'えばば'
    }
  }
})
```

vueではタグに

```
v-on:DOMイベント
```

とつけるとそのイベントのときに発火させられる。DOMイベントは下記のページに表が。

https://developer.mozilla.org/ja/docs/Web2/Reference/Events

またmethodsで関数をvueインスタンスに渡すことができます。上記でやっていることは

* elでappというVueインスタンスを指定
* 基本はdata内の処理を行う
* ただし、methodsでchangeMsgを定義
* htmlにv-on:clickでクリックした際にmethodsが発火するようにした

# 展開

変数を展開したいときは{{}}二重中括弧で囲む。vueで展開されたものはHTMLではなくプレーンなテキストとして扱われる。

```javascript:例
<span>Message: {{msg}}</span>
```

## htmlとして展開したい場合

```javascript:例
rwHtml == <span style="color:red">this should be red.</span>
<p>Using mustaches: {{ rawHtml }}</p>
<p>Using v-html directive: <span v-html="rawHtml"></span></p>
```

結果

Using mustaches:<span style="color:red">this should be red.</span>
Using mustaches:this should be red.

v-htmlプロパティでhtmlで出力できる。

# vueの記述方法

vueは大きく分けて下記二種類記述方法があり、基本的には下記の使い分けを個人的にはしている。

## render関数で記述

プログラミングぽいというか`<h2>`を何個生成してなどループ処理などプログラミングっぽい記述をしたいときに使う。可読性は低い。

## 単一ファイルコンポーネント

htmlをパーツで記述する。vueは基本この書き方のほうが可読性が高くていい感じ。

# コンポーネント

vue.jsではhtmlごとまとめることができてそれをコンポーネントと呼んでいる。

```javascript:javascript
var MyComponent = Vue.extend({
  // オプション...
})
// グローバルに my-component タグでコンポーネントを登録する
Vue.component('my-component', MyComponent)
new Vue({
el:'#example'
})
```

```html:html
<div id="example">
  <my-component></my-component>
</div>
```

# 気をつけたい細かいところ

## `@click`=v-on

v-onは`@click`と書くことができる

# 用語集

* ディレクティブ・・・vから始まるvue.js特有の属性
ヒットアンドブローをPythonで書いてみる

・Pythonの手始めに、ゲーム「ヒットアンドブロー」を書いてみる。
・対戦方式ではなく、コンピュータがランダムに生成する３桁の数値を当てるゲーム。
・３桁の数字を回答し、数字の位置と数値があっていればヒット。
・数字の位置は違うが、数値があっていればブロー。
・３ヒットになれば正解（クリアー）

```Python:HitAndBlow.py
import random
k = ["0","1","2","3","4","5","6","7","8","9"]
#print(k)
random.shuffle(k)
#print(k)
kotae = [k[0],k[1],k[2]]
#print(kotae)
hit = 0
count = 0
while hit != 3:
    count +=1
    q = input("? ")
    print(q[0]+q[1]+q[2])
    hit = 0
    blow = 0
    if(q[0] == k[0]):
        hit +=1
    if(q[1] == k[1]):
        hit +=1
    if(q[2] == k[2]):
        hit +=1
    print(str(hit)+" Hit")
    if(q[1] == k[0]):
        blow +=1
    if(q[2] == k[0]):
        blow +=1
    if(q[0] == k[1]):
        blow +=1
    if(q[2] == k[1]):
        blow +=1
    if(q[0] == k[2]):
        blow +=1
    if(q[1] == k[2]):
        blow +=1
    print(str(blow)+" Blow")
print('Clear! ' + str(count))

```

対話方式で、以下のように回答をする


```
============= RESTART: /Users/xxx/Desktop/Python1/HitAndBlow.py =============
? 345
345
0 Hit
1 Blow
? 678
678
0 Hit
1 Blow
? 129
129
1 Hit
0 Blow
? 156
156
0 Hit
1 Blow
? 527
527
3 Hit
0 Blow
Clear! 5
>>> 
```
ラズパイ　苦戦

file:///home/pi/%A5%C0%A5%A6%A5%F3%A5%ED%A1%BC%A5%C9/IMG_1801.JPG
↑自宅で飼育している動物をスマホで観察する目的で作成をしました。操作側のiphoneのページに操作ボタンが表示をさせる事が出来ませんでした。
どうすれば、操作が出来るか色々模索をしたいです。
Ergodox(qmk firmware)の同時押し/レイヤー切替の設定メモ

## はじめに

qmk firmwareのドキュメントの[Advanced Keycodes](https://docs.qmk.fm/#/feature_advanced_keycodes)で紹介されている設定周りのメモです。
自分で使用しているものだけ記載しています。気が向いたら他も追加していきます。

※執筆時のqmk firmwareのバージョンは0.6.172です。

## 前提
Tap=短押し
Hold=長押し
SFT_T(KC_A)=Tap時にa、Hold時にShift。Mod Tap keyと呼ばれる。
LT(layer1, KC_A)=Tap時にa、Hold時にlayer1に切替

`SFT_T`や`LT`などについては[ErgoDoxのキーマップをいじる時に見るチートシート](https://qiita.com/ReSTARTR/items/970354940f49c67fb9fd)がわかりやすいです。

## TAPPING_TERM

TapからHoldに切り替わるまでの押下時間(ms)。
デフォルト値は200。


## RETRO_TAPPING

TAPPING_TERMを経過しても、他のキーを押していなければTapとして扱われるようになる。
TAPPING_TERMが短くてTapのつもりがHold扱いになってしまう場合の対策になるが、好み次第。
https://docs.qmk.fm/#/feature_advanced_keycodes?id=retro-tapping

```
SFT_T(KC_A) Down
# TAPPING_TERM経過...
SFT_T(KC_A) Up

=> 何も入力されない # RETRO_TAPPING無効
=> aが入力される   # RETRO_TAPPING有効
```

## PERMISSIVE_HOLD

TAPPING_TERM経過前に他のキーを押すと、Holdとして扱われるようになる。
キーの同時押しが速いひとにおすすめ。
https://docs.qmk.fm/#/feature_advanced_keycodes?id=permissive-hold

```
SFT_T(KC_A) Down
# TAPPING_TERM経過前に
KC_X Down
KC_X Up
SFT_T(KC_A) Up

=> axが入力される # PERMISSIVE_HOLD無効
=> Xが入力される  # PERMISSIVE_HOLD有効
```

TAPPING_TERMを500以上に設定していると、自動的に有効になる。

## TAPPING_FORCE_HOLD

Mod Tap keyをTap後にすぐにHoldしたときに、Holdとして扱われるようになる。
https://docs.qmk.fm/#/feature_advanced_keycodes?id=tapping-force-hold

```
SFT_T(KC_A) Down
SFT_T(KC_A) Up   # => aが入力される
SFT_T(KC_A) Down
# TAPPING_TERM経過...
KC_X Down
KC_X UP
SFT_T(KC_A) Up

=> aaaaaaaaa...xが入力される(aの連続はキーリピートによるもの） # TAPPING_FORCE_HOLD無効
=> Xが入力される  # TAPPING_FORCE_HOLD有効
```

## IGNORE_MOD_TAP_INTERRUPT

Mod Tap keyと通常キーを連続して高速に押したとき、両方のキーをTapとして扱うようになる。
https://docs.qmk.fm/#/feature_advanced_keycodes?id=ignore-mod-tap-interrupt

```
SFT_T(KC_A) Down
KC_X Down
SFT_T(KC_A) Up
KC_X Up

=> Xが入力される # IGNORE_MOD_TAP_INTERRUPT無効
=> axが入力される  # IGNORE_MOD_TAP_INTERRUPT有効
```

※ 有効時でも両方のキーをTAPPING_TERM以上押し続けていると、Holdとして扱われる。
※ モディファイアキーのみに適用される。レイヤーキーには適用されない。

## 最後に
キーマップやconfigを公開してるので良かったら参考にしてください :smile:
https://github.com/uodna/qmk_firmware/tree/develop/keyboards/iris/keymaps/uodna-osx-ansi
正規表現　自分用メモ

##概要
自分がググったor使った正規表現をメモります

##文字

半角英数字等(a~z,A~Z,_,1~9)

```
\w
```

ひらがな

```
\p{InHiragana}
```


カタカナ

```
\p{InKatakana}
```

漢字（色々な書かれ方があるが、コレが完璧で全てを含む）


```
[\x{2E80}-\x{2FDF}々〇〻\x{3400}-\x{4DBF}\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}\x{20000}-\x{2FFFF}]
```

記号：!"#$%&'()*+,-./:;<=>?@[]^_`{

```
\p{Punct}
```


文字全体（半角英数字・ひらがな・カタカナ・漢字）

```
[\w\p{InHiragana}\p{InKatakana}\x{2E80}-\x{2FDF}々〇〻\x{3400}-\x{4DBF}\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}\x{20000}-\x{2FFFF}]
```


##Twitter
Twitter APIで取ってくるツイート本文の要素を取得

Twitterのハッシュタグ

```
(#[\w\p{InHiragana}\p{InKatakana}\x{2E80}-\x{2FDF}々〇〻\x{3400}-\x{4DBF}\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}\x{20000}-\x{2FFFF}]+)
```

リプに含まれるユーザー名

```
@[a-zA-Z0-9_\-.]{3,15}: 
```

RTとその時に含まれるユーザー名

```
RT @[a-zA-Z0-9_\-.]{3,15}: 
```

##その他
URL

```
(http|https)://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?
```
##最後に
適宜正規表現を使い次第更新していこうと思います。

##参考文献

基本的なことは全部ここに書いてある
（忘れっぽい人のための正規表現チートシート）
https://qiita.com/tossh/items/635aea9a529b9deb3038

(正規表現の基本)
https://qiita.com/sea_ship/items/7c8811b5cf37d700adc4

正規表現の組み合わせをまとめたチートシート
（よく使う正規表現はもうググりたくない！）
https://qiita.com/dongri/items/2a0a18e253eb5bf9edba

漢字について細かく書いてある
（Unicodeで「漢字」の正規表現）
http://tama-san.com/kanji-regex/
マルコフ連鎖をPythonで


マルコフ連鎖状態遷移の
http://web.tuat.ac.jp/~s-hotta/info/slide4.pdf
の天気の確率遷移をPythonで問題を説いてみる

```markovchain.py
import numpy as np
#晴の日の翌日が、晴になる確率は 0.6 曇りになる確率は 0.3 雨になる確率は 0.1
#曇の日の翌日が、晴になる確率は 0.3 曇りになる確率は 0.6 雨になる確率は 0.1
#雨の日の翌日が、晴になる確率は 0.2 曇りになる確率は 0.3 雨になる確率は 0.5
#これを行列で表すと
prob_matrix  =np.array(
[[0.6, 0.3, 0.1],
[0.3, 0.6, 0.1],
[0.2, 0.3, 0.5]])

#初期状態を、晴として、翌日の天気の確率分布を計算（10日後まで繰り返す）
state = np.array([1,0, 0])
for x in range(10):
    state = np.dot(state,prob_matrix)
    print('{0}日後'.format(x + 1))
    print state

```

出力結果

```
1日後
[ 0.6  0.3  0.1]
2日後
[ 0.47  0.39  0.14]
3日後
[ 0.427  0.417  0.156]
4日後
[ 0.4125  0.4251  0.1624]
5日後
[ 0.40751  0.42753  0.16496]
6日後
[ 0.405757  0.428259  0.165984]
7日後
[ 0.4051287  0.4284777  0.1663936]
8日後
[ 0.40489925  0.42854331  0.16655744]
9日後
[ 0.40481403  0.42856299  0.16662298]
10日後
[ 0.40478191  0.4285689   0.16664919]
```

ということで、途中から天気の分布は収束する。
PythonのJoblibによる並列計算について

###はじめに
事情があって、Random Forestに投げ込むデータセットで自然言語で書かれたDescriptionに特定の単語が入っているかいないかの、One-hotエンコーディングをした行列を作る必要があった。

ある単語が入っている/いない、で行列をつくっていくわけだから個々の単語ごとには依存関係はなく並列化が可能である。

###並列化
Pythonでマルチコア分散実行をするやり方はいくつかあるらしい。IPythonパラレルやParallelPython、Joblib、Multiprocessingなどだ。

そのなかでもJoblibがいいと聞きかじったのでJoblibで実装を行ってみた。

###Joblibの導入
Joblibを導入するのは簡単だ。といってもPythonのライブラリの導入はありがたいことにだいたい簡単だ。

```console
$ pip install joblib
```

あるいはanacondaで環境を整えているならば

```console
$ conda install joblib
```

とすればよい。これでもう使えるようになるはずだ。

Joblibを呼び出すにはこうすれば良い

```python
from joblib import Parallel, delayed
```

joblibは並列化可能なタスクを各コアに振っていってくれる。物理コア数以上の指定をしてもなんとかしてくれるらしい。joblibの使い方に関しては「[Joblibでお手軽計算処理](https://qiita.com/Yuhsak/items/1e8533343cf5458e2e08)」を参考にした。また、「[pythonのjoblibでコア数以上の並列が可能か確認する](http://blog.mwsoft.jp/article/176463849.html)」で物理コア数以上の並列化を確認してくださっている。

###使い方
使い方も簡単だ。importのおまじないを書いた後に

```python
def process(data):
    (Things to do)
    return (something)
```

といった感じでやりたい処理を記述する。引数dataにデータを投げ込んだら必要な処理をして返してくれる、みたいな関数にするとよいだろう。その上でjoblibを利用するには

```python
processed = Parallel(n_jobs=-1, verbose=3)([delayed(process)(data) for data in datas])
```

みたいに書けば良いらしい。Pythonらしくなくてやや気持ち悪い呪文じみたところがあるので解説していく。

まず

```python
Parallel(n_jobs=-1, verbose=3)
```

の部分であるが、引数n_jobsはタスクを何分割するかという指定をする部分だ。-1でコア数をマックスで使うように計らってくれる。引数verboseは途中経過を表示する頻度を指定する引数で0~10の値をとる。0ではなにも表示せず、10で最頻になる。

```python
([delayed(process)(data) for data in datas])
```

の部分は実は単なるリスト内包表記になっている。
datasからdataを取り出してマルチコア分散実行したものをリストにまとめてくれるよ、ということが書いてあるだけである。

ちなみにタプル内包表記でも辞書内包表記でもset内包表記でも問題ないし、実行させたい関数の引数が複数ならば

```python
([delayed(process)(data, argument1, argument2,...)])
```

とすれば良い。

###計算順序の話
ここまで来ればすぐ使えるのだが、ちょっと注意点がある。

実行されて帰ってきた結果は必ずしも、元データの順に並んでいないことがある。したがって、datasにdataが入ったリストを渡し、その順序を保ったリストが帰ってきて欲しい場合は何らかの対策が必要である。

個人的に思いついたのが、process側でタプルを返すようにし、後でソートするというやり方だ。つまり

```python
def process(data, i):
    (Things to do)
    return processed_data, i
```

のようにしておいてjoblibでは

```python
processed = Parallel(n_jobs=-1)([delayed(process)(data, i) for i,data in enumerate(datas)])
```

のようにすればParallelが返すものはリストの中に処理後のデータとインデックスをまとめたタプルが入っている、というものになる。このリストをインデックスに従ってソートすればよい。

```python
processed.sort(key=lambda x: x[1])
processed_data = [t[0] for t in processed]
```

とすれば元データの順番で処理されたデータ群が並ぶことになる。

###もっといい方法

募集中です。
AppServiceの送信IPアドレスの確認

# What for?

SQL DatabaseへのアクセスをIPアドレスで制限する際に、WebAppsの送信IPアドレスを確認したい

# 確認方法
## Azure portal

ポータルにログインし、App Service > LineBotApp(アプリ名) > 設定 > プロパティ の「送信IPアドレス」欄に記載されているIPアドレス

参考：http://cloudsteady.jp/faq/2271.html/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155206/d554c543-6d53-caaf-aa46-baf5e7d51024.png)


## nslookup
Raspberry Pi3 Model Bを購入してOSセットアップするまでの手順

Raspberry Pi3 Model B を購入し、OSセットアップした時の手順のメモが残っていたので記録しておきます。
（2016年のメモをPCの大掃除で発掘しました。古いです。）

# 前提
* SDカードへの書き込みはMac

# 起動する準備
* USB機器接続（マウス、キーボード）
* ディスプレイ接続（HDMIケーブル）
* microUSBケーブル、電源アダプタ接続  
  [電源アダプタはこちらを購入](http://www.amazon.co.jp/dp/B0156NEAJ2)

# OSをインストールする
1. [NOOBS](https://www.raspberrypi.org/downloads/noobs/)をダウンロード、zipファイルを展開
2. 展開したファイルをmicroSDHCカードにコピー
3. 本体に差し込み、電源ON
4. Raspbianを選んでインストール

NOOBSで入れたせいなのか、普通にGUIが立ち上がった

# 日本語設定
1. set locale
2. set keyboard
3. set timezone
5. その他
	* Expand Filesystem - ON（初期設定のまま）
	* パスワード変更
	* SSH - ON（初期設定のまま）

再起動後、文字化けしている！

1. localeをen.GBに戻す
2. Terminal起動しフォントインストール


```
sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfont-kaname
sudo apt-get install jfbterm
```

再起動


※ここでinstall error発生、ネットワークに繋がっていなかった
GUIの右上のネットワークアイコンをクリックしてWi−Fiに接続

```
sudo apt-get update
sudo apt-get upgrade
```

ひととおり設定が終わったら
Enable Boot to Desktop/Scratch
CLIに変更しておく

以後、SSH接続にて作業開始

ssh pi@192.168.x.x




# webcam motion

sudo apt-get install motion

vi /etc/motion/motion.conf
sudo vi /etc/motion/motion.conf

daemon off
target_dir /var/lib/motion
ffmpeg_output_movies off
stream_localhost off

sudo motion  -c /etc/motion/motion.conf

Webで見る
http://(raspberry piのIP):8081/

画像ファイル
sudo ls -lrt /var/lib/motion
JSONファイルを書き換える

# JSONファイルを書き換える

nodeは手軽に使えるので、今までシェルスクリプトでやってたようなツール系の処理を書くのに便利なのですが、意外と同じような処理を調べ直すことが多かったので、自分のメモ用に書いておきます。

## jsonファイルを書き換えるサンプル

jsonファイルとして、`config.default.json`ファイルが

```json
{
  "debug" : true
}
```

みたなものがあったとして、これをfalseに書き換えて、`config.json`として保存するコードは
次のようになる。

```js
var fs = require('fs');
var path = require('path');

var config = JSON.parse( 
  fs.readFileSync( 
    path.resolve( __dirname , "config.default.json" ) 
  ) 
);

var env = process.argv[2];

if (env == "release") {
  config.debug = false;
} else {
  config.debug = true;
}

fs.writeFileSync(
  path.resolve( __dirname , "config.json" ),
  JSON.stringify(config,null,'  '), 
  "utf-8"
);
```
このコードを`deploy_config.js`とすると、呼び出し方は

```
node deploy_config.js release
```

`debug`の値をtrueのままdeployしたい場合は

```
node deploy_config.js debug
```
とすればOK

JSON.stringifyと、readFileSync/writeFileSyncの使い方を毎回調べてるので、まとめました。

## ファイルのタイムスタンプを比較してコピー

ついでに、ファイルのタイムスタンプを調べて、新しければコピーするコード。
ただし、プレースフォルダで書き換えも行う

今、srcDirとdestDirがあるとして、srcDir内のテキストファイルで新しいものがあれば、destDirにコピーする

また、プレースフォルダで、テキスト内に`%%%ADMIN_MAIL%%%`、`###DEBUG_MODE%%%`があれば、それぞれadmin_mail、config.debugに変換する。

```js
fs.readdirSync(srcDir).forEach( file => {
  var srcFile = path.join(srcDir,file);
  var destFile = path.join(destDir,file);

  var srcStat = fs.statSync(srcFile);
  var srcMtime = srcStat.mtime;

  var destStat = fs.statSync(destFile);
  var destMtime = destStat.mtime;

  if (srcMtime.getTime() > destMtime.getTime()) {

    var text = fs.readFileSync(srcFile,'utf-8');

    text = text.replace('%%%ADMIN_MAIL%%%',admin_mail);
    text = text.replace('%%%DEBUG_MODE%%%',config.debug);

    fs.writeFileSync(destFile,text,'utf-8');

    console.log( "copy " + srcFile + " => " + destFile );
  } else {
    console.log( "skip " + srcFile + " => " + destFile );
  }
});
```

fs.statSyncで取得した更新日時(mtime)は、Dateオブジェクトなので、getTime()で
UNIXタイムスタンプを取得出来るので、それを比較している。
簡易WEBサーバ開始・停止toggleをAppleScriptで

# AppleScriptでsimpleHTTPServerの開始と停止をtoggleする

Finderで最前面のウインドウ（なければDesktop）を配信します。
クリップボードに"http://local〜" をコピーするので、対応バージョンのOSが揃っていればiPhoneですぐに見られます。
Photoshop CC（2018）でデバイスプレビュー機能が削除されたため作成。

terminal-notifierを使っていますが、無ければdisplay alertに置き換えて。
（terminal-notifierはbrewで）



```applescript
tell application "Finder"
	set myScript to "python -m SimpleHTTPServer 8888" as Unicode text
	set pid to (do shell script "ps ax | grep " & (quoted form of myScript & "$") & " | grep -v grep | awk '{print $1}'")
	if pid is "" then
		set myDir to POSIX path of (insertion location as alias)
		do shell script "(cd " & myDir & " && " & myScript & ") &>/dev/null &"
		set the clipboard to "http://" & IPv4 address of (get system info) & ":8888/"
		do shell script "/usr/local/bin/terminal-notifier -title 'PythonWEBサーバ' -message '" & myDir & "でWEBサーバを開始しました。アドレスをクリップボードにコピーしました。'"
	else
		do shell script "kill " & pid
		do shell script "/usr/local/bin/terminal-notifier -title 'PythonWEBサーバ' -message 'WEBサーバを停止しました。'"
	end if
end tell
```
JSONで受け取った数値のフィルタリング（NSPredicate）でハマった話

## やりたかったこと


ある関数にいくつかidのセット（id1,id2）を渡す。渡したもののうち、
下記のNSDictionayの配列に含まれる要素に一致したものを取り出したい。

- フィルタ用のデータ構造

これはAPIからJSONで取得され、NSDictionaryのNSArrayで格納している。

```objc
   (
    {
        id1 = 4744139161607189037;
        id2 = 288;
    },
        {
        id1 = 4744139163368868020;
        id2 = 288;
    }
   )
```
- サンプル関数 ※上記のNSArrayはdataという変数で表現

```.objc
+(BOOL) sampleFunc:(NSString*) id1 id2:(NSString*) id2 {
    NSString *query = [NSString stringWithFormat:@"id1 == %@ && id2 == %@", id1, id2]; //クエリ作成
    NSPredicate *predicate = [NSPredicate predicateWithFormat:query]; //クエリをNSPredicateにする
    NSArray *matched = [data filteredArrayUsingPredicate:predicate]; //predicateでフィルタリング
    NSLog(@"%@",matched);
}

```

## ハマり具合

- 実際に関数に渡していた引数のリスト（処理的には、リスト分だけ関数を呼んでいる）

```
4744139161607189037, 288
4744139163368868024, 288
4744139163368868020, 288
```

このとき、一致しないはずの`4744139163368868024`,`288`が一致扱いになっていた。

ここでデバッガで`po data`とかしてdataの中身を確認してみると..

```objc

(
        {
        id1 = "4.74413916160719e+18";
        id2 = 288;
    },
        {
        id1 = "4.744139163368868e+18";
        id2 = 288;
    }
)
```

あっ！丸められている！！
それで`4744139163368868024`も`4744139163368868020`も
同じ数字扱いになっていたのですね。

JSONで受け取っている関係で、[2^53-1(2の53乗-1)以上の数字は丸められてしまいます。](http://progmemo.wp.xdomain.jp/archives/982)
なので、API側でid1の方は文字列として返さないといけないようです。これで勝てる！！

・・・

大丈夫じゃなかった。こんどは何も一致しない。

またAPIから受け取ったフィルタ用データを見てみる。

```
(
        {
        id1 = 4744139161607189037;
        id2 = 288;
    },
        {
        id1 = 4744139163368868020;
        id2 = 288;
    }
)
```

ちゃんと文字列になっている。じゃあフィルタ条件がおかしい？

```.objc
+(BOOL) sampleFunc:(NSString*) id1 id2:(NSString*) id2 {
    NSString *query = [NSString stringWithFormat:@"id1 == %@ && id2 == %@", id1, id2];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:query];
    NSArray *matched = [data filteredArrayUsingPredicate:predicate]; //dataは上記のNSArray
    NSLog(@"%@",matched);
}

```

うーむ。。あっ！


文字列にしたんだからこうじゃなくて

```objc
NSString *query = [NSString stringWithFormat:@"id1 == %@ && id2 == %@", id1, id2];
```

こうですね

```objc
NSString *query = [NSString stringWithFormat:@"id1 like \"%@\" && id2 == %@", id1, id2];
```

ちなみに比較演算子をlikeにしただけだと
`'Can't create a regex expression from object 〜.'`
とかいわれて怒られるので、プレースホルダ前後のダブルクォートは必須です。（これ気付くのも時間かかったorz）

おつかれさまでした
PythonとRの対照表(書きかけ)

##データ読み込み

だいたい同じ. Rでのデータ読み込みはreadrパッケージを使った方が速い。
readrパッケージでファイル名だけを突っ込むと、下みたいな警告が出る。
Parsed with column specification:
理由はよくわからないけど、自分はcol_types = cols()を入れたら警告がなくなった。

```
#Python
df = pd.read_csv("datapath.csv")

#R
df <- read.csv("datapath.csv")
df <- read_csv("datapath.csv",col_types = cols())  #readrパッケージ
```


##要約
Pythonはdescribe() 
Rはsummary()

```
#Python
df.describe()

#R
summary(df)
```

##作図
PythonにおけるmatplotlibのレイアウトをRのggplot風にできる。

```
#Python
plt.style.use(ggplot)
```
cron初心者のチートシート

環境
mac High Sierra 10.13
ubuntu 

1.cronが起動しているかのチェック 
実行中のプロセスを表示 - ps aux | grep cron (ps aux || grep cronはps auxと同じ)


2.ログの確認
ubuntuは - var/log/syslogで見つけます。
CentOSのコマンドは/var/log/cron/

以下のページを参考にしました。
crontabの使い方
http://saba.omnioo.com/note/1233/crontab%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/

ログの確認　(Ubuntu)cronのログ
http://80286.blog62.fc2.com/blog-entry-83.html

ubuntu14.04 cronログ出力設定
https://qiita.com/skyfish20ch/items/46db70e1ff88166ead87
Djangoで"Hello World"を表示するまで①

Djangoのチュートリアルを周回しているので、アウトプットを兼ねてノートを残す。
前提としてMacOSとAnacondaを使っている。
Djangoの環境設定に関しては<https://qiita.com/TsubasaTakagi/items/97aa3bb9025d4a801283>を見てくれるとよい。

# プロジェクトの作成

Djangoでは、インスタグラムのようなサイト全体を”プロジェクト”という。そしてその中の様々な機能、たとえば写真投稿機能やいいね機能を”アプリケーション”という。

それではまず、大枠となるプロジェクトの作成をしていく。

ターミナルを開いて

```
source activate py36
```
と打ち込んで仮想環境を立ち上げる。
py36の部分は各々の仮想環境名を打ち込んで実行すること。

立ち上がったら

```
django-admin startproject プロジェクト名
```

と打ち込むとプロジェクトが作成される。

今回は、

```
django-admin startproject myblogapp
```
として実行して行く。
これを打つと、myblogappというディレクトリが作成される。

ディレクトリの中身をのぞいて見ると、

<img width="361" alt="スクリーンショット 2017-12-30 11.03.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/188108/3d7072e5-99ed-2172-a80a-6878d84e34fb.png">

いろんなファイルが自動でつくられていることが確認できる。

各ファイルについて軽く説明して行くと、

* manage.py:設定を読み込む命令を書いている
* __init__.py:pythonのパッケージ
* setting.py:言語 設定やアクセス制御などの設定が書かれている
* url.py:applicationをどういうurlで呼ぶかのパターンを定義している
* wsgi.py:他のwebサーバとDjangoを連携する(web server gateway interfaceの略)

ファイルの説明に関しては、今後コードを書いて行く上で理解していけばよい。

# サーバーを立ち上げる

　仮想環境を立ち上げた上で

```
python manage.py runserver
```

と打ち込んであげると、サーバーが立ち上がる。

<img width="1135" alt="スクリーンショット 2017-12-30 11.18.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/188108/edb0f913-7fe6-d418-6ba9-b575cfc3728b.png">

画像のように、サーバーが立ち上がったら<http://127.0.0.1:8000/>にアクセスしてみると、

<img width="1440" alt="スクリーンショット 2017-12-30 11.21.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/188108/10c43dac-0bee-d6a4-348c-517be4805f78.png">

サーバーが立ち上がっているのが確認できる。

※サーバーを止めたいときにはCtrl+C

# プロジェクトの初期設定

初期設定を行なっていきたいが、MTVについて理解していない方に関しては呪文のように聞こえる部分もあるかもしれない。その場合は、「いまは初期設定をしているんだなぁ」程度に読み流してもらってよい。

まず、初期設定として、プロジェクトの言語を日本語に、タイムゾーンを日本時間に合わせる。

```setting.py
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
```

の部分を

```setting.py
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
```

と書き換えてあげると、

<img width="1440" alt="スクリーンショット 2017-12-30 11.29.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/188108/19b4c25b-f4f9-49ef-2998-16e5a6b1c8e3.png">

先ほど英語だったのが、日本語に変わっていることが確認できる。

次に、データベースの統合、移行を行なっていく。意味わからない方は、設定ファイルを反映させると考えてもらってよい。

```
python manage.py migrate
```
とターミナルに打ち込むと、データベースのテーブルが作成される。

# アプリケーションの追加

```
python manage.py startapp アプリケーション名
```
とターミナルに打つとアプリケーションが追加される。
アプリケーション名の部分は複数形が望ましい。

今回は

```
python manage.py startapp posts
```
として実行する。

すると、

<img width="361" alt="スクリーンショット 2017-12-30 11.43.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/188108/230f7ecc-8b0b-0115-a0c7-6c6b264cc374.png">

といったように、新たにpostsディレクトリがつくられ、その中に様々なファイルが自動生成されているのが確認できる。

新しく追加されたディレクトリと各ファイルについて簡単に記す。

* migrations:データベースのテーブルを管理する設定ディレクトリ
* views.py:ページをどう整形するかを記す
* models.py:データベースとwebページを連携するための設定ファイル
* apps.py:変数定義や命令を書く

これも先ほどのプロジェクトと同様、コードを書くうちに理解していけばよい。

…今回はここまでとし、次回からは実際にファイルにコードを書き加えて行く。
ベアメタルD言語くん

炎上プロジェクトの合間で苦節１ヶ月、ようやくここまで漕ぎ着けました……。

![rpi_baremetal_d.jpg](https://qiita-image-store.s3.amazonaws.com/0/3735/bcb7fb0c-a4ad-7467-73c4-ae26eb3c2489.jpeg)
TextView の CompoundDrawable に ColorFilter をかける

# 概要
Android の TextView に設定できる CompoundDrawable に ColorFilter をかけるやり方について述べます。

## CompoundDrawable
TextView は CompoundDrawable という、テキストに隣接して表示させる画像を設定できます。

```xml
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/ic_drawable_white"
    />
```

これを用いると、ImageView と TextView を組み合わせる必要がなくなるのでレイアウト構成をシンプルにできます。表示させる位置はテキストの上下左右です。上記の例だと drawableLeft なので、テキストの左側に Drawable が表示されます。

## ColorFilter をかける動機
私が作っているアプリで、ユーザにアプリ内View の色を自由に設定させる機能を入れていて、
ImageView を使っている箇所では白の Drawable を用意しそれに ColorFilter をかけるやり方でユーザの色設定を反映させる実装にしていました。

しかし、 CompoundDrawable の場合は ColorFilter をやり方を知らなかったので、Drawable の色がずっと白のままでした。

![device-2017-12-22-210239.png](https://qiita-image-store.s3.amazonaws.com/0/102004/743c9e76-f266-48ea-56cb-07fcd41b8527.png)


----

# 実装

## 実装方法
調べてみたらすぐにやり方が見つかりました。

[Setting the Color of a TextView Drawable for Android](https://kylewbanks.com/blog/Setting-the-Color-of-a-TextView-Drawable-for-Android)

## 実装
記事のコードそのままでは芸がないので、別の書き方をしてみます。 Kotlin だと短く書けます。

```kotlin
textView.compoundDrawables?.forEach {
    it?.colorFilter = PorterDuffColorFilter(fontColor, PorterDuff.Mode.SRC_IN)
}
```

## 実装後

![device-2017-12-22-210037.png](https://qiita-image-store.s3.amazonaws.com/0/102004/1e481972-b9d4-bffc-37b9-f0d3bf6af145.png)

ご覧の通り、CompoundDrawable に ColorFilter がかかりました。

## 補足
ViewStub 内の TextView に対しては上手くいかなかったので、 `TextViewCompat.setCompoundDrawableTintList` を使った方が良いですね。

```kotlin
textView?.also {
    it.setTextColor(fontColor)
    TextViewCompat.setCompoundDrawableTintList(it, ColorStateList.valueOf(fontColor))
}
```

----

# まとめ
CompoundDrawable に ColorFilter をかけたい場合、TextView の compoundDrawables からそれぞれの Drawable オブジェクトに実施すれば可能です。TextView を継承している Button 等でも同様に適用できます。
今どきのページング

## ページングって？

Webサイトの一覧画面って大概ページングする。

ページングとは、まさに、複数行を1画面に表示して、次のページにまた複数行を表示するようインターフェースのこと。

UIとして、画面を移動したり、画面下部に継ぎ足されたりとかいろんなパターンはあるが、そこは重要ではなく、データ構造としてどう取り出すかというのがポイント。

## 古くから有る例「limit」

SQLにはlimit句がある

```sql
select * from users order by id limit 20,10;
```

この例では、「21番め移行を10件とってきなさいよ」って命令になる。

10件ずつとってくるのは、一気に10万件とかとってきちゃうと画面のデータがいっぱいになっちゃうから。かならず上限は決める。

Webの一覧画面では、レコード数ではなく「1ページあたりの件数を決めて」「何ページ目からのスターとか」ってことで、UIをつくる。ECサイトの大半はそういう作り。

![SS 2017-06-27 12.59.01.png](https://qiita-image-store.s3.amazonaws.com/0/53489/9e9a1f81-da3c-a0f5-4533-5a839a5cee2b.png)

URLのクエリストリングに`p=2`とか`page=2` とかついてるから、いきなり`p=10`とかってやれば、いきなり後ろの方のデータを取得できる。

## 今風のページングは、max_id を取得

limitを使ったページングは、これはこれで、教科書どおりなんだけど、offsetって後ろの方のページになると遅いんですね。じゃぁってことで、イマドキはmax_idをつかう。max_idってのはSQLの用語ではなく、「そのページにある最大のidを覚えておいてそれより小さな件数を取得する」ということ。

Twitterなんかがまさにそうで、そのページのTweetの最大をとっておいて、それより小さなTweetIDを取得するようにしている。

RubyのActiveRecordも、バッチ処理で複数レコードを処理するときには、以下のように、処理したIDの最大を勝手に覚えてくれるので、メモリがあふれることなく、次々と処理をしてくれる。

```sql
 SELECT  `users`.* FROM `users` WHERE (`users`.`id` > 1001)  ORDER BY `users`.`id` ASC LIMIT 1000
```

## max_idでページングするデメリット

### 並び順の種類が2個になっちゃう

「このid以前（以降）何件頂戴」はDBに対してはすごく速いんだけど、並び順が制御できない（idの昇順か降順）。SNSは、新着順が殆どなので、増えていくタイプのIDだと、IDの降順でだいたいこと足りる。だけどSNSのとかだと、必ずしも新着順じゃなくて、オススメ順だとかレビュー数順とかになる。

その場合は、並び順で制御するのではなく、抽出条件として「★3つ以上」とかのUIにするとかで回避。

### ランダムなIDは使いづらい

そもそも、IDがオートナンバーで増えつづける方式もそれはそれで古い。オートナンバー方式だとDBが分残しにくいので、UUID的なランダムな文字列を主キーにするというスタイルも出てきている。その場合は時刻で並ばない。そんなわけで、「分散しやすいランダム文字列だけど並び順は時系列」というスタイルの主キーをつかうのがSNSでは多い。

## まとめ

SNSなんかは、自由に並び替えたいというニーズよりも、「情報の鮮度」「情報の量」「レスポンスの速さ」が大事なので、絶対max_idの方がいい。
ADDA > runtime argument > -shape bisphere <R_cc/d> | 位置情報の可視化 | 2つの球が接触状態になるbisphereパラメータ

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
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)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

関連: [Superposition T-matrix codes > bisphere.f > 2つの球の光散乱計算コード (analytical orientation averaging)](https://qiita.com/7of9/items/ec01ff3b1f8eeddd6923)

ADDA側でbisphereの計算を実行しようとしているが、実行引数について不明な点が出ている。

@ [manual.pdf](https://github.com/adda-team/adda/blob/master/doc/manual.pdf)のpage 15
> bisphere - two identical spheres with outer diameter d and center-to-center distance R cc
(along the z-axis). It describes both separate and sintered spheres.

実行時ヘルプを見てみると

```bash
$ ./adda -shape bisphere
ERROR: Illegal number of arguments (0) to '-shape bisphere' option (1 expected)
Usage: -shape bisphere <R_cc/d> 
Type 'adda -h shape bisphere' for details
```

`<R_cc/d>`に指定する値により、２つの球の位置情報が変化する。
接触状態にするには0.5だろうか。

## 位置情報の可視化

[Jupyter | Matplotlib > 凹凸の激しい形状の可視化 > v0.4, v0.5: ADDA InitField-Yファイル読込み > Sphere | Prism (N=3) | Chevyshev particles](https://qiita.com/7of9/items/32480e2431af914c335b)
で実装したコードを用いて接触状態かどうかの確認をする。

### InitField-Yの生成

ADDAの実行時引数「-store_int_field」を指定することで、`IntField-Y`を作る。

```bash
$ ./adda -shape bisphere 0.5 -store_int_field
...
$ ls run22099_bisphere_g16_m1.5/
CrossSec-Y  IntField-Y  log  mueller
```

上記のリンク先のコード: showChebyshev_170910.ipynbを実行する。
描画までに30秒程度かかる。

### 結果

```
$./adda -shape bisphere 0.5 -store_int_field
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f129e146-857e-d93d-fc74-9b5cbee250b4.png)


```
$./adda -shape bisphere 1.0 -store_int_field 
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3720c1d9-0cb4-95b4-35c4-0b416df7c9be.png)

### 2つの球が接触状態になるbisphereパラメータ

上記の画像より、以下のパラメータにすることで２つの球が接触状態になることが分かった。

```
$./adda -shape bisphere 1.0
```

### Possible correction to the manual.pdf page 15

> bisphere - two identical spheres with **outer diameter** d and center-to-center distance Rcc
(along the z-axis). It describes both separate and sintered spheres.

shall better be: 

"bisphere - two identical spheres with **composing sphere diameter** d and center-to-center distance Rcc
(along the z-axis). It describes both separate and sintered spheres."
迷路を作るアルゴリズムを実装する

暇だったので迷路を作るアルゴリズムを実装してみた。

## アルゴリズムの概要
以下のような表を用意して、隣り合う2つのマスを選択する。(例えば2と8のマス)
<img alt="maze_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/196110/6d58d6ac-aeb2-0313-fcd3-891fe98cd3cf.png">
壁を壊して、小さいほうの値で更新する。
<img alt="maze_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/196110/2823a838-d201-552f-a7b8-ee54b5cf7130.png">
同様に3と4のマスを選択すると以下のようになる。
<img alt="maze_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/196110/30de92d8-9712-598d-9904-cfd43aa24c1a.png">
さらに2と3のマスを選択する。
<img alt="maze_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/196110/87a29e7f-730e-6a56-bdbe-5729bcdd518e.png">
この操作をすべてのマスが0になるまで繰り返す。

## 実装
適当な実装は以下。

```python
import random
import numpy as np
from itertools import product

news = ['n', 'e', 'w', 's']
SPACE = '　'
WALL = '■'
START = 'Ｓ'
GOAL = 'Ｇ'


def print_maze(maze):
    """
    迷路を出力
    """
    with open('maze.txt', 'w') as f:
        for row in maze:
            f.write(''.join(row) + '\n')


# 迷路のサイズを指定
m, n = 30, 50

memo = np.array([i for i in range(n * m)])
memo = memo.reshape(m, n)

# 迷路を初期化
maze = [[SPACE for _ in range(2 * n + 1)] for _ in range(2 * m + 1)]
maze[1][1] = START
maze[2 * m - 1][2 * n - 1] = GOAL
for i, j in product(range(2 * m + 1), range(2 * n + 1)):
    if i % 2 == 0 or j % 2 == 0:
        maze[i][j] = WALL

while (memo != 0).any():
    x1 = random.choice(range(m))
    y1 = random.choice(range(n))
    direction = random.choice(news)

    if direction == 'e':
        x2, y2 = x1, y1 + 1
    elif direction == 'w':
        x2, y2 = x1, y1 - 1
    elif direction == 'n':
        x2, y2 = x1 - 1, y1
    elif direction == 's':
        x2, y2 = x1 + 1, y1

    # 範囲外の場合はcontinue
    if (x2 < 0) or (x2 >= m) or (y2 < 0) or (y2 >= n):
        continue

    if memo[x1, y1] != memo[x2, y2]:
        tmp_min = min(memo[x1, y1], memo[x2, y2])
        tmp_max = max(memo[x1, y1], memo[x2, y2])

        # メモの更新
        memo[memo == tmp_max] = tmp_min

        # 壁を壊す
        maze[x1 + x2 + 1][y1 + y2 + 1] = SPACE

print_maze(maze)
```
プログラマとして働くために指摘されて改善してきたこと

年末だしポエムチックな記事でも書こうと思う。

# 指摘されたこと

普段何を考えながらコードを書いてるのか質問された。

僕の書いたコードで幸せになる人が生まれるように書いていると答えた。

すると、開発者も幸せになるように書けと言われた。
なんのことか理解できなかったが働き方を変えろって話だった。

それまでの僕は下記のような良くない癖があった。

- すべてを書き上げてから確認する
- 複雑になってしまった関数を切り出さない
- コードリーディングの時間が少ない

# すべてを書き上げてから確認する

一つの処理を書いたら確認するべきである。
当時の僕はいけると謎の自信を持って複数の処理を書き上げてから確認していました。

## 改善

単体テストをしっかり書いて行きましょう。
最善はTDDで開発することでしょう。(すべてにおいて良いという話ではないですが、仕様の整理ができます。)

すべてを書き上げてから確認するのは仕様を理解していないことが多いのです。
自分のやっていることを理解しながら書くと手戻りもすくなく、やっていることに自信を持って働けて幸せになります。

# 複雑になってしまった関数を切り出さない

複雑になってしまった関数というのは誰も理解できないし、やばいサインなのでそうならないようにするべきである。
数年運用されてきたサービスにはかなりの確率で複数の人が関わっていて、いろいろな意思が込められている。

例えば

- 0→1でものを作っているので速度が最優先である
- 何も考えず場当たり的な対応をした
- hotfixだからとりあえず動くことを確認して最短でリカバリした

このような場合往々にしてコピペされたコードが生まれたり、関数を切り出さずにいろいろな箇所に同じような処理が散りばめられたりする。
0→1を作れるプログラマは、それはそれでいい価値を持っているので良いと思っているが、
当時の僕がアサインされたのは運用のタイミングで何も考えずに真似した。

## 改善

コードレビューを行ってもらって「ああ、これはよくないんだ」と気づかせてもらう。
リーダブルコードを何度か読む。

現状がこうなっているから僕も真似をするという思考停止は良くなかった。
関数がシンプルになると自分のやっていることが理解できます。すると自信を持って働けて幸せになります。

# コードリーディングの時間が少ない

コードを読む時間が少ないのが悪いというわけではないんです。
ライブラリやフレームワークの挙動をブラックボックスのまま使うと単純にハマり続けるってことです。

## 改善

気合です。やることはシンプルで、READMEを読むとかコードを読むとかそういった話です。

何をやっているのか、自分の書いたコードで何が起きるのかが明確になり自信を持って働けて幸せになります。


# まとめ

何が言いたかったかというと、自分のやっていることに自信を持って働けると幸せになりますってこと。
改善したい問題があって、改善したい問題が何なのかを意識して一つ一つの作業の意味を理解しながら働いていこう。
S3のsinged url を使えば、zipパスワード後送なんて要らん

メールにzipファイルを添付して、そのzipパスワードを別メールで後送するなんてシーンがよくありますね。あれ面倒な上に結局は添付ファイルもパスワードも両方間違った宛先に送ったらアウトです。

なので、メールん添付なんてやめて、S3の署名付きURL（ signed url ）をつかって、期間限定URLを送って差し上げましょう。

## 手順

いきなり手順です。Mac上のbashで実行しています。
aws cli がインストールされていることが前提です。

```bash
# アクセスキーと秘密キーとリージョンを環境変数にセット
export AWS_ACCESS_KEY_ID=xxx
export AWS_SECRET_ACCESS_KEY=xxx
export AWS_DEFAULT_REGION=ap-northeast-1

# アップロードしたいバケットとディレクトリがあるかどうか確認
aws s3 ls s3://bucketname/directoryname/

# ローカルファイルをアップロード
aws s3 cp filename s3://bucketname/directoryname/

# 一週間の署名をつける（標準出力に署名付きURLが表示されるので手動でコピー） 
aws s3 presign  --expires-in 604800 s3://bucketname/directoryname/filename

```

以上をペースト用の雛形としておいて、`filename` の部分だけを差し替えてターミナルで実行すれば、OK。あとは署名付きURLをメール本文にペーストです。

上記はbashの例なので、Windowsの場合は、環境変数のセットをWindows用に直してください。


## 署名付きURLのメリット

### 間違った宛先に送っても開封するまでに対応が可能

間違った宛先に送ったあとでも、S3上のファイルを削除すれば、相手は見れません。
（即DLされるとアウトですが）

### 期間が限定されているのがセキュア

上記は一週間の期間限定URLです。WebサーバにおいてBASIC認証で共有なんて手段に比べると、自動的に非公開になるという安心感はたまりません。

### S3 という公認のセキュアなストレージ

本件にかぎらず、AWSをつかうと、大事な情報はS3に保持されます。AWSをセキュアな用途に使い始めているならS3は大事なデータをおいていい場所という扱いになるでしょう。

## 別解 CyberDuckをつかう

FTPクライアントとして有名なCyberDuckですが、S3クライアントとしても使えます。署名付きURLもファイルの右クリックから作れるので、上記の目的は達成できます。ただしUIの反応が遅く作業ミスに繋がりそうで、上記のコマンドライン上での作業で業務を行っています。

## 今後の展開

Windowsユーザー向けに、batファイルにして、ファイルをドラッグ＆ドロップするだけで、やりとりできるというのもあり。
モブプロ思想で仕事してみた

[@maruyamahiakru](https://twitter.com/maruyamahiakru)さんご主催の[Mob Programming Val #5 DeepLensをみんなで触ってみよう！](https://val-labo.connpass.com/event/73703/)に先日参加させて頂きました！

初めて触れたモブプログラミングがとても新鮮で学びの多いものでしたので、社内でもコソっと取り入れみた内容をまとめます

#〇今日の内容
1.モブプログラミングとは
2.社内でやった事
3.結果(というよりも感想に近いです)
4.一番良かった事

#1.モブプログラミングとは

[モブプロって楽しい！](http://hiiiiiiihikaru.hatenadiary.com/entry/2017/04/14/180333)に実例と共にとても分かりやすく、説明されています。一部を引用させて頂きますと、、、

*モブ=群衆*

*つまり、複数人で、*

*同じ時間*
*同じ場所で*
*同じPCを使って*
*同じ課題に取り組む*

*開発手法だそうです。*

*1人がコードを記述するドライバーの役割を持ち、その他の人はドライバーにアドバイスを送るナビゲーターの役割を持ちます。 ドライバーは何分かおきにナビゲーターとバトンタッチして、全員にドライバーを体験させます。*

[Mob Programming Val #5 DeepLensをみんなで触ってみよう！](https://val-labo.connpass.com/event/73703/)では、[@maruyamahiakru](https://twitter.com/maruyamahiakru)さんが[Re:invent](https://reinvent.awsevents.com/)から持ち替えられた貴重な[AWS DeepLens](https://aws.amazon.com/jp/deeplens/)に約10人ほどで、一つのテーブルに集まり、スクリーンを共有して、チャレンジしてみました。

[@tseigo](https://qiita.com/tseigo)さんが[Mob Programming Val 5 に参加してみたメモ](https://www.1ft-seabass.jp/memo/2017/12/21/mob-programming-val-5-resume/)に紹介くださっています。写真やスライドや、さすがです！！（自分も撮るべきでした、、、、汗）

実際にハンズオン的な進め方をする場合は[repl.it](https://repl.it/)といったツールを使い、代わる代わるコーディングをしていくようです。

#2.社内でやった事

*複数人で、*
*同じ場所で、*
*同じ課題に取り組む、*
*開発手法*

「モブプログラミング、すごいなあ、、、」
「けれども部署で一番下っ端な僕から提案するのは難しいなあ、、、」

と感じた私は、以下ルールを自分の仕事に取り入れてみて、
少しモブプロっぽい働き方をしてみました。

**①周りからため息か独り言が聞こえたら、知らない振りせず話しかけに行く**
**②自分が煮詰まったら、だいたい30分くらいで周りにアドバイスを求める**

#3.結果(というよりも感想に近いです)

####①周りからため息か独り言が聞こえたら、話しかけに行く　をした結果

同僚たちとの関係が良くなる事はもちろんですが、意図したわけではなく**自分の知識が増す**。結果になりました。

こんな問題で苦しんでいました、、、

**・倉庫現場のプリンターが3回目の出力で必ず落ちる**
[HttpWebRequest を連続して呼び出すと３回目以降エラーになる事象](http://blog.goo.ne.jp/takawaguchi/e/f6a589ee8e8c79355d66e38dbedbd87f)がある
⇒それ用にコードを書き換える必要がある

**・Bluetooth同期したデバイスとAndroidが、時間が経つと外れる**
一部のスマホはメモリ消費を抑える為、バックグラウンドで起動するアプリを制限する機能がデフォで入っている。LINE通知がこなくなったり、目覚ましがならなくなったり、、、、
⇒オフにできない機能らしいので、別機種のスマホに買い替える

どれも私の仕事領域ではないかった為、勉強になりました。

####②自分が煮詰まったら、だいたい30分くらいで周りにアドバイスを求める　をした結果

**開発がとても効率的になった**(主観です)。自分の見積もりでは半日かかる内容が、相談すると実は1時間で終わったりですとか、、、、汗

#4.一番良かった事

**プロジェクト内情報のキャッチアップが爆速で早くなった**

これが最も良かった事でした。

私の関わっているプロジェクトは、開発者5人,導入支援3人の合計8人です。PC画面を作る人、スマホ画面を作る人、DB周りを見ている人、客先で導入支援する人。

プロジェクト内の情報は全て[backLog](https://www.backlog.jp/)でアップデートされるのですが、毎日50件,100件とやり取りがあるとキャッチアップが間に合いません。どれから見ればいいか分かりません。コメント読んでも理解できません、しかし、じっくり読む時間はないです、、、

しかし、上記①②を行っていると(特に①ですね)！

**誰かが悩んでいる＝後回し出来ない優先度高い事＝プロジェクト全体に影響がある事＝知っておかなければならない事**

と、自然にプロジェクトの現状が見渡せるようになりました。

これはとても凄い発見でした、モブプロ的働き方、とても有益です！！

ちなみに、、、、、弊害と言いますか、仕方のない事と言いますか、周りの面倒事に触れるので、自分に火の粉がかかる事もあります。

私の場合、倉庫現場へ行ってプリンターを再設定するタスクが私に降ってきました、、、、そういう事もありますよね！汗

しかし繰り返しますが、モブプロ的働き方はとても有益です！！
ADDA > runtime argument > -eq_rad <arg> > Sets volume-equivalent radius of the particle in um 

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
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)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

This articles shows the runtime arguement of ADDA in terms of the radius of the particle.

@ [manual.pdf](https://github.com/adda-team/adda/blob/master/doc/manual.pdf) page 52

> -eq_rad
Sets volume-equivalent radius of the particle in μm (§6.2), float. If default wavelength is
used, this option specifies the volume-equivalent size parameter. Cannot be used
together with -size . Size is defined by some shapes themselves, then this option can be
used to override the internal specification and scale the shape.
Default: determined by the value of –size or by -grid , -dpl , and –lambda .

### Example

```bash
$ ./adda -shape bisphere 1.0 -m 1.5 0.005 -eq_rad 5
```

```bash
$ head -n 12 run22090_bisphere_g20_m1.5/log 
Generated by ADDA v.1.3b6
command: './adda -shape bisphere 1.0 -m 1.5 0.005 -eq_rad 5 '
lambda: 6.283185307
shape: bisphere; diameter(d):7.93700526, center-center distance R_cc/d=1
box dimensions: 20x20x40
refractive index: 1.5+0.005i
Dipoles/lambda: 15.8769
        (Volume correction used)
Required relative residual norm: 1e-05
Total number of occupied dipoles: 8448
Volume-equivalent size parameter: 5
```
Visual Studio Code の画面のちらつきを解消する

Ubuntu にインストールした VS Code で、ステータスバーなどがちらつく現象が起こったので、その解決方法を調べました。

調べると、VS Code のイシューに関連する投稿がありました。
https://github.com/Microsoft/vscode/issues/30703

オプション ``--disable-gpu`` というオプションが回避策となるようです。実際、筆者の環境ではこの方法で解決しました。

```
$ code --disable-gpu
```

ファイルやフォルダを指定して開く場合は、``--disable-gpu`` オプションはそれより後に指定する必要があるようです。（そうでないとうまく動きませんでした。）

```
$ code foo --disable-gpu
```

Ubuntu のランチャに登録されている VS Code にも同様のオプションを指定するには、``/usr/share/applications/code.desktop`` をエディタで開き、``Exec`` プロパティを適当に編集します。

```
$ vi /usr/share/applications/code.desktop
```
Anacondaを使ってDjangoの環境設定をする

前提としてMacOSを使っている。

まずは<https://www.anaconda.com/download/#macos>にアクセスして、Python3.6というのをクリックしてAnacondaをダウンロードしてくる。

そして、ターミナルを立ち上げて仮想環境をつくる。以下のコマンドで作成される。

```
conda create -n 仮想環境名
```

今回は

```
conda create -n py36
```

という仮想環境を作ることにする。

```
conda info -e
```
で、作成した仮想環境を見れるので、忘れた際にはこれを打つと良い。

次に、先ほど作った仮想環境を立ち上げる。

```
source activate py36
```

※py36の部分は自分でつけた仮想環境名で打ち込むこと

このコマンドを打って、先頭に(py36)と出てくれば成功。

さらに、仮想環境を立ち上げた状態で、Djangoに必要なパッケージをインストールする。

```
conda install django
```

そして、Djangoのインストールをする。

```
pip install django
```

これで、Djangoの環境設定は終了。
### 以下、ただのメモ書き。

pythonの対話的な実行環境を立ち上げる

```
python
```

と、仮想環境が立ち上がった状態で打ち込めば実行される。
足し算やら掛け算で遊んだ。

pythonのファイルを実行

```
python ファイル名
```

と、仮想環境が立ち上がった状態で打ち込めば、走らせたいファイルが実行される。
pythonのif文の練習とかで使った。