OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleAppEngineでサーバをSSL化する

# 概要
ReverseProxyをGAEで作成すると、既設のサーバを簡単にSSL対応にできる。
ここでいう簡単とは...
- サーバ証明書取得が不要
- httpサーバ(nginx/apache)の設定が不要
- （GCP上にプロジェクトを作成して）30分程度あればSSL化可能

# 経緯
Androidアプリを作成するチームから下記の困りごとを相談された。
「Android Pでアプリの動作確認をしていたら評価用サーバとの接続に問題が生じた。商用サーバでは問題ないんだけど...」

ここで、商用サーバはSSL化済み。評価用サーバは非SSL。

# 原因
[Android P で TLS のデフォルト化によるユーザー保護](https://developers-jp.googleblog.com/2018/05/protecting-users-with-tls-by-default-in.html)

上記のページに記載されている通り、Android PではアプリがアクセスするサイトがSSLでない場合、アクセスを拒否する模様。これはアプリが使用するWeb上のAPIだけでなくWebViewに表示するコンテンツも対象になる模様？

もちろん回避方法はあるけど、せっかく商用サーバがSSL化しているのに評価用サーバが非SSLのままなのはよろしくない。じゃ評価用サーバもサーバ証明書を取得するかというと事務手続きも面倒だ。費用がかかるなら決済も必要だし...

# 対策
GAEでReverse Proxyを立てることにした。
GCP上にプロジェクトを作って下記の２つのファイルを用意しデプロイするだけ。

app.yaml

```yaml
runtime: go112

handlers:
  - url: /.*
    script: auto
    secure: always
```

main.go

```go
package main

import (
	"context"
	"log"
	"net/http"
	"net/http/httputil"
	"os"
)

// TargetHost はhttps化する対象のホスト
var TargetHost = "your.host"

type myTransport struct {
	Transport http.RoundTripper
	Context   context.Context
}

func main() {
	http.HandleFunc("/", handleFunc)

	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
		log.Printf("Defaulting to port %s", port)
	}

	log.Printf("Listening on port %s", port)
	if err := http.ListenAndServe(":"+port, nil); err != nil {
		log.Fatal(err)
	}
}

func handleFunc(w http.ResponseWriter, r *http.Request) {
	ctx := context.Background()

	director := func(request *http.Request) {
		request.URL.Scheme = "http"
		request.URL.Host = TargetHost
	}
	client := http.DefaultClient
	transport := &myTransport{
		Transport: client.Transport,
		Context:   ctx,
	}
	rp := &httputil.ReverseProxy{
		Director:  director,
		Transport: transport,
	}
	rp.ServeHTTP(w, r)
}

func (t *myTransport) transport() http.RoundTripper {
	if t.Transport == nil {
		return http.DefaultTransport
	}
	return t.Transport
}

func (t *myTransport) RoundTrip(req *http.Request) (*http.Response, error) {
	return t.transport().RoundTrip(req)
}

```

main.go内のTargetHostに対象のhttpサイトを指定する。

以下のコマンドでデプロイ

```
gcloud app deploy --project [project-id]
```

上記のデプロイが完了したらブラウザに"https://[project-id].appspot.com"を入力してSSL化できているか確認する。
なお、プロジェクトの課金設定を変更して「非課金」にしても評価目的であれば耐えられるはず。

タイトルに「GoogleAppEngineでサーバをSSL化する」とか書いちゃったけど、主な対象としてはグローバルIPだけ取得して、ドメイン取得していない評価用サーバ等になります。
Web上のAPIなら上記で問題ないと思いますが、WebViewに表示するコンテンツの場合、追加でリンクを適切に修正しないといけないですね。

# 更新
2020/08/18
元々 Go1.9(appengine 1st gen)用に書いていたコードをGo1.12(appengine 2nd gen)用に改めました。
Laravel基礎（３）バリデーション

#バリデーション

コントローラーにvalidate_ruleとvalidateメソッド呼び出しを加えるだけで、送信データの検証ができます。（前回のコードを手直しします）

```app/Http/Controllers/PageController.php
・・（一部抜粋）・・

    public function post(Request $request) {
        $validate_rule = ['title' => 'required'];
        $this->validate($request, $validate_rule);
        return view('page.post',['title' => $request->title, 'body' => $request->body]);
    }

```
titleというフォームのデータは必須項目（required）とするバリデーションです。

index.blade.phpには次のようにバリデーション結果のメッセージを出すように書き加えます。

```index.blade.php
・・（一部抜粋）・・

<ul>
@foreach ($errors->all() as $error)
        <li>{{$error}}</li>
@endforeach
</ul>

```

これでtitleが空の送信で、バリデーションが働き、エラーメッセージが出ると思います。



ただこれだと、エラー時に入力値がクリアされますので、フォームのvalueに古い値を復元できる仕掛けをしておきます。

```index.blade.php
・・（一部抜粋）・・

TITLE:  <input type="text" name="title" value="{{old('title')}}">
BODY:   <input type="text" name="body" value="{{old('body')}}">

```



[Laravel基礎（４）データベースを使う＞＞](https://qiita.com/taka027/items/8d6ace7b61e157fa47c2)
PySide2でイベントをオーバーライドする

# はじめに
PySide2の各種ウィジェットには，あらかじめ動作予定のイベントが登録されている．例えば，マウスがウィジェットに乗っかった場合やクリックされた場合などが挙げられる．

これらのイベントは継承先のクラスで関数のオーバーライドをすることで，イベントに沿った動作を定義することができる．その定義の仕方を説明する．

## 簡単なソースコード
まずは，サンプルになる簡単なソースコードを載せる．

```python
from PySide2.QtWidgets import QVBoxLayout, QLabel

class NewTextLabel(QLabel):
    def __init__(self, text:str, parent:QVBoxLayout):
        super().__init__("<b>{0}</b>".format(text))
        self.text = text
        
        parent.addWidget(self)
    
    def enterEvent(self, event):
        self.setText("<b style='background-color: #00ff00;'>{0}</b>".format(self.text))
    
    def leaveEvent(self, event):
        self.setText("<b>{0}</b>".format(self.text))
```

`NewTextLabel`クラスは`QLabel`クラスを継承している．`QLabel`クラスの先では`enterEvent`と`leaveEvent`が定義されている．このソースコードでは，それらの関数をオーバーライドすることで，イベントが発生したときの動作を定義している．

各種ウィジェットにはこのようなイベントが既に定義されているので，自分好みのイベントがあればオーバーライドすればいい．

問題はイベントが定義されていなかった場合になる．この場合はシグナルにスロットを接続して，スロットからイベントを発生させるしかない．イベントはシグナルから`emit`を呼び出されて実行される．スロットもイベントも同じではないかと言えば同じように見える．正直，なぜイベントという名前をつけているのかわからない．

この仕組みがかなり厄介で，イベントとスロットの違いについてもわかりやすく説明したサイトもない．なんとなく，コードを読んでそんなもんか，と理解するしかないのが現状なので，より多くのPySideユーザがQiitaに投稿すればデスクトップ開発も賑わうと思う．
IAM各要素の役割

AWS認定試験のため、基本的な単語とそれらの関係性をまとめた。

## IAMとは
各サービスへのアクセス制御を行うサービス
利用者から各サービスへのアクセス制御だけでなく、
EC2やLambdaから他サービスへのアクセス制御を行うことも可能

## 用語
#### ルートアカウント
- AWS登録時のアカウントのこと
- すべてのサービスにアクセスでき、アクセス制御できない

#### ポリシー
- 各サービスへのアクセス可否を記述したもの
- ユーザー、グループ、ロールにアタッチできる
- ポリシーをアタッチすることでサービスへのアクセスを制限することが可能

#### ユーザー
- AWS利用者がサインイン時に利用するアカウント
- ユーザーにアタッチされたポリシーに則って利用者はサービスへのアクセス権限を得る
- 複数のポリシーをアタッチできる

#### グループ
- ユーザーの集合
- グループにアタッチされたポリシーに則ってグループ内のユーザーはサービスへのアクセス権限を得る
- グループにユーザーを追加することで複数ユーザーにまとめてポリシーを適用できる
- 複数のポリシーをアタッチできる

#### ロール
- EC2等に付与するポリシーをまとめたもの
- ロールにアタッチされたポリシーに則ってEC2等は他サービスへのアクセス権限を得る
- 複数のポリシーをアタッチできる
- EC2にアタッチできるロールは1つだけ
- サービスにアタッチする以外にも利用方法がある（今回は省略）

##　構成
ルートアカウント配下に以下のように構成される。（例）
　ルートアカウント
　　┠ポリシー
　　┃　├ポリシーA
　　┃　│　├サービスaへのアクセス許可
　　┃　│　└サービスbへのアクセス許可
　　┃　├ポリシーB
　　┃　│　├サービスbへのアクセス**拒否**
　　┃　│　├サービスcへのアクセス**拒否**
　　┃　│　└サービスdへのアクセス許可
　　┃　├ポリシーC
　　┃　│　└...
　　┃　├ポリシーD
　　┃　│　└...
　　┃　├ポリシーE
　　┃　│　└...
　　┃　├ポリシーF
　　┃　│　└...
　　┃　└...
　　┠ユーザー
　　┃　├ユーザーⅠ ← ポリシーA
　　┃　├ユーザーⅡ ← ポリシーB
　　┃　├ユーザーⅢ ← ポリシーB、C
　　┃　├ユーザーⅣ ← ポリシーD
　　┃　└...
　　┠グループ
　　┃　├グループⅠ ← ポリシーA
　　┃　│　↑ユーザーⅠ
　　┃　│　↑ユーザーⅡ
　　┃　├グループⅡ ← ポリシーD
　　┃　│　↑ユーザーⅢ
　　┃　└...
　　┗ロール
　　　　├ロールⅠ ← ポリシーE
　　　　├ロールⅡ ← ポリシーF
　　　　└...

ロールは以下のように利用される。（例）
　EC2
　　┠インスタンスA ← ロールⅠ
　　┠インスタンスB ← ロールⅠ
　　┗インスタンスC ← ロールⅡ

上記の構成の場合、グループⅠに属するユーザーⅡは
ポリシーAおよびBが適用され、アクセス権は以下となる。

* サービスaおよびdのみアクセス可能（サービスb、cおよび他サービスもアクセス不可）
* サービスbへのアクセス許可と拒否が与えられた場合、拒否が優先的に適用される

|サービス名|アクセス可否|
|:----------:|:------------:|
|サービスa|許可|
|サービスb|**拒否**|
|サービスc|**拒否**|
|サービスd|許可|


上記以外にも他AWSアカウントへのアタッチとかIDプロバイダーとかあるので今後理解していきたい
Python のリスト内包記法でズンドコしてみよう！

# リスト内包記法でズンドコしたい！
最近お仕事で毎日 Python を書いているのですが、リスト内包記法に慣れてきたのでよく使ってます
ある日ふとズンドコキヨシのことを思い出し、リスト内包記法でズンドコを簡潔に書けたら嬉しいなと思いやってみました

もうだいぶ古くなってしまったネタですがよく知らない方はこちらをご参照くださいませ
[ズンドコキヨシまとめ](https://qiita.com/shunsugai@github/items/971a15461de29563bf90)

# やりたいこと
ズンドコキヨシの仕様を改めて確認すると、以下の動作を満たせばよいということです

- `ズン` or `ドコ` をランダムに出力する
- 直近5回の出力が `'ズン', 'ズン', 'ズン', 'ズン', 'ドコ'` の場合に `キ・ヨ・シ！` を返して処理を終了する

これをリスト内包記法でいい感じにズンドコできないかなーと
イメージとしては以下のようなコードでズンドコが定義できたらなーと夢を持ちました

``` python
[x for x in zundoko()]
```

そして上記のコードが評価されるとこのようなリストが生成されて欲しいです

``` python
['ズン', 'ドコ', 'ズン', 'ズン', 'ズン', 'ズン', 'ズン', 'ドコ', 'キ・ヨ・シ！']
```


# Level1. ジェネレーターでズンドコ
どうやらジェネレーターを上手く使えばできそうだということがわかったので、これまでジェネレーターについてあまり詳しく知らなかったのですが調べながらやってみました

まずできたのが以下のようなコードです

``` python
import random

def zundoko():
    history = []

    while True:
        history.append(random.choice(['ズン', 'ドコ']))
        yield history[-1]
        if history[-5:] == ['ズン', 'ズン', 'ズン', 'ズン', 'ドコ']:
            yield 'キ・ヨ・シ！'
            break

print([x for x in zundoko()])
```

非常に基本的なジェネレーターです


# Level2. ジェネレーター内で再帰する
Level1 のものだと `while True` が入るところがちょっと引っかかり再帰にしたいなーと思いました
そして考えたのが以下のコードです

``` python
import random

def zundoko(history=None):
    if history is None:
        history = []

    if history[-5:] == ['ズン', 'ズン', 'ズン', 'ズン', 'ドコ']:
        yield 'キ・ヨ・シ！'
        return

    history.append(random.choice(['ズン', 'ドコ']))
    yield history[-1]
    yield from zundoko(history)

print([x for x in zundoko()])
```

# Level3. 生成と判定を別にする
Level2 のものは値の生成とズンドコ判定が同じジェネレーターの中にあるので、そこを切り離したいなーと思いました
そして考えたのが以下のコードです

``` python
import random

def zundoko_gen():
    yield random.choice(['ズン', 'ドコ'])
    yield from zundoko_gen()

def zundoko():
    history = []
    for x in zundoko_gen():
        history.append(x)
        yield history[-1]
        if history[-5:] == ['ズン', 'ズン', 'ズン', 'ズン', 'ドコ']:
            yield 'キ・ヨ・シ！'
            break

print([x for x in zundoko()])
```

# Level4. 更に過去の window を生成する処理を別にする
(※更によい新たなパターンをコメントを頂き追記しました！)

Level3 では過去に生成されたズンドコを保持する処理も混ざってしまっているところが気持ち悪かったのですが、指定した個数分の window を生成するジェネレーターを間に挟むことで、より各々のジェネレータの役割が明確になりシンプルな構成にすることができました

``` python
import random

def zundoko_stream():
    """
    無限に 'ズン' or 'ドコ' を生成する
    """
    yield random.choice(['ズン', 'ドコ'])
    yield from zundoko_stream()


def zundoko_window(length):
    """
    生成されたズンドコの直近 length 個分の window を生成する
    """
    history = []
    for zundoko_val in zundoko_stream():
        history += [zundoko_val]
        history = history[-length:]
        yield history


def zundoko(pattern=['ズン'] * 4 + ['ドコ']):
    for window in zundoko_window(len(pattern)):
        yield window[-1]
        if window == pattern:
            yield 'キ・ヨ・シ！'
            break

print([x for x in zundoko()])
```

`ズンドコを無限に生成するストリーム` -> `任意の数だけ切り取る window` -> `window に対するパターンマッチ` というより汎用的なズンドコストリーム処理になりましたね！

# まとめ
リスト内包記法でズンドコというより、ジェネレーターでズンドコになってしまいました
ジェネレーターは奥が深いですね

なんかもっとスッキリできそうな感じがしますが、現状の僕の理解度だとこの程度です
使いこなすにはまだまだ修行が必要だと感じました

みんなもジェネレーターでリスト内包記法しよう！
WindowsにてVisual Studio Codeからcommitするときにgpg署名する

# はじめに

ながらくWindowsにてVisual Studio Codeからcommitするときにgpg署名するのは無理だと思っていました。

というのはなぜか

[Add support for signing commits with GPG · Issue #5065 · Microsoft/vscode#issuecomment-207960831](https://github.com/Microsoft/vscode/issues/5065#issuecomment-207960831)

```bash
echo 'no-tty' >> ~/.gnupg/gpg.conf
```

する方法がうまく行かなかったからです。

# 前提

- Windowsを使用
- Visual Studio Codeがインストールされている
- git for Windowsがインストールされている
- git for Windowsでgpg署名付きcommitができる

gpg署名付きcommitができる状態にない場合は
[GitHubで署名されたコミットにバッジが表示されるようになったので設定してみる](https://qiita.com/prince_0203/items/ef0e12f2f6d150ff0485)
を参照してください

# 手順

## git for Windows

```bash
git config --global commit.gpgsign true
```

`~/.gnupg/gpg-agent.conf`に

```plain:~/.gnupg/gpg-agent.conf
default-cache-ttl 46000
pinentry-program /usr/bin/pinentry
allow-preset-passphrase
```

を追記します。

## Visual Studio Code

設定ファイルに

```json
{
	"git.enableCommitSigning": true,
}
```

を追記します

# 参照

- https://github.com/Microsoft/vscode/issues/5065
- https://github.com/Microsoft/vscode/issues/43809
- https://github.com/Microsoft/vscode/issues/46412
- https://risacan.net/use-gpg-sign-with-vscode/
Pythonでのマルチスレッド処理

# マルチスレッド処理とは
- 特定の操作をスレッドに分割し、各スレッドにて並行で処理を実行させる

## マルチスレッド処理をしないと
- 例えばこのようなコード

```python
# -*- coding: utf-8 -*-
import time

def myfunc(i):
   
    time.sleep(10)
    print("execute:" + str(i))

def main():
    
    for i in range(10):
        print("call myfunc:" + str(i))
        myfunc(i)
     
if __name__ == "__main__":
    main()  
```
- myfuncは時間がかかる関数を想定しているのでsleepを入れています
- 実行結果は以下の通り

```
call myfunc:0
execute:0
call myfunc:1
execute:1
call myfunc:2
execute:2
call myfunc:3
execute:3
call myfunc:4
execute:4
call myfunc:5
execute:5
call myfunc:6
execute:6
call myfunc:7
execute:7
call myfunc:8
execute:8
call myfunc:9
execute:9
```
- 目標はmyfuncの終了を待たずして次々にmyfuncの実行を行うこと

# 実装
## threadingモジュール
- Thread オブジェクトを使用する

### Threadの代表的な引数
- target 
    - 実行する関数名を指定
- name 
    - スレッドに付与する名前
- args 
    - targetで指定した関数に渡す引数タプル
## コード
- mainのfor文内を下記のように変更

```python
 for i  in range(10):        
        
        thread = threading.Thread(target=myfunc, args=([i]))
        thread.start()
```

実行結果は下記の通り

```
call myfunc:0
call myfunc:1
call myfunc:2
call myfunc:3
call myfunc:4
call myfunc:5
call myfunc:6
call myfunc:7
call myfunc:8
call myfunc:9

execute:0
execute:5
execute:8
execute:3
execute:6
execute:4
execute:7
execute:2
execute:1
execute:9
```

- executeの出力が同時に行われます
Juliaをはじめてみる

　Julia言語が正式リリースされたことで早速使ってみました。Juliaは科学計算に特化した言語で2009年に開発が始まり、2012年に初公開されてから、やっと10年の月日を経て2018年8月に1.0がリリースされたものです。MITの4人の研究者が開発をはじめ、科学計算に焦点を当てて開発されていますが、あくまでも汎用言語です。やはりMITで様々なプロジェクトに使用されてきたようです。例えばWebフレームワークなどのライブラリもあります。

　そうすると当然、Pythonとは大きく領域が被りますが、julia言語の差別化はズバリ速度です。ザックリ言ってC言語より2倍遅く（10倍や100倍ではない）、Pythonより10倍、30倍速いということが言われています。kerasを使って1日2日かかっていた学習を数時間で終わらせることができるかも、という期待が胸を横切ります。はじめから機械学習は言語開発のターゲットになっているので、FluxやKnet、Mochaなどのフレームワークが存在します。TensorFlowのラッパーもあります。その他の科学計算のためのライブラリも充実しているようなので、勉強のお供によいですね。


**「Julia 1.0」がリリース--急成長を見せるMIT開発のプログラミング言語**
https://japan.techrepublic.com/article/35125276.htm



#インストール

　Windows10のパッケージ「[Current stable release (v1.0.1)](https://julialang.org/downloads/)」をダウンロードしインストールします。jupyter notebook(anaconda)は既にインストール済みなので、その環境にマージします。


　Juliaのインストールが終わったら、環境変数のPathに追加します。
C:\Users\user123\AppData\Local\Julia-1.0.1\bin

（jupyter notebookを全然使いこなしてませんが、今回はjupyterlabの方を使います。）

　以下の操作でAnacondaを更新します。（jupyterlabも最新になる）
Anaconda Promtを「管理者として実行」（右クリック）し、以下のコマンドを打つ

```
conda update --all
```

　IJuliaをインストールするために、コマンドプロンプトからjuliaを起動して以下を実行します。これでjupyterにjuliaが追加されます。

```
using Pkg
Pkg.add("IJulia")
using IJulia
```


　juliaの追加を確認するために、Anaconda Promtを起動してjupyter kernelspec listを打ちます。

```
(base) C:\Users\user123>jupyter kernelspec list
Available kernels:
  julia-1.0    C:\Users\user123\AppData\Roaming\jupyter\kernels\julia-1.0
  python3      C:\ProgramData\Anaconda3\share\jupyter\kernels\python3
```


#２．動作確認

jupyter lab で起動し、動作を確認します。


###動作確認 Plots

　以下のようにPlotsのみをインストールすることによって、グラフを描くことができます。

```
import Pkg
Pkg.add("Plots")
using Plots
gr()
plot(randn(100,3))
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61915/3a6f1266-553a-be9d-0ca9-ff1829b1092d.png)



###動作確認 Statistics

　標準ライブラリStatisticsを使って、標準偏差（**std**)や分散(**var**)の関数が使えます。確認してみましょう。

```
using Statistics
mean(1:20)
a=[71,80,89,80]
b=[77,80,83,80]
std(a)
7.3484692283495345
std(b)
2.449489742783178
var(a)
54.0
var(b)
6.0
```

###動作確認 2項分布

　簡単な2項分布を計算してみます。

　今読んでいる「確率論入門」（ちくま学芸文庫、赤攝也）の例題を計算してみましょう。左利きの人が1%いる集団から1人選び、右利きか左利きかをみる。それを200回繰り返したときに4人以上が左利きである確率を計算する。2項分布を使って以下のように計算できます。

```math
\sum_{i=4}^{200}
\begin{pmatrix} 200 \\i \end{pmatrix}
\left(\frac{1}{100}\right)^i
\left(\frac{99}{100}\right)^{200-i}
```



Julia言語のBaseのMathematicsカテゴリの**binomial**関数を使います。BaseなのでMathematicsカテゴリの関数は特に何もしなくとも利用できます。
Mathematics
https://docs.julialang.org/en/v1/base/math/



```julia
function mybinomial(k, n, p)
    s = 0.0
    for i in k:n
        s += binomial(n,i)*(p)^i*(1-p)^(n-i)
    end
    s
end

mybinomial(4, big(200), big(1/100))
```

　0.141965965....というような値になります。参考書には0.143,,,とあり少し違うの気になります。PCの精度のちがい？

　mybinomial(4, 200, 1/100)で呼び出すとoverflowエラーとなります。big(200), big(1/100)とすると、Int64ではなくBigIntでの計算に切り替わりoverflowに陥りません。


　同じ問題を、Distributionsライブラリを使えば一発で計算できます。

```julia
using Distributions
d= Distributions.Binomial(big(200), big(1/100))
sum(pdf(d, 4:200))
0.14196596555525592
```

プロットしてみましょう。

```julia
plot(4:20, pdf(d,4:20), seriestype=:scatter)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61915/00d6b51d-fa7a-ca0b-7588-d2a80139c69b.png)


　これからも確率統計の勉強のお供にjuliaを活用してきたいと思います。


以上です。
「rails generate controller(rails g controller)」をする時に無駄なhelperやassetsを作らない方法

「rails generate controller」 で controller を生成すると、必要の無い helper、 coffee、stylesheetファイルが一緒に生成されて、それを後から消すのって非常に面倒ですよね。
かといって

```terminal
$ rails generate controller users --no-helper --no-assets
```

のようにコントローラを作るたびにオプションを後ろにつけるのは面倒。しかもこんなの絶対いつか忘れます。（笑）

<b>でも、実はオプションを付け足さずにデフォルトでhelperなどを付け足さないコードがあるんです！
それがこれです。
</b>

```ruby:config/application.rb 
module App
  class Application < Rails::Application
   config.generators do |g|
     g.helper false
     g.assets false
   end
  end
end
```

こんな風に「rails generate controller」をする時に生成したくないものがあったら、config/application.rbにコードを書いておく！

これでデフォルトでhelperやassetsが生成されなくなりました:thumbsup:
是非、試してみてください！！
AWS勉強 -ドメイン名と名前解決-


## ドメイン名と名前解決

前回行ったようにWebブラウザにパブリックIPアドレスを入力することでWebサイトにアクセスできる.
しかし一般的には直接IPアドレスを指定してWebサイトにアクセスすることはほとんどない.
ほとんどの場合は「www.example.co.jp」などのドメイン名を用いてアクセスするはずだ.
ではドメイン名を利用するにはどのようにすれば良いのか.

### ドメイン,DNSについて

https://www.nic.ad.jp/ja/dom/system.html

上記を参考にすると知識面ではOKだと思う.

### DNSサーバーを構成する.

#### インスタンスの名前解決を有効にする

<img width="866" alt="スクリーンショット 2018-10-14 15.03.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/1abe5b41-b721-2664-df41-313af24f7dcf.png">


からの,


<img width="858" alt="スクリーンショット 2018-10-14 15.08.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/2954b4fb-c038-391d-6de7-f595e90336a4.png">

からの,

<img width="855" alt="スクリーンショット 2018-10-14 15.10.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/6db3e006-74c7-e908-d331-b93cec878d64.png">

からの,

<img width="857" alt="スクリーンショット 2018-10-14 15.21.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/7143581b-f87d-2440-d808-e61ba7175624.png">

最後に確認して見る

<img width="1280" alt="スクリーンショット 2018-10-14 15.24.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/239d711c-da3f-7cf9-dbde-e15ead932968.png">

### nslookupコマンドでDNSサーバーの動きを見る

いくつかのコマンドによりDNSサーバーがどのように名前解決しているのかを知ることができる.
もっともよく使われているコマンドが**nslookup**コマンドだ.

#### クライアントからnslookupする

MACでやります.

次のように入力する

```shell
$ nslookup nslookup ec2-18-179-47-97.ap-northeast-1.compute.amazonaws.com
```

<img width="769" alt="スクリーンショット 2018-10-14 15.37.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/7f81bbf6-2b22-0d3f-6db6-321c5c33a41c.png">

こんな感じになる.

##### 逆引きをしてみる

```shell
$ nslookup 18.179.47.97
```

<img width="661" alt="スクリーンショット 2018-10-14 15.39.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/c4fb9606-6396-c174-1d78-e1148a176e94.png">

#### サーバー側からnslookupコマンドを実行して見る

SSHでログインしてから次のコマンドを打つ.

```shell
$ nslookup www.nikkeibp.co.jp
```

<img width="386" alt="スクリーンショット 2018-10-14 15.42.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/9632ec48-b580-1799-8cc6-81b6d6098e17.png">

これでこのインスタンスはIPアドレス「10.0.0.2」をもつDNSサーバーを使用して名前解決していることがわかる.

### 感想

DNSについて理解が深まりました.
新しいコマンドも出てきたので,覚えるようにします!
Dockerに関する知識まとめ

・そもそもDockerとは…
　　他のプロセスを実施しつつ、新たな仮想環境を作ってくれるよってやつ

Docker engineをスタートさせると、仮想環境である「コンテナ」が作動し始める

コンテナ同士はそれぞれ独立した環境であるため、互いに関与しあうことはない

・セットアップに必要なもの
　　Dockerfileとdocker-compose.ymlの2種類。
後者に関しては、コンテナ間で連携させたい際に設定する必要がある。

・代表的なコマンド
　 ◎docker-compose build
     Dockerfileを実行する

　 ◎docker-compose up
     docker-compose.ymlで定義した設定を実行

   ◎docker-compose down
      docker-compose.ymlで定義した設定を終了する

　 ◎docker images
      imageを見る

　 ◎docker ps
コンテナの実行状況を確かめる

　 ◎docker rm
　　　コンテナの削除

・Dockerfileの書き方
　

　dockerfileのコマンド

◎FROM
  ベースイメージを指定する
◎MAINTAINER
　イメージ作成者を書く
◎RUN
  コマンドを実行
　パッケージをインストールする時なんかによく使う
◎ADD
　指定したファイルをコンテナ内にコピー
　ＵＲＬの指定ができる
◎WORKDIR
  作業ディレクトリを変える
コルタナを無効にする

# 管理者権限で PowerShell を起動して以下を実行

## オフにする

```powershell
sl HKLM:\SOFTWARE\Policies\Microsoft\Windows; ni 'Windows Search'; New-ItemProperty 'Windows Search' AllowCortana -Type Dword -V 0
```

## 再度オンにする

```powershell
Set-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Search' AllowCortana 1
```

# 参考
https://www.softantenna.com/wp/tips/windows-10-disable-cortana/
NodeJSからLaravel移行時につまづいた点

#1. ajax利用時にCSRFトークン利用が必須

下記が該当Issue
https://stackoverflow.com/questions/46466167/laravel-5-5-ajax-call-419-unknown-status

bladeファイルでCSRFトークンを生成し、ajax利用するJSファイルでその値をヘッダに付加する必要がある.


```hoge.blade.php
{{--  LaravelでajaxするときにCSRFトークン生成が必須  --}}
<meta name="csrf-token" content="{{ csrf_token() }}">
```

```hoge.js
$.ajaxSetup({
    headers: {
      'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
  });
```

#他の点は見つけ次第update予定
Pythonで再帰フィボナッチのメモ化

```python
# -*- coding: utf-8 -*-
def fib(n):
    """フィボナッチ数列"""
    if n <= 1:
        return n
    return fib(n-1) + fib(n-2)

def fib_memo(n):
    """メモ化フィボナッチ"""
    memo = [0]*(n+1)

    def _fib(n):
        if n <= 1:
            return n
        if memo[n] != 0:
            return memo[n]
        memo[n] = _fib(n-1) + _fib(n-2)
        return memo[n]

    return _fib(n)
```

# 時間計測

```python
import time

def do_fib():
    start = time.time()
    print(fib(50))
    stop = time.time()
    print("elapsed: {}".format(stop - start))

def do_fib_memo():
    start = time.time()
    print(fib_memo(50))
    stop = time.time()
    print("elapsed: {}".format(stop - start))

if __name__ == '__main__':
    do_fib()
    do_fib_memo()
```

```terminal:実行結果
12586269025
elapsed: 3211.8407917022705
12586269025
elapsed: 0.0009133815765380859
```
プログラマのための圏論勉強会の予習

[プログラマのための圏論勉強会](https://cat4pg.connpass.com/event/100728/)のために予習中。

[iOSDC Japan 2018 「圏論とSwiftへの応用」発表スライドメモ](https://qiita.com/inamiy/items/3e0c10d5eaf234b41c3d)にある動画やスライド、記事を見ながら、丸と矢印を書いて頭をひねっていました。

発表の途中、「自然変換」までですが、読んでるだけではさっぱり分からない
→動画を見つつ、「みんなもここで？？？ってなったんだ」と安心して
→手書きでノートに丸と矢印を書きまくって、なんだか理解できたような気がして
→発表資料のswiftのコードをコピって真似してこねくり回して、やっと腑に落ちた
って感じでした。

2018/10/15追記： **ここで書いたコード Setを関手としてやっていますが、Setは関手にならないとの指摘をもらいました。なのでコードとしては動くけど間違ったコードになっています。**


```swift:
import Foundation

// 「iOSDC Japan 2018 「圏論とSwiftへの応用」発表スライドメモ」を参考
// https://qiita.com/inamiy/items/3e0c10d5eaf234b41c3d

// 恒等射
func id<A>(_ a:A)->A {
    return a
}

// 関数の合成
infix operator ∘
func ∘ <A,B,C>(_ g:@escaping((B) -> C), _ f: @escaping((A) -> B)) -> ((A) -> C) {
    return { g(f($0)) }
}

// 関数の合成のお試し
func count(_ s:String)->Int {
    return s.count
}
func isEven(_ i:Int)->Bool {
    return i%2 == 0
}

let 合成関数 = isEven ∘ count
print( 合成関数("hoge") )  // 4文字だからtrueになる
print( 合成関数("hoge2") ) // 5文字だからfalseになる

print( (count ∘ id)("hoge"))  // どっちも4になる
print( (id ∘ count)("hoge"))  // = 「結合律」


// 射: StringからInt(文字数カウント)
func f(_ s:String)->Int {
    return s.count
}

// 関手F: Arrayで包む
func F<A,B>(_ f:@escaping((A)->B)) -> (Array<A>) -> Array<B> {
    return {arr in
        arr.map{f($0)}
    }
}
// 関手G: Setで包む ※ここ間違っている。 Setは関手にならない。※
func G<A,B>(_ f:@escaping((A)->B)) -> (Set<A>) -> Set<B> {
    return {set in
        Set(set.map{f($0)})
    }
}

// 自然変換alpha: ArrayからSetに変換
func alpha<T>(_ a:Array<T>)->Set<T> {
    return Set(a)
}
// (alphaA,alphaBは型を指定しているだけで、なくても行けた)
func alphaA(_ a:Array<String>)->Set<String>{
    return alpha(a)
}
func alphaB(_ a:Array<Int>)->Set<Int> {
    return alpha(a)
}

print((alphaB ∘ F(f))(["hoge","3","hehehe"]))  // 上と下は同じ結果を返しているけど、偶然同じ順番になっているだけ。
print((G(f) ∘ alphaA)(["hoge","3","hehehe"]))  // 

print(alphaB(F(f)(["hoge","3","hehehe"])))
print(G(f)(alphaA(["hoge","3","hehehe"])))

```

まだまだ先は長そうです。
kotlin + SparkFrameWorkの環境構築

## 概要
学習用に環境を作ってみたのでメモする

## プロジェクト作成
IntelliJ IDEAを利用する。

### IntelliJ IDEA起動
「Create New Project」を選択する。
![step01.png](https://qiita-image-store.s3.amazonaws.com/0/142279/add85832-87e2-0f94-c0b5-8ba067237069.png)

### Gradleとkotlinの選択
左のメニューから「Gradle」を選択し、「Kotlin(java)」を選択して「Next」ボタンを押す。
![step02.png](https://qiita-image-store.s3.amazonaws.com/0/142279/73f3f795-3578-33ce-5177-066c5deec2ba.png)

### ArtifactId入力
とりあえず、hogeと入力して「Next」ボタンを押す。
![step03.png](https://qiita-image-store.s3.amazonaws.com/0/142279/c4bd1a3a-d65f-d27b-d56f-93eac42d629c.png)

### Gradle JVMの設定確認
問題なければ、そのまま「Next」ボタンを押す。
![step04.png](https://qiita-image-store.s3.amazonaws.com/0/142279/8a427680-7995-f3c5-e41f-5fb22be7ce93.png)

### プロジェクト名とインストール先の確認
問題なければ、そのまま「Finish」ボタンを押す。
![step05.png](https://qiita-image-store.s3.amazonaws.com/0/142279/3acc908c-ebfc-33f3-88f3-dcdfae467a36.png)

## ファイル構成
下記のようなファイル構成になっているようです。

```:ファイル構成
├ .gradle
├ .idea
├ gradle
│  └ wrapper
│    ├ gradle-wrapper.jar
│    └ gradle-wrapper.properties
├ out
├ src
│  ├ main
│  │  ├ java
│  │  ├ kotlin               <- kotlinのコード
│  │  └ resources
│  └ test
├ build.gradle               <- gradleのbuild設定
├ gradlew
├ gradlew.bat
└ settings.gradle
```

## spark-frameworkインストール
build.gradleの「dependencies」に下記を追記する。

```:build.gradle
...
dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    compile 'com.sparkjava:spark-core:2.6.0'          <- ここ追加
}
...
```

このままでも起動できるが、下記のようなエラーが警告が表示される。

```
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
```
どうやら、SLF4Jライブラリと依存関係のあるようなので、それも追加する。

## SLF4Jインストール
build.gradleの「dependencies」に下記を追記する。

```:build.gradle
...
dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    compile 'org.slf4j:slf4j-log4j12:1.7.21'          <- ここ追加
    compile 'com.sparkjava:spark-core:2.6.0'
}
...
```

## プログラム設置
とりあえず、アクセスできうように下記コードを設置する。

```kotlin:./src/main/kotlin/main.kt
import spark.Spark.get

fun main(args: Array<String>) {
    get("/hello") { request, response ->
        "Hello, Kotlin"
    }
}
```

## 起動
「Run」メニューから「Run...」で「Main.kt」を選択して実行する。
![step06.png](https://qiita-image-store.s3.amazonaws.com/0/142279/84f4d74c-8c25-d374-498e-ea39bbebb8cb.png)
ブラウザで下記にアクセスして閲覧OK
![step07.png](https://qiita-image-store.s3.amazonaws.com/0/142279/70fdf63b-c255-2f6a-af41-b3efe08c5473.png)

以上

## 参考サイト
* [Gradle依存関係がSLF4Jを使っているときのエラー対処法](https://qiita.com/m4kvn/items/3b68e6879672a4202e3d)
* [Javaのプロジェクトで使う.gitignore](https://qiita.com/tora470/items/d61c3fcb261e48edc996)
Android Studio 環境構築(2)  Emulatorで"Hello World" (arm版)

#目的
Android Studio Emulator上でのアプリ実行(arm版)

環境：
 * Android Studio 3.1.4
 * Windows10 Home 64bit

## 【準備】インストール、プロジェクト作成
[Android Studio 環境構築(1) 実機で"Hello World" ](https://qiita.com/oinu-poppo/items/73081fb69fe8ebf22428)　の状態からスタート

## 【1】Android Virtual Device の設定 
[Android Emulator 上でアプリを実行する](https://developer.android.com/studio/run/emulator?hl=ja)の手順を実行

1. AVD Manegerの起動
![00_AMDmaneger.png](https://qiita-image-store.s3.amazonaws.com/0/298713/cf2cdf6b-5470-e2d8-ff08-88f30c0c2345.png)

2. Virtual Deviceの生成
AMD Manageruウィンドウで [Create Virtual Device...] 
Choose a device definietion： [Nexus 5x]
Select a system image： [Other Images]タブの[Nougat(abi armeabi-v7a)]
★業務システムと合わせるためARM版にした。通常は[Recommended]タブ内でよい

## 【2】ABI設定

ARM版にするためbuild.gragle(Module:app)を変更　(ref: [Build multiple APKs](https://developer.android.com/studio/build/configure-apk-splits))

```
android {
...
splits {
    abi {
        reset()
        include "x86", "armeabi-v7a", "armeabi-v8a", "x86_64"
    }
}
```
## 【3】実行

1. Android Studioで[Project] ウィンドウの [app] モジュールをクリックしてから[Run]
2.  [Select Deployment Target]ウィンドウで Virtual Deviceを選択

★PC上のエミュレータに"Hello World!" が表示された

## 【MEMO】
【1】ABI設定が適切でないと動作しない。エミュレータ上にエラーウィンドウが表示された。

![01_Run_error2.PNG](https://qiita-image-store.s3.amazonaws.com/0/298713/b14246f7-f174-2d12-34d5-d316feae67bc.png)
ATOMプラグインgoto-definitionが遅い

# goto-definitionとは
https://atom.io/packages/goto-definition
プロジェクト内のクラスや関数の定言場所に飛ぶことができるプラグインです。
Eclipseなどでは標準で入ってたきがします。

右クリックで```Goto Definition```または
Windowsでは ```Ctrl + Alt + Enter```
Macでは ```Alt+Cmd+Enter```
で利用できます。

# 表示されるまで（検索？）が遅い
![old.gif](https://qiita-image-store.s3.amazonaws.com/0/115485/8f3e23f7-7ef7-fb6e-528e-d5d4cdc06d38.gif)

これくらいであれば表示するまでのストレスは少ないのですが、実際に仕事で使ってるともっと遅くてイライラしてました。

# パッケージの設定をみる
![setting.PNG](https://qiita-image-store.s3.amazonaws.com/0/115485/6ec111fe-0a7e-d052-310e-b1a5f08026fd.png)

ある時ふとgoto-definitionの設定を開くと、Performance Modeという項目を見つけた。
![errar.png](https://qiita-image-store.s3.amazonaws.com/0/115485/43cceaef-d0f7-65bd-d01f-d400c0326f32.png)
チェックを入れて試してみると```ripgrep```をインストールしろと出た。


ripgrepのインストール方法は[こちら](https://github.com/BurntSushi/ripgrep)のInstallationを確認してください。

```
> choco install ripgrep
```
私はWindowだったのでChocolateyでインストールしました。
MACの方はbrewでインストールできるみたいです。

# 早くなった
![new.gif](https://qiita-image-store.s3.amazonaws.com/0/115485/89c1a713-f2cd-d978-7a83-8f0d2880e60f.gif)
めちゃめちゃ早くなりました。なんでいままで気づかなかったんだろうってくらい快適です。
これでストレスなく使うことができます！

READMEにはちゃんと書いてあったので新しいプラグインを入れたときはちゃんと読まないとだめですね・・・。
みなさんもよいATOMライフを！
Laravel基礎（１）ルーティングとビュー

ここではLaravelの環境設定後、初めてLaravelを学ぶ人向けに説明します。
#プロジェクト作成

`laravel new`によりプロジェクトを作成します。プロジェクト名は自由ですが、これから作るWebサービスの内容が分かる命名をします。（今回は勉強用でdemoで始まる命名にしています）

```sh
laravel new demoApp
cd demoApp
```
コマンド投入後出来上がるディレクトリに移動し、内容を確認します。

app・・・・・・Webアプリケーションのプログラム本体の置き場所。開発はここが中心。
bootstrap・・・起動の最初に行われる処理が入っている。
database・・・データベース関連のファイルが入っている。
resources・・・ビュー(Blade)など画面に関するファイルが入っている。開発はここも対象。
tests・・・・・ユニットテストに関するファイルが入っている。
config・・・・・設定に関するファイルが入っている。
public・・・・・JS/CSSなどのWeb公開ファイルが入っている。
routes・・・・・どの処理を呼び出すかのルーティング情報が入っている。開発はここも対象。
storage・・・・一時ファイルやログが置かれる場所。
vendor・・・・フレームワーク本体や他のパッケージの置き場所。

appの中はさらに下記のようなフォルダがあります。

Console・・・コンソールプログラムの置き場所。
Exceptions・・エラー発生時の処理を行うプログラムの置き場所。
Http・・・・・Webアプリの処理を行うプログラムの置き場所。（開発対象）
Providers・・・各種の処理を提供するサービスプロバイダーのプログラムの置き場所。

なお、開発中のアプリケーションのサーバ起動は

```sh
php artisan serve --port 8080
```
です。ポート番号はデフォルトでは8000です。Cloud9の環境ではセキュリティの関係でポート番号を8080にする必要があります。ご注意ください。
ちなみにartisanはフランス語で「職人」という意味で、多分、アーチサンと読みます。Laravelの定番コマンドと覚えておいてください。

最初にやることとしてアプリケーションのタイムゾーンやロケール（言語設定）で、次のように設定します。

```config/app.php
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
```
#ルーティング

ルーティングはURLアドレスに対しどの処理を呼び出すかの道すじを決めています。
具体的には`routes/web.php`を下記のように書いて動きを確認してみましょう。

```routes/web.php
Route::get('/', function () {
	return "This is demoApp";
//    return view('welcome');
});
```
サーバを起動し、ブラウザで確認すると、画面に`demoApp`と表示されたと思います。

つまり`Route::get`メソッドを使って

`Route::get(URLアドレス , 表示する処理)`

と書くことで、アドレスからどの処理を呼ぶかのルーティングを定義しています。
（GETというHTTP通信要求でURLに対して、返すべき内容を決めています）

デフォルトで記述されていたコードのRoute::getメソッドの第二引数は
`function () {
   return view('welcome');
}`
でしたが、これは名前のない関数を定義してその場でviewを呼び出してHTMLを返しています。
実は、`'welcome'`は、
`resources/views/welcome.blade.php`
というBlade（ブレード。Laravelのビューを作るためのテンプレートファイル）を指しています。


#GETパラメータの受け取り

HTTP通信のGETはブラウザから要求されるアドレスにパラメータを埋め込んでサーバサイドで受け取ることができます。
ルーティング情報の中でアドレス`/a/○○○`の時に○○○の部分を変数$strとして受け取れるようにしてみましょう。（compactは変数名とその値から配列を作成するPHP関数です）

```routes/web.php
Route::get('/a/{str}',function ($str) {
    return view('a',compact('str'));
});
```
Bladeでは`$str`を{{}}をつけて呼び出します。

```resources/views/a.blade.php
<!doctype html>
<html lang="{{ app()->getLocale() }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Laravel DemoApp</title>
    </head>
    <body>
        <h1>{{$str}}</h1>
    </body>
</html>
```
サーバを起動し、`http://[servername]/a/アイウエオ`というアドレスでブラウザで確認すると、画面に`アイウエオ`と表示されたと思います。
アドレス部分の「アイウエオ」がビューである`a.blade.php`に渡されて表示されたわけです。


[Laravel基礎（２）コントローラー＞＞](https://qiita.com/taka027/items/55481a185ded5df82d4d)
Google Apps Scripts による Google フォームのフォームクラス設定を変更する

# イントロダクション
## 背景
複数の Google フォーム を作成する際、Google Apps Scripts を利用して、Google フォームの細かな共通の設定を変更したい。

## 目的 (Purpose)
Google フォームの Form Class の設定を変更する。
例えば
- 回答者が行える操作：　送信後に編集
- 別の回答を送信するためのリンクを表示
- 確認メッセージ
- 回答の受付
をデフォルトから変更する

## 目標 (Gole)
次のような画面の設定を変更する
![img1.png](https://qiita-image-store.s3.amazonaws.com/0/154819/d150e64c-6019-297d-57b5-e6dcf38e292b.png)

# ソースコード (source cord)

Google フォームを作成したのち、下記のプログラムを実行してください。

```javascript

function mySF() {
  // ID は 設定したいGoogle フォームのIDを入れる
  var form = FormApp.openById('ID'); // gyo1

  // 新たにGoogle フォームを作成したい場合は gyo1 を次に変更
  // var form = FormApp.create("無題のページ")

  form.setTitle('フォームの名前')
    .setDescription('フォームの説明')
    // (A.) 送信後に編集可能にする
    .setAcceptingResponses(true)
    // (B.) 別の回答を送信するためのリンクを表示する
    .setShowLinkToRespondAgain(false)
    // (C.) 確認メッセージの変更
    .setConfirmationMessage('回答を記録しました。審査へのご協力ありがとうございました。回答を編集する場合は「回答を編集」にお進みください。回答を終了する場合は、そのままブラウザを閉じてください。')
    // (D.) 回答を受け付けている状態に変更
    .setAllowResponseEdits(true);
}

```
# 参考文献
- Class Form, https://developers.google.com/apps-script/reference/forms/form, 2018/10/14 アクセス
Phoenixを触ってみる その6

今回はEndpointの話だけど、あまり書くような内容が…
https://hexdocs.pm/phoenix/endpoint.html#content

# Endpoint

- supervisorである
- Routerに入る前にリクエストを加工したりする
- staticfileに対する扱いもここで定義されている。routerではなく。
- socketもこっち
- lvie reload(開発中、ファイルを保存すると自動でリロードする機能)の設定もここ
    - socket使って勝手にリロードするようになってるらしい
- basicAuthやCORSなどの設定もここで入れられる

最終的にはRouterもPlugとして呼び出す形になってる。

このあとSSL設定の説明もあり、アプリケーションの処理を行うというよりは
apacheやnginxなどで行うレイヤの機能を担っているっぽい。

とはいえ、本番運用する上でここでSSLを扱ったりということはあまりない気がしているので
参考程度に考えておこう。

## SSLを使う

↑にあった内容はEndpoint内でそういった処理を行える、ということだが
SSL周りに関してはEndpointへの設定という形で記述をする。
あわせてHSTS的な設定も可能。

…ここは設定方法的な話だけなので以上で。
Androidのアニメーション(着信)

#アニメーション効果

![着信アニメション.gif](https://qiita-image-store.s3.amazonaws.com/0/296847/95903590-adff-6103-7f02-037337b6c05c.gif)


#１、画像設定

                imageView.setImageResource(R.mipmap.tellphone);
                objectAnimator = AnimationUtil2.getTellphoneAnimation(imageView);

#２、アニメション設定

    public static ObjectAnimator getTellphoneAnimation(ImageView imageView) {
        Keyframe frame0 = Keyframe.ofFloat(0f, 0);
        Keyframe frame1 = Keyframe.ofFloat(0.1f, -20f);
        Keyframe frame2 = Keyframe.ofFloat(0.2f, 20f);
        Keyframe frame3 = Keyframe.ofFloat(0.3f, -20f);
        Keyframe frame4 = Keyframe.ofFloat(0.4f, 20f);
        Keyframe frame5 = Keyframe.ofFloat(0.5f, -20f);
        Keyframe frame6 = Keyframe.ofFloat(0.6f, 20f);
        Keyframe frame7 = Keyframe.ofFloat(0.7f, -20f);
        Keyframe frame8 = Keyframe.ofFloat(0.8f, 20f);
        Keyframe frame9 = Keyframe.ofFloat(0.9f, -20f);
        Keyframe frame10 = Keyframe.ofFloat(1, 0);
        PropertyValuesHolder frameHolder = PropertyValuesHolder.ofKeyframe
                ("rotation",frame0,frame1,frame2,frame3,frame4,frame5,frame6,frame7,frame8,frame9,frame10);
        ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(imageView,frameHolder);
        objectAnimator.setDuration(1000);
        objectAnimator.setRepeatCount(2);
        objectAnimator.setRepeatMode(ValueAnimator.RESTART);
        return objectAnimator;
    }


#３、アニメション開始

                objectAnimator.start();


いいねも忘れずに:point_up:
PowerShellでエアロシェイクだけオフにする

管理者権限で PowerShell を起動して、以下を実行

```powershell
Set-Location HKCU:\Software\Policies\Microsoft\Windows
New-Item Explorer
New-ItemProperty Explorer NoWindowMinimizingShortcuts -Type Dword -Value 1
```

1度ログオフか再起動後エアロシェイクはオフになる

参考: [週刊アスキー-エアロスナップとエアロシェイクがいらない子と思うならオフにしたらええ。](http://weekly.ascii.jp/elem/000/000/022/22691/)
Androidのアニメーション(ハート)

#アニメーション効果

![ハートアニメション.gif](https://qiita-image-store.s3.amazonaws.com/0/296847/9d583e57-4b92-b36e-7669-6b82b91307bd.gif)

#１、リソースファイル設定ObjectAnimator取得

                imageView.setImageResource(R.mipmap.heart);
                objectAnimator = AnimationUtil2.getHertAnimation(imageView);


#２、ObjectAnimatorの作成

    public static ObjectAnimator getHertAnimation(ImageView img_hert) {
        PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha" , 1.0f , 0.5f);
        PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX" , 1.2f , 0.8f);
        PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY" , 1.2f , 0.8f);

        ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(img_hert,alpha,scaleX,scaleY);
        objectAnimator.setDuration(2000);
        objectAnimator.setRepeatCount(Animation.INFINITE);
        objectAnimator.setRepeatMode(ValueAnimator.RESTART);
        return objectAnimator;
    }

#３、アニメション開始

                objectAnimator.start();

ソースコード

https://github.com/YanHengGo/android/tree/master/animation4

いいねも忘れずに:point_up:
モブ読書のススメ prototype

とある会社で ValueFactory をやっているひとです。その流れで [VFStudy](https://peatix.com/group/74771) という勉強会も開催しています。

そこで "モブ読書" という読書法を考えたのでご紹介します。

---

経緯は [こちら](https://peatix.com/event/439558)　

Active Book Dialogue の "アウトプットのためにインプットする" と モブプログラミングの "心理的安全" "経緯や結果の高いレベルでの共有" といったエッセンスを掛け合わせると、なにか面白い読書法ってできないかな、と。

できたのはこれです。

[<img src="http://image.slidesharecdn.com/mobreading-181013065807/95/slide-1-1024.jpg" width=512/>](https://www.slideshare.net/masafumitakarada/prototype-119287310)
<a href="//www.slideshare.net/masafumitakarada/prototype-119287310" title="モブ読書のススメ Prototype" target="_blank">モブ読書のススメ Prototype</a> </strong> from <strong><a href="https://www.slideshare.net/masafumitakarada" target="_blank">masafumi takarada</a></strong> </div>

実際やってみたら "読書" というより "そこから生まれる会話でひとを知る" の方にハンドルを切ってるやり方な感触でした。もしかしたらチームビルディングに適しているかもしれません。

まだまだやりながら改良していくポイントはたくさんあると思います。
（素振りや実践が全然足りてませんので、、、

ご興味ある方、ぜひやってみてフィードバックいただけると嬉しいです。
Cloud Functions で環境変数を使う

## デプロイ時に --set-env-vars を付ける
この機能はまだ beta なので `gcloud beta` にする

```
$ gcloud beta functions NAME --set-env-vars PROJECT=hogehoge KEY=fugafuga
```

## yaml で定義する（オススメ）

```yaml:.env.yaml
PROJECT: hogehoge
KEY: fugafuga
```

## 環境変数を読む

```js:index.js
exports.envVar = (req, res) => {
  // Sends 'bar' as response
  res.send(process.env.PROJECT);
};
```

```py:main.py
def env_vars(request):
    return os.environ.get('KEY', 'Specified environment variable is not set.')
```
【textyle.js】CSSを書かずにテキストのスタイルを簡単にカスタマイズ

# _textyle.js_

**テキスト**の**フォントサイズ**(`font-size`)や**カラー**(`color`)をカスタマイズする際には、CSS にてスタイルを記述する場合がほとんどだと思います。しかし今回、**CSS を書かずにテキストのスタイルを簡単にカスタマイズ**するための JavaScript のライブラリ（40行ほど）を実装しました。
このライブラリの最大の特徴は、**`_`(アンダーバー)から始まるクラス名でテキストのスタイルを指定できるところ**です。

`Text Style JavaSctipt`ということで、**_textyle.js_**と命名しました。

[【GitHub】](https://github.com/7110/textyle.js)

## 使い方

1.  HTML から **_textyle.js_** を読み込んでください。

2.  `textyle();`を実行する記述を読み込みの後に書いてください。
    ※ HTML の読み込みと解析の完了時に実行するように記述

```HTML
<body>

<script type="text/javascript" src="https://7110.github.io/textyle.js/textyle.js"></script>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
  // Execute textyle();
  textyle();
});
</script>
</body>
```

## 記述方法

スタイルを適用したい HTML 上のタグに **`_`** から始まるクラス名を指定します。

- `font-size`を指定したい時

  ```HTML
  <p class="_31.4px">31.4pxになります</p>
  <p class="_1.25em">1.25emになります</p>
  <p class="_1.5rem">1.5remになります</p>
  <p class="_120%">120%になります</p>
  ```

- `color`を指定したい時

  ```HTML
  <p class="_#F00">#F00になります</p>
  <p class="_#dadada">#dadadaになります</p>
  <p class="_rgb(255,0,0)">rgb(255,0,0)になります</p>
  <p class="_rgba(255,0,255,0.5)">rgba(255,0,255,0.5)になります</p>
  ```

## サンプル

[【サンプルページ】](https://7110.github.io/textyle.js/sample.html)
<img width="600px" alt="sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/130952/f1d8fe47-3942-8502-3e05-4be645cf2624.png">

## まとめ

1 年半ほど前にふと思い立って作ったものをリファクタリングしたついでに記事にしてみましたが、インラインで CSS を書くことより **_textyle.js_** を使う決定的なメリットが思い当たらず反省しております。

「こんなメリットがあるよ！」という方がいらっしゃいましたら、どしどしコメントをいただけたらと思います。また、**_textyle.js_**を使ってください。

P.S.
**いいね** を沢山いただけましたら魔改造するかもしれません。
CircleCIのコンテナにSSHしてDebug

# 目的
Githubにプッシュして, CircleCI上で自動テストを回してテストをして...。

ローカルではテストがオールグリーンなのに, CircleCI上ではなぜかテストが失敗する。
そんな時は, コンテナ内にSSHログインしてデバッグして見ると原因究明が捗る。

大抵は必要なモジュールが入っていなかったりといった, 環境の差異が多い

<img width="799" alt="スクリーンショット 2018-10-14 13.13.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/38342/ce360267-0039-72f9-2271-283b34f89084.png">

# コンテナにSSHログインする

## CircleCI側の作業
プルダウンから **Return job with SSH**を選択する
<img width="1440" alt="スクリーンショット 2018-10-14 13.32.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/38342/9854109b-d4d5-0228-2dbe-2aae59939c02.png">

**Enable SSH**の項目を展開すると, コンテナへ接続するためのSSHの情報が記述されている
<img width="1336" alt="スクリーンショット 2018-10-14 13.14.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/38342/88153edc-a920-b026-8662-f01add2037bc.png">

## クライアント側の作業
自分の端末上でターミナルを起動して,　上記のSSH接続情報を入力する

```
$  ssh -p 64535 xx.xxx.xxx.xx
```

ログインが出来たので, テストコードがあるディレクトリに移動してデバッグすると良い

```
circleci@xxxxxxxxxx~$
```

何だかんだ, 久しぶりに触るとやり方を忘れてしまうため, ここに記憶を残す:writing_hand:
Postfixでメールの踏み台対策を行う方法

メールサーバをWebサイトを参考にしつつPostfix(メール送信ソフト) Dovecot(メール受信ソフト)を用いて適当に立ててみたものの、踏み台にされているという連絡がさくらVPSのabuse対策チームというところから入ったため対応を入れてみた。

因みにサーバ環境はCentOS6.9であった。

```
$ cat /etc/redhat-release
CentOS release 6.9 (Final)
```
# 初期対策
何はともあれメールサーバを止める。

```
# /etc/init.d/postfix stop
```
また、迷惑メールの踏み台にされたときには、大量のメールがメールサーバに対して送り付けられており、送信予備軍としてキューに溜まっているはずである。`mailq`コマンドで確認できるが、ともあれこのキューを以下のコマンドで一括削除してやる。

```
# postsuper -d ALL
```
postsuperはpostfixが管理するキューに対してメンテナンスを行うコマンドであるが、superという名前から分かるようにsuperuserしか使えないようなのでroot権限で処理は行おう。
また、メールログにも大量に溜まっているはずなので`/var/log/maillog`あたりを確認して削除しておこう。

# SMTP認証を設定する
Postfixはデフォルトの状態では認証の仕組みを持っておらず、誰でもメールの送信依頼を出せる状態になっている。(このことを**オープンリレー**状態と呼ぶらしい)

自分以外からしか送れないようにするにはIPで制限をかけても良いが、常に固定のIPからメールを送信しなければならないので、ID/Passwordで制限を掛けてやるのが一般的な方法である。
そこで**SASL**(Simple Authentication and Security Layer、サスルと読む)という仕組みを使ってこのセキュリティ施策を実現する。

```
smtpd_sasl_auth_enable = yes
#匿名認証を許可しない = id/passwordの入力を必須とする。 
smtpd_sasl_security_options = noanonymous
#SMTP認証したときのみメール送信の受付を行う。
smtpd_recipient_restrictions = permit_sasl_authenticated,reject_unauth_destination
```

saslの立ち上げ及び、Linuxの再起動時に自動で立ち上がるようにしておく。またpostfixを再起動する。

```
# /etc/rc.d/init.d/saslauthd start
# chkconfig saslauthd on
# /etc/rc.d/init.d/postfix reload
```

これでひとまずSASL対応は完了。

##しつこいアクセスをiptablesで遮断
これで踏み台にされる事はなくなったものの、特定IPアドレスからしつこくSMTP認証の要求が飛んでくる事が`/var/log/mailLog`を見ると確認された。こんな感じである。

```
Oct 14 12:36:04 myhost postfix/smtpd[29066]: connect from unknown[191.96.249.61]
Oct 14 12:36:10 myhost postfix/smtpd[29066]: warning: unknown[191.96.249.61]: SASL LOGIN authentication failed: authentication failure
Oct 14 12:36:10 myhost postfix/smtpd[28874]: connect from unknown[191.96.249.13]
Oct 14 12:36:11 myhost postfix/smtpd[29066]: disconnect from unknown[191.96.249.61]
Oct 14 12:36:16 myhost postfix/smtpd[28874]: warning: unknown[191.96.249.13]: SASL LOGIN authentication failed: authentication failure
```
まあ遮断できているから良いかと思うかもしれないが、頻繁に来られてはメールログで容量を食われてしまうのでIP tablesでこれらのIPからのアクセスを遮断してやる。次のサイトを参考にして設定してみる。https://www.sakura-vps.net/access_denied_specific_ipaddress/

```
# iptables -I INPUT -s 191.96.249.13 -j DROP
# iptables -I INPUT -s 191.96.249.61 -j DROP
```

設定できているかを`iptables -L`で確認

```
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  191.96.249.61        anywhere
DROP       all  --  191.96.249.13        anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
```

変更を保存してrestart

```
# /etc/init.d/iptables save
# /etc/init.d/iptables restart
```

saveすると`/etc/sysconfig/`以下にiptablesファイルが生成されるので、これを直接編集しても良いかも。

```
# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Sun Oct 14 12:56:29 2018
*filter
:INPUT ACCEPT [1010:87284]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [573:1125512]
-A INPUT -s 191.96.249.61/32 -j DROP
-A INPUT -s 191.96.249.13/32 -j DROP
COMMIT
# Completed on Sun Oct 14 12:56:29 2018
```

IPフィルタだけではいたちごっこになってしまう可能性もあるが、ひとまずこれにて。何か良い方法はないものか。。
Visual Studio Codeで日本語を利用する

Visual Studio Codeで日本語が表示されなくなった場合の設定変更方法については、Web検索すると山ほど引っかかります。が、うちの環境だとそれだけでは解決しなかったのでいちおうメモです。`locale.json`をいじっても解消しない場合はご確認ください。

#表示言語を変更する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/14499/d7c464c9-f86f-62e6-4352-d780f0c614b9.png)

一般に書かれているとおり、コマンドパレットから`Display Language`と入力することで表示される、`locale.json`を変更することで、表示言語を変更することができます。日本語の場合は以下です。

```json:locale.json
{
	// Defines VS Code's display language.
	// See https://go.microsoft.com/fwlink/?LinkId=761051 for a list of supported languages.
	
	"locale": "ja" // Changes will not take effect until VS Code has been restarted.
}
```

## ランゲージパックをインストールする。
しかし、特にVisual Studio Codeを再セットアップした直後などは、[ランゲージパック](https://code.visualstudio.com/docs/getstarted/locales#_marketplace-language-packs)が入っていない可能性があります。上記をやってもうまくいかない場合は、拡張機能一覧よりLanguage Packをインストールしましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/14499/4ea9dfdb-0d02-055a-4f5b-bd40e00e5638.png)

両方の手順が終わったら、再読み込みではなくVisual Studio Codeをまるごと再起動します。

#参考
[Visual Studio Code Display Language \(Locale\)](https://code.visualstudio.com/docs/getstarted/locales)
mac OS X 特定のアプリのみTouch bar にファンクションキーを表示させる

# Xcodeだけデフォルトファンクションキーを表示させる

## Overview

Xcodeでデバックする際に、ファンクションキーを使うのが非常に困難である。

fn キーを押下しながらのファンクションキー操作になるので一苦労になる


### FIX


システム環境設定.appを起動

<img width="670" alt="スクリーンショット 2018-10-14 13.16.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/31394/e27eab1a-4766-33c3-296d-07983cad9765.png">

赤枠内に表示されている、キーボードを選択する、

<img width="665" alt="スクリーンショット 2018-10-14 13.17.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/31394/418cff23-2777-7e6c-0161-cc4db9a94c98.png">

ショートカットタブを選択する


<img width="666" alt="スクリーンショット 2018-10-14 13.17.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/31394/bedc3b8c-903a-3172-553f-67244c990c9b.png">

赤枠内のファンクションキーを選択し、デフォルトでファンクションキーが表示させたいアプリを選択する。
CSS3でレトロホームページを再現：2.アンチエイリアスをなくす

こんにちは、＠tacashionです。
前回に引き続き、レトロホームページをモダンめに再現してみよう、というテーマで書きたいと思います。

#あの、懐かしい大文字タイトル
昔のホームページでありがちなことといえば”大文字のタイトル“。
「tacashion★のほ〜むぺ〜じ」など、画像を使わず、文字を大きく表示させてタイトルにしていました。

##微妙なこれじゃない感

![title01.png](https://qiita-image-store.s3.amazonaws.com/0/289530/90748d6c-9918-ec90-1fe8-f2f4ee6384b3.png)

この大きめの文字、この色、この斜体、なかなかそれっぽい感じ★
しかし、（十分古めかしい中にも）どことなく感じるモダン感…。
何がいけないんだろうと考えていると、1つ、今と昔で違う点がありました。

##文字がギザギザしていない！
![smooth.png](https://qiita-image-store.s3.amazonaws.com/0/289530/200a7ad0-309e-c06a-b9f3-5944b8b026dc.png)
*なめらか……*

少し前までは、webサイトの文字というのはアンチエイリアス（曲線や斜線部分に中間色を使って滑らかに見えるようにする）処理がなく、ギザギザというか、ドットがわかるような表示でした。
なるほど、違和感の正体はギザギザか……。
と、気づいたまでは良いものの、どうすれば良いんでしょう。今のブラウザだと勝手にアンチエイリアス処理がかかるし、photoshopで処理なしにして貼り付けるか…、いや、それではCSS3で再現することにならないし。。

##-webkit-font-smoothing: none; があった！
あえてアンチエイリアスをなくす方法なんてあるのかなー、と思いつつダメ元で調べてみたらなんとありました！

```css:css
-webkit-font-smoothing: none;
```

これでアンチエイリアス処理が打ち消されるとのこと。
早速トライしました！

![jaggy.png](https://qiita-image-store.s3.amazonaws.com/0/289530/179b549a-5b98-bd12-8b5f-21070eb1ca92.png)

*ギザギザした！*　＞[表示サンプル](http://tacashion.zashiki.com/samplecode/181014_fontsmoothing.html)

ついでにフォントの種類をOsakaやMSゴシックを指定するなど、なるべく昔の雰囲気を醸し出すようにしました。

###今回使ったCSSプロパティまとめ
```css:css
font-family: "MS PGothic", "ＭＳ Ｐゴシック", "Osaka", "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ Pro W3", Meiryo, "メイリオ", Helvetica, Arial, sans-serif;/* レトロな書体を優先 */
-webkit-font-smoothing: none;/* テキストのアンチエイリアスをなくす（ギザギザさせる） */
```

##注意点
ただ、今回使用した“-webkit-font-smoothing“は、mac・iOSのブラウザでしか処理されないようなんです。残念…。
inodeを使い切ってみる

検証のために inode を枯渇させて見た時の自分メモ

# inodeとは

[inode](https://ja.wikipedia.org/wiki/Inode)

>inode（アイノード）は、ext2などのUnix系ファイルシステムで古くから使われているデータ構造である。inode にはファイル、ディレクトリなどのファイルシステム上のオブジェクトに関する基本情報が格納される。 


[iノード（inode）とは](http://kazmax.zpp.jp/linux_beginner/inode.html)


>ext2や、ext3、ext4というファイルシステムの上で、ファイルやディレクトリを管理するためのデータの事をiノード（inode）といいます。ファイルには、実データの他に、作成者、グループ、作成日時、サイズ等々の属性的な情報が存在しますが、この属性的な情報の部分をiノード（inode）はデータとしてもちます。

>ファイルシステムを作成した時に、ファイルの実際のデータが記録されるデータ領域とともにiノード（inode）領域というものが作成され、この領域へiノード（inode）の情報が書き込まれます。

# 検証環境

+ amzn2-ami-hvm-2.0.20180810-x86_64-gp2(ami-08847abae18baa040)

```bash
$echo $SHELL
/bin/bash
```

# やってみる

```bash
# df -i オプションを付与することで各ファイルシステムの inode使用状況が確認出来る
$ df -i
ファイルシス   Iノード I使用   I残り I使用% マウント位置
devtmpfs        118400   291  118109     1% /dev
tmpfs           122812     1  122811     1% /dev/shm
tmpfs           122812   346  122466     1% /run
tmpfs           122812    16  122796     1% /sys/fs/cgroup
/dev/nvme0n1p1 4193216 38672 4154544     1% /
tmpfs           122812     1  122811     1% /run/user/1000

$cd /dev/shm/

# ファイルを一つ作ると残りが減る
$touch hoge
$df -i |grep shm
tmpfs           122812     2  122810     1% /dev/shm

# 大量にファイルを作る
$for i in {1..122808}; do touch ${i}.txt; done

# 残り1
$df -i |grep shm
tmpfs           122812 122811       1   100% /dev/shm
$touch poyo

# エラー。No space left on deviceとなる
$touch poyoyon
touch: `poyoyon' に touch できません: No space left on device

# inodeを使い切っているがディスク容量としては使い切ってない
$df -i |grep shm
tmpfs           122812 122812       0   100% /dev/shm
$df |grep shm
tmpfs               491248       0  491248    0% /dev/shm

```

やってみたあとで以下の類似記事があることも分かった

[inode (アイノード) を枯渇させてみる](https://blog.amedama.jp/entry/2018/04/21/133823)