OmniAICreator/Qiita-1.07M huggingface dataset:
UITableViewで底辺（Bottom）から描画を開始する方法

#やりたいこと
UITableViewにおいて上辺ではなく、底辺から描画を開始する方法

#解決法
[tableView setContentOffset:CGPointMake(0, CGFLOAT_MAX)];

（追記）
iOS9の場合、CGFLOAT_MAX だとTableViewのヘッダのレイアウトが崩れてしまうバグがあるようです。。
以下のように十分に大きな数値を指定すれば問題ないようです。。
[tableView setContentOffset:CGPointMake(0, 10000000)]


#参考文献
- [Start UITableView from the bottom](https://stackoverflow.com/questions/27763795/start-uitableview-from-the-bottom)
Cassandra Version 推奨

#Cassandra Version

###0系
0.6 - 2010年4月  ---  0.6.13 - 2011年4月
0.7 - 2011年1月  ---  0.7.10 - 2013年8月
0.8 - 2011年6月  ---  0.8.10 - 2013年8月


###1系
1.0 - 2011年10月  ---  1.0.12 - 2013年8月
1.1 - 2012年4月  ---  1.1.12 - 2013年8月
1.2 - 2013年1月  ---  1.2.19 - 2014年11月

##2系
2.0 - 2013年9月  ---  2.0.17 - 2015年10月
**2.1 - 2014年9月  ---  2.1.18 - 2017年6月**
2.2 - 2015年5月  ---  2.2.10 - 2017年6月


##3系
3.0 - 2015月11月  ---  3.0.14 - 2017年6月

#チクタクリリース
**偶数バージョン：新規系 ( 開発 )**
**奇数バージョン：バグフィックス**

3系チクタクリリースを使用する場合は
**奇数系 推奨**

3.1 - 2015月12月  ---  3.1.1 - 2016年1月
3.2 - 2016月1月  ---  3.2.1 - 2016年1月
3.3 - 2016月2月
3.4 - 2016月3月
3.5 -  2016月4月
3.6 - 2016月6月
3.7 - 2016月6月
3.8 - 2016月9月
3.9 - 2016月9月
3.10 - 2017月2月
**3.11 - 2017年6月**

#推奨version
2017年8月現在
**3.11.0**
Cassandraとは

# Cassandraとは

Amazon Dynamoの分散ハッシュテーブル（DHT）と
Google Big TableのKVSの
２つの特徴を併せ持つビッグデータ用分散データベース

## 特徴

・オープンソース
・単一障害点(SPOF)がない
・高速パフォーマンス
・リニアなスケーラビリティ性能
・継続的可用性
・すべてがアクティブな設計
・透過的にエラーを検出、回復
・柔軟なNoSQLデータモデル
・シンプルな運用管理
・様々な無償ツールとドライバ/コネクトをもつ
・データの整合性を選択可能（CAP定理・BASE）
・マルチデータセンター レプリケーション
・CQL (Cassandra Query Language)




#詳細
**単一障害点 ( SPOF ) がない**
　　Cassandraはマスターという概念がありません。
　　全てのノードが完全に同じ機能を持っているため、
　　ノードが故障しても同じデータを持っている他のノードが
　　同じ作業を、全く問題なく処理することが可能です。
 

**高速パフォーマンス**
　　マスターレスであり、すべてがアクティブな設計のため、
　　すべてのノードが読み書き可能です。
　　よって
　　多数のクライアントからの
　　同時書き込み・読み込みが可能です。


**リニアなスケーラビリティ性能**
　　マスターレスな設計のため、
　　運用がシンプルでスケールアウトが容易に行えます。
　　ダウンタイムなくノードを追加することができます。
　　ノードを増やすことによりデータが分散され、
　　1ノードの持つデータ量が減るため
　　パフォーマンスの向上が予測可能になります。


**柔軟なNoSQLデータモデル** 
　　最新のデータタイプに対応し、高速に読み書き可能です。
　　

**データの整合性を選択可能**
　　広く分散されたクラスタに渡り、
　　ポリシーによってデータの整合性を調整することが可能です。
　　
　　
**CQL (Cassandra Query Language)**
　　SQLに似た言語を備えているため、
　　リレーショナルデータベースから非常に容易に移ることができます。


#参照
　　**Apache Cassandra**
　　　　http://cassandra.apache.org/

　　**Apache Cassandra (source code)**
　　　　https://github.com/apache/cassandra

　　**DataStax Document (DataStax,inc)**
　　　　http://docs.datastax.com

　　**Cassandra コミュニティー**
　　　　http://cassandra-jp.com/

　　**Cassandra サポート (株式会社INTHEFOREST)**
　　　　https://www.intheforest.co.jp/
ターミナルでよく使うコマンドは短くしてみよっか。

# ターミナルで使用しているコマンドを"Self rule(自分仕様)"に短くして使う方法
タイトル通り。
macで毎回使うコマンドを自分用のコマンドに変更して使うことが前提。
**※注意:この方法では、引数の削減できません。あしからず。**

## 環境確認&構築
```shell
$ which { 使用しているコマンド }
# 新しいコマンドは、すでに使用されていないかを事前にターミナル上で打って、確認
$ ln -s { source } { 新しいコマンド }
```

#### 使用例
今回は、よく使うDockerコマンドを短く`docker `→` dk`に変更する例。

```shell:使用例
$ dk
-bash: dk: command not found
$ which docker
$ cd { whichで表示されたbin階層へ移動 }
$ ln -s docker dk
```

### シンボリックの活用例
今回使用した技術は、シンボリックというものを活用した設定となります。
毎回、dockerと入力するのが面倒だったので、短くdkとしました。

### コメントからの情報を元に追記しました[2021/04/16]

コメントから推測するに...`.bashrc`と言うファイルに、
`alias`を貼ることで、解決するとのことで、実際に試してみました。
次のようにやれば可能になります。

[@tagawa0525 さん、コメントありがとうございます](https://qiita.com/jack-low/items/7c7cc78eea6f9236c2ba#comment-b9ac14d05023c4203e10)

```shell:aliasを張るバージョン
$ cp -p .bashrc .bashrc.b # 失敗時のバックアップ
$ echo "alias dk='docker'" >> ~/.bashrc # 書き込み
$ . ~/.bashrc # 再読込み
```
ちょっとずつ読むドメイン駆動設計 まえがき4

# 設計とプロセス
> 設計とプロセスは切り離せない。(まえがき　より）

これまでのまえがきの話しは以下のような流れでした。

- 設計と実装は切り離せない。
- 役割も設計と実装を切り離せない。

ということで、『設計とプロセス』も切り離せないという流れはごく自然な話しだと思います。

そして、ドメイン駆動設計は以下のプラクティスがチームに定着していることを前提としています。

- 開発がイテレーティブ・・・モデルを進化させていくのに必要
- 開発者とドメインエキスパートが密接に関わっている・・・コミニュケーションが必要

言うまでもなく、イテレーティブでコミニュケーションを重視する『アジャイル』が合っているということになりますね。

設計と実装と役割とプロセスは切り離さないで考える。
HomeBrew Gitアップグレード (CVE-2017-1000117対応したい人)

#Gitの脆弱性 ( CVE-2017-1000117 )

##HomeBrewアップデート

```bash:terminal
$ brew update
```

##Gitのアップグレード(HomeBrewで既にGitを使用している人)

```bash:terminal
$ brew upgrade git
```

##Gitのインストール(HomeBrewでGitを使用していない人)

```bash:terminal
$ brew install git
$ export PATH="/usr/local/Cellar/git/2.14.1/bin:$PATH"
```
over-aligned newとGCC7の警告

# はじめに

これまでGCC6で警告を出さなかったコードがGCC7で警告を出した。調べてみるとover-aligned newの問題だった。関連する日本語の記事が少ないように感じたので簡単にまとめておく。

# 概要

以下のようなソースを考える。

```cpp:test.cpp
#include <iostream>
const int ALIGN=128;
class Hoge{
  public:
    alignas(ALIGN) double d[10];
};

alignas(ALIGN) double f[10];

int
main(void){
  std::cout << long(&f) % ALIGN << std::endl;
  Hoge h1;
  std::cout << long(&(h1.d)) % ALIGN << std::endl;
  Hoge *h2 = new Hoge();
  std::cout << long(&(h2->d)) % ALIGN << std::endl;
  delete h2;
}
```

`double f[10]`や`double Hoge::d[10]`は128バイトアラインされていることが期待されている。しかし、このコードでは、`new`した時にはアラインが保証されない。

```shell-session
$ g++ -std=c++11  test.cpp; ./a.out   
0
0
48

$ clang++ -std=c++11  test.cpp; ./a.out
0
0
48
```

最後の一個だけアラインメントがおかしいことがわかる。

# GCC7での警告とオプション

GCC7では、このようなover-alignedでnewする場合においても正しくアラインされるオプションが追加された。それに伴い、`-Waligned-new`という警告が追加され、`-Wall`に入った。これで、`-Wall`をつけてコンパイルすると、以下のように「意図しないアラインになっているよ」と警告される。

```shell-session
$ g++ -std=c++11 -Wall test.cpp
test.cpp:15:23: warning: 'new' of type 'Hoge' with extended alignment 64 [-Waligned-new=]
   Hoge *h2 = new Hoge();
                       ^
test.cpp:15:23: note: uses 'void* operator new(std::size_t)', which does not have an alignment parameter
test.cpp:15:23: note: use '-faligned-new' to enable C++17 over-aligned new support
```

ここで教えられたとおり`-faligned-new`をつけるか、`-std=c++1z`オプションをつけると、所望のアラインメントになる。

```shell-session
$ g++ -std=c++11 -faligned-new -Wall test.cpp;./a.out
0
0
0

$ g++ -std=c++1z -Wall test.cpp;./a.out
0
0
0
```

現時点ではclang++はまだ対応していない模様。

```shell-session
$ clang++ -std=c++1z -Wall test.cpp;./a.out
0
0
48
```
# まとめ

* GCC6+`-Wall`で警告出さなかったコードが、GCC7+`-Wall`で`[-Waligned-new=]`がどうこうという警告が出たら、それはover-aligned newの問題
* GCC7では`-std=c++1z`もしくは`-faligned-new`をつけると所望のアラインメントになる。
* っていうかGCC7でこの警告が出るってことは、これまでアラインメント間違えたままコードを使っていたということに・・・

# 参考

* [光成さんの日記(2017年3月14日)](http://herumi.in.coocan.jp/diary/1703.html#14)
* [C++17つまみぐい](http://qiita.com/kazatsuyu/items/b9bde80d79d0cb26be7d)
* [GCC7のリリースノート](https://gcc.gnu.org/gcc-7/changes.html)
Laravel 5.4をインストールする(composer)

## 概要
Laravel5.4のインストール方法を忘れないようまとめておく。

## Composerをインストールする

* 新規登録する場合

```
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer
$ composer --version
```

* 既にインストール済みの場合

```
$ composer self-update
$ composer --version
```

## Laravel5.4をインストール

現在のフォルダにインストールする。

```
$ composer create-project --prefer-dist laravel/laravel .
```

※ Packagistに登録されている「laravel/laravel」を利用する。
　https://packagist.org/packages/laravel/laravel

## 日本語化

言語ファイルを追加し、設定ファイルなどを翻訳するパッケージ「comja5」をインストール
( https://github.com/laravel-ja/comja5 )

```
$ composer require laravel-ja/comja5:~1
```

以上

## 参考サイト

- [Laravel Installation](https://laravel.com/docs/5.4/installation#installation)
- [Laravel インストール](https://readouble.com/laravel/5.4/ja/installation.html)
ROSでロボットの重心を推定する

ロボットの要素の中で大きなウエイトを占めるものに制御系があると思います。
制御系を設計するにあたり大切なものの一つに重心推定があると思います。
今回ロボットの制御系を勉強したいと思い、まずはROSでロボットの重心を推定するパッケージを自作してみました。
ソースコードはこちら
https://github.com/hakuturu583/robot_kinetics_pkgs
で公開しています。
基本的には[前回の記事](http://qiita.com/hakuturu583/items/c62daf0292d560141e4f)でまとめたコードをベースに開発しました。
このパッケージの動作する仕組み以下のようになっています。

```cpp:cog_publisher_node.cpp
//headers in this package
#include <cog_publisher.h>

//headers for ROS
#include <ros/ros.h>

int main(int argc, char *argv[])
{
  // ROSノードとして初期化
  ros::init(argc, argv, "com_publisher");
  // cog_publisherクラスのコンストラクタ内で/robot_descriptionパラメータを取得、各リンクの重心、質量を入手
  cog_publisher center_of_gravity_publisher = cog_publisher();
  // /publish_rateパラメータを取得、重心位置のpublishレートを決定
  ros::Rate rate(center_of_gravity_publisher.get_publish_rate());
  // rosが機能している間以下の処理を繰り返す
  while(ros::ok())
  {
    // /tfトピックより/base_linkフレームから見た各リンクの重心位置を計算
    // 各リンクの重心位置と質量を合成してロボット全体の重心を推定
    // /cog/linksトピックで各リンクの重心をsensor_msgs/PointCloud形式でpublish
    // /cog/robotトピックでロボット全体の重心をgeometry_msgs/PointStamped形式でpublish
    center_of_gravity_publisher.publish();
    // /publish_rateパラメータに合わせてデータを出力するようにsleep
    rate.sleep();
  }
  return 0;
}
```

#動作テスト

ピンク色の点が重心を表しています。
今回は実機ではなくgazeboでシミュレーションを行ってみました。
まずは初期姿勢から
![Screenshot from 2017-08-17 15:55:10.png](https://qiita-image-store.s3.amazonaws.com/0/160346/3f5e9e3c-9dc8-f151-a724-04db63c159f6.png)
左腕を開いて・・
![Screenshot from 2017-08-17 15:55:49.png](https://qiita-image-store.s3.amazonaws.com/0/160346/899663b1-7eb8-f89d-e8e0-c491cf32b8aa.png)
上に上げて・・
![Screenshot from 2017-08-17 15:56:09.png](https://qiita-image-store.s3.amazonaws.com/0/160346/f85f65e0-30a6-021a-ba2a-a0aa712c1115.png)
最後に後ろへ
![Screenshot from 2017-08-17 15:56:43.png](https://qiita-image-store.s3.amazonaws.com/0/160346/2c92a5dc-1c38-8e0e-8d19-a81de1060029.png)

直感的にこんな動きするだろうなという動きしてますし、naoの実機で重心を取得（[ALMotionProxy::getCOM](http://doc.aldebaran.com/2-4/naoqi/motion/tools-general-api.html)）した時と似たような動きしてるので多分あってると思います・・・
PythonでApache Beamを触ってみる

# Python 2.7でApache Beamを触ってみる

Apache BeamはGoogleが自身のクラウドサービスDataflowの中で使っているフレームワーク。
バッチ処理もストリーミング処理も同じ書き方ができるというのが売り。
今回はPythonでミニマムなプログラムを書いて実行してみた。

## Apache Beamインストール前提

- 前提はPython 2.7。
    - Python 3系しかない人やもともとPythonを使っていない人は、Pythonの環境を用意します。
        - 私はPython 3系のconda環境だけだったので、conda installでpython2.7環境を作りました。参考：[Python2, Python3 を切り替えて jupyter notebook を使う](https://ameblo.jp/nekketsu-engineer/entry-12143280349.html)
    - Virtualenvを用いたインストール方法はBeam本家ドキュメント通り。 [Apache Beam Python SDK Quickstart](https://beam.apache.org/get-started/quickstart-py/) 
    - Google のGCPを使うならGCPドキュメント。[Python を使用したクイックスタート](https://cloud.google.com/dataflow/docs/quickstarts/quickstart-python)

## Apache Beamをインストール
  - Python 2.7の環境に入ってから下記を実行。
  - ちなみにPython 3.5だとcythonでエラーが出て終わります。
  - わたしの環境だと

```
pip install apache-beam
```

## 下記のようなプログラムを書いてみる

- Python用のプログラミングガイドを斜め読みして３個くらいソースをコピペして下記を作ってみた。
- [Apache Beam Programming Guide](https://beam.apache.org/documentation/programming-guide/#pccreate)
- 処理内容
    1. シェークスピアの４行を入力とする
    2.  各行の文字数をlen関数でカウントする
    3. 文字数を標準出力に出して終わる（本来はDBか何かに書き出して終わるが今回は割愛）

```python
import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions

# まずパイプラインを作る
p = beam.Pipeline(options=PipelineOptions())

# 1.配列をパイプラインの入力に設定（４行を入力とする）
lines = (p
       | beam.Create([
           'To be, or not to be: that is the question: ',
           'Whether \'tis nobler in the mind to suffer ',
           'The slings and arrows of outrageous fortune, ',
           'Or to take arms against a sea of troubles, ']))

# 2.変換処理として各行の文字列カウントを設定
word_lengths = lines | beam.Map(len)

# 3.最後に標準出力にカウント数を出力して終わる
class ExtractWordsFn(beam.DoFn):
  def process(self, element):
    print(element)
p_end = word_lengths | beam.ParDo(ExtractWordsFn())
p.run()
```

- Jupyterで実行した結果
    - [Gistに公開](https://gist.github.com/onelittlenightmusic/0049d766a6d11999ed8ef2747aeab704)

```
<apache_beam.runners.direct.direct_runner.DirectPipelineResult at 0x7f6b69c92950>
43
42
45
43
```

## まとめ

- かんたんではあるが一応これでPythonからApache Beamのバッチ処理が実行できた。インストールから実装、実行までだいたい１時間くらい。
- 今後ストリーミング処理を実行したい。またSpark Streamingなどをエンジンとして利用できるようなので、それも試したい。
- 上記をWindows上のBash on windows＋Jupyterから実行できてハッピーだった。

## その他参考文献
- [Apache Beam Python SDK Quickstart](https://beam.apache.org/get-started/quickstart-py/)
- [Python を使用したクイックスタート](https://cloud.google.com/dataflow/docs/quickstarts/quickstart-python)
- [Cloud Dataflow入門〜データ処理の実践](http://blog.howtelevision.co.jp/entry/2017/04/19/112056)
railsで部分的なテンプレート・パーシャルの作り方

railsで共通部分をまとめたい時、例えばfooterを共通にしたいときはパーシャルと言ってパーツ化する。

# やり方

* app/views/layouts/にファイルを作成する
* ファイル名は_から始める
* renderで呼び出す

# ファイル作成

ファイルはapp/views/layouts/に作り、名前は_からはじめる。後は小文字

# renderで呼び出す

```ruby:application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
    <%= csrf_meta_tags %>
    <%= stylesheet_link_tag    'application', media: 'all',
                               'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application',
                               'data-turbolinks-track': 'reload' %>
    <%= render 'layouts/shim' %>
  </head>
  <body>
    <%= render 'layouts/header' %>
    <div class="container">
      <%= yield %>
      <%= render 'layouts/footer' %>
    </div>
  </body>
</html>
```
AuthenticationProvider を JUnit からテストできなかった話

# 概要
Spring Boot にて Spring Security の機能を使い認証処理を実装しました。
データソースはデータベースではなく別 Web サービスにあるため、Spring Data JPA での認証が行えないため、AuthenticationProvider にて認証処理を実装しました。

# JUnit での失敗

JUnit を実行したところ、下記エラーが発生しました。

> java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test

AuthenticationProvider 実装後、アプリケーションを起動すると、 無事ページ上からの要求においては、 AuthenticationProvider が起動しました。

# 正しい方法

AuthenticationProvider をインジェクションする場合は、エラー時のメッセージにあるとおり、@ContextConfiguration が必要なようです。
@ContextConfiguration の引数には SpringBoot の起動クラスを指定します。

<pre>
@ContextConfiguration(classes = HogeApplication.class)
public class AuthencationTest {
      ... something to test ....
}
</pre>

なお、ContextConfiguration の引数に変なものを指定するとエラーになります。

> Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfig': Unsatisfied dependency expressed through field 'authenticationProvider'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.security.authentication.AuthenticationProvider' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
ArduinoのEEPROMにsrtring型文字列を格納する

以下のようにすると出来ます。

```c++:
#include <EEPROM.h>

void write_data_to_rom(String String_data) {
  byte Byte_data[30];
  String_data.getBytes(Byte_data, 30);
  int k;
  for (k = 0; k < 30 && Byte_data[k] != '\0'; k++) {
    EEPROM.write(k, Byte_data[k]);
  }
  EEPROM.write(k, '\0');
}

String read_data_from_rom(void) {
  String data_from_rom;
  for (int i = 0; i < 30 && EEPROM.read(i) != '\0' ; i++) {
    char c = EEPROM.read(i);
    data_from_rom = data_from_rom + String(c);
  }
  return data_from_rom;
}
```
[Hugo]plainify関数で<br>を消した際に改行コードが入ってしまう問題

## plainify関数とは
[plainify - 公式ドキュメント](https://gohugo.io/functions/plainify/) - 文字列からHTMLタグを削除してプレインテキストを返す関数

## 例
```
{{ "<b>BatMan</b>" | plainify }} → "BatMan"
```

このようにHTMLタグが取り除かれた状態の文字列が返ってくる

## 今回の問題

```
{{ "Bat<br>Man" | plainify }} → "Bat\nMan"
```

このように`<br>`を入れると削除ではなく\nに置換された状態で返ってくる

## 解決策
色々調べたがHugoにあまり詳しくないせいか単純な解決策は見つからなかった

今回は`<br>`さえ消えてくれればよかったので

```
{{ replace "Bat<br>Man" "<br>" "" }} → "BatMan"
```

replace関数で`<br>`を空文字列に置換する事で対処した

綺麗に解決できる方法ご存知の方がいればぜひコメントお願いします！


## 追記
ソースコード見てたら

[https://github.com/gohugoio/hugo/blob/b2a3d4644bb5a505db662b2927af6f80856a3076/helpers/content.go#L188](https://github.com/gohugoio/hugo/blob/b2a3d4644bb5a505db662b2927af6f80856a3076/helpers/content.go#L188)

```go:content.go

var stripHTMLReplacer = strings.NewReplacer("\n", " ", "</p>", "\n", "<br>", "\n", "<br />", "\n")
```

こういう一行が処理にあったのでHTMLは全部消す(但し、これらは例外的に以下のように置換処理)って関数として納得するしか無いと思います... オプションとか無いし...

```
"\n" => " "
"</p>" => "\n"
"<br>" => "\n"
"<br />" => "\n"
```
複数行SELECTを行うとき、DB2のパフォーマンスを少しでもよくする方法

#FOR READ ONLY

SQL の後ろに　FOR READ ONLY　をつける


参考URL→
http://hishiwork.jp/db2-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E3%83%AD%E3%83%83%E3%82%AF%E3%81%9B%E3%81%9A%E3%81%ABselect%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-with-ur/



#追記
カーソルの概念
http://wa3.i-3-i.info/word11582.html
近似値を返すための初期化パラメーターを試す (Oracle Database 12c Release 2新機能)

Oracle Database 12c Release 2で追加された近似値計算に関する新機能の説明です。

# 初期化パラメーターの追加
近似値計算に関係する以下の３つの初期化パラメーターが追加されました。

1. APPROX_FOR_AGGREGATION
このパラメーターをTrueに設定すると、COUNT (DISTINCT expr) 関数の実行が近似値になります。ただしどの集計関数に対して近似値が利用されるのかについてはマニュアルに記述がありません。
2. APPROX_FOR_COUNT_DISTINCT
このパラメーターをTrueに設定すると、COUNT (DISTINCT expr) 関数の実行が近似値になります。
3. APPROX_FOR_PERCENTILE
このパラメーターにNONE以外の値に設定すると、PERCENTILE_* 関数の実行が近似値になります。

従来のバージョンでは近似値を計算するためにはサンプリングを行う必要がありました（FROM table SAMPLE句）。しかし、SAMPLE句を利用するためにはSQL文を修正する必要があります。この機能を使うことでSQL文はそのままで、自動的に近似値を計算してくれるようになります。



# 実行計画を確認
パラメーターの変更による実行計画の変化を確認します。まず、デフォルト状態で確認します。

```
SQL> ALTER SESSION SET APPROX_FOR_COUNT_DISTINCT = false ;

Session altered.

SQL> SELECT COUNT(DISTINCT L_SUPPKEY) FROM lineitem ;

COUNT(DISTINCTL_SUPPKEY)
------------------------
                   10000

Elapsed: 00:00:02.93
SQL>
SQL> SELECT * FROM TABLE(dbms_xplan.display_cursor()) ;

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  2kgsfb390q63y, child number 1
-------------------------------------
SELECT COUNT(DISTINCT L_SUPPKEY) FROM lineitem

Plan hash value: 1987383118
--------------------------------------------------------------------------------
| Id  | Operation            | Name     | Rows  | Bytes | Cost (%CPU)| Time
|   0 | SELECT STATEMENT     |          |       |       | 29667 (100)|
|   1 |  SORT AGGREGATE      |          |     1 |    13 |            |
|   2 |   VIEW               | VW_DAG_0 | 10000 |   126K| 29667   (1)| 00:00:02
|   3 |    HASH GROUP BY     |          | 10000 | 40000 | 29667   (1)| 00:00:02
|   4 |     TABLE ACCESS FULL| LINEITEM |  6001K|    22M| 29512   (1)| 00:00:02

```

次に初期化パラメーターAPPROX_FOR_COUNT_DISTINCTを実行します。

```
SQL> ALTER SESSION SET APPROX_FOR_COUNT_DISTINCT = true ;

Session altered.

SQL> SELECT COUNT(DISTINCT L_SUPPKEY) FROM lineitem ;

COUNT(DISTINCTL_SUPPKEY)
------------------------
                   10050

Elapsed: 00:00:02.86
SQL>
SQL> SELECT * FROM TABLE(dbms_xplan.display_cursor()) ;

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  2kgsfb390q63y, child number 0
-------------------------------------
SELECT COUNT(DISTINCT L_SUPPKEY) FROM lineitem

Plan hash value: 2287326370
--------------------------------------------------------------------------------
| Id  | Operation             | Name     | Rows  | Bytes | Cost (%CPU)| Time
|   0 | SELECT STATEMENT      |          |       |       | 29512 (100)|
|   1 |  SORT AGGREGATE APPROX|          |     1 |     4 |            |
|   2 |   TABLE ACCESS FULL   | LINEITEM |  6001K|    22M| 29512   (1)| 00:00:02
```

実行しているSQL文はそのままですが、実行計画がSORT AGGREGATE APPROXに変化していることがわかります。
Swiftの正規表現の例

####はじめに
IDやパスワードで使用できそうな正規表現をまとめました。
誤りがありましたら指摘お願いいたします。
####正規表現の例
1.半角英数字8文字の正規表現
**"^[A-Za-z0-9]{8}$"**または**"^[\\\w]{8}$"**

2.半角英数字それぞれ1文字以上を含む半角英数字8文字以上の正規表現
**"^(?=.\*?[A-Za-z])(?=.\*?[0-9])[A-Za-z0-9]{8,}$"**
または
**"^(?=.\*?[\\\w\&\&[\\\D]])(?=.\*?\\d])[\\\w]{8,}$"**

3.半角英数字、特殊文字(!#$%&@)それぞれ1文字以上を含む8文字以上の正規表現
**"^(?=.\*?[A-Za-z])(?=.\*?[0-9])(?=.\*?[^A-Za-z0-9])[A-Za-z0-9!\#\$%&@]{8,}$"**

4.半角英数字、空白文字以外の特殊文字それぞれ1文字以上を含む8文字以上の正規表現
**"^(?=.\*?[A-Za-z])(?=.\*?[0-9])(?=.\*?[^A-Za-z0-9])[^\\\s]{8,}$"**
普通のキーボードで紡ぐEmacs小指戦記

## Emacs小指とは？
Emacsにはタイトルの通りでEmacs小指というのが存在する。
これはEmacsの操作にCtrlキーが密接に関わることに原因がある。
Emacsは基本的な操作ではたいていCtrl（以降Cと記述）+ 他のキーみたいに入力する。
ファイルの保存ならC-x C-sだったりする
このCtrlを押すのが大変なのだ。押す回数がめちゃくちゃ増えるからね
結果的に腱鞘炎になる。職業病のようなものだろう

## それでもEmacsを使う？
Emacs以外にもすぐれたエディターはたくさんあると思う。
Emacs以上の歴史を持つVi、GithubのAtomなど。それでもEmacsを使う理由はEmacsには小指を捨てて(捨てたいと入っていない)でも使いたくなるような魅力的なパッケージがたくさんあり、可能な限りキーボードから手を離さないで操作を完結させるにはEmacsしか無いと考えるから。何より私はEmacsが好きである。

## 小指を失わないために
大切な小指を失わないためには邪道を歩む必要があると思った。
人によってはフットペダルを使って足にCtrlの代わりをさせる人もいるそうだがなんとなくキーボード上で完結したかった。
そこでまずキーボードの形式を眺めることにした。
私のキーボードはUS配列。Macbook Proである。
見てひと目で気がつくことがある、Optionキーである。このキーは２個ある。
そしてEmacsは設定をほぼどこまでも自分の好きなように変更することが可能なのである。
その瞬間答えは出たも同然だった。

## 小指の負担は減ったのか？
劇的に減った。
すべての指に均等にというわけには行かないにせよ小指が過労死する問題からは開放された。
キーバインドを入れ替えるついでに他に気になっているコマンドを入れ替えたり使っていないコマンドを削除したりしていった結果これまでにないくらい使いやすいエディタに変化した。
これからまだまだ良くなるんだと確信できる感じが良いなと思いました。

## つぎは
EmacsでRPCを使えるライブラリがあることを知った。
RubyやPython,JSなどと繋げられるそうだ。
これを勉強して記事にしたいと思う
VALUのデータを日本円で見る

最近なにかと話題の[VALU](https://valu.is/)。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35910/41b529ac-e5ca-20b5-6f67-155184fe9a34.png)

データはこんな感じで表示されてる。

BitCoin対円が桁大きすぎて金額換算しづらかったので[ゆるよろさんの記事](http://qiita.com/yuroyoro/items/08cded7662cf494d53f2)を参考に変換してみた。

デベロッパーズコンソール開いておもむろに



```js
fetch("https://blockchain.info/ja/ticker").then(response => response.json()).then(ticker => {
  var exchange = (target) => target.text(Math.round(ticker.JPY.last * target.text().replace(",", "")).toString().replace(/(\d)(?=(\d{3})+$)/g , '$1,'))
  $(".user_numerical li span").filter((i, e) => $(e).text() == "BTC").each((i, e) => { $(e).text("JPY"); exchange($(e).prev()) })
  $("#hint_chart a").each((i, e) => exchange($(e)))
  $("#candle_chart g text").each((i, e) => { if ($(e).attr("y") == -10) { $(e).text("JPY") } else if ($(e).attr("y") == 0.5) { exchange($(e)) } })
})
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35910/ef65a5ed-9322-7316-c70d-b780f5ed7b4f.png)

お金怖い

（注）画像は全て架空のデータです。
makefile 動的に変数に代入 共通して使う

## 概要
Makefile のルールの中で変数を宣言し、それを使いまわしたい.

## 動機
代入する中身をshellコマンドにする場合 `$(shell ...)` とすれば、そのコマンドの出力を代入できる. _(代入する値が定数ならこの記事に書いて有ることは気にせず、ルールの外で代入しておけばよい.)_ shellコマンドによっては (例えば `peco` コマンド) 何度も実行したくないし、別のルールを make する場合は一度も実行したくない. なので、あるルールの中で唯一度だけshellコマンド実行し、その出力を代入し、それを何度も使いたいという動機がある.

## 方法
通常、Makefile における変数の代入は `:=` で行う.
しかしこれは (ba)sh のコマンドではないのでルールの中には書けない. つまり下のような Makefile は違法.

```make:bad.makefile
rule:
	F := $(shell seq 10 | peco)
	echo $(F)
	echo $(F)
```

`$(eval ...)` の中に入れてやると良いということらしい.

```make:good.makefile
rule:
	$(eval F := $(shell seq 10 | peco))
	echo $(F)
	echo $(F)
```

### 他のルールから参照

することも問題なくできます.

```make
a:
	$(eval A := $(shell date))
	echo "set A"

b: a
	echo $(A)
```

```bash
$ make b
echo "set A"
set A
echo 2017年 8月24日 木曜日 15時12分07秒 JST
2017年 8月24日 木曜日 15時12分07秒 JST
```
Speech To Text：About an output form when I validated SpeakerLabels

About an output form when I validated SpeakerLabels

When I validated SpeakerLabels, I want to output it in the following forms. 
「
speaker0 : Please tell me how to make in Node.js
speaker1 : OK,After I send the email it
speaker2 : Thanking you in advance
」

Please tell me how to make in Node.js. If there is a sample program, please provide it.
CentOSでgitのCVE-2017-1000117対応を行う


centosのyumでインストールされるgitのバージョンは1.7.1でした。
1.7.1でも脆弱性が出ましたので対応が必要でした。
※[テストに使ったもの](https://twitter.com/i/web/status/897139115782582273)


対応しなきゃいけないので[ここを参考](http://tokyo-engineer.com/git-cve-2017-1000117/#AWSGit_CVE-2017-1000117
)に実施しました。


```sh
sudo yum remove -y git
sudo yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
wget https://www.kernel.org/pub/software/scm/git/git-2.14.1.tar.gz
tar -zxf git-2.14.1.tar.gz
cd git-2.14.1
make prefix=/usr/ all
sudo make prefix=/usr/ install
git --version

sudo sh -c 'echo "exclude=git" >> /etc/yum.conf' 
```

参考元にあった /usr/local/bin/git はなかったんでlocalは省いてます。
gitをインストール、アップデートしないようにする方法を教えて貰ったのでexclude=gitを追記


追記:
更新きたようです。(未検証)
https://lists.centos.org/pipermail/centos-announce/2017-August/022519.html
[ReactNative]シミュレータが動かない時にやってみるといいことメモ

- ReactNativeのアプリをシミュレータで動かしていると、突然原因不明のエラーで動かなくなることが多々ある
- そんな時にとりあえず試してみるといいんじゃないかということをメモしていく


1. node_modulesを一旦削除してインストールし直す

    ```
    rm -rf node_modules
    npm install
    ```
1. キャッシュを消す

    ```
    rm -rf ~/.rncache
    ```
1. Rebootする(iPhoneのみ)

    ```
    Simulatorのメニューから「Hardware」 -> 「Reboot」
    ```
1. npmのキャッシュを消す

    ```
    npm cache clean
    ```
ファイル破損でAthena検索ができなくなった時の対処

とある行ログをLogstashでJSONに変換してGzip圧縮後にS3にPUTし、Athenaで検索できるようにしていた。

LogstashのS3 outputプラグインはrestoreオプションをTrue （デフォルト） にしておくと、再起動時に前回途中まで処理したログをPUTしておいてくれる。
しかし、これに何かの原因で失敗すると、S3には不完全なログファイルがPUTされることがある。
そしてこれはGzip的には破損したファイルとなる可能性がある。

検索中に破損したファイルに遭遇すると、Athenaはエラーを出す。

```
HIVE_CURSOR_ERROR: Unexpected end of input stream
```

しかし、**どのファイルが破損しているのかは教えてくれない**。

なので、Athenaで検索をかけたい場合、restoreオプションは誠に遺憾ながらFalseにしておくのが良いのではないかと思う。
リストアされないのでログに欠落が出る可能性があるが、とはいえファイルが破損すると検索できないというトレードオフ。
この場合、例えば （今回みたいに） 1時間でローテートする設定にしておくと、最長1時間分のログが欠落する。
1時間「だけ」と考えるか、「も」と考えるかが問題だ。

まぁお金の節約のためにもパーティションとローテーションは適切に設定しておくしかない、ってそれはいつだってそう。

今回はしかたがないので、ローカルで`gunzip`して破損したログファイルを特定する羽目になった。

# How

エラーが出たパーティション下のデータ量を調べる

```
aws s3 ls log-bucket/log/yearmonth=201707/ --recursive --human --sum
```

何とかローカルに入りきりそうだったので

```
aws s3 sync s3://log-bucket/log/yearmonth=201707/ .
```

適当なスクリプトを作ってエラーチェック

```bash
#! /bin/bash

for f in $(ls *.gz); do
  gunzip $f
  if [ $? = 0 ]; then
  rm $(basename $f .gz)
  else
  echo $f
  fi
done
```

どれかのファイルで`Unexpected end of stream`が出たりすると思う。
破損ファイルを特定したらリダイレクトで解凍できるところまで解凍する

```
gunzip < ls.s3.1d8fc54c-4ce8-4b29-98be-f323641ae011.2017-07-10T18.00.part225.txt.gz > ls.s3.1d8fc54c-4ce8-4b29-98be-f323641ae011.2017-07-10T18.00.part225.txt
```

JSON行の途中で終わってたりすると思うので、編集

```
vim ls.s3.1d8fc54c-4ce8-4b29-98be-f323641ae011.2017-07-10T18.00.part225.txt
```

再度圧縮

```
gzip ls.s3.1d8fc54c-4ce8-4b29-98be-f323641ae011.2017-07-10T18.00.part225.txt
```

アップロードしなおし

```
aws s3 cp ls.s3.1d8fc54c-4ce8-4b29-98be-f323641ae011.2017-07-10T18.00.part225.txt.gz s3://log-bucket/log/yearmonth=201707/ls.s3.1d8fc54c-4ce8-4b29-98be-f323641ae011.2017-07-10T18.00.part225.txt.gz
```

これで完了。`yearmonth=201707`パーティションが検索できるようになった。

解凍後のファイルサイズが大きすぎて編集できない場合は、諦めてDELETEするか、「きっと最終行だけがおかしいに違いない」と運を天に任せてシェルで最終行だけ削除してみるとか、何か便利なアレとかコレとか使ってファイルを修復する。

# ローカルに入りきらないよ

1個ずつダウンロードして確かめるとか……

# いや、ファイル1個がローカルに入りきらないんですよ

そんな巨大な単一ログファイルをAthenaで検索するのはちょっとイケてない気がします。
ファイル分割してパーティション切ったほうがお得だと思います。
SXSSFWorkbook(3.16 or older)を使ってEXCEL出力するときにセル内改行が増幅される問題の解決方法

## 概要

SXSSFWorkbookを使ってEXCEL出力するときは、
ver poi-3.17 or laterを使いましょう。
以上。

以下、どうしてもpoi-3.16を使わないといけない場合のメモとして残します。

### 事象
SXSSFWorkbook使用時、改行コードがCRLFの文字列をセルにセットすると、セル内改行回数が2倍となったのEXCELファイルが生成される。
上記省メモリ版以外を使用時はCRLF改行でも倍増しない。

### 結論
SXSSFWorkbookを使う場合、セルにセットする文字列の改行コードがCRLFであれば、CRのみ、またはLFのみにしてから渡すようにする。

未テスト例

~~~ java
SXSSFWorkbook wb = new SXSSFWorkbook();
// 略
String setString = "1行目\r\n2行目";
Row row = sheet1.createRow(rowNum);
Cell cell = row.createCell(colNum);
cell.setCellValue(setString.replaceAll("\r\n", "\n"));
~~~

### 不具合の原因

ソースを'\r'でGrepしたらわかる。
org.apache.poi.xssf.streaming.SheetDataWriterのswitchで1文字ずつ走査して、
'\r'と'\n'それぞれ改行に変換しているため。
"\r\n"の考慮漏れ。

poi-3.16でも直ってませんでした。

以上。

### 2019/3/19追記
3.17で修正されたようです。
ご指摘いただきました、@yuki-teraokaさん、ありがとうございます。

Bugzilla: [Bug 61048 - Newlines in cells not rendering with SXSSF](https://bz.apache.org/bugzilla/show_bug.cgi?id=61048)
github: [[Bug-61048] SXSSF module writes wrong escape sequence for carriage re…](https://github.com/apache/poi/commit/9fa3e36e9a9a4daf56d368c9a031e29ff2bad15e#diff-6ef46c20a27fbf5fcc9e40727fb29a13)
Raspberry Pi Zero WでBluetoothスピーカーを鳴らす

Raspberry Pi Zero Wと人感センサを使って、妻が帰ってきたときに「おかえり」と言わせる装置を作りたかったのですが、Raspberry Pi Zero Wにはあいにく3.5 mm ジャック出力がありません。。少し考えた結果、Bluetoothスピーカーが便利なんじゃないか(スマホでも使えるし)と思い、この組み合わせで作ることにしました。CUIで安定して鳴らせるまで、思いのほか難航しました。

#買ったスピーカー
[Anker SoundCore](https://www.amazon.co.jp/Anker-Bluetooth4-0-24%E6%99%82%E9%96%93%E9%80%A3%E7%B6%9A%E5%86%8D%E7%94%9F%E5%8F%AF%E8%83%BD-%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC-%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC-A3102011/dp/B016XKHLCK/ref=sr_1_1?ie=UTF8&qid=1502873295&sr=8-1&keywords=A3102011)

#参考にしたサイト
https://github.com/ev3dev/ev3dev/issues/198
http://mickey-happygolucky.hatenablog.com/entry/2015/04/04/105512

導入が終わった後に気が付いたが、以下もとても役に立ちそう。
https://wiki.archlinuxjp.org/index.php/Bluetooth_%E3%83%98%E3%83%83%E3%83%89%E3%82%BB%E3%83%83%E3%83%88

#手順
基本的には上記の[GitHubでのディスカッション](https://github.com/ev3dev/ev3dev/issues/198)の手順を実行していくだけです。途中躓いた点とか、試行錯誤して気付いた点などを補足していく形で記述していきます。

##バージョン情報
```
$ bluetoothctl --version
    5.23

$ pulseaudio --version
    pulseaudio 5.0

$ pactl --version
    pactl 5.0
    libpulse 5.0.0 でコンパイル
    libpulse 5.0.0 でリンク
```

##bluetoothctlでの操作
Bluetoothデバイスに接続するためのツールのようです。
https://wiki.archlinuxjp.org/index.php/Bluetooth#Bluetoothctl

- helpでコマンド一覧が出てくるが、"Controller", "ctrl"というのはRaspberry Pi側のこと。"Device", "dev"というのは接続対象側のこと。
- \<ctrl>, \<dev>には対象のBD_ADDR(MACアドレスみたいな機器固有の数値、例: "12:34:56:AB:CD:EF")を入れる。
- scan onで対象の機器を探し、見つかったらscan offで止める。
    - 一度scan onをやると、しばらくバックグラウンドで動き続けているようなのでscan offしてあげたほうがいいかも？
- いろいろ調べるために便利だったコマンド
    - list、Raspberry Piが使えるコントローラ一覧の表示(普通一個しか出てこないと思う)
    - show、コントローラ詳細の表示
    - devices、使えるデバイス一覧の表示("使える"の本当の意味はまだよく分かっていない)
    - paired-devices、ペアリングしたデバイス一覧の表示
    - info、デバイス詳細の表示

ここで苦労したのは、connectがうまくいったりうまくいかなかったりしたことでした。いろいろ試行錯誤した結果、接続できなかった場合、私の環境では一度removeでスピーカーの情報をすべて削除して最初からやり直すとうまくいくことが分かりました。結局のところスピーカー側の癖なのではないかと思っています。スマホとの接続でも同じような現象になったので。。

##pactlの操作
PulseAudioをコントロールするためのコマンドのようです。

- pactlの操作に入る前に一度rebootが必要だった。
- man pactlでoptionをいろいろ確認。
- "sink"はスピーカーのこと、"source"はマイクのことだと思われる。
- pactl infoに表示されるデフォルトシンクが標準の再生デバイスみたい。
- デフォルトシンクはpactl set-default-sinkで変えられる。
- ボリュームの変更はpactl set-sink-volume "シンクインデックス番号" 50%でできた。
- シンクインデックス番号はpactl listで調べられる。

##その他
- PulseAudioがスタートしていないと、bluetoothctlでのconnectがうまくいかない。
- Linuxでのファイル再生ではaplay(ALSA経由？)をよく見かけるが、paplay(PulseAudio経由？)を使う。
    - aplayで再生していると、最初のうちは動くが何回か再生していると無反応になる。
    - paplayを使っている限りでは問題は起きていない。
Unity Download Assistantを使わないダウンロードとインストールについて

モバイル向けCIのBitriseのブログでこんなものがありました

Bitrise公式ブログ : [Unity for the win, on Bitrise too!](http://blog.bitrise.io/2017/08/10/unity-for-the-win-on-bitrise-too.html)

Bitrise上でもUnityモバイルゲームをビルドできるらしいです。

そのためには、BitriseのCI環境にUnity Download Assistantを使わないでUnity Editorをダウンロード・インストールする必要があります。



さてインストールに関しては、Unityのリファレンス「 [Downloading and installing Unity](https://docs.unity3d.com/Manual/InstallingUnity.html)」やUnityの公式フォーラム「[How Can I Have A Fully Automated Build Process That Can Fetch And Install Any Version Of Unity Into Our Build Environment?(公式)](https://support.unity3d.com/hc/en-us/articles/211013503-How-can-I-have-a-fully-automated-build-process-that-can-fetch-and-install-any-version-of-Unity-into-our-build-environment)」にある程度情報が載っています。

ところが「[How Can I Have A Fully Automated Build Process That Can Fetch And Install Any Version Of Unity Into Our Build Environment?(公式)](https://support.unity3d.com/hc/en-us/articles/211013503-How-can-I-have-a-fully-automated-build-process-that-can-fetch-and-install-any-version-of-Unity-into-our-build-environment)」に記載されている、ダウンロードについては不明確な点があります。

次は、UnityのiOSのプラグインをダウンロードできるURLです。

```
http://download.unity3d.com/download_unity/{Changeset}/MacEditorTargetInstaller/UnitySetup-iOS-Support-for-Editor-{version}.pkg
```

問題は、`Changeset`と`version`についての記載がドキュメント中にないということです。何を入れればいいのでしょう？

Bitriseのブログの「[Unity for the win, on Bitrise too!](http://blog.bitrise.io/2017/08/10/unity-for-the-win-on-bitrise-too.html)」では次のようになっています

```
curl -o ./ios.pkg http://download.unity3d.com/download_unity/38b4efef76f0/MacEditorTargetInstaller/UnitySetup-iOS-Support-for-Editor-5.5.0f3.pkg
```

これを参考にすると、

Changeset : `38b4efef76f0` Unityのリビジョンコード？
version : `5.5.0f3` Unityのバージョン名？

version(バージョン)はわかるとして、Changesetのリビジョンコードはどう調べればいいか困りました。

どうやら各バージョンのリリースノートの記載されている文字列が、Changesetに相当するらしいです。

[パッチリリース](https://unity3d.com/jp/unity/qa/patch-releases)の各バージョンのリビジョンコードの記載あり。
[Unity 5.6のリリースノート](https://unity3d.com/jp/unity/whats-new/unity-5.6.0)にはリビジョンコードの記載あり。

けれど、[Unity 2017.1のリリースノート](https://unity3d.com/jp/unity/whats-new/unity-2017.1.0)にはないorz

2017.1.0f2とか2017.1.0f3とかのリリースノートが存在すれば、それぞれのリビジョンコードが載っているかもしれないけれど、見つからないorz


公式フォーラム「[How Can I Have A Fully Automated Build Process That Can Fetch And Install Any Version Of Unity Into Our Build Environment?(公式)](https://support.unity3d.com/hc/en-us/articles/211013503-How-can-I-have-a-fully-automated-build-process-that-can-fetch-and-install-any-version-of-Unity-into-our-build-environment)」にも書いたけど

* Changeset(リビジョンコード)の一覧
* すべてのリリースノートにリビジョンコードを記載
* ChangesetとかRevisionとか言葉を二つ使わないでほしい

だと助ります。

# 関連・参考

* [Downloading and installing Unity](https://docs.unity3d.com/Manual/InstallingUnity.html)
* [How Can I Have A Fully Automated Build Process That Can Fetch And Install Any Version Of Unity Into Our Build Environment?(公式)](https://support.unity3d.com/hc/en-us/articles/211013503-How-can-I-have-a-fully-automated-build-process-that-can-fetch-and-install-any-version-of-Unity-into-our-build-)
JavascriptでObjectをextend / assign / mergeする4つの方法

# 何が問題か

JavascriptでObjectを拡張する際、Object.assignを使うことが多いと思いますが、レガシーなライブラリにはjQuery.extend, angular.extend等、似たようなものがいっぱいあります。そして、少しずつ仕様が違うため、古いコードのメンテナンス等の際には、混乱することがあります。そこで、レガシーなライブラリのextend / assign系の機能の違いを整理してみました。

# 1. Object階層：たどらない / prototype chain: たどらない

## 例

Object.assign
lodash.assign
angular.extend (Angular1.xのみ)

## 疑似コード

```js
function assign(base, ...args){
  for(obj of args){
      for(const key in obj) {
　　　　　　if(obj.hasOwnProperty(key){
              base[key] = obj[key];
          }　　
      }
  }
  return base;
}
```


# 2. Object階層：たどらない / prototype chain: たどる

## 例

lodash.assignIn
jQuery.extend

## 疑似コード

```js
function assignIn(base, ...args){
  for(obj of args){
      for(const key in obj) {
          base[key] = obj[key];
      }
  }
  return base;
}
```

# 3. Object階層：たどる / prototype chain: たどらない

## 例

lodash.merge
angular.merge (Angular1.xのみ)

## 解説

この場合、各種オブジェクトをどう扱うかが問題になります。angularの場合、Date, RegExp, DOMElement, Arrayに対応していて、それぞれ適切な形に変換されます。これ以外の一般的なオブジェクト（自分で作ったクラスなど）は、Plain Objectになってしまいます。lodashは調べていません。ちなみに、自分で作ったクラスの\_\_proto\_\_も適切にコピーするためには、以下の擬似コードのような実装が適切です。ただし、組み込みオブジェクトは、別に扱う必要があり、DateとRegExp以外の組み込みオブジェクトには対応していません。

余談ですが、angular.mergeは、deprecatedで、loash.mergeを使えとドキュメントに書いてあります。個人的には、なんでangular.extendがdeprecatedにならないのかが不思議です。

## 疑似コード
```js
function merge(base, ...args) {
  for(const obj of args){
    if(typeof obj == 'object' && (obj instanceof Date || obj instanceof RegExp)) {
      base = new obj.__proto__.constructor(obj)
      continue;
    }
    if(typeof base != 'object') {
      base = Object.create(obj.__proto__)
    }
    for(const key in obj){
      if(obj.hasOwnProperty(key)){
        if(typeof obj[key] == 'object'){
          base[key] = merge(base[key], obj[key])
        }else {
          base[key] = obj[key];            
        }
      }
    }
  }
  return base;
}
```

# 4. Object階層：たどる / prototype chain: たどる

## 例

jQuery.extend(true)

## 解説

対応しているオブジェクトは、Arrayのみで、それ以外はPlain Objectになってしまいます。

# まとめ

オブジェクトを拡張 / マージする際には、

1. Objectの階層をたどるかどうか
2. キーの列挙の際に、prototype chain をたどってコピーするか、
3. \_\_proto\_\_をコピーするか、コピーせず、Plain Objectに変換するか
4. 組み込みオブジェクトのコピーにどこまで対応するか

といった複雑な要素が絡み合っています。これらを考慮して、適切なライブラリを選択する必要があります。

多くの場合は、Object.assignとlodash.mergeで問題ないと思いますが、古いのコードの移植の際などは、機械的に変換してしまったりすると、痛い目遭いますので、くれぐれも注意してください。
Dell XPS15 (2017年4Kモデル）でWindows ＆ Ubuntu のデュアルブート

# Dell xps15(4Kモデル) で win10 & ubuntu17

ここ10年くらいでWeb系の開発でMacを使うのはごく見慣れた風景になりましたが、iOSネイティブなアプリとか作るのでなければ最初からUbuntuというかLinuxでよくね？ ということで私はUbuntu推しです。

## Windows10Proをクリーンインストール

PC本体のアップデートにWindowsが必要となる場合もあるので、念の為Windowsは残しておきます。プリインストール済みのHOMEエディションでも構わないのですが、一応Proを持っているのとクリーンな状態にしたかったので最初から入れ直します。


### ディスクが見えない!!
* Windows10のUSBインストーラを作成&挿入
* 本体電源オン
* Dellのロゴが出たらすぐにF12
* USB起動を選択

これで普通にWindowsのインストール画面が出てくるのですが問題が発覚。
インストール先のディスクが見えない、、、。
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/184118/c7ec67ba-2ddf-1b4c-3b0d-64f37e95c131.jpeg)

どうもBIOSのデフォルトで、Intel Rapid Restore TechnologyとやらのRAIDが有効になっていて、この状態でディスクを認識するには別途ドライバが必要なようです。

これの対応は2通りあって、https://www.reddit.com/r/Dell/comments/5qe3oh/how_to_fresh_install_on_xps_15_9560/ にあるようにディスクを認識するためのドライバをUSBにコピーしておくか、あるいは、BIOSを変更してディスクを認識させてあげるかすればよいと思われます。

そもそもRAIDとか必要ないし、このあとUbuntuのインストール時も同様の問題を踏みそうなのでBIOSの設定を変更しました。こんな感じ。

![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/184118/2cb2891c-7f94-71a4-7387-930c05dee774.jpeg)

セキュアブートに関しては、Ubuntuの方でサードパーティ製の署名なしのドライバで問題になるのでオフっておいた方が無難かと思われます。

これで再起動すれば後は普通にWindowsをインストールできました。

## Windowsライセンスキー
WindowsのProをインストールしましたが、このxps15はライセンスキーがハードレベルで埋め込まれているらしくそのままではHOMEエディションのままです。ライセンスキーを変更をすればちゃんとProになります。

## Gnome-Ubuntu(17.04)のインストール

続いてUbuntuの方もUSBスティックを作ってインストールします。WindowsとのデュアルブートにしたいのでBoot Loaderのインストール先をWindows Boot Managerのパーティションにします。

![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/184118/dbb83dab-e6a3-9e73-d263-8b8fdbeedf54.jpeg)

インストール時はサードパーティのソフトやドライバも同時にインストールするようにした方がよいと思います。どうせ必要になるので。

## ドライバの変更

汎用ドライバではNvidiaカードの性能を全然活かしきれてないので、プロプライエタリなものに変更します。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/184118/c20f557f-4098-13ed-3904-2cc34c0140c3.png)

## 解像度の変更
15インチ4Kマシンなのでスケールが自動的に2に設定されていて有効解像度がFullHDになっています。4KはツライけどFullHDはちょっと大きすぎるのでxrandrで調節しようとしましたが、どうもNVIDIA経由だとpanningでエラーになってしまうので、次善の策としてtweak-toolを使って、

* Window scaling を1に設定~~
* FontのScaling Factorを1.75に設定（試行錯誤の結果

この状態だとウィンドウバーだけがやたら大きくなってしまうので、ターミナルから以下のコマンドを実行。

```
gsettings set org.gnome.desktop.interface scaling-factor 1~~
```
内蔵グラフィックならxrandrで行けました(意味ネー）。スケーリングの値は試行錯誤で好みの値にすればいいと思います。1.25くらいの方がいいかも、、。

```
xrandr  --output  eDP-1  --scale 1.3x1.3
xrandr  --output  eDP-1  --panning 4992x2808
```

こんな感じになりました。


![Screenshot from 2017-08-18 11-28-18.png](https://qiita-image-store.s3.amazonaws.com/0/184118/c087dea1-1754-328d-bc9a-e3944395de65.png)

## おしまい

流石にこの4Kモデルは画面が美しいです。Windowsですら綺麗に見えました！
linuxサーバ自動ログインTTLの書き方

txtファイルで、下記のソースを書いて、
拡張子をttlに変更して、ダブルクリックして、自動ログインできます。
前提条件：teratermをインストール済み環境

```
username = 'username'
hostname = '255.255.255.255'
userpasswd = 'wocao'

;msg = 'Enter password for user '
;strconcat msg username
;passwordbox msg 'Get password'

msg = hostname
strconcat msg '22 /ssh /auth=password /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg userpasswd

connect msg

wait '#'
sendln 'su -'
pause 1
wait '# '

sendln 'cd /tmp'
```
HTMLの条件付きコメント

HTML5では条件付きコメントと言って特定のブラウザのときのみ発動するコメントを記述することができます。

```html:rei
<!--[if lt IE 9]>
  <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/r29/html5.min.js">
  </script>
<![endif]-->
```

これでMicrosoft Internet Explorer (IE) のバージョンが9より小さい場合 (if lt IE 9) にのみコメント内の記述が発動します。

これにより、Firefox、Chrome、Safariなどの他のブラウザに影響を与えずに、IEのバージョンが9未満の場合にのみHTML5 shimを読み込めるため、非常に好都合です。
初めてのTDD（PHPUnit）

チーム内でTDDの布教をした際に使用した資料
#単体テストのすゝめ
https://www.slideshare.net/SatoshiLi/tdd-78910554
#TDDとは？
テスト駆動開発 (てすとくどうかいはつ、test-driven development; TDD) とは、プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き（これをテストファーストと言う）、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。（wikipedia）
まず、テストコードを書く。当然失敗するので、それが通るようにするのをひたすら繰り返す。
#サンプルコード
BDDのテストフレームワークが潮流してきていますが、今回はオーソドックスにPHPUnitを使います。
ライブラリ及びコードを同じフォルダに突っ込んでおく。

PHPUnit
https://phpunit.de/
上記から実行するphpのバージョンに対応するphpUnitをダウンロードする。
下記サンプルコードはphp7で実行してるのでPHPUnit 6.3をダウンロード。
（とはいえ、下記コードならある程度古いバージョンでも動くと思いますが）

```php:SampleTest.php
<?php
use PHPUnit\Framework\TestCase;
require_once("SampleProgram.php");

class SampleTest extends TestCase
{
    // まずはうまく返せてるか
    public function testReturn()
    {
        $sample = new SampleProgram();
        $this->assertEquals($sample->step1(12345), 12345);
    }

    // 文字数を確認する
    public function testCharNumber()
    {
        $sample = new SampleProgram();
        $this->assertEquals($sample->step2(12345), 5);
    }

    // 計算してみる
    public function testCalculation()
    {
        $sample = new SampleProgram();
        $this->assertEquals($sample->step3(12345), 15);
    }

    // 予期しない入力値を制御できるか
    /**
     * @expectedException        Exception
     * @expectedExceptionMessage 二桁の自然数ではないです
     */
    public function testErrorHandle()
    {
        $sample = new SampleProgram();
        $this->assertEquals($sample->step4(12345), 15);
        $sample->step4('aiueo');
    }
}
?>
```
```php:SampleProgram.php
<?php
use PHPUnit\Framework\TestCase;

class SampleProgram
{
    public function step1($arg)
    {
        return $arg;
    }

    public function step2($arg)
    {
        return strlen($arg);
    }

    public function step3($arg)
    {
        $total = 0;
        for($i = 0; $i < strlen($arg); $i++){
            $total += substr($arg, $i, 1);
        }
        return $total;
    }

    public function step4($arg)
    {
        if(preg_match('/[0-9]{2,}/', $arg))
        {
            throw new Exception("二桁の自然数ではないです");
        }
        $total = 0;
        for($i = 0; $i < strlen($arg); $i++){
            $total += substr($arg, $i, 1);
        }
        return $total;
    }
}
?>
```

実行コード（例）
`php phpunit-6.2.phar SampleTest.php`
Macに入っていたAnsible 1.9 を 2.3 までアップデートする


Macに（多分デフォルトで？）入っていたAnsibleが1.9で古かったので、brewで入れ直して2.3までアップデートします

# 環境

* OS X Yosemite 10.10.3
* homebrew


# 実行

brewのアップグレードをします

```
$ brew upgrade
```

結構時間がかかります。

続いてansibleのバージョンを確認して更新します。

```
$ ansible-playbook --version
ansible-playbook 1.9.2
  configured module search path = None
```

brewで入れられるansibleのバージョンを確認します。

```
$ brew info ansible
ansible: stable 2.3.1.0 (bottled), HEAD
Automate deployment, configuration, and upgrading
https://www.ansible.com/
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/ansible.rb
==> Dependencies
Build: pkg-config ✔
Required: libyaml ✘, openssl@1.1 ✔
==> Requirements
Required: python ✔
```

ansibleをインストールします

```
==> Downloading https://homebrew.bintray.com/bottles/ansible-2.3.1.0.yosemite.bottle.tar.gz
Already downloaded: /Users/yoshiyuki_sakamoto/Library/Caches/Homebrew/ansible-2.3.1.0.yosemite.bottle.tar.gz
==> Pouring ansible-2.3.1.0.yosemite.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/ansible
Target /usr/local/bin/ansible
already exists. You may want to remove it:
  rm '/usr/local/bin/ansible'

To force the link and overwrite all conflicting files:
  brew link --overwrite ansible

To list all files that would be deleted:
  brew link --overwrite --dry-run ansible

Possible conflicting files are:
/usr/local/bin/ansible
/usr/local/bin/ansible-doc
/usr/local/bin/ansible-galaxy
/usr/local/bin/ansible-playbook
/usr/local/bin/ansible-pull
/usr/local/bin/ansible-vault
==> Summary
🍺  /usr/local/Cellar/ansible/2.3.1.0: 11,346 files, 124.4MB
```

するとすでに /usr/local/bin/ansible とかが存在するのでだめって言われます。こいつらをてきとうにrenameします。

```
$ cd /usr/local/bin
$ ls -la ansible*
-rwxr-xr-x  1 root  admin   7281  8  5  2015 ansible*
-rwxr-xr-x  1 root  admin  11071  8  5  2015 ansible-doc*
-rwxr-xr-x  1 root  admin  36087  8  5  2015 ansible-galaxy*
-rwxr-xr-x  1 root  admin  12976  8  5  2015 ansible-playbook*
-rwxr-xr-x  1 root  admin   9863  8  5  2015 ansible-pull*
-rwxr-xr-x  1 root  admin   7791  8  5  2015 ansible-vault*

$ mv ansible ansible19
$ mv ansible-doc ansible-doc19
$ mv ansible-galaxy ansible-galaxy19
$ mv ansible-playbook ansible-playbook19
$ mv ansible-pull ansible-pull19
$ mv ansible-vault ansible-vault19

$ ls -la ansible*
-rwxr-xr-x  1 root  admin  11071  8  5  2015 ansible-doc19*
-rwxr-xr-x  1 root  admin  36087  8  5  2015 ansible-galaxy19*
-rwxr-xr-x  1 root  admin  12976  8  5  2015 ansible-playbook19*
-rwxr-xr-x  1 root  admin   9863  8  5  2015 ansible-pull19*
-rwxr-xr-x  1 root  admin   7791  8  5  2015 ansible-vault19*
-rwxr-xr-x  1 root  admin   7281  8  5  2015 ansible19*
```

ansibleをremoveしてinstallしなおします

```
$ brew remove ansible
Uninstalling /usr/local/Cellar/ansible/2.3.1.0... (11,346 files, 124.4MB)

$ brew install ansible
```

バージョンを確認します

```
$ ansible-playbook --version
ansible-playbook 2.3.1.0
  config file =
  configured module search path = Default w/o overrides
  python version = 2.7.13 (default, Jul 18 2017, 09:16:45) [GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)]
```

2.3になりました。
はてブではてなお気に入りユーザーのスターを強調するユーザースクリプト

# <i class="fa fa-cubes"></i> 概要

ファクトチェックやポリティカルコレクトネスなど、ITリテラシーや政治的姿勢が重視されかつ監視されやすい昨今。かと思います。
webページの評価基準の一つにはてブを置いていますが、はてブ自体の(人気)コメントの真偽判定や、政治的に自分もスターを付けていいか迷ったときに、自分あるいは信頼している人と似ている属性をもつ人がスターを付けているかを一種の指標としてみる。


# <i class="fa fa-cogs"></i> 検証環境

* Firefox 52
* greasemonkey 3.11
* はてなログイン済み

# <i class="fa fa-code"></i> コード


[favoStar.user.js]



```js:favoStar.user.js
// ==UserScript==
// @name        bookmark style
// @namespace   khsk
// @include     http://b.hatena.ne.jp/entry/*
// @version     1
// @grant       GM_xmlhttpRequest
// @grant       GM_addStyle
// ==/UserScript==

const Hatena = unsafeWindow.Hatena
const favoritesUrl = 'http://s.hatena.ne.jp' + Hatena.Bookmark.user.link + 'favorites.json';

GM_xmlhttpRequest({
  method: "GET",
  url: favoritesUrl,
  onload: function(response) {
    favorites = JSON.parse(response.responseText).favorites;
    favorites.forEach((obj) => {
      // 大きくなる理由はよーわからん 好きに装飾してね
      GM_addStyle('a[href="http://b.hatena.ne.jp/' + obj.name + '/"] > img.hatena-star-star {  width:3%;}');
    })
  },
  onerror: function(response) {
    console.log(response.responseText);
  },
});

```

ここでは自分のお気に入りを取得しているが、`Hatena.Bookmark.user.link`を`/「ID」/`にすれば他人のお気に入りも取得できる。
あまり発信しない人や、大喜利ばっかりしている人は著名な人を使うほうがいいかも。
自分の場合は技術記事には役立ちません…。

クロスドメインのためにGM関数を使ったので、CSSの追加もついでにGM関数でえいやと登録。
だいたい50回ぐらい走るので効率は悪いしソースがひどくなる。

# <i class="fa fa-camera"></i> スクリーンショット

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/b1a5077d-31ff-714e-9215-7a48f02fa837.png)

[はてなブックマーク - Qiita キータ - プログラマの技術情報共有サービス]

自分では大きくならなかったので著名そうなhtomineさんのIDをお借りして反映。

スター意外に少ないしトップもスター連打だし悲しみ。
スター連打も多すぎると省略されて分かるんですけど、半端だとわかりづらいのでこっちも何か対策して可視化したほうがいいのかも。(人気コメント判定には連打は無意味ですが)

あと、他人のお気に入りを借りると当人は当然出てこないので、手動で追加した方がいい(画像だとhtomineさんのスターが強調されない)
じゃあ気になる人だけ全部リストアップすればいいんですけど、それが面倒でAPIを使ったのでうーん…。


# お気に入り

APIのお気に入り≠手動でお気に入り設定したユーザー。
あくまではてなが機械的に判定したユーザー郡。
基準は

>はてなお気に入りAPIは、あるユーザーが気になっている「お気に入り」ユーザーの一覧を取得できるAPIです。「気になっている」かどうかは、はてな内でのコメントをつける、スターをつける、同じグループに所属するといった行動から算出しています。

手動でお気に入り登録したユーザーはAPIから取得できなくて、Qiitaの記事のいいねユーザー一覧は手に入らずストックは取得できるといい、びみょーに欲しいAPIから外れるのはなぜなのだ。(いいねAPIはTeam専用)

# <i class="fa fa-book"></i> 参考

* [はてなお気に入りAPI - Hatena Developer Center]
* [GreasemonkeyのunsafeWindowの移行タイミングのひとつはgrant - Qiita]
* [はてなのシロクマを屑籠に放り込むユーザースクリプト - Qiita]

[はてなのシロクマを屑籠に放り込むユーザースクリプト - Qiita]:http://qiita.com/khsk/items/0cb47046d1721099c729

[GreasemonkeyのunsafeWindowの移行タイミングのひとつはgrant - Qiita]:http://qiita.com/khsk/items/0119839e9835bac0352d

[はてなブックマーク - Qiita キータ - プログラマの技術情報共有サービス]:http://b.hatena.ne.jp/entry/qiita.com/
[はてなお気に入りAPI - Hatena Developer Center]:http://developer.hatena.ne.jp/ja/documents/other/apis/favorite

[favoStar.user.js]:https://gist.github.com/khsk/31e02d24607dd7de7408eb2a8ba9451b/raw/b74c4c6d8bac2ef32d672b23612a3d050b09d608/favoStar.user.js
zabbix (備忘録）

zabbix についての備忘録です。

* version 確認

```
zabbix_server --version
```

* ubuntu 14.04LTS へのインストール バージョンは、適宜変更してください。

https://www.zabbix.com/documentation/3.2/manual/installation/install_from_packages/repository_installation

```
# wget http://repo.zabbix.com/zabbix/3.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.2-1+trusty_all.deb
# dpkg -i zabbix-release_3.2-1+trusty_all.deb
# apt-get update
```
* 起動 /etc/default/zabbix-server で、START=yes　にする
[Rails]has_oneの関係を作るときに注意すべきこと

Railsでhas_oneを用いることがよくある。しかし、この関係は正規化に反しているため色々面倒な状況になることが多い。よくあるのが、DBで親レコードはあるのに子レコードはないという状況で、そうなるとアプリケーションレベルで吸収しないといけなくなる。（子レコードがある場合、ない場合と分岐が必要になってくる）

なので、親モデルをsaveする場合は、has_oneのモデルも自動で作るようにしてあげると良い。そうすれば、親レコードがある場合は子レコードも必ずあるように強制できる。

例えば、UserモデルとUserSettingモデルがhas_oneの関係にある場合、以下のようにすれば良い。

```
class User < ActiveRecord::Base
  has_one :user_setting
  before_validation :build_child, on: :create

  private 
    def build_child
      build_user_setting
    end
end
```

こうしておけば、Userをsaveした際に、UserSettingも自動でsaveされる。（ただし、子テーブルの全てのカラムでデフォルト値が設定されている必要あり）

has_oneの乱用には問題があるが、とはいっても代わりに親モデルに子の要素を入れ込んでしまうと見通しが悪くなることも多いので、使った方が良い場合も多い。なので、使う場合は色々とコストを頭に入れた上で使うようにしたい。
aws で新規サイトをあげるときのチェックリスト


### 前提
AWSのイメージは、初期にAWSから提供されているものを
使うと想定。私の場合は、ubuntu 16.04,centos7.5
EC2 + lambda 使用

### AWS 固有
* アベイラビリティゾーン
* セキュリティゾーン
* インスタンスの種別
* DISK容量
* バックアップ設定
* インスタンスに紐付けられた権限
* IPアドレス(EIP設定)
* サーバのパーティション（スワップなど）
* OSの初期イメージ
* terminate の制限
* ssm 
* lambda 

### DNS
* ドメイン割り当て
* TTL

### サーバ設定
* セキュリティアップデート
* 構成ツール(chef)の適用バージョン（ロールバック可能）
* アカウントの設定、権限レベル
* CRON 設定（主にバックアップ）
* ログ取得
* ufw/firewald 設定
* modsecurity 設定
* zabbix agent 
* サーバからメール送信(logwatch)
* ssm にインストールと設定

### 脆弱性（サーバレベル）
* port の 確認 (公開は、80,443のみが原則)
* SSLab でランク取得
* 80,443 の確認( openvas or owasp zap)

### web 
* ドメイン名で閲覧可能
* 初期データ確認
* 正常系動作
* 異常系確認（seleniumなど）
* 管理系動作確認
sudoers メモ

### ユーザ設定

#### 1. 原則はこれ

```
who where = (as_whom) what
```


#### 2. 例

```bash
testuser1 ALL = (admin_user) NOPASSWD: /bin/chmod, /bin/cat
```

- `who` => testuser1は
- `where`  => ALL(全てのホストで)
- `( as_whom )` => `admin_user`の権限で
- `what` => パスワードなしで`/bin/chmod`と`/bin/cat`を実行することができる