OmniAICreator/Qiita-1.07M huggingface dataset:
pthread_cond_wait の簡単なテスト

pthread_cond_waitでpthread_cond_signalによってシグナルを受けるまで処理を待ちます｡

```C++:SampleCondWait.cpp
#include <stdio.h>
#include <pthread.h>
#include <iostream>
#include <thread>

#define test_cond_wait

pthread_mutex_t mutex;
pthread_cond_t cond;
static void *thread1(void*);

int main(void)
{
    pthread_t thread_id = 0;

    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    if(pthread_create(&thread_id, NULL, thread1, NULL) < 0)
    {
      std::cout << "ERROR for creating thread " << std::endl;
      exit(1);
    }

#ifdef test_cond_wait
    pthread_mutex_lock(&mutex);
    pthread_cond_wait(&cond, &mutex);
    pthread_mutex_unlock(&mutex);
#endif

   std::cout << "Main is working" << std::endl;

   if(pthread_join(thread_id, NULL) < 0)
   {
     std::cout << "ERROR for finishing thread " << std::endl;
     exit(1);
   }

   std::cout << "Main End" << std::endl;
}

void *thread1(void *arg)
{
   std::cout << "Thread is working" << std::endl;

#ifdef test_cond_wait
   pthread_mutex_lock(&mutex);
   pthread_cond_signal(&cond);
   pthread_mutex_unlock(&mutex);
#endif
}
```

以下はpthread_cond_waitを動作させた場合の実行結果

```shell-session
$ g++ -std=c++11 SampleCondWait.cpp -lpthread
$ ./a.out
Thread is working
Main is working
Main End
```

以下はpthread_cond_waitをプリプロセッサで無効にした場合の実行結果

```shell-session
$ g++ -std=c++11 SampleCondWait.cpp -lpthread
$ ./a.out
Main is working
Thread is working
Main End
```

pthread_cond_waitを使った場合、
pthread_createが呼ばれてthread1を作りMain文はpthread_cond_waitで、
thread1からpthread_cond_signalのシグナルを待ち受けます。
そのため、先に"Thread is working"が表示され、thread1が終了し、Main処理が終了します。

pthread_cond_waitを使わなかった場合、
pthread_createが呼ばれてthread1を作っている間にMain文の処理は進み、
"Main is working"を表示してpthread_joinでthread1が終了するまで待ちます。
そのため、後から"Thread is working"が表示され、Thread1が終了し、Main文が終了します。
boto3 で s3 にアクセス

~/.aws/credentials に、
　aws_access_key_id
　aws_secret_access_key
が書かれているとします。

バケットの作成

```py3:create_bucket.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	create_bucket.py
#
#					Mar/16/2018
# ------------------------------------------------------------------
import	sys
import	boto3

sys.stderr.write("*** 開始 ***\n")

bucket_target = sys.argv[1]
s3 = boto3.client('s3')
s3.create_bucket(Bucket=bucket_target, \
	CreateBucketConfiguration={'LocationConstraint': 'ap-northeast-1'})

sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行コマンド　（data-aa というバケットを作成）

```bash
./create_bucket.py data-aa
```

既に、同じ名前のバケットが存在しているとエラーになります。

バケットのリスト

```py3:list_buckets.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	list_buckets.py
#
#						Mar/16/2018
# ------------------------------------------------------------------
import	sys
import	boto3

sys.stderr.write("*** 開始 ***\n")
s3 = boto3.resource('s3')

for bucket in s3.buckets.all():
	print(bucket.name)
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行コマンド

```bash
./list_buckets.py
```

ファイルのアップロード

```py3:upload_data.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	upload_data.py
#
#						Mar/16/2018
# ------------------------------------------------------------------
import	sys
import	boto3

sys.stderr.write("*** 開始 ***\n")
bucket_target = sys.argv[1]
file_upload = sys.argv[2]

s3 = boto3.resource('s3')

data = open(file_upload, 'rb')
s3.Bucket(bucket_target).put_object(Key=file_upload, Body=data)

sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行コマンド　（data-aa に test.txt をアップロード）

```bash
./upload_data.py data-aa test.txt
```

ファイルの一覧

```py3:list_files.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	list_files.py
#
#						Mar/16/2018
# ------------------------------------------------------------------
import sys
import boto3

sys.stderr.write("*** 開始 ***\n")

bucket_in = sys.argv[1]

s3 = boto3.resource('s3')

my_bucket = s3.Bucket(bucket_in)
for object in my_bucket.objects.all():
	print(object)

sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行コマンド (data-aa 内の表示）

```bash
./list_files.py data-aa
```
[C⇒C++] 構造体同士の比較演算 operator

Cでは構造体同士を比較演算子'=='や'!='で比較することはできません。
C++ではoperatorを使うことで構造体同士を演算子で比較することができます。

サンプルコード・・・コマンドで与えられた名前とIDが従業員と一致するか判定し、新人かどうか比較する

まずはCで書いたコード。

```C:SampleC.c
#include <stdio.h>
#include <string.h>

typedef struct guy_st
{
  const char* name;
  const char* id;
}GUY_ST;

static GUY_ST Set_struct(const char* name, const char* id)
{
  GUY_ST Guy;
  Guy.name = name;
  Guy.id = id;
  return Guy;
}

static int Guy_equal(GUY_ST employee, GUY_ST newguy)
{
  return (!strcmp(employee.name, newguy.name) &&
	  !strcmp(employee.id, newguy.id));
}

int main(int argc, char *argv[])
{
  GUY_ST employee = Set_struct("JohnSmith", "A0001");
  GUY_ST newGuy = Set_struct(argv[1], argv[2]);

  if (Guy_equal(employee, newGuy))
  {
    printf("You are not new.\n");
  }
  else
  {
    printf("Welcome new guy.\n");
  }

  return 0;
}
```

次はC++で書いたコード。

```C++:SampleC++.cpp
#include <iostream>
#include <string>

using namespace std;

struct Guy_St
{
  std::string name;
  std::string id;

  Guy_St(std::string name, std::string id)
     :name(name),
      id(id)
  {
  }

  bool operator==(const Guy_St& rhs) const
  {
     return (name == rhs.name &&
             id == rhs.id);
  }
};

int main(int argc, char *argv[])
{
  Guy_St employee("JohnSmith", "A0001");
  Guy_St newGuy(argv[1], argv[2]);

  if (employee == newGuy)
  {
      std::cout << "You are not new." << "\n";
  }
  else
  {
      std::cout << "Welcome new guy." << "\n";
  }

  return 0;
}
```

構造体の中に構造体メンバの初期化処理と比較処理があることと、
比較演算子でif文を作ることができていることでリーダブル性が向上しました。

出力結果

```shell-session
$ gcc SampleC.c
$ ./a.out JohnSmith A0001
You are not new.
$ ./a.out JohnSmith A0002
Welcome new guy.

$ g++ -std=c++11 SampleC++.cpp
$ ./a.out JohnSmith A0001
You are not new.
$ ./a.out JohnSmith A0002
Welcome new guy.
```
railsで複数tweetを連投(スレッド投稿)する

#railsで複数tweetを連投(スレッド投稿)する
前提

- gem 'twitter'
- twitterで各app key,secret,access token,access token secret 取得済み

`@post.tweets = ["tweet1","tweet2","teet3"]`

```posts_controller.rb
class PostsController < ApplicationController

...

  client = Twitter::REST::Client.new do |config|
    config.consumer_key         = ENV['TWITTER_KEY']
    config.consumer_secret      = ENV['TWITTER_SECRET']
    config.access_token         = ENV['ACCESS_TOKEN']
    config.access_token_secret  = ENV['ACCESS_TOKEN_SECRET']
  end

  @tw_ids = Array.new
  @post.tweets.each_with_index do |tw, i|
    if i < 1
      res = client.update(tw)
      @res_ids.push(res.id)
    else
      res = client.update(tw, {:in_reply_to_status_id => @tw_ids.last})
      @tw_ids.push(res.id)
    end
  end

...

end

```

みたいな感じ。

- [Method: Twitter::REST::Tweets#update](http://www.rubydoc.info/gems/twitter/Twitter%2FREST%2FTweets:update)
- [⚾⚾⚾連投⚾⚾⚾](https://rentou.herokuapp.com)
それ、SageMakerで出来るよ！っていう構成をわざわざEC2で自作してしまったのでメモ

![RGT (2).png](https://qiita-image-store.s3.amazonaws.com/0/64098/c00cb41e-5534-539c-59ad-3a23f69cf354.png)


# 概要

完全にやっちまった

実装終わって図作って社内wikiに投稿した瞬間に気付いた

それ、SageMakerでできるよ！

ってね

# やりたいこと

でももったいないのでメモ

- 学習済みのモデルがある
- そのモデルに入力（今回は画像）をかければ出力（今回はJSON）を得られるプログラム（この図のRecognitionTool）がある
- プログラムの実行にはPython3やChainerの環境が必要なので一個一個インストールするのは面倒くさい
- Docker（Docker Compose）で環境構築して、 `docker-compose run` に入力を与えて出力を得られないか
- 出来た。ので、入力いろいろ変えて出力し放題やったー
- でも実行にマシンパワー食うので専用のマシンをクラウドに置きたい
- AWSに作るか

# 構成

## EC2

- 普通にAmazonLinuxAmiを起動
- `docker` `docker-compose`をインストール
- `nginx` `php`もインストール（この辺はなんでもいい）
    - `nginx`は `user: ec2-user`、`group: ec2-user`に設定する
    - あるいは `nginx`ユーザーがdockerを実行できるようにしてもいいかも
- `git`もインストールしてツールをcloneする

## Docker

- ツールのリポジトリに`Dockerfile`と`docker-compose.yml`がある
- `docker-compose build`する

```dockerfile:Dockerfile
### chainer/chainer:latest-python3
### see https://hub.docker.com/r/chainer/chainer/builds/bm89qhzebyhkcrsc2ia4egg/
### 
FROM chainer/chainer:latest-python3

### 
### Application Setting
###
RUN pip3 install --upgrade pip
RUN pip3 install opencv-python
RUN pip3 install pillow

ARG APP_HOME
WORKDIR $APP_HOME
```

```yml:docker-compose.yml
version: '2.1'
services:
  tool:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - APP_HOME=${PWD}
    command: python run.py
    volumes:
      - .:${PWD}
```

## RecognitionTool

- 入力と出力のパス、その他オプションを指定して実行できる `run.sh` がある
- コンテナの中のdemo用ファイルを使うとこんな感じで実行可能

```console
$ docker-compose run --service-ports tool sh run.sh -i demo/input.png -o demo/output.json
```

## PHP

```php:rg.php（雑に抜粋）
<?php
//作業フォルダ(/tmp/RGT***/)
$temp_dir = tempDir('RGT');

//アップロードファイル
move_uploaded_file($_FILES['inputfile']['tmp_name'], "$temp_dir/input" );

//実行
{
  putenv("PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin");
  chdir("/path/to/recognitiontool/");
  $cmd = "/usr/local/bin/docker-compose run --service-ports -v ${temp_dir}:${temp_dir} tool sh run.sh -i ${temp_dir}/input -o ${temp_dir}/output";
  exec($cmd, $output);
}

//JSON返却
{
  header('Content-Type: application/json');
  header('Content-Length: ' . filesize("${temp_dir}/output"));
  echo file_get_contents("${temp_dir}/output");
}
```

### ポイント

- Nginxを通して実行すると`PATH`がないと怒られるのでec2-userのPATHを`putenv`してみたら動いた（要調査）
- PATHを追加したのに`docker-compose`がないと怒られたので`which`して探したフルパスで指定したら動いた（要調査）

# テスト

## 実行

```console
$ curl URL/rg.php -F inputfile=@demo/input.png > demo/output.json
```

# まとめ

実装を始める前にいろいろ振り返ってよく考える

# 資料

- [InvokeEndpoint - Amazon SageMaker](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/API_runtime_InvokeEndpoint.html)
- [amazon-sagemaker-examples/scikit_bring_your_own.ipynb at master · awslabs/amazon-sagemaker-examples](https://github.com/awslabs/amazon-sagemaker-examples/blob/master/advanced_functionality/scikit_bring_your_own/scikit_bring_your_own.ipynb)
(問題) 2秒のあいだにボタンが3回押されたかで、真・偽を返す関数を実装してください。


## 概要
- よくありがちな処理を実装してみよう。
- とりあえず、`C`で。
- 採用の面接とかで、使えないかな？(どのくらい時間かかるかな?)

## 質問
- 問題

	```txt:
	2秒のあいだにボタンが3回押されたかで、真・偽を返す関数を実装してください。
	```
- 具体的に..

	```c:Is_Button_Pressed_3times_In_2sec()の中を実装してください.
	#include <stdint.h>
	#include <stdbool.h>

	//以下の2つの関数と、定数が処理系により与えられます。
	bool     IsButtonPressed(void);		//呼び出し時、ボタンが押されている場合true、押されていない場合falseが返る.
	uint32_t GetTickCount(void);	//ハードウェアのタイマーカウンターの値を取得。電源が入った時点から、カウントされる.
	extern const uint32_t ulTicksInMilliSec;	// 1ミリ秒に対する、ハードウェアカウンターの値.

	//こいつを実装. 例です。
	bool Is_Button_Pressed_3times_In_2sec(void)
	{
		bool bRet;

		// ... うまい処理を書く ...

		return bRet;
	}

	int main(int ac, char *av[])
	{
		bool bRet;

		bRet = Is_Button_Pressed_3times_In_2sec(); //2秒間返ってこない可能性がある。

		if (bRet)
		{
			// 条件成立時の処理
		}
		else
		{
			// 条件不成立時の処理
		}
	}

	```

- ついでの質問
    - チャタリング防止したいんだけど、どうしたらいいかな？
    - 割り込み処理で、おこなう場合は、どんな感じになる？
    - ボタンが複数あって、特定のパターンに、一致したら、trueを返す、という機能の場合はどうする？<br>(例: ↑ ↑ ↓ ↓ ← → ← → B A)

## 補足 :
1. 関数やら、グローバル変数とか、使っていい。その辺は自由に。<br>かっこいいのができたら、教えてください。

2. 全般的な質問、誤字脱字、または、この質問自体がおかしい.. などは コメントへ.
3. 仕様が不明瞭な点がある？(面接では質問者に尋ねるだろうけど...)<br>ここでは、実装者が指摘して、どのようにするか、記述して、実装してみよう.
	- 例: 3回押す => ボタンのカウントは、押した時点で+1か、押して離した時点で+1か？ => 後者で実装!

4. やる人(いるのか!?)は、自分のとこで記述お願いします。(このエントリのコメント、、だと、荒れるよね??)
5. 参考:STM32のHAL使用すると、与えられる関数は、こんな感じ？

	```c:STM32のHAL
	bool IsButtonPressed(void)
	{   //LOWでPressed / HighでReleased.
		return (HAL_GPIO_ReadPin(GPIO_BUTTON_GPIO_Port, GPIO_BUTTON_Pin) == GPIO_PIN_RESET) ? true : false;
	}

	uint32_t GetTickCount(void)
	{
		return HAL_GetTick();
	}

	const uint32_t ulTicksInMilliSec = 1;
	```


## コメント
- @shiracamusさん、ありがとうございます。タイトルから誤字があったとは。。。
Tokyo.ex #8 LT toku_bass



# whoami

- @toku_bass
- :heart:  Perl
    - YAPC運営

- hex.pm

![スクリーンショット 2017-11-26 13.07.12.png](https://qiita-image-store.s3.amazonaws.com/0/62334/b28bc66b-0e5b-16c0-da23-cf55921758a5.png)



- Elixir歴2ヶ月弱
- 10/29 Elixir初心者向けハンズオン vol2 お世話になりました



# 本題
map,struct用のテストフレームワークを作った話


構造体やMapのテストの一部だけテストしたいとき、一つずつ書くのが面倒

これを

```ex
assert Map.get(msg1, "name") ==  "Foo"
assert Map.get(msg1, "token") == "AAAAA"
```

こういう感じでかきたい

```ex
assert msg1, %{ "name" => "foo", token => "AAAAA"}
```


# 車輪の再発明?

調べたけど、なさそう -> ほんとか？
とりあえず、再発明でもいいから勉強がてら書こう


# 調査記録
ExUnitとPowerAssert

## `=`でパターンマッチの場合

![スクリーンショット 2017-11-24 11.20.36.png](https://qiita-image-store.s3.amazonaws.com/0/62334/5d2aff17-2237-bd79-eb3e-b397eeb5f741.png)


### ExUnit.Case

![スクリーンショット 2017-11-24 11.17.34.png](https://qiita-image-store.s3.amazonaws.com/0/62334/32e05137-df4b-6028-cb4d-bfe99d532995.png)


### PowerAssert


![スクリーンショット 2017-11-24 11.17.06.png](https://qiita-image-store.s3.amazonaws.com/0/62334/0ba884ac-37b2-6f3e-eaf8-72c951f0fcf7.png)


## `==`比較

![exunit_equal.png](https://qiita-image-store.s3.amazonaws.com/0/62334/aa3915f7-8a4b-0e53-340e-b888b005c218.png)

### ExUnit.Case

差分は見やすい

![exunit_equal_result.png](https://qiita-image-store.s3.amazonaws.com/0/62334/ba7d5b24-04f4-ed19-2bdf-922e3fa81b96.png)

### PowerAssert

すべて赤文字で出力されてしまうが、差分は出力してくれる

![power_assert_equal_result.png](https://qiita-image-store.s3.amazonaws.com/0/62334/fae092af-a4cd-d32c-c7c6-2e7e62f15e84.png)


## `match?`

assert match?(patter,expr)


### ExUnit

![スクリーンショット 2017-11-24 11.27.05.png](https://qiita-image-store.s3.amazonaws.com/0/62334/69f35749-6e67-3435-e4df-ccee29f6cf69.png)


### PowerAssert
変数の中身が表示されない

![スクリーンショット 2017-11-24 11.27.18.png](https://qiita-image-store.s3.amazonaws.com/0/62334/1fd977cd-0702-a62e-dc86-99c795f6a119.png)


## patternの側に変数が使えない

`Kernel.match?`の実装はただの`case`

```ex
  defmacro match?(pattern, expr) do
    quote do
      case unquote(expr) do
        unquote(pattern) ->
          true
        _ ->
          false
      end
    end
  end
```


## できるといいこと

match?で`==`のような綺麗な差分を出したい
match?でpatternの側にも変数を使いたい


# ExUnitの実装に乗っかる

- お手軽にライブラリつくりたい
- 無理して作ってテストライブラリにバグがあるのは最悪
- Mapをマージして`==`で比較すればいいのでは


# 作ったもの

[struct_assert](https://github.com/tokubass/ex_struct_assert)

## デモ

テストを実行してみる

[struct_assert_test.exs](https://github.com/tokubass/ex_struct_assert/blob/master/test/struct_assert_test.exs)

[callback_test.exs](https://github.com/tokubass/ex_struct_assert/blob/master/test/callback_test.exs)

 
# おわりに

### 今後の豊富
- ライブラリ書いてく
- CPANのエコシステム（を導入できるといいなぁ）
    - CPAN Testers
ビット演算で生年月日から年齢を計算する

「[JavaScriptで生年月日から年齢を計算する簡単ロジック](https://qiita.com/clockmaker/items/865ceafae7117606169a)」(以下「簡単ロジック」)の考え方が、ビット演算でも使えることに気づいたのでご紹介します。

#「簡単ロジック」の考え方
「簡単ロジック」では、生年月日をつぎのような8桁の10進数に揃えます。

```
yyyymmdd
```

そして、同じく8桁にした現在日付から差し引くのです。すると、下4桁は意味のない数字になります。けれど、頭の4桁が年齢を示すということです。それは、引き算で下の桁の数が足りなくなると、上の桁から「借りてくる」という「ロジック」にもとづきます。

#2進数で考える
この「ロジック」は何も10進数にかぎったことではありません。2進数でも構わないでしょう。そして都合のよいことに、JavaScriptには2進数について[ビット演算](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators)という桁ごとの処理が備わっているのです。今回使うのは、2進数の桁をずらすシフト演算子です。

1を4桁[左シフト`<<`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Left_shift)すると16、5桁なら32です。つまり、12月までなら2進数4桁で足り、31日までは5桁でちょうど表せます。

```js
1 << 4  // 16
1 << 5  // 32
```

すると、年月日はつぎのように表せばよいでしょう。`|`は[ビットごとのOR](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_OR)で、今回は足し算と同じ結果になります。

```js
const day = year << 9 | month << 5 | date;
```

#満年齢を求める
満年齢を求めるJavaScriptコードはつぎのようになります。頭4桁の年を得るには、9(= 4 + 5)桁[右シフト`>>`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Right_shift)するだけです。jsdo.itに[サンプルコード](http://jsdo.it/FumioNonaka/Exy1)を掲げました。

```js
const yourBirthDay = {
  year: 年,
  month: 月,
  date: 日
};
const birthday =
	yourBirthDay.year << 9
	| yourBirthDay.month << 5 
	| yourBirthDay.date;
const now = new Date();
const today =
	now.getFullYear() << 9
	| (now.getMonth() + 1) << 5
	| now.getDate();
const age = (today - birthday) >> 9;
console.log(age);
```
AWS RDS PostgreSQL で[CREATE CAST]を実行する方法

AWS RDS（PostgreSQL）で、キャストを設定（CREATE CAST）する方法をご紹介します。

#まずハマります

AWS RDS（PostgreSQL）のDBマスターユーザーで「CREATE CAST」を実行すると2行目のエラーが出力されました。

```
CREATE CAST (character AS numeric) WITH INOUT AS IMPLICIT;
ERROR:  must be owner of type character or type numeric
```
#原因

PostgreSQLでキャスト設定するには、「CREATE CAST」をスーパーユーザー権限で実行する必要があります。（すべての場合にスーパーユーザーが必要な訳ではないようです）
ですが、AWS RDSでは、スーパーユーザーは使用できません。
代わりに[rds_superuser]ロールが割り当てられたマスターユーザーというものを使用できます。
但し、これはスーパーユーザーとは厳密には異なります。


#解決方法
スーパーユーザーが使えなくとも、
キャストするデータ型の所有者になれば「CREATE CAST」が実行できます。


### データ型の所有者になる
キャスト設定したいデータ型の所有者になります。コマンド構文は以下です。

```
alter type <データ型の内部名※> owner to <所有者にするユーザ>;
```
※補足を参照

コマンド例
以下は、chatacter を dbmaster というユーザを所有者にする場合のコマンドです。

```
alter type bpchar owner to dbmaster;
```

###キャストを設定する
データ型の所有者となったユーザでキャストを設定します。コマンド構文は以下です。

```
CREATE CAST (<ソースの型> AS <ターゲットの型>) WITH INOUT AS IMPLICIT;
```

コマンド例

```
CREATE CAST (character AS numeric) WITH INOUT AS IMPLICIT;
```

#補足

ちなみに、データ型の所有者を変更するところで、なぜ、character ではなく　bpchar　かというと。。。
characterで、「alter type」を実行すると以下のエラーになります。

```
alter type character owner to dbmaster;
ERROR:  type "character" does not exist
```

これは、データ型は"名前"ではなく"内部名"で実行する必要があるためです。
内部名の確認方法は、以下になります。


```
\dT+ <データ型の名前>
```

これを実行し、内部名を確認します。ついでに所有者も確認できます。

```
\dT+ character
                                                            データ型一覧
  スキーマ  |   名前    | 内部名 | サイズ | 要素 |   所有者   | アクセス権 |                          説明              
------------+-----------+--------+--------+------+------------+------------+---------------------------------------------------------
pg_catalog | character | bpchar | var    |      | dbmaster |            | char(length), blank-padded string, fixed storage length
(1 行)
```
SublimeText3のHTMLモードで単語補完が効かないことがあるのを直す

Sublime Text 3 (Build 3103) の話です。最新版ではもしかしたら既に修正されてるかもしれません

---

HTMLモードで`Ctrl+Space`での単語補完が時折効かないことがあり、よく調べてみるとHTML文字列中のclassやstyle等の属性中のダブルクォートで囲まれた中にキャレットがある場合にそうなるらしい。

```html
<div id="foobar"></div>
<div id="foob|"></div>
```
↑ 例えば`|`の位置にキャレットがある状態で単語補完を効かせた場合`foobar`が補完されることを期待するものの、何故か動作しない。これを修正したい。



# 修正する

[PackageResourceViewer](https://packagecontrol.io/packages/PackageResourceViewer) を使ってHTMLモードの挙動を書き換える。

1. `Ctrl+Shift+P` → `Package Control: Install Package` から`PackageResourceViewer` をインストールする
1. インストール後 `Ctrl+Shift+P` → `PackageResourceViewer: Open Resource` を選択
1. → `HTML` を選択
1. → `html_completions.py` を選択

すると`html_completions.py`ファイルが開かれるので、その中の `class HtmlTagCompletions` 中の `def on_query_completions(...):` となっている箇所を次のように書き換える：

```python
class HtmlTagCompletions(sublime_plugin.EventListener):
...
    def on_query_completions(self, view, prefix, locations):
        return []
...
```

(インデントに注意)
書き換えたらファイルを保存、HTMLモードの挙動が自動的に更新されるので、HTMLモードで動作を確認する。
お疲れ様でした。
rspecでモデルテストをしやすくするためにreturn selfをよく使う話

# Ruby on Railsで開発していてよくあるパターン

## とりあえずいろいろ処理書いてそのままにしちゃう

よくあるパターンで、メソッドがなにも返却しないか、テキトーな最終評価式を返す

### model

```ruby
class User < ApplicationRecord
  def confirm!(token)
    any_validate!(token)
    ApplicationRecord.transaction do
      confirmed_at = Time.now
      save!
      UserProfile.create!
    end
    # ここではnilが最終評価になる
  end
end
```

### rspec

```ruby
require 'rails_helper'
RSpec.describe User, type: :model do
  describe '#confirm!' do
    let!(:user) { create(:user) }
    let(:token) { user.confirmation_token }
    subject { user.confirm!(token) }

    it "can confirm" do
      subject
      user.reload
      expect(user.confirmed_at).to be_present
    end
  end
end
```

## confirm!が自身を返す

Arrayの破壊的変更をともなうメソッド(sort!とか)がレシーバ自身を返してるのをヒントにしてみた。
厳密にはcofirm!の!はrailsの例外を返すという意味で、sort!の!は自身を変更するという違いがあるが、railsでもcreate!とcreateなんかはどっちも作成したモデルのインスタンスを返却してるし、そんなに違和感ないかなと思ってる。

### model

```ruby
class User < ApplicationRecord
  def confirm!(token)
    any_validate!(token)
    ApplicationRecord.transaction do
      confirmed_at = Time.now
      save!
      UserProfile.create!
    end

    self # 自身を返すように
  end
end
```

### rspec

```ruby
require 'rails_helper'
RSpec.describe User, type: :model do
  describe '#confirm!' do
    let!(:user) { create(:user) }
    let(:token) { user.confirmation_token }
    subject { user.confirm!(token) } # ユーザインスタンス(しかも更新済み！)が帰ってくるので、subjectをそのまま評価に回せる

    it "can confirm" do
      expect(subject.confirmed_at).to be_present
    end
  end
end
```

### subjectに名前をつけるともっと気持ちいい

```ruby
require 'rails_helper'
RSpec.describe User, type: :model do
  describe '#confirm!' do
    let!(:user) { create(:user) }
    let(:token) { user.confirmation_token }
    subject(:confirmed_user) { user.confirm!(token) }

    it "can confirm" do
      expect(confirmed_user.confirmed_at).to be_present
    end
  end
end
```

rspecは英文を諦めた、みたいな話は聞くけど、ちょっとぐらい理想に近づけてもいいじゃない、と思ってる。
（欲を言えばis_expectedにしたいけど、rspec3以降はgem 'rspec-its'を入れてits(:confirmed_at) ~にしないといけないのでハードルが高いから今回はスルー）

追記
rspec-its入れてるならテスト部分は一行で済む

```ruby
its(:confirmed_at) { is_expected.to be_present }
```
[Swift4] Image from URL

## 1. do, catch
```
      let url = URL(string: user.imageURL)
      do {
            let data = try Data(contentsOf: url!)
            let image = UIImage(data: data)
            
       }catch let err {
            print("Error : \(err.localizedDescription)")
       }
```

## 2. URLSession
```
 if let image = imageURL { 
   let url = URL(string: image) 
   URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in 
                  
      if error != nil { 
         print(error!) 
         return 
      } 
 
      DispatchQueue.main.async { 
         imageView.image = UIImage(data: data!) 
      } 
   }).resume() 
} 
```
if文を使って電球画像を消したり表示したりする

初投稿ですcherryと申します。これから自分が発見したこと、学習したことを
備忘録として書かせていただきます。まず手始めに、javascriptで画像を表示・非表示するプログラムを紹介していきたいと思います。
#ソースコードの説明

```html
<img id="gazou"src="denkyuu.png"

<form>
<div>
<input type="button" name="onOff1"value="ON/OFF"onclick="onOff()">
</div>
</form>
```
まず、簡単なhtmlコードの説明をしていきます。
**input type="button"**で属性を決めます。ここではボタンを
つけたいので、属性をbuttonとします。
**"onclick="onOff()"**は、クリックされたときに"onOff()"メソッドが呼ばれます。メソッドの処理は、scriptタグで書いていきます。

```html
<script>
var cnt= 0;

function onOff(){

if(cnt == 1){

document.getElementById("gazou").style.visibility="visible";

{cnt = 0;}

}else{

document.getElementById("gazou").style.visibility="hidden";

{cnt++;}
	}
}
</script>
```
まず最初に、ON/OFFの区別をつけるための変数cntを定義します。
そして、先ほど定義したonoffメソッドの中身を書いていきます。

**document.getElementById()**を使ってボタンのオブジェクトを登録します。
このコードは、cntの値が1の場合は、**style.visibility="visible";**プロパティ
を使います。このプロパティは、登録されたidを持つ画像を表示してくださいという意味を持っており、対となる**style.visibility="hidden";**は画像を非表示にしてくださいという意味を持っています。
Androidアプリケーション開発入門(最速でHelloWorldアプリケーションを作成)

# Androidアプリケーション開発入門(最速でHelloWorldアプリケーションを作成)

起動後に "Hello World" という文字が表示されているだけのAndroidアプリケーションを作成しながら、開発の流れを学んでいきます。  
今回は **新規にプロジェクトを作成し、アプリを起動する** ところまで進めてみます。


## 前提

以下のページを参考に、 **開発環境の整備** が終了していること

* [Androidアプリケーション開発入門(開発環境の整備) - Qiita](https://qiita.com/genzouw/items/ffe34eb4f1d17e5af174)

---

## Android Studio を起動した後の操作

*※ [Android Studioの日本語化が済んでいる環境](https://qiita.com/genzouw/items/ffe34eb4f1d17e5af174#b-android-studio-%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%8C%96) での手順となっていることに注意*

### 1) 「新規 Android Studio プロジェクトの開始」をクリック

![](https://drive.google.com/uc?usp=sharing&export=view&id=1DaoMDqUnaUvvE1yzgdeBhu7h6gl0kEYN)

### 2) **"アプリケーション名"** / **"会社ドメイン"** を指定し「次へ」

* アプリケーション名 : **Hello World**
* 会社ドメイン : **genzouw.com** （任意のドメインを入力。以降自作するクラスのパッケージ名として利用される。）
* プロジェクトのロケーション : *上記２項目から自動的に生成されるため、入力は不要*


![](https://drive.google.com/uc?usp=sharing&export=view&id=1RL8AOP4kBUatgjGIKNwKylCIglsKE2tw)


### 3) **"スマホおよびタブレット"** を指定し「次へ」

* *※サポートする最も古いAndroid APIバージョンの指定を切り替えると、何%のデバイスをサポートできるかがわかるようになっている*
* *どのような端末向けのアプリケーションかを指定*

![](https://drive.google.com/uc?usp=sharing&export=view&id=18NzJxwaZZyqAUApnWx-_2VyBPKpH_s-g)


### 4) "モバイルへアクティビティを追記"

* **空のアクティビティーを選択**

![](https://drive.google.com/uc?usp=sharing&export=view&id=1y3LYYQ9v48m3qqf3pL2PNUbLypXj6qhH)


### 5) Configure Activity

*※英語のままのタイトルとなっている...*

**ここではデフォルトのままで進める**

* アクティビティー名 : **MainActivity**
* レイアウト名 : **activity_main**
* チェックボックス : *そのままでOK*

![](https://drive.google.com/uc?usp=sharing&export=view&id=1VBU8VU6ioPZGLC6OUP989_nLk_SZyDT_)


### 6) Build Toolのインストール

* "Hello World" アプリケーションのプロジェクトが表示されるが、 **"Build Tools"** がインストールされていないというエラーメッセージが表示されている場合がある
* **"Install Build Tools"** のリンクをクリックしインストールを行う

![](https://drive.google.com/uc?usp=sharing&export=view&id=1bnidmCoFBUTky-cpTmFyMTMS0H4F-VKD)


### 7) 実行

1. **メニュー** > **実行** > **実行** を選択
2. *"デプロイ対象の選択"* ウィンドウで、 **"新規仮想デバイスの作成"** ボタンを押下
3. *ハードウェアの選択* ウィンドウで、 **"Nexus 5X"** を選択し 「次へ」
4. **仮想デバイス** がいくつか表示される。 *Download* のリンクが表示されている場合はまた端末のダウンロードが行われていないためクリックしダウンロード
    * ダウンロード完了後は該当デバイスを選択し「完了」ボタンを押下
javaScriptのMapとJSONで事故りそうになる話。


# はじめに
chromeの開発者コンソールで実行しました。

---

# 皆さんご存知ですか？javaScriptのMap。
## 知ってる知ってる！これでしょ？
var obj = { 'hoge': 'hogehoge' }; 
違います。  

## こっちがMapです。
var map = new Map(); 
map.set('hoge','hogehoge'); 

MDN web doc で言えばこれを指します。 
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map


# と、ここまではいいのです。
## MapをJSONにしたい！
JSON.stringify()を使えばええやん。 
楽勝楽勝・・・  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/e43e3675-d9c6-68c7-3035-ecc2d737da05.png)

なんですと！？

## それでも解決策は見つかる。そう、Googleならね。

es6のMapをJSONに変換 - ゆずめも 
http://yuzu441.hateblo.jp/entry/2015/10/26/221010

偉大な先人はいるものです。どうやら、[...map]とすればいいらしい。やってみよう。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/d9a10681-2edb-c25f-0c6c-a941cd73aa6e.png)

# 解決できたし終わり！っとする前に。
この表記でできる意味がわからなかったのでもっと調べます。

## ...とはなんぞや？
スプレッド構文と呼ばれるものです。 
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax  

## [...map]とはなんぞや？
arrayです。 
具体的にはこんな感じの配列になります。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/93d656b6-ca38-7cbf-f43b-643cc660ebd1.png)

つまり、map→array→jsonと変換されるわけですな。 
なるほどなるほど？
DFPの運用ストレスを減らしたい。広告申込情報の安全なテンプレート運用


皆さんはDFPをどのように運用しています。用語が独特だったり、設定項目が多かったりして、Webの画面を触っていても迷子になることがありますよね？
マーケティングやセールスを担当するメンバーのように、日常的にDFPを触っていれば別ですが、たまに設定をするだけのエンジニアは特にそういった傾向が強いのかな、と思っています。

また、基本的には本番モードしか設定がないので、間違った設定がいきなりすべてのサービスに展開されてしまうといった危険性もあります。
あれ？意外とストレスフルなツールでなんですね。

この記事では、

* 初学者が運用に携わって競ってミスしたらどうしよう？
* たくさんのサービスやサイトで運用しているDFP枠が壊れたらどうしよう？

といった不安で夜も眠れないDFP管理者や責任者向けの方に安全・安心なDFPの運用方法の例をお届けします。

## 対象読者
* たまにDFPの設定をするのエンジニア
* DFPの運用・設定に自身がないメンバーをかかえるチームリーダー

ちなみに、DFPの設定用語がよくわからないという方はこちらの記事を参照ください。
* [DFPことはじめ。基本的な用語と設定手順。](https://qiita.com/TanakanoAnchan/items/928510d906d7dde4142f)

## DFP運用の何がストレスフルか？DFP運用のツラミ
### デフォルト設定が全公開

広告申込情報をつくると、デフォルトの公開先はなんと広告ユニット全体です。
クリエイティブのサイズで多少は絞り込まれますが、これは大事故のもとです。

![ツラミ_デフォルトが全公開 2.png](https://qiita-image-store.s3.amazonaws.com/0/37873/d66c1e64-ee13-ac93-5cb3-197e2d3eb19e.png "ツラミ_デフォルトが全公開 2.png")

### 設定が多い

画面見るとわかりますが、設定が多いです。それにどんな値を設定すれば良いのか門外漢でないとなかなかわかりませんね。

![つらみ_設定が多い.png](https://qiita-image-store.s3.amazonaws.com/0/37873/76b12b66-4679-fafa-02ca-2c45ac2e8975.png "つらみ_設定が多い.png")

### バリデーションっぽいことができないので、名付けが自由自在

名付けが自由自在な事自体は良いのですが、自由度が高すぎてあとから解析するときに大変です。
例えば同じサービスや、広告枠を使っていてもばらつきがでやすいです。
あとから文字列をパースするときなど色々と辛いです。

```txt:こんな名付けだとあとから辛い	
serviceA_IOS_あわせて読みたい_インフィード_確認用_2枠目
主力サービス_related_article-自社広告
Android_serviceA_SNS下のバナー
service_a__sidebar_rectangle_AdSense確認用
```

## DFP運用のストレスから逃れるためのソリューション = テンプレートコピーして使う

さて、DFP運用のツラミがわかったところで、それをどうやって解消していけばよいでしょうか。
答えは「テンプレート運用」です。

きちんとしたテンプレートを用意しておくことで下記のメリットが期待できます。

* 配信範囲を予め最小限にしておくことができる
* 複雑な設定を全て理解しなくてもよい
* 名称をある程度コントロールできる

## テンプレート運用の進め方
1. テンプレートとなる広告申込情報の作成
2. 広告申込み情報の作成はコピーで

### 1. テンプレートとなる広告申込情報の作成
テンプレートなる広告申込情報を作成します。ポイントは下記のとおりです。

* テンプレートとわかるように
* 名前のルールがわかるように
* できるだけ配信範囲をしぼるように

![広告申込情報作成_2 2.png](https://qiita-image-store.s3.amazonaws.com/0/37873/d8121a39-db53-e97f-9e31-18e8646df4ac.png "広告申込情報作成_2 2.png")

----

![広告申込情報作成_1 2.png](https://qiita-image-store.s3.amazonaws.com/0/37873/dcd57ec3-00a2-aad5-3366-7e126a050249.png "広告申込情報作成_1 2.png")


### 2. 広告申込み情報の作成はコピーで
テンプレートとなる広告申込情報を作成したら、あとはコピーして使いましょう。

![コピー作成_1.png](https://qiita-image-store.s3.amazonaws.com/0/37873/1fa28b65-5b86-3fef-d0a2-4c2ca5547413.png "コピー作成_1.png")



## 注意点
テンプレート運用ですが、いくつか注意事項があります。

### オーダーをまたいだ広告申込情報のコピーはできない
オーダー（= 広告申込情報をまとめたもの）をまたいだ広告申込情報のコピーはできません。開発確認用途で広告申込情報を作って、いざ本番適用しようかな、と思ったときにコピーしてつかえないのでご注意ください。

### 枠を設定しないと自動的ににされる

広告ユニットを選択しないで保存すると、配信先がネットワーク全体に変わって保存されます。
ご注意ください。

![ツラミ_デフォルトが全公開 3.png](https://qiita-image-store.s3.amazonaws.com/0/37873/c004f336-68d5-8dfe-c083-a0f41a500389.png "ツラミ_デフォルトが全公開 3.png")


## 最後に
DFP運用いろいろとつらみがありますが、それを補ってあまりあるメリット（配信設定を自社で行える）などありますね。
テンプレートをつかって、良いDFPライフを
MNISTのデータを仕分けしてPNGファイルで保存

# はじめに

機械学習でよく出てくる手書き文字の認識データMNISTのデータを、ラベルで仕分けして画像データとして保存します。わりと欲しくなるのに意外にそのものずばりのスクリプトが見つからなかったので作りました。

ソースはここです。

https://github.com/kaityo256/mnist_dump

データの取得にChainerを使っているため、Chainerがimportできる環境で実行する必要があります。

# 使い方

スクリプト`mnist_dump.py`を実行すると、最初に0から9のディレクトリを作り、そこに`test0000.png`から通し番号でデータを対応するラベルのディレクトリに保存していきます。

```shell-session
$ python mnist_dump.py
7/test0000.png
2/test0001.png
(snip)
6/test0098.png
9/test0099.png
```

例えば`0/`には

test0003.png 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/842c5cfa-20be-5205-1a73-2e58c0021f92.png)

test0010.png
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/51fd20bc-24be-435f-8e70-1e5982949483.png)

test0013.png
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/bd397787-5148-ecc2-90dc-66066b714492.png)

といった具合に、ラベル"0"に対応するデータが保存されます。

デフォルトでは最初の100個だけですが、スクリプトの

```py:
    for i in range(100):
        save(test[i][0], i, test[i][1])
```

のところを

```py:
    for i in range(len(test)):
        save(test[i][0], i, test[i][1])
```

にすればテストデータ全部(1万個)について保存します。

# 簡単な説明

## データの取得

MNISTの一次配布元のデータフォーマットは意外に面倒なので、各種ライブラリで読み込むのが楽です。多くのライブラリがMNISTを一発ゲットできる関数を用意しています。Chainerだと、

```py
import chainer
train, test = chainer.datasets.get_mnist()
```

で一発です。ローカルになければウェブから取得し、ローカルにあればそれを使うため、何度実行してもウェブから取ってくるのは一度だけです。

## データ形式

`chainer.datasets.get_mnist()`で取得した`train`や`test`は`TupleDataset`というオブジェクトになっています。訓練用が6万、テスト用に1万のデータがあります。データ形式はこんな感じになっています。

* `test[i]` がi番目のデータとラベルのセット
* `test[i][0]` がデータで、784個のfloat32のリスト
* `test[i][1]`がラベルで、0から9の整数

手書き文字データは28*28のグリッドのデータがずらずらと1次元的に並んだものになっています。グレースケールで、値の範囲は0.0から1.0までです。

## データの可視化

データを可視化するのに、Pythonの画像処理ライブラリPillowを使うと楽です。

```py
from PIL import Image
img = Image.new("L", (28, 28))
```

とすると、縦28ピクセル、横28ピクセルのモノクロ8bitのキャンバスができます。そのピクセル値には

```py
pix = img.load()
```

とすればアクセスできます。たとえば(x,y)座標の場所の値は`pix[x, y]`で読み書きできます。あとはMNISTのデータの値をコピーするだけです。ただし、MNISTのデータが0から1までのfloat32で、ピクセル値は0から255までの整数値なので、適当に変換する必要があります(256倍して整数にキャストするだけだが)。

その、キャストしながらコピーしているのがここの処理です。

```py
    for i in range(28):
        for j in range(28):
            pix[i, j] = int(data[i+j*28]*256)
```

あとは画像データとして保存するだけですが、そのままだと小さすぎるので10倍に拡大してみます。リサイズすれば良いだけなんで簡単です。

```py
img2 = img.resize((280, 280))
```

あとは`img2.save("hoge.png")`とかすればPNGフォーマットで保存できます。

# まとめ

Chainerを使ってMNSITデータを取得し、Pillowで画像データとしてディレクトリごとに仕分けしながら保存するスクリプトを作ってみました。実際に画像をダンプしてみると、同じ数字でもわりとバラエティがあって面白いです。例えば7なら、


シンプルな奴
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/444db0ab-c0d3-56e5-657b-c9b2f87b43f7.png)

1と区別するための横棒つきの奴
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/95e63300-867e-dbb3-92f7-2cbc8e5f13d4.png)

縦棒をつけてカタカナの「ワ」みたいにする奴
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/c72de8a5-959a-3644-e9cc-6b00a1c1b348.png)

みたいなのがあります。横棒をつける流儀は欧米で、縦棒をつける流儀は日本でよく見かける気がしますが、どうなんでしょうね？
STS（Eclipse） + Thymeleafでコンテンツアシスタントを有効にする

以下のような形で、STS（Eclipse）のHTMLエディタ上で、Thymeleafのコンテンツアシスタントを有効にする手順です。当方STSで行いましたがEclipseでも同じ手順だと思います。

![1111無題.png](https://qiita-image-store.s3.amazonaws.com/0/23101/dd7deb06-5e03-9086-7dfd-36a88e61b613.png)

#### 1. ThymeleafのEclipse Pluginをインストール

Work withに、http://www.thymeleaf.org/eclipse-plugin-update-site/
を指定し、ThymeleafのEclipse Pluginをインストールします。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/23101/91fdcca1-c9db-2279-5d73-2d32de373f8f.png)

![無題s.png](https://qiita-image-store.s3.amazonaws.com/0/23101/21281b00-5408-6968-d783-bb0c35e6dad8.png)

![d無題.png](https://qiita-image-store.s3.amazonaws.com/0/23101/e190cd94-5375-4e0f-eaf3-66e4921316a4.png)

これで、インストールが開始されます。途中で以下が出てきたら「Install anyway」を押下します。
![無s題.png](https://qiita-image-store.s3.amazonaws.com/0/23101/583273c6-5f48-eb5b-9962-e82cfc94b052.png)

#### 2. STSの再起動
インストールが完了すると、STSの再起動を促されるので「Restart Now」を押下します。
![s.png](https://qiita-image-store.s3.amazonaws.com/0/23101/87f4b8c4-5946-26aa-9a84-02aa53861afe.png)

STSの再起動が完了すると、めでたくコンテンツアシスタントが有効となります。
![1111無題.png](https://qiita-image-store.s3.amazonaws.com/0/23101/a39f768e-b274-98fa-66d2-9d441b01e6e3.png)

もし上記で有効になっていなければ、以下を試します。
プロジェクト名を右クリック → Thymeleaf → Add Thymeleaf Natureを選択。
![ssssasasa.png](https://qiita-image-store.s3.amazonaws.com/0/23101/c6370e89-54c4-89d8-295b-fde6035958a7.png)

以上です。
Android P Previewの開発環境構築手順

Android SDK P Previewがリリースされたので、Pでアプリをビルドして実行するまでの手順を書いておきます。

----

### Android Studio 3.2をインストールする
Android P Previewを使うには、こちらもPreview版であるAndroid Studio 3.2が必要です。以下より3.2 Canary6（2018/3現在）をダウンロード、インストールします。
https://developer.android.com/studio/preview/index.html

![Screenshot 2018-03-15 22.54.16.png](https://qiita-image-store.s3.amazonaws.com/0/469/80a949f3-3046-72fd-6c40-c1491dfcc6dd.png)

Preview版はアイコンがオレンジ色になっています。
![Screenshot 2018-03-15 22.55.23.png](https://qiita-image-store.s3.amazonaws.com/0/469/8a96552c-fefe-6891-a412-a95168d105b0.png)

----

### SDKをダウンロードする

Android Studio Preview（※アイコンが黄色い）を起動し、SDK Managerで`Android P Preview`をダウンロードします。

![Screenshot 2018-03-15 22.54.30.png](https://qiita-image-store.s3.amazonaws.com/0/469/e0a63cb5-a83b-d78a-eb9e-7397ee08a7b1.png)

----

## build.gradleの設定
トップレベルのbuild.gradleでgradle pluginを3.2+にします。通常、Android Studio起動時にメッセージが出て自動で以下に書き換えてくれます。
- /build.gradle

```
classpath 'com.android.tools.build:gradle:3.2.0-alpha06'
```
モジュールレベルのbuild.gradleでは`compileSdkVersion 'android-P'`、`targetSdkVersion 'P'`を指定します。また、サポートライブラリのバージョンは執筆時点で`28.0.0-alpha1`なので、サポートライブラリを利用している場合はこちらも指定します。

- app/build.gradle

```
android {
    compileSdkVersion 'android-P'

    defaultConfig {
        targetSdkVersion 'P'
    }
}

...

dependencies {
    implementation 'com.android.support:support-v4:28.0.0-alpha1'
    ...
}
```

### エミュレータの作成、実行

リリース時点で国内にはAndroid Pサポート対象端末がないので、動作確認はエミュレータでのみ行うことができます。Android Pエミュレータの作成時に`P`を選択します（PはAndroid 9.0ではなく8.xになるんですね？）
![Screenshot 2018-03-15 23.06.55.png](https://qiita-image-store.s3.amazonaws.com/0/469/9ae0a4f1-513c-6c99-5b84-47b2ed83b26c.png)

設定からAndroidバージョンがPになっていることを確認できます。
![Screenshot_1521123426.png](https://qiita-image-store.s3.amazonaws.com/0/469/ea6207ce-9af7-ce65-26cf-7825a49a1b6f.png)

あとは通常通りにAndroid Studioからアプリを実行すれば、Android P上でのアプリの動作確認ができます。
AOJのSmall, Large, or Equalを解いてみた

こんにちわ
[グローバルセンス株式会社](https://gb-sense.com)のskanehiraです。

以前、[こちらの記事](https://qiita.com/skanehira/items/0760d59da5f23277dbde)で紹介したAOJですが
タイトルの問題を解いてみました。

簡単なアルゴリズムでありますが
読みやすく効率よくを意識しながら組んでみました。

# **問題**
問題は[こちら](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_2_A&lang=jp)になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/33d77e8e-08e6-bc0e-3bdd-c089984fc22d.png)

単純な問題で
入力した数字の大小を比較して出力するだけです。

aとbの位置が変わらないので
記号のみが条件によって変わるイメージですね。

# **ソース**
一応判定では正解なので載せます。
もっと良い書き方無いかな…

```java
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String[] line = scan.nextLine().split(" ");

        int[] inputs = new int[2];
        int input;

        // -1,000 ≤ a, b ≤ 1,000
        for (int i = 0; i < line.length; i++) {
            input = Integer.parseInt(line[i]);
            if (input < -1000 || 1000 < input ) System.exit(-1);
            inputs[i] = input;
        }

        int a = inputs[0];
        int b = inputs[1];

        System.out.println("a " + (a < b ? "<": a > b ? ">" : "==") + " b" );

        scan.close();
    }

}
```
三項演算子を2重で使っているので多少わかりづらいかもしれないが、
これでだいぶ短縮できたのではないかなと思います。

判定処理をメソッドにするなら以下の様になると思います。

```java
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String[] line = scan.nextLine().split(" ");

        int[] inputs = new int[2];
        int input;

        // -1,000 ≤ a, b ≤ 1,000
        for (int i = 0; i < line.length; i++) {
            input = Integer.parseInt(line[i]);
            if (input < -1000 || 1000 < input ) System.exit(-1);
            inputs[i] = input;
        }

        System.out.println("a " + getSymbol(inputs[0], inputs[1]) + " b" );

        scan.close();
    }

    public static String getSymbol(int a, int b) {
        String symbol = "==";

        if (a < b) {
            symbol = "<";
        } else if (a > b){
            symbol = ">";
        }

        return symbol;
    }
}
```

# **最後に**
入力の部分、もう少し省けそうな気がしますが
今のところ思い付きません！

こうすると
　もっと短縮できる
　メモリ使用量が減る
　実行時間が減る
などのアドバイスを頂けたら嬉しいですm(_ _)m
【AppStore申請】iPhone iPad用の画像サイズ変更

#画像の準備

AppStoreに早くアプリをリリースしたいときには、アプリの画面キャプチャを取り、
そのままAppStoreで表示される画像として利用することが私の場合多い。

ただし、iPhoneしか持ってなくても、iPad用のデカい画像も用意しないといけないうえ、きっちりピクセル数もあわせないといけないため、画像の準備が本当に苦労した。。

現時点(2018/3)であれば以下２つの画像は最低限用意しないといけない。

・5.5インチ（iPhone用）　1242×2208ピクセル
・12.9インチ（iPad用）　 2048x2732ピクセル

iPhone用はまだなんとか準備できるものの、iPad用の画像はデカすぎて画像変換ツールでもほとんどのものが上限に引っかかる。
探しまくった結果、i❤imgというサイトを使うのが一番良いという結論になった！
縦横の指定もでき、2048x2732ピクセルを指定しても上限オーバーにならないためスムーズに申請まで可能。

https://www.iloveimg.com/ja/resize-image
2進数から10進数へ、10進数から2進数へ[計算の仕組み]

2進数から10進数への計算方法

10進数から2進数への計算方法


調べたらすぐ検索で出てくるが、なぜその計算方法でもとまるかの説明があまりない気がする。みんな意味わかって計算してるのかな？

https://sci-pursuit.com/math/binary-number-conversion.html
ここ、10進数から2進数への変換の仕組みがわかりやすかったです。
【YaTeX・Emacs】句読点を変換する（、。→ ，．）

# はじめに
僕は現在大学院に所属しており、よく論文を書いています。
日本語の論文では、ルール（慣例？）として句読点は「，」と「．」を使うことになっています（全角です）。
なので、僕の場合Google日本語入力を使っているので、その環境設定で句読点はデフォルトで「，」と「．」になるようにしています。

しかし、PCでやることはなにも論文執筆だけじゃない。。。
LINEやSlackで連絡を取ることもあれば、TwitterやFacebook、Qiitaで情報発信したりする。

そんなときに句読点が「，」と「．」だと、ちょっと固い文章になってしまう。 …と僕は思っています。

したがって、Google日本語入力のデフォルトは「、」と「。」にして、論文書くときだけエディタ上で勝手に「，」と「．」へと変換してくれるようにしました。なので、メモとしてここに残しておきます。


# 環境
*下記が導入済みの環境を想定しています。*

- Emacs
- YaTeX


# 手順

今回は[こちら](http://sugawarayusuke.hatenablog.com/entry/2016/01/22/230346)の記事を参考にさせていただきました。（ありがとうございました🙇）

僕が実際に追加したのは以下のコードです。
このコードをinit.elに追記します。

ただし、今回は僕が使っているYaTeXモードにフックをかけています。
皆さんの環境に合わせて`yatex-mode-hook`（下から4行目）のところを`tex-mode`なりに変えてください。

```emacs-lisp:init.el
(defun replace-dot-comma ()
  (let ((curpos (point)))
    (goto-char (point-min))
    (while (search-forward "。" nil t) (replace-match "．"))
    
    (goto-char (point-min))
    (while (search-forward "、" nil t) (replace-match "，"))
    (goto-char curpos)
    ))

(add-hook 'yatex-mode-hook
          '(lambda ()
             (add-hook 'before-save-hook 'replace-dot-comma nil 'make-it-local)
             ))
```


# いざ、変換！

![やてふ変換.gif](https://qiita-image-store.s3.amazonaws.com/0/119088/d8d69f96-af0b-76df-2009-5e828e9432f9.gif)

少し分かりづらいかもしれないですが、保存した瞬間（下の方に「Wrote 〜」と出た瞬間）に全て変換されていますね！
Project Honolulu 1802入れました

本格的にローカライズされました。
ちゃんと日本語対応も行われます。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/203732/5cbf4bec-44e7-ad43-70be-1774f57cb401.png)

サーバーの情報画面もちゃんとできてます。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/203732/fdea9ac0-e8e0-bde5-dc97-6a83c0235796.png)

Windows10のHyper-Vもちゃんと情報が見れます。

![07.png](https://qiita-image-store.s3.amazonaws.com/0/203732/adf861d4-1e8e-f716-cf70-800da4f49f8d.png)
![08.png](https://qiita-image-store.s3.amazonaws.com/0/203732/25a7f891-77ad-f00b-d860-5c6c9bfa5688.png)
![09.png](https://qiita-image-store.s3.amazonaws.com/0/203732/cce0a47d-23ef-307f-82e9-4b41b502d672.png)

使えますね～。

リモートデスクトップ接続もできるし、Powershellコンソールもあります。

管理する台数が多くなると重宝できそうですね。
続・JSフレームワークの末端がWebComponentsになるのか、なれるのか、検証してみた

https://qiita.com/mizchi/items/053f5b42a6d0902e9412

やりたかったこと： Reactから子に関数参照を渡すのを綺麗に実装したい

## 前回からの変化

- lit-extended を使えば、テンプレートにコールバックを渡せることを知った
- 子に対して関数参照を渡すのではなく、 CustomEvent を生成するようにして dispatchEvent するようにした
- 一旦変換用のイベント定義辞書を渡すようにした


## WebComponent定義

```js
/* @flow */
import { html, render } from 'lit-html/lib/lit-extended'

type Props = {
  onClick?: Function,
  text: string
}

const template = (props: Props) => {
  return html`
    <button on-click=${props.onClick}>${props.text}</button>
  `
}

export default class MyButton extends HTMLElement {
  static get observedAttributes(): string[] {
    return ['text']
  }

  connectedCallback() {
    this.render()
  }

  attributeChangedCallback(_attrName: string, _old: any, _new: any) {
    this.render()
  }

  render() {
    const text = this.getAttribute('text') || 'button'
    const onClick = () =>
      this.dispatchEvent(
        new CustomEvent('my-button-clicked', {
          detail: {
            text
          }
        })
      )
    render(template({ text, onClick }), this)
  }
}

window.customElements.define('my-button', MyButton)
```

静的な値だけを一旦渡すようにした。


## React側

reactify という関数で、特定のエレメントをReactで表示する際にどう値を渡すか定義する

```js
/* @flow */
import ReactDOM from 'react-dom'
import * as React from 'react'
import '~/elements/MyButton'

const reactify = (name: string, opts = {}) =>
  class extends React.PureComponent {
    constructor() {
      super()
      this._listeners = []
    }
    componentDidMount() {
      const el = ReactDOM.findDOMNode(this)
      for (const eventName of Object.keys(opts.eventMap || {})) {
        const translated = opts.eventMap[eventName]
        const callback = this.props[translated]
        console.log('register', eventName, translated)
        el.addEventListener(eventName, callback)
        this._listeners.push({ eventName, callback })
      }
    }
    componentWillUnmount() {
      this._listeners.forEach(listener => {
        el.removeEventListener(listener.eventName, listener.callback)
      })
      this._listeners = []
    }
    render() {
      return React.createElement(name, this.props)
    }
  }

const MyButtonReact = reactify('my-button', {
  eventMap: {
    'my-button-clicked': 'onMyButtonClicked'
  }
})

export default function Home() {
  return (
    <div>
      <MyButtonReact
        text="my button on react"
        onMyButtonClicked={_ev => console.log('clicked!')}
      />
      {/* <my-button text="my-button" /> */}
    </div>
  )
}

```

「このイベントが来たらこのコールバックに渡す」という中間層を用意したことで、とりあえず動くようになった。

## 残ってる点

- 本当は define した名前ではなく オブジェクト参照を使いたいが React.createElement が対応していないので、一旦こうなった。
- やっぱ eventMap ダサい…
spring bootのチュートリアルをとりあえずやってみる(1)

初投稿、今後たくさん技術知識ふやしていかなあかんので、備忘録

# 背景
昔々にSpring Boot(Gradle)触ったんだけども、すっかり忘れちゃったので復習も兼ねて[spring bootチュートリアル](https://spring.io/guides/gs/spring-boot/)をやることにしました。
あと個人的にアプリ作りたいときの一つの手段として。

# 事前準備
そもそもgradleが入ってないので、homebrewにてインストール。

```
brew install gradle
```

適当にプロジェクトディレクトリ作って、チュートリアルでは./gradlewを使ってるので、使えるように準備する。

```
mkdir hogepj
cd hogepj
gradle wrapper
```

ディレクトリ直下に```build.gradle```ファイルも作っておく
ソースはチュートリアルをコピペ

gradlewは、gradleが入ってないPCとかでもビルドとかができるようにするためのものらしい。
あとはJavaとかIDEとかはあるので準備OK

# チュートリアルにそってjavaファイルの作成

```
touch src/main/java/hello/HelloController.java
touch src/main/java/hello/Application.java
```
中身はチュートリアルをコピペ

# 実行
ビルドして実行する。

```
./gradlew build && java -jar build/libs/gs-spring-boot-0.1.0.jar
...
いろいろ出力される
tomcatEmbeddedServletContainerFactory
viewControllerHandlerMapping
```

最後にアクセスしてみる。

```
curl localhost:8080
Greetings from Spring Boot!
```

以上で、実行までのチュートリアル終わり。
次回は続きのgradleでのテストをやろう。
githubで既存アカウントを取得してみる

下記の記事より取得済みアカウントもお願いすれば取れる可能性があるということで、自分も諦めてたアカウントでメールしてみた。

https://qiita.com/uichi/items/e4fcfca0257fd08376d2

返信メールは上記とは異なり、取れるようにしたから早くとってね！って感じだった。

実際に取得できました。
お礼のメールをして本件終了。

これからちょくちょくguthubでも草を生やせるよう頑張ります。
EC2(Linux)の操作ログ(Scriptコマンドの結果)をCloudwatch logsに送りたい

EC2(Linux)の操作ログをクラウドに保存できないかなぁと思って考えたときのメモです。
AWS Logs エージェントは導入済みの環境を想定してます。

# 操作ログ出力先作成
    # mkdir /var/log/script
    # chmod 777 /var/log/script
# 操作ログ出力スクリプト作成
    # touch /etc/profile.d/scriptlog.sh
    # chmod 644 /etc/profile.d/scriptlog.sh
    # vi /etc/profile.d/scriptlog.sh
    －－－－－－－
    #!/bin/bash
    #===================================
    # Script Name   : scriptlog.sh
    # Description   : This script outputs the operation log for each user to the specified directory.
    #===================================
    
    LOGDIR=/var/log/script
    LOGFILE=`whoami`.log
    
    P_PROC=`ps -ef|grep $PPID|grep bash|awk '{print $8}'`
    
    if [ "$P_PROC" = -bash ];then
      #/bin/script -faq ${LOGFILE}
      # タイムスタンプを追加
      /bin/script -fq >(awk '{print strftime("%F %T "), $0} {fflush() }'>> ${LOGDIR}/${LOGFILE})
      exit
    fi
    －－－－－－－
#ログインしなおしてログが出てるか確認
    # id
    uid=0(root) gid=0(root) groups=0(root)
    # ls -la /var/log/script/
    -rw-r--r-- 1 root root  3 Mar 15 03:16 root.log
#logrotate設定
    touch /etc/logrotate.d/scriptlog
    vi /etc/logrotate.d/scriptlog
    －－－－－－－
    /var/log/script/*.log
    {
        daily						# 日次ローテーション
        rotate 7					# 世代数は7
        missingok					# ファイルがなくてもエラーとしない
        notifempty					# ファイルが空なら実行しない
        copytruncate				# コピー後に元ファイルの中身を削除する
        dateext						# ファイル末尾の日付フォーマット
        dateformat .%Y%m%d			# 日付は.%Y%m%dの形式にする
        compress					# ファイルを圧縮する
        su root root				# root権限で実行する
    }
    －－－－－－－
#logrotateおためし
    dry-run
    # logrotate -dv /etc/logrotate.d/scriptlog
    強制実行
    # logrotate -f /etc/logrotate.d/scriptlog
    # ls -la /var/log/script
    -rw-r--r-- 1 root root  3 Mar 15 03:16 root.log
    -rw------- 1 root root 20 Mar 14 16:19 root.20180315.gz
# awslogs設定
    # vi /var/awslogs/etc/awslogs.conf
    －－－－－－－
    [general]
    state_file = /var/awslogs/state/agent-state

    [/var/log/script/root.log]    #root用の設定
    datetime_format = %Y-%m-%d %H:%M:%S
    file = /var/log/script/root.log
    initial_position = start_of_file
    log_group_name = /product/var/log/script/root.log
    buffer_duration = 5000
    log_stream_name = {hostname}

    [/var/log/script/ec2-user.log]    #ec2-user用の設定
    datetime_format = %Y-%m-%d %H:%M:%S
    file = /var/log/script/ec2-user.log
    initial_position = start_of_file
    log_group_name = /product/var/log/script/ec2-user.log
    buffer_duration = 5000
    log_stream_name = {hostname}
    －－－－－－－

# awslogs 再起動
    # service awslogs restart

~~こんな感じでクラウドに残せるんじゃないかなーというメモになります。~~
テストした結果、日付がないとAWS Logs エージェントでうまく送れなかったのでタイムスタンプを付加できるように変えました。
ngrokをNode.jsで起動させる

# 前提条件
npmとNode.jsのバージョンは以下の通りとします。

- npm 5.6.0
- Node.js v9.8.0

# 背景
npm公式サイトの、[ngrok](https://www.npmjs.com/package/ngrok)のページで「usage」を見てみると、

```
npm install ngrok
const ngrok = require('ngrok');
const url = await ngrok.connect();
```

とある。

「npm init」して、「npm install ngrok」して、「app.js」新規作成して、
素直にそのまま記載する。

```javascript:app.js
const ngrok = require('ngrok');
const url = await ngrok.connect();
```

そして、「node app.js」で実行すると、

```
/Users/Hitoshi/src/ngrok-nodejs/app.js:2
const url = await ngrok.connect();
            ^^^^^

SyntaxError: await is only valid in async function
    at new Script (vm.js:51:7)
    at createScript (vm.js:136:10)
    at Object.runInThisContext (vm.js:197:10)
    at Module._compile (module.js:613:28)
    at Object.Module._extensions..js (module.js:660:10)
    at Module.load (module.js:561:32)
    at tryModuleLoad (module.js:501:12)
    at Function.Module._load (module.js:493:3)
    at Function.Module.runMain (module.js:690:10)
    at startup (bootstrap_node.js:194:16)
```

・・・っておい。
**エラーで実行できねEEEEEEEEEE！！！！！**
**公式サイトなのに使い方間違ってるううううう**
と思ったのは僕だけじゃないはず。

# 解決方法
以下のように非同期型（async）の関数でラップしてあげればOK！

```javascript:app.js
const ngrok = require('ngrok');

connectNgrok().then(url => {
    console.log('URL : ' + url);
});

// ngrokを非同期で起動
async function connectNgrok() {
    let url = await ngrok.connect();
    return url;
}
```

async、await、thenの詳しい使い方は、以下のサイトが参考になりました。
[async/await 入門（JavaScript）](https://qiita.com/soarflat/items/1a9613e023200bbebcb3)

# 実行結果
「node app.js」で実行すると、以下のように出力されます！

```
URL : https://xxxxxxxx.ngrok.io
```
UbuntuのcuコマンドでCiscoルータを使おう

#<b>経緯</b>
今までwindowsでルータをいじるときはteratermを用いてルータに接続していたけど、今回晴れてwindowsからubuntuに乗り換えたのでコマンドでのシリアル通信方法について書いておく。
コマンドの説明とかは調べればすぐコマンド辞典とか出るので今回は行わないものとします。
また、今回はあらかじめ線は接続してあり、rootユーザで実行している体でいます。

#<b>環境</b>
Ubuntu17.10
Cisco2911

#<b>コマンド</b>
```
dmesg | grep ttyUSB
```

このコマンド等でUSB接続してあるシリアルケーブルを探します。
商品によりますが、我が家のUSBシリアルケーブルは

*usb 1-1.4: FTDI USB Serial Device converter now attached to ttyUSB0*

になっていました。シリアル通信なので、おそらくSerial等の単語が文字列の中に入っていると思われます。

その後

```
cu -s 9600 -l /dev/ttyUSB0
```

等のコマンドで接続するのですが、おそらく

cu: open (/dev/ttyUSB0): Permission denied
cu: /dev/ttyUSB0: Line in use

等の権限不足の文言が出力されます。これはcuコマンドの仕様で、cuコマンドは一般ユーザで実行された扱いになるようなので、chmodで一般ユーザでも当該USBでr/wできるようにパーミッション設定をします。

```
chmod 666 /dev/ttyUSB0
```

これでこの後に上のcuコマンドもう一度打つとciscoルータのいつもの*Router>*みたいな画面が出てくるはず。

終わるときは

```
~.
```

を入れてあげると少ししてから元のコンソールに戻る。:q等ではなかった。