OmniAICreator/Qiita-1.07M huggingface dataset:
EXCEL VBA 入門３－マクロの記録、実行

#EXCEL VBA のマクロの記録、および実行について
この記事ではEXCEL VBAのマクロの記録、および実行方法について記述します。

#マクロの記録
EXCELを操作した内容をマクロとして記録します。
自分が実際に行いたい変更があり、どのようにコードを記述してよいかわからない場合によく使います。
セルやオブジェクトなど、様々なオブジェクトに対しての操作を記録できます。

##マクロの記録開始
下記の手順でマクロの記録を開始したら、記録したいEXCEL操作を開始します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/d31467ef-9242-0ab8-0ee6-8d3e175702d1.png)

##マクロの記録終了、出力されたコードの確認
EXCEL操作が完了したら、記録終了をクリックし、マクロの記録を終了します。
記録終了後、VisualBasic Editorを開くと記録開始時に指定したメソッド名でマクロが登録されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/04829b27-9d46-61a5-30bd-b373cf3a5d0d.png)

#マクロの実行方法
##VisualBasic Editorから実行
標準モジュールで、Public Subメソッド（引数なし）の場合、カーソルを合わせて実行ボタンを押すと、マクロを実行できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/f81eb5d4-8016-396d-8dfa-3d26d6b46e24.png)

##EXCEL側からマクロ実行
開発ツールバーのマクロアイコンをクリックするとPublic Subメソッド（引数なし）が表示されるので、そこからマクロを実行できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/819cf251-eaf6-b7ed-713e-8f9484392944.png)

##数式として実行
標準モジュールで、Public Functionメソッドは数式内で使用することが可能です。
※ただし大量に使用すると編集などの各処理が非常に重くなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/add061db-9110-8181-c647-fea46f95bfe8.png)

##フォームコントロールのボタンに関連付けて実行
標準モジュールで、Public Subメソッド（引数なし）を関連付けることができます。
デザインモードを解除して、ボタンをクリックするとマクロが実行されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/1bdb2bd3-173c-39db-d2e6-19122ed7b9c7.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/cbd6503b-c80f-4f62-cb8c-20dd6db0de86.png)

##ActiveXコントールのボタンを追加して実行（おすすめ）
ActiveXコントロールはプログラムから状態の参照、変更が容易なので私はこちらを使うことが多いです。
またダブルクリック時に実行させたいなど各種イベントが用意されており細かなイベントにも対応できます。

※マクロのメソッド名は、オブジェクトの名称＋"_"＋イベント名となるため、オブジェクト名を変更した場合はメソッド名の変更も必要になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/c2a21050-a7f2-45c6-310e-a7d169b88e85.png)
EXCEL VBA 入門２－Visual Basic Editorについて

#Visual Basic Editorについて
この記事ではVisual Basic Editorについて記述します。

#Visual Basic Editorの起動
開発ツールバーのVisual Basicアイコンをクリックするか、Ctrl+F11を押し、Visual Basic Editorを起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/79972a2e-1383-4aab-d5ae-43f7b6cde555.png)

#Visual Basic Editorの初期設定
私が個人的に行っている初期設定ですので、必須ではないですが参考にして下さい。

・「自動構文チェック」のチェックを外す
　→少しミスしただけでエラーが表示され、コーディングの邪魔をされるのでいつも外しています。

・「変数の宣言を強制する」のチェックをつける
　→型を明確にし、バグを減らすためにも宣言は必須としています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/6548edf2-0df4-7122-7f51-0907b4afa51c.png)

#Visual Basic Editorの簡単な説明
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/9fbec2ed-2ffc-ecb3-8938-1b70fc9921e8.png)

##①実行、一時停止、停止
　選択されているマクロ（カーソルがある行の関数）を実行する。
　ブレークポイントが指定されている行で停止、もしくはエラーなどで停止した場合に実行を再開することが出来ます。
　プログラム途中で終了される場合は停止を押してください。

##②プロジェクト
開いているワークブック、また関連するワークシート、標準モジュール、クラス、フォームなどが表示されます。
アクティブになっているファイルが選択状態になるので、現在自分がどのファイルを修正しているのか、しっかり意識するようにしましょう。

##③プロパティ
プロジェクトで選択されている、もしくはユーザーフォームで選択されているオブジェクトに対してのプロパティが表示されます。
シートやフォーム、モジュールなどのプロパティを変更、確認できます。

##④コード
プロジェクトで選択されたVBAコードが表示されます。
赤い行がブレークポイントが設定されている行で、実行時に停止するようになっています。
F9でブレークポイントの設定・解除は可能です。
実行中のステップ位置は黄色い行で表示されています。

##⑤イミディエイト
簡易コードを実行することが出来ます。
実行中の変数に値を代入したり、変数の内容を出力することが出来ます。
Debug.Printで出力される値もこちらに出力されます。
?+命令と記述することで、Debug.Printと同等の処理を実行することが出来ます。

例：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/75e32a64-8490-c16d-e28c-8f0dd85dc239.png)

##⑥ウォッチ
変数の値を確認したい場合に使用します。
実行中に変数を選択し、右クリック、ウォッチ式の追加を選択してウォッチする変数を追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/5efa0d20-a20b-6ae5-15d5-f18fec36383c.png)
Cloud9 on Railsでdevise導入の一部始終

# Deviseの導入
## 準備

下記の環境で実行しています
`Ruby 2.3.4`
`Rails 5.0.1`

1. cloud9のアカウントの作成、ログイン
2. cloud9上に新しいRubyワークスペースを作成する
3. ワークスペースを開く

![スクリーンショット 2017-09-29 12.57.41.png](https://qiita-image-store.s3.amazonaws.com/0/144288/0e00565d-3a00-d7fb-a217-d33fa0674c56.png)

上記の画面が出て来れば準備はOKです

##RubyとRailsのバージョンを合わせておく

####Gemfileの書き換え
- Gemfileを開いて、5行目付近を下記のように書き換え

```ruby
gem 'rails', '5.0.1' # gem 'rails', '4.2.5'
```

- ターミナルでコマンドを実行

```terminal
$ bundle update
$ bundle install
```

エラーが発生しなければOKです

##Deviseを使ってユーザー認証機能を作成する
Deviseはrubyのgemで、ログインなどの認証が必要なアプリを作るために利用されます。
CSSがデフォルトのままだと見にくいので、今回はbootstrapを使ってレイアウトを整えることにします。bootstrapの設定が不要な場合は、bootstrapに関係する箇所は適宜飛ばして構いません。


####1. Gemfileの書き換え
下記をGemfileの3~6行目に追記して保存します

```ruby
gem 'devise' # 追記
gem 'devise-bootstrap-views' # 追記
gem 'devise-i18n' # 追記
gem 'devise-i18n-views' # 追記
gem 'bootstrap-sass', '~> 3.3.6' # 追記
```

####2. ターミナルで下記のコマンドを順番に実行

```terminal
$ mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
$ bundle install
$ rails generate devise:install
$ rails generate devise User
$ rails db:migrate
```

####3. app/controllers/application_controller.rbのファイル書き換え

```ruby
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :authenticate_user!
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up) do |user_params|
      user_params.permit(:name, :email, :password, :password_confirmation)
    end
    devise_parameter_sanitizer.permit(:account_update) do |user_params|
      user_params.permit(:name, :email, :password, :password_confirmation, :current_password)
    end
  end
end
```

####4. app/assets/stylesheets/application.scssの書き換え

```ruby
@import "bootstrap-sprockets";
@import 'bootstrap';
@import 'devise_bootstrap_views'
```

####5. app/assets/javascripts/application.jsの書き換え

```ruby
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require bootstrap-sprockets
```

以上でdeviseの導入準備が整いました。

## ユーザー登録・編集画面を作成する

####1. ターミナルで下記のコマンドを順番に実行

```terminal
$ rails g devise:views:bootstrap_templates
$ rails g scaffold Book title:string author:string
$ rails db:migrate
```

####2. routes.rbを下記のように書き換え

```ruby
Rails.application.routes.draw do
  resources :books
  devise_for :users
  root 'books#index'
end
```

####3. サーバー起動
```terminal
$ rails s -p $PORT -b $IP
```

####4. previewを見てみる
![スクリーンショット 2017-09-29 13.34.47.png](https://qiita-image-store.s3.amazonaws.com/0/144288/d55a46bb-6571-14ae-0497-0cd284fb5137.png)
EXCEL VBA 入門１－準備編

#EXCEL VBAを扱うための準備
EXCEL VBAを扱うために必要な準備と機能を記述します。

#開発ツールバーの追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/b8536a0b-dca6-4998-d8cc-6f49dc706e36.png)

EXCEL VBAを扱うためには、開発ツールバーの追加が必要です。

ツールバーの何も無いところで右クリックをしてメニューを表示したら、下記の手順に沿って開発ツールバーを表示してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/7740a18b-b3b7-8f6a-ed9c-3028aaa60eb1.png)

#マクロを扱えるブックとして保存
通常のEXCELファイルはマクロを保存できません。
マクロを保存できる形式で保存する必要があります。

名前を付けて保存を選択し、「EXCELマクロ有効ブック（*.xlsm）」として保存してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/6a51f161-556a-af89-7ccd-a937a539fe75.png)
CSS で「＞」矢印を作る際、IE でゴミが出る

以前ハマったくせにすっかり忘れていたので、自分用メモ。
CSS で「＞」矢印を作る際、border でショートハンドを用いると、IE において不要な薄い線が発生するケースがある。
![arrow.png](https://qiita-image-store.s3.amazonaws.com/0/73925/366b3127-1b0a-0dfb-203b-24a3cbcfef88.png)
こんな具合に、左に薄く線が出る。

これを避ける為には「border-top」「border-right」など個別に設定を行う。

```CSS
.icon-arrow {
position: relative;
padding: 0 0 0 20px;
}

.icon-arrow:before {
content: '';
position: absolute;
top: 50%;
left: 0;
width: 12px;
height: 12px;
margin-top: -6px;
border-top: 4px solid #000;
border-right: 4px solid #000;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
}
```

どちらの設定でも2行必要だが、「色指定が1箇所で済むし〜」とショートハンドを用いるとハマる。
transform: rotate の角度や表示位置によって出たり出なかったりというのも落とし穴。

```CSS
/*　ダメな例　*/
.icon-arrow:before {
..
border: solid #000;
border-width: 4px 4px 0 0;
..
}
```
Auditbeat + Elasticsearch + Kibana で監査ログを視覚化する (ElasticStack 6.0.0-rc1)

# 概要
OS の監査ログを取得したかったので Auditbeat 試しのついでに視覚化してみた。

# 環境

- Ubuntu 17.04 ※
- auditbeat-6.0.0-rc1
- elasticsearch-6.0.0-rc1
- kibana-6.0.0-rc1

※auditd と並列実行するには kernel 3.16 以上が必要なので注意
(参考)
https://www.elastic.co/blog/brewing-in-beats-running-auditbeat-side-by-side-with-auditd

# インストール

**JDK**

```
# apt-get install openjdk-8-jdk
```

**Elasticsearch**

```
# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0-rc1.deb
# dpkg -i elasticsearch-6.0.0-rc1.deb
```

**Kibana**

```
# wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.0-rc1-amd64.deb
# dpkg -i kibana-6.0.0-rc1-amd64.deb
```

**Auditbeat**

```
# wget https://artifacts.elastic.co/downloads/beats/auditbeat/auditbeat-6.0.0-rc1-amd64.deb
# dpkg -i auditbeat-6.0.0-rc1-amd64.deb
```

# 設定

**kibana**
とりあえず外からアクセスできるように

```
# vi /etc/kibana/kibana.yml

server.host: "0.0.0.0"
```

**Auditbeat**
システムコールの監査記録も取得するようにする。

```
# vi /etc/auditbeat/auditbeat.yml

- module: audit
  metricsets: [kernel]
  kernel.audit_rules: |
    -a always,exit -S execve
```

# 起動

各種起動する。

```
# /etc/init.d/elasticsearch start
# /etc/init.d/kibana start
# /etc/init.d/auditbeat start
```

# セットアップ

```
# auditbeat setup
Loaded index template
Loaded dashboards
```

# Kibana にアクセス

file module のダッシュボードはセットアップで作成される。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/105824/a1c3cf14-ddad-a776-36c0-e0669ce43cba.png)


# ダッシュボード作成

kernel モジュールのダッシュボード作ってみる。
実行ユーザー、コマンドとか・・・

![02.png](https://qiita-image-store.s3.amazonaws.com/0/105824/4016b3fd-bb8f-2e29-0168-34300d969d1f.png)
textareaへのsend_keysの速度が遅い時の対処法

# ruby+webdriverで入力する際の標準コマンドsend_keys

inputフォームにおいてtext、textarea、selectに対応するコマンドはsend_keysが主流となっています。

```ruby
driver.find_element(:id, 'textarea').send_keys('こんにちわ')
```
今まで当然のようにこのまま実装していました。



## textareaへの入力速度が遅いというクレームが来た

textareaとなると数千文字を入力する必要がある場合があると思います。
私の環境はwindow10+ruby2.3.3+chromedriverなのですが、send_keysでテキストを入力していくと、
高速ではあるのですが、1文字1文字入力していく形となり、同様の動作を1000件のように大量に行う必要があると、
大変な時間が掛かって来てしまいます。

私が開発依頼を請けたシステムも3000文字ほどの入力を1000件続けて行うような要件となっていました。
「selenium IDEでは一瞬で文字が貼り付けられたのにこれでは遅すぎる」というお叱りを受けることになったのです。



#コピペ的なことで速度をあげたい

textareaに一気に入力するのであればコピペっぽいことでいけるでしょうということで以下が必要だなと考えました。

・クリップボードへ値をつっこむ
・入力したいtextareaにカーソルを合わせる
・クリップボードの中身をペーストする


#クリップボードへのコピーを実装

とりあえずクリップボードに入力する値を取り込む必要があるので clipboard をいうgemを使ってみました。

ターミナルに以下を入力してインストール。

```ruby
gem install clipboard
```
インストールができたら以下でクリップボードに値をつっこみましょう。

```ruby
require 'clipboard'

str = variable # variableには代入したい値が入っている

Clipboard.copy(str) 
```
これでクリップボードの中に値が入りました。



#ペーストしたいtextareaにカーソルを合わせる

ペーストしたいtextareaにカーソルがあっている必要があるので、要素をclickしましょう。

```ruby
driver.find_element(:id, 'textarea').click
```


#seleniumでキーボード操作を行う

clipboardにはペースト用に文字通り"paste"というものも用意されているのですが、なぜか私が実装したいサービスでは動かなかったので、
キーボードの操作をseleniumの ActionBuilder クラスで実装しました。

```ruby
driver.action.key_down(:control).send_keys("v").key_up(:control).perform 
```


これで必要なコードは揃いましたね。



#まとめ

では、以上までのコードをまとめてみましょう。

```ruby
require 'selenium-webdriver'
require 'clipboard'

driver = Selenium::WebDruver.for :chrome

driver.find_element(:id, 'textarea').click
str = variable
Clipboard.copy(str)
d.action.key_down(:control).send_keys("v").key_up(:control).perform 
```
これでコピペのようにtextareaに値を入力することができるので高速化が実現できました。

たぶんjsを使ったりとかいろいろ高速化できる方法はあると思いますので、代替案があったらコメントにバンバン書き込んでいただければと思います。

#自分のブログの紹介
ruby + selenium webdriverに関するブログをやっていますので、そちらもよろしくお願い致します。
[katsulog](http://katsulog.tech)

それとこれが最初の記事になりますので、何か改善した方が良い部分があったら是非コメントください。
Python matplotlib Basemapのインストール

これまで地図のたぐいの出力はGMT (Generic Mapping Tools)で行っていましたが，Pythonでやってみたくなり，Basemapをインストールしました．その方法の紹介です．

マシン：MacBook Pro (Retina, 13-inch, Mid 2014)
OS: macOS High Sierra

インストールは以下に従って実施．

[https://stackoverflow.com/questions/42299352/installing-basemap-on-mac-python](https://stackoverflow.com/questions/42299352/installing-basemap-on-mac-python)

私の場合，matplotlib, numpy, geos, projはすでに入っているので，
下のサイトから，basemap-1.0.7.tar.gzを取ってくるところから始めた．

[https://sourceforge.net/projects/matplotlib/files/matplotlib-toolkits/basemap-1.0.7/[(https://sourceforge.net/projects/matplotlib/files/matplotlib-toolkits/basemap-1.0.7/)

これを解凍すると，```basemap_1.0.7```というディレクトリが作成される．

```
tar -xzv basemap-1.0.7.tar.gz
```

.bash_profile に以下を記載．


```
export GEOS_DIR=/usr/local/Cellar/geos/3.6.2/
```

作成されたディレクトリ```basemap_1.0.7```に移り ```python3 setup.py install```を実行したところで下のエラーでストップ。

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

エラーをGoogleにつっこんだところ，下のサイトがヒット．

[https://apple.stackexchange.com/questions/254380/macos-sierra-invalid-active-developer-path](https://apple.stackexchange.com/questions/254380/macos-sierra-invalid-active-developer-path)


[http://tips.tutorialhorizon.com/2015/10/01/xcrun-error-invalid-active-developer-path-library-developer-commandline-tools-missing-xcrun/](http://tips.tutorialhorizon.com/2015/10/01/xcrun-error-invalid-active-developer-path-library-developer-commandline-tools-missing-xcrun/)

結局，下のコマンド実行後，たくさんの警告を出しながら```python3 setup.py install```が回りました．

```
sudo xcode-select --install
```

basemapのテストランを行ったところ，うまくいきました．

```
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

map = Basemap()
map.drawcoastlines()

fnameF='fig_basemap.png'
plt.savefig(fnameF, bbox_inches="tight", pad_inches=0.2)
plt.show()
```

![fig_basemap.png](https://qiita-image-store.s3.amazonaws.com/0/129300/78eb29d8-fd7d-f6d8-2374-1947c568c3d5.png)

以　上
ubuntuでpostgres導入に失敗した時の解決策

# 環境

- Vagrant 1.8.1
- Ubuntu 14.04.5 LTS, Trusty Tahr

# 事象

N予備校のpostgreSQLの導入でエラーが発生、1時間ほど詰まったのでメモ

posqgreSQL9.5を導入したいのに、テキスト通りコマンドを実行してもエラーが発生します。

```shell-session
$ sudo apt-get update
$ sudo apt-get install postgresql-9.5
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています 
状態情報を読み取っています... 完了
E: パッケージ postgresql-9.5 が見つかりません
E: 正規表現 'postgresql-9.5' ではパッケージは見つかりませんでした
```

ちなみに`sudo apt-get install`を実行すると`9.3`がインストールされます。

# 原因

ダウンロード先リポジトリに、`http://apt.postgresql.org/pub/repos/apt/`がないことが原因です。

デフォルトのリポジトリだと最新versionは9.3のようです。

# 解決

[UbuntuにPostgreSQLをインストール](http://xiangcai.at.webry.info/201604/article_8.html)

[postgreSQL公式](https://www.postgresql.org/download/linux/ubuntu/)

postgrSQL公式の手順に則ってれば問題ありません。

まずubuntuのバージョン確認です。

```shell-session
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.2 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.2 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
```

`VERSION`は`Trusty`ですね

postgrSQL公式のプルダウンを該当のubuntuのバージョンにしましょう。

![fullsizeoutput_4c4.jpeg](https://qiita-image-store.s3.amazonaws.com/0/142918/85c11381-99f8-c7ca-ee28-3459314119e7.jpeg)

`apt-get`で独自リポジトリを設定したい場合は、`/etc/apt/sources.list.d/`に設定ファイルを作ります。

```shell-session
$ sudo touch /etc/apt/sources.list.d/pgdg.list
$ sudo echo "deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main
" >> /etc/apt/sources.list.d/pgdg.list
```

次にリポジトリを認証する鍵情報をローカルキーチェーンに取り込んでおきます。

```shell-session
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | \
  sudo apt-key add -
```

最後に`apt-get`を実行しましょう。

```
$ sudo apt-get update
$ sudo apt-get install postgresql-9.5
```
Rのメモ


data()でデータセットを検索
data(data name)でデータをインポート

summary(data)でデータの集計を見る
str(data)でデータ構造を見る

hist(data$column)でヒストグラムを作る

plot(data$column1, data$column2)でプロット図を作る
cor(data$column1, data$column2)で相関係数を求める
Vagrantのbundle installでエラー


Vagrantで仮想環境作るぜ！の際にありがちなエラー

1. bundle installがうまくいかない、、、
2. rails s, cコマンドができない、、、

## bundle install

gem install json
gem install bcrypt
gem install nokogiri
とかnative extentsionがなんちゃらとか言われる。

###原因
Vagrantで作った仮想環境とローカル環境の共有フォルダ上にgemをインストールしようとすると怒られるので、パスを変更すればうまくいくかもしれない。

```
$ bundle install --path vendor/bundle
ではなく
$ bunlde install --path /sample_app_name/vendor/bundle
```

詳しくはこちらを参考に♡

http://innossh.hatenablog.com/entry/2015/06/10/195623

https://tamosblog.wordpress.com/2015/02/22/bundle-install_on_vagrant/

## rails s, c

require: cannot load such file -- bundler/setup (LoadError)みたいに怒られる時


```
$ rake rails:update:bin
```

http://qiita.com/rojiuratech/items/759c2d62907a2a36e340
erbからslimへの移行をスムーズに


下記５つのルールを意識する。

- <、>、<%、%>などのタグを削除する。閉じタグは全て削除する。
- each、ifなどのロジック部分の先頭に-を記載する。（endは必要ない)
- <%= ... >は=にする。yieldとrenderのときは、==にする。
- class属性やid属性は、p.fieldsやp#contentsなどにする。タグがdivのときはdivを省略し#contentと記載する。
- コメントは、/ このコメントはHTMLに変換後に表示されないか/! このコメントはHTMLに変換後にコメントになるで記載する。
juniper srxにて Setup Wizardのエラーを回避する

Juniper SRX300の最初のGUI設定でつまづいた。
原因は不明であるが回避できたのでメモ。

## 状況

工場出荷状態の SRX300にPCを接続し GUI(192.168.1.1)から SetupWizard「Guilded Setup」を実行。
最後の設定反映となる「Apply Settings」でエラーが発生し
設定項目が反映されない。

設定は単純に PPPoEで光アクセスに接続し、DHCPでPCを接続するもの。

JUNOS 15.1X49-D50.3 built 2016-05-28 20:02:37 UTC

### ダメなパターン

最初に接続するPCのポートが「Port1(0/1)」
Wizard内、Internet Zoneの Select Portで「Port0(0/0)」
Wizard内、Internal Zoneの Select Portで「Port1(0/1)」

→「Apply Settings」でエラー（内容は都度2～3パターンで変わる）が発生。

### 回避パターン

最初に接続するPCのポートを__「Port5(0/5)」__
Wizard内、Internet Zoneの Select Portで「Port0(0/0)」
Wizard内、Internal Zoneの Select Portで「Port1(0/1)」

→「Apply Settings」でエラーは発生せず「設定中」のままとなる。
　数分後に__PCの接続ポートを「Port5(0/5)」から「Port1(0/1)」に差し替え__
　192.168.1.1にアクセスすると設定が反映された GUIにアクセスできる。
　※id/passの入力画面となる
シェルスクリプトを実行する際に、特定のコマンドだけ実行しない方法(やや強引)

## やりたいこと
hulft送信コマンドを含むあるバッチ処理を実行し、正常終了させたい。
hulft送信コマンドはローカル環境でそもそもコマンドがなかったり、外部システムとつながっていない環境なので実行しても異常終了してしまう。
これをなんとかしたい。

応用例として、特定のコマンドの処理結果を変更することもできる。

## 正常終了させたい処理
hulftコマンドであることは特に重要ではないですが、例としてhulftコマンドの場合で説明します。

```
sudo -u [hulft用ユーザ] [utlsendへのパス]/utlsend -f [ファイルID] -sync
```

ただしsudoがなく、かつ下記のようにフルパスで指定されている場合は以下の方法はできません。

```
[utlsendへのパス]/utlsend -f [ファイルID] -sync
```

## やり方
1.ダミーコマンドを作成する

```
echo ":" >~/bin/sudo
```

2.実行権限を付与する
あまりよろしくないかもしれませんが、面倒なので私はいつもコレで。

```
chmod 777 sudo
```

3.パスを通す**(重要！！)**
上記で作成したダミーコマンドにパスを通しますが、ダミーコマンドを作成したディレクトリを必ず**一番左側**にくるようにしてください。

```
PATH=~/bin:${PATH}
```

4.バッチを実行する

## しくみ
まず、

```
sudo -u [hulft用ユーザ] [utlsendへのパス]/utlsend -f [ファイルID] -sync
```

に到達した段階で(他のコマンドでも同じですが)`sudo`がどこにあるかな、と検索します。
通常であれば`/bin`あたりに存在するかと思います。

この検索の仕組みが**環境変数`PATH`にあるディレクトリを左側から順番に検索していって、コマンドが最初にあった場所を採用する**というものなので、`/bin`より左側にダミーコマンドを作成したディレクトリを設定しておけば、ここを採用してくれるという訳です。

### 実験
初期状態

```
$ echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin
$ which cat
/bin/cat
```

`~/bin`にcatを作成する
(`touch`しただけではダメで実行権限をつけないとダメみたい。そりゃそうか。)

```
$ touch ~/bin/cat
$ chmod 777 cat
$ PATH=~/bin:$PATH
$ echo $PATH
[ホームディレクトリ]/bin:/sbin:/bin:/usr/sbin:/usr/bin
$ which cat
~/bin/cat
```

これでcatでファイルの中身を見られなくなりましたね←

```
$ seq 3 | cat -
$ seq 3 | /bin/cat -
1
2
3
```

パスを指定すればさすがに元の`cat`を認識する。

実験は以上。


次に、ダミーコマンドである

```bash:~/bin/sudo
:
```

ですが、`:`は単なる記号ではなく「ヌルコマンド」と呼ばれるものです。
`sudo`は実質`:`と化しているので、

```
sudo -u [hulft用ユーザ] [utlsendへのパス]/utlsend -f [ファイルID] -sync
```

は

```
: -u [hulft用ユーザ] [utlsendへのパス]/utlsend -f [ファイルID] -sync
```

となります。

つまり、`-u`と`[hulft用ユーザ]`と`[utlsendへのパス]/utlsend`と`-f`と`[ファイルID]`と`-sync`が`:`への引数になっています。
が、`:`は引数を貰っても何もせず正常終了するという性質を持っているので、(処理ステータスだけ考えれば)あたかも正常終了したかのように見える訳です。

上記の実験をしている最中に思ったのですが、`echo ":" >~/bin/sudo`なんてことをしなくても`touch ~/bin/sudo`でもいけそう。

以上

## 参考にさせて頂いたサイト様
[環境変数 PATH  UNIX_Linuxの部屋](http://x68000.q-e-d.net/~68user/unix/pickup?PATH)
Bigquery | TIMESTAMPで同時刻が GROUP BY 出来ない時 

Bigquery は TIMESTMAP にマイクロ秒まで持っているので、
WebConsoleでの見かけ上は同じでも、1マイクロ秒でも違えば、別の時刻扱いになる。


## 例

```sql
SELECT
  time
FROM (
  SELECT
    TIMESTAMP('2017-09-01 00:00:00') AS time
  UNION ALL (
    SELECT
      TIMESTAMP('2017-09-01 00:00:00.000001') AS time) )
GROUP BY
  time
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4cb97887-c26f-1fc2-566d-6fbd1021fd8c.png)

## CAST

timestamp型を DatetimeやStringにCASTすると、WebConsoleでミリ秒以下の違いが分かる。

```sql
SELECT
  time,
  CAST(time AS DATETIME) datetime,
  CAST(time AS STRING) string_time,
  regexp_replace(CAST(time AS STRING), '[+.][0-9]+', '') as replaced_time
FROM (
  SELECT
    TIMESTAMP('2017-09-01 00:00:00') AS time
  UNION ALL (
    SELECT
      TIMESTAMP('2017-09-01 00:00:00.000001') AS time) )
GROUP BY
  time
```


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/ea21a7b4-6c3a-1288-b014-8b85f42367db.png)

## 表記

StringにCASTした場合、表記はこんな風になる。
マイクロ秒の6桁まで必ず表示するわけではないようだ。

- `2017-09-01 00:00:00+00`
- `2017-09-01 00:00:00.001+00`
- `2017-09-01 00:00:00.000001+00`

# 秒単位で GROUP BY する

TIMESTMAP型を無理矢理、STRINGの秒単位に置換して、GROUP BY した例。

```sql
SELECT
  regexp_replace(CAST(time AS STRING), '[+.][0-9]+', '') as replaced_time
FROM (
  SELECT
    TIMESTAMP('2017-09-01 00:00:00') AS time
  UNION ALL (
    SELECT
      TIMESTAMP('2017-09-01 00:00:00.000001') AS time) )
GROUP BY
  replaced_time
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f78c040a-a5df-e82f-299e-c7788cac94aa.png)

もっといいやり方があれば教えてください

# 参考

- [データ型  |  BigQuery のドキュメント  |  Google Cloud Platform](https://cloud.google.com/bigquery/data-types?hl=ja)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
bash > 複数のbashスクリプトで１つのパラメータを使いまわす > echo [パラメータ] 実行後に [スクリプト] !:1 を&&でつなげる ( !$や!^でも可 ) (Esc + . で補完)

```txt:動作環境
CentOS 6.8
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
```

以下のようなスクリプトファイルが多数あるとする。

```csh:csh_170929_exec
#!/usr/bin/env csh

set pswd = $1
echo $pswd
```

以下のようなことをしたい。

`
./csh_170926_exec mirrorMirrorOnTheWallWhoIsTheFairestOfThemAll && ./csh_170927_exec mirrorMirrorOnTheWallWhoIsTheFairestOfThemAll && ./csh_170928_exec mirrorMirrorOnTheWallWhoIsTheFairestOfThemAll && ./csh_170929_exec mirrorMirrorOnTheWallWhoIsTheFairestOfThemAll
`

スクリプトを用意するのでもいいが、コマンドで実行するにはどうするか。

### こうした

参考: [前回のコマンドの最後の引数を使用する](https://qiita.com/rsooo/items/ef1d036bcc7282a66d7d#%E6%9C%80%E5%BE%8C%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%86%8D%E5%AE%9F%E8%A1%8C)
> ちなみに、最後の引数だけででなく、n番目の引数を!:2と書いてやれば取得できるが、
あんまり出番はない。

`
$ echo mirrorMirrorOnTheWallWhoIsTheFairestOfThemAll 
$ ./csh_170926_exec !:1 && ./csh_170927_exec !:1 && ./csh_170928_exec !:1 && ./csh_170929_exec !:1
```

`!:1`の部分が展開され、結果として以下になる。

```txt:結果
./csh_170926_exec mirrorMirrorOnTheWallWhoIsTheFairestOfThemAll && ./csh_170927_exec mirrorMirrorOnTheWallWhoIsTheFairestOfThemAll && ./csh_170928_exec mirrorMirrorOnTheWallWhoIsTheFairestOfThemAll && ./csh_170929_exec mirrorMirrorOnTheWallWhoIsTheFairestOfThemAll
mirrorMirrorOnTheWallWhoIsTheFairestOfThemAll
mirrorMirrorOnTheWallWhoIsTheFairestOfThemAll
mirrorMirrorOnTheWallWhoIsTheFairestOfThemAll
mirrorMirrorOnTheWallWhoIsTheFairestOfThemAll
```

### 備考

スクリプトを作るほうが失敗は少ないかもしれない。

### !$や!^も可能

参考: [bashのmanを読んで使いそうなものだけまとめる](https://qiita.com/chroju/items/7af3fd5faa26de4067f0)
> ちなみに実際には!$は直前の「最後の引数」を展開するものであり、複数引数があった場合には!^で最初、!:nでn番目の引数を指定できる。

!:1でなくとも!$や!^でもできる。

### Esc + . で補完

参考: https://unix.stackexchange.com/questions/86036/use-same-arguments-with-different-command
> answered Aug 8 '13 at 22:52
spuder
Use ESC + .
It will grab the last argument from the previous command

```bash
$ echo mirrorMirrorOnTheWallWhoIsTheFairestOfThemAll
```

上記を実行した後に、Esc + . で補完処理されるとのこと。

コマンド行が長くなるので、実行前の確認はしにくくなる。


### 実は教えていだたいていました

自分の2015年1月の記事([linux (bash?) > !$の使い方 (ついでに !^ と !:2 も)](https://qiita.com/7of9/items/6398ecb7bd8605e233d3))にて@emasakaさんにEsc + .のことを教えていただいていました。
Redmineが動いているサーバーにgitLabをインストールする

# 環境

CentOS 6.7
Redmine 3.2.0 （稼働中）
GitLab Community Edition 9.5.5

# やりたいこと

redmineが稼働しているサーバーに、同ドメインでポートを分けてgitLabを動かしたい。こんなかんじに↓
http://redmine.sample/ 
http://redmine.sample:8000/

redmineはApacheで動いているけど、gitLabはNginxで動くみたい。

# gitLabの公式ページに従ってインストール

gitLab公式ページ: https://about.gitlab.com/installation/#centos-6

なにも考えずに書かれてるとおりコマンドを打つ

```
$ sudo yum install -y curl openssh-server cronie
$ sudo lokkit -s http -s ssh
$ sudo yum install postfix
$ sudo service postfix start
$ sudo chkconfig postfix on
$ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
$ sudo yum -y install gitlab-ee
$ sudo gitlab-ctl reconfigure
```

# Redmineにアクセスできなくなった

「このサイトにアクセスできません」…:rolling_eyes:

とりあえずファイアウォールを停止してみたら見れた。
`$ sudo /etc/rc.d/init.d/iptables stop`

どうやら、２番目のコマンド `$ sudo lokkit -s http -s ssh` がiptablesを書き換えてしまう模様。
redmineのポートを復活させなければ…
（コマンドは意味を理解してから打とうね自分）

# Redmineを復活させる

`/etc/httpd/conf.d/redmine.conf` を見たらポート443で動いていたので443を許可する

`$ sudo vi /etc/sysconfig/iptables`
`-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT` を追記

再起動
`$ sudo /etc/rc.d/init.d/iptables restart`

復活しました:v:

# gitLabの設定

URLの設定

```ruby:/etc/gitlab/gitlab.rb
external_url 'http://redmine.sample:8000/'
```

reconfigure
`$ sudo gitlab-ctl reconfigure`

これだけでgitLabにアクセスできました！:v:

※ 最初、sudoを付けずに `gitlab-ctl reconfigure` して、あれ～表示されない…ってしばらくやって無駄な時間を過ごしました。
/var/opt に書き込み権限がなくてもろもろのファイルが生成されなかったようです。…:rolling_eyes:
Rubyでハッシュタグを抽出する

  
 ```ruby
    def scan_hashtags(text)
      text.scan(/[#＃][\w\p{Han}ぁ-ヶｦ-ﾟー]+/).map(&:strip)
    end
 ```

`\w` 英数字
`\p{Han}` 漢字
`ぁ-ヶ` ひらがなカタカナ
`ｦ-ﾟー` 半角カタカナ　？　理解不十分

参考リンク
http://makitt.tumblr.com/post/49494081133/twitter-%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%B0%E3%81%AE%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE
https://qiita.com/corin8823/items/75309761833d823cac6f
https://qiita.com/Sa2Knight/items/31c804e24b06569a6569
https://qiita.com/gomachan7/items/83f54f42883a24f2d76a
http://tools.m-bsys.com/data/charlist_kana.php
GCCBでGo1.9を使う

# tl;dr

- debian環境でGo 1.9でbuildしたい
- `gcr.io/cloud-builders/go:debian`で1.9が使えるようになったのでこれを使う

# GCCBでの1.9対応

GCCB上でbuildするときは`gcr.io/cloud-builders/go`を使うと思います。
これは`gcr.io/cloud-builders/go:alpine`のaliasで1.9のリリースとほぼ同時に1.9になっていました。

```shell-session
$ docker run --rm --name go -it gcr.io/cloud-builders/go:alpine version
Documentation at https://github.com/GoogleCloudPlatform/cloud-builders/blob/master/go/README.md
Running: go version
go version go1.9 linux/amd64
```

ただ[Stackdriver debuggerを使う関係](https://qiita.com/iwata@github/items/6ca5ddd6f17489cd2e81)上、Debian環境で1.9を使いたかったので自前でGCRに`golang:1.9-stretch`をpush[^1]して使っていました。
[^1]: `GOPATH`とかをworkspaceに対応させるためにごにょったimage

## go:debianの追加

そんな折、`cloud-builders`のgithub repositoryに最新のgoバージョンに対応させるため、`go:debian`を追加する[PR](https://github.com/GoogleCloudPlatform/cloud-builders/pull/132)がmergeされました。
これを使えばDebian環境でも1.9になるはず!!と思っていた時期が私にもありました。
しかしながら、このtagがGCRにpushされていない…

```shell-session
$ gcloud container images list-tags gcr.io/cloud-builders/go
DIGEST        TAGS           TIMESTAMP
6f712a3836a0  wheezy         2017-09-21T17:25:46
23ba11fb826c  alpine,latest  2017-09-21T17:25:30
0cd2b6e8cdcd                 2017-09-20T17:23:01
c0f7b7bfc202                 2017-09-20T17:22:42
f597b5141e73                 2017-09-19T17:22:54
241f728b7bb3                 2017-09-19T17:22:37
509a6c7d020f                 2017-09-18T20:53:32
94531456647a                 2017-09-18T20:53:13
ed66988eacd0                 2017-09-17T17:28:52
9f1b5a7c72ff                 2017-09-17T17:28:35
```

上記PRがmergeされてから待てど暮せどなかなかpushされなかったのですが、今朝みてみるとpushされているではありませんかっ!!

```shell-session
$ gcloud container images list-tags gcr.io/cloud-builders/go
DIGEST        TAGS           TIMESTAMP
527a43716750  debian         2017-09-29T06:19:23
3919ecc1666f  wheezy         2017-09-29T06:18:55
a3a582ebc1c0  alpine,latest  2017-09-29T06:18:36
9658d11fc459                 2017-09-29T02:47:57
196314f42c9e                 2017-09-29T02:47:39
520401f83ed4                 2017-09-28T17:34:36
9f16dd3584be                 2017-09-28T17:34:14
86c1525fcd64                 2017-09-27T17:27:13
b9adc60868f3                 2017-09-27T17:27:00
1d112e1afe1c                 2017-09-26T17:22:56
```

これで勝つる!

# cloudbuild.yaml更新

以下のようなstepを書けば早速つかえます。

```yaml:cloudbuild.yaml
steps:
  - name: gcr.io/cloud-builders/go:debian
    args:
      - test
  - name: gcr.io/cloud-builders/go:debian
    args:
      - build
```

おしまい。
Elasticsearch インストールからクエリ叩くまで！



全文検索エンジンElasticsearchをちょろ触りしたのでメモ。
https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concepts.html

## Elasticsearchでやってること
文章（検索対象のドキュメント）と検索クエリの両方共からトークン群（形態素解析もしくはNGramで分割）を作り、検索クエリのトークン群が文章のトークン群に含まれていたら検索にヒットする。もちろん検索クエリのトークン群のうち一部が含まれていたらOKとか、トークンを変形させてあいまい検索にも対応するとかそのようなことも可能。

## レッツインストール！

```
OSにjavaが入ってるの前提で
本家サイトからElasticsearchのZipファイルをダウンロードする。

$ cd path/to/解凍したディレクトリ

Elasticsearch 起動！9200番ポートで立ち上がる。
$ bin/elaticsearch

```

```
データ挿入してみる
$ curl -X POST http://localhost:9200/jazzlegend/sample -d '{"name":"Michael Brecker","instrument":"Tenor Sax"}'
```

```
データ検索してみる
$ curl -X GET http://localhost:9200/jazzlegend/sample/_search -d '{"query":{"match":{"instrument":"Tenor Sax"}}}' | jq .
```

jqってライブラリ入れとくと`| jq .`でJSON綺麗に出力してくれる。

```shell-session

{
  "took": 2, 　　　　　　　　　　　　　かかった時間
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {　　　　　　　　　　　　取得したデータの件数
    "total": 1,
    "max_score": 0.51623213,
    "hits": [
      {
        "_index": "jazzlegend",
        "_type": "sample",
        "_id": "AV69eHB__b0V4BwomFK8",
        "_score": 0.51623213,
        "_source": {
          "name": "Michael Brecker",
          "instrument": "Tenor Sax"
        }
      }
    ]
  }
}
```

## ゆるーく用語の確認
ふわっと理解したつもりでいるので、間違ってたらご指摘お願いします🙇

node: Elasticsearchサーバー
cluster: nodeの集まり。アプリごととかで分けたりする単位なのか
index: いわゆるデータベース
shard: nodeのリミットを超えるような大量のデータを扱うためにindexを小分けにするためのやつ
type: いわゆるデータテーブル
document: データオブジェクト単体
タプルによる多重代入とパターンマッチの比較


タプルは多重代入のための機能かどうか?
ところで、それってパターンマッチの特殊系なのでは?
と、感じたので比較

まずはPythonで。

```python
# Python
a, b = (1,3)
print(a, b)
```

出力

```出力
1 3
```

明示的に括弧をかく。

```python
# Python
(a, b) = (1,3)
print(a, b)
```

出力

```出力
1 3
```

Pythonでは`a, b` と `(a ,b)`は同じ意味になる模様。

Haskellでかいてみよう

```haskell
-- ghci
(a, b) = (1, 3)
print (a,b)
```

出力

```出力
(1,3)
```

Haskellの場合はパターンマッチなので下記のようにもかける
3番目の要素が一致すれば束縛するという処理に変わっているので注意。

```haskell
-- ghci
(a, b, 4) = (1, 3, 4)
print (a,b)
```

```出力
(1,3)
```

haskellの場合はパターンマッチなのでうまくいくことが確認できる。

しかし、Pythonはパターンマッチではないので、失敗する。

```python
# python
(a, b, 4) = (1, 3, 4)
print(a,b)
```

```出力
SyntaxError: can't assign to literal
```

多重代入はタプルのパターンマッチの簡易版とみなすことができそうだ。
【xcode9】指定しているアイコンがipad miniのホームにも設定アイコンにも表示されない解決方法

##問題
xcode9で作業をしているとipad miniだけアイコンが表示されなくなった。
ちなみに実機もシミュレータも駄目。

##シミュレータの設定
初期型ipad miniをシミュレータとして追加したい場合はDevice Typeを「iPad 2」にすればいいそうだ。

##解決方法
今回、TARGETS-General-App Icons and Launch Imagesの
App Icons Sourceを「Use Asset Catalog」から「AppIcon」に変更していた。
その際に、plistの「CFBundleIconFile」が削除され「CFBundleIcons~ipad」という項目が追加されていた。
「CFBundleIcons~ipad」の値は配列になっていて空だった。

どうもこれが原因のようで。「CFBundleIcons~ipad」項目を削除すればアイコンが表示されるようになった。
「CFBundleIconFile」もiOSアプリでは不要とのことなのでこの機会に消しておいた。
とあるエンジニアインターン面接でのコーディング

どうも！修業先探し中エンジニアです。
この間、私がエンジニアのインターンやりたいです！って面接に行った会社でこんなコード書いてみてー。
って言われたものをメモ。

他の言語でも良いので、もっとエレガントで素敵なコードがあれば教えていただきたいです🙇
Pythonとか知りたい。

## 題
一番慣れてる言語で、reverseメソッドを使わずに
"reenigne5252"みたいな文字列を反転する処理書いてみて

## 解答例

```rb
str = "reenigne5252"

str.split('').each_with_object([]) {|s, array| array.unshift(s)}.join()
# => "2525engineer"
```
tmux status lineに表示したwindow nameを自動renameしない

下記設定で自分で設定したwindow nameを表示したいだけなのに
window nameをカレントディレクトリで更新されて役に立つ情報が出ない。

`allow-rename off` めでたしめでたし

~~~.tmux
set-option -g allow-rename off
~~~
[Python3.5]datetimeオブジェクトのタイムゾーンを扱う

utcからjstに変換というより、datetimeオブジェクトのtimezoneを扱う方法です。

# naiveなUTCのdatetimeオブジェクトからからJSTに変換  
## 環境
- python3.5
- windows10

## datetimeオブジェクトのawareとnaive
datetimeオブジェクトにはawareとnaiveという二つの状態がある  
- aware
TimeZone情報を持つdatetimeオブジェクト
- naive
TimeZone情報を持たないdatetimeオブジェクト

datetimeオブジェクトに対して明示的にUTCであるというTimeZone情報を持たせて
naiveからawareにする必要がある。

その際にはpytzライブラリを使う
ちなみに[Python3.5](http://docs.python.jp/3.5/library/datetime.html#tzinfo-objects) のこちらのドキュメントには以下の内容が記載されている。
> pytz  
pytz ライブラリは Python に IANA タイムゾーンデータベース (オルソンデータベースとしても知られています) を持ってきます、そしてそれの利用が推奨されます。

## コード
以下がnavieからawareに変換しutcであるという情報を持ったtimezoneオブジェクトをJSTに変換する処理

```python
from pytz import timezone as tz, utc
utc_time = utc.localize(utc_naive)
jst_time = utc_time.astimezone(tz("Asia/Tokyo"))
```
Ubuntu 16.04にOpenSTF環境構築

Ubuntu 16.04日本語 RemixにOpenSTFの環境構築メモ。

#環境構築
```bash:bash
# rethinkdb
source /etc/lsb-release && echo "deb http://download.rethinkdb.com/apt $DISTRIB_CODENAME main" | sudo tee /etc/apt/sources.list.d/rethinkdb.list
wget -qO- https://download.rethinkdb.com/apt/pubkey.gpg | sudo apt-key add -

#色々
sudo apt-get update
sudo apt-get install git
sudo apt-get install npm
sudo apt-get install rethinkdb
sudo apt-get install android-tools-adb
sudo apt-get install python
sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool
sudo apt-get install build-essential
sudo apt-get install ninja-build
sudo apt-get install libzmq3-dev
sudo apt-get install libprotobuf-dev
sudo apt-get install graphicsmagick
sudo apt-get install yasm
sudo apt-get install stow

#nodejs
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs

sudo npm install -g bower karma gulp

mkdir ~/Downloads

#ZeroMQ
cd ~/Downloads
wget http://download.zeromq.org/zeromq-4.1.2.tar.gz
tar -zxvf zeromq-4.1.2.tar.gz
cd zeromq-4.1.2
./configure --without-libsodium --prefix=/usr/local/stow/zeromq-4.1.2
make
sudo make install
cd /usr/local/stow
sudo stow -vv zeromq-4.1.2

#Google protobuf
cd ~/Downloads
git clone https://github.com/google/protobuf.git
cd protobuf
./autogen.sh
./configure --prefix=/usr/local/stow/protobuf-`git rev-parse --short HEAD`
make
sudo make install
cd /usr/local/stow
sudo stow -vv protobuf-*

sudo ldconfig

#OpenSTF
cd
mkdir openstf
cd openstf/
git clone https://github.com/openstf/stf.git
cd stf
sudo npm install -g stf --unsafe-perm
```

#Chromeを入れる
Firefoxでは動作が不安定なのでChromeを入れる。
[ここ](https://www.google.co.jp/chrome/browser/desktop/index.html)からダウンロードして

```bash:bash
sudo dpkg -i google-chrome-stable_current_amd64.deb
```
#起動
```bash:bash
#rethinkdb起動
rethinkdb

#OpenSTF起動
stf local
```

#参考サイト
https://github.com/openstf/stf
https://gist.github.com/yasuyk/bbaa28568c497d95ff92566efc4ecc3c
https://www.rethinkdb.com/docs/install/ubuntu/
https://nodejs.org/ja/download/package-manager/#debian-and-ubuntu-based-linux-distributions-debian-ubuntu-linux
[Python] ArgumentParserのhelpを標準エラー出力する。

Pythonでコマンドライン引数の制御やhelp表示に便利な`ArgumentParser`。
今回その出力を標準エラー（stderr）にしたかったのですが、そのようなオプションは無かったので


こうしました。

~~~

import sys
import argparse

# argparse.ArgumentParserのWrapperクラス
class MyArgumentParser(argparse.ArgumentParser):
	def _print_message(self, message, file=None):
		if message:
			print(message, file=sys.stderr)

# メイン処理
def main():
	parser = MyArgumentParser()
	... Argment追加・設定処理 ...
	args = parser.parse_args()

~~~

Wrapperクラス作って、`_print_message` をオーバーライド。
これでArgumentParserの出力が全て標準エラーに向かいます。
help、usage、error以外の出力は無いと思うので、全部標準エラーに向けて問題は無いはず。

下記コマンドで動作確認。

~~~
$ python test.py -h 1>/dev/null
→ 標準出力は捨てて、標準エラーはそのまま表示。
　→ 表示される。

$ python test.py -h 2>/dev/null
→ 標準出力はそのまま出力、標準エラーは捨てる。
　→ 表示されない。
~~~


別案として、 

`parser.parse_args()` をコールする前に 
`-h` や `--help` が存在したら 
`parser.print_help(file=sys.stderr)` をコールする

という方法も考えましたが、
`add_help=False` にして自力で処理を書かないといけないですよね。
それは色々と面倒だし、サブコマンドを使う場合は更に複雑になりそうなので。
合成音声(Open Jtalk)でwavファイルを作成しないで再生する

# はじめに
実行環境はRaspberry Pi 3。

# Open JTalkのインストール

`$ sudo apt-get -y install open-jtalk libhtsengine1 open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001`

# 音声ファイルの作成と再生

``` sh
$ echo "こんにちは" | open_jtalk \
         -x /var/lib/mecab/dic/open-jtalk/naist-jdic/ \
         -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
         -ow sample.wav
$ aplay --quiet sample.wav
```

-x オプションは形態素解析用の辞書の場所。
-m オプションは音声データの場所。
-ow オプションは出力するファイル名。

aplay コマンドで音声ファイルを再生する。--quiet オプションで、再生時に文字を出力させない。

# 音声ファイルを作成せずに再生させる
open_jtalkは音声ファイルをファイルへの出力しか行うことができない。-（ハイフン）を指定しても、その名前のファイルが作成される。
そこで、出力ファイル名を`/dev/stdout`に指定して、ファイル出力を標準出力とする。

``` sh
$ echo "こんにちは" | open_jtalk \
   -x /var/lib/mecab/dic/open-jtalk/naist-jdic/ \
   -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
   -ow /dev/stdout \
   | aplay --quiet
```

# 再生用のシェルスクリプト
``` sh:myjtalk.sh
#!/bin/sh

# パイプで送られればそれを、でなければ引数の文字列を、open_jtalkに与える。
if [ -p /dev/stdin ]; then
    cat -
else
    echo $@
fi | open_jtalk \
-m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-ow /dev/stdout \
| aplay --quiet
```

```shell-session
$ chmod +x myjtalk.sh
$ echo "こんにちは" | ./myjtalk.sh
$ ./myjtalk.sh "こんにちは"
```
実際にプロセスを起動せずに、あたかも起動しているように偽装する方法

## やりたいこと
あるバッチ処理で、hulftのデーモンが起動しているか確認する処理があった。
このバッチを正常終了させたいが、実際にhulftのデーモンを起動させることはできない。
(ローカル環境でhulftコマンドがなかったり、デーモンを起動させるとなにかとよろしくないような場合)

hulftのデーモンはhulobsd、hulsndd、hulrcvdの3種類あり、これらが起動している状態に偽装する。
つまり、`pgrep -c hul`の結果を3にしたい。

## やり方
1.sleepコマンドをコピーする
※「~」はホームディレクトリと呼ばれる場所です。

```
cp -p $(which sleep) ~/bin/hulobsdSleep
cp -p $(which sleep) ~/bin/hulsnddSleep
cp -p $(which sleep) ~/bin/hulrcvdSleep
```

2.コマンドを配置したディレクトリへパスを通す(通っていれば不要)

```
PATH=~/bin:${PATH}
```

3.sleepをバックグラウンドで起動する
1hは1時間という意味。ここはなんでもよい。
指定なしでもいいかと思ったけど、killし忘れると面倒なことになる。

```
hulobsdSleep 1h &
hulrcvdSleep 1h &
hulsnddSleep 1h &
```

4.プロセスが起動したか確認する(任意)

```
$ ps | grep Sleep
10658 pts/0    00:00:00 hulobsdSleep
10660 pts/0    00:00:00 hulrcvdSleep
10662 pts/0    00:00:00 hulsnddSleep
```

5.バッチ処理を実行する

6.プロセスを停止する

```
pkill Sleep
```

7.プロセスが停止したか確認する(任意)
何も出力されなければOK。

```
ps | grep Sleep
```

以上
アルゴリズムイントロダクション 練習問題1.1

# アルゴリズムイントロダクションとは

[世界標準MIT教科書](https://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%82%A4%E3%83%B3%E3%83%88%E3%83%AD%E3%83%80%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3-%E7%AC%AC3%E7%89%88-%E7%AC%AC1%E5%B7%BB-%E5%9F%BA%E7%A4%8E%E3%83%BB%E3%82%BD%E3%83%BC%E3%83%88%E3%83%BB%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0%E3%83%BB%E6%95%B0%E5%AD%A6-%E4%B8%96%E7%95%8C%E6%A8%99%E6%BA%96MIT%E6%95%99%E7%A7%91%E6%9B%B8/dp/4764904063/ref=pd_lpo_sbs_14_t_0?_encoding=UTF8&psc=1&refRID=2YGMECM64Q06KXSG69A9)
大学などで情報処理を専門に学ぶが読む本
私は現在エンジニアとして働いているが、教育機関で訓練を受けたわけではないので、
このあたりの知識が不足しているので読んでみてます。

本書で紹介されているアルゴリズムはGithubにGo言語で実装しています。
[リポジトリはこちら](https://github.com/miumiu0917/algorithms-introduction)

ペースもゆっくりですが、マイペースに勉強進めていきます。

#本記事の目的

アルゴリズムイントロダクションでは練習問題が記載されていますが、
模範回答が見つからないのでQiitaに投稿すればレビューしてもらえるのでは！？
と思い、投稿してみます。
皆様の知恵と知識をお貸し頂けますと幸いです。

また、これを機に一緒に勉強したい、自分も基礎から計算機科学を勉強したい、という人が出てくると嬉しいです。

ちなみに私の回答は間違っている可能性が高いので、そのあたりはご了承頂きたく。

#練習問題1
第一章は具体的なアルゴリズムの話ではないのですが、
じっくり考えると意外と難しいですね。

##1.1-1
*ソートを必要とする実社会での応用あるいは凸包を必要とする実社会での応用を説明せよ。*

ソートはまあいいとして、凸包は初めて聞きました。
[凸包-wikipedia](https://ja.wikipedia.org/wiki/%E5%87%B8%E5%8C%85)
![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/183295/464f032c-b219-8af3-8cde-939597ff3734.png)

こんな感じで与えられた要素(画像の場合は点)を全て内包する最小の凸多角形のことらしいです。
これらの点が釘の場合、輪ゴムを引っ掛けると凸包の形になります。


**回答**
ソート-図書館の本の陳列
凸包-CG処理(ポリゴングラフィック)

昔の3Dゲームのグラフィックは3次元の凸包の組み合わせで表現されているように見えます。
(FF7の戦闘シーンとか、そんな感じ)
ソートは色んな所で使われている気がしますが、例で出した図書館で言うと、本とかがソートされずにどこにあるかわかんない！ってなったら借りるほうも困るし、図書館で本を管理する人たちも困りますよね。

##1.1-2
*実社会の枠組みの中で用いられる計算速度以外の効率の尺度をあげよ。*

**回答**
メモリ使用量、データ転送量

省メモリなアルゴリズム
無駄なI/Oのないアルゴリズムを心がけたいです。

##1.1-3
*以前に見たことのあるデータ構造についてその長所と短所を挙げよ*

**回答**
データ構造-配列

長所-検索が高速。*O(1)*
短所-要素の挿入、削除が遅い。挿入or削除した分、メモリのアドレスをずらさなければならない。

逆に連結リストの場合は

長所-検索が遅い。1番目に格納されているデータからポインタをたどる必要がある
短所-要素の挿入、削除が高速。挿入、削除した前後のデータのポインタを変更すれば良い。

##1.1-4
*最短経路問題、巡回セールスマン問題の類似点と違いについて述べよ。*

[巡回セールスマン問題-wikipedia](https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%83%9E%E3%83%B3%E5%95%8F%E9%A1%8C)
[最短経路問題-wikipedia](https://ja.wikipedia.org/wiki/%E6%9C%80%E7%9F%AD%E7%B5%8C%E8%B7%AF%E5%95%8F%E9%A1%8C)


**回答**
複数のルートから距離が最短となるものを選択する、という点が類似点。
違いは巡回セールスマン問題は全てのノードを通る必要があるが、
最短経路問題はスタートとゴールのみが決められていて、他のノードは必ずしも通る必要がない。

##1.1-5
*最適解しか意味を持たない実社会の問題を示せ。また近似解で意味を持つ場合の問題も示せ。*

**回答**
電子商取引の暗号化複合化は最適解でないと意味がない。(暗証番号盗まれたなどのアルゴリズム以外の原因を除いて、本人だと証明出来なければ意味がない。)

トラックのドライバーが荷物を運ぶ最短ルートを計算する問題は現実的な計算時間で、ある程度効率的なルートが判明するのであれば問題ない。


# 次回
次回は1.2の練習問題解いていきます！！！
mosh接続するときのERROR解決

# 環境


## ローカル
Mac

```
brew install mobile-shell
```

## remote

Ubuntu

```
sudo apt-get install mosh
```


#ERROR
接続しようとすると以下のエラーがでていた。

```
mosh <remote-server>
The locale requested by LC_CTYPE=UTF-8 isn't available here.
Running `locale-gen UTF-8' may be necessary.

mosh-server needs a UTF-8 native locale to run.

Unfortunately, the local environment ([no charset variables]) specifies
the character set "US-ASCII",

The client-supplied environment (LC_CTYPE=UTF-8) specifies
the character set "US-ASCII".

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=ja_JP.UTF-8
LANGUAGE=
LC_CTYPE=UTF-8
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
Connection to 153.121.58.100 closed.
/usr/local/bin/mosh: Did not find mosh server startup message. (Have you installed mosh on your server?)
```

# 参考

http://yuzuemon.hatenablog.com/entry/2013/10/11/025628

# 解決策

ローカルで、以下を追加。

```
export LC_CTYPE="ja_JP.UTF-8"
```

# 上ので解決しなかった場合

以下のコマンドでローカルとリモートの違いを確認する。

```
locale
```
日付要件で障害を起こして辛い思いをしないためのtips集

Septemberは7なのに9月、Octoberは8なのに10月。
日付は身近なものではありますが、
過去の歴史やしがらみから認識誤りが発生しやすい分野です。

## 簡単なチェック
- [ ] 日付や期間について、複数パターンの図を描いて合意したか	 
- [ ] 日付や期間について、複数パターンの実例を書いて合意したか	 
- [ ] 期間について、いつ始まり、いつ終わるか秒単位で合意したか	 
- [ ] ひと月あたりの日数の違いは考慮しているか  
 1/31, 2/28, 3/31...
- [ ] うるう年は考慮しているか	 
- [ ] `24:00`をまわった場合は前日分と当日分、どちらとしてカウントするか	 
- [ ] 営業日ベースか、日数ベースか	 
- [ ] その仕様は試験 / 検証可能か	 



##日付や期間について、図と実例で合意したか
ある日の夜間、1週間後とは具体的に何月何日の何時何分何秒...~~地球が何回回ったとき~~でしょうか？
例えば3/3から3日間とすると、終わりは3/6まで？ 3/5まで？ 3/6の23:59:59.9999まで？始まりは？
だいたい関係者間で認識がずれているので、図や実例をいろんなパターンで書いてみましょう。

##月と年：日数が安定しない
期間1ヶ月で！ → 31日ある月もあれば、30日の月もあり、28日しかない月もある。
30日合計分と31日合計分を比較すると、1日だけの違いとはいえ約3%のずれがあります。

###ラウンドトリップ問題
1/31の1ヶ月後は? 2/28?  さらにそこから1ヶ月戻すとどうなる？
法令による業務仕様の場合、その法令の解釈も検証する必要があります。
1年も注意が必要です。うるう年を忘れずに。
###対応例：
* うまくカレンダー通りにする
* 365日で固定させる
* 360日(30日 × 12ヶ月)で固定させる

##"1日"の定義：どこからどこまでか
1日分も簡単そうで紛らわしいです。

* あるタイミングから24時間
* その日の`24:00`まで

おそらくどちらかだと思います。
なお、消費者向けのアプリケーションの場合、
24時を超えてもアクセスはたくさん来ます。
特に主な顧客が国内の場合、`24:00`をまわった分は当日分と翌日分、どちらとしてカウントするか決めておきましょう。

###参考
[30時間制 – Wikipedia](https://ja.wikipedia.org/wiki/30%E6%99%82%E9%96%93%E5%88%B6)

##営業日ベース vs 日数ベース
社内業務系の場合、平日のみ(営業日)で日数を数えることはよくあります。
この場合祝日のマスタ管理が必要になります。
必要なら日本以外の祝日も管理しましょう。

##試験 / 検証可能か
3日後に動作する仕様を試験するのに、本当に3日待たないといけない仕様になっていませんか？
だからといってOSの日付を操作してなんとかしようすると、様々な部分がおかしくなります。
日付周りはパラメータなどの何らかの形でコントロールできるとうれしいですね。
システム的には`now()`といった状態依存のメソッドの乱用は控えるとよいでしょう

わかりやすい例

* https://t-wada.hatenablog.jp/entry/design-for-testability
* ~~https://codeiq.jp/magazine/2013/11/1475/~~
* https://nekoya.github.io/blog/2013/07/09/what-time-is-it/

##細かいもの
###サマータイム
海外向けのフロントエンドを作る場合は考慮を忘れずに
###時差
昼にメールを送ったつもりが現地の深夜に届くかもしれません。
###年号
Web系なら年号を使っているとしてもフロントエンドでの変換ぐらいなので問題ないでしょう。
システム関連携で年号を保持しているとつらいですね。
個人的には新年号がJISやunicodeに加わるか気になります。
㍾　㍽　㍼　㍻　の次。
###以下の話はしません

* 太陽太陰暦による春節の算出
* 修正ユリウス暦のうるう年算出
* 天文時
* イラン歴

##その他システム的観点
###うるう秒
最近はntpサーバがよしなにしてくれます。
よしなにしていない場合は注意
###unixtime
2038年問題はよく知られていますが、日付同士を加算しても起こりえます。
その場合は`(日付A + 日付B) / 2 `ではなく、` (日付A / 2) + (日付B / 2) `に。
###タイムゾーン
OS、言語、ライブラリ、ミドルウェアごとに
どのタイムゾーンを扱っているのか、扱えるのかが異なる可能性があります。
わからなくなったら全部書き出してみましょう。
##最後に
要件の誤りはテストではなかなか見つかりません。
認知の問題で一番検討が難しいのでみなさん頑張りましょう。
Railsで遷移元のコントローラーとアクションを取得する

## 遷移元のコントローラーとアクションを取得する

`Rails.application.routes.recognize_path(request.referer)`を使ってあげる。

```rb
# どこかのコントローラーで
path = Rails.application.routes.recognize_path(request.referer)

# コントローラーを取得
path[:controller]

# アクションを取得
path[:action]
```

以上のようにして取得出来る
【使い方】JMS（Java Message Service）

# JMSとは

Java Message Serviceの略で、Javaでメッセージングサービスを利用するための標準APIのことです。プログラムの疎結合や非同期処理を行う際に用いられます。通信方式には「Point-to-Point」と「Publisher-Subscriber」の２種類があります。

# 環境
- NetBeans8.2
- Java8
- JavaEE7
- GlassFish4.1

# Pub/Sub方式

１つのメッセージを複数の送信先に送ることができる方式です。

JMS（Pub/Sub）で出てくる登場人物は以下の通り。

|項目|意味|
|:--|:--|
|トピック|送信先、または受信先|
|Publisher|メッセージ送信者|
|Subscriber|メッセージ受信者|
|ブローカー|メッセージ管理（トピック管理）|

## ブローカーの作成

ブローカーはPublisherが送信したメッセージを管理するプロバイダです。

```xml:glassfish-resources.xml
<resources>
    <admin-object-resource enabled="true" jndi-name="jms/UserTopic" object-type="user" res-adapter="jmsra" res-type="javax.jms.Topic">
        <description/>
        <property name="Name" value="UserTopic"/>
    </admin-object-resource>
</resources>
```

## 連携オブジェクトの作成

```java:User.java
@Data
Public class User implements Serializable {
    private String name;
}
```

## Publisherの作成

メッセージをトピックと呼ばれる送信先に送信します。

```java:Publisher.java
@Stateless
public class Publisher {

    @Inject
    private JMSContext context;

    @Resource(mappedName = "jms/UserTopic")
    private Topic topic;

    public void send(String name) throws JMSException {
        User user = new User();
        user.setName(name);
        context.createProducer().send(topic, user);
    }
}
```

## Subscriberの作成

登録したトピックからメッセージを受信します。Publiserからメッセージが送信されると、```onMessage```メソッドが呼ばれます。

```java:Subscriber.java
@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/UserTopic"),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic")
})
public class Subscriber implements MessageListener {

    @Override
    public void onMessage(Message msg) {
        try {
            User user = msg.getBody(User.class);
            System.out.println(user.getName());
        } catch (JMSException ex) {
            // 例外処理
        }
    }

}
```

## 使い方

```java:JmsResource.java
@RequestScoped
@Path("jms")
public class JmsResource {
    
    @Inject
    private Publisher publisher;

    @POST
    public void send(@FormParam("name") String name){
        publisher.send(name);　// メッセージ送信
    }
}
```
【Swift】 アセット画像を３種類も書き出したくない

# Swift 画像を３種類も書き出したくないでござる

![gozaru.jpg](https://qiita-image-store.s3.amazonaws.com/0/62822/b8677763-2da7-5060-3428-54a60bcc44b4.jpeg)


## この記事でできるようになること
- xcodeでのiOSアプリ開発において、画像をx1 x2 x3 の３種類書き出さなくてよくなります。
    - ビルド時に、Xcodeが、@2x、@3xのサイズの画像を生成してくれるらしい
- **PDFを使うことで改善できます**

## iOS開発をしていて困るのが、画像の書き出し
- **x1**
- **x2 retina** 
- **x3 ipad**

これらを瞬時に用意しないといけません。
![download.jpg](https://qiita-image-store.s3.amazonaws.com/0/62822/bbe35be0-6ed0-cace-244f-61098922cb02.jpeg)

**めんどう！！**


## **そういえばxcodeはベクターも対応しているじゃないか！！**
- ということで、画像はpdfをimage.xcassetsに入れてみましょう！

### １、まずはPDFを生成

### ２、PDFをasset.xcassetsに入れる

<img width="1029" alt="スクリーンショット 2017-09-28 23.09.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/df3a182e-6b2a-0e95-1807-94d8e73836a2.png">

すると、まあこんな感じになります

### ３、single scaleにする

<img width="1060" alt="スクリーンショット 2017-09-28 23.12.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/a9a1de4f-9a25-d2b4-8f89-dc5ee9951a94.png">

ベクターがぞうなので、single scaleにしちゃいます

### 追記
- preserve vector data にチェックをいれてください、でないとぼやけます


### おわり！！
- あとは、`UIImage(named: "shot_ling")` でも
- storyboardからでも普通に呼び出すことができます！！

## まとめ
- 開発の時間が 1/3 になり、5000兆円の利益アップができました！！
- デザイナーにも優しいですね！！

![download-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/62822/aff9dfdb-6e82-142a-d8ca-2e2ffa16a7ab.jpeg)

ありがとうございました。
Haxe heaps Component Styleの適応

#Haxe heapsとは
https://github.com/HeapsIO/heaps
Haxe創始者謹製ゲームフレームワークライブラリ。
JavaScript・Swf・HashLinkによく対応してあります。
その他のプラットフォームはLime経由での対応のようなのですが、
モバイル対応などこれからのようです。

#heaps component
現在は

- Box
- Label
- Button

など、基本的なコンポーネントが用意されています

#スタイルの設定

```
var button = new Button();
var style = new h2d.css.Style();
style.backgroundColor = Color(0xff000000);
style.borderColor = Color(0xffffffff);
style.borderSize = 1;
style.borderRadius = 10;
button.setStyle(style);
```
ES2015のモジュール機能(import/export)

# ES2015のimport/exportについて

## 何を実現できるのか

- 別ファイルの内容をimportして取り込める
- 自ファイルの内容をexportして公開できる

## サンプル

- 説明するより動きを見たほうが理解できると思うので

```js:User.js
export default 'Ozaki';
export const name1 = 'Mike';
export const name2 = 'John';
```
```js:Hello.js
import User, { name1, name2 } from './User';

console.log(User); // Ozaki
console.log(name1); // Mike
console.log(name2); // John
```
```js:Hello2.js
import aaa, { name1 as bbb, name2 as ccc } from './User';

console.log(aaa); // Ozaki
console.log(bbb); // Mike
console.log(ccc); // John
```

## サンプルの解説

- `export default`で公開した値は
    - 中括弧なしでimportできる
    - どんな名前でimportしてもよい
- `export`で公開した値は
    - 中括弧をつけてimportする
    - export時の変数名でimportする
    - `{ xxx as yyy }`とすることで任意の変数名に変えることができる

## その他

- `export default`で公開できるのは１ファイル１つ
- 変数でも関数でもclassでもexportできる