OmniAICreator/Qiita-1.07M huggingface dataset:
快適なC++生活のためにスクリプト言語を使おう　- OpenCV-Python をC++に移植する -

OpenCV-PythonはOpenCVを利用したアルゴリズムを開発するのに、開発しやすい環境です。
そこで開発したアルゴリズムをC++に移植すときのヒントとなるメモを記す。

OpenCV-Pythonの場合：
numpy.array型の利用
→
cv::Mat型への置き換え
numpy.array型固有のメソッドを
cv::Mat型のメソッドへの置き換え。

このような書き換えが、簡単にできます。
画像処理のアルゴリズムを構築できるほどの経験がなくても、C++の経験さえあれば、OpenCV-Pythonのコードを　OpenCV　C++に書き換えることができます。


| numpy.array | cv::Mat | 注意点 |
|:---------------|:----------------------|:---|
| a = np.ones((h,w), dtype=np.uint8) | cv::Mat a=cv::Mat::ones(cv::Size(w, h), cv::CV_8U);| |
| shape | size | shapeは[h, w, channel]の順番、または[h, w] |
| img.shape | cv::Size(img.rows, img.cols) |  |
| img = cv2.imread("lena.png");　imgRGB=img[:, :, ::-1] |  cv::Mat img = cv::imread("lena.png"); | cv2.imread()はBGRの順 |
| import pylab as plt; plt.imshow(imgRGB) |  cv::imshow("title", img); |  matplotlib のimshow()はMatlabのimshow()に近い|
| a[:, :] = 0     | a.setTo(0);|　カラー画像の場合は a[:, :, :] = 0 。setTo()の引数は定数| 
| a[b>127] = 255 | a.setTo(255, b > 127);|
| a = b+0        | b.copyTo(a);| numpyでは単にa = b とするとaはbに対する別名で、実体は同じになる。|　
| a[c==d] = b[c==d] | b.copyTo(a, c==d);|　|
| a = np.array(b, dtype=np.float32)/255.0 | b.convertTo(a, CV_32F, 1.0/255);| |

OpenCV-Pythonのコード例

```example.py:
# -*- coding: utf-8 -*-

import cv2
import numpy as np
img = cv2.imread("lena.png", 0)

b = np.zeros(img.shape[:2], dtype=np.uint8)
b[img > 128] = 255
cv2.imwrite("junk.png", b)
```



書き換えたC++のソースコードの例

```example.cpp:
#include <opencv2/opencv.hpp>
int main(int argc, char* argv[]) {
    cv::Mat img= cv::imread("lena.png", 0);
    cv::Mat b = cv::Mat::zeros(cv::Size(img.rows, img.cols), CV_8U);
    b.setTo(255, img>127);
    cv::imwrite("junk_cpp.png", b);
}
```

実行結果の画像
![junk.png](https://qiita-image-store.s3.amazonaws.com/0/83761/b40f3c76-f451-12ba-5cde-a0711df67c1d.png)

--------------
numpyにある便利な関数
numpy.rot90(m, k=1, axes=(0, 1) (https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.rot90.html)


## 注意
C++のバージョンが上がるのにともなって、OpenCVで前提とするC++のバージョンも変化しています。この記載内容が古くなっています。
Raspberry PiにDockerを入れる

今まではCPUの違いから導入に苦労したようですが、現在では公式にサポートされているようですのでそれに従います。

他にはhypriotがDocker同梱のOS(Raspbianベース?)を用意しているので、それを利用する方法もあります。

## 導入

公式ブログが一番わかりやすいと思います。

https://www.raspberrypi.org/blog/docker-comes-to-raspberry-pi

どうやらコマンド1つで入るようです。

```
$curl -sSL https://get.docker.com | sh
```

以下をコマンドで非root状態でも利用できるようになります。
再ログインが必要です。

```
$sudo usermod -aG docker [username]
```

Docker Hubで探すときは`rpi-`を付けるとラズパイに対応したものが出てきやすいと思います。

## テスト

とりあえず確認としてhypriotのイメージを動かしてみます。
hypriotとはARM向けのDockerをいろいろ準備してくれているすごい団体です。(たぶん)
ドクロが怖いですが多分いい人だと思います。

```
$docker run -d -p 80:80 hypriot/rpi-busybox-httpd
```

ラズパイのアドレスをPCで覗くとhypriotの画像が現れます。

```
http://192.168.xxx.xxx
```

![20170416224856.png](https://qiita-image-store.s3.amazonaws.com/0/181869/323f2305-0271-d3b1-dd82-aebc8b927295.png)

確認が終わったらpsで動作状況を確認し、stopで名前を指定して停止します。

```
$docker ps
$docker stop [NAME]
```

参考
http://hammmm.hatenablog.com/entry/2016/01/09/230036
Google Apps ScriptでES Module(Babel)を使うときのTips

## 

ここ1年ほどで Browserify + Babel 、 Webpack + Babel の組み合わせで ES2015を使った Google Apps Script の開発を紹介するブログなんかをちらほら見かけるようになりました。

「Babel6を使うとGASをアップロードするときにエラーが発生するのでBabel5を使いました」というような記事もあったので何がいけないのか調べてみました。結論から言うとBabel6も利用できます。

## Babel6での問題

ES Module(import/export)で書いてBabel6で変換した場合、変換後のスクリプトをスクリプトエディターにコピペしたりnode-google-apps-scriptでアップロードしたときにエラーになる場合があります。

## エラーの原因

ローカルでES2015で以下のようにコーディングします。

```js:ES2015で書いたJS
export default {}
```

それをBabel6で変換した結果(必要箇所のみ抜粋)は次のようになります。

```js:babel6で変換した結果
exports.default = {};
```

この変換後の`default`というキーワードが問題で、GASアップロード時のバリデーションに引っかかってエラーになってしまいます。
Babel5までは以下のように変換されていたのでバリデーションでエラーにならずに済んでいました。

```js
export["default"] = {};
```

## エラーの解決方法

`default`というキーワードが問題なので、Babel6で変換した結果が以下のようになればエラーは起きないはずです。

```js
export["default"] = {};
```

ちょうどいいことに、Babelには次のようなプラグインがあり、これらを使うとまさに`export.default`を`export["default"]`に置き換えてくれます。

- [transform-es3-member-expression-literals](https://babeljs.io/docs/plugins/transform-es3-member-expression-literals/)
- [transform-es3-property-literals](https://babeljs.io/docs/plugins/transform-es3-property-literals/)

これらのプラグインは以下のコマンドでインストールできます。

```bash:
npm install --save-dev transform-es3-member-expression-literals transform-es3-property-literals
```

`.babelrc`に次のように書けば今まで通りのコマンドで利用できます。

```json:.babelrc
{
  "presets": ["es2015"],
  "plugins": [
    "transform-es3-member-expression-literals",
    "transform-es3-property-literals"
  ]
}
```

## babel-gas-presetの紹介

複数のプラグインのインストールと`.babelrc`への記述が面倒なのでこれらのプラグインをまとめた [babel-preset-gas](https://www.npmjs.com/package/babel-preset-gas) という babel-preset を作成しました。
GAS向けのプラグインをまとめて導入するのに便利だと思います。(まとめてと言っても今は2つしかありませんが :sweat_smile: )

インストールは以下のコマンドで完了です。

```bash
npm install --save-dev babel-preset-gas
```

`.babelrc`に次のように書けば上記と同じように利用できます。記述が減って少しスッキリしましたね。

```json:.babelrc
{
  "presets": ["es2015", "gas"]
}
```

Babelを使ってGASを開発している方は使ってみてください。

> es3ify-webpack-plugin とかもで同じことが実現ことできるはず。
Delphi 10.2 Tokyo Starter にユニットテストフレームワーク　DUnitXをインストールする

有償版には最初から入っているようですが、Starterにはユニットテストフレームワークは
入っていません。

調べてみるとDunitXはGitHubで公開されているようなので
Starterに入れてみます。

# DUnitXの入手
https://github.com/VSoftTechnologies/DUnitX
を開き緑色の[clone or download]ボタンから
cloneかdownloadどちらかを選択、今回はダウンロードでやってみます。

![GitHub.png](https://qiita-image-store.s3.amazonaws.com/0/151329/b89af635-6d88-ec2a-c65c-bb2cf5a42fa8.png)

DUnitX-master.zipがダウンロードできました。


#環境変数の設定

解凍するとDUnitX-masterディレクトリが出来ます。
このままの名前でもいいですが、今回はDUnitXというディレクトリ名に変更します。
そして適当な場所に移動、今回はわかりやすくCドライブ直下に置きます。

そしてDelphiを起動、メニューのオプションを選択します。
![option.png](https://qiita-image-store.s3.amazonaws.com/0/151329/eb00db58-83af-5d67-050b-d21dce921e10.png)

オプションダイアログの[環境変数]を選択し、下の方にある[新規作成]ボタンを押下します。![option2.png](https://qiita-image-store.s3.amazonaws.com/0/151329/9f873fbd-94c7-a8d7-cc6b-039720b678bf.png)


ユーザ変数の追加ダイアログが表示されるので
変数名に[DUNITX]
変数値にDUnitXの置かれているパス名 [C:&yen;DUnitX]
を入力してOKボタンを押下します。

![UserVariable.png](https://qiita-image-store.s3.amazonaws.com/0/151329/be2fa2ef-7dbc-ebca-9e8f-f0d48bb7cfe9.png)

環境変数DUNITXが追加されました。

![option3.png](https://qiita-image-store.s3.amazonaws.com/0/151329/a365edca-c30a-7804-0660-512057526552.png)

次に同じくオプションダイアログのライブラリのライブラリパスを編集します、右端の...をクリック

![option4.png](https://qiita-image-store.s3.amazonaws.com/0/151329/4f554edc-eba8-99ad-2a83-69d609fc1e85.png)


ディレクトリダイアログが表示されるので[$(DUNITX)]と入力して追加ボタンを押下してOKボタンを押下します。
![directory.png](https://qiita-image-store.s3.amazonaws.com/0/151329/6add6679-05c3-cccf-39cd-50154c73280a.png)

これで環境変数の設定は完了、一旦Delphiを閉じます。

#インストール
DUnitXディレクトリ内にあるDUnitX_D10Tokyo.groupprojをダブルクリックすると
Delphiが立ち上がります。
![install1.png](https://qiita-image-store.s3.amazonaws.com/0/151329/db838d19-a2ae-bc50-d1c4-a0f8b22f5808.png)


右側のプロジェクトマネージャにあるDUnitX_IDE_Expert_D10Tokyo.bplを右クリックするとメニューが表示されるので
そこからインストールを選択するとインストールが開始されます。
![install2.png](https://qiita-image-store.s3.amazonaws.com/0/151329/8aa28ee1-e589-ee2c-fa1b-7cae3f0bc7f6.png)

DUnitXがインストールされました。(厳密に言えばテストウィザードがインストールされたなのかな？)
![install3.png](https://qiita-image-store.s3.amazonaws.com/0/151329/f2763ae0-8254-83b7-e6b9-e6cedc77387f.png)

Delphiを閉じます。

#テストプロジェクトの作成
とりあえずシンプルなのを１つ作ってみます。
Delphiを起動し、メニューから新規作成→その他を選択
今まで無かったDUnitX Projectがあるのがわかります。
![DUnitXProject1.png](https://qiita-image-store.s3.amazonaws.com/0/151329/8180b08e-49d0-3f49-d279-1c9145653cde.png)

このまま、DUnitX Projectを選択し、OKボタンを押下、そのあと表示されるダイアログのチェックも全部つけてOKボタンを押下します。
![DUnitXProject2.png](https://qiita-image-store.s3.amazonaws.com/0/151329/bfe166a0-3279-01ce-08d4-9c18d4b338bf.png)

プロジェクトが出来上がるので、コンパイルして実行すると
![TestImage.png](https://qiita-image-store.s3.amazonaws.com/0/151329/690dcaea-7771-7ab1-38bb-015a6f8a71a2.png)

とりあえず、テストを走らすことができました。
SandBoxだと自分の投稿へのコメントが取れない（Instagram の APIの話）

自分の投稿した写真へのコメントを取得したい。自分の投稿へのコメントなんだからSandBoxで実現できるだろうと思って試してみたが、出来なかった。

ドキュメントのSandBoxの API Behavior にはこうある。

> The first point is important and it means that the API behaves as if the only users on Instagram were your sandbox users, and the only media ever posted were the last 20 for each of these users.
（Google翻訳：最初の点は重要であり、Instagram上の唯一のユーザーがサンドボックスユーザーであるかのようにAPIが動作し、過去に投稿されたメディアがこれらのユーザーの最後の20だったことを意味します。）

要するに、投稿が自分のものであってもSandBoxの世界には存在しない自分以外のユーザーがしたコメントを `/media/{media-id}/comments` で取得することはできない、ということらしい（自分の投稿に自分がしたコメントは取れる）。
ただし、`/media/{media-id}` のレスポンスには `"comments": { "count": 3 }` のような件数が含まれていて、これは自分以外がしたコメントもカウントされている。一貫性がないぞ。


#参考
[Sandbox Mode • Instagram Developer Documentation](https://www.instagram.com/developer/sandbox/)

[Instagram Developer Documentation](https://www.instagram.com/developer/)
[Instagram APIでwebサービスを作りたい全ての人に向けて書きました](https://syncer.jp/instagram-api-matome)
[Instagram APIを使ってWEBサイトに写真を表示させてみよう｜株式会社カポタスト](https://capotast.co.jp/article/detail/21/)
[InstagramのAPIで写真を取得する【準備編】 | デジタルコンサルタントAWS](https://aws2000.net/?p=1189)
[instagramのuser idを取得する方法](http://thisisstandarz.com/instagram%E3%81%AEuser-id%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
[Instagram APIをPHPでさくっと使う - Qiita](http://qiita.com/uda0922/items/0c111d3e312b1dc5d6e8)
[インスタグラムAPIが仕様変更し、アプリケーション・サービスへの利用には申請と承認が必要に](https://gist.github.com/hommaam/c8e2c3e4256971e30507)
[保存版】Instagramの審査の流れ、手順、必要なものまとめ - Qiita](http://qiita.com/takashings/items/f03eb9e2ba343878d287)
[Instagram APIの利用方法 - Qiita](http://qiita.com/NoriakiOshita/items/71800502fca62d9ec685)
[【2017年2月更新】 超厳しい Instagram API の審査基準 を翻訳した - 俺、サービス売って家買うんだ](http://www.ie-kau.net/entry/2016/01/26/%E8%B6%85%E5%8E%B3%E3%81%97%E3%81%84_%E3%80%90Instagram_API_%E3%80%91%E3%81%AE%E5%AF%A9%E6%9F%BB%E5%9F%BA%E6%BA%96_%E3%82%92%E7%BF%BB%E8%A8%B3%E3%81%97%E3%81%A6%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E3%81%BF)
[Instagram APIの審査、承認までの流れ | 株式会社クラヴィス](https://clanweiss.co.jp/column/development/?p=289)
暗黙的Intent（既存のアプリケーションの実行） 

あるアプリケーションからAndroid端末にインストールされている既存のアプリケーションを実行することができる。
一般的に、インストールされているアプリケーションではクラス名などの情報は不明なので、暗黙的Intentを利用する。

#Webブラウザの実行
ここでは例として、Webブラウザを使って指定したURLのページを表示するアプリケーションを作成する。

以下は、メインとなるActivityのコードである。

```Java
        //ボタンを取得
        Button button = (Button)findViewById(R.id.button);

        //EditTextから文字列を取得
        EditText editText = (EditText)findViewById(R.id.editText);
        final String text = editText.getText().toString();

        //ボタンがクリックされた時の処理
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                //文字列からUri型の変数を作成
                Uri uri = Uri.parse(text);

                //実行するActivityとuriをIntentに設定
                //URIを使って何かを表示させたい場合、Intent.ACTION_VIEWを使う
                Intent intent = new Intent(Intent.ACTION_VIEW,uri);

                //Activityを実行
                startActivity(intent);
            }
        });
```

ポイントはintentのコンストラクタで、
第一引数に実行するActivityを決めるための文字列を、
第二引数にuriを設定している。
今回使ったACTION_VIEWは、uriの種類に応じて次のアプリケーションを起動する。

|URIの種類|実行されるアプリケーション|
|:---|:---|
|http:|Webブラウザ|
|https:|Webブラウザ|
|tel|電話をかけるアプリケーション|
|mailto:|メール用アプリケーション|

#GitHubリンク
https://github.com/tagfa/MyImplicitMainActivity02
swift3で手っ取り早くローディングアニメーションを作成

# 概要
iOSアプリ開発でのメモ。
GIFをごにょごにょ読み込むこともSVGKit使ってSVG読み込むこともせずに、**NowLoadingなアニメーション**を実現

# 完成目標
![loading.gif](https://qiita-image-store.s3.amazonaws.com/0/172185/4e8c059c-ffb8-c9aa-b80a-cd1ec3978a71.gif)
※適当に録画→GIF出力してしまったので、GIFが雑です

# 用意するもの
## クルクル回す画像
![loading.png](https://qiita-image-store.s3.amazonaws.com/0/172185/500368bd-2988-8baf-9848-c1f57b924f9b.png)
これは[Preloader](https://preloaders.net/en/free)というサイトで生成しました。便利。
> **APNG**というアニメーション付きPNGで書き出されます。
> これは最近登場した「GIFに代わるアニメーション画像」なのですがまだまだ対応環境は少なそうです...。

![25.png](https://qiita-image-store.s3.amazonaws.com/0/172185/4dad0447-0f71-3f35-3d68-37e6f49ad887.png)

これの1番目のフレームをドラッグ&ドロップすると、画像が１枚抽出できます。

# 手順

## [1]画像を配置
<img width="200" src="https://qiita-image-store.s3.amazonaws.com/0/172185/7a5fd2ec-9e2b-7bfa-8716-2d8fa3d34ed5.png">
普通に配置します。そしてViewControllerに紐付けます。

~~~ViewController.swift
import UIKit

class ViewController: UIViewController {

  @IBOutlet weak var loadingImage: UIImageView!
  
  override func viewDidLoad() {
    super.viewDidLoad()
  }

}
~~~

## [2]アニメーション！
**CABasicAnimation**を使います。

~~~ViewController.swift
import UIKit

class LoadingViewController: UIViewController {

  @IBOutlet weak var loadingImage: UIImageView!
  
  override func viewDidLoad() {
    super.viewDidLoad()

    // z軸を中心に回転（つまり普通に2D回転）
    let ca = CABasicAnimation(keyPath: "transform.rotation.z")
    // 動きの具合（2PI[rad] = 360度）
    ca.toValue = Double.pi * 2
    // １回転にかける時間（秒）
    ca.duration = 1.5
    // アニメーション関数（後述）
    ca.timingFunction = CAMediaTimingFunction(controlPoints: 0.645, 0.045, 0.355, 1)
    // 繰り返し回数（無限に繰り返す時は HUGE）
    ca.repeatCount = HUGE
    // UIImageにアニメーションを紐付け
    loadingImage.layer.add(ca, forKey: "loading")
    
  }

}
~~~
## [出典]アニメーション関数について
こちらの記事を参考に設定しました。
[CoreAnimationでカスタムのEasing Functionを使う](http://qiita.com/sagaraya/items/1f290190cffd4ad4f836)

# まとめ
回転や移動などの簡単なアニメーションだけでなく、これらを組み合わせたものも紐付け可能です。
以上、素敵なアニメーションでした。
iOSのIDFAの確認方法

## 背景
某インターネット広告企業でデータマイニングエンジニアもとい便利屋をやっております。そしてなんでも屋のようなことをやっていると、時折実配信テストみたいなこともやらされることがあります。その時にiOSアプリの場合だと結構めんどくさい。というのも、広告向けの端末識別子（IDFA）が普通に使っているとわからないからです。そのために、IDFA確認方法を調べてみました

## サンプルコード
https://github.com/kousukekikuchi1984/IFA_Confirmation

## 方法
やることは結構簡単で、広告のトラッキングを許可しているかどうかをみてから、IDFAを取得するだけです。コード的には以下のようになります。

```
import AdSupport

func getIDFA() -> String {
    var idfaString: String!
    let manager = ASIdentifierManager.shared()
    if manager.isAdvertisingTrackingEnabled { // 広告トラッキングを許可しているのか？
        idfaString = manager.advertisingIdentifier.uuidString
    } else {
        idfaString = "Advertising tracking is prohibited"
        // この場合で無理やりIDFAを取得しようとすると、
        // 00000000-0000-0000-000000000000 が返ります
    }
    return idfaString
}
```
コードに書きましたが、禁止しているのにIDFAを取得しようとするとデタラメな文字列が入ることになりますので、ちゃんと広告トラッキングを許可しているのかをみてから取得しないといけないようです。

## まとめ
Native Appの広告配信テストをするのはめんどくさいですが、自分でサンプルアプリを作りIDFAを調べることができるので、とりあえず広告業界にいる人には役立つかもしれない。
もっといけてる検索がしたい！

プログラミング初めて2ヶ月のペーペーです。
ちょっと複雑なことをやろうとすると樹海にハマる今日この頃。
完全に自分のやりたいことと一致するサイトなんてなかなか出てこないけど、
どうすればいいかのヒントになるようなものを見つけて生きたい。
もっといけてる検索をすることで解決をしたい！
そんな欲求から記事を書いています。
検索力をもっと上げたいので、アドバイスいただけると嬉しいです！

サンプルとしてお題は
「railsでインクリメンタルサーチをしたい！」に設定します。
・ajax通信のurlでエラーが起こるのだけど、どう書けばいいの？
・controllerはrespond_toとか色々あるけどどう書けばいいの？

ajax通信をすればいいというということぐらいしかわからない状態からスタート。
グーグル、Qiita、Stack Overflowで検索をしました。

##LEVEL. 1

```
「rails インクリメンタルサーチ」
「rails incremental」
```

インクリメンタルサーチは手順が多い割に記事が少ないようでした。
出て来た記事はなんとなく自分の求めていたものと
違う気がして、全然手が動きません。

##LEVEL. 2　

信頼できる方からのアドバイスを元に検索の仕方を調整。

```
「rails ajax url」
「rails search respond_to」
```

手順が多いので、わからないところを少しづつ潰していくやり方に変更。
あとはエラー文を確認しながら少しづつ進んでいきました。
でもまだ物足りない感じ。


##LEVEL. 3

```
「rails search respond_to」
「rails respond_to」
```
進みたいからと具体例を求めすぎているのが、
逆に遅くなる原因となっている。
一行一行何をやっているのかをしっかり理解していく。
そのためには、検索ワードを少なくして、
信頼できる情報をどんどん集めてわからない要素をどんどん集めていく。
検索力というより、焦点を変えて理解を深めるように勧められました。

##LEVEL. 4

大枠の概念を理解するために、キーワードを検索する。
↓
その中でキーになりそうな言葉にあたりをつける。
↓
そのワードについて調べる
↓
自分の状況にマッチしているかアタリをつける
↓
細かい記述を確認して、書いてみる
↓
デバックの結果と照らし合わせる。
↓
本当にそのやり方でいいか判断をする。
↓
どんどん進める。

このやり方で、ある程度進められるようになってきた。
検索力というより、デバックのやり方を工夫して、
エラーの原因を確認できると進められる。

##LEVEL.5

mechanizeのsearchを使った、metaタグのdescription取得でハマってレベルアップした。
「search meta　〜」で探し続けていたけれど、「mechanize meta」で欲しい記述の仕方が一発ででた。
検索がうまくいかないときは、欲しい記述から一歩引いてやり方を変えるのもあり。
searchが色々ヒットするsearchよりも、mechanizeの方がピンポイントでいい。

##LEVEL.6

もっと向上させたい。

今はこの記事を参考にしています。
https://donow.jp/gachinko/?p=798
Eclipseでプロジェクトをインポートしたら Could not save master table to file となってしまった時の対応方法

- 環境
    - OS : macOS Sierra Version 10.12.4
    - Eclipse : Neon.3 Release (4.6.3)
    - Java : 1.8.0_45

Eclipseでプロジェクトをインポートしてクリーンしたら怒られました。

```text
Could not save master table to file '{ワークスペースの場所}/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources'.
{ワークスペースの場所}/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources (No such file or directory)
```

なんか保存できないらしいです。
怒られたディレクトリを見てみると確かに無いです。

```text
$ open {ワークスペースの場所}/.metadata/.plugins/org.eclipse.core.resources/.safetable
The file {ワークスペースの場所}/.metadata/.plugins/org.eclipse.core.resources/.safetable does not exist.
```
「ディレクトリがないからファイルを保存できません」と怒られているっぽいです。
ググってみると・・・英語でよくわからないのですが・・・。

> My .safetable file was missing, so I just created it and problem solved.
> [&quot;eclipse Could not save master table to file&quot; - Ask Ub](https://askubuntu.com/questions/21375/eclipse-could-not-save-master-table-to-file)

自分で作る？

> I created the folder "External Files" and it worked fine. In a few minutes the files ".markers.snap" and ".syncinfo.snap" appeared in this folder and the message didn´t appear any more.
> [Eclipse: &quot;&#39;Periodic workspace save.&#39; has encountered a pro‍blem.&quot; - Stack Overflow](http://stackoverflow.com/questions/11729085/eclipse-periodic-workspace-save-has-encountered-a-problem)

なけりゃ自分で作る？

### 保存先のディレクトリを作ります。

```text
$ mkdir {ワークスペースの場所}/.metadata/.plugins/org.eclipse.core.resources/.safetable
```

### プロジェクトをクリーンします。
:hibiscus:エラーが出なくなりました。:hibiscus:

### ファイルが保存されました。
作ったディレクトリに「保存できない」と怒られたファイルが保存されていました。
![Screen Shot 2017-05-18 at 21.54.26.png](https://qiita-image-store.s3.amazonaws.com/0/159761/83a98e8a-31ac-de2e-94cb-1c7240f14729.png)

ディレクトリ無ければEclipseが作ってくれてよかったのに・・・
目的思考は技術のつまみ喰いの正当化に役に立つ

# ITは幅広い
ITは幅が広く、プログラムやセキュリティ、OS、サーバー、ネットワークetcものすごくたくさんのジャンルがある。
IT技術者として知っていて当然の知識だと思われることでもこのようにジャンルが多くありすぎると知らないこともたくさん出てくると思う。

# 技術のつまみ喰いの正当化とは
そこで、Aというプロダクトを作るという目的があると、その目的に対して必要な技術や知識に絞って学習する理由ができる。
そうすると、あなたはこんな基礎的なことも知らないんだという批判や大学でコンピューター科学を学んだ人たちに対して専門的に劣るという事実に対して自分を正当化できる気がする。

もちろん上記のような自分に対する否定的な観点を防御するだけでなく、今自分は何を勉強すればいいのか？何に集中すればいいのか？という肯定的な観点も生まれる。

# ということでこのように目的思考を使うと攻守に優れる（気がする）
目的思考は便利ですね。もしこのように目的思考を使おうとすると、目的を何にするか？をとても慎重に考えなければいけないだろう。
目的とするプロダクトによって自分の技術・知識や仕事へのスタンスが決まってくるのだから。
Webの未来は今。Polymer 2.0とWeb Components。Google I/O 2017


Googleが「Google I/O 2017」でW3C標準のWeb ComponentsベースのフレームワークPolymerの2.0のリリースを発表しました。
[Polymer Keynote on Day 1](https://goo.gl/gJVFi2)の内容を速報します。

![0.png](https://qiita-image-store.s3.amazonaws.com/0/50720/b6dda4d1-7ab0-85c6-28c9-a8c21df5edc0.png "0.png")


# プロダクトマネージャーTaylor Savage

![1.png](https://qiita-image-store.s3.amazonaws.com/0/50720/312be2a6-a69a-3287-b88b-153328c140c0.png "1.png")


今年、SafariがWebコンポーネントをサポートしました。
これによって、10億以上のモバイルデバイスがWebコンポーネントをサポートすることになります。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/50720/6f1d3b59-8ece-90c0-26b8-870ed0ada6e3.png "2.png")

PolymerはWebプラットフォームを未来に進めるために、Chromeチームと協働で進めてきました。
そして、PolymerはOSSのWebエコシステムと共に進んできました。
ReactやVueはWebに革新をもたらしました。
フレームワークは素晴らしいですが、プラットフォームだけで開発できないでしょうか。
Polymerは「プラットフォームを使おう」というスローガンで進めています。
Webプラットフォームを偉大にしている2つの要素は、標準であることとオープンであることです。

もともと、Webプラットフォームはドキュメントのためにデザインされました。
そして、その脆弱なプラットフォームに対し、フレームワークがアプリケーションを開発できるようにしてきました。
Polymerはプラットフォーム自体をリッチでパワフルにしようとしています。
Webのテラフォームです。

「プラットフォームを使おう」ということは「プラットフォームだけを使おう」ということではありません。
もちろん、フレームワークやツール、Polymerなどを使います。

Polymerプロジェクトの成功は皆がPolymerを使うということではありません。
Polymerプロジェクトの究極の成功は、Webプラットフォームがパワフルで拡張性を持ち、Polymerが必要なくなることです。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/50720/2e7efd23-3c14-eda0-3e04-f12790c021ed.png "5.png")

Polymerのユーザーはすでに多くいて、Polymerを用いてプログレッシブ・ウェブアプリケーションを作成しています。

# PolymerのテクニカルリーダーKevin Schaf

一部の対応していない機能はpolyfillが必要ですが、Polymer 2.0はクロスブラウザー対応です。
ブラウザーのネイティブサポートが進んだことで、Polymer 2.0のサイズは1.0に比べて1/4程度になっています。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/50720/d1ac5c56-2843-8704-0f81-3a5f5f269f69.png "7.png")

Polymer 2.0は相互運用性を持ち、AngularでもReactで使うことができます。

Polymer 2.0はスムーズにマイグレーションできます。
1.新しいES6の記述、2.最低限のテンプレート変更によるレガシーAPI、3.それらのハイブリッド　の3つの方法で記述できます。

# プロダクトマネージャーWendy Ginsberg

Polymerはライブラリだけでなく、ライブラリ、Element、ツール、PRPL、アプリケーション・ツールボックスの５つをサポートしています。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/50720/9c0249ae-321b-dde3-1bfa-3da64a12767d.png "8.png")

Polymerは多くのElementを提供していますが、Webcomponents.orgですばらしいOSSのWebコンポーネントが1000以上あります。

![9.png](https://qiita-image-store.s3.amazonaws.com/0/50720/3e39587a-0aac-0f4e-a89d-e7fbc802201f.png "9.png")

ツールにはIDEプラグインとPolymer CLIがあり、明日詳しいセッションがありますが、IDEプラグインはすばらしく、AtomとVS Codeのプラグインがあります。

PRPLはPush、Render、Pre-Cache、Lazy loadを表すプログレッシブ・ウェブアプリケーションのためのデザインパターンです。

ツールボックスはプログレッシブウェブアプリケーションをつくるめのコンポーネント、ツール、テンプレートのコレクションです。

Polymerを使った、こんなアプリもあります。
プログレッシブウェブアプリケーションなので、オフラインでも使うことができます。

![10.png](https://qiita-image-store.s3.amazonaws.com/0/50720/4c60222d-f390-611c-10dc-6a09eae84c3c.png "10.png")

コペンハーゲンでPolymer Summitを開催します。

![11.png](https://qiita-image-store.s3.amazonaws.com/0/50720/38ea5989-f98a-1813-6f65-f1e0d41a3a79.png "11.png")
[Heroku] Procfile で deploy時の実行コマンドを指定 [Release]


知らぬ間に[Release Phase](https://devcenter.heroku.com/articles/release-phase)(現時点ではβ)機能が追加されてた...(2ヶ月前)

`Procfile` 内に "relaese:" で始まる行を書いて、その後にコマンドを書いておくと、deploy するたびに実行してくれます。db の migrateとかのし忘れがないようにできて便利ですね。

`ruby` だったら、こんな感じにしておけばいい感じ

```ruby:Procfile
release: rake db:migrate
```
ruby でこう書くのは、kotlin ならこう書く、のメモ

kotlinは、kotolin と書き間違えるぐらいの初心者。
Java もよく知らない。

手元の処理系

* ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
* Kotlin version 1.1.2-2

で確認している

#長さとか

##長さ

```ruby:ruby
ary_len = [1,2,3].size # [1,2,3].length でもいい
hash_len = {a:1}.size # {a:1}.length でもいい
string_len = "hoge".size # "hoge".length でもいい
range_len = (1..9).size # Range#length はない。
```

```kotlin:kotlin
var ary_len = listOf(1,2,3).size
var dic_len = mapOf( 1 to 2, 3 to 4 ).size
var string_len = "hoge".length
```

Kotlin の Range の長さのとり方がわからない。


##範囲

Kotlin の Range は面白いんだけど、ここでは控えめに。

```ruby:ruby
(1..10) # 1から10。両端含む。
(1...10) # 1以上10未満。
(1..10)===5 # true
```

```kotlin:kotlin
(1..10) // 1から10。両端含む。
(1 until 10) // 1以上10未満。
5 in (1..10) // true
```

# Object の周辺

## 型

```ruby:ruby
[].class #=> Array
1.class #=> Integer
[1,1.0,1r,1i].map{ |x| x.is_a?( Numeric ) } #=> [true, true, true, true]
```

```kotlin:kotlin
println(listOf(1).javaClass)//class java.util.Collections$SingletonList
println(1.javaClass)//int
println( listOf(1,2.0,"3").map { it is String}) //=> [false,false,true]
```
## 比較

```ruby:ruby
[]==[] #=> true 普通の比較
[].equal?([]) #=> false 同じオブジェクトを指しているかどうか
```

```kotlin:kotlin
println( listOf(1)==listOf(1)) //=> true 同値かどうか
println( listOf(1)===listOf(1)) //=> false 同一オブジェクトかどうか
```

## 文字列化

```ruby:ruby
"hoge".to_s #=> 「hoge」
"hoge".inspect #=> 「"hoge"」
```

```python3:python3
var s:String = listOf(1,2,3).toString() //=> [1, 2, 3]
```

kotlin に inspect はあるのだろうか。

# 文字列処理

## join / joinToString

```ruby:ruby
[1,2,3].join(",") #=> "1,2,3"
```

```kotlin:kotlin
listOf(1,2,3).joinToString(",") //=> "1,2,3"
```

# split

```ruby:ruby
"1a23b34c56".split(/[a-z]/) #=>  ["1", "23", "34", "56"]
```

```kotlin:kotlin
"1a23b34c45".split( Regex	("[a-z]") ) //=> ["1", "23", "34", "45"]
```

わりと面倒くさい。正規表現リテラルはないので、バックスラッシュを重ねる必要があったり。
see http://qiita.com/nonylene/items/295b481330cd0471dd76


# 配列とか列挙の周辺

## 連想配列

```ruby:ruby
m={1=>2,3=>4}
p m[1] #=> 2
m[5]=6
p m #=> => {1=>2, 3=>4, 5=>6}
```

```kotlin:kotlin
var m = mutableMapOf(1 to 2, 3 to 4)
println( m[1]) //=> 2
m[5]=6
println(m) // => {1=2, 3=4, 5=6}
```
kotlin は、`mapOf` で作った連想配列は書き換えられない（不正確な表現）。
書き換えたければ `mutableMapOf` で作る。

## each / forEach

```ruby:ruby
[1,2,3].each{ |a| print a } #=> 123
```

```kotlin:kotlin
listOf(1,2,3).forEach{ print(it) } //=> 123
```

## map / map

```ruby:ruby
[1,2,3].map{ |a| a*2 } #=> [2, 4, 6]
```

```kotlin:kotlin
print(listOf(1,2,3).map{ it*2 }) //=> [2, 4, 6]
```

## inject / reduce	

```ruby:ruby
[1,2,3,4].inject(0){|a,b| a+b } #=> 10
```

```kotlin:kotlin
print(listOf(1, 2, 3, 4).reduce{ acc, i -> acc + i }) //=> 10
```

kotlin の reduce には初期値が入れられない模様。

# 最後に

今日のところはこれぐらいで。

まだ加筆予定だけど、仕事で使っているわけではないのであんまり増えないかも。

もっと良い書き方があるよ！　という意見募集。
【Unity】タップした位置にキャラを移動させたい(RectTransform編)

社内のUnity使いが3人に増えました。
Unity使いと言っても僕はまだまだ見習いみたいなものですが。。。
そんなこんなで(どんな)1人1つ~~クソゲーでもいいから~~ゲームを作ってリリースしようという話になり、ただいま制作に力を入れております。

#タップ(クリック)した位置にキャラクターを移動させたい
制作中のゲームでタップした位置にキャラクターを移動させたくなりました。
ネットで色々調べていたのですが「これだけ書けば動くよ！」なんていう簡潔なものやら何やら多すぎて。。。
iTweenを使ったやり方が一番コードを短く書けそうだったのでiTweenを入れて、載っていたコードをそのまま拝借(俗に言う丸パクリ)いたしました。結果。うまくいかず。。。

ここで散々悩みました、詰みました。
あーだこーだやってみてもうまくいかず、泣きそうになりながら怪しいところをgoogle先生に聞きました。
その怪しいところとは・・・「Transform」と「Rect Transform」
そのまま拝借したコードはTransformが設定されていた場合のコードでした。
動かしたいキャラはRectTransform設定でしたので、それはうまくいかないわけです。
要はCanvasの座標が取得したかった！(google先生に聞く時は自分が何を知りたいのか具体的に聞かなくては・・・。)

CanvasのRectTransformを動かしたい場合はスクリーン座標だけでいいみたいです。
スクリーン座標とは？
**Input.mousePosition**
マウスクリック時に取得できる座標がスクリーン座標らしいです。

コードで書くと

```position.cs
    [SerializeField]
    GameObject player;

    // Use this for initialization
    void Start()
    {
		
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 position = Input.mousePosition;
            iTween.MoveTo(player.gameObject, iTween.Hash("x", playerTapPoint.x, "y", playerTapPoint.y, "time", 10.0f));
        }
    }
}
```
最終的にこんなコードになりました。
Canvasの座標をとってそこに10秒かけてキャラが移動するスクリプトです。

##まとめ
Canvasの座標とる話でどんだけダラダラ書いてるんだっていうツッコミが聞こえる。。。

↓今回参考にさせていただいたサイトです。
からあげさんのデジタルフロッグ
http://karaagedigital.hatenablog.jp/entry/2016/09/04/132300
はじめこちらだけで書いていて詰みました。。。

↓そしてもう1つ
こちらもからあげさんのデジタルフロッグ
http://karaagedigital.hatenablog.jp/entry/2016/09/22/201900
こちらはCanvas座標の他にワールド座標、ビューポート座標の変換なども載っており、大変わかりやすくまとまっています。

お・わ・り
gorp(go-mysql-driver)で独自に定義した型をカラムに割り当てる

# 前提
gorp と go-mysql-driver を使っている。DBとマッピングする構造体に、カスタム定義の型を使いたい。

gorp https://github.com/go-gorp/gorp
go-mysql-driver https://github.com/go-sql-driver/mysql



```go
//define my custom type
type ItemId string

// define my table
type Item struct {
	ItemId ItemId `db:"item_id"`
}
```

# 問題

gorpでクエリを打ってみると、このようなエラーが出て失敗。

```
error: sql: converting argument $1 type: unsupported type hoge.ItemId, a string
```

# 解決

`database/sql/driver`.Valuer インターフェースと、
`database/sql/sql`.Scanner インターフェースを実装すれば良いらしい。

実装

```go
func (a ItemId) Value() (driver.Value, error) {
	return driver.Value(string(a)), nil
}

func (a *ItemId) Scan(value interface{}) error {
	*a = ItemId(string(value.([]uint8)))
	return nil
}
```

この、Value()とScan()の中身は、実際の型にあわせて、よしなに実装する。
今回は error は nil で返してしまっているが、型に適合しているかのチェックにも使えるようだ。
また、Value()とScan()はシリアライザ・デシリアライザのように使えるので、複雑な独自の構造体をDBの単一カラムに割り当てるような使い方も可能なようだ。

タイトルに gorp と入れてしまったが、特にgorpに限定した話ではない。
Maatwebsite/Laravel-Excel でデータをCSV形式でダウンロードしたときエラー UTF-8出しました

収集したデータはDBに格納ですけど、収集したデータをCSV形式でダウンロードしたい。

ダウンロードしたあと、ファイルを開く。フォントはエラー UTF-8です。

提案：
Excel.phpの中はちょっと変更します。

具体：
```'use_bom'=>false```  から ```'use_bom'=>true```になります。

写真：

![OdN2L.png](https://qiita-image-store.s3.amazonaws.com/0/173855/6919844f-e3f1-f5ee-ef4d-715ad8fa064a.png)




以上です。
レイヤーマーカーコメントでエクスプレッションを動作させる　（on/off）

#やりたい事
レイヤーマーカーのコメントをスイッチにする

#出来る事
チェックボックスでエッフェクトをON OFF するようにレイヤーマーカーのコメントでエクスプレッションを動作させる。

#汎用
今回はshakeInとshakeOutの２つしかきっかけを作ってないですが、変数を増やせばその分スイッチの追加は出来ます。
今回のものはとりあえず２つだったのでif文が　shakeIn or elseなので増やす場合はそこも追加してください。


```js

var shakeIn=thisLayer.marker.key("shake In");
var shakeOut=thisLayer.marker.key("shake Out");
var near = thisLayer.marker.nearestKey(time);

var keyN = 0; 
if (marker.numKeys){
　keyN = marker.nearestKey(time).index;
　if (marker.key(keyN).time > time) keyN--;
}

var now=marker.key(keyN).comment;

if(now == shakeIn.comment){
"エクスプレッション1"
}else{
"エクスプレッション2"
}
```

![bandicam 2017-05-18 20-33-30-504.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/9dacfaff-59b9-9b82-e50c-c05e689d8c40.jpeg)
![bandicam 2017-05-18 20-33-33-642.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/fb066ea8-1826-9ae0-3e57-c2dd8ff8826b.jpeg)
データ分析環境からmysqlを叩いて高速な分析環境を用意する


[jupyter](http://jupyter.org/)の様なデータ分析ツールからrdsに接続してデータフレームを手にいれる方法について書かせていただきます。

## モチベーション

データベースからデータを引っ張って来てデータ分析をしたいなと思い立った時に

1. SQL打って欲しい結果セットを作成
2. 結果セットをCSVを落とす
3. CSVを分析環境に置く
4. CSVを読み込んでデータフレーム作成
5. データフレームが手元に入ってready to go

という工程に沿うことが多いと思います。

しかし

- 様々なデータフレームを試したいとなった場合
- 状況によって欲しいデータフレームが変わってくる場合
- 常に新鮮なデータが欲しい場合

と言った状況下では、先の工程を何度も繰り返すことになります。
結果として作業者はデータベースと分析環境の間を反復横跳びすることになったり、あるいはデータを用意するエンジニアと分析するデータサイエンティストの間でそれなりのコミュニケーションコストが発生することがあります。

そこで、分析環境をデータベースにそのまま繋いでしまえばそのコストを削減できるのではと思いました。


## どうしたか

自分はデータ分析にPythonを使うことが多いですが、今回はPythonのMySQLクライアントである [mysqlclient](https://github.com/PyMySQL/mysqlclient-python) を使いデータベースとの接続を試みました（mysqlclientはPythonのwebフレームワークDjangoの推奨ドライバです）

### 踏み台サーバーなしの場合

```
import MySQLdb

connect = MySQLdb.connect(
    host='rdsのエンドポイント',
    user='ユーザー名',
    db='データベース名',
    passwd='パスワード'
)

cursor = connect.cursor()
sql = "selectといったsql文を文字列でかく"
cursor.execute(sql)
for row in cursor.fetchall():
    print(row)
cursor.close()
connect.close()
```

結果はタプルで返ってきます。
テーブルが大きいとプロセスが終わらないので、sqlの指定には必ずlimitをつけてください。

### 踏み台サーバーありの場合
踏み台サーバーがある場合はmysqlclientと一緒に、[sshtunnel](https://github.com/pahaz/sshtunnel)ライブラリを使ってsshトンネルを掘ります。

```
import MySQLdb
from sshtunnel import SSHTunnelForwarder

with SSHTunnelForwarder(
    ('踏み台サーバーのipアドレス', 踏み台サーバーのポート番号),
    ssh_host_key=None,
    ssh_username='踏み台サーバーにアクセスするユーザー名',
    ssh_password=None,
    ssh_pkey='ssh秘密鍵のパスを指定する',
    remote_bind_address=('rdsのエンドポイント', rdsのポート番号),
    local_bind_address=('ローカルホスト', 任意のポート番号)
) as tunnel:
    connect = MySQLdb.connect(
        host='ローカルホスト',
        port=上のlocal_bind_addressで決めた任意のポート番号,
        user='ユーザー名',
        db='データベース名',
        passwd='パスワード'
    )
    cursor = connect.cursor()
    sql = "selectといったsql文を文字列でかく"
    cursor.execute(sql)
    for row in cursor.fetchall():
        print(row)
    cursor.close()
    connect.close()
```

こちらも結果はタプルで返ってきます。

## まとめ

- 様々なデータフレームを試したい
- 状況によって欲しいデータフレームが変わってくる
- 常に新鮮なデータが欲しい

これらの要望を満たすことができ、無事に分析者が欲しいデータをすぐに手に入れられる環境を提供することができました。

またpython側で変数を指定できるので、sqlを指定する文字列に式展開ができるなど柔軟な対応ができる副次的なメリットもありました。
C言語で小文字を大文字にして出力する

# はじめに

C言語でswitch文を使って大文字小文字変換をするエンジニアがいたみたいな記事が上がってたので試しにswitch文を使わない方法を書いてみた

# コード

```c:main.c
#include <stdio.h>
 
int main(void) {
  const char DIFF = 'a' - 'A'; /* 32 */
  const char ch = 't';
  printf("%c", ch - DIFF);
  return 0;
}
```
`DIFF` を定義したのは `32` が何を意味しているのかを明示するためなのでぶっちゃけ

```c:main.c
#include <stdio.h>
 
int main(void) {
  printf("%c", 't' - 32);
  return 0;
}
```

でいい

# 見つけ方

```c:test.c
#include <stdio.h>

int main(void) {
  printf("%d\n", 'a' - 'A'); /* 32 */
  printf("%d\n", 't' - 'T'); /* 32 */
  return 0;
}
```

なんでもいいので大文字と小文字の引き算をすると`32`という数字が出てくる
これをヒントにすれば解けるはず
ASCIIコードを知らなくても物は試しで
四則演算や剰余演算、シフト演算、ビット演算をやってみることが ~~手抜き~~ 効率的な問題解決 への近道になる

# おわりに

C言語で `const` って使えたっけ？ ってくらい久しぶりにC言語書いた
Raspberry Pi 3でopenFrameworksのShaderのサンプルプログラムを動かす


# 1. 概要

以前、Raspberry Pi 3でoFのサンプルプログラムを動かしましたが、Shaderのサンプルを動かそうとすると白い画面のままだったのでなんとかしたメモです。

# 2. 用意するもの

* Raspberry Pi 3
* RASPBIAN JESSIE WITH PIXEL Version:April 2017
* openFrameworks 0.9.8

# 3. 参考サイト

1. [【Raspberry Pi + OF】shaderを使う時の注意点 | メイクノッド](http://mknod.jp/?p=184)
* [Shader demos need modification for Raspberry Pi · Issue #5056 · openframeworks/openFrameworks](https://github.com/openframeworks/openFrameworks/issues/5056)

# 4. 手順

/of_v0.9.8_osx_release/examples/shader/01_simpleColorQuadを実行してみました。
[参考サイト1](http://mknod.jp/?p=184)の方法では上手く行かず、[参考サイト2](https://github.com/openframeworks/openFrameworks/issues/5056)に書いてある方法でうまくいきました。

![IMG_4591.JPG](https://qiita-image-store.s3.amazonaws.com/0/94069/7a7e93a2-a6e0-7a6b-771b-8fe549c093af.jpeg)


``` cpp:main.cpp
#include "ofMain.h"
#include "ofApp.h"

//========================================================================
int main( ){

	// ofGLWindowSettings settings;
	// settings.setGLVersion(3,2);
	ofGLESWindowSettings settings;    <--追加
	settings.glesVersion = 2;    <--追加
	ofCreateWindow(settings);
    
	// this kicks off the running of my app
	// can be OF_WINDOW or OF_FULLSCREEN
	// pass in width and height too:
	ofRunApp(new ofApp());

}
```
信頼できない実行ファイルに対してlddを使ってはいけない理由

lddのmanより
> Security
       Be aware that in some circumstances (e.g., where the program specifies an ELF interpreter other  than  ld-linux.so), some  versions of ldd may attempt to obtain the dependency information by attempting to directly execute the program(which may lead to the execution of whatever code is defined in the program's ELF interpreter, and perhaps to execution of the program itself).
       Thus, you should never employ ldd on an untrusted executable, since this may result in the execution of arbitrary code.

要するに｢依存するライブラリの情報を得るためにlddがそのバイナリ(のdynamic linker?)を実行してしまうケースが有るから｣

(まあそもそもlddを使う時点で普通はその対象のファイルを実行するつもりなわけで問題になることはあまりないとは思うけど)

# 実際にやってみる

- ソースコード

```test.cc
#include <iostream>

int main() {
    std::cout << "!!!!!!" << std::endl ;
}
```
- ビルド

1.lddした時に実行されるdynamic linker用にstatic linkでビルド
`$ g++ test.cc -o loader -static`
2.dynamic linkerに1を使うようにしてビルド
`$ g++ -Wl,--dynamic-linker=./loader test.cc`

- 実行

```
$ ldd ./a.out
!!!!!!
```

確かにlddしただけで実行されてしまった。

# 対策
これまたlddのmanより
> Thus, you should never employ ldd on an untrusted executable, since this may result in the execution of arbitrary code.  A safer alternative when dealing with  untrusted  executables is:
`$ objdump -p /path/to/program | grep NEEDED`

信頼できないバイナリに対してはlddではなくobjdumpやreadelfを使いましょう。
[OSX Sierra] mysql2 をインストールする


ActiveRecordでMySQL上のデータ移行処理を書こうと思ったら環境でハマったしまったので解決した時の流れを。

`rbenv` で `ruby 2.3.0p0` を使用しています

## Gemfile を作成
> bundle init

```Gemfile
gem 'activerecord'
gem 'mysql2', '0.4.6'
```
## mysql.h がないと言われる
かなりトラブルシューティングが見つかったのですが、いずれも試してダメだった。

* homebrew で mysql 再インストール
* bundle config で `mysql_config` を指定してもエラー

こちらの解決策3で成功。
[macOS Sierra で mysql2 の bundle install に失敗する場合 \- ハトネコエ Web がくしゅうちょう](http://nekonenene.hatenablog.com/entry/2016/10/31/061350)

> xcode-select --install

あとは通常通りでOK。

> bundle install
仮想マシンフォルダ名や構成ファイル名の修正

# 概要

仮想マシン名変更後などに、データストア上のフォルダ名や構成ファイル名を仮想マシン名に合わせて修正させたいときは、データストアの移行（コールド移行またはStorage vMotion）を行う。

# 詳細

仮想マシンを新規作成した際には、仮想マシン名に合わせてデータストア上でフォルダや構成ファイル、仮想ディスクファイルの名称が設定される。ただし仮想マシン名を変更した際には、これらはそのままのファイル/フォルダ名のままになる。

通常時のGUIからの利用には特に不都合はないが、仮想マシン名からファイル名が推測できないと、ESXiのシェル（ローカルシェルやssh）での作業時や、外部製品との連携時、APIやCLIからの操作時などでは不便かもしれない。

## データストア変更による修正

仮想マシンのデータストアを変更すると、仮想マシン名に合わせて構成ファイル名やフォルダ名が修正される。データストアの変更は、コールド移行（仮想マシン停止中の移行）でも、Storage vMotion（仮想マシン稼働中の移行）でもよい。

詳細は「[VMware ESXi/ESX で仮想マシンとそのファイルの名前を変更する (2079872) | VMware KB](https://kb.vmware.com/kb/2079872)」の以下の項を参照。

* Storage vMotion を使用した仮想マシンのファイル名の変更
* コールド ストレージ移行を使用した仮想マシンのファイル名の変更

なお「データストアの移行」を実行しても、データストアが変更されない（同じデータストアを指定した）場合は、フォルダ名やファイル名はそのままになった。

## 手作業での修正

データストアが一つしかないなど、データストア変更による修正を利用できないときは、手作業での修正もできる。ただし単純なファイル名およびフォルダ名の変更だけではなく、仮想マシン構成ファイル内に保持されている仮想ディスクファイル名の変更など、適切な方法で行わないと仮想マシンが起動しなくなる。

手作業での修正方法は「[VMware ESXi/ESX で仮想マシンとそのファイルの名前を変更する (2079872) | VMware KB](https://kb.vmware.com/kb/2079872)」の以下の項を参照。

* コンソールを使用した同じ場所での仮想マシンのファイル名の変更

# 参考

* [VMware ESXi/ESX で仮想マシンとそのファイルの名前を変更する (2079872) | VMware KB](https://kb.vmware.com/kb/2079872)
* [Renaming a virtual machine and its files in VMware ESXi and ESX (1029513) | VMware KB](https://kb.vmware.com/kb/1029513)

----

本ページ内容は作成者の個人的なメモです。内容を保証するものではありません。また作成者の所属組織等とは一切かかわりがありません。
H2 データベースのJDBC接続文字列にてDDLを指定する

# はじめに

H2 データベースで，メモリー内にデータベースを構築するようなとき，ファイルに書いてある DDL を流したいことがあると思います。
例えば， JUnit がデータベースにアクセスするテストケースでの使用が考えられますね。

# 書き方

スキーマを指定する場合と，しない場合を書き記します。

スキーマを指定したいケースは， MyBatis Generator 等のツールでスキーマを限定するようなケースを考えてのものです。

## スキーマを指定しない場合

> jdbc:h2:mem:test;INIT=RUNSCRIPT FROM *SCRIPTPATH*

- *SCRIPTPATH* が DDL が書かれたファイルのパスです。

```
jdbc:h2:mem:test;INIT=RUNSCRIPT FROM '../../db/schema.sql'
```

## スキーマを指定する場合

> jdbc:h2:mem:test;INIT=CREATE SCHEMA IF NOT EXISTS *SCHEMANAME*\\\\;SET SCHEMA *SCHEMANAME*\\\\;RUNSCRIPT FROM *SCRIPTPATH*

- *SCHEMANAME* が，スキーマの名称です。
- *SCRIPTPATH* が DDL が書かれたファイルのパスです。

```
jdbc:h2:mem:test;/data;INIT=CREATE SCHEMA IF NOT EXISTS FOO\\;SET SCHEMA FOO\\;RUNSCRIPT FROM '../../db/schema.sql'
```
リモートリポジトリで削除されたブランチをローカルに反映する

リモートリポジトリで削除されたブランチがあったとしても(他の誰かが消したとかgithubとかのサービスから消したとか)、ふつうに`git fetch`や`git pull`しただけではローカルリポジトリに反映されません。


# --prune

そんなときは`prune`オプションを使用します。

```
git fetch --prune

もしくは

git pull --prune
```

こうすると、リモートリポジトリの削除が、ローカルリポジトリにも反映されます。

pruneは「刈り込む」とか「切り落とす」という意味のようです。
なるほど。
slider memo v2

基本的な記述だと思い、メモしました。

```js
    let parts = {
      width: 要素幅,
      left: 0,
      index : 0,
      next : $("クリックターゲット"),
      prev : $("クリックターゲット"),
      $prent_b : $("slideしたい要素"),
        play_clone : function(){
          $child = this.prent.children("子要素");
          len = $child.length-1;
          $child.eq(parts.index).clone().appendTo(this.prent);
        },
        slide_anime : function(){
          parts.prent.stop().animate({
            left : (parts.width * parts.index) * -1 + "px"
          },600);
        },
    }
//1
    let target_1 = function(){
          parts.next.click(function(){
            parts.index++;
            parts.play_clone();
            parts.slide_anime();
        });
          parts.prev.click(function(){
            parts.index--;
            parts.play_clone();
            parts.slide_anime();
        });
      };
      target_1();
```

sliderは、基本がいっぱいつまっています。
僕自身も、よくsliderはつくります。

では、参考までに
流れるようなインタフェースで例外作成

なんでも引数付きコンストラクタでやろうとする例外のインタフェースは使いにくいですよね。
ってお話です。

# 前提
* java8以降


# 問題となる例外

例えば2つ独自フィールドを持つ例外を作る場合

```java

@Getter
public class SampleException extends RuntimeException {

    private String code;

    private String id;

    ...
```

コンストラクタどんなものを用意するかって話になります。

* `code`が入るパターン
* `id`が入るパターン
* `message`が入るパターン
* `cause`が入るパターン

これの組み合わせ...って考えてコンストラクタを作り始めるともう大変です。
さらに`code`と`id`と`message`は同じ型なのでそれぞれに対してそれしか設定しないコンストラクタを作ることはできません。

```java
    public SampleException(String message, String id, String code) {
        super(message);
        this.id = id;
        this.message = message;
    }
```
として入らないところにはNullを入れればいい。って思うかもしれませんがスマートじゃないです。
また、コンストラクタが増えてくると使う側が順番を気にしなきゃいけなくて大変です。(ちゃんとjavadocを書いていれば見れば分かりますが、いちいち見なければ分かりません。)
フィールド2つでこのレベルなので、フィールドが増えてったら悲惨です...


# 流れるようなインタフェースで解決

```java
@Getter
public class SampleException extends RuntimeException {

    private String code;

    private String id;

    private SampleException(String message, Throwable cause) {
        super(message, cause);
    }

    public static class SampleExceptionThrower {

        private String message;

        private Throwable cause;

        private String code;

        private String id;

        private SampleExceptionThrower() {
        }

        public static void call(Consumer<SampleExceptionThrower> consumer) {
            SampleExceptionThrower builder = new SampleExceptionThrower();
            consumer.accept(builder);
            SampleException exception = new SampleException(builder.message, builder.cause);
            exception.code = builder.code;
            exception.id = builder.id;
            throw exception;
        }

        public SampleExceptionThrower setMessage(String message) {
            this.message = message;
            return this;
        }

        public SampleExceptionThrower setCause(Throwable cause) {
            this.cause = cause;
            return this;
        }

        public SampleExceptionThrower setId(String id) {
            this.id = id;
            return this;
        }

        public SampleExceptionThrower setCode(String code) {
            this.code = code;
            return this;
        }

    }

}
```

Fluent Builderパターンです。こんな風に使えます。

```java
SampleExceptionThrower.call(builder -> builder.setCause(e)
    .setMessage("message").setCode("code"));
```
すごくすっきり！

# あとがき
callっていう命名が気に食わないので誰か何かいい案をください...
フォルダを除く全てのファイルを移動させる

`find`コマンドでカレントディレクトリにあるファイルを選択し、
`mv`コマンドで選択したファイルを移動させる。

```bash:terminal
find . -maxdepth 1 -type f -exec mv {} idou-saki-no-path \;
```

コピーの場合は`mv`が`cp`になるだけ。

```bash:terminal
find . -maxdepth 1 -type f -exec cp {} copy-saki-no-path \;
```

###参考
https://superuser.com/questions/65635/how-to-move-only-files-in-unix
私の最初`gem`を作成しましょう



簡単な`gem`を作成しましょう。
参考したり、共有したりしやすいように、[Github](https://github.com/hoangvx/bubu)に貼ってきました。

---

### 1. `gem`名を付けましょう

簡単に始めます。私の`bubu`gemと`gemspec`ファイルを作成します


```bash
$ tree
.
└── bubu
    ├── bubu.gemspec
    └── lib
        └── bubu.rb

```

gemのパッケージのソースでは`lib`ディレクトリ内に置いていきます
以上の構築を使うと、`require 'bubu'`をロード際に、私の`gem`を簡単に使えるように

### 2. `Hello gem!`をしましょう

簡単な`Hello to Gem!`メッセージを表示する

> lib/bubu.rb

```ruby
# bubu gem
class Bubu
  def self.say_hi
    puts 'Hello to Gem!'
  end
end
```

### 3. `bubu`のプロフィール追加

`gemspec`ファイルでは作成者、バージョン、目的とかを書いておきます

> bubu.gemspec

```ruby
Gem::Specification.new do |s|
  s.name        = 'bubu'
  s.version     = '0.0.0'
  s.date        = '2017-05-18'
  s.summary     = 'bubu!'
  s.description = 'Hello to gem!'
  s.authors     = ['Vo Xuan Hoang']
  s.email       = 'hoangvx@gmail.com'
  s.files       = ['lib/bubu.rb']
  s.homepage    =
    'http://rubygems.org/gems/bubu'
  s.license     = 'MIT'
end
```

### 4. `gem`ビルドします

簡単的にローカルでインストールできます

```bash
$ gem build bubu.gemspec

Successfully built RubyGem
Name: bubu
Version: 0.0.0
File: bubu-0.0.0.gem

$ gem install bubu-0.0.0.gem

Successfully installed bubu-0.0.0
Parsing documentation for bubu-0.0.0
Installing ri documentation for bubu-0.0.0
Done installing documentation for bubu after 0 seconds
1 gem installed
```

ビルドしたら、`irb`で使ってみる

```bash
$ irb
reirb(main):001:0> require 'bubu'
=> true
irb(main):002:0> Bubu.say_hi
Hello to Gem!
=> nil
```

### 5. `RubyGems`に共有してみる

[rubygems](https://rubygems.org/)サイトのアカウントがまだ持っていない方、まず登録しないといけないんです。

> 新規アカウントを作成 https://rubygems.org/sign_up

`gem`を`RubyGems`に登録して共有してみます

```bash
$ gem push bubu-0.0.0.gem

Enter your RubyGems.org credentials.
Do not have an account yet? Create one at https://rubygems.org/sign_up
   Email:   xxx
Password:   xxx

Signed in.
Pushing gem to https://rubygems.org...
Successfully registered gem: bubu (0.0.0)
```

### 募集中...

--- 
参考：http://guides.rubygems.org/make-your-own-gem/

> 外国人で日本語はそんなに正しくないですね。〜＿〜　誰か直してくれば嬉しです。(；´∀｀)
neomake で ghc-mod が使いたい!

1. まずはstack を入れる
2. `stack setup` をしてみる
3. `stack install ghc-mod` で ghc-mod を入れる
4. `~/.local/bin` の中に ghc-mod が有ることを確認して パスを通す
3. neomake で '`ghcmod'` を指定する
4. プロジェクトルートで `stack exec -- ghc-mod root` を叩いてみる
5. できそう!



### 追記

ghc のバージョンとghc-mod のバージョンが合わない時は

```stack.yaml
resolver: lts-7.16 # ghc 8.0.1 にする場合(環境に合わせる)
```
を追記する
[openframeworks] ウィンドウサイズはキャッシュしましょう, というお話

## 結論

（Macでは?）ウィンドウサイズはキャッシュしましょう

上級者の方は何を当たり前のことをって言うと思うのでここで終了です.

## よく分からない人向け

久しぶりにそこそこ複雑な描画をするアプリをoFで書いていたのですが, フルスクリーンにしたらフレームレート劇落ち君問題に遭遇しまして, どこがボトルネックか突き止めるのにだいぶ時間が掛かったんですけど, 取り敢えずバカっぽく

```cpp
class ofApp : public ofBaseApp {
    void setup() {
        ...
    }
    void update() {
        ...
    }
    void draw() {
        float t = ofGetElapsedTimef();
        ...
        ofLogNotice() << (ofGetElapsedTimef() - t);
    }
};
```

って書くじゃないですか. 書いたんですよ.
で, フルスクリーン時とフルスクリーンじゃないときでほぼ差が無いわけですよ.
そもそも最初にFullHDで設定しててMBPでフルスクリーンにしても1920x1200じゃないですか.
9:10くらいだからバカみたいに考えると10%くらいしか処理負荷上がらないはずじゃないですか.
でもフレームレートは60fpsだったのが15fpsくらいまで落ちるわけです.

で, このアプリ, 立ち上がりから数十秒掛けて徐々に要素が増えていくんですけどフルスクリーンでも最初は60fpsなんだけど要素で揃うと15fpsになるんですね. フルスクリーンだと.
フルスクリーンじゃないときは100年経っても60fpsなんですよ.

そうなるとバカでも気付くじゃないですか. その要素の中身が悪いって.
だから

```cpp
class ofApp : public ofBaseApp {
    void setup() {
        ...
    }
    void update() {
        float t = ofGetElapsedTimef();
        ...
        ofLogNotice("update") << (ofGetElapsedTimef() - t);
    }
    void draw() {
        float t = ofGetElapsedTimef();
        ...
        ofLogNotice("draw") << (ofGetElapsedTimef() - t);
    }
};
```

こうしますよね.

そしたら案の定`update`が重くなるんです. それも異常な感じで跳ね上がるんです.
でもここでやってるのは簡単な範囲判定的なことなんですよね.

なんか状況説明書いてくのもめんどくさくなったんでそろそろ結論にしますけど

```cpp
class ofApp : public ofBaseApp {
    bool calc{false};
public:
    void update() {
        if(calc) {
            float t = ofGetElapsedTimef();
            for(std::size_t i = 0; i < 10000; i++) float f = ofGetWidth();
            ofLogNotice() << (ofGetElapsedTimef() - t);
            calc = false;
        }
    }
    
    void keyPressed(int key) {
        if(key == ' ') calc = true;
        if(key == 'f') ofToggleFullscreen();
    }
};
```

これで非フルスクリーン時とフルスクリーン時で計測してみると

```
[notice ] 0.000224233
[notice ] 5.37182
```

（Touchbar MBP+MacOS Sierra, oF0.9.8 で計測）

はい. 10000倍くらい違います. このループ回数を100000にしたらクラッシュします.

なので超大雑把ですけど

```cpp
ofRectangle windowRect;

void setup() {
    windowRect.set(ofGetWidth(), ofGetHeight());
}

void windowResized() {
    windowRect.set(ofGetWidth(), ofGetHeight());
}
```

こうやって`windowRect`使いましょ. ってお話でした.

## 追記

ランボー 怒りのaddon化
[https://github.com/2bbb/ofxCachedSize](https://github.com/2bbb/ofxCachedSize)
GCEのmastodonからsendgridを使ってメール送信する

[公式のブログ](https://sendgrid.kke.co.jp/blog/?p=7789)に設定情報は書いてあるのですが
表記がややこしい部分があるのと、GCE運用だとちょっとしたトラップがあるので、メモがてら設定内容を残しておきます。

SMTP周りの設定を抜粋

```:.env.production
SMTP_SERVER=smtp.sendgrid.net
SMTP_PORT=2525
SMTP_LOGIN=apikey
SMTP_PASSWORD=SG.stg************************************************************SPU
SMTP_FROM_ADDRESS=yourname@yourdomain.com
SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail
SMTP_AUTH_METHOD=plain
SMTP_OPENSSL_VERIFY_MODE=peer
SMTP_ENABLE_STARTTLS_AUTO=true
```

以下、補足です。

# SMTP_PORT

GCPではメール送信に使用されるポートのアウトバウンドはブロックされている。
よって`587`は使えないので`2525`を指定する必要がある。

# SMTP_LOGIN

`apikey`です。
<img width="1212" alt="SendGrid.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/157051/68f5c746-f8dc-e65b-6e6e-f3134fe2ca79.jpeg">


# SMTP_PASSWORD

[公式のブログ](https://sendgrid.kke.co.jp/blog/?p=7789)に書いてあるとおり、[ここ](https://sendgrid.kke.co.jp/docs/Tutorials/A_Transaction_Mail/manage_api_key.html)の内容にある「APIキー」で大丈夫です。

# SMTP_OPENSSL_VERIFY_MODE

`peer`で運用する場合、[公式のブログ](https://sendgrid.kke.co.jp/blog/?p=7789)にもリンクされていますが、[こちら](http://qiita.com/awwa/items/cc37fc04013d80397811#%E8%A7%A3%E6%B1%BA%E7%AD%96)の手順を踏む必要があります。
人工知能、機械学習、ディープラーニングを昔の自分でもすぐに理解できるように整理してみた

一読難解、二読誤解、三読不可解の典型例じゃないかと思うくらい人工知能周りの話は難しい。。　それでもずっといろんな本や記事を読んだり、自分でもコードを書いたらなんとなく全体像が見えてきて、人工知能の話題が出たときでも、それがどのレイヤーの話をしているのか理解できるようになってきた気がします。

人工知能について調べるのが初めて、またはなんらかの誤解をしている方、つまり昔の自分が読んで腑に落ちるように整理をしているため、正確性や網羅性はあまりないかもしれませんが、まとめてみました。

# 人工知能

人工知能の定義は様々あり、宗教論争になりがちなので詳細は避けたいのですが、私は人工知能は**人間が行なっているさまざまな行動をシステム化させる**ものだと考えています。

例えば弊社では英語学習サービスを提供しているのですが、外国人講師が返信をしたり、添削をしたり、会話をしたりしています。これを人力ではなくシステムで行うことができれば、人工知能がユーザーに価値を提供している、と言えるのではないでしょうか。

人工知能には**汎用型（強いAI）**と**特化型（弱いAI）**があり、**汎用型AI**は人間と同等またはそれ以上のことができることが期待されていますが、この実現はまだまだ先になると言われています。現時点で実装されているのは**特化型AI**であり、特定の領域においてタスクを実行したり問題を解決したりしてくれます。特定領域とは、例えば画像認識、自然言語処理、音声認識などがあります。

# 機械学習

機械学習とは、**人工知能を実現するための手法の1つ**です。通常プログラミングする場合、入力データに対して望ましいデータが出力されるように処理（ロジック）を記述します。そのロジックは、条件分岐だったり繰り返しだったりいろいろです。

ただ、この入力に対する出力のルールを設定するというというアプローチは、人間がルールを全て明示する（＝ロジックを全て書く）のに限界があるため、ルールを記述していない例外に弱いというデメリットがあります。また、ルールというものは社会状況などに合わせて変化する可能性があり、その変化に合わせて毎回ルールを書き換えるのは煩雑です。

よって、ロジックを全て最初から実装するのではなく、機械学習により大量のデータからパターンや特徴を分析して、その分析して得られたロジック（アルゴリズム）を元に未知のデータに対しても精度の高い予測を自律的に割り出す手法が編み出されました。

プログラムは主に「入力」「処理」「出力」から成り立っていますが、通常のプログラムは「入力」に対し望ましい「出力」がなされるようにルールを記述して「処理」していますが、機械学習では「入力」と「出力」のデータを大量に読み込ませることで自発的にルールを見い出し、「処理」を行ってくれます。

そして、機械学習には大まかに**教師あり学習**と**教師なし学習**があります。先ほど「入力」と「出力」のデータを大量に読み込ませるとしましたが、**教師あり学習**は入力と出力のセットでデータ、**教師なし学習**は入力データのみを読み込ませます。

**教師あり学習**の場合は、入出力のデータをセットで持っていますので、未知の入力データがあってもセットデータの規則性を元に分類などを行い出力を割り出します。一方、**教師なし学習**の場合は、入力データのみを持っているため、未知の入力データがあった場合、その入力データを読み込み済の入力データと比較してクラスタリングしたり、異常検知をしたりして出力を割り出します。

このように**教師あり学習**と**教師なし学習**は読み込ませるデータが異なることから学習方法に違いがあり、適用できるシーンも変わってきます。どのシーンにおいてどの学習方法を選択するかが重要です。

# ディープラーニング（深層学習）

ディープラーニングとは、**機械学習を実装するための1つの手法**です。繰り返しになりますが、機械学習では「入力」と「出力」のデータを大量に読み込ませることで自発的にルールを見い出し、「処理」を行ってくれます。しかし、「処理」を一段階で行うと、複雑なデータを正しく処理することが難しいという問題点があります。そこで、最初の処理の結果をさらに処理することで階層的に処理を行う手法であるディープラーニングが編み出されました。

ディープラーニングでは、**ニューラルネットワーク**という計算アルゴリズムを活用します。ニューラルネットワークとは、人間の脳の神経回路の仕組みを模倣したアルゴリズムであり、大きく入力層、中間層（隠れ層）、出力層の3層に分類されます。「入力」されたデータを「処理」してデータを「出力」するのがプログラムの一連の流れでしたが、中間層（隠れ層）を何層も重ねることで、ニューラルネットワークの精度を向上させることができます。この中間層が2層以上になっている多層構造のニューラルネットワークを機械学習させることをディープラーニングといいます。

そして、ニューラルネットワークの中間層を多層にする手法として、**畳み込みニューラルネットワーク (Convolutional Neural Network: CNN)**や**再帰型ニューラルネットワーク (Recurrent Neural Network: RNN)** があります。**CNN**とは、畳み込み層（フィルタリングをして特徴量を取り出す層）とプーリング層（フィルタの結果から選択する層）を交互に繰り返すことでデータの特徴を抽出し、最後に全結合層で認識を行う手法です。一方**RNN**とは、中間層において、中間層の結果を自ら再度入力に用いることで、文脈理解を可能にする手法です。単純化すると、CNNが順次処理、RNNが再帰処理ということになるでしょうか。

# まとめ

人工知能には汎用型（強いAI）と特化型（弱いAI）があり、現在実現されているのは特化型（弱いAI）です。

機械学習とは人工知能を実現するための手法の1つであり、大まかに教師あり学習と教師なし学習があります。教師あり学習では入力と出力のセットデータ、教師なし学習では入力データを読み込ませます。

ディープラーニングとは、機械学習を実装するための1つの手法であり、多層構造のニューラルネットワークを機械学習させることです。多重構造にする方法として、CNNやRNNがあります。

こう整理すると、全体像が見えて、個別の理解がしやすくなった気がします。
boto3でHTMLをアップロードしてもHTMLとして認識しなかった

# 事象
awsをいじるためのライブラリ、[boto3](https://boto3.readthedocs.io/en/latest/)でアップロードしたHTMLにアクセスすると、ファイルダウンロードになってしまう。

# 解決方法
``` python
import boto3

s3 = boto3.resource('s3')
s3.Bucket(<<bucket_name>>).upload_file(
  'ファイル名',
  'ファイル名',
  ExtraArgs={'ContentType': 'text/html', 'ACL': 'public-read'})
```
ExtraArgsでContentType　text/htmlを指定してあげる。