OmniAICreator/Qiita-1.07M huggingface dataset:
BigQueryのStandard SQLの日付・時刻、JSON、正規表現のTips

はじめに
========

BigQueryを使っていて、しばしば書き方を忘れたりするものをメモしておきます。

内容
======

日付・時間関連
--------
### unixtimestamp と TIMESTAMP型 の変換
TIMESTAMP型は「時刻」的なデータなので unixtimestamp と普通に対応します。

* unixtime -> TIMESTAMP:  `TIMESTAMP_SECONDS(unixtime)`
* TIMESTAMP -> unixtime: `UNIX_SECONDS(TIMESTAMP "2016-11-18 00:00:00+09")`


文字列からTIMESTAMP型には普通にCASTできる。TimeZoneは省略すると`+00`になります。

```sql
SELECT
  TIMESTAMP "2016-11-18 00:00:00" as utc,
  TIMESTAMP "2016-11-18 00:00:00+09" as jst
```

|utc|jst|
|---|---|
|2016-11-18 00:00:00 UTC|2016-11-17 15:00:00 UTC|


### TIMESTAMP型 と DATETIME型 の変換(DATE型もほぼ同じ)
DATETIME と TIMESTAMP は普通にCASTできます。

* TIMESTAMP -> DATETIME: `DATETIME(TIMESTAMP "2016-11-18 00:00:00+09", 'Asia/Tokyo')`
* DATETIME -> TIMESTAMP: `TIMESTAMP(DATETIME(TIMESTAMP "2016-11-18 00:00:00+09", 'Asia/Tokyo'))`

DATETIME型の場合「暦」的な型なので、あるTimeZoneに変換したあとは、TimeZone情報自体は失われます（たぶん）。
なので、 TIMESTAMP->DATETIME->TIMESTAMP にCASTすると、時刻が変わってしまっている場合があるので注意が必要です(３つ目のケース)。


```sql
SELECT
  TIMESTAMP "2016-11-18 00:00:00+09",
  DATETIME(TIMESTAMP "2016-11-18 00:00:00+09", 'Asia/Tokyo'),
  TIMESTAMP(DATETIME(TIMESTAMP "2016-11-18 00:00:00+09", 'Asia/Tokyo'))
```

|f0_|f1_|f2_|
|---|---|---|
|2016-11-17 15:00:00 UTC|2016-11-18T00:00:00|2016-11-18 00:00:00 UTC|

### DATETIME型は「日」「月」などに丸めることができる(DATE型もほぼ同じ)
DATETIME型は「暦」的なので、`DATETIME_TRUNC()`関数を使うと「日」や「月」という単位にTruncateできます。
Timezoneを考慮した日単位や月単位にグルーピングするときに便利です。

```sql
SELECT
  DATETIME_TRUNC(DATETIME(TIMESTAMP "2016-11-18 00:00:00+09", 'Asia/Tokyo'), DAY) as day,
  DATETIME_TRUNC(DATETIME(TIMESTAMP "2016-11-18 00:00:00+09", 'Asia/Tokyo'), MONTH) as month,
  DATETIME_TRUNC(DATETIME(TIMESTAMP "2016-11-18 00:00:00+09", 'Asia/Tokyo'), YEAR) as year
```

|day|month|year|
|---|---|---|
|2016-11-18T00:00:00|2016-11-01T00:00:00|2016-01-01T00:00:00|

### DATETIME型は「１ヶ月後」などの計算ができる(DATE型もほぼ同じ)

```sql
SELECT
  DATETIME_ADD(DATETIME '2015-12-01', INTERVAL 30 DAY) as day30,
  DATETIME_ADD(DATETIME '2015-12-01', INTERVAL 1 MONTH) as month
```

|day30|month|
|---|---|
|2015-12-31T00:00:00|2016-01-01T00:00:00|

JSON文字列のParse
------
※ 以下の方法は既に不要で、最近なら [JSON_EXTRACT または JSON_EXTRACT_SCALAR
](https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators?hl=ja#json-functions) などが便利です。

JSON文字列から取り出す名前や型を明示する必要はありますが、以下のようにすれば可能です。

```sql
CREATE TEMPORARY FUNCTION parse_json(json_str STRING) 
RETURNS STRUCT<name STRING, birthday STRING, mail STRING> 
LANGUAGE js AS """
  return JSON.parse(json_str);
""";

SELECT parse_json('{"name": "hogehoge", "birthday": "2000-01-01", "pref": 31}') as user
```

|Row|user.name|user.birthday|user.mail|
|---|---|---|---|
|1|hogehoge|2000-01-01|null|

`<>` で指定しなかった列 `pref` は出力されませんし、キーが無かった`mail`は`null`になります。


正規表現
--------
正規表現を使って文字列から、マッチした部分を抽出したり、マッチするかを判定することができます。

```sql
SELECT 
  REGEXP_EXTRACT("hogehoge@gmail.com", r'^([^@]+)@'),
  REGEXP_CONTAINS("hogehoge@gmail.com", r'@gmail\.com$')
```

|f0_|f1_|
|---|---|
|hogehoge|true|


さいごに
=======

これで毎回過去の履歴を捜索しなくて済むかな。。。
AWS SDK for Ruby V1でAWS::Errors::MissingCredentialsErrorが出る場合の対処

# 誰向けか

まだ仕方なくAWS SDK for Ruby V1を使っていて、かつクレデンシャルを環境変数でなくEC2のインスタンスメタ情報から取得している人。あんまりいないかもしれん。

# なにが起こるか

クレデンシャルのリフレッシュ時に、AWSの障害などで一度でもメタ情報の取得に失敗すると、二度とリカバーしない。結果こんなエラーが出続けることになる。

```
AWS::Errors::MissingCredentialsError (
Missing Credentials.
```

# なぜそうなるか

AWS SDK for Ruby V1の実装があんまよくない。

```:credential_providers.rb
module AWS
  module Core
    module CredentialProviders
      module Provider

        def credentials
          raise Errors::MissingCredentialsError unless set?
          @cached_credentials.dup
        end

        def set?
          @cache_mutex ||= Mutex.new
          unless @cached_credentials
            @cache_mutex.synchronize do
              @cached_credentials ||= get_credentials
            end
          end
          !!(@cached_credentials[:access_key_id] &&
            @cached_credentials[:secret_access_key])
        end
...
      class DefaultProvider
        def credentials
          providers.each do |provider|
            if provider.set?
              return provider.credentials
            end
          end
          raise Errors::MissingCredentialsError
        end
...
```

リフレッシュ時に取得に失敗すると、@cached_credentialsに空のハッシュが代入されるので、以後get_credentialsが呼ばれることはない。

# どうするのがよいのか

## AWS SDK for Ruby V2にUpgradeする

これが最もよい。V2の実装では、一度リフレッシュに失敗しても次回の実行時にリカバーされるようになる。

## EC2Providerのオプションにリトライをセットする

リトライをセットすることで、リフレッシュが失敗する確率を下げることができる。が100%ではない。

## SDKにパッチを当てる

すぐにSDKをアップグレードできない事情がある場合には、短期的にSDKにパッチを当てることで回避できる。

```:monkey_patches/credential_providers.rb
module AWS
  module Core
    module CredentialProviders
      # The original CredentialProvider has a serious bug that keeps credentials empty
      # when retrieving the ec2 meta infomation was failed on refreshing.
      class EC2Provider
        def initialize options = {}
          @mutex = Mutex.new
          @ip_address = options[:ip_address] || '169.254.169.254'
          @port = options[:port] || 80
          @retries = options[:retries] || 5
          @http_open_timeout = options[:http_open_timeout] || 1
          @http_read_timeout = options[:http_read_timeout] || 1
          @http_debug_output = options[:http_debug_output]
        end

        def credentials
          if near_expiration?
            @mutex.synchronize do
              refresh_credentials if near_expiration?
            end
          end
          super
        end

        def set?
          unless @cached_credentials
            @mutex.synchronize do
              refresh_credentials
              @available_provider = credentials_set?
            end
          end

          if @available_provider && !credentials_set?
            @mutex.synchronize do
              refresh_credentials
            end
          end
          credentials_set?
        end

        private
          def credentials_set?
            !!(@cached_credentials[:access_key_id] &&
              @cached_credentials[:secret_access_key])
          end

          def refresh_credentials
            @cached_credentials = get_credentials
          end
      end
    end
  end
end
```
リスニング/技術英語 > Adafruit > Battery Basics @adafruit > Part 1 > household name / PP3 

Batteryについて面白そうな動画を見つけたので、技術英語関連でリスニングしてみた。

[Collin's Lab: Battery Basics @adafruit #adafruit](https://www.youtube.com/watch?v=8ftkn7nZSDo&index=74&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4)

赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。

(00:00-)
Battery.  They <font color=red>XXX1 (all?)</font> bring up a number of different chemistry, sizes and capabilities.
When considering what battery technology to use, there are a few important attributes to keep in mind.
Namely...

(00:20-)
First off, is milliamp hours. You see this rating printed on most batteries. 
It tells us how many milliamps (that) the battery can supply for a period of one hour.
So, this lithium polymer battery can provide 1200 milliamps continuously for one hour.
Milliamp hours tells us how long the battery will last.

(0:46-)
Nominal cell voltage. 
This is how many volts one cell of that battery chemistry can generate. 
No matter what size of the cell is, it will always generate the same voltage as long as it uses the same chemistry.

(0:59-)
Rechargeability.
Can the cell be recharged? If so, how many times can it be recharged?

(1:08-)
So, now that (the???) we have those basic down, let's look at 
the most essential battery types.
Starting with...

(1:20-)
Alkaline batterys, are a **household name**. 
And for a good reason, they are inexpensive and long lasting.
They're also available in a variety of sizes, with capacity that increases according to the size. 
Such as, AAA, AA, C, D, and **PP3**, more commonly known as a 9V.

(1:40-)
All of the other sizes provide alkalines nominal 1.5V cell voltage. 
But the PP3 provides 9V. And how does that do that? 
Simple. It's not actually a single alkaline cell.

<hr>
上記の単語を抜粋

- household name
  - https://www.merriam-webster.com/dictionary/household%20name
- PP3
S3 内のファイルのデータ容量を知る方法

```
aws s3 ls --recursive s3://BUCKET/hoge/ > hoge.txt
cat hoge.txt|awk '{a+=$3} END{print a;}'
```

## hoge.txt
```
2016-12-01 19:17:00    12345 fuge/2016-12-01-19-17-00-1234567890ABCDEF
2016-12-01 19:17:01    67890 fuge/2016-12-01-19-17-01-1234567890ABCDEF
```

とすると、80235 bytes と出力される。
gulp-imageminのプラグインによる最適化が機能しない際の対処

gulp-imageminを用いて画像を圧縮させる際に、
pngquantや非可逆圧縮としてmozjpeg等を用いようと思ったが、
圧縮率に反映されない時があったのでメモ

他の記事などを参考にimageminプラグインを追加していたが
同様の質問があり下記で解決されていた
https://github.com/sindresorhus/gulp-imagemin/issues/190

追記：下記記事にも既出でした
[Gulpでpngquantを使ってPNGの減色＆軽量化](http://qiita.com/sygnas/items/f6700c75df71b8888d80)

#うまく行かなかった記述

```js:gulpfile.js
gulp.task('imagemin', function(){
  return gulp.src('src/images/*')
    .pipe(imagemin({
      interlaced: true,
      progressive: true,
      optimizationLevel: 5,
      use: [pngquant()]
    }))
    .pipe(gulp.dest('dist/images'));
});
```

#うまく行った記述
[imageminのv3.0.0のアップデート](https://github.com/sindresorhus/gulp-imagemin/releases/tag/v3.0.0)によると
use:[] もしくは plugins:[] は用いずに

```js:gulpfile.js
gulp.task('imagemin', function(){
  return gulp.src('src/images/*')
    .pipe(imagemin(
      [
        pngquant()
      ],
      {
        interlaced: true,
        progressive: true,
        optimizationLevel: 5
      }
     ))
     .pipe(gulp.dest('dist/images'));
});
```

のように指定する必要があるよう。


##現在行っている設定

```js:gulpfile.js
var gulp = require("gulp"),
imagemin = require("gulp-imagemin"),
pngquant = require("imagemin-pngquant"),
mozjpeg = require('imagemin-mozjpeg');

gulp.task('imagemin', function(){
  return gulp.src('src/images/*')
    .pipe(plumber())
    .pipe(imagemin([
       pngquant({
         quality: '65-80',
         speed: 1,
         floyd:0
       }),
       mozjpeg({
         quality:85,
         progressive: true
       }),
       imagemin.svgo(),
       imagemin.optipng(),
       imagemin.gifsicle()
     ]
  ))
  .pipe(gulp.dest('dist/images'));
});
```

のように指定して圧縮しています。
qualityの値は潰れ具合を見て調整が必要なのと、
余計な指定もある気がしていますが
pngquant,optipng両方指定したほうがサイズが減ったので一応

追記：下記記事にもあるoptipngによるガンマ情報の除去が行われるからかもしれません、なので記事中にあるようなもう一度imagemin()をかませる手間が減ってるかも
[【Gulp】pngquantで圧縮した画像がMacで暗くなる場合の対処法](http://taneppa.net/gulp_pq_warning/)
td-agentをインストールしてRailsのログを見やすくする（後編）

前回
[fluentdをインストールしてRailsのログを見やすくする（前編）](http://qiita.com/fk_2000/items/d9577b182bed5f06c960)

# fluentdとtd-agentの違い
[fluentdとtd-agentの違い](http://tsunokawa.hatenablog.com/entry/20120723/p1)

-　td-agentはFluentdの安定版
-　gem installするのはFluentd、RPMインストールするのはtd-agent
-　gem installでもRPMインストールもfluent-catが同梱される

# インストール手順

RPMインストール
`curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh`

インストールバージョンの確認
```
$ td-agent --version
td-agent 0.12.29
```

実行ユーザの変更
`$ vi /etc/td-agent/td-agent.conf`


```diff:
- TD_AGENT_USER=td-agent
- TD_AGENT_GROUP=td-agent
+ TD_AGENT_USER=root
+ TD_AGENT_GROUP=root
```

# 起動、リロード、停止

`$sudo service td-agent start`
`$sudo service td-agent reload`
`$sudo service td-agent stop`

# fluent-catの使い方

## fluent-catの場所

`/opt/td-agent/embedded/bin/fluent-cat`

## 環境変数に追加
`export PATH=$PATH:/opt/td-agent/embedded/bin/`

## ログ出力テスト
`echo '{"first":"hello"}' | fluent-cat debug.test`

## 残りタスク
- `gem install fluent-plugin-rewrite`
- `$ vi /vagrant/config/environments/development.rb`設定変更
    - config.logger = Logger.new(config.paths["log"].first)
    - config.logger.formatter = Logger::Formatter.new
- `$ vi /vagrant/config/environment.rb`設定変更（*1）
- `/etc/td-agent/td-agent.conf`設定変更（&lt;source&gt;&lt;match&gt;追加）
- ログ確認

*1

```
class Logger
  class Formatter
    def call(severity, time, progname, msg)
      if msg.class.to_s == "String"
        msg = msg.gsub(/\n/, "")
        if msg.present? && !msg.include?("assets") && !msg.include?("erb")
          format = "[%s %d] %5s -- %s: \'%s\'\n"
          format % ["#{time.strftime('%Y-%m-%d %H:%M:%S')}.#{'%06d' % time.usec.to_s}",$$, severity, progname, msg2str(msg)]
        end
      end
    end
  end
end 
```
aws cliでECSのリポジトリ内にどんなimageタグがbuildされているかワンライナーで答える

## 時間の無い人向け

下記コマンドの&lt;repositoryName&gt;のところをご自身のECS(Amazon EC2 Container Service)に登録されたrepositoryNameに置き換えて実行します。

```
$ aws ecr list-images --repository-name <repositoryName> --query "imageIds[*].imageTag" --output table
```

--output tableと指定すると表形式で出力されます。

```
-------------------
|   ListImages    |
+-----------------+
|  hoge           |
|  fuga           |
|  moga           |
+-----------------+
```

```
$ aws ecr list-images --repository-name <repositoryName> --query "imageIds[*].imageTag" --output json
```

--output jsonとするとjson形式になります。

```
[
    "hoge",
    "fuga",
    "moga"
]
```

時間が無い人向けはここまで

## リポジトリがたくさんある人向け

一旦、repository.listを作成します。

```
$ aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName"' > repository.list
$ cat repository.list
repository1
repository2
repository3
:
```

ECR内のリポジトリ名だけのテキストファイルが作成されるので、そのファイルをawkで拾っていきます。

```
for X in `awk '{print $1}' repository.list` ; do  echo $X ; aws ecr list-images --repository-name $X --query "imageIds[*].imageTag" --output table ; done
```

```
repository1
-------------------
|   ListImages    |
+-----------------+
|  hoge           |
|  fuga           |
|  moga           |
+-----------------+
repository2
-------------------
|   ListImages    |
+-----------------+
|  hoge-latest    |
|  fuga-latest    |
|  moga-latest    |
+-----------------+
repository3
-------------------
|   ListImages    |
+-----------------+
|  development    |
|  staging        |
|  production     |
+-----------------+
:
```
GO/GAE 環境構築からデプロイまで

以下のリンクを参考に進めます。
[PaaS最前線！たったの15分でできるGAE/GO入門！](http://www.apps-gcp.com/gae-go-gettingstart-01/)

## 環境構築

### AppEngine SDKのインストール

以下のリンクよりAppEngine SDKをダウンロードします。
[Download and Install the SDK for App Engine](https://cloud.google.com/appengine/downloads)

リンクを開くとGO、Java、PHP、Pythonとボタンが表示されているので、GOボタンをクリック。

![gae_go.png](https://qiita-image-store.s3.amazonaws.com/0/2567/2e98409b-87f4-dd0f-9c0e-6e361a60bcda.png)

次に、LINUX、MAC OS X、WINDOWSから選択。（64bit、32bitも選ぶ）

![gae_go2.png](https://qiita-image-store.s3.amazonaws.com/0/2567/049d6a20-177c-74af-0919-8a5e76f28fa7.png)

ダウンロードが開始されるのでアーカイブを適当な場所で解凍します。

環境変数を.bash_profileに追加。

`export PATH=$PATH:DIRECTORY_PATH/go_appengine_sdk_OS_BIT-1.9.40/`

と書いていますが、下記の記述で大丈夫でした。

`export PATH=$PATH:$HOME/go_appengine/`

### pythonのバージョン確認

`$ /usr/bin/env python -V`

Python2.7が必須となります。

### goappのバージョン確認

`$ goapp version`

```
go version go1.6.2 (appengine-1.9.40) darwin/amd64
```

これで準備が整いました。

## hello world

helloworldをローカル環境で試すには以下の手順を行います。

1. hello.goファイルの作成
2. app.yamlファイルの作成
3. goapp serve コマンドで実行後、ブラウザで確認。

まずは、作業ディレクトリを作成。

```
$ mkdir helloworld
$ cd helloworld
```

hello.goファイルを作成

`$ vi hello.go`

```golang:
package hello
import (
        "fmt"
        "net/http"
)

func init() {
        http.HandleFunc("/hello", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello, world!")
}
```

ファイルを保存した後、以下のコマンドを実行することで、行間やインデントなど、自動で整形してくれます。

`$ go fmt hello.go`


app.yamlファイルを作成

`$ vi app.yaml`

```python:
application: helloworld
version: 1
runtime: go
api_version: go1
handlers:
- url: /.*
  script: _go_app
```

```bash:
$ cd ..
$ ls -l helloworld/
total 16
-rw-r--r--  1 val  staff  109 Oct 17 17:47 app.yaml
-rw-r--r--  1 val  staff  185 Oct 12 18:18 hello.go
```

### 下記のコマンドでデプロイ
`$ goapp serve helloworld`

## ブラウザで確認すると、「Hello, world!」と表示されたらデプロイ成功です！

http://sample-project.appspot.com/helloworld
＜2016/12版＞source_genの最小限の使い方

去年のAdvent calendarで@sh4869 さんに[紹介](http://qiita.com/sh4869/items/5e0dfe357f09cd23e4fd)していただいた[source_gen](https://github.com/dart-lang/source_gen)ですが、
一年間で微妙に使い方が変わったようなので再度まとめます。

# 準備

必要なLibraryは

 - build_runner
 - source_gen
 
です

```yaml:pubspec.yaml
name: source_gen_example
description: A starting point for Dart libraries or applications.
version: 0.0.1

environment:
  sdk: '>=1.0.0 <2.0.0'

dev_dependencies:
  test: '>=0.12.0 <0.13.0'
  build_runner: ^0.1.0
  source_gen:
```

# 定義の仕方

JSONの型を定義したClassを作成します。

```dart:lib/language.dart
library language;
import 'package:source_gen/generators/json_serializable.dart';

@JsonSerializable()
class Language {

  final String name;
  final bool staticType;
  final int indent;

  Language(this.name,this.staticType,this.indent);

}
```

# build
buildの定義です。詳しく知らないですがGulpのTaskのようなものだと思います。

```dart:bin/build.dart

import 'package:source_gen/generators/json_serializable_generator.dart' as json;
import 'package:source_gen/source_gen.dart';
import 'package:build_runner/build_runner.dart';

main() async {
  await build(phases, deleteFilesByDefault: true);
}

const library_name = "source_gen_example"; // pubspec.yamlで定義したライブラリ名です。
const file_path = "lib/*.dart"; // ディレクトリ名です。

final PhaseGroup phases = new PhaseGroup.singleAction(
    new GeneratorBuilder(const [
      const json.JsonSerializableGenerator(),
    ]),
    new InputSet(library_name, const [file_path]));
```

# 実行

コマンドプロンプトから上記build.dartを実行するとlib/language.g.dartが生成されます。

```
dart bin\build.dart
```

# Classの修正

型を定義したClassが自動生成した処理を読み出せるように修正します。
するべきことは三点です。

 - 自動生成したFileをpart 文で読み出し
 - ミックスインの設定
 - ファクトリコンストラクタの追加

```dart:lib/language.dart
library language;

import 'package:source_gen/generators/json_serializable.dart';

part 'language.g.dart'; // 自動生成したファイルを読み込み

@JsonSerializable()
class Language extends Object with _$LanguageSerializerMixin { // ミックスインの設定

  final String name;
  final bool staticType;
  final int indent;

  Language(this.name,this.staticType,this.indent);

  factory Language.fromJSON(Map map) => _$LanguageFromJson(map); // ファクトリコンストラクタの追加

}
```


以上です。
Node-RED on Bluemixでのエディタログイン設定について

#Node-REDのフローエディタ
Bluemixからだと、Bluemix上に構築したNode-REDアプリケーションをダッシュボード上で選択し「アプリの表示」をクリックすると、そのままNode-REDのフローエディタが起動します。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/81226/3a1ebdfc-1ebb-71cb-f7c5-ec2e5e7278df.png)

![02.png](https://qiita-image-store.s3.amazonaws.com/0/81226/2d513770-cdcf-d81a-cfd0-8568871a009d.png)


#だれでもアクセス可能？
デフォルトだと、URLさえ知っていれば誰でもフローへアクセスすることが可能です。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/81226/0f97fedb-66a5-f001-5c2f-29f742362b2d.png)


#ユーザーとパスワードを設定する
Bluemixのダッシュボードは毎度変更されるたびにUIががらっと変わったりして、行方が分からなくなるのですが、2016年12月現在、環境変数の設定はここです。
アプリ選択　→　ランタイム　→　環境変数
![04.png](https://qiita-image-store.s3.amazonaws.com/0/81226/ce3983d1-4d8b-8a0b-6280-95f2217bb574.png)

環境変数のタブを開いたら「ユーザー定義」に次の二つの環境変数を設定します。
NODE_RED_USERNAME
NODE_RED_PASSWORD

NODE_RED_USERNAMEにはフローエディタへアクセスするためのユーザーアカウントを設定します。NODE_RED_PASSWORDにはフローエディタへアクセスするためのパスワードを設定します。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/81226/9a31e56f-e7cf-a0b8-9972-11bf8f4f53aa.png)


#確認
実際にフローエディタを起動しなおしてみます。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/81226/b6caddd9-975e-76d3-4bed-12d520e4dc1e.png)

認証を求める画面が表示されればOKです。
![06.png](https://qiita-image-store.s3.amazonaws.com/0/81226/7aeed04e-90a2-b561-252c-adb2ed5da7f2.png)

実際に自分が環境変数に設定したユーザー名とパスワードでログインできれば成功です。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/81226/0f97fedb-66a5-f001-5c2f-29f742362b2d.png)
Javaでデータベースに繋ぐ(その1) たぶん基本のやりかた for MySQL/MariaDB

# 「その1」からちょっとだけ書き換えればOK!

「[その1](http://qiita.com/fugahogeds/items/7dc1a56e950b31e8779e)」だとDerbyを使うため、あまりメジャーとは言えません。
ということでMySQLだったらどうなるのでしょうか? ほとんど差はありません。

実際にコードを少しだけ書き換えてみます。
実行環境は、[CentOS7でのMariaDB導入 簡易ガイド](http://qiita.com/fugahogeds/items/16a63327c30c72cd5cae)で作成しているHOGEDB(ユーザーhogeで接続)としています。

書き換えたのは2箇所だけ、わかるでしょうか?

```java
/**
 * データベース接続のサンプル(その1: Statement方式) MySQL版
 * 
 * @author Sato Daisuke
 */

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Sample1forMySQL {
    public static void main(String[] args) throws SQLException {
        // (1) 接続用のURIを用意する(必要に応じて認証指示user/passwordを付ける)
        String uri = "jdbc:mysql://localhost/HOGEDB?user=hoge&password=hogehoge";

        // (2) DriverManagerクラスのメソッドで接続する
        Connection conn = DriverManager.getConnection(uri);

        // (3) SQL送信用インスタンスの作成
        Statement st = conn.createStatement();

        // (4) SQL送信
        st.executeUpdate("drop table if exists sample");
        st.executeUpdate("create table sample(id integer primary key)");
        Long start = System.currentTimeMillis();
        Long delta = start;

        // とりあえず5万回のループ
        for (int i = 0; i < 10000; i++) {
            st.executeUpdate("insert into sample values(" + i + ")");

            // スプリットの計算
            if (i % 1000 == 0) {
                Long now = System.currentTimeMillis();
                Long split = now - delta;
                System.out.println("" + i + ": " + split + "ms.");
                delta = now;
            }
        }
        Long end = System.currentTimeMillis();
        System.out.println("所要時間: " + (end - start) + "ms.");

        // (5) 後始末(インスタンスの正常クローズ)
        st.close();
        conn.close();
    }

}
```

書き換えた2ヶ所は、

- DBの接続文字列(uri)をMySQL向けに変更してます
- Derby版はメモリDBを使ったため、実行すると毎回初期化される仕組みになってますが、こちらはディスク上に入れてしまっているので、「もしあったら先にDROPする」コードをいれました(create table文の直前)。

# 実行の際の注意

当たり前ですが、MySQLのコネクターがないとエラーが出ます。
[ダウンロードページ](https://dev.mysql.com/downloads/connector/j/)から入手し、展開しておいてから、ライブラリー化しておくといいでしょう。
Bluemix CLI

#Bluemix CLIが便利すぎる件
これまではCF CLIをインストールしてからBluemix Pluginをインストールしていましたが、Bluemix Pluginに変わるBluemix CLIがリリースされているみたいです。[Bluemix CLI公式ページ](http://clis.ng.bluemix.net/ui/home.html)
[H.Tokidaさんの記事「Bluemix-cli」](http://stepxstep.org/blog/2016/03/27/bluemix-cli/)によると2016年3月くらいにはリリースされているみたいですね。

こんなの知らなかった…

<br>
主な特徴
・管理系のコマンドが増えている
・入力補完機能 ← 神ってる
・cf login => bx loginとなる、cfコマンドがbxに置き換わる

#Bluemix CLIのインストール
（筆者の環境はCentOS6.4です）
①CFをインストールする
[CF CLIのGitページから適切なやつを選らんで下さい](https://github.com/cloudfoundry/cli/releases)
※cfコマンド6.11以上を導入しておく必要があるそうです。

```
# rpm -ivh cf-cli-installer_6.22.2_x86-64.rpm
警告: cf-cli-installer_6.22.2_x86-64.rpm: ヘッダ V4 RSA/SHA1 Signature, key ID 50c212b6: NOKEY
準備中...                ########################################### [100%]
   1:cf-cli                 ########################################### [100%]

# cf -v
cf version 6.22.2+a95e24c-2016-10-27
```
<br>
②BluemixCLIをインストールする
[BluemixCLIの公式ページ](http://clis.ng.bluemix.net/ui/home.html)

```
# tar -xvf Bluemix_CLI.tar.gz
Bluemix_CLI/
Bluemix_CLI/update_global_config
Bluemix_CLI/install_bluemix_cli
Bluemix_CLI/bx/
Bluemix_CLI/bx/bash_autocomplete
Bluemix_CLI/bx/zsh_autocomplete
Bluemix_CLI/bin/
Bluemix_CLI/bin/bluemix

# cd Bluemix_CLI
# ./install_bluemix_cli
The Cloud Foundry CLI version 6.22 is already installed.
Copying files ...
The Bluemix Command Line Interface (Bluemix CLI) is installed successfully.
To get started, open a new Linux terminal and enter "bluemix help", or enter "bx help" as short name.

With Bluemix CLI 0.4.0 or later, the CLI can automatically collect diagnostic and usage information and send it to Bluemix for analysis.
This information will help us better understand current client usage and plan for future use. No personally identifiable data is collected.

To stop collecting information, you can run the following command:
        'bluemix config --usage-stats-collect false'


入力補完が有効になるようにPATHの設定を行う
ルートのホームディレクトリにある.bash_profileにPATH=$PATH:/usr/local/Bluemix/binとsource /usr/local/Bluemix/bx/bash_autocompleteを追加する。
※PATHは環境によって違うのでご確認下さい。

# cd
~# vi .bash_profile

以下.bash_profileの内容
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin
PATH=$PATH:/usr/local/Bluemix/bin
export PATH

source /usr/local/Bluemix/bx/bash_autocomplete

最後に設定を読み込む
# source .bash_profile

tabを押すと入力候補がでてくるようなる
# bx log
login   logout

```

<br>
<br>
<br>
<br>
・入力補完機能 ← **神ってる**
[C++Builder]CodeSiteでCodeSiteLogging.hppが見つかりませんと出たら

CodeSiteがインストールされているのに、表題のようにエラーが出る場合は、システムインクルードパスとライブラリパスにCodeSiteが正しく表記されていない可能性が高いです。
特に、32bit Windowsのプラットフォームの設定で、Clangコンパイラ(従来のコンパイラではない方。bcc32c)の方はデフォルトでは正しく設定されていない事が多いみたいです。
![スクリーンショット 2016-12-14 11.33.19.png](https://qiita-image-store.s3.amazonaws.com/0/76058/112f6325-940c-b8d4-3a9f-045f96e1fb66.png)
## 設定方法
変更は自己責任で行って下さい。
**ツール->オプション->環境オプション->C++オプション**
のシステムインクルードパスとライブラリパスの**末尾に追記**すれば良いです。
(環境によって適宜変更してください。インクルードパスとライブラリパス両方に同じ記載でOK。従来のコンパイラで正しく動作しているならそちらの末尾あたりにあるRaizeを含む値があるはずですので、それを使えばOK)
追記例:
C:\Program Files (x86)\Raize\CS5\Lib\RX10.1\Win32;
![スクリーンショット 2016-12-14 11.33.39.png](https://qiita-image-store.s3.amazonaws.com/0/76058/0f9c7329-64b8-50ed-ce78-72495d188882.png)
![スクリーンショット 2016-12-14 11.34.08.png](https://qiita-image-store.s3.amazonaws.com/0/76058/ee2bad03-f154-78dc-917b-4de43a6fba06.png)
Eclipse/Che (version 6以前) の見栄えを変える

タイトルのとおりです。

5.0.0-M8 の時点では Light (なんとなく Eclipse っぽい)と Dark (なんとなく Intelli-J IDEA っぽい)の 2つのテーマを選べます。

# 設定方法

IDE 画面のメニューから `Profile` - `Preferences` で `Preferences ダイアログを出し，`IDE` - `Appearance` を選択すると `Theme:` というドロップダウンリストが出てきます。`Light Theme` また `Dark Theme` を選択し，`Save` ボタンを押してください。

その後，画面をリロードすると，変更が反映されます。
ビルド時の git commit id をAndroid プログラムに埋め込む

Android アプリを作っていて、ビルドしたソースコードを特定したいときに git の commit が参照できたらいいですよね。



```groovy
// git describe を実行して結果を取得
def getRevision() {
    def proc = "git describe --dirty --always --tags".execute()
    proc.waitFor()
    (proc.exitValue() == 0) ? proc.text.trim() : ""
}

android {
    defaultConfig {
        // BuildConfig へ埋め込み
        buildConfigField "String", "REVISION", "\"" + getRevision() + "\""
    }
}
```

Android の gradle plugin には BuildConfig クラスに static フィールドを追加する `buildConfigField` が用意されており、 build.gradle は groovy なので単に外部コマンドを実行することで実現できます。便利。

コード中からは次のように参照できます。

```java
String revision = BuildConfig.REVISION; // ← あなたのパッケージの BuildConfig
```
Google Cloud OnBoardに参加して

https://cloudplatformonline.com/gcp-jp-googlecloudonboard.html

## Googleの考え方
（1）制約を厳しくすることで他の大多数が上手くいくなら制約をつける
制約がないことで、他の大多数の問題が解決するのならどんなことをしても制約を外す。

- AppEngineもこの思想に基づいているので、いろいろできないことがある
  
（2）リソースを効率よく利用する
CPUは、常に100%の状態にしておきたい。

- IaaSだと、遊休リソースが発生する（Googleから見た時に、1分でも早く解放して、別のタスクに使いたい）
- AWSの場合、時間単位の課金だが、GCPの場合分単位になっている
 - 課金単位を細かく設定することで、結果的に遊休リソースを少なくしている

## 基盤技術
全てのサービスは、コンテナ上で動いている。
2種類のコンテナサービス

- Borg（ボーグ）
 - Google社内向けのコンテナサービス
- Kubernetes（クーバネテス）
 - Borgの知見を元に、一般向けに実装したもの

数万台のホストサーバーから、空いているものを見つけて、瞬時に展開する。

ビックデータを解析する場合、HDDの呼び出しがボトルネックになる。
BigQueryでは、1TBのデータを、100MBに分割して、数千台のコンテナで実行している。

## AppEngine

- コンテナ種類
 - Standard Environment: Borgコンテナ
 - Flexible Environment: Dockerコンテナ
- ステートレスに作る
 - コンテナはいつ落とされるかわからない
 - 1分以上かかる処理は、TaskQueueに投げる
- データを持たない
 - Cloud Datastore, Cloud Storageに保存
- Cloud SQLは推奨されない
 - AppEngineは自動でスケールされるが、Cloud SQLは単一のVMとして動いているので、スケールに手間がかかる
 - Cloud Datastoreであれば、AppEngineと同じようにコンテナを増やすことでスケールできる 

## Cloud Storage

- バケットの種類が豊富なので、選んで使う
 - Multi Rqgional: 世界展開する
 - Regional: よく使う
 - Nearline
 - Coldline: あまり使わない

## Cloud Bigtable

- 実行スピードが早いが、低レベルのAPIしか提供していない。一般的には、高レベルAPIを提供しているDatastoreを使う
 - Bigtable: 2ms
 - Datastore: 50ms
- Datastoreの内部はBigtable

実行スピードと、使いやすさのトレードオフ。

## Cloud SQL

- もともとあまり力を入れていなかった
 - WordPress用だったので、大した性能はいらなかった
  - WordPressの内容は、エッジキャッシュに乗るので、DBアクセスはあまりなかった
- 多少使われるようになったので、別途、第二世代として実装した。

前述の通り、GoogleではRDBに力を入れていない。
Datastoreか、Bigtableを使うのが吉。

## Compute Engine

- IaaS

オンプレミスから、PaaSへ移行する際の踏み台ぐらいな感じ。
~~Googleとしてあまり力を入れていないのか、必要な機能はあるけど、大して説明はなく……。~~
（時間の制約上、割愛されたようです。コメントありがとうございました）

## Big Query

- 100億行の正規表現置換を8秒で行う
 - インデックスは使わない。毎回、フルスキャン。
 - 理由としては、ちょっとずつ手法を変えて分析を行うので、インデックス貼っても無駄だから

## 機械学習

- サービスとして提供
 - Google Photo: 画像のラベリング
 - Smart Replay: メールの返信を自動で作成。英語のみ
- APIとして提供
 - Vision API: 物体認識、感情認識
 - Speech API: 音声認識（多言語対応）
SlackからエクスポートしたデータをMarkdownに変換する

[Fujitsu extended Advent Calendar 2016](http://qiita.com/advent-calendar/2016/fujitsu_ext)の14日目の記事です。プランAで書きたかったのですが、各種申請が間に合わなかったのでプランBでの内容となります。

## はじめに

[Slack](https://slack.com/)、便利ですね。しかし過去のメッセージを目グレップで探すときはややスクロールがもたついたり、無料プランでただ乗りをしていると1万件までのメッセージしか参照できなかったり、コマンドラインのgrepで検索をかけたかったりと、ローカルにデータがあれば楽だと思うことがたまにあります。

Slackにはデータの[エクスポート機能](https://get.slack.help/hc/en-us/articles/201658943-Exporting-your-team-s-Slack-history)があり、チャネル内のメッセージを日付ごとに個別のJSONファイルにしZIPで固めたファイルをダウンロードできるようになっています。

しかしJSONファイルのままでは利用しにくいため、JSONをMarkdownに変換するツールを作ってみました。Markdownになっていれば人間が目で見ても読めますし、MarkdownをHTMLに変換してウェブサーバに上げておけば簡易アーカイブにもなります。

## ソース

<https://github.com/ohtake/slack2md> に置いてあります。Goだけで書かれているのでGoが動く環境ならどこでも動くはずです。初めて書いたGoなので、突っ込みどころがあったら突っ込みを入れてくれると助かります。

[テスト用のデータ](https://github.com/ohtake/slack2md/tree/example/test_data)をMarkdownに変換してGitHubにそのまま置いたサンプル出力が <https://github.com/ohtake/slack2md/blob/example/output/index.md> にあります。ユーザAliceのアイコンが表示されないのは意図通りです。

実装する際に参考にしたのはSlack APIドキュメントの[Basic message formatting](https://api.slack.com/docs/message-formatting)です。ここにJSON内の形式が説明されているので、それに従ってパーズするだけです。Slackのメッセージをパーズするライブラリが見つからなかったので、練習がてら自分で書いてしまいました。既存のライブラリがあれば乗り換えたいところ。

## 簡易運用例

変換プログラムがあってもそれだけだと履歴が取れません。ちゃんと履歴を取る運用をすればいいのですが、Gitリポジトリだけを使って簡易的に履歴を取る運用を現在行っています。

具体的には、プログラムのソースコードがあるGitリポジトリのmasterブランチからデータ保存用のdataブランチを作り、そのブランチではSlackからエクスポートしたJSONを保存し続けていきます。dataブランチからmdブランチを作りJSONをMarkdownに変換して保存します。dataブランチが伸びたら、mdブランチでdataブランチをマージして変換しなおしてコミットします。Gitのコミットグラフで図示すると以下のようになります。

```text
 * [md] Convert 2016-12-02
 * Merge branch 'data' into md
/|
*| [data] Export 2016-12-02
|* Convert 2016-12-01
|/
* Export 2016-12-01
* [master] Foo
```

こうするとJSONで何が変わったのかがわかりやすいです。

## React版

Goで作った変換プログラムと同時期に[React版のプログラム](https://github.com/ohtake/react-slack-exported)も別に作っていました。これはエクスポートされたJSONそのままでクライアント側でReactノードに変換して表示させます。Reactで任意のHTML要素を作れるためMarkdownに変換するGo版よりも見た目は良くはありますが、Markdownに一括変換されていたほうが使い勝手が良いので、React版はチャネル内の発言数を[GitHubの草みたいに表示させたい](http://patientslikeme.github.io/react-calendar-heatmap/)時にしか使っていません。

## API Terms of Serviceについて

[Slack API Terms of Service](https://slack.com/terms-of-service/api)の "6. Storage of Data" には以下のことが書かれておりデータの保存を禁止しています。

> **6.5 No Other Storing.** You may not copy or store any Data or capture or store any information expressed by the Data (such as hashed or transferred data), except to the extent permitted by this API TOS.

しかしこれは "6.3 Delete at User Request" のようにOAuthで他人のデータを使う場合の話だという認識で、データのエクスポートには関係がないと判断しています。
[Excel] 数値 => 文字列の0埋め(整数の上位桁、小数点以下の桁の設定）

ちょくちょく使うけどもすぐ忘れるのでメモ。
`TEXT(値,表示形式)` を使用する。

# 使用例

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/a034006a-38b6-af06-26bc-1e1d8852d0e3.png)

出来ること

+ 整数の上位桁の０埋め表示
+ 小数点以下の０埋め表示
+ 小数点以下の桁数の制限(例では小数点以下9桁=>2桁)
+ 他の文字列と組み合わせる

セルの書式設定でもできるけれども、こっちだと文章への埋め込みができるので地味に便利。
RecyclerViewのスクロール位置を保存したい

# RecyclerView

[公式ドキュメント - RecyclerView](https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html)

「Viewの再利用部分だけなんとかするから、その他は自分で実装してね」…って感じのコンポーネント。
普通のListView/GridViewで作ってもいいんですけど、個人的にはこちらが好きです。

# どう書くの？

※LinearLayoutManagerの場合
（GridLayoutManager、StaggeredGridLayoutManagerの場合は、機会があれば調べてみます）

## スクロール位置の保存

```Java
positionIndex = mLinearLayoutManager.findFirstVisibleItemPosition();

View startView = mRecyclerView.getChildAt(0);

positionOffset = (startView == null) ? 0 : (startView.getTop() - mRecyclerView.getPaddingTop());
```

## 保存した位置にスクロールさせる

```Java
mLinearLayoutManager.scrollToPositionWithOffset(positionIndex, positionOffset);
```
jupyter notebook を日本語入りの pdf に変換したい

こちらの記事の焼き直しなんですけど、
http://qiita.com/tttamaki/items/58ab3250202d2c17e233

いろいろハマったのでメモ代わりに。

```bash:ipynb2pdfja.sh
#!/bin/bash

set -eu

tmpdir=$(mktemp -d)
ln -s `pwd`/$1 $tmpdir/
cd $tmpdir

cat <<EOD > jsarticle.tplx
% Default to the notebook output style
((* if not cell_style is defined *))
    ((* set cell_style = 'style_ipython.tplx' *))
((* endif *))

% Inherit from the specified cell style.
((* extends cell_style *))

%===============================================================================
% Latex Article
%===============================================================================

((* block docclass *))
\documentclass[a4paper,dvipdfmx]{jsarticle}
((* endblock docclass *))
EOD

FILENAME=$(basename $1 .ipynb)
jupyter nbconvert --to latex --template jsarticle.tplx $1
extractbb ${FILENAME}_files/*.png
platex ${FILENAME}.tex
dvipdfmx ${FILENAME}.dvi

cd -
cp $tmpdir/${FILENAME}.pdf .
```

```bash:usage
$ ./ipynb2pdf.sh foo.ipynb
```
ユーザー・ライブラリーでDerbyをまとめてしまおう

Eclipseの利用に於いて、外部から持ち込むことになるjarファイルを、そのまま組み込んでも構いませんが、ユーザー・ライブラリーにすることにより、必要なファイルをまとめてビルド・パスに組み込んだり、外したりすることができてうれしくなるので、この方法も覚えておきましょう。

# ユーザー・ライブラリーの新規作成

いくつかのパスがありますが、設定画面から出すのが混乱しにくいでしょう。設定ウィンドウから "Java" → "ビルド・パス" → "ユーザー・ライブラリー" の順で展開してください。

![Java→ビルド・パス→ユーザー・ライブラリー](https://qiita-image-store.s3.amazonaws.com/0/146518/b8d9296c-f1b2-46c5-db7b-5ae580ef3123.png)

上記画像ではすでに入っていますが、なければ空っぽです。
「新規」ボタンを使って適当な名称を作ります。ここではわかりやすく "derby" としておくといいでしょう。

# ライブラリーにjarを追加しよう

実際にjarファイルをライブラリーに入れるには、「外部JARの追加」ボタンを押してから、該当するファイルを選んで加えてあげてください。
Ctrlキーなどを併用すれば複数ファイルを選択できるので楽でしょう。

Derbyの開発においては、以下の3つがあれば多分大丈夫。

- derby.jar
- derbyclient.jar
- derbyLocale_ja_JP.jar ※メッセージの日本語化用、不要なら入れなくていいです

![derby-jars.png](https://qiita-image-store.s3.amazonaws.com/0/146518/e94ba338-cc07-df99-c540-50a1caf91692.png)

どこにjarファイルあるの? という声もあるのでヒントになりそうなものをいくつか。

- もし環境変数`JAVA_HOME`が定義されていれば、その下にあります(`JAVA_HOME`の値→db→lib)
- 自分でDerbyのバイナリをダウンロードして展開していれば、そこを見に行きましょう

無事追加できれば、一覧にぶら下がって出力されています(適宜展開する必要があるかも)。

![derby-libed.png](https://qiita-image-store.s3.amazonaws.com/0/146518/e893a3c1-92d3-4c10-f707-2b38dcd4b776.png)

以上でライブラリーの作成は完了です。OKボタンなどで閉じていきましょう。

# おまけ

Eclipseのプロジェクトに於いて、ライブラリーはその名前が記録されています。
そのため、ライブラリーに含まれる外部JARファイルのパスが入るわけではないため、**抽象化**されてることになります。
つまり、グループ開発に於いて、外部JARファイルの実体がどこにあるかは関係ありません。だから各自の置き場の中を指しているユーザー・ライブラリーを用意すれば利用可能ということを示しています。
CとC++の構造体の違い

これは [初心者C++ Advent Calendar 2016](http://www.adventar.org/calendars/1691) 12日目の記事です。
大遅刻してごめんなさい :bow:

## Cの構造体
Cの構造体は、いくつかの変数をまとめて扱えるようにしたものです。
若干タプルに近いような気がする。

```c
struct Point
{
    double x;
    double y;
};
```

`struct` まで含めて1つの型として扱われるので、型名は `struct Point` と書かないとコンパイルエラーになります。ただ `Point` と書きたかったら、適当に `typedef` するのがいいんじゃないでしょうか。

使用する際は変数宣言の後に各メンバに代入するか、宣言時に `{}` でくくって初期化するのが一般的だと思います。
下記の2つのコードはどちらも同様の処理をしますが、前者は宣言時のメンバが不定値なので気をつけてください。

```c
struct Point p;
p.x = 1.5;
p.y = 2.4;
```
```c
struct Point p = {1.5, 2.4};
```

## C++の構造体
C++の構造体は、**メンバがデフォルトでpublicなクラス**です。メンバ関数が使え、アクセス指定もできます。

```cpp
struct Point
{
    double x;
    double y;

    Point(double x, double y) : x(x), y(y){}
    double r(){ return sqrt(x * x + y * y); }
    double theta(){ return atan2(y, x); }
};
```

コンストラクタだけだとちょっと寂しい気がしたので、極座標に変換できるようにしてみました。
Cと違って `struct` をつけなくても変数宣言ができ、コンストラクタで初期化ができます。

`{}`での初期化も健在です。

```cpp
Point p(1.5, 2.4);
```
```cpp
Point p = {1.5, 2.4};
```
試してみたところ、`{}`での初期化はコンストラクタをそのまま呼び出しているように見えます。
実際にどうなっているか調べたらまた追記します。

```cpp
struct hoge
{
    int x;

    hoge(int x) : x(x){ cout << "hoge constructor" << endl; }
};
```
```cpp
hoge h1(10); // "hoge constructor"
hoge h2 = {20}; // "hoge constructor"
```

ちなみに、クラスはデフォルトが `private` です。

```cpp
class Point
{
    double x;
    double y;

    Point(double x, double y) : x(x), y(y){}
    double r(){ return sqrt(x * x + y * y); }
    double theta(){ return atan2(y, x); }
};
```
```cpp
Point p(1.5, 2.4); // コンパイルエラー
```

構造体も、明示宣言することでメンバを`private`にできます。

```cpp
struct point
{
    point(double x, double y) : x(x), y(y){}

private:
    double x;
    double y;
};
```
```cpp
point p(1.5, 2.4);
cout << p.x << endl; // コンパイルエラー
```

## まとめ
- C++の構造体はデフォルトが `public` なクラス
- 型名に `struct` を入れずに宣言できる
- アクセス指定ができる
CentOS6 でデータボリュームを growpart で拡張する

# メモ

CloudStack （AWS とかも同様）でディスク容量を拡張した際の手順メモ。
/dev/sdb 10GB → 15GB にリサイズ。


# 手順

拡張前の状態

```
# df -h /dev/sdb1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1       9.8G   12M  9.3G   1% /data

# lsblk /dev/sdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  10G  0 disk
∟ sdb1   8:17   0  10G  0 part /data
```



コンソールからディスクサイズ変更(10GB → 15GB)

API でやるときは

```
$ cs resizeVolume id=10e2655a-3e89-427b-91fb-c84728d4xxxx size=15
```


growpart インストール

```
# yum install cloud-utils-growpart
```



デバイス ID 確認

```
# lsscsi
[0:0:0:0]    cd/dvd  NECVMWar VMware IDE CDR00 1.00  /dev/sr0
[2:0:0:0]    disk    VMware   Virtual disk     1.0   /dev/sda
[2:0:1:0]    disk    VMware   Virtual disk     1.0   /dev/sdb
```

リスキャン

```
# echo 1 > /sys/class/scsi_disk/2\:0\:1\:0/device/rescan
```

ディスク容量が増えてるか確認

```
# lsblk /dev/sdb
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb       8:16   0  15G  0 disk
 ∟ sdb1   8:17   0  10G  0 part /data
```

パーティション拡張

```
# growpart /dev/sdb 1
CHANGED: partition=1 start=63 old: size=20964762 end=20964825 new: size=31455207,end=31455270
```

再起動

```
# shutdown -r now
```

ファイルシステム確認

```
# df -h /dev/sdb1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1       9.8G   12M  9.3G   1% /data
```

ファイルシステム拡張

```
# resize2fs /dev/sdb1
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/sdb1 is mounted on /data; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/sdb1 to 3931900 (4k) blocks.
The filesystem on /dev/sdb1 is now 3931900 blocks long.
```

確認

```
# lsblk /dev/sdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  15G  0 disk
 ∟sdb1   8:17   0  15G  0 part /data

# df -h /dev/sdb1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1        15G   13M   14G   1% /data
```

OK
xcodeが「linker command failed with exit code 1」とか出してつらい

# 概要

cocoapodsをいじっていたら、xcodeが `「linker command failed with exit code 1」` とエラーを出してきた。
cocoapodsで読み込んだライブラリも何かおかしい（importできなかったりする）
でもよくわからない。つらい。

# 解決

pod関連のファイル消してinstallし直したら解決しました。

1. プロジェクトのPodsフォルダを消す
  Pods -> 右クリック -> Delete -> Move to Trash
  ![e566edf9729d796361bcf86fc1b20f59.png](https://qiita-image-store.s3.amazonaws.com/0/97259/d6e911d7-814d-3001-8e80-8d0eb9c6f4ad.png)


1. Podfile.lockを消す
  こいつが残っているとinstallし直しても同じ状態に戻される

1. プロジェクトの `.xcworkspace`ファイル(`pod install`で作られるファイル)を消す

1. `pod install` を実行

1. 動いたー

# その他

- プロジェクトで`Build Active Architecture Only` をいじっていたらそこら辺も調べたほうがいいかも   
  -> [cocoapodsを導入したプロジェクトでアーキテクチャ周りのビルドエラーになる時](http://qiita.com/yimajo/items/df7264d7dcc78a57a75d) 

# 参考
- [Pod installとPod updateの違い](http://llcc.hatenablog.com/entry/2015/09/17/233936)
カスタムメトリクスとタグの関係について

**Datadogの優れている機能の1つは、カスタムメトリクスを簡単に収集することができる仕組みを持っていることです。**

Datadogのagentには、dogstatsdと呼ばれるEtsyが公開しているstatsdのpythonを同梱している他、API経由でカスタムメトリクスを送信するための多種に渡るラッパーライブラリーも準備しています。

この優れた機能を有効に使い切るには、一つだけ注意することがあります。Datadogは、SaaSとして監視サービスを提供しているため、ユーザーが送信できるカスタムメトリクスに制限を掛けています。大量のカスタムメトリクスを一期に送信されてしまうと、他のユーザーと共有しているリソースを一期に消費してしまい、他のユーザーのサービス品質を保持できなくなることがあるからです。現状この制限は、ソフトリミットという形で運営されており、常識の範囲を超えてDataを受信しない限りlockがかかることは無いです。

しかしながら、Datadogの特性を理解した腕の良いエンジニアが、ステップアップした使い方をしようとするときに起こすミスでもあります。(実際にlockがかかることがあります。)

そのような、事態に遭遇しないために、今回のadvent calendarでカスタムメトリクスの計算方法を説明したいと思います。そうすることにより、カスタムメトリクスを選択したり、そのカスタムメトリクスに付与するtagの設計をする際の参考にしてください。

## 基本的な考え方

`監視対象台数` X `100` = アカウントに対して送信可能な`カスタムメトリクス名の総数`

上記の計算式が、基本の`メトリクス名`数としての制限値となります。

![総カスタムメトリクス数](https://help.datadoghq.com/hc/en-us/article_attachments/202988149/Custom_Metrics_300.jpg)

図の様に総数に含まれるカスタムメトリクスの内訳は、自由に分散することができます。

僕の経験では、メトリクスの命名の規則をミスってアカウントにlockがかかったユーザーは未だ見たことがありません。


## `メトリクス名`数が制限値以内でもtagの組み合わせでDatadogの制限に掛かるケース

Datadogでは、上記をクリアしていても、各メトリクスに対して`1000`以内のtagの組み合わせ(ユニーク性)の制限を課しています。

`アカウントに対して送信可能なメトリクス名の総数` x `1000` = `アカウントに対して送信可能なユニークメトリクスの総数`

上記の式が、ユニーク性を考慮した制限値となります。

過去の僕の経験からいうと、このユニーク性の部分でDatadogのアカウントがlockになるユーザーが大半です。大抵のケースは、ユーザーiｄや広告枠のid、時間、何かのシリアル番号など、無限に増えていく要素をタグに組み込んでしまうミスが多いです。無限に増殖するtagの発生頻度にもよりますが、下記に示すように複数のtagに無限増殖する値が入る場合、それらを全て個別の組み合わせを持ったメトリクスデーターをグループとして処理し蓄積していくようにバックエンドが設計されているため、累乗でグループが増殖していくことになります。

従って、下記のユニークメトリクスのケースを理解し、必要がないユニーク性は発生しないようにする方法を検討する必要があります。

例題 :
metric name: `auth.exceptionCount`
tags: "method:X", "method:Y", "exception:A", "exception:B"

個別のtagの組み合わせとしてカウントされるケース: (ユニークメトリクスなケース)
`auth.exceptionCount` with tag “method:X”
`auth.exceptionCount` with tag “method:Y”
`auth.exceptionCount` with tags “method:X” and “exception:A” //unique because of new tag “exception:A”
`auth.exceptionCount` with tags “method:X” and “exception:B”
`auth.exceptionCount` with tags “method:Y” and “exception:A”
`auth.exceptionCount` with tags “method:Y” and “exception:B”

同一のtagの組あわせとしてカウントされるケース: (ユニークメトリクスではないケース)
`auth.exceptionCount` with tags “method:X” and “exception:A”
`auth.exceptionCount` with tags “exception:A” and “method:X”

## まとめ
先にも書きましたが、あくまでもソフトリミットなので、上記に書いたことを理解してカスタムメトリクスを送信していれば、多少オーバーしてもlockがかかることはありません。
安心してカスタムメトリクスを送信してください。更に、カスタムメトリクスは、Lambdaからでも、又それ以外のソース(IoTソース)からでもカスタムメトリクスを送信することができます。Datadogの良いところをこういったカスタムメトリクスも同一ダッシュボード上に表示できたり、60インチの巨大TVスクリーンに表示できるようなダッシュボードを簡単に作れるところだと思います。

色々なカスタムメトリクスを、思う存分送り込んで、ダッシュボードを作ってみてください。
Elixir コードもレビューできる Ebert の紹介

Elixir コードもレビューしてくれるサービス [Ebert](https://ebertapp.io/) が Plataformatec から以前にリリースされていたので、そちらを紹介します。
GitHub の公開リポジトリであれば無料で使えるとのことで早速使ってみました。

[<img width="1034" alt="ebertapp.png" src="https://qiita-image-store.s3.amazonaws.com/0/17636/622d9399-1db5-0dc1-315e-5be727876729.png">](https://ebertapp.io)

## 概要

タイトル通り Elixir コードもレビューしてくれるサービスです。
対応言語は最初 Elixir だけかと思っていましたが、実は[結構いろいろとサポート](https://ebertapp.io/docs/engines)しているようです。

Elixir については [Credo](https://github.com/rrrene/credo) を使ってレビューしてくれます。

レビュータイミングは日ごとと Pull Request が来た時です。

レビュー結果の例として ecto のリポジトリで試した結果があるので参考になります。

https://ebertapp.io/github/elixir-ecto/ecto

## 設定方法

add a new repository から画面上の指示に従って作ることができます。

GitHub 認証でアカウントを作った後、連携のための GitHub アカウントの OAuth2 トークンが必要になります。

トークン作る時にトークンのスコープとして repo 及び write:repo_hook が必要なのでチェックをつけて作成します。

![create token](https://qiita-image-store.s3.amazonaws.com/0/17636/abd8d945-5ec6-0e98-223b-73f8f66f967c.png)

最後にレビューしたいリポジトリを選択して完了です。

試しに power_assert_ex のリポジトリを選択し、しばらく待っていたら7つくらい指摘されたようです。

![result of code review.png](https://qiita-image-store.s3.amazonaws.com/0/17636/18f448d2-040c-f07e-e33f-c205676b0720.png)


## 設定ファイル

このままでも特に困らなかったですが、必要な方には設定も用意してあり、それを行うには `.ebert.yml` をプロジェクトのディレクトリ直下に置きます。

これを置くことでレビューに使用するエンジンを切り替えたり、特定のパスを除外したりできるようです。詳しくは[公式のドキュメント](https://ebertapp.io/docs/config)を見てください。

試しに追加した際の pull request はこちらです。デフォルト設定のままなので特に何も変化はないです。
https://github.com/ma2gedev/power_assert_ex/pull/5


## 所感

Credo が出てリポジトリに組み込みたいなーと思っていたものの時間取れずだったところに、Ebert と Advent Calendar が来てちょうど良かった。
指摘もらったところ直さないと。


## Resources

- Ebert
  - https://ebertapp.io/
- Ebert の設定
  - https://ebertapp.io/docs/config
- Ebert の対応 Engine
  - https://ebertapp.io/docs/engines
- Credo
  - https://github.com/rrrene/credo
SassでRGB->HSLに変換してみる

何かと計算しやすい[HSL](http://cweb.canon.jp/camera/picturestyle/editor/matters05.html)を扱いたい、でも色はRGBで管理してる、というわけでコンバーターを作ってみた。
RGB->HSLの変換式は下記を参照。

- [HLS色空間](https://ja.wikipedia.org/wiki/HLS%E8%89%B2%E7%A9%BA%E9%96%93) - Wikipedia
- [RGBとHSLの相互変換ツールと変換計算式](http://www.peko-step.com/tool/hslrgb.html) - PEKO-STEP

Wikipediaは最小値基準の式で少し分かりにくい。
最大値で解説してるサイトが多かった印象。



```scss
@function RGBtoHSL($color){
  //rgbを分解し
  $r: red($color);
  $g: green($color);
  $b: blue($color);
  
  //最大値と最小値を探す
  $max: max($r, $g, $b);
  $min: min($r, $g, $b);
  
  $h: 0; 
  $s: 0;
  $l: ($max + $min) / 2;//輝度L

  @if($max == $min) {
    //最大と最小が同じ（=rgb３つとも同じ値）なら色相・彩度は0
    $h: 0;
    $s: 0;
  }
  @else {

    //色相H(度): 赤・緑・青がそれぞれ最大の場合の色相
    @if($max == $r){ $h : 60 * (($g - $b) / ($max - $min))}
    @if($max == $g){ $h : 60 * (($b - $r) / ($max - $min)) + 120}
    @if($max == $b){ $h : 60 * (($r - $g) / ($max - $min)) + 240}
    
    //彩度S(%)
    @if($l < 127){
      //収束値が127以下の時の彩度
      $s: ($max - $min) / ($max + $min);
    }
    @else {
      //収束値が128以上の時の彩度
      $s: ($max - $min) / (510 - $max - $min); 
    }
  }
  
  // 色相がマイナス値になってたら360足して0-360の範囲にする
  @if($h < 0){
    $h: $h + 360;
  }
  
  @return $h, $s * 100, $l / 255 * 100;
}

//ex) RGBtoHSL(#d24678);
// -> 338.57142857, 60.86956522, 54.90196078
// 小数点第２位以下は丸めても良いかも。
```

# 感想

- 誰得と聞かれると私得。某案件でcolorhexaを使って手作業でrgb->hsl変換するの大変だった。
- JSでやろうとする場合、すでに[TinyColor](https://github.com/bgrins/TinyColor)などの洗練されたライブラリがある。
- `sin()`や`cos()`も欲しい…。
最低限押さえておきたい EXPLAIN の見かた

## <i class="fa fa-check-square-o" style="font-size:1em;"></i> EXPLAIN とは

SELECT 文の前に記載して実行することで、その SELECT 文のデータへのアクセス方法を知ることができます。
SELECT 文の実行に時間がかかっている場合や、index を張ったが意図通りに使用されているのかの確認などに使うことができます。
ただ、EXPLAIN の結果は見方が難しいため、少しまとめてみます。

```
MySQL> EXPLAIN SELECT * FROM hoge;
```

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> select_type

単一の表を参照する場合には `SELECT` になる。UNION を使用すると、`PRIMARY`, `UNION`, 'UNION RESULT' などが現れる。

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> type

type はレコードアクセスタイプとも呼ばれ、そのテーブルにどのようにアクセスするのかを表しています。
実行速度が遅い場合は、ここを見ることで原因が分かる場合があります。

### <i class="fa fa-list" style="font-size:1em;"></i> type の種類
- const
  - PK や UNIQUE インデックスの等価検索時のタイプ
  - 問題なし
- ref
  - UNIQUE 出ないインデックス使用検索時
  - 大抵問題なし
  - セカンダリインデックスを禁止していたら問題あり
- range
  - Index を用いた範囲検索時
  - ちょっと注意
- index
  - index 内のフルスキャン
  - かなり注意
  - 場合によってはダメ
- ALL
  - 全表操作
  - すごく小さいことが保証されるテーブルの参照以外は改善が必要

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> key

key には `PRIMARY KEY` かセカンダリインデックス名が入っているべきであり、もしセカンダリインデックスを禁止しているとすると、PRIMARY KEY 以外入ってはならない

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> possible_keys

使うことのできる key の候補。ここから一番効率がいいと思われる key が選択される。

### <i class="fa fa-info-circle" style="font-size:1em;"></i> ヒント句

SELECT 文に key に対するヒント句を付与することで、使ってほしい key を指定することができる。([インデックスヒントの構文](https://dev.mysql.com/doc/refman/5.6/ja/index-hints.html))

```
SELECT * FROM t1 USE INDEX (i1);
SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a;
```

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> Extra

付帯情報であるが、かなり大事な項目。

### <i class="fa fa-list" style="font-size:1em;"></i> Extra の内容

- Using where
  - 頻繁に出力される追加情報で、あまり気にする必要はない
- Using index
  - クエリがインデックスだけを用いて解決できることを示す
  - Covering Index を使用している場合などに表示される
  - Using index が Extra に表示されるようにインデックスを貼るのが一つの目標
- Using index condition
  - クエリがインデックスの値を一部利用できることを示す
- Using filesort
  - filesort(クイックソート) でソートを行っていることを示す
  - これが出ている場合は、インデックスをうまく使ってソートをしなくてすむ設計にできないかを考える
functionのインデント

F#では関数を引数レベルでパターンマッチする `function` というキーワードがあります。このインデントについて気付いたことのメモです。

`function` は `match` のポイントフリースタイル版のような印象を持っていました。

```fsharp:F#
let foo1 = function
| 0 -> "!"
| _ -> "?"

let foo2 x = match x with
             | 0 -> "!"
             | _ -> "?"

printfn "%A" (foo1 0, foo2 0)
printfn "%A" (foo1 1, foo2 1)
```
```text:実行結果
("!", "!")
("?", "?")
```

しかし引数を暗黙化するだけでなく、インデントも異なります。`function` は `let` と同じレベルで書くことが許されますが、`match` は `=` の右辺として扱われます。

これがどういう気持ちなのかずっと分からなかったのですが、Haskellのパターンマッチと似た気持ちなのではないかと気付きました。

```haskell:Haskell
foo1 0 = "!"
foo1 _ = "?"

foo2 x = case x of
         0 -> "!"
         _ -> "?"

main = do
    print (foo1 0, foo2 0)
    print (foo1 1, foo2 1)
```
```text:実行結果
("!","!")
("?","?")
```

Haskellでは形式的に関数自体を複数書くようなスタイルで引数をパターンマッチしますが、これと同じようにF#でも関数レベルで引数を分けているという気持ちでインデントが許されているのではないか、ということです。