OmniAICreator/Qiita-1.07M huggingface dataset:
Docker suttang/sphinx-rtd を自動でビルドできるようにした


wamw Friday I/O 5日目です。
株式会社ワムウでは、毎週金曜日は 興味がある事柄に取り組み、その成果を何らかの形でアウトプットする日としています。

## 概要

おかげさまで先日作成した `suttang/sphinx-rtd` が、一部地域でご好評頂いております。

http://qiita.com/suttang/items/2e225b9f98e7aa8bafe7

ある案件でドキュメントを書くに際して、Sphinxで構築しようと思って作成し、それは無事に完了したんですが、使い終わっての反省点として下記が残りました。

1. ビルドコマンド毎回打つのダルい
2. 自分でブラウザリロードするのダルい
3. 公開手順がダルい

3は置いといて、このダルいポイント1, 2を解決するために自動でビルド・ブラウザリロードするようにしました。

エディタの拡張機能とかで解決しようとも思ったんですが、ローカルに環境を作る必要がある、とかblockdiagビルドできないじゃん、とかそういう理由でgulpで構築。


## 作ったもの

https://github.com/suttang/docker-sphinx-rtd-theme-auto-build


## 使い方

上記リポジトリを 	`クローン` するなり `zipでおｋ` するなりします。
その後 `npm install` を行い、 `npm run build:dev` するだけです。

ゼロコンフィギュレーションなのでなかなか便利です。

```
git clone https://github.com/suttang/docker-sphinx-rtd-theme-auto-build
cd docker-sphinx-rtd-theme-auto-build
npm install
npm run build:dev
```

するだけです。
まるで魔法。

ワンライナーでドキュメントが構築できます。

```
git clone https://github.com/suttang/docker-sphinx-rtd-theme-auto-build && cd docker-sphinx-rtd-theme-auto-build && npm install && npm run build:dev
```

よかったら使ってみてください。
[Unity IAP] Androidで非消費アイテムを消費する

# 前置き

Unity IAPで課金処理を実装している時の話。

Androidで非消費アイテム（`NonConsumable`）を購入した場合、アプリを一度アンインストールして再インストールしても購入情報が保持されたままとなる。
(Unity IAPの初期化時に自動でリストア処理が実行される)

そのため非消費アイテムは1アカウントで1回しか購入することができない。
このままだとテストがしづらいため、購入アイテムをリセットするデバッグ機能を実装しておくと便利。


# 仕組み

そもそもAndroidの課金アイテムは以下の2種類しかない

* 標準のアプリ内アイテム（一回限りの課金）
* 定期購入（繰り返し自動課金）

参考
https://developer.android.com/google/play/billing/index.html?hl=ja

そのため、Unity IAPでの「消費アイテム（`Consumable`）」「非消費アイテム（`NonConsumable`）」の分類は、
Androidでは同じカテゴリ（上記の「標準のアプリ内アイテム」）になる。

ではどう分けているかと言うと、「消費アイテム」はアイテムを購入した後、すぐに「消費」処理を実行することで、
消費アイテムを実現するというのが、Android課金の基本的な実装方法。
つまり「消費」処理を実行するかしないかの違い。
UnityIAPも内部でそのような処理を実行している。

つまり、UnityIAP上は「非消費アイテム（`NonConsumable`）」となっているアイテムも、
消費してやれば所持状態が解除される。


# 実装

`IAPManager`としているのは課金処理を実行しているクラスを想定して書いているけど何でも良い。
`Debug_ConsumeAllProducts()`を実行すれば指定したIDのアイテムが消費されるはず。
処理実行後にアプリをアンインストールしてから再インストールするとキレイな状態になるはず。


```csharp:IAPManager.cs
public class IAPManager {

    // 省略

    private class DebugStoreListener : IStoreListener {
        public void OnInitialized(IStoreController controller, IExtensionProvider extensions) {
        }
        public void OnInitializeFailed(InitializationFailureReason error) {
        }
        public void OnPurchaseFailed(Product i, PurchaseFailureReason p) {
        }
        public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e) {
            return PurchaseProcessingResult.Complete;
        }
    }

    public void Debug_ConsumeAllProducts() {
        var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());

        // 非消費アイテムのIDを必要なだけ指定する
        builder.AddProduct("<product_id>", ProductType.Consumable);
        builder.AddProduct("<product_id>", ProductType.Consumable);
        builder.AddProduct("<product_id>", ProductType.Consumable);
        // ...

        UnityPurchasing.Initialize(new DebugStoreListener(), builder);
    }
}
```

[AbstractStore.FinishTransaction](https://docs.unity3d.com/ja/540/ScriptReference/Purchasing.Extension.AbstractStore.FinishTransaction.html)が消費処理のメソッドだと思うんだけど、呼ぶまでが遠そうだったため断念。

代わりに`Consumable`を指定した状態で、初期化処理を実行させる方法とした。
初期化処理で、所持アイテムのリストア処理として`ProcessPurchase`が呼ばれる流れとなる。
`ProcessPurchase`は問答無用で`Complete`を返しているため、
これにより「消費アイテムの処理成功」状態となり、Unity IAPが消費処理を実行する。
TeXShop で LaTeXの日本語文書で図にpdfファイルを使う

# はじめに

以前は、pLaTeXで日本語を使おうとすると、図にはEPSファイルを準備しなくてはならず、変換が大変だった。Macではプリント＞pdfで保存を使うと、スライドショーの任意の図をpdfで書き出せるため、EPSファイルよりはるかに使いやすい。日本語文書でもpdfファイルを読み込める環境を設定した。


##TeXShopの環境設定
設定プロファイル＞upTeX (ptex2pdf)

## 使用するパッケージ
LaTeXのソースコードの最初に
```tex
\usepackage[dvipdfmx]{graphicx}
\usepackage{bmpsize}
```
を入れる。


## pdfファイルの前処理

MacTeX等でインストールすると、pdfファイルの余白を切り取ってくれるユーティリティがインストールされる。ターミナルでpdfファイルが入っているディレクトリまで移動し、以下のようなコマンドを入力する。
```
$ pdfcrop Fig5.pdf
```

##図の挿入

以下のようなコードで挿入できる。
```tex
\begin{figure}[htbp]
\begin{center}
  \includegraphics[width=0.5\textwidth]{Fig5-crop.pdf}
\end{center}
\end{figure}
```
RubyMineで参照するRubyのバージョンをrbenvのRubyに変更する

#迫り来る赤線地獄
MacのRubyのバージョンとDocker内のRubyのバージョンが異なり、
RubyMineがエラー地獄になっていたため、バージョンを同期しようと思いました。

ちなみにRubyのバージョンはMacが`2.0.0`、コンテナが`2.3.1`でだったので、
ぼっち演算子が特にひどかった・・・。

RubyMineはすでに導入されているものとして書きます。

#rbenvの導入
まずは`rbenv`を入れます。
すでに導入済みの人はぶっ飛ばしましょう。
こちらのサイトを上から順に見ていけば簡単に導入できます。
http://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/

今回は2.3.1に設定したかったので、リンク先の手順通り進めたのち、
`2.3.1`を`global`に設定しました。

`$ ruby -v`で自分が設定したrubyのバージョンになっていればOKです。

#RubyMineで参照するRubyを設定

まずは、rubyがどこを参照しているのか確認しておきます。
`$ which ruby`

どこを参照しているのか確認ができたら、
RubyMineの`Preferences`を開き、
`Languages & Frameworks` -> `Ruby SDK and Gems`の中に先ほど参照した場所を追加・・・

あれ・・・

#できない・・・
追加しようとして、＋ボタンを押すと、Finderが開くのですが、Finderでは隠しディレクトリを表示してくれない。

なので、whichコマンドで確認した場所が隠しディレクトリ内にあると指定できない。

#シンボリックリンクで代用
仕方が無いので、隠しディレクトリ内を参照するシンボリックリンクを作成
`$ ln -s ruby (whichコマンドで確認したパス)`

そちらの場所を追加するようにしたところ・・・

できた！！

（シンボリックリンクなんて使わなくても直接指定できるやり方知っている方ぜひご教授願います！）
↓
@scivola さんにRubyMineは`rbenv`が`~/.rbenv`にあると仮定していることを教えていただいたので、試しにRubyMineを再起動したところ、rbenvのバージョンが選べるようになりました。なのでシンボリックリンクを作る必要はありません。情報提供ありがとうございます。

#まとめ
今回はRubyMineで参照するRubyのバージョンを変更してみました。
これでとりあえず赤線地獄からは解放された！

それではまた。
Javascriptの非同期処理を同期的に書く方法

## はじめに
Javascriptは**シングルスレッド**+**同期的**なプログラミング言語だが**非同期処理**が可能

## シングルスレッド？
シングルスレッド
人-------------------

マルチスレッド
人-------------------
人-------------------
人-------------------

## 同期処理/非同期処理とは？
同期処理
処理の1つに時間のかかる処理があると、
その実行が完了するまで、次の行には進まない。

非同期処理
処理の1つに時間のかかる処理があると、
その終了を待たずに次の処理に進み、時間のかかる処理が終了したら通知する

## 非同期処理が可能？
```
export default {
  methods: {
    sleep (wait, result) {
      setTimeout(() => {
        console.log(value)
      }, wait)
    },
    setTimeoutIsAsync () {
      this.sleep(2000, 1)
      this.sleep(100, 2)
      this.sleep(1000, 3)
    },
  },
  mounted () {
    this.setTimeoutIsAsync()
  }
}
```
**実行結果**
2->3->1

Javascriptでは、setTimeoutやfsなど処理時間がかかる処理を行う場合、その処理が非同期で実行される。

## シングルスレッドの証明
```
export default {
  methods: {
    sleep (wait, result) {
      setTimeout(() => {
        console.log(value)
      }, wait)
    },
    jsIsSingleThread () {
      this.sleep(1000, 1)
      for (let i = 0; i < 10000; i++) {
        console.log(i)
      }
    },
  },
  mounted () {
    this.jsIsSingleThread()
    console.log('completed')
  }
}
```
**実行結果**
0...10000->completed->1

this.sleepの実行は「0-10000」のループ処理終了後に行われる。
Javascriptはシングルスレッドなため、優先度が高く、重い処理が実行中の場合はその処理が終了してから非同期の処理が実行される。

## Promiseを使って非同期処理を同期的に書く
```
export default {
  methods: {
    sleep (wait, result) {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          console.log(result)
        }, wait)
      })
    },
    syncSleepByUsingPromise () {
        this.sleep(2000, 1).then(
          () => this.sleep(100, 2)
        ).then((result) => {
          return this.sleep(1000, 3)
        }).catch((error) => {
          console.log(error)
        })
      },
  },
  mounted () {
    this.syncSleepByUsingPromise()
  }
}
```
**実行結果**
1->2->3

## Async-Awaitを使って非同期処理を同期的に書く
こちらの方がより手続き的に書けるので使いやすい

```
export default {
  methods: {
    async sleep (wait, result) {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          console.log(result)
        }, wait)
      })
    },
    async syncSleepByUsingAsyncAwait () {
      await this.sleep(2000, 1)
      await this.sleep(100, 2)
      await this.sleep(1000, 3)
    },
  },
  mounted () {
    this.syncSleepByUsingAsyncAwait()
  }
}
```
**実行結果**
1->2->3
■IBM BPM 8.5.7 Process App or Toolkit の削除方法　(超初心者向け) 


■背景
プロセスアプリ名：123

1.「123」をクリックしてください。

![2017-09-01 17_35_22-_ への返答How to__ - IBM Notes.png](https://qiita-image-store.s3.amazonaws.com/0/181748/29419999-f815-4a0c-3572-2c3b681bfb55.png)

2.「管理」をクリックしてください。

![2017-09-01 17_38_50-_ への返答How to__ - IBM Notes.png](https://qiita-image-store.s3.amazonaws.com/0/181748/24377d7b-52b2-4f01-7aee-7c15f293793c.png)

3.右側の「ProcessAppのアーカイブ」をクリックしてください。

![2017-09-01 17_43_44-_ への返答How to__ - IBM Notes.png](https://qiita-image-store.s3.amazonaws.com/0/181748/6de55443-9f11-e49b-2b97-5cf2609b9855.png)

4.「アーカイブ」をクリックしてください。
![2017-09-01 17_44_35-Untitled page - OneNote.png](https://qiita-image-store.s3.amazonaws.com/0/181748/3c937b80-f25a-e52d-3f05-ba16d1088708.png)

5.ProcessApp一覧で　「123」というProcessAppが消えてしまったはず！

6.「アーカイブ済み」をクリックしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181748/c198ba8e-ff3e-8873-d325-083be2f57b11.png)

7.「削除」をクリックしてください。
![2017-09-01 17_48_57-_ への返答How to__ - IBM Notes.png](https://qiita-image-store.s3.amazonaws.com/0/181748/09f58cc3-e92f-c52b-65d7-89aff54a4ca7.png)

![2017-09-01 17_49_14-_ への返答How to__ - IBM Notes.png](https://qiita-image-store.s3.amazonaws.com/0/181748/67443b87-e2b0-d3ac-b10c-42eab9705068.png)


**※Toolkitの削除方法はProcess Appと同じ！**
sqlplusで複数SQLを確認しながら順に流し込むbat芸

windows限定、超小ネタです。

##１．流し込みたいSQLファイルの順番をリスト化したtxtファイルを用意
<ex>

```text:list.txt
hogehoge_alter.sql
hugahuga_insert.sql
mogamoga_update.sql
```

そもそも、このリストを作るのが辛いって人は

```bat:コマンドプロンプト
dir *.sql /b > list.txt
```

みたいな感じでlist.txtを出力させましょう。

##２．以下内容のbatファイルに１．で作ったlistファイルをドラッグアンドドロップ

```bat:sqlplus_injection.bat
@echo off
set user=scott
set pass=tiger
set db=orcl
set SQLPLUS=sqlplus %user%/%pass%@%db% 

:init
cls
echo userを入力してください enter:%user%
set /p user=
if defined user set user=%user:"=%

echo passwordを入力してください enter:%pass%
set /p pass=
if defined pass set pass=%pass:"=%

echo dbの識別子をどうぞ enter:%db%
set /p db=
if defined db set db=%db:"=%

cls

echo user:%user%
echo password:%pass%
echo db:%db%
echo 以上の設定でよろしいですか？ (やりなおし:0)

set /p input=
if defined input set input=%input:"=%
if /i "%input%" == "0" (goto init)

cls

FOR /F "" %%i IN (%1) DO @CALL :SUB %%i
goto Exit

:SUB
set args=%1
echo %args% の流し込み開始します。よろしいですか？ (続ける:Enter 中止:0)
set /p input=
if defined input set input=%input:"=%
if /i "%input%" == "0" (goto Exit)
%SQLPLUS% < %args%
EXIT /B

:Exit
pause
exit
```


##３．(ﾟдﾟ)ｳﾏｰ

しかし、そろそろコマンドプロンプト(bat)芸も引退かな。
aws LambdaとAPI Gatewayではまったところ


## やりたいこと
- API GatewayとLambdaを使ってパラメータの値を返すAPIを作りたい
- 以上


## はまったところ
- Lambdaのテストは通ってるのにAPI Gatewayを通すと502
- パラメータが拾えないんですけど

### Lambdaのテストは通ってるのにAPI Gatewayを通すと502
ドキュメント読めという話なんですが、最低以下のフォーマットを満たしていないといけないようです。

```json
{
    "statusCode": httpStatusCode,
    "body": "..."
}
```

http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html

### パラメータが拾えないんですけど
結論から言うと`event`の中の`queryStringParameters`にパラメータが入ってます。
ググると出てくるような
これは以下を実行すると確認できます。

#### Python
```python
import json

print('Loading function')


def lambda_handler(event, context):
    return {
        "isBase64Encoded": "true",
        "statusCode": 200,
        "headers": {},
        "body": json.dumps(event)
    }
```

#### Nodejs
```js
'use strict';

console.log('Loading function');

exports.handler = (event, context, callback) => {
    callback(null, {
        "statusCode": 200,
        "body": JSON.stringify(event)
    });
};
```
AWS Tools for PowerShellで認証プロキシを超える

##前置き
社内から認証プロキシ経由でPowerShellコマンドレットを実行したいこと、
あると思います。
需要がニッチな上にPowerShell使いも少なく、情報も少ないのでメモとして残します。

##環境
Microsoft Windows 7 Professional(64bit)
PSVersion 5.0.10586.117
AWS Tools for Windows PowerShell Version 3.3.53.1


認証プロキシによって弾かれた際はこのエラーが発生する。

```
PS C:\Windows\SysWOW64\WindowsPowerShell\v1.0> Get-IAMUser
Get-IAMUser : A WebException with status ProtocolError was thrown.At line:1 char:1
+ Get-IAMUser
+ ~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Amazon.PowerShe...etIAMUserCmdlet:GetIAMUserCmdlet) [Get-IAMUser], InvalidOpe 
   rationException
    + FullyQualifiedErrorId : Amazon.Runtime.AmazonServiceException,Amazon.PowerShell.Cmdlets.IAM.GetIAMUserCmdlet
```


##認証プロキシに認証情報を入れる。
このあとから実行するコマンドレットは認証プロキシを超えてくれる。

###毎回認証情報を入力させる場合
```OneLiner.ps1
Set-AWSProxy -Credential (Get-Credential) -Hostname "example.org" -Port 10080
```


###認証情報を固定してスクリプトなどで使用する場合
```OneLiner.ps1
Set-AWSProxy -Hostname "example.org" -Port 10080 -Username "xxxx" -Password "pppp"
```

###もしもEC2から使用する場合
こちらのユーザーガイドに記載のとおり、
BypassListパラメータでインスタンスメタデータ用IPアドレスは除外しましょう。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-proxy.html

```OneLiner.ps1
Set-AWSProxy -Hostname "example.org" -Port 10080 -Username "xxxx" -Password "pppp" -BypassList "169.254.169.254"
```
Visual Studio CodeでZ80の開発環境を作るまで


Z80で開発する特殊な環境にいます。開発環境は秀丸ですが、もう少しmodernな環境を使ってみたくなったので、その記録です。

# インストール

## Visual Studio Code

* [Download Visual Studio Code](https://code.visualstudio.com/download)
* インストール時点のバージョンは v1.15.1

## プラグイン

* プラグインの導入方法は[拡張機能]から検索窓にキーワードを入れ、[インストール]を押すだけ。かんたん！

![Z80 Assembly インストール画面](https://qiita-image-store.s3.amazonaws.com/0/7886/d1630763-2fb7-d9d7-9dae-7eb4237ecd41.png "プラグインインストール例")

### インストールしたもの

* [Z80 Assembly](https://marketplace.visualstudio.com/items?itemName=Imanolea.z80-asm) (Z80用のSyntax Highlighter）
* [Project Manager](https://marketplace.visualstudio.com/items?itemName=alefragnani.project-manager) （プロジェクト管理用）

# プロジェクト作成

今までのVisual Studioのように、プロジェクトという概念がない（？）ので、ディレクトリを開くだけ。

![Syntax Highlight例](https://qiita-image-store.s3.amazonaws.com/0/7886/bac840b1-0b56-35f4-3ad8-309d6c781eb3.png "Syntax Highlight例")

# TODO

* 0FFFFHのようなデータも色がつくように修正しようかと思っています

# 感想

すごい簡単に終わってしまいました・・。
もう少し色々使い込んでみようかと思います。

## VS Codeを使うメリット

* クロスプラットフォーム
* 最近な感じでかっこいい（←ココ重要）
* プラグインが豊富
	* ミニマップ
	* Syntax Highliter
* プラグインの開発知見が豊富
	* node.jsの情報量が多い

## VS Codeを使うデメリット

* さすがに起動が少し遅い
* それなりに学習コストがある
* （秀丸に慣れた人が使ってくれない・・）

# 参考文献

* [Visual Studio Codeをはじめるにあたって参照すると良いもの](http://qiita.com/satokaz/items/dd2f16fc953e7bdb6d2f)


以上
【Delphi / C++Builder / RAD Studio】Enterprise Connectors (エンタープライズコネクターズ)がリリースされました

#【Delphi / C++Builder / RAD Studio】Enterprise Connectors (エンタープライズコネクターズ)がリリースされました

[以前のブログ](http://qiita.com/kazaiso/items/f63e112b3defe40e6e50)にてEnterprise Connectors (エンタープライズコネクターズ)の発表についてお知らせをいたしました。この発表後、エンタープライズコネクターズはベータテスト期間として公開されていましたが、この度、正式リリースとなりました。

正式リリースとなったエンタープライズコネクターズは、30日間の試用版としてGetItパッケージマネージャよりダウンロード可能となっています。

また、さらなる追加のエンタープライズコネクターズがベータ版として提供されています。
ここで、「？」となった方。 エンタープライズコネクターズとは、一つの一つのコンポーネントとして提供されているのではなく、接続先別に個別に提供されているFireDACコンポーネント達なのです。
以前の発表時と共にベータ版として公開されていた約70数個のエンタープライズコネクターズ達が、正式リリースされ、ここ最近で、さらに新しい接続先をサポートするエンタープライズコネクターズ達がベータとして追加された、という事であります。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/145847/7b9fa052-b811-2200-61a1-153b830172bd.png)

上部のイメージをご覧ください。GetItパッケージマネージャに表示されているエンタープライズコネクターズの一部です。上段の上段の6つと、下段左側2つののエンタープライズコネクターズはベータとして公開されている新しい接続先です。下段右側4つは正式公開されトライアルとしてダウンロード可能となったエンタープライズコネクター達です。

##エンタープライズコネクターズのダウンロード方法
ダウンロードの方法は[以前のブログ](http://qiita.com/kazaiso/items/f63e112b3defe40e6e50)にても紹介しましたが、ここでも簡単にご紹介します。
エンタープライズコネクターズを利用するにはDelphi / C++ Builder / RAD Studio のバージョン10.2 Tokyo 以降、エディションは Professional 以上が必要です。
こちらをお持ちでない方は[トライアル版](https://www.embarcadero.com/jp/products/rad-studio/start-for-free)をお試しください。
[トライアル版のインストール方法はこちらの記事をご参照ください。](http://qiita.com/kazaiso/items/479fdf1170fa886fe208)

1. RAD Studioを起動 （Professional エディション以上）
2. ウインドウ上部のメニューバー内の[ツール（T)] - [GetItパッケージマネージャ(G)]を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/9d4f552c-68ec-ad7c-a3d8-0d2a4d13f0f1.png)<br><br>
1. 「GetItパッケージマネージャ」ウインドウが開くので、左側の「カテゴリ」から「Connectors」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/bfda75a3-c873-dec3-80c3-9293f7dd13d1.png)<br><br>

2. Cdata EC+と表示されている水色のアイコンが一覧表示されます
3. 必要とするサービスのコネクターの「インストール」をクリックすると、インストールが開始されます
4. インストレーションダイアログに従って進めていけば、インストールが完了します。インストール完了時にはRAD Studioの再起動が求められます。

##エンタープライズコネクターズの契約・販売形態について
エンタープライズコネクターズは「エンタープライズコネクターズ サブスクリプション」として2種類のエディションで販売を行います。
エディションによって利用できるエンタープライズコネクターズ群が異なります。エディションによって利用できるコネクターを確認するには[エンバカデロのエンタープライズコネクターズのWebサイト](https://www.embarcadero.com/jp/products/enterprise-connectors)をご参照ください

また、このエンタープライズコネクターズの販売・契約形態は「年間利用」となるサブスクリプション型になります。例えば1年間の契約を結び、有効な契約期間中であれば、下記のような利用が可能です。

* エンタープライズコネクターズを使ったアプリケーションの開発・デプロイ・配布が可能
* バグフィックスが行われた新しいエンタープライズコネクターズを入手・適用可能
* 接続先のAPIが更新されたとしてもその新APIに適合したエンタープライズコネクターズを入手・適用可能
* 新しい接続先に対応した新しいエンタープライズコネクターズがリリースされた場合、これを利用可能（エディションによっては利用できないコネクターもあります）

契約を更新して継続していただければ、これらメリットを受け続けることができます。
契約が更新されなかった場合、過去の有効な契約期間中にデプロイ・配布されたアプリを利用し続けることは可能です。しかし、新たにアプリをデプロイ・配布することはできません。

##サブスクリプション契約について
さて、なぜこのような年契約＆更新タイプの契約なのでしょうか？
これはSaasや各種Web APIを包んでSQLにて利用できるというエンタープライズコネクターズの特性に関わっています。Web APIは常にこれらWeb API提供者によって変更・改善されており、時には新APIの追加や、削除が行われます。このようなAPIの変化に追従するためにエンタープライズコネクターズは継続したメンテナンスを行い、適切な対応を行ったコンポーネントへとアップデートし続ける努力をしています。そのため、売り切りタイプの販売形態ではなく、継続したサブスクリプションタイプの販売契約形態とし、継続したメンテナンスを提供しているわけです。
1年間のサブスクリプションの予価の詳しく＆最新の情報は[別途Webページ](https://www.embarcadero.com/jp/company/contact-us-japan)をご参照ください。
WEBページを構成する言語の役割まとめ

#HTML CSS JavaScript Ruby Ruby on Railsの違い
自分用のメモもかねて、WEBページを構成する言語たちの役割をまとめた。

##HTMLとは
WEBサイトの基本構造を指定する言語。基礎の部分。これがないと始まらない。
文章を書いたときに、これは見出し、これは本文というように文章に意味を持たせることができる。
また、ハイパーリンクを使用することにより、別のWEBページに行き来するようにすることもできる。
そのほか、コンテンツごとのまとまりを設定することも可能である。

##CSSとは
HTMLをもとに、色どりを与えたりレイアウトを整えたりする。
文字の色、フォント、太字にした線や、背景画像の設定などが可能。
その設定を、すべての要素ではなく、idやclassを使用することで特定の要素にだけ適用させるなど細かく設定することができる。
また、マウスカーソールが重なった際の挙動を変更することも可能である。

##JavaScriptとは
WEBページに動きを与えることができる**プログラミング言語**。
上記2つは一度決めてしまったらファイルを編集しない限り変更することはできない。しかし、JavaScriptを使用すると、画像をスライドさせたり、ボタンを押すと背景色が変わるなどの**動的な処理**ができるようになる。

##Rubyとは
WEBページを見るには、私たちが対象のサーバーに"HTMLくださいな"と要求し、HTMLファイルを受け取ることで閲覧できるようになる。
この受け取るHTMLファイルを、サーバー側で自動生成してくれるのが**サーバーサイドの言語**である。
そのサーバーサイドの言語の一つがRubyである。

##Ruby on Rails
WEBアプリケーションを作成する際、よく使うRuby機能の詰め合わせ的な存在。
詰め合わせなのでゼロからコードを書く必要がなく、用意された機能を説明書通り使えばいい。

##まとめ
HTMLを使用してページ構成を決め、CSSでレイアウトなどの見栄えを整える。
そこにJavaScriptやRubyなどの言語を使用して、動きを付けていく。Ruby on RailsはRubyの機能の詰め合わせ。
Pythonメモ TensorFlow1.3のインストール(Macのみ)

<br><h4>1.Anaconda</h4>
TensorFlowをダウンロードするのに今回はAnacondaを使用していきます。
以下のページの手順に従ってダウンロードしてください。
http://qiita.com/ShibaNDD/items/61624a947651caee40a0


<br><h4>2.Anacondaでの環境構築</h4>
Anaconda Navigatorを起動した後、
左側のHomeの下にある[Enviroments]をクリックします。

一度もAnacondaを使用していない方はrootのみが表示されていると思います。
新たにTensorFlow用に環境構築していきます。

(Enviromentsの)左下にある[Create]をクリックします。

Name: 好きなもので大丈夫です。(例: TF1.3(TensorFlow1.3の略))
Packages: Python3.6 

※Packagesの注意点
TensorFlow1.2以降はPython3.6に対応していますが、
1.2以前は対応していないので、Python3.5を選択してください。
今回は1.3をインストールするので3.6で大丈夫です。

[Create]をクリック。

必要なデータがダウンロードされて環境を
構築してくれているのでしばらく待ちましょう。

<br><h4>3.環境を起動</h4>
完了したら、TF1.3(Nameで決めた名前)の横に
再生ボタンが表示されているので[▶︎]をクリックします。

[Open Terminal]をクリックします。

<br><h4>4.TensorFlowをインストール</h4>
TerminalでTensorFlowをインストールしていきます。
以下のコマンドでインストールしてください。

```
$ pip install TensorFlow
```
<br>

実際にインストールされているのか　確認作業は以下の方法で出来ます。


TerminalにてPythonを起動

```
$ python
```
<br>

python内でTensorFlowがあるか以下のコマンドで確認。 
注意点: 全小文字

```
>>> import tensorflow 
```

<br>

成功例
```>>>         ```

失敗例
```ModuleNotFoundError: No module named 'tensorflow'         ```

<br>

<br>
Pythonメモ Anacondaインストール(Macのみ)

<br><h4>1.サイトからインストール</h4>
Anacondaのホームページからパッケージをインストールします。
以下のサイトから出来ます。
https://www.anaconda.com/download/

基本的にはPython3.6 64bitで大丈夫です。(2017.8.30)

インストール後、Continuum Analytics社に登録するかどうかとメールアドレスを聞かれますが、特に必要ないので[No Thanks]をクリックしてください。

ダウンロード完了したらブラウザの左下の[Anaconda3-4.4.0-MacOSX-x86_64.pkg]をクリックします。(ダウンロードしたバージョンによって数字は異なります。)

<br><h4>2.インストーラーでの設定</h4>
このソフトウェアをインストールするために必要な手順が表示されます。
→[続ける]をクリック

大切な情報
→[続ける]をクリック

使用承諾契約
→[続ける]をクリック

ソフトウェア使用承諾契約に同意する必要があります。
→[同意する]をクリック

Macintosh HDに標準インストール
→[インストール]をクリック

インストールが始まります。

インストールが完了しました。
→[閉じる]をクリック

<br><h4>3.Anacondaを起動</h4>
Macの[Finder]を立ち上げ、
[アプリケーション]の中に[Anaconda Navigator]があるのでそちらをクリックするとAnacondaが起動します。


<br>

<br>
DangerでCheckstyleの結果を指摘する

[CircleCI 2.0でAndroidのアプリをビルドしつつ、コードレビューBOTも動かす - Qiita](http://qiita.com/noboru_i/items/780abf904568c664712f) で、Androidアプリの自動レビューでRubyが使えるようになりました。

その最後で書いてましたが、gradleのタスクを実行しないDangerプラグインを自分で作ったので、それの利用方法などを紹介しようと思います。

主にAndroidのアプリを想定していますが、Checkstyle formatのXMLが用意できれば、同じように自動レビューさせることが出来ると思います。

## 作ったもの

RubyGems : [danger-checkstyle_format](https://rubygems.org/gems/danger-checkstyle_format)
GitHub : [danger-checkstyle_format](https://github.com/noboru-i/danger-checkstyle_format)

## 出来ること

Checkstyle formatのXMLファイルを用意して、[Danger](http://danger.systems/ruby/)経由で `danger-checkstyle_format` を実行すると、差分に対してwarningをコメントしてくれる。

イメージとしては、こんな感じ。

https://github.com/noboru-i/SlideViewer/pull/76

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8708/490b9c42-9628-5153-b442-dc796887209e.png)

## 導入手順

基本的には、 [CircleCI 2.0でAndroidのアプリをビルドしつつ、コードレビューBOTも動かす - Qiita](http://qiita.com/noboru_i/items/780abf904568c664712f) で記載した内容のうち、Saddlerに関する部分を、Dangerに書き換えるイメージ。

### 利用するGemのインストール

Gemfileに、下記の依存関係を追加します。

```ruby
gem 'danger'
gem 'danger-checkstyle_format', '~> 0.0.1'
```

`bundle install` を実行し、Gemfile.lockを更新しておきます。

### Dangerfileを作成する

https://github.com/noboru-i/SlideViewer/blob/0680f790273785adfea8c3d5184f59a96b3a8e42/Dangerfile こんな感じのDangerfileを作成する。
最低限必要なのは、下記の3行です。

```ruby
github.dismiss_out_of_range_messages

checkstyle_format.base_path = Dir.pwd
checkstyle_format.report 'app/build/reports/checkstyle/checkstyle.xml'
```

`github.dismiss_out_of_range_messages` については、 https://techblog.recruitjobs.net/development/danger_driven_development を参照してください。

`checkstyle_format.report` の引数は、利用するCheckstyle formatのXMLファイルです。
ただ、基本的にはfileタグのname属性は絶対パスになるようです。
inlineでレビューするときには、リポジトリルートからの相対パスが必要になるため、それを打ち消すために `base_path` の指定が必要となります。
（ https://github.com/noboru-i/danger-checkstyle_format/blob/03de2616687fe7e8c8d93afbb2f72e087e2f1fc3/lib/checkstyle_format/plugin.rb#L36 こんな感じで、置換しています。）

### CircleCIの設定を行う

`.circleci/config.yml` を下記のように修正します。
参考： https://github.com/noboru-i/SlideViewer/pull/75/files#diff-1d37e48f9ceff6d8030570cd36286a61

```yaml
jobs:
  build:
    <<: *defaults
    steps:
      - run:
          name: Check lint
          command: ./gradlew :app:check -x test
      - persist_to_workspace:
          root: ~/code
          paths:
            - .
  check:
    working_directory: ~/code
    docker:
      - image: circleci/ruby:2.4.1
    steps:
      - attach_workspace:
          at: ~/code
... 略
      - run:
          name: Run danger
          command: bundle exec danger
```

いろいろ書いてありますが、メインはRubyのコンテナで `bundle exec danger` をやっている点です。
あとは、その前で `./gradlew :app:check` をすることで、 `app/build/reports/checkstyle/checkstyle.xml` が出力しておき、それを `attache_workspace` などを利用して引き継いでいます。

## 最後に

初めてのDangerプラグインでした。
もし、使ってバグなど発見されましたら、issueやPRしていただけるとうれしいです。 :bowing_man:
flake8を入れるとpyflakesのバージョンが最新じゃなくなるぽい

## 問題
```shell-session
pip install pyflakes
pip install flake8
```
これで `flake8 --version` すると

```shell-session
3.4.1 (mccabe: 0.6.1, pycodestyle: 2.3.1, pyflakes: 1.5.0) CPython 3.6.2 on Darwin
```
となる。最新の`pyflakes`は1.6.0

実際、

```shell-session
root@a0241303ada3:/# pip install pyflakes
Collecting pyflakes
  Downloading pyflakes-1.6.0-py2.py3-none-any.whl (227kB)
    100% |████████████████████████████████| 235kB 1.0MB/s
Installing collected packages: pyflakes
Successfully installed pyflakes-1.6.0
root@a0241303ada3:/# pip install flake8
Collecting flake8
  Downloading flake8-3.4.1-py2.py3-none-any.whl (68kB)
    100% |████████████████████████████████| 71kB 1.0MB/s
Collecting mccabe<0.7.0,>=0.6.0 (from flake8)
  Downloading mccabe-0.6.1-py2.py3-none-any.whl
Collecting pyflakes<1.6.0,>=1.5.0 (from flake8)
  Downloading pyflakes-1.5.0-py2.py3-none-any.whl (225kB)
    100% |████████████████████████████████| 225kB 941kB/s
Collecting pycodestyle<2.4.0,>=2.0.0 (from flake8)
  Downloading pycodestyle-2.3.1-py2.py3-none-any.whl (45kB)
    100% |████████████████████████████████| 51kB 3.1MB/s
Installing collected packages: mccabe, pyflakes, pycodestyle, flake8
  Found existing installation: pyflakes 1.6.0
    Uninstalling pyflakes-1.6.0:
      Successfully uninstalled pyflakes-1.6.0
Successfully installed flake8-3.4.1 mccabe-0.6.1 pycodestyle-2.3.1 pyflakes-1.5.0
```
`flake8`をインストールすると`pyflakes-1.6.0`がアンインストールされてしまう。

## 解決方法
```shell-session
pip install flake8
pip install pyflakes -U
```
`pip install パッケージ -U`
または
`pip install パッケージ --upgrade`
でパッケージをアップデート出来るので、flake8でpyflakesを入れてからupdateする

## なんでこれ見つけたか
CIいじってたときに`pyflakes-1.6.0`で修正されたlintエラーが出ていたからおかしいと思ってた。
ちなみにこれ

```py3
from typing import Optional


class A:
    def __init__(self):
        self.v: Optional[int] = None
```
このとき、`pyflakes-1.5.0`ではOptional使われてないって怒られる。
`pyflakes-1.6.0`では修正されている
Vue.jsとjQueryで行うAjax処理

#はじめに
Vue.jsでAjax処理を実装した時に便利だったので備忘録も兼ねてご紹介です。
初歩的過ぎるからか、Vue.jsの記事でこういった内容のものはあまり見かけませんね。
まだjQuery現役だけどVue.js使ってみようかな、とお考えの方の後押しになれば嬉しい限りです。

さて、今回はjQueryを使用していますが、axiosなどのXHRプラグインに変えても問題はないと思います。むしろ他箇所でjQueryを使っていなければそちらのほうが動作は軽くなります。

後述の説明はVue.js公式サイトの「[基本的な使い方](https://jp.vuejs.org/v2/guide/installation.html "基本的な使い方")」を理解しているという前提で説明しています。
誤って理解している箇所もあるかと思いますが、ご指摘頂けますと助かります。

#コードと使用例
htmlのコードでは簡単なリンクの一覧実装例を記載しています。

```Javascript:app.js
var mixin = {
  ajax:{
    data:{
      error:0, //エラー状態
      loading:true, //通信状態
      result:{} //取得結果格納用
    },
    methods:{
      getData:function(){
        var _this = this;
        _this.loading = true;
        $.ajax({
          url: _this.request.url,
          type: 'POST',
          dataType: 'JSON',
          timeout : 30000,
          data:_this.request.data
        })
        .done(function(response) {
          //結果をresultに格納、各種状態管理用の変数を完了ステータスに変更
          _this.error = 0;
          _this.loading = false;
          _this.result = response;
        })
        .fail(function(error) {
          //通信エラー時の再試行。
          //再試行回数が指定数に達した場合は状態管理用の変数を更新しAjaxを停止
          if(_this.error <= 5){
            _this.error++;
            _this.getData();
          }else{
            _this.error = true;
            _this.loading = false;
          }
        });
      }
    },
    mounted:function(){
      //Ajaxを実行
      this.getData();
    }
  }
}

var app = new Vue({
  el:'#app',
  mixins: [mixin.ajax],
  data:{
    request:{
      url:'//example.com/path/to/api/', //呼び出しurl
      data:{ //リクエストデータ
        date:'2017/12/31'
      }
    }
  }
});
```
```html:app.html
<!-- 実装例 -->
<div id="app" v-cloak>
  <div v-if=“!error”>
    <ul>
      <li v-for="item in result">
        <a :href="item.url">{{ item.text }}</a>
      </li>
    <ul>
  </div>
  <p v-else-if="error">通信エラーが発生しました。しばらく時間をおいてから再度お試しください。</p>
</div>
```


#簡単な解説
要点はソースのコメントに記載しましたのでVue.jsを使った利点について少し書いておきます。

##データバインディング
Vue.jsはdataオブジェクトの全てのプロパティをプロキシしています。そのため、dataオブジェクト内の値が変更された時、それを検知し値が依存している箇所は全て自動で更新されます。
今回のようにdataオブジェクトに通信状態やエラー状態を管理する変数を用意してさえいれば、取得終了時やエラー時の同期処理を簡単に実装することができます。

## テンプレート構文
Vue.jsではHTMLベースのテンプレート構文が使われていますので、html実装例のように記述するだけで直感的に実装が可能です。pugやEJSなどのテンプレートエンジンを利用されてる方は理解しやすいのではないでしょうか。
Ajaxで言えば、今までのようにforで変数にhtmlコードを入れて...という処理が必要なくなりますので、コードの見通しも良くなると思います。

## ミックスイン
今回はVue.jsの便利な機能「[ミックスイン](https://jp.vuejs.org/v2/guide/mixins.html "ミックスイン")」を使っています。これによって、Ajaxの機能が必要なインスタンスで呼び出すだけで使用可能になります。複雑なAjax用の関数を書く必要はありません。
ミックスイン内のメソッドや変数は呼び出されたインスタンスで完結するので、インスタンスの機能拡張に非常に有用です。

## デベロッパーツール
フレームワークそのものには関係しませんが、Chromeの拡張機能である「[Vue.js devtools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=ja "Vue.js devtools")」が非常に便利です。
dataオブジェクトの値や算出プロパティの状態などがひと目で分かるため、コンソールを使った確認作業は一切行いませんでした。

#あとがき
Ajaxを多用する案件で使ってみましたが今までのAjax処理とは比べ物にならないくらい素早く簡潔に進められました。もう取得結果をforで回して変数に入れてから出力なんて実装方法には戻りたくありません（笑）

書いていて気づきましたが、Vuexを使えば状態管理はもっと楽になるかもしれません。自分はまだVuex周りの知見を深められていないので勉強あるのみですね。

「フレームワークの導入」と聞くと身構えてしまう方も中にはいらっしゃると思いますが、このくらいの使い方でも十分に力を発揮してくれると思います。使ってみたいなと思った方はどんどん使ってみましょう！
sitemap xmlを作る

## 概要
sitemap xmlの作り方です

## オンラインでsitemap xmlを作成
SEOに大切と言われているsitemap xml。
オンライン上でsitemap xmlを作ります。

### sitemap.xml Editor
サイトマップを作成-自動生成ツール「sitemap.xml Editor」
http://www.sitemapxml.jp/

- URLの制限あり（1,000まで）
- priorityを記載するかどうか選べます

### Xml-Sitemaps.com
Sitemap is being created now - Free Online Google Sitemap Generator
https://www.xml-sitemaps.com/

- URLの制限あり（500まで）
- 細かい設定が可能

### FC2サイトマップ
FC2によるsitemap.xml作成ツール
https://seo.fc2.com/sitemap/

- URLがアルファベット順にきちんとならびます
- ワンクリックで簡単に作成できます
- priorityが入ります


## まとめ
サイトにより生成されるファイルに特定があります。
適時好みのものを選択してください。

## おそらく役立つ情報 
痒いところに手が届くかもしれない記事を書いています。
フォローしてくれるとやる気になります！

- Qiita　プログラミングに関する情報はこちら
http://qiita.com/nadonado


- Twitter　日々のつぶやきはこちら
https://twitter.com/hironado
[Git] 特定の行がいつ削除されたのか知りたい

## やりたいこと
Git 上で管理しているコードで特定の行が消えていることがわかった。
行が消えてしまった時点以降に作成されたデータを精査したいので、いつ削除されたのか知りたい。

## やり方
以下のコマンドを実行して、探していたコミットを見つけたら後はコミット番号を使って煮るなり焼くなり。

```shell-session
$ git log -p -S '削除されたコード' app/models/hogehoge.rb
commit 52e41af01XXXX3694654XXXX2750e59eXXXXa0d5
Author: Henko Shitahito <henko.shitahito@gmail.com>
Date:   Wed Mar 8 11:10:31 2017 +0900

    :sparkles: hogehoge

diff --git a/app/models/hogehoge.rb b/app/models/hogehoge.rb
index a3d6XXX..609fXXX 100000
--- a/app/models/hogehoge.rb
+++ b/app/models/hogehoge.rb
@@ -78,18 +78,7 @@ class Hogehoge
       
-      # 削除されたコード
+      # 代わりに追加されたコード


commit XXXX...
```

### コマンドの意味
`git log` : 変更履歴を表示
`-p` : 各コミットの diff を表示
`-S '文字列'` : diffの内容を検索

最後のファイル名は不明な場合はなくても可

## 参考
[git logでコミットの差分の中身で絞り込む](http://qiita.com/yuichielectric/items/cce64b5b5e0eacc02e64)
[Gitで行が削除されたコミット番号を知る方法](https://ja.stackoverflow.com/questions/21361/git%E3%81%A7%E8%A1%8C%E3%81%8C%E5%89%8A%E9%99%A4%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E7%95%AA%E5%8F%B7%E3%82%92%E7%9F%A5%E3%82%8B%E6%96%B9%E6%B3%95)
SquareのPOSレジアプリで利用できる決済方法について

SquareのPOSレジAPIを使った際に指定できる決済方法としては以下があります。

|値|内容|
|---|---|
|CREDIT_CARD|クレジットカード|
|CASH|現金|
|OTHER|その他|
|SQUARE_GIFT_CARD|ギフトカード|
|CARD_ON_FILE|カード情報を記録|

この中で説明が必要そうなのは CARD_ON_FILE と OTHER 、SQUARE_GIFT_CARD になるでしょう。

CARD_ON_FILEはクレジットカード情報をオンラインに残しておき、繰り返し呼び出せる機能になります。常連さん向けなど、毎回カードを読み込ませることなく決済ができるようになります。

OTHERでは取り扱い外のクレジットカードやデビットカード、ギフトカードであったり電子マネーといった決済を指定します。基本的にPOSレジアプリ外でお金を受け取る形になります。

SQUARE_GIFT_CARDはSquareの提供するギフトカードになります。1枚あたり120円から制作できるカードで、プロモーションであったり友人を紹介してもらうために使ったりします。チャージもできるので再訪問を促すのにも便利です。

[Square ギフトカード - 自店のプリペイドカードを発行](https://squareup.com/jp/gift-cards)

## 手数料がかかるのはクレジットカードだけ

この中でSquareとして手数料をもらうのはクレジットカード決済およびギフトカードになります。他の決済手段の場合はカード以外の方法でお金を受け取る形になりますので、手数料がかかったりすることはありません。

ギフトカードについてはカード作成費用はかかりますが、クレジットカードでチャージした際に決済手数料がかかる形になります（つまり支払時には手数料はかかりません）。

[Square Connect API Documentation](https://docs.connect.squareup.com/articles/web-api-ios)
Python with Go

何番煎じかわからないが、Golangで書いたパッケージをPython(多言語)から利用

##1.構成

Python : 2.7
Golang : 1.7
OS     : CentOS release 6.8
Memory :  2048MB
CPU    :  3core 

PythonLibrary
[ctypes](https://docs.python.jp/3/library/ctypes.html)

##2. 準備


```fib.go
package main

import "C"

//export fib
func fib(n uint) uint {
    if n <= 1 {
        return n
    }
    return fib(n-1) + fib(n-2)
}

func main() {}
```

build
```
go build -o fib.so  -buildmode=c-shared fib.go
```

```fib_go.py
from ctypes import *

lib = cdll.LoadLibrary("./fib.so")

## arg
lib.fib.argtypes = [c_longlong]
## return
lib.fib.restype = c_longlong
print "fib  %d" % lib.fib(40)

```

```fib.py
#!/usr/bin/env python

def fib(n):
    if n <= 1:
        return n
    else:
        return fib(n-1) + fib(n-2)

print(fib(40))

```

##3.計測

fib_go.py

```
#time python fib_go.py
fib  102334155

real	0m1.171s
user	0m1.105s
sys	0m0.071s
```

fib.py

```
#time python fib_go.py
102334155

real	0m46.598s
user	0m46.449s
sys	0m0.030s
```
Gitを使うためのクライアント


#Gitのクライアント
GitをWindowsで利用するためには、以下をインストールすると便利です。
- TortoiseGit（Gitクライアント）
- TortoiseGitの日本語用ランゲージパック

#TortoiseGitのインストール

https://tortoisegit.org/download/ から必要なインストーラーを入手してインストールする。

#日本語ランゲージパック
同じインストーラーを入手したサイトの「Language Packs」の表から、日本語「Japanese」を選択し、ダウンロード、インストールする。
Webページから画像を取得し、リサイズを行う

今回、自分のメモ用に記載しています。
もし、参考になるのであれば皆さんも使用してみてください。

今回使用するソースコードは、[「TomoProgの技術書」](http://tomoprog.hatenablog.com/entry/2016/02/13/024004)と[「Python, Pillowを使って画像を一括でリサイズ（拡大・縮小）する方法」](https://www.outoutput.com/programming/python-pil-pillow-image-resize/)を参考にさせていただきました。
より詳しい解説は、上記Webページに記載してありますのでご確認ください。

では、私が使用した環境と使用した感想を記載していきます。


#開発環境
windows7
python 3.5
pycharm

#画像取得のソースコード
```
import urllib.request
import bs4

# 取得したいwebページのURL
url = "https://www.google.co.jp/"
request = urllib.request.urlopen(url)
html = request.read()

# 文字コードのリストを作成
encoding_list = ["cp932", "utf-8", "utf_8", "euc_jp",
                 "euc_jis_2004", "euc_jisx0213", "shift_jis",
                 "shift_jis_2004", "shift_jisx0213", "iso2022jp",
                 "iso2022_jp_1", "iso2022_jp_2", "iso2022_jp_3",
                 "iso2022_jp_ext", "latin_1", "ascii"]

for enc in encoding_list:
    try:
        html.decode(enc)
        break
    except:
        enc = None

resources = []

# BeautifulSoupオブジェクトを作成
soup = bs4.BeautifulSoup(html)

# htmlのすべてのimgタグの中のsrc属性の内容を取得
for img_tag in soup.find_all("img"):
    src_str = img_tag.get("src")
    resources.append(src_str)

# srcの内容を表示
array_jpg = []
for resource in resources:
    array_jpg.append(resource)

# 画像ファイルのURLを開く
# （urlに画像ファイルのURLを指定）
count = 0
for number in range(0, len(array_jpg)):
    request = urllib.request.urlopen(array_jpg[number])

    # ファイルをバイナリモードで開き、URLの内容を書き込み
    # ファイル名は連番(例：0.jpg/1.jpg/......)
    f = open("%d.jpg" % (count), "wb")
    f.write(request.read())

    # ファイルを閉じる
    f.close()
    count += 1
```

#画像リサイズのソースコード
```
#coding:utf-8

from PIL import Image
import os

input_path = "C:\\Users\\画像"
output_path = "C:\\Users\\画像_480x300"

# 画像フォルダの中のファイル名取得
list_input_path = os.listdir(input_path)

for number in range(0, len(list_input_path)):
    # 画像ファイルを開く
    img = Image.open(input_path + "/" + list_input_path[number], 'r')

    # img.resize((480, 300), Image.LANCZOS)は、リサイズするサイズの設定、フィルタの設定
    img_resize_lanczos = img.resize((480, 300), Image.LANCZOS)
    img_resize_lanczos = img_resize_lanczos.convert("RGB")
    # リサイズした画像の保存
    img_resize_lanczos.save(output_path + "/" + list_input_path[number], quality = 100)
```

# 使用してみての感想
上記webサイトでは、解説が丁寧に書かれており重複で調べることなどは無かったです。
とても良くまとめられているサイトでした。

皆さんも、機械学習をやってみたいと思ったときに、何かしらのデータが必要になると思います。
そんな時、こういった知識があれば、すぐデータが集められ、機械学習に取り掛かる事ができます。
私もこのソースコードを使って多くの画像を集めましたので、機械学習に利用していきたいと思います。
画像の著作権等は気をつけてくださいね。
【イベントレポ】20170831_エンジニア女子イベントなるものに初めて参加してみた


## はじめに
いつまでもひよっこでダメ社会人、でも実は中堅社員のワタクシですがさすがにイベント情報を提供するだけじゃつまらないと思い、重い腰を上げてイベント(今回はLT大会)に一般参加者として参加してきました。

ただのメモなのであまりまとまりはない上、久しぶりの飲酒(お酒は非常に弱いほう)だったのでところどころメモれてないです。

## イベント概要
タイトル：夏ダっ!! 祭りダっ!!TECH PLAY女子部LT大会♡
 https://techplay.jp/event/627251
日時：2017/08/31 19:30-
形式：LT大会(+懇親会)
ハッシュタグ：#techplaygirls

## 会場の様子
※画像がデカくてごめんなさい

![IMG_2070.jpg](https://qiita-image-store.s3.amazonaws.com/0/186166/aa32d11b-5239-031c-b6cf-bcff00082442.jpeg)
会場がすごくきれい。

![IMG_2072.jpg](https://qiita-image-store.s3.amazonaws.com/0/186166/ef88b56a-60ef-265a-0e60-2072276877d9.jpeg)
お水もかわいい。ICEBOX入りの氷結（これがお酒だった

![IMG_2074.jpg](https://qiita-image-store.s3.amazonaws.com/0/186166/7a95cd6e-d28d-e96a-5ad5-efa71daf3f4b.jpeg)
懇親会の様子。サンドイッチをモグモグ

## LTメモ
#### 1.	めるさん : 2人目のエンジニアとしてベンチャーに入社してやったこと・感じたこと
Railsをマスターした後、サイト改善に貢献、pvやcv(応募)の向上に貢献

#### 2. しいなさん(しーちゃんさん) : 社内勉強会の立ち上げから、見えてきたこと
サーバサイドプログラマ。PHP、Ruby
休みの日にやる。意識のたかそうな社内エンジニアを勧誘した。
経費をGETした、理解のない上司を説得するのが大変

#### 3. まいどるさん： 脆弱な開発体制で少しでもリスクを減らす方法
半年でリーダーになってしまい、新人率の高い億単位のプログラム
大炎上、リリース直前にログがでてないことが発覚
→技術のあるエンジニアに管理をさせない
マネジメント体制は必要

#### 4. いしやすさん：フリーランスって何がおいしいの？
コワーキングスペース 神楽坂クロススタジオ
最初の仕事の見つけ方
→最初は常駐、そして人脈もいらない
フリーランス用のエージェントがいる
派遣とフリーランスだとだいぶ仲介料が違う
次に、週3程度のエージェントで掛け持ちをして、ゆくゆくはエージェント介さずに人脈で仕事をGET
エージェントより仕事の内容
初月から支払いが遅れたエージェントや手数料30%のところもあるので注意
技術者経歴書の充実
国保は高い→日本IT教育研修機構、という保険がある

#### 5. たんたんさん： 開発の見積もり・スケジュール管理
iOSエンジニア、バイトルというアプリをリリース
見積もりとは？→全タスクと工数を洗い出すこと
プランニングポーカー:ポイントで工数を出し合うゲーム
→agile開発でよく使われる
人間的心理:
パーキンソンの法則、学生症候群、作業が完了しても報告しない、マルチタスク
CCPM 50%の確率で完了するスケジュールを引く

#### 6. 吉澤和香奈さん ：妊娠子育て中にReact動画コースをUdemyで公開するまで
エンジニアであれば、オフィスに行かなくても動画作成などでマネタイズ手段がある
動画はノイズ除去などの編集が必要な場合がある

## 感想
- 思った以上にいろいろな立場・会社の方々が参加されており、知らない世界ばかりで勉強になった
- Mac Book率多くてクラクラした
    (過去のイベント写真からなんとなくそんな気がしたので私はiPadを持ち込みひそかに抵抗していた…苦笑)
- 自己紹介緊張した
- Rubyや○○.js系の方が多く感じた
- フリーランスさんや社長さんもいてすごかった
- 女性の集まりってやっぱり素敵、皆さまキラキラしてる
- 面白かったのでまた参加したい
[Fusion360]休憩時間にfusion360と遊ぶ その2。

休憩時間しか、360いじる時間がないですが、
fusion360本当に簡単で凄いと思います。
どんどん楽しくなってます。

今日はConstruct機能とmodifyを使ってプロセッサーを中に含むケース（箱）を作ってみました。

![fusion.JPG](https://qiita-image-store.s3.amazonaws.com/0/137182/14b04f82-7a3f-98f0-05f5-560ea11371e9.jpeg)


- STL、共有も簡単。。

http://a360.co/2enwQsf
カレントディレクトリにあるテキストファイルの、冒頭、末尾をそれぞれ指定行数だけ表示する

次のようなファイルがある時

```
$ cat 1.txt
1-1
1-2
1-3
1-4
1-5
1-6
1-7
1-8
1-9
$ cat 2.txt
2-1
2-2
2-3
2-4
2-5
2-6
2-7
2-8
2-9
$ cat 3.txt
3-1
3-2
3-3
3-4
3-5
3-6
3-7
3-8
3-9
```

次のコマンドで、各ファイルの冒頭と末尾の指定行数を表示させる

```
$ find ./* -type f | xargs -I{} sh -c "(echo -e '{}\n-'; head -2; echo -e '---'; tail -2;echo -e '---------\n---------') < {}"
./1.txt
-
1-1
1-2
---
1-8
1-9
---------
---------
./2.txt
-
2-1
2-2
---
2-8
2-9
---------
---------
./3.txt
-
3-1
3-2
---
3-8
3-9
---------
---------
```

## 参考記事
[find 結果それぞれにパイプ・リダイレクトを含むコマンドを適用する](http://qiita.com/janus_wel/items/027f5a926d9def177df4)
[Linux > Link > head / tail > (head; tail) < file.txt > 先頭と最後を同時表示](http://qiita.com/7of9/items/278fddf6d576eedc3d95)
CakePHP3で年月日選択のプルダウンのoptionをゼロ埋め表示させる

# はじめに
CakePHP3のFormHelper::date()で年月日を選択させるプルダウンを作ろうとして
月や日をゼロ埋めさせる方法でちょっとはまったのでメモ。

# 結論
date()に渡すoptionsでmonthやdayのところにleadingZeroValueをtrueで渡せばいけた。

```php:sample.ctp
<?php echo $this->Form->date("dateSelection", [
        'monthNames' => false,
        'year'       => [
                            'start' => 1970,
                            'end'   => 2030,
                        ],
        'month'      => [
                            'leadingZeroValue' => true
                        ],
        'day'        => [
                            'leadingZeroValue' => true
                        ]
    ]); ?>
```

# 理由
DateTimeWidget::_generateNumbers()でこの値がtrueなら2桁ゼロ埋めするように書いてあった。

```php:DateTimeWidget.php
    protected function _generateNumbers($start, $end, $options = [])
    {
        $options += [
            'leadingZeroKey' => true,
            'leadingZeroValue' => true,
            'interval' => 1
        ];

        $numbers = [];
        $i = $start;
        while ($i <= $end) {
            $key = (string)$i;
            $value = (string)$i;
            if ($options['leadingZeroKey'] === true) {
                $key = sprintf('%02d', $key);
            }
            if ($options['leadingZeroValue'] === true) {
                $value = sprintf('%02d', $value);
            }
            $numbers[$key] = $value;
            $i += $options['interval'];
        }

        return $numbers;
    }
```

インターバルとかもセットできるのね。
root権限なしでCaboChaをインストールする．

root権限がない状況でCaboCha[^1]をインストールする方法です．Cabochaをインストールするためには

- CRF++ (0.55以降)[^2]
- MeCab (0.993以降)[^3]

が必要なので事前に併せてインストールしています．

## 検証環境

- Ubuntu 16.04.3 LTS

## インストール場所の作成

CRF++,MeCab,CaboChaをインストールするための場所を`~/usr`に作ります．

```bash
echo "export PATH=$HOME/usr/bin:$PATH" >> ~/.bashrc
echo "export LD_LIBRARY_PATH=${HOME}/usr/lib" >> ~/.bashrc
source ~/.bashrc
mkdir $HOME/usr
```

## CRF++のインストール

```bash
wget 'https://docs.google.com/uc?export=download&id=0B4y35FiV1wh7QVR6VXJ5dWExSTQ' -O CRF++-0.58.tar.gz
tar xf CRF++-0.58.tar.gz
cd CRF++-0.58/
./configure --prefix=$HOME/usr
make
make install
```

## MeCabのインストール

```bash
git clone https://github.com/taku910/mecab.git
cd mecab/mecab
./configure --prefix=$HOME/usr --with-charset=UTF8 
make
make install
```

### IPA辞書のダウンロード

```bash
wget 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM' -O mecab-ipadic-2.7.0-20070801.tar.gz
tar xvzf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801/
./configure --with-mecab-config=$HOME/usr/bin/mecab-config --with-charset=UTF8 --prefix=$HOME/usr 
make
make install
```

### 動作確認

```bash
$ echo "すもももももももものうち" | ~/usr/bin/mecab
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
```


## CaboChaのインストール

cabocha-0.69.tar.bz2をダウンロードします．最新版をダウンロードしたい場合は下記から探してください．

https://drive.google.com/drive/u/1/folders/0B4y35FiV1wh7cGRCUUJHVTNJRnM

```bash
curl -sc /tmp/gcokie "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7SDd1Q1dUQkZQaUU" > /dev/null
getcode="$(awk '/_warning_/ {print $NF}' /tmp/gcokie)"  
curl -Lb /tmp/gcokie "https://drive.google.com/uc?export=download&confirm=${getcode}&id=0B4y35FiV1wh7SDd1Q1dUQkZQaUU" -o cabocha-0.69.tar.bz2
tar xvf cabocha-0.69.tar.bz2
cd cabocha-0.69
export LDFLAGS="-L$HOME/usr/lib"
export CPPFLAGS="-I$HOME/usr/include"
./configure --with-mecab-config=$HOME/usr/bin/mecab-config --with-charset=UTF8 --prefix=$HOME/usr
make
make install
cd python
python setup.py build
python setup.py --user install
```

### 動作確認

```bash
$ echo "貴社の記者が汽車で帰社した" | cabocha
  貴社の-D    
    記者が---D
      汽車で-D
      帰社した
EOS
```

## References

[^1]: Kudo et al., [CaboCha/南瓜: Yet Another Japanese Dependency Structure Analyzer](https://taku910.github.io/cabocha/)
[^2]: Kudo, [CRF++: Yet Another CRF toolkit](https://taku910.github.io/crfpp/), 2005.
[^3]: Kudo et al., [MeCab: Yet Another Part-of-Speech and Morphological Analyzer](http://taku910.github.io/mecab)
GeneOntrogyのchild termをすべて取得する

Amigoの標準ブラウザでは、なぜか、特定termのChild termを全部取ってくるということができなかった。
そういうときはgooseをつかって直接sqlセレクト文と叩いて取ってくることができる
gooseのページ
http://amigo.geneontology.org/goose
構文例集
http://wiki.geneontology.org/index.php/Example_LEAD_Queries

けど、sqlにはあんま慣れてないのでできればpythonに直で流したい
そこでpythonをつかってGoSqlに入って、データを取ってくるスクリプトを作ったのでメモっとく。

以下のサイトを参考にした
https://biology.stackexchange.com/questions/35188/how-do-i-find-the-number-of-child-terms-associated-with-a-specific-go-term

https://www.biostars.org/p/72936/



```python:go_child_get_mysql.py

# -*- coding: utf-8 -*-
import MySQLdb

# DBに接続しカーソルを取得する
connect = MySQLdb.connect(host='mysql-amigo.ebi.ac.uk', port=4085, user='go_select', passwd='amigo' , db='go_latest', charset='utf8')
cursor = connect.cursor()


sql = (
    'SELECT DISTINCT descendant.acc, descendant.name, descendant.term_type '
    'FROM'
    ' term'
    ' INNER JOIN graph_path ON (term.id=graph_path.term1_id)'
    ' INNER JOIN term AS descendant ON (descendant.id=graph_path.term2_id) '
    "WHERE term.name='nucleus' AND distance <> 0;"
#IDで調べるときはterm.acc='GO:0015979'など
)

cursor.execute(sql)  # select文を実行

for row in cursor:
    print row[0], row[1]
    
cursor.close()
connect.close()
```
simple_form memo1

# SimpleForm::ActionViewExtensions::FormHelper

## with_simple_form_field_error_proc

```rb
        default_field_error_proc = ::ActionView::Base.field_error_proc
        begin
          ::ActionView::Base.field_error_proc = SimpleForm.field_error_proc
          yield
        ensure
          ::ActionView::Base.field_error_proc = default_field_error_proc
        end
```

When the yield method is commented out, it will not be rendered.

## simple_form_for

```rb
...
...
        with_simple_form_field_error_proc do
          form_for(record, options, &block)
        end
```
When the form_for method is commented out, not be rendered.

simple_form_for is the form_for wrapper of ActionView::Helpers:: FormHelper.

### definition of form_for
https://github.com/rails/rails/blob/5.1.3/actionview/lib/action_view/helpers/form_helper.rb#L428

---
```
    # Example:
    #
    #   simple_form_for @user do |f|
    #     f.input :name, hint: 'My hint'
    #   end
```

The class of f, that is block variable ( not block argument, Proc argument) , is SimpleForm::FormBuilder.
@user class in Example is the same as f.object.

## SimpleForm::FormBuilder
pry ls

```
ActiveSupport::ToJsonWithActiveSupportEncoder#methods: to_json
ActionView::ModelNaming#methods: convert_to_model  model_name_from_record_or_class
SimpleForm::ActionViewExtensions::Builder#methods: simple_fields_for
ActionView::Helpers::FormBuilder#methods: 
  check_box             emitted_hidden_id?         month_field     phone_field      time_select     
  collection_select     field_helpers              multipart       radio_button     time_zone_select
  color_field           field_helpers=             multipart=      range_field      to_model        
  country_select        field_helpers?             multipart?      search_field     to_partial_path 
  date_field            fields                     number_field    select           url_field       
  date_select           fields_for                 object=         submit           week_field      
  datetime_field        file_field                 object_name=    telephone_field
  datetime_local_field  grouped_collection_select  options         text_area      
  datetime_select       hidden_field               options=        text_field     
  email_field           index                      password_field  time_field     
SimpleForm::FormBuilder#methods: 
  association    collection_check_boxes    full_error   label               mappings=    template
  attribute      collection_radio_buttons  hint         lookup_action       mappings?    wrapper 
  button         error                     input        lookup_model_names  object     
  button_button  error_notification        input_field  mappings            object_name
self.methods: __pry__
instance variables: 
  @default_options  @index      @nested_child_index  @object_name  @template
  @defaults         @multipart  @object              @options      @wrapper 
locals: _  __  _dir_  _ex_  _file_  _in_  _out_  _pry_
```

### hint
`f.hint('My hint')` -> `"<p class=\"help-block\">My hint</p>"`
realm マイグレーション

データベースを使ってる場合、時間が経つにつれ、データモデルは変更されていくものです。
Realmでのデータモデルは、インターフェースに変更を加えるだけで、データモデルを変えられます。 
例えば、以下のMyticketEntityモデルについて考えてみてください。
Personクラスについて、以前に異なる2つのスキーマバージョンをとっていた場合を考えてみましょう。 

```objc
// v0
@interface MyticketEntity : RLMObject
@property NSString *firstName;
@property NSString *lastName;
@property int age;
@end
 
// v1
@interface MyticketEntity : RLMObject
@property NSString *fullName; // 追加したプロパティ(v0　→ v1のときにfirstNameとlastNameを結合した)
@property int age;
@end
 
// v2
@interface MyticketEntity : RLMObject
@property NSString *fullName;
@property NSString *email;   // 追加したプロパティ
@property int age;
@end
 
TBDatabaseManager.m
RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
//キーチェーンから復号キーを取得
NSData *keyData = [[LUKeychainAccess standardKeychainAccess] dataForKey:@"Encryption"];
  
// 暗号化されたRealmファイルを開きます
config.encryptionKey = keyData;
//現在のスキーマバージョンは2
config.schemaVersion = 2;
　
//マイグレーションブロック
config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
  // enumerateObjects:block:メソッドで保存されているすべてのMyticketEntityオブジェクトを列挙します
  [migration enumerateObjects:MyticketEntity.className
                        block:^(RLMObject *oldObject, RLMObject *newObject) {
    // スキーマバージョンが0のときだけ、'fullName'プロパティを追加します
    if (oldSchemaVersion < 1) {
      newObject[@"fullName"] = [NSString stringWithFormat:@"%@ %@",
                                oldObject[@"firstName"],
                                oldObject[@"lastName"]];
    }
 
    // スキーマバージョンが0または1のとき、'email'プロパティを追加します
    //初期値の設定も可能だが、はじめは何もないはずなので空とする
    if (oldSchemaVersion < 2) {
      newObject[@"email"] = @"";
    }
  }];
};
[RLMRealmConfiguration setDefaultConfiguration:config];
 
// スキーマバージョンを更新して、マイグレーションブロックを追加したので、
// 古いスキーマバージョンのRealmを開こうとすると
// Realmは自動的にマイグレーションを実行し、成功したらRealmを開きます。
RLMRealm *realm = [[TBDatabaseManager manager] getEncryptedRealmDb];
```
電子工作 > D-sub 25ピン(DB25)コネクタからユニバーサル基板へ接続する方法

個人用にD-sub25ピン(以下DB25)で接続する基板の実装を検討している。

ひっかかっている点はDB25がユニバーサル基板にそのまま半田付けできないこと ([端子が二段で上下がずれている](http://www.aim-ele.co.jp/tech/metal-tech2/)ため)。


どういう方法でユニバーサル基板に接続できるか。
以下のような方法がありそうだ。

- 変換基板を購入
    - @ サンハヤト CK-12
        - http://eleshop.jp/shop/g/gE8PV22/
        - [CK-12 @ Sunhayato](http://www.sunhayato.co.jp/material2/index.php/item?cell003=%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E5%A4%89%E6%8F%9B%E5%9F%BA%E6%9D%BF%E8%A3%BD%E5%93%81&cell004=%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E5%A4%89%E6%8F%9B%E5%9F%BA%E6%9D%BF&name=D-Sub%E7%94%A8%E5%9F%BA%E6%9D%BF%E3%80%80CK-11&id=466&label=1)
        - 二枚入り 750円
    - @ aitendo
        - [ユニバーサル基板（100×71） [UPCB-H100W71T015S]](http://www.aitendo.com/product/2246)
        - 200円(税別)
- ピンを折り曲げる
    - [DSUBコネクタをユニバーサル基板に取り付ける @ やねうらおさん](http://d.hatena.ne.jp/yaneurao/20080701)
    - DB25の場合は12本を曲げる。。。
- ケーブルを圧着して、ケーブル反対側をストレートピンヘッダなどで接続
    - コネクタ部分の固定をどうするか
- ユニバーサル基板をDB25コネクタに挟む
    - [(別室)MSP430で遊ぼう](http://picpage.art.coocan.jp/MSP430.htm)
    - 片面基板だと上段と下段の導通を回避できる?
    - コネクタの固定具合はどうだろうか?
    
## 実装してみた
(追記 2017/09/02)

以下の方法を実施してみた。
> ユニバーサル基板をDB25コネクタに挟む

- [ICB-88](http://www.sunhayato.co.jp/material2/index.php/item?cell003=%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E5%9F%BA%E6%9D%BF%E8%A3%BD%E5%93%81&cell004=%E5%B0%8F%E5%9E%8B%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E5%9F%BA%E6%9D%BF&name=%E5%B0%8F%E5%9E%8B%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E5%9F%BA%E6%9D%BF+ICB-88&id=605&label=1) : 片面基板
- 100m巻 ジュンフロン ETFE電線 AWG28 (赤)

コネクタ端子とジュンフロン線（の芯線のみ）を部品面にハンダ付けした。線の反対をハンダ面まで出し、ハンダ付けした。

部品面
![IMG_20170901_220409.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/d32470f0-5fe7-0552-ba7a-565a413e2107.jpeg)

ハンダ面
![DSC_0259.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/384f8d5f-56b4-45bd-92f4-e3e818e83f77.jpeg)

上段と下段の端子が離れて扱いやすそう。
コネクタ部分は、軽く引っ張ったくらいでは取れない程度の強度にはなっている。