OmniAICreator/Qiita-1.07M huggingface dataset:
Djangoでバッチ作るよ

DjangoもPythonも初心者だけど、Djangoめっちゃ便利な関数いっぱいあるからバッチでも使いたいゾ！

## やりたいこと
+ Webアプリケーション向けのDjangoだけど、サイト立てずにバッチ化したい
+ 引数を受け取って処理内容を分岐させたい

## ディレクトリ構造
アプリケーションの直下に`management/commands/`のディレクトリ構造でおかないとコマンドとして認識してくれないらしい。
勿論`settings.py`の`INSTALLED_APPS`にアプリケーションは書いておく。
アプリケーションの構造はどうなっていてもよい。
（1プロジェクトに複数のアプリ置いてた時に同コマンド名のファイル作られてたらどうなってしまうんだろう…？？？）

今回は`sampleBatch`コマンドを作成。
このpythonファイルの名前がそのままコマンドになる。

```
├── app
│   └── management
│       ├── __init__.py
│       └── commands
│           ├── __init__.py
│           └── sampleBatch.py
├── config
│   ├── __init__.py
│   ├── settings.py
│   └── urls.py
├── manage.py
└── requirements.txt
```

## バッチクラスの中身
+ `BaseCommand`を継承すること
+ 引数の受け取りは`add_arguments`（なくてもよい）
    + [argparseについては資料を読んでくれ](https://docs.python.org/ja/3/library/argparse.html)
+ コマンド実行された時に動くのは`handle`
    + つまり1pythonファイルあたり1処理しか書けない
    + （引数で処理分岐させてもいいけど、別.pyにしてコマンドを分けるべきでは？？？）

```python:sampleBatch.py
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    # [python manage.py help sampleBatch]で表示されるメッセージ
    help = 'これはテスト用のコマンドバッチです'

    def add_arguments(self, parser):
        # コマンドライン引数を指定
        parser.add_argument('-t', action='store', dest='intValue', help='【必須】1,2,3,4から好きな数字を選んでください',required=True, type=valid_type)

    def handle(self, *args, **options):
        try:
            print('バッチが動きました： {}'.format(options['intValue']))
        except Exception as e:
            print(e)


def valid_type(t):
    """
    引数のバリデーション
    :param unicode t:
    :rtype: int
    """
    try:
        product_type = int(t)
        if product_type in [1, 2, 3, 4]:
            return product_type
        raise argparse.ArgumentTypeError('Choices are 1, 2, 3, 4 but {0} are given'.format(product_type))
    except ValueError:
        raise argparse.ArgumentTypeError('Not a valid type: {}.'.format(t))
```

## そもそもコマンドとして認識されてるの？
ターミナルで以下のコマンドを実行して出てくるコマンド一覧に含まれていればOK。
含まれていなければどこかがおかしい…ので構造等を見直してくる。

```
% python manage.py help
```

## 実行する

```
% python manage.py sampleBatch -t 1
```

## 参考
Djangoを使ったバッチ処理の実装方法
https://www.phactory.jp/blog/django_batch/

カスタム django-admin コマンドの実装
https://docs.djangoproject.com/ja/1.10/howto/custom-management-commands/

Djangoカスタムコマンドを作成し、引数を送る
https://shotanuki.com/django%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%80%81%E5%BC%95%E6%95%B0%E3%82%92%E9%80%81%E3%82%8B/
fontawesomeと文字を並べたい！！

##何がしたいのか

:pencil2: メモ　:gear: 編集　:scissors: 切り取り 

みたいにアイコンの横に文字が並ぶようにしたい


##fontawesomeのアイコンの横に文字が並ぶようにする

:raised_hands_tone1:scss（css)に記述するだけ:hugging:

今回はhamlとscssで
↓これを作ってみます
<img width="301" alt="スクリーンショット 2019-06-20 16.40.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400567/45e3901b-1026-04b9-fef7-b08d6f85c463.png">

```search.html.haml
.index-header
   .index-header__category カテゴリーから探す
   .index-header__brand ブランドから探す
```

hamlにはクラスと表示させたい文字を書くだけ:point_up_tone1:

```search.scss
.index-header {
 display: flex;
 //カテゴリーから探す
  &__category::before {
   font-family: FontAwesome;
   content: '\f0ca';
   color: red;
   }
 //ブランドから探す
  &__brand::before {
   font-family: FontAwesome;
   content: '\f02b';
   color: red;
   }
```


scssに書くことは:point_down_tone1:

（アイコンを入れたい文字のクラス名）::before {
  font-family: FontAwesome;
  content: '(fontawesomeの番号）';
}

:bulb:before：文字の前、after：文字の後にアイコンがくる
:bulb:アイコンに色をつけたり回転させたり装飾することもできる
:bulb:(fontawesomeの番号）はどこにあるのか？↓
fontawesomeのページ（https://fontawesome.com/icons?d=gallery&m=free）
から使いたいアイコンをクリックすると出てくるページ↓

<img width="594" alt="スクリーンショット 2019-06-20 17.05.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400567/1f34e020-c466-6338-5e41-3e35ec2183ff.png">
左から三つ目の　f03a　を使う



####cssだけでアイコンを入れることができるのは初めて知った！:v_tone1:
１日目　CSS設計の概念について（初学）

#1日目　css設計の概念についてざっくりまとめ
今日初めてcss設計について学んだので、
軽くまとめておきます。

##1. CSS設計ってなんだ？
煩雑なcssにならない為に、決められた規則に則って記述する。

CSS設計のいいところ
・予測しやすい
・再利用しやすい
・拡張がしやすい
・保守がしやすい



逆に破綻しやすいコード（やってはいけないもの）

①**HTMLの記述に依存しているもの**

```css
h1 {
  background: #fff; /* h1がpタグに変更になったら,,?　*/
}
```

→場合にもよるが、クラス名を付与して管理する方が良い

②**スタイルを打ち消しているもの**

```html
<!-- HTML -->
<p class="box">四角</p>
<p class="box underline">下線だけ</p>
```


```css
/*css*/
.box {
  background: #fff;      /*ホワイト*/
  border: 1px solid #ededed;
}
.underline {
  background: #000;    /*ブラック、上のホワイトをわざわざ打ち消している*/
}
```
無駄が多い。

③絶対値を多用する

```CSS
.box {
   width: 368px;
   height: 200px;
   margin: 30px 60px;
}
```
パーセントなどの相対値を用いることで、
メンテナンスしやすくなる。

**④指定がむやみに多い**

```CSS
div.box {               /*.boxで十分*/
   background: #fff; 
}

div.box dd p {          /* クラス名を付与する等で解決*/
   background: #fff;
}
```
詳細度をむやみにあげてしまい、
後から書いたコードがうまく効かなくなる。
下記のように、セレクトを限定的にかく方が、管理が容易になる。

```css
.nav li {
   list-style: none;
}

.nav > li {
   list-style: none;   /*こちらの方がより限定的*/
}
```


CSS設計の考えを用いれば、より管理しやすくなる！
CSS設計はコンポーネント設計の考え方の一つ。
コンポーネント設計・・・一つ一つを部品化し、分離させる。
##2.代表的なCSS

###2-1. OOCSS
共通部分をまとめて記述し、それ以外の個別部分を別のクラスで管理する。
例えば同じ大きさの吹き出しで、背景が異なるものを二つ記述するとき、

```css
.balloon01 {          /*共通部分*/
   height: 100px;
   width: 100px;
}

.color01 {          /*異なる部分を分けてかく*/
   background: #fff;    
}
.color02 {
   background: #eee;
}
```

→再利用はしやすいが、一つに多くのクラスを付与しないといけない場合がある。

###2-2. BEM
**B**lock **E**lement **M**odifier の略。
この三つの概念に分けてCSSを記述していく。

**Block**
大枠。ナビリストや一つの吹き出し、ボタンリストなど。
例）　.nav, .container 

***
**Element**
Blockを構成する要素。
block名＋アンダーコア二つ+エレメント名で記述する。
例）.nav__comment

こうすることで、そのブロック外で使用してはいけないことを示すことができる。
***

**Modifier**
状態変化を表す。
block名\_\_要素\_\_modifier で表す。
例）.nav\_\_comment_alert

***
しかし、単にアンダースコアを命名したい場合、
どこまでがどの役割かがわからない！

###MindBEMding

Elementをアンダースコア二つ、
Modifierをハイフン二つで区切る命名規則！
例）.nav__comment--alert

欠点：クラス名が長くなりがち

##2-3. FLOCSS
  クラスを３つに分類する。

**Foundation**
デフォルトの初期化や基本的な全体設定など、ページの下地となるもの。

**Layout**
ページを構成する大枠の要素。
ヘッダーやサイドバー、コンテナーブロックなど。

***
**Object**
Objectはさらに三つに分類されている。

-**component**
 使い回しのきく小さな単位のコンポーネント。
 接頭辞に-cをつける。

-**Project**
 そのページ独自で使用されているもの。
 ページの多くの部分をしめる。
 接頭辞に-pをつける。

-**Utility**
 上記に合致しない、わずかな調節のためのお助けクラス。
 接頭辞に-uをつける。
***
Modifierの考えがFLOCSSにもある！？
→接頭辞にis-をつける。
わかりにくいであろうSAML連携時の作業フローおよび設定内容をまとめておきます。【SP（Tableau） - IdP（OracleIDCS）】

# 目的
SAML連携の設定をする際、全体工程が見えないことが多いと思います。
本記事では、全体フローをできるだけわかりやすく記載します。

※大体SPとIdPでは担当者が違い責務がわかれているため、
　苦労することも多いと思います。

# 今回のサンプル事例
AWSにEC2でTableau Serverを構築しました。
クラウドの認証基盤（IDaaS）であるOracleIDCSを利用しているため、
Tableauのローカルログインではなく、IdPとしてOracleIDCSを設定することで
認証の統合をする。

# 全体フロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172015/8c5c35f1-6303-7035-1d34-757b1aaeee8f.png)

## 簡単説明

### 共通
・SAMLアサーションの仕様取り決め
　SAML連携では、IdP側でもっているユーザーの属性情報を渡すことができます。
　どの値でユーザーを紐付けるのか（一般的にはメールアドレス　や　ユーザーIDとなるもの）、
　どの情報をどういうカラム名で渡しますという仕様を決める必要があります。
　Tableauの場合は以下のカラムがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172015/cd199298-8392-b9cd-6e43-cdb72a8002da.png)

　IdP側では「usernameにEメールアドレスを設定します。」というような設定が必要になります。


### SP（Tableau側）
・ドメイン決定
　AWSにEC2でTableau Serverを構築する際、
　アクセスするためのURL(ドメイン)を用意します。
　これがSAML連携をする上での最初のInput情報となります。

・証明書作成
　SP開始の際、SAMLリクエストに署名するための証明書を作成します。
　秘密鍵は重要な情報ですので大切に保管しましょう。
　署名証明書はIdP側の設定の際に利用します。

　※証明書の作成方法(Windows)
　　■OpenSSLインストール
　　　https://slproweb.com/products/Win32OpenSSL.html
　　　　Win64 OpenSSL v1.1.0k Light　をダウンロードしてインストール
　　　　※one time $10 donation to TWndows OpenSSL　のチェックははずす

　　■環境変数の設定をする
　　　コントロールパネル=>システム=>システムの詳細設定=>環境変数=>システム環境変数
　　　　Pathに以下を追加
　　　　　C:\OpenSSL-Win64\bin

　　■証明書作成
　　　コマンドプロンプトで以下
　　　　openssl genrsa -out server.key 4096
　　　　openssl req -new -key server.key -out server.csr
　　　　　⇒国など質問されるので適当な値を入力
　　　　openssl x509 -in server.csr -out server.crt -req -signkey

・SP側設定
　ドメイン、証明書、SAMLアサーションの仕様取り決めが完了すると、
　ようやくSP側の設定ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172015/cf5ac129-dea9-f4b4-91d4-97b484949809.png)

・SP側メタデータダウンロード
　このメタデータはIdP側の設定で参考となる値が記載されています。
　このファイルをIdP側担当者に渡すか、作成した署名証明書とURLを伝えればOKです。

・IdP登録
　IdP担当者からメタデータ(xml)をもらったら、それをインポートしましょう。

### IdP（OracleIDCS側）
・SP登録
　SPとの仕様取り決め + URL + 署名証明書を利用してアプリケーション登録する

　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172015/999fa70f-a986-51ab-e88d-2ff5f2e8015f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172015/621f32a7-3a09-f9b6-018e-d4eb7f7ba733.png)


・IdPメタデータダウンロード
　IdPの情報が記載されているメタデータをダウンロードします。
　これは、SP側でのIdP登録に利用します。

# まとめ
★事前取り決め内容（最低限）
　・IdPとSPのユーザーを紐付ける一意のID(NameID)
　・その他マッピング
★IdP側が必要とする情報
　・SPメタデータ
　　※SPのURL、SPの署名証明書があればok
★SP側が必要とする情報
　・IdPメタデータ

シングルログアウトするかどうかとかもあるのですが、ここでは割愛させていただきます。
少しでも読んでくれた方の理解が深まれば嬉しいです。
【Go】MacにGoをインストールする

# 概要
MacにGo言語をインストールして Hello World して環境確認するまで．

# 手順
```shell:
$ brew install go
```

# 確認
```
$ go version
//バージョンが表示されたらOK
```

# Hello World !
```go:hello.go
package main
import "fmt"

func main(){
    fmt.Printf("Hello World !\n")
}
```

# Runで実行
```
$ go run hello.go
Hello World !
```

# Buildしてバイナリ生成して実行
```
$ go build hello.go
$ ./hello
Hello World !
```

# 環境確認
```
$ go env
```

```
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/takeharu/Library/Caches/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/takeharu/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/Cellar/go/1.12.6/libexec"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.12.6/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/p6/0ynlfrjj6ds3l9v5c0jvxt000000gn/T/go-build131527314=/tmp/go-build -gno-record-gcc-switches -fno-common"
```

# Happy Hacking :sunglasses: !
vue.js laravel サイトマップ手動で作ろうぜ

vue.js のサイトマップライブラリ使えばエラー。
スクレイピングで作成する・・・ってのもエラー。

じゃあ、いいわ。
手動で作るわ！
ってことで。

さっさとAdsense通ってくれや。。。

サイトマップのルーティング

```web.php

Route::get('sitemap.xml', 'SitemapController@sitemap');

```

以下の感じでvue.jsのルーティングに合わせ
URLを作ってこう。

```SitemapController.php

class SitemapController extends Controller
{
    public static function sitemap()
    {

//        まずは固定ページを入れる
        $map = ['info','brand','faq','kiyaku','article_show'];


        //use App\Model;
        $social = Social::query()
            ->where('sum_social_day7pageviews','!=',0)
            ->orderBy('sum_social_day7pageviews', 'DESC')
            ->pluck('id');//リスト形式で取得


        foreach ($social as $v) {
            $map[] = 's/'.$v.'/';
        }

        //use App\Model;
        $article = Article::query()
            ->select('id','title')
            ->orderBy('id', 'DESC')
            ->pluck('id');//リスト形式で取得

//
        foreach ($article as $v) {
            $map[] = 'article/'.$v.'/';
        }


        $fortune = Fortune::query()
            ->pluck('id');//リスト形式で取得
//
        foreach ($article as $v) {
            $map[] = 'article/'.$v.'/';
        }

        foreach ($fortune as $v) {
            $map[] = 'f/'.$v.'/';
        }

        return response()->view('sitemap',compact('map'))->header('Content-Type', 'text/xml');
    }



}

```


サイトマップ用 view


```sitemap.blade.php

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>{{ url('/') }}</loc>
    </url>
    <? foreach($map as $v): ?>
        <url>
            <loc>{{ url('/') }}/{{ $v }}</loc>
        </url>
    <? endforeach; ?>
</urlset>

```

これで

https://uranaibako.com/sitemap.xml

を見りゃ閲覧可能。
しかも、googleに登録できますのでご安心を。
【Python3】多次元のリストを一次元にする

# はじめに

numpyつかえよって話かもしれませんが、スクレイピングとかデータを取得・加工するときは多次元リストを一次元にしたいとおもうことがよくあったので、関数を載せときます．

#  -- 追記 --
[shiracamus](https://qiita.com/shiracamus)さんにコメントいただいたので追記します

下の記事などとても参考になります
[Python 3 で flatten する方法いろいろ](https://qiita.com/hoto17296/items/e1f80fef8536a0e5e7db)

## 多次元のリスト

こんなかんじのやつ

```Python
# 例として,なにも規則性のない多次元リスト
l = [[0, 1, 2],[10, 11, [12], 13], [4]]
```

# output

```Python
def list_dim(l):
    """
    リストの次元数を算出
    """
    dimention = 1 if isinstance(l, list) else 0
    return dimention + max([list_dim(l_) for l_ in l]) if isinstance(l, list) else dimention

def multidim2onedim(l):
    """
    多次元のリストを1次元に修正
    """
    if list_dim(l) > 1:
        onedim_list = []
        [onedim_list.extend(l_) if isinstance(l_, list)
         else onedim_list.append(l_) for l_ in l]
        return multidim2onedim(onedim_list)
    else:
        # 次元数が1になったら終了
        return l

```

# usage

```Python
l = [[0, 1, 2],[10, 11, [12], 13], [4]]
multidim2onedim(l) # '[0, 1, 2, 10, 11, 12, 13, 4]'
```

# 参考
[再帰関数を理解するための最もシンプルな例](https://qiita.com/jumpyoshim/items/20e6b5e70efa466699b4)
kubernetesでcontroller-managerの設定変更をする

kubernetesのcontroller-managerには色々な設定があります。

* https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/

これらを使おうと思った時に以外とどうやればいいのかわからないことがあるので備忘がでらまとめます。

## 設定方法


<strong>注意</strong>
この設定ファイルを修正するとすぐにk8sが検知してcontroller-managerのpodがrestartしますので、注意しましょう。
※つまり設定を反映するためのrestart処理はユーザはやらなくてよいということです。

```bash:/etc/kubernetes/manifests/kube-controller-manager.yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-controller-manager
    tier: control-plane
  name: kube-controller-manager
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-controller-manager
    - --allocate-node-cidrs=true
    - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --bind-address=127.0.0.1
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --cluster-cidr=10.244.0.0/16
    - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
    - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
    - --controllers=*,bootstrapsigner,tokencleaner
    - --kubeconfig=/etc/kubernetes/controller-manager.conf
    - --leader-elect=true
    - --node-cidr-mask-size=24
    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
    - --root-ca-file=/etc/kubernetes/pki/ca.crt
    - --service-account-private-key-file=/etc/kubernetes/pki/sa.key
    - --use-service-account-credentials=true
    env:
    - name: no_proxy
      value: localhost,127.0.0.1,172.16.0.0/24,k8s-admin-001,k8s-node-001,k8s-node-002,service-ac,service-bd,10.96.0.0/12,10.244.0.0/16
    image: k8s.gcr.io/kube-controller-manager:v1.14.3
```

こんな感じに書かれているので、以下のように追記しましょう。

```
    - --service-account-private-key-file=/etc/kubernetes/pki/sa.key
    - --use-service-account-credentials=true
    - --node-monitor-grace-period=10s　←追記
    env:
    - name: no_proxy
```
Blender2.8で追跡を使う

Blender初心者です。
[こちら](https://www.blender3d.biz/simple3dcg_scening.html)のサイトを参考にしてテントウ虫のチュートリアルをしているのですが、Blender2.8から大きくUIが変わったようでサイトと異なる点がちょいちょいあります。

その中で今回はライトをオブジェクトの方向に常に向くようにする追跡について
2.8バージョンの方法で説明します。

# 追跡とは

追跡とはあるオブジェクトAを常に他のオブジェクトBの方向を向くようにするということです。
例として今回はスポットライトを常にテントウ虫に向くようにします。

![blender_track.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260272/105a114b-f8c7-4c04-54dd-843ab42c64be.gif)

# 方法

まず向かせたいオブジェクト（今回はスポットライト)を選択します。

<img width="512" alt="blender_track01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260272/aa18f6e8-842f-4ff2-1540-b45efda8d282.png">


次にプロパティウィンドウからObject Constraintを選択します。

<img width="512" alt="blender_track02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260272/2cc59b03-d90c-50e5-f687-66be9764e66c.png">

ここではオブジェクトの制限を付けることができます。
現在は何もありません。

「Add Object Constraint」を押し、「Track To」を選択します。

<img width="512" alt="blender_track03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260272/bc29e91e-ef6c-35dd-ca33-0d0868eb5b84.png">

そして以下のように設定します。

- Target：向かせたいターゲットオブジェクト（今回はテントウ虫）
- To：オブジェクトのどの軸方向を向かせるか
- Up：オブジェクトのどの軸方向を上にするか

例えば今回の場合、スポットライトは下を向いていますので、Toは-Zを指定します。するとスポットライトのローカル座標軸の-Z方向がテントウ虫の方向を向きます。

Upはその際にどの軸を上に向かせるかです。Toと同じ軸を指定してしまうとこちらが優先され、オブジェクトが向いてくれませんのでそれ以外を指定します。今回はYを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260272/42bee028-ec48-141c-75a4-b77a554e9c8b.png)

これでスポットライトが常にテントウ虫の方向を向くようになりました。
試しにテントウ虫を動かして確認してみます。


![blender_track.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260272/105a114b-f8c7-4c04-54dd-843ab42c64be.gif)

しっかりと追跡ができています。

# まとめ

手順を最後にまとめます。

- 向きを変えたいオブジェクトを選択
- プロパティウィンドウのObject Constraintから「Track To」を追加する
- Targetに向かせたいターゲットオブジェクトを指定し、軸などを調整する


# おわりに
Blenderは調べると2.8より前のバージョンのことが多いので、なかなか見つからないことがありますので順次記事を書いていこうと思います。

# 参考
StackOverflowの方にあった質問を参考にさせていただきました。
https://blender.stackexchange.com/questions/42837/constraint-the-camera-to-look-at-an-object
vb.netの設定ファイルweb.configのメモ書き！

#vb.netでの設定ファイルでもある『web.config』について自分が苦労した内容を抜粋しました。

- 受信データ容量のサイズアップ   ＜system.serviceModel＞
- RESTコントローラの指定   ＜system.serviceModel＞
- レスポンスのフォーマット形式をJSONにする   ＜system.serviceModel＞
- ログファイル、My.Application.Logの設定＜system.diagnostics＞

###・受信データ容量のサイズアップ   ＜system.serviceModel＞
多めのデータをJSONで送信しようとしたら『413 Request Entity Too Large』のエラーがでたので
webHttpBindingタグで各サイズを指定します。
※サンプルは『basicHttpBinding』ばかりでしたが、これだと自分の環境では解決できなかったので『webHttpBinding』を使います
 
```html

        <bindings>
            <webHttpBinding>
                <binding maxBufferPoolSize ="2147483647" maxBufferSize ="2147483647" 
                         maxReceivedMessageSize ="2147483647" />
            </webHttpBinding>
        </bindings>
```

###・RESTコントローラの指定   ＜system.serviceModel＞
```html

      <services>
         <service name="proc1.Test1">
            <endpoint address="" behaviorConfiguration="proc1.Proc1Behavior" 
                      binding="webHttpBinding" contract="proc1.Test1" />
         </service>
         <service name="proc1.Test2">
            <endpoint address="" behaviorConfiguration="proc1.Proc1Behavior" 
                      binding="webHttpBinding" contract="proc1.Test2" />
            </service>
        </services>
```

###・レスポンスのフォーマット形式をJSONにする   ＜system.serviceModel＞
defaultOutgoingResponseFormatでJsonに設定
※これがないとJSONに余分な値がセットされる

```html
        <behaviors>
            <endpointBehaviors>
                <behavior name="proc1.Proc1Behavior">
                    <!--	<enableWebScript />  	-->
                    <webHttp defaultOutgoingResponseFormat="Json" />
                </behavior>
        </behaviors>
```

###・ログファイル、My.Application.Logの設定＜system.diagnostics＞
```html

    <system.diagnostics>
        <sources>
            <source name="DefaultSource" switchName="DefaultSwitch">
                <listeners>
                    <add name="FileLogListener" />
                </listeners>
            </source>
        </sources>
        <switches>
            <add name="DefaultSwitch" value="Information" />
        </switches>

        <sharedListeners>
            <!--    下記プロパティはデバックで警告になるが、実行はできるので無視する
                ・"autoflush"                ：　自動的にフラッシュの指定　　
                ・"location"     　　        ：　ログの保存場所を変更する　　
                ・"basefilename"             ：　ログファイル名　　
                ・"customlocation"           ：　出力フォルダ名            　※※　ここを環境に合わせて修正する　※※　
                ・"logfilecreationschedule"  ：　ログファイル名の最後に日付を付加する　
                                                 "バイク検索システムエラーログ-2019-06-14.log"
            -->
            <add name="FileLogListener" 
                 type="Microsoft.VisualBasic.Logging.FileLogTraceListener,
                 Microsoft.VisualBasic, Version=8.0.0.0,
                 Culture=neutral, 
                 PublicKeyToken=b03f5f7f11d50a3a" 
                 initializeData="FileLogListenerWriter" 
                 autoflush="true" 
                 location="Custom" 
                 basefilename="バイク検索システムエラーログ" 
                 customlocation="C:\file\ログ\" 
                 logfilecreationschedule="Daily" />
        </sharedListeners>
    </system.diagnostics>

```
gitで最近触ったブランチのリストを出す

正確にはコミット日時で並び替えたブランチのリストを出す方法です。

```
git --no-pager branch --sort=committerdate
```

`--no-pager`でページャーを抑制。`--sort=committerdate`で並び替えます。`--sort=-committerdate`と頭に`-`を入れると降順で並び替えられます。

これをaliasに登録しようと思ったら`--no-pager`を登録するのには一ひねり必要なようです。下記でいけました。

```
$ vi ~/.gitconfig

[alias]
        recent-branch = !git --no-pager branch --sort=committerdate
```

一つ前に戻るのは

```
git checkout -
```

で可能ですが、2，3個のブランチを行ったり来たりしてる時、正確なスペルが思い出せない時重宝します。

## 参考サイト

https://stackoverflow.com/questions/5188320/how-can-i-get-a-list-of-git-branches-ordered-by-most-recent-commit
https://stackoverflow.com/questions/48341920/git-branch-command-behaves-like-less
https://qiita.com/oieioi/items/d8c48012ca3a1ecb274d
Go言語でコマンドを自作してみる

Go言語でコマンドを自作してみる
#実行環境
- manjaro
- zsh
- go1.12.5

#使用するパッケージ
- os
- log
- fmt

#実際に作ってみる
##目次
- コマンド名を決めてファイルを作る
- コマンドの中身を作る
- ビルドする
- 実行ファイルがある場所にパスを通す
- 使ってみる

##コマンド名を決めてファイルを作る


```
$ vim <コマンド名>.go
```

作りたいコマンドの名前のファイルを作ります。
※拡張子に.goをつけます。
※この記事ではmake_directory.go

##コマンドの中身を作る
下のプログラムではmkdirと同じようなものを作っています

```go:make_directory.go
package main

import (
	"fmt"
	"os"
	"log"
)

func main() {
	if len(os.Args)!=2{
		fmt.Println("Please enter \"make_dirctory <dirctory name>\"")
		os.Exit(0)
	}
	dir_name := os.Args[1]
	if 	err := os.Mkdir(dir_name,0777); err != nil{
		log.Fatal(err)
	}
}


```

##ビルドする
書いたプログラムをビルドして、実行ファイルを作成します。

```
$ go build <コマンド名>.go
```

##実行ファイルがある場所にパスを通す
毎回実行ファイルがある場所を指定すれば、コマンドを実行できますがそれではめんどくさいので、パスを通します。
パスを通すために、.zshrcに下の文を追記します。
※bashを使っている場合は.zshrcではなく.bashrcです。

```sh:.zshrc
export PATH="$PATH:<実行ファイルのある場所>"
```

##使ってみる
実行します

```
$ <コマンド名>
```
一意性制約


一意制約とは、設定したカラムに同じ値を設定できなくする制約のことです。
例えば、ユーザー登録でニックネームを登録しようとすると「このユーザー名はすでに使われいます」となるうざい奴ですね。
この制約のおかげで、テータの重複を禁じキーとしての設定も可能となります。



railsでの実装方法


```ruby:qiita.rb
add_index :テーブル名, :カラム名, unique: true
```
railsでは、カラムに対してadd_indexメソッドを用いるこで一意制約を実装できます。

１：ターミナルにてマイグレーションファイルを作成
２：マイグレーションファイルの編集

```ruby:qiita.rb
class AddNicknameToUsers < ActiveRecord::Migration
  def change
    add_column :users, :nickname, :string
    add_index :users, :nickname, unique: true
  end
end
```
３：忘れずに、bundle exec rake db:migrate

個人的メモ
プログラミング初心者にこそAlexa スキル開発を薦める6つの理由

私はアプリケーションエンジニアでは無いので、Web系の知識がほぼ皆無に等しいですが、一応ソフト屋です。

ひょんなきっかけから、最近Alexa skillを作成する機会がありました。

いざ、作ってみると思ったより簡単で、プログラミングの入門にも良さそう。

何故そう思ったのか、綴ってみたいと思います。


# 1. 構成がシンプル

動く仕組みがとてもシンプルで、理解しやすいです。

基本的な仕組みは、ユーザから発せられた声を分解し、プログラム側に引っ張って、処理して、結果を返す。

これだけの流れです。

コーディングが一切不要なスキル作成サービスもありますので、まずはここから基本概念を学んでみても良いでしょう。

https://blueprints.amazon.co.jp/


# 2. 開発がほぼWeb上で完結する

Webページ上で設定をいじっていくだけで、基礎的な動作はほぼ実現できます。

コードも書けますし、シミュレータ(仮想実行環境)もあるので、デバッグもできます。

また、ビルドはサーバ側で行うので、PCのスペックが低くても問題無いです。

Webだけでは面倒になりがちな、テーブルデータなどはcsvからインポートもできるので良く考えられてます。

声だけの操作なので、Webのシミュレータでも十分。

もちろん、完成したところで実機確認もできます。


# 3. Web系開発に繋げられる

イベントハンドラ(コマンドを受けた時の振る舞い)の基本的な処理部分はJavaScript(JS)で記載していきます。

JSはWeb系のプログラミング言語として非常にメジャーな言語。

そして、プログラミング言語の中では比較的習得難易度が低く、初心者向きだと言えます。

スキル作成のためにJSの文法も覚えておけば、今後その経験を活かして、Web系の開発にシフトしていくこともできると思います。

学習したことが無題にならないので、取り組みやすいですね。


# 4. UI開発が要らない

アプリやWeb開発は、ユーザインターフェース（画面デザインなど）の部分と、バックエンド(ボタンを押したときの動作部分など)の部分をそれぞれ開発するため、

完成するまでにはそこそこの工数が必要ですし、デザインセンスも問われます。

その点、Alexa skillは声による応答なので、UI開発が必要ありません。

厳密に言うとEcho showのようなディスプレイ向けの表示もカスタマイズできますが、必須では無いです。

よって、バックエンドの開発に集中できますし、それによってコードも複雑化しにくいところも良いです。

# 5.認定が親切

Alexaスキルを作成したら、一般公開したいと思うでしょう。

一般公開するためには、アプリなどの開発同様、Amazonによる認定が必要になります。

この認定ですが、レスポンスがかなり早いかつ、的確にアドバイスしてくれます。

私の場合だと、提出して3時間ほどで認定結果が返ってきました。（却下ですが）

その際、「ここのURLみて、これに従ってね」というような投げやりな指摘では無く、具体的にどこが悪いのかを細かく指摘してくれます。

しかも、自分が申請したスキルを例にとった再現手順を事細かに記載してくれるのです。

それでも分からないことがあれば、質問することが出来ます。

Web系の専門用語使われて難解な指摘を受けるようなことが無いので、初心者に優しいと言えます。

# 6. 対応デバイス数が多い

今話題のAlexaは、Amazon Echoシリーズに留まらず、3rd party製のデバイスにも搭載されていますし、アプリを入れればスマホにも対応しています。

今後も対応デバイスは増える一方でしょう。

そのため、知り合いに宣伝して自分が作ったスキルを使ってもらう、、みたいなことも出来ます。

開発難易度が低いのに、多くの人に使ってもらえるプラットフォームですので、作るモチベーションに繋がりやすいです。

# まとめ

何となくVoice UIは難しそうなイメージがありましたが、

私のような非アプリケーションエンジニアでも比較的楽に開発できました。

今話題になっているデバイスですし、結果が実機で見えるのでプログラミングの教育にも良い教材かと思います。
Numpyの乱数生成における再現性についての注意事項

## 概要
pythonで乱数生成するときに，再現性を担保するためにseedを指定する方が多いと思います．
乱数のseedの設定について，他スクリプトを呼び出す場合にどのような挙動をするかを実験しました．
自分用のメモも兼ねて投稿．

## 結論
+ 別スクリプトで乱数を実行する場合でも`np.random.seed`は共有される模様．
+ 自分で関数とかを作って，読み込み元のスクリプト(`hoge.py`)でシードを設定すると実行先のスクリプト(`fuga.py`)のシードも書き換えられてしまうので注意が必要
+ それを避けるためには，`np.random.RandomState`を使うなどが挙げられる．(実際pandasの乱数とかはこれを使っていた)

## 実験
以下のように`hoge.py`を準備`fuga.py`を準備します．
`fuga.py`を実行した際にどのように乱数が生成されるかを見てみます．

```python:hoge.py
import numpy as np

def hoge(seed=None, random_state=None):
    if random_state is not None:
        rs = np.random.RandomState(123)
        print(rs.randint(0, 1000, 10))
    else:
        if seed is not None:
            np.random.seed(seed)    
        print(np.random.randint(0, 1000, 10))
```

```python:fuga.py
import numpy as np
import hoge

if __name__ == '__main__':
    # 普通に実行
    np.random.seed(123)
    print(np.random.randint(0, 1000, 10))
    ### [510 365 382 322 988  98 742  17 595 106] (seed=123)
    
    # fugaでseedを設定するが，hogeでは設定しない．
    np.random.seed(123)
    hoge.hoge()
    ### [510 365 382 322 988  98 742  17 595 106] (seed=123)

    # fugaでseed(231)を設定し，hogeでは別のseed(123)を設定する．
    np.random.seed(231)
    hoge.hoge(seed=123)
    ### [510 365 382 322 988  98 742  17 595 106] (seed=123)
    
    # hogeでnp.random.seed(213)を渡してしまうと，fugaにも反映してしまう．
    np.random.seed(123)
    hoge.hoge(seed=231)
    ### [599 176 660 457 779 710 514 478 887 340] (seed=231)
    print(np.random.randint(0, 1000, 10))
    ### [874 241 274 802 828 546  33 291 401 556] (seed=231の2回目)

    # hogeでnp.random.RandomStateを使えば，fugaには反映されない
    np.random.seed(123)
    hoge.hoge(random_state=231)
    ### [599 176 660 457 779 710 514 478 887 340] (seed=231)
    print(np.random.randint(0, 1000, 10))
    ### [510 365 382 322 988  98 742  17 595 106] (seed=123)
```

## 変更履歴
+ 2019/06/20 16:39
    + めっちゃ間違えてたので大幅に変更
+ 2020/08/17 10:52
    + seed値を打ち間違えていたので修正
CloudWatchLogs の内容を取得するLambda

# 概要
表題の通り

# 経緯
SESで受信したメールの添付ファイルをS3に保存するっていうLambdaがこけてたらしく、再実行したいからそのログを引っこ抜きたいけど何百件もあって全部マネジメントコンソールからみるの辛いから作った。
この記事では引っこ抜く部分を説明する。

# 前提
- python 3.6
- 参照したいCWLogsの権限
  - `logs:DescribeLogStreams`
  - `logs:FilterLogEvents` 

# GitHub Repository
https://github.com/atsushi-ito-110/python-lambda-cwlogs-filter

# 内容
```python:lambda_function.py
import json
import boto3
import os


def lambda_handler(event, context):
    fetch_object_keys()
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

group_name = '/aws/lambda/' + os.environ['LAMBDA_FUNCTION_NAME']
log_stream_name_prefix = '2019/06'
print(log_stream_name_prefix)
# 適宜変更する
filter_pattern = 'ERROR'
client = boto3.client('logs')


def call_filter_log_events(log_stream_names, next_token=''):
    print('called call_filter_log_events')
    if not next_token:
        response = client.filter_log_events(
            logGroupName=group_name,
            logStreamNames=log_stream_names,
            limit=2000,
            filterPattern=filter_pattern,
        )
    else:
        response = client.filter_log_events(
            logGroupName=group_name,
            logStreamNames=log_stream_names,
            limit=2000,
            nextToken=next_token,
            filterPattern=filter_pattern,
        )

    print(len(response['events']))
    for event in response['events']:
        print('log: ' + event['message'])
    if 'nextToken' in response:
        call_filter_log_events(log_stream_names, response['nextToken'])


def fetch_object_keys(next_token=''):
    print('called fetch_object_keys')
    if not next_token:
        response = client.describe_log_streams(
            logGroupName=group_name,
            logStreamNamePrefix=log_stream_name_prefix,
            orderBy='LogStreamName',
            descending=True,
        )
    else:
        response = client.describe_log_streams(
            logGroupName=group_name,
            logStreamNamePrefix=log_stream_name_prefix,
            orderBy='LogStreamName',
            descending=True,
            nextToken=next_token,
        )
    print(len(response['logStreams']))
    for stream in response['logStreams']:
        print(stream['logStreamName'])
        call_filter_log_events([stream['logStreamName']])

    if 'nextToken' in response:
        fetch_object_keys(response['nextToken'])
    else:
        print('end')

```
torch.mean(torch.pow(torch.sub(a, b), 2))よりnn.MSELoss(a, b)の方が断然早い

# 何をしたいか
平均二乗誤差（Mean Squared Error）を手で生で書いた場合と、pytorchのAPIを叩いた場合で、速さを比較したい。

# MSEってなに
誤差を二乗したものの平均です。
$$\ell(x, y) = L = \{l_1,\dots,l_N\}^\top, \quad
        l_n = \left( x_n - y_n \right)^2$$
↑は[nn.MSELoss()](https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html#MSELoss)より。
例えば$[1, 2]$と$[2, 3]$のMSEは、$((2-1)^{2} + (3-2)^{2}) \div 2 = 1$です。

# コードの比較
```python:生で書いた場合
torch.mean(torch.pow(torch.sub(a, b), 2))
```
```python:API
nn.MSELoss(a, b)
```

# 結果
```python:mse.py
from time import time
import matplotlib.pyplot as plt
import seaborn as sns
import torch
import torch.nn as nn


a = torch.randn([1, 2])
b = torch.randn([1, 2])
mse = nn.MSELoss()


def measure_with_api(cnt):
    times = []
    since = time()
    for i in range(cnt):
        mse(a, b)
        times.append(time() - since)
    return times


def measure_without_api(cnt):
    times = []
    since = time()
    for i in range(cnt):
        torch.mean(torch.pow(torch.sub(a, b), 2))
        times.append(time() - since)
    return times


if __name__ == '__main__':
    sns.set()
    times_without = measure_without_api(1000)
    times_with = measure_with_api(1000)
    plt.plot(times_without, label="without")
    plt.plot(times_with, label="with")
    plt.title("measure")
    plt.legend()
    plt.show()
```

これを実行すると、こんな結果が表示されると思います。
![measure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207596/11262aed-0069-642d-c681-4825ff9b0df4.png)
データベース設計について

データベース設計とは
作成するサービスやシステムで扱う情報をどのようにデータベースで管理するかを決める作業です。
データベース設計をしっかりと行うことで、システムが複雑になって行ってもいい感じでデータ操作を行えるのでとても重要！！

データベース設計の基礎知識
・扱うデータの概念（エンティと言うらしい）
・エンティの属性
・エンティ同士の関係性（リレーション）

エンティを一つのテーブルと考えてください。
エンティの属性がそのテーブルでもつ詳細情報（カラム）のことです。
複数のエンティの紐付けを行うことで、優位的に各テーブル情報を活用できます。


データベース設計の手順
１：管理するエンティを決める
２：エンティの属性を決める
３；エンティ同士のリレーションを決める
４：データをテーブルとして定義していく

理解はしやすいが実際にやってみると難しいーー。
Laravelのキャッシュ的なものたち

もうすぐPC内のメモとか消えるのであとで見れるように投稿。
というわけで今回の投稿は自分用です。
大体は他サイトに載ってたことを集めてきた内容になります。

# 設定キャッシュファイル

```
php artisan config:cache
```
→ configure/bootstrap/cache/config.php

※このファイルが出来てるとenvファイル読まなくなるらしい。
　https://hiroto-k.hatenablog.com/entry/2018/03/28/213000

# routeのキャッシュ作成
```
php artisan route:cache
```
→ configure/bootstrap/cache/routes.php


# Bladeのキャッシュ
アクセスすると勝手につくられる
→configure/storage/framework/views

# パッケージManifestファイル
新しいパッケージが追加・削除された場合は自動的に再作成、無ければアクセス時に作る
→configure/bootstrap/cache/packages.php


# サービスManifestファイル
新しいパッケージが追加・削除された場合は自動的に再作成、無ければアクセス時に作る
→configure/bootstrap/cache/services.php


# 共有クラスファイルの最適化
```
php artisan optimize
```

# デプロイ時にやるといいこと
## パッケージとかの更新

```
composer update
```

新しいパッケージとか追加してるならupdateじゃなくて「composer install」を。
パッケージは更新したくなくて自分の書いたクラスとかを追加しただけなら「composer dump-autoload」



## キャッシュクリア
```
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
```

※叩くときのユーザーに注意。
　特にBladeのキャッシュを作るのはapacheが動かしてユーザなのでそれ以外のユーザで叩いてもキャッシュは消えない。


# 参考
https://qiita.com/qiita-kurara/items/d37dbc5b67e6b6dfbe1d
https://qiita.com/Ping/items/10ada8d069e13d729701
Rubyで数値を3桁区切りにする方法！

フリマアプリなどを開発していく中で、商品の値段を3桁で区切って表示させたい時とかありますよね！

例）　「1,000円」といったように...


そんな時に活躍するのが、:delimitedメソッドです！

## delimitedメソッド

```ruby:sample.rb
12345678.to_s(:delimited)
 # => 12,345,678
12345678.05.to_s(:delimited)
 # => 12,345,678.05
```

***:delimiterオプションを利用することで、桁区切り文字も指定することができます！***

```ruby:sample.rb
12345678.to_s(:delimited, delimiter: '.')
 # => 12.345.678
12345678.to_s(:delimited, delimiter: ',')
 # => 12,345,678
```
メソッドを活用した例をみていきましょう！

「1000」という数値が引数で与えられたら「1,000円」といったように、「桁区切り」と「円」を追加する、ヘルパーメソッドconverting_to_jpyを定義します！

```ruby:app/helpers/product_helper.rb
module ProductsHelper
  def number_to_currency(price)
    "#{price.to_s(:delimited, delimiter: ',')}円"
  end
end
```

完成です！

---

delimitedメソッドは他にもオプションがあるので、興味が湧いた方は是非調べてみてください！

ご静聴ありがとうございました:relaxed:

>https://railsguides.jp/active_support_core_extensions.html#%E6%9B%B8%E5%BC%8F%E8%A8%AD%E5%AE%9A
Wordpressのheader.phpに書いたGoogleグローバルサイトタグが反映されない挙動の原因

表題の通りなんだけど、テーマのheader.phpファイル（またはそこでincludeしている外出しのファイル）にGoogleのグローバルサイトタグを埋めてたけど反映されない。

調べてく中で、[Autoptimize](https://ja.wordpress.org/plugins/autoptimize/)とうプラグインが悪さしていたよう。

以下のオプションのチェックを外すことで反映されるようになった。

![貼り付けた画像_2019_06_20_14_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30951/f1a23005-8d5e-fd8a-5b6e-f3075fe4fced.png)
macOSで vlang 0.0.12 使ってhello world

ダウンロードできるようになってたので試してみました。

# ダウンロード、展開
https://vlang.io/
上記サイトから、 `v_macos.zip` をダウンロードして展開します。
今回は面倒臭いので、`~/Desktop/v_macos` に展開しました。

# brew で諸々インストール

READMEに従ってインストール

```console
$ brew install glfw freetype curl
````

# ファイルの準備

```~/Desktop/v_macos/hello.v
fn main() {
        println('hello world')
}
```
上記ファイルを、展開したディレクトリにおきました。

# コンパイル

パスとか通してないので、.を頭につける必要がありますが、以下のコマンドでコンパイルです。

```console
~/Desktop/v_macos $ ./v hello.v 
Checking for updates... (soon this will only be done once per day)
V is up to date
```


# 実行

hello という実行ファイルが作成されているので叩きます。

```vlang
~/Desktop/v_macos $ ./hello
hello world
```

# その他

バイナリサイズですが以下でした

```console
~/Desktop/v_macos $ ls -lah
... 50K  6 20 14:53 hello
```

vscodeのエクステンションはこちら
https://github.com/0x9ef/vscode-vlang
SQLの基本構文

・LIKE演算子
ある文字を含むデータを取得したいときに使う
構文
WHERE カラム名　LIKE 文字列;

・ワイルドカード
例えば焼きプリン、牛乳プリンなど「プリン」という文字列が一致するデータを取得したい場合に使う
構文
WHERE カラム名　LIKE"%プリン%";

・前方一致
ワイルドカードを文字列の前後どちらかにのみ書く方法
下の例だと「プリン」から始まるデータを取得する。「焼きプリン」など「プリン」から始まらないデータは取得しない
構文
WHERE カラム名　LIKE"プリン%";

・後方一致
前方一致と真逆の書き方で、このように書くと「プリン」で終わるデータを取得する
構文
WHERE カラム名　LIKE"%プリン";

・NOT演算子
「〇〇を含まないデータ」や「〇〇に一致しないデータ」のような条件で取得する場合に使う
構文
WHERE NOT カラム名　>= 数値;
WHERE NOT カラム名  LIKE"%文字列%";

・NULLのデータを取得する
～がNULLであるというデータを取得する場合に使う
構文
WHERE カラム名　IS NULL;

・NULLでないデータを取得する
～がNULLでないというデータを取得する場合に使う
構文
WHERE カラム名　IS NOT NULL;

・AND演算子
WHERE文に複数の条件を指定してデータを取得する場合に使う
構文
WHERE カラム名1　＝　"カラムの中身"
AND カラム名2　＝　"カラムの中身";
例
WHERE food = "スナック"
AND name = "田中";
※foodカラムにある「スナック」データとnameカラム「田中」が一致している条件を出力する

・OR演算子
ANDと同様、複数の条件を取得する。
「WHERE 条件1　OR 条件2」と記載すると条件1または条件2のどちらかを満たすデータを取得することが出来る
構文
WHERE カラム名　＝"カラムの中身"
OR カラム名　＝　"カラムの中身";

・ORDER BY
データを並び替えるときに使う
構文　
ORDER BY 並び替えたいカラム名　並べ方;

・昇順と降順
ORDER BYの並べ方に昇順加工順を指定する時に使う
ASC(昇順): 1,2,3....100
DESC(降順):100....3,2,1
※ORDER　BYはSQL文の末尾に記述すればよいのでWHERE文と併用することが可能

・LIMIT
最大で何件取得するかを指定する時に使う
構文
SELECT カラム名
FROM テーブル名
LIMIT 数値；

※WHWRE文と併用することが可能
WHERE 条件
LIMIT 数値；
英語の品詞付与プログラム（POS tagger）をひとまず実行する方法

#品詞付与プログラム
英文への品詞付与を行うために，POS (Part of Speech) tagger を利用することがある。老舗的な Brill tagger や，[NLTK](https://www.nltk.org/) など，いくつかの選択肢があるが，わりとすぐに使える（気がした）[Stanford Log-linear Part-Of-Speech Tagger](https://nlp.stanford.edu/software/tagger.shtml)で試してみた，というメモ書き。

#実行環境
- OS: macOS Mojave (ver.10.14.5)
- POS Tagger: Stanford POS Tagger (ver. 3.9.2)

#事前準備
[Stanford Log-linear Part-Of-Speech Tagger](https://nlp.stanford.edu/software/tagger.shtml) にアクセスし，Download の項目にある "Download basic English Stanford Tagger version 3.9.2 [25 MB]"（2019/06/20 時点の最新版）のリンクをクリックして，ZIP ファイルをダウンロードして展開する。

#ひとまず実行
Mac の Terminal.app を起動して，展開したファイル一式まで移動（cd）して，一覧を確認。

`$ cd stanford-postagger-2018-10-16`
`$ ls`
>
LICENSE.txt			   	stanford-postagger-3.9.2-javadoc.jar
README.txt				stanford-postagger-3.9.2-sources.jar
TaggerDemo.java				stanford-postagger-3.9.2.jar
TaggerDemo2.java			stanford-postagger-gui.bat
build.xml				stanford-postagger-gui.sh
models					stanford-postagger.bat
sample-input.txt			stanford-postagger.jar

続いて，品詞付与プログラム実行のため，次のコマンドを入力する。実行時に，「Java がない！」と怒られることがあるので，その警告が出たら，[ORACLE の Java 配布サイト](https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html)からダウンロードしてインストールしておく必要がある。

`$ ./stanford-postagger.sh models/english-left3words-distsim.tagger sample-input.txt `

シェルスクリプト（stanford-postagger.sh）を，english-left3words-distsim.tagger に含まれたモデルを使い，sample-input.txt 内の英文に品詞を付与せよ，というコマンド。ちなみに，sample-input.txt はダウンロードしたファイル一式に最初から含まれているお試し用のファイル。

以下のような結果が得られる。「単語_品詞」の形式で出力され，最後の行に処理した単語数や時間が出力される。

>
A_DT passenger_NN plane_NN has_VBZ crashed_VBN shortly_RB after_IN take-off_NN from_IN Kyrgyzstan_NNP 's_POS capital_NN ,_, Bishkek_NNP ,_, killing_VBG a_DT large_JJ number_NN of_IN those_DT on_IN board_NN ._.
The_DT head_NN of_IN Kyrgyzstan_NNP 's_POS civil_JJ aviation_NN authority_NN said_VBD that_IN out_IN of_IN about_IN 90_CD passengers_NNS and_CC crew_NN ,_, only_RB about_IN 20_CD people_NNS have_VBP survived_VBN ._.
The_DT Itek_NNP Air_NNP Boeing_NNP 737_CD took_VBD off_RP bound_VBN for_IN Mashhad_NNP ,_, in_IN north-eastern_JJ Iran_NNP ,_, but_CC turned_VBD round_RB some_DT 10_CD minutes_NNS later_RB ._.
Tagged 72 words at 827.59 words per second.

ちなみに，品詞付与に使う「タグセット」というタグの一覧があるが，上記のモデルで処理する際には，Penn-treebank の（有名な）タグセットが使っている。タグ一覧は，[こちら](https://www.sketchengine.eu/penn-treebank-tagset/)を参照。

他の品詞付与プログラムの使い方については，また後日...。
CentOS 7系でLaravel 5.8を動かす最短手順

# CentOS 7系でLaravel 5.8を動かす最短手順
centos7系でlaravel5.8を動かす最短手順です。
細かい説明は省きます！

## 環境
- vagrant: 2.2.3
- virtual: box 6.0
- vagrant box: bento/centos-7.6
- OS: CentOS 7.6
- DB: mysql5.7

##前準備
### centos7系のremiをダウンロードする
```
$ sudo rpm --import http://vault.centos.org/RPM-GPG-KEY-CentOS-7
$ sudo rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
$ sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

### PHP 7.3をremiでダウンロードする
```
$ sudo yum install php --enablerepo=remi-php73 php-xml php-mbstring php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysql php-mysqlnd php-pecl-mysql php-zip
```

### [composer]('https://getcomposer.org/download/')をインストール
```
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
$ sudo mv composer.phar /usr/bin/composer
```

### mysqlのインストール
```
//mariadbとデータフォルダの削除
$ sudo yum remove mariadb-libs
$ rm -rf /var/lib/mysql/

//インストール
$ sudo yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
$ sudo yum -y install mysql-community-server

//初期パスワード確認
$ grep password /var/log/mysqld.log

//ログイン
$ mysql -uroot -p
Enter password: {初期パスワード}

//パスワード変更
mysql> set password = password('{パスワード}');

//データベース作成
mysql> create database {データベース名};
```

### Laravelをインストール
```
$ composer global require laravel/installer
```

## プロジェクト作成
### Laravelプロジェクト作成
```
$ composer create-project "laravel/laravel=5.8" {プロジェクト名}
```

### 設定ファイル(.env)変更
```:.env
APP_URL={vagrant private ip}

DB_DATABASE={データベース名}
DB_USERNAME=root
DB_PASSWORD={パスワード}
```

### npmインストール (Vue.jsなどを使う場合)
```
//centos内ではなく、mac上でするのがオススメ
$ npm install
```


##参考文献
- [https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=3523]('https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=3523')
- [https://weblabo.oscasierra.net/installing-mysql57-centos7-yum/]('https://weblabo.oscasierra.net/installing-mysql57-centos7-yum/')
よく見るけど、なんだっけこれ？用語集

###あ、前も調べたなこれ...ってなるやつ！！

#脆弱性（ぜいじゃくせい）
コンピュータのOSやソフトウェアにおいて、**プログラムの不具合や設計上のミスが原因となって発生した情報セキュリティ上の欠陥**のことを言います
#YAGNI
You ain't gonna need it
そんなの必要ないって！
（機能は実際に必要となるまで追加しないほうがよい）
#N+1問題
リレーションによるレコードの取得で起こる。**内部的にAを取り出し、そこから一つ一つAに関連付けられてるBを取り出すというクエリが発行されている。**
N個のレコードがあった場合、一度レコード取得を実行するとN+1回もDBにアクセスしてしまう。
#クラウド（クラウド・コンピューティング）
インターネットなどの**ネットワーク経由でユーザーにサービスを提供する形態**。
ユーザーがソフトウェアやデータの物理的な保存場所（サーバーの設置場所）を意識することなく、「雲の中に隠れたコンピューターから提供されるサービスを利用する」というイメージからきている。
https://www.internetacademy.jp/it/server/server-basic/merit-and-demerit-of-cloud.html
#ビットコイン
ビットコインは、新しい決済システムと完全な**電子通貨**を実現するものであり、中央機関や仲介者を必要としない、ユーザーによる初の分散型P2P決済ネットワークです。ユーザーの観点からは、ビットコインは**インターネット上のお金**の様なものです。

紙幣などの実物がないピュアな**「情報(データ)」であるビットコイン(BTC)の取引は「ブロックチェーン」**という技術によって管理されます。
#ブロックチェーン
分散型台帳技術、または、分散型ネットワーク。
世界各地に散らばる「ノード」によって取引履歴を記録する台帳が分散管理されていることから、分散型台帳技術と呼ばれるようになりました。ビットコインではこの方式を採用することで、悪意のあるユーザーによる過去の取引履歴の改ざんが困難になっています。
#IoT（Internet of Things）
インターネット経由でセンサーと通信機能を持ったモノ達。
例えば、ドアが「今、開いているよ。」、工場内の機械が「調子が悪いよ。故障しそうだよ。」、植物が「水が欲しいよ。」、猫の首輪が「今トイレにいるよ。」等。これらの情報をインターネットを介し様々な場所で活用することができます。
Google Apps Scriptでカンマが含まれたデータのあるシートをCSV出力する方法

#GASでCSV出力処理
Google Apps ScriptでCSV出力したかったのだけど、
データにカンマ(,)が含まれてて、サンプルソース調べたんだけど、
ジャストな記事がなかったので、あきらめて自作。
その結果を残しておく。

#コード
```JavaScript
//出力先のフォルダIDを入力。IDはURL参照。
var folderId = '(フォルダIDを記入)';

//ボタンから呼び出す処理
function createCsv() {
  var csvData = loadData('(シート名を記入)');
  writeDrive(csvData,'(出力ファイル名を記入)');
}

//CSV形式データ作成処理
function loadData(sheetName) {
  var data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getDataRange().getValues();
  var csv = '';
  var rows = data.length;
  var cols = data[0].length;

  for(var r = 0; r < rows; r++) {
    for(var c = 0; c < cols; c++) {
      csv += '"' + data[r][c] + '"' + ',';
    }
    csv += '\r\n';
  }

  return csv;
}

//CSVファイル出力処理
function writeDrive(csvData, fileName) {
  var drive = DriveApp.getFolderById(folderId);
  var contentType = 'text/csv';
  var charset = 'utf-8';
  var blob = Utilities.newBlob('', contentType, fileName).setDataFromString(csvData, charset);
  drive.createFile(blob);
}
```

#備考
GASのシンタックスハイライトって、何選べばいいのかな。
とりあえず、JavaScriptにしておいた。

""で括るかどうかとか、区切り文字何にするかとかそのうち全部指定できるように作り変えたいな。
行末のカンマとかあるし。
【Mac】キー長押しの入力速度をアップする方法

# やりたいこと
- macでキーの長押しをした時の速度をあげたい

# 方法
1. terminalを起動する
2. `defaults write NSGlobalDomain KeyRepeat -int 1` を入力する（macの環境設定で最速の設定が2なので0か１好みを設定する）
3. ログアウトして再ログインする

# 参考
- [How can I increase the cursor speed in terminal? [closed]
](https://stackoverflow.com/questions/4489885/how-can-i-increase-the-cursor-speed-in-terminal)
- [Macギークなら知っておきたいdefaultsコマンドの使い方](http://tukaikta.blog135.fc2.com/blog-entry-209.html)
LaravelクエリビルダーでIDのあいまい検索をする

# 概要
LaravelのクエリビルダーでIDのあいまい検索(1を含むIDを検索するなど)を実装する際に詰まったので，問題のあったコードとその解決策を残しておきます．

# 環境
Laravel 5.5
Postgresql 9.6

# 問題点
SQLインジェクションを避けるために，クエリビルダーのwhereRawメソッドでバインディングを行おうとしましたが，エラーが発生して実行できませんでした．

#### 問題のあるコード
以下はすべて動作しません．

```php
$query->whereRaw("CAST(books.id AS TEXT) LIKE %?%",[1]);        //1
$query->whereRaw("CAST(books.id AS TEXT) LIKE % ? %",[1]);      //2
$query->whereRaw("CAST(books.id AS TEXT) LIKE '%?%'",[1]);      //3
$query->whereRaw("CAST(books.id AS TEXT) LIKE '% ? %'",[1]);    //4
$query->whereRaw("CAST(books.id AS TEXT) LIKE '%' ? '%'",[1]);  //5
```

1,2の場合は，

```sql
WHERE CAST(books.id AS TEXT) LIKE %1%
```

というSQLが実行されます．バインディングはされますが，%1%の部分を' 'で囲めていないためにエラーが生じます．

3,4では，?を' 'で囲んでしまうと，

```sql
WHERE CAST(books.id AS TEXT) LIKE '%?%'
```

というSQLが発行されますが，?が文字列として扱われるためバインディングができず，エラーが生じます．

5の場合は

```sql
WHERE CAST(books.id AS TEXT) LIKE '%' 1 '%'
```

というSQLが発行されますが，```'%' 1 '%'```の部分がエラーとなってしまいます．

# 解決策

次のようにすると動作しました．

```php
$query->whereRaw("CAST(books.id AS TEXT) LIKE '%' || ? || '%'",[1]);
```

この場合だと，

```sql
WHERE CAST(books.id AS TEXT) LIKE '%' || 1 || '%'
```

というSQLが発行され，```'%' || 1 || '%'```の部分は結合されて```'%1%'```となり，目的のSQLが発行っされます．

#### 参考
- [ドキュメント](https://readouble.com/laravel/5.5/ja/queries.html)
マルチアカウントにおける Amazon GuardDuty 

# やりたいことが以下に該当する場合は読み進めて下さい
- AWS でマルチアカウントを運用している。
- 各AWSアカウントで GuardDuty を有効にしつつ、特定のAWSアカウントで Findings を一元管理したい。

# GuardDuty のマスターアカウントとメンバーアカウントを設定する
GuardDuty にはマスターアカウントとメンバーアカウントという概念がある。
マスターアカウントでは、紐づけたメンバーアカウントの Findings を透過的に閲覧、管理できる。
詳しくはきちんとしたドキュメントがあるので、参照してほしい。
https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/guardduty_accounts.html

## GuardDuty を有効にする
まず、それぞれの AWS アカウントで、GuardDuty を有効にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840/eeed161c-0cbc-5666-fceb-4311794e6eb0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840/9a254fb8-dcdf-0f25-45e3-62a8e89e07d3.png)

## マスターアカウントを設定する
マスターアカウントにしたい AWS アカウントにログインして、マスターアカウントの設定を始める。
(マルチアカウント戦略においては、おそらくは監査用AWSアカウントのようなものがあるはずで、それをマスターアカウントにすることが多いと思う)

マスターアカウントの GuardDuty の設定画面で `Accounts` を選択し、`Add accounts` でメンバーアカウントを追加していく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840/a0a65eb0-33f1-f332-b780-494031863ebd.png)

追加時に必要な情報は `AWS Account Id` と `ルートアカウントのメールアドレス` となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840/8e50aa67-581b-5f54-75a3-7267f5482cdb.png)

情報を入力して、 `Add` を選択すると追加予定リストに追加される。
`Next` を選択すると、招待画面に遷移する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840/71bb6adc-223d-ca01-839b-6dda1ec77431.png)

招待画面で `Invite` を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840/96fec47f-da85-b78d-d4c7-3b680d52d7cd.png)

ダイアログで、 `Send invitation` を選択する。これでメンバーアカウントに招待が飛ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840/7740504e-f24a-519e-1a1e-c591fa49520e.png)

## メンバーアカウントを設定する
メンバーアカウントの GuardDuty の設定画面で `Accounts` を選択すると招待が届いているので `ACCEPT` トグルを enable にし、 `Accept invitation` を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840/98e275f5-57bc-ced4-2e0e-d5190df7a9e0.png)

メンバーアカウントがマスターアカウントにリンクされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840/a6972e3d-0124-5c29-00eb-c7051824f7a8.png)

これで、メンバーアカウントの GuardDuty がマスターアカウントから透過的に管理できるようになる。
Django チュートリアル[その４]

[公式Djangoドキュメント　チュートリアル４](https://docs.djangoproject.com/ja/2.2/intro/tutorial04/)
#要約
##簡単なフォームを書く
[画面遷移]

- [1] `index.html (8000/polls/)`
- [2] "What't up?"を選択
    - `path("<int:question_id>/", views.detail, name = "detail")`
    - `<a href = "{% url 'polls:detail' question.id %}">{{ question.question_text }}</a>`
    - `return render(request, "polls/detail.html", {"question": question})`
- [3] `detail.html (8000/polls/1/)`
- [4] ラジオボタンを選択して"vote"
    - `path("<int:question_id>/vote/", views.vote, name = "vote")`
    - `<form action = "{% url 'polls:vote' question.id %}" method = "post">`
    - `return HttpResponseRedirect(reverse("polls:results", args = (question.id, )))`
- [5] `results.html (8000/polls/1/results/)`
    - `again`で[3]に戻る

```python
[1]
#index.html
{% if latest_question_list %}
	<ul>
	{% for question in latest_question_list %}
		<li><a href = "{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
	{% endfor %}
	</ul>
{% else %}
	<p>Mo polls are available.</p>
{% endif %}
```
```python
[2]
#views.py
def detail(request, question_id):
	question = get_object_or_404(Question, pk = question_id)
	return render(request, "polls/detail.html", {"question": question})
```
```python
[3]
#detail.html
<h1>{{ question.question_text }}</h1>

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action = "{% url 'polls:vote' question.id %}" method = "post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
	<input type = "radio" name = "choice" id = "choice{{ forloop.counter }}" value = "{{ choice.id }}">
	<label for = "choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
{% endfor %}
<input type = "submit" value = "Vote">
</form>
```
```python
[4]
#views.py
def vote(request, question_id):
	question = get_object_or_404(Question, pk = question_id)
	try:
		selected_choice = question.choice_set.get(pk = request.POST["choice"])
	except (KeyError, Choice.DoesNotExist):
		return render(request, "polls/detail.html", {"question": question, "error_message": "You didn't select a choice.", })
	else:
		selected_choice.votes += 1
		selected_choice.save()
		return HttpResponseRedirect(reverse("polls:results", args = (question.id, )))
```
```python
[5]
#results.html
<h1>{{ question.question_text }}</h1>

<ul>
{% for choice in question.choice_set.all %}
	<li>{{ choice.choice_text }}  -- {{ choice.votes }} vote{{ choice.votes | pluralize }}</li>
{% endfor %}
</ul>

<a href = "{% url 'polls:detail' question.id %}">Vote again?</a>
```
nilに対してメソッドを使った時のエラーの回避方法　(ぼっち演算子「&」使い方)

ぼっち演算子の使い方をアウトプットしてみた。


例）
Deviseを使用したときのcurrent_userに対して、nicknameカラムに
あるデータを取得して@ nicknameに代入することを意図したコードがある。

```
@nickname = current_user.nickname
```
このような記述の場合、ログインしていない時に、これを実行するとnilに対してメソッドを使おうとしてエラーになってしまう。このようなエラーを**ぼっち演算子**を用いて、回避する方法を解説する。


#ぼっち演算子とは何か？

ぼっち演算子とは、オブジェクトの中身がnil(空、値が代入されていない)の場合に、**nilという値**変換して、**nilという値**をオブジェクトに代入する演算子をいう。別名では、Null条件演算子と言われることもある。

Railsの場合、Rubyは2.3.0以降から、& 「アンパサンド」というぼっち演算子が使用できるようになっている。

#ぼっち演算子「&」使い方

```
@nickname = current_user&.nickname
```

current_userというメソッドに続けて&を記述するだけで完了する。

処理の流れは、
current_userメソッドがに値が代入されている(nilではない)場合のみ、右辺のメソッドが実行される。そして、もしnilであった場合は、全ての演算結果としてnilを返すことになる。つまり、@ nicknameにnilという**値**が代入される。

＜参考記事＞
・https://kossy-web-engineer.hatenablog.com/entry/2018/09/20/060701
・https://ja.wikipedia.org/wiki/Null%E6%9D%A1%E4%BB%B6%E6%BC%94%E7%AE%97%E5%AD%90
・https://matt-note.hatenadiary.jp/entry/2018/11/14/083307