OmniAICreator/Qiita-1.07M huggingface dataset:
CloudFront+S3での静的コンテンツ遅延生成

初回アクセス時に静的コンテンツを生成し、2回目以降のアクセスは生成済のコンテンツを返す構成をCloudFront＋S3で実現できたので残します。  
もっとよい方式があればコメントください。

# 目的
・URLへの初回アクセス時にコンテンツを生成し、2回目以降は同じ内容のコンテンツを返したい
・サーバレスで実現したい

# 用途
・検索キーワードを元にコンテンツを生成するなど事前処理が難しい場合
・対象データ量は多いがアクセスされるURLが限定されているためディスク容量を節約したい場合
・コンテンツ生成処理がネックになっていて生成の回数を減らしたい場合

# メリット
・サーバレスなのでスケールする
・S3の低冗長化ストレージ(RRS)を使用することでコストを抑えられる
　→2016/12の値下げにより、東京リージョンではRRSの方が価格が高いという逆転現象がおこっている

# ポイント
- コンテンツ配信処理はCloudFrontとS3で、コンテンツ生成処理はlambdaとAPI Gatewayで実現する（コンテンツ生成処理は既存サーバでも可）
- コンテンツ生成処理ではS3のパスを引数として受けてコンテンツを生成する。生成したコンテンツをS3に置き、その内容をレスポンスする
- S3は静的ウェブサイトホスティングを有効にする
- S3の設定で404レスポンス時に307(Temporary Redirect)を返し、生成処理へリダイレクトする  
低冗長化設定でデータがロストした場合は405が発生する[^注]ようなのでこれもリダイレクトする(未検証)

 ```xml:s3に設定するリダイレクトルール例
<RoutingRules>
  <RoutingRule>
    <Condition>
      <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
    </Condition>
    <Redirect>
      <Protocol>https</Protocol>
      <HostName>example.com</HostName>
      <ReplaceKeyPrefixWith>img?fname=</ReplaceKeyPrefixWith>
      <HttpRedirectCode>307</HttpRedirectCode>
    </Redirect>
  </RoutingRule>
  <RoutingRule>
    <Condition>
      <HttpErrorCodeReturnedEquals>405</HttpErrorCodeReturnedEquals>
    </Condition>
    <Redirect>
      <Protocol>https</Protocol>
      <HostName>example.com</HostName>
      <ReplaceKeyPrefixWith>img?fname=</ReplaceKeyPrefixWith>
      <HttpRedirectCode>307</HttpRedirectCode>
    </Redirect>
  </RoutingRule>
</RoutingRules>
```
- 上記リダイレクトを有効にするため、CloudFrontのOrigin Domain Name に指定するS3のバケット名は、ドロップダウンに表示されるエンドポイント(\*.s3\*.amazonaws.com)でなくウェブサイトエンドポイント(\*.s3-website-\*.amazon.com)を指定する。[^エンドポイント]
- **[重要]** CloudFrontのデフォルト設定は307であってもキャッシュするため、2回目以降も生成処理へリダイレクトしてしまう  
また、S3で設定するリダイレクトルールではキャッシュをコントロールするヘッダは付与できない  
CloudFront側のキャッシュをデフォルトで無効化し、すべてのファイルに個別にキャッシュ設定を入れることでこれを回避する。
設定は以下の通り。
 * CloudFrontのBehaviorにてObject Cachingを「Customize」に変更、Default TTLを0に設定
 * コンテンツ生成処理のS3へのアップロード時に、コンテンツファイルにメタデータとして `Cache-Control  max-age=2592000, s-maxage=259200`　を追加  

# 注意点
・初回アクセスはコンテンツ生成の時間がかかる
・キャッシュが必要なすべてのコンテンツに明示的にキャッシュコントロールの設定を付与する必要がある

----

参考URL
- <http://qiita.com/komazawa/items/51cbedbc0f2e5be0ed67>
- <https://cloudpack.media/12607>

[^注]: Amazon S3 でオブジェクトの消失が検出された場合、後続の GET または HEAD オペレーション、あるいは消失したオブジェクトをコピー元として使用する PUT Object copy オペレーションは、405 Method Not Allowed エラーになります([AWS Documentation データ消失のリターンコード](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/RtnCodeLostData.html データ消失のリターンコード))
[^エンドポイント]: 参考: [AWS Document AWSのリージョンとエンドポイント](https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html AWSのリージョンとエンドポイント)
SPFレコードの書き方について、紛らわしいサイトを見つけた

メールサーバの設定の際に、メールアドレスの信頼性を高める為に、
SPFレコードの設定の確認を行い、SPFレコードのチェックを行うために、
チェックツールを運用しているサイトを検索したら、
アスメルのサービスの専用SFPレコード設定を推奨するサイトを見つけた。

アスメルユーザー向けなのでなんのメールアドレスを設定しても、
『include:1lejend.com』をテキストレコードに追加しろと書かれているが、
これはアスメル社のサービスを使っている人だけのものなので、気を付けてほしい。
http://asumeru.net/tools/spf/spfchecker.php

どういう人向けのサイトか説明が明記されておらずわかりにくいので、
詳しく設定を知らずに設定をしている人にしてみれば、
フィッシングサイトみたいなつられ方をする危険がある。

自分の利用しているメールサービスに対して、適切なSFPレコードの設定をしましょう。

参考）なりすましメール撲滅に向けたSPF（Sender Policy Framework）導入の手引き
http://www.ipa.go.jp/security/topics/20120523_spf.html
参考）Sender Policy Framework - Wikipedia
https://ja.wikipedia.org/wiki/Sender_Policy_Framework

①『test@yahoo.co.jp』を検索した結果
![image](https://qiita-image-store.s3.amazonaws.com/0/19439/c8878dbb-e785-5214-c64c-cd5b306edf51.png)
②『test@excite.co.jp』を検索した結果
![image](https://qiita-image-store.s3.amazonaws.com/0/19439/699d7cb6-ecad-3282-09c0-53d580219bb5.png)

現在Google、Yahooで『spf チェック』検索すると、検索上位4位で表示される。

Google検索『spf チェック』
![image](https://qiita-image-store.s3.amazonaws.com/0/19439/b014dc8b-0237-4ac0-79c6-00390e2d956e.png)
Yahoo検索『spf チェック』
![image](https://qiita-image-store.s3.amazonaws.com/0/19439/9c8b7c80-188c-f509-8025-3b4d4f15dcbb.png)
THREE.js モデルのローディングでCTMのモデルを使う



Three.jsで3Dモデルデータをロードする時にwebで配信するにはモデルのファイルサイズが大きすぎるという事態が起きた。

最初はPLYやDDSといったモデルをロードしていたが、OpenCTMというバイナリのモデルにすることで、圧縮効率を上げてweb配信でも問題ないレベルにすることができた、その時に使ったCTMLoaderの話。

CTMLoaderはOpenCTM形式のモデルを非同期でロードする。
OpenCTMの開発元はこちらで
http://openctm.sourceforge.net
JavaScriptのライブラリが公開されている、three.js用にはすでにラップされたCTMLoaderというローダーが用意されていて、three.jsのExample内
[https://github.com/timoxley/threejs/tree/master/examples/js/loaders/ctm](https://github.com/timoxley/threejs/tree/master/examples/js/loaders/ctm)
にコードがあり、公式のExampleにもLoaderの項にCTMLoaderの例がある。


###CTMLoader

大体Exampleどおり、他のローダーと同じような使い方でokなのだが、
デコードの処理をworkerを使って高速化する場合、注意したいのはworkerは処理を単一のjsファイルにしておく必要があるので、ビルドツールなどでjsファイルを連結している場合は
ctm/ctm.js
ctm/lzma.js
ctm/CTMWorker.js
だけ連結せずにビルドしておく必要がある。

また、loaderの第三引数でworkerプロパティに、ワーカーのjsファイルへのパスを指定しておく必要も出てくる。

おそらく、再生環境によってはブラウザの処理速度が問題になるのでウェブワーカーでデコードさせる方が吉なことが多いだろう。


```
var loader = new THREE.CTMLoader();

loader.load("your_ctm_file.ctm", (geom, materials) => {
	let result = {
			geometry: geom
			materials: materials
        }
        
        ... make your mesh with result here.
        
    }, { 
      useWorker: true, 
      worker: new Worker( 'libs/ctm/CTMWorker.js' ) 
    })
```

loaderの第二引数のロード完了のコールバックで、geom, materialsが帰ってくるので、これをメッシュに使ってあげる。

第三引数でworkerプロパティにCTMWorker.jsを指定しておく。
worker: new Worker( 'libs/ctm/CTMWorker.js' )

###圧縮率

こちら公式ページにOpenCTMの圧縮率について書いてる。この通り今回もかなりの圧縮率になった。モデルが重くなったらCTM試してみるのもいいかも。
[http://openctm.sourceforge.net/?page=performance](http://openctm.sourceforge.net/?page=performance)
RS256 と HS256 ってなにが違うの

原文
http://stackoverflow.com/questions/39239051/rs256-vs-hs256-whats-the-difference
以下は、RS256[^1]およびHS256[^2]をJWTの署名に用いる場合の文章です。

#RS256 と HS256
どちらの選択肢も、IDプロバイダがJWTに署名する(sign)ために使用するアルゴリズムです。ここで「署名する」とは、トークンの受信者が、トークンが改ざんされていないことを検証できる「署名(signature)」（JWTの一部）を生成する暗号操作です。

#RS256
RS256は非対称アルゴリズムであり、公開鍵/秘密鍵のペアを使用します。IDプロバイダは署名を生成するために使用される秘密鍵を持ち、JWTのコンシューマは署名を検証するための公開鍵を取得します。秘密鍵とは対照的に、公開鍵は保護されている必要がないため、ほとんどのIDプロバイダは、IDのコンシューマが（通常はメタデータURLを介して）入手して使用できるようにします。

#HS256
一方、HS256は、対称アルゴリズムであり、2つの当事者間で共有される1つの（秘密）鍵のみを使用します。署名を生成して検証するために同じ鍵が使用されるので、鍵が侵害されていないことを保証するように注意する必要があります。JWTを使用するアプリケーションを開発する場合は、誰が秘密鍵を使用するかを開発者（あなた）が制御できるため、HS256を安全に使用することができます。

#どちらがいいの？
開発者（あなた）がクライアントを制御できない場合、または秘密鍵を保護する方法がない場合、コンシューマが公開鍵を知るだけでよい、RS256が適しています[^3]。公開鍵は通常、メタデータのエンドポイントから入手することが可能なため、開発者（あなた）はクライアントが自動的に公開鍵を取得するようにプログラムすることができます。多くの場合、ライブラリがサーバから公開鍵を取得します処理を持っているため、あなたの作業は少なくなります。一方、秘密鍵は帯域外で交換する必要があり（セキュアな通信チャネルを確保する必要があります）、署名鍵の更新があった場合は、共有済みの古い秘密鍵を新しいものに手動で更新する必要があります。

ざっくり書くと...

|共通鍵|採用すべきは|
|:--|:--
|利用可能なら...|HS256|
|利用不可能なら...|RS256|

[^1]: RSA using SHA-256 hash
[^2]: HMAC using SHA-256 hash
[^3]: 結局、２つのアプリケーションで共通鍵を持てる場合はHS256で、そうでない場合はRS256くらいの認識でいいかと。
Xamarin.Android で Font Awesome のアイコンを利用する

Xamarin でもFont Awesome などのアイコンが利用できるとのことなので、Xamarin.Android で検証した手順を以下に示します。

- [Iconize Plugin for Xamarin](https://github.com/jsmarcus/Xamarin.Plugins/tree/master/Iconize)

---
#### 0. プロジェクトの作成
今回は、Visual Studio の [Andorid Blank AppCompat] のテンプレートを利用してプロジェクトを作成しました。

#### 1. Nuget パッケージを取得します
Xam.Plugin.Iconize は必須パッケージなので必ずインストールしましょう。その他のパッケージは、必要に応じてインストールしましょう。

- Xam.Plugin.Iconize
- Xam.Plugin.Iconize.FontAwesome

#### 2. 初期化処理を実装する
Icon を利用するには、Activity か Application の OnCreate メソッド内で、Plugin の初期化を実行しなければなりません。今回は、MainActivity の OnCreate 内に初期化処理を実装しました。

```csharp:MainActivity.cs
public override void OnCreate()
{
    base.OnCreate();

    // プラグインの初期化処理
    Plugin.Iconize.Iconize.With(new Plugin.Iconize.Fonts.FontAwesomeModule());
}
```

#### 3. アイコンボタンを画面に配置
画面にアイコンボタンを記述します。

```xml:main.axml
<Plugin.Iconize.Droid.Controls.IconButton
    android:id="@+id/SampleButton"
    android:textSize="25sp"
    android:textColor="@color/primaryText"
    android:minWidth="35dp"
    android:gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
```

#### 4. ボタンのテキストにアイコンのフォントを指定する
`IconButton` の `Text` Property への値の代入方法がポイントです。**{アイコン名}** の形式で代入してください。

```csharp
IconButton iconButton = FindViewById<IconButton>(Resource.Id.SampleButton);
iconButton.Text = "{fa-calendar}";
```

[本家のサイト](http://fontawesome.io/)を参考にして、お好みのアイコンを指定してください。

---
今回は、Android での検証を行いましたが、Iconize Plugin for Xamarin は Xamarin.Forms, Xamarin.iOS にも対応しています。機会があれば検証してみたいと思います。
（備忘録）tableタグで写真を横並びに投稿したい時に、table内に長いURLがあると画像が上手く小さくならない件


| 文字が短い | 文字が短い |
|:-----------:|:------------:|
| ![Google.png](https://qiita-image-store.s3.amazonaws.com/0/153088/2b921b80-bd3e-0b32-914f-7d68f39e7260.png) | ![Google.png](https://qiita-image-store.s3.amazonaws.com/0/153088/2b921b80-bd3e-0b32-914f-7d68f39e7260.png) | 

| 長文だとどうなるのでしょうか、きになりますね。 | 長文だとどうなるのでしょうか、きになりますね。 |
|:-----------:|:------------:|
| ![Google.png](https://qiita-image-store.s3.amazonaws.com/0/153088/2b921b80-bd3e-0b32-914f-7d68f39e7260.png) | ![Google.png](https://qiita-image-store.s3.amazonaws.com/0/153088/2b921b80-bd3e-0b32-914f-7d68f39e7260.png) | 
| （備忘録）tableタグで写真を横並びに投稿したい時に、table内に長いURLがあると画像が上手く小さくならない件（備忘録）tableタグで写真を横並びに投稿したい時に、table内に長いURLがあると画像が上手く小さくならない件 | （備忘録）tableタグで写真を横並びに投稿したい時に、table内に長いURLがあると画像が上手く小さくならない件（備忘録）tableタグで写真を横並びに投稿したい時に、table内に長いURLがあると画像が上手く小さくならない件 |

| 長いURLだと？ | 長いURLだと？ |
|:-----------:|:------------:|
| ![Google.png](https://qiita-image-store.s3.amazonaws.com/0/153088/2b921b80-bd3e-0b32-914f-7d68f39e7260.png) | ![Google.png](https://qiita-image-store.s3.amazonaws.com/0/153088/2b921b80-bd3e-0b32-914f-7d68f39e7260.png) | 
| https://www.google.co.uk/search?site=&source=hp&ei=YINTWMCFHISt8QWfzYLgAg&q=test&oq=test&gs_l=mobile-gws-hp.3..0l5.288233.288459.0.288633.5.3.0.1.1.0.121.279.2j1.3.0....0...1c.1j4.64.mobile-gws-hp..1.3.279.0..0i4k1.KlseHj-Eeao | https://www.google.co.uk/search?site=&source=hp&ei=YINTWMCFHISt8QWfzYLgAg&q=test&oq=test&gs_l=mobile-gws-hp.3..0l5.288233.288459.0.288633.5.3.0.1.1.0.121.279.2j1.3.0....0...1c.1j4.64.mobile-gws-hp..1.3.279.0..0i4k1.KlseHj-Eeao |

## 検証結果

長い文字列は問題ないが、長いURLだと、画像が小さくならない。
EV3とleJOSでIoTっぽいことをしてみる

##はじめに
この記事は [SLP_KBITその２ Advent Calendar 2016](http://qiita.com/advent-calendar/2016/slp_kbit2) の16日目の記事です。

今回はEV3とleJOSを使用してIoTっぽいことをします。
使用している環境については[前回の記事](http://qiita.com/uplight_max/items/d0b3a3ac7c3e7b370e75)を参考にしてください。

##IoTについて
様々なモノがインターネットに接続され、情報交換することによって相互に制御する仕組みのことです。私が面白いと思った事例として、スマホで鍵の開閉ができる[スマートロック](http://www.itmedia.co.jp/enterprise/articles/1603/31/news055.html)や、バッテリー残量や位置情報から観光をサポートする[電動バイクのレンタル事業](http://www.itmedia.co.jp/enterprise/articles/1603/31/news055.html)があります。

##今回作ったもの
今回は潜水艦のソナーのようなものを作ります。
超音波センサーのついている車型のロボットを一回転させ、周辺の物体の距離を測定します。
その後、取得したデータをサーバーに送り、グラフに変換してブラウザで表示します。

##動作確認
###ロボットの動作
ロボットが一回転しています。
![写真 2016-12-16 14 47 48.gif](https://qiita-image-store.s3.amazonaws.com/0/61622/aa3f4b3e-a25f-0553-c718-924e018e4867.gif)


###ブラウザで確認
Webページの画面です。取得したデータをグラフにします。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/61622/ccccba3f-8040-c564-8444-09060b578811.png)


##開発
###ロボット側
やることは至ってシンプルです。
まず、ロボットをゆっくりと360度回転させます。そのときに、1度ごとに超音波センサで値を取得します。
値を取得した後は、その値をサーバーにPOSTで送信します。

ロボット側のコードは[ここ](https://github.com/SLP-KBIT/EV3SonarPlot_Front)にあります。

###サーバー側
サーバー側は、ロボットからPOSTされたときの値の記録と、ブラウザでの結果の確認を実装します。
ロボットからポストされたデータは、一旦CSVとして記録されます。
その後、ブラウザからアクセスがあったときに、Google Visualization APIを使用してCSVのデータをグラグにして表示します。

サーバー側のコードは[ここ](https://github.com/SLP-KBIT/EV3SonarPlot_Back)にあります。

##おわりに
今回はロボット側からサーバーにデータを送るだけのシンプルなシステムを作りました。
ネットワークに繋げるモノさえあれば、IoTは簡単に始められます。
ぜひ普段の活動やハッカソンで作成してください。
任意のメニューを選択状態にするスクリプト

# AppleScriptでメニューを選択状態にする

## 概要
メニューをクリックされたのを検知することはよくあるが，こちらで選択状態に制御できるようにする．
つまり，クリックはされていないが，メニュー項目が青でハイライトされている状態．

## 環境
Mac OS Sierra
AppleScript

## 雛形
```applescript
tell application "System Events"
	tell process "Script Editor"

	end tell
end tell
```
説明するコードは雛形の3行目に書くものとします．
アプリケーションはScript Editorを使います(他のアプリケーションでも可)．



## メニュー項目を選択状態にする
(1)
メニューバーの中のメニューを開くには
<code>click menu bar 1's menu bar item "ファイル"</code>
もしくは，インデックスを使い，
<code>click menu bar 1's menu bar item 3</code>
のようにしてできます．

(2)
<code>click menu bar 1's menu bar item "ファイル"</code>
上記でメニューを開いた状態で
<code>select menu bar 1's menu bar item "ファイル"'s menu 1's menu item 1</code>
のようにselect命令をすると選択状態(青でハイライトされた状態)となります．
簡単ですね．

(3)
さらにその中の項目を決定させるには
<code>click menu bar 1's menu bar item "ファイル"'s menu 1's menu item "新規"</code>
または
<code>click menu bar 1's menu bar item "ファイル"'s menu 1's menu item 1</code>
のようにします．

これでボタンが押されるとメニューを移動し，自由にメニュー項目を動き回るアプリケーションを作ったりできます．

## コード全体
選択状態にするまでのコードです．

```applescript
tell application "System Events"
	tell process "Script Editor"
            click menu bar 1's menu bar item "ファイル"
            select menu bar 1's menu bar item "ファイル"'s menu 1's menu item 1
	end tell
end tell
```

## イメージ
![スクリーンショット 2016-12-16 14.58.38.png](https://qiita-image-store.s3.amazonaws.com/0/154121/b7f5b0d0-eaed-d1c7-a322-3a7f50481e3d.png)

## 感想
簡単だが，柔軟なメニュー選択ができそうな気がした．
middlemanのバージョンアップ挫折（笑）

#タイトル通り挫折中（笑）

自社や個人でmiddleman3Xを愛用していますが、最新は4X（執筆時点の最新は4.1.14）
いつかはアップグレードしなきゃいかんなぁと思いつつも後回し（笑）

重い腰をあげ、
先人の知恵を借りようと色々ググった結果、そもそもアセットパイプラインが廃止されているという事実を突きつけられた。
いやいや、思いっきり恩恵授かって構築しちゃってるよwww
偉い人はその代替策を駆使して動かしているようなんですけど、僕にはそんな根性もスキルもありません（笑）

#僕なりの妥協策
もう3Xを最新版にアップグレードするのはとりあえず諦めました。
これからmiddlemanで新規サイトを構築する場合、そのプロジェクトだけ4Xにするというチキンな結論に至りました（笑）

僕の様に黒い画面が苦手な人のためにも、簡単な手順を残しておきます。

いつものようにmiddlemanプロジェクトを生成する。

```console:console.
middleman init PROJECTNAME
```

これで生成されるのは今までと同じ3X系のパッケージとなります。
そこで、Gemfileを開いて

```Ruby:Gemfile.rb
gem "middleman"
gem "middleman-livereload"
```

バージョン指定を解除

```console:console.
bundle install
```

もしかするとRubyのバージョン低いよボケ！的なお叱りを受けるかもしれません。
そんな時は、このプロジェクトだけ2.2.2以上に変えます（rbenv使用前提）

```console:console.
rbenv local 2.2.2
```

ちなみに僕は2.3.1で動いてます。
ElasticsearchとLuceneのバージョン一覧

Elasticsearchの各バージョンが使用しているApache Luceneのバージョンを一覧表にしました。

|Elasticsearch|Lucene|
|--:|--:|
|0.9.0|4.2.1|
|1.4.0|4.10.2|
|1.4.3|4.10.3|
|1.5.0|4.10.4|
|1.7.3|4.10.4|
|2.0.0|5.2.1|
|2.1.1|5.3.1|
|2.4.0|5.5.2|
|2.4.1|5.5.2|
|5.0.0|6.2.0|
|5.1.1|6.3.0|
なりすまし攻撃の危険性

# **なりすまし攻撃の危険性**

##**サイバー攻撃とは**

* <font color="Red">**サイバー攻撃による犯罪が、種類・被害件数とも増加傾向にある**</font>

####ちょっと昔のトレンド

* 「愉快犯」的にウィルスをばら撒き、自身の技術力を誇示するような攻撃が主流

####最近のトレンド

* 「妨害」目的のサイバー攻撃や、具体的な「金銭（利益）」を目的としたより高度なサイバー攻撃が主流となり、対策を講じていない場合、**大きな損害**に繋がるケースも出てきている

####サイバー攻撃一覧表
今回はなりすましに注目していく

|攻撃分類|攻撃方法|侵入経路|攻撃の目的→被害内容|
|:--:|:--:|:--:|:--:|
|不特定多数への攻撃(愉快犯)|ウィルス|メール、サイト閲覧からの感染|情報の拡散、コンピュータの破壊など→コンピュータが起動しない・誤動作など|
||スパムメール|メール|情報の拡散→詐欺被害など|
|不正アクセス（事業妨害）|不正侵入|社内外ネットワークからの侵入(セキュリティホール等を利用）|権限を持たない者の不正なコンピュータ利用→Webサイト改ざんなど|
||DoＳ攻撃／DDoＳ攻撃|Webサイト等への大量アクセスや大量データの送付|システム・Webサイトが正常に稼働しないようにする→Webサービスの停止|
|標的型攻撃（金銭目的）|マルウェア（不正プログラム）|メール、サイト閲覧からの感染|アカウントの乗っ取り、コンピュータシステムへの侵入・遠隔操作→Webサービスの停止・事業存続の妨害|
||<font color="Red">なりすまし|<font color="Red">総当りパスワード解析等を利用したID情報などの盗用|<font color="Red">機密情報・個人情報等の取得・改ざん・消去→情報盗用による詐欺被害など|
||フィッシング|メール、Webサイトの偽装|機密情報・個人情報等の取得・改ざん・消去→情報盗用による詐欺被害など|
||ランサムウェア|ダウンロードファイル、社内外ネットワークからの侵入（セキュリティホール等を利用）|コンピュータの強制的なアクセス制限／暗号化、破壊→暗号化解除のための身代金被害など| 
  

##**なりすまし攻撃の事例**

####なりすましメールによる情報の漏洩

>* 今年6月、国内大手旅行代理店において**約679万人**分の個人情報が漏洩

>* 昨年6月には**中央官公庁**から**約125万件**の個人情報が漏洩した可能性

いずれも標的型攻撃によるものであり、**なりすましメール**の開封が事の発端となっている

####なりすましメールの手口

* なりすましメールは、「エンベロープFrom」と「Display Name」を詐称しているものが多い

* 基本的に前者の詐称には送信ドメイン認証（SPF、DKIM、DMARC）が対策として有効だが、なかには**認証をパス**してしまうものもある

* また、Display Nameを詐称されるとユーザーが騙されやすいが、現時点ではDisplay Name詐称対策として一般化された方法がなく、判定・除去しにくいという現状


## **なりすまし攻撃を防ぐ仕組み**

* 攻撃者は、DKIMやSPF、DMARCなどの業界標準的な送信者認証に対応していることが多いため、メールなりすましの抜本的な対策には、送信ドメイン認証対応に加えて、別の手段も必要・・・

####JIPDECの取り組み

* 現在JIPDEC(日本情報経済社会推進協会)は、受信メールの安全性を可視化できる「安心マーク」という仕組みを提供しており、今後はこれに加えて、企業ロゴへの対応とDisplay Nameの識別を進めていくことを検討中


####安心マーク？

* ニフティやヤフーのWebメールにおいてDKIM（作成者署名）による送受信でのメール改ざん防止技術と、サイバー法人台帳ROBINSの情報を組合せることで、メール送信者(組織)を特定し「安心マーク」で表示するシステム。これにより、受信者は「正しいメール」であることが瞬時に判断できる

## **まとめ**

*  標的型攻撃による被害をなくすため、送信者ドメイン認証を用いたなりすましメール対策や、多段構成および出口対策等、マルウェア感染を念頭に置いた対策を講じることが重要！

###引用元
> http://it-trend.jp/lp/cyber-attack-protection
>https://www.jipdec.or.jp/library/report/20161107_01.html
Service Worker の初歩の初歩

# はじめに
ネイティブアプリの開発をしていて、Web アプリとの差がプッシュ機能くらいなのでは…と思いました。

じゃあ、「Webアプリでプッシュ機能を実装できればいいのにな」と思い、
いろいろ調べたら [ServiceWorker](https://developers.google.com/web/fundamentals/getting-started/primers/service-workers?hl=ja) に出会いました。

折角なので調査した内容を共有しようと、Qiita に投稿してみました。
主な内容は下記のとおりです。

* ServiceWorker の概要
* ServiceWorker を使ってできること  
* ServiceWorker の始め方
* 他の似たようなサービス  

**※本記事は ServiceWorker を実際に使うにあたって、サービスの大まかなイメージを掴んでもらうための導入的な記事です。これから実装していく中での発見等を共有できたら幸いです。**

# ServiceWorker って何？  
端的に言うと **ユーザーの端末上でバックグラウンドで動くイベント駆動のJavaScript環境**です。
ユーザーがブラウザで Webページを開いていないときでも、何かしらの処理を実行させることが出来ます。

※ServiceWorker の概要に関しては下記の記事を参考にさせていただきました。
> [Service Workerの基本とそれを使ってできること](http://qiita.com/y_fujieda/items/f9e765ac9d89ba241154)

## 何ができるか
バックグランドで動くイベントの種類によって色んなことができそうです。  

* ウェブのプッシュ通知  
GCMからプッシュ通知を受け取り、ブラウザに表示させる   
* バックグラウンド同期  
ブラウザを閉じていてもバックグラウンドでデータ受信したり、  
オフライン状態で受けた動作も通信可能になるとバックグラウンドで動作可能
* データのキャッシュ  
指定したページや画像等をCache APIを使って保存、Fetchイベントハンドラで取り出す
* リクエストの横取り  
ブラウザから投げられるリクエストを横取りして、サーバに投げる前に加工したり、  
サーバにリクエストを投げずに、固定のページをレスポンとして返したりすることが可能

## ServiceWorker の始めかた
ServiceWorker を使いたいサイトの好きな場所に下記のスクリプトを埋め込む。

```js
navigator.serviceWorker.register('/ServiceWorker.js',{scope: '/mysite'}); 
//scope プロパティで ServiceWorker.js が有効になるスコープの指定もできる。
```
register が完了すると、次回以降スコープ内のページにアクセスしたときに

ユーザーの環境上で `ServiceWorker.js` がブラウザをコントロールするようになります。
そして、ページにアクセスするたびに fetch イベントを発火するようになります。
あとは fetch イベントをキャッチするイベントリスナー内で好きな処理を書けばいいです。

```js
self.addEventListener('fetch', (event) => {
    //fetch イベントに対してやりたい処理を書く
}
```

# 実現方法例  
* ウェブのプッシュ通知  
    - Service Worker + Push API
      - https://ics.media/entry/11763  
    - PushCrew
      - https://digitalcontent.tokyo/push-notifaction-pushcrew/  
    - GrowthPush
      - http://jp.techcrunch.com/2013/08/07/sirok-launched-growthpush/  
    - Pushdog Owned
      - http://wdplu.com/pushdog-owned 
* バックグラウンド同期  
    - Service Worker + Background Sync API  
      - https://developers.google.com/web/updates/2015/12/background-sync?hl=en  
      - http://www.publickey1.jp/blog/15/chromebackground_syncapi.html  
* データのキャッシュ  
    - Service Worker + Fetch API + Cache API
       - http://qiita.com/horo/items/175c8fd7513138308930  
    - HTML5 Application Cache  
      - https://developer.mozilla.org/ja/docs/Web/HTML/Using_the_application_cache  
      - http://qiita.com/TakamiChie/items/a7f8921bdb95871d90e1  
    - localStorage, cookie等  
* リクエストの横取り  
    - AngularJS の interceptor  
     - http://qiita.com/uggds/items/b89be96f1e297f6dbab4
     - https://docs.angularjs.org/api/ng/service/$http#Interceptors 
    - Proxy サーバ
     
# おわりに 
次回は実際に ServiceWorker を使ってプッシュ通知などを実装してみる予定です！
WatchOS3にRealmを導入する Objective-C版

AppleWatch単体で動作するアプリでDBを使用したくなったためモバイル用のDBとしてRealmを導入してみることにした。

cocoapodsで導入させてみたが何故かビルドが通らない。
そもそもAppleWatch単体で動作するアプリは20MBまでの容量制限があるので
フレームワークとしてcocoapodsは導入するつもりがなかった。

とりあえずは
1．iOS版はcocoapodsでRealmを導入
2．WatchOSは直接frameworkを追加 ※DLLなのでEmbedded Binariesに突っ込む

本当はcocoapodsで導入したいが妥協しました。


```text:Podfile
target 'iOSのプロジェクト名'
platform :ios, '8.0'
pod 'Realm'
```

RealmのGitHubからプロジェクト一式ダウンロードして
WatchOS用のFrameworkをWatchOSプロジェクトに追加する
https://github.com/realm/realm-cocoa

Frameworkを追加する時に下記のスクショで示している通りにEmbedded Binariesに追加する
![スクリーンショット 2016-12-16 14.20.27.png](https://qiita-image-store.s3.amazonaws.com/0/142882/90b1d105-2242-39ac-8d52-bba50a25e6e4.png)
GitHub Pagesでプロジェクトホームページを作る。15秒で。

2016/12/15にGitHub Pagesの新機能「__Jekyll Theme Chooser__」というものが[発表された](https://github.com/blog/2295-new-theme-chooser-for-github-pages)ので、先日作った[Goslings](http://qiita.com/kaitoy/items/91585ba1a3081ffd2111)のホームページをこの機能を使って__15秒__で作った話。

# Jekyll Theme Chooserとは
詳しくは[公式のドキュメント](https://help.github.com/articles/creating-a-github-pages-site-with-the-jekyll-theme-chooser/)を参照。
簡単に言うと、数クリックの操作で、GitHubのリポジトリのトップに置いたReadme.mdにしゃれおつなテーマを適用してインターネットに公開してくれる機能。

# 使ってみる
まず、ホームページを作りたいプロジェクトのページに行く。
今回は[Goslings](https://github.com/kaitoy/goslings)。
Readme.mdは作成済み。

![goslings.png](https://qiita-image-store.s3.amazonaws.com/0/110166/8c98a04c-8711-5fb9-02cf-9413bd61e16d.png)

<br>

右上の`Settings`をクリックして、`GitHub Pages`のセクションまでスクロールして、`Choose a theme`をクリック。

![choose.png](https://qiita-image-store.s3.amazonaws.com/0/110166/43199400-39f0-570e-9432-d4079c38a960.png)

<br>

するとテーマ選択画面が開く。

![themes.png](https://qiita-image-store.s3.amazonaws.com/0/110166/83632357-3e66-7a85-d9d4-1ae8d750f554.png)

<br>

今の時点では12種類からしか選べないようだ。今後増えることを期待。
今回は、上部のリストから「Architect theme」を選んで、`Select theme`ボタンをクリック。

![select.png](https://qiita-image-store.s3.amazonaws.com/0/110166/0f58018a-7ec3-47aa-c58d-44446cdd1f90.png)

<br>

これでホームページ作成完了。
GitHub PagesのプロジェクトページのURLに行ってみる。

https://kaitoy.github.io/goslings/

![done.png](https://qiita-image-store.s3.amazonaws.com/0/110166/51420085-1ef9-8d54-aba4-0c19d9ed5547.png)

<br>

ちゃんとできてた。
ここまでわずか5クリック0タイピング。テーマを選ぶ時間を除けば15秒程度で完成。
こだわりがそんなにないならこれで十分なクオリティだし、なんといっても手軽すぎる。

<br>

因みに、ホームページ作成後、`Settings`の`GitHub Pages`セクションを見てみたら、`master`ブランチからホームページをビルドする設定になっていた。
また、プロジェクトのトップに以下の内容の`_config.yml`というファイルがコミットされていた。

```yaml:_config.yml
theme: jekyll-theme-architect
```
re:dashを試してみた

この記事は[ACCESS Advent Calendar 2016](http://qiita.com/advent-calendar/2016/access)の16日目の記事です。

# Motivation

チーム内外からこういうデータを調べて欲しい、可視化してほしい、というリクエストが定期的に来るので、visualizeするツールを色々探していた。
[re:dash](https://redash.io/) を使うと、SQLで抽出したデータをそのままグラフにでき、任意の間隔で自動更新ができるので試してみる。

# Setup

- re:dashにはマネージドサービスと、自分たちでサーバを立てる方法があるが、今回は後者にした。
- セットアップ時にre:dashの依存関係を解決するのが面倒らしいので、[用意されているAMI](http://docs.redash.io/en/latest/setup.html#create-an-instance)からEC2インスタンスを作った。
- [アップデート適用](http://docs.redash.io/en/latest/upgrade.html)
- [ID/PWログイン](http://docs.redash.io/en/latest/setup.html#users-google-authentication-setup)
  - 会社のGoogle Apps domainのアカウントからログインできるようにした。
- お試しなのでその他は後回し

# DataSource

- Postgresql
 - SQLで書く

```sql
        SELECT to_char(created_at, 'YYYY-MM-DD') AS created_at,
                                                    model,
                                                    count(id) AS COUNT
        FROM cars
        WHERE created_at BETWEEN NOW() - interval '1 month' AND NOW()
        GROUP BY 1,
                 2
```

![datasource-postgresql.png](https://qiita-image-store.s3.amazonaws.com/0/6288/dcbe44fd-1610-2fd3-b92f-4874ec2f7de5.png)


- MongoDB
  - [PyMongo風のクエリ](http://docs.redash.io/en/latest/usage/mongodb_querying.html)で書く
- Google Spreadsheets
  - Google Apps domainの管理者の認証がいる

# 所感

- ドキュメントが少ない
  - セットアップ部分は一通り揃っているが、
    その後はあまり無いので不明な部分はコードから調べることになる
- ユーザの権限管理がよく分からん
- SQL力が求められる
  - 可視化が楽な分、可視化に適したSQLをがんばって書くことが求められる



明日は @pankona さんの記事です。お楽しみに:smiley:
スプレッドシートでvlookup関数とは逆向きに値を抽出してくれる数式を作ってみた

本記事は[マイネット Advent Calender](http://qiita.com/advent-calendar/2016/mynet)16日目の記事です。
今回はプログラマー暦1年6ヶ月なのに成長が全く感じられない@hashiがお送りさせていただきます。
#はじめに
みなさん、日々の業務やプライベートの中でExcelやGoogle SpreadSheetをよく使用されると思います。
これの便利なところはなんといっても数式に関数を入れることで自動的に計算結果を表示したり集計を行ったりしてくれることだと思います。

弊社のようなソーシャルゲームの運営に携わる会社としてはDAUやARPPUなど様々なKPIを集計し資料を作成することで施策の方針やテコ入れなど様々な判断材料をする際の大きな道標になります。
そんな時、ExcelやGoogle SpreadSheetには非常に便利なツールとして我々の手助けをしてくれます。

今回は、実際に集計作業を行っていた時に「これができたら便利なのに」と思ったことと、それをどのようにして関数を使って実現したかをお話できればと思います。

#vlookup関数の限界
ExcelやGoogle SpreadSheetを使っている方にとって非常に馴染みの深い関数「vlookup」

ご存知の通り
[検索したい値]　を　
[検索範囲の一番左の列]　から縦に検索して　
[一致した行の左からN番目にある値を取得する]
という関数ですね。

ただ、この関数「右からN番目にある値を取得」することはできるんですが、逆の
「左からN番目にある値を取得」ということが一番左の列を検索する仕様上できません。
そのためvlookup関数が使えるように列の並び順を変えたりしないといけません。

個人で使用する資料であればいいかもしれませんが
業務などで大人数が編集をすることのある資料の場合は
おいそれと列や行をいじるわけにもいきません。

なので既存の関数をうまく組み合わせて
[検索したい値]　を　
[検索範囲の**一番右の列**]　から縦に検索して
[一致した行の**右からN番目にある値を取得**]
ができるようにやってみました。

#数式を作ってみた
- index関数
- match関数
この2つの関数を組み合わせて実現しました。

ちなみに
####**index関数**
[指定した範囲]　の　
[上からN番目の行]　と
[左からN番目の列]　を指定すると
**一致する箇所の値を取得**
してくれる関数です。

####**match関数**
[検索したい値]　を　
[１行または１列で指定された検索範囲]　の中から検索して
**一致した場所が検索範囲の何番目（行の場合は上から、列の場合は左から数えた値）にある値かを返す**
関数です。

なので

`=index(検索範囲, match(検索したい値, 検索したい列, 0), 左から数えて何番目か)`
※match関数内の0は完全一致で検索させるためのオプションです

とう感じに
ますはmatch関数を使用して「検索したい値」がどこの行に存在するか算出します。
あとはindex関数で検索範囲を指定して算出した行の値を目印にして最終的に抽出したい値が列の何番目かを指定します。

そうすれば一致した行の左からN番目の値を算出することができるようになります。

例えば

| | A | B | C | D |
|:-:|:-:|:-:|:-:|:-:|
|1|id|名前|性別|部署ID|
|2|1|孫 太郎|男|C|
|3|2|田中 ミク|女|D|
|4|3|初音 悟空|女|F|

（記入されている名前はアニメや実際の人物の名前とは全く関係ありません）
というテーブルがあったとして
部署ID（例えば部署ID：D）から該当する名前を算出したいとなった場合、vlookupでは検索できませんね？
そんな時こそ先ほどの数式の出番です。

部署IDをもとに名前を抽出したいので
`=index(B2:D4, match(D3, D2:D4, 0), 1)`
これで部署IDに応じた名前を抽出することができます。

ちなみに性別を抽出したい場合は
`=index(B2:D4, match(D3, D2:D4, 0), 2)`

idを抽出したい場合は少し検索範囲が変わります
`=index(A2:D4, match(D3, D2:D4, 0), 1)`

このように検索する列の左側にある値を抽出することができるようになりました。

#おわりに
いかがでしたでしょうか？
正直、ネットで調べればすぐに出てくる情報だったのですが最初知った時、個人的にはすごく革命的だと感じました。
関数の可能性に驚きを隠せなかったです。
ただ、一つだけ問題があり「数式が少し複雑なのでメンテナンスが大変な場合がある」ということです。
ある程度、関数を理解しているのであれば大丈夫かもしれませんが、初心者の人が最初に見た時は必ず固まると思います（多分、自分もいきなり見せられたら半べそかくと思います）。
なので数式を組み合わせて表現するのもいいですが、もし可能であればvlookup関数だけなど1つの関数で済む列の構成にするなど、できる限り誰でも安全に運用できるような配慮をしたほうがいいと思います。
そんな中でどうしてもという時に、少しでもこの記事が参考になれば幸いです。

さてさて明日は[@jozaki](http://qiita.com/Jozaki)さんになります。
引き続きマイネット Advent Calendarをお楽しみくださいませ。

ありがとうございました。
embeds_*　🆚　has_*どっちを選ぶ!?

### 1. 定義
Mongodbホームページにリレーションの定義が書いてあります。

- Embeds One
>
**Embeds One**
One to one relationships where the **children** are **embedded** in the **parent** document are defined using Mongoid’s embeds_one and embedded_in macros.


- Has One
>
**Has One**
One to one relationships where the **children** are **referenced** in the **parent** document are defined using Mongoid’s has_one and belongs_to macros.

``Embeds One``と``Has One``の違いはデータの持ち方です。

- ``Embeds One``  
parentのデータの中にchildrenのデータが入っています。そのため、parentからchildrenのデータを取りたいとき、別のクエリーが必要ないです(処理時間が少ない)
- ``Has One``  
parentのデータの中にchildrenのデータが入っていません。そのため、parentからchildrenのデータを取りたいとき、別のクエリーが必要です。

p.s.: [embeds-many](https://docs.mongodb.com/ruby-driver/master/tutorials/6.0.0/mongoid-relations/#embeds-many)と[has-many](https://docs.mongodb.com/ruby-driver/master/tutorials/6.0.0/mongoid-relations/#has-many)も上に書いた違いがあります。

### 2.どれが良いか？
Mongodbホームページの事例を見ましょう！
例１:

```rb
class Band
  include Mongoid::Document
  has_many :albums, dependent: :delete
end
```

例２:

```rb
class Band
  include Mongoid::Document
  embeds_many :albums
end
```

両方はBandとAlbumの関係を定義しています。
``embeds_many``と``has_many``のどちらを使いますか？

場合によって違います。
仕様が決まらないと、どちらを使うか選べません。
なので私は、以下の二つのケースを考えてから決めることにしています

:point_up:質問１. parentとchildrenを一緒に使うケースが多いですか？
  - もし多かったら``embeds_*``を使った方が良いです。
　- 逆に、少なかったら、``has_*``を使った方が良いです。[詳細](https://docs.mongodb.com/manual/tutorial/model-embedded-one-to-one-relationships-between-documents/)   

:point_up:質問２.parentがなくなると、childrenが存在する意味がなくなるか？
　- もしchildrenの存在する意味がまだあるなら、``has_*``を使った方が良いです。
　- 逆に、childrenの存在する意味がもうなくなるなら、``embeds_*``を使った方が良いです。

2つの質問を考えてもまだ決められない時は
``has_*``を使う場合の、クエリーコストを考えたり、
``embeds_*``を使う場合の、重複されるデータ量のことを考えます。[詳細](https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/)


``embeds_*`` :

- メリット:
  - childrenのデータを取得するスピードが早い
  - n+1 問題が起こりません
- デメリット:
  - 集計、分析が難しい。ドキュメントに直接アクセスすることができないから。
  - ネストのデータは管理しにくい
  - 重複するデータが増える可能性が高い
  - ドキュメントのリミットがありますので増え続けるようなデータを``embeds_*``にしたら注意しないといけない。[詳細](https://docs.mongodb.com/v3.2/reference/limits/)  

``has_*`` :

 - メリット:
   - 集計、分析が比較的簡単です
   - 正規化(normalized data model)
 - デメリット:
  - childrenのデータを取得する場合、クエリーが必要です。
  - n+1 問題に気を付けないといけない

### 3. サンプル（実際に考えてみる）
1. 記事とタグはembeds_*、has_*？

  - 質問１を答える：
      - 記事を取得するたびに、タグを取得するケースが多発しそうな時、``embeds_*``が候補に上がります。
      - 記事のデータだけ取得するケースが多い場合、``has_*``でも大丈夫だと思います

  - 質問２を答える：
    - 記事を削除して、タグの存在する意味がなくなることはないので、``has_*``を使います。

なので僕は``has_*``にします。

2.PostとCommentはembeds_*、has_*？

  - 質問１を答える：
     - SNSの場合、Postを取得するたびに、commentも取得します。``embeds_*``で大丈夫です
     - comment数を数えたい、commentの意味を分析したい、like数を数えたい。この場合は、``has_*``もよさそうです。
  - 質問２を答える
     - Postを削除すると、commentの意味がなくなってしまいます。``embeds_*``を使う方がいいです。
  
なので``embeds_*``にします。

3.他のは「記事とアイキャッチ」、「人とアドレス」
startActivityで起動したときとstartActivityForResultで起動したときで処理を分ける方法

# startActivityで起動したときとstartActivityForResultで起動したときで処理を分ける

Activityにおいて、`startActivity()`で起動された時と`startActivityForResult()`で起動したときで実行される処理を分けたい、そんなときがあります。
そういう場合は、`Activity#getCallingActivity()`を使用することで識別することができます。

```java
if (getCallingActivity() == null) {
    /* startActivity()で起動された */
} else {
    /* startActivityForResult()で起動された */
}
```

## 参考

* [getCallingActivity()](https://developer.android.com/reference/android/app/Activity.html#getCallingActivity%28%29 getCallingActivity())
Mithrilで自動補完付きのテキスト入力を作る

HTML5以降で追加された``<datalist>``タグを使うと、テキスト入力で自動補完ができます。

* [サンプル](https://jsfiddle.net/shibukawa/vb2fp4co/4/)

最終的にできあがる仮想DOMは次のような感じです

```js
m('input', {
    list: 'datalist',
    oninput:  m.withAttr('value', ctrl.data),
    value: ctrl.data()
}),
m('datalist', {id:'datalist'}, [
    m('option', {value: 'data1'}),
    m('option', {value: 'data2'}),
    m('option', {value: 'data3'}),
])
```

たとえば、プログラミング言語名を補完するデータリストは次のように定義できます。id名のlanguagesを``<input>``タグの``list``属性に指定すると言語の補完ができます。

要注意なポイントとしては、マウスで選択した瞬間はまだ確定しておらず、onchangeイベントは発行されません。選択された瞬間だと確定しません。oninputイベントを使います。リスト以外の項目を拒否するのであれば、イベントハンドラ内で候補のものがきたらプロパティに格納するようにすればOKです。

```js
const languages = [
  'HTML',
  'CSS',
  'C Language',
  'C++',
  'Common Lisp',
  'Erlang',
  'Elixir',
  'Fortran',
  'Go Language',
  'Haskell',
  'Java',
  'JavaScript',
  'OCaml',
  'TypeScript'
];

m('datalist', {
    id: 'languages'
}, languages.map(language => {
    return m('option', {value: language});
}))
```
ユーザーから見た技術

こんにちは、アプレッソ技術部片岡です。
７月にアプレッソに入社しました。
入社する前は、このAdvent Calendarを見て「企業研究」したこともありました。
入社したら、もしかしたら書く機会もあるかもしれないな、とも考えたこともあったのですが、
本当にその通りとなりました。これも縁ですね。

今回は、「ユーザーから見た技術」をテーマに、過去の経験を含め、思うところを書かせて頂きます。


# 技術がユーザーの環境を変える
振り返ると、早いもので社会人になって四半世紀近く働いていることになります。
新卒で入った会社はアパレルメーカーだったのですが、当時の職場環境はこんな感じでした。
その当時で言えば、特に進んでも遅れてもいない、標準的だったのではないかと思われます。

・パソコンはデスクトップしかなく、１０人くらいの課で２台を交代に使いまわしていた。
・LANはなく、当然メールもなかった。一部の部署が必要に応じてモデムを使っていた。
・当時はLotus 1-2-3ができることがパソコンを使いこなせると同義だった。
・ホスト系のシステムにFAXで届いた注文書を入力処理する専門の人がいた。
・パソコンとは別に大型のワープロがあり、その専門のパンチャーの人もいた。
　取引先に出す文章とかは、手書きでその人に渡してパンチングし、印刷してもらってた。
・携帯電話は世の中にはありましたが実用的ではなく、社長は社用車に車内電話をつけて使っていた。

どうですか？
当時を知らない人には想像しにくいのではと思います。

蛇足ですが、デートの約束をした彼女に当日伝えたいことがあって連絡取るのに、
会社に電話して本人を呼んでもらう、なんてことが必要で、結構緊張するものでした。
今の人はそういう苦労は皆無ですよね。

当時の会社はそこからの動きは早く、3年くらいでPCを一人一台、メールを全社員で使用となりました。
WORDを使うようになり、ワープロもなくなりました。もちろん専門のパンチャーの人も。
言い方を代えれば、専門の人がやっていた仕事が一般の人ができるようになったと言えます。
これら諸々も、技術の進歩がユーザーにもたらした変化です。


# ユーザーに技術を伝える
もっと驚いた話があります。
入社直後にマーケティングの部署に配属されました。
一応業界二位でしたが、当時ライバル社の下記の製品に売り上げで遠く及ばない状況でした。

「よせてあげる」ワコール

けっこう流れたＣＭだったのですが、覚えている人もいらっしゃるかな？
（動画等も落ちていると思うので、興味があれば探してみて下さい）
新人だったら自分は製品のことはよくわからず、機能をもったいい製品なんだろうなと思っていました。
ところが・・・

色々と現場で話を聞いていくと、衝撃の事実がわかりました。
実は「よせてあげる」という機能では自社製品の方がはるかに勝っていたのです。
（今は知りません、当時です）
営業さんや、現場の販売員さんとかもみんな知っているのですが、
ＣＭやられちゃったら指名買いに来るし、イメージでかなわないし・・・
という感じでした。

自社の製品が勝っている部分を逆にライバル会社に逆用されているようでショックでした。
ふりかえると大きく三点が、ライバル会社の成功要因だと考えます。
・「よせてあげる」という表現が機能をわかりやすくアピールした
・ＣＭという手段で広く告知し、専売特許のようなイメージを植えつけた
・業界最大手なので信用がある（まさか自社が負けている機能をアピールするとは思わない）

この件は教訓になりました。
製品の機能（技術）を説明するのに、いかにユーザーにアピールする形で伝えることが重要だと。
すばらしい技術があっても伝え方を考えないと、先の教訓のように足元をすくわれるような話にもなりかねない。
この当時の自分の会社は技術では優位でライバル会社が見本にして研究しているという噂もありましたが、
その伝え方という部分でライバルに水をあけられていました。
結果売上げも・・・

# ユーザーから見た技術
ユーザーから見た技術というものは二つに分けられます。
・意識していない当然だと認識している技術
　例えば水道水は「普通に飲める水が蛇口をひねればでてくるよね」
・意識していて購買に繋がる技術
　ＸＸの機能があるから選ぼう、△△できるから買おう

どちらの方が優れているわけではなく、両方優れています。
むしろ前者のようなポジションを得ることの方が重要かもしれません。
DataSpiderは後者はもちろん、前者を目指せると思っています。

前職ではDataSpiderのユーザー側で仕事をしていました。
自分でDataSpiderの導入を決めました。
実際に使ってみて感じたのは、「データ連携という部分においては絶対に使うべきだろう」という思いでした。

そんなことを考えて転職し、入社半年足らずで勉強の毎日ですが、DataSpiderファミリー製品の
技術の価値をユーザーにつなげるように、創意工夫していきます。
今後ともよろしくお願いいたします。


# おまけ
今回インフルエンザにかかり、自宅療養中にこの文章を書きました。
いつもの病院なので、なんとなく聞いてみたら、前回インフルエンザにかかったのは5年前の3/11でした。
調子が悪くて当時の会社を早退して病院にいき、インフルエンザの検査薬の反応を待っていた時に
地震が起こり、釣り下げられた蛍光灯が大きく揺れていたのを思い出しました。

なくしてわかる〇〇というやつで、健康の有難味と平穏な暮らしの有難味を再認識しました。
その裏にも様々な技術が生かされていることも。
UPDATEのSETでANDを使ってしまうとヤバい

タイトルだけを見て、結論がわかった方もいるかもしれません。

UPDATE文では、複数カラムにデータをセットするとき、","（カンマ）で区切るのが正しいですが、
間違ってANDで区切ったときに起こりうる問題です。

### テーブル定義

```SQL
mysql> show create table user\G
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` smallint(6) DEFAULT NULL,
  `yomigana` varchar(80) NOT NULL,
  `birth_date` date DEFAULT NULL,
  `prefecture` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql>
```


UPDATEを使って、「山田　太郎」さんに、年齢、生年月日、都道府県を設定します。

```SQL:①
UPDATE user
   SET age = 36, birth_date = '1980-01-15', prefecture = '東京都'
 WHERE name = '山田　太郎';
```

```SQL:②
UPDATE user
   SET prefecture = '東京都' AND age = 36 AND birth_date = '1980-01-15'
 WHERE name = '山田　太郎';
```

```SQL:③
UPDATE user
   SET age = 36 AND birth_date = '1980-01-15' AND prefecture = '東京都'
 WHERE name = '山田　太郎';
```

それぞれのUPDATE文を実行すると、どうなるでしょうか。

・

・

・

・

・

・

・

・

・

・

正解は、①は正常に動作、②はエラーメッセージが出る、③はageが0か1に変化、でした。

①は、更新するカラムが","（カンマ）で区切られているため、問題ありません。

②は、prefectureに、**'東京都' AND age = 36 AND birth_date = '1980-01-15'**という条件を設定するという意味になります。
しかし、prefectureはVARCHAR型なので、0か1の数値は入れようとしてエラーとなります。

```
ERROR 1292 (22007): Truncated incorrect DOUBLE value: 
```

③は、ageに、**36 AND birth_date = '1980-01-15' AND prefecture = '東京都'**の判定結果を設定するという意味になります。
そのため、ageに0か1の値を入れることになるため、**ageが0か1になります。**
ほかのカラムは更新されません。

SETの最初が数値系のカラム(INT, DECIMAL, TINYINT等)だと0か1にデータが更新されます。


つまり、意図しない値にUPDATEされうるのです。
もし、これが大量のレコードに対し、0か1を設定してしまったら、悲劇にもつながるわけです。
そのため、UPDATE文を直接流す際は、十分に注意しなければなりません。
org-modeのタスクをリマインダーに渡す

この記事ではEmacsのorg-modeからリマインダー.app(Mac OS X or iPhone)にタスクを渡す方法について紹介します。

私はタスク管理にorg-modeを使うのですが、最近は買い物リストもorgに書き込んでいます。
イオンやイトーヨーカドーに行くときに、Macを持っていくわけにはいきません。

そこで、Mac OS Xのリマインダー.appにその買い物リストを転送して、
iCloud経由でiPhoneと同期させ、iPhoneの「リマインダー」アプリで、その買い物リストを見るようにしています。

# セットアップ

+ [reminders-cli](https://github.com/keith/reminders-cli)をインストールする
+ 後述するhoge.elを追加する

reminders-cliを使うと、コマンドライン操作でタスクをリマインダー.appに登録することができます。
そして、下記のelispを使うことで、Emacsからリマインダー.appにタスクが追加できるようになります。

```el:hoge.el
(defun add-org-task-to-reminder ()
  (interactive)
  (when (eq major-mode 'org-mode)
    (setq reminder-list-name "リマインダー")
    (setq element (org-element-at-point))              ;; カーソル位置のタスク(エレメント)を取得する
    (setq title (org-element-property :title element)) ;; そのタスク(エレメント)から名前を取得する
    (setq command (format "reminders add %s %s" reminder-list-name title))
    (shell-command-to-string command)))
```

上記のコードは、[Org Element API](http://orgmode.org/worg/dev/org-element-api.html)でタスクの名前を取得し、reminders-cliをシェルで実行します。

# 使い方

Emacsで以下の操作をして、リマインダー.appにタスクを追加します。

- リマインダー.appに登録したいorg-modeのタスクにカーソルを合わせる
- M-x add-org-task-to-reminder を実行する

# 今後の課題

- reminders-cliを改良して日時、優先順位の情報もコマンドラインでリマインダー.appに渡せるようにする
- Emacsからリマインダー.appにタスクを渡す際に、リマインダー.appのリスト名をインタラクティブに指定できるようにする
- Emacsから複数のタスクを一括でリマインダー.appに渡せるようにする
【VBA】シートの扱い【基本】

##シートを変数に代入

```vbnet
Dim hogeSheet As Worksheet

Set hogeSheet = ThisWorkbook.Worksheets("シート名")
```

##シートのアクティブ化

```vbnet
ThisWorkbook.Worksheets("アクティブ化したいシート名").Activate
```

または、

```vbnet
Dim hogeSheet As Worksheet
Set hogeSheet = ThisWorkbook.Worksheets("アクティブ化したいシート名")

hogeSheet.Activate
```

## 新規シート作成

```vbnet
Function 新規シート生成(sheetName As String) as WorkSheet
    Dim OldSheet As Worksheet
    Set OldSheet = ActiveSheet
    
    With Worksheets.Add()
        .Name = sheetName
    End With
    
    Set 新規シート生成 = ActiveSheet
    OldSheet.Activate
End Function
```

###ポイント

```vbnet
Dim OldSheet As Worksheet
Set OldSheet = ActiveSheet

OldSheet.Activate
```

デフォルトだと新規にシートを追加すると、その追加したシートがアクティブになってしまう。
上記の記述により、このプロシージャを実行する前後でアクティブシートが変わらないようにしている。

##シート削除

```vbnet
Sub シート削除(sheetName As String)
    Application.DisplayAlerts = False
    ThisWorkbook.Worksheets(sheetName).Delete
    Application.DisplayAlerts = True
End Sub
```

デフォルトだとシート削除時にアラートがでるため、`Application.DisplayAlerts`を切り替えている。

##画面描写OFF

```vbnet
Application.ScreenUpdating = False

'アクティブシートが変わるような処理
'
'

Application.ScreenUpdating = True
```

デフォルトだとアクティブシートを切り替えるマクロを実行すると、その都度画面描写をするため、実行速度が遅くなってしまし、目がチカチカする。
`Application.ScreenUpdating`を切り替えることにより、画面描写をOFFにすることができる。
Unityでの2Dアクションゲームにおける、コライダーの工夫の仕方。

Unity にて一時期、2Dアクションゲームを作ってみようと思い、スーパーマリオブラザーズの様なオーソドックスなアクションゲームを試みていました。Unity の Ver は **<font color="Blue">5.4.3f1</font>** です。

しかし、Unity3D では Character Controller という簡易的で非常に便利な制御システムがあるんですが、実際に1からプレイヤーの制御を作っていくのは大変なんですね・・。

- プレイヤーと地面との接地判定。
- ジャンプの条件と軌道の調整。
- プレイヤーがブロック等に横から当たった際の処理。

3番目の「プレイヤーがブロック等に横から当たった際の処理」については現在もどうしようか悩み中です。で、予想外に厄介だったのが、1番目の「プレイヤーと地面との接地判定」でした。
床については Scale 1×1 のブロックを敷き詰める感じで作っていくのですが、
**<font color="Blue">『Scale X:1 Y:1 のスプライトを、Position X:1 の間隔で並べる』</font>**
上記の様に数値上はキッチリ設定しても、何故かSceneビューで確認すると、隙間が発生してしまいます。

![Block01.png](https://qiita-image-store.s3.amazonaws.com/0/153239/1442305e-887b-bfca-f3b6-46ecac5fd9ef.png)
**<font color="Brown">※見た目的には問題無さそうですが・・</font>**

![Block02.png](https://qiita-image-store.s3.amazonaws.com/0/153239/e94e2d72-dfbc-13da-03a8-9ea1f913dc70.png)
**<font color="Red">※実際はこんな風に・・。（注：数値上はちゃんと等間隔で隙間も出ない数値です）</font>**

![Block03.png](https://qiita-image-store.s3.amazonaws.com/0/153239/8988451f-27a8-a51f-51a3-2c5727df36ee.png)
**<font color="Red">※スプライトを消した状態。</font>**

この結果、どうなるかというと、<font color="Red">プレイヤーのコライダーが四角形の場合、時折ブロックの継ぎ目の所で引っ掛かってしまう</font>のか、それ以上右に進めなくなってしまうケースが発生してしまうのです。

![ColliderBug01.png](https://qiita-image-store.s3.amazonaws.com/0/153239/5df20c65-cd6e-74cc-47e1-c2a976c4d515.png) ![ColliderBug02.png](https://qiita-image-store.s3.amazonaws.com/0/153239/aef30d1d-7df4-e099-574c-7b04c43807bb.png)
モーションとしては歩いていますが、実際はブロックの継ぎ目で引っ掛かって右に進めていません（**<font color="Red">□</font>**の部分）。
こうなってしまうと、一旦ジャンプして継ぎ目を飛び越えない限り、いつまでも引っ掛かったままです。これはプレイヤーのコライダー形状が四角形だから起こる様です。

しょうがないから、Box と Circle の Collider をドッキングさせた形状にしてみました。
![ColliderBun03.png](https://qiita-image-store.s3.amazonaws.com/0/153239/4748c620-47af-a0e7-ce90-043aeaa4da1d.png)
まあこれならブロックの継ぎ目には確かに引っ掛からなくなります。が、今度はブロックとプレイヤーとの接地面積が少な過ぎて、ブロックの端まで来るとそのままズルッと落ちていってしまいます。ブロックのギリギリ端までプレイヤーが進める仕様にしたい以上、これじゃ都合が悪過ぎます。ギリギリジャンプの際にもジャンプの高さがおかしな事になりますし・・。

しかし、これを解決してくれる材料を、Unityはちゃんと持っているんですね。
Inspectorビュー > Add Component > Physics 2D > **<font color="DarkGoldenRod">Edge Collider</font>** という便利なコライダーです。これは、曲線こそ書けませんが、任意の形状（台形や三角形、六角形等）にコライダーを作る事が出来る様ですね。
![EdgeCol01.png](https://qiita-image-store.s3.amazonaws.com/0/153239/2dadb40c-9764-c8ca-6590-2d8094207a33.png)![EdgeCol02.png](https://qiita-image-store.s3.amazonaws.com/0/153239/85857920-4f74-77bc-6f5d-0e6f20363755.png)

**<font color="Brown">※ Points の項目を開いて Size を指定し、頂点を編集していく事で右の画像の様なコライダー形状にも出来ます。</font>**

足元の両端のみ、上手く小さい切り込みを入れる感じで設定（**<font color="Red">□</font>**の部分）。これにより、従来の Box Collider とほぼ同じ形状を維持出来る上に、これならブロックの継ぎ目で引っ掛かる事も無くなります。実際、これであれば、全く引っ掛かる事無くプレイヤーが進める様になりました。良かった良かった、これは素晴らしい！

・・本当は数値的に問題無い以上、継ぎ目で引っ掛かってもらっては困るのですが、仕方のない場合も出て来ると思います。そんな時は上手く別の解決策で解消しましょう。

以上、小ネタでした。

「さいたまげーむすライト」のページ。
***https://play.google.com/store/apps/developer?id=さいたまげーむすライト***

「さいたまげーむす」のページ。
***http://saitamagame.com/***
npmに変わるパッケージマネージャーYarnを導入してみる

npmのinstallが遅い？ yarnを試しましょう。

# Yarnとは
https://yarnpkg.com/
Facebook2016年10月にローンチした新しいパッケージマネージャー。
開発にはGoogleを始めとする企業のエンジニアが携わっているらしい。

サイトにも書かれている通り、Ultra Fast らしい。

# 特徴

* 早い
    * 特に2回目以降のinstallはキャッシュが使われるため非常に高速になる
* オフラインでもキャッシュあればインストール可能
* yarn.lockによりインストールバージョンが固定される(後述)
* 重複バージョンをインストールしないように出来る
    * サイズが減る(ただし、動作確認しないと悲惨なことになりそう)

# インストール
とりあえず、Macにインストールしてみる。
```npm install``` でもいいけど、npmからの乗り換えのために作られたのでbrewでのインストールが推奨されている。

```
$ brew install yarn
$ yarn --version
0.17.2
```
まだv1.0.0ではないらしい。

## すでにnpm入れていて、yarnに乗り換えるとき
package.jsonはnpm互換とのことで、そのまま使える。※例外あったので後述

```
$ cd [project_directory]
$ rm -rf node_modules/
$ yarn (or yarn install)
```

これで完了。

## 初めてyarnを試す時

```
$ cd [project_directory]
$ yarn init
// nameとかversionとか聞かれるので入力する
$ yarn add [package]
```

addとかremoveとかupgradeは公式ドキュメントを見る
https://yarnpkg.com/en/docs/usage

## 速度

とあるPJで測定してみると・・・
Ultra Fast！

```
// npm install
real	1m29.153s
user	1m1.950s
sys	0m13.633s

// yarn(1回目)
real	0m14.794s
user	0m9.357s
sys	0m4.429s

// yarn(2回目)
real	0m0.923s
user	0m0.932s
sys	0m0.069s
```

# npmとの互換性について
## private githubリポジトリがインストール出来ない
下記のような記載になっているとインストールが上手く行かない

```package.json
{
  "dependencies": {
    "some-package": "git+ssh://git@github.com:org/some-package.git#v1.0.0"
  }
}
```

このような場合は":org"を"/org"にする

```package.json
{
  "dependencies": {
    "some-package": "git+ssh://git@github.com/org/some-package.git#v1.0.0"
  }
}
```

※yarnのgithubではこれに対するPRが出ているので、そのうち修正されると思われる。

## ローカルパッケージがインストール出来ない

```package.json
{
  "dependencies": {
    "some-local-package": "../some-local-package"
  }
}
```

こうする

```package.json
{
  "dependencies": {
    "some-local-package": "file:./../some-local-package"
  }
}
```

# yarn.lockについて
インストールすると、ルートディレクトリに```yarn.lock```なるファイルが自動生成される。
このファイルにはインストールされたバージョン情報などが記載され、他の人がインストールするときに全く同じバージョンのパッケージがインストールされるとのこと。

このファイルは、gitなどのバージョン管理に含めることが推奨されており、
「え？自分のマシンだと動くし」みたいなめんどくさいやつが無くなりそう。

# 補足: pnpm
npm installの時間を短縮しようと、yarn以外で[pnpm](https://www.npmjs.com/package/pnpm)というものもある。

こちらもnpmに比べて超高速にインストールが可能。
既存プロジェクトで比べた所、インストールに2分とかかかるやつが20秒くらいでインストールされる。
ただし、node_modulesのディレクトリ構成が変わる(シンボリックリンクになる)ため、不具合が出る可能性もある。
React Redux コンテナコンポーネントのプロパティにActionをdipatchするコード(mapDispatchToProps)の書き方

React Redux を理解するために以下のサンプルコードを追ってました
[TODOアプリ](https://github.com/reactjs/redux/tree/master/examples/todos)

コンテナコンポーネントのプロパティにActionをdipatchするプロパティ（よくある名前はmapDispatchToProps)の挙動がよく分からなかったのですがいろいろいじくっていたらわかったことがあったので共有


mapDispatchToProps　が関数の場合は、引数で渡されるdispatchを明示的に読んでActionとプロパティが紐付けられます

```js:containers/FilterLink.js
import { setVisibilityFilter } from '../actions'
import Link from '../components/Link'
const mapDispatchToProps = (dispatch, ownProps) => ({
  onClick: () => {
    dispatch(setVisibilityFilter(ownProps.filter))
  }
})

```


逆に
mapDispatchToProps　がオブジェクトの場合は、dispatchを呼ばずに、Actionとプロパティが紐付けられます

```js:containers/VisibleTodoList.js
import { toggleTodo } from '../actions'

const mapDispatchToProps =  ({
  onTodoClick: toggleTodo
})

```

 
ちなみにReduxの考え方に関しては以下の記事がわかりやすかったです
[Reduxでコンポーネントを再利用する](http://qiita.com/kuy/items/869aeb7b403ea7a8fd8a)
LEFT JOINを利用して絞り込みを行う際、default_scopeを考慮したいならmergeで書く

`Author has many Comments` という関連がある時に「commentsを持たないauthor」を得ようとしたらたぶんこう書くと思う。

```ruby
Author.eager_load(:comments).where(comments: { id: nil })
```
しかし`Comment`に`default_scope`が設定されている場合、上記の書き方では無視されてしまう。

## なので`merge`で書く
```ruby
Author.eager_load(:comments).merge(Comment.where(id: nil))
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```
こう書くと`Comment`の`default_scope`がクエリに含まれる。

# 余談
- 「`eager_load`じゃなくて`includes`じゃないの？」という人は以下を参照
  - http://k0kubun.hatenablog.com/entry/2016/05/29/215851
- そもそも`default_scope`が微妙ではという話でもある
- Rails5の`left_outer_joins`だとどうなってるんだろう？
Linuxでファイルの拡張属性を一括削除する

Linuxの主要なファイルシステムでは拡張ファイル属性というものがサポートされている。これはファイル名やファイルサイズやファイルの中身とは別に、任意の属性名で任意の値をファイルに付けられるものです。

# 拡張属性の基本的な使い方
拡張属性の操作には `attr`, `getfattr`, `setfattr` というコマンドを使うのが一番基本的なやり方になります。これは attr というパッケージに入っているので、無ければ `yum install attr` とかすれば入れられます。
で、例えばこんなふうに使います。

```shell-session
# 適当にファイルを作って
$ touch file1

# 適当に拡張属性を付けてみる
$ setfattr -n user.foo -v bar file1
$ setfattr -n user.aaa -v AAA file1

# 拡張属性名を指定して値を取得したり
$ getfattr -n user.foo file1
# file: file1
user.foo="bar"

# 拡張属性名をマッチングで一覧したりも出来る
getfattr -m .\* file1
# file: file1
user.aaa
user.foo

# 削除は拡張名を指定して１個ずつ行う
$ setfattr -x user.foo
$ setfattr -x user.aaa
```

こんなふうに沢山拡張属性を付けてもファイル自体のサイズは一切替わりません。

拡張属性には名前空間というのがあって、頭に `user.` とついているのがその一つで、種類は以下の通り全部で４つあります。

- user (ユーザ空間でユーザが好きな名前で好きに使える場所)
- trusted (ユーザ空間の一種？実行プロセス制限付き)
- system (システムがアクセス制御とかに使う用)
- security (SELinuxやcapabilityの付与に使われる)


# 拡張属性をまとめて全部削除したい
で、ここが本題です。

GlusterFS とかを使ってると拡張属性がバリバリに使われていて `trusted.gluster*` とか `trusted.afr.*` とかの拡張属性が全ファイルに数個〜10個ずつくらいついてきたりします。まぁそれは必要があって付いてるものなんで構わないんです。
ですが、ある日 GlusterFS をやめて普通のディスクとして使いたいなー、しかも GlusterFS 内にあったファイルはそのまま使いたいなー、となったとします。
そういう場合は別にブリックフォルダをGlusterにマウントしないだけで、そのまま使ってても全然構わないし、逆にそのまま使えちゃうのって凄い便利で安心だよねーというのがGlusterFSのポイントでもあるんですが、やっぱり気持ち悪いので大量についた拡張属性を掃除したくなるわけです。

そんなとき、`setfattr -x -m .\* file1` とかいう風に１ファイルに対して全ての全マッチングした拡張属性名を全部一発で消せたら嬉しいんだけど、そういうオプションはないみたいです。なのでまず `getfattr -m .\*` とかで拡張属性名一覧を取得して、それを１個ずつ指定して削除という感じでクリーニングしてくことになります。当全面等臭いので関数化しておくと便利です。

```bash:rmxattr.sh
#!/bin/bash
rmxattr() {
  local p a
  for p in "$@"; do
    getfattr -m .\* "$p" |
    while read -r a; do
      [[ -z $a ]] && continue
      [[ $a == \#* ]] && continue
      setfattr -x "$a" "$p"
    done
  done
}
if [[ ${BASH_SOURCE[0]} == "$0" ]]; then
  rmxattr "$@"
fi
```

これを source するか直接実行するかで `rmxattr file [..files]` としてやればそのファイルについてる拡張属性が全部消せます。ちょっと楽になった。
あとはまーさらにこれを find で回してやればディレクトリを再帰的に巡回してやれば、元GlusterFSのブリックなディレクトリが普通のファイルシステムに戻せたりします。あ、あとGlusterの元ブリックだと `.gusterfs` とか `.trashcan` とかいうディレクトリがあった気がするのでそっちはファイルの実体ごと削除しちゃってOK。

おわり。
リスニング/技術英語 > Adafruit > Battery Basics @adafruit > Part 5 > in stark contrast / susceptible to punctures

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

Part 1: http://qiita.com/7of9/items/2f714355dcbbe3992cb5

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

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

CC: (Closed Captioning)[英語(自動生成)]とする。


(6:09-)
In <font color=red>startling contrast (CCでは in stark contrast; こちらが正しいそう)</font> to Lead acid, lithium-ion and lithium-polymer batteries deliver a lot more energy for their weight, but they're significantly less durable and far more expensive.

(6:26-)
You find lithium-ion cells usually come in a rigid casing whereas lithium-polymer cells uses a soft pouch, which is lighter and more compact.  

(6:39-) [一部訂正]
This streamline design is great for keeping portable electronics small, but it also make the cell <font color=red>~~acceptable~~ susceptible(訂正)</font> to (CCではtwo;間違い) **punctures**, which can quickly lead to shorts between the electrodes over heating (CCではoverheating;正しそう), off-gassing and subsequent undesirable explosions. 

(6:55-)
... that being said lithium cells are the most popular rechargeables nowadays, available in the impressive **<font color=red>XXX (CCではarray of; 正しそう)</font>** sizes from tiny, 2 grams, all the way up to the monsters used in the electric cars.

(7:07-)
And that's the basics of a variety of battery types for a variety of uses. It's important to choose the right cell for the job. Now **a few (CCではif you'll)** ... Excuse me. I'm going to recharge myself. 

終わり

### 上記のフレーズを抜粋

- in stark contrast
   - http://eow.alc.co.jp/search?q=in+stark+contrast
   - 全く対照的に
- punctures
   - 思い出したのは [Acupuncture](https://en.wikipedia.org/wiki/Acupuncture)
   - タイヤのパンクは [flat tire](http://ejje.weblio.jp/content/flat+tire)
- (追記) susceptible to punctures
   - @knoguchiさん、訂正ありがとうございます
   - [susceptible](https://www.merriam-webster.com/dictionary/susceptible)
   - https://github.com/scaron/prettyphoto/issues/149
      - > and all of them **are susceptible to** this attack.
Three.jsとカンバスで簡易テクスチャフォント


3D空間上に文字を表示したい時がよくある。
日本語などマルチバイト文字の表示は、毎度のこと苦労するのでcanvasをTHREE.Textureにそのまま割り当てる手法をつかって、お手軽にテクスチャフォントを実現した。

###サンプル

[http://codepen.io/moxuse/pen/zoMggj](http://codepen.io/moxuse/pen/zoMggj)


###ポイント

65行目

```
var texture_ = new THREE.Texture(canvas_);
```

でカンバスの描画をそのままTHREE.Textureにできる。

- 裏面も描画されるようマテリアルのsideプロパティはTHREE.DoubleSideにしている。

- テクスチャサイズを2のベキ乗にしておく必要があるので、文字が見切れないよう、うまく収まるテクチャサイズとカンバスサイズを設定する必要がある。

- カメラが寄った時にカンバスの解像度によって眠くなる大きさがある。動かす環境や描画の数等パフォーマンス面と、カメラの距離など考慮してテクスチャのサイズはうまいこと設定する。
エクセルでCtrlキーをいろいろなキーと組み合わせて試してみた件

#1.はじめに  
    エクセルのCtrlキー＋他のキーの組合せで、先日（私にとって）すごく便利なキーの組合せを見つけました。
    そこで、他にも便利なCtrlキーの使い方があるか、いろいろと試してみました。
    ※私がすごく便利だと感じたキーの組合せは、最後に発表します。
    
#2.普段から便利でよく使っているキーの組合せ
    Ctrl＋C  選択されたセルのコピー  
    Ctrl＋F  検索画面を開く  
    Ctrl＋S  上書き保存  
    Ctrl＋V  セルを貼り付ける    
    Ctrl＋X  選択されたセルを切り取る
    Ctrl＋Z  直前の操作を元に戻す
    
#3.普段は使っていないが、使ったら便利そうだと思ったキーの組合せ  
    Ctrl＋1  セルの書式設定ダイアログの表示
    Ctrl＋2  太字の書式設定／解除    
    Ctrl＋B  太字の書式を設定／解除   
    Ctrl＋3  斜体の書式設定／解除    
    Ctrl＋I  斜体の書式を設定／解除   
    Ctrl＋4  下線の設定／解除    
    Ctrl＋U  下線の設定／解除 
    Ctrl＋5  取り消し線の設定／解除  
    Ctrl＋A  全てのセルを選択    
    Ctrl＋H  置換画面を開く  
    Ctrl＋O  ファイルを開く  
    Ctrl＋P  印刷をする  
    Ctrl＋W  保存して閉じる  
    
#4.個人的にはそれほど利用したいと思わないキーの組合せ    
    Ctrl＋9  行を非表示          
    Ctrl＋0  列を非表示          
    Ctrl＋K  ハイパーリンクを挿入          
    Ctrl＋N  Bookを新規作成する          
    Ctrl＋R  右方向へコピー（フィル）      
    Ctrl＋:  現在時刻を入力          
    Ctrl＋－ セルを削除          
    Ctrl＋Space  列を選択            
    Ctrl＋Page Up    1つ前のシートを表示  
    Ctrl＋Page Down  1つ後のシートを表示  
    Ctrl＋↑↓←→  行や列の端までジャンプ
    
#5.何かが起こるが使い方がわからなかったキーの組合せ  
    Ctrl＋8
    Ctrl＋G
    Ctrl＋L
    Ctrl＋T
    Ctrl＋Y
    
#6.何も起こらなかったキーの組合せ    
    Ctrl＋6 反応なし
    Ctrl＋7 反応なし
    Ctrl＋E 反応なし
    Ctrl＋J 反応なし
    Ctrl＋M 反応なし
    Ctrl＋Q 反応なし
    
#7.最近見つけてすごく便利だと思ったキーの組合せ
   唐突ですが、ユーザーとの会議の場でプロジェクターに課題管理表を映しその場で解決日や最終更新者などを入力しながらどんどん進めていくのですが、日付や最終更新者の入力が結構煩わしかったりします。

しかし、以下のキーを知ることで、これらの煩わしさから解放されました。

　　Ctrl＋;　現在日（YYYYMMDD）を入力する

　　Ctrl＋D　1つ上のセルの内容をコピーする

どうです、すごく便利だと思いませんか。

1～6番までは、この2つのキーを書くための前振りだったのですが、私のこの感動が伝わらなかった方、ごめんなさい。