OmniAICreator/Qiita-1.07M huggingface dataset:
djangoプロジェクト開発環境構築

#前提
Pythonインストール済み
#環境構築
任意のディレクトリでコマンド実行

```
$ pip install virtualenv
$ virtualenv 任意名
```

任意名のディレクトリが出来ていたら成功
##virtualenvの起動

```
$ source 任意名パス/任意名ファイル/bin/activate
(任意名) $
```

※virtualenvを抜けたい時

```
$ deactivate
```

##djangoインストール

```
$ pip install django
```

バージョンを指定したい場合(数字部分を任意)

```
$ pip install django==1.9.5
```

djangoがインストールされているか確認するため、
現在インストールされているパッケージを表示

```
$ pip freeze
appdirs==1.4.0
Django==1.10.5
packaging==16.8
pyparsing==2.1.10
six==1.10.0
```

##djangoプロジェクト作成

virtualenvのディレクトリとは別にプロジェクト用のディレクトリ作成

```
$ django-admin startproject プロジェクト名
```

プロジェクト名ディレクトリに移動後、サーバ起動

```
$ python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

February 02, 2017 - 08:53:44
Django version 1.10.5, using settings 'fiverr.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

DBがまだ無いため、１部赤文字になっている箇所があります。
サーバ起動には問題ないため、以下のURLをクリックしてみてください。
[http://127.0.0.1:8000/](http://127.0.0.1:8000/)もしくは[http://localhost:8000](http://localhost:8000)

もし、8000番ポートが使われていてエラーが出る場合には、ポート番号を指定してサーバを起動してください

```
$ python manage.py runserver 8080
```

以下の画面が出ればdjangoプロジェクトの作成の完了です

![9f1a4e9273cba4b698572cb4aa998656.png](https://qiita-image-store.s3.amazonaws.com/0/145448/57a70f83-8711-235c-3d2d-a9092e30c152.png)
Let's Encryptで発行した証明書をRemote Desktopの証明書にも割り当ててみる

Let's Encrypt で IIS に証明書を割り当てる試験をしていて、ふと思った。これを Remote Desktop 接続の証明書にも使えないかと。

そしてやってみたら、一応できたっぽい。

# 手作業でやる方法

手作業でやる場合は、基本的には下記URLの内容のとおりです。
http://www.atmarkit.co.jp/ait/articles/1309/20/news036.html

Let's Encrypt で発行された証明書は下記のようなパスに [FQDNホスト名]-all.pfx という名前で保存されていましたので、これを個人の証明書ストアにインポートした上で、それを上記URLの「PowerShellで証明書を割り当てる方法」の通りに処理すればOKです。

```
C:\Users\Administrator\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org\
```

# もうちょっと自動化したい

こちらのURLに出ている手順を参考にすれば、もうちょっと自動化できそうです。
http://blog.engineer-memo.com/2016/08/19/remote-desktop-%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E5%90%8C%E4%B8%80%E3%81%AE%E6%8B%87%E5%8D%B0%E3%81%A7%E9%87%8D%E8%A4%87%E3%82%A4%E3%83%B3%E3%83%9D/

ただし Let's Encrypt の証明書発行処理で生成された pfx ファイルはパスワードがありません。このためにこのまま実行するとエラーになってしまうようです。

そこで手順を少し弄ってエラーが出ない状態にしたのが下記の内容です。$certpath には実際に使用する証明書のフルパスを記述します。

```ps1
$certpath = "C:\Users\Administrator\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org\[FQDNホスト名]-all.pfx"
$certpass = ""
 
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $certpath, $certpass, ([System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::DefaultKeySet)
 
if((Get-ChildItem Cert:\LocalMachine\My).Thumbprint -notcontains $cert.Thumbprint){
    Write-host "Cert Import"
    Import-PfxCertificate -CertStoreLocation "cert:\LocalMachine\My" -FilePath $certpath
}
 
if((Get-ItemProperty 'registry::\HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp').SSLCertificateSHA1Hash -ne $null){
    Remove-ItemProperty "registry::\HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name SSLCertificateSHA1Hash
}
$path = (Get-WmiObject -class "Win32_TSGeneralSetting" -Namespace root\cimv2\terminalservices -Filter "TerminalName='RDP-tcp'").__path 
Set-WmiInstance -Path $path -argument @{SSLCertificateSHA1Hash="$($cert.Thumbprint)"}
 
$cert.Dispose()
```

これで Remote Desktop 向けの証明書割り当てが概ね自動化できそうです。

# 注意点
この手順通りに作業を行うと、cert:\LocalMachine\My にも Let's Encrypt の証明書がインポートされますが、これは削除してはダメです。削除するとリモートデスクトップサービスから証明書を参照できなくなるからです。こうなると残念ながらリモートデスクトップ接続で無効な証明書のワーニングが出る状態に戻ってしまいます。
SPAPI ConditionNoteを変更する

## リメイクしました
MWS用の記事だったのですが、時は経ちMWSはもう.....
SPAPIでも全く同じなので、タイトルとタグとリンク先を変更しました。

## ConditionNoteてどれ？
![20161202102208.png](https://qiita-image-store.s3.amazonaws.com/0/147005/5925837d-c29a-000e-fe80-829b2523f14e.png)
ここのこと
商品の状態とか仕入れの状態とかカテゴリーとかによって変えたい時があるよね:star:

## どのオペレーションを使う？

**オペレーション**：[createFeedDocument](https://developer-docs.amazon.com/sp-api/docs/feeds-api-v2021-06-30-reference#createfeeddocument)
**FeedType**：商品フィード（[_POST_PRODUCT_DATA_](http://docs.developer.amazonservices.com/ja_JP/feeds/Feeds_FeedType.html)）

## サブミットサンプル

```xml:updateConditionNote.xml
<?xml version="1.0" encoding="utf-8"?>
<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
  <Header>
    <DocumentVersion>1.01</DocumentVersion>
    <MerchantIdentifier>[authToken]</MerchantIdentifier>
  </Header>
  <MessageType>[Product]</MessageType>
  <Message>
    <MessageID>[1]</MessageID>
    <OperationType>Update</OperationType>
    <Product>
      <SKU>[指定するSKU]</SKU>
      <Condition>
        <ConditionType>[New]</ConditionType>
        <ConditionNote>[コンディションノート]</ConditionNote>
      </Condition>
    </Product>
  </Message>
</AmazonEnvelope>
```

## 所感
[リファレンス](https://images-na.ssl-images-amazon.com/images/G/01/rainier/help/xsd/release_4_1/Product.xsd)に

```xml
<xsd:element name="Condition" type="ConditionInfo" minOccurs="0"/>
```
これだけしか書いてないからConditionの中にConditionTypeとかConditionNoteとか指定できるって気づかんかったんや...
[Xcode][エラー]Error ITMS-90168: “The binary you uploaded was invalid.”

#Error ITMS-90168: “The binary you uploaded was invalid.”

iTunes Connectにビルドしたアプリをアップロードする時に、Macにインストールされた　「Application Loader」　よりipaファイルをアップロードする必要があります。

その際、「Error ITMS-90168: “The binary you uploaded was invalid.”」というエラーで　アップロードができない症状がありました。
かなりリリース時大変な思いをしました。

対処方法を記載していきます。

##原因
iTunes Connect経由でダウンロードした 「Application Loader」 はバージョンが低くてipaファイルをアップロードできなくなったそうです。

バージョンを確認してみると、iTunes Connectのリンクからダウンロードできる　「Application Loader」　はバージョン「3.0」。Xcode版は「3.6」でした。

---
手順：「Application Loader　の アプリバージョン を調べる」
1.「Application Loader」をFinderから検索する
2.「Application Loader」を起動する。
3.メニューから「Application Loader」>「Application Loaderについて」
---

##解決策
MacにXcodeをインストールし、Xcodeに付いてくる「Application Loader」を使います。

###参考サイト
https://forums.adobe.com/thread/2233035


##想定外
ただ、これでもうまくいかなくなった。。。

そこで色々調べていくうちに以下の方法を試してもらいたい。


####Info.plistファイルが複写されてアクセスに困っていないか、、、

リリース時にかなり困った内容だったので本気でいろんなことを調べてみたのですがこんな感じです。

どうやら環境によって作成していたInfo.plistファイルがいくつか作成されることによって起こる？もののようで

同じ名前だったり参照するファイルだったりがずれていたりしないか、一度考えられるファイルを出してみてください。


## 関連ワード
・XCode error - XCode エラー
・[XCode warning](http://qiita.com/drafts/af298e03286732343439) - XCode 警告

随時、変更記事、体裁を整えていきます。

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
C++ Builder / String > 文字列の脱落をするクラス

```txt:動作環境
C++ Builder XE4
```

関連 http://qiita.com/7of9/items/8e433c6d0f7a9b2fe373

UDP通信でのパケットロスを再現してパケットロス対策を実装しようとしている。

パケットロスを発生させるクラスをStatic関数で実装してみた。

### code

```UtilStringDropout.h
//---------------------------------------------------------------------------

#ifndef UtilStringDropoutH
#define UtilStringDropoutH
//---------------------------------------------------------------------------

#include <System.hpp> // for String

/*
Stringを意図的に脱落させるためのクラス。
UDP通信時などでのパケットロスを再現するために使う。
*/

class CUtilStringDropout
{
private:
public:
	static String __fastcall GetStringAfterDrop(String srcStr, float dropout_rate, int dropout_chars);
	/**
	 *	@param [dropout_rate] 関数コール時に何回に1回dropoutを発生させるか [0.0 - 1.0]
	 *  @param [dropout_chars] dropout時の脱落文字数
	 */
};

#endif
```

```UtilStringDropout.cpp
//---------------------------------------------------------------------------

#pragma hdrstop

#include <vcl.h>
#include "UtilStringDropout.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)

/*
v0.1 2017/02/08
	- GetStringAfterDrop()実装
*/

//---------------------------------------------------------------------------
// public関数
//
/*static*/String __fastcall CUtilStringDropout::GetStringAfterDrop(String srcStr, float dropout_rate, int dropout_chars)
{
	double rnd = Random(); // 0.0 to 1.0

	if (rnd >= dropout_rate) {
		return srcStr;
	}

	String wrk = srcStr;
	for(int loop=0; loop < dropout_chars; loop++) {
		int pos = Random(wrk.Length());
		wrk.Delete(pos, /* count=*/1);
	}

	return wrk;
}
```

### 利用例

TMemoとTTimerを持つフォーム。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "UtilStringDropout.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	Memo1->Clear();
	Timer1->Interval = 1000; /* msec */
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
	String rcvd = L"123456789ABCDEF";

	rcvd = CUtilStringDropout::GetStringAfterDrop(rcvd, /* dropout_rate=*/0.3, /*dropout_chars=*/5);

	Memo1->Lines->Add(DateTimeToStr(Now()) + L":" + rcvd);
}
//---------------------------------------------------------------------------
```

### 実行例

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4f384a35-61b1-b520-314f-effd0b448793.png)


### 補足

@tenmyo さんの[コメント](http://qiita.com/7of9/items/0ad041cfdd174f142ecc#comment-bab6740e1eb8fbda8595)などから考えて、UDPの通信の脱落は上記の状況とは異なるかもしれない。

また、過去に自分が調べていた記事が見つかった。
http://qiita.com/7of9/items/7b980d262bf600d35cea

自分が遭遇している問題は、パケット単位の破棄が発生しているようだ。
知っておきたい飯に誘う活用法

#出オチ

後輩にダッシュボタン借りれたので，node.jsの練習も兼ねて飯食べに行こうぜ！ボタンを作ります．

##やりたいこと
研究室から飯に誘う


#環境
- Raspberry pi3
    - node.js : v7.2.1
    - npm : v3.10.10
        - dasher : 1.3.0
- Amazon Dash Button(事前にwi-fiのセッティングをしておいてください)
- IFTTT

#実装
##ダッシュボタンの設定
作業用ディレクトリに移動後，以下コマンドでクローンします．

`$git clone https://github.com/maddox/dasher.git`

ここで，公式のGithubでは，`$./script/find_button`を実行してダッシュボタンのMACアドレスと取得するのですが，今回自分の環境ではエラーが発生して実行できなかったので， 以下コマンドを叩きます

`$sudo tcpdump port bootps`

ここを参考にしました．
[コマンドだけでAmazon Dash ButtonのMACアドレスを調べる
](http://qiita.com/1060ki/items/aaa0bc388eeb261ac682)

とりあえず，***出てきたMACアドレスをメモっておいてください．***
自分のダッシュボタンでは，`34.d2:70:~~~~~~`というMACアドレスになっていました．
##IFTTTの設定
次は[IFTTT](https://ifttt.com/)にサインインして,Appletを作ります．(これいつからRecipeじゃなくなったんですかね...)

![スクリーンショット 2017-02-08 15.27.17.png](https://qiita-image-store.s3.amazonaws.com/0/137949/70fa8c38-8ecc-d4b8-ba9d-28e1949e93aa.png)

ここまで来たら， + this を押して　Makerを追加します．

![スクリーンショット 2017-02-08 15.30.56.png](https://qiita-image-store.s3.amazonaws.com/0/137949/eac95ba9-aaf5-240c-4516-3e05a87bafbd.png)

Event Nameには好きな名前を追加してください．これも***後で使うのでメモっておいてください．***

次は　thatの方になんでもいいですが，今回はTwitterを追加します．
(事前にTwitterのアカウントをIFTTTTに追加しておくとスムーズ)

![スクリーンショット 2017-02-08 15.35.01.png](https://qiita-image-store.s3.amazonaws.com/0/137949/5db3be66-c4e1-93aa-5c2b-8131271b5fde.png)


一緒に飯に行きたくなる文書を執筆します．ここが今回の山場です．
OccuredAtを追加しておくことで，連投できるようにします．

あとはいい感じにポチポチしてアプレットを作ってください．ここでは詰みません．

最後に，Makerのアイコンをクリックして，APIのようなものをメモってください．
![スクリーンショット 2017-02-08 15.53.19.png](https://qiita-image-store.s3.amazonaws.com/0/137949/09913ead-7e93-1c3f-77d1-588a7610215f.png)

***この赤い部分の文字列が必要になります***


##dasherの設定
男は黙って，
`$touch config/config.json`
で，config.jsonを作ります．
`vi config.json`で以下のように編集します．

```json:config.json
{"buttons":[
  {
    "name": "{さっきメモったEvent　Name}",
    "address": "{さっきメモったMACアドレス}",
    "url": "https://maker.ifttt.com/trigger/{さっきメモったEvent　Name}/with/key/{さっきメモったAPIキーのようなもの}",
    "method": "POST",
  }
]}
```



最後に
`$sudo　npm start`

![IMG_1729.JPG](https://qiita-image-store.s3.amazonaws.com/0/137949/70a61e94-812f-6f3b-1754-05bfcb43b6e2.jpeg)


完成しました．ボタンを押すとコンソール上に何回押されたかがカウントされます．


Twitterの方にもしっかり投稿されていますね．

![スクリーンショット 2017-02-08 16.32.14.png](https://qiita-image-store.s3.amazonaws.com/0/137949/83c02774-6feb-b9c2-f87b-52771d6f46f7.png)


****
****
****
dasherのexampleを見ると，POSTする際にvalueも渡せるようです．(当たり前だけど)
これを使えば， 複数のAmazon Dash Buttonを別の部屋に置いて
講座研　「飯食いに行こうぜ！」，　学生研「飯食いに行こうぜ！」みたいなことができそうですね．



#詰んだ所
***ラズパイの環境構築***
自分の場合ですので参考程度にお願いします．
最初に `npm i` が動かなかったので公式にもあるように

`sudo apt-get update && sudo apt-get upgrade`

したが，エラーが消えず...

pcapがダメみたいな文字がたくさん出てたので

`sudo apt-get install　libpcap-dev`

したら解決しました．

mac OSの方でもdasher使ってみたのですが，この時はPythonのバージョンが違うよ，２系を使ってねみたいなエラーが出たので，

[ここ](https://github.com/nodejs/node-gyp/issues/577)の偉いおじさんが言ってるようにコマンドを打ったら治りました．
Conohaのオブジェクトストレージにwindowsからアクセスす

Conohaのオブジェクトストレージを、windowsから操作したい。
FTPクライアントのようなものからなら、誰でもつかえるのに。

で、とりあえず試した2つ
・Cyberduck
・CloudBerry Explorer for OpenStack Storage


#Cyberduckの場合
Cyberduckを起動してメニューからブックマークの新規ブックマークを選択しよう

| 項目名      |  値 | 
|:-----------------|:------------------|
|プロトコル|Swift(OpenStackObjectStorage)|
| ニックネーム |おまかせ|
|サーバ|identity.tyo1.conoha.io|
|ポート|443|
|TenantID:AccessKey|テナントID:APIユーザー名|
|詳細設定
|パス|/v2.0|
|その他||
|secret Key|APIパスワード|


#CloudBerry Explorer for OpenStack Storageの場合
ウィルスバスターにインストール用のexeがウイルス/脅威:HEU_CDPLC007ではじかれた(2017/02/09に）インストールは、自己責任で。

| 項目名      |  値 | 
|:-----------------|:------------------|
|プロトコル|OpenStack or SwiftStack|
| Display name |おまかせ|
|User name|APIユーザー名|
|Api key|APIパスワード|
|AuthenticationService|https://identity.tyo1.conoha.io/v2.0|
|TenantID|テナントID|
カレントディレクトリ以下の隠しファイル系も含めた全ディレクトリ、ファイルを一覧取得する

以下のコマンドと同じリストをrubyで取得したい

``` shell
% find .
```

下記リファレンスに記載はあるけど、辿り着くまでが面倒だったのでメモとして記載しておく。
  * https://docs.ruby-lang.org/ja/latest/class/Dir.html#S_--5B--5D

ポイント

  * `File::FNM_DOTMATCH`を利用する。
  * FNM_DOTMATCHを利用すると「xxx」に加えて「xxx/.」のように要らない子も取得されてしまうので、rejectする。

``` ruby
#! /usr/env/ruby

results = Dir.glob("**/*", File::FNM_DOTMATCH).reject{|x| x =~ /\.$/}
results.each do |result|
  p result
end
```
macに古いRails環境を構築する

手元に「パーフェクトRuby on Rails」があったので、ruby2.1.2+Ruby on Rails4.1.1の環境を作りました

# TL;DR

- homebrewをインストール
- homebrewでrbenvをインストール
- rbenvでrubyをインストール
- (rbenvでいれたrubyの)gemでbundlerをインストール
- bundlerでRailsをインストール

# 環境
macOS Sierra 10.12.3

# homebrewをインストール
[公式サイト](http://brew.sh/index_ja.html)を参考に
`/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`

# homebrewでrbenvをインストール
`brew install rbenv`

# rbenvでrubyをインストール
`rbenv install 2.1.2`

開発用に適当なディレクトリを作り、その中で2.1.2を有効にする
`rbenv local 2.1.2`

# (rbenvでいれたrubyの)gemでbundlerをインストール
インストールする前にコマンドのpathを確認する

```
which ruby
$HOME/.rbenv/shims/ruby
which gem
$HOME/.rbenv/shims/gem
```

.rbenv/shimsにpathが通っていない時はrehashする
`ruby rehash`

bundlerインストール
`rbenv exec gem install bundler`

# bundlerでRailsをインストール
インストールする前にコマンドのpathを確認する

```
which bundle
$HOME/.rbenv/shims/bundle
```

.rbenv/shimsにpathが通っていない時はrehashする
`ruby rehash`

Gemfileを生成する
`bundle init`

Gemfileを修正する

```rb
# frozen_string_literal: true
source "https://rubygems.org"

gem "rails", "4.1.1"
gem "thor", "0.19.1"
```

thorのバージョン指定しているのは[これ](http://qiita.com/motty93/items/ad39f2f632a7d8b3b442)

インストール
`bundle install --path=vendor/bundle`

インストール出来たことを確認

```
bundle exec rails -v
Rails 4.1.1
```

開発用のディレクトリの中で以下のコマンドを叩きプロジェクトの作成
`bundle exec rails new . --skip-bundle`

railsのインストールに使ったGemfileの上書きを確認されるので、yを入力
`Overwrite ./Gemfile? (enter "h" for help) [Ynaqdh] y`

Gemfileが上書きされていることを確認
`less Gemfile`

プロジェクト用のgemをインストール
`bundle update`

お疲れ様でした！

# さいごに
なんかおかしいなーと思ったら、自分の叩いているコマンドをwhichしてみるのが良いです
PIRセンサーモジュール [DSUN-PIR]で遊ぶ

##DSUN-PIR 人感センサー
買ったのは
DSUN-PIR
http://www.aitendo.com/product/10254


```python
#!/usr/local/bin/python

-- coding: utf-8 --

from future import print_function
import RPi.GPIO as GPIO
import os
import time
SENSOR_PIN = 25
LED_PIN = 24
GPIO.setmode(GPIO.BCM)
GPIO.setup(SENSOR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(LED_PIN, GPIO.OUT)
while True:
   pin_status = GPIO.input(SENSOR_PIN)
   print(pin_status)
   GPIO.output(LED_PIN, pin_status)
   time.sleep(1)
GPIO.cleanup()
```
LEDを24番にさせば光る

##調整
正面からみて
左　検出間隔
右　検出距離
っぽい
Windows でPython

# Anaconda Setup

## Install
AnacondaのサイトからPython3の最新版をダウンロードする。
https://www.continuum.io/downloads

## Proxy設定(conda)

- command promptを立ち上げる。
- AnacondaのHome directoryを確認する。
 - C:\Users\[user name]\AppData\Local\Continuum\Anaconda3

- テキストエディタでa.condarcを作成し以下のように記述する。

```bash:.condarc
proxy_servers:
    http: http://[username]:[password]@[proxy server address]:[port]
    https: https://[username]:[password]@[proxy server address]:[port]
```

- コマンドプロンプトでファイル名を変更する。エクスプローラーから変更しようとすると「ファイル名がありません」と怒られるため。

```
>ren a.condarc condarc
```

- 設定を確認する。設定したプロキシー情報が表示されればOK。

```
>conda config --show
```

## Proxy設定(PIP)
実行時に引数で指定することができる。

```
pip install [packagename] --proxy http://[username]:[password]@[proxy server address]:[port]
```
イメージマップの出力

イメージマップの出力には、Illustlator を利用する。

- [illustratorで日本地図の各都道府県のイメージマップを出力する](http://masup.net/2014/09/image-map-illustrator.shtml)

## Illustratorでの操作
1. パスを書く。グループ化している場合は解除しておく。
1. メニューの「ウィンドウ」から「属性」ウィンドウを表示させる。
1. パスを選択し、属性ウィンドウの「イメージマップ」の項目を「多角形」に変更する。
1. URL欄に「#areaname」など任意の名前を設定する（あとで手がかりになる項目なので、わかりやすい名前をつける）
1. 「ファイル」→「Web用に保存」を選択し、「プレビュー」ボタンを押す。
1. イメージマップのソースコードが出力されるので、エディタにコピペする。

## エディタでの設定
設定が正しく行われていれば、このような形式で出力される。

```html:イメージマップのソース
<img src="image_map.png" width="400" height="200" alt="" usemap="#_Map">
<map name ="_Map">
<area shape="poly" alt="" coords="10,20, 30,40" href="#areaname">
</map>
```

imgタグの`usemap`属性 とmapタグの`name`属性 が対応関係にある。
ここを任意の名前に書き換える。
Illustratorの仮設定のままで使うのは微妙なので。

usemap属性が「#名前」の形式なのに対して、name属性は#なしの名前だけという点に注意。
ここを正しく記述しないと、関連付けがされない。

```html:名前書き換え後
<img src="image_map.png" width="400" height="200" alt="" usemap="#japanMap">
<map name ="japanMap">
<area shape="poly" alt="" coords="10,20, 30,40" href="#areaname">
</map>
```

ここまでできれば、画像内の任意の領域がクリック可能になる。
あとは、各エリアにclassを振ったり、altを設定したり、data属性を加えたりして、JS等で具体的な処理をさせていく。

# 画像のロールオーバー
画像のクリック時・ホバー時に表示画像を切り替えさせるためには、
JSを使う必要がある。

```html
<img src="image_map.png" width="400" height="200" alt="" usemap="#japanMap">
```

## src属性の書き換え
クリック・ホバー時にsrc 属性を書き換えて、別パターンの画像を表示させる形式でやると、WindowsのChromeで何度も実行させていると、途中でレンダリングが止まった。

src属性の書き換えは行われているが、画面への反映が行われない状態。
なので、src属性の書き換えで切り替えない方が良い。

## class の書き換え
classの付け替えを利用して、CSSの背景画像を切り替える方式でやると上記の問題は起こらない。
が、そもそも画像にCSS背景を設定しても、画像の領域部分は画像表示が優先されて背景が表示されない。
なので、「同じ大きさの透明な画像にイメージマップを設定し、CSSで背景画像を表示させ（本来イメージマップで使用する画像）、それをイベントで切り替える」というパターンにする必要がある。

コードにすると以下の様な構造になる。

```html:サンプル
<div class="base"> <!-- ベースの背景画像 -->
	<div class="switch"> <!-- JSでクラスを追加・削除してCSS背景を切り替える箇所 -->
		<img src="image_map.png" width="400" height="200" alt="" usemap="#japanMap"> <!-- 透明な画像を設定 -->
		<map name ="japanMap">
			<area shape="poly" alt="" coords="10,20, 30,40" href="#areaname">
		</map>
	</div>
</div>
```

#  ImageMapster
書きだしたイメージマップは、 jQuery プラグイン ImageMapster でロールオーバーを変化させることが手軽にできる。
[jQuery プラグイン ImageMapster で、イメージマップのロールオーバーを変化させる](http://honttoni.web.fc2.com/blog_honttoni/samples/sample61set/)

※IE8非対応　モックとして使う分には有用。
Canvasを利用して描画するため、他の処理を同時にさせると反応が結構重くなる。
独自の文字列を二次元配列にする

# 概要
- 独自の規則に従った文字列から二次元配列を生成する。
- 規則性がありつつ、ある程度柔軟性も持たせる。

# ルール
- 1階層目の配列区切りはカンマ。
- 2階層目の配列区切りは半角スペース。
- 文字列前後のスペースはないものとして扱う。
- カンマの前後にスペースがあっても、そのスペースはないものとして扱う。
- スペースが2つ以上連続で続いている場合は1つ扱いとする。

```js:例
'hoge 123, fuga 456' -> [["hoge", "123"], ["fuga", "456"]]
'sample   test   ,     example     text' ->  [["sample", "test"], ["example", "text"]]
```

# サンプルコード

- [実行サンプル](http://codepen.io/yama-t/pen/JXMbGZ)

```js
var str = 'word texttext  test1  , title example.com';
var ary = str.trim().split(',').map(function(item){
  return item.trim().replace(/\s+/g,' ').split(' ');
});

console.log(ary); // [["word", "texttext", "test1"], ["title", "example.com"]]

/* 関数化 */
var dArray = function(str) {
  return str.trim().split(',').map(function(item) {
    return item.trim().replace(/\s+/g, ' ').split(' ');
  });
};

var test = dArray(str);
```

# 使った関数
|関数名|効果|
| --- | --- |
| split | 文字列を任意の文字列で区切り、配列を生成|
| trim | 文字列の前後の空白を削除 |
| replace |文字列の置換 |
| map | 配列を元に新たな配列を生成する|

# まとめ
- オレオレ文法から任意の配列が作れる。
- 関数を組み合わせることで、ちょっとした独自言語のようなことができる。
コンソールに寿司を流す+α

# 概要
- コンソールに寿司を流す。
- 画面にも流したい！ → 流しました。

# 元のコード

```js
const STR_LEN = 80
const SUSHI_INTERVAL =10
let cnt = 0;
function sushiDraw(){
    const sa = new Array(STR_LEN).fill(' ')
   
    for(let i = 0; i < STR_LEN; i += SUSHI_INTERVAL){
        const sushiIndex = sa.length - 1 - (cnt + i) % sa.length
        sa.splice(sushiIndex, 1, '🍣')
    }
    console.clear()
    console.log(sa.join(''))    
    cnt++
}

setInterval(sushiDraw, 1000)
```

# Class構文を使ってみた
- [実行サンプル](http://codepen.io/yama-t/pen/vyxQrE)

ロジックも見直した。結果、コードは長くなった。

- 引数で寿司の数、間隔、流れる速度を変更できるようにした。
- 処理のたびに毎回配列を1から作って結合していたので、それをやめる。
- 最初に一度だけ寿司文字列を生成する。
- その後は処理が行われるたびに最初の1文字を削って後ろに継ぎ足していく方式。
- 寿司の絵文字がサロゲートペアという問題にぶち当たり、単純に1文字削るだけでは上手く行かなかったので、例外処理を追加。
- 表示処理は単純に文字列の入ったインスタンス変数を参照するだけにした。

```js
class RevolvingSushi {
  constructor(len = 80, interval = 10, delay = 1000) {
    this.STR_LEN = len;
    this.SUSHI_INTERVAL = interval;
    this.DELAY = delay;
    this.sushi = this.make(this.STR_LEN, this.SUSHI_INTERVAL);
    this.display();
    this.flow();
  }
  make(len, interval){
    const sushi = ' '.repeat(interval - 1) + '🍣',
          count = Math.floor(len / interval),
          space = ' '.repeat(len % interval);
    return sushi.repeat(count) + space;
  }
  slide(){
    let str = this.sushi.charAt(0);
    if (str !== ' '){
      this.sushi = this.sushi.slice(2);
      str = '🍣'
    } else {
      this.sushi = this.sushi.slice(1);
    }
    this.sushi += str;
  }
  clear(){
    console.clear();
  }
  display(){
    console.log(this.sushi);
  }
  flow(){
    setTimeout(() => {
      this.slide();
      this.clear();
      this.display();
      this.flow();
    }, this.DELAY);
  }
}

// 実行
new RevolvingSushi();
```

## HTML上に寿司を流す
- JavaScript上での処理はテキスト生成と指定した要素への挿入のみ。
- 動きはCSSでつける。

```js:JS
class RevolvingSushiText {
  constructor(selector = '.sushi', len = 80, interval = 10, delay = 1000) {
    this.STR_LEN = len;
    this.SUSHI_INTERVAL = interval;
    this.DELAY = delay;
    this.space = '　';
    this.afterSpace = this.space.repeat(len % interval);
    this.sushi = this.make(this.STR_LEN, this.SUSHI_INTERVAL);
    this.target = document.querySelector(selector);
    this.set();
  }
  make(len, interval) {
    const sushi = this.space.repeat(interval - 1) + '🍣',
      count = Math.floor(len / interval);
    return sushi.repeat(count);
  }
  set() {
    this.target.innerHTML = `<div class="sushi-outer"><div class="sushi-inner">${this.sushi}</div><div class="sushi-inner">${this.sushi + this.afterSpace}</div></div>`
    const width = document.querySelector('.sushi-inner').offsetWidth;
    document.querySelector('.sushi-outer').style.width = width * 2 + 'px';
  }
}

new RevolvingSushiText('.sushi', 100, 5);
```

```html:HTML
<p class="sushi"></p>
```

```css:CSS
.sushi {
  overflow: hidden;
}

.sushi-outer {
  display: block;
  white-space: nowrap;
}

.sushi-inner {
  float: left;
  animation: slide 15s infinite linear;
}

@keyframes slide {
  0% {
    transform: translateX(0%);
  }
  100% {
    transform: translateX(-100%);
  }
}
```

# 外部リンク
- [sushi-console.js](https://gist.github.com/1984weed/6b186886cce79479e4c1f72f578a175d)
光る画像

# 概要
- ホバーしたら光る
- 一定の間隔で光る

![cat.gif](https://qiita-image-store.s3.amazonaws.com/0/46299/bd34e172-b652-23d0-6878-592499c707bd.gif)


# 原理
- 斜めに変形させた白い四角形（平行四辺形）を高速で横に動かし、画像の上を横切らせる。
- 四角形は画像を囲うdivのbefore 擬似要素に設定。
- div自体には`display: inline-block` と`overflow: hidden`をかけることで、画像の表示領域から外れた部分の白い四角形は見えなくする。

# 備考
##  ホバー時に光る
- ホバー時にtransitionを設定することで、ホバーした時のみアニメーションする（サンプル一番左）
- ホバー擬似要素を使わず、クラス自体にtransitionを設定すると、ホバーが外れた時にも逆方向に戻るアニメーションをしてしまう（サンプル中央）

## 自動アニメーション
サンプル一番右。

-  無限アニメーション。
- 間隔を空けてアニメーションさせるようにしている。
 - `animation: bright 3s` ← アニメーションの実行時間を（アニメーションを実際にさせる時間＋間隔を空けたい時間）に設定。
 - keyframesを途中時点（サンプルだと15%）でアニメーションが完了するような設定にし、100%にも同じ設定を適用。
 - 上記で、15％〜100％までのアニメーション時間が待機時間になる。

# サンプルコード
- [実行サンプル](http://codepen.io/yama-t/pen/zKOjYm)

```html
<div class="imgBright">
  <img src="http://lorempixel.com/100/100/cats">
</div>

<div class="imgBright2">
  <img src="http://lorempixel.com/100/100/cats">
</div>

<div class="imgBright3">
  <img src="http://lorempixel.com/100/100/cats">
</div>
```

```css
.imgBright,
.imgBright2,
.imgBright3 {
  position: relative;
  display: inline-block;
  overflow: hidden;
}

.imgBright:before,
.imgBright2:before,
.imgBright3:before {
  content: "";
  background-color: rgba(255, 255, 255, 0.4);
  height: 100%;
  width: 100%;
  display: block;
  position: absolute;
  top: 0;
  left: -160%;
  transform: skewX(-45deg) translateX(0);
}

.imgBright2:before {
  transition: all 0.4s ease-in-out;
}

.imgBright:hover:before,
.imgBright2:hover:before {
  transform: skewX(-45deg) translateX(320%);
  transition: all 0.4s ease-in-out;
}

.imgBright3:before {
  animation: bright 3s ease-in-out 2s infinite;
}

@keyframes bright {
  0% {
     transform: skewX(-45deg) translateX(0);
  }
  15% {
    transform: skewX(-45deg) translateX(320%);
  }
  100% {
    transform: skewX(-45deg) translateX(320%);
  }
}
```

# 元ネタ
https://teratail.com/ のアイコン部分の演出。
Network > 設計 > 意図的にパケットロスを起こす仕組み > 機能の所在 > VMWare: パケットロス機能 | Linux: tcコマンド, dummynet | ケーブル切替器 | Raspberry Pi:遅延・パケットロス生成エミュレータ

```txt:動作環境
C++ Builder XE4
```

UDP通信でのパケットロスの対処に関して、実際にパケットロスを生じさせる必要がある。

### 方法1

途中にパケットロスを発生させるソフトを置く方法。

`![](http://yuml.me/diagram/class/[Client]<-->Port A[パケットロス by ソフト],[パケットロス by ソフト]<-->Port B[Server])`

![](http://yuml.me/diagram/class/[Client]<-->Port A[パケットロス by ソフト],[パケットロス by ソフト]<-->Port B[Server])

- 利点
   - Client, Serverソフトともに変更しなくて良い
   - 様々なソフトの組合せに使える
- 欠点
   - Clientの接続先(IPアドレスもしくはポート番号)変更が必要
   
### 方法2

Clientにパケットロスを起こさせるクラスを実装して使う。

`![](http://yuml.me/diagram/class/[Client|パケットロス機能]<-->Port A[Server])`

![](http://yuml.me/diagram/class/[Client|パケットロス機能]<-->Port A[Server])


- 利点
   - 接続先(IPアドレスもしくはポート番号)を変更しなくて良い
   - Serverソフトは変更しなくて良い
- 欠点
   - Clientソフトを変更する必要あり

### 追加で学んだこと

@tenmyo さんの[コメント](http://qiita.com/7of9/items/8e433c6d0f7a9b2fe373/#comment-6d266e6f468cc83d7877)にてパケットロスを発生させる様々な提案をいただきました。

情報感謝です。

さらに[色々教えていただきました](http://qiita.com/7of9/items/8e433c6d0f7a9b2fe373/#comment-504893e03a632424a12f)。

@mistymagich さんの[コメント](http://qiita.com/7of9/items/8e433c6d0f7a9b2fe373/#comment-0a2b2d7dadab6b8be599)にてRaspberry Piでの遅延・パケットロス発生用エミュレータを紹介いただきました。
Vagrant destroyせずに消してしまったり放置していたりした時のその後の処理

# global-statusでvagrant内を確認してみる。

```
$ vagrant global-status

id       name               provider   state        directory
----------------------------------------------------------------------------------------------
xxxxxxx  wocker             virtualbox inaccessible /Users/xxxxx/wocker
```

```
$ vagrant global-status --prune
```
※通常これで存在していないものは削除される。

```
$ vagrant destroy xxxxxx
```
[xxxxxx]上のid番号を指定でdestroyできる。


## これでも削除されない場合VirtualBoxのコマンドで確認してみる。

```
$ VBoxManage list vms

"<inaccessible>" {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
"<inaccessible>" {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
"example.dev" {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
```
アクセスできない（inaccessible）がたくさんでてきたので削除する。
コピーして全部つなげて以下のようなコマンドにしましたが良い方法があったら教えてください。

```
$ VBoxManage unregistervm {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} && VBoxManage unregistervm {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
```

そのあとglobal-statusで確認してまだのこっていたら--pruneで削除できるはず。

```
$ vagrant global-status
$ vagrant global-status --prune
```

# ディレクトリが違う仮想マシンを落としたり、消したり

```
$ vagrant global-status

id       name               provider   state    directory
----------------------------------------------------------------------------------------
xxxxxxx  xxxxxxx.dev virtualbox poweroff /xxxxxxx
xxxxxxx  xxxxxxx.dev virtualbox running /xxxxxxx
xxxxxxx  xxxxxxx.dev virtualbox aborted  /xxxxxxx

$ vagrant halt xxxxxxx xxxxxxx xxxxxxx xxxxxxx
$ vagrant destroy xxxxxxx
```
IDを指定して別階層から操作できるっぽい。（追記：複数指定も）
vimperatorの代替としてcVim入れてみた

いつのまにか新たに、chrome対応のvimpっぽいプラグインがでてた。
vimiumがしっくり来なかったけどこれはすごい。

[cVim \- Chrome ウェブストア](https://chrome.google.com/webstore/detail/cvim/ihlenndgcmojhcghmfjfneahoeklbjjh?hl=ja)


## コマンドモード
キャプチャはvivaldiだけどこんなかんじ
`:buffer` もある

<img width="1600" alt="cvim buffer" src="http://i.imgur.com/3FbxKZJ.png">

## 設定画面
vimpっぽく設定もかけるみたいだ。
試してないけど、別途 `.cvimrc` とか読み込めるみたい。
<img width="1600" alt="cvim config" src="http://i.imgur.com/8mujBG1.png">


## .cvimrc
やる気が出たのでコンフィグ書いた。
jsでfunction書いてmapに登録できるっぽかったので、bitlyAPI叩いてyankするやつかいた。
access_tokenは適当に自分で発行してください:bow:
ってか `title` 取りたいんだけどて悩んだので、マニュアル見たけど見当たらんかった。
まあ、ソース読んでたらわかったけど。

```vim:.cvimrc
" Settings
" set noautofocus
set typelinkhints
let searchlimit = 30
let scrollstep = 70
let fullpagescrollpercent = 100
let barposition = "bottom"
let locale = "jp"
let mapleader = ","
let hintcharacters = "qwertyuiasdfghjklzxcvbnm"

" Search
command g tabnew google
let completionengines = ["google", "amazon"]
let searchalias g = "google"
let qmark t = ["http://twitter.com"]
let qmark m = ["https://inbox.google.com/u/0/?cid=imp"]
let qmark c = ["https://www.google.com/calendar"]
let qmark i = ["http://www.inoreader.com/folder/Must%20Read"]

" Ignore Site
let blacklists = ["https://inbox.google.com/*"]

" Mapping
map h previousTab
map l nextTab
map b :buffer<Space>
map B :bookmarks<Space>
map d closeTab
map u lastClosedTab
map <M-i> goToInput
map @ pinTab
map <C-h> moveTabLeft
map <C-l> moveTabRight
map <M-r> reloadTabUncached

iunmapAll

" yank '%title% - %url%'
copyTitleUrl() -> {{
  RUNTIME('getRootUrl', function(url) {
    let ret = document.title + " - " + url;
    Clipboard.copy(ret);
    Status.setMessage(ret, 2);
  });
}}
map yt :call copyTitleUrl<CR>

" accessTokenは自分で発行して入れてね
" yank '%title% - %bitly%'
copyTitleBitly() -> {{
  RUNTIME('getRootUrl', function(url) {
    const bitlyToken = 'pleaseSetAccessToken!!!!!111';
    httpRequest(
      {url: `https://api-ssl.bitly.com/v3/shorten?access_token=${bitlyToken}&format=json&longUrl=${url}`, json: true},
      function(res) {
        let ret = document.title + " - " + res.data.url;
        Clipboard.copy(ret);
        Status.setMessage(ret, 2);
      });
  });
}}
map yb :call copyTitleBitly<CR>
```
digdag logを繰り返し実行するプログラム

何度も手でdigdag logを打つのは面倒
digdag logは時々「error: Attempted read on closed stream. (io)」エラーになる(0.9.4にて)
digdag UIはログの取りこぼしがある(0.9.4にて)

```digdag_log.rb
require 'open3'

STDOUT.sync = true

attempt_id = ARGV[0]

log_line_no_max = 0
attempt_stdout = nil

loop do
  # digdag attempt実行 (エラーなら即終了)
  status = nil
  attempt_stdout = []
  Open3.popen3("digdag attempt " + attempt_id) do |stdin, stdout, stderr, wait_thr|
    stdout.each do |line|
      tmp = line.match(/  status: (.+)/)
      status = tmp[1] unless tmp.nil?
      attempt_stdout << line
    end
    unless wait_thr.value.success?
      stdout.each do |line|        puts line end
      stderr.each do |line| STDERR.puts line end
      abort
    end
  end

  # digdag log実行 (正常終了するまで繰り返す)
  loop do
    log_line_no = 0
    log_success = false
    Open3.popen3("digdag log " + attempt_id) do |stdin, stdout, stderr, wait_thr|
      stdout.each do |line|
        log_line_no += 1
        # 前回出力行以降を出力
        if (log_line_no > log_line_no_max)
          puts line
          log_line_no_max = log_line_no
        end
      end
      log_success = wait_thr.value.success?
    end
    if log_success
      break
    end
  end

  # attemptが終了しているか
  if status == "error" || status == "success"
    break
  end

  # 次の実行までスリープ
  sleep 10
end

puts
puts "this attempt ended with following status"
puts
puts attempt_stdout
```
```shell-session
ruby digdag_log.rb 6
```
chai.expectとsinon.assertの使い分け

sinonでspy/stub/mock化したメソッドのアサーションはsinon.assertを使ったほうがいいと思う。

```index.js
function getIndexPage(req, res) {
  return res.render('index');
}

module.exports = getIndexPage
```

```index.spec.js
it('renders index view', () => {
  const req = {};
  const res = {};
  res.render = sinon.spy();

  getIndexPage(req, res);

  expect(res.render.calledOnce).to.be.true;
  expect(res.render.calledWithExactly('indexx')).to.be.true;  // chai.expect
  sinon.assert.calledWithExactly(res.render, 'indexx');       // sinon.assert
});
```

chai.expectだと、trueを期待したのにfalseだった、という表示になる。
`res.render.calledOnce`の検証に失敗したのか、`res.render.calledWithExactly('indexx')`の検証に失敗したのかがわかりづらい。

```
AssertionError: expected false to be true
  at Context.it (test/index.spec.js:9:57)  // ここで失敗したテストコードの行番号がわかる
```


sinon.assertだと、失敗箇所がわかりやすく、実際にどんな引数で呼ばれたかがわかる（実際には`render('index')`で呼ばれた）

```
 expected render to be called with exact arguments indexx
render(index) at getIndexPage (controllers/index.js:2:14)
```

### 2017/02/24追記

sinon-chaiを使うと、sinon.assertをexpectで書ける。
これでexpectとsinon.assertが混在しなくなる。

```
chai.use(require('sinon-chai'));

...

sinon.assert.calledWithExactly(res.render, 'indexx');         // これを

expect(res.render).to.have.been.calledWithExactly('indexx');  // こうやって書ける
```
Blueprintで追加したComponentのプロパティを追加してから変更する #UE4Study

# UE4 Blueprintで追加したComponentのプロパティを追加してから変更する

## ブループリント：BP_PublicComponentを作成する

ブループリントを作成
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/edf7ec34-735b-551c-ca3a-e21ac9f92d62.png)

親クラスにActorを選択
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/6438ea51-eea1-e3c0-9683-c880021aa9cc.png)

名前をBP_PublicComponentに設定して、ブループリントエディタを開く
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/90628bde-fc69-9949-fbef-3bef3f37c9b8.png)

## ブループリントにコンポーネントを追加する

コンポーネントにSpot Lightを追加する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/e4b89433-a6d1-6a5d-4467-7caa67e75bf7.png)

確認しやすいように光源を下向きに設定する

**トランスフォーム**

|項目  |X  |Y  |Z  |
|---|---|---|---|
|ロケーション  |0.0  |0.0  |200.0  |
|ローテーション  |0.0  |-90.0 |0.0 |
|スケール  |1.0  |1.0  |1.0  |
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/c76fe4df-fa53-01fc-1971-dc9c8a52a282.png)

コンパイルして保存
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/f7f1559e-8c62-909b-36ac-d0af05cbfc16.png)

## 画面に配置してコンポーネントの設定を編集できるか確認する

画面にBP_PublicComponentを配置する。
詳細タブのコンポーネントの階層が確認できるように境界を広げる。
DefaultCmponentRoot(継承)の階層を開く。
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/46b19985-5a47-e2af-f2e1-ecfb0eae016e.png)

階層のSpotLight(継承)を選択することで、画面に追加した後に設定を変更することが出来る
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/508cedc7-a50b-5762-f912-155766c0dabb.png)


## 画面に配置してからのコンポーネントの変更をできなくする

ブループリントBP_PublicComponentを開き、SpotLightの[Editable when Inherited]のチェックを外す。
[Editable when Inherited]のチェックを外した場合、画面に追加後に詳細の変更が出来なくなる
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/29295e54-4ba3-ff9e-5645-7063a35ca32f.png)
リスト内に行列を生成する時

自分用のメモ

下記のように3×3のゼロ行列をリストの各要素として持つリストを生成したとする。
```A=[np.zeros((3,3))]*(3)```
このリストに値を代入することを考える

```
In : A
Out: 
[array([[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]), array([[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]), array([[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]])]

```

ここで以下のように、一つ目の要素（ゼロ行列）の一行目に値を代入してみる。


```
A[0][0]=1
```


この操作を行った後のAは以下のようになる。

```
In : A
Out: 
[array([[ 1.,  1.,  1.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]), array([[ 1.,  1.,  1.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]), array([[ 1.,  1.,  1.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]])]
```

全ての要素に代入されている！？
気をつけよう……
(おとなしく```np.zeros((3,3,3))```で生成すればよかったのかな
各要素の要素数が異なる多次元行列（こんな表現が許されるのかはしらない）を作りたいときはどうやるのがスマートなのだろうか）
配列を走査する際に現在の値と次の値を比較したいなら Enumerable#each_cons が便利

# 例題

配列からある要素がひとつ前の要素と別の値になる箇所のインデックス、その一覧を取り出したいとします。

```rb
names = ['ゆの', 'ゆの', 'ゆの', '宮子', '宮子', '沙英', 'ヒロ', 'ヒロ', 'ヒロ']
```

例えば、上記の配列では `[3, 5, 6]` です。

# 方法 1

実直にやるとこのような実装になると思います。

```rb
names
  .each_with_object([])
  .with_index do |(name, indexes), i|
    indexes << i + 1 if names[i + 1] && name != names[i + 1]
  end

#=> [3, 5, 6]
```

`names[i + 1]` で次の要素を取得し、それが存在し、なおかつ現在の値と異なるかどうかを調べています。ループ内で、元の配列 `names` を利用しているのが個人的に好きではないです。

# 方法 2

今回オススメするのが以下の方法です。

```rb
names
  .each_cons(2)
  .each_with_object([])
  .with_index do |((current_val, next_val), indexes), i|
    indexes << i + 1 if current_val != next_val
  end

#=> [3, 5, 6]
```

ループ内で直接次の要素にアクセスできるので便利です。

この方法では [Enumerable#each_cons](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/each_cons.html) を使って、配列をあらかじめ重複ありの 2 要素ずつに区切り、それからさらにループを回すというアプローチを取っています。

```rb
names.each_cons(2).to_a
#=> [["ゆの", "ゆの"], ["ゆの", "ゆの"], ["ゆの", "宮子"], ["宮子", "宮子"], ["宮子", "沙英"], ["沙英", "ヒロ"], ["ヒロ", "ヒロ"], ["ヒロ", "ヒロ"]]
```

なお、[Enumerable#each_slice](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/each_slice.html) と挙動が異なることに注意してください。

```rb
names.each_slice(2).to_a
#=> [["ゆの", "ゆの"], ["ゆの", "宮子"], ["宮子", "沙英"], ["ヒロ", "ヒロ"], ["ヒロ"]]
```
Windows GAE/Go の VS Code開発環境セットアップメモ

WindowsでGAE/Goを開発する場合の最小構成について調べたメモ

# Gitのインストール
https://git-for-windows.github.io/

# Google Cloud SDK のインストール
https://cloud.google.com/sdk/docs/quickstart-windows

# Python 2.7のインストール
https://www.python.org/download/releases/2.7.4/

# App Engine SDK for Go インストール
https://cloud.google.com/appengine/docs/go/download

ダウンロードして解凍

出てきた、go_appengineディレクトリをCドライブ直下に配置

管理者権限でコマンドプロンプトを起動し、ハードリンクを作成する
(*注 シンボリックリンクだとコマンドからは実行できるが、VS Codeでエラーになるため)

```
> cd C:\go_appengine\goroot\bin
> mklink /H go.exe goapp.exe
```

Windowsの環境変数に以下の値を設定

```
GOPATH : C:\go_appengine\gopath
GOROOT : C:\go_appengine\goroot
APPENGINE_DEV_APPSERVER : C:\go_appengine\dev_appserver.py
PATH : C:\go_appengine\goroot\bin
```

これで、コマンドプロンプトでgoコマンドが使用できるようになる

# Visual Studio Codeのインストール
https://code.visualstudio.com/

# Delveをインストール
Golangのデバッガ
VS Codeではこれがないと実行できない(?)
コマンドプロンプトから以下を実行

```
go get -v -u github.com/peterh/liner github.com/derekparker/delve/cmd/dlv
```

# VS CodeのGo Pluginをインストール
VS Codeを起動する。
左のアイコンリスト一番下の、「拡張機能」をクリック
検索窓に「Go」を入力
検索結果の説明文が「Rich Go language support ...」の方の「Go」プラグインをインストール
インストール後、「再度読み込む」をクリックしてVS Codeを再起動

# Golangのプロジェクト作成
任意の場所に、「Hello」ディレクトリを作成
VS Codeの「ディレクトリを開く」で「Hello」ディレクトリを開く
左側の「HELLO」にマウスを合わせ、表示された新規ファイルアイコンをクリック
「main.go」を作成
上部に「The "golint" command is not available. ...」と表示されるので、「Install All」をクリック
インストールが終わったら準備完了

以下のコードを記述

```
package main

import "fmt" // 自動補完されるので記述しなくてもよい

func main() {
  fmt.Println("Hello Golang")
}
```

「Ctrl + s」で保存

F5キーを入力すると、上部に「環境の選択」と表示されることがあるので、その場合は「Go」と入力

アプリケーションの起動用設定ファイル「launch.json」が生成される

「Ctrl + F5」を入力して、実行する
raspberry pi zeroでusb wifiを使う設定


raspberry pi zeroでwifiを使う
忘れないために書く簡単な設定

使用部品

```raspberry pi zero v1.3
buffalo WLI-UC-GNM2```

1.
```lsusb```
USBを認識してるか確認
```ifconfig```
USBの名前を確認

今回```wlan0```と認識してた。


2.
ファイルを書き換えるか追加
```nano /etc/network/interfaces```

ipアドレスを固定にしたいのでstaticとする。

```/etc/network/interfaces
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static

wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

address 192.168.000.000
netmask 255.255.255.0
gateway 192.168.000.000
```

3.
```wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf```
接続したいwifiのSSIDやパスワードを書く

```nano /etc/wpa_supplicant/wpa_supplicant.conf```

```
network={
         ssid="hoge"
         proto=WPA2
         key_mgmt=WPA-PSK
         psk="hoge"
        }
```

これで最後に再起動
分散版 tensorflow cifar10を1Gnic,10Gnic,Infinibandで比較してみた

Infinibadを触る機会があったので分散版tensorflowのcifar10を使って早さなどを比較してみました。
InfinibandはIPoIBで通信しています。

# 検証環境
## サーバー
```
CPU: E5-2623 * 2
GPU: TITAN X(Maxwell) * 4
RAM: 128G
NIC: 1Gbps, 10Gbps, InfiniBnad(FDR 56Gbps)
```
計：5台

## tensorflow version
tensorflow=0.12

## 比較プログラム
- 分散版cifar10(後述)
    - サーバー1台, 4GPU, パラメータサーバー2台
    - サーバー5台, 20GPU, パラメータサーバー10台

本当は学習サーバーとパラメータサーバーを分けた方が良いのですが別途用意できなかったので各サーバーに相乗りで2個ずつ立てています。

分散版はtensorflow付属のcifar10のtrain()部分をSyncReplicasOptimizer + Adamに置き換えた物を使います.

```
images, labels = cifar10.distorted_inputs()
logits = cifar10.inference(images)
loss = cifar10.loss(logits, labels)

opt = tf.train.AdamOptimizer()
syc_opt = tf.train.SyncReplicasOptimizer(opt, ....)
train_op = syc_opt.minimize(total_loss, global_step)
```
バッチサイズとかそのほかのパラメータは全部そのままです。

ついでにtensorflow付属のcifar10の比較もしておきます。

- tensorflow付属のcifar10_train.py
    - サーバー1台, 1GPU
    
- tensorflow付属のcifar10_multi_gpu_train.py
    - サーバー1台, 1GPU
    - サーバー1台, 4GPU

各GPUのイテレーションが `100000` になるまで回します。　
比較はlossの下がり具合を見ます。

# 結果
グラフの見方
左図： 重みを共有しているとあるGPU1台で計算した イテレーションあたりのlossの変化
右図： 重みを共有しているとあるGPU1台で計算した 時間あたりのlossの変化(イテレーション100000で終了)

## サーバー1台1GPU
- tensorflow付属のcifar10_train.py
    - サーバー1台, 1GPU
- tensorflow付属のcifar10_multi_gpu_train.py
    - サーバー1台, 1GPU

の比較

![1S1GPU.png](https://qiita-image-store.s3.amazonaws.com/0/63479/9e3e242b-7f80-34c5-f75b-100d796c2f2d.png)

1台の場合は予想通り？一緒でした。

## サーバー1台4GPU
- tensorflow付属のcifar10_multi_gpu_train.py
    - サーバー1台, 4GPU
   
- 分散版cifar10
    - サーバー1台, 4GPU, パラメータサーバー2台

の比較

![1S4GPU.png](https://qiita-image-store.s3.amazonaws.com/0/63479/4d77c037-ea8a-9691-2218-6273ec47969f.png)

イテレーションあたりのlossの変化はだいたい同じぐらいでしたが時間あたりの変化に差がでています。
重み更新時 lossが4つ計算おわるまで待ってから更新(cifar10_multi_gpu_train.py)とlossが4つたまれば更新(SyncReplicasOptimizer)の差が出た感じでしょうか。

## 5台20GPU

タイトルの

- 分散版cifar10
    - サーバー5台, 20GPU, パラメータサーバー10台, 1G NIC
    - サーバー5台, 20GPU, パラメータサーバー10台, 10G NIC
    - サーバー5台, 20GPU, パラメータサーバー10台, InfiniBand

の比較。

![5S20GPU.png](https://qiita-image-store.s3.amazonaws.com/0/63479/92e11857-0a83-8e4c-f9d6-8a8fbdf9a7b2.png)

こちらもイテレーションあたりの変化はほぼ同じになり時間あたりの変化に差が出ています。

もっともパラメータサーバーへの通信が集中したサーバーでは常時2.5Gbpsの通信が発生しました(10G,infiniband)。
1GのNICの場合は最大速度は1Gbpsに制限されているのにでは同期に時間がかかり100000イテレーションに到達するまでに23時間とinfinibadの5倍以上時間がかかりました。 

通信が10Gbpsを超えないようであればinfinibadの低レイテンシの分10Gnicより有利なようです。
このちょっとした差でinfinibad使うかどうかは実験の規模によりそうですね。

## 全部の結果

![all.png](https://qiita-image-store.s3.amazonaws.com/0/63479/0c1a89c4-2275-c9f8-08fc-850a6ab35037.png)

1Gnicではすぐにボトルネックになりそうな感じです。
10Gnicか効率の良い分散学習方法が必要になりそうです。

RDMA使った分散学習もそのうち試してみたいです。
socket.io接続中はsessionが更新されない？

#0.はじめに
session情報が更新されない事象があったのでその内容と回避策をメモ的に記述します。
結局原因はわかりませんでした・・・

#1.環境

- express-sessionを使います。
- セッションDBとしてPostgreSQLを使用。connect-pg-simpleを使います。
- （関係あるかわかりませんが）pgpool-IIも使ってます。

#2.事象
WEB画面よりPOST通信した後、session内に情報を更新し保存します。
ですが、session情報が更新されない事象が発生しました。

```
req.session.data1 = 'sample_data_1';
req.session.save();
```

WEB画面よりPOST通信する前にsocket.ioの接続をしておりました。
この状態だとsession情報が更新（正確には保存）されないようです・・・

socket.io未接続時においては更新（保存）されました。

#3.原因
不明です。
回避策として、「session情報を更新する際はsocket.io未接続にする」ことにしました。
Network > Link > TCPとUDPの違いを10個挙げてみる

UDP通信でパケットロスが発生する状況にある。

その対策をどうするか。

1. UDPにてパケットロス時に再送する
2. TCPを使う

など。

ただし、TCP自体は僕は経験が浅いため、TCPを使うかどうかは予備調査が必要となる。

TCPとUDPの違いについて詳しい記事がありました。
TCPとUDPの違いを10個挙げてみる by ikeasさん
http://d.hatena.ne.jp/ikeas/20100415/1271338590

情報感謝です。

ネットワークのトラブルでTCPにて輻輳制御が多くなる場合の状況などが懸念事項。
輻輳制御が多い場合に、デバッグをどうするのかということも検討課題。

### 他のリンク

関連 [Simulate delayed and dropped packets on Linux](http://stackoverflow.com/questions/614795/simulate-delayed-and-dropped-packets-on-linux)

関連 http://www.n-study.com/network/congestion.htm
> グローバルシンクロナイゼーションが発生すれば、多くのアプリケーションで一度に送信レートが下げられるのでふくそうは解消しますが、帯域幅の利用効率が悪くなるという問題点があります。

http://takyaku.com/?p=757
> TCPはそもそもの設計思想がスループットを優先する仕組みになっています。
スループットが優先されるシステムやサービスでは、ウィンドウサイズの操作による輻輳制御はとても有効に作用します。
しかし一つ一つの通信が小さく、短い時間で終了し、手数も馬鹿みたいに多い広告配信においては、ウィンドウサイズによる輻輳制御はまったく有効に機能しません。
どーしても忘れるbashシェルの履歴補完で前方一致

# はじめに
ターミナルで操作するUNIX系サーバーや、MAC...
新しく構築したり、買ったとき便利だから **シェルの履歴補完で前方一致** を設定するのだが、いつもやり方というか、設定文字列をわすれる・・（´・ω・｀）ｼｮﾎﾞｰﾝ

なので、覚え書きしておく・・・

あ・・・
これを設定すると、コマンドプロンプトにコマンドの途中まで入力し↑（上矢印キー）を押すたび、入力しかけたコマンド文字と同じ過去の入力したコマンドが表示されます。
過去のコマンドを再実行したいけど、全部覚えてなかったり、全部入力するのが手間なとき非常に便利です。

# 設定ファイル
以下のいずれか

- ~/.bashrc
- ~/.bash_profile

# 設定文字列

```bash
bind '"\C-n": history-search-forward'
bind '"\C-p": history-search-backward'
# 上矢印キー
bind '"\e[A": history-search-backward'
# 下矢印キー
bind '"\e[B": history-search-forward'
```
# 関係ないけど、いつもおまけにつけるalias設定

```bash
alias ll='ls -la'
alias h='history 25'
```
# 急いで反映させるには〜

- source ~/.bashrc
- source ~/.bash_profile

# 最後に

- わすれんじゃねーぞ・・・
cakephp3 別のDBを使う switch datasources

app.php に以下を追加

```

'betudata' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => '111.222.33.44',
            //'port' => 'non_standard_port_number',
            'username' => 'your',
            'password' => 'yourpass',
            'database' => 'dbname',
            'encoding' => 'utf8mb4',
            'flags' => [],
            'cacheMetadata' => true,
            'log' => false,

        ],

```

コントローラーでもモデルでも。
```
//use Cake\Datasource\ConnectionManager;

$conn = ConnectionManager::get('serposcope');

        $res = $conn
            ->newQuery()
            ->select('*')
            ->from('users')
            ->execute()
            ->fetchAll('assoc')
```
Pythonで処理の時間を計測する冴えた方法

#バージョン
Pythonは3.6.0をつかっています．
`stop_watch.py`にて

```python
print(f"{func.__name__}は{elapsed_time}秒かかりました")
```
という処理を用いていますが，この記法は3.6.0以上でないと動きません．
自身のバージョンに合わせて適宜書き換えてください．
なお，他の部分に関しては，未確認ですが，3xなら動くと思います．

#関連記事
Pythonで時間をはかるには，基本的には，以下の記事の方法を用います．

[【Python】処理にかかる時間を計測して表示](http://qiita.com/fantm21/items/3dc7fbf4e935311488bc)
[python > 処理時間計測 > time.time() - start_time](http://qiita.com/7of9/items/f64d805ae5e4d886a9c2)
[pythonでメソッドの処理時間を計測する関数](http://qiita.com/sakiyamaK/items/81bcf80ac2729cc8b283)

上記の方法でも，時間は計れます．
しかし，書きたいロジックと時間の計測が一緒になっています．

そこで，ロジックと時間の計測を完全に分離する冴えた方法があるので， 共有します．

#時間を計測する処理

```python:stop_watch.py
from functools import wraps
import time
def stop_watch(func) :
    @wraps(func)
    def wrapper(*args, **kargs) :
        start = time.time()
        result = func(*args,**kargs)
        elapsed_time =  time.time() - start
        print(f"{func.__name__}は{elapsed_time}秒かかりました")
        return result
    return wrapper
```
上記のコードが時間を計測する処理です．
このコードにはデコレータを用いています．
`func`に実際の処理を`start`に計測開始時間を`elaspsed_time`に処理に掛かった時間を格納しています．
デコレータについて，詳しく知りたい方は，こちらの記事に詳しく書いてくださっています．
[Pythonのデコレータを理解するための12Step](http://qiita.com/_rdtr/items/d3bc1a8d4b7eb375c368)


#実際の使い方

```python:test.py
from stop_watch import stop_watch

@stop_watch
def func() :
    j=0
    for i in range(99999999) :
        j+=i
    print(j)

func()
```

実際の使い方は，このようにします．
時間を計測したい関数の上に，`@stop_watch`と書いて上げるだけです．
(*なお，同一ディレクトリ(フォルダ)に上記の`stop_watch.py`と以下の`test.py`があるという前提です．違う場合は，適宜インポート処理を書き換えてください)


結果は，

```:result
4999999850000001
funcは6.330682277679443秒かかりました
```
のように表示されます．
1行目に時間を計測したい関数の結果が表示されます．
2行目に時間を計測したい関数の名前と，その関数の実行に掛かった時間が表示されます．

#雑感
ロジックと関係ないけど，何か結果が見たい場合，デコレータが輝くと思います．
今回は，時間の計測というタスクでした．
何かのお役に立てばなと思います．