OmniAICreator/Qiita-1.07M huggingface dataset:
python + seleniumでwebデザインギャリーサイトの自動投稿 (1)環境構築



#概要
##動機
副業の関連で治療院専門のwebデザインギャラリーサイトをwordpressで製作しようと思いたつ。でもギャラリーサイト画像用のキャプチャ保存、wordpressへのアップデートを毎回行うのがとても面倒。ということでpythonの勉強がてら自動投稿環境を作成。
長くなるので何回かに分けて投稿します。

\* ここでいう自動投稿は、ターミナル上でpythonスクリプトを動かし、スクリーンキャプチャの取得から、投稿テキストの作成、worpdressへのログイン、投稿までを行えることを指します。

##前提
- mac OS Sierra
- wordpress 4.7
- python 3.5
- selenium  3.0.2
- beautifulsoup4 4.5.1

##内容
1. 環境構築
2. 画面キャプチャの取得 - selenium
3. 画像の切り抜き、圧縮 - PIL、tinypng
4. 投稿用CSVの作成 - bs4
5. 自動投稿 -selenium

実際のギャラリーサイトは[こちら](https://clinic-web-design.com)になります。


##フォルダ構成
```
image_cap
├── cap.py #キャプチャ保存、csv書き込みのスクリプト
├── images #キャプチャ画像の保存先
├── min-images #圧縮したキャプチャ画像の保存先
├── list.txt #ギャラリ-に追加したいサイトのURLの取得
├── up-list.csv #一括投稿に使うCSV
├── upload.py #wordpress投稿用のスクリプト
├── setting.config #ログインID、パスワードやimageディレクトリのパスなどの設定
```

一応ソースコードをgithubで管理してます。
[こちら](https://github.com/kawamataryo/py_cap)からどうぞ。


#1. 環境構築
##ローカル側の設定
###seleniumのインストール
キャプチャの取得等で使用するウェブプラウザをプログラムで動かすためのソフト。主にwebサイトのテスト用で使用されるみたい。

```
$ pip install selenium
```
###chromewebdriverのダウンロード
今回はChromeを使いたいのでhomebrewよりダウンロード。

```bash
$ brew install chromedriver
$ which chromedriver 
  usr/local/bin/chromedriver # これをseleniumのpassとして設定します
```


###beautifulsoup4のインストール
スクレイピングで掲載サイトのタイトルを取得するのに使います。

```
$ pip install beautifulsoup4
```

###tinifyのインストール
画像の圧縮でtinypngのAPIを使用するために。[こちら](http://qiita.com/Alice1017/items/b23aa8e1de55c8dfbad5)の投稿が大変参考になりました。API KEYの設定等も行ってください。

```
$ pip install tinify
```

###lxmlのインストール
htmlパーサーとしてlxmlを利用するためにインストール。正直パーサーがどんなことするかイマイチわかっていない。。汗

```
pip install lxml
```

[こちら](http://qiita.com/itkr/items/513318a9b5b92bd56185)を参考にさせて頂きました。

##設定ファイルの読み込み
今後の修正で楽するためにpythonのConfigParserというのを使ってログインID、ファイルパスなどの変数をまとめました。
以下のコードではこちらを使っていきます。

```setting.config
[CAPTURE] #キャプチャ画像のパス
img_pass = /cap_git/images
min_img_pass = /cap_git/min_image

[RESIZE] #tinypngのAPIキー
tiny_key = hogehoge

[WRITE] #csv書き込みの設定
init_row = post_title,post_category,capture,url,post_type,post_status
post_type = post
post_status = publish
up_address = http://test/wp-content/themes/test/dist/images/

[UPLOAD] #wordpressのログイン情報などなど
login_url = http://test/wp-login.php
login_id = hoge
login_pass = hogehoge
import_url = http://test/wp-admin/admin.php?import=csv
img_up_pass = http://test/wp-content/themes/sage-8.5/dist/images
```

それでcap.pyにおいて下記で変数を読み込みます

```cap.py
# 設定ファイルの読み込み
conf = configparser.ConfigParser()
conf.read('setting.config')

# APIキーの設定
tinify.key = conf['RESIZE']['tiny_key']
# 縮小前の画像があるdir
FROM_DIR = conf['CAPTURE']['img_pass']
# 縮小後の画像を置くdir
MIN_DIR = conf['CAPTURE']['min_img_pass']
# 設定項目
INIT_ROW = list(conf['WRITE']['init_row'].split(','))
# 画像のURL
IM_ADRRESS = conf['WRITE']['up_address']
# 設定する投稿タイプ
POST_TYPE = conf['WRITE']['post_type']
POST_STATUS = conf['WRITE']['post_status']

```

configparser.ConfigParser()でモジュールの設定
conf.readeでconfgファイルのパスを指定して読み込み。
値には辞書型みたいな形式でアクセスできるのでそれを変数に挿入してます。



##wordpress側の設定
###Really Simple CSV Importerプラグインの追加
csvでの一括投稿を行うために。[こちら](https://liginc.co.jp/web/wp/plug-in/58046)を参考にしました。
その他、Advanced Custom Fieldsで投稿用のカスタムフィールドの設定もおこなっています。




その2画面キャプチャの保存へ続く
《Wordpress》Contact Form 7 add confirm使用時のスタイルを整える

入力フォームプラグイン「Contact Form 7」のアドオンの、「Contact Form 7 add confirm」を使用時のスタイルをリセットしたりカスタマイズします。

## 暗くなるのをリセット

確認状態になると入力領域がグレーになります。
これをリセットします。

```css

input.wpcf7c-conf,
textarea.wpcf7c-conf {
  border: 0;
  padding: 0;
  background: #fff;
}

```


## オートコンプリートの背景色を取り除く

Chromeで確認状態になると、背景色がオートコンプリートのまま残ります。
これをリセットします。

```css

.wpcf7-text:-webkit-autofill {
  box-shadow: 0 0 0 1000px #fff inset;
}

```

このコードは通常入力時のオートコンプリートも打ち消す挙動になります。
確認フローの時だけ、オートコンプリートの背景色を取りのぞきたい場合は、もうすこし改良が必要です。


### 確認のフローでのみオートコンプリートの背景色を取り除く

これにはスクリプトが必要になります。
確認状態の時に任意のクラスを付与して、それを利用してスタイルを指定します。
そして、戻るボタンを押したときには、クラスを取り除きます。

WordPressの管理画面のコンタクトフォームの編集画面から、「その他の設定」タブに以下を記述します。

```

on_confirm: "var $wpcf7 = $('.wpcf7'); $wpcf7.addClass('is_confirm');$('.wpcf7c-btn-back')[0].addEventListener('click', function() { $wpcf7.removeClass('is_confirm'); });"

```

確認状態の時に`wpcf7`に`is_confirm`というクラスを与えて、戻るボタンを押下すると削除します。

CSSは以下のように記述します。

```css

.wpcf7.is_confirm input:-webkit-autofill {
    box-shadow: 0 0 0px 1000px #fff inset;
}

```


## アラートウインドウで確認を促す

スタイルを整える、の趣旨からそれますが、確認状態に移るときにアラートウインドウを表示するコードです。

```js

document.addEventListener('wpcf7submit', function (event) {
  switch (event.detail.status) {
    case 'wpcf7c_confirmed':
      // 確認後に実施したい処理
      break;
  }
}, false);

```

確認のフローは非同期遷移なので、慣れていないユーザーに対してわかりやすくしてあげるのに、手荒ですが対応できるかなあと思います。
`wpcf7submit` イベントの `wpcf7c_confirmed` のタイミングでスクリプトを与えるといろいろ確認時に実行できるので、モーダルウィンドウとかを自作するのもアリですね。




おわります。
iTunes Connect の Resolution Centerを開きたいけどURLがわからない時

App StoreへiOSアプリを公開しようとする時に利用するiTunes Connect。
提出したアプリが審査でリジェクトされると、Resolution Center(問題解決センター)で問題点を指摘されます。
そこは掲示板(チャット？)形式になっていて、異議申し立てや質問をすることが出来ます。

ところで、審査に通るとResolution CenterへのリンクがUI上から消えてしまいます。（消えてしまいますよね？少なくとも僕にはわからないUIでした！）

でも時がたってからResolution Centerでのやり取りを振り返りたいとか、引き継ぎされたプロジェクトで過去の経緯を確認したいとか、いろいろあって審査が通った末に参考としてリンクをどこかに貼り付けておきたいとかが有ると思います。なので、困る〜！！

というわけで他の情報を元にResolution CenterへのURLを組み立ててしまう方法です。

## その前に: メールがあったらリンクを辿れる

そもそも何の努力をしなくてもメールがあれば開けます。

審査で問題があった時に受信するメールにResolution Centerへのリンクが書かれていると思います。

そのリンクは審査が通ったあとも有効です。

## Resolution Center のURLの仕組み

これが Resolution Center のURL。

`https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/ra/ng/app/アプリID/platform/ios/versions/バージョンID/resolutioncenter`

というわけでこのURLの生成に必要な情報を集めてURLを組み立てます。必要なのはアプリIDとバージョンIDです。

`マイ App` > `アプリを選択` > `アクティビティ` > `App Store バージョン`

Resolution Centerを見たいリリースバージョンの見出しを右クリック

`<div class="accordion-header collapse-trigger" data-version-id="XXXXXXXXX">` というHTMLの `XXXXXXXXX` がバージョンIDです。

この時点で、現在見ているページのURLにアプリIDが含まれているので、アプリIDとバージョンIDが揃いました。

アドレスバーからURLを編集します。URLはこんな感じになっていると思います。

`https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/ra/ng/app/アプリID/activity/ios/versions`

これを次のように編集します。

1. `/activity/` を `/platform/` に変更
2. `/versions` の後ろに `/バージョンID/resolutioncenter` を追加する
onOptionsItemSelectedが呼ばれない時の対処法

#対処法
FragmentのToolbarの戻る(home)ボタンやメニューのクリックをハンドルしたいと思って`onOptionsItemSelected`をオーバライドしたけど呼ばれない！

そのときはだいたい下記を忘れている。

`setHasOptionsMenu(true);`

これを`onCreateView`なり`onViewCreated`で呼べば`onOptionsItemSelected`が呼ばれるようになる。`onCreateOptionsMenu`も同様。
herokuで動かしてる既存railsプロジェクトの開発環境をdocker-composeで作る

# 環境
- os: macOS Sierra(10.12.4)
- docker for mac(17.0.3.0-ce-mac2)
- git
 
# ゴール
herokuで稼働中のrailsプロジェクトをローカルのdockerで動かすところまでをゴールとします。前提として、開発環境では今までsqlite3を使っていましたが、dockerでは本番環境(heroku)と同じpostgresを使います。モチベーションとしては、開発環境を本番環境に近づけることにあります。

#手順

## gitリポジトリをローカルへclone
[`heroku git:clone -a project_name`](https://dashboard.heroku.com/apps/sudoku-log/deploy/heroku-git)とかでもできるみたいですが、未確認です。

```bash
 $ git clone https://.../my_heroku_project.git
 $ cd my_heroku_project
```
## Gemfileとconfig/database.ymlを編集(ここはDBMS変更時のみ)

以下では差分のみ書き出してます。

```:Gemfile
diff --git a/Gemfile b/Gemfile
index 27352ae..2033fcb 100644
--- a/Gemfile
+++ b/Gemfile
@@ -14,7 +14,7 @@ gem 'sdoc',         '0.4.0', group: :doc
 
 group :development, :test do
   gem 'bullet', '4.14.0'
-  gem 'sqlite3', '1.3.9'
+  gem 'pg', '0.17.1'
```
`pg`は本番環境でも使うのでまとめられるのですが、あえてこう書いています。

```:config/database.yml
 default: &default
-  adapter: sqlite3
+  adapter: postgresql 
   pool: 5
   timeout: 5000
+  encoding: utf8
+  database: postgres
+  username: postgres
+  password:
+  host: db
 
 development:
   <<: *default
-  database: db/development.sqlite3
+  database: my_heroku_project_development 
 
 # Warning: The database defined as "test" will be erased and
 # re-generated from your development database when you run "rake".
 # Do not set this db to the same as development or production.
 test:
   <<: *default
-  database: db/test.sqlite3
+  database: my_heroku_project_test 
```

#dockerコンテナのビルド

次のDockerfileとdocker-compose.ymlを`my_heroku_project/`に配置します。rubyとpostgresのバージョンはherokuに合わせています。

```:Dockerfile
FROM ruby:2.1.10
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install --without production
ADD . /myapp
```

```:docker-compose.yml
version: '2'
services:
  db:
    image: postgres:9.6.2
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
     - "3000:3000"
    depends_on:
      - db
```
`docker-compose build`でビルドします。ビルドが終わったら`docker-compose up -d`で動かします。立ち上がったら`docker-compose run web rake db:migrate`してからlocalhost:3000をブラウザで開けば動いていることが確認できます。

開発はローカルにあるファイルを編集すれば反映されます。今の構成だと`docker-compose build`する度にgemのインストールをしたり時間がかかります。時間はかかるんですが、個人的にはそれをする頻度はそれほど高く無いのと、それを解決するのは後からでも良いと考え、まず導入してみることにしました。

# おまけ
`psql`を起動する方法を書いておきます。個人的に少し解決に時間がかかりました。

```:bash
docker-compose run db psql -h db -p "5432" -U postgres
```
現場で使えるSQL [SQLServer]

現場で使えるSQLまとめてみました。

## 指定したカラム名を持つテーブルを検索する
```
SELECT   T.name AS TableName,
         C.name AS ColumnName
FROM     sys.tables AS T
           INNER JOIN sys.columns AS C
            ON T.object_id = C.object_id
WHERE    C.name = 'カラム名'
ORDER BY T.name,
         C.name;
```

## スキーマから簡易テーブル設計書を作成する
```
SELECT
    C.TABLE_NAME AS TableName,    
    C.ORDINAL_POSITION AS OrdinalPosition,
    CASE WHEN T1.COLUMN_NAME IS NULL THEN 0 ELSE 1 END AS IsPK,
    C.COLUMN_NAME AS ColumnName,
    C.DATA_TYPE AS DataType,
    CASE C.CHARACTER_MAXIMUM_LENGTH WHEN -1 THEN 'MAX' WHEN NULL THEN '' ELSE ISNULL(CONVERT(VARCHAR(10), C.CHARACTER_MAXIMUM_LENGTH), '') END AS MaximumLength,
    CASE WHEN C.IS_NULLABLE = 'NO' THEN 0 ELSE 1 END AS IsNullable,
    COLUMNPROPERTY(OBJECT_ID(QUOTENAME(C.TABLE_SCHEMA) + '.' + QUOTENAME(C.TABLE_NAME)), C.COLUMN_NAME, 'IsIdentity') AS IsIdentity,
    ISNULL(C.COLUMN_DEFAULT, '') AS ColumnDefault
FROM
    INFORMATION_SCHEMA.COLUMNS AS C
    LEFT OUTER JOIN(
        SELECT 
            K.TABLE_NAME, 
            K.COLUMN_NAME 
        FROM 
            INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K 
            INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS T 
            ON K.TABLE_NAME = T.TABLE_NAME 
            AND K.CONSTRAINT_NAME = T.CONSTRAINT_NAME 
        WHERE 
            CONSTRAINT_TYPE = 'PRIMARY KEY'
    ) AS T1 
    ON C.TABLE_NAME = T1.TABLE_NAME
    AND C.COLUMN_NAME = T1.COLUMN_NAME
ORDER BY
    C.TABLE_NAME,
    C.COLUMN_NAME
```
New RelicとSlackの連携手順

# New Relicとは
- レスポンスタイムやスロークエリといった、Webアプリケーションのパフォーマンスを測定してくれるサービス
- 無償で利用できるライセンスあり
- https://newrelic.com

# Slackとは
- ビジネス向けのチャットサービス

# New Relic × Slack
## Slackの設定
1. New Relicの通知を受信するチャンネルを作成し、 「Add an app or integration」を選択する
![slack1.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/35131c7b-b63e-5c03-8324-3f93a1e34cb4.png)

2. new relicを検索すると、以下のような画面になるので、New Relicを検索する
![slack2.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/42b70e2f-bf08-01d8-18a5-cefbcd452233.png)

3. この画面からインストールする
![slack3.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/70b769d2-fb55-305e-12d3-bdddf469e344.png)

4. 通知するチャンネルを選択して、「Add New Relic Integration」をクリック
![slack4.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/9bb53185-7095-ac3c-5fd0-d0a6f38987a5.png)

5. ここで「Webhook URL」をコピーして、どこかに覚えておく。設定を保存して、Slackの設定は一旦終わり
![slack5.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/0271215c-7262-9e00-5260-affc264c47e7.png)

## New Relicの設定
1. New Relicにログインして、APMのサブメニューのAlertsを選択する（newがついているほうは有償プランのユーザーのためのものです）
![newrelic1.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/62f0b32e-98ae-fda5-f202-c98acd33f3df.png)

2. 左ペインの「Server Policies」を選択する。「Edit」ボタンを選択する
![newrelic2.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/a4045ca7-9c65-842b-d5a2-856198854491.png)

3. 以下のような画面に遷移し、各指標の閾値を編集できる
![newrelic3.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/f1463efb-3454-5676-e802-b42c9ffaf5fe.png)

4. 右上のコンポーネントの「Alert channels」のタブを選択すると、「Create channels」というリンクが表示されるので、クリックする
![newrelic4.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/ca2affa0-c279-0233-2477-5924d48b21d6.png)

5. ChannelsのWebhookを選択する
![newrelic5.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/d3be8a3b-cf87-1689-6d63-4290843ac226.png)

6. 先程コピーしておいたWebhook URLを入力して、設定ボタンをクリックする
![newrelic6.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/ee16daf7-9a9c-7bb2-8979-2720d55c8578.png)

7. 4の画面のAlert ChannelsでSelect Channelsを選択、該当のWebhookにチェックを入れる
![newrelic7.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/e0ea145d-a137-f7e9-cb0f-8c9642f22897.png)

＊SlackにNew Relicが通知が来ます＊
SlimでHTMLタグを動的に切り替えたい

## 概要
高性能かつ、シンプルなシンタックスでシェアを伸ばしているテンプレートエンジン「**Slim**」 → [Slim公式GitHub](https://github.com/slim-template/slim)

弊社でも導入しているのですが *SEOなどの観点から特定条件下でタグを切り替えたい* 場合があって、その方法を調べたので記載します。

## 要件

わかりやすい具体例を挙げると下記のように出力させることを想定しています。
共通のテンプレートになっていて、各所から呼ばれていると仮定してください。

```:html
# トップページで呼び出された場合
<h1>
    タイトル
    <span>サブタイトル</span>
</h1>

# 他コンテンツで呼び出された場合
<div>
    タイトル
    <span>サブタイトル</span>
</div>
```

このように、特定の条件だけトップノードのタグが異なって内包する要素は同一となっています。

## 方法

解決方法は下記の通りです。

```:slim
# top_page = トップページの場合はtrueを返す

*{tag: (top_page ? 'h1' : 'div')}
    | タイトル
    span サブタイトル
```

ちなみに `*{}` の記法ですが、`tag`以外にも`id`や`class`といったプロパティも対応しているので、動的にCSSクラスを書き換えたい場合にも有用です。

```:slim
*{tag: タグ名, id: ID名, class: クラス名}
```
シェルスクリプトの途中で実行するシェルを変えることはできそうにない…かも

# <i class="fa fa-question-circle"></i> なぜそんなことがしたいの？

シェルスクリプトでbash環境にfish環境作りたい。
fishを入れるまではいいけどその後のfish操作が難しい


```sh

#!/bin/bash

# fish install
cd /etc/yum.repos.d/
wget http://download.opensuse.org/repositories/shells:fish:release:2/CentOS_7/shells:fish:release:2.repo
yum install fish -y

# デフォルトshellへ

which fish | xargs chsh -s

# fisherman

curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisherman

fisher up # bashにはないよ

```

# <i class="fa fa-cube"></i> シバン | シェバン

[シバン (Unix) - Wikipedia]

複数書いたら以降はそれにならないかなーっと

```sh
#!/bin/bash
hogehoge

#!/bin/fish
hugahuga
```

まあならない。Rubyとかはシバンを見て呼び飛ばしてくれるから、
[Perl, Python 及び Ruby スクリプトにおける正しいshebangの書き方 - Qiita]
>起動されたshは2行目のexecでRubyに飛び、Rubyは3行目までを読み飛ばすという寸法である。

```sh
#!/bin/bash
hogehoge

fish readlink -f $0 # スクリプト内でのcd対策に絶対パスで
exit 0
#!/bin/fish
hugahuga

```

[bash で ファイルの絶対パスを得る - Qiita コメント:#comment-10d1b710bcf7df114cb7]


こんな感じのを書いたけど、まあfishのシェバンまで読み飛ばすことはなく、頭から再実行するよねと。

# <i class="fa fa-cube"></i> 実行中シェル判定

じゃあ自身を別シェルで呼び出すまではいいとして、実行中のシェル名を見てifで分岐すればいいんじゃない？
文法上の問題はあるだろうけど、インタプリタで毎行解析？だろうから通過しなければいいし、デフォルト設定だと失敗しても処理が継続するのがシェルの特徴？だから？、なんとかなるかも。
 bashにはSHELL変数があるみたいだし。

と思って調べて、
[現在使っているシェルの名前を知る方法 - 揮発性のメモ]
や
[現在の shell を shellscript の中から確認する(Linux, BSD 両対応) - tkuchikiの日記]

を見て

```sh
#!/bin/bash

echo 'start'
echo `readlink /proc/$$/exe`
if [ `readlink /proc/$$/exe | grep bash` ] ; then
    echo "bash"
    fish `readlink -f $0`
elif [ `readlink /proc/$$/exe | grep fish` ] ; then
    echo "fish"
    fisher up
fi
```

みたいにしたんだけど、fishがifや$$のは使えないよーってなって無理でした。

POSIX互換?なシェルで基本文法が同じならできるかもしれない？
fishはPOSIX互換ではないらしい。

[ログインシェルは bash のまま fish を利用する - Qiita]

>この問題はログインシェルを一時的に bash に戻すことで解決できました。
>
ですが、rsync に限らず、何らかの形でシェルに依存しているプログラムは、そのシェルが POSIX 互換であることを前提としています。fish は POSIX 非互換なので、いつまた同じような問題に遭遇するかわかりません。


# <i class="fa fa-cube"></i> 最終的に

bashの中で一コマンドごとにfishを呼び出すのでした。
手を出すにはまだ早い領域でした。

```sh
#!/bin/bash

# fishインストール

# 毎回呼び出し
fish -c 'fisher up'
fish -c 'fisher install spin'

```


[シバン (Unix) - Wikipedia]:https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_(Unix)
[Perl, Python 及び Ruby スクリプトにおける正しいshebangの書き方 - Qiita]:http://qiita.com/tueda/items/369215b99316b2e9f3d8
[bash で ファイルの絶対パスを得る - Qiita コメント:#comment-10d1b710bcf7df114cb7]:http://qiita.com/katoy/items/c0d9ff8aff59efa8fcbb#comment-10d1b710bcf7df114cb7
[現在使っているシェルの名前を知る方法 - 揮発性のメモ]:http://d.hatena.ne.jp/iww/20131108/dash
[現在の shell を shellscript の中から確認する(Linux, BSD 両対応) - tkuchikiの日記]:http://tkuchiki.hatenablog.com/entry/2014/05/08/222135
[ログインシェルは bash のまま fish を利用する - Qiita]:http://qiita.com/tak-onda/items/a90b63d9618d6b15c18c
go標準のbenchmark機能の使い方

## ReadMeFirst

golangには、関数のbenchmarkを行うパッケージ・ユーティリティが標準で含まれています。
今回はgoで関数単位でのbenchmarkをとる方法について書きます。

testの基本的な実行方法については、[前記事](http://qiita.com/marnie_ms4/items/e51cc6d879cc9ad07af3)を参照。

## ベンチマークするテスト関数を作る

[testing package](https://golang.org/pkg/testing/) の benchMark用の
構造体を使います。

Benchmark関数は以下のように宣言します。(規約)

```go

func BenchmarkXxx(b *testing.B)
```

* go界隈では有名な `appendで都度allocateすると重いよね~` なコードを例に。testファイルを作成

`hoge_test.go`

```go
package main

import (
	"fmt"
	"testing"
)

func BenchmarkAppend_AllocateEveryTime(b *testing.B) {
	base := []string{}
	b.ResetTimer()
	// Nはコマンド引数から与えられたベンチマーク時間から自動で計算される
	for i := 0; i < b.N; i++ {
		// 都度append
		base = append(base, fmt.Sprintf("no%d", i))
	}
}

func BenchmarkAppend_AllocateOnce(b *testing.B) {
	//最初に長さを決める
	base := make([]string, b.N)
	b.ResetTimer()
	// Nはコマンド引数から与えられたベンチマーク時間から自動で計算される
	for i := 0; i < b.N; i++ {
		base[i] = fmt.Sprintf("no%d", i)
	}
}

```

## 実行

```
$ go test -bench . -benchmem
testing: warning: no tests to run
PASS
BenchmarkAppend_AllocateEveryTime-4	 2000000	       676 ns/op	     106 B/op	       2 allocs/op
BenchmarkAppend_AllocateOnce-4     	 5000000	       258 ns/op	      22 B/op	       2 allocs/op
```

```
実行した回数
１回あたりの実行に掛かった時間(ns/op)
１回あたりのアロケーションで確保した容量(B/op)
1回あたりのアロケーション回数(allocs/op) 
```
が表示されていますね。
毎回appendする場合と最初に固定長で用意する場合で大分速度と確保容量が違いますね。

## 知っとくと便利なオプション

https://golang.org/cmd/go/#hdr-Description_of_testing_flags
に載ってる中からよく使うものを抜粋。

* -benchmem

メモリ関連の情報を出力。

* -benchtime t
 
計測に使う時間を`t`で指定する。defaultは1s

* -cpuprofile=*.prof

詳細なCPUプロファイルが取れる `go tool pprof`で内容を見る

* -count

テストする回数を指定 

* -cpu

実行するcpu数

* -memprofile=*.prof

詳細なMemoryプロファイルが取れる `go tool pprof`で内容を見る


## よく使うtesting.Bのmethod

コード見た方が早いぜ、って方は[こちら](https://github.com/golang/go/blob/master/src/testing/benchmark.go)


* `testing.B.ResetTimer()`

計測時間をResetします。比べたい処理部分の前に行う感じで。
StartTimer(),StopTimer()もよく使います。

* `testing.B.Benchmark() `

go testを使わないでBenchmarkをするときに。
返り値は[こちら](http://golang-jp.org/pkg/testing/#BenchmarkResult)

## 参考
[testing package](https://golang.org/pkg/testing/)
[go cmd](https://golang.org/cmd/go/#hdr-Description_of_testing_flags)

## 関連
[はじめてのgo test](http://qiita.com/marnie_ms4/items/e51cc6d879cc9ad07af3)
proxy環境下でgit cloneするまで（503エラーを超えて）

proxy環境下でgit cloneしようとして悪戦苦闘した話。

# 結論
git のバージョン上げて環境変数no_proxyを設定しましょう。

# 環境
Bash on Ubuntu on Windows (10 pro)

# 環境変数設定
まずは環境変数を設定。

```
$ export http_proxy="http://example.co.jp:xxxx"
$ export https_proxy="https://example.co.jp:xxxx"
```
（ここで'.co'を入れ忘れてて30分ぐらい失った。すごく恥ずかしい）

# git のバージョンと設定
バージョンは以下の通り。
とりあえずapt-get install git でいれました。

```
$ git --version
git version 1.9.1
```

以下のように設定。
会社ではgitlabを使用しているので、そこで使ってる名前やアドレスを登録しました。

```
git config --global user.name taro
git config --global user.email taro.com
git config --global http.sslverify false
git config --global credential.helper cache
git config --global http.proxy http://example.co.jp:xxxx
git config --global https.proxy https://example.co.jp:xxxx
```

#とりあえずgit clone
とりあえずcloneしてみました(sshのアドレスじゃなくてhttpであることに注意)

```
$ git clone http://git.example.com/taro/sample.git
Cloning into 'sample'...
fatal: unable to access 'http://git.example.com/taro/sample': The requested URL returned error: 503
```

まさかの503エラー。

調べてみたところ、このサイト([Gitを社内(Proxy環境下)で使うときは気をつけましょう](http://gozuk16.hatenablog.com/entry/2014/06/06/200602))と同じ状況でした。

どうやら環境変数no_proxyの設定が必要らしい。
ただし、このバージョン(1.9.1)のgitはno_proxyに対応していない（参照していない？）らしい。
([Gitがいつの間にかno_proxyに対応してた](http://qiita.com/tenten0213/items/65192c41d188032ebe25))

なのでgitのバージョンを上げる
#gitのバージョンを上げる
上げるといっても、デフォルトのapt-getで入れると1.9.1が入ってしまうため、
一工夫いれる。([Ubuntu 14.04 で Git の最新を使う](http://qiita.com/cointoss1973/items/1d419e51dbb8eccae972))

```
$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt-get update
$ sudo apt-get upgrade
```
コピペなのでsudo ついちゃってるけど、BoWだと起動時にデフォルトで
rootユーザとしてログインしてるからなくても動くと思います。

バージョンが上がっていることを確認。

```
$ git --version
git version 2.11.0
```

#環境変数no_proxyの設定
```
export no_proxy="127.0.0.1,localhost,192,168.*,git.example.com"
```
ここら辺の細かい値は各自調整。
(おそらく)

#git clone(リベンジ)
```
$ git clone http://git.example.com/taro/sample.git
fatal: destination path 'sample' already exists and is not an empty directory.
```

ようやく成功しました！
(fatalと書いてありますが、空のリポジトリをcloneしたから吐かれているだけで、ちゃんとディレクトリにはcloneされてます)

#感想
プロキシ周りは勉強不足すぎてトラウマしかできませんでした。
皆さんも気を付けましょう！
C++ builder / TCanvas > Timageの内部を白にする

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

TCanvasで描画をする場合、描画内容の変更時に一度内部を白で塗りつぶす必要がある。

参考 http://www.delphigroups.info/2/c8/206300.html

C++ Builderでは以下のような関数を用意して使ってみる。

```cpp
void __fastcall TForm1::clearTImage(TImage *imgPtr)
{
	imgPtr->Canvas->Brush->Color = clWhite;
	imgPtr->Canvas->FillRect(Rect(0, 0, imgPtr->Width, imgPtr->Height));
}
```

希望の動作になった。
MESSAGE_MAP

# MESSAGE_MAPを使ってみる

[MSDNのMESSAGEMAP](https://msdn.microsoft.com/ja-jp/library/0812b0wa(VS.80).aspx)

メッセージマップテーブルにWindowsメッセージを追加する

```test.cpp
BEGIN_MESSAGE_MAP(CTest01Dlg, CDialogEx)
	ON_WM_CLOSE() //追加
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()
```

MSDNより
>関数名は必ず "On" で始めます。この後に Windows メッセージ名から WM_ を取ったものを続けます。なお、各語の先頭だけを大文字にします。パラメータは、wParam、LOWORD(lParam)、HIWORD(lParam) の順に指定します。指定しないパラメータは渡されません。MFC クラスにラップされたハンドルは、該当する MFC オブジェクトへのポインタに変換されます。

宣言

```test.h
public:
	afx_msg void OnClose();
```


実装

```test.cpp
void CTest01Dlg::OnClose() 
{
	MessageBox(_T("終了します"), _T("確認"));

	CDialogEx::OnClose();
}
```
現場で使える英語

###### 仕様ですか？
Is this by design?
Is this in the specifications?

###### これは仕様です。
It's in the specifications.

###### バグ見つけちゃいました。
I found a bug in your system.

###### 修正したdocumentの確認お願いします。
Please kindly confirm the revised document.

###### IT環境にプロジェクトをデプロイしてもらってもいいですか？
Could you please deploy プロジェクト to IT環境.

###### プロジェクトをIT環境にデプロイしました。確認お願いいたします。
プロジェクト has been deployed to IT環境. Please check it out.

###### プロジェクトはまだデプロイしてないよ。
プロジェクト is not deployed yet.
Swiftで画面の向きを固定する方法

##iosアプリで画面の向きを固定する方法



アプリの画面を横向きで固定したいのに最新のコードが(貼り付けて動くもの)がなかったので。


swift3(2017.3.28現在)
画面の向きを指定する方法は(横向き)
以下だ。


とりあえず

```Viewcontroller.swift

    override var shouldAutorotate: Bool {
        return true
    }
    
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.landscape
    }

```

追記　2019.04.01

### プロジェクト全体で画面の向きを固定する

xcodeの設定画面でぽちぽちすれば良い。

### 特定のViewControllerで画面の向きを固定する


### iPadで画面が回転してしまう
MacでFirefoxが開かなくなった

よければ[こっち](http://off.tokyo/?p=713&preview=true)で見てくれたら飛び跳ねます

# 環境

Sierra
mac book

# 謎

いつものようにFirefoxを立ち上げようとしたら下記のエラーが発生して開なくなりました

```swift

A copy of Firefox is already open. Only one copy of Firefox can be open at a time.

//Firefoxのコピーは既に開いています。一度に開くことのできるFirefoxのコピーは1つだけです。
```

# 解決

以下のようにコマンドを実行していくことで治りました

```
$ cd ~/Library/Application\ Support/Firefox/Profiles/
```

```
$ cd rAnd0m(ここの値は個々でユニークです).default 
```

```
$ ls -la
```
```
$ rm -v .parentlock
```

# 参考

[Can't open Firefox because a copy of Firefox is already open](http://apple.stackexchange.com/questions/196771/cant-open-firefox-because-a-copy-of-firefox-is-already-open)
Chrome拡張をインストールする際に「Invalid manifest」のエラーが出て困った

## 現象

自作のChrome拡張をzipでアップロード → 公開 → 自分の環境にインストールしようとしたところ
`Invalid manifest`というエラーが出てインストールできない現象に陥った

![スクリーンショット 2017-03-29 11.11.31.png](https://qiita-image-store.s3.amazonaws.com/0/67471/bb01b08f-1020-5574-2766-6cfe5a5284b7.png)


## 実際のmanifestファイル

```json:manifest.json
{
    "manifest_version": 2,
    "name": "invalid_manifest",
    "version": "1.0.0",
 
    "description": "Invalid Manifestを意図的に起こす拡張",
 
    "icons": {
        "16": "icons/invalid_manifest.png",
        "48": "icons/invalid_manifest.png",
        "128": "icons/invalid_manifest.png"
    },
 
    "content_scripts": [
        {
            "matches": ["http://www.google.co.jp"],
            "js": ["js/invalid_manifest.js"],
            "run_at": "document_end"
        }
    ]
}
```

## 原因

`Match Patterns`の構文が間違っていたようだった
https://developer.chrome.com/extensions/match_patterns
このページのBad Patternの書き方をしているとアップロード時のバリデーションには通るがインストール時のバリデーションで失敗するようだ

ひとつ注意点があるとすると
http://www.google.com
これはpathがなくてエラーになるので
http://www.google.com/
こうする（末尾にスラッシュをつける）とうまくいく
Ruby on Rails の ActiveRecord でバリデーションエラー取得時に、翻訳済みのフルのエラーメッセージとアトリビュート名を同時に取得する

# 問題

Ruby on Rails では、モデルにバリデーションエラーを設定していた場合、 #errors でエラーの内容を取得出来ます。

`full_messages` では、アトリビュート名を含んだフルのメッセージを取得出来ますが、アトリビュート名は取得出来ません。

```.rb
> person = Person.create
> person.errors.full_messages
=> ["年齢は数値で入力してください", "年齢を入力してください"]
```

`messages` ではアトリビュートとエラーの対が取得出来ますが、フルのメッセージは取得出来ません。

```.rb
> person.errors.messages
=> {:age=>["は数値で入力してください", "を入力してください"]}
```

# 解決

`to_hash` に引数を与えることで、双方を取得出来ます。

```.rb
> person.errors.to_hash(true)
=> {:age=>["年齢は数値で入力してください", "年齢を入力してください"]}
```

http://api.rubyonrails.org/classes/ActiveModel/Errors.html#method-i-to_hash
【Laravel】Commandクラスのconstructorの罠

タイトルは言い過ぎですね。

罠というモノではないのですが`php artisan`コマンドを実行したタイミングで、
`App\Console\Kernel`に登録されているCommandクラス群は、
すべてインスタンス化されて`__construct` がコールされます。
(コマンドリストが出力されるのは、そういう仕組みなのか)

ですので、`__construct`内で`Command::handle`がコールされた時にしか使用しないような
初期化処理はやめた方が良いです。。。

`php artisan`するだけでRedisやらDBやらにアクセスする処理が走ってしまうと...
ESP-WROOM-02 とDHT11の温湿度計(Ambient)にLCDモニターを付ける

WROOM-02で温湿度計をネットに送るのは、既に多くの事例が公開されていて、私もそれらの情報を参考にさせていただいて、Ambient に送ってグラフ化することで一応満足していたのですが、単体で動作させている時に、その時点のデータを見たいと思って、LCDディスプレイを接続して見ました。

## 16文字✖️2行のLCDが310円！
　お試しということで、接続が簡単なI2C対応で廉価なLCDディスプレイを探しました。
Amazon に 16文字✖️2行のLCDディスプレイが 190円、シリアルインターフェースアダプタが120円（どちらも送料込み）というのがありましたのでそれを購入。

## 構成
　構成は、次のとおり
![IMG_2155.jpg](https://qiita-image-store.s3.amazonaws.com/0/16491/3c7007e0-7ca3-74c2-79f4-c313839e60ab.jpeg)
![IMG_2156.jpg](https://qiita-image-store.s3.amazonaws.com/0/16491/51663e09-4654-e1a9-7b31-4bbadb36fdf2.jpeg)


- ESPr Developer　（スイッチサイエンス）
- 温湿度センサー（DHT11）
- HD44780 1602 LCD ディスプレイモジュール 16×2キャラクタ (HiLetgo)
- IIC/I2C/TWI/SPI シリアル インタフェース ボード モジュール (HiLetgo)
- ブレッドボード
- ジャンパーワイヤー
- プルアップ抵抗

　LCDとボードは半田付けが必要です。
LCDのSDAは4番、SCLは5番端子に接続しました。（プルアップ抵抗は10KΩとありましたが、手元にあった24KΩで代用）

## スクリプト
　プログラムは次のとおり。

``` cpp:WROOM
#include <Ambient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP8266WiFi.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);

#define ssid       "YOUR WiFi SSID"   // WiFiのSSID をセット
#define password       "YOUR WiFi PASSWORD" // WiFiのパスワード をセット

#define channelId <YOUR CHANNEL>  // Ambientのチャネル番号
#define writeKey "YOUR WRITE KEY FOR AMBIENT"  // Ambient の書き込みキーをセット

WiFiClient client;
Ambient ambient;


void setupWiFi() {
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void setup() {
  Serial.begin(9600);
  Serial.println("DHT11 test!");
  dht.begin();
  setupWiFi();
  ambient.begin(channelId, writeKey, &client);
  lcd.init();
  lcd.backlight();
}

void loop() {
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" *C ");
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.println(" %\t");

  ambient.set(1, t);
  ambient.set(2, h);
  lcd.clear();
  lcd.setCursor(1,0);
  if (ambient.send()) {
    lcd.print("Data sent!");
  } else {
    lcd.print("Data send NG.");
  }
  lcd.setCursor(1,1);
  lcd.print(" to Ambient.");

  delay(5000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("\xb5\xdd\xc4\xde"); // 「オンド」
  lcd.print(": ");
  lcd.print(t);
  lcd.print("\xdf");   // 上付きの○
  lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print("\xbc\xc2\xc4\xde"); // 「シツド」
  lcd.print(": ");
  lcd.print(h);
  lcd.print("%");

  delay(20000);
}

```

## 意に反して1文字しか表示されなかった時は

　Arduino nano など、WROOM-02 より処理速度が速いものなどで使うと、この LCD は1文字しか表示されなかったりすることがあります。処理が遅くて追いつかないようです。
　そんな時は、次のオマジナイを先にやっておけば、全部表示されるようになります。
（Amazon のカスタマーレビューにありました。）

```cpp:omajinai
#define printIIC(args) Wire.write(args)　
inline size_t LiquidCrystal_I2C::write(uint8_t value) {
  send(value, Rs);
  return 1;
}
```

## 雑感
　DHT11は安くて買いやすいのですが、精度が良くないので目安程度です。
Fish Shell で、コマンド結果を出力したくない、 （zshの 2>&1 >/dev/null） をしたい場合

試行錯誤の末、愚直な解しか得られなかった。

```bash:fish
~> git rev-parse --git-dir ^/dev/null >/dev/null
```

# 背景

現在のディレクトリがGitリポジトリ配下かどうかを判定したかったので、

```bash:zsh
% git rev-parse --git-dir 2>&1 >/dev/null
```

がしたかったのだが、

```bash:fish
~> git rev-parse --git-dir 2>&1 >/dev/null
~> git rev-parse --git-dir ^> /dev/null
~> git rev-parse --git-dir >| cat > /dev/null
```

は全部駄目だった。

もっとエレガントな方法があれば教えてほしい。

参考 https://github.com/fish-shell/fish-shell/issues/110
Dockerを使って、ownCloudをセットアップしてみた。 Nginx編

#はじめに
前回、[Dockerを使って、ownCloudをセットアップしてみた。](http://qiita.com/takanemu/items/9a43b72f59309328f643)では、オフィシャルイメージのapacheが内蔵されているものを利用しました。
Apacheは、非常に安定して動作するが動作が遅いらしいので、今回は、Nginxを使ってみたいと思います。
利用するイメージは、owncloud:fpmです。

##コンテナ構成
OSは、前回に引き続きBargeOSを使用しますので、全てのサービスをコンテナで導入します。
導入するコンテナは、下記の３つです。
(1)Nginx
(2)ownCloud
(3)PostgresSQL

##準備
本記事では、docker v17.03.0-ceとdocker-compose v1.11.2を使います。
下記のコマンドで用意します。
OSは、dockerに特化されたBargeを使いました。
###dockerのバージョンアップ

```:bash
$ sudo /etc/init.d/docker restart v17.03.0-ce
```
###docker-composeのインストール

```:bash
$ wget -L https://github.com/docker/compose/releases/download/1.11.2/docker-compose-`uname -s`-`uname -m`
$ chmod +x docker-compose-`uname -s`-`uname -m`
$ sudo mv docker-compose-`uname -s`-`uname -m` /opt/bin/docker-compose
$ sudo chown root:root /opt/bin/docker-compose
```
##ownCloudのセットアップ
owncloudのimageは、owncloud:fpmを利用します。
owncloud:latestは、apacheがコンテナに内蔵されていましたが、fpmは、内蔵されていません。
fpmは、php-fpmというcgiインターフェース(?)だけが用意されているという意味みたいです。
nginxのimageは、raulr/nginx-owncloudを利用します。
このimageは、default.confに、owncloudへの接続設定が予め焼き込んであります。

```:docker-compose.yml
# postgres
postgres:
    image: postgres
    container_name: postgres
    volumes:
        - "/opt/pg_data:/var/lib/postgresql/data"
    environment:
        POSTGRES_PASSWORD: supersecretpassword
# owncloud
owncloud:
    image: owncloud:fpm
    container_name: owncloud
    links:
        - postgres
# nginx
nginx:
    image: raulr/nginx-owncloud
    container_name: nginx
    links:
        - owncloud
    volumes_from:
        - owncloud
    ports:
        - "80:80"
```
nginxとowncloudのコンテナ間は、9000ポートで接続されます。

```:bash
$ docker-compose up -d
```
実行してみるとapacheを使った構成よりもレスポンスが大幅に良いようです。
金融工学入門（ストックオプションとは何か）

#ストックオプションの概念
ストックオプションとは、金銭報酬の代わりに、企業から役員や従業員に付与される、当該企業の「株を買う権利」であり、新株予約権の一形態である。
あらかじめ決められた値段で株を買うことが出来る権利であるから、ストックオプションは一種のコールオプションである（オプションとは何かについては[こちらの記事](http://qiita.com/Oz-Spade/items/b240c791aea76973f75b)を参照）。

#報酬としてのストックオプション
企業が業績を上げ株価が高まると、ストックオプションの保有者は株価と権利行使価格の差額を利益として得られる。
ここに価値が発生するため、ストックオプションは金銭的報酬の代替手段として用いられるのである。

ベンチャー企業などではストックオプションを用いた報酬設計を取り入れる会社も多い。
従業員にストックオプションを付与し、株価上昇のインセンティブを与えることで、労働のモチベーションを上げることが可能になる。
ストックオプションはオプションであるから、報酬として無償で付与される限り、付与された者が損をすることはない（有償で付与、つまりストックオプションを購入するというスキームもある）。

#ストックオプションの会計処理（企業側の問題）
企業がストックオプションを報酬として付与した場合、報酬の対価として付与者から労働サービスを受領するわけであるから、企業会計上、給与と同様コストとして認識しなければならない。
その際、実際にいくらを費用認識しなければいけないのか、換言すれば、付与時点のストックオプションの価値はいくらなのかを、計算しなくてはならない。

#ストックオプションの価値
ストックオプションの価値を計算する方法は、金融工学と呼ばれる分野で1970年以降発展してきた。
その方法にはいくつかあるが、「[ストック・オプション等に関する会計基準](https://www.asb.or.jp/asb/asb_j/documents/docs/stockop/stockop_s2.pdf)」では、ブラック・ショールズ式や二項モデルが挙げられている。

ブラック・ショールズ式とは、権利行使日が決まっているタイプのオプションの価格を求める公式である。[こちらの記事](http://qiita.com/Oz-Spade/items/c41155d415ca321f2c73)では、Pythonによるブラック・ショールズ式の計算方法が解説されている。これを用いれば、自分でストックオプションの価値を計算することも可能である。

#ストックオプションを発行/付与されることになったら
ストックオプションの発行は、企業の利益に直接影響する要因であるため、公認会計士や税理士などの専門家の意見を取り入れるべきである。特に価値の評価に関しては、上述のブラック・ショールズ式を適用してはいけないケースも多々あり、この場合、より先進的な手法であるモンテカルロ・シミュレーションに基づく評価を実施しなければいけないため、金融工学に精通した専門家に相談することを検討してもらいたい（モンテカルロ・シミュレーションについては[こちらの記事](http://qiita.com/Oz-Spade/items/b8efb975756364ff574d)を参照）。
また、ストックオプションを付与される側も、条件によって所得税法上の取り扱いが変わるなど、テクニカルな問題がある。この点についても、顧問税理士や会計事務所などの判断を仰ぎたい。

#リファレンス
企業会計基準委員会, 2005, [ストック・オプション等に関する会計基準](https://www.asb.or.jp/asb/asb_j/documents/docs/stockop/stockop_s2.pdf)
J. ハル, 2016, [フィナンシャルエンジニアリング〔第9版〕 ―デリバティブ取引とリスク管理の総体系](http://amzn.to/2o4oqMQ), きんざい
vimで開いているファイルのgitでのtop階層をカレントにする方法

# TOP階層の取得方法
`git rev-parse --show-toplevel`

# コマンド
```:vim
nnoremap <leader>cg :<C-u>cd %:h\|cd `git rev-parse --show-toplevel`|"
```

`\cg<CR>`で移動することを想定しています。
コマンドの最後に`<CR>`を書いていないのは、毎回コマンドが見れるからです。
最後の`|"`は、後ろに変な文字があったら大変なので書いています。
一回`cd %:h`しているのは、ファイル指定でTOP階層を取得する方法がわからなかったからです。

# プラグイン
`tpope/vim-fugitive`を導入している場合は、**`:Gcd`**でカレントにできます。

詳しくは`:h gcd`
《Wordpress》Contact Form 7でエラー時にフォーム上部にスクロールさせる

入力フォームプラグイン「Contact Form 7」で、エラーが出たときにフォーム上部にスクロールさせるスクリプトです。


```js

(function($) {
  var position = $('form.wpcf7-form').offset().top;
  $('.wpcf7').on('wpcf7:invalid', function() {
    $('html, body').animate({
      scrollTop: position
    }, 700);
  });
})(jQuery);

```


`wpcf7:invalid`というイベントをトリガーにスクロールを実行します。




おわります。
Angular Translateのセキュリティ対策

未だにAngular 1系を使っております。基本的に英語でアプリ書いて必要に応じて[Angular Translate](https://github.com/angular-translate/angular-translate)で日本語対応させることにしていますが、デフォルトだとangular-translateはsanitizeもescapeもしてくれません。

大事なことだから二度いいます。

デフォルトだとangular-translateはsanitizeもescapeもしてくれません。

Documentを読むと `$translateProvider.useSanitizeValueStrategy('sanitize')`と指定することでsanitizeがOnになるようですが、これだとUTF8文字列は正しく表示されません。

正解はuseSanitizeValueStrategyを使うことで、具体的には `$translateProvider.useSanitizeValueStrategy('escape','sanitizeParameters')`のように設定すればUTF8文字列も正しく表示されます。ただし、translateにおいてHTMLタグを使うことはできなくなります。
Python > positional arguments / keyword arguments > mix可能 > print(2, 3, 5, 7, 11, sep='\t', end='')

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2503 / 12833)


以下の2つのargumentがある。

- positional arguments
- keyword arguments

https://docs.python.jp/3/glossary.html
> 位置引数 (positional argument、固定引数)
> [実引数](https://docs.python.jp/3/glossary.html#term-argument
) を参照してください。

...
> keyword argument
> [実引数](https://docs.python.jp/3/glossary.html#term-argument
) を参照してください。

...

> You can mix positional and keyword arguments.

### 2つのargumentの混合 > 失敗

http://ideone.com/bfvZTn

```py
def check_inputs(name1, value1, name2, value2):
	print('%s: %s' % (name1, value1))
	print('%s: %s' % (name2, value2))

# mixing of [keyword] and [positional] arguments
check_inputs(value1=3.1415, name1="pi", "napier", 2.718)
```

```txt:結果
Compilation error	time: 0 memory: 23288 signal:0
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python2.7/py_compile.py", line 117, in compile
    raise py_exc
py_compile.PyCompileError:   File "prog.py", line 6
    check_inputs(value1=3.1415, name1="pi", "napier", 2.718)
SyntaxError: non-keyword arg after keyword arg
```

keyword argumentの後にpositional argumentはダメとのこと。

### 2つのargumentの混合 > 成功

http://ideone.com/Kcwf5Q

```py
def check_inputs(name1, value1, name2, value2):
	print('%s: %s' % (name1, value1))
	print('%s: %s' % (name2, value2))

# mixing of [positional] and [keyword] arguments
check_inputs("pi", 3.1415, value2=2.718, name2="napier")
```

```txt:結果
Success	time: 0 memory: 23288 signal:0
pi: 3.1415
napier: 2.718
```

### 余談 > 備考

何故、keyword argument, positional argumentだとダメか。

考えたのは、positional argumentが後ろにある場合、どのインデックスのargumentかを判別するのが難しいのだと思う。

先にpositional argumentがある場合は、インデックスの0から逐次判別していき、途中にkeyword argumentになれば、そこからkeyword argumentの処理を可能。

### mixを使うかどうか

個人的には使おうと思わない (2017年3月29日現在)。
一貫性がくずれるからソースを読みにくくするように感じている。

うまい使い方があれば、使うかもしれない。

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

@shiracamus さんの[コメント](http://qiita.com/7of9/items/6fff5853cf3886a1a67a/#comment-2979bd5a2efcd5d616a8)にてpositional arguments / keyword argumentsのmixの用途を教えていただきました。

情報感謝です。
IFTTT経由でSkypeボットを使う


**IFTTTでSkypeが使えなくなってしまったので、以下の方法は現在は使用できません。**


[Microsoft Bot Framework](https://dev.botframework.com/)で、SkypeのBotを自作できるようになったけれど、Slack用ボット作るのと比べるとちょっと面倒くさい。
[Azure Bot Service](https://azure.microsoft.com/ja-jp/services/bot-service/)みたいなのなのもあるけど、プログラムはある程度する必要がある。


Webサービス間の連携が出来るサービスの「[IFTTT](https://ifttt.com/)」がSkypeに対応していたのでこれを使う。天気やTwitterの通知をSkypeに送ったり出来る。


## SkypeにIFTTTボットを登録

[Skype](https://www.skype.com/ja/)にサインインする。

[Skype ボットとは何ですか? どうすれば追加できますか?](https://support.skype.com/ja/faq/FA34646/skype-botsutotohahe-desuka-dousurebazhui-jia-dekimasuka)


上記のヘルプにWindows デスクトップの場合は　「[ボットを追加] アイコンを選択します」とあるが、ボットを追加アイコンはSkype上には見当たらなかった。

「ボットは現在、オーストラリア、カナダ、イギリス、アイルランド、インド、ニュージーランド、シンガポール、米国でご利用いただけます。」と書かれているので日本だと使えないように思えるが、実際は使える。


[どのようなSkypeボットを利用できますか？]
(https://support.skype.com/ja/faq/FA34655/donoyounaskypebotsutowoli-yong-dekimasuka)


上記のヘルプに「Skypeディレクトリではどのようなボットを利用できますか？」とあるので、これを選ぶと利用できるボットの一覧がでてくる。


![SkypeBotList.png](https://qiita-image-store.s3.amazonaws.com/0/34699/6d2f96e8-37c0-936b-be76-5c83be41b395.png)


この中から、「IFTTT」を選んで追加を押す。





![SkypeAddToContacts.png](https://qiita-image-store.s3.amazonaws.com/0/34699/23a7b4d2-b5c9-82b1-1820-c6d9a2ff7855.png)


上記の画面が出てくるので、「Add To Contacts」を押すと、Skypeが起動する。


![SkypeLaunch.png](https://qiita-image-store.s3.amazonaws.com/0/34699/acbbfe9f-36ec-ca81-ff44-4141983a84ad.png)
上記のように、起動したSkypeに「IFTTT」のボットが追加されていることがわかる。




## IFTTTの登録、Skypeとの連携

[IFTTT](https://ifttt.com/join)でアカウントを作成

IFTTTの使い方はこちらを参考
[作りながら覚える「IFTTT」レシピの使い方活用講座！（全5回）
](http://hoomey.net/ifttt_study_1/)

[IFTTTのSkypeページ](https://ifttt.com/skype)にアクセスする。


![IFTTT_Skype.png](https://qiita-image-store.s3.amazonaws.com/0/34699/d9c1cad0-68e1-fb40-25d0-44980be34ff1.png)


上記のページで、「Connect」を押して自分のSkypeとIFTTTと連携を行う。

## IFTTTのタスク登録


https://ifttt.com/skype のページでおすすめのタスクを選択することも出来るし、

https://ifttt.com/search のページで連携するサービスを探したり、
https://ifttt.com/create のページで一から条件を指定したりして作る。

IFTTTの使い方はこちらを参考
[作りながら覚える「IFTTT」レシピの使い方活用講座！（全5回）
](http://hoomey.net/ifttt_study_1/)


WEBサービスと連携ではなく、直接WEBリクエストで送信したい場合は、「[Maker Webhooks](https://ifttt.com/maker_webhooks)」を使うといいらしい。

使い方はこちらを参考
[Webサービス同士を連携できる「IFTTT」と自作IoTデバイスを繋いで生活を便利にしてみた](https://liginc.co.jp/263899)


Skype側のActionを指定する画面で、Conversationにチャンネル指定するところがあるが、
これは、Skype側で指定したグループに対してもポスト出来るようだが試していない。

![SkypeAction.png](https://qiita-image-store.s3.amazonaws.com/0/34699/9d9d0a16-6852-3dbc-b6e8-32c77a940221.png)
Atomの使えそうなプラグインを記載していく

（随時更新予定）

Pythonで色々コードを書いていこうかな、と思っているので、エディタを選定。
Vimを使えるようになりたいという憧れはありつつ、最近流行っているっぽいAtomを選択してみた。
もはやPythonに適しているかとかはどうでもよく、使ってみたいから、という理由。

##japanese-menu
 - メニューを日本語にするやつ

##language-python
 - 構文を理解して色を変えてくれる
 - python以外の言語もあります

##atom-runner
 - ショートカット（Ctrl + R or Alt + R）でコードを実行してくれる
 - （引数を指定したいときはできなそう）

##minimap
 - 右側に全体像をうつしてくれる
エクセル突合のやり方

#この記事を書いた理由#
面倒な作業になりがちなシステムから出力されるエクセル表の確認方法を記載していきます。

#基本的な流れ#
改修によってシステムから出力されるエクセル表のフォーマットが変わった場合、
基本的には以下の方針に沿っての確認を行っていきます。

大ざっぱですが、下に図で説明。

![エクセル突合概念図.PNG](https://qiita-image-store.s3.amazonaws.com/0/124488/9401c79b-29ab-251a-4f5a-421f3cd34976.png)

|確認部|確認内容|
|:-----------------------|:--------------------------------------|
|既存部分|そのままであることを確認する|
|修正部分|期待値を作成し、それと比較して、一致することを確認する|
|新規部分|期待値を作成し、それと比較して、一致することを確認する|

#確認の方法#
例としてはエクセルでエビデンスを作成する場合、以下のような構成になると思います。

<font color='red'>検証するためのデータは同じものを使っていないと計算式が合っていても違う値を出してしまい、期待値通りにならないことに注意</font>

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/124488/ae402c0e-3d2d-32ff-5a11-025f77ff01ca.png)

#値の検証

エクセルでは以下の方法で検証可能です
<b>文字</b>
=A1=B2 
とすることで値が一致していれば、TRUE、値が不一致ならばFALSEと表示される。

<b>数値</b>
=A1-B2 
とすることで値が一致していれば、0、値が不一致ならば差分が表示される。

数値の確認

#参考#

エクセルの突合を行うにあたっては下記のサイトのエクセル関数が役に立ちます。

[文字の検索、置換、比較、変換 関数一覧](http://www.excel-list.com/conversion.html)
技術英語 > as long as we [tack] report

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 3022, 3036 / 12833)

```py
import report
```

> as long as we tack report.

この前の文から見ると

> After this import statement, everything in report.py is available to the main program, as long as we **tack** report.

http://ejje.weblio.jp/content/tack
> 動詞 他動詞
1. 〔+目的語(+down)〕〈…を〉びょうで留める，取り付ける.
3. a〔+目的語+on〕〈…を〉付加する，添える.

意訳「このimport文の後、report.py内のすべてはmain programにおいて利用可能となる。report（という言葉)を付加する限りは。」
Hippo Notes インストールの際のQt周りのエラーについて．

#経緯
　ubuntuで使用できるEvernoteクライアントのNixNote2というソフトを使用していた．しかし文字化が酷いので，他のソフトとしてHippo Notesを選んだ．
 下準備は[ここ](http://mr-msk.hatenablog.jp/entry/2015/11/11/114039)を参考にした．

#環境
- ubuntu 16.04 lts
- Qt5.5.1(インストール済み)

#問題
[公式](https://www.linux-apps.com/content/show.php/Hippo+Notes?content=168617)通りにビルドを進めていき,`$ make`コマンドを実行すると以下のエラーがでた．

```
pdfcache.h:10:25: fatal error: poppler-qt4.h: そのようなファイルやディレクトリはありません
compilation terminated.
Makefile:894: ターゲット 'tmp/main.o' のレシピで失敗しました
make: *** [tmp/main.o] エラー 1
```

#解決
どうやらQtのバージョン4に関するエラーらしい．Qt5をインストールしてあるのに何故・・・？
エラーが出たファイル**pdfdcache.h**を見てみる．

```pdfdcache.h
if QT_VERSION >= 0x050000
include <poppler-qt5.h>
else
include <poppler-qt4.h>
endif
```

インストールしてあるのQtのバージョンでそれぞれのファイルを指定しているみたい．何故かQt5ではなくQt4として認識されている模様．

現在のQtのバージョンを確認する．
``
$ qmake -query QT_VERSION
$ 4.8.7
``

Qt4がデフォルトでインストールされていることが判明した．

こいつをQt5に変えてやる．
``/usr/lib/x86_64-linux-gnu/qtchooser/default.conf``
か
``/usr/lib/x86_64-linux-gnu/qt-default/qtchooser/default.conf``
でQtのバージョンを選択してやる．自分は後者で選択をした．

```default.conf変更前
/usr/lib/x86_64-linux-gnu/qt4/bin
/usr/lib/x86_64-linux-gnu
```
qt4と書いてある場所を5にしてやる．

```default.conf変更後
/usr/lib/x86_64-linux-gnu/qt5/bin
/usr/lib/x86_64-linux-gnu
```

もう一度バージョンを確認する．

```
qmake -query QT_VERSION
5.5.1
```

これで直ったので再びビルドする．

```
$ make clean
$ qmake
$ make
```

終わったと思ったら再びエラーがでた．

```
$ 3rdparty/qtsingleapplication/qtlocalpeer.cpp: In member function ‘bool QtLocalPeer::sendMessage(const QString&, int)’:
3rdparty/qtsingleapplication/qtlocalpeer.cpp:160:19: error: variable ‘QDataStream ds’ has initializer but incomplete type
     QDataStream ds(&socket);
                   ^
$ 3rdparty/qtsingleapplication/qtlocalpeer.cpp: In member function ‘void QtLocalPeer::receiveConnection()’:
3rdparty/qtsingleapplication/qtlocalpeer.cpp:180:26: error: variable ‘QDataStream ds’ has initializer but incomplete type
     QDataStream ds(socket);
```

配布ファイルにインクルードし忘れがあったみたい．公式がおちゃめさん．
> ./hippo/3rdparty/qtsingleapplication/qtlocalpeer.cpp
の先頭部分に`QDataStream`を新しく追加する．

```qtlocalpeer.cppの変更後
#include "qtlocalpeer.h"
#include <QCoreApplication>

#include <QDataStream>

#include <QTime>

```

もう一度，
```
$ make clean
$ qmake
$ make
```
ようやく完了．

#終わりに
Hippo Notesで普通にEvernoteを使うことが出来た．しかし，ビジネスノートを読み込むことができなかったので，結局wineで公式クライアントを使用している．ビジネスノートを使わない人にはいいかもしれない．
さくらサーバーのメモ


| |シリーズ：さくらサーバーで遊ぶ|
|:--|:--|
|設定等のメモ|http://qiita.com/cielavenir/items/67a7c631713b4c816b6d|
|SSL化|http://qiita.com/cielavenir/items/aad29b2348fc4d3f9155|
|(さくらサーバー導入の主目的)<br>メールをフックする|http://qiita.com/cielavenir/items/5ce4568fc405329d421a|
|Linuxbrewを導入する(旧)|http://qiita.com/cielavenir/items/741921fcecb281555f77|
|Homebrewを導入する|https://qiita.com/cielavenir/items/67ce0ec9cd8d43ed00f1|
|さくらサーバーでgccへの依存が発生しない理由<br>(HOMEBREW_BUILD_FROM_SOURCE=1は不要)|https://qiita.com/cielavenir/items/410ded536d9b520989c4|

## まえがき

ConoHaのVPSでも良かった気もするけど、さくらのレンタルサーバーに環境作ってしまったので、まあしゃーないか。150円ほど安いし。

## vim

- `$HOME/bin`を作っておく(下の手順で使う)
- `ln -s /usr/local/bin/vim ~/bin/vi`
  - viと入れてvimが呼び出されて欲しい
- `~/.vimrc`に`set nocompatible`を付けておく
  - (これで最低限Ubuntuにvimを入れたのと同じ挙動になるはず)
  - `syntax on`も付ける

## ログインシェル

- `EDITOR=vim chsh`として、Shell行を編集。/usr/local/bin/bashを指定することで、次回以降のログインシェルがbashになり、.profileの編集だけで完結させることができるようになる。

## PATH

- `~/.profile`を編集に用いる。.bash_profileとかは使わない。
  - `$HOME/.rbenv/bin:$HOME/.rbenv/shims:$HOME/bin:$HOME/local/bin`を先頭に足す
  - `export LD_LIBRARY_PATH=$HOME/bin/lib`
  - `export PYTHONPATH=/home/cielavenir/local/lib/python2.7/site-packages`
  - `export LC_ALL=ja_JP.UTF-8`
  - `EDITOR=vim`
  - `PAGER=less`
- `ln -s /usr/local/bin/gmake ~/bin/make`

## rbenv

https://github.com/rbenv/rbenv

```
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
RUBY_CONFIGURE_OPTS="--with-openssl-dir=/usr/local/ssl" TMPDIR=~/tmp rbenv install 2.5.1
rbenv global 2.5.1
```

[180524修正] OpenSSLディレクトリを指定したほうが良いです。なおこのディレクトリはSSL化のcertbotの導入で使用しているディレクトリと同じです。

なお、readlineがlibeditであるため、irbで日本語を入力すると不具合が出ます。`rb-readline` gemをインストールして、

```
ruby -rrb-readline -S irb
```

とします(この点はOSXでも共通です)。ただし後述のinfocmpが導入されていないとrb-readlineの読み込みに失敗します。

## infocmp

http://pkg.freebsd.org/FreeBSD:9:amd64/latest/All/ncurses-6.0_3.txz をうまく`~/bin`や`~/bin/lib`配下に展開する。
[WordPress]Facebookに自動投稿するときのカスタマイズ


WordPressでの案件がかなり増えていて学ぶことも日々多いですが、自分自身のサイトもWordPressで運営していて、各種SNSと連携しています。

WordPressに投稿すると自動で連携させたSNSへ投稿されるようにしていて、アイキャッチも設定しているのに(特に)Facebookだと表示されたりされなかったりしてました。

今回はその解決のための自分自身の健忘録です。

# アイキャッチは1:1.91の比率で作成する

Facebookの使用は変わることもありますが、縦・横を1:1.91の比率で作成すると上手く表示されます。

その際の最小サイズはwidth:600px、height:315pxですが、大きく表示させたいならば推奨サイズである**width:1200px、height:630px**がよいかと。

ちなみに私の場合、1280px：670pxで作成しています。
比率があっていればちゃんと表示されるので問題なし！

# Jetpackだと改行なし投稿になる問題

Jetpackはとても便利な機能が多く利用している人も多いのではないでしょうか。
Jetpackで各種SNSと連携させ、投稿を自動でSNSに連動させていると起こるのがFacebookの改行なし全文表示。

これの解決策を見つけ、実装はしましたがその後にブログを更新していないので確かめていませんが、以下のコードをfunction.phpに追記してください。
※念のため、バックアップしてから追記してください。

```php:functions.php
function set_title_publicize() {
    global $post;
    $publicize_custom_message = sprintf('新しい記事『%s』を投稿しました。ぜひ読んでみてください♪'.get_the_title( $post -> ID ) );
    update_post_meta( $post -> ID, '_wpas_mess', $publicize_custom_message );
}
add_action( 'the_post', 'set_title_publicize' );
add_action( 'save_post', 'set_title_publicize' );
add_action( 'draft_to_publish', 'set_title_publicize' );
add_action( 'new_to_publish', 'set_title_publicize' );
add_action( 'pending_to_publish', 'set_title_publicize' );
add_action( 'future_to_publish', 'set_title_publicize' );
```
## JetpackのOGPを無効化する

JetpackはWordPress公式の便利プラグインで必要な機能だけを使うこともできるので導入していますが、私はJetpackのOGPを無効化して、自力でOGPとTwitter Cardを設定しています。

```php:functions.php
// JetpackのOGP無効化
add_filter('jetpack_enable_open_graph', '__return_false');
```

このコードをfunctions.phpに追記するだけでOKです。
OGPの自力実装は長くなりそうなのでまた別記事で。

ご閲覧ありがとうございました。

----

【参照サイト様】

- [WordPressのJetpackのパブリサイズ共有でFacebookに全文が掲載されてしまう - プラスα空間](https://oichinote.com/plus/2016/05/jetpack-posts-full-text-on-facebook.html)
Slack の絵文字登録数ランキングを出すワンライナー

絵文字登録ページで

```js
Object.entries(Array.from(document.querySelectorAll("td[headers='custom_emoji_author']")).map(e => e.innerText.trim()).reduce((d, v) => { d[v] = (d[v] || 0) + 1; return d; }, {})).sort((a, b) => b[1] - a[1]).map(a => `${a[0]}: ${a[1]}`).join("\n")
```
CSS グリッドとグリッドのハイライト機能が Firefox Developer Edition で利用できるようになりました。

この記事は Hacks ブログに掲載された "[CSS Grid and Grid Highlighter Now in Firefox Developer Edition](https://hacks.mozilla.org/2016/12/css-grid-and-grid-highlighter-now-in-firefox-developer-edition/)" の抄訳です。

[CSS グリッド](https://developer.mozilla.org/docs/Learn/CSS/CSS_layout/Grids#Native_CSS_Grids_with_Grid_Layout)が Firefox Developer Edition で利用できるようになりました ([ダウンロードはこちら](https://www.mozilla.org/firefox/developer/))。この機能は [Chrome](https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/hBx1ffTS9CQ) でもすぐに使えるようになります (Safari や Edge でもそうなるでしょう)。そうなれば、ウェブサイトのグリッドレイアウトが簡単にできるようになります。

CSS だけでグリッドレイアウトができるようになるため、HTML からグリッドレイアウトに関する記述を削除できるようになります。メディアクエリや、そのほかのコンテキストと組み合わせることもできるので、Twitter [Bootstrap](http://getbootstrap.com/2.3.2/) や [Skelton](http://getskeleton.com/) のようなコンテンツグリッドを表すためにクラス構造を利用するようなフレームワークを置き換えられます。

変更に弱くなるリスクや、コードが肥大化するリスク、ウェブ上でものを作るときにつきまとう高いメンテナンスコスト、これらを小さくするグリッドは、レイアウトの方式を大きく変える可能性を持っています。これを Jen Simmons は「[ウェブで使える本当のアートディレクション](https://www.youtube.com/watch?v=5Z7lSSMwRgo)」と呼び、Rachel Andrew は、CSS グリッドを広めるための [Grid by Example](http://gridbyexample.com/what/) を作成しました。CSS グリッドを知るなら、ここから始めると良いでしょう。

[![CSS グリッドの紹介](http://img.youtube.com/vi/hG8avHeD9fs/0.jpg)](https://www.youtube.com/watch?v=hG8avHeD9fs)

この動画でも使われていますが、グリッドハイライトツールを使うと、表示しているページのグリッドがわかりやすく表示されます。今後もこのような CSS グリッドを使った開発を助けるツールを充実していく予定です。

このツールを使うには、まず最新の [Firefox Developer Edition](https://www.mozilla.org/firefox/developer/) がインストールされている必要があります。CSS グリッドを利用しているページを開き（この[デモページ](http://labs.jensimmons.com/)で試すと良いでしょう）、メニューの開発ツールからインスペクターを選んで、インスペクターを起動します。CSS で display: grid; と設定されている要素を選択し、"grid" の横に表示されているアイコンをクリックするとグリッド線が表示されます。

前述した通り、Firefox の開発ツールチームは、グリッドをより簡単に使えるようにするための改善を計画しています。進捗は以下のバグで確認できます：

* グリッドが使われているページでは、自動的にハイライトするボタンの追加 ([bug 1297100](https://bugzilla.mozilla.org/show_bug.cgi?id=1297100))
* 新しい[レスポンシブデザインモード](https://blog.nightly.mozilla.org/2016/11/07/simulate-slow-connections-with-the-network-throttling-tool/)を拡張し、グリッドをハイライトできるようにするとともに、簡単にグリッドを表示するためのオプションを追加する
* [グリッドの変更を簡単に行えるパネル](https://projects.invisionapp.com/share/3X87NEBYH#/screens/179720294_Grid)の追加

全体に関しては、[bug 1181227](https://bugzilla.mozilla.org/show_bug.cgi?id=1181227) のメタバグをご覧ください。

## [Helen V. Holmes](http://helenvholmes.com/) について

Firefox 開発ツールチームのデザイナー。タイポグラフィと Arduino に関するものに情熱を燃やしている。
全ての人に対する健全な技術コミュニテイを作ることを強くサポートしており、
Women Who Code のワシントン DC 支部の開設に貢献。
また全米での学生ハッカソンのメンターを務める。

* ウェブサイト：[helenvholmes.com](http://helenvholmes.com/)
* Twitter: [@helenvholmes](http://twitter.com/helenvholmes)

[Helen V. Holmes によるその他の記事はこちら](https://hacks.mozilla.org/author/hholmesmozilla-com/)