OmniAICreator/Qiita-1.07M huggingface dataset:
ImageIOを使ってbyte配列の画像データをoutputstreamに書き込む

# はじめに
ImageIOを使ってbyte配列をoutputStreamに入れようとしたら色々はまったので、メモとして記事にします。

# とりあえずなんとかなったソース
``` java
    public void writeOutputStream(byte[] byteArray, OutputStream outputStream, String fileFormat) throws IOException {
        ByteArrayInputStream imageInput = new ByteArrayInputStream(byteArray);
        BufferedImage buffer = ImageIO.read(imageInput);

        ImageWriter writer = null;
        Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName(fileFormat);
        if (iter.hasNext()) {
            writer = iter.next();
        }

        ImageWriteParam param = writer.getDefaultWriteParam();
        if (param.canWriteCompressed() && fileFormat.equals("jpg")) {
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            param.setCompressionQuality(0.5f);
        }

        ImageOutputStream ios = ImageIO.createImageOutputStream(outputStream);
        writer.setOutput(ios);
        IIOImage iioImage = new IIOImage(buffer, null, null);
        writer.write(null, iioImage, param);
    }
```

# ソースの説明
説明はそんなにいらない感じだと思いますが、ひっかかりそうな点を説明していきます。

## 引数の前提
* byteArrayには画像データのbyte配列が入っている
* fileFormatには"jpg"や"png"、"gif"なんかのファイル形式が入っている

## ImageWriteParamの話
今回、画像の圧縮をするという任務があったため、ImageWriteParamを使う必要がありました。
今回最大にはまったのはこの部分で、圧縮する条件が厳しくJPEG or GIFのみが可能でPNGはExceptionが発生してしまいます。
無理やりJPEGのwriterを使ってPNGの圧縮をすることも可能ですが、残念ながら使い物にはなりませんでした。

なので、今回は`param.canWriteCompressed() && fileFormat.equals("jpg")`の判定を入れることにしました。
`canWriteCompressed`はImageWriteParamの種類によって変わり、上に書いたように`getImageWritersByFormatName`から取り出していくとJPEGとGIFはtrue、PNGはfalseと返ってきます。
さらにJPG判定を追加していますが(本当は"jpeg"も必要)、これはGIF画像の場合`setCompressionType`も指定せねばExceptionが発生するようですが、何を指定すればいいかよくわからなかったので入れました。

JavaDoc
https://docs.oracle.com/javase/jp/7/api/javax/imageio/ImageWriteParam.html

## 書き込みの話
書き込みにはImageWriteを使って書き込みますが、実際に書き込むObjectをsetOutputする際には特定の形式に変換しなければなりません。
ImageIOクラスにcreateメソッドがあるのでそれを使ってImageOutputStreamに変換すればよいのですが、具体的にどのクラスであれば書き込み可能であるかは調べてません。
とりあえずはこれで変換しておけば問題ないのですが、getImageWritersByFormatNameから取り出したwriterの中にImageOutputStreamが許容されてない場合があると面倒です。

PNG、JPEG、GIFで試した限りは全部大丈夫だったので、普段使いには問題ないと思います。
独自にImageWriteを作りたい場合は、大丈夫かどうかをきちんと考えないと痛い目にあう可能性があるので注意が必要です。

圧縮したりの最適化処理をせず直接OutputStreamに書き込みたい場合はImageIO.writeでさくっと出来るので許容されているOutputStreamに変換という手順は必要なく書き込むことが出来ます。
PCをローカルサーバーとして立ち上げて、スマホからそのサーバーのページを開きたい時の手順

* 最近の新しいMacは最初からPHPやApacheが入っているので、MAMPインストールなど不要で、すぐローカルサーバーを立ち上げられる。便利。


## Apacheを起動する

`$ sudo apachectl start`


## PCのブラウザで確認する

* `http://localhost`をブラウザで開く。

	- 「It works!」と表示されていることを確認する。


## スマホのブラウザで確認する

* スマホとPCで同じwi-fiを使い、スマホからPCのプライベートIP`(http://192.168.xxx.xxx)など`のページを閲覧できる。


## (ページを書き換えたいときは)

* デフォルトだと`/Library/WebServer/Documents/index.html.en`←これが、ドキュメントルートになっていると思うので、ここを編集する。



### memo

(1) __プライベートIPの確認方法__
wi-fiに接続して、[Launchpad] -> [システム環境設定] -> [ネットワーク]と進み、IPを確認する。
Object#tapでbreak(値)すると値を返せる、のはなぜ？

https://ruby-doc.org/core-2.4.1/Object.html#method-i-tap

![image.png](https://qiita-image-store.s3.amazonaws.com/0/16626/9b3f31b8-9ede-be7e-1d85-64c8498d1db2.png)


公式っぽいドキュメントにはbreakしたら値が戻るとは書いてないんだけど、なぜかそうなる裏テク。
https://www.google.co.jp/search?q=rails+tap+break

コード見ても元のobjが返りそう。
なんでなんで。
rb_yieldはobjを書き換えるのか？


# yieldしたprocの中でbreak
```rb
def aaa
  yield
  return "123"
end

aaa{ break "456" } #=> "456"
```

これだー。
絶対"123"しか返さなさそうなaaaが"456"を返す。
https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#break

でもそんなこと書いてない。裏テク？



# ブロックの中から 制御構造/break により中断された場合

> ブロック付きメソッドの戻り値は、通常のメソッドと同様ですが、ブロックの中から 制御構造/break により中断された場合は nil を返します。
>
> break に引数を指定した場合はその値がブロック付きメソッドの戻り値になります。
https://docs.ruby-lang.org/ja/latest/doc/spec=2fcall.html#block


これだなあ。
callbackとして渡したblock内でまちがってbreakすると意図しないreturnになっちゃうということだ。
やっぱり裏テクだった。



# Object#as
https://stackoverflow.com/questions/7878687/combinatory-method-like-tap-but-able-to-return-a-different-value

```rb
class Object
  def as
    yield self
  end
end
```

キレイでよさそう。

```
> "1112222".delete("-").as{|x| x[0,3] + "-" + x[3,4]}
=> "111-2222"

> "111-2222".delete("-").as{|x| x[0,3] + "-" + x[3,4]}
=> "111-2222"

> "111-2222".delete("-").tap{|x| break(x[0,3] + "-" + x[3,4]) }
=> "111-2222"

> "1112222".delete("-").tap{|x| break(x[0,3] + "-" + x[3,4]) }
=> "111-2222"
```
fuse-box で tsconfig: paths を解決する

# tsconfig: paths を解決する

fuse-box で typescript のパス解決 (`paths`オプション) ができなかったので調べたところ `alias` オプションを使えば良いとのこと（[参照](https://github.com/fuse-box/fuse-box/issues/563)）

http://fuse-box.org/page/configuration#alias

```js
FuseBox.init({
    alias: {
        "faraway": "~/somewhere/far/away/",
    },
})
```

fuse-box が `paths` を対応するまで `tsconfig` 側と併記する必要がありそう
WPF DataGridの各列幅を同比率のままいっぱいまで広げる

#やりたいこと
こんな感じでDataGridのサイズ自体が変わっても各列幅を追従させたい
![DataGridResizeSample.gif](https://qiita-image-store.s3.amazonaws.com/0/145898/aa23f7c2-138e-2764-40f5-57bf89e632d8.gif)

なんで標準でこの機能ついてないんだろう…

#やってみる
Behaviorを使ったほうが良さそうだけど、View内にしか影響なさそうだし今回はイベントでやってみる
DataGridのSizeChangedイベントに以下を記述する

```csharp
        private void DataGrid_Data_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            var dataGrid = (DataGrid)e.Source;
            var difference = (dataGrid.ActualWidth - dataGrid.Columns
                .Sum(x => x.ActualWidth) -20) / dataGrid.Columns.Count;
            foreach (var col in dataGrid.Columns)
            {
                col.Width = new DataGridLength(col.ActualWidth + difference );
            };
        }
```

やってることは単純で、今のDataGridの幅と各列幅の合計の差を列の数で割って各列幅に足してるだけ
途中で-20とかやってるのはスクロールバーの幅がだいたいこれくらいだったからその分を引いている

ちゃんとスクロールバーの幅を取得できる方法とか、もっといいやり方を知ってる方がいれば教えてください(人∀・)
crontab並べ替え（テキトー）

時系列に並べ替えます。
自分用なので超テキトーです。あしからず。

```ruby
def sort_crontab(str)
  sorted_lines = []

  str.split("\n").each do |line|
    arr = line.split(" ")
    next unless arr[0]
    next if arr[0] =~ /\#/
    min = arr[0]
    hour = arr[1]
    day = arr[2]
    month = arr[3]
    week = arr[4]
    command = arr[5..arr.size].join(' ')
    mdhi_com = [min, hour, day, month, week, command]
    sorted_lines << mdhi_com
  end

  sorted_lines.sort! do |a,b| 
    (a[1].to_i <=> b[1].to_i).nonzero? || 
    (a[0].to_i <=> b[0].to_i)
  end
  
  sorted_lines
end

sort_crontab(str).each { |l| puts l.join(' ') }
```
僕が考えた最強のML環境 on MBP 2017/07版


こんにちわ、ドローンおじさんです。先週人口知能エキスポに行きました。古き良き人工知能が一杯有って、違和感を覚えたんですが、じゃあ自分はほんとに特徴量ガンガン浮かび上がらせるネットワーク組めるのかと自問したときに、自信がなかったのでML再入門してます。

# 目指す環境

- 熱くない
- 計算速い
- 安い
- 可視化出来る

# 環境
MacBookかiPadのブラウザ内でipython notebook
でちまちまかければいいかなぁと。今はまだ人間側の学習段階なので、コードの量も大したことないのでnotebookで全然問題ないはず。ストレージはオンラインで、どの環境からも同じリソースが見えたいけど最悪gist経由で共有でも良いかも。とにかくブラウザだけでサクッとテストできるようにしたい。

可視化は、tensorboardでいい。とにかくグラフ見ないと何が起きているのか、どうなったのかが全然わからんｗｗ

MBPのCPUだとしょぼい学習、低回数でも数十分単位で時間が持っていかれるので、学習時にはML Engineを上手に活用していきたい＞速いし安いし熱くない！

# 注意点
これでTFの環境作るの何回目かわからないけども、かなりverアップが激しかったり、周りのツールのバージョンも連動しているので下記環境は2017/07版ということです。
py3の環境を作ってたんだけど、ML Engine使うには py2じゃなくちゃいけないということです。イマココ

# 1) python 仮想環境
```
cd ~
virtualenv tensorflow2
source tensorflow2/bin/activate
```

# 2) tensorflow 
```
pip install --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.2.1-py2-none-any.whl
```
上記はバイナリ版のインストール、インスコ速度が早いです。
最新版は＞ https://www.tensorflow.org/install/install_mac#the_url_of_the_tensorflow_python_package

# 3) Jupyter Notebook 等

```
pip install jupyter
pip install pandas
pip install matplotlib

```

# 4) ML Engine

```
pip install cloudmlmagic
```

このモジュールを導入することで、notebookのバックエンドをML engineに指定することが出来る。すばらしい。 detalabのnotebookはデフォで使えるらしい。
https://github.com/hayatoy/cloudml-magic

設定

```ipynb
%load_ext cloudmlmagic

%ml_init -projectId PROJECTID -bucket BUCKET -region us-central1 -scaleTier BASIC
```

使い方

```ipynb
%ml_run cloud
```


# 今後の予定

- gfileの使い方
- Datalab上での構築
-
一部のRDSの情報の閲覧だけできるポリシーは作れなかった話

# ポリシー作ってみた

協力会社の人が、「AWSのRDSのリソースの状況とか自分たちでリアルタイムで見たいから、マネジメントコンソールのアカウント欲しい」というので、**特定のRDSの情報を見ることだけできるユーザ**を作ることに。

で、ポリシーの作成とかあまりやったことなかったので、`AmazonRDSReadOnlyAccess`のポリシーのJSONの`Resource`を`"*"`からARN指定に変えればいけるんじゃね？　と思いコピペ＆修正で新しいポリシーをJSONで作ってみる。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "rds:Describe*",
                "rds:ListTagsForResource",
                "ec2:DescribeAccountAttributes",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeVpcs"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:rds:ap-northeast-1:999999999999:db:rds-postgresql-test1",
                "arn:aws:rds:ap-northeast-1:999999999999:db:rds-postgresql-test2"
            ]
        },
        {
            "Action": [
                "cloudwatch:GetMetricStatistics",
                "logs:DescribeLogStreams",
                "logs:GetLogEvents"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

# だめでした

このポリシーを付けたユーザでマネジメントコンソールにログインしたところ、怪しいメッセージが・・・。

`アカウントの属性の取得に失敗しました。特定のコンソール機能に障害が発生している可能性があります。`

RDSのインスタンス一覧を表示したところ、また違うエラーメッセージが。そして、一覧には何も表示されず。

```
User: arn:aws:iam::999999999999:user/testuser1 is not authorized to perform: rds:DescribeDBInstances 
(Service: AmazonRDS; Status Code: 403; Error Code: AccessDenied; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
```

その後、JSONの構造を変えてみたり、アクション名を足したり引いたりワイルドカードやめてみたりとかしたけど、何やってもエラーは変わらず。
もしかして、メッセージ通り何かの障害かもしれないと思い、サポートに問い合わせることに。

# サポートの回答来た

英語で問い合わせたので、回答も英語。Google自動翻訳が以下の通り。

>ポリシーのDescribe*権限は、コンソールからアクセスしたときのリソースレベル権限をサポートしていません。リソースレベルの権限とは、ユーザーがアクションを実行することを許可されているリソースを指定する機能を指します。サポートされていないアクション/権限は、すべてのリソース '*'で許可または拒否する必要があります。

>たとえば、 'rds：DescribeDBInstances'を実行する権限があると言われているエラーの場合、 'rds-postgresql-test1'というリソースでこれを許可し、RDSコンソールを開くと、エラーが発生します。この理由は、RDSコンソールがすべてのリソースを記述し、単一のDBインスタンスだけを記述することができないためです。したがって、コンソールを介して 'rds：DescribeDBInstances'を呼び出すには、すべてのリソース '*'にアクセス権を許可する必要があります。

ということで、**全てのアクションでリソース指定ができるわけじゃない**、ということがわかりました。
`DeleteDBInstance`のアクションとかだと指定できるみたいです。編集系だといけるんでしょうか。
AWSのドキュメントにも少し書いてました。

[IAM と連携する AWS サービス](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)

>API がリソースレベルのアクセス権限をサポートしない場合、ポリシーのそのステートメントは Resource 要素で * を使用する必要があります。

可否の一覧とか無いと思ってググったけど、いい感じのは見つけられなかった。
そういうやり方ができない予感はしていたけど、出来ればポリシー作成時にエラーだして欲しかったぜ。

# 代替案あったら教えて

結局あきらめてすべてのRDSインスタンスのリードオンリー権限で作りました。
もしかしたら、タグで切り分けるとか他に方法があるかもしれません。
誰か知っていたら教えてください。
ExcelのShapes内の順番

Excelマクロで、シートにビットマップを貼り付けたあと、そのイメージを取得しようと思い、Shapesの末尾のものを取得していた。

```vbnet:VBA
Dim img As Shape
ActiveCell.PasteSpecial
Set img = Shapes(Shapes.Count)
img.Width = ActiveCell.Width
```
何もないシートの場合、これでも問題なかった。
ただ、シートにコメントが入っていた場合、コメントのWidth値が変更されてしまった。
最後に入れたモノがShapesの最後に入っていると(勝手に)思っていたが、どうもそうではないらしい。

```vbnet:VBA
ActiveCell.PasteSpecial
Debug.Print "Index=" & Shapes.Count & ", Type=" & Shapes(Shapes.Count).Type & ", Name=" & Shapes(Shapes.Count).Name
Debug.Print "Index=" & Shapes.Count - 1 & ", Type=" & Shapes(Shapes.Count - 1).Type & ", Name=" & Shapes(Shapes.Count - 1).Name
```
```text:結果
Index=3, Type=4, Name=Comment 1
Index=2, Type=13, Name=Picture 1
```
Type=4はmsoComment
Type=13はmsoPicture
ということで、後から入れた(貼り付けた)ビットマップが、Shapesの末尾に入っておらず、元々あったコメントが末尾にある状態だった。

ちゃんとやるなら

```vbnet:VBA
Dim img As Shape

ActiveCell.PasteSpecial
For Each img In Shapes
    If (img.Name = Selection.Name) Then
        img.Width = ActiveCell.Width
        Exit For
    End If
Next img
```
というように貼り付けられたもの(まだ貼り付けた画像が選択状態にあるのでSelection.Nameで取れる)の名前と一致するものを探してやるのが正解かな。

__2017-07-07 追加__
[nukie_53](http://qiita.com/nukie_53)さんからコメントをいただいて、もっと簡潔に解決する方法を教えていただきました。

```vbnet:VBA
Dim img As Picture
ActiveCell.PasteSpecial
Set img = Selection
img.Width = ActiveCell.Width
```
そもそも欲しいのは貼り付けた画像なので、Shapeで受けずにPictureで受けてWidthを変更しています。
画像などはShapeで処理するものだとばかり思っていましたが、こういうやり方もあるんですね。

VBAはなかなか奥が深い。

__2017-07-07 追記その2__
PictureからShapeも簡単に取得できたので追記します。

```vbnet:VBA
Dim img As Shape
Dim pic As Picture
ActiveCell.PasteSpecial
Set pic = Selection

Set img = Shapes(pic.Index)

img.LockAspectRatio = msoFalse
img.Placement = xlMoveAndSize
img.Width = ActiveCell.Width
img.Height = ActiveCell.Height
```
PictureのIndexがShapes内のIndexを指しているようなので、上記のようにするとShapeもうまく取得できました。
git-tip集：ローカルにブランチをサーバから取得

# Gitメモ

やりたいことはlocalにremoteのブランチを持ってきたい。
今まではこんな感じでやったが、もっと便利にしたくて、

```
git branch 'BRANCH_NAME'
git pull origin 'BRANCH_NAME'
```

中々スマートじゃない気がして、
調べたらこんな感じができる

```
git fetch
git checkout test
```

割と大丈夫そうなので、メモしました

参考：https://stackoverflow.com/questions/1783405/how-do-i-check-out-a-remote-git-branch
iOS11では画像をアルバム保存するアプリはPrivacyへの追記が必要になりました

iOS11のbeta版でアプリのデバッグを行なっていたら、以下のようなエラーでクラッシュしました。

```
[access] This app has crashed because it attempted to access privacy-sensitive data without a usage description.  
The app's Info.plist must contain an NSPhotoLibraryAddUsageDescription key with a string value explaining to the user how the app uses this data.
```

どうやらiOS11 later向けに制約が増えていたようです。

■ [CocoaKeys#NSPhotoLibraryAddUsageDescription](
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW73)
`アプリがユーザーのフォトライブラリへの書き込み専用アクセスを求める理由を説明します。`

`UIImageWriteToSavedPhotosAlbum`などを利用して撮影した画像を保存する機能などを提供している場合はiOS11が出る前に`info.plist`にPrivacyの追記をしておいた方が良いですね。

```xml:info.plist
<key>NSPhotoLibraryAddUsageDescription</key>
<string>撮影した写真を保存します</string>
```
C++ で std::vector<派生クラス> から std::vector<基底クラス> に変換する

さて、C++ では次のような `std::vector<派生クラス>` から `std::vector<基底クラス>` への
暗黙的な変換はできません。

```cpp
struct base{
	
};

struct derived : base{
	
};

std::vector<derived*> ary;

// base は derived の基底クラスなので変換を期待するが、こういう変換は無理
std::vector<base*> bases = ary;
```

## ポインタ型からポインタ型へ変換する場合
両方共ポインタ型であればコンストラクタに iterator を渡すことで解決します。

```cpp
std::vector<derived*> ary;

// コンストラクタに begin と end の iterator を渡せばコピーされる
std::vector<base*> bases(std::begin(ary), std::end(ary));
```

## 派生クラスを参照で受け取る

`std::vector<T&>` も同様に iterator でコピーすることができるんですが、`std::vector` で生の参照は保持できないので `std::reference_wrapper` を利用します。

```cpp
std::vector<derived> ary;
std::vector<std::reference_wrapper<base>> bases(std::begin(ary), std::end(ary));
```

こういう利用方法は覚えておくとよさそうですね。
xamppでApacheが起動しない？

xamppでApacheを起動するとThis may be due to a blocked port, missing dependencies, improper privileges, a crash, or a shutdown by another method. Press the Logs button to view error logs and check the Windows Event Viewer for more clues If you need more help, copy and post this entire log window on the forumsとエラーが表示される時の対処法

ポート番号を調べるのが最初ではありますが、
ありがちな例を紹介します。

httpd.confや、confディレクトリ下のconfの、
ファイル内に記載されてる各種パスが間違ってる…

何故か、/xampp/apache/…で始まる記載だが、
実際はC:/pleiades/xampp/apache/…なんですけど、等。

この場合も、上記のエラーメッセージが出て起動しません。

対処法は、当然、パスの編集です。
PHP で Python-Requests な感じで HTTP リクエストをする


[Requests for PHP](http://requests.ryanmccue.info/) を使う。

## install

```
$ composer require rmccue/requests
Using version ^1.7 for rmccue/requests
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing rmccue/requests (v1.7.0): Loading from cache
Writing lock file
Generating autoload files
```

## 使ってみる

サンプルコードを使ってみる。 

```index.php
<?php
require 'vendor/autoload.php';

$headers = array('Accept' => 'application/json');
$options = array('auth' => array('user', 'pass'));
$request = Requests::get('https://api.github.com/gists', $headers, $options);

var_dump($request->status_code);
// int(200)

var_dump($request->headers['content-type']);
// string(31) "application/json; charset=utf-8"

var_dump($request->body);
// string(26891) "[...]"

```

`gist`をとってくるけど、`auth` 情報を書き換えてないので `401` が帰ってくる。

実行結果はこんな感じ。

```shell
 $ php index.php
int(401)
string(31) "application/json; charset=utf-8"
string(83) "{"message":"Bad credentials","documentation_url":"https://developer.github.com/v3"}"
```
Array(配列)をこねくり回すネタ集

前回の[Stringをこねくり回す](http://qiita.com/Saayaman/items/6c98fd27e2469df4b1c0)に続いて、Arrayのネタ集つくりました。
自分用メモな感じです。

## 1. Array.dropFirst() .dropLast()

配列の一番最初の値をなくす / 最後の値をなくす。

```
let arr = ["Mike","Betty","Joe","Heather","Cathy","Malcom"]
      
print(arr.dropFirst())　//["Betty", "Joe", "Heather", "Cathy", "Malcom"]
print(arr.dropLast()) //["Mike", "Betty", "Joe", "Heather", "Cathy"]

print(arr) //　["Mike","Betty","Joe","Heather","Cathy","Malcom"]
```

※メモ：arrayにletコンスタントがついてるので解るように、元々の配列arrは変更されない。
arr自体に変更を加えたい場合は、append()やpopLast()などを使おう

## 2. Array.popLast()
配列の最後を抜き取る！

```
var arr = ["Mike","Betty","Joe","Heather","Cathy","Malcom"]

print(arr.popLast()) // Malcom
print(arr) // ["Mike", "Betty", "Joe", "Heather", "Cathy"]
```
このように、配列の最後だけ抜き取られています。元のデータも変更されるので、配列はvarで指定する。

## 3. Array.append(Any)
配列の最後にItemをぶち込む

```
var elements = [5,3,2,1,4,7,4,5]
elements.append(12)
print(elements)  // [5,3,2,1,4,7,4,5,12]
```

## 4. Array.insert(newElement: <Any>, at: Int)

指定した好きなところにItemをぶち込む。append()と似てますがちょっと違う。

```
var elements = [5,3,2,1,4,7,4,5]
elements.insert(10, at: 3)
print(elements) // [5, 3, 2, 10, 1, 4, 7, 4, 5]
```
at: IntはIndexの数字です。なので、**4番目**加えられています。(arrayのindexは**0から始まる**ため)

## 5. Array.index()色々!
せっかく前回でindexの話が出たのでまとめていきたいと思います。

```
var elements = [5,3,2,1,9,7,4,5]
```

### index(of: Any)
例) 数字の4がいるところのindexを引っ張ってきている

```     
if let index = elements.index(of: 4) {
   print(index) // 6
}
```
Stringでやった場合

```
var elements = ["Nate", "Cate", "Sasha", "Goro", "Gugu", "Imo"]
        
if let index = elements.index(of: "Nate") {
    print(index) // 0
}

```

###  index(after: Int) , index(before: Int)
単純に指定したindex + 1, index - 1。使い道がよくわかってない。

```
let index2 = elements.index(after: 4)
print(index2) // 5
        
let index3 = elements.index(before: 2)
print(index3) // 1 
```

###  .startIndex , .endIndex
```     
let index4 = elements.startIndex
print(index6) // 0
        
let index5 = elements.endIndex
print(index5) // 8
print(elements.count) //8   .countと同じ。
```

##  6. Array.remove(at: index)

index番目のアイテムをArrayから抜く。
せっかくなので、itemを探し出してからremove()しましょう。

```
var elements = [5,3,2,1,9,7,4,5]
if let index = elements.index(of: 4) {
     elements.remove(at: index)
     print(elements) //[5, 3, 2, 1, 9, 7, 5]
}
```

## 7. Array.min, Array.max 

```.swift
let numbers = [1, 6, 3, 9, 4, 6]
numbers.min() // 1
numbers.max() // 9
```

09/01/2017 追記
## 8. 2D Array

初期化

```.swift
var array:[[Int]]  = []

for i in 0...5{
    for j in 0...5{
        array.append([i,j])
    }
}
print(array[3]) // [0,3]
print(array[4][1]) // 4
print(array[3][1]) // 3

```

print(array)の結果

```.swift
[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5], 
[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5], 
[2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5],
 [3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5],
 [4, 0], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5],
 [5, 0], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5]]
```


Array.map



## これからどんどん増やす予定です。
Seleniumを5分で動かしてみる

## はじめに

この記事は、仕組みとかはおいといて、Seleiumの凄さをとにかく見てみたいという方のために書きました。

わずか5分でブラウザ起動、フォーム入力、ボタン入力の操作を自動で行えるようになります。
(前提条件が揃っている場合です。。)

Selenium初心者はここから勉強していくのもありかなと思います。

## 参考
こちらの記事を参考にしました。詳しく書いています。
http://www.kaizenprogrammer.com/entry/2016/11/23/143938

github : https://github.com/adebadayo/selenium_quickstart/blob/master/README.md

## 前提
* PCがMac
* BrowserがGoogle Chrome
* nodeがインストールされている（自分はv7.9.0）

## 手順

### git clone

```
git clone https://github.com/adebadayo/selenium_quickstart.git
cd selenium_quickstart
```

### クロームドライバー追加

```
wget https://chromedriver.storage.googleapis.com/2.25/chromedriver_mac64.zip
unzip chromedriver_mac64.zip
```

### node パッケージ追加

```
npm install
```


### node 実行

```
node quickstart.js
```

5分を切ったら教えてください。
「.android」など、自動で作られるドット始まりのフォルダの保存先を変更する

前回 [eclipse の変更方法](http://qiita.com/krmtyshr/items/a36c54b604b42fba7554)を書きましたが、今回は AndroidStudio。

## .android フォルダの変更
これは AndroidStudio の設定と言うよりは SDK の保存先になりますので、環境変数を設定することで解消します。

``` 
ANDROID_SDK_HOME=C:\dev\hoge 
```

## .AndroidStudioX.X フォルダの変更
これが AndroidStudio の設定ですね。IDEのバージョンに応じてフォルダ名が変わります。
変更するには 「Android Studio」フォルダ内のプロパティファイルを編集します。
※「X.X」の部分はバージョンです

```properties:Android&nbsp;Studio\bin\idea.properties
#---------------------------------------------------------------------
# Uncomment this option if you want to customize path to IDE config folder. Make sure you're using forward slashes.
#---------------------------------------------------------------------
idea.config.path=C:/dev/hoge/.AndroidStudioX.X/config

#---------------------------------------------------------------------
# Uncomment this option if you want to customize path to IDE system folder. Make sure you're using forward slashes.
#---------------------------------------------------------------------
idea.system.path=C:/dev/hoge/.AndroidStudioX.X/system
```

## その他
eclipse の場合、ini ファイルを編集すれば「.gradle」などのフォルダの保存先も変更されますが、AndroidStudio の場合は個別に設定が必要です。
これは AndroidStudio 内の設定画面で行えるので必要に応じて行いましょう。
iOSでselectboxの中身が長い時に省略される問題（jsで全セレクトボックスに対応）

[【iOS】select要素内の文字列が長く、選択肢が省略されてしまう(…表示)場合の対策 - Qiita](http://qiita.com/yukinaka/items/89bc9cf7c9dd58ee9692)

こちらの記事を参考に、最後にこれを追加するとオッケーなのですが、全フォームに対して手作業で追加していくのは面倒です。

```html
<optgroup label=""></optgroup>
```


なので、下記のように書くと勝手に追加してくれます。

```js
$(function() {    
    var ua = navigator.userAgent;
    if (ua.indexOf('iPhone') > 0 || ua.indexOf('iPod') > 0 ) {
            var selects = document.querySelectorAll("select");
            for (var i = 0; i < selects.length; i++ ){
                selects[i].appendChild(document.createElement("optgroup"));
            }
    }
});
```
Visual Basic 改行の文字を詰める

現在、visual basic を勉強しています。質問があります。

ファイルにある文字列：
　      　　　　　　　　　　　　　　　001 aaa 2017-12-04
        　　　　　　　　　　　　　　　　002 bbbb 2017-12-05 SendOrderData: 
                                　　　　　　　　　　　　　　　　　　　　　　　　　　　　 ReceiveString
       　　　　　　　　　　　　　　　 　003 ccccc 2016-09-05 Test order 
                         　　　　　　　　　　　　　　　　　　　　　　　　　　　　　is accepted.
        　　　　　　　　　　　　　　　　004 dddd 2025-09-09

今下のイメージになってほしいです。
![error.png](https://qiita-image-store.s3.amazonaws.com/0/189765/6fbbd53d-fb01-8e2d-b91a-02d9f91bf534.png)

以前に Split(" ")を使って文字の区切りしました。メッセージを改行されましたので、読み込むとき例外が出ました。今度、改行されたメッセージが詰めてほしいです。
教えてください。
お願いします。
Quantopianチュートリアル LESSON 9

[前回](http://qiita.com/driller/items/0af8b83b282d62715e4c)の続きです。

# LESSON 9 Slippage and Commission

## Slippage
### set_slippage()
スリッページを設定する場合には `set_slippage()` メソッドを用います。これも定義なしで存在しています。`initialize()` 関数内で定義する必要があります。
引数に後述するスリッページのモデルを渡します。

```python
set_slippage(slippage.VolumeShareSlippage(volume_limit=0.025, price_impact=0.1))
```

### Slippage Models
スリッページのモデルは `FixedSlippage` と `VolumeShareSlippage` の他、カスタマイズしたモデルを作成できます。
モデルは `slippage` モジュールに属していますが、このモジュールは予めインポートされています。

#### FixedSlippage
bid/askのスプレッドを固定で指定します。流動性の低い銘柄には向いていません。

#### VolumeShareSlippage
キーワード引数 `volume_limit` に出来高に対する注文数の割合を設定します。デフォルトは0.025です。例えば1分の出来高が1000である銘柄に60株を注文した場合、25株、25株、10株と注文が分割されて執行されます。

キーワード引数 `price_impact` にマーケットインパクトとなる定数を設定します。デフォルトは0.1です。出来高と注文数の比率の2乗にこの定数を掛けた値がマーケットインパクトとなります。出来高が1000である銘柄に25株を注文した場合、マーケットインパクトは下記のようになります。

```
0.1 * (25 / 1000) ** 2 = 0.00625％
```

また、約定できなかった注文は当日の引けでキャンセルされます。FixedSlippageモデルと比較して、かなり実用的なモデルと言えそうです。

## Commission
手数料は `set_commission()` メソッドを用います。

```python
set_commission(commission.PerShare(cost=0.0075, min_trade_cost=1))
```

### Commission Models
スリッページのモデルは `PerShare` と `PerTrade` があります
モデルは `commission` モジュールに属していますが、このモジュールは予めインポートされています。

#### PerTrade
1注文当たりの手数料を設定します。

#### PerShare
キーワード引数 `cost` に1株当たりの手数料を設定します。デフォルトは0.0075ドルです。キーワード引数 `min_trade_cost` に1注文当たりの最低手数料を設定します。デフォルトは1ドルです。

[LESSON 8](http://qiita.com/driller/items/0af8b83b282d62715e4c) <--> [LESSON 10](http://qiita.com/driller/items/03661934addccbe6bf29)
個人的Macの初期設定メモ

# 経緯
会社の自分用MacBook Airを初期化したのでメモ。
10年以上もWindowsしか触ってなかったので結構Windowsよりにしています。

## 環境
macOS Sierra 10.12.5

## インストール
- [Google Chrome](https://www.google.co.jp/chrome/browser/desktop/index.html)
- [Firefox](https://www.mozilla.org/ja/firefox/new/)
- [SourceTree](https://www.sourcetreeapp.com/)
- [KeePassX](https://www.keepassx.org/)
- [DropBox](https://www.dropbox.com/ja/)
- [Vagrant](https://www.vagrantup.com/)
- [VirtualBox](https://www.virtualbox.org/)
- [IntelliJ IDEA](https://www.jetbrains.com/idea/)
- [Visual Studio Code](https://code.visualstudio.com/)
- [Google 日本語入力](https://www.google.co.jp/ime/)

## 環境設定系
### キーチェーンアクセスでスリープ
1.アプリケーション ＞ ユーティリティ ＞ キーチェーンアクセス
2.キーチェーンアクセス ＞ 環境設定
3.メニューバーにキーチェーンの状況を表示にチェックを入れる
4.好きな時にメニューバーの南京錠（鍵）アイコンから「スクリーンをロック」

### マウススクロールを反転
1.システム環境設定 ＞ マウス
2.「スクロールの方向：ナチュラル」のチェックを外す

### Dockを自動で隠す
1.システム環境設定 ＞ Dock
2.「Dockを自動的に隠す/表示」のチェックを付ける

### バッテリー残量のパーセントを表示させる
1.1番上のメニューバー右上の電池マークをクリック
2.「割合（％）を表示」をチェック

### メニューバーに日付・秒を表示する
1.システム環境設定 ＞ 日付と時刻 ＞ 時計
2.「秒を表示」のチェックを付ける
3.「日付を表示」のチェックを付ける

### コンピュータ名の変更
1.システム環境設定 ＞ 共有
2.コンピュータ名を変更

### F7でカタカナ、F10で半角英数字に変換といった標準機能にする
1.システム環境設定 ＞ キーボード
2.「F1、F2などのすべてのキーを標準のファンクションキーとして使用」のチェックを付ける

### デスクトップに表示させるアイコンの選択
1.Finder ＞ 環境設定 ＞ 一般
2.「ハードディスク」「接続中のサーバ」のチェックを付ける

### ファイルの拡張子を表示する、フォルダを上部に表示する
1.Finder ＞ 環境設定 ＞ 詳細
2.「すべてのファイル名拡張子を表示」のチェックを付ける
3.「名前で並べ替えるときにフォルダを上部に表示」のチェックを付ける

### ウィンドウの情報を表示
1.Finderの表示を選択
2.タブバーを表示にする
3.パスバーを表示にする
4.ステータスバーを表示にする

### ファイアウォールの設定
1.システム環境設定 ＞ セキュリティとプライバシー ＞ ファイアウォール
2.左下の鍵マークをクリックして解除する
3.「ファイアウォールを入にする」ボタンをクリック

### ディスプレイを切にするまでの時間を調整
1.システム環境設定 ＞ 省エネルギー ＞ バッテリー or 電源アダプタ タブ
2.「ディスプレイを切にするまでの時間」を設定する

### ディスプレイ輝度自動調整をOFFに
1.システム環境設定 ＞ ディスプレイ
2.「輝度を自動調整」のチェックを外す

### スクロールバーを常に表示
1.システム環境設定 ＞ 一般
2.スクロールバーの表示を「常に表示」に設定

## おわりに
結構使いやすくなりましたがまだ増えるかも・・・
【Ansible】自分自身への実行

自分自身への実行をする際のコマンドは下記の通り。
完全な備忘録です。
オプションで**--connection=local**をつけるだけです。
インベントリファイルは不要です。

```
# ansible-playbook 実行したいYAMLファイル --connection=local

例
# ansible-playbook start.yml --connection=local

```
[checkio] Counting Tiles

今回のお題は正方形タイルが8x8で敷き詰められた戦場に、円の半径ニキが出陣し、その半径ニキの爆心エリアに巻き込まれるかわいそうなタイルたちを、完全消失のものと部分消失のものを分けてそれぞれ数えよというもの。

イメージ：
<img width="300" alt="counting tiles2.png" src="https://qiita-image-store.s3.amazonaws.com/0/161122/92a9ce06-e87b-fe23-b30f-025b7a1c059a.png">

どうしろっていうんだ！と最初は解き方がわからず、数学嫌いだった高校生活を呪った。
だがしかし、以下の啓示が天より舞い降り、
・円を４分割して考える。
・左上の円に限って見てみる。
・半径と、そのタイルの左上と右下の中心からの距離を比べ、前者が真の場合は完全なタイル、後者が真の場合は部分的に含まれるタイルとなる。
これで解けるやんけということで無事生還。

###自分の回答
```js
function countingTiles(radius){
    
    //variables
    let peT = 0;
    let paT = 0;
    let bigRad = Math.ceil(radius);
    
    countTiles(bigRad, radius);
    peT*=4;
    paT*=4;
    
    //counting up mates
    function countTiles(a, b) {
        for (let x=0; x<a; x++) {
            for (let y=0; y<a; y++) {
                if ((x==0&&b>=y)||(y==0&&b>=x)) {
                    if (b>=Math.sqrt((x+1)**2+(y+1)**2)) peT++;
                    else if (b>=x||b>=y) paT++;
                }
                else if (b>=Math.sqrt((x+1)**2+(y+1)**2)) peT++;
                else if (b>=Math.sqrt(x**2+y**2)) paT++;
            }
        }
    }
    
    return [peT, paT]
}
```
けっこう簡潔に書けたような気がする。
三平方の定理が当てはめられない、x軸,y軸いずれかが0のパターンを分けたところはちょっと冗長だった。なんとかならんもんか。

###すごいかいとう
```js
function countingTiles(radius) {
  var d = (x, y) => Math.sqrt(x * x + y * y),
      a = Math.ceil(radius), i = 0, x, y, f = 0, p = 0;
  while (i < a * a)
    d((x = i % a) + 1, (y = ~~(i++/a))+1) <= radius ? f++ : d(x, y) <= radius &&  p++
  return [4 * f, 4 * p];
}
```
例の如く何がどうなってるのか全くわからない。

2-3行目では変数をいくつか定義していて、
d...そのポイントの中心からの距離を２つの引数から計算。
a...半径の値を切り上げた数値を格納。
i...~~わからん。~~カウンタ的な？
x...~~わからん。~~そのタイルの右下位置のx座標
y...~~わからん。~~そのタイルの右下位置のy座標
f...完全な方のタイル。
p...部分的な方のタイル。

5-6行目のwhileブロックだけで90度分の円の中のタイルを数えているみたいだけど・・・
まず三項演算子の一つ目の式。

```js
d((x = i % a) + 1, (y = ~~(i++/a))+1) <= radius ?
```
むむ、例えばradius=1.6, a=2として考えてみると、
1週目...i=0
d(0+1, 0+1) <= 1.6 ? //左上位置が[1,1]のタイル
2週目...i=1
d(1+1, 0+1) <= 1.6 ? //左上位置が[2,1]のタイル
3週目...i=2
d(0+1, 1+1) <= 1.6 ? //左上位置が[1,2]のタイル
4週目...i=3
d(1+1, 1+1) <= 1.6 ? //左上位置が[2,2]のタイル

なるほど確かに完全タイルを一つずつ順に見ていっている・・・・

上記の式が真にならない場合は次を実行

```js
d(x, y) <= radius &&  p++
```
これは論理演算子の動き方でみたやつだ！
参考：[JavaScriptの「&&」「||」について盛大に勘違いをしていた件](http://qiita.com/Imamotty/items/bc659569239379dded55) - Qiita

右下位置が最初の式のx,yで定義されているので、それを`d()`に代入して、半径より短い場合は`p++`を実行する。
すごいなー


###学び
*~~number*

- numberの小数点部分を切り捨てる。numberが負の数値の場合はMath.floorと働きが違って、ただ小数点以下をなくすして整数部分を返すだけ。
(参考：[JavaScriptで小数を整数にするマニアックな方法とその実行速度](https://q-az.net/javascript-math-floor-other-method/) - q-az)

*Math.floor(number)*

- numberの小数点以下を切り捨てる。numberが負の値であれば整数部分が1下がる。
例) Math.floor(-4.25)...-5

*%(剰余算)*

- 左のオペランドを右のオペランドで割った余りの数値を返す。左のオペランドの方が小さい場合は左のオペランドをそのまま返す。

`++a`と`a++`の違い

- どちらもincrementするすることには変わりはないが、前置と後置という考え方の違いがあって、具体的な違いとしては、これらを他の変数に代入する場合に、incrementするタイミングが変わる。前置は代入する前にa+1をし、後置はaを他の変数に代入したあとで、aを+1する。厳密に言えば、行を実行する前に加算をするかどうかという違い。
参考：[前置と後置](https://www.ajaxtower.jp/js/ope/index7.html) - ajaxtower,
参考：[JavaScript(2) 前置演算子と後置演算子](http://86707359.at.webry.info/200901/article_7.html) - ゆっくりいこう寅日記

###反省
圧倒的センスを感じた。
あと、前置後置とか論理演算子とか細かい仕様を見落とさずに勉強していく。
Typescript環境でplotlyを用いてデータを可視化する

D3.jsを使いやすくした可視化ライブラリに、plotly.jsというものがあります。
日本ではPythonやR方面からの利用が多いようですが、そもそものjsから利用している人があまりいないようなので、記事にしてみました。

plotlyはまだ型定義ファイルが配布されていないので、npm経由でのimportはせずに

```html
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
```

と大本のhtmlでcdn経由で読み込んでしまうのが2017/07現在の最善策と思われます。

大本のhtmlでplotlyのソースを読み込んであげることで、

```
declare const Plotly: any;
```
として宣言してあげれば、問題なくts側からplotlyを操作できます。

以下は、angular2（実際はangular4ですが）でplotlyを使ったサンプルになります。

```hoge.component.html
<div id="graph"></div>
```

```hoge.component.ts
import { Component, OnInit } from "@angular/core";

declare const Plotly: any;


@Component({
    selector: "hoge",
    templateUrl: "./hoge.component.html",
    styleUrls: []
})
export class HogeComponent implements OnInit {
    public plotly: any;

    constructor() {
        this.plotly = Plotly;
    }

    public ngOnInit(): void {
        this.plotly.plot(
            "graph",
            [{
                x: [10, 11, 12],
                y: [1, 100, 1000]
            }],
            {
                title: "Typescript & angular2 & plotly"
            }
        );
    }
}
```
以上で、

![スクリーンショット 2017-07-05 18.18.27.png](https://qiita-image-store.s3.amazonaws.com/0/56038/24d27391-77e7-3463-4f43-9a76bbffd324.png)



のように、可視化することができました。ご参考まで。
Python3 > in演算子の振る舞い > 'e' in ('yes')と 'e' in('yes', 'no') > 優先演算の括弧、リストの括弧 | 'e' in ('yes',) はFalse

@shiracamus さんの[こちらのコメント](http://qiita.com/masushin/items/5046df9090e3add4d773#comment-8a1e4a30b0f927899904)が気になりました。

以前教えていただいたのはこちら。
http://qiita.com/7of9/items/19398f51a9aa1d10ce38#comment-987175c746eedbc1baa3

> ```py
>>> 'e' in 'yes'
True
>>> 's' in 'yes'
True
>>> 'es' in 'yes'
True
```

気になった振る舞いを再現するため、以下を実装した。
https://ideone.com/Rulkb3

```py
#
tag = "d"
if tag in ("ruby", "dot"):
	print("1: yes")

print('e' in 'yes')

#
tag = 'e'
if tag in ('yes'):
	print("3: True")
if tag in ('yes', 'no'):
	print("4: True")
```

```
Success	time: 0.02 memory: 27624 signal:0
True
3: True
```

4がTrueにはならない。

### link

in演算子は`__contains__`を使うようだ。
[`object.__contains__(self, item)`](https://docs.python.jp/3/reference/datamodel.html?highlight=__contains__#object.__contains__)

in ('yes')の場合は、itemが'y', 'e', 's'となり、
in ('yes', 'no')の場合は、itemが'yes', 'no'となるように思う。

### 教えていただいた事項

@shiracamus さんの[コメント](http://qiita.com/7of9/items/e3e1db52370559f2264f/#comment-3cdbfd9af4ceee50da01)にて優先演算の括弧とリストの括弧の違いを教えていただきました。

情報感謝です。
VB6.0基礎中の基礎

## 書き方

```vb
Private Sub Form_Load()
    MsgBox "Hello World"
End Sub
```

Private Sub ~ End Subまでが肩書き
Form_Loadが名称
()が伝言を意味する。

## フォームイベント

|イベント|処理内容|
|----|----|
|Activate|フォームがアクティブになったときに行う処理を記述|
|Click|フォームの内側をクリックしたときに行う処理|
|DblClick|フォームの内側をダブルクリックしたときに行う処理|
|Deactivate|フォームがアクティブでなくなったときに行う処理|
|initialize|一番最初に行う処理|
|Load|フォームを開く直前に行う処理|
|Resize|フォームのサイズが変わったときに行う処理|
|Unload|フォームを閉じる直前に行う処理|

## ret

```vb
Private Sub Form_Load()
    ret = MsgBox ("Hello World",vbOkCancel)
    msgbox ret
End Sub
```

retは戻り値を受け取る命令語
またMsgBoxに渡す引数を()で囲まないとコンパイルエラーが起きてしまう。
よって上記のプログラムの流れは

1. Hello Worldと表示されOK,キャンセルボタンが表示される。
1. OKの戻り値である定数１、キャンセルの戻り値である定数２がretに格納される。
1. その戻り値が表示される。

の流れで表示される。

## Input Box

入力ボックスを作成するときに使用する。
またInput Boxは`msg box`と同様に ***戻り値を返すタイプの関数*** であるため`ret`を使用する。

```vb
ret = Input Box ("ここに文字を入力してください。")
Label1.Caption = ret
```

CaptionはLabelコントロールに表示する文字そのものを指定するプロパティのこと。
よって入力した値がLabel1に反映される。

## Dim
複数の戻り値を受け取る場合に初めに変数を宣言する。

```vb
Option Explicit
Private Sub Form_Load()
    Dim ret1
    Dim ret2

    ret1 = InputBox(" ここに値を入力してください ")
    ret2 = InputBox(" ここに値を入力してください ")
    Label.Caption = ret1 + ret2
End Sub
```

`Option Explicit`は変数宣言を必ずやることを明示している。
またForm_Loadプロシージャの外側に位置することで、全体に有効となる。

上記のコードは２回の入力値を連結させLabelに表示させる。
ここで注意しなければならない事はデータ型のデフォルトがString型となっているため

```vb
Dim ret As integer
```

のように`As`を用いてデータ型を指定することを行う。
また短縮も可能となっており

```vb
Dim ret%
```

のように記述しても上記と同じ意味になる。
他のデータ型も短縮が可能なものがあり、型宣言文字一覧を以下の表で表す。

| データ型 | 機能 | 型宣言文字 |
|----|----|----|
|String|文字列型|$|
|integer|整数型|%|
|Long|長整数型|&|
|Single|単精度浮動小数点型|!|
|Double|倍精度浮動小数点型|#|
|Currency|通貨型|@|

## IsNumeric
この関数は数値かどうかの判定をする関数であり、
数値であればtrue、数値以外であればfolseが返ってくる。

```vb
Dim ret1%
Dim ret2$

ret1 = 1
ret2 = 1

IsNumeric(ret1)    #true
IsNumeric(ret2)    #folse
```

## 改行

```vb
MsgBox("あいうえお"+Chr(13)+"かきくけこ")
```

改行は ***13*** という値を持っている。
Chr関数より周りの文字列と同等のStringクラスにすることで、改行として扱うことが出来る。
よって上記コマンドは

```vb
あいうえお
かきくけこ
```

と表示される。
Intel Euclidのリカバリ（初期化）方法

注意:
自己責任でこの手順をおこなってください。

#この記事を読んでわかること
Intel Euclid Development Kitの工場出荷状態(？)に戻す方法。


#この記事を読んでわからないこと
副作用。つまり、この操作をして、購入時とのEuclidと本当に変わらなくなるのか。失われる情報はないのかは謎。

# 手順概要
- 以下のインテルフォーラムサイトからインストールイメージファイルをダウンロードする。
https://communities.intel.com/external-link.jspa?url=https%3A%2F%2Ftinyurl.com%2Fy9wb43me

- RufusでそのファイルをUSBメモリに焼く。このとき、MBR partition (中略)を選ぶ。
https://rufus.akeo.ie/

- F5連打しながらEuclidを起動。
- BIOS画面が出たら、ESCを押し、Boot Managerではなく、Boot optionみたいなのを選択。起動順番を入れ替え、ubuntuを最後にする。設定を保存して再起動。
- 起動スプライト画面にバージョン情報が書いてなければ、リカバリメディアの起動成功
- ほっておくとライセンス確認ダイアログが出るので確認の上ACCEPTボタンを押す。
- ほっておくとリカバリが終わる。途中で再起動が起きるかもしれない。

# 参考文献
[1] https://communities.intel.com/message/479790#479790
[2] https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-windows#1

需要があれば、背景とかを書くかも
『パーフェクトPHP』のフレームワーク

#パーフェクトPHP
書籍[『パーフェクトPHP』](https://www.amazon.co.jp/dp/4774144371)に掲載されてるフレームワークの構造を図解メモ
<img width="960" alt="20170705パーフェクトPHP.png" src="https://qiita-image-store.s3.amazonaws.com/0/76471/ce206044-4f9c-44fc-19bc-6bcf3153a2e8.png">

※[サポートページ](http://gihyo.jp/book/2010/978-4-7741-4437-5/support)
iOSのIPv6テスト環境構築でハマったこと

IPv6テスト環境構築でかなりハマったので備忘録。

基本は<a href="https://goo.gl/pHEzeH">本家</a>通りの設定で問題ないが、iPhoneからMacに接続する際にドハマリした。

#iPhoneのWi-Fiから共有したネットワークが見つからない問題
Mac側で作成したNAT64ネットワークのWi-Fiに接続しようにもiPhoneの「ネットワークを選択」以下に中々表示されない。

##解決方法
ひたすら待つorWi-Fiのオン、オフを繰り返す。

#正しいパスワードを入力しているのに「｛ネットワーク名｝のパスワードが正しくありません」で接続できない問題
ネットワークが見つからない問題が解決したと思ったら、今度はWi-Fiオプション設定時に入力したパスワードでログインできない。「｛ネットワーク名｝のパスワードが正しくありません」のポップアップが表示され続けイライラはピークに。

##解決方法
Wi-Fiオプションを設定する際に、チャネル数はデフォルトで11（2.4GHz帯）が選択されているのだが40（5GHz帯）に設定を変更して接続できるようになった。

ふぅ。。
[ruby]値が範囲内に存在するかbetweenでチェック（数、文字、日付）

参考：[知って得する！５５のRubyのトリビアな記法](http://melborne.github.io/2013/03/04/ruby-trivias-you-should-know-4/)

範囲内にあるかどうかは、`between?`でチェックできる。

Comparableモジュールをインクルードしている
数(Numeric)、
文字(String), 
シンボル(Symbol)、
日付(Time)、
で利用できる。:grapes:


```ruby
48.between?(0, 50)
# => true

'D'.between?('A', 'C')
# => false

:b.between?(:a, :d)
# => true

now = Time.now
now.yesterday.between?(now.prev_week, now.next_week)
# => true
```
Apache Edgentの紹介

# Apache Edgentとは？
[Apache Edgent](http://edgent.apache.org/)とはエッジサイドデバイス向けのリアルタイム・ストリーム処理フレームワークです。[Apache Storm](https://storm.apache.org/)などはクラウド上で分散ストリーム処理を行うのに対し、Apache Edgentはエッジサイドの単一のデバイス上でストリーム処理を行います。

エッジサイドデバイス、特にIoTデバイスのユースケースとしては

- センサーから定期的に取得し
- データをフィルタリング・変換を行い
- 機器の制御を行ったり
- 必要な数値データのみをクラウドに蓄積する

というものが多いと思います。
Apache Edgentを使う事でエッジサイドで行われる一連のストリーム処理を簡単に実現できそうです。

以前はApache Quarksという名前だったようです。
同様のプロジェクトとして[SensorBee](http://sensorbee.io/)があります。

# 使い方
Apache EdgentはJava7/Java8/Androidを使ってストリーム処理を書くことができます。

```Java
import java.util.concurrent.TimeUnit;

import org.apache.edgent.providers.direct.DirectProvider;
import org.apache.edgent.topology.TStream;
import org.apache.edgent.topology.Topology;

public class TempSensorApplication {
    public static void main(String[] args) throws Exception {
        TempSensor sensor = new TempSensor();
        DirectProvider dp = new DirectProvider();
        Topology topology = dp.newTopology();
        TStream<Double> tempReadings = topology.poll(sensor, 1, TimeUnit.MILLISECONDS);
        TStream<Double> filteredReadings = tempReadings.filter(reading -> reading < 50 || reading > 80);

        filteredReadings.print();
        dp.submit(topology);
    }
}
```
Python対応なども議論に挙がっているようですが当面は対応しないようです。
[Getting Started](http://edgent.apache.org/docs/edgent-getting-started)を試してみると実装の感覚がつかめるかと思います。

# 将来性
[Apache incubator](https://ja.wikipedia.org/wiki/Apache_Incubator)に参加している事ですし、今後も継続的に開発が行われていく予定だと思います。活発とは言えませんがコミット自体はされていました。
2016年2月からプロジェクトが始まったようなので、今後に期待です。
ちなみに、コミッターはほとんどIBMの人です。

# リンク
- [プロジェクトページ](http://edgent.apache.org/)
- [Getting Started](http://edgent.apache.org/docs/edgent-getting-started)
- [Github Repo](https://github.com/apache/incubator-edgent)

現在、日本語の記事・ドキュメントは探した限り無かったので増えていくといいなーと思っています。
EmEditor 上で書いた Ruby のコードを動かして結果を後ろに挿入する


# はじめに

テキストエディターで何かを編集中，ちょっと何かを計算させたり，何らかのプログラムを実行させてその結果を使ったりしたいときがある。

いちいちコマンドラインに移ってやるのは面倒。

ここでは，Windows 用テキストエディターである [EmEditor](https://jp.emeditor.com/) 上で選択状態にしたテキストを Ruby の式として評価した結果をうしろに挿入させる，ということを EmEditor のマクロで実現させてみる。

# マクロのコード

EmEditor のマクロはいろんな言語で書けるが，ここでは JavaScript を使ってみよう。

以下のようなファイル（拡張子は `.jsee`）をマクロ保存フォルダー（My Macros）に入れると，マクロのメニューから呼び出すことができる。


```js:ruby-eval.jsee
// 選択部分を Ruby の式として評価した結果を
// 選択部分のあとに「 #=> 」に続けて挿入する

var WshShell = new ActiveXObject("WScript.Shell");
var ExecCmd = WshShell.Exec('c:\\ruby24-x64\\bin\\ruby.exe -e "print(eval(STDIN.read))"');

ExecCmd.StdIn.Write(document.selection.Text);
ExecCmd.StdIn.Close();
while (ExecCmd.Status == 0) {
    Sleep(10);
}
if (ExecCmd.ExitCode == 0) {
    result = ExecCmd.StdOut.ReadAll();
} else {
	result = "ERROR\n" + ExecCmd.StdErr.ReadAll();
}

document.selection.CharRight(false, 1);
document.selection.Text = " #=> " + result;
```

冒頭の `WshShell.Exec`  の引数に Ruby 実行ファイルへの絶対パスがあらわに書いてあるので，ご自分の環境に合わせて書き換えられたい。

このマクロは，`ruby` コマンドに対して，実行すべき式（スクリプト）を標準入力で与えているところがポイント。

というのは，式を ruby コマンドの `-e` オプションで直接与えようとすると，エスケープやらなんやら非常にややこしい話になってしまうから。
標準入力ならそういうことを考えなくて済む。

なので，ruby の `-e` オプションには単に

```rb
print(eval(STDIN.read))
```

を与えている。

実行コマンドに標準入力を与えるのは `ExecCmd.StdIn.Write` の役割だ。

同様に，実行結果も `ruby` コマンドが標準出力に書き出したものを拾って，EmEditor の編集テキストに挿入している。

なお，実行が失敗した場合（ステータスが 0 でない場合）は標準エラー出力を拾って挿入する。

# 注意点

どうやら，この方法で EmEditor から `ruby` コマンドへ渡されるテキストは Shift JIS であるらしい。

よって，実行させたいコードに非 ASCII の文字列が入っていたりすると，期待通りに動かないことがある。

いまのところ解決策は見つけられていない。



# 参考ページ

この記事は下記の記事に触発されて書きました。スクリプト自体もかなりストレートに ~~パクり~~ 参考にしました。記事の著者に感謝します。

[EmEditorでPowerShellコマンドを実行し、入力補助機能として使用するためのマクロ - Qiita](http://qiita.com/alg/items/ff0b87338a3802b1ec56)

# 関連記事

[CotEditor 上で書いた Ruby のコードを動かして結果を後ろに挿入する - Qiita](http://qiita.com/scivola/items/d9f5aa8f8bbb17d4eef3)
Laravelで、単一テーブル継承（STI）を簡単に実現

単一テーブル継承の理解が間違っていたらごめんなさい。

Laravel 5.2 から、 `Global scope` という機能が使えるようになった。

これにより、全てのクエリに自動的に条件を追加できるため、クラスの継承を使い、同一のテーブルを性質に分けて実装することが可能。

例えば、Q&Aサイトなどで、投稿（`posts`） の種類として 記事（`article`） と 質問（`question`） に分けられるとする。

`posts` は `tags` や `users` と関連があり、その処理は共通化したいため一つのテーブルに収めたい。
`article` と `question` には固有の処理を持たせたい。

こんな状況だと

```php
class Article extends Post
{
    protected $table = 'posts';

    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('article', function (Builder $builder) {
            $builder->where('type', 'article');
        });
    }
}

```

これにより、 `where type = 'article'` が全ての `Article` が発するクエリに付加される。

```php
>>> App\Article::where('id', 1)->toSql()
=> "select * from `posts` where `id` = ? and `type` = ?"
```

実際、Laravelの提供する `SoftDeletes` トレイトもほぼ同じように実装されている（らしい）。
Ubuntu 16.04におけるmysqlのインストールと設定、エラー対応のまとめ

#背景
Ubuntu 16.04のサーバーにMySQLをインストールする時に、何回も同じ問題が出ていたので、Ubuntu 16.04におけるmysqlのインストールと設定、エラー対応などをまとめておく。

#インストール
```
sudo apt-get install mysql-server
```

通常、このコマンドを実行すると、MySQLの初期設定画面が出て、初期パスワードなども設定できるはずだが、出ない時もあった。というか、私の場合、ほどんど出なかった。

#エラー 1 : 初期設定のパスワードがわからない

初期設定画面が出なかった場合、初期設定のパスワードがわからないので、MySQLをインストールしたものの、使えない。

この場合、mysqlのsafeモードの下で、MySQLの権限システムを使用しないで起動することが可能。従って、safeモードで起動して、rootのpasswordを変えることが考えられる。

その手順は、以下のようになる。

#### a. mysqlを停止

  ```
sudo /etc/init.d/mysql stop
  ```

#### b. safeモードで起動

  ```
mysqld_safe --skip-grant-tables &
  ```

#### c. 他のターミナルを開き、MySQLの権限システムを使用しないで起動する

  ```
mysql -u root
  ```

#### d. user tableのデータを削除し、rootユーザを作成
*このステップで、単なるrootユーザのpasswordを変えることも考えられる。

```
mysql> truncate table user;
mysql> flush privileges;
mysql> grant all privileges on *.* to root@localhost identified by 'root' with grant option;
mysql> flush privileges;
```

#### e. safeモードからexitし、MySQLを再起動

```
sudo /etc/init.d/mysql restart
```

#エラー 2 : MySQLのsocketファイルが見つかれない
エラー 1の対処で、 以下のようなエラーが出る場合がある。

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
```

この場合は、見つかれないパスの下にファイルを作っておけば解決できる。

対処コマンド:

```
sudo touch /var/run/mysqld/mysqld.sock
sudo chown mysql:mysql /var/run/mysqld/
sudo /etc/init.d/mysql restart
```

#備考
MySQLが正常にインストールされ、 パスワード再設定を含め、 初期設定を行いたい場合、 以下のコマンドで設定できる。

```
mysql_secure_installation
```

#参照文献

1. [MySQLでの「Access denied for user ‘root’@’localhost’ (using password: NO) 」への対処](http://www.goofoo.jp/2011/11/1457)
2. [ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)](https://stackoverflow.com/questions/21944936/error-1045-28000-access-denied-for-user-rootlocalhost-using-password-y)
3. [mysqlソケットエラー解決法](http://d.hatena.ne.jp/TamaC/20090330/1238418696)
WordPress ショートコードの作成とエディタへのボタン追加

# 仕様

* ショートコードを作る（ショートコードの中身は問わない）
* 投稿作成時にショートコードが挿入しやすいようビジュアルエディタとテキストにボタン追加

# ショートコードの作成
[ショートコードAPI](https://wpdocs.osdn.jp/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89_API) を参考に。
コードはGenerateWPの [Shortcodes Generator](https://generatewp.com/shortcodes/) でオケ。

例：

```php
// Add Shortcode [myshortcode][/myshortcode]
function my_shortcode_func( $atts , $content = null ) {

	return '<div>' . $content . '</div>';

}
add_shortcode( 'myshortcode', 'my_shortcode_func' );
```
# ビジュアルエディタ（TinyMCE）でボタン追加
[TinyMCE Custom Buttons](https://codex.wordpress.org/TinyMCE_Custom_Buttons) や　[Guide to Creating Your Own WordPress Editor Buttons](https://code.tutsplus.com/tutorials/guide-to-creating-your-own-wordpress-editor-buttons--wp-30182) を参考に。

* ボタン追加のPHP
* ボタン用の画像
* TinyMCE用のJavaScript

が必要

```php
// add new buttons
add_filter( 'mce_buttons', 'myplugin_register_buttons' );

function myplugin_register_buttons( $buttons ) {
   array_push( $buttons, 'separator', 'my_shortcode' ); // separator は区切り線（オプション）
   return $buttons;
}
 
// Load the TinyMCE plugin : editor_plugin.js (wp2.5)
add_filter( 'mce_external_plugins', 'myplugin_register_tinymce_javascript' );

function myplugin_register_tinymce_javascript( $plugin_array ) {
   $plugin_array['myplugin_script'] = plugins_url( '/tinymce-plugin.js',__FILE__ ); // TinyMCE用のJS
   return $plugin_array;
}
```


```js:tinymce-plugin.js
(function() {
     /* Register the buttons */
     tinymce.create('tinymce.plugins.MyButtons', {
          init : function(ed, url) {
               /**
               * Inserts shortcode content
               */
               ed.addButton( 'my_shortcode', {
                    title : 'Insert my shortcode',
                    image : url + '/images/btn.png', // アイコン　urlはこのjsのあるディレクトリまで
                    cmd: 'my_shortcode_cmd'
               });
               ed.addCommand( 'my_shortcode_cmd', function() {
                    var selected_text = ed.selection.getContent();
                    var return_text = '';
                    return_text = '[myshortcode]' + selected_text + '[/myshortcode]'; // 挿入されるコード
                    ed.execCommand('mceInsertContent', 0, return_text);
               });
          },
          createControl : function(n, cm) {
               return null;
          },
     });
     /* Start the buttons */
     tinymce.PluginManager.add( 'myplugin_script', tinymce.plugins.MyButtons );
})();
```

# テキストエディタでボタン追加（Quicktags）

コードはGenerateWPの [Quicktags Generator](https://generatewp.com/quicktags/) でオケ。

```php
// Add Quicktags
function myshortcode_quicktags() {

	if ( wp_script_is( 'quicktags' ) ) {
	?>
	<script type="text/javascript">
	QTags.addButton( 'my_shortcode', '[myshortcode]', '[myshortcode]', '[/myshortcode]', '', 'My shortcode',  );
	</script>
	<?php
	}

}
add_action( 'admin_print_footer_scripts', 'myshortcode_quicktags' );
```

現場からは以上です。
Laravelの勉強に使えそうなウェブのページや書籍

Laravelは、次のLTS(Long Term Support)版の5.5が出るようなので、できるだけ最新のバージョンで学習したい、つまり、今なら5.4。

でも、5.4の最新バージョンに追随できているチュートリアルや、まとまっている勉強コンテンツがなかなか見つからない、たぶん、ほとんどないので、最新の動向も調べつつ、過去のバージョンをベースにしたコンテンツで勉強することになりそう。

で、ここでは、参考になりそうなものをクリッピングしておく。
(随時、追記していく予定)

# 入門編
簡単なブログのようなものを作成するチュートリアル的な内容なので、取っ掛かりとしては、入りやすそう。
タイトルが別物のようだけど、CMSを作成してから、それを題材にDBに関係する部分を解説しているので、一連の教材として見ると良さげ。

 - [Laravel5.4でシンプルなCMSを作るチュートリアル | webOpixel](http://www.webopixel.net/php/1259.html)
 - [Laravel5.4で基本的なリレーションを学んでみる | webOpixel](http://www.webopixel.net/php/1261.html)

# 入門から、ちょい上なコンテンツ
アシアルさんのコレは、Vue.jsも使ったチュートリアル的なものなので、超初心者の入門というよりは、少し慣れてからの方が迷わないで進められそう

 - [Laravel 5.4で Vue.js開発環境を手軽に作る : アシアルブログ](http://blog.asial.co.jp/1496)
 -  [Laravel 5.4でWeb APIを作る : アシアルブログ](http://blog.asial.co.jp/1498)
 -  [Vue.js + vuexによるToDoアプリケーションの実装 : アシアルブログ](http://blog.asial.co.jp/1499)

この辺りも、少し上級

 - [Laravel 5.4 と Vue.js 2.2 と JWTAuth で、ログインできる SPA アプリケーションのチュートリアル 1/4 - Qiita](http://qiita.com/acro5piano/items/908cd751b2ea97e19be1)
 - [Laravel 5.4 と Vue.js 2.2 と JWTAuth で、ログインできる SPA アプリケーションのチュートリアル 2/4 - Qiita](http://qiita.com/acro5piano/items/7ae04c0e57d0027f63c9#_reference-054b1c417932d773a175)
 - [Laravel 5.4 と Vue.js 2.2 と JWTAuth で、ログインできる SPA アプリケーションのチュートリアル 3/4 - Qiita](http://qiita.com/acro5piano/items/a2c30bdd2b6f1a0d9c7d#_reference-2c3088c017f5c3c0ba68)
 - [Laravel 5.4 と Vue.js 2.2 と JWTAuth で、ログインできる SPA アプリケーションのチュートリアル その4 - Qiita](http://qiita.com/acro5piano/items/eb29f13b82f386220460#_reference-3f516735e1f0890da252)

# 初歩的なもの

ルーティングやテンプレートの関係がざっくりわかる

 - [Laravel5.4導入とHelloWorld表示までの流れ – 社畜プログラマーだってアニメは見る。](http://mahuyu.main.jp/proani/2017/03/08/laravel5-4%E5%B0%8E%E5%85%A5%E3%81%A8helloworld%E8%A1%A8%E7%A4%BA%E3%81%BE%E3%81%A7%E3%81%AE%E6%B5%81%E3%82%8C/)
 - [Laravel 5.4 (4) ルーティングとビューのちょっとだけ入口 | ほぼWebエンジニアリング](http://munyagu.com/1383/)

DBの設定など、初期設定のことがさらっと書いてある

 - [Laravel 5.4 (2)インストール | ほぼWebエンジニアリング](http://munyagu.com/1323/)

# Laravelの内部構造を知るのに約立ちそう

認証の動きが、ざっくりわかる

 - [Laravel 5.4 (3)ルーティング基礎（認証） | ほぼWebエンジニアリング](http://munyagu.com/1362/)
 - [Laravelの標準Authentication(Auth)の動きを調べてみる - Qiita](http://qiita.com/zaburo/items/9fcf0f4c771e011a4d35)