OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7 Apache2.4 に PHP7.0を入れる

# 目的
Laravel5.5アプリケーションを動かすために、PHPを導入する。

# 参考資料
https://qiita.com/ozawan/items/caf6e7ddec7c6b31f01e

# 手順
## リポジトリ追加

```
yum -y install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

## PHPインストール
### yum

```
yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-pecl-zip php-mysqlnd
```
composerも入れます（[CentOSにPHP7とcomposerをインストールする方法](https://qiita.com/Esfahan/items/e55fa83a9dcf91d89d84#composer%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)）

```
curl -sS https://getcomposer.org/installer | php -- --install-dir=/tmp
sudo mv /tmp/composer.phar /usr/local/bin/composer
```

### php.ini編集

```php.ini
date.timezone = "Asia/Tokyo"

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8

```
Object Pascal で FizzBuzz

# FizzBuzz

「FizzBuzz をどれだけ短く書けるか」というブームが定期的にやってきます。
今まで作った FizzBuzz は

```delphi
program FizzBuzz;
uses
  System.SysUtils;
var
  i: Integer;
  Values: array [0.. 3] of String = ('', 'Fizz', 'Buzz', 'FizzBuzz');
begin
  for i := 1 to 100 do 
  begin
    Values[0] := i.ToString;
    Writeln(Values[Ord(i mod 3 = 0) or (Ord(i mod 5 = 0) shl 1)]);
  end;
end.
```

こんなのや

```delphi
program FizzBuzz;
uses
  System.SysUtils;
var
  i: Integer;
  S: array [0.. 2] of String = ('', 'Fizz', 'Buzz');
begin
  for i := 1 to 100 do
    Writeln(S[Ord(i mod 3 = 0)] + S[Ord(i mod 5 = 0) shl 1], i.ToString.Substring(0, (i mod 3) * (i mod 5) * $ff));
end.
```

こんなのがあります。

今回は DEKO さんの

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">こうですか！？わかりません &gt;&lt;　<a href="https://t.co/AuGM07MR34">https://t.co/AuGM07MR34</a> <a href="https://twitter.com/hashtag/FizzBuzz%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86?src=hash&amp;ref_src=twsrc%5Etfw">#FizzBuzzを書いてみよう</a> <a href="https://twitter.com/hashtag/delphi_jp?src=hash&amp;ref_src=twsrc%5Etfw">#delphi_jp</a> <a href="https://t.co/HpiK7lz4bU">pic.twitter.com/HpiK7lz4bU</a></p>&mdash; DEKO (@ht_deko) <a href="https://twitter.com/ht_deko/status/920020283708207104?ref_src=twsrc%5Etfw">2017年10月16日</a></blockquote>

このツイートによって、またブームが来ました。

## Delphi で恐らく一番短い Fizz Buzz

今のところ、一番短いはず！
97 バイト！

```delphi
var i:Byte;begin for i:=1to 100do Writeln(i,^m,Copy('Fizz',i mod 3*9)+Copy('Buzz',i mod 5*9))end.
```

清書すると

```delphi
var
  i: Byte;
begin
  for i := 1 to 100 do
    Writeln(i, ^m, Copy('Fizz', i mod 3 * 9) + Copy('Buzz', i mod 5 * 9))
end.
```
こんな感じ。

コード中の ^m は、コントロールコードを書く古い書き方です。
^m = #13 = CR です。
キャリッジリターンで先頭まで戻るのがポイント。

なお、'Fizz' の所を 'Fizz ' にすると "Fizz Buzz" と間にスペースを入れられます。
そうすると 98 バイトになります。

## Val バージョン

また、試行錯誤の最中に [Val](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/System.Val) を使うと計算しなくて済むことに気がつきました。
Delphi だと [Copy](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/System.Copy) の第三引数は省略できるのですが、Ideone / FreePascal でも動くように第三引数も書きました。
[Ideone 上のコードはこちら](https://ideone.com/kdtlp4)

```pascal
program FizzBuzz;
var
  S: String;
  i, R, C: Integer;
begin
  for i := 1 to 100 do
  begin
    Str(i, S);
    S := S + Copy('Fizz', i mod 3 * 9, 4) + Copy('Buzz', i mod 5 * 9, 4);
    Val(S, R, C);
    Writeln(Copy(S, C, 8));
  end;
end.
```

#まとめ
Val とか [Str](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/System.Str) とか ^ 記法とか、古の技術がコードゴルフには役に立つのだ…
そして、FizzBuzz は永遠のテーマ…

求む！挑戦者！
sqlalchemy error with cx_Oracle 6.0

### Error in running Plone 4.3.7

DBAPIError: (TypeError) 'twophase' is an invalid keyword argument for this function None None

```shell-session
2017-10-17T18:18:06 ERROR Zope.SiteErrorLog 1508231886.820.430123597401 http:///front-page/document_view
Traceback (innermost last):
  Module ZPublisher.Publish, line 127, in publish
  Module ZPublisher.BaseRequest, line 607, in traverse
  Module Products.PluggableAuthService.PluggableAuthService, line 253, in validate
  Module Products.PluggableAuthService.PluggableAuthService, line 784, in _findUser
  Module pas.plugins.alma.plugin, line 210, in getPropertiesForUser
  Module sqlalchemy.orm.session, line 932, in execute
  Module sqlalchemy.orm.session, line 802, in _connection_for_bind
  Module sqlalchemy.orm.session, line 298, in _connection_for_bind
  Module sqlalchemy.engine.base, line 1661, in contextual_connect
  Module sqlalchemy.pool, line 272, in connect
  Module sqlalchemy.pool, line 425, in __init__
  Module sqlalchemy.pool, line 777, in _do_get
  Module sqlalchemy.pool, line 225, in _create_connection
  Module sqlalchemy.pool, line 318, in __init__
  Module sqlalchemy.pool, line 368, in __connect
  Module sqlalchemy.engine.strategies, line 80, in connect
  Module sqlalchemy.engine.default, line 283, in connect
DBAPIError: (TypeError) 'twophase' is an invalid keyword argument for this function None None
```

### How to fix

use **sqlalchemy >= 1.1.11**

```versions.cfg
[versions]
#zc.buildout = 1.5.2
zc.buildout = 1.7.1
#sqlalchemy = 0.8.1
sqlalchemy >= 1.1.11

...

#z3c.saconfig = 0.13
z3c.saconfig = 0.14

#zope.sqlalchemy = 0.7.6
zope.sqlalchemy = 0.7.7


...


plone4.csrffixes = 1.0.9
plone.protect = 3.0.18
plone.keyring = 3.0.1
plone.locking = 2.0.9
Products.CMFQuickInstallerTool = 3.0.12
Products.PlonePAS = 5.0.4

```



https://bitbucket.org/zzzeek/sqlalchemy/issues/3997/twophase-is-an-invalid-keyword

>Remove twophase for cx_Oracle 6.x
>
Support for two-phase transactions has been removed entirely for cx_Oracle when version 6.0b1 or later of the DBAPI is in use. The two- phase feature historically has never been usable under cx_Oracle 5.x in any case, and cx_Oracle 6.x has removed the connection-level "twophase" flag upon which this feature relied.


cf.
https://blogs.oracle.com/linux/cx_oracle-rpms-have-landed-on-oracle-linux-yum-server
【Ethereum】Geth APIにおけるContract functionへの引数の渡し方

# はじめに
一年前ぐらいに投稿するつもりだったものを供養する。
gethのバージョンは古いが、現在でもここの仕様はおそらく変わっていない。

GethにはJSON-RPC APIがあり、基本的にほとんどの機能がAPI経由で実行することができる。そこでコントラクトをBlockchainにデプロイしようと思った時、コントラクトに値を渡す方法がわからなかったので、忘備録として記録しておく。

以下に詳しくは書いてある。
[Ethereum Contract ABI - Github Ethereum wiki](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI)

基本的なEthereum APIの使い方は以下
[JSON RPC - Github Ethereum wiki](https://github.com/ethereum/wiki/wiki/JSON-RPC)

# 環境
- geth 1.6.5-stable


# やり方
基本的には

```
0x(Keccak(関数名)の先頭4byte)(渡す　引数パラメータ群)
```
をdataとしてContract Account宛に送ることでコントラクトの関数実行が可能である。
デプロイ時にはコントラクトをコンパイルしたソースコードの末尾に渡すパラメータ群を記述する。コンストラクタの関数名は入れる必要はないので、パラメーター群をそのまま以下のような形式で書けば良い。

## 引数パラメータの記述方法

基本的に32byte毎に引数一つとして記述する。例えば以下のような関数を考える。

```php:foo.solidity
function fuga(uint256 hoge,address user,string fuga) {
    _hoge = hoge;
    _user = user;
    _fuga = fuga;
}
```

この場合、uint256型とaddress型、string型のパラメータを渡したい。

### Uint256の場合
先頭はuint256型なので、渡したい値を16進数にし、パラメータ一つの全体が32byteの長さになるように左を0埋めする。

```
1234
-> 00000000000000000000000000000000000000000000000000000000000004d2
```

### addressの場合
次にaddress型だが、これも左0埋めして32byteにする。

```
0xb8bac7b269f97350e1df5b57a45302ded9b177d3
-> 000000000000000000000000b8bac7b269f97350e1df5b57a45302ded9b177d3
```
### Stringの場合
stringの場合は、パラメータ全体の末尾にその長さとともに記述し、正規の記述するべき順序の場所の32byteには、先頭から何byte後の部分からその順序にあるべきStringのデータが記述されているかを記述する。つまり、この場合はパラメータが3つあり、その末尾になるので、正規の記述するべき順序の場所の32byteには先頭から96byte後あることを示す。その後、末尾には、先頭32byteにそのString長の数値を左0埋め、その後ASCIIでStringを記述する。

つまり、3番目のパラメータとして、

```
先頭から96byte後にStringの記述開始
-> 0000000000000000000000000000000000000000000000000000000000000060
```

そして末尾に

```
hogehoge
-> 0000000000000000000000000000000000000000000000000000000000000008
686f6765686f6765000000000000000000000000000000000000000000000000
```
を記述する。

### 関数名
関数名は引数を含んだものをKeccakするので、

```
keccak("fuga(uint256 hoge,address user,string fuga)")
-> 5e03f4b96ab58326c1381d7b3218d9318f3b013f7d044e6d039e67f8cae2ed4d
```
これの先頭4byteを持つ。

### 送信データ
上の3つをパラメータとして、実際に送信するdataは以下である。わかりやすく32byte毎に改行している。

```
0x5e03f4b9
00000000000000000000000000000000000000000000000000000000000004d2
000000000000000000000000b8bac7b269f97350e1df5b57a45302ded9b177d3
0000000000000000000000000000000000000000000000000000000000000060
0000000000000000000000000000000000000000000000000000000000000008
686f6765686f6765000000000000000000000000000000000000000000000000
```

eth_sendTransactionのメソッドを使ってContract Account向けにトランザクションを発行することで実行できる。

#　おわりに
他にも配列や、渡す型によって記述方法がそれぞれ違うのだが、全てを網羅するのは諦めた。~~ドキュメント読め。~~正直この辺の話は上に挙げたABIのページに書いてあるのだが、非常にわかりづらく~~英語もわからないので~~Mistでコンパイルし、トランザクションデータを作らせて、というのを繰り返して諸行無常をした。ちゃんとドキュメントには書いてあるので読もう。
Splunk7の新機能

　9月末にメジャーバージョンアップしたSplunk7がリリースされました。そこでSplunk7に追加された新機能を簡単にまとめます。

#１.metrics（メトリクス）のネィティブサポート
Ver7以前でもメトリクス（サーバやIoT等のリソースの状態に関するデータ）のデータを扱うことは可能でしたが、Ver7からはSplunkネィティブでサポートされるようになったようです。つまり、メトリクスの取り扱いに対して最適化が行われたということです。実際、このネィティブ化された機能「Metrics Index」を使うことで従来のEvent Indexと比較して、

* ディスク消費量が約50%減
* スループット（イベントの処理能力）の向上
* サーチ実行速度の向上

となるようです。リアルタイムサーチを実行しているような環境では特に恩恵を得られそうです。
なお、Metrics Indexへのアクセスは専用のコマンド「mcatalog」、「mstats」を用いて行います。他のサーチコマンドは使えないようです。

#2.モニタリングコンソールに機能追加
モニタリングコンソールに「Regex CPU Profiling」が追加されました。regexによるフィールド抽出で消費したCPUリソースが確認できます。

#3.サーチパフォーマンスの向上と、CPU・メモリ・IOリソース消費の削減
言葉通り、各所改善されているようです。

#4.Machine Learning Toolkitの拡張
これはSplunk7とは関係していないような気もしますが、「Machine Learning Toolkit」の最新Verでは、機械学習のアルゴリズムが追加されたこと、学習済みモデルのロール管理が可能になったようです。
MySQLの検索エンジンの話


MySQL/MarinaDBのOSSって無料で使えるのがいいところと思っていましたが、大変お恥ずかしい。
本質的には、データベースの心臓部”ストレージエンジン”を選択できるところ、更には**それをテーブルごとに選択できる**のが特徴なのです。

#### What's ストレージエンジン
<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/S/Shindo_Masaya/20150401/20150401154842.png" width=50%>

>1. データベースエンジンがクライアントからSQL文を受け取ると、まずそのSQL文の解釈を行います。これをSQL文のパースと呼びます。
>2. 次にどのようにデータを処理するかを決めます。プランナやオプティマイザと呼ぶ機能がこの仕事を行います。
>3.  データの処理方法が決まると、はじめて実データへのアクセス処理が開始されます。ストレージエンジンは、実データがどのような形式で、ディスク上にどのように格納されているかといった情報を判別した上で処理を実行する。

http://shindolog.hatenablog.com/entry/2015/04/01/185703

#### What's kind of Engine 
ざっくり下記種類があって、検索系（オンメモリ、ストレージ）orバックログ系など、様々な用途があり、目的に応じたストレージエンジンの選択が必要。
https://thinkit.co.jp/cert/article/0608/1/1/2.htm

|ストレージエンジン | 概要|
|:-------|:-----|
|MyISAM|MySQL標準のストレージエンジンとして使用される|
|InnoDB|行ロックとトランザクションをサポートする|
|Memory|メモリ上にテーブルを配置する|
|Merge|複数のMyISAMテーブルを統合する|
|Archive|圧縮したデータベースを使用する|
|Federated|リモートのデータベースを参照する|
|NDB|クラスター構成にて使用される|
|CSV|データファイルにCSVを使用する|
|Blackhole|ダミーテーブルを使用する|
  
公式サイトにより詳細な情報がのってました。
https://mariadb.com/kb/ja/choosing-the-right-storage-engine/

#### My comment
仕事ではOracle使ってるし最近AWSやら便利なのがでてきて、あんまりこういったレイヤーを意識することがなくなってきてしまいました。
昨今は、”インフラを意識せずアプリに注力していこう”といった大きな潮流がありますが、そのいった中でもしっかり土台を理解していきたいですね。


Thanks,
cakePhp3がlocalhsotに表示されない

##cakePhpがlocalhostに表示されない
xammpの.htaccessに記述されている権限が問題。
と思ったけど違うみたい。

```C:\xampp\apache\conf\extra\httpd-vhosts.conf
<Directory "参照先">
 Option All
 AllowOverride All  //"Index"から"All"に変更
 Require all granted
</Directory>
```
これで表示された。
ローカルプッシュ通知（iOS10以降）

普段は、外部サーバーなどと連携したリモートプッシュ通知を使う機会が多いですが、
今回は、ローカルプッシュ通知の機能に少し触れてみました。
※iOS10から実装されたUser Notifications Frameworkを使ってみました。

###ユーザーの通知使用許可をとる

```Objective-c:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    if ( floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max )
    {
        [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:
         (UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert ) completionHandler:^(BOOL granted, NSError *_Nullable error) {
             if (granted) {
             }
         }];
        // デリゲートを接続
        [UNUserNotificationCenter currentNotificationCenter].delegate = self;
        
        [application registerForRemoteNotifications];
        
    } else {
        // iOS9以前の場合
        NSLog(@"iOS9以前の端末です。");
    }
    return YES;
}
```

###ローカルプッシュ通知の登録
おそらく、以下で「ボタンを押下後、通知を受ける」ことが可能

```Objective-c:ViewController.m
// UserNotificationsのインポートが必要

- (IBAction)push:(id)sender {
    
    // 通知を作成
    UNMutableNotificationContent *unMutableNotice = [UNMutableNotificationContent new];
    // title、body、soundを設定
    unMutableNotice.title = @"おはようございます";
    unMutableNotice.body = @"今日も一日頑張ってください！";
    unMutableNotice.sound = [UNNotificationSound defaultSound];

    // 通知タイミングを設定（今回は、実装後5秒後に通知を受信します）
    UNTimeIntervalNotificationTrigger *triger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];
    
    // リクエストの作成
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"リクエスト" content:unMutableNotice trigger:triger];
    
    // NUserNotificationCenterにリクエストを投げる
    [UNUserNotificationCenter.currentNotificationCenter addNotificationRequest:request withCompletionHandler:nil];
}

```


##まとめ
通知する内容、タイミング次第では、外部サーバーを使用しないローカルプッシュ通知でも十分要件を満たせることが多そうだと感じました。
通常の通知以外にも、「アクションボタン付き通知」や「位置情報を基にした通知」などもあるみたいなので、少しずつ触れていきたいです。
■ Qiita - 投稿手順

#　１．[ 投稿する ]

![Qiita_010.jpg](https://qiita-image-store.s3.amazonaws.com/0/196323/a78ca16c-f4cc-6c64-ff9e-41375d58a4a6.jpeg)



#　２．タイトルと記事を書いてみる。

![Qiita_001.jpg](https://qiita-image-store.s3.amazonaws.com/0/196323/c0317e31-f28b-67ba-3445-4fa922299e62.jpeg)



#　３．こんな感じで。

![Qiita_002.jpg](https://qiita-image-store.s3.amazonaws.com/0/196323/a0bd8233-31cf-e7c4-8c6d-55059422ca10.jpeg)



#　４．早速、投稿☆　しようとしたら… （ タグ って何？？？(汗) ）

とりあえず、記事を記録しておきたいだけ だったので、
「 メモ(memo) 」 と記録。

![Qiita_003.jpg](https://qiita-image-store.s3.amazonaws.com/0/196323/c9f11d48-0b0b-0f81-1dfc-cb65eb27d3bf.jpeg)



#　５．「 メモ(memo) 」 と記録。

![Qiita_004.jpg](https://qiita-image-store.s3.amazonaws.com/0/196323/c8a416db-2d39-d23b-fcda-0e26d2bc8733.jpeg)




#　６．利用規約に チェック[✔] を入れて、[ 投稿する ]

いつも思うんだけど、利用規約、ちゃんと読んでいる人いるのだろ～か 。。。

![Qiita_005.jpg](https://qiita-image-store.s3.amazonaws.com/0/196323/d763bdd2-e9a1-33c8-deee-d585fc82843d.jpeg)



#　７．補足①　～ 画像がないと淋しいので入れてみた ～

[ 投稿を編集 ]

![Qiita_008.jpg](https://qiita-image-store.s3.amazonaws.com/0/196323/4ffbc4d6-ef35-ea7a-4321-2129fcf2d8c2.jpeg)



#　８．画像は選択するだけ ☆　⇒　[ 更新 ]

![Qiita_007.jpg](https://qiita-image-store.s3.amazonaws.com/0/196323/0dc4651a-0266-af2c-49c8-70143b7ef542.jpeg)

![Qiita_009.jpg](https://qiita-image-store.s3.amazonaws.com/0/196323/ae7a385b-26e8-8538-943c-1e0e24e18fa4.jpeg)



#　９．完了 ☆

![Qiita_011.jpg](https://qiita-image-store.s3.amazonaws.com/0/196323/59f37985-9b0f-23e2-60bf-75cc775e132d.jpeg)
TupleでDictionaryの複合キーを実現するサンプル

```csharp:TupleSample.cs
	class TupleSample {
		static void Main(string[] args) {
			var dic = new Dictionary<Tuple<int, int>, string>();
			dic.Add(Tuple.Create(1, 1), "元旦");
			dic.Add(Tuple.Create(2, 11), "建国記念の日");
			dic.Add(Tuple.Create(2, 14), "バレンタインデー");
			dic.Add(Tuple.Create(3, 3), "ひな祭り");
			dic.Add(Tuple.Create(3, 14), "ホワイトデー");

			for (int i = 1; i < 13; i++) {
				for (int j = 1; j < 32; j++) {
					string val = null;
					if (dic.TryGetValue(Tuple.Create(i, j), out val)) {
						Console.WriteLine(string.Format("{0}月{1}日は{2}", i, j, val));
					}
				}
			}
		}
	}
```
さくらの専有サーバで Google 感情分析してみる

# Googleアカウント
https://cloud.google.com/natural-language/pricing?hl=ja
事前にアカウントを作っておく。
クレジットカード登録必要。

https://console.cloud.google.com
プロジェクトを作成。

~~https://cloud.google.com/docs/authentication/getting-started?hl=ja~~
~~【IAM と管理者 > IAM】からプロジェクト内にIAMを作成する。~~
【IAM と管理者 > サービスアカウント > 作成】で入力したサービスアカウントIDでIAMが作成される。
その際、【新しい秘密鍵の提供 > JSON】にチェックを入れて、JSONをダウンロードする。

【API とサービス > ダッシュボード】から Google Cloud Natural Language API を有効化しておく。


# composerのインストール
`/home/hoge/www/huga/composer`
諸事情によりcomposerディレクトリを作ってその中にインストールする。

1. SSHで接続。
2. cshになっているのでbashに変更。
3. パスワードを要求されるので入力。

```ssh:change
% which bash
/usr/local/bin/bash
% chsh -s /usr/local/bin/bash
```

exitで閉じてから再度ログインすると変更されているので、ディレクトリを指定してインストール。

```ssh:install
$ curl -sS https://getcomposer.org/installer | php -- --install-dir=/home/hoge/www/huga/composer
```


# Natural Language API Client Libraries のインストール
https://cloud.google.com/natural-language/docs/reference/libraries?hl=ja#client-libraries-usage-php
https://cloud.google.com/natural-language/docs/analyzing-sentiment?hl=ja#language-sentiment-string-php

composerからGoogleの感情分析ライブラリをインストールする。
/composer/vendor 配下に色々落ちてくる。

```
$ cd /home/hoge/www/huga/composer
$ php composer.phar require google/cloud-language
```


# PHPソース

```php
use Google\Cloud\Language\LanguageClient;
use Google\Cloud\Language\Annotation;
use Google\Cloud\Storage\StorageClient;

require_once('composer/vendor/autoload.php');

//サービスアカウント作成時にダウンロードしたjsonをアップロードしておき、環境変数に追加
putenv('hoge.json');

$o_languageClient = new LanguageClient([
	'projectId' => 'hoge',	//サービスアカウント名
]);
$result = $$o_languageClient->analyzeSentiment('わーい！たーのしー！');
```

* * *

# curlでもできるっぽい
https://codelabs.developers.google.com/codelabs/cloud-nl-intro-ja/index.html
https://cloud.google.com/natural-language/docs/analyzing-entities?hl=ja#language-entities-string-protocol
↑のプロトコルタブとか。
~~ただし分析する内容がPOSTできず、添付ファイルとして送らないといけない。~~

```PHP
$params = [
	'encodingType'	=> 'UTF8',
	'document'		=> [
		'type'		=> 'PLAIN_TEXT',
		'content'	=> 'I Want To Believe'
	]
];
exec('curl "https://language.googleapis.com/v1/documents:analyzeSentiment?key=***" -s -X POST -H "Content-Type: application/json" -d "' . addslashes( json_encode($params) ) . '"', $results);
```
実行するたびに添付ファイルを作りたくない場合はこれでいける。


* * *

# 参考
https://qiita.com/tonosamart/items/e1d7ee95bf1b2a4532ff
http://kawairi.jp/weblog/vita/2014123118987
http://tnamao.hatenablog.com/entry/2015/07/05/223707
https://kohkimakimoto.github.io/getcomposer.org_doc_jp/doc/00-intro.html
https://qiita.com/k_akakura/items/f318993fb87a976683a2
自分用Android開発テンプレート

最低限のライフライクルとそのログ、ボタンハンドラとテキスト書き換えのテンプレ

```java:MainActivity.java

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private String debugMsgTitle = "HELLO_WORLD_APP";
    private TextView mText;
    private Button mButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(debugMsgTitle,"Create");
        setContentView(R.layout.activity_main);

        mText = (TextView) findViewById(R.id.text);

        mButton = (Button) findViewById(R.id.button);
        mButton.setOnClickListener(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(debugMsgTitle,"Resume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(debugMsgTitle,"Pause");
    }

    public void onClick(View v) {
        Button btn = (Button)v;
        Log.d(debugMsgTitle,"onClick");

        switch( btn.getId() ){
            //ボタンが押されたとき
            case R.id.button:
                mText.setText("Wow!");
                break;
            default:
                break;
        }
    }

}

```
有名なサービスのWebページヘッダーの高さは何px？（2017年10月）


調べる機会があったのでまとめました。
方法はPCでChromeのDeveloperツールを利用してポチポチと調べてみました。

## 結果

| サービス | ヘッダー高さ<br>※下段はモバイルページ | ロゴ（PC） | 検索窓（PC） |
|:---------|:---------|:---------|:---------|:---------|
| facebook |42px<br>44px |左寄せ    |高さ:25px、左寄せ、ロゴとの余白5px|
| Twitter |46px<br>105px スクロール時36px |中央    |高さ:32px、右寄せ|
| Google |122px(64px+58px)<br>144px(64px+80px)|左寄せ（余白13px）|高さ:49px ロゴとの12px+|
| Apple |44px<br>48px |左寄せ|高さ:44px 入力時に中央寄せ|
|amazon|99px(39px+60px)<br>139px(44px+50+45px)|左寄せ|高さ:35px、左寄せ|
|Yahoo!Japan|137px（背景の変更箇所までは105px）<br>88px(34px+44px)|右寄せ|高さ:28px、左寄せ|
|楽天|68px <br>メインは156px(38px+77px)<br>47px<br>メインは109px(48px+61px)|左寄せ|高さ:36px、左寄せ|
|はてなブックマーク|34px<br>44px|左寄せ|高さ：30px、ヘッダーになし|
|Naverまとめ|44px<br>45px|中央寄せ|高さ:26px、左寄せ|
|Airbnb|106px(64px+42px)<br>106px(64px+42px)|左寄せ|高さ:40px、左寄せ|
|UBER|86px<br>63px|中央寄せ|検索なし、アカウント名の高さ:36px|
|AWS|41px<br>PCページのみ|左寄せ|検索なし、アカウント名の高さ:16px|
|HEROKU|50px<br>50px|左寄せ|高さ:34px、中央寄せ|
|Microsoft Azure|40px<br>PCページのみ|左寄せ|高さ:28px、中央寄せ|
|Google Cloud Platform|48px<br>48px|左寄せ（最左部はハンバーガーメニュー）|高さ:36px、中央寄せ|
|Salesforce|90px(50px+40px)<br>44px|左寄せ（余白16px）|高さ:34px、左よりの中央|
|Firebase|48px<br>48px|左寄せ（余白20px）|検索なし、アカウント名の高さ:32px|
|Google Drive|48px<br>56px|左寄せ（余白24px）|高さ:46px、中央寄せ|
|Google Analytics|64px<br>PCのみ|左寄せ|検索なし、アイコン領域の高さ:48px|
|Twitter Bootstrap(navbar)|56px<br>56px|左寄せ|高さ:38px、右寄せ|
|React|60px<br>40px|左寄せ|高さ20px、右寄せ|
|Slack|53px（チャンネル内のHeader）<br>アプリのみ（ページヘッダーは70px）|左寄せ（チャンネル名）|高さ:34px、右寄せ|
|Todoist|44px<br>40px|左寄せ|高さ:28px、中央寄せ|
|GitHub|54px<br>86px(50px+36px)|左寄せ|30px、左寄せ|
|Stack Overflow|57px<br>44px|左寄せ|高さ:36px、左寄せだが中央あたりに表示|
|Qiita|48px<br>48px|左寄せ|33px|

##確認時のページURL
| サービス | URL |
|:---------|:---------|
| facebook |https://www.facebook.com/|
| Twitter |https://twitter.com/|
| Google |https://www.google.co.jp/search?q=header|
| Apple |https://www.apple.com/|
|amazon|https://www.amazon.co.jp/|
|Yahoo!Japan|https://search.yahoo.co.jp/search?p=header|
|楽天|[トップページ](https://www.rakuten.co.jp/)、[カテゴリページ](https://www.rakuten.co.jp/category/)|
|はてなブックマーク|http://b.hatena.ne.jp/|
|Naverまとめ|https://matome.naver.jp/search?q=XXX ※検索ページ|
|Airbnb|https://www.airbnb.jp/|
|UBER|https://riders.uber.com/trips <br>※ログイン後ページ|
|AWS|https://ap-northeast-1.console.aws.amazon.com/console/home <br>※ログイン後ページ|
|HEROKU|https://dashboard.heroku.com/apps <br>※ログイン後ページ|
|Microsoft Azure|https://portal.azure.com/#dashboard/ <br>※ログイン後ページ|
|Google Cloud Platform|https://console.cloud.google.com/home/dashboard  <br>※ログイン後ページ|
|Salesforce|https://XXX.lightning.force.com <br>※ログイン後ページ|
|Firebase|https://console.firebase.google.com/u/1/project/ <br>※ログイン後プロジェクトページ|
|Google Drive|https://drive.google.com/drive/u/1/my-drive <br>※ログイン後ページ|
|Google Analytics|https://analytics.google.com/analytics/ <br>※ログイン後ページ|
|Twitter Bootstrap(navbar)|http://getbootstrap.com/docs/4.0/examples/starter-template/|
|React|https://reactjs.org/|
|Slack|https://XXXXX.slack.com/messages/ <br>※ログイン後ページ|
|Todoist|https://todoist.com/app <br>※ログイン後ページ|
|GitHub|https://github.com/ <br>※ログイン後ページ|
|Stack Overflow|https://stackoverflow.com/|
|Qiita|https://qiita.com/|
VueJS 文字列テンプレート

[公式のComponentページ](https://jp.vuejs.org/v2/guide/components.html)で度々出てくる **文字列テンプレート**がイマイチ把握できなかったので、まとめてみた。

公式より

```
# キャメルケース vs ケバブケース

HTML の属性は大文字と小文字を区別しません。そのため、非文字列テンプレートを使用する場合、キャメルケースのプロパティ名を属性として使用するときは、それらをケバブケース (kebab-case: ハイフンで句切られた) にする必要があります:

Vue.component('child', {
  // JavaScript ではキャメルケース
  props: ['myMessage'],
  template: '<span>{{ myMessage }}</span>'
})

<!-- HTML ではケバブケース -->
<child my-message="hello!"></child>

繰り返しになりますが、もし文字列テンプレートを使用する場合は、この制限は適用されません。

```

とあります。
属性値のKEYがキャメルケースでも、表示されるものが文字列テンプレートなのですね。

そこで、以下のファイルを用意しました。

```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>vue</title>
  </head>
  <body>
    <div id="app">
      <child my-message="hello! parent"></child>
      <App/>
    </div>
    <!-- built files will be auto injected -->
  </body>
</html>
```

```main.js
import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false;

Vue.component('child', {
    props: ['myMessage'],
    template: '<span>{{ myMessage }}</span>'
});

new Vue ({
             el        : '#app',
             components: {
                 App
             }
         });
```

```App.js
<template>
  <div id="app">
    <child my-message="hello! child"></child>
  </div>
</template>

<script>


export default {
  name: 'app',
}
</script>
```

これで、画面を表示すると

```
hello! parent
hello! child
```

と表示されます。
どちらもケバブケースなので、正常に表示されます。

次に、index.htmlの属性値のKEYをキャメルケースに修正します。

```index.html
...

    <div id="app">
      <child myMessage="hello! parent"></child>
      <App/>
    </div>

...
```

画面表示すると

```
hello! child
```

制限に引っかかり、「hello! parent」が表示されません。故に、`index.html`は文字列テンプレートではないです。

次に、App.htmlの属性値のKEYをキャメルケースに修正します。

```App.html
<template>
  <div id="app">
    <child myMessage="hello! child"></child>
  </div>
</template>

...
```

画面表示は

```
hello! child
```

「hello! child」は表示されました。
故に、App.htmlは文字列テンプレートになります。

なるほど。
conanで "Incorrect 'apple-clang' version 'compiler.version=8.1' is not the one  detected by CMake: 'Clang=9.0'" って言われる

Conan を使っていて、エラー出たんでメモ。

ビルド時に以下のエラーが発生
```
Incorrect 'apple-clang' version 'compiler.version=8.1' is not the one
detected by CMake: 'Clang=9.0'
```

Macで動かしていたのですが、コンパイラのバージョンがどうもあってないみたい。

ググったら、外国の方が解決策を書いてくれてました。

`~/.conan/profiles/default`にデフォルトのバージョンが書いてあるのでそこを修正。

```
[settings]                                                                                                                                  
arch=x86_64
build_type=Release
compiler=apple-clang
compiler.libcxx=libc++
compiler.version=9.0 // 8.1 だったのを 9.0に変更
os=Macos
```

これで、エラーが出なくなりました。

[追記]
・conanにgtestを導入しようとした際、なぜか compiler.version が 7.3 に変わってしまう現象が起きたのでその解決策を追記します。
環境変数 `CONAN_APPLE_CLANG_VERSIONS` に希望のバージョンを設定(自分の場合は `9.0`)
これで解決しました

Conan
conan
compiler.version
apple-clang
cmake
gtest
CentOS7インストール時のネットワークインターフェース名変更

## 歴史
ネットワークインターフェース名と言えばeth1,eth2などを思い浮かべるはずだ。
しかし、CentOS7から仕様が変わり、enp0s3,enp2s0f0といった分かりにくいものになってしまった。

## 昔の仕様に戻したい
調べてみると/etc/default/grubを修正すると旧仕様に戻るようだ。
うーん、できることならファイル修正は極力したくない、OSインストール時に設定したい・・・
という人向けの手順を展開します。

## 手順
①インストールの初回画面
![01.png](https://qiita-image-store.s3.amazonaws.com/0/207077/744a65c2-1d6a-d016-f127-4c3cf6acfaef.png)

②[tab]押下
![02.png](https://qiita-image-store.s3.amazonaws.com/0/207077/612cb313-72b9-eb85-6daa-fae58d45d0fd.png)

③以下のコマンドを追記して[Enter]押下
net.ifnames=0 biosdevname=0
![05.png](https://qiita-image-store.s3.amazonaws.com/0/207077/4ce84d3f-0df1-8482-2133-79b4bd87f963.png)

おわり。
Rubyで数独を解く

##動機
[この記事](https://qiita.com/wsldenli/items/78596c8775a0673f255e)に触発されて、数独のソルバーを作ってみました。自分はpythonよりもRubyに慣れているので、Rubyで実装してみました。

##実装の方針
参考にした記事を元に、再帰を使った深さ優先探索で解を求めるソルバーとして、実装しました。マス目に入れる数字が適切かどうかをチェックするメソッドについては、元の記事のものとほとんど同じものを使用しております。

##コード
追記：いただいたコメントをもとに、コードをすっきりさせました。コメントして頂いた方、ありがとうございます。

```ruby:sudoku.rb
#!/usr/bin/env ruby

class Solver
  def initialize values
    @values = values
  end

  def show
    @values.each_with_index do |row, i|
      puts row.each_slice(3).map{|a| a.join(" ")}.join("|")
      puts "-----+-----+-----" if [2,5].include?(i)
    end
  end

  def solve(x=0,y=0)
    return true if y > 8
    if @values[y][x] != 0 then
      return (x > 8) ? solve(0,y+1) : solve(x+1,y)
    else # 値が決まっていない場合
      for i in 1..9
        next unless check(x,y,i)
        @values[y][x] = i
        retval = (x > 8) ? solve(0, y+1) : solve(x+1, y)
        return true if retval
        @values[y][x] = 0
      end
      false
    end
  end

  def check( x, y, i)
    row(y, i) and column(x, i) and block(x, y, i)
  end

  def row( y, i)
    ! @values[y].include?(i)
  end

  def column( x, i)
    ! @values.map{|row| row[x]}.include?(i)
  end

  def block( x, y, i)
    xbase = (x/3)*3
    ybase = (y/3)*3
    block_values = @values[ybase,3].map{|row| row[xbase,3]}.flatten
    ! block_values.include?(i)
  end
end

def values_from_grid
  filename = "grid.txt"

  File.foreach(filename).
    map {|line| line.scan(/[.0-9]/).map(&:to_i)}. #scanで、指定した文字を取り出してArray化。mapでintegerに変換
    select {|row| row.size == 9} #selectで、数字が9つ格納されているArrayのみ取り出す
end

grid_value = values_from_grid
solver = Solver.new grid_value
solver.show
solver.solve
puts "" # 見やすくするため
solver.show
```

```text:grid.txt
8 5 . |. . 2 |4 . .
7 2 . |. . . |. . 9
. . 4 |. . . |. . .
------+------+------
. . . |1 . 7 |. . 2
3 . 5 |. . . |9 . .
. 4 . |. . . |. . .
------+------+------
. . . |. 8 . |. 7 .
. 1 7 |. . . |. . .
. . . |. 3 6 |. 4 .
```
■ IT用語辞典

#■ 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
http://wa3.i-3-i.info/index.html

![Qiita_006.jpg](https://qiita-image-store.s3.amazonaws.com/0/196323/6a8f6af8-9396-9387-4e73-d4d631ba5e00.jpeg)
CentOS7インストール時の解像度設定

VMwareにCentOS7をインストールしてたら、インストール画面の解像度が低くて「完了」等のボタンが押せなかったときの対応

①インストールの初回画面
![01.png](https://qiita-image-store.s3.amazonaws.com/0/207077/ca539c10-c41d-922b-4cad-99c6cfad3e65.png)

②[tab]押下
![04.png](https://qiita-image-store.s3.amazonaws.com/0/207077/8209b469-1262-fa48-3772-5a0a22013ca7.png)

③入力コマンドの後半を修正する
修正前：rd.live.check quiet
修正後：resolution=1280x800 quiet
![02.png](https://qiita-image-store.s3.amazonaws.com/0/207077/6a12907a-f3f1-3cf9-937a-39f223506751.png)

解像度はアスペクト比16:10ならなんでもOK

| 通称 | 横×縦 |
|:-:|:-:|
| PC-98ノーマル ・DCGA  | 640×400  |
| WXGA (Wide-XGA)  | 1280×800  |
| WXGA+ (Wide-XGA+) | 1440×900  |
| WSXGA+ (Wide-SXGA+)  | 1680×1050  |
| WUXGA (Wide-UXGA)  | 1920×1200  |
| WQXGA (Wide-QXGA)  | 2560×1600  |
| QWXGA+ (Quad-Wide-XGA+)  | 2880×1800  |
| QUXGA Wide  | 3840×2400  |

④[Enter]押下
![03.png](https://qiita-image-store.s3.amazonaws.com/0/207077/31550547-7a1b-afa0-c50f-6a39fe52dff5.png)

おわり。
rakeタスクの中だけで使うメソッドはRefinementsで定義するとべんり

Refinementsを使うと他から参照できないrakeタスクの中だけで使えるメソッドを定義できる。

```rb:Rakefile
top_level = self

using Module.new {
  refine(top_level.singleton_class) do
    def hi
      puts :hi
    end
  end
}

desc 'はい'
task :hi do
  hi
end
```

```
% rake hi
hi
```

## その他のアプローチ

[rake task でメソッド定義 by @kuboon on @Qiita](https://qiita.com/kuboon/items/26e90800856863c64cdc)
[ruby - 特定のRakeタスク内でのみ使うメソッドの定義方法 - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/8223/%E7%89%B9%E5%AE%9A%E3%81%AErake%E3%82%BF%E3%82%B9%E3%82%AF%E5%86%85%E3%81%A7%E3%81%AE%E3%81%BF%E4%BD%BF%E3%81%86%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E5%AE%9A%E7%BE%A9%E6%96%B9%E6%B3%95)

## ふつうに定義したときの失敗1

`hi`メソッドがトップレベルに定義されてしまう。

```rb:Rakefile
def hi
  puts :hi
end

desc 'はい'
task :hi do
  hi
end
```

## ふつうに定義したときの失敗2

`hi`メソッドがトップレベルに定義されてしまう。

```rb:Rakefile
desc 'はい'
task :hi do
  def hi
    puts :hi
  end

  hi
end
```

## ふつうに定義したときの失敗3

`hi`メソッドがトップレベルに定義されてしまう。

```rb:Rakefile
m = Module.new do
  def hi
    puts :hi
  end
end

desc 'はい'
task :hi do
  include m
  hi
end
```
【Ruby on Rails】後方参照を使ったgsubメソッドでの文字列書き換え

Ruby on Railsで2chビューワの製作中に、gsubメソッドと正規表現を使って文字列置換をしていた時にハマったので書いておきます。

# どうしたいか
ddタグ(レスポンス本文)内の`>>id`へのリンク先はそのままで、`>>id-id`へのリンクから`-id`の部分を除去して`>>id`にしたい。(処理を統一したい)

# どうしたか
```
text = "<dd> <a href=\"../test/read.cgi/moeplus/1506116566/187\" rel=\"noopener noreferrer\" target=\"_blank\">&gt;&gt;187</a>
 <br>\x{96EC}\x{8FE3}\x{8349}\x{835E}\x{8AEE}\x{926E}\x{8A4F}\x{90BA}\x{93D8}\x{834A}\x{8347}\x{838C}
<br> \x{82BB}\x{82B5}\x{82C4}\x{82CD}\x{82E6}\x{8E80}\x{82CB} <br><br>\n</dd>\n"

text = text.gsub(/<a href(\w|\d|=|>|<|"|\.|\/|_|\\|\s|-)+&gt;&gt;(\d+|\d+-\d+)<\/a>/) {
        link_id = $2
        link = (link_id.match(/-/) == nil ? link_id : link_id.gsub(/-\d+/, ''))
        "<a href=##{link}>&gt;&gt;#{link_id}</a>"
      }
```
始めに、gsubメソッドでaタグ部分を端から端までマッチさせます。
次にブロックを作って、中に書き換えする文字列を書きます。
今回は書き換えの前に、後方参照した文字列`$2`から`-id`を除去しています。

`$2`のままだと、Stringのメソッドが使えないので、`link_id`に`$2`を代入します。
`link_id`内に`-`がない場合はそのままで、ある場合は`-id`を除去します。
最後に、aタグにそれぞれの変数を埋め込んで書き換えています。
Terraformでtask-definisionを消したらエラーがで続けた...

# task-definitionをコンソールから停止
tfファイルを更新してもtask-definitionが更新されないので試しに現状動いているものを停止してみた

```error.sh
$ terraform apply
aws_ecs_service.registry: ServiceNotActiveException: Service was not ACTIVE.
    status code: 400, request id:*****
```

後に更新されない理由が判明したがエラーが消えてくれない

# 原因
ECSのtaskは停止しても削除されず、INACTIVE状態で残るためにtfstateファイルから同じものを見続けることが判明
一時的に参照するtask-definitionを動いてるものに指定 => apply => 元に戻す　でも効果なし

```ecs.tf
resource "aws_ecs_service" "service_redash_blt" {
  name = "${terraform.env}-****"
  cluster = "${aws_ecs_cluster.****.id}"
  task_definition = "${aws_ecs_task_definition.****.arn}"
  desired_count = 1
  deployment_minimum_healthy_percent = 50
  deployment_maximum_percent = 100
  iam_role = "${aws_iam_role.****.arn}"

  load_balancer {
    elb_name = "${aws_elb.****.name}"
    container_name = "nginx"
    container_port = 80
  }
}
```

# 解決策
結局task-definitionのfamily自体を変更
terraformで作ったものをコンソールからいじってはいけないと痛感...
asp.netのtry～catchでハメられた話

# お題
asp.netのtry～catchでハメられた話

## 結論
try～catchも、ちゃんと設計しましょう。

## 環境
- asp.netで作られた年代物のサイト
- もちろんスパゲッティ
- もちろん初期開発者・担当者は居ない
- windows2008R2　
- どこかのタイミングで、.net2.0系から、.net4.0系にアップしたみたい

## 状況
エラーでリダイレクトする場合に、発生エラーに応じて、適切なリダイレクトするようになっていたが、どうやら最近、ちゃんとリダイレクトされていないようだけど、どうなの？

## 調査開始
### 調査結果
ここで簡単に、ファイルを3つほど紹介（かなり簡略化しています。）
- main.asp.vb （メイン処理となるvb）
- check.vb　（チェック処理を行うvb）
- db.vb　（DBにアクセスして、データを取り出すvb）
どうやら、こいつらのリダイレクト処理が怪しい。

```VBScript:main.asp.vb
Class Main
    Protected Sub Page_Load() Handles Me.Load
        Try
            If 入力チェック処理() End
                KEY　＝　Getパラメータ
                DB.データ取得処理()        
            End if
        Catch
            リダイレクト（例外エラー）
        End Try
    End Sub
End Class
```
```VBScript:check.vb
Public Class Chk
    Public Function 入力チェック処理()
        Try
            KEY　＝　Getパラメータ
            return チェック処理の結果
        Catch
            リダイレクト（パラメータエラー）
        End try
    End Function
End Class
```
```VBScript:db.vb
Public Class DB
    Public Function データ取得(ByVal KEY As Integer)
        Try
            return KEYで取得したデータ
        Catch
            リダイレクト（DBエラー）
        End try
    End Function
End Class
```

### 予想
開発者は、
- KEYが想定外　-->> check.vbのtryに捕まって、__リダイレクト（パラメータエラー）__
- DBまわりで想定外 -->> db.vbのtryに捕まって、__リダイレクト（DBエラー）__
- それ以外の想定外 -->> main.asp.vbのtryに捕まって、__リダイレクト（例外エラー）__
のつもりで書いたのかと。

### 実際の挙動
全部、__リダイレクト（例外エラー）__

つまり、main.asp.vbから呼び出している関数内でエラーが発生した場合に、関数内のtryじゃなくて、呼び出し元のmain.asp.vbのtry～catchに捕まってしまっていたという訳。

## 対応
try～catchに関しては、放置！
というか、既存が凄すぎて、手が入れられない！

そのため、意図したエラーを、try～catchではなく、ちゃんと補足して、リダイレクトさせる用にしました。

本当は、他の方法もあったのかも知れないが、半ば放置されているようなサイトですがら、予算観点で・・・。
AWS関連用語まとめ

個人的に今勉強中のAWS関連の用語をなるべく簡単にまとめてみました。（語弊がある部分もあるかもしれませんが個人的に理解できる形で落とし込んでみました）。今後も随時追加予定

### EC2
仮想サーバ

### S3
Amazon Simple Storage Service。オンラインストレージサービス

### EBS
Amazon Elastic Block Store。オンライン外付けストレージ

### ELB
Elastic Load Barancing。ロードバランサー

### EIP
Elastic IP。固定のグローバルIP

### RDS
Relational Database Service。クラウド型RDBMS

### AMI
Amazon Machine Image。ソフトウェア構成(オペレーティングシステム、アプリケーションサーバー、アプリケーションなど)を記録したテンプレート

### IAM
AWS Identity and Access Management。AWSへのアクセスを安全に制御するための仕組み

### VPC
Virtual Private Cloud。仮想プライベートクラウド。

### CloudFormation
環境設定に関してソースコード化したものを読み込んでAWS上に環境構築してくれるサービス（インフラをコード化してくれるなんてすごいね）

### CodePipeline
システムのリリースにおけるプロセスを監視し、自動化・視覚化してくれるサービス。GitHubでMasterブランチへのマージを検知し→ビルド→デプロイ作業を自動で行ってくれる、みたいな事ができる

### CodeBuild
CodePipelineで連携している機能の一部。自動でビルドしてくれる

### CodeDeploy
CodePipelineで連携している機能の一部。自動でデプロイしてくれる
【メモ】astah*がMac High Sierraで動かない

この記事は
===

* [astah*](http://astah.change-vision.com/ja/)という有名なUMLツールがありますが、どうもMacのHigh Serraでうまく動かないような感じ
* メニューが出てこなくて機能の大半が使えない・・・
* 公式のワークアラウンドを見つけたのでメモっておきます

公式ワークアラウンド
===

* これ→ https://ja.astahblog.com/2017/09/26/bugs-on-mac-os-high-sierra/

手順
===

上のリンクの通りですが、一応列挙

* インストールフォルダのastahの.appファイルを右クリック
* 「パッケージ内容を表示」を選択
* そうするとFinder上でContentsというフォルダが表示されるので、その中のinfo.plistというファイルをダブルクリック
* テキストエディタの機能で「-Dapple.laf.useScreenMenuBar」という文字列を検索
* 値が```true```になっていますが、```false```に変更して保存

終わりに
===

* 以上です！
【Vuforia】The name `Unzip' does not exist in the current context

日本語での記事が見つからず、また英語の質問も解決に直結しなかったのでメモ

#環境
- Unity 5.6.3p1
- MacOS HighSierra
- Vuforia vuforia-unity-6-2-10.unitypackage

#エラー
The name `Unzip' does not exist in the current context

（おそらく）Vuforia同梱のUnzipのDLLが見つからないというエラー
今回は他のコンパイルエラーなどが発生したタイミングで再発。前も同様のエラーに遭遇したが、再起動などで出なくなっていた

#解決法
VuforiaのUnityPackageからの再インポートで解決（公式のHPよりダウンロード）
下記の方法でも治るかもしれない（今回は再インポート以外ではなおらず）

- Unityの再起動
- VuforiaフォルダのReimport
    - ProjectビューでVuforiaフォルダを右クリック → Reimport
- SwitchPlatform

どうもVuforiaが裏で行なっているコンパイルのタイミングで読み込みができなくなると再発するようなので、何らかの方法で読み込めるようにすると良い？
具体的な原因がつかめていないので、詳しい人いたら教えて下さい

#参考URL
https://stackoverflow.com/questions/42745782/unity-the-name-unzip-does-not-exist-in-current-context
句点をカンマにしたり，¥を\にしたりする方法(Mac)

# はじめに
情報系の論文は句読点の代わりにコンマ・ピリオドを使う蛮族の風習がある．
それを簡単に実現するためのTIPS．
ついでに，日本語キーでバックスラッシュが1発で打てず，困っているみんなにも．

# 句読点をコンマ・ピリオドに変換
1. ```システム環境設定```を開く
2. ```キーボード```を開く
3. ```入力ソース```を開く
4. スクショのように選択する  
<img width="600" alt="スクリーンショット 2017-10-17 16.11.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/c58e976e-7da8-e50e-0692-61876bbd9a97.png">

## 円マークをバックスラッシュにする
1. ```システム環境設定```を開く
2. ```キーボード```を開く
3. ```入力ソース```を開く
4. スクショのように選択する  
<img width="600" alt="スクリーンショット 2017-10-17 16.12.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/3b6602b5-e83d-3641-2629-835db3722377.png">

やったねタエちゃん！
yumでmysql(maria DB)を最新安定バージョンにアップデートする(Cent OS7)


mariadbが5.5.40と古いバージョンになっていたので、これを最新安定版の10.1.21にアップデートする方法のメモ

## yumリポジトリの追加

### MariaDBリポジトリ情報の生成

[repository generator](https://downloads.mariadb.org/mariadb/repositories/)を使って、指定のmaria DBバージョンのyumリポジトリ情報を生成し、追加する。

### yumリポジトリのMariaDBリポジトリを追加

/etc/yum.repos.d/MariaDB.repoが無ければ新規作成

```bash:/etc/yum.repos.d/MariaDB.repo
# MariaDB 10.1 CentOS repository list - created 2017-02-07 07:13 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```

## yumでMariaDBをインストール・アップデート

### 新規のインストールの場合

```bash
sudo yum install MariaDB-server MariaDB-client
```

### アップデートの場合

```bash
＃ systemctl stop mariadb
＃ systemctl status mariadb
mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled)
   Active: inactive (dead)

 
＃ yum update MariaDB-server MariaDB-client
読み込んだプラグイン:fastestmirror, remove-with-leaves, show-leaves
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
依存性の解決をしています

　　〜　略　〜

＃ mysql --version
mysql  Ver 15.1 Distrib 10.1.21-MariaDB, for Linux (x86_64) using readline 5.1

＃ systemctl start mariadb

＃ mysql -u root -e 'status'
--------------
mysql  Ver 15.1 Distrib 10.1.21-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:		2
Current database:
Current user:		root@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server:			MariaDB
Server version:		10.1.21-MariaDB MariaDB Server
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	latin1
Db     characterset:	latin1
Client characterset:	utf8
Conn.  characterset:	utf8
UNIX socket:		/var/lib/mysql/mysql.sock
Uptime:			3 sec

Threads: 1  Questions: 4  Slow queries: 0  Opens: 16  Flush tables: 1  Open tables: 9  Queries per second avg: 1.333
--------------
```
MyBatisのcommit設定でハマった

# MyBatisでINSERT実行

ちょっとしたバッチの中でSELECTして加工したデータをMyBatisでINSERTしたかった

```java
// まずMapperをSqlSessionから取得して
XXXMapper m = session.getMapper(XXXMapper.class);

System.out.print("Insert records...");

// Mapperに設定されてる関数からINSERT実行
m.insertByList(recordList);
System.out.println("OK!");
```

これでうまくいくはず…が、入らない…データが１つも入らない。

# AutoCommitはデフォルトでOFF?

いろいろ検索してStackoverflowで同じような現象を見かけた

* [Stackoverflow - why do myBatis insert/update functions now require a commit after adding FK to DB?](https://stackoverflow.com/a/4372935/2565527)
* [MyBatis 3.0.1 insert problem](https://stackoverflow.com/a/3105987/2565527)

要は作成更新系のクエリを呼ぶときは`commit()`を実行しろということ。普段はSpringのほうでトランザクション管理をしているので気づかなかった。
KRACKsについて簡単に解説してみた。

# 元ネタ翻訳している記事見つけました。要確認です！
https://qiita.com/Qithub/items/17871e7f26c308ef6514

# 具体的な攻撃
WPA2の暗号鍵を任意に再インストールさせる攻撃。
再インストールさせる鍵：ペア暗号鍵（PTK-TK）、グループ鍵（GTK）、整合性グループ鍵（IGTK）

# 攻撃の結果何ができるようになるのか
WPA2の暗号通信を解読したり、特定の暗号化の際は通信内容を改ざんすることができる。

# なんで？
ここが一番理解の時間がかかったところ。
Q.
暗号鍵を任意に再インストールさせたからといって何故、通信が解読できるのか？
再インストールは平文で分かりやすいのか？

A.
平文で分かりやすいわけはない。
鍵をリセットしたことで通信ごとに利用されるワンタイムパスワード的なパケット番号*1が0になるため。
そのため、再インストールする前とまったく同じ通信をするとまったく同じ暗号化キーが利用される*2
その同じような通信を集めることで暗号鍵を導出させることができる。
ただし一般的に無線LANのパスワードと呼ばれる「事前共有キー」は最初のマスタ暗号生成でしか利用されないため、それはわからない。

*1.nonce(ナンス)
*2.過去にすでに使用されているnonceと同じ暗号化キーが使用されるということ（キーストリームの再利用）


# もう少し説明すると？
WPA2は事前共有キーを元に暗号鍵を生成している。
ただその暗号鍵をそのまま使うと単純すぎて推測されうるため、パケット番号(nonce)も組み合わせて、暗号化キーを生成している。
それが「Group Transient Key（GTK）を生成するWPA2の4ウェイハンドシェイク」という初期化処理。

その初期化処理におけるキーの送信（メッセージ3）を収集しリプレイ攻撃をして再送信させることが出来るのが今回の脆弱性。
→nonceのリセット

# もう少し分かりやすくいうと？
WPA2の暗号鍵生成とその鍵の再配布を強制することで、そのタイミングでの暗号鍵を構成する要素のうち半分がわかる（nonce）
半分分かれば様々なパターンの暗号化データから残りの半分も足した”暗号鍵そのもの”が導出できる。

暗号鍵が導出出来れば事前共有キーはわからなくても、 *アクセスポイントとクライアント間の通信が傍受* できる。
もし暗号化アルゴリズムにWPA2-TKIP(RC4)を使っていれば *既存の脆弱性で通信を改ざん* もできる。

# まとめ
KRACKsの解説がまだなかったため、元ネタをGoogle翻訳にかけて理解してきました。
よってこの記事は https://www.krackattacks.com/ 内の、
項「Key reinstallation attacks: concrete example against the 4-way handshake」をGoogle翻訳かけて理解した結果となります。
それに下記の参考文献（特に下から二つ目）を読みあさって書いた形となります。

一応各種日本語文献も読み漁ったため、大枠としてはあっているはずです。

鍵を再インストールさせてnonceをリセット。
nonce再利用によって暗号化キーの導出が容易になったので何度も繰り返して導出させる。

というのが大枠だと思っています。
とりあえずの殴り書きでもあるので間違っていたら突っ込みください。
個人的には高木浩光先生の解説を待っております。

# 参考文献
KRACK Attacks: Breaking WPA2
https://www.krackattacks.com/

WPA2の脆弱性「KRACKs」、同一Wi-Fi内で盗聴や通信内容の改ざんが可能 -INTERNET Watch
http://internet.watch.impress.co.jp/docs/news/1086486.html

WPA2の脆弱性「KRACKs」、ほぼすべてのWi-Fi通信可能な端末機器に影響 | トレンドマイクロ セキュリティブログ
http://blog.trendmicro.co.jp/archives/16162

WPA2の脆弱性「KRACKs」についてまとめてみた ｜ Developers.IO
https://dev.classmethod.jp/security/wpa2-vulnerability-krack/

ストリーム暗号 - Wikipedia
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0%E6%9A%97%E5%8F%B7

Counter mode with Cipher-block chaining Message authentication code Protocol - Wikipedia
https://ja.wikipedia.org/wiki/Counter_mode_with_Cipher-block_chaining_Message_authentication_code_Protocol

wifi - How does a nonce reset allow for decryption? - Information Security Stack Exchange
https://security.stackexchange.com/questions/171381/how-does-a-nonce-reset-allow-for-decryption

cryptanalysis - How does one attack a two-time pad (i.e. one time pad with key reuse)? - Cryptography Stack Exchange
https://crypto.stackexchange.com/questions/2249/how-does-one-attack-a-two-time-pad-i-e-one-time-pad-with-key-reuse
(初心者向け)Swift3.0で初アプリ - アプリをコピーして新アプリを作成

既存のアプリからコピーして新しいアプリを作ります

#1. アプリをフォルダーごとコピー
- Finderでコピー元となるアプリをフォルダーごとコピー→ペーストして、新しいアプリ名のフォルダー名にします
- コピーされた先のxcodeprojをダブルクリックしてXcodeで開きます

#2. Xcodeでの変更
- アプリの画面左上のフォルダーアイコンを選択し、新アプリのGeneralページを開いてIdentityセクションの`Bundle Identifier`欄を新しいアプリ名に合うように変更します

<img width="997" alt="スクリーンショット 2017-10-17 15.12.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/55b62af4-54a6-19b3-b1d3-b0d8c62f47b0.png">

- Xode画面右上の`Initity and Type`欄で、新しいアプリ名へ更新する → 更新される対象のファイル一覧が表示されるので「Rename」を押してそれらを一斉に更新します

<img width="263" alt="スクリーンショット 2017-10-17 15.12.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/3c192d4e-ffa5-d63e-a1ce-072deab7a13a.png">


<img width="506" alt="スクリーンショット 2017-10-17 15.12.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/789035af-857f-18b6-ad9a-bdc612a2aaa2.png">

#3. アプリをビルド＋実行して確認します
- [Cntl]+Rでアプリをビルド＋実行してみて、新しいアプリとして稼働することを確認します
JavaScriptでスクロールを最下部に移動する方法

## 説明
JavaScriptで、非同期通信のタイミングに、スクロールを最下部に移動したかったのでメモ。

```js
var obj = document.getElementById(targetId);
obj.scrollTop = obj.scrollHeight;
```

---
ページの最下部に移動する場合は以下で可能

```js
var element = document.documentElement;
var bottom = element.scrollHeight - element.clientHeight;
window.scroll(0, bottom);
```
## 参考ページ
https://developer.mozilla.org/ja/docs/Web/API/Element/scrollTop
https://syncer.jp/javascript-reference/element/scrollheight
Rakeタスクで並行処理をするとCircular dependency detected while autoloading constant エラーが出て困った話

## 背景
- Rails4.2, ruby2.3系
- 集計のためにRakeタスクで並行処理を行う必要があった
- [Parallel](https://github.com/grosser/parallel)を採用し、並行処理を実装した
- `Circular dependency detected while autoloading constant` エラーが発生し困った
- 調べると[eager_load_paths設定しよう](https://qiita.com/tjnet/items/cecf9eae6e34a057e4d8)って書いてあって、やったけど解決しなかった

## エラーの原因
### 1. Autoloadingはスレッドセーフじゃない
- マルチスレッド処理するとCircular dependency起こる。
- [ActiveSupport::Dependencies](https://github.com/rails/rails/blob/4-2-stable/activesupport/lib/active_support/dependencies.rb)あたりを参照
- [関連issue](https://github.com/rails/rails/issues/25807)
- [関連stackoverflow](https://stackoverflow.com/questions/29439323/rails-4-2-autoloading-not-thread-safe)

### 2. rakeタスクはデフォルトでeager_loadがfalseになり、Autoloadしちゃう
- config/application.rbに以下の表記をふと発見
  - eager_load設定いくらしてもうごかなかったのはこれが理由

```config/application.rb
# Rake tasks automatically ignore this option for performance.
```


## 対策
- taskの始まりに`Rails.application.eager_load!`を追加する
  - taskの外に追加するとうまくいかないので注意
  
```rb

task 'resque:setup' => :environment do |task|
  Rails.application.eager_load!
  # ここに並行処理
end

```
- [参考issue](https://github.com/rails/rails/issues/28358)


## その他参考になったやつ
- autoloadとeager_loadとproductionとdevelopmentの話
  - [Don't forget about eager_load when extending autoload paths](http://blog.arkency.com/2014/11/dont-forget-about-eager-load-when-extending-autoload/)
Scoop で始める Docker（proxy 環境下）

# 対象

普段仕事で Docker 使わない人にとって、Windows 環境に Docker を入れるのは面倒
会社でプロキシがあったりするとさらに面倒

Docker Kitematic とかいらないし、さくっとDocker試したいんだけどー、
でもプロキシの設定面倒だし、環境汚したくもない　ぐらいの人が対象です。

プロキシの設定が必要ないなら、[scoop のドキュメントどおり](https://github.com/lukesampson/scoop/wiki/Docker-and-Docker-Compose) にすればいい。


## scoop について

Windows向けパッケージ管理ソフト

[Gradle のインストール](https://gradle.org/install/)をするときに、scoop 使えと書いてあったので入れたら存外便利だった。

scoop については taichi さんの、[ScoopでWindowsにおける開発環境構築を最適化しよう](http://blog.satotaichi.info/scoop/) を読めば大体どんなものか分かると思う。

もっと詳しくは公式ドキュメントを読もう。

以下は全て Powershell 

## scoop のインストール

[公式](http://scoop.sh/)の通りに

```ps1
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
```

セキュリティの警告が出たら

```ps1
Set-ExecutionPolicy RemoteSigned -scope CurrentUser 
```

## Docker のインストール&起動

VirtualBox あるいは VMWare が必要なのでインストールしておく。

以下の例は VirtualBox で 環境変数 HTTP_PROXY と HTTPS_PROXY が設定されている前提
多分プロキシ設定がない場合でも動くと思う。

### extracts bucket の登録

~~docker 関連のツールは scoop の extras bucket に入っているので登録する。~~
2017/10/18 docker系の 定義ファイル は scoop の [標準 Bucket](https://github.com/lukesampson/scoop/tree/master/bucket) に入ってた。
以下の extras bucket の登録等は必要ない。タブンネ( ˘ω˘ )

> ```ps1
> > scoop bucket add extras
> ```

> ※ Git がインストールされていないと git が必要と言われるので、

>```ps1
>> scoop install git
>```

> でインストールする。
> git の proxy 設定もおそらく必要なので以下のように設定しておく。

>```ps1
>> git config --global http.proxy $env:http_proxy
>> git config --global https.proxy $env:https_proxy
>```

### docker のインストール

```ps1
> scoop install docker docker-compose docker-machine
```

### docker-machine の作成

```ps1
# docker-machine の作成
# 環境変数 http(s)_proxy も一緒に登録
> docker-machine create -d "virtualbox" --engine-env  http_proxy=$env:http_proxy --engine-env https_proxy=$env:https_proxy default

# ローカルマシンの環境変数 no_proxy の設定
> $env:no_proxy="$(docker-machine ip)"

# ローカルマシンの環境変数を設定
> & docker-machine env | Invoke-Expression

# Hello world
> docker run hello-world

# 終了
> docker-machine stop
```

次回以降は以下のコマンドを叩く

```ps1
> docker-machine start
> $env:no_proxy="$(docker-machine ip)"
> docker-machine env | Invoke-Expression
```

### dockerインスタンスへのproxy設定

Docker インスタンスにも環境変数渡さないと動かない。

```ps1
> docker run -e http_proxy=$env:http_proxy -e https_proxy=$env:https_proxy -it ubuntu
```

うーん、プロキシ下で docker 動かすのは大変だ。

## 参考

* [Docker and Docker Compose · lukesampson/scoop Wiki](https://github.com/lukesampson/scoop/wiki/Docker-and-Docker-Compose)
* [Proxy環境下のDockerトラブルシューティング](https://qiita.com/tora470/items/cd9335f5ce638e11bb97)
* [ScoopでWindowsにおける開発環境構築を最適化しよう](http://blog.satotaichi.info/scoop/)