OmniAICreator/Qiita-1.07M huggingface dataset:
文字列のパズル

#頭の体操

コンソールに任意の文字列を入力したときに

```console
YamadaTaro //input
a        r
m        a
a        T
d        a
a        d
T        a
a        m
r        a
oraTadamaY
```
以上のように表示されるコードを書く。

最終行の**"oraTadamaY"**は、StringクラスかStringBuilderクラスに文字列を逆順に返すreverseメソッド的なのがあったような気がします(うろ覚え)。これが使えます。

さて、残り中間部分。文字の間に空白が（文字列長-2）個挿入されるということです。
ということは、（文字列長-2）回for文で結合を繰り返した空白文字列群の両端に、charAt()で抜き出した文字を連結させればいいのです。




```main.java
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		String a = s.nextLine();

		StringBuilder sb = new StringBuilder(a);
		StringBuilder blank = new StringBuilder();

		int len = a.length();
		for (int i = 0; i < len - 2; i++) {
			blank.append(" ");
		}
		for (int j = 1; j < len - 1; j++) {
			System.out.println(a.charAt(j) + blank.toString() + a.charAt(len - j - 1));
		}
		System.out.println(sb.reverse());
    }
}
```

本当はScan したStinrgの方のまま扱いたかったのですが、reverseメソッドを使う必要があったためStringをStringBuilderに変換しています。

for（;;）は見通しがすこしよくないので、あまり使いたくありません。それよりも拡張forかwhileを使いたいのですが、無駄なローカル変数が増えそうだったのでfor（;;）使います。

今考えてみると、文字配列（char[]）とif文でも行けそうな気がしますね。その場合、行数長くなりそうです。

```for (int j = 1; j < len - 1; j++) {
			System.out.println(a.charAt(j) + blank.toString() + a.charAt(len - j - 1));
		}```
jの終値はlen-1なので、2-9行目の右端の文字のインデックスは｛(len-1)-j}なのですね。上の**(len - j - 1))**よりも**len-1-j**のほうが分かりやすいのかなーと思います。
Raspberry Pi でOS（Raspbian）のバージョンを調べる

ラズパイはOSのバージョンによって仕様がかなり変わるので、ネットの情報通りに動かないことが多々ある。
Qiitaを書くときは、みんなバージョンを確認して記事に書いておこうね！

```bash
pi@raspberrypi:~ $ lsb_release -a
# 以下出力
# No LSB modules are available.
# Distributor ID:	Raspbian
# Description:	Raspbian GNU/Linux 9.1 (stretch)
# Release:	9.1
# Codename:	stretch
```
1，2月で気になった Ruby のパッチ、提案

[ブログ記事](http://secret-garden.hatenablog.com/entry/2018/03/04/123343)からの転載です。  

去年、Ruby のパッチを書き始めた頃から開発者向けの ML に参加しているんですが、その中で面白そうなパッチや提案が結構目に付くので定期的にまとめてみようかと。


### [Feature #13784: Add Enumerable#filter as an alias of Enumerable#select - Ruby trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/13784)

`Enumerable#filter` を `Enumerable#select` の alias にする提案。
提案自体は去年されていたんですが、最近取り込まれました。
先日リリースされた Ruby 2.6 preview 版にもすでに実装されています。
確かに名前は `filter` の方が直感的だと思うんですが、これにより `find_all`、`select`、`filter` と同等のメソッドが3つ存在することに…。



### [Feature #14371: New option "recursive: true"; for Hash#transform_keys! - Ruby trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/14371#note-7)

Ruby 2.5 で追加された `Hash#transform_keys!` を再帰的に適用させたい、みたいな提案だったんですが、残念ながら reject されました。
これに関しては [matz がコメント](https://bugs.ruby-lang.org/issues/14371#note-6)しているのでそっちを参照してください。

### [Feature #14390: UnboundMethod#to_proc - Ruby trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/14390)

`UnboundMethod#to_proc` を追加して、第一引数をレシーバとして扱うような提案…かな？
多分以下のような挙動を想定。

```ruby
to_s = Integer.instance_method(:to_s)

# 従来の使い方
p to_s.bind(42).call 2
# => "101010"

# 提案された使い方
# 第一引数を bind する
p to_s.to_proc.call 42, 2
# => "101010"
```

確かにこれがあるといろいろとできそうな気がする。

### [Feature #13581: Syntax sugar for method reference - CommonRuby - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/13581#change-69771)

これ、スレッド内でかなり議論されているんですが、やりたいことは単純で `X.method(:hoge)` のシンタックスシュガーがほしいという要求です。
わたしもこれがめちゃくちゃ欲しいんですが、どういうシンタックスシュガーがいいのか…。
あと `instance_method` のシンタックスシュガーがほしい〜〜〜〜〜〜。

### [Feature #5120: String#split needs to be logical - Ruby trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/5120)

これもかなり昔から提案されていたみたいなんですが、最近ちょっと話題になって正式に reject されました。
確かに `"".split('') # => ['']` になったほうが自然な気がしますが、まあいまから仕様を変えるのも大変そう。

### [Feature #14498: Class#to_proc - Ruby trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/14498)

`Class#to_proc` で `Class#new` を呼び出す提案。
ぱっとみ便利そうなんですが、`to_proc` を潰すのはもったいないので、これぐらいなら `Dog.method(:new)` 使えばいいかなーという感じ。
可読性の観点からもよくないということで reject されています。
物体検出アルゴリズムSSDを読解する part1

# はじめに
物体検出アルゴリズムを勉強する過程でSSDの存在を知り，その仕組みについて手元の教科書に記載がなかったので，出典元の論文<a href="https://arxiv.org/abs/1512.02325">SSD:Single Shot MultiBox Detector(2016)</a>を読解することにしました．初学者の私による読解ですので内容に誤りがあるかもしれません．何か問題がありましたらご指摘ください．なお特に断りのない限り，記事中の図表は前述の論文から引用したものになります．

# Abstract.
要旨(Abstract)ではSSDについて以下のような説明がされていました．

* SSDは画像中の物体を単一のディープニューラルネットワークで検出する．<p>

* 画像中の物体を囲む長方形の領域──バウンディングボックスを，それぞれが別々の縮尺およびアスペクト比をとるデフォルトボックスの集合で離散化する．<p>
* 「各カテゴリの物体が実際にボックス内に存在する可能性を示すスコア」を各デフォルトボックスごとに算出し，(このスコアを最適化することで)より物体の形状をなぞるようデフォルトボックスの形状を調整する．<p>
* それに加えて，さまざまな大きさの物体に対応するために，解像度の異なる複数の特徴マップを用いて畳み込みをおこなう．<p>
* SSDではすべての訓練過程を単一のネットワークにカプセル化しておこなうので，R-CNNのようにネットワークの前段階で物体が存在する領域候補を抽出したり，それをリサンプリングしたりする過程(Object Proposal)は排除されている．<p>
* そのためSSDは物体検出コンポーネントを必要とするシステムへの組み込みが容易であり，モデルの訓練を容易におこなえる．<p>
* PASCAL VOC，COCOやILSVRCなどのコンテストで，SSDはObject Proposalを必要とする方法と精度で競合し，しかもはるかに処理速度が速かった．またVOC2007のデータセットでは最先端のFaster R-CNNモデルよりも精度で優れていた．小さい画像についても，ほかの単一のネットワークを用いる方法に比べて精度においてはるかに優れていた．

### 用語
<dl>
 <dt>バウンディングボックス</dt>
 <dd>画像中の物体を囲む長方形の領域のこと．</dd>
 <dt>特徴マップ</dt>
 <dd>特徴マップは「線形フィルターで入力画像を畳み込み，バイアス項を加えて非線形フィルタを適用することによって得られる」
 <dd>参考：<a href="http://deeplearning.net/tutorial/lenet.html#details-and-notation">Details and Notation</a></dd>
 <dt>R-CNN</dt>
 <dd>R-CNNは，まず画像をCNN部分に入力する前に，画像中の物体が写っている領域の候補を抽出し，抽出した領域の大きさを揃えてから(リサンプリング)，領域ごとに入力する．CNN部分は領域ごとに特徴量を計算し，被写体を分類する．
 <dd>参考：<a href="https://www.slideshare.net/KazukiMotohashi2/rcnn">R-CNNの原理とここ数年の流れ</a></dd>
</dl>

#1 Introduction
Introductionでは，おもにR-CNNのような従来の物体検出アルゴリズムに対してSSDがどのように改善されているかについての説明がなされていました．

* バウンディングボックスの候補の抽出と，それに続くピクセルや特徴のリサンプリングの段階を排除したことで，処理速度および精度が改善した．<p>

* 物体のカテゴリとバウンディングボックスの位置のオフセットを予測するために小さい畳み込みフィルタを使用し，および検出のアスペクト比ごとに別々のフィルタを使用し，さまざまな大きさの物体を検出できるよう，それらのフィルタをネットワークの後半段階で複数の特徴マップに適用したことで，解像度の低い画像の検出における処理速度および精度が改善した．<p>

以下は論文の著者によるIntroductionの要約の意訳になります．

* SSDは，YOLOのような最先端の検出器よりも高速かつ正確で，Faster R-CNNのような物体が写っている領域の候補を抽出してプーリングするタイプの検出器と同等の精度をもつ．<p>

* SSDの核心は，特徴マップに適応された小さな畳み込みフィルタを用いた『デフォルトボックスのカテゴリスコア』と『デフォルトボックスのオフセット』の予測にある．<p>

* 高い精度を得るために，異なる縮尺の特徴マップから異なる縮尺の予測を出力し，アスペクト比ごとに別々に予測した．<p>

* これらの設計の特徴は，シンプルなエンドツーエンドの訓練過程と，(たとえ低画質の画像であったとしても)高い精度をもたらし，さらに処理速度と精度のトレードオフを改善した．<p>

* 処理時間と精度に関する分析を含む，様々な画像サイズでのPASCAL VOC，COCOおよびILSVRCを用いた実験と，他の最先端の手法との比較．

### 用語
<dl>
 <dt>YOLO</dt>
 <dd>6つの畳み込み層と2つの全結合層で構成された，SSD同様単一のニューラルネットワークによる検出器．</dd>
 <dd>参考：<a href="https://arxiv.org/abs/1506.02640">You Only Look Once: Unified, Real-Time Object Detection</a></dd>
</dl>

# 2 The Single Shot Detector (SSD)
<a href="https://qiita.com/hiroqik/items/2f602913a0363f2c9ee9">物体検出アルゴリズムSSDを読解する part2</a>
onLoad系のイベントをPromise化する

`onLoad`系のイベントと`Promise`は、相性が良いのではないかと思い始めました。

## `onLoad`系のイベントをそのまま使うと

`onload`や`DOMContentLoaded`を筆頭に、JavaScriptの世界には「ロード完了時に」何かを実行するようなイベントがあります。ただ、そのままイベントにセットしようとすると「すでに終了済みだった」というような事態が発生することがあります。

また、「複数の条件が満たされてから実行したい」ということがあるかもしれません。

## `Promise`化するメリット

このような状況にも、`Promise`なら柔軟に対応できます。

* 遅れてのセット…`Promise#then`は`resolve`前でも`resolve`後でも問題なく動く
* `Promise`はデフォルトで非同期実行
* 複数の条件…`Promise.all`で取れる

例えば、`DOMContentLoaded`を`Promise`化してみると、以下のようになります。

```javascript
const promise = new Promise(resolve => {
  const fire = () => {
    resolve();
    document.removeEventListener('DOMContentLoaded', fire, false);
  };
  document.addEventListener('DOMContentLoaded', fire, false);
});
```

この`promise`に`then`していけば、「まだ`DOMContentLoaded`していなければ、それまで待つ」「すでに`DOMContentLoaded`していれば、その場で非同期実行」というような挙動となります。
ツイッターAPIの情報取得を簡単に

ツイッターのAPIを取得して出力するコードを最小で

まずTwistOAuth をインストール。
https://github.com/mpyw/TwistOAuth

ツイッターマネジメントってやつに登録
https://apps.twitter.com
そこからconsumer_key, consumer_secret, access_token, access_token_secretの4つを取得します。

次にTwistOAuthフォルダのbuildフォルダにtwi.phpを作成

```php:twi.php
//TwistOAuthダウンロード
//buildのフォルダにファイル作成
require 'TwistOAuth.phar';

//自分のtwitter developperの情報4つ入れる
$consumer_key = '自分のキー';
$consumer_secret = '自分のキーその２';
$access_token = '自分のキーその３';
$access_token_secret = '自分のキーその４';

//インスタンス化
$cone = new TwistOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);

//取得の条件を入れる
$tu = ['q'=>'ロックバンド','count'=>'20'];
$tubu = $cone->get('search/tweets', $tu)->statuses;

//繰り返し処理で取り出す
foreach($tubu as $ok){
	print $ok->text;
	print "<br>";
}
```
ロックバンドってキーワードを含む投稿を20件取り出します
datatablesのrenderをカスタマイズ

最近datatablesをさわったので今更ながらまとめてみます。
# エラーのアラートを無効にする

```javascript
$.fn.dataTable.ext.errMode = 'none';
```

# 日本語化オプション

```javascript
$.extend( $.fn.dataTable.defaults, {
        language: {
            url: "http://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/Japanese.json"
        }
    	})
```

# Number helper
```javascript
{
    data: 'price',
    render: $.fn.dataTable.render.number( ',', '.', 2, '$' )
}
```

$.fn.dataTable.render.numberというヘルパー関数が用意されています。
使い方は
第一引数が1000ごとの区切り文字列、
第二引数が小数点の表し方、
第三引数は小数点以下第何位まで表示するか。0なら整数。
第四引数は必須ではありませんが、数値の先頭に￥記号や＄記号をつけたいときに使います。
[Number helper](https://datatables.net/manual/data/renderers#Number-helper)

# Number helperを使わないやり方
複数のカラムを使って値や文字列を合成する際はこのように書くこともできます。toFixed(3)で小数点第3位までに丸めています。

```javascript
{ data: "average",
	render:function(data,type,row){
		var value=data;
		return row.id+'/'+value.toFixed(3);
	}
}
```

#tdタグに動的にクラスを設定する
columnsあるいはcolumnDefsのオプションとして使います。
datatablesで生成されたtdタグ(セル)にclass属性をつけるときに使います。

```javascript
"createdCell": function (td, cellData, rowData, row, col) {
	if ( rowData.rank==1 ) {
		//rankプロパティが1ならclass="important"を付加する
		$(td).addClass('important')
	}
}
```
[createdCell](https://datatables.net/reference/option/columns.createdCell)
コマンドの実際の実行時間を `time` コマンドを使わずに計測する


# 背景

- 既存のShell Scriptをちょっと改変して実際の実行時間を出力したい。
- 後でちょっと集計したいから標準出力に時間だけを出力したい。
- ミリ秒くらいの粒度で測定したい。

# 実装

```bash
start_time=$(date +"%s.%3N")
$command > /dev/null
end_time=$(date +"%s.%3N")
echo "scale=1; $end_time - $start_time" | bc
```

`%3N` はミリ秒の上位３桁をとる `date` のフォーマット指定子です。BSD版ではこの指定子は使えないので、Macの場合はHomebrewで `coreutils` をインストールして `gdate` コマンドを使います。

# 所感

`date` コマンドでミリ秒を指定するフォーマットや、BASHで小数を計算する方法など、まだまだ知らないことばかりです。
ホワイトハッカー、Anand Prakashの勇姿を見よ

[Tinderアカウントをハックして6250ドル稼いだ話](https://qiita.com/rana_kualu/items/0c546c7781a80e4067e9)の主役、Anand Prakash氏についてべた褒めする記事がなんか該当記事の隣に上がってました。
以下は[Meet Anand Prakash — a white hat hacker who's earned bug bounties from Facebook, Twitter, and Uber](https://medium.freecodecamp.org/meet-anand-prakash-a-white-hat-hacker-whos-earned-bug-bounties-from-facebook-twitter-and-uber-74e30d709b97)の日本語訳です。

# Meet Anand Prakash — a white hat hacker who's earned bug bounties from Facebook, Twitter, and Uber

彼はバグハンターとして成功しています。
バグハンターとは、システムをうまくハッキングしてセキュリティ上の欠陥を発見し、それと引き替えに企業から対価を得る生業のことです。
FacebookやTwitter、Uberといった有名企業の脆弱性を発見するなど、Anandの功績は非常に優れています。

過去5年間にわたって、FacebookはAnandをトップバグハンターの一人として[ランクインしています](https://www.facebook.com/whitehat/thanks)。
Twitterのbounty programでは、彼は世界第3位にランキングされています。

ハッカーとしてのAnandの評価は、アジアのエンタープライズ分野において、昨年の[Forbes 30 Under 30](https://en.wikipedia.org/wiki/Forbes_30_Under_30)に選ばれる程度です。
インドの[主要なニュースサイト](http://www.firstpost.com/india/meet-anand-prakash-one-of-indias-best-known-white-hat-hacker-4336577.html)で、彼は『インドで最も有名なホワイトハッカーの一人』と評価されました。

Anandが何を行ってどのように成功したかを理解するには、以下の3分間の動画を見るとよいでしょう。
エシカルハッキングには何が必要か、どのようにバグハンティングするのか、そしてFacebookやTwitterをハックした方法について解説しています。


<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">The bug stops here | Anand Prakash: One of India&#39;s best known &#39;white hat hackers&#39;<a href="https://t.co/OsxoBkZMjh">https://t.co/OsxoBkZMjh</a></p>&mdash; ラナ・クアール (@rana_kualu) <a href="https://twitter.com/rana_kualu/status/970657581856276488?ref_src=twsrc%5Etfw">2018年3月5日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## Origin of an Ethical Hacker

Anandは[Tamil Nadu州](https://ja.wikipedia.org/wiki/%E3%82%BF%E3%83%9F%E3%83%AB%E3%83%BB%E3%83%8A%E3%83%BC%E3%83%89%E3%82%A5%E5%B7%9E)にある名門[Vellore工科大学](https://en.wikipedia.org/wiki/Vellore_Institute_of_Technology)においてコンピュータサイエンスを学んだ後、Flipkartなどの会社でペネトレーションテスター・セキュリティエンジニアとして働いていました。

2016年にはAnand自ら[AppSecure](http://appsecure.in/)というセキュリティコンサルタント企業を立ち上げました。
そこではインドの有名なスタートアップ企業や多国籍企業と協業しています。
彼は、世界中の企業と仕事をしています。

Anandによって、世界中の400以上の会社がよりセキュアになることができました。

そして今、AnandはfreeCodeCamp上のMediumを通して、セキュリティに関する知見と戦闘記録を開発者コミュニティに提供しています。
以下は最近の彼のハッキング報告の一部です。

[I figured out a way to hack any of Facebook’s 2 billion accounts, and they paid me a $15,000 bounty for it](https://medium.freecodecamp.org/responsible-disclosure-how-i-could-have-hacked-all-facebook-accounts-f47c0252ae4d)

[How I hacked Tinder accounts using Facebook’s Account Kit and earned $6,250 in bounties](https://medium.freecodecamp.org/hacking-tinder-accounts-using-facebook-accountkit-d5cc813340d1)

Anandの[Twitterアカウント](https://twitter.com/sehacure)をフォローしましょう。
そして[Medium](https://medium.freecodecamp.org/)から彼のハッキング報告をもっと探してみてください。


# 感想

世界ランカーがほいほい知見を共有してくれるなんて、とてもよい時代になったものですね。
さすがに企業の存続に関わる深いところまでは出さないとは思いますが、幾つか記事を読むだけでも色々と面白い内容が出てきます。
世界に名だたるスタートアップ企業が『え、そんな単純な？』的チェックミスを出してたり。

Gizmodoなど海外記事を日本語で紹介してくれるメディアはありがたいといえばありがたいのですが、詳細を端折っていたり誤訳的なところも多々見受けられたりするので、最終的には原文を当たるしかないですね。
もちろんこの和訳記事もね。
ECSのECSとコンテナのオートスケール

# はじめに
ECSのオートスケールで、コンテナのスケールと、コンテナが動いているEC2のスケールで、どっちがスケールするのか良く分からずでハマったので、方法をメモ的に残しておきます。

# ECSのEC2のオートスケール
```
const AWS = require('aws-sdk');

//EC2を３台起動
const params = {
AutoScalingGroupName: "your-auto-scale-group",
MaxSize: 3,
MinSize: 3
};

const autoscaling = new AWS.AutoScaling();
autoscaling.updateAutoScalingGroup(params, function (err, data) {
  if (err) {
    console.log(err, err.stack); // an error occurred
  } else {
    console.log(data);           // successful response
  }
})
});
```

# ECS のコンテナのオートスケール
```
const AWS = require('aws-sdk');
var ecs = new AWS.ECS();

// EC2上のコンテナを3つ起動
var params = {
  service: 'your-service-name',
  cluster: 'your-cluster-name',
  desiredCount: 3,
};
ecs.updateService(params, function(err, data) {
  if (err) {
    console.log(err, err.stack); // an error occurred
  } else {
     console.log(data);           // successful response
  }
});
```
MySQL:トリガーでデータ操作をコピーする

# Copy data manipulation with triggers in MySQL.

トリガーを使ったデータ連携。

PKが張られているテーブルを前提にしています。
PKがないテーブルって追記されるだけですよね、多分updateもdeleteもないはず（いやまずPKをだな...）

### 事前準備

データ連携をする場合、連携先が必要です。作ってみましょう。
連携先は別データベースでも構いません。

```sql
create table new_table like original_table;
insert into new_table select * from original_table;
```

### 定義取得

こんな感じのSQLで必要な定義情報を取得しましょう。
group_concat_max_lenが足りないテーブルもあると思われますので、そこは確認、必要に応じて上限を上げましょう。(SESSION単位で変更可能です)

```sql:values_phrase
select
  table_name,
  group_concat(concat('new.', column_name) order by ordinal_position separator ', ') as values_phrase
from
  information_schema.columns
where
  table_schema = 'database_name'
  and table_name = 'original_table_name'
group by
  table_name;
```

```sql:set_phrase
select
  table_name,
  group_concat(concat(column_name, ' = new.', column_name) order by ordinal_position separator ', ') as set_phrase
from
  information_schema.columns
where
  table_schema = 'database_name'
  and table_name = 'original_table_name'
group by
  table_name;
```

```sql:where_phrase
select
  table_name,
  group_concat(concat(column_name, ' = old.', column_name) order by seq_in_index separator 'and ')
from
  information_schema.statistics
where
  table_schema = 'database_name' and
  table_name = 'original_table_name' and
  index_name = 'PRIMARY'
group by
  table_name;
```

### トリガー作成スクリプト

ここまで取得した情報を以下のtrigger作成文の{}に代入して実行すれば完了です。
triggerはonされるテーブルと別データベースでは作成できませんので、useしているデータベースに気をつけるか、trigger作成文中でデータベース名まで指定するようにしましょう。

```sql:create_triggers
delimiter |

create trigger insert_{table_name}
after insert
on {table_name} for each row
begin
  insert into {new_table_name}
  values({values_phrase});
end;
|

create trigger update_{table_name}
after update
on {table_name} for each row
begin
  update {new_tabel_name}
    set {set_phrase}
  where
    {where_phrase};
end;
|

create trigger delete_{table_name}
after delete
on {table_name} for each row
begin
  delete from {new_table_name}
  where
    {where_phrase};
end;
|

delimiter ;

```

なんらかの事情がある場合、例えばコピー先のエンコーディングが変更され照合順序も変わっている場合、insertとupdateのtrigger操作をreplace into に切り替えてみるといいかもしれません。

定義情報を取得しているクエリをもっとCONCATしてTRIGGER文すべて作るもよし、コマンドラインからmysql、awk、sedなどを組み合わせて長ったらしいワンライナーで作るもよし、こまめにファイル出力しておいてjoinして一括生成するもよし、好きな言語・方法で生成しましょう。

既存のトリガーとの兼ね合いについてはバージョンに応じて対応が変わると思いますので、マニュアルを確認しましょう。

当然ですが、DDLは連携できません。
トリガーの操作中で参照しているオブジェクトがなくなったりすればエラーになります。
レプリケーションのスレーブではRBRの場合、トリガーが発火しません。(Mariaはできるらしい)
またパフォーマンスへの影響もあるので、そこはしっかり計測しましょう。
Yahoo! JavaScriptマップAPIで鉄道路線図を表示する

## 概要

[YOLP\(地図\):Yahoo\! JavaScriptマップAPI](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/js/) のスタイル地図レイヤーを利用して鉄道路線図を表示する。

## 動作サンプルのスクリーンショット

<img width="375" alt="railwaymap1.png" src="https://qiita-image-store.s3.amazonaws.com/0/139365/d9b6a38a-a310-520b-8ca0-8763662d028d.png">

<img width="375" alt="railwaymap2.png" src="https://qiita-image-store.s3.amazonaws.com/0/139365/6a84a9fe-8a73-ca3d-1b3f-842d03b8b238.png">

<img width="375" alt="railwaymap3.png" src="https://qiita-image-store.s3.amazonaws.com/0/139365/ca0465fb-609f-9d84-0161-c7c34c806ec7.png">

## 鉄道路線図を表示するソースコード

```html
<!DOCTYPE html>
<html lang="ja" style="width: 100%; height: 100%">
<head>
<title>Rails Map</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
</head>
<body style="width: 100%; height: 100%; margin:0; padding:0;">
<div id="map" style="width:100%; height:100%"></div>
<script type="text/javascript" charset="utf-8" src="https://map.yahooapis.jp/js/V1/jsapi?appid=<YOUR APPLICATON ID>"></script>
<script type="text/javascript">
window.onload = function(){

  // スタイル地図レイヤーを生成
  // 地図の図式には鉄道路線(railway)を指定
  var railwayMapLayer = new Y.StyleMapLayer("railway");

  // 鉄道路線のレイヤーセット(IDとレイヤーセット)
  var RAILWAY_LAYER_SET_ID = "myRailway";
  var railwayLayerSet = new Y.LayerSet("鉄道路線", [railwayMapLayer]);

  // 使用するレイヤーセット群を用意
  var layerSets = {};
  layerSets[RAILWAY_LAYER_SET_ID] = railwayLayerSet;
  layerSets[Y.LayerSetId.NORMAL]  = new Y.LayerSet("地図", [new Y.NormalLayer()]);

  // 地図オブジェクトを生成
  var map = new Y.Map("map", {
    layerSets: layerSets, // レイヤーセット群を指定
    configure : { // 各種設定
      doubleClickZoom : true,
      scrollWheelZoom : true,
      singleClickPan  : true,
      hybridPhoto     : true,
      continuousZoom  : true
    }
  });

  // 各種コントロール
  map.addControl(new Y.ScaleControl());
  map.addControl(new Y.ZoomControl());
  map.addControl(new Y.LayerSetControl());

  // 地図を描画
  map.drawMap(new Y.LatLng(35.170634, 136.881751), 14, RAILWAY_LAYER_SET_ID);
}
</script>
</body>
</html>
```

## 参考資料

- [YOLP\(地図\):Yahoo\! JavaScriptマップAPI \- Yahoo\!デベロッパーネットワーク](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/js/)
- [YOLP\(地図\):レファレンス \- Yahoo\!デベロッパーネットワーク](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/js/reference/)
- [StyleMapLayerクラス](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/js/reference/YLayer.html#StyleMapLayer)
- [LayerSetクラス](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/js/reference/YLayer.html#LayerSet)
- [Mapクラス](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/js/reference/YCore.html#Map)
- [ベースの変更 \- Yahoo\! Open Local Platform \(YOLP\)](https://map.yahoo.co.jp/promo/yolp/sample/jsmap_base.html)
- [レイヤーセットIDの変更 \- Yahoo\! Open Local Platform \(YOLP\)](https://map.yahoo.co.jp/promo/yolp/sample/jsmap_layerset.html)
- [Rails Map (動作サンプルページ)](https://niwasawa.github.io/railsmap/)
macのコマンドラインからiOSエミュレータを起動する方法

こんばんは。

flutterについて調べていたらiOSのエミュレータの起動する方法にたどり着いたので
コマンドラインからエミュレータを起動する方法について説明しておきます。

# 準備物
・Xcodeが入っていること
→ 僕のPCにはXcode9.2が入っていました。

# 設定方法
## 1. Xcodeのデベロッパディレクトリの場所の設定

xcode-selectは、xcrun(1)、xcodebuild(1)、cc(1)や他のXcodeやBSD 開発ツールにより使われるデベロッパディレクトリの場所を管理する。

```iterm.command
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
```

## 2.Xcodeのライセンス処理
ライセンスに同意するみたいです。


```iterm.command
sudo xcodebuild -license
```

イメージ
<img width="500" alt="スクリーンショット 2018-03-05 22.17.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/56169/07896b1e-e906-3886-70d9-bb182e541a60.png">
<img width="500" alt="スクリーンショット 2018-03-05 22.17.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/56169/54a731bb-7fc2-14ac-afde-74c68da17a57.png">


# 起動
iOS端末のエミュレータをコマンドから起動します。
以下のコマンドを実行することで下記の画像を表示させることができます。

```iterm.command
open -a Simulator
```

<img width="545" alt="スクリーンショット 2018-03-05 22.26.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/56169/fa6d4a42-65fd-3c1c-1cfa-b05a8f2e1bb7.png">


### 引用
https://qiita.com/gooichi/items/017cf84ec52726ccd785
Raspberry Pi 3に接続したフォトリフレクタアレイQTR-8RCをNode.jsで使う

# 1. 概要

Raspberry Pi 3からNode.jsを使ってフォトリフレクタアレイQTR-8RCの値を読みます。

スイッチサイエンスで入手できるフォトリフレクタアレイにはアナログ出力タイプのQTR-8Aとデジタル出力タイプのQTR-8RCの2種類があります。

  * [QTR-8RC(二値出力版)](https://www.switch-science.com/catalog/1361/) - 今回使ったもの
  * [QTR-8A(アナログ出力版)](https://www.switch-science.com/catalog/1360/)
 
Raspberry Piはアナログ入力がないので、アナログ出力版に以下のようなA/Dコンバータを使うかデジタル出力タイプを使うことになります。

  * [MCP3008 8チャネル 10ビット A/Dコンバータ(SPI接続)](https://www.switch-science.com/catalog/1514/)

Raspberry PiはSPIがSPI0とSPI1の2つありますが、私の場合はSPI0を別用途で使用していたことと、Node.jsで使っているライブラリのrpioがSPI0しか対応していなかったので、アナログ出力版はあきらめてデジタル出力版を使用しました。
GPIOから簡単に読めるかと思っていたら、少し使い方が違ったのでメモしておきます。

# 2. 環境、使用機器
* Raspberry Pi 3 (Rasbpian Stretch)
* [QTR-8RC フォトリフレクタアレイ](https://www.switch-science.com/catalog/1361/)

# 3. 参考サイト

1. [Pololu - 5. Module Connections](https://www.pololu.com/docs/0J12/5)
    * 製造元のサイトの使い方のページ
2. [QTR-1RC using GPIO - Raspberry Pi Forums](https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=107941)
    * Raspberry Piのフォーラム

# 4. 使い方

## 4.1 配線

| QTR-1RC | Raspberry Pi 3 |
|:--|:--|
| GND | GND |
| VCC | 5V |
| LED ON | GPIO5 (29) |
| SENSOR1 | GPIO6 (31) |

## 4.2 プログラム

デジタル出力版の方は、センサに手をある程度近づけたら出力が変わるような仕様だと思っていました。簡単に使えると思っていましたが違いました。

[参考サイト１の製造元のページ](https://www.pololu.com/docs/0J12/5)では使い方について以下のように書かれています。

```
1. Turn on IR LEDs (optional).
2. Set the I/O line to an output and drive it high.
3. Allow at least 10 μs for the sensor output to rise.
4. Make the I/O line an input (high impedance).
5. Measure the time for the voltage to decay by waiting for the I/O line to go low.
6. Turn off IR LEDs (optional).
```

また[参考サイト２のRaspberry Piのフォーラム](https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=107941)でも以下のようなサンプルコードがありました。

```python
def Read():
  GPIO.setup(pin, GPIO.OUT) #Set your chosen pin to an output
  GPIO.OUTPUT(pin, True) #Drive the output high, charging the capacitor
  time.sleep(0.01) #wait for the cap to charge. Equations available on wikipedia for working out exact times
  count = 0 # set the counter to 0
  GPIO.setup(pin, GPIO.IN) # set pin to input
  while GPIO.input(pin) == True:
    count = count + 1
  return count
    
while True:
  Read()
  Print(Read())
  time.sleep(1)
```

ダメ元でGPIOに繋いで入力を見てみましたが変化はなさそうでした(もしかしたら使えるのかもしれませんが私には分かりませんでした…)。

そこで上のサンプルコードを元にプログラムを書きました。(Node.js勉強中なのでコードの書き方は参考にしないでください。)

```javascript:index.js
var rpio = require('rpio');
rpio.init({mapping: 'gpio'});
    
function checkSensor(pin){
  rpio.open(5, rpio.OUTPUT, rpio.HIGH);
  rpio.open(pin, rpio.OUTPUT, rpio.HIGH);
  rpio.sleep(0.01);
  var count = 0;
  rpio.open(pin, rpio.INPUT, rpio.PULL_DOWN);
  while(rpio.read(pin) == 1){
    count++;
  }
  rpio.open(5, rpio.OUTPUT, rpio.LOW);
  return count;
}
    
setInterval(function(){
  console.log('test = ', checkSensor(6));
},500);
```

実行結果は以下の通りで、センサに指を近づけると値が小さくなります。

```
    test = 93
    test = 92
    test = 92
    test = 92
    test = 92
    test = 92
    test = 92
    test = 5
    test = 6
    test = 93
    test = 92
    test = 89
    test = 59
    test = 19
    test = 8
    test = 23
    test = 72
    test = 92
```

フォトリフレクタが8つついているので、これを順に繰り返していけばとりあえず値は読めそうです。
【SAS】yyyymmddhhmmss形式の値のSAS日時値への変換


```
data sample ;
 	val_num  =  20180102030405 ;
	val_char = "20180102030405";
run ;

data sample2 ;
	set sample ;
	
	/* num to sas datetime */
	format val_date datetime20.;
	val_date = input(put(val_num, 14.), B8601DN.);
	
	/* char to sas datetime */
	date  = input(substr(val_char,1,8), yymmdd8.);
	hour  = input(put(input(substr(val_char, 9,2), 4.),z4.),4.);
 	min   = input(put(input(substr(val_char,11,2), 4.),z4.),4.);
 	sec   = input(put(input(substr(val_char,13,2), 4.),z4.),4.);

	format val_date2 datetime20.;
	val_date2 = dhms(date,hour,min,sec);
	
run ;
```
sedで置換して別ファイルに保存

sedを使った置換のメモ。
読み方はsed(セド)らしい。

#置換前のファイル
```sample.txt
androidアプリをダウンロード
私の携帯はandroidだ
iOSからandroidへ移行する
```

#置換だけする
androidの頭文字を大文字から小文字へ置換だけ行う。

```
sed s/android/Android/ sample.txt
```

#置換して別ファイルに保存する
置換してnew_sample.txtに保存する。

```
sed s/android/Android/ sample.txt > new_sample.txt
```


以上。
CSharperが書くTypeScript入門 Part1

私自身がTypeScriptを触ったことが無いのでチュートリアルを順番に実施していきます。
※少し私のアレンジ加えます

今回は[Basic Types]の章を全て終わらせます。

# 参考
[TypeScriptドキュメント](http://www.typescriptlang.org/docs/handbook/basic-types.html)

# 変数
TypeScriptの場合は「:」の後に型名を宣言することで型指定ができます。

## Boolean
Boolean型はtrue,falseの設定が出来ます。

```typescript
let isStarted: boolean = true;
let isDone: boolean = false;
```

## Number
Number型は2進数、8進数、１０進数、16進数が使用できます。
もちろん、浮動小数点数も使用できます。

```typescript
let decimal: number = 6; // 10進数
let hex: number = 0xf00d; // 16進数
let binary: number = 0b1010; // 2進数
let octal: number = 0o744; // 8進数
let pi: number = 3.14; // 小数
```

## String
文字列はシングルクォート(')またはダブルクォートで囲います。

```typescript
let color: string = "blue";
color = 'red';
let name: string = 'iwakura';
let age: number = 24;
// ES6のテンプレート文字列も使用できる
let profile: string = 'Name:${name}, Age:{$age}';
```

## Array
配列は[]を使用します。

```typescript
let list: number[] = [1, 2, 3];
let list2: string[] = ['a', 'b', 'c'];
// ジェネリックも使用できるらしい
let list3: Array<number> = [1, 2, 3];
```

## Tuple
タプルって言っても、配列を複数の型で宣言するだけみたいですね。
以下の様に宣言したした場合は
[0]:string
[1]:number
[2]:string
[3]:number
と、交互に割り当てられるみたいです。

```typescript
let x: [string, number];
x = ["test1", 10];
console.log(x[0]);
console.log(x[1]);
// 出力結果
// test
// 10
```

## Enum
列挙型も使用できるのですね。めっちゃC#みたい。
そして中括弧だからセミコロンはいらないのね。
ちなみに数字を明記しない場合は１から始まります。

```typescript
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
// もちろん、数字を割り当てることもできる
enum Num {Zero = 0, One = 1, Two = 2}
console.log(c);
// 出力結果
// 1
```

## Any
Anyを使用すると型が不明な状態で宣言できます。

```typescript
let obj: any = 4; // 数値を代入
// 後から別の型を代入しても怒られない
obj = 'Object';
obj = true;
// 配列で使用するとごちゃ混ぜにできる
let list: any[] = [1, true, "文字列"];
```

## Void
公式ドキュメントに記載されている通りだといきなりVoidがきました。
まだ関数宣言すらやってないのに・・・
C#とかJavaと同じで、「戻り値なし」の関数宣言用ですね。

```typescript
function hoge(): void {
    alert("hoge hoge");
}
```

## Null and Undefined
nullとundefinedの扱いはJSと同じで別らしいです。

```typescript
let u: undefined = undefined;
let n: null = null;
```

## Never
ん？何これ・・・

>The never type represents the type of values that never occur. 
訳) never型は決して出現しない値の型を表す。

どうやら、関数の中でthrowで返す時や、そもそも結果を返さない時に使用するらしいです。

```typescript
// throwで返す
function error(message: string): never {
    throw new Error(message);
}

// 呼び先でtrhowを返すため、暗黙的にneverと解釈する
function fail() {
    return error("Something failed");
}

// 結果を返さない
function infiniteLoop(): never {
    while (true) {
    }
}
```


## Type assertions
キャストのことみたいですね。

```typescript
/*
* ブラケット(角括弧)によるキャスト
*/
// 最初はanyで定義
let someValue: any = "this is a string";

// 使う時にstringへ変換
let strLength: number = (<string>someValue).length;

/*
* asによるキャスト
*/
let someValue: any = "this is a string";

let strLength: number = (someValue as string).length;
```

どちらでキャストするかは自由らしいですが、JSXでTypeScriptを使用する場合は「as」によるキャストしか使えないらしいです。

## 最後に
公式には「let」について軽く書かれていますが、ここでは説明しません。
letを使用することでスコープを意識した実装が行えるので、極力「let」を使いましょう。
Redux: webpack+babelでSpread Operatorを利用できるようにする

# Spread Operator を使えるようにする

コマンドラインで

```
$ yarn add babel-preset-stage-2
```

そしてwebpack.config.jsのpresetsに次にようにstage-2を加える。

```webpack.config.js
    ...
    module: {
      loaders: [{
        exclude: /node_modules/,
        loader: 'babel-loader',
        query: {
          presets: ['react', 'es2015', 'stage-2'],
        },
      }],
    },
    ...
```

これでreduxのreducerのreturnを書く時などにSpread Operatorを使って楽になれる。
jQueryのAjax非同期処理でcssを即時変更する方法

```html

				<!DOCTYPE html>
				<html lang="ja">
				<head>
				<meta charset="UTF-8">
				<title>jQueryのAjax非同期処理でcssを即時変更する方法</title>
				<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
				</head>
				<body>

				<div id="loading_information_id_button_a" style="display:none;">
				<h1>【ボタンA押下】ループ処理（何らかの重たい処理）を実行中。しばらくお待ちください。</h1>
				<img src="http://www.pixelimage.jp/blog/images_loading_gif/icon_loader_f_ww_01_s1.gif">
				</div>
				<div id="loading_end_information_id_button_a" style="display:none;">
				<h1>【ボタンA押下】【Complete!】ループ処理（何らかの重たい処理）が終わりました。</h1>
				</div>

				<h2 class="yamato_red">ボタンAを押してください。重たい処理が実行中でも、その完了を待たずして、この文字の背景色を即時、赤色にできます。</h2>

				<hr>
				<button class="btn_a">ボタンA</button>
				<hr>

				<script>
				// ボタンAをクリックしたときのイベント。
				$(document).on('click', '.btn_a',function(e){
					var type='ボタンA';
					alert('あなたは'+ type + 'を押しました。');
					$(".btn_a").prop("disabled", true); // ボタンを非活性にして連続押下できなくする。
					$(".btn_a").css("background-color", 'black'); // 押せないボタンの色を暗くする。
					$(".yamato_red").css("background-color","red");
					$("#loading_information_id_button_a").show(); // 「実行中」メッセージを表示する。
					alert(type + ' 今からajaxで大量ループ（スリープ）に入ります。');
					$.ajax({
					  success: function() {
						yamatoSleepTimer(type);
						$("#loading_information_id_button_a").hide(); // 「実行中」メッセージを隠す。
						$("#loading_end_information_id_button_a").show(); // 「終わりました」メッセージを出す。
						$(".yamato_red").css("background-color","white"); // 赤色に変えた背景色を白色に戻す。
						$(".btn_a").prop("disabled", false); // ボタンを押せるようにする。
						$(".btn_a").css("background-color", ''); // ボタンの色を元に戻す。
					  }
					});
					alert(type + '   ：クリックイベントの最後に来たよ。');
				});

				//
				// 大量ループによるスリープ関数。
				//
				function yamatoSleepTimer(type){
				  alert(type+'：スリープ関数に入ったよ！今から大量ループするよ。ブラウザのconsole.logを見てね！');
				  for(var i=0; i<200000; i++){
					var jikan= new Date();
					var hour = jikan.getHours();
					var minute = jikan.getMinutes();
					var second = jikan.getSeconds();
					var dispTime = hour+':'+minute+':'+second;
					console.log(type + '：時刻 '+ dispTime + '   '+ i);
				  }
				}

				</script>
				</body>
				</html>
```
Drupal8 カスタムREST API ~ POST編 ~

Drupal8でカスタムのREST APIの作成方法を説明します。

まず、`RESTful Web Services` と `REST UI` の2つのモジュールを利用して、
GUIよりREST APIを定義できるようにインストールします。
詳しくは以下のサイトを参考してください。
https://drupal.studio-umi.jp/blog/drupal8-restui

### 1.モジュールの設定
新しいディレクトリを作成し、そのモジュールの情報ファイルを追加します。
`/modules/custom/sample_rest_api`

例：`sample_rest_api.info.yml`

```php:sample_rest_api.info.yml
name: Sample Rest API
description: sample rest api taxonomy.
package: Custom
type: module
core: 8.x
dependencies:
  - rest
```

### 2. リソースプラグインの作成
RESTモジュールでプラグインを実装するために新しいディレクトリを作成し、
ファイルを追加します。
`sample_rest_api/src/Plugin/rest/resource/`

新しいファイル：`SampleResource.php`

```php:SampleResource.php
<?php

namespace Drupal\sample_rest_api\Plugin\rest\resource;

use Drupal\rest\Plugin\ResourceBase;
use Drupal\rest\ResourceResponse;

/**
 * Provides a Sample Resource
 *
 * @RestResource(
 *   id = "sample_resource",
 *   label = @Translation("Sample resource"),
 *   uri_paths = {
 *     "canonical" = "/api/sample_resource",
 *     "https://www.drupal.org/link-relations/create" = "/api/sample_resource"
 *   }
 * )
 */
class SampleResource extends ResourceBase
{
   /**
    * Responds to POST requests.
    */
    public function post() {
        return new ResourceResponse("REST State POST!");
    }

}
```

###3.RESTリソースの設定
RESTリソースを設定していくために、新しくディレクトリを作成し、
設定ファイルを追加します。
`sample_rest_api/config/install/`

新しいファイル：`rest.resource.sample_rest_api.yml`

```php:rest.resource.sample_rest_api.yml
id: sample_rest_api
plugin_id: sample_rest_api
granularity: method
configuration:
  POST:
    supported_formats:
      - hal_json
      - json
    supported_auth:
      - basic_auth
      - cookie
```

REST API用のモジュール作成が完了したら、モジュールをインストールして、
RESTリソースと権限の設定を行います。

###~ APIを叩く ~
Chrome拡張機能のDHC - REST/HTTP API Client を使って検証していきます。
ヘッダー情報の設定を以下のようにします。
`Content-Type`：`application/hal+json`
`X-CSRF-Token`:`XXXXXCSRFトークン`

APIを叩くと以下のように結果が返ってきます。
METHOD:`POST`
URL：`/api/sample_resource`

```json:
{
 'REST State POST!'
}
```

【CSRFトークン】
注意点として、リソースの登録・更新・削除を行う際にリクエストにX-CSRF-TokenヘッダーにCSRFトークンを付与する必要があります。
CSRFトークンは`/rest/session/token`にリクエストを送信することで取得できます。
MQTT: mosquittoをwebsocket対応にするには

# mosquittoの設定

/etc/mosquitto/mosquitto.config
の最後に以下の行を追加する。

```mosquitto.config
listener 1883
listener 9001
protocol websockets
```

そして

```
$ sudo systemctl restart mosquitto
```

これで通常の1883ポートによるmqtt接続に加えて、9001ポートを利用しwebsocketでmosquittoに接続することができるようになる。
GTKWaveをMacにインストールする

# はじめに
ハードウェア記述言語**Verilog HDL**の学習をMacでやってみようと思い、波形が観察できるソフト**GTKWave**をインストールしてみました。

# インストール方法
Homebrewを使うのが簡単です。以下のコマンドでインストールできました。

```bash
brew install caskroom/cask/gtkwave
```

ちなみに、パッケージ名は以下で検索しました。

```bash
brew search gtkwave
```

# 起動方法
Applications直下にgtkwave.appが生成されているので、それをダブルクリックするだけです。
S3へのアップロードでsvgファイルのContent-typeが変わってしまう原因と対策

## 事象

`aws s3 `cliコマンドでSVGファイルをアップロードすると、content-typeが`binary/octet-stream`になってしまう。


## 原因
完全に把握できたわけではないですが、
[このRequest HeaderのContent-typeのあたり](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/API/RESTObjectPUT.html#RESTObjectPUT-requests)を読むと、defaultとなりうる値が `binary/octet-stream` となっている。

jpgなどの他のバイナリファイルはそのまま`image/jpg`などのままアップロードしてくれるものの、svgはPUT時に自動で拡張子から読み取ってヘッダ付与しない仕様なのか、default値が取られていると推定されます。

## 対処
特定のファイルのcontent-typeを書き換える方法はググれば出てきますが、多くのケースでは、一括で静的ファイルをアップロードしてその中のsvgファイルのみ書き換えたいかと思います。

よって、他の拡張子のファイルはいったん除外し、svgのみを指定する方法をとり、汎用コマンドとしました。

```bash
$ aws s3 cp --recursive s3://${S3_BUCKET}/images s3://${S3_BUCKET}/images --exclude '*' --include '*.svg' --metadata-directive "REPLACE" --content-type "image/svg+xml"
```

- `--exclude`で全ファイルを対象外とし
- `--include`でsvgファイルのみを含める
- `--metadata-directive "REPLACE" --content-type`でContent-typeを置き換える

これでバケットのimagesディレクトリ内のすべてのsvgファイルを再帰的に変更します。

一括アップロード後にこちらのコマンドを叩くよう各種デプロイツールに組み込むとよい。


## 余談
再現させていませんが、pdfファイルも同様の現象が発生するらしい。
ライデンネットワークとは

##ライデンネットワークとは
　ライデンネットワークは、グローバルコンセンサスを必要とせずに、参加者間で安全なトークンの転送を可能にする。これは、前もって作成されたオンチェーンのデポジットに担保された、バランスプルーフと呼ばれる、ハッシュロックされた転送と電子署名によって達成される。転送の総額がデポジットを超えない限り、最初のデポジットと最後のチャンネルを閉じる操作以外ブロックチェーンの関与なしに瞬時に転送が実行される。
　バランスプルーフは、Ethereumブロックチェーンによって強制される拘束力のある合意である。デジタル署名は、参加者の少なくとも1人がそれをブロックチェーンに提示する限り、どちらの当事者もそこに含まれる価値移転を取り消すことができないようにする。 2人の参加者以外誰もチャンネルのスマートコントラクトに入金されたトークンにアクセスすることができないので、バランスプルーフはオンチェーン取引と同様に拘束力がある。
　またすべてのノード間にチャネルが存在する必要はなく、他ノードを経由するルートが一つあれば充分である。(A-B,B-CというチャンネルがあればA-C間で取引可能)

##ライデンネットワークの限界　
　ライデンネットワークには手数料の減少、即時性、スケーラビリティといったメリットがあるがデメリットも存在する。チャンネルの存在期間中デポジットしたトークンはロックされるので、高額な取引には向かない。

##動作原理
- ライデンチャンネルの寿命

参加者が確実に債務を履行するためには、支払いチャネルの存続期間中にスマートコントラクトでトークンを拘束する必要がある。このデポジットされたトークンは、チャネルが最終的にいずれかの参加者によって閉じられるまで、トークンをチャネルパートナーとの間で送受信するためにのみ使用できることを保証し、トークンを他のピアに二重に費やすことを防止する。
<img width="264" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/116240/b675be86-2086-1228-0448-e92d679ab850.png">

 すべてのチェックを追跡する代わりに、各ピアは最新のもののコピーのみを保持する。バランスプルーフには、送信者がデジタル署名した、参加者に送信されたすべてのライデン転送の最終的な合計が含まれている。
　最後に、一方が残高をブロックチェーンに決済することや、未払いの残高を請求または支払うことを決定した場合、彼らはスマートコントラクトにバランスプルーフを提示することによっていつでもチャネルを閉じることができる。チャンネルを閉じることを選択しなかった参加者は、自分自身のバランスプルーフを提示しなければならない。 両当事者はバランスプルーフを提出した後、トークンを引き出すことができる。 これは、2人の参加者以外の誰かによって引き起こされることがある。
<img width="266" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/116240/ac709e2c-9e41-50e4-2ea4-8de98190d266.png">

- ネットワークの必要性 

したがって、チャンネルの作成と決済はブロックチェーン上で実行する必要があるので、ターゲットごとに新しいチャネルを作成することは実行不可能である。 代わりに、ライデンは、各参加者が支払いチャネルのウェブを介して他の人と過渡的に接続されているチャネルのネットワークを作成する。
　AからDにB,Cを経由して支払をすることを考える。
<img width="273" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/116240/db21ad1b-eb0d-2a42-7c96-79c3da61ddaf.png">
　参加者は、パス内の次のホップに支払いを転送することによって、自分のチャンネルをAに貸し出す。暗号化ハッシュ・ロックは、Dが支払いを受け取ったことをDがAに確認するまで、これらの中間転送のすべてがクレジットされるのを防ぐ。Aが支払いのロックを解除することを決めると、Aはロックの鍵をDに与えます。Dがチャンネルを閉鎖せずに支払いを請求したい場合、ルート内の最後の仲介相手(C)に鍵を渡す必要があります。すると今度はCが自分の支払いを請求するために次の相手(B)に鍵を渡す必要があります。そのルート上の各参加者は、入金をすぐにロック解除するインセンティブがあるので、キーは自然にチャネルルートを通って後方に伝播し、Aに戻ります。 すべてのロックされた転送は、アリスの秘密鍵を使用してオンチェーンで償還可能である。しかし、参加者は、ロックされた転送の値をバランスプルーフに統合することが望ましい。したがって、秘密鍵を受信した後、中間転送の各送信者は、ロックされた転送値を含む新しいバランスプルーフに署名し、ロック状態を完全に無効にし、チャネル状態をきれいに同期させる。これで転送が完了したことになる。


##参考
https://raiden.network/101.html
【Azure】AzureポータルからLB（Application Gateway）にSSL証明書をアップロードしてみた

#前提
- SSL証明書&秘密鍵&中間証明書は取得済み
- pfx証明書はCentOS7.4で作成
- Azure Application Gatewayを作成済み



#手順概要
①SSL証明書と秘密鍵からpfx証明書を作成
　⇒**AzureのLBにはpfx証明書が必要です**

②作成したpfx証明書をAzureポータルからアップロード
　⇒リスナーの追加とルールの適用


#①SSL証明書&秘密鍵&中間証明書からpfx証明書を作成
1.サーバにSSL証明書&秘密鍵&中間証明書をアップロードする。

2.下記コマンドを実行しpfx証明書を作成します。

```
# openssl pkcs12 -export -inkey <秘密鍵> -in <証明書> -certfile <中間証明書> -out <出力する任意のpfx証明書名>

■実行例
# openssl pkcs12 -export -inkey Privatekey.key -in Certificate.crt -certfile CA-Certificate -out HWS_Certificate.pfx
Enter Export Password: ★任意のパスワードを入力しEnter
Verifying - Enter Export Password: ★任意のパスワードを入力しEnter
※ここで入力するパスワードは後々必要です。
```


#②作成したpfx証明書をAzureポータルからアップロード
1.Azure Portalにログインする。
<br>

2.[アプリケーションゲートウェイ]を押下し対象のロードバランサーを選択する。
>
![01azure-ssl.png](https://qiita-image-store.s3.amazonaws.com/0/168635/393138d5-72fd-4a81-0dba-86ee6bf4595d.png)
<br>

3.[リスナー]を選択する。
>
![02azure-ssl.png](https://qiita-image-store.s3.amazonaws.com/0/168635/e2773933-e55e-3620-9e4c-5d2428a615e0.png)
<br>

4.追加するリスナーのタイプを選択する。※今回はマルチサイト
>
![03azure-ssl.png](https://qiita-image-store.s3.amazonaws.com/0/168635/374fcb0a-1942-7ac1-b563-863cc0d2681c.png)
<br>

5.必要な情報を記入して[OK]を押下する。
>
![04azure-ssl.png](https://qiita-image-store.s3.amazonaws.com/0/168635/18ea9d5c-523c-8886-5857-d68290b993a7.png)
パスワードは手順①の2.で使用したものを入力
<br>

6.追加するルールのタイプを選択する。※今回はBasic
>
![05azure-ssl.png](https://qiita-image-store.s3.amazonaws.com/0/168635/e213977d-4a2a-55a1-ae2f-6bd2728106d6.png)
<br>

7.必要な情報を記入して[OK]を押下する。
>
![06azure-ssl.png](https://qiita-image-store.s3.amazonaws.com/0/168635/dcab5894-d262-138a-b5b6-a1ab32d2e169.png)
<br>

httpsでの接続確認を行い完了！
色々な言語で競技プログラミングをやっていたときに知りたくなったことまとめ

競技プログラミングを通して様々な言語を学ぼうとした時に「この言語でこれはどうやるんだっけ？」となったことをまとめていきたいと思います。
決して競技プログラミングに限ったものを扱っているわけではありません。
ジャンルごとに記事を作ってそこにまとめていきます。
また、言語は自分が学習しがてら随時追加していきます。
## 現在の記事一覧
* [標準入出力まとめ](https://qiita.com/ebiyuu1121/items/fd7c06414cdd18a37560)
* [文字列操作のまとめ](https://qiita.com/ebiyuu1121/items/9d91683af99a1af4a2ca)

## 現在の言語一覧
* Python(2系、3系)
* C,C++
VF帳票出力Tips Excel編

VFでExcelファイルを出力方法をかんたんにまとめました。

2018年3月1日（木）に行われた Salesforce Developers Meetup #17 のLTで紹介した内容となります。

# VFでExcelを出力したい
Salesforce で Excel を出力したいという要望がたまにあると思います。

主な対応としては次の2通りがあります。

- Web サービスの帳票出力を利用する
- VF で html または xml を利用して拡張子 .xls で出力する

上記以外の方法で Salesforce から Excel を出力できる方法を紹介します。

# ExcelBuilder.js を利用する

https://github.com/stephenliberty/excel-builder.js/

開発は停止していますが、こちらを利用します。

 ※注意 http://excelbuilderjs.com/ のサイトは別のサイトになっています。
アーカイブからドキュメントのサイトを参照することができます。
http://web.archive.org/web/20161010025710/http://excelbuilderjs.com:80/index.html

サンプルをもとにVFで試してみました。
出力結果のイメージ
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/215729/06a100bf-57ab-0fac-3fec-3cd04fbf8f4b.png)

# ExcelBuilder.js で出来ること

- 画像の差し込み
- 罫線をひく
- セルの背景色を変更する
- シートを追加する
- ヘッダー／フッターの設定

画像の差し込みや罫線を引くことができるので、
簡単なレイアウトの帳票も作成できるのではないかと思います。
Android Studioで使っているJDKをターミナルでも使う

ちょっとハマったのでメモがてらの投稿です。

# Javaが入っていない？
先日ですが、新しいMacが支給されたので、Android Studioを入れて開発環境を構築しました。（インストールするだけですが。）
構築も完了し、Android Studioをポチポチしてアプリの実行などは問題なく出来、開発を進めていました。
で、ターミナルでGradleのタスクを実行しようとしたところ、

```
No Java runtime present, requesting install.
```

とエラーが…。

「Android Studioで実行出来たのに、なんでJavaが入ってないエラーが起きるんだろう…？」と色々調べてみました。

# Android Studio 2.2以上には最新バージョンのOpenJDKのコピーがバンドル
はい、公式サイトに記載がありました。
https://developer.android.com/studio/intro/studio-config.html?hl=ja#jdk

Android StudioにJDKが入っていて、それを使っていたということですね。

Android Studioでも `[File] > [Project Structure]` から確認することができました。（↓キャプチャ）

![1af1ad7980757f92687112c914c8243e.png](https://qiita-image-store.s3.amazonaws.com/0/995/96749b75-a028-de5a-8b8a-29a8d2ee15f0.png)

しかも、 `recommended` と記載されているので、バンドルされているOpenJDKを使ったほうがいいということもわかりました。

# Android Studioで使っているJDKをターミナルでも使う
ターミナルでJavaが使えない理由はわかりました。
で、Oracleのページからダウンロードしてもいいのですが、折角なのでAndroid StudioにバンドルされているJDKで使えるようにしたい。（逆に統一しといたほうが、変な差みたいなのが発生しないので良い？）

まぁ、Javaのパスを通す方法は、数多くのサイトで説明がされているので省略しますが、下記のような感じでOKでした。

```bash:.bash_profile
export PATH=$PATH:/Applications/"Android Studio.app"/Contents/jre/Contents/Home/bin
export JAVA_HOME=/Applications/"Android Studio.app"/Contents/jre/Contents/Home
```

これで問題なくターミナルでGradleのタスクが実行できるようになりました:grinning:

# まとめ
Android Studioで使っているJDKをターミナルでも使う方法を記載しました。
バンドルされているJDKを使うことが推奨されているということもわかりました。

環境も整ったので、開発していくぞ:muscle:
deck.glを試す


# deck.glを試したので備忘録

deck.glとはUS Uberが作ったReactベースの地図用ライブラリ
Mabboxをベースとしているもよう。
![Uber.gif](https://qiita-image-store.s3.amazonaws.com/0/49910/c744c6f5-3d0e-d608-a747-2abf065fdef6.gif)

[deck.gl](https://uber.github.io/deck.gl/#/)


## 展開
リポジトリからコピーを行い、ローカルに展開
Gitクローンするか、ZIPをダウンロードして解凍。


## Hello-World
ハローワールドを実行
deck.gl/examples/react/hello-world-webpack2/

npm install
npm start


http://localhost:8080/

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/3ee4a962-da72-2511-9761-38363fa615fa.png)


MapboxAccessToken（Mapboxのアクセストークン）が必用と表示されました。



どうもapp.jsのこの部分に入れるっぽいです。

const MAPBOX_TOKEN = "pk.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxx";  // eslint-disable-line



![image](https://qiita-image-store.s3.amazonaws.com/0/49910/10f4c626-10c1-dc4b-86c1-48f14f2fdfcf.png)





## Example実行
展開したフォルダ下にExampleフォルダがあるのでカレントをExampleへ移動する。

以下を実行する。

```
npm install
npm start
```

しばらく待てばブラウザが立ち上がる。



![image](https://qiita-image-store.s3.amazonaws.com/0/49910/8bca86fc-2037-9834-e412-814902b709ac.png)

表示はされましたが、前述のMAPBOX_TOKENがセットされてないせいで地図が表示されてません。

\examples\layer-browser\webpack.config.js

ファイルの下の方にMapboxAccessTokenを追加します。
```js
process.env.MapboxAccessToken = "pk.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxx";

// This line enables bundling against src in this repo rather than installed deck.gl module
module.exports = env => (env ? require('../webpack.config.local')(CONFIG, __dirname)(env) : CONFIG);
```

地図が表示されました。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/e4cbd25f-6395-24be-ea97-18b4548aa984.png)



## 公式デモサイト

https://uber.github.io/deck.gl/#/examples/core-layers/hexagon-layer
MySQLを使ってページネーションする時はSQL_CALC_FOUND_ROWSを使うと良い

備忘録のために記載

# サンプル

* 1. 一覧ページ用のSQLを投げる

```sql
SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 0,100
```

* 2. (1)のSQLで対象になった件数取得

```sql
SELECT FOUND_ROWS()
```

# どうしても`UNION`したい場合

```sql
SELECT SQL_CALC_FOUND_ROWS * FROM  table1 UNION ALL SELECT * FROM table2 LIMIT 0,100
```
文字列操作のまとめ

様々な言語での文字列操作をまとめていきたいと思います。
随時言語を追加していきます。
[目次](https://qiita.com/ebiyuu1121/items/686682be61bf8ccc1a63)

## 文字列の結合
### Python
```python
str = str1 + str2
str = ','.join(list) #','を区切り文字に指定してリストを結合
str = str1*n #n回同じ文字列を繰り返す
```
## 値の埋め込み
### Python
```Python
'%s, %s!' % ('Hello', 'world') #'Hello, world! 'printf形式(Cの項を参照)
'%(x)s, %(y)s!' % {'x':'Hello', 'y':'world'} #'Hello, world!' printf形式、辞書参照
```
format関数

```Python
'{0}, {1}'.format('Hello','world') #'Hello, world'
'{0:30}'.format('aa') #桁数指定(30)
'{0:<30}'.format('aa') #左揃え
'{0:>30}'.format('aa') #右揃え
'{0:^30}'.format('aa') #中央揃え
'{0:*<30}'.format('aa') #埋め文字(*)指定
'{:+}'.format(10) #符号を表示
'{:-}'.format(-10) #負号のみ表示
'{: }'.format(10) #負号のみ表示、正の場合は' 'を表示
'{:.3}'.format(3.1415) #3.14 桁数(3)を指定
'{:.3f}'.format(3.1415) #3.142 小数点以下の桁数(3)を指定
'{:,}'.format(5000000000000000) #3桁カンマ区切り
'{:.2%}'.format(30.0/113.1) #'26.53%' パーセント表示
'10:{0:d},16:{0:x},8:{0:o},2:{0:b}'.format(12) #進数を指定(16進数ではx:小文字、X:大文字)
'{:%Y-%m-%d %H:%M:%S}'.format(date) #日付
```
###C
```c
sprintf(s, "%s %s", "Hello", "world") //Hello, world sに代入(s:char[])
```
詳細はprintf関数の項を参照
## 文字列の切り出し
### Python
```Python
str = 'ABCDEFGH'
str[1] #'B' 2文字目
str[1:3] #'ABC' 2文字目から3文字目
str[3:] #'DEFGEH' 4文字目以降
str[:3] #'ABC' 3文字目まで
str[-3:] #'FGH' 右から3文字
```
## 文字列の置換
### Python
```Python
str = str1.replace(from, to)
str = str1.replace(from, to, count) #個数を指定して置換
```
正規表現を使う場合

```Python
import re
pattern = re.compile('(r.*a)$')
str = pattern.sub('\1', sur1)
```

## 文字列の分割
### Python
```Python
list = str.split() #空白で分割
list = str.split(',') #,で分割
```
## 文字列検索
### Python
```Python
str = 'ABCDEFABC'
str.find('BC') #1 前方から検索
str.rfind('BC') #7 後方から検索
str.find('KK') #-1 存在しないときは-1を返す
str1 in str #文字列が含まれるかどうか
str.count(str1) #strに含まれるstr1の数を数える
```
正規表現を使う場合

```Python
import re
pattern = re.compile('(r.*a)$')
m = pattern.search('\1', start) #start:検索開始位置(0スタート)
m.start() #開始位置を返す
m.end() #終了位置を返す
```
## 大文字・小文字
### Python
```Python
str = str1.upper()
str = str1.lower()
```
## 数字かどうかのチェック
### Python
```Python
str.isdigit()
```
BTTでTouch Barにyahooニュースを表示する。



## はじめに

macユーザーお馴染みの[BTT(BetterTouchTool)](https://www.boastr.net/)はトラックパッドやキーボードショートカット、さらにはTouch Bar上にボタンを作成し、様々な操作を行うことができる。
そんなBTTがアップデートでTouch Bar上にShellScriptの実行結果を表示出来るようになった。[BitBar](https://github.com/matryer/bitbar)のような便利なモノを作れたらなぁ・・と思いながら良いアイデアが浮かばないので、チュートリアルとしてyahooニュースを表示することにした。

pythonを使いますが、ShellScriptならなんでもおkです。

## 環境
macOS High SIerra v10.13.3
BetterTouchTool 	v2.331
python(anaconda) 	v3.5


## ShellScript作り

まず、表示したい内容を標準出力するスクリプトを作成します。

```py:yahooニュースの経済ジャンルの最新記事を表示するスクリプト.py
from bs4 import BeautifulSoup
import requests

url = requests.get('https://news.yahoo.co.jp/hl?c=bus')
soup = BeautifulSoup(url.content,'html.parser')
news =  soup.find(class_='listFeedWrapBox').find(class_='titl').get_text().strip()
print (news)
```

```bash:実行結果
$ python ~/touch_bar/yahoo_news.py
ピザ味のソーセージ爆誕
```

##BTTの設定

### 1.widgetの作成
+widgetをクリックして新規のwidgetを作成する。

### 2.Run Shell Script and Show return valueを選択
Select Touch Bar WidgetからRun Shell Script..を選択する。

### 3.widgetの設定を開く
Advanced Configurationをクリックして設定を開く。

![tb_app1.png](https://qiita-image-store.s3.amazonaws.com/0/197110/c77a3698-2a65-a2ac-fd49-3fda3f6e93e8.png "tb_app1.png")


## widgetの設定

### 1.スクリプトを実行するコマンドを記述する。

```bash:真ん中のでっかいフォームに記述する
PYTHONIOENCODING=utf-8 python ~/touch_bar/yahoo_news.py
```

**右側のRun Scriptで実行結果の確認が出来る。文字化けする事もあったので要チェック。**

### 2.実行間隔の設定
Execute this script eventry x secondsのバーを調整して、何秒毎に実行するか設定する。ニュースの読み込みならmaxの100秒間隔でも十分。(数値をダブルクリックするとそれ以上の数値も設定出来る。)

### 3.アイコンの設定
Finderからアイコンとして使いたい画像をドラックして設定する。

その他にも色とか大きさとか設定できるので適宜変更されたし。


![bt_app2.png](https://qiita-image-store.s3.amazonaws.com/0/197110/79cad7b5-105e-88c8-3328-d3c788ce1155.png "bt_app2.png")

### タッチしてwebページを開くようにする
別のwidgetを作成し、Predefined ActionからOpen URLを選択する。
出てくるフォームに開きたいURLを設定すれば、デフォルトのブラウザで表示されるようになる。
これを先ほど作成したwidgetに重ねようとすると、くっ付き、矢印が表示されTouch Barタッチするとwebページを開くようになる。

![tb_app3.png](https://qiita-image-store.s3.amazonaws.com/0/197110/9eb5f960-355d-bafa-c5a2-91ec148e234d.png "tb_app3.png")



##つまづいた点

### aliasが使えない
anaconda上の仮想環境のモジュールをインポートしようとした際に、モジュールを見つけられなかった。これはanacondaの環境に入れてないから。当然。
そこで、anacondaに入ろうとしてつまづいた。どうにも環境変数が使えないっぽい。`~.bashrc`を読み込んで無い様子なので、 **aliasを使っている人は注意。**


### 文字化けする
スクリプトをコマンドラインで実行する分には問題ないが、Touch Barに表示すると上手くいかない。
そこでpythonを実行する際に`PYTHONIOENCODING=utf-8`と指定してあげると上手くいった。



## おわりに
以下のように表示されるようになる。
![Touch Barショット 2018-03-05 17.12.14.png](https://qiita-image-store.s3.amazonaws.com/0/197110/72b499c4-5e7a-5266-0a6a-32cf9b5e3589.png "Touch Barショット 2018-03-05 17.12.14.png")

あまり活用出来ていなかったTouch Barだが、ニュースが表示されると意外と目につき便利。

:thinking:oO(yahooファイナンスはダメだけど、yahooニュースはスクレイピングしても問題ないよね？)
Code Composer Studioをワークスペースを固定して起動

## 目的

TI製の開発環境Code Composer Studioを複数のバージョンを切り分けて使わざるを得なかったり、複数のプロジェクトに対してそれぞれワークスペースがあるような場合に、Code Composer Studioのバージョンとワークスペースの関係が混乱することが、無いかもしれないけど、私の場合はあるので、間違わないように起動するためのショートカットの作り方を記しておく。  
ご存じのようにEclipseベースの開発環境なので、Eclipseの起動オプションを利用することができるようだ。（できると書いてある文書を見つけられなかった）

## 適当なところにショートカットを作る

まずは、適当なところにショートカットを作る。  
ショートカットの元はどんな方法でもいいと思うが、簡単なのはスタートニューから右クリックしてデスクトップにショートカットを作ってしまうことだろう。  
あれ？今時はスタートメニューって言わないんだっけ？

![スタートメニューからショートカットを作る](https://qiita-image-store.s3.amazonaws.com/0/21786/51078916-6f21-3e2f-0fd5-fef092499f67.png)

## ショートカットのプロパティで編集

デスクトップにショートカットが出来たら、そのプロパティを開く。  

![ショートカットのプロパティを開く](https://qiita-image-store.s3.amazonaws.com/0/21786/efdce523-033a-8802-0866-1de9e8788708.png)

インストールしたままだとこんな感じになっているはず。  

![標準のショートカット](https://qiita-image-store.s3.amazonaws.com/0/21786/dba82e73-a326-3a38-fb4a-0ca2102f421b.png)

## 起動オプションを指定

手前味噌だが以前の投稿のワークスペースをこのショートカットで開くようにしてみる。
ワークスペースの位置は次の通り、「.metadata」があるフォルダがワークスペースとなっている。

![ワークスペースのフォルダ](https://qiita-image-store.s3.amazonaws.com/0/21786/c6a7e675-ee59-fa5a-1ba5-bb83ce86cfab.png)

リンク先に起動オプション（-data [ワークスペースの絶対パス]）を追加する。  

```
C:\ti\ccsv6\eclipse\ccstudio.exe -data D:\home\workspace\BeableBone_CppUTest
```

![short3.png](https://qiita-image-store.s3.amazonaws.com/0/21786/7598870c-9e6b-d0f0-b69e-d2a63cfa1206.png)

## ショートカットを名前変更

最後にショートカットのファイル名を分かりやすい名前に変えておくと良い。  
ちなみに、ショートカットにはコメントを記載できるので適宜活用されたい。

![short3_.png](https://qiita-image-store.s3.amazonaws.com/0/21786/6d3d2c39-ddf6-445a-cbf3-fb1c350e22dc.png)

コメントはマウスオーバーで表示されるかも。

![short4.png](https://qiita-image-store.s3.amazonaws.com/0/21786/9de0bb8f-7490-b64b-f9ee-23b56139123e.png)