OmniAICreator/Qiita-1.07M huggingface dataset:
unity2018でIron Pythonをやる

Iron python とは　C#でpythonをリアルタイムで、使える奴だ

全部、**2009年ころ、iron python 2.6.1を使いunityでpythonをやる方法達**は全部バグが多かった

今、**2018年の**はあんまりバグがない  **Iron python 2.7.8（2018）のnet45を使おう**

##バグ？
Iron python 2.7.8の**net40**がunityを**ダウン**するぽい使わないよにしよう
**net45を使おう**
##import os
うまくできる
##import 他の
うまくできる

##スクリプト
全部前と同じく書いておｋ、バグない

##unityでビルド途中エラーが出て、ビルドできない
ビルドするとエラーが出る
でも昔のiron pythonはエラーが出ない
iron pythonは全部Pluginsフォルダにある。昔のironpythonのPluginsを変わりに入れてビルドし、ビルドしたフォルダのDataフォルダにPluginsフォルダを作って今のiron pythonのPluginsを入れる
**Pluginを変えると、ビルド後も使える**

##文字化け
ironpythonの特徴上、見る時、文字の化けがある
print(str(文字).decode('utf8'))
これ使ってみる

完
パワポを使ってアニメーションgifを作る

## まずは完成品から

![anime.gif](https://qiita-image-store.s3.amazonaws.com/0/53489/84b6fb38-b51f-927f-e7ed-3c0dab11645c.gif)

## どうやって作るのか？

パワポを使ってとは言うものの、実際にアニメーションgifを作るのは、ImageMagickです。Windows版と、Mac,Linux版とではコマンド名が違うので、適宜読み替えてください。以下のステップです。

1. パワポで連番のgifを作る
2. ImageMagickで、連番のgifからアニメーションgifを作る

## パワポでの準備

### スライドを書いていく

普通にスライドに文字を書いていきます。「ルパン オープニング アニメーションgif」などで検索すると自動的に作ってくれるWebサービスもあるのですが、特定のフォントや長体を使いたいときには、Officeを使うのが楽ちんです。PowerPointの書式に長体はないのですが、テキストBOXをコピー→形式を選択して貼り付け→PDF、を選ぶと、画像と同じ扱いになるので、縦横の変形が可能になります。

![SS 2018-08-18 17.20.29.png](https://qiita-image-store.s3.amazonaws.com/0/53489/4e799a3b-7380-4848-8bac-b24ef14dca39.png)

止めたいコマは複数にすることで、コマ送りのスピードを変えることができます。

### マクロを埋め込む

パワーポイントには、基本機能としてgifファイルへのエクスポート機能があります。しかしながら、ファイル名が、「スライド1.gif」のようになっているので、ページ数が増えると、「スライド11.gif」が「スライド9.gif」よりもファイル名が逆順になり、あとでアニメーションgifにするのに不便です。そこで、VBAで、昇順ファイル名に出力ができるような機能を加えます。

以下のVBAをパワポドキュメントに埋め込んで実行します。マクロも保存するなら、pptm形式で保存するのがおすすめです。

```vb
Sub exportGif()
    Dim sld As Slide
    Dim cnt As Integer
    Dim strDir As String
    Dim strFileName As String
    
    ' output dir is hard-coded
    strDir = Application.ActivePresentation.Path & "/gif/"
    
    cnt = 0
    For Each sld In Application.ActivePresentation.Slides
        cnt = cnt + 1
        strFileName = "slide" & Format(cnt, "000") & ".gif"
        sld.Export strDir & strFileName, "gif", 720, 498
    Next
End Sub

```

このマクロを実行すると、連番で同階層のgifというフォルダに、gifファイルが作成されます。

![SS 2018-08-18 17.28.40.png](https://qiita-image-store.s3.amazonaws.com/0/53489/5cb03675-021d-537a-7c4a-43ada87e551d.png)

## ImageMagicでgifファイルを結合

gifファイルがあるフォルダで以下のコマンドを実行します。

```bash
convert -loop 0 -delay 20 slide*.gif anime.gif
```
MacでImageMagickを実行するときには、convertコマンドを使いますが、Windowsは適宜読み替えてください。

以下引数の説明

- loop はループするかどうか。0がループする設定。1がloopしないけど、Twitterに投稿すると結局はループしちゃうので、gifアニメーションはループする前提で作った方がいい
- delay は、1コマの時間。適当に増減させてくだい
- 入力ファイルは連番の部分をアスタリスクにすることで、複数ファイル名を指定可能。

## 用途

TWitterはアニメーションgifに対応しているので、伝えたいことをアニメーションgifにすると暑苦しい演出が可能になります。

![anime.gif](https://qiita-image-store.s3.amazonaws.com/0/53489/84ee47ce-21d2-1542-cf6d-0b5501738508.gif)
TidalCyclesでOSCを送信する方法

こんにちは，[santa](https://twitter.com/santa_sukitoku)です．
今回は，TidalCyclesでOSCを送信する方法について書きます．

## ソースコード
TidalCyclesでOSCを送信するためには，TidalCyclesではなく，SuperColliderに下のコードを追加する必要があります．

```
(
var addr = NetAddr.new("localhost", 10000); //localhostにはIPアドレスを追加
OSCdef(\tidalplay2, {
  arg msg;
  addr.sendMsg("/play2", *msg);
}, '/play2', n);
)
```

次に下のコードをcommand + Enterでコンパイルしましょう．

```
SuperDirt.start;
```

次にTidalCyclesを起動するとOSCが送信されているのがわかると思います(本記事ではTouchDesignerを用いて確認しています)．

![ScreenShot 2018-08-18 17.46.08.png](https://qiita-image-store.s3.amazonaws.com/0/43650/e7a102bc-d55d-bb71-9ce0-e070e2654d21.png)

## まとめ
とても簡単にOSCを送信することができるのでぜひ一度試してみてください．

下のように，TidalCyclesとTouchDesignerの連携もできるようになります．
[GitHub](https://github.com/santak-sukitoku/TouchDesigner_TidalCycles)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">TidalCycles &amp; TouchDesigner.<br>TidalCyclesで音を生成してOSCでTouchDesignerに送信.<a href="https://twitter.com/hashtag/TidalCycles?src=hash&amp;ref_src=twsrc%5Etfw">#TidalCycles</a> <a href="https://twitter.com/hashtag/TouchDesigner?src=hash&amp;ref_src=twsrc%5Etfw">#TouchDesigner</a> <a href="https://t.co/17714ERqfZ">pic.twitter.com/17714ERqfZ</a></p>&mdash; Santa (@santa_sukitoku) <a href="https://twitter.com/santa_sukitoku/status/1030348523500232704?ref_src=twsrc%5Etfw">2018年8月17日</a></blockquote>
サマータイムと2000年問題の比較

確か2000年問題は３年くらい前から予算と取って準備していたはず。
ソースがない場合はテスト環境にコピーして実際に２０００年に進めて影響を見たり。
また逆アセンブルする専用ツールもあった。

サマータイムは２０００年問題よりも改修内容は多い。しかも予算も人員もツールもない。

正気ではない。

確かホリエモンの偽メール事件は、メールヘッダーにばりばりに日本語が書かれていて、ITエンジニアなら素人でもねつ造メールとわかった。

そんなこともわからない政治家がホリエモンを責めていた。

そんなレベルの人が簡単にサマータイムを言うなって。

東京都は開催都市として、非合理なサマータイム導入に断固反対すべき 
http://blogos.com/article/318584/
mongoose.connect()時のエラー

#node.jsのmongoose.connect()時のエラー

####エラー内容
```irb
(node:22215) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
```

Google翻訳で翻訳
`DeprecationWarning：現在のURL文字列パーサは廃止され、将来のバージョンで削除されます。 新しいパーサを使用するには、オプション{useNewUrlParser：true}をMongoClient.connectに渡します。`

あとこちらの記事[「MongoClient.connect()時にuseNewUrlParserオプションを与える」](https://qiita.com/mimizq/items/c2b980ce97ccbeac23ca)も参考にし、第二引数に`{ useNewUrlParser: true }`を追加するとエラーが消えた。

```node.js
const express = require('express');
const mongoose = require('mongoose');

mongoose.connect('mongodb://(省略).mlab.com:(省略)', { useNewUrlParser: true });

const app = express();

app.get('/rentals', function(req, res) {
  res.json({'success': true});
});

const PORT = process.env.PORT || 3001;

app.listen(PORT, function() {
  console.log('I am runnnig');
});

```
とても助かりました。

###参考記事
[「MongoClient.connect()時にuseNewUrlParserオプションを与える」](https://qiita.com/mimizq/items/c2b980ce97ccbeac23ca)
蟻本 三角形とＡｎｔｓとくじ引き

ｎ本の棒があります。棒ｉの長さはａ[i]です。あなたは、それらの棒から3本を選んでできるだけ周長の長い三角形を作ろうと考えています。最大の周長を求めなさい。三角形が作れない場合は０を答えとしなさい。
ただし3<=n<=100,1<=a[i]<=10**6
n=5
a={2,3,4,5,10}
12
n=4
a={4,5,10,20}
0

```
#include <iostream>
#include<algorithm>
using namespace std;
int main() {
	int n;
	int a[110];
	cin >> n;
	for (int i = 0; i < n; ++i)
		cin >> a[i];
	int ans = 0;
	for (int i = 0; i < n; ++i) {
		for (int j = i + 1; j < n; ++j) {
			for (int k = j + 1; k < n; ++k) {
				int len = a[i] + a[j] + a[k];
				int ma = max(a[i], max(a[j], a[k]));
				int rest = len - ma;
				if (ma < rest) {
					ans = max(ans, len);
				}
			}
		}
	}
	cout << ans;
	return 0;
}
```


長さLcmの竿の上をｎ匹のアリが毎秒１ｃｍのスピードで歩いています。アリが竿の端に到達すると竿の上に落ちていきます。また竿の上は狭くてすれ違えないので二匹のアリが出会うとそれぞれ反対を向いて戻っていきます。各アリについて現在の竿の左端からの距離x[i]はわかりますがどちらの方向を向いているのかわかりません。すべてのアリが竿から落ちるまでにかかる最小の時間と最大の時間をそれぞれ求めなさい。
ただし1<=L<=10**5 1<=n<=10**6 0<=x[i]<=L

```
#include <iostream>
#include<algorithm>
using namespace std;
int main() {
	int n, L;
	cin >> n >> L;
	int x[1100000];
	for (int i = 0; i < n; ++i)
		cin >> x[i];
	int minT = 0;
	for (int i = 0; i < n; ++i) {
		minT = min(minT, min(x[i], L - x[i]));
	}
	int maxT = 0;
	for (int i = 0; i < n; ++i) {
		maxT = max(maxT, max(x[i], L - x[i]));
	}

	cout << minT << maxT;
	return 0;
}
```

くじびき
数字が書かれているｎ枚の紙切れが袋に入っています。あなたはこの袋から紙切れを取り出し数字を見て袋に戻すということを４回行い、４回の紙切れの数字の和がｍになっていればあなたの勝ちそうでなければ友人の勝ちとなる。あなたはこのゲームに何度か挑戦しましたが一度も勝つことができませんでした怒ったあなたは袋を破り本当に勝つ可能性があるのかを調べることにしました。紙切れに書かれている数字がk[1],k[2],,,,k[n]であったとき、和がｍになる取り出し方が存在するかどうかを計算し、存在するならＹｅｓ，存在しないならＮｏと出力するプログラムを作成してください
ただし、1<=n<=50,1<=m<=10**8,1<=k[i]<=10**8

for文の４重ループでもいいが、時間を短くする方法を考える。二分探索のアルゴリズムを使用する。

```
#include <iostream>
#include<algorithm>
using namespace std;
int n, m, k[1010];
bool binary_search(int x) {
	int l = 0, r = n;
	while (r - 1 >= 1) {
		int i = (l + r) / 2;
		if (k[i] == x)return true;
		else if (k[i] < x)l = i + 1;
		else r = i;
	}
	return false;
}

int main() {
	sort(k, k + n);
	bool f = false;
	for (int a = 0; a < n; ++a) {
		for (int b = 0; b < n; ++b) {
			for (int c = 0; c < n; ++c) {
				if (binary_search(m - k[a] - k[b] - k[c])) {
					f = true;
				}
			}
		}
	}
	if (f)cout << "yes";
	else cout << "no";
}
```
サマータイム導入は不可能だと思うがこれを機に考えたほうがいい事

# はじめに
まず、私は今発表されているスケジュールでの日本版サマータイム導入は不可能と考えています。
以下の記事はよくまとまっていますが懸念点など自分なりにまとめてみました.

[サマータイム導入には反対だが、サマータイム導入に必要なことを考えた](https://qiita.com/belgianbeer/items/e3853a315f94379c8f21)

サマータイムを2年後に導入すると仮定してみて、運用とかサポートとかの観点であんまり議論されてなさそうな点を思いつくままに書いてみます。

1. マルチベンダ対応
2. ハードコードされた機器や設定への対応
3. サマータイム以前にEOSになった機器
4. サマータイムを考慮してない独自ログとか
5. 深夜時間帯の運用作業

色々書きますがそんなの時代遅れの杞憂だというのならいいんですが。

## 1. マルチベンダ対応

日本のサマータイムに対応するのに各ベンダが各自で開始日と終了日指定してやるでしょうが、結局解釈の違いとかで問題が出てくると思います。
ベンダを統一して導入している所は各ベンダだけでいいだろうけど、官公庁とかも含めて大抵はマルチベンダで運用されています。
その実地テストは各ベンダからリリースされた物をまって組み合わせてテストするだろうけど、2020年では十分テスト出来ない状態で突入しそうです。

## 2. ハードコードされた機器や設定への対応
ハードウェア内で決めうちされていたり、後からのアップデートを考慮されていないという場合があります。
この場合パッチもあてられないしリプレースも予算とかの関係で無理です。
ベンダから正式対応は出来ないのでなんらかの別手段でサマータイムに対応する必要があります。
対応によってはサポート外運用になるおそれはあります。
ソフトウェア等でうまいことカバーしないと駄目でしょう。

## 3. サマータイム以前にEOSになった機器

EOSだけど、お客様判断で使い続けるハードウェアは結構あります。
この機器に対するファームウェアとかドライバとかのパッチってEOS後は普通出ませんしサマータイム対応はユーザ責任という事になりそうです。
政治的に対応するというベンダーも出てくると思いますが一般的には巨大なユーザじゃないと対応してもらえません。
EOS後の延長サポート代行の会社はいくつかあるけど、対応は難しそうです。

## 4. サマータイムを考慮してない独自ログとか
サマータイムの開始、終了を跨いだ時間に対し、OS側での対応はベンダからパッチで出る事は期待したい。でも独自なアプリケーションとかで直接イベントの時間をテキストでログに書く形式だとサマータイムを考慮した仕組みは必要です。
今からの対応ではなんらかの変換の仕組みを組みこんだ監視エージェントソフトなどで対応する必要はあります。

## 5. 深夜時間帯の運用作業

サマータイムの切替日って結局人が起きていない深夜に時間をズラしたりします。
運用しているシステムのバックアップとかリブートとかの運用作業って結局深夜から業務がはじまる2時間前位に終わらせるみつもりで運用するけど、サマータイムの切り替えの2時間の誤差を考慮してその日は運用しないとダメです。

# 結論

結局は「**運用でカバー**」しか無いですな。
そして対応する予算も確保も難しいので「**オーバーデリバリ**」でしか対応出来ないですね。
Raspberry Pi3にUbuntu18.04LTSをインストール

#環境
母艦 macOS 10.13.6 (17G65) High Sierra
Raspberry Pi3 Model B
　32GB Micro SDカード

#Mac側
###SDカードをFAT_32でフォーマット
MacのディスクユーティリティでもWindowsマシンでも
###マウントポイントの確認

```sh:
$diskutil list
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *32.0 GB    disk2
   1:             Windows_FAT_32 PI253                   32.0 GB    disk2s1
```
SDカードは/dev/disk2にマウントされている。
確認したらアンマウントする。

```sh:
diskutil umountDisk /dev/disk2
```

###Raspberry PI3用Ubuntu18.04イメージをダウンロード

[ここ](https://wiki.ubuntu.com/ARM/RaspberryPi#Booting_the_official_Pi_2_image_on_the_Pi_3B.2F3B.2B-)の「Unofficial images」にある
[Raspberry Pi 3用Ubuntu18.04イメージ](https://www.finnie.org/software/raspberrypi/ubuntu-rpi3/ubuntu-18.04-preinstalled-server-armhf+raspi3.img.xz)をダウンロードする。

※前準備としてMacでxzcatコマンドが使えない場合は
[Mac で xz を使用する方法](https://qiita.com/kamayaplus/items/d5a355e03ee78095daf7)
を参考にインストールしておく

###SDカードにイメージを書き込む。
~/Downloads/にイメージがダウンロードされたとして
以下のコマンドでxzで解凍したイメージをSDカードに焼く。
（進捗はCtrl+T）

```sh:
$cd ~/Downloads/
xzcat ubuntu-18.04-preinstalled-server-armhf+raspi3.img.xz | sudo dd bs=4m of=/dev/disk2 conv=sync
```
###起動
Raspberry Piにモニタとキーボードを接続し、SDカードを挿入し、起動させる。

```sh:
Ubuntu 18.04 LTS ubuntu tty1

Ubuntu login:
```
とプロンプトが出たら
ユーザー名:ubuntu / パスワード:ubuntu
でログイン
初期パスワードの変更を求められるので変更する。

```sh:
You are required to change your password immediately (root enforced)
Changing password for ubuntu.
(Current) UNIX password:変更前のパスワード「ubuntu」
Enter new UNIX password:変更するパスワード
Retype new UNIX passwprd:もう一回
```
###ユーザーの追加
ユーザーhogehogeを追加する。
[ubuntu ユーザを追加して sudo 権限をつける]
(https://qiita.com/white_aspara25/items/c1b9d02310b4731bfbaa)

###追加したユーザーでssh公開鍵認証でログインできるようにする
この状態でDHCPがあるLAN環境にいれば、sshログインできる。

[ssh公開鍵認証設定まとめ](https://qiita.com/ir-yk/items/af8550fea92b5c5f7fca)
を参照に公開鍵をサーバに登録し、パスフレーズなしでsshログインできるようにする。

###timezoneの設定 JSTに変更
[[Ubuntu16.04] timezoneの確認と設定](https://qiita.com/koara-local/items/32b004c0bf80fd70777c)

###apt source.listは更新しない
本家ubuntu.comのaptが遅いからといって、source.listを更新しないこと。
raspberry用armのパッケージはjaistに無いことがあるため。

とりあえずここまで。
Nuxt.js + TypeScript + Sass でプロジェクトをスタートする

## はじめに

新規でNuxt.js + TypeScript + Sassで開発をするときの覚書です。

## Nuxt.js + TypeScript のインストール

任意の場所で下記を実行します。

```sh
$ vue init nuxt-community/typescript-template my-project
$ cd my-project
$ npm install
```

## Sass のインストール

my-project のディレクトリで下記を実行します。

```sh
$ npm install --save-dev node-sass sass-loader
```

nuxt.config.jsを修正します。


```js:nuxt.config.js
css: [
  '~/assets/css/main.css',
],
```

↓

```js:nuxt.config.js
css: [
  '~/assets/css/main.scss',
],
```

main.cssのファイル名も修正します。

```sh
$ cd assets/css/
$ mv main.css main.scss
```

以上！
Javascript 事件處理 - 基本教學 By 彭彭 20


	7. 
		a. 選單開合操作範例

![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/280122/d1b28eb3-01c7-1808-f407-22d324f2db83.jpeg)


```ruby
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"></meta>
	<title>Event 事件處理</title>
	<script type="text/javascript">
	//alert("hello");
	function over(element){
		element.style.color="pink";
	}
	function out(element){
		element.style.color="blue";
	}
	// 用JavaScript 動態的注冊事件處理器 */
	function init(){
		var btn = document.getElementById("btn");
		/*
		btn.onclick = function(){
			alert("clicked");
		}*/
		var handler =function(){
			alert("clicked");
		}
		btn.addEventListener("click"/* 事件的名稱 */,handler);
	}
	</script>
</head>
<body onload="init();">
	<button id = "btn">Click</button>
	<!-- 靜態的處理 -->
	<span onmouseover="over(this);" onmouseout="out(this);">florence</span>
</body>
</html>
```
[Docker + Elixir]Docker上でElixir環境を作ってTDDしてみた話

# はじめに
今回の記事は [**ソフトウェアテストもくもく会in福岡 #1**](https://connpass.com/event/97329/) で実践した内容になります。
最近何かと話題の [**Elixir（エリクサー）**](https://ja.wikipedia.org/wiki/Elixir_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)) を触ってみたかったこと、Dockerに親しんでいきたいと思っていたことから今回の課題を選択しました。
Elixir入れたついでにフレームワークのPhoenixもついてきてます。

# やること

* ローカルにDocker for Macをインストール
* Elixirのコンテナを作成する
* Elixirに触れてみる
* ElixirでTDDをやってみる

## ローカルにDocker for Macをインストール
[**DockerをMacにインストールする**](https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81) の記事を参考にさせていただきました。
基本的に悩むことはないと思います。
インストール後は念のため、下記コマンドを実行してみる。

```bash:console
docker version
docker-compose version
```

## Elixirのコンテナを作成する

### ワークディレクトリを作成する
適当なところにワークディレクトリを作成しておきます。
私は構成を下記の通りにしました。

```text:directory
elixir
|
+-- Dockerfile
|     * コンテナの構成を記述したファイル。
+-- docker-compose.yml
|     * サービスの構成などを記述したファイル。
|     * 更に.envなどとして細分化が可能。
`-- docker/elixir
      * elixirのソースコードを管理するディレクトリ。
```

### 以降の処理
これ以降の作業は [**こちらの記事**](https://qiita.com/dd511805/items/13f3ea4255dc4d1a3fbb) 通りに進めさせていただきました。

## Elixirに触れてみる
ElixirというかPhoenixというか。
とりあえずコマンドが分からんでは話にならないので、よく使いそうなコマンドを調べてみました。
なお、今回はDocker上で起動しているため、全て `docker-compose run --rm web` を頭につける必要があります。

~~まとめると言ったな、スマンありゃウソだった~~

## ElixirでTDD！
TDDのお題は有名なFizzBuzzで行こうかと。

**ディレクトリ構造**

```text:elixir/docker/elixir
lib
+-- fizzbuzz.ex
|     * Fizzbuzzモジュール
`-- test
    |
    `-- fizzbuzz_test.ex
          * テストモジュール
```

###　まずは単体でテストモジュールをテストする

```elixir:elixir/docker/elixir/test/fizzbuzz_test.ex
defmodule FizzbuzzTest do
    use ExUnit.Case

    test "入力値をそのまま返す" do
        assert 1 == 2
    end

end
```

```bash:console
# test {path} とすることで特定のテストだけに絞り込める
docker-compose run --rm web mix test test/fizzbuzz_test.ex
```

```text:result
  1) test 入力値をそのまま返す (FizzbuzzTest)
     test/fizzbuzz_test.ex:4
     Assertion with == failed
     code:  assert 1 == 2
     left:  1
     right: 2
     stacktrace:
       test/fizzbuzz_test.ex:6: (test)

Finished in 0.1 seconds
1 test, 1 failure
```

はい、当然エラーになりますね。
ここで `1 == 1` などとして、グリーンで通してみましょう。

```text:result
.

Finished in 0.2 seconds
1 test, 0 failures
```

### 徐々にテストを実装していく
…ぶっちゃけここからは [**他の方の記事**](https://qiita.com/tbpgr/items/4d1fd7e25fdf7f78a82d) 通りに実装しただけなので（と言うかタイムアップで）、最初のユニットテストだけご紹介します。

```elixir:elixir/docker/elixir/lib/fizzbuzz_text.ex
defmodule FizzbuzzTest do
    use ExUnit.Case

    test "入力値をそのまま返す" do
        assert Fizzbuzz.fizzbuzz(1, 2) == [1, 2]
    end

end
```

```elixir:elixir/docker/elixir/lib/fizzbuzz.ex
defmodule Fizzbuzz do

  # 受け渡された値をそのまま返す
  def fizzbuzz(from, to) do
    from..to |> Enum.map(&(fizzbuzz/1))
  end

end
```

# 終わりに
Laravelなんかだと、最初に `use` とかしてどのモジュールをテストしているのかひと目で分かるんだけど、Elixir（というかPhoenix？）はそういった記述がなくてパッと見どこをテストしているのか分からなくなりました。
まあこの辺は慣れだと思います。
あとやっぱり懸念はしていたんですが、今やってるのが `Elixir` 側の機能なのか、 `Phoenix` 側の機能なのかで混乱してる感じが否めない。
コマンド一発でテーブル・ビュー・コントローラー・テストなどがまとめて生成できるのにはびっくりした反面、どうなってんだか理解するのに時間がかかりそうです。

とは言え新しい言語ということもあり、楽しくやれたので今後も続けていきたいと思います。
Auraの構築

勉強がてら構築してみた

# 環境
以下の環境で実施

|ミドルウェア  |バージョン|
|:-----------|:--------|
|JDK         |1.8      |
|Apache Maven|3.5.4    |
|Node.js     |8.11.4   |
|npm         |6.4.0    |

# 手順
1. chromedriverのzipファイルをダウンロードする

    ```
    # curl -LkvOf http://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip
    ```

2. 展開する

    ```
    # unzip chromedriver_linux64.zip
    ```

3. `.bash_profile`ファイルにパスを追記する

    ```
    # echo "export PATH=$PATH:$HOME/bin" >> $HOME/.bash_profile
    # source ~/.bash_profile
    ```
4. Gitリポジトリをクローンする

    ```
    # git clone https://github.com/forcedotcom/aura.git
    ```

5. `aura`ディレクトリに移動する

    ```
    # cd aura/
    ```
6. auraをビルドする

    ```
    # mvn clean install
    ```

# 参考
- [ChromeDriver - WebDriver for Chrome -  Downloads
](http://chromedriver.chromium.org/downloads)
初めてのVORTEX CORE

##### 導入
高級キーボードへの憧れから元々HHKBを買うつもりで某大型家電店で見つけてしまったキーボード
VORTEX CORE

こいつのプログラミング機能に魅かれて（よくわかってはいない）買ったものの、
使いこなすのにかなり時間がかかったのでメモとして残す。

この記事にたどり着いたおそらく初めて英字キーボードを触る人、もっといい記事を書いてください。


#### やったこと
1. ULE4JISを使う  
2. 全角半角の切り替えをできるようにする  


## 1.ULE4JISを使う
何も知らずに買った人もいると思うのです。
英字キーボードとかよくわかんね！って人もきっと。
僕がそうです。
何が違うってキーの配列が違うので今お使いの日本語入力のPCでは
印字されている通りに打てないです。
それを解消してくれるのがこのアプリで、
起動するだけで解決してくれます。
https://www.vector.co.jp/soft/winnt/util/se476294.html

## 2.全角半角の切り替えをできるようにする
まずは全角/半角の切り替え方法ですが、
[Alt]+[Fn1]+[ESC]
これで切り替えられるはずです。
もしかしたらお使いのOSのバージョンとかにもよるのかもしれませんが
僕はこれでできました。

で、そんなの毎回入力するのが面倒なのでキーに覚えさせる（プログラミングする）
このキーボードはL0~L3のレイヤーというものがあります。
このレイヤーというのどのキーがどのキーか（ややこしい）設定できるもので、
[K]のキーに[O]のキーを設定すれば、[K]のキーで[O]を入力できます。
ポルポルパニックを起こしそうですがそういうことです。
見た目と中身をすり替えられるのです。
プログラミング方法については説明書を参考にしていただきたいのですが、
少しだけ書くと[Fn]+[M]と押すとL0のレイヤーを選択できます。
現在どのレイヤーを選択しているかは左スペースキーの左側のLEDの色で分かります。
点灯していない：L0
赤：L1
緑：L2
青：L3

ちなみにL0はプログラミングできません。
あと、キーによってもプログラミングできないキーがあります。

なのでプログラミングしたい場合は、L1~L3のキーを選択します。

このあたりが引っかかるポイントだと思うので、何か引っかかった個所の解決に役立てば幸いです。
使い心地はかなりいいと思います。
ほかの高級キーボードを使っていないからかもしれませんが、、、ｗ

#### 追記
なんやかんやでやっぱりよく見るのは公式のPDF
https://www.archisite.co.jp/wp-content/uploads/2017/06/CORE-Manual.pdf
PlatformIOでArduino NanoボードをISPにしてみる

#免責
この記事に従って発生した如何なる損害も筆者は負うことができません。ご免なさい。

#目標
PlatformIOが大好きなので、これでArduino NanoボードをISPとして使えるようになりたいです。

#やり方
PlatformIOの環境が、インストールしてある場合は簡単でした。
old boootloaderとnew bootloaderで、initのオプションが違います。

```shell-session:old.bootloader
$ mkdir isp.nano328p
$ cd isp.nano328p
$ pio init -b nanoatmega328
$ pushd src
$ wget https://raw.githubusercontent.com/arduino/Arduino/master/build/shared/examples/11.ArduinoISP/ArduinoISP/ArduinoISP.ino
$ popd
$ pio run -t upload
```

```shell-session:new.bootloader
$ mkdir isp.nano328p
$ cd isp.nano328p
$ pio init -b nanoatmega328new
$ pushd src
$ wget https://raw.githubusercontent.com/arduino/Arduino/master/build/shared/examples/11.ArduinoISP/ArduinoISP/ArduinoISP.ino
$ popd
$ pio run -t upload
```

#接続例
この図ではハートビートのLEDをD9に付けてません。
コンデンサを挿したままだとArduinoISPの書き込みに失敗します。
ただしAVRマイコンを書き換えるときにはコンデンサを挿してください。
![qiita_attiny13_led_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/190950/6db93fad-64dc-45c7-75bd-f8c455fecb2b.png)
#まとめ
意外と簡単でした。
stringまとめ

#include <string>       // ヘッダファイルインクルード
using namespace std;         //  名前空間指定
int main()
{
    string str;       // ローカル変数として、str を生成
    .....
}

 std::string str;  //  string 型のオブジェクト str の宣言
空文字列の生成

std::string str("1234"); // "1234" という文字列
    str.insert(str.begin() + 2, '-');       //  [2] の位置に '-' を挿入
    std::cout << str << "\n";       // 結果は "12-34" となる

std::string str("1234567890"); // "1234" という文字列
    str.insert(str.begin() + 5, '*');       //  [5] の位置に '*' を挿入
    std::cout << str << "\n";
12345*67890となる

std::string str("12345");
    str.pop_back();    //  末尾文字（この場合は '5'）を削除
    std::cout << str << "\n";

std::string str("012345");
    std::string sub = str.substr(2, 3);     //  [2] の位置から3文字切り出す
    std::cout << sub << "\n";
A:234
 std::string str("abcabc");
    std::cout << (int)str.find("b") << "\n";    //  マッチする場合
    std::cout << (int)str.find("b", 3) << "\n";    //  ３文字目から末尾に向かって検索
    std::cout << (int)str.find("x") << "\n";    //  マッチしない場合
1
4
-1
std::string str("abcabc");
    std::cout << (int)str.rfind("b") << "\n";    //  マッチする場合
    std::cout << (int)str.rfind("b", 3) << "\n";    //  ３文字目から先頭に向かって検索
    std::cout << (int)str.rfind("x") << "\n";    //  マッチしない場合
4
1
-1
github上でURLから始まるコミットメッセージを正しくリンクさせる

#リンクがおかしくなる
github上ではコミットメッセージからコミットのページへのリンクが自動で張られるが、メッセージ内容がURLで始まると正しくリンクされない。

例）
https\://github.com/を参照　というメッセージの場合
https://github.com/horisakis/commit_message_url/commit/81df803f80cb99122aa4a8fd96e133cf42c823b2
こうなってほしいが

https://github.com/%E3%82%92%E5%8F%82%E7%85%A7
結果はこうなる

##対処案
思いつく方法で色々試して見みた

###シングルクオートでくくる
'https\://github.com/'を参照
https://github.com/'%E3%82%92%E5%8F%82%E7%85%A7
###ダブルクオートでくくる
"https\://github.com/"を参照
https://github.com/%22%E3%82%92%E5%8F%82%E7%85%A7
###スペースをあける
https\://github.com/ を参照
[https://github.com/][1] [を参照][1]
[1]:https://github.com/horisakis/commit_message_url/commit/308a9f64c1974e65efdb2f67a912da677738a1bc
###バッククオートでくくる
\`https\://github.com/\`を参照
https://github.com/%60%E3%82%92%E5%8F%82%E7%85%A7
###バックスラッシュでエスケープ
https\\://github.com/を参照
https://github.com/horisakis/commit_message_url/commit/8036db15c220c3019df78071202da37f1aa4623c
###特殊文字でエスケープ
https\&#58;//github.com/を参照
https://github.com/horisakis/commit_message_url/commit/889628d3dc1c10a72906fbc17f8e037452cabcaf

#まとめ
- スペースをあける
- バックスラッシュでエスケープ
- 特殊文字でエスケープ

これらの場合に正しくリンクされた。
バックスラッシュと特殊文字の場合、エスケープ文字が表示されてしまうのでコピペして参照元に移動する際に文字列を修正する手間がかかる。
スペースを空けた場合、参照元URLから張られているリンクがコミットへのリンクになっているので注意が必要。

URLから始まるメッセージの場合はスペースを空けるのが無難か。
VSCodeでIonicを利用するときimport文のエイリアスにumdを付けるバグがある。。


Ionicを使ったアプリを実装していて、急に以下のようなエラーがはかれて、画面が真っ白になってしまうようになった。

```
Uncaught Error: Cannot find module "."
    at webpackMissingModule (vendor.js:42708)
    at e.code (vendor.js:42708)
    at Object.<anonymous> (vendor.js:42717)
    at __webpack_require__ (vendor.js:55)
    at Object.256 (main.js:440)
    at __webpack_require__ (vendor.js:55)
    at Object.233 (main.js:425)
    at __webpack_require__ (vendor.js:55)
    at webpackJsonpCallback (vendor.js:26)
    at main.js:1
```

ネットで検索してみるとどうやら多くの人が同様の問題に直面しているらしい。
https://github.com/webpack/webpack/issues/4921

スレッドの最後の方にもあるように、これはVSCodeを利用していると発生する障害で、
VSCodeが勝手にTypeScriptのソースコード上の'ionic-angular'という文字列を'ionic-angular/umd'という文字列にコード補完してしまうことが原因とのこと。

プロジェクト中の全ての/umdという文字を削除することでエラーは発生しなくなる。
＼(＾o＾)／
Setting ec-cube for my Mac

```plaintext:httpd.conf
<IfDefine !SERVER_APP_HAS_DEFAULT_PORTS>
    Listen 80
</IfDefine>
```
# 드디어 성공
show databases;
<img width="814" alt="스크린샷 2018-08-05 오후 7.23.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/108659/59bc5943-939a-fd33-536e-9fba4c546d05.png">

#database
<img width="183" alt="스크린샷 2018-08-05 오후 7.35.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/108659/e36a41c9-fb3b-5eaa-e652-6ae1cda75620.png">
<img width="298" alt="스크린샷 2018-08-05 오후 9.36.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/108659/a41d22dd-07c0-322c-6323-7c7d7e9ff295.png">
## mysql user 생성, 권한부여
<img width="676" alt="스크린샷 2018-08-19 오후 5.48.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/108659/cc7a9b08-96a9-740d-0cc2-95f008dcb892.png">
## mysql user list
<img width="299" alt="스크린샷 2018-08-19 오후 5.51.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/108659/d43f688f-47d9-d197-8101-16f7f7a307bd.png">
## mysql설치 후 화면
<img width="635" alt="스크린샷 2018-08-19 오후 6.27.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/108659/3cab5187-8b38-c39a-0991-2ebcce8d5463.png">
Ruby 入門 ~Ruby環境の導入~

# 目次
・　rbenv、ruby-buildをインストール
・　rubyの最新バージョンをインストールする
・　rbenvを使ってrubyバージョンを切り替えてみる

# rbenvインストール
```
brew update
brew install rbenv ruby-build
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

ruby-buildをすでにインストールしている場合は最新版にアップグレード

```
brew upgrade ruby-build
```

# rubyインストール
インストールできるrubyバージョンを確認

```
rbenv install --list
```

ruby　2.5.1(2018/8/18時点の最新)をインストール

```
rbenv install 2.5.1
```
# 現在設定されているrubyバージョンの確認
```
rbenv versions
* 2.1.3 (set by /Users/nagataki/.rbenv/version)
  2.2.2
  2.3.0-dev
  2.5.1
```

# rubyバージョンの切り替え
今回は環境全体にrubyバージョンを適用するのではなく、
ローカル環境のみに適用する。

```
rbenv local 2.5.1

rbenv versions
  system
  2.1.3
  2.2.2
  2.3.0-dev
* 2.5.1 (set by /Users/nagataki/ruby_study/.ruby-version)
```
HTML DOM - 選單開合範例 By 彭彭


		
	6. HTML DOM
		b. 選單開合操作範例

![WS000015.JPG](https://qiita-image-store.s3.amazonaws.com/0/280122/4404852c-ce5e-e93c-08d8-415cf6ebcfb8.jpeg)


```ruby
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"></meta>
	<title>HTML DOM 選單開合操作</title>
	<script type="text/javascript">
	//alert("hello");
	function toggleMenu(number){
		var menu = document.getElementById("menu-" + number);
		menu.classList.toggle("hide");//切換標簽物件class的 hide的設定
	/*	if(menu.style.display == "none"){// 目前是none
			menu.style.display = "block";
		}else{
		menu.style.display = "none";// 目前是block
		}*/
	}
	</script>
	<style type = "text/css">
	.hide{display:none;}
	</style>
</head>
	<body>
	<div onclick = "toggleMenu(1);">florence1</div>
	<ul id = "menu-1">
		<li>1-0825</li>
		<li>1-0826</li>
		<li>1-0827</li>
	</ul>
	
	<div onclick = "toggleMenu(2);">florence2</div>
	<ul id = "menu-2">
		<li>2-0825</li>
		<li>2-0826</li>
		<li>2-0827</li>
	</ul>
	
	<div onclick = "toggleMenu(3);">florence3</div>
	<ul id = "menu-3">
		<li>3-0825</li>
		<li>3-0826</li>
	</ul>
	</body>
</html>
なりすましメール対策 DMARC、SPF、DKIM の確認方法

# 背景・概要
企業を狙ったフィッシングやビジネスメール詐欺（**BEC**: Business Email Compromise）の入口の多くは従業員を狙ったメールがほとんどです。こういったサイバー攻撃には、銀の弾丸と呼ばれるような対策は存在しません。いくつかの対策を多層的に取り組む必要があります。これらの対策の一つとしてなりすましメール対策が有効であり、その一つが**送信ドメイン認証（DMARC、SPF、DKIM）**です。
自ドメインのなりすましメール対策が効果的に設定されているかを確認する方法をまとめます。

![pochi.png](https://qiita-image-store.s3.amazonaws.com/0/13675/e663d0e7-f4e6-5f85-911f-f51357db02eb.png)

# check@naritai.jp へメール送信
なりすまし対策ポータル「**ナリタイ**」 https://naritai.jp/ では、技術解説だけではなく、確認ツールを提供しています。このサイトで用意している確認用メールアドレス
check@naritai.jp
にメールを送信するだけで、DMARC、SPF、DKIM の認証結果が返信されます。

https://naritai.jp/notice_check_dmarc.html

![guidance_confirmation_check_2.png](https://qiita-image-store.s3.amazonaws.com/0/13675/5cd9477f-c251-dbc3-e8d2-902426c3e1cf.png)

また、DMARC レコードにレポート（RUA）の送信先を指定していれば、ナリタイからレポートのサンプルが届けられます。

# DMARC 設定方法
DMARC の具体的な設定方法はこちらを参考にしてください。

ドメイン管理者がまず最初に実施するなりすましメール対策（DMARC、SPF、DKIM）
https://qiita.com/softest/items/8873655458f4831bad3b

# 参考サイト
なりすまし対策ポータル: https://naritai.jp/
Blazor SPA (v.0.5.x) で、ラジオボタン input 要素に双方向データバインドする方法

:::note info
この記事には以下の改訂版がありますので、最新の情報は下記を参照ください。

[改訂版] Blazor でラジオボタン input 要素に双方向データバインドする方法
https://qiita.com/jsakamoto/items/a326ddb14b0a7b6c4a74

:::

# その前に: "Blazor" とは?

"Blazor" とは、シングルページ Web アプリケーション (いわゆる "SPA") フレームワークです。

Blazor は、C# コードおよび .NET Standard 2.0 のネイティブアセンブリ (.dll) を、.NET サーバープロセスを使用せずに、モダン Web ブラウザ上で実行します。

もし Blazor について初めての方は、手前味噌ながら下記ポストをご覧頂くとよいかと思います。

**[C# で Single Page Web Application が書ける Blazor が凄かった件](https://qiita.com/jsakamoto/items/20d4893f6c8cdb0356f6)**

# Blazor における双方向データバインド

Blazor は SPA フレームワークですから、下記のとおり容易に、データと input 要素・select/option 要素とを、双方向データバインドすることができます。

```csharp
@functions {
    int EditionCode = 1;
}

<select bind="@EditionCode">
  <option value="1">Home</option>
  <option value="2">Pro</option>
  <option value="3">Enterprise</option>
</select>
```

Blazor は双方向データバインドの仕組みを **"bind=..."** 構文として提供しています。

## "bind" 構文がラジオボタン input 要素で機能しない!

しかしながら例外的に、現時点での Blazor (v.0.5.x) では、ラジオボタン input 要素に "bind=..." 構文で双方向データバインドすることができません。

以下のサンプルコードは機能しません。

```csharp:App.cshtml
@functions {
    int EditionCode = 1;
}

<label>
  <input type="radio" value="1" bind="@EditionCode"/> Home
</label>
<label>
  <input type="radio" value="2" bind="@EditionCode"/> Pro
</label>
<label>
  <input type="radio" value="3" bind="@EditionCode"/> Enterprise
</label>
```

近い将来、上記コードが機能するようになるとは思います。
しかし Blazor v.0.5.x ではまだ対応されていません。

どうしたらよいでしょう!?

# この問題の回避策

ご心配いりません。回避策があります。

ラジオボタン input 要素に対する双方向データバインドは、以下のとおり実装できます。

```csharp:App.cshtml
@functions {
    int EditionCode = 1;
}

<label>
  <input type="radio" checked="@(EditionCode == 1)" onchange="@(() => EditionCode = 1)"/> Home
</label>
<label>
  <input type="radio" checked="@(EditionCode == 2)" onchange="@(() => EditionCode = 2)"/> Pro
</label>
<label>
  <input type="radio" checked="@(EditionCode == 3)" onchange="@(() => EditionCode = 3)"/> Enterprise
</label>
```

`checked="@(EditionCode == ...)"` というコードは、"データから DOM へ" の一方向データバインドとして機能します。

他方、 `onchage="@(() => EditionCode = ...)"` というコードは、"DOM からデータへ" の一方向データバインドとして機能します。

この2つのコードを組み合わせることで、ラジオボタン input 要素に対する双方向データバインドを実装できます。

もちろん、下記のとおり、ラジオボタン input 要素を動的に構築することもできます。

```csharp:App.cshtml
@functions {
    int EditionCode = 1;

    // "Edition" class has "int Code" and "string Text" properties.
    Edition[] Editions = new [] {
      new Edition { Code = 1, Text = "Home" },
      new Edition { Code = 2, Text = "Pro" },
      new Edition { Code = 3, Text = "Enterprise" },
    };
}

@foreach (var edition in this.Editions)
{
<label>
  <input type="radio" 
         checked="@(EditionCode == edition.Code)"
         onchange="@(() => EditionCode = edition.Code)"/>
         @edition.Text
</label>
}
```

この回避策はやや冗長であまり格好良くはありません。  
が、兎に角、正しく機能します。

いずれ将来バージョンの Blazor は、ラジオボタン input 要素の "bind=..." 構文をサポートすることと思います。

下記の Isseue もお見逃しなく。

- [Blazor - Issue #1322 "Bind does not yet handle radio buttons"](https://github.com/aspnet/Blazor/issues/1322)

Blazor の新バージョンリリースが楽しみですね!

Happy coding with Blazor :)
Node.jsのインストール

やってみたメモ。とは言ってもほとんどやることはないけど

# 手順
1. 次のコマンドを実行する

    ```
    # curl -sL https://rpm.nodesource.com/setup_10.x | bash -
    ```

2. Node.jsをインストールする

    ```
    # yum -y install nodejs
    ```

# 参考
- [公式ドキュメント - Installing Node.js via package manager](https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora)
【豆腐対策】通知アイコンを作る【GIMP】


GIMPを使って通知用アイコンを自作するメモ。
デザイナーさんにお願いしたいところだけど、雑でOK＆時間が無い時にのために。
ちなみに環境はmac

※自分用なので、かなり適当です

# なぜ？

[Android 5.0 の動作の変更点] (https://developer.android.com/about/versions/android-5.0-changes?hl=ja#NotificationsMaterialDesignStyle)

>色に関係するアセットを更新または削除する。アクション アイコンおよびメインの通知アイコンでは、非アルファ チャンネルはすべて無視されます。これらのアイコンはアルファ チャンネル限定と考えてください。通知アイコンは白、アクション アイコンはダークグレーで描画されます。

残念な例。豆腐になってしまうよ。と
![3IVm3.png](https://qiita-image-store.s3.amazonaws.com/0/88858/6b471f28-e605-d496-cc35-520a07641bf0.png)

# やってTry!

## GIMP ダウンロード

https://www.gimp.org


## GIMPでアイコンを開く

ドラッグ＆ドロップでOK

## 背景を選択する

左のツールから”魔法使いの棒”みたいなのを選択する
そのまま透明にしたい背景をクリック。
そうすると背景が選択状態になる。

<img width="1280" alt="スクリーンショット_2018-08-18_14_08_12.png" src="https://qiita-image-store.s3.amazonaws.com/0/88858/2c0d7e21-1589-412d-4c85-69f93490ef79.png">

## 選択範囲を透明にする

選択した部分を右クリックしてメニューを開く。
編集 ＞消去 を選択すると背景が透明になる。

<img width="1280" alt="スクリーンショット 2018-08-18 14.08.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/88858/2ecef7ef-b077-7497-2eac-b5995f9e2200.png">

## 保存

pngで適当な場所に保存して終わり。

<img width="1280" alt="スクリーンショット_2018-08-18_14_08_49.png" src="https://qiita-image-store.s3.amazonaws.com/0/88858/dbee8596-2f71-987c-0c41-6862b704ff7b.png">
まだTLSv1.3(OpenSSL 1.1.1-pre8)はお勧めできない。(2018/08/18現在)

自宅サーバーをOpenSSL1.1.1にしてTLSv1.3でWEBサーバーを設定してニヤニヤしてしました。

でもね。OpenSSL1.1.1にしたことで色々めんどくさいことになったのであんまりお勧めしないです。もっとこの辺りの知識があれば良いのだけれど、私の力では今の所うまくやりきることができてないです。というか誰か助けてください。

こういうめちゃくちゃコアなものはOS標準から更新しないほうが良いですね。

## 追記

Ubuntu18の標準バージョンは1.1.0gなのでソースから引っ張ってきてmake,make installすると1.1.1はなかったことになりました。今から様子見

```
sudo su
cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.1.0g.tar.gz
tar xzvf openssl-1.1.0g.tar.gz
cd openssl-1.1.0g
./config -Wl,--enable-new-dtags,-rpath,'$(LIBRPATH)'
make
sudo make install
```

## 環境

Unbunt 18

## OpenSSL1.1.1のインストールについて

これは簡単です。makeしてmake installして再起動するだけ

```bash
sudo su
cd /usr/loca/src
wget https://www.openssl.org/source/openssl-1.1.1-pre8.tar.gz
tar zxf openssl-1.1.1-pre8.tar.gz
cd openssl-1.1.1-pre8
./config
make -j 4
make insatall
# 再起動
init 6
```

## WEBサーバーを設定して起動した感じ

H2Oはもう一度makeしてinstallしないといかんです。
取り込むOpenSSLを新しくしないといけないからね。
Apacheとかも同じだと思う

下記みたいな感じになって最先端！って 一瞬嬉しくはなるんだけど、その後が辛い。
![スクリーンショット 2018-08-18 12.59.34.png](https://qiita-image-store.s3.amazonaws.com/0/13106/af6df2bb-db4f-2437-65c1-25ac827e7b9d.png)


## なにが起こったか

これからも色々起こると思います。辛い。
まぁ、多分色々再インストールすれば良いのだろうけど。
つらい。

### 1. phpからfile_get_contentsとかしているところがこける。

httpsに接続しようとしてこける。辛い。
下記みたいなコードを入れないといけなくなります。

```php
$POST_OPTIONS['ssl']['verify_peer']=false;
$POST_OPTIONS['ssl']['verify_peer_name']=false;
```

#### phpについてはなんとかなった

https://curl.haxx.se/docs/caextract.html
からpem落としてきてphp.iniに設定したらなんとかなった。

```bash
sudo su
cd /etc/ssl
wget --no-check-certificate https://curl.haxx.se/ca/cacert.pem
```

(wgetにも設定しないといけないのは辛い)

fpmのphp.iniとかcliのphp.iniとか

```ini
openssl.cafile=/etc/ssl/cacert.pem
```

して、

```bash
sudo /etc/init.d/php7.2-fpm restart
```

### 2. vue initができぬ。

`vue init webpack my-project`ができなくなります。これはとても辛い
下記みたいになる。

```bash
npm_config_strict_ssl=false vue init webpack my-project
```

nodeとかvueとかインストールしなおしても状況変わらないのでしんどいです。

## 感想

もうちょっとOpenSSLについて突っ込みたいですが、ソフトウェアに軸足を置くおじさんの領分からは外れそうな感じ、あるのでやめます。
「ディストリが提供してくれてるの、使おう。」
間違ってもプロダクションではまだやるべきではないですね。
脆弱性のパッチとかならいざ知らず、バージョンアップですもの。

というか誰か助けてください。
Notificationメモ

## 複数の通知がある場合、どれをタップしても同じ内容が表示される

【事象】
1. 通知タップ後に起動する画面に表示されるデータをIntentにputExtraしてPendingIntentに設定する
2. 複数の通知が届いた状態で通知をタップして画面を起動すると、すべて一番最近届いた通知のデータになっている

【対応方法】

Intentに```setAction(System.currentTimeMillis().toString())```をセットする

```kotlin
val intent = Intent(this, MainActivity::class.java).apply {
            putExtra(MainActivity.BUNDLE_MAIL, mail)
            action = System.currentTimeMillis().toString()    // ★これ重要
        }
val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT)
```

Extraのデータが違っていてもOSは同じものだと判断して、古い通知をすべて新しいPendingIntentに更新してしまうよう。
なので、OSに各通知が別なことを伝えるために```setAction(System.currentTimeMillis().toString())```をセットして、古い通知が上書きされないようにしている。

参考：[PendingIntent works correctly for the first notification but incorrectly for the rest
](https://stackoverflow.com/questions/3168484/pendingintent-works-correctly-for-the-first-notification-but-incorrectly-for-the)
Google Apps Scriptで処理時間をLogする関数

# はじめに

Google Apps Script(GAS)で処理時間をLogする関数を作成しました。

処理が重そうな関数を作成する度に処理時間を測定するコードを書いてた過去におさらばです。

関数の実行はコールバック関数(callback)を用いています。

# コード

```Javascript:
function funcTime(func){
  var start = new Date();
  var result = func();
  var end = new Date();
  Logger.log('%s(): %ssec', func.name, (end - start)/1000);  // Logの形式はお好みで
  return result;
}
```

# 使用例

```Javascript:使用例
// 引数がない関数の使用例
funcTime(func1);
  
// 引数がある関数の使用例
funcTime(func2.bind(this, 2, 1000));
  
// 戻り値がある関数の使用例
var res = funcTime(func3);
Logger.log(res);  // 戻り値をLog
```

```Javascript:テスト関数
// 引数がない関数
function func1(){
  Utilities.sleep(1000);
}

// 引数がある関数
function func2(time1, time2){
  Utilities.sleep(time1 * time2);
}

// 戻り値がある関数
function func3(){
  return 'func3は戻り値あり';
}
```

# 結果

```
func1(): 1.001sec
(): 2.001sec
func3(): 0.0sec
func3は戻り値あり
```

引数がある関数を実行した際に関数名(func.name)が取得できないのが微妙ですが、とりあえず動くので良しとしました。

誰かよい方法を知っている方は教えていただけますと幸いです。
GitHub　SSH Keyの設定

GitHubに登録、リポジトリ公開はできたけど、SSH Keyの設定をしていなかったので設定方法をメモ。

###1.公開鍵の作成
```
$ ssh -keygen -t rsa -c "your_email@example.com
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/XXXXXX/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): パスフレーズ入力
Enter same passphrase again: 

The key fingerprint is:
フィンガープリント
The key's randomart image is:
+---[RSA 2048]----+
```

###2.公開鍵の登録

GitHub＞Account Setting＞Add SSH Key
titleは適当に、以下コマンドで公開鍵内容をコピペして登録する。

```
$cat ~/.ssh/id_rsa.pub
ssh-rsa 公開鍵の内容
```

登録が完了したら動作確認

```
$ ssh -T git@github.com
Enter passphrase for key パスフレーズ入力
You've successfully authenticated, but GitHub does not provide shell access.
```

設定されているメールアドレスに登録メールがくるので、これにて完了。
「master」ってなによ？

https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%81%AF


　
　
ここに書いてあることで僕はわかった。
　
またあとで、自分なりに理解したポイントをここに書いておくかも。
超初心者がPhalconエンジニアになるための学習ロードマップ

こんにちは！
今回はphalconエンジニアになるための学習ロードマップを詳しく説明したいと思います。

# phalconって？

phalconはPHPの高速webフレームワークです。

PHPのwebフレームワークで有名なのはLaravelですよね。あとは、Symfonyとかかな？

じゃあ、どのフレームワーク使ったらいいねん！っていうことですが、僕はphalcon激推しします。

phalconのメリットは、最速フレームワークである、圧倒的省メモリ、自由度が高いとかその辺です。


## phalconエンジニアになるためのロードマップ(1st Stage)

これからはphalconエンジニアになるためのロードマップを教えます。
あくまで僕が辿ってきた道筋なので、これが全てではありません。
ただ、プログラミングの学習者にはかなり有益だと思ったのでつらつらと書きます。
超初心者がphalconエンジニアになるための学習ロードマップ、開始します。

1st Stageでは、基礎の勉強方法を教えます。
2nd Stageでは、ちょっと発展編の学習について説明します。


### HTML&CSS

これはもう入門中の入門ですよね。
HTML&CSSはウェブサイトの文字やデザインとかを扱う言語です。

【学習方法】

- ProgateのHTML&CSS
- ドットインストールのHTML入門、CSS入門


### JavaScript, ES6

これは、ウェブサイトを動的に書き換えたりする言語です。
フロントエンドなら、HTML&CSSとJavaScriptを知らないと何もできませんね。。。
ES6はJavaScript2015とも言われ、最新のJavaScriptです。

【勉強方法】

- ProgateのJavaScript
- ドットインストールのJavaScript入門


## ローカル開発環境の設定

HTML&CSSくらいなら別に必要ないのですが、PHPとか触るようになると確実にローカル開発環境が必要です。
ローカル開発環境とは、自分のパソコンで、本番と同じようなアプリの挙動とかを確認しながら開発できる環境のことです。

【ローカル開発環境の設定】
XAMPP、VagrantとVirtualBox、　Dockerとか色々方法はありますが、初心者にはXAMPPをオススメしています。(簡単なので）

- [XAMPPのインストール(WIndows)](http://proengineer.internous.co.jp/content/columnfeature/4285#2)

- [XAMPPのインストール(Mac)](http://www.koreyome.com/web/xampp-mac-setup/)


### jQuery(optional)

jQueryはJavaScriptをさらに扱いやすくしたものです。
jQueryという言語というよりは、JavaScriptのライブラリの一つです。
JavaScriptのライブラリで他に有名なものは、「React」「Vue.js」「Node.js」とかですね。

【jQueryの勉強方法】

- ProgateのjQuery
- ドットインストールのjQuery入門


### PHP
PhalconはPHPのフレームワークなので、PHPは必須中の必須です。笑
PHPはデータベースとのやりとりができたりします。

【勉強方法】

- ProgateのPHP
- ドットインストールのPHP入門


### SQL

データベースと接続、データベースからデータを取り出すとかデータベースにデータを入れるとかを行うやつです。

【勉強方法】

- ProgateのSQL
- ドットインストールのMySQL入門



## phalconエンジニアになるためのロードマップ(2nd Stage)

2nd　Stageでは、ちょっと応用編について説明します。
言語というよりは開発ツールについての内容になります。

### git

gitはチーム開発に欠かせないものです。
バージョン管理したり、どのコードを修正したのか一目瞭然だったりして、めちゃくちゃ便利です。
gitを使った開発ツールとしてgithubが一番使われていますよね。
まずは、gitを勉強して、githubで自分専用のリポジトリを作っていじってみると良いと思います。

【勉強方法】

- ProgateのGit
- ドットインストールのGit入門


### Linux

Linuxは、コンピュータに直接指示を出すことができます。
シェルスクリプトとかいう言い方もします。
フォルダを作って、ファイルを作って、ファイルの名前を変更して、ファイルを削除してファイルの中身を書き開けてとか、なんでも全部これですみます。

【勉強方法】

- ProgateのCommand Line
- ドットインストールのシェルスクリプト入門(有料)

### 正規表現(Regex)

正規表現は、文字列のパターンを表現する書き方ですね。
〇〇から始まる文字列を検索できたり、数字で終わる文字列を調べたりとか、そういうのに使います。

【勉強方法】

- ドットインストールのエディタで学ぶ正規表現入門
- [Regex One](https://regexone.com/) ←英語です。
- HackerRankのRegex(練習できます。)


### phalcon

PHPのwebフレームワークです。
めっちゃ高速で、自由度が高いので使いやすいです。

【勉強方法】

- [phalconチュートリアル(日本語)](https://phalcon-docs-ja.readthedocs.io/ja/stable/reference/tutorial.html)
- [phalconチュートリアル(英語)](https://docs.phalconphp.com/zh/3.2/)

phalconは日本語ドキュメントが少ないことが難点ですので、英語で勉強することをオススメします。

日本語ドキュメントにも、結構訳されずに英語をそのまま掲載されているところあります笑



#　終わりに

いかがでしたか？
Laravelエンジニアになりたい方は、phalconの代わりにLaravel勉強すれば良いだけですし、全ていつか必ず必要になることなので、勉強していて損はありません。
皆さんもphalconエンジニアを目指してみてください！
μVisionのプロジェクトをGit管理するときの.gitignore設定

調べてもそれらしい設定例が出てこなかったので、
適当ですが自分の場合の設定を書いておきます。

### .gitignore
```
*.uvguix.*
/Listings
/Objects

*.htm
*.map

*.axf
*.d
*.crf
*.hex
*.o

*.dep

```
wordpressでページャー2ページ目以降が見つかりません

すこしはまったのでメモします。

# 結論・解決策・確認ポイント
管理画面　→　設定　→　表示設定　→　1ページに表示する最大投稿数
ここで設定している数値と
WP_Queryの引数、プロパティposts_per_pageを比べます。

```wpquery.php

$args     = array(
	'posts_per_page' => 5
);
$my_query = new WP_Query( $args );

```

ここで
1ページに表示する最大投稿数　＞　posts_per_pageだと
私の場合2ページ目のリンクを踏んだ時
ページが見つかりませんと出てしまいました。
posts_per_pageの数値を大きくすると問題が解決しました。

# 状況
WP_Queryで一覧画面を作成。
paginate_links関数でページャー、ページネーションを設置していた。

#起こった問題
2ページ目以降が表示されない
『ページが見つかりません』
と出てくる。

# ソース

```pagenation.php

$paged    = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;
$args     = array(
	'category_name'  => single_cat_title( '', false ),
	'paged'          => $paged,
	'post_type'      => array( 'page' ),
	'posts_per_page' => 5,
	'page'           => get_query_var( 'page' ),
);

$list_query = new WP_Query( $args );
if ( $list_query->have_posts() ) :
	while ( $list_query->have_posts() ) : $list_query->the_post();
		?>
		<article class="BlogPagePost">
			<h2>
				<?php the_title(); ?>
			</h2>
			<?php the_excerpt(); ?>
		</article>
	<?php endwhile; ?>
<?php else: ?>
	<p>まだ記事がありません</p>
<?php endif; ?>
<?php

if ( $list_query->max_num_pages > 1 ) {
	//リンク形式を指定
	if ( get_option( 'permalink_structure' ) ) {
		$format = 'page/%#%/';
	} else {
		$format = '?paged=%#%';
	}

	//ページ送りを表示
	echo paginate_links( array(
		'base'      => get_pagenum_link( 1 ) . '%_%',
		'format'    => $format,
		'current'   => max( 1, $paged ),
		'total'     => $list_query->max_num_pages,
		'mid_size'  => 2,
		'prev_text' => '&larr;',
		'next_text' => '&rarr;'
	) );
}
// クエリとページネーションをクリーンアップ（メインクエリを再設定）
wp_reset_postdata();

```


# はまりポイント
前述した以外にもいろいろと原因があるようです。
自分で経験したポイント以外は書くと混乱を招きかねないので
以下さわりだけ書いてみます。

- WP_Queryのoffset パラメータをセットすると paged パラメータを無視します。そのためページ送りされません
- 固定ページではWP_Queryのpagedパラメータを設定する必要がある
- WP_Queryのmax_num_pagesパラメータが取得できていない
- wordpress管理画面→設定→表示設定→フロントページの表示の設定が関係することがある
[Ruby][初心者] 例外処理について

## 例外とは？
プログラムのエラーにより継続して処理ができない異常
例外が起きると途中で処理が止まってしまうため、例外が起きる可能性がある場所においては適切に例外処理を行う必要がある


## 例
例外が発生する可能性のある箇所を begin ... rescue　で囲む。
例外が発生した場合は、rescueブロックの中の処理が実行される。

```
begin
  val = 10 / 0
  put val
rescue
  puts '0で割ることはできません'
end
```

例外に関数情報が入った例外オブジェクトを取得するには次のように書く

```
begin
  val = 10 / 0
  put val
rescue => e
  p e
end

#<ZeroDivisionError: divided by 0>
=> #<ZeroDivisionError: divided by 0> # 実行結果
```

## 例外オブジェクトにはエラーの原因を調べるための便利なメソッドが用意されている

- backtraceメソッド　

どのような順序でプログラムが実行されエラーに至ったかという情報を返してくれる

- full_messageメソッド

例外に関する整形されたメッセージを返すメソッド

## 例外によって処理を分ける

```
begin
  val = 10 / 0
  put val
rescue　ZeroDivisionError => e
　　　　puts '0で割っては行けません;
rescue => e
  puts 'その他のエラー'
end

#<ZeroDivisionError: divided by 0>
=> #<ZeroDivisionError: divided by 0> # 実行結果
```

## rescueに入った後に何らかの処理を行いもう一度実行したい場合
retryを使う

retry時にエラーが解消されないコードを書いてしまうと、例外が発生し続け永遠にretryし続けるループに入ってしまう可能性がある

```
num = 0

begin
  p 10 / num
rescue ZeroDivisionError => e
  p e
  num = 2
  retry
end
```

## raiseについて
raiseは明示的に例外を発生させたい時に使うもの

単純にraiseとした場合はRuntimeErrorという例外が発生する

```
begin
  raise
rescue => e
  p e
end
```

raiseの後に書いたクラスの例外を発生させることができる

```
begin
  raise ZeroDivisionError
rescue => e
  p e
end
```

独自で例外クラスを作成することもできる。
その場合は、独自のクラスにStandartErrorクラスを継承させて作る。

```
class MyError < StandardError; end

begin
  raise MyError
rescue => e
  p e
end
```

## 例外は発生してもしなくても実行されるensure
begin ... rescueの最後にensureを入れることで例外が発生しても、しなくても実行される処理を書くことができる

```
begin
  raise
rescue => e
  p e
ensure
  puts 'ensureが実行されました。'
end
```
ensureはbeginブロックで行なった処理の後処理が必要な場合に使用される
Unity,3Dゲームでタップ入力時の注意点/Camera.main.ScreenPointToRayでのエラー

###タップしても弾が前に飛ばない!現象
Unityで3Dゲームを制作している中、弾が上手く飛ばないという事があるのではないでしょうか。
その原因の１つがCamera.main.ScreenPointToRay()に起因します。
![失敗.gif](https://qiita-image-store.s3.amazonaws.com/0/259333/37bb21ba-a8fa-9d12-29cb-d89bd93e6ca4.gif)

#タップした場所に弾を飛ばす時の座標取得方法
そもそもタップした時にどう座標取得するのでしょうか。
3Dでは座標が３次元世界での座標系(ワールド座標系)になります。
UnityではScreenPointToRayというメソッドがあり、カメラからスクリーン座標に向かうベクトルを取得できます。
このベクトルを使って弾をタップした方向に飛ばします。

![スクリーン.png](https://qiita-image-store.s3.amazonaws.com/0/259333/90799c9f-b74b-ff56-b62d-ce425d83959e.png)




↓弾Prefab用スクリプト

```C#
public class IgaguriGenerator : MonoBehaviour {

    public GameObject igaguriPrefab;
	
	void Update () {
        if(Input.GetMouseButtonDown(0)){
            GameObject igaguri = Instantiate(igaguriPrefab) as GameObject;
//ScreenPointToRayに因るベクトルの取得
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            Vector3 worldDir = ray.direction;
            igaguri.GetComponent<IgaguriController>().Shoot(worldDir.normalized * 2000);
        }
	}
}
```

MainCameraの座標からタップした座標に向かうベクトルを取得できますがここでMainCameraをタグ付けしないと上画像のようにベクトルを取得できずに弾が発射できません。

<img width="337" alt="スクリーンショット 2018-08-12 15.32.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/259333/024e09be-4d0c-b483-9291-f927ae451cde.png">
　　　　　　　　　　↓
タグにMainCameraを選択します。
<img width="343" alt="スクリーンショット 2018-08-12 15.33.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/259333/28a9780c-1169-23cc-84cb-70a3f8fdc7ed.png">

これで弾が発射できました。
![成功.gif](https://qiita-image-store.s3.amazonaws.com/0/259333/7fbfcc9a-801b-de02-5bc6-9207f7b3b970.gif)


>参考書籍
>>[Unityの教科書 北村愛美](https://www.sbcr.jp/products/4797397659.html)
業務が快適になること間違いなし! Windowsの業務効率化ツール6選!

# はじめに
Windowsで業務をする上で私がいつもお世話になっているツールから特に重宝しているものをまとめました。

# ランチャー Executor
さまざまなアプリケーションをランチャーから起動できるので非常に便利です。
私はランチャー起動ショートカットを「Alt」+「Space」に設定しています。

特定の部分だけスクリーンキャプチャを取りたいときに、「Executor」 → 「Snipping Tool」を起動して
サクッとキャプチャを取ったりと非常に重宝しています。
![image2018-8-18 12_53_21.png](https://qiita-image-store.s3.amazonaws.com/0/254318/ee13bfe0-4401-c56f-be19-3bb7a22e75e7.png)

参考リンク
[windowsでmacのalfred風ランチャーが使いたいなら「Executor」がおすすめ！](https://enjoypclife.net/2014/11/22/windows-mac-quicksilver-alfred-launcher-executor/)

# クリップボード履歴ソフト Clibor
Windows標準ですと、クリップボードに保存できる件数は1件なので少し不便です。
クリップボード履歴ソフトとして、Cliborをおすすめします。

コピーした文字列を複数件保持し、指定したショートカットキーでいつでも呼び出せます。
保存しておいたワードリストから使いたい文字をぱぱっと選んでペーストしたりできます。
![2016-09-25_14h35_01.png](https://qiita-image-store.s3.amazonaws.com/0/254318/252b8121-d997-73a0-93bd-851d0d2a9d28.png)

参考リンク
[窓の杜 - Clibor](https://forest.watch.impress.co.jp/library/software/clibor/)

# Alt-tabをかっこよくする alt-tab terminator
「alt」+「tab」をかっこよく表示させるためのツールです。
特に実用性は無いですが、見た目は大事!
![image2018-8-18 12_56_9.png](https://qiita-image-store.s3.amazonaws.com/0/254318/438a4022-51d7-c954-a7b1-18173d4ba6f6.png)

参考リンク
[freesoft 100 - alt tab terminator](https://freesoft-100.com/review/alt-tab-terminator.html)

# 高速ファイル検索ソフト Everything
Windows標準のファイル検索だと「うまくファイルが検索できない」「動作が重い」と
感じている方にはEverythingをおすすめします。

非常に軽量でサクサクとPC内のファイルを検索できます。
Executorなどと組み合わせてぱぱっと表示したいファイルまでアクセスできるので業務効率UPに貢献してくれます。
![image2018-8-18 12_58_16.png](https://qiita-image-store.s3.amazonaws.com/0/254318/1f5f1ff9-4532-2fba-370c-37c96d56b8dd.png)

参考リンク
[窓の杜 - Everything](https://forest.watch.impress.co.jp/library/software/everything/)

# 非アクティブなウィンドウもスクロール WizMouse
非アクティなウィンドウをスクロールしたいシーンって意外とあるんですよね。
ウィンドウをクリックしてアクティブ化 → スクロールをするのが少しだけ面倒だったりします。

WizMouseを利用すると、非アクティなウィンドウもそのままスクロールできるのでマルチディスプレイで作業したりする際に地味に便利です。

参考リンク
[Vector - WizMouse](https://www.vector.co.jp/magazine/softnews/120412/n1204122.html)

# 環境変数を便利に編集する Rapid Environment Editor
Windowsで環境変数を編集するときはこちらを利用しています。
視覚的に現在の環境変数が見えるので非常に便利です。

新しい環境変数の追加や、編集も非常に簡単なので、Windows標準の環境変数エディタだと見づらいという方にはおすすめです。
![largeImg_thumb800.png](https://qiita-image-store.s3.amazonaws.com/0/254318/303021d7-89a7-bf74-11ed-3df042c1bb9a.png)

参考リンク
[窓の杜 - Rapid Environment Editor](https://forest.watch.impress.co.jp/article/2008/03/04/rapidenvedit.html)

# おわりに
皆さまのおすすめツールがございましたら、ぜひご紹介いただけますと嬉しいです!
[Ruby][初心者] モジュールとミックスイン

## モジュール


```ruby:
module SampleModule
  CONST_NUM =100

  def const_num
    CONST_NUM
  end
end

puts SampleModule::CONST_NUM

# moduleをincludeしたあとならモジュール名を省略して定数に直接アクセスできるようになる
include SampleModule
puts CONST_NUM
puts const_num
```

`module_function`を使うことで`module`名に.をつけてメソッドを呼び出せるようになる

```ruby:
module SampleModule
  def module_function_sum(a, b)
    a + b
  end

  module_function :module_function_sum
end

SampleModule.module_function_sum(1, 100)
=> 101
```

## ミックスイン
モジュールの機能をクラスに取り込むには
　　`include モジュール名`
とする

```ruby:
module SampleModule
  def sum(a, b)
    a + b
  end
end

class Sample
  include SampleModule

  def class_sum(a, b)
    sum(a, b)
  end
end
```

実行してみる

```ruby:
sample = Sample.new
puts sample.sum(1, 100)
=> 101

puts sample.call_sum(1, 100)
=> 101

```

## 使い道
- 複数のクラスで使う共通のメソッドを`module`として定義し、適宜`include`して使う
- 特定のメソッドを`module`としてまとめておきユーティリティーとして使用する