OmniAICreator/Qiita-1.07M huggingface dataset:
Getting counter clockwise in python

```python
occw = {1:"COUNTER_CLOCKWISE",-1:"CLOCKWISE",2:"ONLINE_BACK",-2:"ONLINE_FRONT",0:"ON_SEGMENT"}
def ccw(p0, p1, p2):
    a = p1 - p0
    b = p2 - p0
    # print(a,b,np.cross(a,b))
    if (np.cross(a,b) > np.finfo(np.float).eps):
        return 1 #COUNTER_CLOCKWISE
    if (np.cross(a,b) < - np.finfo(np.float).eps):
        return -1 # CLOCKWISE
    if (np.dot(a,b) < - np.finfo(np.float).eps):
        return 2 # ONLINE_BACK
    if (np.linalg.norm(a) < np.linalg.norm(b)):
        return -2 # ONLINE_FRONT
    return 0 # ON_SEGMENT

a = []
a.append(map(int, raw_input().split()))
for aa in a:
    t = np.array(aa).reshape(2,2)
    p0 = t[0] #[::-1]
    p1 = t[1] #[::-1]

# print(p0,p1)
n = input()
for i in range(n):
    a = []
    a.append(map(int, raw_input().split()))
    for aa in a:
        hn = np.array(aa).reshape(1,2)
        hn = hn[0] #[::-1]
        # print(hn)
        print(occw[ccw(p0,p1,hn)])
```

# Refs.
* [eps](http://jn1inl.blog77.fc2.com/blog-entry-2002.html?sp)  
http://d.hatena.ne.jp/komiyam/20111210/1323503019
* 外積  
http://www.wakhok.ac.jp/~asami/linalge/pdf/04-5-6.pdf  
http://jsciencer.com/unimath/linarge/3789/  
http://d.hatena.ne.jp/pashango_p/20090714/1247590272  
* sin  
http://manapedia.jp/text/2575
babelとsassをgulpから使うメモ

gulpfile.jsのメモ。
(Sassとbabelが欲しい時に)

```ruby:gulpfile.js
var gulp = require('gulp');
var sass = require('gulp-sass');
var autoprefixer = require('gulp-autoprefixer');
var plumber = require("gulp-plumber");
var babel = require("gulp-babel");

gulp.task('sass', function() {
  return gulp.src('./assets/sass/**/*.scss')
    .pipe(plumber())
    .pipe(sass({outputStyle: 'expanded'}))
    .pipe(autoprefixer({
            browsers: ["last 2 versions", "ie >= 9", "Android >= 4","ios_saf >= 8"],
            cascade: false
        }))
    .pipe(gulp.dest('./assets/css'));
});

gulp.task("babel", function () {
     return gulp.src("./assets/es6/**/*.js")
         .pipe(babel({presets: ['es2015']}))
         .pipe(gulp.dest("./assets/js"));
 });

gulp.task('default', function() {
  gulp.watch('./assets/sass/**/*.scss', ['sass']);
	gulp.watch('./assets/es6/**/*.js', ['babel']);
});
```

```ruby:package.json
{
  "name": "site_template",
  "version": "1.0.0",
  "description": "template",
  "homepage": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-preset-es2015": "^6.24.1",
    "gulp": "^3.9.1",
    "gulp-autoprefixer": "^4.1.0",
    "gulp-babel": "^7.0.1",
    "gulp-plumber": "^1.2.0",
    "gulp-sass": "^3.1.0"
  }
}

```
「gulp」で監視開始。
ssh_configでの落とし穴

# SSHの設定
実例をいれつつ、というより流用できるように、なので例が長くなります。
なにか発生するたびに実例を追加していく予定。

## TL;DR
`man ssh_config`を読みましょう。
あと、`ssh_config`は重複があると最初の項目が優先[^1]です。

## 落とし穴1
sshでgithubで複数アカウントをやるとして、

```conf
# Github
Host github.com
  # Alt/Use for Over HTTPS at 443
  # Hostname ssh.github.com
  # Port 443
  Hostname github.com

# gist(use ssh)
Host gist.github.com
  # Over HTTPS
  # Hostname ssh.github.com
  # Port 443
  Hostname gist.github.com

# altssh server direct setting
Host ssh.github.com
  Hostname ssh.github.com
  Port 443

# 2nd or later account
# Example
Host example.github.com
  Hostname github.com
  # key define : first match check
  IdentityFile ~/.ssh/id_rsa.github.example

# github common setting
Match originalhost github.com,gist.github.com,ssh.github.com
  IdentityFile ~/.ssh/id_ecdsa.github
  IdentityFile ~/.ssh/id_ed25519.github
  # fallback
  IdentityFile ~/.ssh/id_rsa.github

# github global setting
Host *github.com
  User git
  TCPKeepAlive yes
  IdentitiesOnly yes
  Compression yes
  # Note:key
  # https://api.github.com/users/tsuyoshicho/keys
```

ここでハマったのは、前は`Match`ではなく`*github.com`へメインアカウントの鍵ファイルを定義していたことです。

こうすると、2ndアカウントの鍵の定義が

```shell-session
$ ssh -G git@example.github.com
user git
hostname github.com
 <中略>
identityfile ~/.ssh/id_rsa.github.example
identityfile ~/.ssh/id_ecdsa.github
identityfile ~/.ssh/id_ed25519.github
identityfile ~/.ssh/id_rsa.github
 <後略>
```

になるんですが、これが穴です。

期待としては、ここで選んだ鍵で(先頭から)接続するはずで、それは問題ないですが、ここに`ssh-agent`がからむと鍵の選択が適切に実施される保障がないようです。(メインアカウントRSAで繋がった、たぶん`ssh-add`した順に`ssh-agent`が選択してしまうっぽい)

なので、メインアカウントでの接続の鍵は`Match`節にまとめるようにしました。あとそのときは`originalhost`である必要もあるので注意。

## 落とし穴2

```conf
# operation server
Host op.example.com
  User tsuyoshicho
  TCPKeepAlive yes
  IdentitiesOnly no
  PubkeyAuthentication no
  ProxyCommand none

# server instance
Host dev1.example.com
  Hostname [2001:db8::1]
  User tsuyoshicho
  TCPKeepAlive yes
  # key define : first match check
  IdentityFile ~/.ssh/id_rsa.example
  IdentitiesOnly yes
  ProxyCommand none
```

operation serverは公開鍵認証はないサーバなのですが、ここで鍵が指定されてないだけだと、`ssh-agent`とやり取りして`Too many authentication failures `になってしまう。

解決方法としては公開鍵認証だけの指定を止める(`IdentitiesOnly`)だけではなく、公開鍵認証を止める(`PubkeyAuthentication`)こと。

別の方法として`PreferredAuthentications`で公開鍵認証よりパスワード認証を先にする(もしくは公開鍵認証を外す)、というのもあるが、ちょっとアレなのでそれはなし。

### おまけ
なお、このサーバは内部ネットワークなので最後に`Host *`で全サーバに設定している`ProxyCommand`の設定が不要なのだが、ここだけ外すには`none`を明示してしまうという方法が有効。

[^1]: [ssh config最強設定](https://qiita.com/keiya/items/dec9a1142ac701b19bd9)
REXMLでXMLの子要素数をかぞえる

```ruby
require 'rexml/document'

doc = REXML::Document.new(
'<?xml version="1.0" encoding="utf-8" ?>
<root>
  <item>
    <title>A</title>
  </item>
  <item>
    <title>B</title>
  </item>
  <item>
    <title>C</title>
  </item>
</root>')


p doc.get_elements("//item").size
# 3
```
MySQLでユニークキーや外部キーを確認する

MySQLでテーブルの情報を確認する場合は、

```sql
DESC table_name;
```

とすることが多いですが、**これだとユニークキーや外部キー制約などは確認できません**。

このような場合は

```sql
SHOW CREATE TABLE table_name;
```

とすると、

```sql
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(255) NOT NULL DEFAULT '',
  `name` varchar(255) DEFAULT NULL,
  `parent_id` int(11) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `index_users_on_email` (`email`),
  KEY `index_users_on_id` (`id`),
  FOREIGN KEY (parent_id) 
      REFERENCES parent(id)
      ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8

```

上記のように確認できます。

指定したテーブルを``TABLE CREATE``するための情報がそのまま出力されるので、DB設定を網羅的に確認できて便利です。

## バージョン
MySQL：5.6.38

## 参考リンク
* [MySQL :: MySQL 5\.6 リファレンスマニュアル :: 13\.7\.5\.12 SHOW CREATE TABLE 構文](https://dev.mysql.com/doc/refman/5.6/ja/show-create-table.html)
* [MySQL :: MySQL 5\.6 リファレンスマニュアル :: 13\.1\.17\.2 外部キー制約の使用](https://dev.mysql.com/doc/refman/5.6/ja/create-table-foreign-keys.html)
* [MySQLで外部キーやユニークキーを確認する \| 株式会社ランチェスター](https://www.lanches.co.jp/blog/736)
React NativeのTextInputで日本語入力ができない問題の対処法

# 起きた問題
TextInputタグにstateの値をvalueに設定すると、日本語の入力が打てなくなる。
以下、実際の動き
![rnjapaneseinput.gif](https://qiita-image-store.s3.amazonaws.com/0/224815/5f573fff-4322-cdc8-def7-4e87e8fc0526.gif)


# 原因
自分が使っていたReact Nativeのバージョン0.54.0にて、[日本語や中国語など一部の言語が入力できないバグがあった](https://github.com/facebook/react-native/issues/18403)。
ここ一ヶ月ぐらいのあまりに最近の話題だったため、情報ソースがReact NativeのGitHubにしかなかった。

# 解決策
バグがないバージョンに変える。
僕は友人が0.52.0で動いていたのを近くで見ていたので、0.52.0を指定したが、GitHubのやりとりを見ていたら中国語は0.53.0でも問題なかった様子。

[ここの記事](https://qiita.com/ponnjinnka/items/b1fdd200b1bc094c6797)を参考にバージョンを下げようとしたが、react-native run-ios実行時にエラーが複数起き、解決に時間がかかりそうだったため、結局新しいプロジェクトをバージョン指定で作り、ファイルを移管した。
IntelliJでJuliaを書く(不具合あり)

#はじめに
あなたは今まで、Juliaをどのエディタで書いてきましたか？

軽量なVisual Studio Codeですか？
JuliaProに付属するJuno(Atom)ですか？
それともSublime Textですか？

この度、新たな選択肢が加わりました。

#待望のIntelliJ IDEA
そう、IntelliJ IDEAでJuliaが書けるようになったのです。

JetBrainsが公式にサポートしたというわけでは無いですが、海外の方によってプラグインがリリースされています。2018年1月31日にver 0.01がリリースされ、4月4日時点で0.1.11です。
[https://plugins.jetbrains.com/plugin/10413-julia](https://plugins.jetbrains.com/plugin/10413-julia)

>
Functions provided: 
SDK and module management
A GUI package manager
Documentation view
Syntax highlight
Language injection
Run configuration and code execution
Live templates
File templates
Completions
Jump to definition
Find usages
Renaming
Doc string generation
Try Evaluate
Evaluate Hints (Somewhat strange)
Bread crumbs
Regular expression injection
DocString markdown injection (works only when either Markdown or MarkdownNavigator is installed)
Special input for LaTeX style unicode character
Structure view
DocumentFormat.jl integration
Error reporter
What you'll see in the future: 
Formatter
Displaying numeral output as images
Please don't downvote our plugin for not having one of the features above, because we're just working on it. 

開発者によるチュートリアルの動画があったんですが、上手くいかなかったので少し書きます。

#インストール
JetBrainsの各種エディタでも互換性があると書いてありますが、IntelliJ IDEAで進めていきます。

File -> Settings -> Pluginで検索ボックスにJuliaと入力
Search in repositoriesって出るのでクリックし、ダウンロードします。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/216168/50210d81-b26a-4b41-a9ab-f0002696b741.png)

そして後は再起動を求められるので再起動して再びエディタを開きます。

###不具合ぽいもの
次にFile -> New -> ProjectからJuliaのプロジェクトを作ります。
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/216168/771a0bd6-93f6-f93b-3e0b-667057f4361d.png)

下画像のようになるのですが、Nextを押しても何も進みません。
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/216168/648600d1-cc1e-88f3-ad46-ef046d1341d4.png)

File -> New -> New Julia Projectを押しても同様でFatal Errorの通知が出ちゃいます。

なので適当なプロジェクトを開いてJulia Fileを作成すれば、Juliaを動かすことができます。
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/216168/f9266824-209c-9b57-3570-1022f790ac2e.png)


#困った
自分だけかもしれないですが、このプラグイン入れたらSettingsが開けなくなりました。バージョンや人によってはプロジェクトも新規作成できるかもしれないですね。

今後のアップデートで使えるようになるか、JetBrainsが公式にサポートするかですね...
マクロでループ（？）

マクロを使ってfor文やwhile文使わないでループできないかなって思って書きました。もっとうまい書き方あれば教えていただきたいです。

``` macro_loop.c
#include <stdio.h>

#define FUNC printf("hello world\n");
#define TWO FUNC FUNC
#define FOUR TWO TWO
#define EIGHT FOUR FOUR
#define SIXTEEN EIGHT EIGHT
#define THIRTY_TWO SIXTEEN SIXTEEN
#define SIXTY_FOUR THIRTY_TWO THIRTY_TWO
#define HUNDRED SIXTY_FOUR THIRTY_TWO FOUR

int main(){
    HUNDRED
    return 0;
}

```
JSでIPアドレスをビット演算子で計算する

# '192.168.11.0' みたいなのを、32bit数値にする

IPアドレスをCIDRで色々やったりする必要がありました。
最初は以下のようなコードを書いてました。
**うろ覚え・・・**

```javascript
function convertBinaryIp(ip) {
    const dividedIp = ip.split('.');

    return dividedIp.reduce((accumulator, v, idx) => {
      const bit = `00000000${parseInt(ip[i], 10).toString(2)}`;
      accumulator + bit.slice(-8);

      return accumulator;
    }, '');
  }
```

このコードで行くと、文字列で`10101010000~~`みたいなのが返ってきます。
なので、その後の計算も文字列にたいして`split()`したりしてました。

# 数値Onlyでやったほうが効率的
いちいち文字列の`10101000111~~`みたいな形式にするの非効率だよと教えて頂きました。
さらに、どうやって数値Onlyでやるかみたいなアドバイスも頂けたので処理を書き換えました。

```javascript
function convertBinaryIp(ip) {
    const dividedIp = ip.split('.').reverse();
    const byte = 8;

    return dividedIp.reduce((accumulator, v, idx) => {
      const binary = (parseInt(v, 10) << (byte * idx)) >>> 0;
      return accumulator + binary;
    }, 0);
  }
```

この関数を`convertBinaryIp('192.168.11.0')`みたいな感じで実行してあげれば、
`3232238336`のような数値が返ってきます。
この数値は2進数に直すと、`11000000101010000000101100000000`です。

```
11000000 => 192

10101000 => 168

00001011 => 11

00000000 => 0
```

この`3232238336`という数値を使えば、他のIPとの大小比較とかCIDRの範囲内か？とかもチェックできます。


CIDRの時に使用する、
上位24ビットをそのまま取得して、下位8ビットは0にするというような場合の式は以下です。

```
(ipアドレス & (~((1 << (32 - 24)) - 1))) >>> 0;
```

以上。
Google Hangouts Chat のBot作ってみた

Google Hangouts Chatが公開されたので、GASを使ってBotを作ってみた。

# Botを自分用に限定公開する

## まずはGASでスクリプトを作成

公式のガイドでサンプルスクリプトを用意してくれているので、自分用のスクリプトとしてGoogleDrive上に保存する。
> Hangouts Chat Bot template
> https://script.google.com/create?template=hangoutsChat

このサンプルスクリプトは、ダイレクトメッセージを送る、もしくはグループ内でメンションを付けたときに、メッセージ内容をユーザ名と一緒にオウム返しする機能が実装されている。

ソースコードはいったんそのままで、プロジェクト名を適当に「MyBot」とでもして保存。

<img width="891" alt="キャプチャ2.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/198128/3c90624b-6bb7-4ebd-eb31-e476a4e4253c.jpeg">


## 早速デプロイ

### デプロイIDを取得

ナビゲーションの「公開」＞「マニフェストから配置」を選択。
「GetID」からデプロイIDを取得し、メモ帳にでもキープしておく。

### APIの有効化

次に、ナビゲーションの「リソース」＞「Google Platform プロジェクト」を選択。
「このスクリプトが現在関連付けられているプロジェクト:」
の直下のリンクをクリックして、Google Cloud Platformの管理画面に移動する。

左上のスライドメニューから「API」＞「ダッシュボード」を選択し、ここから先ほど作ったMyBotプロジェクトをHangouts ChatのAPIから利用できるようにする。

+APIとサービスの有効化 でHangouts Chat APIを選択し、有効化する。

### Botの各種項目設定

ナビゲーションの「設定」から、各項目を入力する。
全て必須項目なので、アバターとか用意できてなければ適当にaaaとか入力しておくとデフォルトアイコンになる。

* ボット名 -> ボットを検索したり、@をつけてメンションするときの名前。
* アバターの URL -> Botのアイコン。正方形で縦128px横128px以上。
* 説明 -> Botの簡単な説明。検索したときに表示される。
* 機能 -> Botの用途を選択する。
* 接続設定 -> 今回はApps Script projectを選択し、メモ帳に逃がしたデプロイIDを入力。
* 権限 -> いったん自分だけにする。

<img width="494" alt="キャプチャ3.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/198128/3b1e0f00-a2bd-08b9-287f-f693bb135035.jpeg">
<img width="478" alt="キャプチャ4.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/198128/bb7ec26d-a25d-6ec9-b41a-6aff4c773147.jpeg">


## Botにメッセージを送ってみる

以上で自分だけのBotが完成。簡単ですね。
早速今付けたBotの名前で検索して、ダイレクトメッセージを送ってみる。
<img width="577" alt="キャプチャ.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/198128/8ad79c4b-d6ee-aa26-bc88-748b168c1585.jpeg">

ちゃんとオウム返ししてくれるBotが完成しました！

最初に作ったGASを編集して保存すると、自動でデプロイされるので気軽に実装していきましょう。

続き：実装について調べた
> Google Hangouts ChatのBotの実装
> https://qiita.com/yotsua/items/d49c44db4005848d6b81

# 参考

> https://developers.google.com/hangouts/chat/quickstart/apps-script-bot
WindowsサーバOSで使用するPowerShellコマンド一覧

# はじめに
WindowsサーバOSで汎用的に使用できそうなPowrShellコマンド一覧を控え、インフラセットアップを加速したいなぁと思い、まとめてみました。
<font color="red">※ログコマンド(Start-TranScript)を伴えば画面証跡とかいう面倒なスクリーンショット作業をやらなくても良くならないかなぁと妄想したりしていますが、パッ見で説明不要なので駆逐はできないでしょう。</font>

# 1.Windows Firewall

## 1.1.Windows Firewallの設定情報を取得する
1.すべての情報を取得する

```powershell:
get-NetFirewallProfile
```

2.指定のプロファイルの設定情報を取得する

```powershell:
get-NetFirewallProfile -Name {Domain or Private or Public}
```

3.Windows Firewallの有効性を確認する

```powershell:
get-NetFirewallProfile | select-Object Name, Enabled
```

## 1.2.Windows Firewallを無効にする

```powershell:
get-NetFirewallProfile | set-NetFirewallProfile -Enabled false
```


# 2.コンピュータ名を変更する

```powershell:
rename-Computer -NewName "新しいコンピュータ名" -Force -Restart
```


# 3.ドメインに参加させる

```powershell:
add-Computer -DomainName ドメイン名(FQDN可) -Credential ドメイン名\ユーザー名
```


# 4.UAC(ユーザーアカウント制御)
レジストリ操作するしかない

## 4.1.UACの情報を得る

```powershell:
$uacpath = "\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
Get-ItemProperty -Path Registry::$uacpath -Name "EnableLUA" | Select-Object EnableLUA
```
<font color="red">※余計な情報が出てしまうので[Select-Object]でフィルターしたほうがいい。</font>


## 4.2.UACを無効にする

```powershell:
$uacpath = "\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
Set-ItemProperty -Path $uacpath -Name "EnableLUA" -Value 0
```


# まとめ
PowerShellでできることもいっぱい増えてきたのでもっと現場に浸透してくれないかなーと思ったり。Bat運用が多すぎる。


# 参考

+ レジストリエントリの操作 via Microsoft 
https://docs.microsoft.com/ja-jp/powershell/scripting/getting-started/cookbooks/working-with-registry-entries?view=powershell-6
Amazon ECS(Amazon Elastic Container Service)にDocker Hub上のイメージをデプロイするHowTo

## はじめに
Dockerのイメージ作ってECSにデプロイってなんかナウいですよね。
メモ書き程度ですがよかったら参考にしてください。


## 必要なもの
- [AWSアカウント](https://aws.amazon.com/jp/register-flow/)
- [Docker](https://www.docker.com/)
- [Docker Hubアカウント](https://hub.docker.com/)

## HowTo
すでにDocker Hubに自作イメージある&AWSのマネジメントコンソールを閲覧できる前提で話進めます。
###クラスタの作成
AWS上のサービスでElastic Container Serviceを...

[続きはこちらへ移転しました](https://taiseiotsuka.github.io/items/aws/ecs)
OBJ等のファイルをPOV-Rayのpovファイルに変換する

#0. はじめに
レイトレーシングをプログラムで行う場合って、MayaとかBlender使うよりも、やっぱりPOV-Rayが便利ですよね。でもレイトレーシングを行う3DモデルをPOV-Rayのジオメトリファイルでゴリゴリ書くのって死んじゃいますよね・・・。ということでMayaやBlenderで作成したObjectファイルをPOV-Rayのpov形式に変換する方法を説明します。

#1. objectファイルの用意
まずはBlenderなどを用いて、テキトーにobjファイルなどを書き出します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/95636/931b40e3-3360-51c9-7f0c-8d06ecc96f57.png)

#1. PoseRayで変換
下記URLからPoseRayをダウンロードし、インストール
https://sites.google.com/view/poseray

PoseRayを起動し、Input->Load...->objファイルを選択
そうすると開いたObjファイルが表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95636/27a377ee-c2f5-9d92-5d65-bdf8cf2e96ec.png)


次にPOV-Ray Output->Export...->Save...で書き出します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95636/52ca0b4b-4c44-c914-46c8-c10724d092f6.png)

そうするとこんなファイルが書き出されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95636/d20d61fd-f706-aad4-0404-661adfa904a8.png)


#2. POV-Rayで表示
書き出された.povファイルを開き、Runを押すと、以下のような結果が得られる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95636/f8cdff25-a788-5c35-4b00-340decb992b8.png)

ちゃんと変換できた
今日から使えるGASの基礎知識とノウハウについてまとめてみた

# はじめに

前回、[Google Apps ScriptでGoogleカレンダーからタイムスケジュールを作成してみた](https://qiita.com/neriai/items/483426cba8a9de479249)を行った結果を元に簡単にGASのノウハウと使った感想についてまとめました。

# 関数じゃ難しい！GASを使った理由

以前[]()を作る際にGASを使うきっかけになったのは、以下のような理由からでした。
Excelでも関数だけで行うのは難しく、マクロやVBAなどを使うことになる場合がありそうです。

## セルのカラーコード
- 取得ができない

## 複数の条件からそれぞれマッチする値やセル番号を取得
- VLOOKUPや集計関数を使いこなせばできると思うが複雑
- 計算するためのセルがいくつも必要なのでヤダ！

## Googleカレンダーからデータを取得したい
- Slackなどのサービスと連携したい

# 私がよく使った関数3選

こちらの[ソースコード](https://github.com/neriai/time-scheduler)で実際に使っています。

## Logger

ロガークラスです。

### Logger.log()

- ログを出力します

#### 使用例

```js
Logger.log('apple');
```
## SpreadsheetApp

スプレッドシートを操作するためのクラス群です。

### SpreadsheetApp.getActive().getSheetByName()

- 操作するシートを指定します

#### 使用例

```js
SpreadsheetApp.getActive().getSheetByName("スケジュール");
```

### getRange()

- 操作するセルの範囲を指定します
- 関数操作のときのような行列番号を指定する方法と、行列を単なる数値で指定する方法の2種類があります

#### 使用例

```js
var sheet = SpreadsheetApp.getActive().getSheetByName("スケジュール");
var range = sheet.getRange("B3:O50");
```

### getValues()/setValues()

- セルの値を操作します
- Values関数の場合は、複数のセルの値を配列形式で扱います
- 1セルのみの場合は、getValue()/setValue()を使用します

#### 使用例

```js
var cells = sheet.getRange(1, 2, 1, 16);
var dateHeaders = cells.getValues();
```

### getBackground()/setBackground()

- セルの色を操作します
- 引数にはカラーコードを指定します

#### 使用例

```js
var range = sheet.getRange("B3:O50");
range.setBackground("#FF0000");
```
## parseXXX()

- 演算や出力を行う際は型指定が厳密になっているので、
- パースを行う必要があります

## 

#### 使用例

```js
// int型
parseInt(1);

// float型
parseFloat(1);

// string型
String(1);
```

# ここが楽しいよ！GAS

## 大方はJavaScriptなので学習コストが低い
## 当たり前だけどセルに関数を挿入できるのはいい
## スクリプトエディタのUIが直感的
## Google製サービス連携が楽

# ここがつらいよ！GAS

## スクリプトエディタが貧弱
- 自動整形やインデント表示がない

## 6分以上の実行でタイムアウトエラー
- イベントトリガーの場合は、6分以内の処理にしなければならない
- 実行時刻を指定するタスクスケジューラなら大丈夫そう

## foreachがちょっと変（GASというよりJavascript）
- for(var num in numbers)だとキーが取得できない
- numbers.forEach(function(num, key)みたいな記述になる

## イベントトリガーの条件が少ない
- セルの値が変更されたとき、とか色々ほしい

## 実行速度が遅い
- 仕方なしだけどタイムアウトエラーにならないようにするのに頭を使う

## 修正パッチ機能とかほしい
- 使ってはいませんが、厳密なソースコード管理は以下のようにするといいらしい
- [gapps を使って Google Apps Script を継続的にデプロイする[(http://kakakakakku.hatenablog.com/entry/2017/02/26/034115)
tensorflow.jsでsin

#概要
tensorflow.jsでsin問題やってみた。


#写真
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/b67c61bd-2342-8192-ba28-07ca6bc0e8d9.png)

#サンプルコード

```
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
function draw(data, n) {
	var hc = n * 100 + 100;
    ctx.strokeStyle = "#f00";
    ctx.lineWidth = 1;
	ctx.moveTo(0, hc);
    for (var i = 1; i < 200; i++) 
    {
        ctx.lineTo(i, hc - data[i] * 30);
    }
	ctx.stroke();
}
const model = tf.sequential();
model.add(tf.layers.dense({
	units: 20,
	activation: 'relu',
	inputShape: [1]
}));
model.add(tf.layers.dense({
	units: 20,
	activation: 'relu'
}));
model.add(tf.layers.dense({
	units: 1,
	activation: 'linear'
}));
model.compile({
	optimizer: 'adam',
	loss: 'meanSquaredError'
});
const buffer = tf.buffer([200, 1]);
const buffer2 = tf.buffer([200, 1]);
b = [];
for (var i = 0; i < 200; i++) 
{
    var x = i / 30.0;    
    var y = Math.sin(x);
    b.push(y);
    buffer.set(x, i, 0);
    buffer2.set(y, i, 0);
}
draw(b, 0);
const xs = buffer.toTensor();
const ys = buffer2.toTensor();
//alert(xs);
//alert(ys);
model.fit(xs, ys, {
    batchSize: 200, 
    epochs: 6000
}).then((d) => {
    var str = "loss = ";
    str += d.history.loss[0]; 
    alert(str);
    p = [];
    for (i = 0; i < 200; i++)
    {
        var x =  i / 30.0;
        var pre = model.predict(tf.tensor2d([[x]], [1, 1]));
        var f = pre.dataSync();
        p.push(f);
    }
    draw(p, 1);
});




```


#成果物

http://jsdo.it/ohisama1/2DaC

以上。
ApacheBeamSDKのアップデートで詰まったところと対処法

ApacheBeamSDK for Pythonを`v2.1.1`から`v2.4.0`にアップデートした際に起きた問題と対処法

## やったこと
元々 2.1.1を入れていたため、それをupgradeした。

```
pip install --upgrade apache-beam
pip install --upgrade apache-beam[gcp]
pip install six==1.10
```

apache-beamをupgradeした際に入る、sixのバージョンが1.11で、

[Can't import apache_beam · Issue #46 · GoogleCloudPlatform/DataflowPythonSDK · GitHub](https://github.com/GoogleCloudPlatform/DataflowPythonSDK/issues/46)

と同様の問題に直面したため、1.10を入れ直した。

## 実行時のエラー
Dataflowでの実行時、以下ログが出たきり10分経っても、先に進まなかった。

```
JOB_MESSAGE_DETAILED: Workers have started successfully.
```

Stackdriver Loggingで確認したところ、worker-startupのINFOログで

```
ValueError: apache_beam.metrics.execution.MetricsContainer has the wrong size, try recompiling. Expected 40, got 48
/usr/bin/python failed with exit status 1
```

と出ていて、これが怪しい？

## 対処法
既存のものをupgradeするのではなく、1からライブラリを入れ直す。

```:Dataflowを動かすために必要なもの
pip install apache-beam
pip install apache-beam[gcp]
pip install nose
```

ライブラリの依存関係の問題っぽい。
Python環境をWindows10で作ってプログラマーになろう!! 文系学生がやってみた!!

##はじめに
インターン先でプログラミングを勉強中の文系学生。

(Python楽だな…)
HackerrankとかPHPでやってたけど、Pythonのほうが楽だと気付いた。
それじゃあ、インストールしていこう!!

##Pythonとは
一言でいえば、簡潔にプログラミングができる言語。
あくまでも自分の感想でしかないけどね。
自分の周りだけかもしれないけれど、Pythonでプログラミングをやっている人が多い気がする。
人気の波が来ている言語なのかな?
さてさて、そんなPythonをインストールしていきますか!!

##Python環境の構築
###Pythonのインストール
[Pythonインストール手順【for Windows10】](https://qiita.com/Futo23/items/2bed334b07eab5e130e8)を参考にインストールしていくか。
まぁ、Pythonの[公式HP](https://www.python.org/)から`Download`タブを選択して、64bitに対応しているインストーラーを選ぶだけなんだけどね。
2018/4/5で最新のバージョンは、`Download Windows x86-64 web-based installer`かな?
これをインストールしますか。

デフォルトだと、PATHの追加にチェックが付いていないから付けたほうが楽かも。
チュートリアルを紹介されたけど、Hackerrankや本で見た内容と、ほとんど変わらないから、必要ないと感じたら読まなくてもいいかもね。

じゃあ、ちゃんとインストールされたか確認してみますか。

```
$ python --version
```

を打つと、`Python 3.6.4 :: Anaconda custom (64-bit)`が表示された。

って、なんでAnaconda?

AnacondaとPythonをアンインストールしてから、もう一回Pythonをインストールするか。
Anacondaをインストールするときに、PATHを通さなければいい話だもんね。

`Python 3.7.0b3`

うん。大丈夫そうだね。

###pipの導入
####pipとは
Pythonをインストールしていることを社員さんに伝えると、「pipもインストールしておいたら、あとあと便利だよ」のこと。
pip?

とりあえず調べてみると、Pythonのパッケージを管理してくれるツールみたい。
パッケージってあれかな?
`import`や`__init__`で読むファイル?

調べてみると、大体そういう認識で間違ってないと思う。
そりゃあ、インストールしたほうが便利だ。

早速、インストールしていこう!!

####pipのインストール
調べてみると、一定のバージョン以降のPythonにはpipがインストールされているらしい。
バージョンを確かめてみるか。
ちなみに、pipだと`-v`じゃなくて、`-V`でバージョンを確かめるみたい。
注意しないと。

```
$ pip -V
```

を押すと、`pip 9.0.3`が出てきた。
本当にあったわ。

何か作業したいわけじゃないから、これ以上操作はしないでおこう。
基本的なコマンドは、[Pythonのパッケージ管理システムpipのインストールと使い方](http://uxmilk.jp/12691)が一番わかりやすいと思う。
ブックマークしておこうっと。

##まとめ
今回はWindows10にPython環境を整えました!!
これを機に、Pythonを使って、プログラミングの勉強を進めていこう!!

##参考サイト
[Pythonインストール手順【for Windows10】](https://qiita.com/Futo23/items/2bed334b07eab5e130e8)-https://qiita.com/Futo23/items/2bed334b07eab5e130e8
[Pythonのパッケージ管理システムpipのインストールと使い方](http://uxmilk.jp/12691)-http://uxmilk.jp/12691
正規表現まとめ

正規表現についてまとめてみました。

# そもそも正規表現とは
いくつかの文字列を一つの文字列にできてしまう形式のこと。使いこなせると検索するときに非常に便利。

# 正規表現まとめ
## 「.」；ある一文字を表すことができる。

その一文字は何でもいい。言わば大富豪のジョーカー的存在。
例えば「...は....です。」と検索すると、

- わたしはてんさいです。
- あのこはかわいいです。
- わらわはぽんこつです。

全てヒットする。

##「\.」；本当に「.」を使いたい時には「.」の前に「\」をつければよい。

例えば「I am happy.」と検索してしまうと、

- I am happy.
- I am happya

両方ヒットしてしまう。「\.」とするとそれを防ぐことができる。

## 「[]」；かっこの中に「これは入っていてほしい！」という文字を入れる。

例えば「[abcde]」とすれば、aかbかcかdかeのどれかを一つ以上含んでいるものがヒットする。

## 「[^]」；かっこの中に「この文字を含むものは除外したい！」という文字を入れる。

例えば「[^fgh]」とすればfを含むものやgを含むもの、hを含むものはヒットしない。

## 「-」；範囲を表せる。

例えば、「[a-z]」とすればaからzまでのどれかを含んでいればヒットすることになる。ここで注意が必要なのは、小文字と大文字は区別して考える必要があること。もし、「[A-Z]」とすれば、

- APPLE
- Kirigirisu888

などはヒットするが、

- udon
- soba

などはヒットしない。逆に言えば、「[^a-z]」で小文字を含むものを除外というように応用することができる。

## 「\w」；アルファベット一文字の代わりをする。

先ほど紹介した「.」は全ての文字、一文字の代わりができた。これはアルファベット一文字の代わりができる。

## 「\d」；数字一つの代わりをする。

「\w」と同じように、数字一つの代わりができる。

## 「\s」；スペース一つの代わりをする。

「\w」「\d」と同じように、スペース一つの代わりができる。

## 「{}」；何回以上含めばよいか指定する。

「検索したい文字{何回以上含めばよいかを表した数字}」のようにして使う。例えば「a{6}」とすればaを六回以上含むものだけがヒットする。

- aaajkaaa
- tivwaaaaaaaaaaaaaaaaa

はヒットするし

- atkitkitktiti
- aaegtaa

あたりはヒットしない。何回以下しか含まないという条件をつけ足したり、複数の文字のどれかを含むという条件を足すこともできる。例えば、「[abc]{1, 5}」とすれば、aかbかcのいずれかを一回以上三回以下含むものがヒットする。

- aa111
- ab86kc

などだ。

## 「+」「*」；それぞれ「一回以上」と「ゼロ回以上」。

文字の後ろにそのままつけることで、それぞれ「一回以上」と「ゼロ回以上」じゃないとだめ、という条件をつけられる。例えば「aa+b+c*」としてやれば、aが二回以上でbが一回以上のものが出てくるはず。（cはどちらでもよい。）

##「?」；前の文字はあってもなくてもいいことを表すマーク。

例えば「pcs?」とすると、

- pc
- pcs

どちらもヒットする。

## 「^」「$」；一番前の一連のワードを指定/ 一番後ろの一連のワードを指定。

例えば「^It」とすれば一番最初に「It」が来るもののみがヒットする。「possible$」とすれば一番最後に「possible」が来るもののみがヒットする。この場合「impossible」もヒットしてしまうことに注意。

## 「()」；グループ化。

かっこでくくることによって、その中のデータを取り出し、ひとまとまりにできる。また、一時的に記録することができるらしい。かっこを複数回使用することによって、階層構造になっているデータのうち、下層にあるデータを複数回取り出すことができる。

- (\w(\d))

上のようにしてやれば任意の文字と数字を一つずつ取り出しつつ（\wと\d）さらにその数字単体を取り出すことができる（\d）。

## 「|」；もしくは、の意。

例えば「(blue|red)」なら「blueあるいはred」の意味になる。複雑なものを書く時に重宝するかもしれない。

## 大文字について。

しばしば大文字を用いると否定の意味になる。例えば「\W」はアルファベットでない一文字。「\D」は数字でない一文字。「\S」は空白でないことを表す。

#まとめ
基礎的なことはこれくらいかなと思います。
yumインストールでエラー([Errno 256] No more mirrors to try)

たまにおきるので備忘。

yumで何かのパッケージをインストールしようとして、次のようなエラーになることがある。
###[Errno 256] No more mirrors to try
ミラーサイトが見つからないよ！というエラー。

新バージョンがリリースされると、古いバージョンのミラーがなくなってしまうが、yumのキャッシュが残ってると、古いミラーサイトへ見に行ってしまうのでエラーになってる。

なので、とりあえずyumのキャッシュを確認して削除する。

ちなみにyumキャッシュは `/var/cache/yum`にある。
'du -sh /var/cache/yum'でどのくらいキャッシュがあるか確認できる。

```
# du -sh /var/cache/yum     <-キャッシュの確認
# rm -rf /var/cache/yum/*　 <-キャッシュ削除
# yum clean all
```

キャッシュクリアしたら、updateして、リポジトリリストが正常になってるか確認。

```
# yum update
# yum repolist
```

特にエラーになってなければ、大丈夫。
再度yumインストールできるはず。
ActiveRecord::Migration で string のカラムをデータごと integer に変換する

間違えて string(=varchar) で定義したカラムを、
データのコンバート込みで integer(=int4) にしたい時の小技。

```rb
def up
  change_column :reports, :file_size, 'integer USING CAST(file_size AS integer)'
end

def down
  change_column :reports, :file_size, :string
end
```
Facebook Graph APIから交際ステータスが取得できなくなる

# 概要
4/5 4:00ごろからFacebook Graph APIから交際ステータス(user_relationship)が取得できなくなりました。

# 原因
Facebook側のGraph APIの仕様変更によるものです。
https://newsroom.fb.com/news/2018/04/restricting-data-access/

Facebookの個人情報流出事件を受け、大幅にGraph APIで取得できる情報を制限したようです。

```
We will also no longer allow apps to ask for access to personal information such as religious or political views, relationship status and details, custom friends lists, education and work history, fitness activity, book reading activity, music listening activity, news reading, video watch activity, and games activity
```

以前は交際ステータスを取得するには審査が必要でした。
審査が通っていても今回の変更で取得できなくなるようです。

# 対策
現在の所、Graph APIから交際ステータスを取得する方法はなさそうです。
なにか対策等ありましたらコメントいただけると助かります。
Unreal Engine 4メモ：文字列操作系TIPs

#フォーマット
```c++:sample.cpp
FString text = "文字列";
FString message = FString::Format(TEXT("文字列 {0} 文字列"), { *text });
```
`FString::Printf`は4.20でdeprecatedになりました。
#FStringからc標準文字列への変換
`TCHAR_TO_ANSI`マクロを使うと簡単です。

```c++:HowToCastFStringToAnsiChar.cpp
void SampleMain()
{
	FString needCastString;
	SampleFunction(TCHAR_TO_ANSI(*needCastString));

	// FStringのログ出力
	UE_LOG(LogTemp, Warning, TEXT("[LOG] : %s\n"), (const char*)TCHAR_TO_ANSI(*needCastString));
}

void SampleFunction(const char* columnName)
{
	// process...
}
```
[フォーラム「How can I cast FString to Char *?」](https://answers.unrealengine.com/questions/37762/fstring-to-char.html)

#FNameからc標準文字列への変換
`FName::GetPlainANSIString()`を使用します。

```c++:HowToCastFNameToAnsiChar.cpp
void SampleMain()
{
	FName needCastString;
	SampleFunction(needCastString.GetPlainANSIString());

	// FNameのログ出力
	UE_LOG(LogTemp, Warning, TEXT("[LOG] : %s\n"), (const char*)needCastString.GetPlainANSIString());
}

void SampleFunction(const char* columnName)
{
	// process...
}
```

#その他のエンコード変換系
名前が読んだままなので特に解説しませんが、変換マクロです。便利なので使いましょう。

```
TCHAR_TO_ANSI(str)
TCHAR_TO_OEM(str)
ANSI_TO_TCHAR(str)
TCHAR_TO_UTF8(str)
UTF8_TO_TCHAR(str)
```

#フルパス取得
先頭に「/」が入ってたりすると相対パスと判定されなかったりするのでFPaths::IsRelative(RelativeFilePath)を使って事前に本当に相対パスなのかチェックすべし（内部的にこれでチェックされている）。また、相対パスでなかった場合元の文字列が返されるので「あれ？なんで？」ってなっても気づきにくい。

```c++:Sample.cpp
check(FPaths::IsRelative(RelativeFilePath));
FPaths::ConvertRelativePathToFull(RelativeFilePath);
```

#参照
[Unreal Engine 4 ドキュメント > プログラミング ガイド > ゲームプレイのプログラミング > 文字列の取り扱い](https://docs.unrealengine.com/ja/Programming/UnrealArchitecture/StringHandling/index.html)

<details>
<summary>書きかけの項目</summary>
FName
NAME_None
</details>
ディープラーニング検定E資格の認定プログラムを比較してみました（2018/04/05最新版）

# ディープラーニング検定E資格について

> ディープラーニングに関する知識を有し、事業活用する人材（ジェネラリスト）と、ディープラーニングを実装する人材（エンジニア）の育成を目指します。各々に必要な知識やスキルセットを定義し、資格試験を行うとともに、協会が認定した事業者がトレーニングを提供します。 各々年二回実施予定。日進月歩する技術であることから、検定・資格実施年毎に実施年号を付与する。 （参照：http://www.jdla.org/business/certificate/#education）

# 概要
- 概要：ディープラーニングを実装するエンジニアの技能を認定する  
- 受験資格：JDLA認定プログラム※を修了していること
- 試験概要：会場試験（初回は東京、大阪）、知識問題（多肢選択式）
- 出題問題：シラバスより、JDLA認定プログラム修了レベルで、使用フレームワーク、ライブラリに依存しない問題を出題
- 試験日：2018年9月29日（土） 時刻未定
- 受験料：32,400円（税込／予定）

→資格試験を受けるために、**JDLA認定プログラムを受ける必要がある。**

# JDLA認定プログラム一覧
参照：http://www.jdla.org/news/detail/20180403001/

> ■現場で使えるディープラーニング基礎講座
　認定番号：00001
　講座形態：ハンズオン（東京、大阪、名古屋）
　運営会社：スキルアップAI株式会社
　詳細ページ：https://www.skillupai.com/deep-learning/

> ■機械学習オンライン／ディープラーニングオンライン
　認定番号：00002
　講座形態：オンライン
　運営会社：株式会社zero to one
　詳細ページ：https://zero2one.jp/company/

> ■現場で潰しが効くディープラーニング講座
　認定番号：00003
　講座形態：ハンズオン（東京）
　運営会社：株式会社ナトフ
　詳細ページ：http://study-ai.com/jdla/

# 認定プログラム比較
|   　　　　　　　　　|①現場で使えるディープラーニング基礎講座|②機械学習オンライン／ディープラーニングオンライン|③現場で潰しが効くディープラーニング講座|
|:--|:--|:--|:--|
|運営|スキルアップAI株式会社|株式会社zero to one|株式会社ナトフ（Study-AI）|
|料金（税別）|￥258,000（講座＋E資格対応）<br>※その他学割などもあり。<br>　法人は＋￥69,000|※未公開|￥350,000<br>※法人は￥450,000|
|オフライン（座学）|〇　　　　　　　　　　　　　　　　　　|×　　　　　　　　　　　　|〇　　　　　　　　　　　　　|
|オンライン|〇|〇|〇|
|講座時間|対面講義（約30時間）|※未公開|講座36時間|
|期間中問い合わせ|＋￥29,000で講師や有識者にチャット対応可能。講義最終日から1か月間猶予あり。|※未公開|追加オプション（有料）で、講師やTAに質問可能|
|応用数学|講義なし。確認テストはあり。別コースでの講義受講可能（割引あり）。|なし？|ベーシックターム内で講座あり。ベーシックタームを受講しない場合は、確認テストのみ。|
|機械学習|講義なし。確認テストはあり。別コースでの講義受講可能（割引あり）。|講座あり。機械学習と、ディープラーニングのコースを２つ受講して、初めてE資格受験可能。|ベーシックターム内で講座あり。ベーシックタームを受講しない場合は、確認テストのみ。|
|ディープラーニング|https://www.skillupai.com/deep-learning#comp-jfj0lj33inlineContent|https://zero2one.jp/company/course/deep-learning/|http://study-ai.com/jdla/<br>↑ディベロッパータームの詳細をクリックk|
|期間（東京）|5/16~8/29（毎週水曜日夜間）|？|5/20~7/29（毎週日曜日、山手線内）|
|期間（その他）|大阪　：6/30~9/1<br>名古屋：6/30~9/1<br>東京２：6/16~8/25|-|-|
|期間（オンライン）|5/1~8/25|？|5/20~7/29|
|説明会|https://skillupai.connpass.com/|？|https://ws.formzu.net/fgen/S41122260/|
|申し込みのために説明会参加する必要あるか|必要ない|？|おそらく必要ない（明記なし）|
|申し込み開始日|不明|不明|すでに申し込み可能|
|修了証|〇|不明|〇|

# 所管
- まだ②の情報が少なく、2社比較のようになってしまいまいた。②については、現在詳細情報を問い合わせ中です。
- ①も③も価格感的には横並びの印象です。③も、ベーシックターム（数学、機械学習）を除けば25万円になるためです。
- 私はスキルアップAIの説明会にしか参加していませんが、他2社もこれから参加予定です。
- 実際の講義内容は日本ディープラーニング協会が定めるシラバスに従っているので、内容にも大きく差はないと考えます。価格と、場所と、時間帯で決めるのがいまのところ最適解かと。

以上です。
情報が更新され次第、また更新します。
isset(), empty()の動作


## 判定結果一覧

|値|isset()|empty()|
|-----|-----|-----|
|未定義|false|true|
|NULL|false|true|
|false|true|true|
|空文字("")|true|true|
|0|true|true|
|"0"|true|true|
|空の配列|true|true|

---
isset()

```
変数がセットされていること
そしてNULLではないことを検査する
```

empty()

```
変数が空であるかどうかを検査する
```
Ansibleについて

自分に向けたメモ代わり

##<b>Ansibleとは
レッドハットが開発している、<B>"構成管理ツール"</B>
といわれても、、構成管理ってなんだ。

##<b>構成管理ツールについて(補足)
クラウド、サーバ、ネットワークなどインフラの様々な<b>構成</b>を管理するためのツール
有名どころは以下の３つ

①Puppet

②Chef

③Ansible  <--- 今回のテーマ

##<b>Ansibleの特徴
・シンプル
　YAMLという形式で記述された設定ファイルで実行
　シンプルで学習コストが少ない

・エージェントレス
　コントロール側にAnsibleがありターゲット側にはAnsibleが必要ない
　SSHで接続ができる環境であれば即時使用可能
　
・豊富なモジュール
　モジュールがあれば対応可能
　ネットワーク機器にも使えるのでネットワーク屋の私的にも期待がすごい
　- ios
　- Junos
　- A10
　- Nxos
　ネットワークモジュール:http://docs.ansible.com/ansible/latest/modules/list_of_network_modules.html
　※サーバ系のモジュールほうが圧倒的に多いが私がネットワーク屋なので恣意的に選出

##<b>構成要素</b>
基本的には以下の3つ
<b>・ansible.cfg</b>
  Ansibleの設定ファイル
　たとえばどこのインベントリファイルを参照するなどの設定を書き込む

<b>・インベントリファイル</b>
　認証情報(ipとかhost名とか)を記載する場所
　拡張子は「.ini」が一般的な模様、拡張子なしでも可

<b>・Playbook</b>
　イメージは作業手順書
　どこに(インベントリファイル内)の誰(ホスト)に対して何(モジュール)を実行するかを定義したもの
　※ざっくりとしたイメージのため語弊があるかもしれません


##<b>まとめ</b>
Ansibleは<b>"構成管理ツール"</b>
ネットワーク機器やサーバなどの構成情報を管理できるもの、対象範囲は広くモジュールが対応していれば即時投入可能
インベントリファイルやPlaybookなど自分で作成するファイルはシンプルで学習コストも低い
最近バージョン2.5がリリースされて盛り上がってる？
Espruino 起動手順

Espruino 1v96 でのメモ。バージョンが変わると変更されうるので、注意。

一般的なボードにコードを保存する手順はこう。

- スケッチに `E.on("init", callback);` を記述する、かつまたは `onInit` という関数を定義する。
- SEND ボタンでデバイスに送信する
- コンソールで `save()` を実行する

もちろんコンソールで直接関数を定義して `save()` までやってしまっても問題ない。デフォルトでは、SEND ボタンは `reset()` とスケッチの実行までをやってくれる。つまり中身を分解すると次のようになる。

- `reset()` 実行
- コードの定義
- `save()` 実行

電源投入時は "init" イベントハンドラが順番に処理された後に、`onInit` が存在すれば、それも呼び出される。


## BootCode

実は上記の仕組み以外にコードを流し込む `setBootCode()` という仕組みがある。電源投入時は次のようになる

- boot code を上から実行
- "init" イベントハンドラが順番に処理される
- `onInit` が存在すれば、それも呼び出される。

設定の COMMUNICATIONS > Save on Send の項目で YES とすると、スケッチの内容が boot code に設定される。

Save on Send を YES にしたり NO にしたりして実行すると、boot code 領域と、通常の領域の両方にコードが設定される。起動時に両方とも実行されるので、**大混乱**することに注意。混乱したら、下の初期化手順で初期化しよう。

## built-in init

ボードによって環境初期化時に実行されるコードが設定されるものもある（ex: `jswrap_wio_lte_init`）。これも含めると、こういう手順になっている。

- 隠された `init` を上から実行
- boot code を上から実行
- "init" イベントハンドラが順番に処理される
- `onInit` が存在すれば、それも呼び出される。


## Wrap-up

以上をまとめて、結局 `dump()` で確認できる。

ボードの初期化はコンソールで次を実行するのがいいだろう。

```javascript
E.setBootCode() // reset() does not erase boot-code
reset()
save()
```

Wio-LTE は上記の初期化でもコードが残るけれど、正常な動作（`jswrap_wio_lte_init` の効果）。

```javascript
>dump()
pinMode(A2, "af_output", true);
pinMode(A3, "af_output", true);
digitalWrite(A15, 1);
pinMode(C8, "input_pullup");
digitalWrite(C9, 0);
digitalWrite(C10, 0);
digitalWrite(C11, 1);
digitalWrite(C12, 0);
digitalWrite(D2, 1);
```

## おまけ

しかしまぁ Arduino と比べると消費電力は確実に大きいようで、Arduino で使っていたバッテリーでは Wio LTE の起動状態すら維持できないということが判明。なかなか強いバッテリを用意しないと駄目かも。
macOSでスクリーンショットをクリップボードに保存してファイルにしない方法

さっき書いた記事[IntelliJ IDEAのエディタに背景画像を設定する方法](https://qiita.com/stmkza/items/2db930cd2bf2a8e957c6)を書くときにスクリーンショットを撮ったのですが、Qiitaの編集画面に貼り付けるときにいちいちファイルにするとあとで消す必要があります。
どうせならクリップボードに保存してここにペーストするだけにしたかったので、ファイルに保存しない方法を探して、色々試していたら見つけました（素直にググったほうが早かった気がするけど。。。）

# スクリーンショットをクリップボードに保存する方法
- 画面全体をスクリーンショットする場合：<kbd>⌘</kbd>+<kbd>shift</kbd>+<kbd>control</kbd>+<kbd>3</kbd>
- 画面の一部をスクリーンショットする場合：<kbd>⌘</kbd>+<kbd>shift</kbd>+<kbd>control</kbd>+<kbd>4</kbd>

単純に普段の操作にcontrolキーを加えるだけでした。。。これを見つけるのに10分ほど色々試してた。。。
Git merge request/pull request

# 概要
よく使うだけに、メモに残す

# 適当なファイルを編集
```
vi README.md 
```

# ブランチ作成
```
git branch
git checkout -b dev-add-README
git branch -a
```

# コミット&別ブランチへpush

```
git add  README.md 
git commit -m "edit README.md" 
git push -u origin dev-add-README
```

# マージリクエスト
GitHub/GitLab上で。
IntelliJ IDEAのエディタに背景画像を設定する方法

[JetBrains](https://www.jetbrains.com/)のIntelliJ IDEAはとても便利なのですが、今まで他のエディタでできる背景画像を設定する方法が見つからず、モチベーションがあがらなかったので設定を探していました。
そしたら設定が意外なところで見つかったので、書いておきます。

# 設定方法
### Preferencesを開く(⌘+,)
![pref.png](https://qiita-image-store.s3.amazonaws.com/0/120731/3459f64f-a696-77e7-5ab4-5fbf8fdba6ec.png)

### Appearance & Behavior -> Appearance を開く
![appearance.png](https://qiita-image-store.s3.amazonaws.com/0/120731/b69f1b27-3ac9-f155-d643-95996b721e6c.png)

### Backgrund Image...をクリックする
![settings.png](https://qiita-image-store.s3.amazonaws.com/0/120731/5b375548-21a5-72eb-d812-6543f33c6802.png)

# まとめ
ずっとEditorから探していたので全くわかりませんでした。
わかりにくすぎる。。。。。
参考になれば幸いです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120731/6dd90e4d-0cc7-a7f7-a61f-72fd7e04b0fb.png)
fish shellの起動時間が遅いのでプロファイルを取得する

## 概要
fish shellの起動がだんだん遅くなってきたので、設定ファイルの棚卸しも兼ねて起動時のプロファイルを取得して遅い部分を調査しました。

## プロファイルの取得

一般にfish shellでプロファイルを取得するには、`fish`の起動時に`--profile /path/to/file.txt`というオプションを指定します。

```sh
$ fish --profile profile.txt
```

これで新しくfish shellが立ち上がり、シェルを終了するまでの実行されたコマンドとその処理時間が詳細に記録されます。

例えば、`ls`を実行すると以下のような結果が出てきます。なお、ここに示している出力以外にも大量にコマンドが前後に出てきますが、ここでは割愛しています。

```
Time    Sum     Command
[...]
436     31113   > ls
401     14172   -> source /usr/local/Cellar/fish/2.7.1/share/fish/functions/ls.fish
36      13771   --> if command ls --version >/dev/null ^/dev/null...
5557    5557    ---> command ls --version >/dev/null ^/dev/null
8149    8149    ---> command ls -G / >/dev/null ^/dev/null
29      29      ---> function ls --description "List contents of directory"...
16505   16505   -> command ls -G $argv
[...]
```

1カラム目のTimeが各行のコマンド単体の実行にかかった時間、2カラム目のSumがコマンド全体としてかかった時間、そして3カラム目が実行されたコマンドを示しています。時間の単位はどちらもマイクロ秒です。

`ls`が実行されるとまず`ls.fish`というコマンドが読み込まれ、この処理自体は14.172msかかっていることがわかります。コマンドの中身を見ると"Make ls use colors if we are on a system that supports that feature and writing to stdout."とあるので、lsのファイル名などに色を付ける関係の処理を行っているようです。

## 起動時プロファイルを取得する

今回は起動時間が遅いということで、シェルの立ち上げ時のプロファイルを取得します。`--profile`をつけてシェルを起動してすぐに終了させることで起動部分のみのプロファイルを取得します。そして2カラム目のトータル実行時間でソートすることで、コマンドの処理時間順に並び替えています。

```sh
$ fish --profile profile.txt
$ exit
$ sort -k 2 -nr profile.txt
```

これでボトルネックとなっている箇所が特定できます。私の場合はfishermanで入れた特定のパッケージの設定が遅いことがわかったので、それを`.config/fish/config.fish`上で無効にすることにより、起動時間を短縮することができました。

## 参考

- [git path completions are slow · Issue \#4117 · fish\-shell/fish\-shell](https://github.com/fish-shell/fish-shell/issues/4117)
初心者は React と Angular のどちらを選ぶべきか？

# 対象読者

* React とか Angular とか学習したいけれども最近のフロントエンドについて詳しくないのでどちらをやればいいかよくわからない人。

# はじめに

* React と Angular についての一般的な比較は「[開発者はReactとAngularのどちらを選ぶべきか？](https://www.webprofessional.jp/react-vs-angular/)」という記事に詳しくまとめられているが、どちらが絶対的に優れているということはないので、どうしても「よく比較して状況にあった方を選んでね」という結論になる。
* 初心者としては結局どうすればいいのかわからなくて不安になるので、とりあえずこうやって学習していけばいいんじゃない？という記事があると嬉しいと思いまとめてみた。

# 最初に結論

* とりあえず Angular からやってみて、余裕ができたり Angular に過不足を感じられるようになったら React もやってみる。

# Angular はパッケージツアー

* Angular はフロントエンドのアプリケーションで必要になりそうな機能がまとめられているフレームワーク。
* つまり Angular の使い方を学習すればフロントエンドアプリケーションがどのような技術でできているのかを俯瞰してみられるようになる。
* Angular を利用するということはちょうどパッケージツアーに参加するようなもので、Angular に案内してもらうことでよく知らないフロントエンドアプリケーションも効率よく開発することができ、開発を通じてフロントエンド分野の技術スタックの地図を自分の中に作っていくことができる。ただし個人的に興味のあるところに行きたくても予定になければ諦めなければならない。

# React は個人旅行

* React はビュー表示に特化したライブラリで他のライブラリと組み合わせてアプリケーションを作成する。
* どのライブラリと組み合わせるか、どんな構成にするか、などは個々の要望に合わせて変更することができるので自由度が高いが、ライブラリやアーキテクチャについての知識が要求される。
* Angular がパッケージツアーだとすると React による開発は個人旅行に似ている。どこにいくかや何を食べるかなどは好みに合わせて変更することができるので、旅先についての十分な知識を持ち正しい判断ができるとすれば楽しい時間が過ごせるだろう。ただしそれらが足りなければ最悪の場合は帰ってこれないかもしれない。

# React と Angular はどちらが簡単か？

* React 単体と Angular だと React の方が機能が少ないので簡単。React と他のライブラリを組み合わせて使おうとすると、他のライブラリの選定や学習、組み合わせて使うための設計などが必要になってくるので難易度が上がる。始めるのは簡単だがゴールは自分で見つけなければいけない感じ。
* Angular は機能が多いのでおぼえることは多い。機能が多い分 Angular 単体で完結できる部分が大きく、他ライブラリの選定や設計などが必要ないため根気さえあれば使えるようになる。ゴールは遠いが確かにある感じ。

# 初心者は React を使わないほうがいい？

* 初心者が独学で始めるなら難易度は高い。
* サポートしてくれるいい人がいたり、いい資料があったりするのであればどちらから始めても問題はないはず。
ElasticsearchのScriptを使った更新

---
- scriptを使用して下記のような更新が可能。

当たり前ですが、modifiedのみが更新される。

```
POST index_name/type_name/{{ ドキュメントの_id }}/_update?pretty
{
  "script": "ctx._source.modified  = ctx._source.created"
}
```
modifiedとcreatedはtype_nameの適当なフィールドの例。
この場合は、modifiedをcreatedで更新している。

---
- curlを使った場合は下記のようになる。

```
curl -XPOST 'http://localhost:9200/index_name/type_name/{{ ドキュメントの_id }}/_update?pretty' -d '{"script":"ctx._source.modified  = ctx._source.created"}'
```

---
- レスポンス

```
{
  "_index" : "index_name",
  "_type" : "type_name",
  "_id" : "{{ ドキュメントの_id }}",
  "_version" : {{ バージョン }}
}
```
Nuxt.js 初期設定＆トラブルシューティング

## Install & Generate project
プロジェクト開始時のnuxtインストールとプロジェクトテンプレート作成。

1. `npm install -g vue-cli`
2. `vue init nuxt-community/starter-template <project-name>`

[https://ja.nuxtjs.org/guide/installation/](https://ja.nuxtjs.org/guide/installation/)

## css & scss 読み込み設定
scssを使うための設定

1. `npm install --save-dev node-sass sass-loader`
2. `~/assets/example.scss`
3. configure `nuxt.config.js`

```js
module.exports = {
  css: [
    // プロジェクト内の CSS ファイル
    '~assets/css/main.css',
    // プロジェクト内の SASS ファイル
    { src: '~assets/css/main.scss', lang: 'scss' } // SASS の代わりに SCSS を使う
  ]
}
```

npmコマンドでインストールしたcssライブラリはこう読み込ませる。

```js
..
  css: [
    'assets/main.css',
    { src: '~assets/css/pulse.scss', lang: 'scss' },
    // spectre css framework
    'node_modules/spectre.css/dist/spectre.min.css',
    'node_modules/spectre.css/dist/spectre-exp.min.css',
    'node_modules/spectre.css/dist/spectre-icons.min.css'
  ], ..
```

[https://ja.nuxtjs.org/api/configuration-css/](https://ja.nuxtjs.org/api/configuration-css/)

## plugins 外部ライブラリ設定
npmでインストールしたライブラリはこう読み込ませる。

1. create plugin js `plugins/vue-notifications.js`

```js
import Vue from 'vue'
import VueNotifications from 'vue-notifications'
Vue.use(VueNotifications)
```

2. configure `nuxt.config.js`

```js
module.exports = {
  build: {
    vendor: ['vue-notifications']
  },
  plugins: ['~plugins/vue-notifications']
}
```

ex. クライアントサイドでしか使わない系のプラグイン

```js
  plugins: [
    { src: '~plugins/uikit', ssr: false }
  ],
```

[https://ja.nuxtjs.org/guide/plugins/](https://ja.nuxtjs.org/guide/plugins/)

## tslintでエラー出るときは

```
No ESLint configuration found.
```

1. `.eslintrc.js` を作る

```js
module.exports = {
  root: true,
  parser: 'babel-eslint',
  env: {
    browser: true,
    node: true
  },
  extends: 'standard',
  // required to lint *.vue files
  plugins: [
    'html'
  ],
  // add your custom rules here
  rules: {},
  globals: {}
}
```

---

nuxt.jsすっごく便利ですね :D
【BigQuery】Syntax error: Missing whitespace between literal and alias atってエラーの対処方

`Missing whitespace between literal and alias`
とでてパット見、「スペースがなんか悪さしてるのかな」って思って色々探すんですけどなんとなく問題なさそう。


そんなときの原因ですが、

```sql
SELECT
  "aaa" as 1hoge
```

という感じで、列名のエイリアスの頭が数字になってるとタイトルのようなエラーがでるようです。

SQL界隈では常識なんでしょうけどうっかりやっちゃうこととかあると思います。
僕は今までSQLなんて書いてこなかったのでハマってしまったのです。

今日はそれだけです。
Element.prototype jQueryLike

### usage
```js
E();//boot one;
let log=function(ev){console.log(ev)};
fn.ce('label')
 .once('click mouseover',log)
 //.on('click mouseover',log)
 .ef('orange',log)
 .a2(document.body)
 .attr('title','xyz')
 .textContent='zzzzz'
;
```
```css
.orange{
 color:orange;
 animation:x ease-in 10s; 
}
@keyframes x{
 0%{background-color:red}
 100%{background-color:orange}
}
```

### core
```js
;(function(root){
 /*v0.01 animation ok. but transiton the issue.*/
 let fn=root.fn||{}
 ,a='oTransitionEnd mozTransitionEnd webkitTransitionEnd transitionend'
 ,b='animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd'
 ,f=function(a,b){return function(ev){this.classList.remove(a);if(b)b(ev)}}
 ,f1=function(str){return str.split(' ').filter(d=>(d.trim().length!=0))}
 ;
 fn.r=(d=>d.parentNode.removeChild(d))
 fn.q=(s,doc=document)=>{return doc.querySelector(s)};
 fn.qa=(s,doc=document)=>{return [].slice.call(doc.querySelectorAll(s))}
 fn.ce=(d=>document.createElement(d))
 ;
 function entry(){
  root.fn=fn;
  var e=Element.prototype;
  e.on=function(a,b,c){ f1(a).map(d=>this.addEventListener(d,b,c));return this}
  e.off=function(a,b,c){ f1(a).map(d=>this.removeEventListener(d,b,c));return this}
  e.emit=function(a){ f1(a).map(d=>this.dispatchEvent(d));return this}
  e.once=function(a,b){this.on(a,b,{once:true});return this}
  e.one=e.once;
  e.a2 =function(p){p.appendChild(this);return this} //appendTo
  e.p2 =function(p){p.insertBefore(e.el,p.firstChild); return this} //prependTo
  e.as2 =function(p){p.parentNode.insertBefore(this,p.nextSibling);return this} //append siblingsTo
  e.ps2 =function(p){p.parentNode.insertBefore(this,p);return this} //prepend siblingsTo
  e.r=function(){return fn.r(this)}
  e.q=function(s){return fn.q(s,this)}
  e.qa=function(s){return fn.qa(s,this)}
  e.ce=function(s){return fn.ce(s,this)}
  //
  e.ac=function(a){f1(a).map(d=>this.classList.add(d));return this} 
  e.rc=function(a){f1(a).map(d=>this.classList.remove(d));return this}  
  e.attr=function(a,b){ if(b){ this.setAttribute(a,b);return this}else{return this.getAttribute(a)} }
  e.rattr=function(a){ this.removeAttribute(a);return this}
  /*v0.01 animation only*/
  e.ef=function(cls,caller){this.classList.add(cls);this.once(a+' '+b,f(cls,caller));return this}  
 }
 ;
 root.E=entry;
})(this);

```
Ethereum.rbで.deploy_and_wait()をしたらIOError: unknown transactionになる

## まえおき
https://qiita.com/fukumame55/items/a66b8b04a543fae0baff
https://qiita.com/shiki_tak/items/1fdac873e35c5257a4d7
上記の記事を参考にしてEthereum.rbを学習していた際に遭遇したエラー

## 現状
```ターミナルにて.
$ geth version

Geth
Version: 1.8.1-stable(1.8.1以下だと起こるのかな？という所)
Git Commit: 329ac18ef617d0238f71637bffe78f028b0f13f7
......
```

```Ruby.
irb> client = Ethereum::IpcClient.new('/Users/cohki0305/private_geth/geth.ipc')
irb> contract = Ethereum::Contract.create(file: '/Users/cohki0305/sample.sol', client: client)
irb> contract.deploy_and_wait()

IOError: unknown transaction
	from /Users/cohki0305/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/ethereum.rb-2.2/lib/ethereum/client.rb:129:in `send_command'
	from /Users/cohki0305/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/ethereum.rb-2.2/lib/ethereum/client.rb:137:in `block (2 levels) in <class:Client>'
	from /Users/cohki0305/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/ethereum.rb-2.2/lib/ethereum/deployment.rb:27:in `check_deployed'
	from /Users/cohki0305/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/ethereum.rb-2.2/lib/ethereum/deployment.rb:35:in `deployed?'
	from /Users/cohki0305/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/ethereum.rb-2.2/lib/ethereum/deployment.rb:43:in `block in wait_for_deployment'
	from /Users/cohki0305/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/ethereum.rb-2.2/lib/ethereum/deployment.rb:40:in `loop'
	from /Users/cohki0305/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/ethereum.rb-2.2/lib/ethereum/deployment.rb:40:in `wait_for_deployment'
	from /Users/cohki0305/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/ethereum.rb-2.2/lib/ethereum/contract.rb:152:in `deploy_and_wait'
	from (irb):18
	from /Users/cohki0305/.rbenv/versions/2.4.3/bin/irb:11:in `<main>'
```

Versionが1.8.1とかそれ以下だと当てはまりそうです。
deploy_and_wait()するとIOErrorが起こる
## 解決策
gethをアップデートしましょう！
1.8.3では解決がされているようです。
https://github.com/EthWorks/ethereum.rb/issues/71

bundle経由でダウンロードをしている場合は、bundle updateとかでできそう。
自分の場合はgit経由でアップデートしました

```ターミナル.
$ cd
$ cd go-ethereum
$ git branch -r
$ git checkout -b release/1.8 origin/release/1.8 (最新のverに)
$ git pull origin release/1.8
$ make all
```
Amazon Linux 2 で EPEL rpm package を有効にして、 The Silver Searcher を install する方法

```
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install the_silver_searcher
```

## 参考
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-enable-epel/ だけど、Amazon Linux 2 は "Amazon Linux - the EPEL rpm package is already downloaded on Amazon Linux." ではないよね。
NimでDiscordBotを作る

#環境

```shell:環境

Nim Compiler Version 0.18.0 [Windows: amd64]
Copyright (c) 2006-2018 by Andreas Rumpf
```

#Discord側の準備
[Discord developers](https://discordapp.com/developers/applications/me)に行きNewApp![スクリーンショット 2018-04-05 11.12.05.png](https://qiita-image-store.s3.amazonaws.com/0/241492/6cd8624d-5b49-139e-1662-85b0a929e2a4.png)
名前を入力しCreate App
![スクリーンショット 2018-04-05 11.15.01.png](https://qiita-image-store.s3.amazonaws.com/0/241492/9af104eb-8d7d-9f9d-7e5b-80933320d2e9.png)
少し下にスクロールし Crearte a Bot User
![スクリーンショット 2018-04-05 11.15.23.png](https://qiita-image-store.s3.amazonaws.com/0/241492/b489d9b3-aef5-2ba3-981f-25fe171f5381.png)
Token:click to revealをクリック
Token:************************
をメモしておく
![スクリーンショット 2018-04-05 11.20.38.png](https://qiita-image-store.s3.amazonaws.com/0/241492/9e28a662-ab42-a7dd-b577-2b521cf0d020.png)
Generate OAuth2 URLをクリック
![スクリーンショット 2018-04-05 11.22.29.png](https://qiita-image-store.s3.amazonaws.com/0/241492/85782ba8-95f5-5e93-908d-115b2c38e07c.png)
Botを選択し COPY
![スクリーンショット 2018-04-05 11.23.52.png](https://qiita-image-store.s3.amazonaws.com/0/241492/b1f2994f-b5f2-5a48-b555-16d71aa042d7.png)
COPYしたURLを開き自分のサーバーを選択　認証しましたとでれば成功です
![スクリーンショット 2018-04-05 11.25.47.png](https://qiita-image-store.s3.amazonaws.com/0/241492/c4a47244-0de4-4748-860e-156bae7a8839.png)

#Nim側の準備
[使用するライブラリ](https://github.com/Krognol/discordnim)
ライブラリのインストール

```shell
nimble install discordnim
```

pingとメッセージを送るとpongと返ってくるサンプルコード

```nimrod
import asyncdispatch, discordnim, strutils

proc messageCreate(s: Shard, m: MessageCreate) =
    if s.cache.me.id == m.author.id: return
#自分自身(Bot)だったら反応しない
    if m.content == "ping":
#メッセージがpingだったら
        asyncCheck s.channelMessageSend(m.channel_id, "pong")
#送られてきたチャンネルにpongと送り返す
        
let d = newDiscordClient("Bot token")
#先程メモしたtokenをBot の後ろにコピーペースト
let s = d.addShard()
proc endSession() {.noconv.} =
    waitFor d.disconnect()

setControlCHook(endSession)

d.addHandler(EventType.message_create, messageCreate)
waitfor s.startSession()
```

実行する場合は　-d:ssl　を付けてください
`nim c -d:ssl -r fileName`

![スクリーンショット 2018-04-05 11.35.57.png](https://qiita-image-store.s3.amazonaws.com/0/241492/f814c1f8-50d1-d5fd-40c9-5ca6028d8016.png)

#おしまい
サンプルコードは
[こちら](https://github.com/Krognol/discordnim/tree/master/examples)やインストールしたライブラリのexamplesフォルダにあります
情報がほとんど無いのでソースコードを見るのが一番だと思います