OmniAICreator/Qiita-1.07M huggingface dataset:
vagrantとdockerで自分用GitLabを構築

# 目的

GitHubがMicrosoftに買収されてからGitLabに移行する人が多かったので、流行りに乗ってみました。
乗るしかないでしょこのビックウェーブに！

## 構築環境

Vagrant + docker(docker-compose) で構築しています。

| 名前 | バージョン |
|:-:|:-:|
| ホストOS | Windows8.1 |
| VirtualBox | 5.2.12 r122591 (Qt5.6.2) |
| Vagrant | 2.1.2 |
| BOX | ubuntu/bionic64 |
| docker | 18.03.1-ce |
| docker-compose | 1.17.1 |
| コンテナ | gitlab/gitlab-ce:latest |

## 構築方法

任意のフォルダに`Vagrantfile`と`docker-compose.yml`を置きます。
PowerShellなどで、フォルダに移動して、`vagrant up`とすれば自動で作成してくれます。
後は、指定したIPにブラウザでアクセスするだけです。
(vagrant up後にGitLabが起動するため、少し時間がかかってます。)

`Vagrantfile`と`docker-compose.yml`の中身は下記になります。


# Vagrantfile

``` vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  # 使用したいボックスを選択
  # boxes at https://vagrantcloud.com/search.
  config.vm.box = "ubuntu/bionic64"

  # IPアドレス(DHCPの場合は、", ip:～"は不要)
  config.vm.network "public_network", ip: "192.168.0.100"

  # ホスト名
  config.vm.hostname = "VM-GitLab"

  # 共有フォルダ
  # dockerfileの場所を共有フォルダとしています。
  config.vm.synced_folder "E:\\dockerfile", "/dockerfile", type: "virtualbox"

  config.vm.provider "virtualbox" do |vb|

    # Display the VirtualBox GUI when booting the machine
    vb.gui = false

    # 仮想マシン名
    vb.name = "GitLab"

    # CPU数
    vb.cpus = 2

    # メモリー
    # 4096Mbyteが推奨らしい。
    vb.memory = "4096"

  end

  # シェルスクリプト
  config.vm.provision "shell", inline: <<-SHELL

    apt update
    apt install -y apt-transport-https ca-certificates curl software-properties-common git
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
    add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    apt update
    apt install -y docker-ce
    apt install -y docker-compose
    cd /dockerfile
    docker-compose up -d

    echo "TZ=Asia/Tokyo" > /etc/environment

  SHELL

end
```


# docker-compose.yml

```docker-compose.yml
web:
  # 使用するイメージ
  image: 'gitlab/gitlab-ce:latest'
  # ゲストOSが起動したら自動的に起動させる。
  restart: always
  # ホスト名
  hostname: 'gitlab.example.com'
  # 環境変数
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'http://192.168.0.100'
      gitlab_rails['gitlab_shell_ssh_port'] = 2222
  # ポートフォワード
  ports:
    - '80:80'
    - '443:443'
    - '2222:22'
  # 共有ディレクトリ
  # GitLabデータをゲストOSの上に保存する。
  volumes:
    - '/srv/gitlab/config:/etc/gitlab'
    - '/srv/gitlab/logs:/var/log/gitlab'
    - '/srv/gitlab/data:/var/opt/gitlab'
```

# おわりに

はじめはdocker-compose.ymlの環境変数らへんの設定がわからずに苦労しました。
gitlab_railsの設定があまりわかってないので、もう少し調べたいと思ってます。
Ansible の handler を使ってみる

# handler とは

他の処理にフックして、処理を走らせることが出来る。
他の処理で changed のイベントが起こった時に、一度だけ、最後に handler 処理が走る。

タスク側では `notify` を設定し、 handler側では `listen` でそれを待ち受ける。

## playbook の例

```yaml:handler.yml
---
- hosts: localhost

  handlers:
    - debug:
        msg: i am the handler
      listen: hook to me
    - debug:
        msg: you are the handler
      listen: hook to you
    - debug:
        msg: he is the handler
      listen: hook to him

  tasks:
    - debug:
        msg: message
      changed_when: true
      notify: hook to me
    - debug: 
        msg: try to hook to me
      changed_when: true
      notify: hook to me  # hook twice but run handler once
    - debug:
        msg: try to hook to you
      changed_when: true
      notify: hook to you
    - debug:
        msg: try to hook to him
      changed_when: false # no changed no hook
      notify: hook to him
```

# 実行例

tasks が終わった後に、二種類の handler が実行されているのが分かる。
(playbookでは三回notifyしているが、同じ種類のhandlerが走るのは一回だけ。changed でない場合もhandler処理は走らない)

```bash
$ ansible-playbook handler.yml


PLAY [example] *****************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [debug] *******************************************************************
changed: [localhost] => {
    "msg": "message"
}

TASK [debug] *******************************************************************
changed: [localhost] => {
    "msg": "try to hook to me"
}

TASK [debug] *******************************************************************
changed: [localhost] => {
    "msg": "try to hook to you"
}

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "try to hook to him"
}

RUNNING HANDLER [debug] ********************************************************
ok: [localhost] => {
    "msg": "i am the handler"
}

RUNNING HANDLER [debug] ********************************************************
ok: [localhost] => {
    "msg": "you are the handler"
}

PLAY RECAP *********************************************************************
localhost                  : ok=7    changed=3    unreachable=0    failed=0   


```


# 環境

- ansible 2.6.0

# 参考

- [Intro to Playbooks — Ansible Documentation](https://docs.ansible.com/ansible/devel/user_guide/playbooks_intro.html#handlers-running-operations-on-change)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
rspec中にsystemの標準エラー出力を出力したくない

バッチ処理などでsystemを使って処理をしているのですが、その際に処理中のメッセージなどが標準エラー出力に出力されます。
バッチ処理中にはそういったログが残って欲しいのですがrspec中に出力されるとテスト結果が長くなり邪魔です。

というわけで、rspecでsystemを実行する際にオプションにmergeして対応しました。

```rb
  before(:each) do 
    original_system = Object.method(:system)
    allow_any_instance_of(Object).to receive(:system) { | *args |
      option = {:out => "/dev/null", :err=>"/dev/null"}
      if args.last.is_a? Hash
        option = args.pop.merge(option)
      end 
      original_system.call(args.last, option)
    }
  end
```
NUC8i7HNKにUbuntu16.04をインストール

NUC8i7HNKにUbuntu16.04をインストールした際のメモです。NUC8i7HVKも同様だと思われます。基本的には現時点（2018年6月）ではだましだまし動かす感じです。


## 手順

- BIOS
    - Version 44
    - Performance＞Graphics＞Intel iGD をEnableにしておく
- 起動USBメモリを作成
- USBメモリから起動、その際にKernelOptionを修正しないとGUI画面が表示されない
    - nomodeset
- Install後にKernelOptionを修正しておく
    - /etc/default/grub を編集
        - GRUB_CMDLINE_LINUX_DEFAULT="quiet nosplash nomodeset"
        - 補足： LUKS使う場合はnosplashにしておかないとLUKSのPWが起動時に入力できない
    - sudo update-grub　で更新
- 以上でひとまずUbuntuが起動はするようになる
    - 16.04でも動いたが、18.04のほうが無難とおもいます（アプリの事情もありまだ16・04を使ってます）

## バージョンメモ

- BIOS version
    - 37 OK
    - 44 OK
- kernel
    - 4.4.0-127 OK
    - 4.4.0-130 OK
   

## Radeon™ RX Vega M GL graphics を有効にする (WIP)

- How-To Install/Uninstall AMD Radeon™ Software AMDGPU-PRO Driver for Linux® on an Ubuntu System
    - https://support.amd.com/en-us/kb-articles/Pages/AMDGPU-PRO-Install.aspx

いまのところ失敗。Kernelを最新に差し替えれば動くかもしれないが未確認。


## トラブルメモ

- 起動がちょっと遅い
- サスペンドすると復帰できない（X上がらない）ので注意
- Compizが暴走
    - 4.18にしてGPUドライバを導入か？
- Radionのドライバが不調でXが上がらなくなったとき
    - Recovery mode で起動
        - enable network
        - root
        - DNSが引けないときは /etc/resolv.conf を修正
    - AMD GPUドライバを削除
        - dpkg -l amdgpu-pro
        - amdgpu-pro-uninstall
    - Xドライバを再導入
        - apt-get install --reinstall xserver-xorg
    - reboot


## NUC8i7にUbuntu/Linuxを導入する際のトラブル例

- nuc8i7hnk could not install ubuntu 18.04/16.04, is it?
    - https://communities.intel.com/thread/126824
    - AMDのドライバは4.18からの模様
- Hades Canyon NUC8i7HNK can install but can't boot
    - https://askubuntu.com/questions/1051446/hades-canyon-nuc8i7hnk-can-install-but-cant-boot
    - https://askubuntu.com/questions/1037865/hades-canyon-nuc8i7hvk-can-install-but-cant-boot
    - nomodeset
    - GPU FW必要
- Graphics drivers for Intel NUC Hades Canyon NUC8i7HVK (AMD Radeon RX Vega GH)
    - https://askubuntu.com/questions/1040440/graphics-drivers-for-intel-nuc-hades-canyon-nuc8i7hvk-amd-radeon-rx-vega-gh
    - 手順
- NUC8i7HNK1 and Ubuntu
    - https://askubuntu.com/questions/1048979/nuc8i7hnk1-and-ubuntu/1050969#1050969
    - BIOSでGPUをOFF
Swift4でインカメラの使用

Swift4でインカメラのを取得して使用。
備忘録なので当該箇所のみ。

```swift
var captureDevice: AVCaptureDevice?
    let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera, .builtInTelephotoCamera],
                                                            mediaType: AVMediaType.video,
                                                            position: .front)
    for device in discoverySession.devices {
        let devicePosition: AVCaptureDevice.Position = .front
        if (device as AnyObject).position == devicePosition {
            captureDevice = device
        }
    }
    if captureDevice == nil {
        print("Error: no camera devices available")
        return false
    }

    guard let videoInput = try? AVCaptureDeviceInput(device: captureDevice!) else {
      print("Error: could not create AVCaptureDeviceInput")
      return false
    }
```

- `.builtInTelephotoCamera` は要らない気がするが念のため。
- あとは `videoInput` を `AVCaptureSession` にセットしてよしなにする。
Blazor0.5.0-preview1-10328付近での変更内容

# 過去に作ったもの
前回作成したときは0.1.0のテンプレを元に0.2.0でも一応動いていた物でしたが、割かし破壊的な変更が多かったため、軽くメモっておこうと思います。
以下は以前の
* [１準備編](https://qiita.com/lensouko/items/3aff7311887470ad0905)
* [２実装編](https://qiita.com/lensouko/items/f28dbbaf4dc8cedeff26)
* [３実用っぽいの編](https://qiita.com/lensouko/items/f4716d90e4673b118c46)

# 変更対応
Blazorはかなり頻繁に更新しており、時々破壊的な変更が入ります。そのため、せっかく作ったプロジェクトを毎回作り直しは面倒なので何とか変更して対応していっているのでどないしたのかっていうメモです。
変更を一通り反映させたものは[ソース(GitHub)](https://github.com/lensouko/SignalBlazorR)にあります。使い方が変わったものはBlazorのソースを一式落としてから探し出していますので、やっちゃまずいやり方があるかもしれません。

## プロジェクトの設定
これは、拡張機能を最新へ更新してから新規プロジェクトを作成して、プロジェクトの右クリックメニューでプロジェクトファイル（ファイル名が表示されています）の編集で中を見ます。
おおむね、「<PropertyGroup>」あたりをコピペして上書きしてから開きなおすとある程度何とかなります。
ビルドが通らない場合はルートの「_ViewImports.cshtml」にある@using ～を一通り見比べて自分が追加したもの以外をそろえると良いかと思います。

## 0.2.0から変更されて0.3.0で新しい文法しか使えなくなったもの
ボタンのクリックイベントやデータのバインドですが、`@onclick(イベントハンドラ)`は`onclick="@イベントハンドラ"`に、`@bind=変数名`は`bind=変数名`に変わりました。他にも変わった気がしますがこれが大きなトピックかな？

## 0.5.0に変わった直後あたりでの変更
Pagesディレクトリのコンポーネントを別ページ内に埋め込むとビルドエラーになりました。埋め込む場合はSharedに持って行ってそれだけのページが欲しい場合はから枠ページを用意して埋め込めってことなのかもしれません。

## 0.5.0のpreview1-10320からpreview1-10328の間の変更
JsonUtilが非推奨になりました。また、JavaScriptで登録したメソッドを呼ぶ形から、window.～でメソッドを用意して`JSRuntime.Current.InvokeAsync<T>`で呼び出すようになりました。非同期じゃない呼び方はあるにはあったんですが、キャストしてInvokeを呼び出すみたいでまた変更が入るような気がしなくもないです（ひょっとしたら別クラスのメソッドで同じように呼べるのかもしれませんが）。ちなみに[PullRequestの#1033「JavaScript interop v3」](https://github.com/aspnet/Blazor/pull/1033)での変更のようです。
DNS Queries over HTTPSでのTTLとCache-Control

DNS Queries over HTTPSにおいて、HTTPのキャッシュとDNSのキャッシュの話が面白かったのでメモ

## DoH
IETFで「[DNS Queries over HTTPS (DoH)](https://tools.ietf.org/html/draft-ietf-doh-dns-over-https-12)」と呼ばれる、HTTP上でDNS通信を行うプロトコルが議論されている。DoHと呼ばれており、実装もすでに広く行われている。

外とのDNS通信を遮断するようなネットワークでもHTTPSとして出ていくため経路上からは判別することができない。特にHTTP2などで通常のWebサーバとのコネクション上でDNSクエリが送られれば見分けはつかない。

また、CDNからの配信も既存のWebの仕組みに乗っかることができるほか、HTTP/2 ServerPushも行えるなど応用の幅は広い。

### 例
GETとPOSTに対応しているが、GETでwww.example.comの名前解決を行う例を示す。

このように、HTTPリクエストのパラメータにbase64urlエンコードしたDNSクエリが付加される。

```
   :method = GET
   :scheme = https
   :authority = dnsserver.example.net
   :path = /dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
   accept = application/dns-message
```

レスポンスはボディにDNSレスポンス入って返ってくる。この例は結果として192.0.2.1 TTL=128のDNSレスポンスである。

```
   :status = 200
   content-type = application/dns-message
   content-length = 64
   cache-control = max-age=128

   <64 bytes represented by the following hex encoding>
   00 00 81 80 00 01 00 01  00 00 00 00 03 77 77 77
   07 65 78 61 6d 70 6c 65  03 63 6f 6d 00 00 01 00
   01 03 77 77 77 07 65 78  61 6d 70 6c 65 03 63 6f
   6d 00 00 01 00 01 00 00  00 80 00 04 C0 00 02 01
```

## TTLとCache-Control
HTTPにはCache-Controlヘッダというキャッシュを制御するヘッダがある、一方でDNSの世界にはTTLと呼ばれるキャッシュしてよい期間を示すパラメータがある。

DoHを利用するとき、CDNやその他のキャッシュサーバはDoHを解釈せずにDoHのメッセージをキャッシュする可能性があります。そのため、DoHサーバ(レスポンスを生成するオリジン)は、生成するDoHレスポンスのTTLに合わせて`Cache-Controlヘッダ`を指定する必要があります。

具体的に、DNSレスポンスに含まれる複数レコードのTTLがそれぞれ`30`, `600`, `300`だったら、`Cache-Control: max-age=30`を指定することになります。Ageヘッダが付いている場合、DoHクライアントはTTLからAgeの値分を引いて処理する必要があります。

アンサーセクションがなくSOAレコードをもつ場合、MINIMUMの値よりも短い期間のみキャッシュするようにしなければなりません。

通常のHTTPと同様に、`Cache-Controlヘッダ`で`stale-if-error`, `stale-while-revalidate`を指定することで名前解決に失敗したときのみキャッシュを使ったり、キャッシュをひとまず使ってから更新がないか問い合わせるという事もできます。
[Python]WatsonのSpeech To Textを使うお話

# 概要
PythonからIBMのAI、Watsonに音声データを送信していわゆる音声認識をしましょうというお話です。

# 環境
* MacBook Pro high Serra 10.13.5
* Python 3.6.6
* pip 10.0.1
* Visual Studio Code

# 準備
* Pythonのインストール(いうまでもなく)
* IBM Cloudアカウントの入手  
https://www.ibm.com/watson/developercloud/
からアカウントを作成する。

# 手順

1. Pythonで`watson-developer-cloud`を使えるようにする。
2. Watsonにアクセスするusername、passwordを取得する。
3. Watsonに音声データを送信する。
4. Watsonの結果を表示する。

## Pythonで`watson-developer-cloud`を使えるようにする。
ターミナルで次のコマンドを打ちます。

```Python
pip install "watson-developer-cloud>=1.4.0"
```

最後の行に`Successfully"と表示されていれば大丈夫です。

Windowsでうまく行かない人はもしかしてVisual Build Toolsがインストールされていないかも？
https://qiita.com/white0221/items/b48f1b64dbd810e21702
以前まとめたものです。

## Watsonにアクセスするusername、passwordを取得する。
IBMのサイトでSpeech To Textを選んで作成し、視覚情報を得ます。

```
{
  "url": "https://stream.watsonplatform.net/text-to-speech/api",
  "username": "••••••••••••••••••••••••••••••••••••",
  "password": "••••••••••••"
}
```

こんな風にマスクされているので右上の目のマークを押して表示させます。

このusernameとpasswordを用いてwatsonと通信を行います。

## サンプルコード
今回は`voice.wav`ファイルを送信することにします。また、音声データは日本語として認識するように`ja-JP_BroadbandModel`を指定します。サポートしている音声ファイルや言語はIBMの[API reference](https://www.ibm.com/watson/developercloud/speech-to-text/api/v1/python.html?python#introduction)を参照。音声ファイルは頑張って録音して、wav形式でなければオンラインコンバータか何かでコンバートしましょう。返却データはjson形式です。

```python:SpeechToText.py
from watson_developer_cloud import SpeechToTextV1
import json

# define
user = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
pswd = "xxxxxxxxxxxx"
audio_file = open("voice.wav", "rb")
cont_type = "audio/wav"
lang = "ja-JP_BroadbandModel"

# watson connection
stt = SpeechToTextV1(username=user, password=pswd)
result_json = stt.recognize(audio=audio_file, content_type=cont_type, model=lang)

# print
for i in range(len(result_json["results"])):
    print(result_json["results"][i]["alternatives"][0]["transcript"])

# json file save
result = json.dumps(result_json, indent=2)
f = open("result.json", "w")
f.write(result)
f.close()
```

## 実行例
```
$ python SpeechToText.py
こんにちは ワトソン の　音声認識　テスト　です  
```


```json:result.json

{
  "results": [
      {
          "alternatives": [
              {
                  "confidence": 0.xxx,
                  "transcript": "こんにちは ワトソン の　音声認識　テスト　です "
              }
          ],
          "final": true
      }
  ],
  "result_index": 0
}
```

# まとめ
こんな感じに以外と手軽にできました。
おそらく英語ができればもっと色々できると思うんですが・・・。
~~IBMさん、ドキュメントの日本語化お願いします。~~

WebSocketを用いてリアルタイム音声認識ができるはずなので模索中です。できたら記事にします。

# 参考文献
https://www.ibm.com/watson/developercloud/speech-to-text/api/v1/python.html?python#introduction
https://qiita.com/nanako_ut/items/7d53c81b89cdeae1e676
boto3で二段階認証を使用する方法

## AWSの二段階認証

AWSへのアクセス、キーを使用する時に個人の携帯に入れている認証デバイスで発行されているワンタイムパスワードを入力しないと、
AWSへの機能が制限される仕組み。
大規模開発において、よりセキュアな個人アカウントの管理方法としてAWSから提供されている

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa.html

## 問題

セキュアなのは良いが、面倒くさい。ある程度テンプレートを用意しないと開発の効率が落ちる。


## やり方

こんな感じにやる

`regions`は全てのリージョンに対して処理をしているが、適宜減らしても問題なし。

``` py
import boto3
import argparse

config = {
    "device": "",
    "AccessKeyId": "",
    "SecretAccessKey": "",
    "regions": ['us-east-1','us-east-2','us-west-1','us-west-2','ca-central-1','eu-central-1','eu-west-1','eu-west-2','eu-west-3','ap-northeast-1','ap-northeast-2','ap-southeast-1','ap-southeast-2','ap-south-1','sa-east-1']
}

def set_param():
    parser = argparse.ArgumentParser()
    parser.add_argument('-mfacode', dest='mfacode', default="")
    parameter = parser.parse_args()
    return parameter

def get_one_time_token(access_key_id,secret_access_key,device,mfa_code):
    duration_seconds = 86400
    client = boto3.client('sts',aws_access_key_id =access_key_id,aws_secret_access_key = secret_access_key)
    response = client.get_session_token(DurationSeconds=duration_seconds,SerialNumber=device,TokenCode=mfa_code)
    return response

def main():
    parameter = set_param()
    token =  get_one_time_token(config['AccessKeyId'],config['SecretAccessKey'],config['device'],parameter.mfacode)
    
    one_time_access_key_id = token['Credentials']['AccessKeyId']
    one_time_secret_access_key = token['Credentials']['SecretAccessKey']
    session_token = token['Credentials']['SessionToken']
    for region in config['regions']:
        #Please input main function
        print 'This region is ' + region
        instance_name = 'hogehoge'
        ec2_client = boto3.client(
            'ec2',
            aws_access_key_id = one_time_access_key_id,
            aws_secret_access_key = one_time_secret_access_key,
            region_name = region,
            aws_session_token = session_token
        )
        response = ec2_client.describe_instances(Filters=[{'Name':'tag:Name','Values':[instance_name]}])
        print response
main()

```
Terraformを使ってAWS環境を構築するやり方(Backend機能を利用)

前回の続きから・・・

今回は複数人で同じ環境を変更する際に必要な対応になります。
前回gitignoreにて、しれっと管理外にした「*.tfstate」ファイルですが、これが重要になります。

こちらのファイル何かというとJSON形式で実際に設定した詳細な情報がかいてあります。
作成したユーザーのアクセスキーとかも記載されているので取扱いは注意が必要。

下記の設定を行うとapplyした際にS3に保存するという動きに変わり、ローカルに残さないようになります。

設定方法については以下を参考にしました。

Terraform v0.11でAmazon S3 backendを使ってtfstateファイルを管理する
https://qiita.com/marshmallow911/items/e8c05f580d07451fcf5e

TerraformのBackend機能を利用して.tfstateを管理する
https://qiita.com/siro33950/items/1b94bc8234c46e440057

# 修正点

1. アクセスキーの管理を環境変数にしないと上手く動作しませんでした。

* terraform.tfvarsを削除
* envファイルの作成

````sh:aws/.env
AWS_ACCESS_KEY_ID=**********************
AWS_SECRET_ACCESS_KEY=**********************
AWS_DEFAULT_REGION=ap-northeast-1
````

1. main.tfを編集 

````json:main.tf
terraform {
    required_version = ">= 0.11.7"

    backend "s3" {
        bucket = "terraform-state-bucket" <- ユニークなるように変更
        key    = "terraform.tfstate.aws"
    }
}

provider "aws" {
}
````

1. シェルが環境変数を読み込むように編集 

````sh:bin/terraform_aws.sh
#!/usr/bin/env bash

set -eu

SCRIPT_DIR=$(cd $(dirname $0); pwd)

cd $SCRIPT_DIR/../

docker run --env-file $(pwd)/aws/.env -i --rm -t -v $(pwd)/aws:/aws -w /aws hashicorp/terraform:light $@
````

# AWSコンソールを利用してS3にバケットを作成

main.tf内で設定したバケットを作成
例： "terraform-state-bucket"

作成時にバージョニングを設定しておくといいようです

# 実行

`$ sh bin/terraform_aws.sh init`

---

## ハマったところ

#### S3バケットを作り直したくなった...

````json:main.tf
terraform {
    required_version = ">= 0.11.7"

    backend "s3" {
        bucket = "terraform-state-bucket"　　<- 変更
        key    = "terraform.tfstate.aws"
    }
}

provider "aws" {
}
````

バケットが見つからないというエラーで何もできなくなった
設定の再構築コマンドを実行する必要があります。

`sh bin/terraform_aws.sh init --reconfigure`

#### 再構築して、applyしたら既に存在するというエラーが出た

terraform.tfstate.aws を新しいバケットにコピー
※自分は失敗して消してしまい検証できていないです
Rustだけでmain関数の前後に処理を行う

世界は`main()`から始まるんじゃ無かったんだよ！！

```rust
#![feature(start)]

fn main() {
    println!("Hello, world!");
}

#[start]
fn start(_argc: isize, _argv: *const *const u8) -> isize {
    println!("Before the world!");
    main();
    println!("After the world!");
    0
}
```

```
$ cargo run
Before the world!
Hello, world!
After the world!
```

な、なんだってー

Q&A
=====

## いつ使うのこれ？
OS書くときとかはあると便利だったりするらしいですね
http://ykomatsu.github.io/rust/book-ja/no-stdlib.html

## nightlyでしか動かないのでは？
夜中に書いてるから良いんです！

## 元ネタはC++の話ですよね？`lasy_static!`あれば十分じゃないの
せやな(´・ω・｀)

参考
----
- [Rustでmain関数の前後に処理を行う](https://qiita.com/pf_packet/items/07e9ef7b2cf61cc8d5b8)
RailsのAMSについて学ぶ_100DaysOfCodeチャレンジ16日目(Day_16:#100DaysOfCode)

# はじめに

この記事はTwitterで人気のハッシュタグ`#100DaysOfCode`をつけて、
100日間プログラミング学習を続けるチャレンジに挑戦した16日目の記録です。

## 動作環境

* ruby 2.4.1
* Rails 5.0.1

## 現在学習している内容のリポジトリ

https://github.com/yuta-ushijima/notebook-api-on-rails

## 本日学んだこと

* AMS(Active_Model_Serializer)のCRUD操作
* belongs_toの関連付けとroutesについて

## AMS(Active_Model_Serializer)のCRUD操作

通常のCRUD操作と同じことがAMSでも可能。

## belongs_toの関連付けとroutesについて

Kindモデルに対してContactモデルがbelongs_toであるような関係の場合、ルーティングをネストさせることでURLに関係性を持たせることができます。

実装する時のポイントとしは、resourceの部分をresourcesのブロック内に記述すること。

```
Rails.application.routes.draw do
  resources :kinds
  resources :contacts do
    resource :kind, only: [:show]
  end
end

# 上記の実装により、ブロックの箇所では、以下のようなURLが生成されます

/contacts/:contact_id/kind

```

また、通常のルーティングと同じく、onlyオプションによって、対象となるアクションの絞り込みが可能です。
Pythonのpipインストールエラーでハマった話[Windows]

# 概要
Windows 10にて pip install時のMicrosoft Visual C++ 14.0 is required.ってエラーにハマったので最近の解決法を載せておきます。

# エラー内容
windowsにてPythonでIBM WatsonのSpeech To Textを使いたかったので[Watson-Speech_To_Text](https://www.ibm.com/watson/developercloud/speech-to-text/api/v1/python.html?python#introduction)を読みながら

```Python
pip install --upgrade "watson-developer-cloud>=1.4.0"
```

をすると

```
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http:landinghub.visualstudio.com/visual-cpp-build-tools
```

そのあとに赤文字でなんやかんや...
しかもURLは「Not Found...」

# 解決法
__Build Tools for Visual Studio 2017__から__Visual C++ Build Tools__の__Windows 10 SDK__をインストールする。


Build Tools for Visual Studio 2017をダウンロードする。
https://visualstudio.microsoft.com/ja/downloads/
上記サイトの少し下にある
「Tools for Visual Studio 2017」の中にある「Build Tools for Visual Studio 2017」をダウンロード。

起動後自動でインストールやら何やら始まるので少し待つ...

しばらくしてウィンドウが表示されたら一番上の「Visual C++ Build Tools」にチェックを入れて右側の「概要」より、オプション一番上の「Windows 10 SDK(xx.x.xxxx)」に最低限チェックが入っていることを確認して、インストール。


再度

```Python
pip install --upgrade "watson-developer-cloud>=1.4.0"
```

を実行。Successfully!やったー！
# まとめ
windowsのpipインストール時のエラーについて、build toolsをインストールすることで解決できることを書きました。errorメッセージのリンクがフェイクで騙された...orz。調べても2015とかの情報が多くて、別のbuild toolsをインストールしても別のエラーでハマってしまったので、解決できた状況をまとめました。2018年6月現在です。

# 参考文献
http://thinkami.hatenablog.com/entry/2016/06/06/225903
UnityのEventSystemがイベントハンドラを呼び出す仕組み

## 最初に
Unityにはコンポーネントに設定されたイベントハンドラをマウスクリック等で呼び出す、イベントシステムという仕組みがあります。これがどうやって動いているかを調査したので、まとめました。

勘違いしている箇所などあればご指摘お願いします。

以下URLを参考にさせてもらいました。
http://blog.d-yama7.com/archives/190
https://docs.unity3d.com/ja/current/Manual/EventSystem.html

環境: Unity 2018.1.5f1 (64-bit)

## イベントシステムの主要なオブジェクト

### EventSystem

ゲームオブジェクトの追加でUI→EventSystemとやると、このコンポーネントが付いたオブジェクトが生成されます。
Updateメソッドで毎フレームInputModuleの処理をキックしているコンポーネントです。
また、シーン内に存在する全てのRaycasterを使って指しているオブジェクト一覧を得るなどのユーティリティ的な役割も行います。

### InputModule

マウスの状態やRaycasterから得た指しているオブジェクトを元に、実際にイベントを発生させているコンポーネントです。
既定ではEventSystemのGameObjectに最初からStandaloneInputModuleが追加されています。

### RayCaster

unityは3次元を扱うので、マウスでクリックした点から直接「何が指されているか」を求めることができません。
RayCasterはRayオブジェクトを使って「何が指されているか」を取得するためのコンポーネントです。
種類ごとにアタッチすべきGameObjectが異なるので注意が必要です。

- Graphic Raycaster - キャンバスのUI要素を指す。Canvasにアタッチする必要がある。
- Physics Raycaster    - 3D物理要素を指す。カメラのGameObjectにアタッチする必要がある。
- OVR Physics Raycaster    - Oculus用のVRコントローラーや視線から3D物理要素を指す。OVRCameraRigにアタッチする必要がある。
ちなみにOculus用のイベントシステムを動かすにはレーザーポイント先を表示するための、OVRGazePointerがシーン内に必要。

### IEventSystemHandlerを継承したインターフェース

イベント時になにかするコンポーネントは、このインターフェースを実装することでそれを実現します。
クリックされたときのイベントハンドラを定義しているIPointerClickHandler等です。

```C#
// 使い方の例
public class CubeClickEventHandler : MonoBehaviour, IPointerClickHandler {
    public void OnPointerClick(PointerEventData pointerEventData)
    {
        Debug.Log("Game Object Clicked!");
    }
}
```


## シーケンス図

以下のような感じでイベントハンドラを呼び出している……と思います。

![UnityEventSystem.png](https://qiita-image-store.s3.amazonaws.com/0/92354/ab082f3f-0482-46ef-c7cc-81a46d90519a.png)

### PlantUMLソース
```
unity -> EventSystem : Update()
note left : MonoBehaviourの\nUpdate()
EventSystem  -> InputModule : Process()
EventSystem <-- InputModule: RaycastAll(point)
note right : マウス等座標等を渡して、\nRaycasterに指されたGameObjectを\n取得してもらう
EventSystem --> Raycaster : Raycast(point)
EventSystem <-- Raycaster : raycastRsult
EventSystem --> InputModule : raycastResult
InputModule  -> EventData : 生成
activate EventData
note left : マウスボタン情報などは\nInputModuleが自前で取得して\nEventData作成、イベント発火
InputModule  -> ExecuteEvents : Execute(target,eventData)
ExecuteEvents -> "イベントハンドラが\n設定されたComponent" : OnPointerClick()等
deactivate EventData
note right : IEventSystemHandlerを継承した\nintarfaceのメソッドを呼び出す
```
Java SE Subscription


# 内容
Java SE8サポートを2025年迄(2018年からの8年間)受けることが出来る

原文：
Oracle will provide commercial support for Java SE 8 through at least 2025 including Java Web Start technology.

# 価格
サーバ/クラウド：$25 processor/月
Desktop             ：$2.5 ユーザ/月
※交渉で値引き可能？

原文：
Desktop pricing is $2.50 per user per month, or lower with tiered volume discounts. Processor pricing for use on Servers and/or Cloud deployments is $25.00 per month or lower.  


http://www.oracle.com/technetwork/java/javaseproducts/overview/javasesubscriptionfaq-4891443.html

OlacleBlog
https://blogs.oracle.com/java-platform-group/a-quick-summary-on-the-new-java-se-subscription

公式情報
http://www.oracle.com/technetwork/java/javaseproducts/javasesubscription-data-sheet-4891969.pdf

JavaSE
https://www.sejuku.net/blog/12902
ファイル名や拡張子のみなど取得

```jsx
var myFile = new File("/Desktop/abc.csv");

//GetFileName
function GetFileName(Num,FilePath){
    var returnStr="";
    var reg=/(.*)(?:\.([^.]+$))/;
    switch(Num){
        case 0 : returnStr = FilePath.name.match(reg)[0]; break; //abc.csv
        case 1 : returnStr = FilePath.name.match(reg)[1]; break; //abc
        case 2 : returnStr = FilePath.name.match(reg)[2]; break; //csv
    }
    return returnStr;
}
```
RADIUSプロトコル概要

RADIUSは認証/承認/課金でISPや携帯キャリア等大抵の会社が利用している。

# AAAモデル
RADIUSはAAAモデルの考え方を背景として実装されている。
## 認証(Authentication)
相手が利用者であるかを確認する処理
## 承認(Authorization)
利用者にどのようなことを許可するのかを決める処理
## 課金(Accounting)
利用者がサービスを利用した事実と利用内容を計測し記録する処理
JSON形式で取得したデータの日本語を文字化けしないようにした

curlでデータを取ってきた後、見やすくするため、```python -m json.tool```を使っているが、日本語が文字化けするため、見やすくしてみた。

## 環境
- OS : windows10
- python : 3.6.5

## 手順

[参考](http://zakiyamatakashi.hatenablog.com/entry/2018/05/03/220726)を元に、ensure_asciiをFalseにすれば良いと思い、直接pyファイルを修正した。

インストール先フォルダが以下だったので、
C:¥Users¥xxxx¥AppData¥Local¥Programs¥Python¥Python36

更に¥Lib¥jsonと行くと、```__init__.py```があり、120行目を

```python
def dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True,
```

から

```python
def dump(obj, fp, *, skipkeys=False, ensure_ascii=False, check_circular=True,
```
に修正

あとは、```python -m json.tool```をたたいて、テキストなどに吐き出せば文字化けが解消していた。
【swift】 tupleで二次元配列

swift、tupleで二次元配列を使ってみました。
数名の生徒が100点満点のテストを複数回受けたとします。
生徒数をstudentCount、テストの回数をrepeatCountとします。
学籍番号をid、点数をscoreとするtupleを使用します。
このコードは、[loveeさんのサンプル](https://qiita.com/BMJr/items/0907136643028860f420) を参考にさせて頂きました。

```swift
typealias TestScore = (id: Int, score: Int)
        //repeatCount: テストの回数, studentCount: 生徒数（自由に変更してください）
        let repeatCount = 3
        let studentCount = 5
        //空のtupleの二次元配列を宣言＋初期化
        var testScores = [[TestScore]]()
        for _ in 0 ..< repeatCount{
            testScores.append([])
        }
        //repeatCount回のテストでそれぞれの生徒にランダムに点数を割り当てる
        for i in 0 ..< repeatCount{
            testScores[i] = (1 ... studentCount).map{j in return (j, Int(arc4random_uniform(100)))}
        }
        //テスト結果のprint
        for i in 0 ..< repeatCount{
            print("\nテスト \(i + 1)回目")
            for testScore in testScores[i]{
                let id = testScore.id
                let score = testScore.score
                print("\(id)：\(score)点")
            }
        }
```
print結果は、以下のようになります。

テスト 1回目
1：83点
2：8点
3：7点
4：71点
5：20点

テスト 2回目
1：17点
2：72点
3：94点
4：58点
5：49点

テスト 3回目
1：19点
2：78点
3：34点
4：66点
5：35点
LaravelのHomestead環境でPostgreSQL初期設定を行う

# はじめに
LaravelのHomestead環境を構築後、PostgreSQLの初期設定をしました。
当記事では、環境構築が済んでいる前提で進めます。

Homestead環境の構築方法は[コチラ](https://qiita.com/a_shiba/items/1ece6eb49da8a1a2be5b)

# 実行環境
- PCスペック
    - OS : windows 10 Home
    - CPU : corei7 4790
    - GPU : GeForce GTX 1060 6GB
    - RAM : 16GB
- ソフトウェアバージョン
    - Laravel : 5.6.26
    - VirtualBox : 5.2.12
    - Vagrant : 2.1.2

# 用意するもの

- LaravelのHomestead環境（[Homestead環境構築](https://qiita.com/a_shiba/items/1ece6eb49da8a1a2be5b)）

# PostgreSQL接続設定

## Vagrantで仮想マシン起動

```shell
$ vagrant up
```

## Vagrantで仮想マシンにログイン

```shell
$ vagrant ssh
```

## PostgreSQLバージョン確認
Homestead環境にはPostgreSQLがデフォルトで入っているはずですが、一応確認します。

```shell

vagrant@homestead: $ psql --version

#出力例
psql (PostgreSQL) 10.3 (Ubuntu 10.3-1)
```

## PostgreSQLにログイン
```shell

vagrant@homestead: $ psql -U homestead -h localhost
# パスワードを要求されるので入力し、ログイン（デフォルトは「secret」）
```

## データベース作成
```
# UTF8指定した場合
homestead=# CREATE DATABASE db_name ENCODING UTF8;
```

## データベース確認
以下コマンドで、データベース一覧を表示します。
先ほど作成したデータベースがあるか確認してください。

```
homestead=# \l
```

## Laravelプロジェクトの環境ファイル編集
`.env`の中身を編集します。

先頭に`DB`がつく項目を変更すればOKです。

```:.env
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=db_name
DB_USERNAME=homestead
DB_PASSWORD=secret
```


# 感想
普段はMySQLを使っているので、PostgreSQLのコマンドを毎回調べるのが大変でした。
そもそもMySQLとPostgreSQLの違いが少ししか分かりません。
積極的に使って、Google先生に聞きながら覚えていこうと思います。
Clojure 基本的な操作

##はじめにleiningen環境においてセッション（計算機と利用者のやりとり）の例をみてみよう。

###1) 何も入力せず、<kbd>enter</kbd>

```clojure
user=>

user=>
```

計算機からの応答はない。エラーは起きず正しくセッションが終了する。

###2) 数字を入力、return

```clojure
user=> 87
87
user=>
```

入力した数字が表示される。

###3) 簡単な計算機(式の評価）
加法演算子+

```clojure
user=> (+ 3 2)
5
```

除法演算子/

```clojure
user=> (/ 3 2)
3/2
```

三角関数

```clojure
user=> (Math/sin 3.14)
0.0015926529164868282
```

```clojure
user=> (Math/sin 3.141592)
6.535897930762419E-7
```

```clojure
user=> (Math/sin Math/PI)
1.2246467991473532E-16
```

##次に関数の構築、すなわちスクリプトについて記述する。
###1) square

```clojure
user=> (defn square [x]
  #_=> (* x x))
#'user/square
user=> (square 5)
25
```

###2) min

```clojure
user=> (min 1 2 3 5)
1
```

minは定義済みの関数であることに注意。

###3) minimum (ユーザー定義）

```clojure
user=> (defn minimum [x y]
  #_=> (if (<= x y)
  #_=> x
  #_=> (y)))
#'user/minimum
```

この結果

```clojure
user=> (minimum 2.5 4)
2.5
```

###4) 関数の組み立て

```clojure
user=> (square (+ 3 4))
49
user=> (square (minimum 2 4))
4
```

4乗

```clojure
user=> (defn quad [x] (square (square x)))
#'user/quad
user=> (quad 2)
16
```

###5) 円の面積

```clojure
user=> (defn c_area [r] (* Math/PI r r))
#'user/c_area

user=> (c_area 2)
12.566370614359172
```

###6) カリー化
Clojureの場合は部分適用(partial)で代用する。
関数addを
add x y = x + y　とすると、
(add x)はxを足す関数である。

```clojure
user=> (defn add [x y] (+ x y))
#'user/add
user=> (def add1 (partial add 1))
#'user/add1
user=> (add1 10)
11
```
Dockerでnginxおためし環境を作る

# 前提条件
- mac
- Dockerアプリがインストール済であること  
（インストール方法は[こちら](https://qiita.com/matyahiko2831/items/dd64aa91f2b03e50f05d)をご参照ください）

# 手順
## nginxのdockerイメージを取得
```
$ docker pull nginx

# 確認
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              5699ececb21c        6 days ago          109MB
```

## コンテナの起動
```
$ docker run -d -p 8081:80 nginx
※"8081"は任意の空いているポート
```
### オプション
- -d バックグラウンド実行
- -p ホストのポート：コンテナのポート

## アクセス
http://localhost:8081
![スクリーンショット 2018-07-03 22.44.26.png](https://qiita-image-store.s3.amazonaws.com/0/172019/066010c6-95b9-cae4-7698-71e4fa408e3b.png)

次回以降は下記についてまとめる予定です。
- Dockerfileを利用して、confファイルを反映
- nginxの基本的なconf設定おためし
vue-cliのdevサーバにプライベートネットワークから接続する

## モバイル端末で確認したい
普通にローカルIPでアクセスしてもロードが終わらず設定不足を睨む

## config/index.jsにあった
下の箇所を変更

```diff:index.js
// Various Dev Server settings
- host: 'localhost', // can be overwritten by process.env.HOST
+ host: '0.0.0.0', // can be overwritten by process.env.HOST
port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
```

## 無事接続
同じネットワークのモバイル端末からweb画面を表示できました

###### (追記)
バージョン書いてませんでした。。。

```shell:
vue -V
2.9.3
```
【N予備校】crontab -e のエラーについて

第2章準備しようの10番で出てくる

毎時16分にシェルを実行するbotを作るつもりが…

```
16 **** /home/vagrant/workspace/bot/niconico-ranking.sh10 **** /home/vagrant/workspace/bot/niconico-ranking.sh
```

#crontab -e で出てきたエラー文
5分くらいつまずいた
```no crontab for vagrant - using an empty one
crontab: installing new crontab
"/tmp/crontab.TcEYJb/crontab":22: bad day-of-month
errors in crontab file, can't install.
Do you want to retry the same edit? (y/n)```

#こう書けばよかった
```
16 * * * * /home/vagrant/workspace/bot/niconico-ranking.sh
```
#無事にbotができた
```
crontab: installing new crontab
```
マウスとキーボードの反復横跳びが嫌になってきたあなたにお送りするこれだけは覚えろショートカットキー

`Ctrl+C`、`Ctrl+V`とかは知ってる人もこの手の奴っていちいち調べないから便利なのに意外に知られてないんだよな～集  
挙げだすとキリがないのでほんとに使用率高くて便利な奴だけ（随時編集するかも）

# 汎用

## Win+D
- デスクトップを表示する。シンプルに便利。
    - 突然のお母さんにもこれで安心！

## Win+1,2,3...
- タスクバーの左から数えてn番目のアプリケーションを起動する。
起動済みならアクティブにする。
複数ウィンドウがあるなら数字を押した回数でどれを開くか決定。**めちゃくちゃ便利。**
    - ちなみに`Shift`一緒に押すと起動済みでも新しいウィンドウで開く。

## Alt+Tab
- Tabキーでアプリを選択、Altを離すとそのアプリをアクティブにする。
    - 開いた順で出てくるので2つのアプリを行き来するだけなら`Alt+Tab`だけでトグルできる分`Win+1,2,3...`より便利

## Win+矢印キー
- ↑はウィンドウ最大化。↓で解除、もしくは最小化。←→で左右に寄せて半分サイズで表示。
    - デュアルディスプレイマンは`Shift`も添えてみよう。幸せになれる。

## Alt+F4
- 現在アクティブなアプリを閉じる。
    - 突然のお母さんにもこれで安心！（2回目）
        - ~~と思いきや「終了しますか？」ダイアログボックスが出て一発で消せない罠~~
    - ちなみにディスプレイでこれやるとシャットダウンできる。

# Chromeで使えるやつ

## Ctrl+Tab
- 右隣のタブをアクティブにする。
    - `Shift`を添えると左隣に

## Ctrl+1,2,3...
- 左から数えてn番目のタブを表示。
    - 1~8は上記でいいのだが、9は一番右のタブを表示する謎。~~それ0でよくね？~~
    - ~~なお筆者はしょっちゅうタブを開きすぎて機能しなくなる~~

## Ctrl+F4
- そのタブを閉じる。
    - `Alt+F4`と間違えると悲しい。
【初心者向けシリーズ】javascript(DOM)のそもそも論備忘録

どうもこんにちは。
舌の裏に口内炎ができてしまって辛い日々を過ごしている私です。

本日はjavascriptとは何たるやをざっくりまとめてみることにしました。
変わらず身内共有ようなのでごっちゃごちゃな内容かもしれませんがご容赦ください。

また、今回この記事で語るjavascriptとは、フロントの動きを作る"DOM"という小さな小さな視野の話になるので「あ？これjsやないやないか！」とかいうのは一切受け付けませんご容赦ください。

# jsは３つのステップで動きを作る
js(javascript)は、フロントエンドで動きを作る際基本的には３ステップを経て動くようになります。
３つとはざっくり『探す・発火・動く』です。
動きの”きっかけになるもの”と、それによって”動くなり煮るなり焼くなりするもの”を探し、きっかけになるものに爆弾を設置し、爆破のタイミングで動かす。。。ざっくりそんな感じです（自分でもわけわかんなくなった）
この３つの感覚をしっかりつかむと、jsと大親友になれると思うので、うざいとは言わずに一旦向き合ってみてください！！！



## 1.探す
jsで動きを作るときには、まずclassやidの付与されたhtmlタグを探します。
探すタグはこのあと出てくるイベント発火用のものと、イベント発火時に何かをするためのものを探しておきます。

```html
<div id="sample01">こんにちは</div>
<div class="sample02">こんばんは</div>
```

```js

var sample01 = document.getElementById('sample01');
var sample02 = document.getElementsByClassName('sample02');

console.log(sample01);
==><div id="sample01">こんにちは</div>

console.log(sample02[0]);//classは自動的に配列処理されるので数字ふってあげようね
==><div class="sample02">こんばんは</div>
```

##2.発火（イベント）
初心者はここで大体「お？イベントとはなんぞ？」となりますね。
イベントっていうのは、jsで何かをしたい時の”きっかけ”のことを指します。
例えば
「何かにクリックした時」
「ページがスクロールした時」
それを起こす記述自体を"イベントハンドラ"と呼びます。

jsのイベントハンドラにはたくさんのものがありますが、今回は”クリック”というイベントを例にしてサンプルコードを書いていきます。
２パターンありますが、どちらもどちらも同じ動きをします。(厳密にはちょっと違うかも？)
また、このイベントが発火することによってsample()という動作が詰まった宝箱がぱっくり開きます。

### htmlに書く場合

```html

<div id="btn" onclick="sample()">ぼたん</div>
```


### jsに書く場合

```html

<div id="btn">ぼたん</div>
```


```js

var btn = document.getElementById('btn');

btn.addEventListener('click',sample,false);
```

##3.動く
上の記述でイベントは設定できました。
先ほど書いたイベントが発火することにより、今回解説するsample（）という宝箱が発動します。
DOMは主にここの処理が肝になります。
いろんなやりかた種類があって、ここでは紹介しきれないので
(ざっくり知りたい方はこの記事みてね)
[javascript備忘録](https://qiita.com/yuchul-K/items/79474784d27d4db42f08)



今回は「イベントが発火したときにsample02のテキストが変わる」
というものをサンプルコードにします。

```js
function sample() {
sample02[0].innerHTML = 'さようなら';
}

console.log('samle02[0]');
==> <div class="sample02">さようなら</div>
```

#　まとめ
私が食わず嫌いで苦労したjsをできるだけ多くの人に楽しんで使ってもらいたくてまとめました。
理系ではないので計算式の嵐のようなjsの使い方などは全くわからないけど、デザインベースのものやちょっとした条件分岐なら正直誰でもできるようになると思います！一緒にがんばろ〜〜〜〜〜！
swift 4.x strokeTextAttributes

```swift
        let strokeTextAttributes: [NSAttributedStringKey: Any] = [
        NSStrokeColorAttributeName: UIColor.black,
        NSForegroundColorAttributeName : UIColor.white,
        NSStrokeWidthAttributeName : -2.0,
        NSFontAttributeName : UIFont.boldSystemFont(ofSize: 18)
    ]
```
CentOS 7 コンテナに消えない日本語ロケールを追加する

# はじめに

Docker の centos:centos7 は `locale -a | grep -c ja_JP` がゼロ、つまり日本語ロケールが定義されていません。
これはイメージサイズを縮小するための措置です。
ロケールは /usr/lib/locale/locale-archive に記録されていますが、フルサイズでは 102M というサイズです。コンテナ観点では、これが大きすぎる、というのは自然な発想かと思います。

そして、日本語ロケールは localedef で登録することが可能ですが、glibc-common を `yum update` すると消えてしまいますｗ

で、本ポストは「俺のロケールを消した奴は誰だ？」の回答・対処法と、localectl コマンド（非特権コンテナでは実行できないコマンド）によってロケール設定を操作した結果を紹介します。


# 犯人の紹介

まずは犯人から。最初からクライマ（略

```/etc/yum.conf
(略)
override_install_langs=en_US.utf8
(略)
```

これです。この指定（ホワイトリスト）によってロケールを制限しています。


にしても「/usr/share/doc が空っぽ」と同じ犯人です。やってくれるぜ。


# 対処法

まず、前述の設定を消してしまえば、ロケールが制限されなくなります。ただし locale-archive が 102M になってしまいます。
なので、丁寧なのは "ja_JP.utf8" を追記することかと思います。

```
sed -i -e '/override_install_langs/s/$/,ja_JP.utf8/g' /etc/yum.conf
```

その後 glibc-common をアップデートすれば日本語ロケールが出現します。

glibc-common が既に最新という場合は `rpm --force` で強制的にインストールしましょう。
（nodocs と同じで、そもそも rpm コマンドを使えば yum.conf の影響は受けないんですけれども。。。）

```
# locale -a
C
POSIX
en_US.utf8
ja_JP.utf8

# ls -lh /usr/lib/locale/locale-archive
-rw-r--r-- 1 root root 2.5M Jul  3 12:34 /usr/lib/locale/locale-archive
```

なお、glibc-common の postinstall scriptlet を実行しただけでは日本語ロケールは出現しません。
これは、locale-archive が locale-archive.tmpl から間引く形で生成されていて、一度 scriptlet が動いてしまうと locale-archive.tmpl が空になってしまうためです。


# localectl 結果

日本語ロケールを出現させることが出来でも、それを使用する設定は別途必要です。
簡単には環境変数 LANG を設定すれば終わりなんですが、フル機能の OS のシステム設定がどうなるか、気になりますよね。私は気になります。

なので、localectl コマンドの結果を載せておきます。

（言いつつ /etc を grep しただけの差分なので、網羅されてないかも知れません。誰かソース見て処理を追いかけてくださいな。）

```
# localectl set-locale LANG=ja_JP.UTF-8
# cat /etc/locale.conf
LANG=ja_JP.UTF-8

# localectl set-x11-keymap jp
# cat /etc/vconsole.conf
KEYMAP=jp106
FONT=latarcyrheb-sun16

# cat /etc/X11/xorg.conf.d/00-keyboard.conf
# Read and parsed by systemd-localed. It's probably wise not to edit this file
# manually too freely.
Section "InputClass"
        Identifier "system-keyboard"
        MatchIsKeyboard "on"
        Option "XkbLayout" "jp"
EndSection
```

対比用に初期値（コンテナイメージ centos:centos7 の初期値）も載せておきます。

```
# cat /etc/locale.conf
LANG="en_US.UTF-8"

# cat /etc/vconsole.conf
KEYMAP="us"
FONT="latarcyrheb-sun16"

# cat /etc/X11/xorg.conf.d/00-keyboard.conf
# Read and parsed by systemd-localed. It's probably wise not to edit this file
# manually too freely.
Section "InputClass"
        Identifier "system-keyboard"
        MatchIsKeyboard "on"
        Option "XkbLayout" "us"
EndSection
```

そういえば、インストーラでインストールした CentOS 7.5 では vconsole.conf の KEYMAP は jp でした。
`SceneManager' does not contain a definition for `LoadScene'

しょうもない話だったけど備忘録的に。

Unityで制作中にこんなエラーがConsoleに。

```
`SceneManager' does not contain a definition for `LoadScene'
```

「あれ……ネット上のサンプル参考にしてるから間違ってないはずなんだけど……」と思いつつスクリプトを眺めていました。
コードはこんな感じ。Oculus Goのコントローラーの入力を受けて次のシーンに移るというもの。

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneManager : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger)) {
			SceneManager.LoadScene(1);
		}
	}
}
```

SceneManager#LoadScene()はあるはずなのにな……と悩むこと一日。気づきました。
**SceneManagerというクラス名がUnityEngine.SceneManagement.SeneManagerと名前衝突してる！**
単純な話でしたね。ハイ。クラス名を独自のものに変更して解決です。

```c#
public class HogeSceneManager : MonoBehaviour 
```
人柱報告：Eclipse Photon で C# を試してみた。結論：VS Code

# 背景
[Eclipse Photon](https://projects.eclipse.org/releases/photon)がリリースされ、[C#の対応が強化](https://projects.eclipse.org/projects/tools.acute/downloads)されました。
早速試してみましょう。

# 手順
Photonをダウンロードして、Eclipse MarketplaceからaCuteをインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25176/b7508eaf-048b-48a0-6108-037fca024c7f.png)
インストール後、再起動します。完了。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25176/735b3d50-d00f-c1e0-dca3-9929a83ab9e2.png)

# 試す。
MacBook Pro (Retina, 13-inch, Early 2015)で検証しました。
プロジェクトビューを右クリック→New→Other→.Net Core→.Net Core Project→
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25176/d7d163bd-8c0f-8be5-c434-a26c69686883.png)
.Net Core Empty[C#]を選んでみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25176/beef7f1a-e1c3-c3f7-542a-07cafc0dfb6f.png)
すると、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25176/135e438f-80ae-23e7-b1e7-e7a7995bcd71.png)
ソースコードいじっても、重くて動かない。。。。

というわけで、小職の環境では試用を諦めざるをえませんでした。

#　結論
VS Code最高！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25176/bb5abed8-2353-e497-a171-dda252d9ea8a.png)

一つのアプリですべての作業が行えるIDEの強みは惜しいものの、
プロジェクトの作成や実行はターミナル + dotnet cliに任せるとして、Eclipseに移行することはなさそうかな、と思いました。

以上です。
Node.jsのモジュールを理解する

# はじめに

この記事はNode.jsのモジュールシステムについて段階的に理解していった記録です。

# 基本

モジュールは以下のように読み込みます。

```js
const http = require('http');
```

「モジュールってなんなんだ」ということで対話環境で叩いてみる。

```js
{ _connectionListener: [Function: connectionListener],
  METHODS:
   [ 'ACL',
     'BIND',
     'CHECKOUT',
     'CONNECT',
  （中略）
  Server: { [Function: Server] super_: { [Function: Server] super_: [Object] } },
  ServerResponse: { [Function: ServerResponse] super_: { [Function: OutgoingMessage] super_: [Object] } },
  createServer: [Function: createServer],
  get: [Function: get],
  request: [Function: request] }
```

「これは、オブジェクトか？モジュールとはオブジェクトなのだな」

# Expressさん登場

Expressでは以下のようにアプリケーションを作ります。

```js
const express = require('express');
var app = express();
```

「ちょっと待て」
express「はい？」
「いやお前オブジェクトのはずだろ、なんで関数呼び出しできんねん」
express「いやだって私、関数オブジェクトですから」
「なん、だと・・・。いやまあ確かに[Node.jsのドキュメント](https://nodejs.org/dist/latest-v8.x/docs/api/modules.html)にも"The module.exports property can be assigned a new value (such as a function or object)."って書いてあるわ。オッケー完全に理解した、expressは関数オブジェクトね」

# express.staticの脅威

Expressで静的ファイルを提供するには以下のようにします。

```js
app.use(express.static('public'));
```

「待てやこら」
express「はい？（いちいちうるせーな）」
「お前関数オブジェクトだろ、なんでメソッドっぽいことしてんねん」
express「いやまあ、Javascriptの関数オブジェクトってプロパティ設定できまして」
「まじか」

というわけで、具体的に見てみると、expressとして受け取るオブジェクト、つまり、[module.exportsとして設定されているものはcreateApplication関数であり](https://github.com/expressjs/express/blob/4.16.3/lib/express.js#L28)、module.exportsというか[exportsが指すオブジェクトのプロパティとしてstaticが設定されています](https://github.com/expressjs/express/blob/4.16.3/lib/express.js#L80)。
あれ？ていうか、bodyParserのurlencodedとjsonも設定されてるな、4.16.0からか。日本語ドキュメントしか見てなかったから気づかなかった。

# まとめとあとがき

というわけで今回はNode.jsのモジュールについて見てきました。
まとめます。Node.jsのモジュールとは、

- 普通はオブジェクトでプロパティとして関数を設定する
- module.exportsに代入することで関数をモジュールのトップとすることができる
- 関数オブジェクトはプロパティを設定できるので（これはNode.jsというかJavascriptの機能）、引き続きメソッドっぽいこともできる

次にあとがき。
Pythonでも関数に属性を設定できるので、関数オブジェクト自体にプロパティが設定できるのは（上で驚いているほど）驚きではないのですが、息を吸うように普通に使われているのは驚きでした。Pythonで関数に属性設定しているのってDjangoの内部実装読んだ時にしかお目にかかっていないので。
モナコイン、Bitzeny、Ethereumの価格をGoogle Apps Scriptで毎日Discordに通知するようにした

![スクリーンショット (3)_2018-07-03.png](https://qiita-image-store.s3.amazonaws.com/0/180861/a95d854e-e8f8-9393-55d1-3b484cd75814.png)
# 前提
仮想通貨は値動きが激しいので、自分がチェックしている通貨の価格を1日1回Discordに通知してくれる仕組みが欲しかったので、スクリプトを組みました。
Twitterなどで通貨の価格をツイートしているBotでも良かったのですが、1時間おきとかでちょっと頻度が高すぎたので、自分ひとりだけのDiscordサーバに通知しています。
通知させているコインは自分の興味のあるコインですが、APIを利用しているCoinGeckoはかなりたくさんの種類の通貨に対応しているので、数行書き換えればお好みのコインの価格を通知させられると思います。

# ソースコードと動かし方

## ソース
https://gist.github.com/oosawa/bb73e0f104f6a6c24cdff60bf32a15c1

## 動かし方
- DiscordのWebhookを作成し、Tokenを取得する
- Google Apps Scriptで新規プロジェクトを作成し、ソースをコピー。Webhook用URLとTokenを配置する
- GASのタイマーで毎日1回実行するように設定する

# 謝辞

小数点の丸めには[こちらの記事にある関数](https://qiita.com/nagito25/items/0293bc317067d9e6c56)を使わせてもらっています。
MacにLaravelをインストールしてみた

Laravelをローカルサーバーで開くところまで。

## 環境
MacOS 10.13.5(High Sierra)。
brewインストール済み。

この時の環境は最終的に以下のようになった。
PHP 7.1.16
Laravel 5.6.26

## コマンド
```diff
# PHPをインストール
brew install php
php -v
# Composerをインストール
brew install composer
composer -V
# Laravelをインストール
composer global require "laravel/installer"
# 環境変数を設定
echo export PATH=\"$HOME/.composer/vendor/bin:\$PATH\" >> ~/.bash_profile
# 環境変数を読み込み
source ~/.bash_profile
php artisan -V
# テンプレートを生成
laravel new blog
# ディレクトリ移動
cd blog/
# ローカルサーバーを起動
php artisan serve
# ブラウザで開く
open http://localhost:8000/
```

するとこんな画面が表示される。完了 :tada: 
![スクリーンショット 2018-07-03 20.48.57.png](https://qiita-image-store.s3.amazonaws.com/0/9104/b7cf4f24-0d40-963b-9197-f1855512d227.png)

## 参考
- [Installation - Laravel - The PHP Framework For Web Artisans](https://laravel.com/docs/5.6/installation)
PHPの条件式が読めなかったお話

どーも。[ばぁど](https://twitter.com/ultrabirdtech)です。
Qiitaには久々の投稿だと思います。

Rubyが一番のお気に入り。
現在はDrupalを勉強中。
セキュリティに興味ありのプログラマ歴5年目の鳥です。

PHPはプログラマ1年目の時に１ヶ月弱触りました。
ここ３ヶ月はGitから眺めている程度で、久々にサンプルを書いて動かしています。

普段は、[はてなブログ](https://ultrabirdtech.hatenablog.com/)の方を更新しているのですが、
今回はとある研修中にどうしても理解できないPHPコードがあったので、調べて共有。

## これ、どうなの？
簡略化しますが、下記のようなコードを目にしました。
※コード自体は業務のコードではなく、一般公開されているもの

```sample01.php
<?php

$target = 'valid target';

if($target == !isValid($target)) {
  // エラー処理（エラー文言入れて画面に表示)
  echo 'false'; 
  return 'something';
}

// ビジネスロジックが続く
```

`isValid()`メソッドは下記のようなものを想像してくれればいいと思う

```isValid.php
/**
* 何かしらの値（メールアドレスや電話番号）が正当か確認するメソッド 
*/
function isValid($target) {
  // $targetの正当性を検証してtrue or false　を返す
}
```

文字列の検証を行うメソッドが自分のことを、`is×××`と名乗っているのだから、`true` or `false`を返してくれるだろう。という、淡い期待。（実際はそんな感じでした）

問題なのが、if文の中身。

文字列と`true`か`false`を比べてる？？？
これってどうなるの？？？
この書き方どうなの？という疑問。

## 調べ直したこと
### falseと判定される定義
PHPの `false`になる定義をずいぶん昔に聞いたことがある。
詳しくは覚えていないが、とりあえず酷いということだけは覚えていた。

[論理型 (boolean) ](http://php.net/manual/ja/language.types.boolean.php#language.types.boolean.casting)

上記のマニュアルからすると、下記の７つの属性が`false`として判断される。
 
 - boolean の false
 - integer の 0
 - float の 0
 - 空の文字列、および文字列の0
 - 要素の数が0の配列
 - 特別な値NULL
 - 空のタグから作成された SimpleXML オブジェクト

なるほど。。。
ゼロはどうしても`false`として扱いたいらしい。
PHPはゼロに恨みでもあるのか。

Rubyが `false` と `nil(NULL)` だけを`false`として判定するのがとても素晴らしい仕様なんだと感じる。

### 緩やかな比較と厳密な比較
PHP の比較には緩やかな比較と、厳密な比較がある。
[PHP 型の比較表](http://php.net/manual/ja/types.comparisons.php)

`==`は緩やかな比較。
型を見ずに、上記のfalse と判定される定義以外同士のものであれば全て`true`。

`===`は厳密な比較。
型と値があっているかを確認する。

今回は、`==` が使われているので緩やかな比較が行われている。

## ロジックの検証
上記の調査結果から、今回は文字列と`boolean`を対象に緩やかな比較をしていることがわかった。

ここで厄介なのが、`isValid()`の前に ! (NOT) を入れていること。

`isValid()`で返ってくる値を反転させて、文字列と比較している。

おそらく、コードを書いた人は`false`が返ってきた時に条件式の処理を入れたかったのだろう。
なるほど、こういうロジックになるのもなんとなく分かる。

このソースコードを言語化すると下記のようになる。

```
文字列と検証結果を逆転したものを条件式で判定して、falseであれば正常ロジックの処理を続行するよ。
文字列と検証結果を逆転したものを条件式で判定して、trueであればエラー処理をしてreturnで返却するよ。
```

もう、最初の一文目を読むだけで混乱する。

はぁ、こんな書き方ができるからPHPはダ（ry

## あれ？これって書き方の問題なのでは？
こんな書き方ができるから、PHPはダメなんだ！！！！と言いたくなる気持ちをグッと堪えた。
違うよね。
書き方がおかしいんだよ。

そもそも`isValid()`で返ってきたものと文字列を比較する意味ってあるん？
要するに`isValid()`が`true`なのか、`false`なのかだけでいいんじゃないの？
これじゃダメ？（変更点はifの条件式のみ）

```sample02.php
<?php

$target = 'valid target';

if(!isValid($target)) {
  // エラー処理（エラー文言入れて画面に表示)
  echo 'false';
  return 'something';
}

// ビジネスロジックが続く
```

少なくとも、僕ならレビューで弾く。
きっと上記のような書き方になった理由があるだろうから、もう少し調査はします。

## さらに問題発見
これ、文字列の`0`みたいに、`false`として判定される値を入れたら、メールアドレスや電話番号の形式じゃなくても`true` として処理されるんじゃね？？

```sample03.php
<?php
$target = '0'; //★ここが0★

if($target == !isValid($target)) {
  echo 'false'; // エラー処理（エラー文言入れて画面に表示)
  return 'something';
}

// ビジネスロジックが続く
```

上記実行したら、条件式の中に入らずに通りました。
ダメじゃん。

## まとめ
最近、他人が書いたPHPをGitから眺めているのだが、やっぱりなれん。
$変数だとか、アロー演算子だとか。
まだまだPHPとお友達になれていないということか。
自分が実際にPHPを書くときにクソコードを大量生産しないように気をつけよう。

PHPerとしてはまだまだ未熟。
もっとPHPになれないとなー。
日々是精進、心を磨く！　オネスト・ハート！

きっと優秀なPHPerになったら[新垣結衣さんと結婚できる](http://www.tbs.co.jp/NIGEHAJI_tbs/)と信じて！！
※余談ですが、私は土屋太鳳ちゃんが好きです
Fusion360のシミュレーション【3D CAD】【静的解析】

無料で使える3D CAdソフトが進化していますね。Fusion360(AutoDesk社)で解析までできるのに無料で使えるらしいということで使ってみました。

無料アカウントで使えるのは`静的解析、モード周波数、熱解析、熱応力解析`。

今回はよくありそうな梁っぽい形状+αを作って試しました。
**静的解析するモデル**
---

![fusion360解析0.PNG](https://qiita-image-store.s3.amazonaws.com/0/260345/a2782967-4162-ae3b-d938-57f608cad9ca.png)

ネジ部、部品の結合したりを簡単にできたのでとても優秀でした。
若干2次元の図面にした時に不満がありましたが。（慣れていないのもあるかも）

この程度なら
`スケッチ → 作成（押し出し） → 結合or削除`
で描けました。

１面を拘束して先端に5000Nかけてみた結果がこれ。(本当はIボルト入れてそれに加重かけるつもりだったが単純化のためこの形状で)

安全率
![fusion360解析1.PNG](https://qiita-image-store.s3.amazonaws.com/0/260345/197eee1b-6855-2d3c-beab-4ed9018c930b.png)

変位
![fusion360解析2.PNG](https://qiita-image-store.s3.amazonaws.com/0/260345/97c96e9d-8941-9e9c-1b72-508413aca250.png)

安全率1以下になると塑性変形するので形状を考えましょうとのこと。

**10000N(約1t)を先端にかけてみた**
---
安全率
![fusion360解析3.PNG](https://qiita-image-store.s3.amazonaws.com/0/260345/262f0f23-4e63-881f-9310-e99dbb863a3b.png)
応力
![fusion360解析4.PNG](https://qiita-image-store.s3.amazonaws.com/0/260345/12ef73fd-c316-fc81-16a6-0a17603f194a.png)
変位
![fusion360解析5.PNG](https://qiita-image-store.s3.amazonaws.com/0/260345/0e66c190-5456-112f-cc43-58954c708550.png)
さすがに鋼材でも厳しいみたいですね。というか、この形状なら一番力かかるところが溶接だろうからもっと弱いだろうが。

**材料アルミで試してみた**
---
ついでに5000系のアルミにて。モデル→修正→物理マテリアル
から簡単に変えることができました。
![fusion360解析6.PNG](https://qiita-image-store.s3.amazonaws.com/0/260345/3fc356dd-f97b-e3d3-ea8e-bfb48b946730.png)

**感想**
---
今回はすごく簡単な形状ですが、もちろんもっと複雑な形状も作り、解析もできる無料のCADソフトで個人レベルや小さな部署で使うならオーバースペックと言えるほどの性能がありました。

2次元の図面をPDFやDWGで出力も可能ですし、なにかを作りたいと思っているけど、お金かけてまでは…という人にもいいですし、3Dプリント使ったプロダクトの試作品作りたいという人にもいいと思います。

**参考URL**
>[Fusion360 help](http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-07455A29-2433-4D67-B0BF-E2BAAC63F015)