OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】文字列型(str型)について学んだことを備忘録としてまとめた

# この記事について
python初心者である私が学習したものをまとめたものです．
リスト型について超基本的なことを書きました．

# 文字列型のメソッド
### 文字列の置換,削除、検索、連結、大文字小文字変換

**置換**

* str.replace("置換前文字","置換後文字")

**削除**

* str.replace("削除した文字","")

* str.strip(［削除したい文字列］）

**検索**

* str.find(検索したい文字列［,開始インデックス［,終了インデックス］］）→検索したい文字が見つからなかった場合は「-1」を返却

* str.index(検索したい文字列［,開始インデックス［,終了インデックス］］）→検索したい文字が見つからなかった場合はValueError例外発生

**連結**

* str.join(シーケンス）　

**大文字変換**

* str.upper()

**小文字変換**

* str.lower()

### split( )メソッドとjoin( )メソッド
split( )メソッドは文字列を特定の文字を目安にして分割できる機能を持つ。

分割に利用する**区切り文字列(デリミタ文字列)**を引数として渡して結果を文字列のリストとして返す。

join( )メソッドはsplit()メソッドの逆の処理

→split( )とjoin( )を使うことで分割してから余分な空白を削除できる！

```python
str_speeds = " 38  42         20 40 37"
speeds2 = str_speeds.split()
csep_speeds2 = "".join(speeds2)
print(speeds2)                  # ['38', '42', '20', '40', '37']
print(csep_speeds2)             # 3842204037
```

###文字列のフォーマット
差し込み処理を行えるformat()メソッド

```python
linkstr = '<a href="{}">{}</a>'
for i in [ 'http://python.org',
            'http://pypy.org',
            'http://cythin.org',]:
    print(linkstr.format(i,i.replace('http://','')))
#結果
<a href="http://python.org">python.org</a>
<a href="http://pypy.org">pypy.org</a>
<a href="http://cythin.org">cythin.org</a>
```

### スライスを使った要素の代入と削除
* スライスと代入を組みわせると、リストの複数の要素を一括して置換することができる
* 置換対象の要素をイコールの右側に置き、置換したい要素をスライスで左側に指定する
* del文とスライスを組み合わせると、複数の要素をいっぺんに削除することができる


```python
a = [1,2,3,4,5]
a[2:3] = ['Three','Four','Five']
print(a)                             # [1, 2, 'Three', 'Four', 'Five', 4, 5]
a = [1,2,3,4,5]
a[2:4] = ['Three','Four','Five']
print(a)                             # [1, 2, 'Three', 'Four', 'Five', 5]
```
## 文字列型の比較について
・"100">200のような比較を書いて自動的に文字列を数値に変換されることはない。Java同様、キャストする必要がある。
・文字列を不等号で比較するとき(比較するときがあるかどうかはさておき)、Pythonが文字列を内部で文字コードに置き換えて比較する.

```python
>>> "10" <= "112"
True
>>> "120"<="23"
True
>>> "10" == "10"
True
>>> "10" == "11"
False
```


## Pythonの文字列と日本語
Pythonが日本語文字列に対して、どのような扱いをするのか簡単に紹介
### バイト型について
* プログラム外部に文字列を出力するとき(または外部から文字列を取り入れるとき)、何らか(UTF-8等)のエンコード変換されている
* Python3では、すべての文字列はユニコードとして保存され,エンコードされた文字はバイト型という(特殊な)文字列オブジェクトになる
* 文字列オブジェクトでは、日本語(マルチバイト文字列であるが)は「1文字の長さが1」、バイト型は「1バイトの長さが1」

```python
s = "AΩ語"
len(s)                    # 3
bs = s.encode("UTF-8")
print(len(bs))            # 6
print(bs)                 # b'A\xce\xa9\xe8\xaa\x9e'
```
【Python】 リスト型について学んだことを備忘録として

# この記事について
python初心者である私が学習したものをまとめたものです．
リスト型について超基本的なことを書きました．
#特徴
* 複数の要素を順番に管理できるデータ型

* インデックスを使って要素の取得，変更ができる

* メソッドや文により，要素の追加や削除，並び替えを行えるほか，要素の検索，要素数を取得することが可能

* オブジェクト自体書の書き換え可能(変更可能な［=mutable］データ型)

# リストの定義方法
リスト型の定義するには，角括弧[ ]を使って定義する

```python
tokyoTempList = [16.7,20.9,35.8,10.3]
```

#リストの繰り返し
```python
list = ['あ','いう','え','お']
for str in list:
    print(str)
```
# リストのソート

* リスト型では要素を昇順に入れ替えるソートをsort()メソッドによって行える．
* reverseキーワード引数をTrueに指定する降順にできる．

※リスト型は変更可能なデータ型であり，sort()を呼び出すと，リストオブジェクト自体が書き換わる．

```python
monk_fish_team = [158,157,163,157,145]
monk_fish_team.sort()
monk_fish_team
```


# ソート順をカスタマイズ
数値以外の大小以外に基づいたソート順のコントロールが可能
書式はlist.sort(key, reverse)
key引数には順番を決める基準を返す関数を渡す．

```python
bmi_data = [("太郎",1.85,75),("花子",1.6,57),("おれ",1.8,67)]
#BMIを計算する関数を定義
def evaluate_bmi(tup):
    return tup[2]/tup[1]**2
bmi_data.sort(key=evaluate_bmi)
```

# アンパック代入
* イコールの左右に複数の要素を記入して，一度に複数の要素に対して代入を行う機能
* アンパック代入ではイコールの左右で要素数が揃っていないとエラーになる．

```python
a = 1
b = 2
c = 3
(a,b,c) = (b,c,a)
#または
a,b,c = b,c,a
print(a,b,c)
```

# スライスのステップ数
* スライスに与えるコロン(:)区切ったパラメータには3つ与えることができる.
* 3つ目の数値はステップとして扱われる.
* n個飛ばしながら要素を取り出すことができる.

```python

a = [1,2,3,4,5,6,7,8,9,10]
#通常のスライス
print(a[1:4])   #[2, 3, 4]を出力
print(a[2:100]) #[3, 4, 5, 6, 7, 8, 9, 10]を出力

#先頭の次からn番目の要素を取り出していく
print(a[::3])  #[1, 4, 7, 10]を出力
```

# リストで利用できるメソッド
* **reverse()メソッド：並び順逆にする**

```python
a = [1,2,3,4,5]
a.reverse()
a
```

* **remove(取り除く要素)メソッド：要素を削除する**

```python
a = [1,2,3,4,5]
a.remove(a[0])
a.remove(2)
a
a.remove(9)  #意図的にValueError発生

```

* **append(追加する要素)メソッド：末尾を追加する**

```python
a = [1,2,3,4,5]
a.append(6)
a #[1, 2, 3, 4, 5, 6]
```
* **extend(追加するシーケンス)メソッド：末尾にシーケンスを追加する**

```python
a = [1,2,3,4,5]
a.extend("678")
a.extend((9,10))
print(a) #[1, 2, 3, 4, 5, '6', '7', '8', 9, 10]
```
* **pop(インデックス)メソッド：削除した要素を返す**

```python
a = [1,2,3,4,5]
a.pop(2)
a  #[1, 2, 4, 5]
```
* **index(検索したい要素)メソッド：要素を検索してインデックスを返す**


```python
a = [1,2,3,4,5]
a.index(1)  #0
a.index(6)#Value Error発生
```
【Python】 ファイル操作について学んだことを備忘録として

# Pythonのファイル処理
### ファイルとファイルオブジェクトについて
* 組み込み関数open()を使用してファイルを開く(組み込み関数のため特別な宣言などは必要ない）
* open()関数はファイルオブジェクトで結果を返す
* open(開くファイル名orファイルパス,モード,エンコード)：モードの指定によって、あるパラメータを指定することでファイルをどのように開くかを指定できる
* 組み込み関数close()を使用してファイルを閉じる(明示的にファイルを閉じない場合、GCによってファイルオブジェクトが削除されたとき自動的に閉じる)


```python
f = open("sample.txt", "r",encoding="utf-8",errors="ignore" )
s = f.read()
print(s)
f.close
```
## ファイルを開くときのモードについて
目的に応じてモードを指定する。
読み込み専用　⇒　「r」を使用　
書き出し専用　→　新規作成か？　⇒　Yesなら「w」、Noなら「a」
読み書き両方　→　新規作成か？　⇒　Yesなら「w+」、Noなら開始位置に先頭から読み書きで「r+」(末尾から読み書きなら「a+」）

## ファイルに対する操作
* ファイルに対する操作はファイルオブジェクトに対してメソッドを呼び出す
* F.read(整数サイズ):文字列として返す。サイズ指定によりバイトサイズを指定できる
* F.readline(整数サイズ):ファイルから1行の読み込む。文字列として返す。
* F.readlines(整数サイズ)：ファイルから複数行の読み込む。戻り値として文字列を要素として含んだシーケンス（行ごとに分割してリストにする）
* F.write(文字列):文字列を指定してファイルに書き出しを行う
* F.writeline(シーケンス):改行文字を追加して書き出せない

```python.readメソッド使用
f = open("sample.txt", "r",encoding="utf-8",errors="ignore" )
str_read = f.read()
print(str_read)
#以下、結果
sample

ad
gv
ewg
g\vewg\v
v
d
vc
dwvc
ds

```
```python.readlineメソッド使用
f = open("sample.txt", "r",encoding="utf-8",errors="ignore" )
str = f.readlines() # 1行ごとを1つ要素としてリストを返す
print(str)
#以下、結果　
['sample\n', '\n', 'ad\n', 'gv\n', 'ewg\n', 'g\\vewg\\v\n', 'v\n', 'd\n', 'vc\n', 'dwvc\n', 'ds']
```
FizzBuzz問題をSwiftで書いてみる

Swift4.0想定です。

# 問題
>
1から100までの数をプリントするプログラムを書け。
ただし3の倍数のときは数の代わりに｢Fizz｣と、5の倍数のときは｢Buzz｣とプリントし、
3と5両方の倍数の場合には｢FizzBuzz｣とプリントすること。
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm

# 当然できるよな？
> ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。
怖い事実を聞きたい?  
コンピュータサイエンス学科卒業生の過半数にはそれができないのだ。
自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm

# 解いてみた
僕も10分くらいかかりました。

```swift:FizzBuzz
for i in 1...100 {
    if i % 3 == 0 && i % 5 == 0 {
        print("FizzBuzz")
    } else if i % 3 == 0 {
        print("Fizz")
    } else if i % 5 == 0 {
        print("Buzz")
    } else {
        print(i)
    }
}
```

```swift:出力
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```

最初独立したif文を3つ作り、Fizz判定、Buzz判定、両方でない判定で出力する方針で組んだんですが、
Swiftのpritnの仕様上、改行文字を入れちゃうので、「FizzBuzz」とはならずに、
「Fizz
 Buzz」になってしまいました。

```
print("改行しない", terminator: "")
```
こっちを使うと改行しないので、if文の中ではこれを使い、最後に
print("\n")で一律改行させることで回避しようとしたら、これはこれできれいな出力にならなかったので、
直感的なわかりやすさを落として、最初にFizzBuzz判定を入れました。
デバッグしながら10〜15分でしたが、紙とペンだと厳しいかもですね。
PHP、これまで勉強したオブジェクト指向関連用語まとめ①

①オブジェクト指向...オブジェクト(モノ)を中心(指向)にした考え方

②クラス...オブジェクトに於ける設計図。それを基にインスタンスを設計する。

````
clsss クラス名　{ //クラス名は大文字
クラスの内容
}
````

③インスタンス...クラスを基に生成された実体。オブジェクトと同じ意味で使われる。インスタンスの生成はクラスの外で記述する

```
new クラス名(); //クラス名は大文字

$変数名 = new クラス名() //この記述によって$変数名に生成されたインスタンスを代入する。
````

④プロパディ...インスタンスが持つ情報

````
public $プロパディ名;
````
⑤メソッド...インスタンスが行う処理、関数に似てる

```
public function メソッド名(){
  メソッドの処理;
}
```

⑥$this...メソッド内でインスタンスのプロパディやメソッドにアクセスしたい時に使う特殊な変数。thisはメソッドを呼び出した時に呼び出し元のインスタンスに置き換えられる

````
$this->プロパディ名orメソッド名　
//"->"の呼び方はアロー演算子、アクセスする時に使う。プロパディ名やメソッド名にアクセスする際は"$"は使わないこと。
```
⑦コンストラクタ...インスタンスが生成された瞬間に自動的に呼び出される特殊なメソッド

```
例) public function __construct(引数){
    処理内容;
}

new クラス名()　//インスタンスの生成。この瞬間コンストラクタが呼び出される
$インスタンス名->
```

⑧継承...既存のクラスに新しいクラスを作ること。作ったクラスを"小クラス" 、予め定義していたクラスを"親クラスと呼ぶ。

```
例　class MainUser  extends User{
    //メソッド定義orプロパディ定義
　}
  ```

⑨オーバーライト...小クラスの方で親クラスで定義したメソッド名、プロパディ名を上書きする

⑩カプセル化...外部からのアクセスを制限する方法、他の人にメソッド等を修正をさせたくない時に使う。アクセス修飾子"private"を使う。

```
class クラス名{
 public name; //外部からアクセス可能
 private age; //外部からのアクセス不可能
 
protected...クラス内or継承先クラスのみアクセス可能
```
CS+のシミュレータを使う

RL78をCS+でいじってます。
このCS+に内蔵されたシミュレータが何かと使えます。
んまCS+なんで、例によって便利だけど扱いにくい･･･色っぽくて可愛いんだけど扱いが面倒くさい･･･ん？(爆)

__UARTやSPIの送受信をシミュレートできる__
　　相手が居ないときに便利です。
__ポートへのOUT状態がグラフで見える__
　　ポートをパタパタして手動でSPIとかをする際に便利です。
　　またグラフ上で時間を計れるのも何気に良いです。
__ソフトでの待ち時間DELAYを簡単に作れる__
　　CPUのクロック数から経過時間を計ってくれます。
__ビルド・デバッグのサイクルが早い__
　　E1にDLしないのでとても高速に繰り返せます。これはでかい。

などなど、もっと色んな使い途が有るんだろうと思います。
ハードが完成する前にかなりのことを試せるんで、納期の短いアナタにぴったりかも(^^;

Qiitaのマークダウン記法になれてないので、[__こちらにまとめました。__](https://yokaton.com/mcu-202209-cssim/)
![2019-08-16_10h25_19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43186/f00aceb9-a6cd-ffcf-13f0-0a1b12a30d98.jpeg)
webarenaでubuntu その13

#概要

webarenaでubuntu18.04やってみた。
apache2.4やってみた。
basic認証やってみた。

#apache2.confの修正

```
<Directory /var/www/>
	Options -Indexes -FollowSymLinks
	AllowOverride All
	Require all granted
</Directory>
```

#.htpasswd作成

```
sudo htpasswd -c /var/www/html/.htpasswd hoge
```

#.htaccess作成

```
AuthType basic
AuthName "Auth"
AuthUserFile /var/www/html/.htpasswd
Require valid-user
```
#パーミッション設定。

```
sudo chmod 604 .htaccess
sudo chmod 604 .htpasswd
```

以上。
githubからのzipファイルダウンロード

# githubからのZIPファイルダウンロード方法

gitコマンドを使えない初心者向けにgithubからzipファイルをダウンロードする方法を伝えるため、最小限の手順を記載します。

## 1. プロジェクトのトップページを開く

サンプル：
![github_zip_download_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/fdb25c3d-ac51-da14-5784-44f267d739df.png)

## 2. "Clone or download"ボタンをクリック

緑色の"Clone or download"ボタンを押すと下図のポップアップが出現するので、"Download ZIP"をクリックする。
（自動でダウンロードが始まります。 sign upやsign inはしなくても大丈夫です）

![github_zip_download_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/b022c82f-1ed9-47c3-8ce5-183c3293ef88.png)

以上
【解決策】axiosでPOSTがGETになってしまう

## 概要
以下のようにaxiosを使ってPOSTしようとすると、GETメソッドが走って404エラーが出てしまいました。

```javascript
axios({
  method: image.id ? 'PUT' : 'POST',
  url: `/hoge/${image.id}`
})
```

## 原因
どうやらURLの末尾に`/`（スラッシュ）が付いていると、POSTしようとしてもGETメソッドが走ってしまう~~不具合があるようです。~~

【追記: 2019年8月16日】
不具合ではなくスラッシュがないURLにリダイレクトしようとしているだけでした。コメントでのご指摘ありがとうございました。

今回の例だと、POSTメソッドのときはimage.idがnullなので、URLが`/hoge/`となっていたんですね。

## 解決策
じゃあ末尾スラッシュをなくせばええやん！ということでコードをサクッと直し解決しました。

```javascript
let url = '/hoge'
if (model.id) url += `/${image.id}`
axios({
  method: image.id ? 'PUT' : 'POST',
  url: url
})
```
マネジメント、チームビルディング時に意識していること

# はじめに
マネジメント、チームビルディング時にいつも意識していることがあるので、その内容と参考にした記事などをまとめました。


# 意識していること
### チームのミッションを明確にする
当たり前の話なのですが、**「これは何のためにするのか」「この仕事は何のためにあるのか」**というミッションが明確になっているとチームが同じ方向を向くことができ、チームビルディングにおいて非常に有効です。

明確なミッションが見えていると、まずはチームの**結束力**が上がります。
それだけではなく、**個人の目標**もチームのミッションからブレイクダウンしたもので**簡単**に作ることができたり、トラブルが発生して何かしらの難関が見えてきた場合も、**妥協点を見つけるのが簡単**で**妥協点に対してメンバーが納得しやすく**なります。

期間や目的が明確なプロジェクトではこれを達成することは容易ですが、常設のチームではここを設定するのは難しかったりすると思います。

参考
[re:Work](https://rework.withgoogle.com/jp/guides/managers-set-and-communicate-a-team-vision/steps/create-a-vision-with-the-team/)

### メンバーに任せる
ここで私が特に意識しているのは、確実に**「任せる」**と感じてもらうことで、**「丸投げ」**と感じさせないことです。
こちらは**「任せた」**つもりでも、**「丸投げ」**と感じられていたら、それは**「丸投げ」**と同じだと考えています。
そこのバランスは非常に難しく重要なのはメンバーとの信頼関係やコミュニケーションがどれだけ取れているかになってきます。

>ある Google 社員は、マネージャーが自分のチームをサポートする様子を次のように語っています。「目的に向かって自由にやらせてもらえますが、口を挟むべきタイミングを心得ていて、うまくいかない問題は必要以上に追わないよう助言してくれます」。

これが非常に大切で、タイミングよく入れるということはそもそもの日々の状況も理解できていることが求められるため、任せてはいるがきちんと管理できているということになると考えています。

参考
[re:Work](https://rework.withgoogle.com/jp/guides/managers-empower-your-team/steps/introduction/
)
[DIAMOND online](https://diamond.jp/articles/-/159740)

### 好きではなく得意なことを意識させる
これは有名な任天堂の岩田さんのお話ですが、まさにおっしゃる通りでとても素晴らしい考え方だと思い、常にメンバーにはこの考え方を伝えるようにしています。
>「好きじゃないけど得意なこともありますし、好きだけど、実はあんまり得意じゃないよっていうことも結構あって。だから、仕事というのは『得意なこと』をやった方がいいんです。好きだけど得意じゃないことに溺れると、仕事っておかしくなることが多いんです。

個人的な見解ですが、他人よりも得意なことをやっていくと達成感や優越感を得られる確率も上がり、後に好きになるのではないかと思っています。

参考
[BLOGOS](https://blogos.com/article/174562/)
[4gamer](https://www.4gamer.net/games/999/G999905/20141226033/)


### 話を聞いて思いを理解する
>リフレクティブ リスニングでは、相手が表に出した言葉や気持ちを聞き、それを自分の言葉に置き換えて繰り返します。これによりマネージャーはさらに効果的にコミュニケーションを取れるようになり、チームメンバーは自分が理解されていると感じることができます。

ここまで戦略的には考えていませんが、どのような場面でも相手の話を聞き、思いやそこに至ったプロセスを理解するようにしています。
思いやプロセスが理解できていたら、メンバーの他の行動や言動に関しても理解が早く、お互いにメリットになる事が多いです。
また、こちらから何かアドバイスや意見をする場合も、思いを理解できているとスムーズに事を進めることができます。

参考
[re:Work](https://rework.withgoogle.com/jp/guides/managers-set-and-communicate-a-team-vision/steps/introduction/)

### 私生活の充実を意識させる
人と状況によって異なりますが、私個人としては**私生活の充実は仕事に良い影響を与え、逆に仕事の充実は私生活に良い影響を与えると考えています。**
単純な話ですが、何か不安な事や悩みを抱えているとそれがずっと心の中にあって何をやっても楽しくない感じってありますよね？それと同じです。
その状況が仕事と私生活で発生しないように、ちょっとの意識でよくなるのであればと思いこの取り組みを行っています。

しかしマネージャーが私生活まで管理をするは介入しすぎだと思うため、あくまでもマネージャーとしては**「仕事によって私生活が圧迫されていないか」**というところを意識し、メンバーには**「私生活が充実しているか」**というところを意識してもらっています。

充実の定義が難しい場合は**「楽しい」**くらいでも良いと思います。

# 最後に
あくまでも個人的な見解も含まれていますので、参考になればという程度で見ていただければと思います。

# 参考まとめ
- re:Work　<br>
https://rework.withgoogle.com/jp/
- BLOGOS<br>
https://blogos.com/article/174562/
- 4gamer<br>
https://www.4gamer.net/games/999/G999905/20141226033/
- DIAMOND online<br>
https://diamond.jp/articles/-/159740
OSX 10.15 (Catalina) βでJavaを使う

macOS Catalinaですが、32-bitアプリが動作しなくなります。自分の使っているアプリは32bitの物は多くなく、βの時点で実用上はあまり問題は無いのですが、唯一にして最大の問題はJavaがインストールできない事でした。

JDK,OpenJDKなども現時点(2019/8/16)はインストーラーでインストールする事ができません。これによりJavaが必須のソフトが動かない問題が出ていました。

Catalinaの正式リリース時までには対応されるとは思いますが、[homebrew](https://brew.sh/index_ja)を使って下記の方法にてインストール可能でしたのでメモしておきます。

# OpenJDKのインストール

```
brew tap homebrew/cask-versions
brew cask install java11
```

初回起動時のみ確認が出ます。

<img width="614" alt="スクリーンショット 2019-08-16 9.30.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/f374f280-2ca0-e5dc-2cca-7e2cd4e09712.png">


## バージョン確認

```
$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
```

## インストールパス確認

```
$ which java
/usr/bin/java
```

# むにゃむにゃ

しばらくいろいろな方法でインストールを試みたのですがうまくいかず、必要な場合はOSを切り替えて使っていたのですが、これで対応する事ができました。

# 参考

https://apple.stackexchange.com/questions/363728/how-to-run-an-app-that-require-java-sdk-on-macos-catalina-10-15
KaggleのNotebookでコミットせずにファイルをダウンロードする方法 (Python)

# はじめに
KaggleのNotebookでファイルをダウンロードする場合、
通常、コミット後にOutput Filesからファイルをダウンロードする必要があります。

![qiita5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131499/265a67f6-f4e3-341d-d358-9440f271df7a.png)

Notebookのエディットモードで検証しながら生成したファイルが欲しい場合、
その方法だと一度コミットを挟まなければいけません。

流石にそれは面倒なので、Notebookのエディット画面からファイルをダウンロードする方法をいくつか調べました。

どの方法も大差は無いと思いますが、個人的にFileLinksを使用しています。

※ダウンロード対象は下図の **./images.zip** です。コードは適宜読み替えてください。

![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131499/925348c5-f4ff-5149-a088-457c38648d80.png)


# マークダウンでリンクを作成
マークダウン形式のセルを作成し、以下のコードを実行します。
(hrefはダウンロード対象のファイルパスを指定してください。)

```html
<a href="./images.zip"> Download File </a>
```

出現したリンクをクリックすることでダウンロードができるようになります。

![qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131499/3e4d8ff8-dff0-e2c1-555f-8b84558746ce.png)


[参考](https://www.kaggle.com/rtatman/download-a-csv-file-from-a-kernel#535151)

# IPythonのFileLink/FileLinksを使用
IPython用のライブラリにFileLink/FileLinksというモジュールがあります。
違いは引数の指定と、複数ファイルのダウンロードが可能かどうかという点で異なります。

## FileLink
FileLinkの場合は、ファイルのパスを引数に指定します。
実行すると、出力結果にダウンロードリンクが出てきます。

```python
from IPython.display import FileLink
FileLink("./images.zip")
```
![qiita4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131499/baabf7af-ed30-ede2-1ce7-2801bfd8b673.png)


## FileLinks
FileLinksの場合は、ダウンロードしたいファイルがあるディレクトリのパスを引数に指定します。
実行すると、出力結果にディレクトリ直下にあるファイルのダウンロードリンクが出てきます。
サブディレクトリは表示されません。

```python
from IPython.display import FileLinks
FileLinks(".")
```

![qiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131499/ab6c7a59-39ad-1753-2dd6-2f9dc0f71934.png)


[参考1](https://www.kaggle.com/rtatman/download-a-csv-file-from-a-kernel#467667)
[参考2](https://ipython.readthedocs.io/en/stable/api/generated/IPython.display.html#IPython.display.FileLink)

# 余談
なぜkaggleはKernelからNotebooksに名前を変えたのだろうか。。。
【Python】Reverse Geocodeを使った逆ジオコーディング

# はじめに
Reverse Geocodeは緯度/経度座標を取得し、国と都市を返します。
このモジュールには、既知のジオコーディングされた場所のセットがあり、[k-dツリー](https://en.wikipedia.org/wiki/K-d_tree)を使用して、最も近い場所を効率的に見つけるそうです。

# 環境
+ Windows 10
+ Python 3.7.3
+ reverse-geocode=1.4

# インストール
`$ pip install reverse-geocode`

# 使い方
```python:
>>> import reverse_geocode
>>> coordinates = (35.69, 139.77), (40.71, -74.01)
>>> reverse_geocode.search(coordinates)
[{'country_code': 'JP', 'city': 'Tokyo', 'country': 'Japan'}, {'country_code': 'US', 'city': 'Financial District', 'country': 'United States'}]
```

**しかし!**
Windowsだと色々エラーが出ました。

## OverflowError
```python:
>>> import reverse_geocode
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\grin\Anaconda3\envs\practice\lib\site-packages\reverse_geocode\__init__.py", line 4, in <module>
    csv.field_size_limit(sys.maxsize)
OverflowError: Python int too large to convert to C long
```

### 解決法
パッケージのソースを直接いじるのはとても嫌なのですが、仕方がないので該当部分を修正します。

```python:修正後
csv.field_size_limit(2**20)
```

## UnicodeDecodeError
```python:
>>> import reverse_geocode
>>> coordinates = (35.69, 139.77), (40.71, -74.01)
>>> reverse_geocode.search(coordinates)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\grin\Anaconda3\envs\practice\lib\site-packages\reverse_geocode\__init__.py", line 118, in search
    gd = GeocodeData()
  File "C:\Users\grin\Anaconda3\envs\practice\lib\site-packages\reverse_geocode\__init__.py", line 22, in getinstance
    instances[cls] = cls()
  File "C:\Users\grin\Anaconda3\envs\practice\lib\site-packages\reverse_geocode\__init__.py", line 31, in __init__
    coordinates, self.locations = self.extract(rel_path(geocode_filename))
  File "C:\Users\grin\Anaconda3\envs\practice\lib\site-packages\reverse_geocode\__init__.py", line 97, in extract
    for latitude, longitude, country_code, city in rows:
UnicodeDecodeError: 'cp932' codec can't decode byte 0x98 in position 429: illegal multibyte sequence
```

### 解決法
ファイルのオープンをしているところに、エンコーディングの指定を付ける。

```python:修正後
rows = csv.reader(open(local_filename, encoding='utf_8'))
```

これでなんとか動きました。

# 参考URL
+ https://pypi.org/project/reverse-geocode/#description
+ https://bitbucket.org/richardpenman/reverse_geocode/issues/4/error-python-37-win10-overflowerror-python
+ [(Windows) Python3でのUnicodeEncodeErrorの原因と回避方法](https://qiita.com/butada/items/33db39ced989c2ebf644)
+ [Python UTF-8のCSVファイル読み込み (UnicodeDecodeError対応)](https://qiita.com/HyunwookPark/items/ebc963f82355c837c488)
scikit-learnのGridSearchCVに規定外の評価指標を設定する

#はじめに
scikit-learnのGridSearchCVにおいて、クロスバリデーションの評価指標をscoringパラメータの引数として指定できるが、通常、公式ドキュメントの[3.3.1. The scoring parameter: defining model evaluation rules](https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter)にあるものしか指定できない。

今回、kappa係数や、マシューズ相関係数を評価指標として指定したかったのでやり方を調査した。

途中で[この記事](https://qiita.com/y_kani/items/011b65a09e480322ac98)とかぶっていることに気が付きました。本記事は「scikit-learnの関数としては用意されているが、GridSearchCVには指定できないケース」として読んでください。

# やり方

sklearn.metrics.make_scorerにより評価指標の関数をラップしたスコアラーを作成し、それをGridSearchCVのscoringパラメータに渡せばよい。

以下は、kappa係数、マシューズ相関係数、およびそれ以外(規定のもの)を指定する場合の例である。
値が大きいほどよい指標の場合は、make_scorer関数をそのまま呼び出せばよいが、値が小さい程よい指標(RMSE等)の場合は、make_scorerのgreater_is_betterパラメータをFalseに指定する必要がある。

```python
from sklearn.metrics import cohen_kappa_score, make_scorer, matthews_corrcoef
from sklearn.model_selection import GridSearchCV

scoring = ...  # 評価指標を文字列で指定
estimator =  ... # ハイパーパラメータを求めたい予測器を指定
params = ... #　探索したいハイパーパラメータを指定(dict形式)

if scoring == "kappa":
   kappa_scorer = make_scorer(cohen_kappa_score)
   gc = GridSearchCV(estimator, params, cv=3, scoring=kappa_scorer)
elif scoring == "mcc":
   mcc_scorer = make_scorer(matthews_corrcoef)
   gc = GridSearchCV(estimator, params, cv=3, scoring=mcc_scorer)
else:
   gc = GridSearchCV(estimator, params, cv=3, scoring=scoring)
```

# 所感
そういえば、RMSEも規定の評価指標にはない。毎回、GridSearchCVのログに出力される‘neg_mean_squared_error’等の値を読み替えるのも面倒なので、この方法でRMSEも指定できるようにしたい。

#参考
[3.3.1. The scoring parameter: defining model evaluation rules](https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter)
[How to use Cohen's Kappa as the evaluation metric in GridSearchCV in Scikit Learn?
](https://datascience.stackexchange.com/questions/8064/how-to-use-cohens-kappa-as-the-evaluation-metric-in-gridsearchcv-in-scikit-learn)
名前をつけるときは予約語に注意


今回出てたLaravelの開発で出たエラー。結構ハマったのでメモ。

結論：フォルダ名も予約語使わないこと。


```
PHP Parse error: Syntax error, unexpected T_INTERFACE, expecting T_STRING or '{' on line 1
```

初めは全体通して動かしてたけど問題の切り分けのために、tinkerで直指定してファイル呼び出し。


```
php artisan tinker

>>> use App\Infrastructure\Repositories\Interface\IGreetdictionarysRepository;

PHP Parse error: Syntax error, unexpected T_INTERFACE, expecting T_STRING or '{' on line 1
```

ファイルの中身を全部消してもエラー出るので、フォルダ名を変えた。
Interfaceって名前が予約語なのでIRepositoriesに変えた。



```
use App\Infrastructure\Repositories\IRepositories;
use App\Infrastructure\Repositories\IRepositories\IGreetdictionarysRepository;
```

これで通った。


# 他の言語でも同じように注意


## Pythonの予約語に注意

Pythonの変数名で避けた方がいい名前は？
https://qiita.com/matsui2019/items/98165df7bee980ae6a18


## MySqlの予約語に注意

MySqlで予約語を使うと、syntax errorが出る
https://qiita.com/ma_me/items/a98842d1cb65bfcd20cf
【UE4】地形(Landscape)の標高を元に専用マテリアルを作成する🌏

# 🌏完成図🌏

![Terrain](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213065/61f4055e-7f13-4299-12e3-cd953298b07e.gif)

今回は標高ごとにのマテリアルの種類を変更する方法を解説します。
この解説では、標高が高いところは雪、中くらいは草、低いところは土のマテリアルを適応します。

※画像はDTLで作成した孤島に今回作成するマテリアルを適応したもの。

# 🌏完成ノード🌏

![mate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213065/c048048a-4cb3-ae99-909c-74994efb0d01.png)

今回の解説で作るマテリアルノードの完成図はこのようになります。
高画質画像なので拡大して確認用にお使いください。

画像に書かれている変数値を全てそのまま写した方で、
DTLの(最高高度30000の)PerlinSolitaryIslandを使用している方は
地形(Landscape)のZ軸を20000にし、水面をZ軸-500に設定すると綺麗な島が作成できます。

# 🌏標高分けノード🌏

![1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213065/b5359b91-6077-c092-c3a1-581da70b5e46.png)

worldと打つと出るWorldPosition(絶対ワールド位置)を選択。
マテリアルを適応させる地形の各点の位置情報を取得します。

今回は標高情報のみ使うので、マスクで標高値であるB(Z軸)の値のみ取得します。

![2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213065/8d5cfb52-d4b2-0aa8-1bdd-1b2f17c23d18.png)

取得した値と変数値を演算してclampで0から1の間の値に変更します。

![3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213065/11f5e36c-f61c-e7c3-b0e4-93c4a170774b.png)

最後に標高ごとに分割させたいテクスチャを指定して合成します。

# 🌏テクスチャノード🌏

テクスチャの指定は以下のように書きました。
お好きなテクスチャを作成して使ってみてください。

![4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213065/8fa40e4f-093b-ef25-2b9c-7c9a9aa2d7e3.png)

![5](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213065/e6afcd52-3c74-3c48-6213-c7f808cf97b7.png)



# 🌏完成🌏

![6](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213065/13f85f00-5961-01f9-024a-34e117fae816.png)

これでマテリアルを地形(Landscape)に適応すると標高ごとに違ったマテリアルが表現できます。

![Terrain](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213065/61f4055e-7f13-4299-12e3-cd953298b07e.gif)

綺麗な地形を楽しんでくださいね！
react で "number of file watcher reached" になり  yarn start できなかった　(ubuntu 18.04)

ubuntu18.04でreacを使い yarn startを実行しようとした所以下のエラーになった

```bash
Error: ENOSPC: System limit for number of file watchers reached
``` 
###原因
system's file watchersの上限を超えていた

###対策

以下を実行してファイル監視数の上限を開放する。

```bash
$ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
```

###参考
https://github.com/gatsbyjs/gatsby/issues/11406

https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers#the-technical-details
"Writing An Interpreter In Go " を JavaScriptで実装してみる　その2 Parser

[Writing An Interpreter In Go " を JavaScriptで実装してみる　その1 Lexer](https://qiita.com/freddiefujiwara/items/41be900cdd5ed8111d49)
に引き続き　夏休みの個人的課題を進めています
[Writing An Interpreter In Go](https://interpreterbook.com/)の103ページまで読み進めました
ほぼ動いてないけど(特定の構文は理解できず無限ループするようです^^;)
かなりバギー
[parser 部分のcode]
https://github.com/freddiefujiwara/saru/blob/master/src/parser.js


# 現時点のコードカバレッジ
```bash
-------------------------|----------|----------|----------|----------|-------------------|
File                     |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
-------------------------|----------|----------|----------|----------|-------------------|
All files                |    96.02 |    82.38 |    95.24 |    95.95 |                   |
 block_statement.js      |      100 |       50 |      100 |      100 |                12 |
 boolean_literal.js      |      100 |        0 |      100 |      100 |                19 |
 call_expression.js      |       80 |        0 |       60 |    77.78 |              9,15 |
 expression.js           |      100 |      100 |      100 |      100 |                   |
 expression_statement.js |      100 |      100 |      100 |      100 |                   |
 function_literal.js     |      100 |        0 |      100 |      100 |                15 |
 identifier.js           |      100 |      100 |      100 |      100 |                   |
 if_expression.js        |    78.57 |       50 |       40 |    76.92 |          10,16,22 |
 infix_expression.js     |      100 |    16.67 |      100 |      100 |             28,33 |
 integer_literal.js      |      100 |      100 |      100 |      100 |                   |
 let_statement.js        |      100 |      100 |      100 |      100 |                   |
 lexer.js                |      100 |      100 |      100 |      100 |                   |
 node.js                 |      100 |      100 |      100 |      100 |                   |
 parser.js               |    93.75 |    83.91 |      100 |    93.75 |... 39,342,349,384 |
 prefix_expression.js    |      100 |        0 |      100 |      100 |                26 |
 program.js              |      100 |      100 |      100 |      100 |                   |
 return_statement.js     |      100 |      100 |      100 |      100 |                   |
 statement.js            |      100 |      100 |      100 |      100 |                   |
 token.js                |      100 |      100 |      100 |      100 |                   |
-------------------------|----------|----------|----------|----------|-------------------|   
```

# インストール方法はこちら
```bash
npm i -g saru
```

# 新しい使い方はこちら
```bash
  $ saru
Hello fumikazu! This is the Monkey programming language!
Feel free to type in commands
* Please type 'bye' if you want to exit
>>>
```
## こんな構文が理解できます
```bash
>>> 1 + 2 * 3
(1 + (2 * 3))
>>>
1 * 2 - 3
((1 * 2) - 3)
>>>
false == 1
(false == 1)
```
# またLexerだけを使いたい場合は -l オプションつければLexerモードで起動します
```bash
  $ saru -l
Hello fumikazu! This is the Monkey programming language!
Feel free to type in commands
* Please type 'bye' if you want to exit
>>>
```

さて次はいよいよ　Evaluation 18日までに終わるかな
【Google Play】定期購入の無料試用の適用範囲の設定が追加されていた件

いつの間にやら、定期購入の無料試用で適用範囲の設定がPlay Consoleに追加されていたので、ざっくり説明してみる。（いつから追加されたのかは不明です。）


# どこに？
Google Play Consoleの「定期購入」画面にある「定期購入の設定を管理」にありました。
<img width="1221" alt="スクリーンショット_2019-08-15_18_26_51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/559a1696-e3ac-d2d9-2f28-faf2a4f1bfa1.png">

「定期購入の設定」の一番下
![スクリーンショット_2019-08-15_18_13_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/46a29382-c8d8-0fbb-406e-65a1bad1a1bf.png)

# 何が設定できるのか
> **「定期購入ごとの無料試用」**
> アプリ内で利用可能な各定期購入の無料試用にユーザーが登録できるようにします。これを設定しない場合、ユーザーはアプリ内で 1 個のみの無料試用に登録できます。

ということで、無料試用の適用範囲を **アプリ内で一度にするのか** or **定期購入ごとにするのか** が設定できるようになります。（この設定が追加される前は「定期購入ごとの無料試用」だった？）

例えば、同じような機能を提供する定期購入が複数ある場合は、アプリ内で一度だけ無料試用できたほうが望ましいのかなと思いますし、雑誌の定期購入のような種類の異なるものの場合には、定期購入ごとに無料試用ができたほうが良い、などユースケースに合わせて設定することができるようになった形ですね。

# まとめ
定期購入の無料試用の設定が追加されていた件をざっくり説明しました。
この設定をうまく調整することで、適切な無料試用の運用ができるようになるのではないかと思います。

ちなみに自分はこの設定のことを知らず、「無料試用できるはずなのにできない涙」となりました。（Play Consoleで設定を変更したら、反映されるまでに4〜5時間かかました。）
webarenaでubuntu その11

#概要

webarenaでubuntu18.04やってみた。
apache2.4やってみた。
virtualhostやってみた。

#ユーザー作成

```
sudo adduser hoge
```

#public_htmlフォルダを作成。

#index.html書く。

```
<html>
<body>
It's work!! [hoge]
</body>
</html>
```

#ftpで、アップロード。

パーミッションを設定。

#000-default.confを修正。

```
<VirtualHost *:80>
	ServerName hoge.dip.jp
	ServerAdmin webmaster@localhost
	DocumentRoot /home/hoge/public_html/
	<Directory /home/hoge/public_html>
		AllowOverride None
		Require all granted
  	</Directory>
</VirtualHost>
```

#テスト

```
http://hoge.dip.jp
```


以上。
Raspberry Pi 3 が可愛いのでSSHログイン時にscreenfetchが表示されるようにした話

# Raspberry Pi 3 が可愛いのでSSHログイン時にscreenfetchが表示されるようにした話

うちのRaspberry Pi 3ちゃんです。かわいいですねー

<img width="480" alt="IMG_20190815_072901.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481198/83705086-0fd2-3111-3a62-a4f1da1620e4.jpeg">
たまりすぎた家電量販店のポイントで、血迷ってRaspberrypi 3を購入しました。  
正確には`Raspberry Pi 3 Model B+`ですね。

## セットアップについて
セットアップは以下を参考にさせていただきました。

* [ゼロから始めるRaspberry Pi Zero(4)LEDが点灯しない!?その2 原因はNOOBSの保存先でした](http://bokuraku.com/rasberrypi-nyumon-4/)

* [最近のRaspberry Piイメージ（Raspbian）をインストールするメモ](https://www.1ft-seabass.jp/memo/2018/07/23/raspbian-install-201807-memo/)

つっかかったところとしては、**電源投入時にLEDが赤色→緑色(SDカード読み込み状態)にならず、起動しない**というのがありました。
以下を試して、解決しました。

1. 電源を[これ](https://www.amazon.co.jp/gp/product/B07J1Y966M/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)に変える

2. micoroSDを変えてOSを入れる

3. OSを、micoroSDに書き込む形式ではなくNOOBSでmicoroSDにファイルを置く形式に変える

電源を変えても解決しなかったので、2と3を試した感じです。

## SSHログイン時にRaspbianのロゴを表示させるように設定する
買ったはいいもの、特に何かに使う予定もないので、徒然なるままにSSHログイン時にRaspbianロゴが表示されるように設定しました。
### Screenfetchインストール
まずはScreenfetchをインストールします

```
pi@raspberrypi:~ $ sudo apt-get install screenfetch
```

### ログイン時にScreenfetchの実行結果を出力するように設定する
[こちら](https://qiita.com/ysaotome/items/09dddc9f1efae3065d15)を参考にさせていただいたところ、以下にScreenfetchの実行結果を反映すれば、ログイン時にScreenfetchの実行結果が出力されることがわかりました。

```
/etc/motd
```

以下のコマンドを実行して、`/etc/motd`にScreenfetchの実行結果を動的に反映してくれるスクリプトを取得します。 

```
pi@raspberrypi:~ $ sudo wget --no-check-certificate -P /usr/local/bin/ 'https://gist.github.com/ysaotome/5997652/raw/fecdf757b348debfcdd866df00f6d567ff749623/update_motd_by_screenfetch.sh'
```

スクリプトを実行できるように実行権限を付与します。

```
pi@raspberrypi:~ $ sudo chmod +x /usr/local/bin/update_motd_by_screenfetch.sh
pi@raspberrypi:~ $ ls -la /usr/local/bin/update_motd_by_screenfetch.sh
-rwxr-xr-x 1 root root 792  8月 14 08:03 /usr/local/bin/update_motd_by_screenfetch.sh
```

sudo権限でScreenfetchをインストールしたからなのか、スクリプト内に記載されているScreenfetchのパスが違っていたので、修正します。

```
pi@raspberrypi:~ $ cat /usr/local/bin/update_motd_by_screenfetch.sh
#!/bin/bash
# Description:UpdateMotd by Screenfetch
(略)
# BIN_SCREENFETCH='/usr/local/bin/screenfetch'   ← コメントアウト
BIN_SCREENFETCH='/usr/bin/screenfetch'           ← 追記
(略)
```

また、このままスクリプトを実行しても、`/etc/motd`へのアクセスが拒否られましたと表示されてしまうので
以下を実行しました.
`chmod 777`やっちゃダメでしょという感じですが、`chmod 755`がなぜか効きませんでした。。

```
pi@raspberrypi:~# sudo chmod 777 /etc/motd
pi@raspberrypi:~# ls -la /etc/motd
-rwxrwxrwx 1 root root 286  6  7 00:42 /etc/motd
```

後はスクリプトが5分ごとに実行されるように以下を実行します。

```
pi@raspberrypi:~# sudo -i
root@raspberrypi:~# /bin/cat << _UPDATEMOTD_ > /etc/cron.d/update-motd
> #update-moted
> */5 * * * * root /usr/local/bin/update_motd_by_screenfetch.sh
> _UPDATEMOTD_
```

ログアウトしてから再度ログインすると
↓こんな感じに表示されるはず！
![20190816_080357000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481198/57aed59b-16cf-0af2-2828-d992600e2bd9.jpeg)
要件定義書の最低限の書き方をざっくりとまとめる


## 要件定義書として最低限挙げる項目

- まずどんなシステムなのか概要を説明する
- それを踏まえてそのシステムを導入すると何ができるようになる？
- で、そのシステムを導入することによって改善される事はなに？
- 現時点での問題点のうち、どれが改善される？
  つまり今導入することで得られるメリットはなに？
- 期限やマイルストーンなど、こういったスケジュール感でいきますよ？
- 人員・設備のリソースと、それらの費用・見積もりはこんな感じですよ？

## おわりに

上流工程未経験なので、完全にGoogle/Qiita頼りの内容になっています。

なぜこれをまとめておきたかったか。
その理由は、自分のプライベートでの開発にも利用し
製作する目的などを整理するための一種のフレームワークとして取り入れたかったからです。
そして、ドキュメント化しておけば、採用面接の時に
「こういった物を実現したかった。だからこれを作った。」と
伝える良い材料になるのではないか？と考えたからです。

他の人達（自分と同じように開発未経験の転職者）がどのようにアプローチしているか分かっていませんが
少しでも差別化を図りたいということ。そして、
自分の頭の中を整理するための手段として知っておきたかった。
ということでした。

今回の調査にあたり、参考にしたサイトは以下に記します。めっちゃ詳しいところまで書いてあるので
興味のある方はぜひご覧になってください。

[僕が思う要件定義や設計書作成時に決めるべき内容](https://qiita.com/9ryuuuuu/items/b006e18f59afc3e082cc)
[テスト担当者も上流工程の技術を学ぶべき3つの理由](https://qiita.com/hinac0/items/e1cdfbd8daf418937b26)
[https://biz.trans-suite.jp/19026](https://biz.trans-suite.jp/19026)
Web技術についての備忘録2

# Webサイト上で仕組みに関するキーワード

## ドメイン
他のWebサイトと重複しない名前を付与する役割を持つ。1つのWebサイトにつき、必ず1つ割り当てられる

## Webサーバー
Webサイトのファイルデータを保有する機械。Web上では膨大な数のサーバーが存在している。

## IPアドレス
Web上での固有の住所に該当する情報。
Webブラウザ上でIPアドレスを入力し、アクセスすることで特定のWebサイトの閲覧が可能
ただし、サーバーが変わるとIPアドレスも変更されてしまう

## DNS
Domain Name Systemの略称であり、WebサイトとIPアドレスを結びつける役割がある。
DNSサーバーを通じて、ドメイン名とIPアドレスを双方で管理・変換できる仕組みを持つ

# 上記についての素敵な例え
Web上の世界 → サーバーというビル群の世界
Webサイト → お店自体
Webサイトを公開 → 現実世界で言うお店を出店するイメージに近い
サーバー → お店を出すテナントビル
ドメイン → お店の名前
IPアドレス → お店の住所

決まりごと：ビル内の1室につき、1つのWebサイト・1つのIPアドレスを持つ

# 次の内容
[Web技術についての備忘録3](https://qiita.com/zoomk06/items/bc6e7187eee8bd9a13b3)

# 参照
[【基本のき】ホームページの仕組みをイラスト付きでまるっと解説！](https://webliker.info/65123-2/)
Homebrew でよく使うコマンドまとめ

バージョン 2.1.11 で確認。詳しくは [Homebrew のマニュアル](https://docs.brew.sh/Manpage)を参照。

### インストールされているパッケージを最新版に更新
```
brew upgrade <パッケージ名>
```
パッケージ名を省略すると、すべてのパッケージを更新する。

### パッケージをインストール
```
brew install <パッケージ名>
```
複数のパッケージをスペースで区切って指定することもできる。

### パッケージをアンインストール
```
brew uninstall <パッケージ名>
```
パッケージの古いバージョンも削除しないと、次の `brew upgrade` で再インストールされる。
`brew uninstall -f <パッケージ名>` とすることで確実にアンインストールできる。

### インストールされているパッケージを表示
```
brew list
```
`brew list -1` とすると、1 行に 1 つずつ表示される。

### パッケージを検索
```
brew search <文字列>
```
`/<文字列>/` とスラッシュで囲むことで正規表現を使用できる。

### パッケージの情報を表示
```
brew info <パッケージ名>
```
【日記】DjangoでImageFieldを実装したり、object-fitで画像表示したりした。

Django公式チュートリアルで作るpollsアプリケーションの発展型のようなものを作っています。詳しくはまだないしょです。

今日は各投稿の詳細画面をある程度実装しました。デザインはまだ何もいじっていないので見た目カッコ悪いですが……。あとからやります。

![スクリーンショット 2019-08-15 18.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255497/4fbbeedc-91f4-1b8e-ffd8-0fdfb4f2b4db.png)

## ImageField 

今日実装したのは画像を扱うフィールド、**ImageField**です。公式チュートリアルでは触れられておらず、ドキュメントでも詳しく触れられていなかったので困りました。ググったところ、Django BrothersのチュートリアルがImageFieldについて扱っていて、非常にわかりやすかったのでこれに沿って実装しました。

[ImageFieldを使ってみよう](https://djangobrothers.com/tutorials/photo_app/imagefield/)

僕の場合、default値を設定したかったのですが、ファイルを指定するパスが良くわからずだいぶ四苦八苦しました。結果的にこうなりました。

```Python:models.py
choice_image = models.ImageField(upload_to='polls', default=os.path.join(BASE_DIR, '/polls/default_icon.jpg'))
```

詳しくはDjango Brothersチュートリアルを読んでほしいのですが、settings.pyでMEDIA_ROOTを指定したところからのパスで良いようです。

```python:settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
```
つまり、ImageFieldのデフォルト画像のパスは以下のようになります。
```/media/polls/default_icon.jpg
```

## object-fit
画像を表示できたは良いものの、画像サイズがそのままなので表示が整いません。縦横比を維持しつつ正方形で表示したかったので調べてみたところ、CSSの**object-fit**というものを使えばうまくいきそうです。

[1行追加でOK！CSSだけで画像をトリミングできる「object-fit」プロパティー｜Webクリエイターボックス](https://www.webcreatorbox.com/tech/object-fit)

実際に書いたコードはこちら

```CSS:/polls/static/polls/style.css
.choice_image {
    width: 100px;
    height: 100px;
    object-fit: cover;
}
```
画像にはchoice_imageクラスを指定しました。

## 細かい話

**スーパーリロード**というものについて知りました。キャッシュを消してリロードできるので、CSSを変更したのに反映されない！ってときに使うといいです。

[Django開発中にクロームでcssが反映されない場合の対処方法 - 知的好奇心](https://intellectual-curiosity.tokyo/2018/11/08/django%E9%96%8B%E7%99%BA%E4%B8%AD%E3%81%AB%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A0%E3%81%A7css%E3%81%8C%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6/)

## 円グラフを表示したかったがうまくいかない

投票された割合を表示する手段として、円グラフを実装したいのですがこれがうまくいかなかったので持ち越しです。Chart.jsというJSライブラリを使おうと思ったのですが、Pythonのfor文とどのように共存させればよいかわからないのです。もしかしたらviews.pyで作成したほうが良いのかもしれないですね。

[Chart.jsでグラフを描画してみた](https://qiita.com/Haruka-Ogawa/items/59facd24f2a8bdb6d369)

今後の課題です。がんばろう。
php-master-changes 2019-08-14

この日は ReflectionClass::newInstanceWithoutConstructor() が内部クラスを継承した final クラスに使えない問題の修正、7.2 系と 7.3 系の開発バージョンの引き上げ、arginfo を PHP スタブへ移行する修正があった！

# 2019-08-14
## nikic: Fixed bug [#78410](https://bugs.php.net/bug.php?id=78410)
- https://github.com/php/php-src/commit/d891b5f458a253befaa56d325ae90518536fc2f0
- [7.4~]
- ext/reflection で、[ReflectionClass::newInstanceWithoutConstructor()](https://www.php.net/manual/ja/reflectionclass.newinstancewithoutconstructor.php) が内部クラスを継承した final クラスに使えない問題の修正

## cmb69: Bump version numbers
- https://github.com/php/php-src/commit/fe7997912d2aec3a3836a426034521b083434fdb
- [7.3~]
- 7.3 系の開発バージョンの引き上げ（の忘れてた奴）対応

## cmb69: Next will be 7.3.10
- https://github.com/php/php-src/commit/5536105b67465151a7a9d94e80d91871ef3aff22
- [7.3~]
- 7.3 系の開発バージョンの引き上げ

## sgolemon: Bump for 7.2.23
- https://github.com/php/php-src/commit/4b64d47c99c8f7e874b441bcaafadd7b6279eb0e
- [7.2~]
- 7.2 系の開発バージョンの引き上げ

## stephenreay: Added arginfo stub for posix extension
- https://github.com/php/php-src/commit/f40cc41465c3a7bd4afb2b4ecbe55171fabbd048
- ext/posix で、arginfo の PHP スタブへの移行

## jason-liew: add some stubs for array func in basic_functions
- https://github.com/php/php-src/commit/ffffaf12cf3b6f3ca6cdd7350eb4e20cf8e2f748
- 配列操作関数幾つかの arginfo の PHP スタブへの移行

## Arkanius: Add some stubs at ctype ext
- https://github.com/php/php-src/commit/262227fc9e6829ab9651a0b547e038b3a9a1e967
- ext/ctype で、arginfo の PHP スタブへの移行

## theodorejb: Add hrtime arginfo stubs
- https://github.com/php/php-src/commit/e2b0fb946baf065cb9d920ce49996890b05b5b5f
- [hrtime()](https://www.php.net/manual/ja/function.hrtime.php) の arginfo の PHP スタブへの移行
JavaScriptをMacのターミナルで使用する時の注意点

Macのターミナルで初めてJavaScriptを実行した際に、基本的なところでエラーが出たのでその対処法を書いていきます。

# console.log()でエラー
まずJavaScript標準で用意されているオブジェクトのnowDate()を用いて、今日の日付と今の時刻を表示しようとしました。

```nowDate.js
const today = nowDate();

console.log(today);
```
こちらのjsファイルをターミナルで実行すると、

```
Exception: TypeError: undefined is not an object (evaluating 'console.log')
```
このようなエラーが出てきました。


# print()に変更

```nowDate.js
const today = nowDate();

print(today);
```
このように変更して実行すると、

```
Fri Aug 09 2019 11:24:41 GMT+0900 (JST)
```
先ほどのようなエラーが起きず無事に現在の日付・時刻を表示できました。

# まとめ

エラーが出ても、焦らず冷静に開発環境やコードをチェックしていきたいですね。
Macのlocalhostで複数ドメインを管理する

## 概要
MacのApacheで立てたローカルホストで、`http://hoge.localhost`のように任意のドメイン名で複数サイトを管理したい時の方法です。

## 経緯
自分の場合、複数サイトにまたがるCookieのテストをローカルでしたいときに、RFCの仕様でCookieはポート番号では分離されないのでドメイン名を分ける必要がありました。
`http://localhost:8000`や`http://localhost/hoge`などポートやパスでサイトを指定することはありますが、Apacheでドメイン指定する方法をやったことがなかったので忘備録です。

## 環境

- macOS Mojave 10.14.5
- Apache 2.4.34

※ Apacheバージョンによって設定の記述方法が結構違うので注意

## 手順
### 1. httpd.confでバーチャルホスト設定ファイルの読み込み

Apacheの設定ファイルであるhttpd.confを開きます。

```bash
$ sudo vim /etc/apache2/httpd.conf
```
httpd.confの中にそのままバーチャルホストの設定を記述することもできますが、バーチャルホスト用の設定ファイルをIncludeします。
コメントアウトされているので、先頭の#を外します。

```conf:/etc/apache2/httpd.conf
# Supplemental configuration
#
# The configuration files in the /private/etc/apache2/extra/ directory can be
# included to add extra features or to modify the default configuration of
# the server, or you may simply copy their contents here and change as
# necessary.

(省略)

# Virtual hosts
Include /private/etc/apache2/extra/httpd-vhosts.conf
```

### 2. httpd-vhosts.confでバーチャルホストの設定

バーチャルホスト用の設定ファイルを開きます。

```bash
$ sudo vim /private/etc/apache2/extra/httpd-vhosts.conf
```

ファイルを開くと説明とダミーの例が書かれており、末尾に追記していきます。
[\<VirtualHost>ディレクティブ](https://httpd.apache.org/docs/2.4/ja/mod/core.html#virtualhost)でバーチャルホストの設定、[\<Directory>ディレクティブ](https://httpd.apache.org/docs/2.4/ja/mod/core.html#directory)でディレクトリの認証設定を行ないます。

```conf:/private/etc/apache2/extra/httpd-vhosts.conf
# サイト1のバーチャルホストの設定
<VirtualHost *:80>
    DocumentRoot /path/to/your/project/directory1
    ServerName project1.localhost

    # サイト1のディレクトリの設定
    <Directory "/path/to/your/project/directory1">
        Options FollowSymlinks Includes
        AllowOverride All
        Require all granted
    </Directory>

</VirtualHost>

# サイト2のバーチャルホストの設定
<VirtualHost *:80>
    DocumentRoot /path/to/your/project/directory2
    ServerName project2.localhost

    # サイト2のディレクトリの設定
    <Directory "/path/to/your/project/directory2">
        Options FollowSymlinks Includes
        AllowOverride All
        Require all granted
    </Directory>

</VirtualHost>
```

### 3. HostsファイルでDNS設定

Hostsファイルを開き、IPアドレスとホスト名の対応付けを追記します。

```bash
$ sudo vim /etc/hosts
```

```conf:/etc/hosts
127.0.0.1       project1.localhost
127.0.0.1       project2.localhost
```

### 4. Apacheの起動
Apacheを起動(または再起動)します。

```
$ sudo apachectl start
```

### 5. 確認

**新しいウィンドウ**のブラウザで、http://project1.localhost と http://project2.localhost を開きます。
それぞれのサイトが見られるようになれば完了です！

## 参考

- [localhostでバーチャルホストを切る - toytools log](http://toytools.hatenablog.com/entry/20070417/p1)
- [OSXのlocalhostに複数サブドメイン « cross HVN](http://cross.hvn.to/?p=238)
- [Apache2.4で、アクセス制限の記述方法が変更されていた - Qiita](https://qiita.com/nwsoyogi/items/c8eb1fedef3c00c5fbac)

## 最後に
~~今更思ったけどDockerで2つ環境作ればよかった気がする~~
間違いや不明な点があれば遠慮なくご指摘ください。
毎回検索とかでApatchがApacheって怒られるけど、Apatchってどうしても書いてしまう。。
EC2インスタンス停止による料金の発生について

##EC2インスタンスを停止中にしたら料金が発生していた
勉強不足で私は知りませんでした。
停止中のEC2インスタンスに関連づけられている**ElasticIP**は、課金対象だということを。

標題の件、私の失敗談をご紹介します。

先日、クレジットカードの明細を見たときに
「Amazon web services　¥４８」
という記載がありました。

おやおや？と思い、AWSの「請求」を確認すると

```請求の内訳.
AWS Service Charges　　　 $0.44

▼ Elastic Compute Cloud
　▼ Asia Pacific (Tokyo)
　　Elastic IP Addresses　$0.41
　　$0.005 per Elastic IP address not attached to a running instance per hour (prorated)82.600 Hrs　$0.41
徴収される消費税(日本)　　　　$0.03
```

どうやらElasticIPで料金が発生している様子です。
こちらについて公式サイトで調べてみます。
[Elastic IP の料金を理解する - Amazon Web Services](https://aws.amazon.com/jp/premiumsupport/knowledge-center/elastic-ip-charges/)

>次の条件が満たされている限り、Elastic IP アドレスに料金は発生しません。

> - Elastic IP アドレスが EC2 インスタンスに関連付けられている。
> - **Elastic IP アドレスに関連付けられているインスタンスが実行中である。**
> - インスタンスに 1 つの Elastic IP アドレスしか添付されていない。

>これらの条件を満たしていない Elastic IP アドレスについては、1 時間単位で請求されます。




私は、7月の終わりにEC2インスタンスを停止中にしていました。
今回の料金発生は、2つ目の「ElasticIPアドレスに関連付けられているインスタンスが実行中である。」という条件を満たしていないことが原因でした。

これを回避するには、EC2インスタンスを実行中にする、もしくは**ElasticIPを解放**する必要があります。

##停止中にした経緯
「AWS Free Tier limit alert」
というタイトルのメールが届きました。

```メール本文抜粋.
AWS Free Tier usage limit alerting via AWS Budgets	07/28/2019

Dear AWS Customer,

Your AWS account xxxxxxxxxxxx has exceeded 85% of the usage limit for one or more AWS Free Tier-eligible services for the month of July.

AWS Free Tier Usage as of 07/28/2019	AWS Free Tier Usage Limit
642 Hrs	                                750 hours of Amazon EC2 Linux t2.micro instance usage

```
「t2.microインスタンスは、月に750時間まで無料で使えるけど、あなたの利用時間は既に８５％を超えているから念の為お知らせしとくね」
ということだと思われます。

31日 × 24時間 = 744時間
t2.microインスタンスを一つだけ使う分には、750時間は超えません。
ということは、そのままで大丈夫！

しかし、このメールを初めて見た当時の自分はこう思いました。
「アラートが来てドキッとするくらいなら、停止中にしておいて必要なときにまた実行中にすればいいや」と・・・。
（EC2インスタンスを複数使うときだけElasticIPを解放すれば良いのだと思ってた）

##終わりに
今回は、**しなくてもいいことをして料金発生**という失敗でした・・・。
ただ、今回の失敗を経て、利用するサービスの仕組みはよく調べて理解しておくべきだと実感できました。

もし、料金について気になる方はAWSのマネジメントコンソールから「請求」と検索してご確認ください:point_up:

ご覧いただきましてありがとうございました。
内容に不備がございましたら、ご指摘いただけますと幸いです。
Docker環境でAtomからRubocopを使う方法

# この記事なんやねん
最近はDockerを使って環境構築をするケースが多いと思いますが、Atomなどのテキストエディタのコードフォーマットで使うRubocop系のライブラリを動作させるための日本語の記事が意外となかったので投稿します。

Atomの[linter-rubocop](https://atom.io/packages/linter-rubocop)をDocker経由で動作させるのを目的に書いていきます。
docker-composeでも動きますよ。

# 手順
ここから早速始めていきましょう。因みに、以下の環境は揃っているという前提で進めます。

- Dockerとdocker-composeをインストール済み
- Atomをインストール済み
- docker-composeを使ってRails環境を構築済み

もし、 *環境構築まだやねん* って状態だったら、[こちらの記事](https://qiita.com/belion_freee/items/f0ef60a08299c9febbdf)を参考に開発環境を作ってみてください。

また、自分の使ってる`.rubocop.yml`は[こちら](https://gist.github.com/belion-freee/031cd89c5db8e8ba42d77d0ac04d7493)になります。まだ用意してなければなければ使ってみてください。

## ラッパースクリプトの配置
まずは、ラッパースクリプトを作成しましょう。
配置場所はどこでもいいですが、プロジェクト配下に`bin/rubocop`というパスで配置するのが分かりやすいかと思います。今回の例ではそうします。

`docker exec`していますが`docker run`コマンドでも動作します。
ただ、`exec`の方が早いので、コンテナを起動しておいて`exec`コマンドにてrubocopを叩く方が使い勝手がいいかと思います。
ここら辺はお好みで変えてください。

```shell:bin/rubocop
#!/bin/bash

CMD_ARGS=""
for arg in $@
do
if [ -f "$arg" ]
then
  CMD_ARGS="$CMD_ARGS ${arg#$PWD/}"
else
  CMD_ARGS="$CMD_ARGS $arg"
fi
done

docker exec -i <コンテナ名> rubocop $CMD_ARGS
```

`<コンテナ名>`にrubocopがインストールされてるコンテナ名を記載してください。`docker-compose ps`コマンドで確認できます。
因みに、私の環境では下記のように`hr_web_1`がrailsとrubocopがインストールされてるコンテナになります。

```shell
% dc ps
   Name                  Command                State     Ports
---------------------------------------------------------------
hr_chrome_1   /opt/bin/entry_point.sh          Exit 143        
hr_db_1       docker-entrypoint.sh postgres    Exit 0          
hr_web_1      bundle exec rails s -p 300 ...   Exit 1          
```

記述したら、`chmod +x bin/rubocop`で実行権限を付与するのを忘れないでください。

スクリプトの実行準備が整ったら、`docker-compose up -d`でコンテナを起動しておきましょう。

## プラグインの設定
[linter-rubocop](https://atom.io/packages/linter-rubocop)から`Install`ボタンを押して、プラグインをAtomにインストールしてください。

次に、AtomのLinter Rubocopの設定画面から、Command欄に`./bin/rubocop`と入力してください。

<img width="805" alt="rubocop.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234657/02f5f4df-d344-0ae6-0dc0-e5fbf98230fa.png">

これで設定は終わりです。

# まとめ
全てDocker内で完結できるとスッキリしていいですね。

因みに、いくつかRailsプロジェクトを掛け持ちしてると、あるプロジェクトではDocker使ってなくてローカルでRubocop使う場合もありますよね。そんな時はわざわざAtomの設定を変更しなくても、ラッパースクリプトの最後の行のコマンドをこのように変更すれば大丈夫です。

`rubocop $CMD_ARGS`

はい、単純にローカルにインストールした`rubocop`を実行してるだけですね。

それではDockerと過ごすRubocopライフを楽しんでください。
Flatツールのテンプレート一覧

# Flatツールにて提供されるテンプレートの一覧

# 今回の記事ではテンプレート一覧について一部のみ紹介致します。

>Cloud9

WEBでコード編集ができるIDEツールです。
コンソールも提供されているので、編集ツールとコンソールが両方使える便利なツールです。
これがテンプレートをインストールするだけで簡単に環境構築ができます。

参照サイト：https://www.sejuku.net/blog/385

![QS_20190816-004919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/1ce46f5f-f04f-be23-adeb-950341cc960c.png)

>Kodi

KodiはRaspberryPI環境で動画及び音楽ファイル再生が可能な便利なプログラムです。
RaspberryPIと直接モニター及びTVと繋げているならこれでいつでも外部入力を選択したら
KODIが既に起動されているので動画再生がすぐできる環境となります。
使い方については下記のサイトを参照してください。

参照サイト：https://kaciy-discovery.hatenablog.com/entry/2017/12/23/141957

![QS_20190816-005200.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/08d1eebe-a7d2-3202-4806-3e68ff9fe4c8.png)

>Chrome

このテンプレートをインストールするとTVがChromeTVになります。
Kodiと同じですが、RaspberryPIと直接繋げているなら外部入力を選択したらブラウザが実行されている状況です。
無線キーボードで色々検索またはYouTubeサイトで動画を見ることも可能です。
※重要なポイント！Kodi、Chromeコンテナーを片方だけ起動してください。

# その他テンプレート
![QS_20190816-002857.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/da3f37f3-4bb4-7d15-2724-00eb0b2ac3e7.png)
![QS_20190816-002908.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/b3f60b0e-bc38-f341-dec8-78ca39506f05.png)
![QS_20190816-002921.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/208b18c0-c7c7-aa44-5628-06455a351265.png)
![QS_20190816-002928.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/a6f6fb88-2bc8-7fc0-b29d-95561089ec85.png)
![QS_20190816-002936.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/0ce7ae56-2114-5329-ab08-fd9e33bd018a.png)
![QS_20190816-002945.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/d7cdd046-4987-913a-a3a8-3212ea25dac7.png)
![QS_20190816-002951.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/fd3e59fe-a321-1d5b-1fed-c50b40c1b835.png)
![QS_20190816-002957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/861f718a-3b36-c304-1df7-d30524270cb0.png)

>一言

個人的には凄く良いと思ったテンプレート（コンテナ）はCloud９とKodiです。

>公式サイト

http://flat.wednus.com/home