OmniAICreator/Qiita-1.07M huggingface dataset:
Apex システム関数

####ログイン情報の取得
[UserInfo](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_userinfo.htm)
`UserInfo.getUserId();` 005N0000003ABMuIAO
`UserInfo.getName();`   東京 太郎
`UserInfo.getUserName();` taro@text.com
`UserInfo.getProfileId();`
`UserInfo.getUserRoleId()`
`UserInfo.getLanguage()` //ja
`UserInfo.getTimeZone()` //Asia/Tokyo


####JSON
######取得
```java:
//String配列としてデータを格納している
String[] xx = 
  (List<String>)System.JSON.deserialize(xxx, List<String>.class);
//Map型としてデータを格納している。Valueは文字列のみ
Map<String,String> xx = 
  (Map<String,String>)System.JSON.deserialize(xxx, Map<String,String>.class);
//Map型だが、Valueの型がAnyの場合
Map<String,Object> xx = 
  (Map<String,Object>)System.JSON.deserializeUntyped(xxx);

```

######格納
```java:
//Systemは付けても付けなくてもOK
String accompaniers = JSON.serialize(new List<String>{user2.Id, user3.Id});  
```

####レコードタイプIDの取得
```java:
//レコードタイプのラベル名を元にIDを取得する方法
Map<String, Schema.RecordTypeInfo> recordTypes =  XXX__c.sObjectType.getDescribe().getRecordTypeInfosByName();
Schema.RecordTypeInfo recordType = recordTypes.get('レコードタイプのラベル名');
Id recordtypeId = recordType.getRecordTypeId();
```
この方法では下記のレコードタイプ名（英字）でIDを取得することはできない。
<img width="482" alt="Screen Shot 2017-02-03 at 21.12.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/161463/6f1467ca-0405-0ca1-0836-708d6fb8e4c7.png">
レコードタイプ名でIDを取得したい場合は、SOQLクエリーでDeveloperNameを取得する。-> [ここを参照](http://qiita.com/TaigarAndDragon/items/5932966e18cc4459da70#レコードタイプ)

####URLエンコード/デコード
`String encoded = EncodingUtil.urlEncode(value, 'UTF-8');` 
`String decorded = EncodingUtil.urlDecode(value, 'UTF-8');` 

####オブジェクトの3桁のプレフィクスを調べる
`xxx.sobjecttype.getDescribe().getKeyPrefix()` xxx はオブジェクト

####SF組織のベースURLを取得
`URL.getSalesforceBaseURL().toExternalForm()`
下記のようなURLを取得できる。
https://xxxx.cs31.my.salesforce.com/
stackdrive logging の基本

#stackdriveとは？
Googleが２０１４年に買収したサービスで、ユーザのクラウドアプリケーションの監視を代行し、
問題が起きたときにはdevopsの一部を自動化、そして、ユーザのクラウド利用状況を詳細に数字で把握し記録する。

#目的
システム管理者以外のユーザーが簡単にログを見れるようにする.

##用意
GCPのアカウントを作成する。（６０日間は無料）

基本的には[チュートリアル](https://cloud.google.com/logging/docs/quickstart-sdk)沿ってやる。

#Google Cloud Platform SDK のダウンロード
[ここ](http://www.task-notes.com/entry/20151019/1445223600)を参考に
cd
wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-137.0.1-linux-x86_64.tar.gz
tar -zxvf  google-cloud-sdk-137.0.1-linux-x86_64.tar.gz
./google-cloud-sdk/install.sh

**<環境変数を再起動>**
exec -l $SHELL
**<初期設定>**
gcloud init

URLがコンソールに表示されるのでそれにアクセス。

乱数が表示されるのでそれを、コンソールにコピペ。

**<いよいよgcloud ベータコマンド コンポーネントをインストール>**
gcloud components install beta
<log書き込み>
gcloud beta logging write my-test-log "A simple entry"

<構造化log書き込み>
gcloud beta logging write --payload-type=struct my-test-log '{ "message": "My second entry", "weather": "partly cloudy"}'

GCP->stackdriver->ログで一覧から見れる。

![スクリーンショット 2017-01-24 14.29.50.png](https://qiita-image-store.s3.amazonaws.com/0/95143/b6e04d0b-0bba-5756-17df-550674c44e56.png)
AWS&PHPからGCP Stackdriver Logging にlogを書き込んでみる

#前提
AWSインスタンスすでにある
[ここ](https://cloud.google.com/logging/docs/agent/installation)のチュートリアルを基本に進める

#AWSアカウントをStackdriver Monitoring に接続する。
[ここ](https://cloud.google.com/monitoring/accounts/guide#monitor-aws-project)を参考に


#承認認証情報を作成する
[ここ](https://cloud.google.com/logging/docs/agent/authorization#configuring_client_id_authorization)を参考に

#ログ エージェントをインストールする
AWSにて以下のコマンドをタターン！

curl -sSO https://dl.google.com/cloudagents/install-logging-agent.sh
sha256sum install-logging-agent.sh

チェックサムコマンド（ファイルの同一性を確認するための数値）の出力結果
07ca6e522885b9696013aaddde48bf2675429e57081c70080a9a1364a411b395  install-logging-agent.sh

インストールスクリプト実行
sudo bash install-logging-agent.sh

#ログエージェントとは？
ログエージェントは fluentd をベースとしており、Google Compute Engine や Amazon EC2 の仮想マシン（VM）インスタンス上で実行されます。このエージェントは、一般的なサードパーティのアプリケーションやシステム ソフトウェアから Stackdriver Logging にログをストリーミングします。ログ エージェントをすべての VM インスタンスにインストールすることをおすすめします。

#logに書き込んでみる
AWSのコマンドラインで
logger "hello my first log"

↓書き込まれている！
![スクリーンショット 2017-01-25 14.59.38.png](https://qiita-image-store.s3.amazonaws.com/0/95143/22c0bcf6-0044-11af-0148-ee968d08cce7.png)


#PHPで挑戦してみる

##Google API を使えるようにする

API Manager-> StackdriverLogging API->認証情報

Google-Cloud-PHPのAPI仕様は[ここ](https://github.com/googlecloudplatform/google-cloud-php)から

**<コンポーザをインストル>**
curl -sS https://getcomposer.org/installer | php

**composer.jsonに以下を書き込む**

```json:sample.json
    "require": {
        "monolog/monolog": "1.2.*"
    }
```
php composer.phar install
composer require google/cloud

**こんなエラーがでてきたら**
Installation failed, reverting ./composer.json to its original content.
The following exception is caused by a lack of memory or swap, or not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details

**↓これで解決**
/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024

pecl install grpc
composer require google/gax && composer require google/proto-client-php
sudo mv ~/composer.phar /usr/local/bin/composer

#記述方法
```php:sample.php
<?php
require 'vendor/autoload.php';

use Google\Cloud\Logging\LoggingClient;

$logging = new LoggingClient([

    'keyFilePath' => '/etc/google/auth/application_default_credentials.json',//←各々のkeyfilePathを設定
    'projectId' => 'XXXXXXX'//←各々のprojectIdを設定
]);


// Get a logger instance.
$logger = $logging->logger('syslog');//←logのインスタンスを生成

// Write a log entry.
$logger->write('my message from php ');//←出力メッセージを記載

//↓ここからはログを取得してコンソールに表示する↓
// List log entries from a specific log.
$entries = $logging->entries([
    'filter' => 'logName = projects/hoge/logs/syslog'//←表示したいログのパスを記載
]);

foreach ($entries as $entry) {
    echo $entry->info()['textPayload'] . "\n";//←ループでログを出力
}
```
もちろんログビューアからもログは見れます。

**<ログビューアからなら高度な検索を指定できる>**
例)
resource.type="aws_ec2_instance"
"Jan 25" AND ("pid 29718" OR "pid 29629")

#LoggingClientの詳しい仕様は↓
http://googlecloudplatform.github.io/google-cloud-php/#/docs/v0.20.1/logging/loggingclient


#その他
**"Project Name" と "Project ID"の違いは?**
Project Name は、ユーザが任意でつけれるものです。
一方 Project ID グーグルクラウドクライアントライブラリに認証接続するために必要になります。
[メモ] 異なる aws アカウント間での、s3バケットのコピー方法手順

# 概要
aws アカウント間をまたぐs3のバケットコピー方法をよく忘れるのでメモしておく。

# 手順
## コピー元バケットポリシー
- Principal にコピー先のaws アカウント ID を追加
  - 000000000001
     - コピー元 aws アカウント
  - 000000000002
     - コピー先 aws アカウント

```json
{
	"Version": "2012-10-17",
	"Id": "Policy1485173315727",
	"Statement": [
		{
			"Sid": "Stmt1485173309916",
			"Effect": "Allow",
			"Principal": {
				"AWS": [
					"arn:aws:iam::000000000001:root",
					"arn:aws:iam::000000000002:root"
				]
			},
			"Action": "s3:*",
			"Resource": [
				"arn:aws:s3:::org.excample.com",
				"arn:aws:s3:::org.excample.com/*"
			]
		}
	]
}
```

## コピー先EC2
EC2から aws s3 コマンドを実行するので権限的には `s3:*` の iam roleを割り当てておく

## s3 bucket コピー(コピー先アカウントのEC2で)
- コピーしたいディレクトリを指定している

```
aws s3 sync --region ap-northeast-1 s3://org.exsample.com/hogehoge s3://new.exsample.com/hogehoge
```
Apex String

[String class](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_string.htm?search_text=String)
####文字列の切り出し
`abc.left(n);` 左からn文字を切り出し
####文字列の長さ
`abc.length()`
####置換
`String replaced = abc.replace('@@@xxx@@@', '123')` @@@は置換される文字列(戻り値が置換された文字列であることに注意）
####文字列の分割
`String[] result = abc.split('\r\n')` 改行で分割
####型変換
`String.valueOf(123)`
`Integer.valueOf('123')`
####トリム
`String trimmed = abc.trim();`
####改行
`public final static String CRLF = '\r\n';`
IE9でcalc()が効かないときの忘備録

## ことの始まり

「はー。IE対応めんどくさいなー」
「でもIE９以上だとcalc()使えるし、まだ多少楽かな…」
「幅をcalc()で計算して、できた！」

-- 数日後

「IE9で崩れてるやん」


## 大まかな内容

```html:error.html
<div class="hoge">
  <ul>
    <li>
    <li>
    <li>
  </ul>
  <div class="moge">
</div>
```
```scss:error.scss
.moge {
  width: 100px;
}

.hoge {
  > ul {
    display: table;
    width: calc(100% - 100px); // 効かない

    li {
      display: table-cell;
    }
  }
}
```

## 対策

+ IE9ではtableまたはdisplay: tableに対してcalc()が効かない
+ divなどで囲ってやり、そのdivに対してcalc()をかけると解決。

## 参考

[Why doesn't the CSS calc() function work for me?](http://stackoverflow.com/a/32724768/6897398)
qiitaから自分のストックを全て削除したいスクリプト

# はじめに

qiitaのストックがフラット過ぎて管理できなくなったのでevernote管理に移行しました。その結果、qiitaに残っているストック一覧が目障りなので、掃除できたらいいなあと考えました。

# スクリプト

- `<ACCESS_TOKEN>`は、[個人用アクセストークン](https://qiita.com/settings/applications)を利用
    - scopeは、`qiita_read`, `qiita_write`あたりを選択する

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

# stock urls ( evernote移行用 stock url 回収 )
# curl -X GET "https://qiita.com/api/v2/users/imasami/stocks?per_page=100" | jq ".[].url"

# stock item ids
curl -X GET "https://qiita.com/api/v2/users/imasami/stocks?per_page=100" | jq ".[].id" -r > stocks.txt


# remove all stocks
access_token='<ACCESS_TOKEN>'
for i in `cat stocks.txt`
do
    curl -X DELETE -H "Authorization: Bearer ${access_token}" -H "Cache-Control: no-cache" "https://qiita.com/api/v2/items/${i}/stock"
done
rm stocks.txt
```

# メモ

- [shとbashでの変数内の文字列置換など - ろば電子が詰まっている](http://d.hatena.ne.jp/ozuma/20130928/1380380390)
    - sedを使わないでシェルスクリプトだけで文字列置換を行う
Pythonの三項演算子の効きかたにびっくりした

よく考えなくても当たり前のことですし、多分皆さまは知ってることだと思うのですが面白かったので投稿します。

Pythonで正誤判定するときに以下のように三項演算子を使いました。

``` hoge.py
print 'No.' + str(i) + ' is ' + 'True' if test[i][1] == res else 'False' + ' (true label:' + test[i][1] + ', predicted label: ' + res + ')'
```

結果、
```
No.1 is True
False (true label: 3, predicted label: 0)
No.3 is True
No.4 is True
No.5 is True
No.6 is True
No.7 is True
No.8 is True
No.9 is True
No.10 is True
No.11 is True
False (true label: 1, predicted label: 2)
No.13 is True
No.14 is True
False (true label: 1, predicted label: 2)
```

正誤ごとの結果が演算子の前後にあるので前の全文と後ろの全文に効いてくるんですね。
カッコで囲めば期待通りに動くのですが、この使い方でも色々できそうだなぁと思いました。おしまい。
新米iOSエンジニアの広告用語集

iOSエンジニアに転職して４週目に突入。
業務でアプリ内広告の改修案件を担当することになったので、初めて知ったネット広告用語を忘れないようにメモしておく。多分随時追記。

##アプリ内広告の分類
###オーバーレイ広告
アプリの下部に表示されていて、リストを上下にスクロールしても底にくっついていて動かないやつ。

###インフィード広告
TableViewのリスト内に混ぜて表示させる広告。

###レクタングル広告
商品詳細ページとかのView内に表示させるやつ。
レクタングルは長方形という意味だけど、どちらかと言うと正方形に近いタイプの広告。

##配信単価
###CPC【Cost Per Click】クリック単価
１クリックあたりの広告料金。

###CPM【Cost Per Mile】インプレッション単価
表示1000回当りの広告料金。

##広告効果計測用の指標
###インプレッション【Impression】
広告の表示回数のこと。１回の表示が１インプレッション。。
「表示」じゃだめなの・・？

###CTR【Click Through Ratio】クリックスルー率
CTR = 広告がクリックされた回数 / 広告が表示された回数。

###CVR【Conversion Rate】コンバージョン率
CVR = 購入や申込みに至った回数 / 広告をクリックされた回数。
CVRが低すぎると、CTRが高くても誤クリックである可能性が高まる。
そうすると、クリック単価を下げられてしまうことも。
ユーザーの誤クリックを誘うような位置に広告を配置して、CTRを上げようという狡い施策は結果的には収益減を招く可能性があるということ。

##その他の用語
###広告在庫
読んで字のごとく広告の在庫。広告在庫が切れると、その会社自身の広告が表示されたりする。
テレビでACのCMが頻繁に流れている状態のことを「広告在庫が切れている」というんですね。

###クリエイティブ
広告の制作物。
「クリエイティブの品質が高い」などのように使う。
HTMLのhead内の面倒なコードはEmmetを使って鬼速でコーディングすべき

HTMLページを新規で作成する場合、最上位に書くのは`head`タグですが、記述すべき量は多くて時間がかかります。HTMLコードを短いコードで記述可能な[Emmet](http://docs.emmet.io/)を使えば、ドキュメント宣言、`meta:viewport`等の`head`部分に必要なコードを効率よく記述できます。

なお、基本的なEmmetの書き方については、geechs magazineの「[学生だって覚えたい！Emmet(省略記法)で鬼速コーディング](https://geechs-magazine.com/tag/lifehack/20160811)」が分かりやすいので参照ください。

# `head`タグ内に必要なタグをまとめて指定する
Emmetでは、**ドキュメント宣言や`title`、`meta`等、HTMLの最初に書くコードをまとめて指定できます**。面白いことに、**「`!`」一つで展開可能です。**

```html:Emmet
!
```

```html:展開後のHTML
<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

</body>
</html>
```

`doctype`、`html`、`meta:charset`、`meta:viewport`の他、IEのレンダリングモードを最新にする`<meta http-equiv="X-UA-Compatible" content="ie=edge">`も設定されています。この機能をTwitterで紹介したところ、反響がありました。

展開は快感なので、知らなかった方は是非試してみてください。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">doctype・html・head・body等のHTMLを最初に書くときに使うコードを「!」一つで生成するEmmet先生は、もっとフロントエンド界で知られるべきだと思う。<a href="https://twitter.com/hashtag/Emmet?src=hash&amp;ref_src=twsrc%5Etfw">#Emmet</a> <a href="https://t.co/9boWCYfC0W">pic.twitter.com/9boWCYfC0W</a></p>&mdash; Takeshi Kano 鹿野 壮 (@tonkotsuboy_com) <a href="https://twitter.com/tonkotsuboy_com/status/751288139524648966?ref_src=twsrc%5Etfw">July 8, 2016</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## XHTMLの場合
HTML5ではなくXHTMLやHTML4で`head`をまとめて指定したい場合は、次のように記述します。

```html:Emmet(XHTML)
html:xt
```

```html:Emmet(HTML4)
html:4t
```

例えばXHTMLの方は展開する次のようになります。

```html:XHTML用Emmetの展開後
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  <title>Document</title>
</head>
<body>

</body>
</html>
```

次のセクションからは、個別に`head`内の指定をする方法を紹介します。

# `meta`タグのviewport指定
レスポンシブwebデザインが主流になった現在、`meta`タグのviewport指定が必要なケースは多いです。Emmetでは次のように記述できます。

```html:Emmet
meta:vp
```

展開後のHTMLコードには、`width`、`initial-scale`等、viewportに必要なコードが記述されます。

```html:展開後のHTML
<meta name="viewport"
      content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
```

# ドキュメント宣言の展開
`doctype`のみを展開したい場合は、`!!!`と記述します。

```html:Emmet
!!!
```

```html:展開後のHTML
<!doctype html>
```

XHTMLやHTML4の面倒なドキュメント宣言も短いEmmetで展開可能。今はHTML5が主流ですが、レギュレーションの関係で古い宣言が必要な場合もあるでしょう。

例えばXHTMLは次のとおり。

```html:XHTMLのドキュメント宣言
!!!xt
```

```html:展開後のHTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
```

HTML4は次のとおりです。

```html:HTML4のドキュメント宣言
!!!4s
```

```html:展開後のHTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
```

# HTMLの`head`で消耗するのはもう辞めよう
Emmetを使えばHTMLの`head`の内容を一瞬で記述できます。決まりきったコードはEmmetで処理してしまい、空いた時間で我々はコンテンツの作り込みに時間を割きましょう。
Androidの省電力機能

HW的なspecではなく、アプリの動作を制限するタイプの、Androidの省電力機能について。

---
# Androidスマホの省電力機能は、大きく分けて2つ

1. low-battery時の緊急用
2. 常時動くもの

---
# low-battery用

- メーカ独自のもの
- 二段階あったりする
    - 閾値(15%など)を切った時に発動
        - アプリのBG通信、バイブレーション、描画速度、GSP等を制限
    - 数%時/災害時の待ち受け
        - 使えるアプリが限定的
        - 待ち受け（ホーム画面）自体が変わる

---
# 常時動くもの
- スリープする
    - Screen Offする、WiFiを切る、CPUが眠るなど
    - wake lock により誰でも起こすことが出来る
- メーカ独自のものも、あった
    - アプリを選択してBG通信を制限するなど
- Android M (6.0) から、2つの新機能を搭載
    - 使っていないアプリを動作させない (App Standby)
    - 使っていない時に動作させない (Doze)

---
# App Standby
- ユーザが使っていない
- 他アプリも使っていない
- 通知を出していない

いずれかに該当すれば、BGでのnetwork accessができなくなる。

---
# Doze
- 画面消灯、バッテリー駆動で、端末を動かさないと、一定時間でIDLE状態
- App Standbyと違い、network accessだけでなく動作自体が制限される


---

# Doze (Android M)

![android doze](https://developer.android.com/images/training/doze.png)

stationary とは？

---
# Significant Motion Sensor
- ユーザの動きを検出する、ワンショットのセンサー
- 加速度センサーを使用
    - or another as long as low power
- repeatedly でない false negative を許容
    - 実際は動いているけど検知しないのは OK
    - 実際に動いていないのに検知するのは NG
        - 省電力繋がらない

---
# Significant Motion Sensor
- triggerとなる例
    - ウォーキング、サイクリング
    - 自動車や列車に乗っている
- triggerとならない例
    - ポケットに中に入れていて、人は動いていない
    - テーブルに置いてあって、テーブルが道路や洗濯機の振動で少し揺れる

---
# DozeでのSensorの使われ方

![android doze](https://qiita-image-store.s3.amazonaws.com/0/107584/c09175ca-9680-e76a-f42a-a9ddfd7d3d8c.png)

[Androidのソースコード](https://android.googlesource.com/platform/frameworks/base/+/android-6.0.1_r78/services/core/java/com/android/server/DeviceIdleController.java) より解析。
画像は [Android MのDozeにおける状態遷移](http://qiita.com/komitake/items/4476e7e4d1b5ed3a8b97) より。

---
# IDLE中の動作制限

- network access
    - 全て不可
- alarm による起床
    - alarm clock（目覚まし時計など）は動く
        - すぐに ACTIVE 状態に戻る
    - それ以外は無視
- wake lock
    - 全て無視
- Could Messaging (GCM/FCM) 受信
    - high-priorityでないメッセージは受信できない
- GPSとWiFiのスキャン
    - 動作しない

---
# whitelist

ユーザによる設定で、アプリを動作制限の対象外リストに入れることが出来る

- network access が可能となる
- CPUのみを起こすwake lockが可能となる

注: Google Play ポリシーでは、アプリの主要機能が悪影響を受けない限り、アプリを直接的に Android 6.0 以降の電力管理機能（Doze とアプリ スタンバイ）の対象外とするよう要求することを禁止しています。


---
# Android N (7.0) で更に改善
IDLEを2段階（LightとDeep）に分け、段階的に制限をかける

- まずは network access と Sync/Job を制限
- つぎに alarm や wake lock などを制限

Light IDLE へは、端末が静止していなくても突入する

---
# Doze (Android N)

![android doze](https://developer.android.com/images/android-7.0/doze-diagram-2.png)

---
# 資料

- https://developer.android.com/training/monitoring-device-state/doze-standby.html
- https://developer.android.com/about/versions/nougat/android-7.0-changes.html?hl=ja
- https://source.android.com/devices/sensors/sensor-types.html
claudia-js の custom-authorizer を理解する

最初に: AWS 初心者なので用語の使い方、とくにIAM付近が正しいかよくわかってないです。

## 概要

- claudia-api-builder で `{ customAuthorizer: 'testAuth' }` と指定すると、**それ自身が呼ばれる前に**、`testAuth` の lambda function が起動する
- `testAuth` 側では、ログイン成功可否と、そのユーザーのIAM Policy を生成することができる
    - `execute-api:Invoke` と Resource 該当リソースへのアクセスを許可することで、認証を実現できる

## Example

https://github.com/claudiajs/example-projects/tree/master/custom-authorizers を読んで理解する。

testAuth として登録される authorizer.js

```js:authorizer.js
/*global exports, console */
var generatePolicy = function (authToken, methodArn) {
	'use strict';
	var tmp = methodArn.split(':'),
	apiGatewayArnTmp = tmp[5].split('/'),
	awsAccountId = tmp[4],
	region = tmp[3],
	restApiId = apiGatewayArnTmp[0],
	stage = apiGatewayArnTmp[1];

	return {
		'principalId': authToken.split('-')[0],
		'policyDocument': {
			'Version': '2012-10-17',
			'Statement': [{
				'Effect': 'Allow',
				'Action': [
					'execute-api:Invoke'
				],
				'Resource': [
					'arn:aws:execute-api:' + region + ':'  + awsAccountId + ':' + restApiId + '/' + stage + '/GET/unlocked'
				]
			}]
		}
	};
};
exports.auth = function testAuth(event, context, callback) {
	'use strict';
	console.log('got event', event);

	/*
	 * {
	 * "type":"TOKEN",
	 * "authorizationToken":"<Incoming bearer token>",
	 * "methodArn":"arn:aws:execute-api:<Region id>:<Account id>:<API id>/<Stage>/<Method>/<Resource path>"
	 * }
	 */
	if (event && event.authorizationToken && event.methodArn) {
		callback(null, generatePolicy(event.authorizationToken, event.methodArn));
	} else {
		callback('Unauthorized');
	}
};
```

- 認証できるかの判定
- 認証できた場合のIAM Policy


次に、それを使用する claudia-api-builder

```js:index.js
/*global require, module */
var ApiBuilder = require('claudia-api-builder'),
	api = new ApiBuilder();

module.exports = api;

api.registerAuthorizer('testAuth', {
	lambdaName: 'testAuth',
	lambdaVersion: true
});

api.get('/', function () {
	'use strict';
	return 'OK';
});

api.get('/locked', function () {
	'use strict';
	return 'NOT-OK';
}, { customAuthorizer: 'testAuth' });

api.get('/unlocked', function (request) {
	'use strict';
	return 'OK for ' + request.context.authorizerPrincipalId;
}, { customAuthorizer: 'testAuth' });
```

- `api.registerAuthorizer` で `testAuth` との関連付けを登録
- `/` は誰でもアクセスできる
- `/unlocked` にそのまま（Authorizationヘッダ無しで）アクセスすると event.authorizationToken が足りないため、`testAuth` で `callback('Unauthorized')` でアクセス権が付与されず、落ちる
- `/unlocked` にAuthorization ヘッダ付きでアクセスすると ポリシーが付与され、アクセスに成功する
    - `curl -i https://<your-hash>.execute-api.ap-northeast-1.amazonaws.com/dev/unlocked -H 'Authorization: Bob-123'` => `Ok for Bob-123`
- `/locked` は認証成功してもIAMポリシーが付与されないので、アクセスできない

## 実際の使い方を考える

DynamoDBをバックエンドに普通の認証系を作りたい

- `/register` で username/password を送って、DynamoDBのusersテーブルへ書き込み、accessToken を生成して書き込み、クライアントへ返す
- クライアントからaccessToken をHeaderに入れてリクエストをすると、authが通る
- `/logout` で accessToken 破棄
- `/login` で username/password で accessToken 再生成

TwitterのOAuthを通したい

- TwitterのOAuthフローに飛ばす
- OAuth認可のコールバックをLambdaでうける
- nodeのoauthライブラリを使ってOAuthの検証/処理を進め、TwitterのaccessTokenを手に入れる
- あとはアプリ用AccessTokenを生成して↑の認証と一緒

たぶんこうなるってだけで、まだ作ってないのでこれから確かめる
iOS 10.3で追加されたアプリレビューを投稿できるSKStoreReviewControllerを試してみた

iOS 10.3に追加された`SKStoreReviewController`を使うとアプリから直接App Storeへレビューをすることができます。

> Using the SKStoreReviewController API, you can ask users to rate or review your app while they're using it, without sending them to the App Store. 

また、App Store上のレビューへの返信もできるようになるようです。

> you will be able to respond to customer reviews on the App Store in a way that is available for all customers to see.

## 実装方法

以下の2行を追加することでレビューを促すアラートを表示することができます。

``` swift
import StoreKit
```

``` swift
SKStoreReviewController.requestReview()
```

## 所感

今回の変更でレビューまでのステップが減るので、より多くのフィードバックを受けることができそうです。

また、レビューへの返信ができることで、「〇〇ができない」といったコメントをしていたユーザをサポートすることができるようになり、返信を見ることで他のユーザの問題も解決できる可能性があります。
レビュースコアをKPIに置いているのか、高いレートをつけそうなユーザだけをApp Storeに遷移させ、低いレートをつけそうなユーザをアンケートフォーム等に遷移させるアプリもありますが、不具合とその解決方法や対応状況がレビュー上で共有されている方がユーザにとっては嬉しい状況になりそうです。

## 参考

- https://developer.apple.com/reference/storekit/skstorereviewcontroller
- https://developer.apple.com/library/prerelease/content/releasenotes/General/WhatsNewIniOS/Articles/iOS10_3.html
EmmetでHTML 5.1のレスポンシブイメージを効率よく記述しよう

HTML、CSSを短い文字数で打てるプラグイン[Emmet](http://docs.emmet.io/)を使いこなせば、コーディングの時間は大きく短縮されます。昨今のEmmetでは、HTML 5.1のレスポンシブイメージ(※)を効率的に記述できることをご存知でしょうか？

本エントリーでは**Emmetでレスポンシブイメージのコードを効率的に記述する方法を紹介します**。

※ 参考記事「[レスポンシブイメージで画像の表示を最適化 〜CSSもJSもいらないHTML 5.1の新機能 - ICS MEDIA](https://ics.media/entry/13324)」

# `srcset` の記述
レスポンシブイメージでは、デバイス環境に応じた最適なファイルサイズの画像を表示するために`img`要素の`srcset`属性を用います。Emmetでは次のように記述します。

```html:Emmet
ri:v
```

または

```html:Emmet
img:z
```

展開後のHTMLコードは次のとおりです。レスポンシブイメージに必要な`sizes`、`src`を指定しつつ、`img`タグが展開されます。

```html:展開後のHTML
<img sizes="" srcset="" src="" alt="">
```

# アートボード(`picture`、`source`)用の記述
レスポンシブイメージのもう一つの機能として、最適な「見た目」の画像を出し分ける為の`picture`要素があります。Emmetでは次のように省略できます。

```html:Emmet
ri:art
```

展開後のHTMLコードは次です。`picture`を構成する`source`タグ(`media`属性、`srcset`属性を含む)、`img`タグが展開されます。

```html:展開後のHTML
<picture>
  <source media="(min-width: )" srcset="">
  <img src="" alt=""></picture>
```

## `source`タグのみを展開する
`picture`要素は複数の`source`要素から成り立つので、`source`タグのみを展開したいケースがあります。`media`属性のみ指定、`sizes`も併せて指定等、いくつかの指定方法があります。

```html:media属性のみ指定
src:m
```

```html:展開後のHTML
<source media="(min-width: )" srcset="">
```

`media`と`sizes`を両方展開したい場合のコードです。

```
src:mz
```

```html:展開後のHTML
<source media="(min-width: )" sizes="" srcset="">
```

例えば、3つの`source`タグを展開したい場合には、次のように記述するとよいでしょう。

```html:Emmet
picsrc:mz*3
```

```html:展開後のHTML
<source media="(min-width: )" sizes="" srcset="">
<source media="(min-width: )" sizes="" srcset="">
<source media="(min-width: )" sizes="" srcset="">
```

# レスポンシブイメージには嬉しい機能
レスポンシブイメージは、今後のレスポンシブwebデザインを考える上で標準となる機能だと予想していますが、コードの記述量の多さがネックでした。

Emmetを使えば短いコードで済むので、今回の機能を覚えて無駄なコーディング時間をなくしましょう。
gccの正規表現がバグだらけという話

# その1
例えば、次の簡単なコード（抜粋）をgcc 4.9.2で実行してみましょう。

```cpp
string s("test");
smatch m;
regex re(R"([A-Z_a-z]+)");
if (regex_search(s, m, re)) {
    cout << m[0] << endl;
}
else {
    cout << "Not matched" << endl;
}
```
[Wandbox](http://melpon.org/wandbox/permlink/V2K8D6dQBcEmYpD8)

    Not Matched

！！！？？？
どうなってるの？？？

これ、"_" の場所を変えたりしたらマッチするようになるんですよ。
なぜか？
わからない。わかりたくもない。
こんなファッキンなバグが、gcc 4.9.2 まで残ってるんですよ。
4.9.3 では直っていました。

#その2
今度は、これをgcc 4.9.2 で実行してみましょう。
文字クラスにマッチさせるだけの簡単な正規表現です。

```cpp
string s("~");
smatch m;
regex re(R"([~\-_])");
if (regex_search(s, m, re)) {
    cout << m[0] << endl;
}
else {
    cout << "Not matched" << endl;
}
```
[Wandbox](http://melpon.org/wandbox/permlink/3HxNuMyqaELXtQTu)

    Not Matched

えぇ…。
まあ、気を取り直して、4.9.3 で動かしてみましょう。
[Wandbox](http://melpon.org/wandbox/permlink/dco7OiM9V79HvVFN)

```
terminate called after throwing an instance of 'std::regex_error'
  what():  regex_error
Aborted
```

なんでだよ！
このエラー、どうやら"\\-"のエスケープが効いていない（"\\]"は大丈夫なようです）ことによるもののようで、gcc 6.1.0 でも直っていませんでした。
（やれやれ）
gcc HEAD 7.0.1 20170123 (experimental)では直っていました。
**使えるか！！**

まあ、こちらのほうはその1みたいに完全に意味不明というわけではなく、"-"のエスケープをあきらめて、文字クラスの先頭か末尾に持って行けばいいので、まだ対処可能です。

#結論
gccを窓から投げ捨てましょう。
**Clangでは、当然のことながら、どちらもOKです。**

まあ、投げ捨てられない場合、できるだけ新しいものを使って、**文字クラスにハイフンそのものを入れる場合は、エスケープせずに先頭か末尾に入れましょう。**
スクロールが終わった時にイベント処理


```javascript:sample.js
// スクロールイベントを設定
window.addEventListener( "scroll", function(){
    // setTimeoutIdの内容がある場合は、setTimeoutをキャンセル
    if(setTimeoutId){
	    clearTimeout(setTimeoutId) ;
    }

    // 新しくsetTimeoutイベントを設定
    setTimeoutId = setTimeout( function(){
		// スクロール終了時の処理内容
		if("<%=rirekiKeepFlg %>" == "1"){
			// スクロール位置保管
			ajaxSaveScroll();
		}

        // setTimeoutIdを空にする
		setTimeoutId = null;
    }, 500) ;
});
```
VBでiniファイルの取得方法

```vbnet:sample.vb
Const DEF_STR As String = vbNullString
Dim nmBuffer As String = New String(" ", 64)         ' iniファイルから取得した項目(事前に領域を設定)

' iniファイル名を指定
Dim iniFileName As String = Application.StartupPath & "\sourceCheck.ini" 'INIファイル名
        
' 項目名を指定し、設定内容を取得
Dim ret As Integer = GetPrivateProfileString("CHKCONF", "userNm", DEF_STR, nmBuffer, nmBuffer.Length, iniFileName)
        
' 設定内容の一番後ろがnullCharなので、余計なものをtrimしておく
userNmText.Text = nmBuffer.Substring(0, nmBuffer.IndexOf(vbNullChar))
```
[TouchDesigner] 起動時にPerform Modeで複数ウィンドウを各画面にフルスクリーン出力する方法

![td_final.png](https://qiita-image-store.s3.amazonaws.com/0/127402/d45e8597-8d7c-d8fb-1485-c0d9100efa73.png)

アプリケーション起動時にPerformModeで立ち上げ、自動的に複数のディスプレイをフルスクリーン出力する方法を考えてみました。
展示作品の場合、プログラムを操作する人間が常にいるわけではない為、ボタンでウィンドウを立ち上げるわけにはいきません。
もっといい方法があるかもしれませんが、とりあえずメモ程度に...

追記
**参考にしちゃだめ！**

# 最終的なノード
今回は1つの動画を「上、中、下」3分割し、3つのディスプレイにそれぞれ出力する場面を考えます。
動画の分割方法については別途記事を書く予定です。
![2017-01-25_120209.jpg](https://qiita-image-store.s3.amazonaws.com/0/127402/6cafc3a8-c795-331e-151e-d0e54a0354ec.jpeg)

# 1. Window COMP
映像の最終出力結果を保持したオペレータを「Operator」にアタッチすることで、
映像を外部Windowとして出力することが可能になります。
![2017-01-25_122018.png](https://qiita-image-store.s3.amazonaws.com/0/127402/7335b145-92ea-a8f1-cff4-86d06953afd7.png)
今回はproject1コンポーネントの子階層で、「top, medium, bottom」という名前のnull DATを最終出力としているので、
このような表記となっています。
残り2つのwindowコンポーネントについても、project1/medium, project1/bottomという具合で最終出力を参照しています。

マルチスクリーンに描画する際は、それぞれの「Location」を「Single Monitor」に設定し、「Monitor」インデックスを適切な出力先に割り当ててください。
フルスクリーン描画する際は「Size」を「Full Location」、「Borders」を「Off」に変更します。
後の設定は適宜自由に行ってください。
![2017-01-25_125950.png](https://qiita-image-store.s3.amazonaws.com/0/127402/ea30bd14-e427-303b-feb1-c791f3dd5d37.png)


# 2. Info CHOP
アタッチしたオペレータのattributeを参照することができます。
今回はこの中の「winopen」パラメータを使用していきます。
このパラメータは、Windowが開かれている場合に1、それ以外の場合に0を返します。
![2017-01-25_120505.png](https://qiita-image-store.s3.amazonaws.com/0/127402/1dca6822-c97b-4f5a-22c5-a6c1cf0f7a5e.png)

# 3. Select CHOP
先述のように、「winopen」パラメータのみを使用するので、これを抽出します。
![2017-01-25_120447.png](https://qiita-image-store.s3.amazonaws.com/0/127402/19eb0d1a-042f-2036-9bb5-98e6eff3dcdc.png)

# 4. Logic CHOP
今回は
・「Windowが閉じている場合はWindowを開く」
・「Windowが開いている場合は何もしない」
というロジックを組んでいきます。
Window COMPの「Open In Separate Window」に「0から1」のパルス信号を渡すと
ウィンドウが立ち上がる仕組みとなっているので、これに合うように値を編集します。

ウィンドウが立ち上がっていないとき、渡ってくる値は「0」ですが、
ウィンドウが立ち上がっていなければウィンドウを立ち上げる、すなわち「1」をExportするという処理を実装するため、
論理値を反転させる必要があります。
よって、このLogic CHOPでは、「Channel Pre OP」を「Invert」に設定し、論理値を反転させます。

**※このチャンネル値をWindow COMPの「Open In Separate Window」にExportすればいいように思われますが、
Perform Modeで初回起動した際、ウィンドウは立ち上がりません。(常に1ではトリガーとして作用しない)**

![2017-01-25_120529.png](https://qiita-image-store.s3.amazonaws.com/0/127402/e5dd8a85-6e4f-08ef-e75a-f7ab1d8bb61c.png)

# 5. Delay CHOP
先ほどの注釈を踏まえて、起動時はチャンネル値が0であるように仕向けます。(正しい方法かわかりませんが)
Delayを仕込むことによって、起動時に前ノード(Logic CHOP)から出力された「1」という値は一定時間遅延して出力されます。
Delay CHOPの初期値は0であるので、うまく「0 -> 1」の遷移ができるという理屈です。
そして、このチャンネル値を初めのWindow COMPの「Open In Separate Window」に出力します。
![2017-01-25_120615.png](https://qiita-image-store.s3.amazonaws.com/0/127402/a4c7a9d1-5f4f-bc29-a0a1-2b70d258d473.png)

# 注意
初めからすべての画面にフルスクリーンで出力すると、PCの操作ができなくなります。
(なぜなら、ウィンドウを消すとロジックに検出されてウィンドウが再び立ち上がるからです)
展示作品の場合は常にコンテンツだけを表示させたいということもあって、この手法で実装しています。
あしからず。
HTMLやらPHPで読み込んでいるCSSやJSが反映されない時にはブラウザのキャッシュを消してみる

学生の時には普通に考え付いたことも一年半ほどWEBについて触ってないとブラウザのキャッシュを疑うことを忘れてしまうようです。

#何が起こったのか
デザインの確認の際に、CSSを更新してあるのにも関わらず、更新を押してもデザインが反映されなかった。

#解決方法
ブラウザのキャッシュを削除する。

Choromeなら
**右クリック→検証→→**
![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/85815/4c809b35-1727-db6b-4edf-90f10301f0b5.jpeg)
**→→検証ツールが表示されてから更新ボタン部分を長押し→キャッシュの消去とハードの再読み込み**をクリック
![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/85815/882e8e32-9c9b-375e-aa90-a81ab3e38299.jpeg)

※右クリックが禁止されているサイトなら、ブラウザ右上の「・・・」から、
**その他のツール→デベロッパーツール**　で開けます。

これでCSSやらが再度読み込まれて更新が反映されるかと思います。

#そのほかに疑うべきこと
上の方法で再度読み込みをしても更新分が反映されない・・・
というときには基本的ですが、以下の項目も確認してみてください。

**・そもそもHTMLやPHPに更新されたCSSやJSを読み込むための記述があるか
・CSSやJSがディレクトリに存在しているか
・バージョン管理（Gitは知らないのでSVNを例として）している場合、対象のファイルを更新して最新のファイルを落としてきているか
・各ファイルでシンタックスエラー（構文ミス）が発生していないか
・CookieとかSessionとか消してみる**

とかですかね

まあ思いつく限りやってみてダメなら他の人に相談してみましょう

おわり
PHPの出力で文字を改行（\n）させるには’’（シングルコーテーション）じゃなくて""（ダブルコーテーション）で記述する

プログラマの皆さんにとっては基本的なことで「なにいってんだこいつ」となるかと思いますが、
自分は知らなかったので、後日の禍とならぬようここに書き留めておこうと思います。

#何が起こったか
PHPで変数を出力（echo）した際に、改行コードも記述して見やすくしようとしたが
いざ出力してみると改行がされていなかった

・コード

```php:echo_test.php
$text = 'あいうえお\nかきくけこ';

echo $text;
```
・出力結果

```text:出力結果
あいうえお\nかきくけこ
```
#解決方法
改行コードを""（ダブルコーテーション）で囲ってやると改行が反映される。

・コード

```php:echo_test.php
$text = 'あいうえお'."\n".'かきくけこ';

echo $text;
```
・出力結果

```text:出力結果
あいうえお
かきくけこ
```
PHP 正規表現メモ

#正規表現メモ
個人的に使用した正規表現を淡々とメモしていくページ。
下部にリファレンス記載。


##画像パスから、ファイル名・拡張子・ID・縦・横サイズを抜き出す正規表現。
対象文字列：news789_NS_789_9457_2_240x240.jpg
正規表現　：/^hoge([0-9]+)_(.+)_([0-9]{2,4}?)x([0-9]{2,4})\.(jpg|gif|png)/
>$match[0] = hoge_NS_789_9457_2_240x240.jpg
>$match[1] = 789
>$match[2] = NS_789_9457_2
>$match[3] = 240
>$match[4] = 240
>$match[5] = jpg

##リファレンス
###文字クラス
|文字クラス||
|---|---|
|[abc]|a,b,cいずれかの1文字|
|[^abc]|a,b,c以外の1文字|
|[A-Z]|大文字のアルファベット1文字|
|[0-9]|数字1文字|
|[a-zA-Z0-9]|アルファベットか数字1文字|
|[!-~]|半角文字1文字|
|\w|アルファベットか数字かアンダースコア1文字|
|\W|アルファベット、数字、アンダースコア以外の1文字|
|\d|[0-9]と同じ|
|\D|[^0-9]と同じ|
|\s|空白1文字 （[ \r\t\n\f\v] と同じ）|
|\S|空白以外1文字 （[^ \r\t\n\f\v] と同じ）|
|\n|改行|
|\t|タブ|


###量指定子
|量指定子||
|---|---|
|*|0回以上の繰り返し|
|+|1回以上の繰り返し|
|?|0回または1回の出現|
|{n}|n回の繰り返し|
|{n,m}|n回以上、m回以下の繰り返し|
|{n,}|n回以上の繰り返し|
※量指定子に続けて?を記述すると、最短でのマッチングを実施。

###その他のメタ文字
|その他のメタ文字||
|---|---|
|.|改行以外の1文字|
|^|行頭|
|$|行末|
|パイプ|いずれかの文字列|
|()|グループ化|
|\\|直後のメタ文字をエスケープする|

※パイプは→|

###修飾子
|修飾子|（末尾のデリミタの後ろに記述)|
|---|---|
|i|大小文字の違いを無視する|
|s|シングルラインモードにする(.が改行にマッチする)|
|m|マルチラインモードにする(^と$が改行の直前直後にマッチ)|
|u|マルチバイト（UTF-8）対応|

※メタ文字は \ ^ . $ * ? | ( ) [ ] { }
※[ ]内はメタ文字が通常の文字として扱われるのでエスケープする必要無し。
DELL iDRAC6 の注意点

# Frimware Version
iDRAC6 は PowerEdge Gen11 のサーバに採用されているリモート管理アダプタ。
[iDRAC6 のご紹介](http://ja.community.dell.com/techcenter/m/mediagallery/481/download)

搭載可能なサーバーの対象は

```
PowerEdge
T110、T110 II、R210、R210 II、R310、T310、R410、T410、R415、
R510、R515、R610、T610、R710、T710、R715、R810、R815、R910、
M610x、M610、M710、M710HD、M810、M915
```

一見するとヤフオクや eBay で買ってきてポン付けしたら動きそうであるが実はそうではないというのが今回の話。
iDRAC6 自体は ２つのドーターカードで構成されている。

```
iDRAC6 Express CARD　(写真左)
  iDRAC の firmware が搭載されたカード
iDRAC6 Enterprise CARD　(写真右)
  SDカードスロット及びiDRAC専用NICが搭載されたカード   
```

この iDRAC6 Express CARD に実は罠がある。PowerEdge Gen11 では初期に販売されたものと後発で販売された製品が混在している（例えばR210 II）。iDRAC6 Express CARD の firmware version が古いと、後発で販売された筐体ではカードが認識されず、使うことが出来ない。

```
iDRAC6 Monolithic FW Version まとめ
Version 1.0
  | R610, R710, T610 のサポート
Version 1.2
  | R410, T410, T710 のサポート
  | Auto-Discovery
Version 1.3
  | R210, T310, R510 のサポート
  | WebUIが更新される
  | Syslog, vFlash 512MB SDcard, Boot Once
Version 1.5
  | R310, R715, R815, R910 のサポート
  | ファイル共有が可能になる
  | Serial Over LAN, Virtual Console Preview, Reset iDRAC Using GUI 
Version 1.7
  | R210 II, R415, R515, R810 サポート
  | WebUIのデザインが今のものと同じになる
Version 1.8
  | R210 II で Sandy Bridge に対応
Version 1.8.5
  | 推奨最低Version
Version 1.9
  | openssl, openldap, libxml が更新される
Version 1.95
Version 1.96
Version 1.97
Version 1.98
Version 1.99
  | OpenSSL POODLE 対応
Version 2.80
Version 2.85(latest)
  | OpenSSL upgraded to v1.0.1p.
  | OpenSSH upgraded to v7.0p1

1.9 以降は主にセキュリティー系の更新しかありません。
```

というわけで、もし中古で買い付けた iDRAC6 Express CARD の firmware が古かった場合、素直に買い直すか初期販売された筐体を使って version up するしかないです。
ショートカットを活用しよう - 12 - Ctrl + +

# <kbd><kbd>Ctrl</kbd> + <kbd>+</kbd></kbd> の効果
<font color="red"><b>※注：テンキー側の<kbd><kbd>+</kbd></kbd>のみで、通常の<kbd><kbd>+</kbd></kbd>（<kbd><kbd>;</kbd></kbd>）は<kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>+</kbd></kbd>としても機能しません。</b></font>
エクスプローラ限定での話ですが、名前の欄の幅をもっとも長い名前の長さに合わせます。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/cf3a3a04-85a7-a40a-7c3e-196319a26ece.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/f4974884-207a-3197-309e-ad49601b098e.png)

名前が見えなくて長さを調整したい時にとても便利です。

以上

|前回|方針|次回|
|:--|:--:|--:|
|[<kbd><kbd>Win</kbd> + <kbd>+</kbd></kbd>](http://qiita.com/rrryutaro/items/15b048396dcd5fed1705)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|[<kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Esc</kbd></kbd>](http://qiita.com/rrryutaro/items/a5219344d8cf51af1261)|
EC-CUBE3 Formのcollectionを使ったPOST値について

現在あるプロジェクトでEC-CUBE3のプラグインを作っていますが、そこでFormに関して思いっきりハマってしまったところがあったので備忘録として書いておきたいと思います。

はじめは以下のように実装していました。

```php:ConfigType.php
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(
                'plg_api_value',
                'text',
                array(
                    'label' => false,
                    'mapped' => false,
                )
            );
        $builder->add(
                'plg_api_display_flg',
                'choice',
                array(
                    'choices'  => array('1' => '表示', '0' => '非表示'),
                    'multiple' => false,
                    'expanded' => true,
                    'mapped' => false,
                )
            );
    }
    public function getName()
    {
        return 'test';
    }
```

```php:Event.php
    public function onAdminProductEditInitialize(EventArgs $event) {
        $data_set = [];
        // デフォルト値のセット
        foreach ($Test as $key => $t) {
	    	$data_set[$key]['plg_test_value'] = $t->getTestValue();
	    	$data_set[$key]['plg_test_name'] = $t->getTestName();
        }
        $builder = $event->getArgument('builder');
        // collectionフォームの作成
        $builder->add(
        	'collection_test',
        	'collection',
        	array(
                'type' => 'test',
                'data' => $data_set,
                'allow_add' => true,
                'allow_delete' => true,
                'mapped' => false,
        	)
        );
    }
```

デフォルト値を生成する部分はQiita用に情報を隠すためにTestクラスっていうもので書いています。

んで、この状態だとフォームはちゃんと表示されるけど、POSTされたあとに

```php:Event.php
    public function onAdminProductEditComplete(EventArgs $event) {
         $data = $form->get('collection_product_other_info')->getData();
         //ここで$dataをみてもPOSTされてるはずの値が取得できない！
    }
```

getData()のところで値が取得できないので、色々と試していて半日ほど時間を費やしていました。

半日費やした結果、Typeの設定をしている部分でmappedを指定していたのがNGだったようで、以下のように修正。

```php:ConfigType.php
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(
                'plg_api_value',
                'text',
                array(
                    'label' => false,
                    // これがダメだった
                    //'mapped' => false,
                )
            );
        $builder->add(
                'plg_api_display_flg',
                'choice',
                array(
                    'choices'  => array('1' => '表示', '0' => '非表示'),
                    'multiple' => false,
                    'expanded' => true,
                    // これもダメ！
                    //'mapped' => false,
                )
            );
    }
    public function getName()
    {
        return 'test';
    }
```

collectionの場合はmappedの個別指定はしてはダメなようでした。
というかmappedって公式ドキュメント読んでもイマイチ何のためにあるのかわかりませんでした。

>mapped
データ型: boolean
オブジェクトを読み込んでいるまたは書き込んでいる間、フィールドが無視されるようにしたい場合は、 mapped オプションを false にしてください。

symfony2の学習コストが高いと思う今日この頃。
watchアプリで「A signed resource has been added, modified, or deleted.」となったときの対処法

## 現象
watchアプリを実機にインストールしようとすると、「App Installation failed. A signed resource has been added, modified, or deleted.」というエラーがでる。

![image](https://qiita-image-store.s3.amazonaws.com/0/12352/20853255-8ff3-1fe9-fadc-1fc57e81b1b5.png)

simulatorでの実行やiOSアプリ単体での実行は問題なくできる。

cleanしたり、DerivedData消したり、provisioning profileを一回消して入れ直したりとかやってたら、一度直ったけど、その後また再現して今度は直らなくなった。

※Xcode8.2.1, watchOS3.1で確認

## 対処法
**watchOSから利用するフレームワークは、Carthageの利用をやめ、Cocoapodsを使う。**

[Using copy\-frameworks for watch extension causes "A signed resource has been added, modified, or deleted" Xcode error · Issue \#1272 · Carthage/Carthage](https://github.com/Carthage/Carthage/issues/1272) にあるように、Carthageのcopy-frameworkが原因っぽい。


↑のissueに書いてある方法だと、別のエラーでたり、実行時にFrameworkが見つからなかったりしたので、Cocoapodsを使ったら、ひとまず無事に実機インストールできた。

ググったり、Twitter検索したりすると、Cocoapodsでも過去に同様の現象はあったようだが、少なくとも自分が試したv1.1.1では今のところ問題ない。

ここまでたどり着くのにトータルでまる1日ぐらい費やしてしまった。。。:cry:

### Cocoapodsだとbitcode注意

iOSではbitcodeを無効にしていても、watchOSではbitcode必須となる。そのため、watchOS側で利用するフレームワークは `ENABLE_BITCODE` を `YES` にする必要がある。

```ruby
post_install do |installer|
  installer.pods_project.targets.each do |target|
    # watchosではbitcode必須
    watchos_targets = ['Pods-HogeWatch Extension', 'Alamofire', 'SwiftyBeaver', 'SwiftDate']
    target.build_configurations.each do |config|
      config.build_settings['ENABLE_BITCODE'] = watchos_targets.include?(target.name) ? 'YES' : 'NO'
    end
  end
end
```
react + Material-UIの構築で多分一番簡単な方法

#React環境構築
いろんな記事を見たけどES2015じゃなかったり、自分向けにカスタムされてたりした。
##create-react-app
公式のこれを使うのが早い。
https://github.com/facebookincubator/create-react-app
上記のREADMEに書かれている通り下記コマンドでインストールが完了する

```shell-session:
npm install -g create-react-app
```

##Appの作成

```shell-session:
create-react-app my-app
```

で完了する。React,ReactDOMはdependencyに入っている。devDependencyにあるreact-scriptの配下にwebpackとかbabelとかlintとかが入ってる。

#Material-UIのインストール

```shell-session:
npm install --save material-ui
```

とかやっておけば完了する。

あとはApp.jsをいじれば幸せになれる。
App.test.jsがあってnpm testでtestできるのでindex.jsは最初書き換えない方がいいと思う。

#Production
実際に公開するファイルは

```shell-session:
npm run build
```

で簡単に作れる。これでReact+Material-UIを使ってゴリゴリjsとhtmlを書いてる現状から逃れたい！
Fileオブジェクトをbase64エンコードする

```base64converter.js
function convert(file) {
	const fr = new FileReader();
		fr.onload = (e) => {
	    	// readAsDataURL実行後の処理
	    	// e.target.resultでbase64文字列を取得
	    });
	};
	fr.readAsDataURL(file);
}
```
CocoaPodsでライブラリを追加する方法

#CocoaPodsインストール&セットアップ
自分のマシンがMacなのでMac前提で話がスタートします。
インストールは基本的にTerminalを使ってインストール＆セットアップを行います。

##インストール
```console:terminal
$ sudo gem install cocoapods
```
rubyのgemから簡単にインストールする事ができます。

##セットアップ
```console:terminal
$ pod setup
```
セットアップは瞬殺です。

#ライブラリを追加
ライブラリを追加していきます。
今回は[SnapKit](https://github.com/SnapKit/SnapKit)というライブラリを追加していきます。

##プロジェクトディレクトリに移動
![Screen-Shot-0029-01-25-at-11.03.01-AM.png](https://qiita-image-store.s3.amazonaws.com/0/98649/1f09bf27-eba9-a170-827a-56885c50878b.png)


```console:terminal
$ cd projectDirectory
```
ディレクトリをドラッグすると一撃でパスが書かれます。
プロジェクトディレクトリは「.xcodeproj」があるファイルに移動します。

##Podfileの作成
![Screen-Shot-0029-01-25-at-11.21.27-AM.png](https://qiita-image-store.s3.amazonaws.com/0/98649/85bc1f67-f73d-9514-69d4-77fb407efb02.png)


```console:terminal
$ vi Podfile
```
```console:terminal
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'
use_frameworks!

target 'test' do
    pod 'SnapKit', '~> 3.1.2'
end
```
内容の理解はたくさんの方々が書いているのでここで割愛します。
testの部分はアプリ名に変更してください。
ちなみにviで保存終了は :wq です。

##ライブラリのインストール
![Screen-Shot-0029-01-25-at-11.26.02-AM.png](https://qiita-image-store.s3.amazonaws.com/0/98649/a1a5b15f-91f3-50f4-0399-644a05740737.png)

```console:terminal
$ pod install
```
自動的にプロジェクトディレクトリ内にファイルがダウンロードされたことが確認できたと思います。
赤枠で囲みました「.xcworkspace」の拡張子のファイルで今後コーディングを進めていきます。

##別にライブラリを追加する場合
Podfileに別のライブラリ情報を記入します。

```console:terminal
$ pod update
```
コマンドでライブラリが追加されます。
フロントエンド演出：板をキラっと光らせる

# 演出の雰囲気を紹介する記事です

前回の記事「[フロントエンド演出：物体に弾力をあたえる](http://qiita.com/umi_kappa/items/2d9e8302fd5c1981c9fb)」から時間がたってしまいましたが、また1つ演出ネタをまとめました:bow_tone1:

特にソースコードなどは紹介しません。JSでもCSSでも使えるように雰囲気をお伝えできればと思います。演出づくりはその雰囲気で作っていくものなので（ここはビビビッと出てきてサッと消える感じなどなど）。

因みに、今回掲載する素材は[Animate CC](http://www.adobe.com/jp/products/animate.html)で作成しました。

# 板をキラっと光らせる

今回のゴールはこちらです。青い板がキラっと光る表現です。

![mov1.gif](https://qiita-image-store.s3.amazonaws.com/0/55103/a5f59254-2490-49e5-b032-9ea645038f75.gif)

# 複数の演出を重ねてそれっぽく

キラっと光らせる演出はいろいろな演出が重なっています。単体の演出だけでは単調でリッチに見えません。今回は次のような演出を重ねています。

## 面全体の光り

面の光りを表現します。光が当たると全体が明るくなり、外れると暗くなるというイメージです。

![mov2.gif](https://qiita-image-store.s3.amazonaws.com/0/55103/5d7ecc9b-e1c4-4456-159f-8319976c1040.gif)

## 光源となる光り

面が光るということは、光源がそこにあるということです。光源が存在し続けては変化が出ないので、移動させます。

![move3.gif](https://qiita-image-store.s3.amazonaws.com/0/55103/544e4c0a-a4a3-3f01-5cac-8d8623a096a6.gif)

こういう画像を移動させてマスクをかけています。

![line.png](https://qiita-image-store.s3.amazonaws.com/0/55103/7bcfcd09-13f1-1be0-ea45-c449d729b37c.png)

## キラン:star2:

これは演出をリッチに見せるアクセントです。現実世界ではあまり見られませんが、アニメや映画でよく見ますね。現実世界には存在しないオーバーな表現をつけてあげると、ユーザーにもわかりやすくなります。

![move4.gif](https://qiita-image-store.s3.amazonaws.com/0/55103/d502f480-e0a0-eb5f-8100-eff84001e353.gif)

# 動きのきっかけを意識して

板がキラッと光る流れを考えます。

光源が出現 → 面が明るくなりはじめる →　光源が端まで到達 → キラン:star2: → 光源が通り過ぎていく → 面が暗くなる 

この動きのきっかけをもとに、各演出の始まりと終わりを決めます。

演出のスタート位置

![step1.png](https://qiita-image-store.s3.amazonaws.com/0/55103/8cbd7d71-7456-c3d6-9dc3-81f9d7d0f803.png)

光源が出現 & 面が明るくなりはじめる

![step2.png](https://qiita-image-store.s3.amazonaws.com/0/55103/7250e461-f191-3956-1335-4fdd13d215c6.png)

光源が端まで到達 & キラン:star2:

![step3.png](https://qiita-image-store.s3.amazonaws.com/0/55103/2496202e-0775-d8bf-0ec4-7999aedd66dc.png)

光源が通り過ぎていく & 面が暗くなる

![step4.png](https://qiita-image-store.s3.amazonaws.com/0/55103/99271cbc-aab4-a0db-8adf-d1945b8aac33.png)

**演出づくりは、各演出が影響しあって深みがでます！**
やっぱり演出づくりは楽しいな〜次回も乞うご期待！:relaxed:
第1回つぶやき英語勉強会 ~ インデントつけてみる ~

# 英語にインデントつけてみる試み。

----

# よみましょう！

The path to changeable and maintainable object-oriented software begins with classes that have a single responsibility. Classes that do one thing isolate that thing from the rest of your application. This isolation allows change without consequence and reuse without duplication.

----

# 3つの文章です。

----

The path to changeable and maintainable object-oriented software begins with classes that have a single responsibility.

----

# インデントつけてみました。

----

```js
The path 
    // to changeable and maintainable object-oriented software
begins with 
classes 
    // that have a single responsibility.
```


ex) He began with a joke.

----

```js
Classes 
    // that do one thing 
isolate 
that thing 
from 
the rest of your application.
```

ex) He isolated himself from all his acquaintances.

----

```js
This isolation
allows 
change 
    // without consequence 
and reuse 
    // without duplication.
```

----

# ありがとうございました！
Django+Apache+NginxをWindows上に構築してハマった2つのこと

#概要
この記事は，色々あって，windows上にタイトルの環境を構築した際にハマった以下の2つの点について共有します．

- mod_wsgiのファイル名，場所，拡張子
- 静的ファイルをおいてあるファイルパスの記述法

#各バージョン

- windows7 64bit
- Python3.5.3 64bit
- Apache24 64bit
- Nginx-1-10.2

#mod_wsgiのファイル名，拡張子，場所
[h_nt21さんの記事](http://qiita.com/h_nt21/items/279ec1dfd28cb9693a1f)を参考に，mod_wsgiをpipでインストールしようとしました．
上記の記事では，インストール後
``/Python35/mod_wsgi.so``
が作られると書かれていました．
しかし，このようなファイルは作られませんでした．
実際には，
``/Python35/lib/site-packages/mod_wsgi/server/mod_wsgi.cp35-win_amd64.pyd``
というファイルが作られました．
これが，上記のファイルと同じものとして扱うことができました．

#静的ファイルをおいてあるファイルパスの記述法
こちらは，windowsの流儀を自分が知らなかったのが原因です．
nginxにて，外に括りだした静的ファイルへ流す際に，以下の様に記述してました．

```
location \static\ {
  alias "Drive:¥pass¥to¥static¥";
}
```

正しくは，

```
location \static\ {
  alias "Drive:/pass¥to/static/";
}
```

です．

静的ファイルの置き場所をパスとしてコピーして，貼り付けたら上記になりました．
正しくは，以下の様に¥(バックスラッシュ)ではなく，通常(unix等)のファイルシステムと同じく/でパスを区切る必要がありました．

余談ですが，Djangoのsettings.py内のSTATIC_ROOTは通常の¥でいけました．
だから，逆にハマったのですが
画面内に重複しているID名がないか調べるChrome拡張を作りました

## はじめに

同一画面には重複したID名は設定してはいけません。
常識だとは思いますが複数人でプロジェクトを回していると気付いたら同一ID名が存在していた、なんてことあるかと思います。
人間が目で見て重複しているかどうか判断してもいいですが、部分テンプレートが複数にまたがっていたりすると探すのも大変です。
できあがった画面で調べられたら便利だなという発想から作成を開始しました。

## 使用イメージ

![スクリーンショット 2017-01-25 9.49.15.png](https://qiita-image-store.s3.amazonaws.com/0/67471/7945d586-02cd-dc9b-01f8-498c436d0b94.png)

1. URL欄横のブラウザアイコンをクリックするとサーチを開始
1. サーチが終わるとアラートで通知
1. 重複したものはコンソールに表示される

## ソースコード

https://github.com/yamamoto-hiroya/search_not_unique_id

```js:background.js
// backgroundで動くjs
// ブラウザ上部のアイコンをクリックすることで発火し、content.jsの方にメッセージを飛ばす（トリガー）
chrome.browserAction.onClicked.addListener(function(tab) {
  /**
   * 第一引数: タブのID
   * 第二引数: ポストするキーとバリュー
   * 第三引数: コールバック関数（レスポンスが戻ってきた時に実行される）
   */
  chrome.tabs.sendMessage(tab.id, { trigger: "on" },
    function(msg) {
      console.log("background側のconsole:", msg);
    });
});
```

```js:search_not_unique_id.js
$(function(){
  /**
   * @param object message backgroundからポストされた値
   * オブジェクトになっていてmessage.trigger = 'on'のような形になっている
   * @param sender
   * @sendResponse
   * これらは2つとも宣言してないとsendResponseが最後に返せなかったので設定した
   *
   * backgroundからメッセージが送られてきた時（ブラウザボタンをクリックされた時）に発火する
   */
  chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
    // 意図したbackground.jsからの送信でない場合は弾く
    if(message.trigger !== 'on'){
      return false;
    }

    var ids = [];
    // 画面の全要素に対してループを回す（やや遅い可能性あり）
    $.each($("*"), function(){
      var id = $(this).attr("id");
      if(typeof(id) !== "undefined"){
        // undefined以外の全idを配列に保持
        ids.push(id);
      }
    });

    /**
     * 重複したもののみを検出する
     * @see http://qiita.com/cocottejs/items/7afe6d5f27ee7c36c61f
     */
    var not_unique = ids.filter(function (x, i, self) {
      return self.indexOf(x) === i && i !== self.lastIndexOf(x);
    });

    if(ids.length === 0){
      console.log('重複したID要素はありませんでした');
    } else {
      console.log('重複したID要素: ');
      console.log(not_unique);
    }
    alert('結果はconsoleを確認してください');

    sendResponse('Done');
  });
});
```

## 解説

### 全体処理フロー

1. `background.js`でブラウザアイコンに`onClick`イベントを設定する
2. ブラウザアイコンがクリックされると`background.js`のイベントが発火
3. `sendMessage`で`content_scripts`の方にメッセージを送信
4. `content_scripts`は`manifest.json`に指定されているjsが対象
5. `search_not_unique_id.js`内に`onMessage`イベントを配置、これがメッセージを受信した時に発火する
6. 中で「現在表示しているページに対して」重複してるIDを検索する
7. `sendResponse`で`search_not_unique_id.js`から`background.js`にレスポンスを返す

### browser action

ChromeのURL欄の右横のアイコンの部分のこと
今回はここをクリックすることをトリガーにしたかった

### background page

その拡張が裏側で持っている拡張用のページのこと
この拡張の作成時、`background`の方でIDの検索のメイン処理を行っていて、バックグラウンドのページに対して検索をかけてしまいうまくいかない状態でハマりました
バックグラウンドからフロント側（今表示しているタブ側）にメッセージ送信することでトリガーを実現できました
バックグラウンドのページを見るためには以下の画像のようにすると要素が見える

![スクリーンショット 2017-01-25 10.39.10.png](https://qiita-image-store.s3.amazonaws.com/0/67471/c79f3e27-9cb0-991a-9224-48fc1955f737.png)


## おわりに

やってることはすごくシンプルで、コード自体は一瞬で完成しました。
どちらかというとこれをChrome拡張の形に落とし込むのにやや手間取りました。
`browser_action`, `backgroud page`について良い勉強になりました！
ブラウザアイコンクリック時にポップアップを出したりするのもこのあたりの応用でいけそうなので、次回はこのあたりを触ってみたい:smile:
SQL - グループ毎に最新の属性値を取得

テストデータ

```
time,id,prop
1483196400,id1,prop4
1483196401,id1,prop3
1483196402,id1,prop2
1483196402,id1,prop1
1483196400,id2,prop4
1483196401,id2,prop3
1483196402,id2,prop2
1483196402,id2,prop1
```

SQL

```
SELECT
  a.id,
  MAX(a.prop) AS prop
FROM
  tbl a
  INNER JOIN (
    SELECT
      id,
      MAX(time) AS time
    FROM
      tbl
    GROUP BY
      id
  ) b ON (
        a.id   = b.id
    AND a.time = b.time
  )
GROUP BY
  a.id
```

結果

```
id,prop
id1,prop2
id2,prop2
```

最新レコードが複数ある場合に無理やり1つに絞っている

Treasure Data・Hiveで確認
macでユーザー辞書登録

#システム環境設定へ行く

<img width="256" alt="スクリーンショット 2017-01-25 10.31.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/8d5bc9a8-cd8a-a981-5526-910557682012.png">

#キーボードを押す

<img width="100" alt="スクリーンショット 2017-01-25 10.31.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/a8323f17-7afc-e4d2-f549-0858d0e52ba1.png">

#ユーザー辞書を定義する

<img width="646" alt="スクリーンショット 2017-01-25 10.31.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/856417e6-98ef-df6f-a923-2ab13432ea1b.png">

#こんな感じ

<img width="313" alt="スクリーンショット 2017-01-25 10.34.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/5417ca94-8ea6-11d7-d86c-d63a569c7cda.png">

#使ってみる

![スクリーンショット 2017-01-25 10.34.23.png](https://qiita-image-store.s3.amazonaws.com/0/135794/4fbceef3-9732-c9ac-60e5-9d4c3a4022b3.png)