OmniAICreator/Qiita-1.07M huggingface dataset:
【ShellScript】キーストアに電子証明書をインポートする

##経緯

JavaのWebアプリケーションにて、電子署名されたXMLの出力機能を実装中です。
[電子証明書あれこれ](https://qiita.com/irohamaru/items/cfbb5aa4ff0dae56e360)

実際の運用を考えたときに、元となる電子証明書がキーストアにインポートされている必要があったり、失効した電子証明書の差し替え作業が発生するため、それをいちいちコマンドを叩いてやっていくのは面倒です。
なので、シェルスクリプトを用意することにしました。

以下、参考にしながら作りました

[シェルスクリプトの基礎知識まとめ](https://qiita.com/katsukii/items/383b241209fe96eae6e7)

##このスクリプトがやっていること

・キーストアを作成
・キーストアのファイル権限を変更（その他ユーザーに書き込み権限を付与）
・デフォルトでインポートされている証明書（mykey）を削除
・キーストアに証明書をインポート

##ソース（随時修正予定）

```sh:certset.sh
#!/usr/bin/bash

#変数定義
cn="test1"
ou="test2"
o="test3"
c="JP"
keystore="testkeystore"
certpass="/Users/XXXXXX/XXXXXX"
certnm="testcrt.p12"
keypass="password"
storepass="changeit"
srcalias="1"
destalias="999999"

#各コマンド
cmdcd="cd ${certpass}"

cmdgenkey="keytool -genkey -dname \"cn=${cn}, ou=${ou}, o=${o}, c=${c}\" -keystore ${keystore} -keypass ${keypass} -storepass ${storepass}"

cmdchmodstore="chmod o+w ${keystore}"

cmddelmykey="keytool -delete -alias mykey -keystore ${keystore} -storepass ${storepass}"

cmdimportkey="keytool -importkeystore -keystore ${keystore} -srckeystore ${certpass}/${certnm} -srcstoretype PKCS12 -srcalias ${srcalias} -destalias ${destalias} -srcstorepass ${keypass} -deststorepass ${storepass}"

cmdlistv="keytool -list -v -alias ${destalias} -keystore ${keystore} -storepass ${storepass}"

#コマンド実行

echo "証明書配置:1 設定変更:2 番号を入力してください。"
read select

if [ $select = "1" ]; then

  echo "キーストアを作成しますか？ [Y/n] "
  read key

  if [ $key = "y" ]; then

    eval $cmdcd

    eval $cmdgenkey

    eval $cmdchmodstore

    eval $cmddelmykey

  fi

  eval $cmdimportkey

  #eval $cmdlistv

else
  echo 以下設定値を変更します。番号を入力してください。
  echo 1: 証明書のファイル名 現在の設定値:$certnm
  echo 2: 証明書のパスワード 現在の設定値:$certpass
  echo 3: 証明書の元のエイスアス 現在の設定値:$srcalias
  echo 4: 証明書の新規エイリアス 現在の設定値:$destalias
  echo 5: キーストアのファイル名 現在の設定値:$keystore
  echo 6: キーストアのパスワード 現在の設定値:$storepass
  #echo 7: 証明書の配置場所 現在の設定値:$certpath
  echo
  echo 入力値:

  read setnum

  case "$setnum" in
  "1" )
    echo 「証明書のファイル名」の値を変更します。値を入力してください。
    paramkey=certnm
    trg=${certnm:0:${#certnm}};;
  "2" )
    echo 「証明書のパスワード」の値を変更します。値を入力してください。
    paramkey=certpass
    trg=${certpass:0:${#certpass}};;
  "3" )
    echo 「証明書のパスワード」の値を変更します。値を入力してください。
    paramkey=srcalias
    trg=${srcalias:0:${#srcalias}};;
  "4" )
    echo 「証明書の新規エイリアス」の値を変更します。値を入力してください。
    paramkey=destalias
    trg=${destalias:0:${#destalias}};;
  "5" )
    echo 「キーストアのファイル名」の値を変更します。値を入力してください。
    paramkey=keystore
    trg=${keystore:0:${#keystore}};;
  "6" )
    echo 「キーストアのパスワード」の値を変更します。値を入力してください。
    paramkey=storepass
    trg=${storepass:0:${#storepass}};;
  #"7" )
  #  echo 「証明書の配置場所」の値を変更します。値を入力してください。
  #  paramkey=certpath
  #  trg=${certpath:0:${#certpath}};;
  esac

  echo 入力値:
  read paramval

  before="$paramkey=\"$trg\""
  after="$paramkey=\"$paramval\""

  sed -i -e "s/$before/$after" certset.sh

fi
```
HighSierraにしたら、はい死んだ

HighSierraにバージョンをあげて１ヶ月で、OSがインストールされていませんと言われました。
そこからの復旧作業など、人柱の役目としてまとめます。


時は、2017年10月24日 明朝 7:11頃
macoOS could not be installed on your computer


![IMG_9111.JPG](https://qiita-image-store.s3.amazonaws.com/0/62822/6bf449b9-1904-7350-2440-fbc744948024.jpeg)


## HighSierraとは
macOS High Sierra（マックオーエス ハイ シエラ）は、アップルが開発したMacintosh向けのオペレーティングシステム(OS)。macOSシリーズの14番目のバージョンである。バージョンナンバーは10.13。macOS Sierraの後継バージョンとして、2017年6月5日（ ...


## 死ぬまでの兆候
- HighSierraが公開された直後からinstall
- docker for mac をbrewでinstall
- 毎日いつのまにかdockerが落ちている、再インストールを求められ毎回再インストールしつつ・・・放置
- 気がついたらdockerが落ちるかつ、いつのまにかosが落ちている事が多々あったが・・・放置


## 死んだ日　2017年10月24日
- 7:06頃　macを起動する。。。いつもより時間がかかるなぁぁぁぁぁあああアアアアアアッ
- 7:08頃　普通に再起動しても同じ
- 7:08頃　普通に再起動しても同じ
- 7:09頃　普通に再起動しても同じ
- 7:09頃　普通に再起動しても同じ
- 7:10頃　普通に再起動しても同じ
- 7:10頃　普通に再起動しても同じ
- 7:11頃　エラー文より死亡確認
- 7:15頃　SMCリセットを試みるも失敗...
- 7:16頃　NVRAMのリセット失敗...

そもそも、ドゥーンっていわない


## １日放置してみる　2017年10月25日 
- 22:41頃　相変わらず同じ
- 22:52頃　cmd + R で起動し「ディスクユーティリティ」を起動し、"first aid"をする
- 22:54頃　普通に再起動しても同じ
- 23:11頃 諦めて寝る

## 2日目(長引きそうな予感)　2017年10月26日 
- osの上書きができるらしい（データは死なずに上書きインストールで助かるかも）
- cmd + R で起動し　「osを再インストール」　をする
- **これがなんとうまくいく！！！！！！！！**

## 2017年10月26日  9:51頃　生存確認！！
- データも全て復元された
- すぐさまタイムマシンでバックアップをとる

## 10/28日現在
- 同じ現象はおきていないが、起きる可能性はあるので今後も様子をみます。

## まとめ
- 助かった！！
- あの絶望的な画面で、諦めていましたが、よく生き返ってくれました！！！
Angular Materialのカスタムテーマを設定する

## 環境


```:angular-cli
$ ng -v
@angular/cli: 1.4.9
node: 8.1.3
os: darwin x64
```

```:package.json
...
    "@angular/material": "^2.0.0-beta.12",
```

## 元プロジェクトの説明

Angular Material導入済みのプロジェクトを参考に進めます。

app.module.tsでは次のAngular Materialコンポーネントをモジュールをインポート済みなことが前提です。

```ts:app.module.ts
import { MatToolbarModule, MatButtonModule } from '@angular/material';
```

また、`style.scss` にはプレビルドテーマであるindigo-pinkを設定してあります。

```css:style.scss
@import "~@angular/material/prebuilt-themes/indigo-pink.css";
```

見た目はこんな感じです↓

![スクリーンショット 2017-10-27 18.58.51.png](https://qiita-image-store.s3.amazonaws.com/0/79414/4bb579a7-033a-2e6b-363c-216e99dc44aa.png)


## テーマを作成・適用する

### テーマ用のscssファイルを作成する
今回は、 `src/theme/` 以下に `my-theme.scss` ファイルを作成します。
また、次のようにAngular Materialのベーススタイルをインポート&適用します。
※ プロジェクト全体で使用するcssの拡張子に関わらず、テーマファイルの拡張子は`.scss`とします



```scss:src/theme/orange-theme.scss
@import '~@angular/material/theming';
@include mat-core();
```

`mat-palette` を使って、primary、accent、warnそれぞれの色を定義します。
`mat-palette` に渡す色名の変数は、以下に定義されています。
[material2/src/lib/core/theming/_palette.scss](https://github.com/angular/material2/blob/c1f6ea19cb317d30af79dc431d39ed8b962e146d/src/lib/core/theming/_palette.scss)

```scss:src/theme/orange-theme.scss
// ...
$orange-theme-primary: mat-palette($mat-blue-grey);
$orange-theme-accent:  mat-palette($mat-pink, 500, 900, A100);
$orange-theme-warn:    mat-palette($mat-deep-orange);

$orange-theme: mat-light-theme($orange-theme-primary, $orange-theme-accent, $orange-theme-warn);

@include angular-material-theme($orange-theme);
```

`mat-light-theme` または、 `mat-dark-theme` を使って、最終的なテーマを定義した後、`angular-material-theme` mixinにその変数を渡します。


```scss:src/theme/orange-theme.scss
// ...
$orange-theme: mat-light-theme($orange-theme-primary, $orange-theme-accent, $orange-theme-warn);

@include angular-material-theme($orange-theme);
```

### angular-cliの設定
angular-cliが今回作成したscssをコンパイルするように設定します。`styles` セクションにファイル名を指定します。

```json:angular-cli.json
"styles": [
  "styles.css",
  "theme/my-theme.scss"
],
```

## 適用後の確認

次のように、設定したテーマが適用されているかと思います。

![スクリーンショット 2017-10-27 18.56.32.png](https://qiita-image-store.s3.amazonaws.com/0/79414/258800a7-e96d-129d-8515-33e498a29515.png)

## 参考

https://material.angular.io/guide/theming
https://alligator.io/angular/angular-material-custom-theme/
https://material.io/guidelines/style/color.html
Windows アイコンオーバーレイのひみつ

# 概要
TortoiseGitのアイコンオーバーレイが表示されていなかった問題が解決した。
この過程で笑える秘密を発見。
(環境はWindows10)

# 解決方法
regedit.exe(レジストリ エディター) の

コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers

のTortoise関連キーの名前の先頭のスペースを増やし、順番が先頭に来るようにする。
(regedit.exe はTortoseGitの設定から開くのが便利。)

# 原因
ググったページを見た範囲だと、Windowsのアイコンオーバーレイが有効になる個数は15個らしく、レジストリ上、優先順位が低いものは表示されなくなる。
先頭にスペースを入れて優先度を上げることで、表示されるようになる。

# ひみつ
ShellIconOverlayIdentifiersのキーの並びがなんか変な感じだな～と思ってよく見てみると、先頭にスペースが入っているからであった。
おもしろいのは、複数のスペースが入っていること。
例えばOneDriveは1個、GoogleDriveは2個、Dropboxは3個入っていて、スペース入れ合戦になってる(笑)
今回はTortoise関連をスペース4個(!)にすることで解決したのであった。

![windows_icon_overlay.png](https://qiita-image-store.s3.amazonaws.com/0/201153/84371fed-526e-cf46-e1ef-fdc2a382966c.png)


# 参考
[[Windows] TortoiseGitのアイコンオーバーレイが表示されないときの対処法３つ](http://shinten-dream.com/computer/49/)
link > Python で 1 変量データ補間 > SciPy > interpolate.*

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
```

一次関数の補間が気になりだした。

Python関連で一次補間を比較しているコード例を以下に見つけた。
[Python で 1 変量データ補間](https://org-technology.com/posts/univariate-interpolation.html) by かくあきさん

情報感謝です。

### code

Matplotlibコード

描画の中で自分が使いたい補間処理だけを表示するようにコードを変更してみた(表示部分のコメントアウト)。
また、図の表示がこちらの環境では小さいようなので、dpi変更をした。


```py:Interpolate_171028.ipynb
import numpy as np
from scipy import signal, interpolate
from matplotlib import pylab as plt


# forked from 
# https://org-technology.com/posts/univariate-interpolation.html
# 謝辞: かくあきさん
#

# サンプルデータ作成
t = np.linspace(0, 10, 11)
tt = np.linspace(0, 10, 51)
y = np.sin(t)

# 線形補間
f1 = interpolate.interp1d(t, y)
y1 = f1(tt)

# 2 次スプライン補間
f2 = interpolate.interp1d(t, y, kind="quadratic")
y2 = f2(tt)

# 3 次スプライン補間
f3 = interpolate.interp1d(t, y, kind="cubic")
y3 = f3(tt)

# 1 次スプライン補間(線形補間と結果は同じ)
f4 = interpolate.interp1d(t, y, kind="slinear")
y4 = f4(tt)

# 0 次スプライン補間
f5 = interpolate.interp1d(t, y, kind="zero")
y5 = f5(tt)

# 最近傍点による補間
f6 = interpolate.interp1d(t, y, kind="nearest")
y6 = f6(tt)

# 秋間法による補間
f7 = interpolate.Akima1DInterpolator(t, y)
y7 = f7(tt)

# 区分的 3 次エルミート補間
# y8 = interpolate.pchip_interpolate(t, y, tt)でも結果は同じ
f8 = interpolate.PchipInterpolator(t, y)
y8 = f8(tt)

# 重心補間
# y9 = interpolate.barycentric_interpolate(t, y, tt)でも結果は同じ
f9 = interpolate.BarycentricInterpolator(t, y)
y9 = f9(tt)

# Krogh により提案された補間法
# y10 = interpolate.Krogh_interpolate(t, y, tt)でも結果は同じ
f10 = interpolate.KroghInterpolator(t, y)
y10 = f10(tt)

plt.figure(figsize=(12, 9),dpi=200)
plt.plot(t, y, "o")
#plt.plot(tt, y1, "r", label="linear")
plt.plot(tt, y2, "b", label="quadratic")
plt.plot(tt, y3, "g", label="cubic")
#plt.plot(tt, y4, "y", label="slinear")
#plt.plot(tt, y5, "m", label="zero")
#plt.plot(tt, y6, "c", label="nearest")
plt.plot(tt, y7, "--r", label="Akima")
plt.plot(tt, y8, "--b", label="Pchip")
plt.plot(tt, y9, "--g", label="Barycentric")
plt.plot(tt, y10, "--y", label="Krogh")
plt.legend()
plt.show()
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/98a977c9-341d-5b2c-6bca-01f59bccba2e.png)


### 検索用キーワード

- 一次補間
- cubic interpolation
Serverlessのデプロイ時に"The specified bucket does not exist"って言われた時の対処

## こういう人向けの内容

* 綺麗好き
* Serverless Frameworkを使ってデプロイしている
* DynamoDBの設定をserverless.ymlに書いている
* デプロイ時に `The specified bucket does not exist` というエラーが出た

## 結論

S3のバケットを手動で削除したりすると出る。もう一度同じ名前でバケットを作り直せばOK。

## 手順

1. AWSのコンソールでCloudFormationを開く
1. Serverlessが生成したスタックを選択
1. `リソース` タブの `ServerlessDeploymentBucket` という項目に書かれたバケット名をメモ
1. S3でその名前でバケットを新規作成

## 経緯

* serverless公式GitHubのIsuuesには「CloudFormationで該当スタックを削除すればいいよ」って書いてある
* でも削除するとDynamoDBまわりがいろいろ面倒なことになるから消したくない
* S3のバケットだけ再生成すればいけるんジャマイカ
* いけた
node-ffiでWindows APIでUnicode版のAPIを使って文字列を取得する

# GetWindowTextW を使ってみた

以下のコードで、日本語のウィンドウ名もコマンドプロンプトに
文字化けせずに表示できた。

```js
const ref = require('ref');
const ffi = require('ffi');
const wchar_t = require('ref-wchar');
const wchar_string = wchar_t.string;

const voidPtr = ref.refType(ref.types.void);

const user32 = ffi.Library('user32.dll', {
    EnumWindows: ['bool', [voidPtr, 'int32']],
    GetWindowTextW : ['long', ['long', wchar_string, 'long']]
});

const windowProc = ffi.Callback('bool', ['long', 'int32'], function(hwnd, lParam) {
  const buf = new Buffer(255);
  
  const ret = user32.GetWindowTextW(hwnd, buf, 255);
  const s = ref.reinterpretUntilZeros(buf, wchar_t.size);

  console.log(wchar_t.toString(s));
  return true;
});

user32.EnumWindows(windowProc, 0);
```

## wchar_t*型を使うには

wchar_t*型に関係するコードを抜粋すると以下のとおり。

```js
const wchar_t = require('ref-wchar');

// node側はwchar_t*型の指定をwchar_stringで行う
const wchar_string = wchar_t.string;

// wchar_t*型を扱うAPIの利用準備
const user32 = ffi.Library('user32.dll', {
    GetWindowTextW : ['long', ['long', wchar_string, 'long']]
});

// wchar_t*型に対応する変数（というか領域）を用意
const buf = new Buffer(255);

// wchar_t*型を扱うAPIの呼び出し
const ret = user32.GetWindowTextW(hwnd, buf, 255);

// wchar_t*型の変数から文字列を取り出す
const s = ref.reinterpretUntilZeros(buf, wchar_t.size);
console.log(wchar_t.toString(s))
```

# 参考資料

- http://d.hatena.ne.jp/eggtoothcroc/20150622/p1
CMSの記事などの幅が制限されたエリアで、一部の要素のみ幅100%で表示する

これはa-blog cmsのTIPSとして書いていた記事を、より問題が起きやすいWordPress向けに改筆したものです。

----

![55b688ecd5434f653af2fc1c0d177b17.jpg](https://qiita-image-store.s3.amazonaws.com/0/21117/7ca764cb-d70f-af84-4704-d1bb532eb607.jpeg)

最近は、高解像度のディスプレイを大胆に使ったデザインが人気です。

上の画像のような「本文内で、一部の要素だけが幅100%になっているデザイン」が来ることがあります。
CMSベースのサイトの場合、「編集可能な領域」をシステム側で制限する必要があり、だいたいその領域内はコンテナタグで幅を制限することになるので、このようなデザインへの対応が難しくなっています。

このようなデザインを実装する方法を2種類ご紹介します。たぶん、WordPressの既存テーマのカスタマイズでハマる人が多そうですが、どのCMSでも起こりうることです。

## A案：要素の開始前にコンテナタグを閉じる

よく利用されるのが「記事の本文中で、コンテナタグを閉じてしまい、幅100%エリアの終了後に、再びコンテナタグの開始タグを書く」という方法です。

bootstrapベースのサイトだとこうなるでしょうか。

```html
        </div><!-- /.post-contents -->
    </div><!-- /.post -->
</div><!-- /.container -->

<h2>h2要素を幅100%にしたい！</h2>

<div class="container">
    <div class="post">
        <div class="post-contents">
```

### A案の問題点

#### コンテンツ側でマークアップを限定している

リニューアルなどでbootstrapベースではなくなった場合、該当箇所を全て修正する必要があります。エントリー中にHTMLをゴリゴリ書いていた場合は、目も当てられないことになります。

#### タグが分断されてしまう

一部のCMSに実装されているダイレクト編集機能を有効にするとページが崩れたり、JavaScriptのエラーが起きやすくなることがあります。

### A案改：ショートコードを利用する

WordPressであれば、幅100%の部分だけショートコードにする手があります。
後々のリニューアルでコーディングが変わっても、ショートコードを定義している関数を変えるだけで追随します。


## B案：CSSを使う

実は、CSSだけでこの問題を解決できます。以下の記事を参考に解説します。

親要素の幅を越えてボックスの幅をブラウザいっぱいに広げるテクニック | CSS-EBLOG
http://css-eblog.com/csstechnique/overflow-menu.html

### ページ全体をdivで包括する

**ページ全体**を任意のdiv要素で包括し、overflow:hiddenを定義します。これをしておかないと横スクロールバーが出てしまいます。

```css:container-full_01.css
.outer-wrap {
    overflow:hidden;
}
```

- body要素やhtml要素に指定するとスクロールができなくなります。
- もしも、コンテナタグや記事本文にoverflow:hiddenを定義していた場合は、解除しておいてください。

### 任意クラスを指定する

100%にしたい要素に、任意のクラスを付与しておきます。ここでは「container-full」クラスとします。

### 巨大なネガティブマージンと余白を指定する

CSSの定義を以下の通り追加します。
ここでは9999としていますが、一般的なディスプレイを考えると2000もあればよいでしょう。

```css:container-full_02.css
.container-full {
    margin-left: -9999px;
    margin-right: -9999px;
    padding-left: 9999px;
    padding-right: 9999px;
}
```

画面幅を大幅に超えるネガティブマージンと同値のパディングを指定すると、その要素は背景だけ100%になります。
既存テーマをカスタマイズしていて、既存の定義の方が優先されてしまう場合は、idなどを追加して優先度をあげた方が良いでしょう。

### B案の問題点

#### overflow:hiddenを使えない

JavaScriptのライブラリの都合などで、コンテナタグよりも内側にoverflow:hiddenを指定しなければならない場合は利用できません。

#### background-size:coverが使えない

幅100%の要素は、実質20000ピクセルもの幅を持っている状態となります。このため、背景画像を敷こうとbackground-size:coverを使用すると、画像が伸びきってトホホなことになります。幅1960ピクセルくらいの帯状の画像を用意しておき、background-size:containで配置するしかないでしょう。

#### 左右マージンが均等になっていなければならない

二段組レイアウト内では使用できません。

### B案改：calcを使う

IE9以下、Android4.3以下を無視してよいなら、calcを使って適切な値を算出する手があります。一瞬崩れますが、同様の計算をjQueryで行っても良いかもしれません。

コンテナーの幅より広がったエリアをcalcでつくる - Qiita
http://qiita.com/hiloki@github/items/bf2590d622cbff1967db

## そもそも論

CSSだけで対処できる…と言っても、いろいろと厄介ではあります。
なので、カンプを早めにチェックして、以下のようなすり合わせをするに越したことはありません。

- このようなデザイン指示がないか
- あった場合、このデザインは必須なのか
- 必須だった場合、カスタムフィールド等での対応は可能か
【Python】Flask-SQLAlchemyでmysqlを扱う

## はじめに
`Flask-SQLAlchemy`を使って`mysql`を操作するやり方を記述します
事前準備として、[公式のtutorial](http://study-flask.readthedocs.io/ja/latest/02.html)で作成してください
10分〜20分くらいで作れると思います

## 実装
### 1.データベースを作成
まずmysqlでデータベースを作る必要があります
そのため、以下のコマンドを実行してデータベースを作成してください

```
$ brew install mysql
$ mysql -u root
mysql> create database hogehoge;
mysql> exit
```

### 2.PyMySQLをインストールする

```
$ pip install PyMySQL
```

### 3.データベースのurlを変更
flaskr/config.pyを以下のように変更します

```config.py
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:@localhost/hogehoge?charset=utf8'
SECRET_KEY = 'secret key'
```

### 4.データベースファイルを作成
作成したデータベース定義を読み込み、データベースファイルを作成します

```
$ python
>>> from flaskr.models import init
>>> init()
```

### 5. 完成
以上で完成です

```
$ python manage.py
```
http://127.0.0.1:5000 をブラウザで開いて動作を確認してください

## おわりに
`Flask-SQLAlchemy`で`postgres`や`Oracle`と接続がしたければ、[このページ](http://flask-sqlalchemy.pocoo.org/2.3/config/)を参照すれば出来ると思います
virtualenv で仮想環境を立てる時のチートシート

# はじめに
[virtualenv](https://virtualenv.pypa.io/en/latest/)はクリーン環境をすぐに作れるのでちょっとPythonのライブラリ試して見たい時にで実行できてとっても便利です。でもでも、virtualenvはインストールしたけど使うのは久しぶりすぎて、いざ試す時にコマンド忘れてググる事が多々。。加えて、セットアップ系の記事はpyenvやanacondaなどと複合しているものが多いので自分用のメモ。

# 環境
ハード：MacBook Air
OS：macOS Sierra(10.12.6)
Python:3.6.1
virtualenv:15.1.0

# チートシート
## 新規の仮想環境を立てる
カレントディレクトリに<仮想環境名>のディレクトリが生成されます。

```console:コマンド
<ディレクトリ>$ virtualenv <仮想環境名>
```

```console:実行結果
Using base prefix '/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6'
New python executable in <ディレクトリ>/<仮想環境名>/bin/python3.6
Also creating executable in <ディレクトリ>/<仮想環境名>/bin/python
Installing setuptools, pip, wheel...done.
```

## 仮想環境を起動

```console:コマンド
<ディレクトリ>$ cd <仮想環境ディレクトリ>
<仮想環境ディレクトリ>$ source bin/activate
```

```console:実行結果
(<仮想環境名>) <仮想環境ディレクトリ> <ユーザー名>$ 
```

## 仮想環境を停止
```console:コマンド
$ deactivate
```

# おまけ
## virtualenvインストール
ココまで書いてインストールがないのも違和感があるので念のため。

```console:コマンド
pip3 install virtualenv
```

## 構築と起動を一発実行するシェルスクリプト
そもそも忘れてしまうのならば、大した量では無いですがシェルスクリプトにしました。
シェルスクリプト実行後も階層移動を保持したいため`soruce`で実行しています。

```bash:activevirtualenv.sh
#!/bin/sh
virtualenv $1
cd $1/
source bin/activate
```

```console:コマンド
$ source activevirtualenv.sh <仮想環境名>
```
# おわりに
自分でチートシートって書くと覚えるし、理解も深まるので意外と良いかも。
virtualenv以外にも、jupyterなど開始、終了のstepがあるものは忘れっぽいので、今後もこまめにまとめていきたいと思います。
関連エントリーの候補リストに「ブログ名」を表示する

![73933185358b2b41d3d2b756d058c66d.jpg](https://qiita-image-store.s3.amazonaws.com/0/21117/f06b2ced-957d-5b7d-8984-b2adac5fd7ed.jpeg)

a-blog cmsの「関連エントリー」機能は、キーワードを入力すると全ブログのエントリーから候補を表示してくれますが、ブログ名が表示されないため、複数のブログで似たようなタイトルがあると、どれが対象のエントリーなのかわかりづらいことがあります。

このリストに「ブログ名」を表示する方法を解説します。

## オートコンプリート用のテンプレートを作成する

「system」テーマの以下の場所にあるテンプレートを、階層を変えずに、現在利用しているテーマ内に複製してください。

/ajax/edit/autocomplete.json

複製したテンプートをエディタで開くと、以下のようなJSON形式のデータを出力するコードが書かれています。

```html:acms_autocomplete.json
<!-- BEGIN_MODULE Admin_Entry_Autocomplete -->[<!-- BEGIN entry:loop -->
\{
	"label": "<!-- BEGIN categoryField -->（{fieldCategoryName}）<!-- END categoryField -->{title}",
	"value": "<!-- BEGIN categoryField -->（{fieldCategoryName}）<!-- END categoryField -->{title}",
	"title": "{title}",
	"id": {eid},
	"url": "{url}",
	"datetime": "{date#Y}/{date#m}/{date#d} {date#H}:{date#i}",
	"categoryName": "<!-- BEGIN categoryField -->{fieldCategoryName}<!-- END categoryField -->"
\}<!-- BEGIN glue -->, <!-- END glue --><!-- END entry:loop -->
]<!-- END_MODULE Admin_Entry_Autocomplete -->
```

4・5行目の「label」と「value」を以下の通りに書き換え、ブログの情報を呼び出せるように修正してください。

```html:acms_autocomplete_diff.json
	"label": "（<!-- BEGIN blog -->{blogName}<!-- END blog --><!-- BEGIN categoryField -->｜{fieldCategoryName}<!-- END categoryField -->）{title}",
	"value": "（<!-- BEGIN blog -->{blogName}<!-- END blog --><!-- BEGIN categoryField -->｜{fieldCategoryName}<!-- END categoryField -->）{title}",
```

画像のように「ブログ名」が表示されるようになれば成功です。

![abe6dd8280b4fed7693111ccbca668cb.jpg](https://qiita-image-store.s3.amazonaws.com/0/21117/9855b1d4-8e13-2d03-85a2-f7679816d178.jpeg)


## 補足

a-blog cmsのEntryモジュール関係のタグ（波カッコで囲まれた変数）は、この記事のオートコンプリートのような、その他のモジュールでも使用できることがあります。

a-blog cmsの設置環境によっては、利用中のテーマ内に「autocomplete.json」を設置しても、systemテーマの体裁が優先されてしまうことがあります（MAMPのlocalhostで確認）。

sysytemテーマの「autocomplete.json」を直接差し替えれば解決できますが、この場合は、今後のバージョンアップの際に、systemテーマを書き換えたことを忘れないよう控えておいてください。
エックスサーバー（Xserver）でMovable Typeに画像をアップロードできない場合の対処

エックスサーバーにMovable Typeをインストールすると、画像のアップロードに失敗します。

他のサーバーから、既にアップロード画像が含まれているMTを移行した場合、管理画面の「アイテム > 一覧」に入った途端に500エラーとなります。

~~これは、MTで画像処理の標準となっているモジュールが、エックスサーバーではインストールされていないためです。~~

これは、エックスサーバーでは[OpenMP](https://qiita.com/Syo_pr/items/cca512d1043f33a3da2c)での高速化を行っているのに対し、ImageMagickのマルチスレッド処理に不具合があることが原因と考えられています。
この件についても後述します。

## 最速の対応

/MTをインストールしたパス/mt-config.cgi
をテキストエディタで開き、環境変数の「ImageDriver」をコメントアウトして「GD」に書き換えてください。

```perl:mt-config_xserver.cgi
# ImageDriver ImageMagick
ImageDriver GD
```
エックスサーバーには「Image::Magick」「Imager」はありませんが、「GD」は標準でインストールされているようです。

## もう少し本格的な対応

エックスサーバーはSSHを利用できるので、Perlモジュールを管理する、CPANのライブラリを許可ディレクトリ内に設置することもできるようです。
モジュールひとつを管理する目的ではちょっとコストが大きいので試したことがありませんが、GDよりも高速なImagerを利用したい方向けの情報としてご紹介します。

xserverでperlのcpanをローカル構築。local::lib
http://dq310.com/nm/xserver%e3%81%a7perl%e3%81%aecpan%e3%82%92%e3%83%ad%e3%83%bc%e3%82%ab%e3%83%ab%e6%a7%8b%e7%af%89%e3%80%82locallib/

## ImageMagickそのものを使用可能にする

先述のとおりですが、Movable Typeのコアファイルを「ImageMagickのみマルチスレッド処理を行わない」よう修正すると、ImageMagickのままで動作させられるようになります。
手順については下記を参照ください（藤本さんありがとうございます）。

OpenMPが有効なImageMagickとMovable Typeを組み合わせた際の不具合の回避策 - The blog of H.Fujimoto
https://www.h-fj.com/blog/archives/2017/08/15-103037.php

ファイルを一箇所修正するのみなので簡単ですが、予約投稿を行った際に、PageButeなどの多くのプラグインに内部的なエラーが出てしまうことを確認しています。
予約投稿を行わないのであれば問題ないかもしれませんが、GDに変更する対応が最も無難なようです。
VSM (Value Stream Mapping) のススメ〜開発プロセス可視化〜

### もっと詳しい内容については下記のブログにのせておりますので、興味があればご覧ください。
* [DMM inside : プロダクトのリリースまでの時間が268.5hから54.5hに！ VSM(ValueStreamMapping)時短術](https://inside.dmm.com/entry/2018/06/01/value-stream-mapping)
* [VSM (Value Stream Mapping)を書いたらリリースリードタイムが約200時間も短縮できることがわかった話](https://medium.com/@i35_267/vsm-value-stream-mapping-%E3%82%92%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%89%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%83%AA%E3%83%BC%E3%83%89%E3%82%BF%E3%82%A4%E3%83%A0%E3%81%8C%E7%B4%84200%E6%99%82%E9%96%93%E3%82%82%E7%9F%AD%E7%B8%AE%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%82%8F%E3%81%8B%E3%81%A3%E3%81%9F%E8%A9%B1-db8af1fb82bc?source=linkShare-aa8874ac89-1529406798)
* [VSM (Value Stream Mapping)の改善プロセスの悩みを「カイゼン・ジャーニー」を読んで解決した。](https://medium.com/@masatoishigaki/vsm-value-stream-mapping-%E3%81%AE%E6%94%B9%E5%96%84%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E6%82%A9%E3%81%BF%E3%82%92-%E3%82%AB%E3%82%A4%E3%82%BC%E3%83%B3-%E3%82%B8%E3%83%A3%E3%83%BC%E3%83%8B%E3%83%BC-%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A7%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%9F-63e708c4a4c0?source=linkShare-aa8874ac89-1529406843)


### ■ 前提
ソフトウェア開発をする上で、普段の仕事をしている上で業務プロセスに無駄がないか分析したい。又はどこがボトルネックになっているかがわからないがQCD※の品質が低く感じるなどを思ったことはないでしょうか？
※品質（Quality）とコスト（Cost）と納期（Delivery)の頭文字


### ■ VSM(Value Stream Mapping) という考え方
VSMとは、バリュー・ストリーム・マップの略。
>リーン生産方式やリーンソフトウェア開発において、生産や物流、ソフトウェア開発などの工程を改善する際に、現状を把握し将来のあるべき姿を明確にするために作成されるプロセス図のこと。もともとはトヨタ生産方式における手法で、トヨタ自動車では「物と情報の流れ図」という。
引用 : http://www.itmedia.co.jp/im/articles/0803/24

### ■ VSMの用語について
| 用語 | 説明 | 
|:-----------|:------------|
| プロセスのタイトル    | そのときに行ったプロセスの名前 | 
| リードタイム : LT (Lead Time)    | プロセスが次ステップに移るまでに要した時間の合計（PT+WT）        | 
| 実行時間 : PT (Process Time)     | 実際にそのプロセスを実行している時間      | 
| 待ち時間 : WT (Wasting Time)     | プロセスで待機状態の時間      | 
| %C/A : 完成と正確性の割合    | 上流プロセスから受け取ったものが手直しせずに使える割合         | 

### ■ 具体的なVSMの記載の仕方

【VSM例】
![20180517171257.jpg](https://qiita-image-store.s3.amazonaws.com/0/122901/3e8b9863-5a5a-a67b-bf4b-5ea3169bd562.jpeg)

### ■ 効果として見込まれる点

* リードタイムを可視化することで、どこのプロセスにどれだけの時間がかかっているかが可視化される。
* プロセスを可視化した上で、効果が高そうな改善ポイントを選べる。
* プロセスを改善した上で、どれだけの時間的コストを短縮できたかを可視化できる。
* 何と言ってもすべての業務プロセスを可視化をすることで対外的に説得力が生まれる！


せひ、皆さんもVSMを書いてみて普段の業務プロセス改善へ役立ててください。
Wio LTE IFTTT通信編(mineo au SIM)

#Wio LTE IFTTT通信編(mineo au SIM））

[前回](https://qiita.com/KazuyukiEguchi/items/2f6ca6e329ce1e98a646)の記事の続きです。
[前々回](https://qiita.com/KazuyukiEguchi/items/bf9a6c3a3bc7abf128c7)の記事の続きです。
今回はデータ通信で、IFTTTに送信するサンプルを動かしてみました。

##環境(2017/10/28)
MacBook 12(2017)
MacOS High Sierra(10.13)
Arduino IDE 1.8.5
Wio LTE Library v1.0.1
Wio LTE Japan Version (SORACOM CONSOLE経由で購入）　v1.0
mineo au MVNO 1 SIM(VoLTE専用)
mineo au 6 SIM(黒SIM)

## 結論
前回の記事で黒SIMを受信できないとレポートしましたが、データ通信も、数分で切れてしまうようですなので、実質,黒SIMでは、Wio LTEは利用できないことが判明しました。

## 黒SIMでの動作
最初のリクエストは成功したけど、２回目以降は回線が切断されているので、エラーになっています。

![171028-0001.png](https://qiita-image-store.s3.amazonaws.com/0/33220/2e6e489e-26b3-974c-8357-f717583d23b8.png)

## VoLTE専用SIMでの動作
こちらは、回線が切断されることなく、リクエストが送信出来ています。
![171028-0002.png](https://qiita-image-store.s3.amazonaws.com/0/33220/6ba8efec-eb14-dd72-83db-2e33abfa4f5a.png)

## 検証コード
## 検証プログラム
```c:test.ino
#include <WioLTEforArduino.h>
#include <stdio.h>

#define APN               "mineo.jp"
#define USERNAME          "mineo@k-opti.com"
#define PASSWORD          "mineo"

#define WEBHOOK_EVENTNAME "wiolte_uptime"
#define WEBHOOK_KEY       "秘密"
#define WEBHOOK_URL       "https://maker.ifttt.com/trigger/"WEBHOOK_EVENTNAME"/with/key/"WEBHOOK_KEY

#define INTERVAL          (60000)

WioLTE Wio;
  
void setup() {
  delay(200);

  SerialUSB.println("");
  SerialUSB.println("--- START ---------------------------------------------------");
  
  SerialUSB.println("### I/O Initialize.");
  Wio.Init();
  
  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyLTE(true);
  delay(5000);

  SerialUSB.println("### Turn on or reset.");
  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("### ERROR! ###");
    return;
  }

  SerialUSB.println("### Connect the \""APN"\".");
  delay(5000);
  if (!Wio.Activate(APN, USERNAME, PASSWORD)) {
    SerialUSB.println("### ERROR! ###");
    return;
  }
}

void loop() {
  char data[100];
  int status;
  
  SerialUSB.println("### Post.");
  sprintf(data, "{\"value1\":\"uptime %lu\"}", millis() / 1000);
  SerialUSB.print("Post:");
  SerialUSB.print(data);
  SerialUSB.println("");
  if (!Wio.HttpPost(WEBHOOK_URL, data, &status)) {
    SerialUSB.println("### ERROR! ###");
    goto err;
  }
  SerialUSB.print("Status:");
  SerialUSB.println(status);
  
err:
  SerialUSB.println("### Wait.");
  delay(INTERVAL);
}

```

以上、ご参考までに
2017年版:エックスサーバー（Xserver）で、PHPを拡張子.htmlのファイル内で動作させる

二年ぶりにエックスサーバーを契約したところ、PHP周りの仕様が変わっていました。
検索しても正しい情報が出にくいので共有しておきます。

※Movable TypeのTIPSではないのですが、MTはこの手の設定が必須となることが多いのでタグをつけておきます

## ソース

こちらのブログで見つけました。ありがとうございます。

【備忘録】html拡張子でPHPを実行する（エックスサーバー） | WEBの技
https://www.websuccess.jp/blog/archives/800

Qiitaにももう少し詳しい情報があります。FastCGI導入による仕様変更らしいです（確かに速くなりました）。

x-serverでのphpのインクルードとBasic認証【.htaccess】 - Qiita
https://qiita.com/kotarosoma/items/c34c1e32c3c417062b5d

## 設定方法

### サーバー番号が2001（sv2001）以降

.htaccessに以下を追記してください。
FCGIWrapperを併記しなければならない旨の情報も見られますが、**必要ありません。**2000番台サーバーのサービスが始まった直後、一時的に.htaccessの初期設定が異なっていたことによります。

```.htaccess
AddHandler fcgid-script .html
```

### サーバー番号が1999（sv1999）以前

これまでと同じです。
PHPのバージョンは、サーバーのPHP設定か、phpinfoで確認してください。
順次変わっていく可能性がありますので、エックスサーバーからのメールはチェックしておいてください。

```.htaccess
AddHandler x-httpd-php5.6 .php .phps .html
```
Wio LTEでSMSを受信してみる(mineo au SIM)

#Wio LTEでSMSを受信してみる(mineo au SIM)

[前回](https://qiita.com/KazuyukiEguchi/items/bf9a6c3a3bc7abf128c7)の記事の続きです。

##続報(2017/11/7)

dev branchだけど、SMS受信電番対応したよって連絡あったので、試してみました。

```c:test.ino
char mes[256];
char number[256];

if(Wio.ReceiveSMS(mes,sizeof(mes),number,sizeof(number)) > 0)
{
  SerialUSB.print("SMS:");
  SerialUSB.println(number);
  SerialUSB.println(mes);
  Wio.DeleteReceivedSMS();
}
```
で、問題なく、SMS送信者の電番を取得することができました！
対応ありがとうございます！

##環境(2017/10/27)
MacBook 12(2017)
MacOS High Sierra(10.13)
Arduino IDE 1.8.5
Wio LTE Library v1.0.1
Wio LTE Japan Version (SORACOM CONSOLE経由で購入）　v1.0
mineo au MVNO 1 SIM(VoLTE専用)
mineo au 6 SIM(黒SIM)
## 結論
SMS送信は、mineo Docomoも音声SIMからiPhone 8で送信しています。
VoLTE専用SIMは、SMS受信できるけど、黒SIMの場合は、残念ながらSMSを受信できませんでした。
ReceiveSMS()関数は、古いSMSのものから、取り出してくれるので、DeleteReceivedSMS()を呼ばないと、新しいSMSを取り出せないのでご注意を！
## 考察
黒いSIMは、SMSを３G経由で受信する仕様なので、LTE Onlyのデバイスでは受信できないのかもね。
VoLTE専用は、そもそも、LTE網で、SMSも受信するので、OKということなんでしょう！きっと！

## 検証プログラム
```c:test.ino
#include <WioLTEforArduino.h>
#include <limits.h>
#include <stdio.h>

WioLTE Wio;

void setup() {
  // put your setup code here, to run once:
  delay(200);

  SerialUSB.println("");
  SerialUSB.println("--- START ---------------------------------------------------");
  
  SerialUSB.println("### I/O Initialize.");
  Wio.Init();
  
  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyLTE(true);
  delay(5000);

  SerialUSB.println("### Turn on or reset.");
  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("### ERROR! ###");
    return;
  }
  
  delay(3000);

  if(Wio.Activate("mineo.jp","mineo@k-opti.com","mineo") == true) {
    SerialUSB.println("Activate is True");
  } else {
    SerialUSB.println("Activate is False");
  }

  delay(3000);

  SerialUSB.println("Loop Start");
}

void loop() {
  char num[20];

  if(Wio.GetPhoneNumber(num,sizeof(num)) > 0) {
    SerialUSB.println(num);
  }

  int rssi = Wio.GetReceivedSignalStrength();
  if (rssi == INT_MIN) {
    SerialUSB.println("### ERROR! ###");
    goto err;
  }

  SerialUSB.print("RSSI:");
  SerialUSB.print(rssi);
  SerialUSB.println("");

  char mes[256];

  if(Wio.ReceiveSMS(mes,sizeof(mes)) > 0)
  {
    SerialUSB.print("SMS:");
    SerialUSB.println(mes);
    Wio.DeleteReceivedSMS();
  }

err:  
  delay(5000);
}
```

以上、ご参考までに
Laravel5 で Facebook graph-sdk を使うときに stateなんちゃらで怒られないようにする

Facebook API 使っていますか？ 今までOAuthを毛嫌いしていてなかなか手を付けずにいたんですが、いざやってみたらチョーカンタン！なんですね。こりゃいいや。さっそくLaravelのプロジェクトにもサラッと組み込んで……。と思ったのに、まさか $_SESSION でコケてハマりました。

# 何がしたい？

[Facebookログインの例 - facebook for developers](https://developers.facebook.com/docs/php/howto/example_facebook_login)
こちらがFacebook公式のサンプル。ほとんどこのまま動きますが、Laravelのプロジェクト内でサンプル通りやると

```
Cross-site request forgery validation failed. Required param "state" missing from persistent data.
```

と出てしまいます。"Cross-site"と聞いて一瞬クロスサイトスクリプティング的なややこしい問題が頭をよぎりましたが、要するに、「$_SESSIONに必要なセッション情報が保存されてない」ということです。

# 結論

[CakePHPでFacebook php-sdk-v4使ってもstateなんちゃらで怒られないようにする](https://qiita.com/sarumonera/items/f83aeccf33ce3ea6f0fb)
こちらを参考にさせていただきました（というかそのままです、すみません……）

ソースコードの中から、その$_SESSIONに保存しているところを探して、Laravelのやり方に変更します。
それが、FacebookSessionPersistentDataHandler.php で、Laravel風にするとこんな感じです。

```php:FacebookSessionPersistentDataHandler.php

  public function __construct( $enableSessionCheck = true )
  {
  }

  public function get($key)
  {
      return \Illuminate\Support\Facades\Session::get($this->sessionPrefix . $key);
  }

  public function set($key, $value)
  {
      \Illuminate\Support\Facades\Session::put( $this->sessionPrefix . $key, $value );
  }

```
コンストラクタでは、もともとエラーチェックをしていてそのままだと「セッションが活きてないよ！」と怒られますので、まるごと削除しました。

# 結論２ － SDKのソースコードを書換えない方法

しかし上記コード。Facebook SDKの中のコードを書き換えるのは控えたいところ。SDKがバージョンアップした時に上書きされてしまうかもしれませんし、Facebook SDKの中にLaravelのコードが紛れ込んでしまうので再利用性が落ちます。
これを解決するには、Facebookオブジェクトに、上記の$_SESSIONに関する操作をする部分 = PersistentDataHandler を作って渡してあげればOKです。**依存性注入(DI)**ですね。
具体的にはFacebookオブジェクトを作るところが、下記のようになります。

```php:SampleApp.php

class LaravelDataHandler extends \Facebook\PersistentData\FacebookSessionPersistentDataHandler {
  public function __construct( $enableSessionCheck = true )
  {  
  }

  public function get($key)
  {
      return Session::get($this->sessionPrefix . $key);
  }

  public function set($key, $value)
  {
      Session::put( $this->sessionPrefix . $key, $value );
      // var_dump(Session::all()); // デバッグ用：保存されたセッション情報をダンプ
  }
}

/* ... */

$facebook = new Facebook([
  'app_id' => 'xxxxxxxxxxxxx',
  'app_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  'default_graph_version' => 'v2.10',
  'persistent_data_handler' => new LaravelDataHandler, // このオプションを追加
]);    

```

# 感想

最近ちょっとだけDIというものがナニかわかってきたので、言ってみたかっただけです(๑•̀ㅂ•́)و✧
Nuxt.jsの良いところとハマリどころ

## はじめに
私が良いと思ったところやハマったところなどを紹介していきます。
これから Nuxt.js に触れる方の知見になれば幸いです。

#良いところ
## Vue Cli でテンプレートが提供されている
```
$ vue init nuxt-community/starter-template <project-name>
$ cd <project-name>
$ npm install
$ npm run dev
```
のようにすることで何も考えること無くプロジェクトが立ち上がります。
## Vuex Vue-Router が初めから内包されている
先ほどのテンプレートでプロジェクトを作ると、初めから Vuex・Vue-Router が使えます。
ページの描画前にストアにデータを入れるメソッドがあったり、 Vue-Router で画面遷移する際、アニメーションを適用できたりします。


## サーバサイドレンダリングできる
Nuxt.jsはアプリケーションをサーバサイドレンダリングできるフレイムワークです。
バックエンドでも処理をしたい場合は、expressやadonis.jsと統合することも可能です。
統合した場合でも、Vueのコードはサーバサイドレンダリングされます。

## 静的ページも作成できる
nuxt generateコマンドを使うことで、静的ページを作ることも可能です。
netlifyなどの静的ホスティングサービスにUpしても動作するのでそういう用途にも使えます。
## ミドルウェアがある
ミドルウェアを使うことで、ページがレンダリングされる前に実行する処理をかけます。
ログインしていなければTopページにリダイレクトするなんていうよくある処理もかけます。

# ハマリどころ
## コンテキストが難しい
Nuxt.jsで提供されている api はよく引数で state や app などのコンテキストが落ちてきます。
どのメソッドでどのコンテキストが落ちてきて、どのデータにアクセスできるのかという説明があまりドキュメントにないので私はハマリました。
今の所contextをconsoleで吐き出して見るのがベスト(?)だと思います

## 違うフレイムワークと統合する時には少なからず戦わないといけない
nuxt-express や adonuxt といったスターターがありますが、そういうものを使わずに自分で作った環境を統合する場合、それなりにエラーが出ると思うので、スターターのコードを参考にしながらするといいと思います。

## ユニバーサルJSであるという点
フロントでもサーバサイドでも同じコードで運用できるというメリットがある一方、 window などのブラウザに依存するコードはエラーで死んでしまいます。
エラーが出て、なんか悪いことしたっけ？このエラー文なに？ってなった時に import してるモジュールがクライアントサイドでしか動かないコード使ってるみたいなことがよくあります。

## ページコンポーネント内でしかFetchなどのAPIが使えない
一部の非同期APIがPagesディレクトリ内でしか使えません。
違うディレクトリで扱うとエラーが出ます。

## 再利用したくないコンポーネントの置き場所に悩む
見通しを良くするために分けたもの置き場所に悩みます。
Pagesディレクトリに置いてしまうと自動でrouteとして登録されてしまうし、どこに置くのが綺麗なんでしょうか？いい方法があればご教授お願いします。
【Swift】コードを使った二つの画面遷移の方法

最近元気がありませんm(><)m
こんにちはTOSHです。
今回は、アプリ開発の基本でもある画面遷移について紹介していこうと思います！

#基本的な遷移の方法
Xcodeで画面遷移（アプリ内で画面を移動すること)際には、segueでボタンとパーツをつなげるのが一般的だと思います（下記参照）。
![](https://media.giphy.com/media/3ov9k1ce0sXuUcuGze/giphy.gif)
この方法は最も一般的で便利であるとは思いますが、例えば

+ パスコードを入力して画面遷移をしたい
+ 何回タップしたら遷移するといった  
場合ではこのような方法では実装できないのでまた別の方法で実装する必要があります。


#コードを使った画面遷移(2通り)

+ viewControllerとviewController同士をsegueでつなぎ、そのsegueを遷移したいタイミングで呼び出す(TypeA)
+ 遷移したいviewController自体に名前、識別IDをつけて遷移したいタイミングでviewControllerそのものを呼び出す

の2通りがあります。個人的には上の方法の方が楽かなって感じです。下の方法だと、他のstoryboardのviewControllerに行く時に役立つのかな？

#任意のタイミングでsegueを呼び出す(TypeA)
###1. まず、移動前のviewControllerと移動したいviewControllerをsegueでつなぎます。
![](https://media.giphy.com/media/xT9IgAFJVolwBZlUFG/giphy.gif)

###2. segueにIdentifierをつけます(segueを認識させるために名前をつけるような感じ!)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/180994/29b86a30-54fd-9796-548b-78400ce94672.png)
今回は、toSecondと名付けました。

###3. 次はコーディングをしていきます
今回は二回タップした場合のみ移動するという条件でやってみましょう！
ちなみに、移動し呼び出すときのコードは、
 
```swift
self.performSegue(withIdentifier: "先ほど名づけたsegueのidentifier", sender: nil)
```

で遷移することができます。
先程の条件で動かすためには、

```swift
var counter = 0

@IBAction func move1(_ sender: Any) {
        
        counter = counter + 1
        print(counter)
        
        if counter == 2{
            self.performSegue(withIdentifier: "toSecond", sender: nil)
            counter = 0
        }
}
```

のように書いてあげれば、無事遷移します。
![](https://media.giphy.com/media/3ohhwKjelUKBdXpcKA/giphy.gif)

# 任意のタイミングでviewControllerを呼び出す
### 1. まずは、遷移したいviewControllerに名前をつけます
名前をつける際にはsegueの場合と同様に、Identifierをつける感じです！
![スクリーンショット 2017-10-28 1.13.00.png](https://qiita-image-store.s3.amazonaws.com/0/180994/663b78de-02e4-321f-3e5d-afa1af925451.png)
今回はsecondと名付けました。

###2. コーディングしていきます。
コードを書く内容は、

```swift
//まずは、同じstororyboard内であることをここで定義します
let storyboard: UIStoryboard = self.storyboard!
//ここで移動先のstoryboardを選択(今回の場合は先ほどsecondと名付けたのでそれを書きます)
let second = storyboard.instantiateViewController(withIdentifier: "second")
//ここが実際に移動するコードとなります
self.present(second, animated: true, completion: nil)
```

これだけで完了です！最初の一行を少し変えれば他のstoryboardのviewControllerへと移動できるような気がします。

####注意点
このコードを書く時は、全てこれらのコードを`@IBAction func`の中に書いてください！
例えば、

```swift
@IBAction func move2(_ sender: Any) {
        let storyboard: UIStoryboard = self.storyboard!
        let second = storyboard.instantiateViewController(withIdentifier: "second")
        self.present(second, animated: true, completion: nil)
}
```
このような感じです。もしも、これを

```swift
let storyboard: UIStoryboard = self.storyboard!
let second = storyboard.instantiateViewController(withIdentifier: "second")

@IBAction func move2(_ sender: Any) {
        self.present(second, animated: true, completion: nil)
}
```
のように書いてしまうと、エラーが発生してしまいます。これはどうやら指定されている語のstoryboardという名前で定数を定義できないといった意味のようなものなのですが、なぜIBActionの中ではよくて外ではダメなのかよくわかりませんが...(誰か知っている人がいたら教えていただけるとありがたいです!)

#おまけ
##一つ前の画面に戻るときの遷移のコード
矢印でもう一回繋いで戻ることも可能ですが、それでは実際に戻っているのではなく新しく画面を立ち上げる動作であるのであまりお勧めできません。
戻るときのコードは

```swift
self.dismiss(animated: true, completion: nil)
```

で戻ることができます！これだと立ち上がっていた現在の画面から新しい画面を立ち上げるのではなく、先ほど開いていたページへ戻るように遷移できます。


#サンプルコード
[sample2](https://github.com/tosh7/sample2)
Windowsでの最高のコンソール環境構築

# この記事でできるようになること
**Windowsでリッチなコンソール環境を整えられる**

↓具体的に↓

1. tabやスプリットが使える
2. 256色カラーがきちんと使える
3. フォントがキレイ(好きなのを入れられる)
4. ローカルでも基本的なbashコマンドが使える(SSHクライアントだけではない)
5. 2バイト文字(日本語)がキレイに表示できる

↓こんなの↓

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/125791/37835027-f29c-1d0d-dd1e-33ddb04cdab9.png)
※コンソールでの日付表示などは.bashrcで各自設定してください。これについては解説しません。

# 前提条件

| Material | Version | link |
|:-----------|------------:|:------------:|
| OS       | Windows10        | -         |
| cmder     | Full      | http://cmder.net/ |
| mintty       | -        | -         |
|Ricty Diminished | 3.2.3 | https://github.com/edihbrandon/RictyDiminished |

# 経緯

何番煎じかわからないこの記事ですが、
「やはりwindowsでコンソールの環境を自分の好きなようにリッチに備えたいな」
という思いが強かった。
cmderがタブやスプリットが使えるので好きだったのだが
ただ、なんとなく調べていても
・[GitBash in ConEmu で256色を表示させるまでの軌跡](http://neos21.hatenablog.com/entry/2016/11/05/094328)
など、cmder側で対応しようとすると問題が発生するようなので、それの回避策を

# 本題
## 1. cmder
### 1.1 インストール
上記リンクから、Cmder本体を「**FullVersion**」でダウンロードし、任意の場所で解凍 & exeを起動
### 1.2 設定
Settings > Statrup > Specified named task 
にて初期起動のbashを {bash::mintty} に設定

![2017-10-29_22-20-54_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/125791/8570e6a2-1101-6e45-13a3-57880a3e4e07.png)

その他項目は、ご自由に
(フォントなどはここでは設定しない)

## 2. フォント
### 2.1 インストール
上記URLからttfファイルをzipでダウンロード(他に希望のフォントがあればそれをダウンロード)
ダウンロード完了後、解凍し管理者権限でインストール。


## 3. mintty
### 3.1 設定
一度念のため、cmderを再起動。
その後、ホームディレクトリにおいて下記ファイルを新規作成。

```sh:.minttyrc
BoldAsFont=no
#カーソルをブロックに
CursorType=block
#フォントの指定
Font=Ricty Diminished
#フォントサイズの指定
FontHeight=14
WindowShortcuts=no
Transparency=off
FontSmoothing=full
#256色コンソールを有効化
Term=xterm-256color
Locale=ja_JP
Charset=UTF-8
#以下、色の定義
CursorColour=253,157,79
ClicksTargetApp=yes
```

各項目の詳しい解説は省略するが
ここで先程インストールしたフォントのファミリーネームなどを指定することで、フォントを有効にする。
コンソールの色も、ここで変更できる。

次に、コンソール上で右クリック > Options... でmintttyのショートカットなどをお好みで設定。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/125791/321610da-a009-c90a-0c90-e1c55b0c9b75.png)


そして、最後にcmderを再起動。
**完☆成**
最高のコンソール環境をどうぞ。

# 最後に
ひとしきり理想的な環境は手に入れられましたが、
Windows側の方から文字列をコピペをショートカットでしたりすると
不可視文字が入ってしまったりする事がある。
(マウスでやれば無問題)
あとは、スマートにキーボードでコピペができれば完璧なんだけどなぁ

以上です。

ブログ始めました、よかったら遊びに来てください
https://red-full-moon.com/
webエンジニアにおすすめしたいツール

## はじめに
普段私が使ってるツールを、軽く言葉を添えながら紹介していきます。
こんなのも便利だよーっていうのがあれば、共有してくれると嬉しいです。

### Postman
apiを叩けるグーグル拡張機能
headerを自由に追加できたり、１０種類以上のhttpメソッドに対応してる
動作確認によく使う
### Postico
PostgresqlをGUIで操作できるアプリケーション
データの確認とかによく使う
### MySQLWorkbench
MySQLをGUIで操作できるアプリケーション
ER図を作れたりもする
### Kitematic
DockerをGUIで操作できるアプリケーション
コンテナをリスタートしたり、コンテナの中に入ってコマンドを叩くのが凄い楽になる
### Slack
おなじみのチャットツール
ないと生きていけない
### Pocket
気になったサイトを保存できるアプリケーション
エラーを解決に導いてくれたサイトとか、あとで読もうと思ったサイトをよく保存している
グーグル拡張や、Alfred workflow、スマホアプリまであるのでどこでも使えて便利
### PhpStorm
エディタ
LaravelとかVue.jsとかWeb系のプログラミングをするときはこれを使う
Visual Studio Codeとかもいいらしい
### Kobito
Qiitaと連携してるマークダウンエディタ
Kobitoで書いた記事をQiitaにあげられる
個人的にはメモとかによく使う
### Alfred
ランチャーアプリ
カスタマイズ次第でめちゃくちゃ用途があるので詳細はGoogle先生に
カスタマイズなしでも、コピーしたテキストの履歴をとれたり、スニペットを登録したりできる
買ったら幸せになれるけど、他人のpcを触った時に無くてアッってなる
### Sip
カラーピッカー
ブラウザ上だけで無く、どこの色でも抽出できる
抽出した色の履歴もとれて便利
### Web Developer Tools
毎日使うブラウザの機能
エラーを確認したり、apiが正しく飛んでるか確認したり、一時的にcssを変更したりする
めちゃくちゃ機能があるので本当に使いこなせたら~~変態~~凄い
### Awesome ScreenShot
スクリーンショットが取れるグーグル拡張機能
長いページでも自動でスクロールしてページ全体のスクリーンショットがとれる
### OneTab
タブを一つにまとめてくれるグーグル拡張機能
いっぱいタブを開いてる時に一つにまとめていらないタブだけ消したりできる
### Vue DevTools
Vue.jsを使うなら必須
Dataの状態を見たり、storeの状態をみたりする
### Github trend
賢い人たちの賢くてナウいコードがいっぱい見れる
### 日本語に翻訳
Google Chromeの右クリックすると出てくる機能
英語が読めない私は、すぐ日本語に翻訳してその場をしのぐ
### Image Downloader
サイトで使ってる写真を抽出してダウンロードできるグーグル拡張機能
### Snappy Snippet
Web Developer Tools で 指定した箇所のhtmlとcssが抽出できるグーグル拡張機能
GithubのPullRequestを取り消したい --deleteオプション

remoteにpush済みのブランチを削除することで紐づくpull requestを削除出来ます。

```git
git push --delete origin branch-name
```

(参考)
http://tweeeety.hateblo.jp/entry/2015/06/10/220841
https://qiita.com/megu_ma/items/7533b4327dc110a9e2b8
Androidで WiFi Analyzer を使うときの注意点

#位置情報をONにしよう
Android6.x以降からPermission仕様が変わったので、Wi-Fiスキャン（WiFi Analyzer）アプリの動作時は位置情報をONにする必要がある
（位置情報がOFFだと定数値`02:00:00:00:00:00.`となってしまう）

#参考
[Access to Hardware Identifier](https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id)
[Android OS 6 Location Service ON · VREMSoftwareDevelopment/WiFiAnalyzer Wiki · GitHub](https://github.com/VREMSoftwareDevelopment/WiFiAnalyzer/wiki/Android-OS-6---Location-Service-ON)
MAMPにTomcatを移植する


JavaでWebAPIを作成する機会があったので，ローカルのMAMPの中にTomcatも入れば良いなと思っていたところ，以外に簡単にできてしまったのでメモ．

# 実行環境
macOS Sierra 10.12.6

# Tomcatのダウロード
[Apache Tomcat® - Welcome!](http://tomcat.apache.org)

今回は，Tomcat8.5.23を使いました(Tomcat9もあるみたいですが，今回は保留)．

Coreのzipファイルをダウンロードしました．

![tomcatDownload.png](https://qiita-image-store.s3.amazonaws.com/0/152224/513a88a2-3073-14c9-ca7a-06ff0e5fa826.png "tomcatDownload.png")

# MAMPに追加
ダウンロードしたファイルを `/Applications/MAMP/` に移動．  
ファイルを展開して，`tomcat` に名前を変更．

```bash
mv ~/Download/apache-tomcat-8.5.23.zip  /Applications/MAMP
cd /Applications/MAMP
mv apache-tomcat-8.5.23 tomcat
```

# 各種設定
## 起動設定
`/Applications/MAMP/bin/startApache.sh`に以下をファイルの最後に追記．

```bash
/Applications/MAMP/tomcat/bin/startup.sh
```

## 終了設定
`/Applications/MAMP/bin/stopApache.sh`に以下を追記．

```bash
/Applications/MAMP/bin/shutdown.sh

# ↑ 以下のコマンドの前に追記
/Applications/MAMP/Library/bin/apachectl stop
```

MAMPを再起動して，http://localhost:8080 アクセスしてTomcatのホームにアクセスできるようになりました．

![tomcatHome.png](https://qiita-image-store.s3.amazonaws.com/0/152224/7419ba61-1523-ec9a-5ba9-393447580e4f.png "tomcatHome.png")

# 参考文献
[Add Tomcat into MAMP (Not MAMP Pro](http://lingxiao216.blogspot.jp/2011/05/add-tomcat-into-mamp-not-mamp-pro.html)  
[[Sy] 【技術メモ】MacにTomcatをインストール＆動作確認 | Syntax Error.](https://utano.jp/entry/2014/05/mac_tomcat_installation/)
Java 数当てゲーム（定番のプログラミング問題）

定番のゲームを作ってみました。
1000までの乱数生成して数当てです。7回以内に当てられなかったらゲームオーバーになります。
自分としてはツッコまれどころはあっても一つくらいかなと思っています。

breakの働きを忘れかけていたのが危なかったです。

```java:乱数生成して数当て　7回以内に当てられなかったらゲームオーバー

import java.util.Random;
import java.util.Scanner;

public class NumberQuiz {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		Random random = new Random();

		int randomNumber = random.nextInt(1001);

		System.out.println("数当てゲームを作りました。0から1000までの任意の数字を入力してください。7回以内で当てて下さい");

		int number = scan.nextInt();

		int i;
		final int LIMIT = 8;
		for (i = 0; i<=LIMIT ; i++) {
			int th = i + 2;
			if (th == LIMIT) {
				System.out.println(LIMIT + "回目になりました。ゲームオーバーです。正解は" + randomNumber + "でした。");
				break;
			}else {
				if (number > randomNumber) {
					System.out.print("もっと小さいです。");
					System.out.println("もう一度任意の数を入力してください。" + th + "回目の挑戦です");
					number = scan.nextInt();
				}else if (number < randomNumber) {
					System.out.print("もっと大きいです。");
					System.out.println("もう一度任意の数を入力してください。" + th + "回目の挑戦です");
					number = scan.nextInt();
				}else if (number == randomNumber) {
					System.out.println("正解です。" + (i+2) + "回でたどり着きました!");
					break;
				}
			}
		}
		scan.close();
	}
}

```
FactoryGirl用のデータを作るコード


開発中に必要になったのでメモ代わりに。
昔作ってたコードが下の感じ。（もしかしたらどこかを参考にしてたのかも）


```ruby:config/initializers/to_factory.rb 
module ActiveRecord
  class Base
    def to_factory
      factory_name = "#{self.class.name.underscore}_#{self.id}"
      result_str = "  factory :#{factory_name}, :class => #{self.class} do \n"
      self.attributes.each do | column, value |
        next if %w(created_at updated_at).include?(column)
        next if value.nil?
        result_str += "    #{column} "
        if value.is_a? Numeric
          result_str += value.to_s
        elsif value.is_a?(TrueClass) ||  value.is_a?(FalseClass)
          result_str += value  ? "true" : "false"
        elsif value.nil?
          result_str += " nil"
        elsif value.is_a?(String)
          result_str += "\"#{value && value.gsub(/"/, "\\\"")}\""
        else
          result_str += "\"#{value}\""
        end 
        result_str += "\n"
      end 
      result_str += "  end\n"
      result_str
    end 
  end 
end
```

これがあると、以下の様にModel毎にto_factoryできるので、このデータをちょっとspec/factories/に書きたいという時に便利

```
puts Account.first.to_factory
```
シェルスクリプトでNASからローカルにファイルをDLする(Macで)

# デザイナー『これ、組み込みお願いします』
そう言われて、素材を確認しようとしたらNAS上に置いてあったなんてことはないだろうか（いや、よくある）。

NASにいちいち接続して確認するのがめんどくさい、欲を言えば自動でローカルのリポジトリ上のしかるべきところに配置までしてもらいたい…。

MacならNASに接続するためのmountコマンドが使えます。
そして、NASに接続するためのパスワードなどもシェルスクリプトでKeyChainから呼び出せます。

ということは…。

## というわけでシェルスクリプト化

```bash:nasFileTransfer.sh
#!/bin/bash
set -u

# [使用例]
# ./nasFileTransfer.sh smb://path/to/file/on/nas /tmp

# NASマウント時の一時ディレクトリ名
# ${VOLUMES_DIR}/${TMP_NAS_DIR_NAME}の形式で使われる
readonly VOLUMES_DIR="/Volumes"
readonly TMP_NAS_DIR_NAME="tmpNASMount"
readonly NAS_HOST_NAME="nas.aaabbbccc.private" # nasのホスト名

function echoUsage () {
    echo "$0 <nas_path> <download_dir>"
}

# NASのpath指定
if [ -n "$1" ]; then
    # 日本語の部分だけURLエンコードしてくれるワンライナー
    # FYI: https://hydrocul.github.io/wiki/others/oneliner.html#urlencode-urldecode
    NAS_PATH=`echo ${1} | sed -E 's/^smb:\/\///g' | perl -nlpe 's/([^ -~])/"%".unpack("H2",$1)/eg'`
else
    echoUsage
    exit 1
fi

# ダウンロード先指定
if [ -n "$2" ]; then
    DOWNLOAD_DIR=$2
else
    echoUsage
    exit 1
fi

# Finderなどで開いていて同じNASの階層をマウント済みならアンマウント
MOUNTED_NAS_INFO=`df | grep -i $NAS_PATH | awk '{print $9}'`
if [ "$MOUNTED_NAS_INFO" != "" ]; then
    umount "${MOUNTED_NAS_INFO}"
fi

# このスクリプトで${VOLUMES_DIR}/${TMP_NAS_DIR_NAME}をマウント済みならアンマウント
df | grep "${VOLUMES_DIR}/${TMP_NAS_DIR_NAME}"
if [ "$?" -eq 0 ]; then
    umount  "${VOLUMES_DIR}/${TMP_NAS_DIR_NAME}"
fi

# ReadOnlyでボリュームマウント
# キーチェーンへアカウント名とパスワードを参照
NAS_CONNECT_USER=$(security find-internet-password -s ${NAS_HOST_NAME} | grep acct | sed -E 's/[ \f\n\r\t]+"acct"<blob>="(.+)"/\1/g')
mount -t smbfs -r //${NAS_CONNECT_USER}:"$(security find-internet-password -ws ${NAS_HOST_NAME})"@${NAS_PATH} ${VOLUMES_DIR}/${TMP_NAS_DIR_NAME}

case $? in
    0 | 1 ) ;;
    * ) 
        rmdir ${VOLUMES_DIR}/${TMP_NAS_DIR_NAME}
        echo 'NAS server connection failed.'
        exit 1 ;;
esac

# 画像ファイルコピー
# psdやaiなどの重めのファイルなどがもし入っていた時のためにここで除外指定します
# 隠しファイルなども除外
find ${VOLUMES_DIR}/${TMP_NAS_DIR_NAME} -maxdepth 1 -mindepth 1 ! -name "*.psd" ! -name "*.ai" ! -name ".*" | xargs -J% cp -v -a % ${DOWNLOAD_DIR}

# umount
umount ${VOLUMES_DIR}/${TMP_NAS_DIR_NAME}
```

## 使い方
初めて接続するNASには一回Finderで開いてKeyChainにパスワードなど覚えさせときましょう。

```bash
$ # nasFileTransfer.shという名前で保存したとして
$ # 実行権限付与
$ chmod +x nasFileTransfer.sh

$ ./nasFileTransfer.sh smb://path/to/file/on/nas /tmp/mynasdlfolder
```
で、NASのsmb://path/to/file/on/nas以下のファイルを/tmp/mynasdlfolderに展開してくれます。
(PATHは適宜書き換えて下さい)

そして、スクリプト冒頭のperlのワンライナーで日本語混じっててもいけちゃいます。

```bash
$ # 日本語が混じっててもいけちゃう
$ ./nasFileTransfer.sh smb://path/to/日本語の/ファイルの/ありか /tmp/mynasdlfolder
```


自動でNASのファイルを配置までさせたい場合は、このシェルスクリプトをラップさせるように、別のシェルスクリプトから叩かせると、いろんなシェルスクリプトから扱いやすいです。

## おまけ
シェルスクリプトで画像の確認しながら配置させたいという場合には、そのラップさせたシェルスクリプト上でqlmanageコマンド(Macだけ利用可)で画像のQuickLookを開かせたりすると更に良いです。

```bash
qlmanage -p path/to/image.png >& /dev/null
```
Excel2013でセル選択し続けると黒なる。

たまたま見つけたExcelネタです。気分転換にどうぞ。

![ポルナレフ.png](https://qiita-image-store.s3.amazonaws.com/0/200585/efc7a536-94b6-d04c-f175-29ca0a303592.png)
> あ…ありのまま 今　起こった事を話すぜ！
>  
> 「おれは　何度もセル選択していたと
> 　　　思ったら　いつのまにか黒くなっていた」
> 
> な…　何を言っているのか　わからねーと思うが
> 　　　おれも 何をされたのか　わからなかった…

というお話です。
以下、詳細。

左クリックでセル選択。
Ctrlを押しながらだと複数個所選択。
Ctrlを押しながら同じセルを何度も選択すると黒くなった！

参考画像
選択する回数によって濃さが変わる。
![2017-10-27_20h24_00.png](https://qiita-image-store.s3.amazonaws.com/0/200585/a4ec6ad4-f0b7-edfc-cf17-77c802d8d0e0.png)

範囲選択でも同じ。
![2017-10-27_20h40_16.png](https://qiita-image-store.s3.amazonaws.com/0/200585/8cb332aa-40fc-4ac4-1f8c-5dcef9762f5f.png)

たまたま見つけたExcelの機能ですが、
正直、何に使うのかさっぱりだったので検索してみました。

結果：仕事では使わないと思う(笑)。

いったい何のための機能なのか謎のままですが、
検索して見つけた数少ない使い道をご紹介したいと思います。

検索して見つけた使い道
参考：https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13127245903

手順
１．数値コピー。
２．選択
３．Ctrl＋Alt＋v
４．加算を選択しOK
５．なんか面白い！

１．数値コピー。
２．選択
![2017-10-27_19h29_09.png](https://qiita-image-store.s3.amazonaws.com/0/200585/86986948-db63-284e-17f3-4f38b6d504cb.png)

３．Ctrl＋Alt＋v
４．加算を選択しOK
![2017-10-27_19h29_22.png](https://qiita-image-store.s3.amazonaws.com/0/200585/e0e7e5f0-e15e-8406-6f40-a565f09bf11c.png)

５．なんか面白い！
![2017-10-27_19h29_33.png](https://qiita-image-store.s3.amazonaws.com/0/200585/7f73e743-071c-fccd-d8d7-778d467d8bc3.png)

選択された回数加算されるみたいです。

その他の使い道としてはセル選択しまくりながら、
無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄機能ァーーーッ！！！ってするぐらいだと思います。

良い使い道をご存知の方、
教えていただけると助かります。

今回は以上です。