OmniAICreator/Qiita-1.07M huggingface dataset:
Illustratorのスクリーン用に書き出しを自動化

都内でデザイナー職をやっています

## 目指すこと
<img width="274" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/99161/1e57a755-e898-f9de-b3e9-678bb623eb04.png">
Illustratorの『スクリーン用に書き出し』をスクリプトにやってもらい
アートボードごとにSVGを書き出す


## リファレンスを見る
https://www.adobe.com/devnet/illustrator/scripting.html
JavaScript、VB Script、AppleScript でのそれぞれのリファレンスが
**PDF** がダウンロードできるAdobe公式のページ

### それはやばいものだった
1. PDFである
    - あのAdobeぞ？ Acrobat作っている Adobeぞ？ なので仕方ない
2. PDFにロックがかかっており、テキストのコピーすらできない
    - 英語のため、翻訳しようと思ったときに困る 英語が読めれば問題ないから仕方ない
    - コードもすべて写経しないといけない 写経は大事だから仕方ない
3. スクリーン用に書き出し のスクリプトがない
    - CC2015くらいから導入されたはずだけど まぁ比較的新しい機能だから仕方ない
    - [スクリプトでできるようになったのは CC2018 から](https://forums.adobe.com/thread/2399115)で、CC2017までのリファレンスしかないから仕方ない

**仕方ない**

Google検索で情報を集めることにした

### なお
ドキュメント自体を保存(Cmd+S)させる `exportFile` は[リファレンス](https://www.adobe.com/devnet/illustrator/scripting.html)で解説されている
それでもSVGの出力をすることができるが、元のドキュメントへの影響がありそうなので使わない


## コード
```javascript:export-svg.js
#target "Illustrator";

var doc = app.activeDocument;

// 保存するフォルダを選択させる
var folder = Folder.selectDialog();
if (!folder) return;
var file = new File(folder + '/');

var whatToExport = new ExportForScreensItemToExport();
whatToExport.document = true;

var options = new ExportForScreensOptionsWebOptimizedSVG();
options.coordinatePrecision = 2;
options.cssProperties = SVGCSSPropertyLocation.PRESENTATIONATTRIBUTES;
options.documentEncoding = SVGDocumentEncoding.UTF8;
options.saveMultipleArtboards = true;

// (exportFolder: File , exportFormat: ExportForScreensType , options:any, itemToExport: ExportForScreensItemToExport , fileNamePrefix: string )
doc.exportForScreens(file, ExportForScreensType.SE_SVG, options, whatToExport, '');
```


## 設定の内容
### ExportForScreensItemToExport
<img width="350" alt="スクリーン用に書き出し オプション" src="https://qiita-image-store.s3.amazonaws.com/0/99161/0a359da5-82b3-dbed-f9f8-171e5f355d6d.png">
ここの画面での設定と同じ

|オプション|型(予想)|内容|
|:--|:--|:--|
|document|boolean|不明 trueにするのがよさそう？|
|artboards|string|書き出し範囲のこと<br>`01-50`などと指定<br>省略はすべてのアートボードを出力|
|その他||不明<br>今後のリファレンスに期待|

### ExportForScreensOptionsWebOptimizedSVG
<img width="350" alt="形式の設定" src="https://qiita-image-store.s3.amazonaws.com/0/99161/2da1b63c-0eda-27c3-0bad-0c3a8d8cbe09.png">
この画面での設定と同じ

[リファレンス](https://www.adobe.com/devnet/illustrator/scripting.html)の `ExportOptionsSVG` と同じ内容が書けるっぽい

|オプション|型|内容|
|:--|:--|:--|
|compressed|boolean|svgzに圧縮するかどうか|
|coordinatePrecision|number(long)|小数点以下の桁数<br>パスの精密度に影響|
|cssProperties|SVGCSSPropertyLocation|スタイル<br>インラインスタイルにするかとか|
|documentEncoding|SVGDocumentEncoding|svgファイルのエンコード|
|DTD|SVGDTDVersion|SVGのバージョン<br>`SVGDTDVersion.SVG1_1`とか|
|saveMultipleArtboards|boolean|アートボードごとに保存するかどうか<br>`exportFile`では必要だが、おそらく不要|
|その他||いろいろ|


## おわりに
Adobeのリファレンスについては、もっと扱いやすいようにしてほしさがある
また今回のスクリプトだけでは利点は特にないが、他のスクリプトと組み合わせて楽に仕事をしたい
SION - is now Interchangeable

[SION]は Swift Interchangeable Object Notation から取ったと[紹介記事]で書きましたが、実装が単一言語ではinterchangeableとはとても言えません。というわけでJSの実装を書いたのですが、なんとGoの実装をそれより先に[mattn]が文字通り一晩で書いてくれちゃいましたよ。

[SION]: https://dankogai.github.io/SION/
[紹介記事]: https://qiita.com/dankogai/items/a0b5005b3530a8e273da
[mattn]: https://qiita.com/mattn

というわけで誕生二日目で早くもinterchangeableになった[SION]ですが、

* フォーマットの公式ページを実装ページから分離しました。
  * https://dankogai.github.io/SION/
  * URLダサいので何かとりますかね…
* 前述通り、GoとECMAScriptの実装が加わりました。
  * https://github.com/mattn/go-sion
  * https://github.com/dankogai/js-sion

どちらもドキュ貧なのですが、ここでは私が書いた方のjs-sionの方を少し解説しておきます。

* ESMですモダンです。いやあ楽ですねえ。
* なので[CORS]さえクリアすればこんなことも出来ます。

[CORS]: https://developer.mozilla.org/ja/docs/Web/HTTP/HTTP_access_control

```html
<html>
<head>
    <meta charset="utf-8">
    <title>Console</title>
</head>
<body>
<script type="module">
import SION from 'https://cdn.rawgit.com/dankogai/js-sion/master/sion.js';    
console.log(SION);
window.SION = SION;
</script>
open sonsole and use SION interactively.
</body>
</html>
```

* ECMAScript標準の`JSON`オブジェクト同様、`.parse()`と`.stringify()`が提供されます。
* `Dictionary`はキーが全て`String`なら`Object`に、そうでない場合は[Map]にマップしてます。そうなんです。ECMAScriptでも今や文字列でないキーも使えるんですよ。
* `.Data`は[Uint8Array]にマップしてます。node.jsとブラウザーでここだけ処理を切り替えています。
* 数値は…`Int`も`Double`も`Number`です。が、`.stringify()`では`Int`(で表現可能)なものは10進で、`Double`なものは16進で出力するようにしました。

[Map]: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map
[Uint8Array]: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array

おっと時間もないので今はこの辺で。引き続きSIONをよろしくお願いします。

Dan the Safe, Fast, and Expressive
Dockerチュートリアルをやってみた（２章後半〜３章前半）

前回の続き

```docker login```
dockerIDとパスワードでログインできます。


# タグをつける

タグはオプションだけと強く推奨されるとのこと。

```
$ docker tag friendlyhello kugyu10/get-started:part2
```

これで前回作ったコンテナにタグ（名前）がついた。

# Pushする

```
# docker imageの確認
$ docker image ls
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
kugyu10/get-started   part2               8543f6131f0c        24 hours ago        132MB
friendlyhello         latest              8543f6131f0c        24 hours ago        132MB
<none>                <none>              e3ec34abe801        24 hours ago        120MB
python                2.7-slim            02ca219cf841        2 weeks ago         120MB

# さっきタグつけたイメージをpushする
$ docker push kugyu10/get-started:part2
The push refers to repository [docker.io/kugyu10/get-started]
4300848e2cbd: Pushed 
757f50f4057d: Pushed 
e2806e443186: Pushed 
7dd909bc1884: Mounted from library/python 
13fd5e03bfb3: Mounted from library/python 
28a70ee9f822: Mounted from library/python 
9c46f426bcb7: Mounted from library/python 
part2: digest: sha256:5c7f59a1de25d703195372f3cfee9ab71a181c7267463db72015a647d2005918 size: 1787
```

んん？コレでDockerImageを公開できたってことでいいの？

# dockerHub
名前の通り、GitHubのdocker版

kugyu10のdockerHub
https://hub.docker.com/u/kugyu10/

あ、なんかできてた。
pullコマンドも書いてあるし、これで公開できたってことだと思う。

コレをWindowsにpullしてdocker-for-Windowsとかで
起動してPython環境を用意することもできるってことだね。
試してないけど。


#タグをつけたコンテナを起動

```
$ docker run -p 4000:80 kugyu10/get-started:part2
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)


```

これで２章は終了。３章へ。サクサクだね。

2章までのおさらい。
あくまでぼくの現時点の理解なので間違いあるかも。


docker使うと、コンテナって単位で環境を用意できる。
VMと違ってOSのインスコからやらなくていいのでお手軽。
マシンリソース的にもいいらしい。
「それお前のOSには対応しないねん」問題も起きにくい。

それでいて、環境は別に作れるので、
昔はよくあった「Ruby 2.3系と 2.4系の共存がややこしいのねん問題」とか
現在でもよくある「テスト環境と本番環境と環境が違いすぎてあんまテストになってないねん問題」
ある程度解消できる。

コンテナってのは、docker imageと呼ばれるものをrunすることで立ち上がる仮想環境。
imageは、dockerfile と REQUIREMENTS.txt とその他必要ファイルをビルドして作れる。

imageはdockerHubで公開できる。

オレオレ開発環境もimageをdockerHubで持っておけば
いつPCが水没しても安心！！
あわてて用意した代替機にdocker用意して、イメージpullしてコンテナ起動すれば
あっという間にあなた好みの開発環境が用意できるぜ！

なるほど便利やん。
もう２章の時点で、dockerしない理由が見当たらないんだけど。

なんでうちの会社Gitもdockerも知らないの？


# 第３章 サービス

サービスとは本番環境で動くコンテナのことで
どれがどのポートで動くかとか、どのくらいの数のコンテナレプリカを動かすのかとか、
スケーリングどうしようとかを厳密にすることができるらしい。

コンテナが「docker image」で定義されたように、
サービスも「docker-compose.yml」で設定できるらしい。

このdocker-compose.ymlをコピペして、自分のタグに書き直したところで今日は終了。
Termuxでシェルスクリプトを改変なしに実行できるようにしてみる

# Termuxとは
Termuxはroot権限なしにLinuxのコマンドライン環境を実現するAndroidのアプリ。ちょっと古めのスマートフォンやタブレットでもサクサク。VimやClangをはじめ、wget、curl、rsyncなどたくさんのツールが動作し、いつでもどこでも思い立ったらコーディングできます。

ただし、ディレクトリ構造はシミュレートしないのでLinuxの```/```に相当するパスは```/data/data/com.termux/files```になってしまうという制限があります。今日はそれをなんとかしてみます。

# PREFIX環境
Termuxは[自身のWiki](https://wiki.termux.com/wiki/Differences_from_Linux)に書いてあるようにPREFIX環境です。

```sh:
PREFIX=/data/data/com.termux/files
HOME=/data/data/com.termux/files/home
```

以上の2つの環境変数が予め設定されており、たとえば
```/etc```ディレクトリへ行く場合```cd $PREFIX/etc```のように```/etc```を```$PREFIX/etc```と変換して入力する必要があります。なので、実際には```cd /data/data/com.termux/files/usr/etc```を実行していることになります。

## 問題点
ホームディレクトリ以外へ行くときはたまに設定をいじったりする程度なので頻度は高くないです。しかし、シェルスクリプトを実行するときに

```sh:
#!/bin/sh
```

と、書いてしまうと、そんなものは存在しないと怒られます。そのためにTermuxには```termux-fixshebang```コマンドが用意されており、```termux-fixshebang script.sh```と実行することで

```sh:
#!/data/data/com.termux/files/usr/bin/sh
```

へ変換してくれます。ただ、これだと他のPCにシェルスクリプトを持っていくときに修正する必要があります。きっと一番大事なときに書き換えるのを忘れてしまいます。僕は絶対に忘れる自信があります。

# 方法1: ```termux-chroot```
Termuxのリポジトリには```proot```というパッケージがあり、```chroot```して一般的なLinuxと同じディレクトリ構造をシミュレートしてくれます。なので、新しいターミナルを開いたらこれを実行するようにしておけば全く違和感なく利用できます。
```$PREFIX/etc/profile```の最初に以下のコードを追加しておけばターミナルを開いたら勝手にchrootしてくれます。

```sh:/etc/profile
# シェルの深さが1ならchrootする
[ $SHLVL = 1 ] && termux-chroot
# ...
```

これで解決だと思いきや、自分の環境(```Xiaomi Redmi Note 4/Android 6.0 MIUI 8/MT6797 Helio X20/3GB RAM```)ではコマンド実行時に顕著にレスポンスが悪くなってしまいます。たとえば、いつもは```htop```を叩くとすぐに起動していましたが、```termux-chroot```実行後は画面が表示されるまで1秒以上待たされます。

# 方法2: rootを取る
グローバル展開しているAndroid端末ならrootが取れないものなんてあまりないですよね。というか、rootが取れない端末なんて買わないですよね。UbuntuでWifiが動作しないPCを買わないのと一緒です。とは言うものの、root権限なしでLinux環境と謳っているTermuxのコンセプトに反するのは後ろめたいですが。
rootを取ってSuperSUをインストールする部分はそれぞれの端末で異なりますので割愛します。

```sh:
# rootfsをrwでマウント
mount -o remount,rw /

# シンボリックリンクを作る
cd /bin
ln -s /data/data/com.termux/files/usr/bin/sh
ln -s /data/data/com.termux/files/usr/bin/bash

# "#!/usr/bin/env python"も実行できるようにする
# "/usr"以下は存在しないので、作成してパーミッションも変更
mkdir -p /usr/bin
chmod a+rx /usr/bin
cd /usr/bin
ln -s /data/data/com.termux/files/usr/bin/env

# rootfsをreadonlyでマウント
mount -o remount,r /
```

``/usr``が存在しないのでディレクトリを作成した後はパーミッションを変更しておくのを忘れないようにしましょう。あとはSuperSUのFull Unrootを実行すればもとのセキュアな環境に戻れます。
nem-libraryを利用してJavaScriptでlc:jpyを送金する。

TypeScriptを使用せず、nem-libraryを活用するシリーズ２回目です。
今回はNEMモザイクの1つでもあるLCNEMさんが発行されているlc:jpyの送金を行います。

以前までの記事はこちらを参考にしてください。

[amazon linuxでNode.jsのNEM開発環境を爆速で整える](https://qiita.com/nem_takanobu/items/39231820416a8a58b99a)
[nem-libraryを利用してJavaScriptでXEM送金する](https://qiita.com/nem_takanobu/items/20f9dc7bbae2d730cb96)

使用するライブラリは少し増えます。

```JavaScript:require

const nemlibrary = require('nem-library');
const NetworkTypes  = nemlibrary.NetworkTypes;
const Account = nemlibrary.Account;
const Address = nemlibrary.Address;
const TimeWindow = nemlibrary.TimeWindow;
const XEM = nemlibrary.XEM;
const PlainMessage = nemlibrary.PlainMessage;
const TransferTransaction = nemlibrary.TransferTransaction;
const TransactionHttp = nemlibrary.TransactionHttp;

const MosaicId = nemlibrary.MosaicId;
const MosaicHttp = nemlibrary.MosaicHttp;
const Rx = require("rxjs");
require( "rxjs/add/observable/from");
require( "rxjs/add/operator/mergeMap");
require( "rxjs/add/operator/toArray");
require( "rxjs/add/operator/map");
```

rxjsというライブラリのObservableという機能を使います。なかなかの高機能ですので是非マスターしてください。

メインネットへの接続は前回同様です。

```JavaScript:bootstrap
nemlibrary.NEMLibrary.bootstrap(NetworkTypes.MAIN_NET);
```

そして肝心のlc:jpy送金

```node.js

const PRI_KEY = "aaaaaaaaaaaabbbbbbbbbbbcccccccccccccc";
const address = "NXXXXXXXXXXYYYYYYYYYYYYZZZZZZZZZZZZZZ";
const namespace = "lc"
const mosaic = "jpy"
const amount = 1;
const message = "これはテストです";
const account = Account.createWithPrivateKey(PRI_KEY);

Rx.Observable.from([
	{mosaic: new MosaicId(namespace, mosaic), quantity: amount}

]).flatMap(_ => mosaicHttp.getMosaicTransferableWithAmount(_.mosaic, _.quantity))
.toArray()
.map(mosaics => TransferTransaction.createWithMosaics(
	TimeWindow.createWithDeadline(),
	new Address(address),
	mosaics,
	EmptyMessage
	)
)
.map(transaction => account.signTransaction(transaction))
.flatMap(signedTransaction => transactionHttp.announceTransaction(signedTransaction))
.subscribe(
	value => {console.log( "リクエスト結果：\n" + value.message);},
	err => {console.log( "失敗：\n" + err.toString());}
)
```

XEM送金より少し難しくなっています。それはなぜかと言いますとNEMでは総供給量などを元に手数料が計算されるので、いったんモザイク情報をメインネット問い合わせてからでないと送金処理が行えないのです。そこで活躍するのがObservableです。問い合わせ結果を元にトランザクションを組み立てるといったことが容易にできます。rxjsはnem-libaryをインストールした時に内部に含まれているので、正しくパスを指定することで適切なバージョンをそのまま使用することができます。

NEMでは複数のモザイクを一度に送信できるので、配列やマップ関数を駆使しています。このあたりは公式ドキュメントの手順を参考にしました。

[How_to_create_a_Transfer_Transaction_with_Mosaics.ts](https://github.com/aleixmorgadas/nem-library-examples/blob/master/howto/transaction/How_to_create_a_Transfer_Transaction_with_Mosaics.ts)

まず、送金したいモザイク情報のjsオブジェクトを作成します。

```
{mosaic: new MosaicId(namespace, mosaic), quantity: amount}
```

配列にして複数並べることも可能です。これらをmosaicHttp.getMosaicTransferableWithAmountクラスで金額が送金可能かを検証します。結果に対してmosaicトランザクションを組み立てていきます。あとは前回同様で署名トランザクション、アナウンス、結果取得と一連の処理が続きます。

たったこれだけのプログラムでオリジナルトークンの送金が実現できました。
HTMLなどでウォレットを作るとなるともう少しハードルは高くなりますが、SNSなどのAPIを利用すればあと少しで送金システムを完成させることができます。

次は最後の講座、slackのコマンドからユーザごとにアカウントを生成する方法をお伝えします。お楽しみに！
GMail APIでメール送信（Golang）

GolangでGMail APIを利用し、メールを送信するサンプルを作ってみました。

以下のソースを実行すると、、
GMail APIを取得したGMailアカウントから
to@example.jpにメールを送信します。

```golang

package main

import (
	"fmt"
	"log"
	"strings"
	"time"

	"encoding/base64"
	"golang.org/x/oauth2"
	"golang.org/x/oauth2/google"
	"google.golang.org/api/gmail/v1"
)

func main() {

	config := oauth2.Config{
		ClientID:     "Your Client ID",
		ClientSecret: "Your Client Secret",
		Endpoint:     google.Endpoint,
		RedirectURL:  "urn:ietf:wg:oauth:2.0:oob",
		Scopes:       []string{"https://mail.google.com/"},
	}

	expiry, _ := time.Parse("2006-01-02", "2017-07-11")
	token := oauth2.Token{
		AccessToken:  "Your Access Token",
		TokenType:    "Bearer",
		RefreshToken: "Your Refresh Token",
		Expiry:       expiry,
	}

	client := config.Client(oauth2.NoContext, &token)

	srv, err := gmail.New(client)
	if err != nil {
		log.Fatalf("Unable to retrieve gmail Client %v", err)
	}

	temp := []byte("From: 'me'\r\n" +
		"reply-to: reply-to@example.jp\r\n" +
		"To: to@example.jp\r\n" +
		"Subject: TestSubject\r\n" +
		"\r\n" + "TestBody")

	var message gmail.Message
	message.Raw = base64.StdEncoding.EncodeToString(temp)
	message.Raw = strings.Replace(message.Raw, "/", "_", -1)
	message.Raw = strings.Replace(message.Raw, "+", "-", -1)
	message.Raw = strings.Replace(message.Raw, "=", "", -1)

	_, err = srv.Users.Messages.Send("me", &message).Do()
	if err != nil {
		fmt.Printf("%v", err)
	}
}
```

参考にしたもの：

以下を参考に、GMail APIを作成し、GolangでGMailのラベルを取得するサンプルを実装
http://takaya030.hatenablog.com/entry/2017/07/12/002841

以下を参考に、GMail APIでメールを送信する処理を実装
https://stackoverflow.com/questions/37523884/send-email-with-attachment-using-gmail-api-in-golang
探索アルゴリズム

# 線形探索

>線形探索  
>先頭から順番に探す値が見つかるまで探していく

配列を「直線的(リニア)に」探していくので「リニアサーチ」と呼ばれる。

単純でわかりやすいが、値をひとつひとつ調べていくためデータが大量になると時間がかかる探索方法になる。

| 線形探索 |
|:----:|
| ![LinearSearch.png](https://qiita-image-store.s3.amazonaws.com/0/163332/2fe93191-3bd1-866c-67c0-bac056751562.png)
 |

線形探索配下のように実現する

| 線形探索のAlgorithm |
|:----:|
| ![LinearSearch2.png](https://qiita-image-store.s3.amazonaws.com/0/163332/844a8195-59a0-fd35-81d7-3d4aaee498b8.png) |

>上図は[楽しく学ぶ アルゴリズムとプログラミングの図鑑](https://book.mynavi.jp/manatee/detail/id=64253)の紹介ページから引用

1. まず、「結果を入れる変数(find)」を用意して「-1」を入れる
2. 先頭から末尾まで比較をくり返す
3. 「探す値」と同じ値かどうかを比較する
4. もし同じ値なら、「結果を入れる変数(find)」を「その配列の番号」で上書きして、くり返しを終了する

>単純なコードのため、実装例は省く

# 二分木探索

>二分木探索(バイナリーサーチ)  
>ソート済みの配列において、検索する間隔を半分に分割しながらデータを探し出すアルゴリズム

ソート済みであることを利用して、徐々に値を見つけていく

| 二分木探索 |
|:----:|
| ![BinarySearch.png](https://qiita-image-store.s3.amazonaws.com/0/163332/04eb8f17-5feb-18f9-650d-bdef05a7a5a4.png) |

1. 配列をソートする
2. 配列の中央にある要素を調べる
3. 探索を行う
    - 中央の要素が目的の値の場合:Trueを返す
    - 中央の要素が目的の値ではない場合
        - 目的のデータが中央の値より大きい場合:中央より後半の部分を調べる
        - 目的のデータが中央の値より小さい場合:中央より前半の部分を調べる
4. 2.に戻る

```cs
public class BinarySearch : Search
{
    public bool solver(int[] data_array, int target)
    {
        Array.Sort(data_array);

        int search_index = data_array.Length / 2;
        int search_length = search_index;
        do
        {
            if (target == data_array[search_index])
            {
                return true;
            }
            else if (search_length == 0)
            {
                return false;
            }
            else if (target > data_array[search_index])
            {
                search_length /= 2;
                if (search_length == 0)
                    search_index++;
                else
                    search_index += search_length;
            }
            else
            {
                search_length /= 2;
                if (search_length == 0)
                    search_index--;
                else
                    search_index -= search_length;
            }
        } while (true);
    }
}
```
内閃光（フォスフェン）でもなんでもいいから視覚インタフェースをより簡単に作るため神経ｖｒ作るべきだ

今のvrは2000ピクセルで映っても画質が悪いし作り難い
けどフォスフェンを利用したり神経視覚ｖｒの場合100ピクセルで映っても
画面が真ん中で映るんだからべつにどうでもいい（Oculus Connect 4でも言ってた中心窩のこと）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258501/00cdb248-f1bf-77b6-c942-1151b2a22da0.png)
実はすげインタフェースじゃん！
もう未来の話じゃないね！


参考にして良いと思うもの
https://www.emf-portal.org/ja/glossary/term/576 眼内閃光
https://www.jstage.jst.go.jp/article/tvrsj/21/4/21_613/_pdf/-char/ja 多電極視神経電気刺激が惹起する 眼内閃光の光源位置制御手法 - J-Stage
https://www.google.co.kr/search?q=内閃光&oq=内閃光&aqs=chrome..&sourceid=chrome-mobile&ie=UTF-8 内閃光 - google 検索
【Kotlin】AndroidのTextWatcherを半端なくスッキリ書こうぜ

### TextWatcherでオーバーライドしなきゃいけないメソッド多すぎじゃない？

Android開発していて一番頻繁に使うであろうUIの一つにEditTextがあると思います。
ユーザーに文字列を入力できるような機能を提供するときには必ずと言っていいほど使いますよね。

ただ、一つ問題があるんです。
入力された文字列を取得する際に使うTextWatcherというinterface

こいつ、いちいち３つのメソッド全部オーバーライドしなきゃいけない・・・。

```kotlin

editText.addTextChangedListener(object: TextWatcher{
            override fun afterTextChanged(p0: Editable?) {
                //処理
            }

            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                //処理
            }

            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                //処理
            }
        })

```

正直な話、３つを全て使い分ける場面ってそんなにないんです。
個人的にはafterTextChangedだけでだいたい事足りるのではないかと思っています（もちろん使い分けるべき場面もありますが）。

つまり

```kotlin

editText.addTextChangedListener(object: TextWatcher{
            override fun afterTextChanged(p0: Editable?) {
                //処理を色々書く
            }

            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                //ここ使わない・・・
            }

            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                //うわ・・・ここも使わない・・・いらない・・・　
            }
        })

```

こうなってしまうわけですね。

この書き方自体に何か大きな問題があるというわけはないんですが、わざわざ使わないメソッドを書かなきゃいけないのってなんかダサいし、コードもごちゃごちゃして読みづらくなるので避けたいです。EditTextが一つだけだとそんなに問題にならないのですが、アカウントの登録などで複数のフォームを実装する場合、途端にコードが膨れ上がってごちゃごちゃしてきます。

そこで、どうにかしてafterTextChangedだけをオーバーライドしてスッキリさせる方法はないかと考えて思いついたのがこちら。

まず、TextWacherを継承した独自のinterfaceを定義しましょう。
ここではCustomTextWatcherと命名します（適当）

```kotlin

interface CustomTextWatcher: TextWatcher{
        override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
        override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
    }

```
ここでキモになってくるのは、beforeTextChangedとonTextChangedをオーバーライドして実装しちゃうってこと。そうすることでこのinterfaceを実装するときにafterTextChangedだけをオーバーライドするだけで事足りちゃいます。

それではaddTextChangedListenerの引数に入れて確かめて見ましょう。

その結果がコチラ！！

```kotlin

editText.addTextChangedListener(object: CustomTextWatcher{
            override fun afterTextChanged(p0: Editable?) {
                //ここに処理を書く
            }
        })
```

これでスッキリかけるようになっちゃました〜

皆さんもぜひお試しあれ。

間違っているところやもっと良い書き方などありましたら、ご指摘いただければと思います。
まだ有料ドメインを買ってるの？（Freenomで無料ドメインを取得する方法）

すいません、タイトルはほとんど釣りです。（無料で取得するデメリットもありますため）

世の中には「お名前。。。」などで有料ドメインを購入し、利用されている方がいらっしゃると思います。
しっかりとしたwebサービスを運用されている方は、それがベストだと思いますが、ポートフォリオ用のwebサービスや、開発用のものに年いくら払う必要性はあるでしょうか。
私は開発用のwebサービスのコストはできるだけ削減したいと思っています。
そこで無料でドメインを取得しましょう

## 取得方法
方法は非常に簡単で、下記のサイトでドメインを取得することができます。

http://www.freenom.com/en/index.html

英語は一般常識レベルがあれば問題ないと思います。
「Find a new free domain」 に好きなドメイン名を入力し、取得しましょう。
クレジットカードの入力もなかったです。

## 取得後
ドメインを取得したあとは、VPSに紐づけましょう。
「My domains」 -> 「manage domain」をクリック
「Register glue records」を選択します
hostnameに「www」
IP AddressにVPSの実IPアドレス（v4)を入力し、決定すればOKです。
私の場合は反映に1分くらいしかかからなかったです。

## 注意事項
### URL forwardingはブラウザによって動かない
・よくURL forwadingを設定しようという記事がありますが、これは転送設定のみなため、ブラウザによって正常に動作しません（chromeなど）
・よってglue recordsを利用するのがよいと思います

### 無料ドメインを信用しすぎない
・ドメインの乗っ取りなどの記事が目につきます
・私も検証中ですが、freenom.comを信用しすぎなで、あくまで開発・ポートフォリオ用に利用するのがよいと思います。

### 一定数のアクセスがない場合、ドメインが破棄される
・3カ月で25アクセス以上必要なため、注意する必要があると思います

これで浮いたお金を、VPSに投資して、快適な開発・勉強の環境を手に入れましょう。
他なにか不明点あれば、コメントください。
PEP 562 -- Module __getattr__ and __dir__を試してみた Part2

前回の続き。

[PEP 562 -- Module \_\_getattr\_\_ and \_\_dir\_\_を試してみた - Qiita](https://qiita.com/nakkun/items/71c101add09f057b5a0d)

「\_\_getattr\_\_と\_\_dir\_\_関数を試してみた」と言いながら、\_\_dir\_\_を試していないことに気づいた。

前回の続きでmain3.pyを追加して実行すると以下のようになる。

``` Python3:getattr/main3.py
import getattr

print(dir(getattr))
```

``` :実行結果
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__getattr__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'importlib']
```

ここには、file_loaderやdb_loaderが追加されていない。
そこで、\_\_init\_\_.pyに\_\_dir\_\_()を追加する。

``` Python3:__init__.py
import importlib


__all__ = ['file_loader', 'db_loader']


def __getattr__(name):
    if name in __all__:
        return importlib.import_module("." + name, __name__)
    raise AttributeError(f"module {__name__!r} has no attribute {name!r}")


def __dir__():
    return __all__
```

``` :実行結果
['db_loader', 'file_loader']
```

ただし、これだと\_\_all\_\_に代入した2つしか出力されなくなるので、

``` Python3:__init__.py
import importlib
import sys

__all__ = ['file_loader', 'db_loader']


def __getattr__(name):
    if name in __all__:
        return importlib.import_module("." + name, __name__)
    raise AttributeError(f"module {__name__!r} has no attribute {name!r}")


# 位置が重要
__all__ += dir(sys.modules[__name__])


def __dir__():
    return __all__
```

``` :実行結果
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__getattr__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'db_loader', 'file_loader', 'importlib', 'sys']
```

こうすることで、元のアトリビュートに追加することができる。
注：\_\_dir\_\_()の中でdir()を呼ぶと無限再起してしまいます

ちなみに、あまり考えずにgetattrディレクトリを作ってパッケージ名にしてしまったけど、getattr()組み込み関数があるのでよくない命名だった。
CentOS6にGitをソースからインストールする


```sh
$ sudo yum -y groupinstall "Development Tools"
$ sudo yum install -y gettext-devel openssl-devel perl-CPAN perl-devel zlib-devel curl-devel expat-devel openssl-devel gcc perl-ExtUtils-MakeMaker
$ wget https://www.kernel.org/pub/software/scm/git/git-2.18.0.tar.gz
$ tar xzf git-2.18.0.tar.gz
$ cd git-2.18.0
$ make configure
$ ./configure
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install
$ git --version
```
C#で簡単にファイル入出力

1行でファイル入出力をする方法を紹介します。
この方法を使うと、ファイルをクローズしたかなど面倒なことを考える必要はありません。(.NET Framework 2.0 以降で使用することができます。)

# **1.ファイル出力**

## 1.1ファイル上書き

ファイルを新規作成(上書き)して、文字列をファイル出力をするためには、File.WriteAllTextメソッドを使用します。ファイルを上書きするため、複数回実行すると以前に出力された結果が消えます。前の結果も残したいという場合は、次の「ファイル追記」を参考にしてください。

```C#:Overwrite.cs
using System;
using System.IO;

namespace TestFileIO
{
    class Program
    {
        static void Main(string[] args)
        {
           //第1引数：ファイルパス
           //第2引数：追記するテキスト 
           File.WriteAllText(@"C:\Myfolder\test.txt", "Good morning!");
        }
    }
}
```

補足
第1引数のファイル名のクォーテーションの前には＠をつけます。
これはエスケープシーケンスを打ち消すために使用します。

>エスケープシーケンスとは、画面上に文字を出力する際に、文字そのものを出力するのではなく、文字色の変更やカーソルの移動、文字の消去など、文字出力の制御を行う特殊な文字列のことである。

(https://www.weblio.jp/content/%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9)

## 1.2ファイル追記

すでに存在しているファイルに追記するためには、AppendAllTextメソッドを使用します。(ファイルが存在していない場合は、ファイルが新しく作成されます。例外は発生しません。)

```C#:Append.cs
using System;
using System.IO;

namespace TestFileIO
{
    class Program
    {
        static void Main(string[] args)
        {
           //第1引数：ファイルパス
           //第2引数：追記するテキスト
           File.AppendAllText(@"C:\Myfolder\test.txt", "Good morning!");
        }
    }
}

```
Append.csを複数回実行すると、テキストファイルには以下のように記述されます。
「Good morning!Good morning!Good morning!Good morning!Good morning!Good morning!」

読みにくい。。。。
そのため、改行しましょう。改行にはEnvironment.NewLineを使用します。
改行を追加した修正コードを以下に記載します。

```C#:Append_Mod.cs
using System;
using System.IO;

namespace TestFileIO
{
    class Program
    {
        static void Main(string[] args)
        {
           //第1引数：ファイルパス
           //第2引数：追記するテキスト
            File.AppendAllText(@"C:\Myfolder\test.txt", "Good morning!"+Environment.NewLine);
        }
    }
}

```

# **2.ファイル入力**

出力したテキストファイルから、文字列を読み込むためには、File.ReadAllTextメソッドを使用します。

```C#:Read.cs
using System;
using System.IO;

namespace TestFileIO
{
    class Program
    {
        static void Main(string[] args)
        {
           //第1引数：ファイルパス 
           string readText = File.ReadAllText(@"C:\Myfolder\test.txt");
           Console.WriteLine(readText);
        }
    }
}

```

# **3.Tips**

ファイルパスに存在しないフォルダパスが含まれると'System.IO.DirectoryNotFoundException'例外が発生します。対策として下記のようにファイルパスが正しいか、ファイルIO処理前に確認しておくと良いでしょう。

```C#:Tips.cs
 if (!File.Exists(path))
{
//ここにファイルIO処理を記述する
}
```
[C言語]ハミング重みとハミング距離を求める

ハミング重みと距離の求め方の備忘録
##ハミング重み

>ハミング重みとは、シンボル列中の 0 以外のシンボルの個数である。典型的には、ビット列中の1の個数として使われる。(Wikipedia)

```c
#include <stdio.h>
#include <stdint.h>

uint32_t HammingWeight(uint32_t);

int main() {
    int n;

    printf("n = ? ");
    scanf("%d", &n);
    printf("Hamming weight = %d\n", HammingWeight(n));

    return 0;
}

uint32_t HammingWeight(uint32_t n)
{
    n = (n & 0x55555555) + (n >> 1 & 0x55555555);
    n = (n & 0x33333333) + (n >> 2 & 0x33333333);
    n = (n & 0x0f0f0f0f) + (n >> 4 & 0x0f0f0f0f);
    n = (n & 0x00ff00ff) + (n >> 8 & 0x00ff00ff);
    return (n & 0x0000ffff) + (n >>16 & 0x0000ffff);
}
```

```
実行結果1
>n = ? 7
Hamming weight = 3

実行結果2
>n = ? 2147483647
Hamming weight = 31
```

##ハミング距離

>ハミング距離とは、等しい文字数を持つ二つの文字列の中で、対応する位置にある異なった文字の個数である。(Wikipedia)

ハミング距離は関数に渡す際、排他的論理和を取ればよい

```c
#include <stdio.h>
#include <stdint.h>

uint32_t HammingDistance(uint32_t);

int main() {
    uint32_t a, b;

    scanf("%d", &a);
    scanf("%d", &b);
    printf("Hamming Distance = %d\n", HammingDistance(a ^ b));

    return 0;
}

uint32_t HammingDistance(uint32_t n)
{
    n = (n & 0x55555555) + (n >> 1 & 0x55555555);
    n = (n & 0x33333333) + (n >> 2 & 0x33333333);
    n = (n & 0x0f0f0f0f) + (n >> 4 & 0x0f0f0f0f);
    n = (n & 0x00ff00ff) + (n >> 8 & 0x00ff00ff);
    return (n & 0x0000ffff) + (n >>16 & 0x0000ffff);
}
```

```
実行結果1
>10
>10
Hamming Distance = 0

実行結果2
>0
>2147483647
Hamming Distance = 31
```
JavaScriptでtextareaの選択範囲の前後に文字列を挿入する

## 経緯

redmineでtextileで書いていて、```<pre>```タグ内で一部を赤文字にするなどして強調させたい時があって毎回、```</notextile>%{color: red}<notextile>赤文字</notextile>%<notextile>```をコピペしていたが、めんどくさくなったのでjavascriptにした。

## ソース

```js
var textarea = document.querySelector('textarea');
var pos_start = textarea.selectionStart;
var pos_end = textarea.selectionEnd;
var val = textarea.value;
var range = val.slice(pos_start, pos_end);
var beforeNode = val.slice(0, pos_start);
var afterNode = val.slice(pos_end);
var insertNode = " [前] " + range + " [後] ";
textarea.value = beforeNode + insertNode + afterNode;
```

## 使い方

1. " [前] "、" [後] "を任意の値に修正
1. ChromeでF12を押してJavaScriptコンソールを開く
1. テキストエリアの挿入したい個所を選択
1. 選択した状態で上記のソースをJavaScriptコンソール上にコピペ＆Enterして実行
1. ブックマークレット化など後はお好きにどうぞ

![javascriptで選択範囲の前後に文字列挿入.png](https://qiita-image-store.s3.amazonaws.com/0/210771/8fd79659-11d5-d4c2-f931-e19bf021fed4.png)
JavaScript 勉強メモ

## Babelの設定ファイル(対象ブラウザの設定方法)

``` json:.babelrc
{
  "presets": [
    ["env", {
      "targets": {
        "browsers": [
          "last 2 versions",
          "android >= 5",
          "ios >= 9",
          "Explorer >= 8"
        ]
      }
    }]
  ]
}

```

使用できるフォーマットは [browserslist](https://github.com/browserslist/browserslist)


## Tree Shaking
利用していない不要なコードを除去して出力する機能

チョイスしてimportしてるのに、全部import入っちゃう **(exports used \*）**
###設定方法
ESモジュール→commonJS形式の変換を無効にする

```js:.bablerc
  "presets": [
    [ "env", {"modules": false } ],
    "flow"
  ],
```

[参考記事](https://qiita.com/pirosikick/items/863830856891d40308cb#tree-shaking%E3%81%A8%E3%81%AF)
挫折しないRailsチュートリアルの取り組み方

Railsチュートリアルの存在を知ってからかなり時間が経ちましたが１週終えることができました。
自分みたいな意思の弱い方でも完走できる方法を共有しようと思います。
結論から申し上げると

- モチベーション維持のため、自分の1歩先を行く人をツイッターでフォローする
- 学習のハードルを下げる

の２点です。

# 自分の1歩先を行く人をツイッターでフォローする
モチベーション維持のために「**自分の1歩先**を行く人をツイッターでフォロー」します。
2歩でも３歩でも１０歩でもなく、**自分の1歩先**です。
**1歩先**の人をフォローすることで、「自分と同じように頑張っている人がいるんだ」と学習の励みになりますし、やる気がないときでもタイムラインを眺めるとやる気が復活します。
注意点としては、いわゆるスーパーエンジニアはフォローしないことです。
彼、彼女らのツイートは参考になることもありますが、Railsチュートリアルを完走するという目的からは外れた情報が多いですし、自分の場合はスーパーエンジニアとの差を感じることが多く、モチベーションという面ではプラスにはなりませんでした。

補足として、流行りものには乗っかるといいと思います。
2018年7月時点だと、[１００DaysOfCode](https://twitter.com/prog_8/status/1007536796001959937)とかあります。
流行りものに乗っかって100日続かなくても、3日続けば儲け物じゃないですか！


# 学習のハードルを下げる
Railsチュートリアルはめちゃくちゃ難しいです。
「3日で終わった」みたいな方もいますが、そういう人は外れ値だと思って気にしない方がいいです。
そこでRailsチュートリアルをやるにあたり限界までハードルを下げようと思ってこのようにしました。

- エディタはRubyMine
 ソースコードに色が付く(シンタックスハイライト)ので見やすい。
 統合開発環境なので、ローカル環境構築は不要。
 よく使うショートカットキーは4つ
 ・option  + F12 → ターミナルを表示する
 ・command + 1   →　 ディレクトリビューの表示する
 ・command + w   → カーソルがあるタブを閉じる
 ・(メソッド上で)command + タップ   → メソッドを実装している場所へジャンプする


- 本番環境へのデプロイはしない
- Gitはローカルのみで使う
- 演習は１０分以上悩んだら飛ばす
- css(Bootstrap)はコピペして飛ばす
- ソースコードはコピペ
 内容は理解するように努めるが、ソースコードを手打ちしたり、コメントを書いたりはしない。

とにかく１週終わらせることを優先してこのようにするのが良いと思います。


# どのくらい意思が弱いのか
正直恥ずかしいのですが、どのくらい意思が弱かったのかというとこのくらいです。

- 2016年 2月「やるぞ！」→ できない
- 2017年 6月「やるぞ！」→ 中断
- 2017年12月「やるぞ！」→ 中断２回目
- 2018年 5月「やるぞ！」→ 2018年7月11日完走

約2年半ですね。
ここまで時間が掛かった人は僕以外いないのではないでしょうか？笑

# まとめ
１週終わらせることで次のアクションが見えてくると思います。
Railsを学習する目的はそれぞれかと思いますが、参考にしてみてください。

最後になりますが、Railsを学習中の方陰ながら応援しています。
頑張ってください:smiley:
Macのスクリーンショットショートカットコマンド

Macのスクリーンショットのショートカットコマンドです。指定ウィンドウのスクリーンショットのやり方は知らなかったので、これからは画像を加工する手間も省けて少し作業が捗るようになりました。

### バージョン情報
- Mac OS 10.11.6（El Capitan）

#### その他情報
- blog:[Macのスクリーンショットショートカットコマンド – Ninolog](https://ninolog.com/screenshot-mac/)

### ショートカットコマンド一覧
#### 画面全体
[ command + shift + 3 ] 

![screenshot-mac_01.png](https://qiita-image-store.s3.amazonaws.com/0/203758/e2914d12-9017-2c6f-34d6-8ff33d18e066.png)

#### 指定範囲
[ command + shift + 4 ] 

![screenshot-mac_02.png](https://qiita-image-store.s3.amazonaws.com/0/203758/710b1b7f-b8ab-ecf6-c7a3-34c7283e69cc.png)


#### 指定ウィンドウ（影付き）
[ command + shift + 4 + space ]

![screenshot-mac_03.jpg](https://qiita-image-store.s3.amazonaws.com/0/203758/c9988cb7-b891-9fa6-4157-b64ed5f7a03f.jpeg)


#### 指定ウィンドウ（影なし）
[ command + shift + 4 + space + option ]

![screenshot-mac_04.jpg](https://qiita-image-store.s3.amazonaws.com/0/203758/7d0278e7-b405-57db-4333-74dfb0a08d41.jpeg)
macOSのPython環境にてCERTIFICATE_VERIFY_FAILEDが発生した場合の対処メモ

新しく調達したMacにてAdwords APIを実行しようとしたところ、以下のようなエラーが返ってきました。実行環境はPython3.7。
```ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
```
しばらく闘った結果、stack overflowの以下の投稿内容で解決できました。
https://stackoverflow.com/questions/42098126/mac-osx-python-ssl-sslerror-ssl-certificate-verify-failed-certificate-verify/42098127#42098127

どうやらmacOS用のPython.org公式インストーラでのみ発生する、ルート証明書の参照にまつわるエラーだったようです。
https://qiita.com/orangain/items/0a641d980019fd7e0c52

被害者が増えないようにメモ。
0.5を1056964608に一発で変換する方法

C言語では `0.5` を一発で `1056964608`に変換するということができます。

```c
#include <stdio.h>

int main() {
    float f = 0.5;
    printf("%d\n", *(int *)&f); // => 1056964608
}
```
(ただし処理系やCPUアーキテクチャによって書き方は変わる。上記は MacOS Sierraかつ clang-900.0.39.2での例)

これを Go言語で書くにはどうすればよいでしょうか。
結論から言うと `unsafe.Pointer` という型を使うと同じようなことができます。

```go
package main

import "fmt"
import "unsafe"

func main() {
    var f float32 = 0.5
    var p unsafe.Pointer
    p = unsafe.Pointer(&f)
    fmt.Printf("%d\n", *(*int32)(p)); // => 1056964608
}
```

なんの役に立つのかというと、メモリを直接手でいじっている気分にひたれます。
dockerで起動しているSolrのメモリを増やす


# docker(docker-compose)で起動しているsolrのメモリをデフォルトから1Gに変更する

### docker-compose.ymlを以下のように

docker-compose.ymlを使わない場合、以下を参考にコマンドで。

```docker-compose.yml
version: '2'
services:
    solr:
        image: solr
        ports:
         - "8983:8983"
        volumes:
         - /data:/opt/solr/server/solr/mycores
         - /var/log/solr:/opt/solr/server/logs
         - /home/junk/solr/entrypoint/set-heap.sh:/docker-entrypoint-initdb.d/set-heap.sh
        restart: always
```
* 公式ドキュメントとの違いは、sedの置き換え前パスに.*をつけている点（コメント化されてても有効にするため）

* ログの出力もVしたので、以下でオーナーを変更

```shell
$ sudo mkdir /var/log/solr
$ sudo chown 8983:8983 /var/log/solr
```

set-heap.shファイルを/home/junk/solr/entrypoint/フォルダに作成します。

```set-heap.sh
#!/bin/bash
set -e
cp /opt/solr/bin/solr.in.sh /opt/solr/bin/solr.in.sh.orig
sed -e 's/.*SOLR_HEAP=".*"/SOLR_HEAP="1024m"/' </opt/solr/bin/solr.in.sh.orig >/opt/solr/bin/solr.in.sh
grep '^SOLR_HEAP=' /opt/solr/bin/solr.in.sh
```

フォルダとファイルのオーナーを変更

```shell
$ sudo chown -R 8983:8983 /home/junk/solr/entrypoint
```


### 再起動
```shell
$ docker-compose restart
```

### 確認
```
$ sudo docker logs solr_solr_1 | head

/opt/docker-solr/scripts/solr-foreground: running /docker-entrypoint-initdb.d/set-heap.sh
SOLR_HEAP="1024m"

```
SOLR_HEAP="1024m"が出ていればOK。
あとか管理画面からJVM-Memoryを確認しても良い。

トラブルシューティングとして、set-heap.shが実行されているか？
・実行されていない → Volume、パス、オーナーを確認する
・実行されている → set-heap.shの中身を確認

solr.in.shによっては上記set-heap.shで上手く書き換えられない場合があるかもしれないのでその場合、コンテナに入って直接ファイルが書き換わるかコマンドを実行して確認する。



### 個人的メモ
* コンテナに入らないでdockerで起動しているsolrのpostコマンドを実行する

```shell
echo '/opt/solr/bin/post -h' | sudo docker exec -i solr_solr_1 /bin/bash
```
Win10Home+Vagrant+Ubuntu+golangで go get github.com/my/repos 覚え書き(ついでにdockerとnodebrewとdep)

## はじめに
自分用のメモですが、誰かの目に留まって助けになればうれしいです。

## 手順
[VirtualBox](https://www.virtualbox.org/)と[Vagrant](https://www.vagrantup.com/)をインストール

いい感じのところにDirを切って移動 ` mkdir yourDir && cd yourDir `

[Vagrant Cloud](https://app.vagrantup.com/boxes/search)からタグがVagrantのUbuntuを選択する(今回はUbuntu16なので[xenial64](https://app.vagrantup.com/ubuntu/boxes/xenial64))

` vagrant init Ubuntu/xenial64 ` 後、vagrantfileの ` config.vm.network "forwarded_port", guest: 80, host: 8080 ` と ` config.vm.network "private_network", ip: "192.168.33.10"  ` のコメントアウトを外しておく

` vagrant up ` !!　(しばし休憩)
 
```bash
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
sudo apt-get install -y golang
sudo apt-get upgrade -y git
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo apt-get install -y docker-ce
```
ここで一回 ` exit ` して ` vagrant ssh `
 
```bash
sudo curl -sL https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo mkdir -p ~/go; echo "export GOPATH=$HOME/go" >> ~/.bashrc
sudo chown vagrant.vagrant -R /home/vagrant/go
```

もう一度 ` exit ` ` vagrant ssh `
[この記事](http://jnst.hateblo.jp/entry/2016/10/17/210612)のとおりにkey生成と登録をおこなう

```bash
cd ~/go
mkdir bin
curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
vim ~/.profile
```


```[.profile]
PATH="$HOME/bin:$HOME/.local/bin:$HOME/go/bin:$HOME/.nodebrew/current/bin:$PATH"
```

追加して再度 ` exit ` ` vagrant ssh `

```bash
curl -L git.io/nodebrew | perl - setup
nodebrew install v10
nodebrew use v10
go get github.com/your/repos
cd ~/go/src/github.com/your/repos
dep ensure
```


## 参考
https://github.com/hironeko/virtual_environment_for_beginner
http://jnst.hateblo.jp/entry/2016/10/17/210612
https://github.com/golang/dep
https://github.com/hokaccha/nodebrew

## 最後に
効率が悪かったり、間違っている箇所があるかと思います。
もしよろしければ、ご指摘とご教授よろしくお願いいたします。
フォルダ内のファイルをリストアップするVBA

# はじめに

業務の中には「頻度は低いけどたまにやってくる単調で面倒な作業」というのが少なからずあります。
そういったものに限って忙しい時にやってきて、「あの時自動化しておけば良かった」と後悔させられるものです。

今回のマクロは前回の「ファイルを仕分ける」の逆バージョンです。
フォルダ内にある大量のファイルをExcelにリストアップする、という単純な内容です。

# ファイル一覧化マクロ

```vb:pickupfile.xlsm
'-----------------------------------
'ファイル一覧化メソッド
'  フォルダに格納されたファイルのファイル名を「PICKUP」シートへ記載します
'  サブフォルダはチェックしません
'-----------------------------------
Sub pickupFileFunc()
  Dim orgFolderPath As String
  orgFolderPath = ActiveWorkbook.Path 'Excelがあるフォルダパス
  sheetName = "PICKUP" 'ファイル名を記載するシート名
  
  'エラーが発生しても無視
  On Error Resume Next
  'シートが無ければエラーになるが、エラーが無視されるのでwsは空となる
  Dim ws As Excel.Worksheet
  Set ws = ActiveWorkbook.Sheets(sheetName)
  'エラー無視を無効化
  On Error GoTo 0
  'シートが無ければ作成
  If ws Is Nothing Then
    Worksheets.Add after:=Worksheets(Worksheets.Count)
    ActiveSheet.Name = sheetName
    Set ws = ActiveWorkbook.Sheets(sheetName)
  Else
    ws.Activate
  End If
  
  'シートをクリア
  ws.Cells.Clear
  ws.Cells(1, "A").Value = "ファイル名"
  
  Dim fso As Object
  Set fso = CreateObject("Scripting.FileSystemObject")
  Dim cnt As Integer
  cnt = 2
  'ファイル名の取得
  For Each fileObject In fso.GetFolder(orgFolderPath).Files
    '自分は無視
    If Not InStr(fileObject.Name, ActiveWorkbook.Name) <> 0 Then
      ws.Cells(cnt, "A").Value = fileObject.Name
      cnt = cnt + 1
    End If
  Next
  
  'オブジェクト参照の解除
  Set fso = Nothing
End Sub
```

# 使い方
1. 上記のマクロをExcelのVBエディタにCopy＆Paste。
2. 「Alt＋F8」キーをクリックして「moveFileFunc」マクロを実行。
3. Excelと同じディレクトリ内のファイルがA列にリストアップされて完了。

# 簡単な解説
下記でExcelが置かれたフォルダパスを取得します。

```vb
ActiveWorkbook.Path
```

下記でシート名が存在するかチェックします。

```vb
On Error Resume Next
Dim ws As Excel.Worksheet
Set ws = ActiveWorkbook.Sheets("シート名")
On Error GoTo 0
```

`Set ws = ActiveWorkbook.Sheets("シート名")`でシート名を取得しますが、対象のシート名が無ければ通常はエラーになります。
そこで、事前に`On Error Resume Next`でエラーを無効化しておくことでシート名が見つからない場合に`ws`が空になるようにします。
あとは`On Error GoTo 0`でエラー無効化を解除しておしまいです。


下記でフォルダ内のファイルを取得して、ファイル名を一つずつセルに記入していきます。

```vb
For Each fileObject In fso.GetFolder("調査したいフォルダパス").Files
  ws.Cells("行番号", "A").Value = fileObject.Name
Next
```

# おわりに
Mac版のExcelでは動作しないので注意してください。（権限でひっかかるようです）
historyで最も使ってるコマンドを取得する

historyコマンドを使えば最近使ったコマンドを一覧にして見ることができますが、これを更に使いやすくするために少し試しにやってみました。


使った頻度順に並べる

```bash
$ history | cut -d' ' -f 4 | sort | uniq -c | sort -nr
```

最初の10件だけを取得する

```bash
$ history | cut -d' ' -f 4 | sort | uniq -c | sort -nr | head -10
```

gitでどのコマンドを一番使ってるかを調べる

```bash
$ history | cut -d' ' -f 4,5 | awk '$1=="git" {print $2}' | sort | uniq -c | sort -nr
```
awkを使えばcutした後の第１列目が「git」であるときのみ、その第２列をprintする形にすれば、gitに絞ってソートできます。
Docker pullでERROR: unauthorized: authentication requiredが出た時のエラー解消法

Dockerでphpmyadminのimageをpullしてbuildしようとした際に発生した[ ERROR: unauthorized: authentication required ] エラーの解消方法です。
結論から言うと、俺はインターネット回線不調のケースでした。認証エラーと表示されていたから何回もDockerHubの再ログインや設定情報を見直していたりしてたけど「そっち！？」って感じであっけなく終わりました。

### バージョン情報
- Mac OS 10.11.6（El Capitan）
- Docker Toolbox
  - Docker version 18.03.0-ce
  - Oracle VM VirtualBox Manager 5.2.12

#### その他情報
- blog:[Docker pullでERROR: unauthorized: authentication requiredが出た時のエラー解消法 – Ninolog](https://ninolog.com/fix-docker-pulling-unauthorized-error/)

### エラー内容
imageをpullしている際[ ERROR: unauthorized: authentication required ]と、エラーメッセージに認証エラーと表示され、途中でダウンロードが止まる。

```
８０c35484f704: Pulling fs layer
f1756f883４５d: Pull complete
a73fef5319c1: Pull complete
cc5642v54c68: Downloading [======>                                            ] 100.6 MB/778.4 MB
5203f0cbc5e4: Download complete
2847cfad3893: Downloading [=======>                                           ] 60.78 MB/404.6 MB
7b8f9e71437d: Download complete
4a33d6e054a0: Downloading
a227293ed9ac: Waiting
ERROR: Service 'phpmyadmin/phpmyadmin' failed to build: unauthorized: authentication required
```

### 解消方法
#### DockerHubにログインしていないケース

```
$ docker login
Username (****):
Password: 
```
imageを利用して作業する際は、DockerHubにログインして行います。

#### ~/.docker/config.jsonの[ https] 情報が間違っているケース

```
$vi ~/.docker/config.json
"auths": {
        "https://index.docker.io/v1/": {
                "auth": "****************************"
        }
},
```
[ https://index.docker.io/v1/ ] になっているか確認して、必要があれば修正します。

#### インターネット回線不調のケース
imageをpullする際imageサイズが大きく、また、使用しているインターネット回線が遅い場合に[ ERROR: unauthorized: authentication required ]になりますので、違う回線を使用したりするなどして再度試す。


##### 参考
- [docker pull was failed due to "unauthorized: authentication required" · Issue \#484 · jupyter/docker\-stacks](https://github.com/jupyter/docker-stacks/issues/484)
- [docker unauthorized: authentication required \- upon push with successful login \- Stack Overflow](https://stackoverflow.com/questions/36663742/docker-unauthorized-authentication-required-upon-push-with-successful-login)
AndroidのButtonでアルファベットテキストが全部大文字になる

# はじめに
Androidを実装していて困ったのが、Buttonのテキストです。
英語で記述したテキストが全て大文字になってしまうのです。

![スクリーンショット 2018-07-12 0.14.42.png](https://qiita-image-store.s3.amazonaws.com/0/259412/b57ccee5-4348-4f5e-d49c-175321f657e0.png)

大文字小文字を区別したいのに...地味に困ります。


# 対策
大文字小文字を区別したい時の解決策は、レイアウトxmlで`android:textAllCaps="false"`と指定してあげることです。
ボタンテキストは大文字固定がデフォルトになっているようです。

- 修正前

```activity_main.xml
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="hoge" />
```

- 修正後

```activity_main.xml
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="hoge"
    android:textAllCaps="false" /> //textAllCapsを指定する
```

![スクリーンショット 2018-07-12 0.15.44.png](https://qiita-image-store.s3.amazonaws.com/0/259412/3c3d09d9-61eb-9203-9797-ff9792c711f6.png)


もちろん、コードを書いて指定することもできます。

```MainActivity.java
Button button = findViewById(R.id.button);
button.setAllCaps(false);
```
[メモ]Swift String型いろいろ

※自分用のメモです。
#環境
Swift4

#文字列定義
```swift
var str:String = "swift"
```

#型変換
##文字列→配列
```Swift
let str:String = "swift"
let array = Array(str)
// ["s", "w", "i", "f", "t"]
```
##文字列→数値
```Swift
var str:String = "123"
let num:Int = Int(str)
// 123
```

#文字列の長さ
```Swift
let len:Int = str.count
// 5
```

#文字列分割
```Swift
import Foundation // components（）を使用するために必要

let str:String = "abc,def"
let array = str.components(separatedBy: ",")  
// ["abc", "def"]

// 改行コードで分割
let str:String = "abc\ndef"
let array = str.components(separatedBy: .newlines)   
// ["abc", "def"]
```
Git grep の検索結果をエディタで開く

普段開発でRubymineを使っているのですが、Rubymineの検索機能ではなく
`git grep` でサクッと検索したい場合があります。

そんなときに、検索結果を直接エディタで開けたら楽だなと思いこんな関数を使っています。

```sh:Rubymineで開く
function ggm(){
  name_number=$(git grep $@ | peco | cut -d ":" -f 1,2)
  if [ -n "$name_number" ]; then
    mine $name_number
  else
    echo 'fileが見つかりません'
  fi
}
```

vimで開くときはこちら。

```sh:vimで開く
function ggv(){
  name_number=$(git grep $@ | peco | cut -d ":" -f 1,2)
  if [ -n "$name_number" ]; then
    name=$(echo $name_number | cut -d ":" -f 1)
    number=$(echo $name_number | cut -d ":" -f 2)
    vim -c $number $name
  else
    echo 'fileが見つかりません'
  fi
}
```

使い方は検索したい単語を引数で渡すだけです

```
% ggm User
% ggv User
```

※ cutの1はファイル名,2は行数で、 `git grep` で行数を表示していることを前提にしています

```
[grep]
  lineNumber = true
```
MetabaseからSQLServerに動的ポートを使って繋げない


データ可視化ツールのMetabaseは、データベースでSQL実行した結果をブラウザ上で表やグラフ化できて便利。

* [OSSのデータ可視化ツール「Metabase」が超使いやすい](https://qiita.com/acro5piano/items/0920550d297651b04387)
* [MetabaseをWindowsにインストールする]
(https://qiita.com/n-i-e/items/b721687903055659ee2d)

ちょっと試すだけなら、metabase.jarファイルを公式からダウンロードして、下記のコマンドを実行するだけで、 ```http://localhost:3000/``` に接続するだけで使える。

```
java -jar metabase.jar

```

これを使って、SQLServerに接続して実行結果をとってきたいのだが、SQLServerExpressなどの様に「動的ポート」の場合は、ポート番号「1433」で繋がらない。

下記にあるように、「TCP動的ポート」の番号を確認して、ポートに指定すれば接続できるようになる。

* [SQLServerの接続ポート開放の設定について](https://softplanner.zendesk.com/hc/ja/articles/223206627-SQLServer%E3%81%AE%E6%8E%A5%E7%B6%9A%E3%83%9D%E3%83%BC%E3%83%88%E9%96%8B%E6%94%BE%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

ただし、動的ポートなので、起動するたびにポートの指定を変更する必要あり。

下記を見る限り、要望は上がっているみたいだけど、今の所、SQLServerを静的ポートに変更しない限り、他に手はなさそう。

* [Metabase should not default port in SQL Server database connection - prevents use of dynamic ports #7597](https://github.com/metabase/metabase/issues/7597)
Rider 2018.1のUnity用のEditor Pluginについて

これは、Rider 2018.1のUnity用のEditor Pluginについてのメモです。

* 公式ブログ : [Control Unity editor play mode with Rider 2018.1](https://blog.jetbrains.com/dotnet/2018/04/05/control-unity-editor-play-mode-rider-2018-1/)
* 公式ドキュメント : [JetBrains Rider 2018.1 Help Unity Getting started](https://www.jetbrains.com/help/rider/Unity.html#getting-started)

の情報を基にしています。

* Rider用のUnity Editor Pluginはプロジェクトごとに生成される
* 場所は`Assets/Plugins/Editor/JetBrains/`
* 名前は`JetBrains.Rider.Unity.Editor.Plugin.Repacked.dll`
* もし古いバージョンの`Unity3DRider.cs`というファイルがプロジェクト内にあったとしても、それを検知し削除する。たとえ、移動していたとしても。
* Gitなどのバージョン管理システムからRider用のUnity Editor Pluginは除くべき。
Railsでjoinしたテーブルでorderする

よく見るサンプルでは、こんな感じだが

```
Book.joins(:user).order('users.name')
```

文字列を極力避けたい場合は `merge` を使うといける。

```
Book.joins(:user).merge(User.order(:name))
```

あまり調べても `merge` の方は出てこない気がするので投稿してみました。
ThingSpeakのMATLAB VisualizationsでOpenWeatherMapのAPIを叩いてグラフ表示

# はじめに
Google Cloud PlatformのVirtual MachineでPython使ってOpenWeatherMapのAPIたたいて、天気情報をThingSpeakにあげてたけど、ThingSpeakのMATLAB Visualizationsで直接OpenWeatherMapのAPI叩いたらいいんじゃないかと思って試してみた。

試してみると、MATLAB Visualizationsだけじゃ、データを蓄積する機能がないので、微妙だということがわかった。

# 前提
ThingSpeakの登録とか、こんなことした。
[pythonを使ってOpenWeatherMapから天気情報を取得 - Qiita](https://qiita.com/iton/items/87d4846de15736b599e4)
[ThingSpeakでMATLAB Visualization使ってグラフをカスタマイズ - Qiita](https://qiita.com/iton/items/23f37a7052d4d8a13964)
[Nature Remoで測定した室温をThingSpeakに渡して表示。 - Qiita](https://qiita.com/iton/items/e88121525ddb6ad6e13a)

# MATLAB Code

こんな感じで書いてみた。```xxx```のところを自分のAPPIDに変更。Kobe以外の都市知りたい人はそこも変更。
webreadしたらjsonが構造体として読み込まれてそう。楽ちん。
グラフを早く表示したいので、pauseを0.1秒にしてる。イラチ。

```matlab
i_max = 10;
temperature = zeros(1,i_max);
humidity = zeros(1,i_max);

for i=1:i_max
    url = 'http://api.openweathermap.org/data/2.5/weather?units=metric&q=Kobe&APPID=xxx';
    weather = webread(url);
    weather.main;
    temperature(i) = weather.main.temp;
    humidity(i) = weather.main.humidity;
    pause(0.1);
end

figure;
plot([1:i_max], temperature);
grid on;
```

# 結果

どうも、Channelのサイトひらいたときに実行される。
データをそんとき読み込むので、そんときのデータしか表示できない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/06704c86-cff6-0e83-ae54-199da5df5174.png)

# おわりに
思ったことはできなかったけど、うまく使えば便利かも。
MATLABユーザーは試したらいいと思う。
MATLAB Analysisも使ってみよかな。
【RDBMS】データベースの用語を整理しよう

#データベースってなんぞや

データベースは、ウェブサイトにおいて動的なページを生成する際に、テンプレートに差し込むデータを保管し、素早く取り出す役目を担っている。


#データベースをEXCELになぞらえて説明してくれているサイトがあった

>勝手に丸パクリさせていただきましたすみません

引用元はこちら： https://academy.gmocloud.com/know/20160425/2259

![160425_DBword_04.png](https://qiita-image-store.s3.amazonaws.com/0/265778/0e00c131-c4c8-aeca-e4d3-63c69d90d7f3.png)

# 1.テーブル

"データベースではデータの種類やプログラムの利便性を考慮して複数のテーブルを持つことが多く、Excelのブックのような構造になっているとイメージできます。"

# 2.カラム

"列に相当するのが、”カラム”です。雑誌の囲み記事を”コラム”といいますが、スペルは同じです。データベースではカラムごとに、文字列（と文字数）、数値（と桁数）のように属性が定められるので、(一般的なウェブ業界の)打ち合わせにおいては、これら属性のことをカラムと呼ぶ人もいます。"

# 3.レコード

"”テーブル”と”カラム”が、データが保管される場所のことを表していた語に対して、”レコード”はデータそのもののことを指す言葉です。同時に、列である”カラム”に対して行を意味する”ロウ”と同じ意味で用いることもあります。"

# 4.フィールド

"レコードを構成する１つ１つの要素のことです。Excelでいう”セル”に相当します。
カラム、レコード、フィールドの関係を表すと、「複数のレコードの同じフィールドを集めたものがカラム 」ということになります。
また、ユーザーインターフェイスにおいてもフィールドと言う言葉を使います。入力フォームのデータを入力するスペースのこともフィールドといいます。フォームのフィールドから入力されたデータは、（データベースを使っていれば）該当するテーブルのレコード内フィールドに格納されるわけですから、フォームのフィールドとデータベースのフィールドはこの場合同じと言えます。"


#　おわりに

無許可で丸パクリした挙句理解できなくてすみません・・・
掲載問題あったら教えてください。
bacpacファイルをsqlpackageを用いてAzure SQL Databaseへインポート

tl;dr
----------------

ここのことをやるだけです。

https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-import#import-from-a-bacpac-file-using-sqlpackage


注意点
----------------

- DB上にユーザが存在する場合、同様に作成されます。が、 Azure SQL Server作成時のユーザと同名のユーザにすると**失敗します**
- sqlpackageを用いてリモートへ取り込む方法となるため、IP制限あたりに注意してください。
- 既に存在するAzure SQL Databaseに対しての操作は行えません。同名のDB名で作成したい場合は、**既存のDBを削除する必要があります**。




手順
----------------

1. bacpacファイルを用意する(手順無し)
    - 注意点にあるユーザ被りに注意。
2. 既存のDBが存在する場合、削除する
3. sqlpackageコマンドでimportを実行
    - 実行時に生成するDBのプランに注意する


sqlpackageコマンドは前に書いた以下を元にして打ちます。

- [sqlpackageを用いたリモートのSQL Serverのバックアップ・リストア・スキーマ取り出し](https://qiita.com/fukasawah/items/8365f2288e4a5b719f60)

ここを参考に、Azure上に作成するDBプランも指定していきます。

例: StandardのS0(DTU=10)プラン、クォータ250GBで作成する場合。

```
"C:\Program Files (x86)\Microsoft SQL Server\140\DAC\bin\sqlpackage" ^
  /Action:Import ^
  /TargetServerName:%DB_HOST% ^
  /TargetDatabaseName:%DB_NAME% ^
  /TargetUser:%DB_USER% ^
  /TargetPassword:%DB_PASSWORD% ^
  /TargetEncryptConnection:True ^
  /SourceFile:backup.bacpac ^
  /p:DatabaseEdition=Standard /p:DatabaseServiceObjective=S0 /p:DatabaseMaximumSize=250
```


トラブルシューティング
-------------------

### 「マスター サーバーとターゲット サーバー '(DB_NAME)' のいずれにも接続できません。マスター サーバーかターゲット サーバー '(DB_NAME)' に同じパスワードのユーザーが必要です。」というエラーメッセージが出る

全文

```
*** データベース インポート エラー: パッケージをインポートできませんでした。
マスター サーバーとターゲット サーバー '(DB_NAME)' のいずれにも接続できません。マスター サーバーかターゲット サーバー '(DB_NAME)' に同じパスワードのユーザーが必要です。
```

原因の一つとして、IP制限に引っかかっていると同名の文言が表示されます。
GitHubにpushしようと思ったら403がでちゃった

# エラーが出てきました
commitした後に, GitHubにpushしようとしたところ, 次のようなエラーが出てきました.

```
remote: Permission to ABC/---.git denied to XYZ.
fatal: unable to access 'https://github.com/ABC/---.git/': The requested URL returned error: 403
```

ABCさんのレポジトリにXYZさんとしてpushしようとしていることが原因だそう.

# 解決方法?
Windowsの資格情報に以前違うアカウントで入ったときの情報が残っていたことが原因でした.
ですので, 根本的な解決方法ではないのかもしれませんが, この情報をリセットすればpushできるようになります.

1. コントロールパネル -> ユーザーアカウント -> 資格情報マネージャ という順で開く ![git.png](https://qiita-image-store.s3.amazonaws.com/0/269455/738e5849-02f2-590b-8593-5226d2cabd97.png)


2. Windows資格情報を選ぶ
3. 汎用資格情報というリストがありますので, この部分のgithubの情報を削除しましょう![git2.png](https://qiita-image-store.s3.amazonaws.com/0/269455/216b09a3-bbc7-2f45-e2b4-dcb84346af74.png)

このあと, もう一度pushを試みるとうまくいくと思います.


# 最後に
例えば2重のアカウント情報を用いた運用をしたいとすると, この方法は適用できないかと思いますので, 他の方法にあたるとよいかもしれません.

## 追記
新しくgit上に作ったリポジトリをcloneするときに出てくるエラー

```
remote: Repository not found.
fatal: repository 'https://github.com/aipocom/---.git/' not found
```
も上記の方法でリセットすることで解決することがわかりました.