OmniAICreator/Qiita-1.07M huggingface dataset:
RobotoとNoto Sans CJKを用いて，見やすいBeamerのスライドを作る


**概要**
Beamerでスライドを作成する際，デフォルトの設定のままではフォントが細い．
(主にWindows, Linux)
そのため，スライドが投影された際に文字が潰れて見づらい可能性がある．
そこで，RobotoとNoto Sans CJKを用いて潰れに強く見やすいスライドを作る．

**環境**

- texlive 2018
    - コンパイルにはxelatexを利用
- Ubuntu 18.04

## フォントのインストール
RobotoとNoto Sans CJK JPをインストールする．
このとき，RegularとBoldだけでなく，他のウェイトもインストールする．

ここではxelatexのfontspecを用いるので
linuxならば`~/.fonts`，
Windowsならば`C:\Windows\Fonts`
にフォントのファイルを置くだけで良い．

## スライドの作成

### ポイント1．ウェイトはMediumを用いる
プリンブルに

```latex
\usepackage{zxjatype}
\setsansfont{Roboto Medium}
\setjasansfont{Noto Sans CJK JP Medium}
```

と書く．潰れに強くするため，フォントのウェイトはRegularではなくMediumを設定する．

### ポイント2．数式フォントにFourierを用いる
本文のフォントを太くしたので，それにともなって数式も太めのフォントを使う．
セリフの中では(おそらく)Fourierが最も濃く見えるので，プリアンブルに

```latex
\usefonttheme{professionalfonts}
\usepackage{fouriernc}
```

と書く．

### ポイント3．数式のフォントサイズと本文のフォントサイズを合わせる
対症療法的であるがデフォルトのフォントサイズを14ptに設定した上で，
本文のフォントを小さく設定する：

すなわち，

```latex
\documentclass[14pt]{beamer}
```

と設定した上で

```latex
\usepackage{zxjatype}
\setsansfont[Scale=0.85]{Roboto Medium}
\setjasansfont[Scale=0.81]{Noto Sans CJK JP Medium}
```

とする．

## 例

```latex
% !TEX program = xelatex
\documentclass[14pt]{beamer}

\usepackage{amsmath}
\usepackage{fouriernc}
\usefonttheme{professionalfonts}

\usepackage{zxjatype}
\setsansfont[Scale=0.85]{Roboto Medium}
\setjasansfont[Scale=0.81]{Noto Sans CJK JP Medium}



\begin{document}
  \begin{frame}{スライドの例}
    \begin{block}{Cauchyの積分公式}
      $D$を複素平面上の単連結領域とし$f(z)$は$D$上の正則関数とする．
      このとき，任意の $a\in D$に対して
      \begin{align}
        f(a) = \frac{1}{2\pi\mathrm{i}} \oint_c \frac{f(z)}{z-a} \,\mathrm{d}z.
      \end{align}
      ただし，$C$は$a$を囲む$D$
      内の単純閉曲線である．
    \end{block}

    \vspace{1ex}
    \begin{block}{太字と普通の字の比較}
      \begin{center}
        \textbf{太字}と普通の字 \quad \textbf{Futoji}とFutsunoji
      \end{center}
    \end{block}
  \end{frame}
\end{document}
```

**特にフォント設定を行わず作ったスライド** 
(フォントサイズは12pt，日本語はIPAexゴシック)
![default-1.png](https://qiita-image-store.s3.amazonaws.com/0/129263/1ca2c73a-6c85-00aa-fc34-257295b9986e.png)


**Roboto + Noto Sansで作ったスライド**
![roboto-1.png](https://qiita-image-store.s3.amazonaws.com/0/129263/6ab9bb17-c092-68c5-5649-1e0f19464892.png)
vs codeのvimでescとcapslockが入れ替わらない時の対処法

ubuntu18.04でgnome-tweak-toolを使いescとcapslockを入れ替えて使用しているが、

拡張機能のvimを入れたvisual studio codeで
・capslockで反応無し
・escボタンで、escとcapslockの同時押しのような反応

という状態に陥った。

どうやら調べると、VS codeのバグらしい
※参照 (https://github.com/VSCodeVim/Vim/issues/2419)

[ここ](https://github.com/Microsoft/vscode/issues/23991#issuecomment-292336504
)に解決策があった

これを

```javascript:ユーザ設定(変更前)

  // `keydown.code` (推奨) または `keydown.keyCode` のいずれかを使用するキー操作のディスパッチ ロジックを制御します。
  "keyboard.dispatch": "code",

```

こうして

```javascript:ユーザー設定(変更後)
  "keyboard.dispatch": "keyCode"
```

再起動
at coder beginner 042

B
いろはちゃんは 長さ L の文字列を N 個持っており、それぞれ S1,S2,…,SN です。
それらの文字列を好きな順番で全て結合してできる文字列のうち、もっとも辞書順で小さいものを求めてください。
なお、ある文字列 s=s1s2s3...sn と t=t1t2t3...tm について、以下のどちらかを満たすとき、辞書順比較で s<t であるといいます。
ある整数 i(1≦i≦min(n,m)) に関して、 1≦j<i を満たす任意の整数 j において sj=tj が成立し、かつ si<ti が成立する。
任意の整数 i(1≦i≦min(n,m)) に関して si=ti が成立し、かつ n<m が成立する。

```
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
	int L, N;
	cin >> N >> L;
	string S[100];
	for (int i = 0; i < N; ++i) {
		cin >> S[i];
	}
	sort(S, S + N);
	for (int i = 0; i < N; ++i) {
		cout << S[i];
	}
	cout << endl;
	return 0;
}
```
通った。

Cいろはちゃんはこだわりもので、嫌いな数字が K 個あり、それぞれ D1,D2,…,DK です。
いろはちゃんはお店でお買い物をしていて、 N 円の品物を買おうとしています。 もちろん、この品物は N 円以上のお金を支払えば買うことができます。 しかし、先ほど述べたようにいろはちゃんは強いこだわりがあるので、自分がお店に支払う金額の 10 進表記にいろはちゃんの嫌いな数字が出現しないような最も少ない金額を支払おうとします。
いろはちゃんが支払う金額を求めてください。
制約
1≦N<10000
1≦K<10
0≦D1<D2<…<DK≦9
{D1,D2,…,DK}≠{1,2,3,4,5,6,7,8,9}

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<list>
#include<cmath>
#include<map>
using namespace std;
using ll = long long;
const int INF = 1e9;
#define rep(i,n)for(int i=0;i<n;++i)
#define p pair<int,int>
int main() {
	int N; int K; int D[10];
	cin >> N >> K;
	for (int i = 0; i < K; ++i) {
		cin >> D[i];
	}
	for (int i = N; i < 10000;++i) {
		bool can = true;
		int ans = i;
		while (i > 0) {
			int a = i % 10;
			for (int j = 0; j < K; ++j) {
				if (a == D[j]) {
					can = false;
					break;
				}
			}
			if (!can) {
				break;
			}
			i /= 10;
		}
		if (can) {
			cout << ans<< endl;
			return 0;
		}
	}
	return 0;
}
```
通った
SAS Viyaのデモ用Jupyter Notebookがデータアップロードに対応！

[SAS Viya](https://developer.sas.com/home.html)はAIプラットフォームになります。Webブラウザ上で機械学習の設計、実行ができるStudioという環境も用意されていますが、開発者はプログラミングコードで開発することも可能です。

SAS Viyaでは14日間のデモ環境を提供していますが、これまではあらかじめ用意されているデータしか使えませんでした。しかし、先日よりJupyter Notebookにファイルをアップロードする機能を追加しました。

## フォルダを作成する

必須ではありませんが、ファイルの管理がしやすいようにフォルダを作った方が良いでしょう。今回は Data というフォルダを作成しています。

<img width="1000" alt="Screenshot_ 2018-09-24 17.06.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/274479/ab86c159-e919-b866-acaa-fdf4ab21a3d4.png">

## ファイルをアップロードする

Dataフォルダの中に入ったら、ファイルをアップロードします。Uploadボタンを押すとファイル選択ダイアログが表示されます。ファイルは複数指定できます。

![Screenshot_ 2018-09-24 17.06.25.png](https://qiita-image-store.s3.amazonaws.com/0/274479/a911daf8-609e-f48d-2671-0b4468231e0d.png)

ファイルが一覧表示されるので、アップロードボタンを押していきます。

## ファイルの使い方

今回はPythonのコードで紹介します。まずSAS Viyaのライブラリを読み込みます。

```py
import swat
```

次にSAS Viyaに接続します。

```py
cashost='localhost'
casport=5570
useremail='YOUR_EMAIL'
userpassword='YOUR_PASSWORD'
casauth='~/.authinfo'
sess = swat.CAS(cashost, casport, useremail, userpassword, caslib="casuser")
```

ファイルアップロードします。

```py
out = sess.upload('Data/iris.csv')
```

これでテーブルが作成され、操作できるようになります。

## デモ版ではネットワークによるファイルアップロードが使えません

デモ版のJupyter Notebookでは外部へのネットワークアクセスが禁止されており、ネットワークベースでファイルがアップロードできません（商用版では可能です）。例えば以下のようなコードはエラーになります。

```py
out = sess.upload('http://example.com/Data.csv')
```

そこで、今回のように Jupyter Notebook側で一旦ファイルをアップロードしておき、それを読み込むようにすればOKです。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
KiCadのCvPcbの動作を高速化する

##追記
KiCad 5.0.2においては、ローカルに置かれたフットプリント・ライブラリを参照しているようだ。
よって、この方法は、もはや使い物にならない。

##はじめに
Kicad 5.0になってから、CvPcb（フットプリントを関連付け）の動作が遅くなった。
KiCadのGitHubから、最新のフットプリント・ライブラリをいちいち参照しているようだ。

そこで、フットプリント・ライブラリをローカルに置き、動作の高速化を図った。

##シェルスクリプトで一括ダウンロード
CvPcbは、KiCad公式（ https://github.com/KiCad/ ）のリポジトリ（ https://github.com/KiCad/Buttons_Switches_THT.pretty など）を参照している。

これらを一括にダウンロードするため、このようなシェルスクリプトを作成した。

```
rm -rf kicad-footprints

mkdir kicad-footprints

cd kicad-footprints

for repo in Battery_Holders Buttons_Switches_SMD Buttons_Switches_THT Buzzers_Beepers Capacitors_SMD Capacitors_Tantalum_SMD Capacitors_THT Connectors_Card Connectors_Harwin Connectors_HDMI Connectors_Hirose Connectors_IEC_DIN Connectors_JAE Connectors_JST Connectors_Mini-Universal Connectors_Molex Connectors_Multicomp Connectors_Phoenix Connectors_Samtec Connectors_TE-Connectivity Connectors_Terminal_Blocks Connectors_WAGO Connectors_USB Connectors Converters_DCDC_ACDC Crystals Diodes_SMD Diodes_THT Displays_7-Segment Displays Enclosures EuroBoard_Outline Fiducials Fuse_Holders_and_Fuses Hall-Effect_Transducers_LEM Heatsinks Housings_BGA Housings_CSP Housings_DFN_QFN Housings_DIP Housings_LCC Housings_LGA Housings_PGA Housings_QFP Housings_SIP Housings_SOIC Housings_SON Housings_SSOP Inductors_SMD Inductors_THT IR-DirectFETs LEDs Measurement_Points Measurement_Scales Microwave Modules Mounting_Holes Opto-Devices Oscillators PFF_PSF_PSS_Leadforms Pin_Headers Potentiometers Power_Integrations Relays_SMD Relays_THT Resistors_SMD Resistors_THT Resistors_Universal RF_Antennas RF_Modules Shielding_Cabinets SMD_Packages Socket_Strips Sockets Symbols TerminalBlocks_Phoenix TerminalBlocks_WAGO TO_SOT_Packages_SMD TO_SOT_Packages_THT Transformers_SMD Transformers_THT Transistors_OldSowjetAera Valves Varistors Wire_Connections_Bridges Wire_Pads; do
	git clone https://github.com/KiCad/$repo.pretty
done
```

##使い方
###まず必要なもの
- Windows Subsystem for Linux
Windows 10上でLinuxが動くやつ

- git
```sudo apt install git```とかで入れる

###ダウンロードして実行する

```
git clone https://github.com/nezumi-tech/Kicad-Footprints-Downloader
sh Kicad-Footprints-Downloader/kicadfp.sh
```
"kicad-footprints"フォルダに入ってるので、WindowsのC:\とかにコピーする。

```
sudo cp -r kicad-footprints /mnt/c
```

##CvPcbの設定
###環境変数をいじる
設定>パスを設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187799/f7c34252-a99b-7670-619d-1b5d6d96fd7d.png)
"KIGITHUB"を、" https://github.com/KiCad "から、先程移動したフォルダのパスに変更する。
ここでは、ドキュメントに入れた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187799/ae5acd99-c274-c744-65a9-4109948e2083.png)
OKで閉じる
###ライブラリの種類を変える
設定>フットプリントライブラリーを管理
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187799/afe80916-c890-683a-63ac-111abb0ad9cd.png)
プラグインの種類（右にスクロールするとある）を"KiCad"に変える。
（セルを選択した状態だとコピペができるので簡単）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187799/64c634f4-2dca-5f5b-b9fc-798644a07077.png)
これで設定は完了した。
CvPcbを再起動すると、設定が反映される。


##後記
シェルスクリプトの作成に当たり、@zayarwinttun氏の「初心者向けシェルスクリプトの基本コマンドの紹介」を参考にしました。
https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337

自分がサッと書けそうだったので、シェルスクリプトを使いましたが、Windowsのバッチファイル（.bat）を使えば、Windows上だけで完結できると思います。
at coder beginner 041

B
正の整数 A，B，C が与えられます。 幅 A、高さ B、奥行き C の直方体の体積を X とします。 X を 10**9+7 で割った余りを求めてください。
なお、いくつかのプログラミング言語では、整数型が表せる値に上限があることに注意してください。

pow(10.0,9.0)で10の9乗。le9でも１０の９乗

整数 A，B，C (1 ≤ A,B,C ≤ 109) が与えられるので，(A×B×C) % (109 + 7) を求める問 題です．ここで，% は剰余の演算子です． いくつかのプログラミング言語では，整数型が表せる値に上限があります．たとえば，C 言語の long long 型が表せる値の上限はおよそ 9×10＊＊18 です．A×B×C は最大で 10＊＊27 なので，long long 型では正しく表せません．そのため，A×B×C を計算した後 10＊＊9 +7 で剰余をとる方法で は，正しい答えが求まりません． 正しい答えを求めるためには，計算の途中結果が常に 9×1018 以下に収まるようにしなければ なりません．そのために，よく知られた剰余の性質 (A×B) % M = {(A % M)×(B % M)} % M を使います．この性質を使うと，(A×B×C) % (109 + 7) は (long long) A * B % 1000000007 * C % 1000000007
という式で計算できます．計算の途中結果が常に 9×1018 以下に収まることが確認できます． 他の方法として，多倍長整数型（表せる値に上限がない整数型）を使って計算することもできま す．実行時間に余裕があれば有用な方法です．

いまいち何を伝えたいのかわからなかったから解説を読んだ。なるほどそういうことかい。

```
#include<iostream>
#define d 1000000007
using namespace std;
int main() {
    long long A, B, C;
	cin >> A >> B >> C;
	cout << (A*B%d)*C%d << endl;
	return 0;
}
```
これで通ったけど何個かCE出してしまった。いずれ桁数とかの勉強もやらなきゃいけないんだろうな

とりあえずデカい桁数のときはlong long使うかって思う

C
高橋学級には N 人の生徒がいます。 生徒は 1 から N まで出席番号が振られています。 i 番目の生徒の身長は ai です。 ai はすべて相異なります。
高橋先生は N 人の生徒を背の高い方から順に並べました。 N 人の生徒の出席番号を背の高い方から順に出力してください。 
制約
2≦N≦105
ai は整数である。
1≦ai≦109
ai はすべて相異なる。

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<list>
#include<cmath>
#include<map>
using namespace std;
using ll = long long;
const int INF = 1e9;
#define rep(i,n)for(int i=0;i<n;++i)
#define p pair<int,int>
int main() {
	int n, height;
	vector<p>a;
	cin >> n;
	rep(i, n) {
		cin >> height;
		a.push_back(make_pair(height, i + 1));
	}
	sort(a.begin(), a.end(), greater<p>());
	for (int i = 0; i < n; ++i) {
	    cout << a[i].second << endl;
	}
	return 0;
}
```
pairの使い方講座って感じ
仕事でAngular使うことになったので整理する

# Angularとは？

Wikipediaより。
>AngularJS（アンギュラージェイエス）、または Angular は、Googleと個人や企業のコミュニティによって開発されている、完全にJavaScriptで書かれたオープンソースのフロントエンドWebアプリケーションフレームワークである。
(中略）
>AngularJSはシングルページアプリケーション (SPA) の開発が可能なフレームワークで、一つのフレームワーク内で全ての機能が完結するフルスタックフレームワークであることが特徴として挙げられる。

[AngularJS - Wikipwdia](https://ja.wikipedia.org/wiki/AngularJS#cite_note-3)

# 何ができるの？

主にSPAを作るためのフレームワーク。
Angular Materialといって、AngularでMaterial Designを簡単に導入できるツールなどもあり、いい感じの見た目のサイトが割合簡単に作ることもできる。
ただ、かなりクセのあるフレームワークだと感じていて、なおかつフルスタックのフレームワークなので、特定のページにだけちょこっと導入したいなーという場合には不向き。そういう場合はVue.jsとかのほうがいいらしい（使ったことない）。

# AngularJSとAngular

バージョン1のころはAngularJSという名前だったけど、バージョン2からはAngularと名前が変わった。
変わったのは名前だけじゃなくて、AngularJSとAngularでは正直別物と言っていいくらいに中身が変わっている。（互換性もない）
最初は"JS"ってつけて呼ぶのが面倒だからみんなAngularAngular言ってるのかと思ったら、ちゃんと違ってたという。
調べ物をするときはAngularについての記事なのか、AngularJSについての記事なのかちゃんと確認しましょう。（最初はわからなくて混乱した）
なお、今回使うことになったのは**Angular**の方なので、AngularJSについては以降触れません。

# Angularを使う上でわかっておいた方がよいもの

## Dependency Injection (DI)
依存性の注入、とよく日本語訳される。デザインパターンの一種。
「依存性」とか言われると（しかもそれを注入？？）一瞬よくわからないけど、あるクラスやメソッドが、別のクラスのインスタンスを利用するような場合に、そのクラスやメソッドはそのインスタンスに依存していると表現する。
で、依存性を注入するっていうのは、その依存しているインスタンスを、クラスやメソッド自身が生成するんじゃなくて、外部から渡せるようにするって感じ。
うまく説明できないけど、調べるといい解説がたくさんあるのでググろう。
AngularではこのDIの仕組みを扱う機会が多いので、知っておかないと「意味わからん！」という場面に遭遇しそう。

余談だけど、「依存性の注入」とか、正直このあたりの日本語訳のセンスってどうにかならないものかと^^;

## Reactive Extensions (Rx)
リアクティブエクステンション。
もとはC#、、、というか.NETのライブラリだったようですが、Java(RxJAVA)やSwift(RxSwift)などにも広がり、javascript(RxJS)にもやってきた。
データやイベントを「ストリーム」という概念で扱い、関数型言語のようなプログラミングスタイルで、シンプルに書くことができる。
Angularの依存ライブラリとなっていて、よく使われているところを目撃します。
自分は触り始めたばかりなのでまったく上手に扱えないのですが、練習すればいろいろ応用効くのかな、と思っています。

## TypeScript
いわゆるAltJSの一種。Microsoftが開発したオープンソースの言語。
AltJSって何？って人は、これもググればすぐわかるんだけど、最終的にjsに変換して使うjsのメタ言語みたいなものと考えればいいかな。
AltJSはいろんな種類があるんだけど、TypeScriptは簡単に言うとjsで型による静的解析を行えるようにしたものです。（デコレータとか他にもたくさん機能があるんですが。。。）
AngularはTypeScriptを採用しているので、これがわからないとほとんど書けないと思います。

# まとめ
ちょっと雑ですが、簡単にまとめました。
どっか間違ってたりとか、他にもいろいろ書くべきことはあったりとかすると思うんですが、
使い始めたばっかなので自分もよくわかっておらず。。。
そのうち色々まとめられればと思います。
VPSに個人用のGitサーバを作る

# 目的
色々作るにあたって、ソースコードを公開できる場合とできない場合がある。
企業レベルでなら、ちゃんと契約してprivateで作業できるようにしてもいいと思うが、個人レベルでやってる場合には、そうはいかない。
そこで自分でGitサーバを構築することにした。
ここで問題が発生する。それは、そのサーバをどのように調達するかだ。
しかし、今回は作るものがWebサーバということで、元々VPSを借りる予定だったため問題とはならなかった。
その他の対応としては、ローカルLAN内にサーバを立てるなどがあるだろう。
現状予定では使用するのが私一人なので、GUIは作らず、CLIで管理できれば良いとする。

# 環境
- サーバ
VPSサーバ
CentOS release 6.5 (Final)

- クライアント
Windows 10(Fall Creators Update済み)
Subsystem for Linux(Ubuntu)

# 構築する
## Git用ユーザの作成
gitユーザを作成。

```
[root@Server:~]# adduser git
[root@Server:~]# passwd git
```

## SSHの設定
デフォルトで接続できる設定になっていた。
### 公開鍵認証でログイン
```
[root@Server:~]# su git
[git@Server:~]# cd
[git@Server:~]# mkdir .ssh
[git@Server:~]# chmod 700 .ssh/

[Client:~]# ssh-keygen -t rsa
[Client:~]# scp ~/.ssh/id_rsa.pub git@{ServerIP}:~/.ssh/authorized_keys

[git@Server:~]# chmod 600 .ssh/authorized_keys

[Client:~]# ssh git@{ServerIP} -i ~/.ssh/id_rsa
```

### `.ssh/config`に登録
[.ssh/configファイルでSSH接続を管理する](https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1#sshconfig%E3%81%A8%E3%81%AF)を参照。

## Gitのインストール
```
[root@Server:~]# yum install git
```

これでGitのインストール完了！
でも、バージョンが古すぎる...

### バージョンアップ
参考：[CentOSに最新版のGitをインストール・アップデートする方法 - TASK NOTES](https://www.task-notes.com/entry/20150622/1434942000)
2018年9月23日現在 最新版`v2.19.0`

```
[root@Server:~]# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
[root@Server:~]# mkdir /usr/local/src/
[root@Server:~]# cd /usr/local/src/
[root@Server:src]# git clone https://github.com/git/git
[root@Server:src]# yum erase git
[root@Server:src]# cd git
[root@Server:git]# git checkout refs/tags/v2.19.0
[root@Server:git]# make prefix=/usr/local all
[root@Server:git]# make prefix=/usr/local install
```

これでSSHを再接続すれば、Gitは最新版！

# 使ってみる
## クローン
```
[git@Server:~]# mkdir sample.git
[git@Server:~]# git init sample.git --bare --shared

[Client:~]# git clone git@{ServerIP}:sample.git
```
Gitクローンできた！

## コミット＆プッシュ
```
[Client:~]# cd sample
[Client:~]# echo "サンプルだよー" > sample.txt
[Client:~]# git add .
[Client:~]# git commit -m "first commit"
[Client:~]# git push

[git@Server:~]# cd sample.git
[git@Server:sample.git]# git log --oneline
```
ちゃんとプッシュできてるわー
最速でわかったつもりになるReact / Vue.js / Angularの違い

| フレームワーク・ライブラリ | 特徴 | 
|:-----------------|:------------------|
| React | Scriptの中にHTMLを書く |
| Vue.js | HTMLの中にScriptを書く |
| Angular | HTMLとScriptを分けて書く |

※ js, jsx, tsを `Script` と書いてます。

# コードサンプル
公式チュートリアルから当該箇所のみ抜粋。

## React
Scriptの中にHTMLを書く。

```index.jsx
ReactDOM.render(
  <h1>Hello, world!</h1>, // Scriptの中にHTML
  document.getElementById('root')
);
```
https://reactjs.org/docs/hello-world.html

## Vue.js
HTMLの中にScriptを書く。

```index.html
<div id="app">
  {{ message }}
</div>
<script> // HTMLの中にScript
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})
</script>
```
https://vuejs.org/v2/guide/

## Angular
HTMLとScriptを分けて書く。

```welcome.component.ts
@Component({
  templateUrl: './welcome.component.html', //ここでHTMLを呼び出し
})
export class WelcomeComponent {
  message: string = 'Hello World!'
}
```

```welcome.component.html
<div>{{message}}</div>
```

https://angular.io/tutorial/toh-pt1 をベースに改変。

# まとめ
これを応用すると「Reactはフロントエンドエンジニアが強いチームに向いてる」とか、「Angularはチームで作業するのに向いてる」などと知ったように言えるのでおすすめ。

## おまけ
ちなみに私はAngularをベースにしたモバイルアプリケーションフレームワーク「Ionic Framework」を使っています。Webアプリケーションだけではなく、iPhone/Androidアプリもリリースできておすすめです。

![ionic-lab.png](https://qiita-image-store.s3.amazonaws.com/0/100460/09a93973-a6a3-f2de-da16-f35cca63b6f6.png)

参考　[Ionicでのアプリ開発の始め方](https://qiita.com/clown0082/items/5405c53eb955f985edda)

それでは、また。
GIMPで作成した画像をUnityにインポートすると透明部分が黒塗りになってしまう時の対処法

# 動作環境
Unity 2018.2.9f1 Personal
GIMP 2.10.6

## 事象
GIMPで下図のように透明レイヤに描いていても…
![GIMPスクショ.JPG](https://qiita-image-store.s3.amazonaws.com/0/205347/3481996c-ef00-1b0c-304b-e2ce7362be32.jpeg)

Unityにインポートすると透明部分が黒く塗りつぶされてしまう。
![UnityBeforeResolve.JPG](https://qiita-image-store.s3.amazonaws.com/0/205347/292c8ba0-22be-2a03-14e7-796bccf639c2.jpeg)


## 対処法
一度黒塗りのままインポートして、インポートした画像のInspectorViewから「Texture Type」を「Sprite(2D and UI)」に設定。
![SelectTextureType.png](https://qiita-image-store.s3.amazonaws.com/0/205347/f8a7485c-f8dc-bce6-0524-3e5b47fd9c8c.png)

ね？簡単でしょ？
![UnityAfterResolve.JPG](https://qiita-image-store.s3.amazonaws.com/0/205347/a60fc1e8-fd56-38c4-abc1-e7b5e7c469b0.jpeg)
GitLab 11 の初期設定でFirefoxではrootのパスワードが設定できない

CentOS 7に、GitLab 11.3をインストールして、
URLにアクセスして、rootのパスワードを初期設定しようとしたところ、

422 The change you requested was rejected.

というエラー。

GitLabで422 The change you requested was rejected. の解決方法  |  urashita.com 浦下.com (ウラシタドットコム)
https://urashita.com/archives/7067

では、

Firefox の履歴、Cookie、キャッシュの削除

とのことでしたが、それをやっても上手くいかず、

Chromeでやったらイッパツでした。

なお、Internet Explorer 11 もダメでした。
Emacs:Scratchバッファの保存と復元


## 目的

- Scratchバッファはkillさせない
- Scratchバッファーの内容を保存して再起動時に復元する

上記を実現させるための Emacs-lisp は、沢山紹介されていますがMELPAのpackageをInstallするだけで簡単に導入できるので紹介します。

## unkillable-scratch

````lisp
;; unkillable-scratch
(setq unkillable-buffers '("^\\*scratch*\\*$" "^\\*dashboard\\*$"))
(unkillable-scratch 1)
````
scratchバッファをkillさせないためのものですが、正規表現マッチを追加することで自由にカスタマイズできます。私の場合は、dashboardも消さないように追記しています。

## persistent-scratch

````lisp
;; Persist and save/restore *scratch* buffer
(persistent-scratch-setup-default)
````
scratchバッファの内容を保存して再起動時に復元させるものです。保存データーはデフォルトで````~/.emacs.d/.scratch````に保存されます。
babel7でのstage-xの定義を知る

stage-0系のpresetであるbabel-preset-stage-0をBabel6からBabel7に上げようとして次のエラーに遭遇した。
[Removing Babel's Stage Presets
](https://babeljs.io/blog/2018/07/27/removing-babels-stage-presets)

```
As of v7.0.0-beta.55, we've removed Babel's Stage presets.
Please consider reading our blog post on this decision at
https://babeljs.io/blog/2018/07/27/removing-babels-stage-presets
for more details. TL;DR is that it's more beneficial in the
  long run to explicitly add which proposals to use.

For a more automatic migration, we have updated babel-upgrade,
https://github.com/babel/babel-upgrade to do this for you with
"npx babel-upgrade".
```

ざっくりというとコミュニティとか団体とか時代の変化とかでstage-0とかstage-1とかどの機能の範囲まで指しているかわからないよね、だからちゃんと機能別にプラグインで入れてねってことらしい。
以下、stage別にどのプラグインが対応しているかの対応表

```json
{
  "plugins": [
    // Stage 0
    "@babel/plugin-proposal-function-bind",

    // Stage 1
    "@babel/plugin-proposal-export-default-from",
    "@babel/plugin-proposal-logical-assignment-operators",
    ["@babel/plugin-proposal-optional-chaining", { "loose": false }],
    ["@babel/plugin-proposal-pipeline-operator", { "proposal": "minimal" }],
    ["@babel/plugin-proposal-nullish-coalescing-operator", { "loose": false }],
    "@babel/plugin-proposal-do-expressions",

    // Stage 2
    ["@babel/plugin-proposal-decorators", { "legacy": true }],
    "@babel/plugin-proposal-function-sent",
    "@babel/plugin-proposal-export-namespace-from",
    "@babel/plugin-proposal-numeric-separator",
    "@babel/plugin-proposal-throw-expressions",

    // Stage 3
    "@babel/plugin-syntax-dynamic-import",
    "@babel/plugin-syntax-import-meta",
    ["@babel/plugin-proposal-class-properties", { "loose": false }],
    "@babel/plugin-proposal-json-strings"
  ]
}
```

ちなみに以下Babel6→Babel7にあげたときの対応表
各種presetとpluginsがbabel本体のリポジトリに取り込まれている

・"babel-core": "^6.26.0" → "@babel/core": "^7.1.0"
・"babel-loader": "^7.1.2" → "babel-loader": "^8.0.2"
・"babel-plugin-transform-decorators-legacy": "^1.3.4" → "@babel/plugin-proposal-decorators": "^7.1.0",
・"babel-plugin-transform-react-jsx": "^6.24.1" → "@babel/plugin-transform-react-jsx": "^7.0.0"
・"babel-polyfill": "^6.26.0" → "@babel/polyfill": "^7.0.0",
・"babel-preset-env": "^1.6.1" → "@babel/preset-env": "^7.1.0"
・"babel-preset-react": "^6.24.1" → "@babel/preset-react": "^7.0.0"
・"babel-preset-stage-0": "^6.24.1" → 消去

babel関連パッケージをbabel7にあげてくれるツール使うと楽にアップグレードできる
[babel-upgrade](https://github.com/babel/babel-upgrade)
at coder beginner 040

B
高橋君は大きさ 1 メートル四方のタイルを n 枚持っています。
高橋君はこれらのタイルのうちいくつかを、重ならないように隙間なく並べて大きな長方形を作ろうとしています。
出来上がる長方形はできるだけ正方形に近いほうがよいですが、同時に、使わずに余るタイルの枚数ができるだけ少なくなるようにしたいと考えています。
長方形の縦と横の長さの差の絶対値と、余ったタイルの枚数の和を最小でいくつにできるでしょうか。

```
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int n;
	cin >> n;
	int a, b;
	int e = 1000000;
	for ( a = 1; a <= n; ++a) {
		for (b = 1; a*b <= n;b++) {
			int c = abs(b-a);
			int d = n - a*b;
			e = min(e, c + d);
		}
	}
	cout << e << endl;
	return 0;
}
```
これで通った-。結構つらかったけどこんなので時間かかってるようじゃまだまだやな

C
N 本の木の柱が左から右へ一列に並んだアスレチックがあります。左から i 本目の柱の高さは ai センチメートルです。
高橋君は左から 1 本目の柱からスタートし、右へ柱を渡っていき N 本目の柱まで行こうとしています。
高橋君がある柱にいるとき、次には現在の柱から 1 個もしくは 2 個右にある柱のどちらかへ移動することができます。
移動するときには、現在いる柱の高さと、移動後の柱の高さの差の絶対値のぶんだけコストがかかります。
N 本目の柱まで行くとき、コストの合計の最小値はいくらになるでしょうか。
制約
2≦N≦100,000
0≦ai≦10,000
ai はすべて整数である。

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<list>
#include<cmath>
#include<map>
using namespace std;
using ll = long long;
const int MC = 3010;
#define rep(i,n)for(int i=0;i<n;++i)
#define p pair<int,int>
int main() {
	int N;
	cin >> N;
	int a[100100];
	int dp[100100];
	for (int i = 0; i < N; ++i) {
		cin >> a[i];
	}
	dp[0] = 0;
	dp[1] = abs(a[1] - a[0]);
	for (int i = 1; i < N-1; ++i) {
		dp[i + 1] = min(dp[i] + abs(a[i + 1] - a[i]), dp[i - 1] + abs(a[i + 1] - a[i - 1]));
	}
	cout << dp[N-1] << endl;
	return 0;
}
```
初歩的なdp
CUDA Toolkit 10.0 インストール手順

# インストール環境
・Windows 7 Professional 64bit
・Intel Corei7-3770K
・16GB RAM
・Geforce GTX 780
・Visual Studio 2017 Version 15.7.0

# Step 1. GPUの確認
ここにアクセスし、GPUがCUDAを使えるかを確認する。
Compute CapabilityはCUDAで使える機能の豊富さだとでも思っておけばよいです。
https://developer.nvidia.com/cuda-gpus

# Step 2. ダウンロード
以下からCUDA Toolkit 10.0をダウンロードしてきます。
https://developer.nvidia.com/cuda-downloads

「Windows」を選択。
![WS000000.png](https://qiita-image-store.s3.amazonaws.com/0/92978/5cfeebd5-fd08-4a02-0fd7-1142fba5b683.png)
「7」を選択。
![WS000001.png](https://qiita-image-store.s3.amazonaws.com/0/92978/20ed15cf-9932-2dcc-a62c-d684c816180c.png)
「exe(local)」を選択(exe(network)でも、特に問題ないと思いますので、こちらはお好みでどうぞ)。
![WS000002.png](https://qiita-image-store.s3.amazonaws.com/0/92978/3927c486-1221-d816-4a98-2a4038a05e87.png)
「Download」を選択。
![WS000003.png](https://qiita-image-store.s3.amazonaws.com/0/92978/612e0640-c4da-c007-f1df-fea5631dce34.png)

# Step 3. インストール
ダウンロードしてきた「cuda_10.0.130_411.31_windows.exe」を実行し、
解凍します(解凍パスは一時的ものなので、どこでもよいです)。
使用許諾をよく読み「同意して続行する」をクリックします。
![WS000004.png](https://qiita-image-store.s3.amazonaws.com/0/92978/6a3449e0-a6a2-6e53-70b3-d8758633124d.png)
「カスタム」を選択し、「次へ」を押す。
![WS000005.png](https://qiita-image-store.s3.amazonaws.com/0/92978/dee96a84-a082-e121-4d2a-361722e229ce.png)
CUDAのみだと後からの、インストール確認でエラー出ます。なので、最低でも、CUDA, Driver componentsにチェックを入れてください。
チェック後、「次へ」を押す。
![WS000006.png](https://qiita-image-store.s3.amazonaws.com/0/92978/1aeffaff-774a-7c84-d56d-44a3567f02d0.png)
「次へ」を押す。
![WS000007.png](https://qiita-image-store.s3.amazonaws.com/0/92978/0cf03538-8f41-5943-9f3c-78fd316b2465.png)
インストール後のサマリが出る。「次へ」を押す。
![WS000008.png](https://qiita-image-store.s3.amazonaws.com/0/92978/6afadb0a-3f7f-ec73-2326-58d59313d1c4.png)
「閉じる」を押す。これでCUDA 10.0のインストールは完了！
![WS000009.png](https://qiita-image-store.s3.amazonaws.com/0/92978/88cb671a-1d9b-dee6-4a31-c16c3f3fea73.png)

# Step 4. インストール確認
下記フォルダにある「deviceQuery_vs2017.vcxproj」をVisual Studioで開く。
`C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.0\1_Utilities\deviceQuery`
その後、ソリューション構成をRelease>deviceQueryを右クリック>ビルドで、次のフォルダにdeviceQuery.exeができます。
`c:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.0\bin\win64\Release`
コマンドプロンプトを開き、次のコマンドを実行。
`"c:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.0\bin\win64\Release\deviceQuery.exe"`
Result = PASSになっていれば、OK。

# トラブルシューティング
- deviceQueryをビルドしたら、大量のエラーが出てきた！<br>(主にヘッダーファイル関連)
    - メニューバーのツール>ツールと機能を取得>個別のコンポーネントタブを選択>Windows ユニバーサル CRTにチェックが入っているか確認する。
    <br>チェックが入っていなければ、チェックを入れてインストールする。
    - インストールしても同じエラーが出る場合は、ソリューションのプロパティ>VC++ ディレクトリ>インクルード ディレクトリに下記パスを入れる。<br>`C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\ucrt`<br>Visual Studioで前のバージョンのSKDを指定してたりすると、SKDバージョンのエラーが出るので、ソリューションを右クリックし、プロジェクトの再ターゲットをすることでエラーが消えます。
- deviceQuery.exeを実行したら、Result = FAILになった。主に下記エラー内容。

```
deviceQuery.exe Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

cudaGetDeviceCount returned 35
-> CUDA driver version is insufficient for CUDA runtime version
Result = FAIL
```
これは、CUDA driverのバージョンが低いとこうなってしまう。
Nvidia コントロールパネル>ヘルプ>システム情報>コンポーネントを確認して、NVCUDA.DLLが10.0以下だと上記エラーになる。これは、基本的にインストール時に、Driver Componentsをチェックしておくことで防げます。チェックし忘れていたら、もう一度入れ直せば、OKです。
Python3 忘備録 リスト その2

## リスト値の整理
Python3 でリストに格納した値を整理したい場合、`sort()` メソッドを利用する。

```Python
chars = ["b", "a", "c"]
chars.sort()　# chars は ["a", "b", "c"] になる。

numbs = [100, 1, 10]
numbs.sort() # numbs は [1, 10, 100] になる。

mixed_chars = ["a", "A"]
mixed_chars.sort() # mixed_chars は ["A", "a"] になる。
```

`sort()` メソッドは1度に1つの型しか対象にできない。[100, "a"] など複数の型の場合 TypeError になる。

### リスト値を逆順に整理する
`sort()` メソッドに `reverse=true` の引数を与えると、逆順で整理が出来る。

```Python
numbs = [100, 1, 10]
numbs.sort(reverse=True) # numbs は [100, 10, 1] になる。
```

## 一時的な値の整理
`sort()` メソッドを利用すると、そのリストの値の順番が完全に変わってしまうが、`sorted()` 関数を使うと一時的な順番整理が行える。

```Python
chars = ['b', 'a', 'd', 'c']
print(sorted(chars)) # ['a', 'b', 'c', 'd']
print(chars) # ['b', 'a', 'd', 'c']
chars.sort()
print(chars) # ['a', 'b', 'c', 'd']
```

`sorted()` 関数にも `reverse=True` が利用出来る。

```Python
chars = ['b', 'a', 'd', 'c']
print(sorted(chars, reverse=True)) # ['d', 'c', 'b', 'a']
```

## インデックスを基準に値を逆順にする
`reverse()` メソッドを利用すると、リストのインデックスを逆順にして値を再配置する。

```Python
numbs = [100, 1, 10]
numbs.reverse() # リストは [10, 1, 100] になる。
```
Word コマンドマクロの出力、実行

#そのまえにまた英語しか出ないんだけど何をやっているんだ公式は
##Egde+アドインかChromeで日本語が出る
Edgeが最適化といいながらこの状況。しかもたまに翻訳ができない。EdgeもChromeもページ単位だと失敗する場合がある。

Docs / Office VBA Reference / Word / Object Model / Application Objcect Method ListCommands
[Application.ListCommands Method (Word)](https://docs.microsoft.com/ja-jp/office/vba/api/word.application.listcommands)
新しい文書を作成し、Word コマンドおよび関連するショートカット キーとメニューの割り当てのテーブルを挿入します。
Syntax
Application .ListCommand ListAllcommands

Parameter
ListAllCommands 必須 True (-1) ですべてのコマンドとその割り当て、‎‎False‎‎（0）、ユーザー設定の割り当てコマンドだけが含まれます。

Example
‎この例は、すべて Word コマンドおよび関連するショートカット キーとメニューの割り当ての一覧を表示する新しい文書を作成します。印刷し、変更を保存しないで文書を閉じます。

```vb
Sub WrietListCommansNewDocument()
'Macroの記録で出力
'For Word
  Application.ListCommands ListAllCommands:=1
  'Application.Run MacroName:="ListCommands" 'コマンド一覧だが、コマンド一覧という名前ではエラーになる
  Windows("文書 2").Activate
  '68ページくらい出力される
  'なので公式は改変
End Sub
Sub PrintOutWordCommandList()
'For Word
Dim wd As Word.Document: Set wd = ThisDocument
Application.ListCommands ListAllCommands:=True
With ActiveDocument
 .PrintOut Background:=True, From:=1, To:=1 '1ページだけ出力されるように調整
 .Close SaveChanges:=wdDoNotSaveChanges
End With

Sub PrintOutWordCommandList()
'For Word
Dim wd As Word.Document: Set wd = ThisDocument
Application.ListCommands ListAllCommands:=True
With ActiveDocument
 .PrintOut Background:=True, From:=1, To:=1 '1ページだけ出力されるように調整
 .Close SaveChanges:=wdDoNotSaveChanges
End With
End Sub
```


## 出力が日本語で使えない
こんな感じだが、英語の名前が出ない。英語名がわからないとApplication.runで実行できない。
この時は、英語ではなく、必要な命令をQATに登録しようとして確認する。

|コマンド名|補助キー|キー|
|:----------:|:------:|:-----:|
|{[LTR マクロ] ダイアログ ボックス	| | |
|戻る|Alt+Ctrl+	|Z|

#参考

[How to List All the Commands Available in Word -LifeWire ](https://www.lifewire.com/listing-all-commands-available-in-word-3539743)
出力方法はこちらを参考にした。

[Wordの「コマンドマクロ」一覧 谷本玲大氏のページ](http://tanimoto.to/comp/WordCommandMacrosList.html)
[コマンドマクロ一覧(Word 2013 Customer Preview) 初心者備忘録](https://www.ka-net.org/blog/?p=2194)
レイキャストを使用した3D射撃スマホゲームの開発

# 動作環境
Unity 2018.2.9f1 Personal

# Raycast関数の使い方
### Raycastの呼び出し方
```Physics.Raycast(Vector3 origin,Vector3 direction,out RaycastHit hitInfo, float distance, int LayerMask);```

### 引数の概要
1. origin: Rayの始点の座標
2. direction: Rayの方向
3. hitInfo: ヒットしたオブジェクトの情報
4. distance(オプション): Rayの距離(default=Infinity)
5. LayerMask(オプション): 指定したLayerのオブジェクトに特別な処理をさせる。(例: コリジョン判定を無視するなど)

### Tip
第1引数及び第2引数を下記のように纏めて変数に格納し、代入する方法もあるよう。
```Ray myRay = new Ray(Vector3 origin, Vector3 direction);
myRay = (始点となるオブジェクトのPosition)
Physics.Raycast(myRay,out RaycastHit hitInfo, float distance, int Layer Mask);```
Glitch上で多人数編集しながらローカル開発もする

# Glitchとは

[これ](https://glitch.com/)

簡単にWebサービスを立ち上げて公開出来て、Web上のエディタで多人数編集も出来る便利サービス。
今回はこのサービスを使って多人数編集もしつつ、GitHubでソースも管理したいと思ったのでメモ。

# やったこと

- masterブランチが更新されたらCI経由でGlitchへデプロイ
- Glitch上のコードをダウンロードしてきてローカルリポジトリへ反映

サンプルリポジトリ： https://github.com/sisisin-sandbox/try-glitch

# 前置き

GlitchはAPIが叩けますが、ドキュメンテーションされてません
使い方は開発者ツールを開いて、GlitchのUIから各種ボタンを押したときに発生してる通信をもとに調べる、といったことをやっているのでいつ壊れてもおかしくないと思います

# やったこと解説

## masterブランチが更新されたらCI経由でGlitchへデプロイ

ここらへん： https://github.com/sisisin-sandbox/try-glitch/blob/master/.circleci/config.yml#L34

`/project/githubImport` というエンドポイントを、`authorization` , `projectId` , `repo` というクエリパラメータと共にPOSTで叩けば `repo`のソースコードをそのまま `projectId`のプロジェクトへインポートします。そのまんまですね。

`.glitchignore` みたいな設定ファイル作ってインポート時に特定のファイルは除外、みたいなことが出来るかどうかはちゃんと調べてません


## Glitch上のコードをダウンロードしてきてローカルリポジトリへ反映

ここらへん： https://github.com/sisisin-sandbox/try-glitch/blob/master/dl.sh#L3

`/project/download/` というエンドポイントを、　`authorization` , `projectId`　というクエリパラメータと共にGETで叩けばgzファイルが落ちてきます。
これを解凍すると、 `app/`ディレクトリ以下にGlitchのプロジェクト内のファイルが全て配置されているので、このファイル群をリポジトリに `cp`で移動する、という泥臭い感じのことをやってます。。

実際に運用してないので多分問題出る気はしてますが、まあ一旦実現出来たからいいかなと。
chromeで英語の検索結果を優先表示させる方法

chrome で英語で検索した時　日本語記事より英語記事の方が先にヒットして欲しいですよね？！

特にstackoverflowがヒットして欲しいのに日本語の記事ばっかりヒットしてしまうと萎えます。

#### chrome で英語の検索結果を優先表示させるためには

macの設定　-> 言語と地域　->優先する言語　

ここで英語を選択して最優先に表示させるようにする

※最初　chromeの言語設定を英語に変更にすればいいと思っておりましたが変更してもやはり日本語の方が先にヒットしてしまったのでこの方法を使うことにしました。
Nodejsのコンソールに色付け

## Color一覧
```
const Reset = '\x1b[0m';
const Bright = '\x1b[1m';
const Dim = '\x1b[2m';
const Underscore = '\x1b[4m';
const Blink = '\x1b[5m';
const Reverse = '\x1b[7m';
const Hidden = '\x1b[8m';

const FgBlack = '\x1b[30m';
const FgRed = '\x1b[31m';
const FgGreen = '\x1b[32m';
const FgYellow = '\x1b[33m';
const FgBlue = '\x1b[34m';
const FgMagenta = '\x1b[35m';
const FgCyan = '\x1b[36m';
const FgWhite = '\x1b[37m';

const BgBlack = '\x1b[40m';
const BgRed = '\x1b[41m';
const BgGreen = '\x1b[42m';
const BgYellow = '\x1b[43m';
const BgBlue = '\x1b[44m';
const BgMagenta = '\x1b[45m';
const BgCyan = '\x1b[46m';
const BgWhite = '\x1b[47m';
```

## 使い方
文字の前に色コードを入れるだけ、複数色もできます、最後にResetする

```js
console.log(`${FgRed}This is Red.${FgBlue}This is Blue.${Reset}`);
```
Windowsメモ帳のメニュー と viエディタコマンドの対応

# Windowsメモ帳のメニュー と viエディタコマンドの対応 #
（一部）

## ファイル ##
### 新規 ###
GUIのテキストエディタなどと違い、原則として、ファイル名がつかない状態での編集はしないので、注意。

	:e 新ファイル名
### 開く ###
	:e 既存ファイル名
### 上書き保存 ###
	:w
### 名前を付けて保存 ###
	:w 新ファイル名

### （参考）カレント行に別ファイルの内容を読み込み ###
	:r 別ファイル名


### 終了 ###
#### 編集結果を保存して終了 ####
	:wq
#### 編集結果を破棄して終了 ####
	:q!
#### （編集していない場合）終了 ####
	:q


## 編集 ##
### 元に戻す ###
	u
### 切り取り ###
#### カーソル位置の文字を切り取り ####
	x
#### カーソルの前の文字を切り取り ####
	X
#### カレント行を切り取り ####
	dd
### コピー ###
#### カレント行をコピー ####
	yy
#### カーソル位置の文字をコピー ####
	yl
### 貼り付け ###
#### カーソル位置／カレント行の前に貼り付け ####
	P
#### カーソル位置／カレント行の後に貼り付け ####
	p
### 削除 ###
#### カーソル位置の文字を削除 ####
	x
#### カーソルの前の文字を削除 ####
	X
#### カレント行を削除 ####
	dd
### 検索 ###
#### 後方検索 ####
	/文字列
#### 前方検索 ####
	?文字列
#### 次を検索 ####
	n
#### 逆方向に検索 ####
	N
### 置換 ###
#### ひとつめの文字列Ａを文字列Ｂに置換 ####
	:%s/文字列Ａ/文字列Ｂ/
#### 文字列Ａを文字列Ｂに全置換 ####
	:%s/文字列Ａ/文字列Ｂ/g
#### （参考）カーソル位置の文字を■に置換 ####
	r■
Sketchで画像からgifアニメを作成

##概要
ちょっとしたgifが欲しいなと思った時にブラウザのフリーのgif作成ツールを使ったら背景が透過にならなかったり、画像がボケたりとあまり上手いこといかなかったのでSketchでできれば良いなと思って調べたら簡単に作れるExport MoreというPluginがあったのでメモ

##プラグインの追加

- [Export More](https://github.com/nathco/Export-More)のインストール
    - Export-More-master.zipをダウンロードして開く
    - Export-More.sketchpluginをダブルクリックでpluginがインストール
    

##使い方

1. Insert　→　Artboardでアートボードを作成
2. Artboardを画像の枚数分コピペで作成
3. Artboardの名前をXXX01, XXX02, ...(XXXは任意の名前) のように画像が表示される順に番号付きで名前を付ける
4. Artboardにアニメーションする画像を作成
<img width="1017" alt="スクリーンショット 2018-09-24 15.14.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/172740/060dafca-fb60-dd27-9d28-1f84029c4f40.png">

5. Plugins → Export More →　Artboards to GIF
6. Loopするかどうか、表示秒数を選択し、保存

##完成
Frame Rate 100ms          
![loading_star.gif](https://qiita-image-store.s3.amazonaws.com/0/172740/3e327094-738c-f45d-bb93-ad19288b9166.gif)

Frame Rate 200ms
![loading_star_200.gif](https://qiita-image-store.s3.amazonaws.com/0/172740/86fd7d41-ad97-e7d8-f396-4b152415eeef.gif)


参考
[Export More公式](https://github.com/nathco/Export-More)
Wekanの設定（メールとWebhook送信）

# 概要
dockerにあるWekanからメールとwebhookを送れるようにします。

# メール
メールを使いたいときはコンテナ作る時にMAIL_URLとか設定してねとあるがうまくいかなかった。
しかしふと設定画面が普通にあることに気付いた。
![mail1.png](https://qiita-image-store.s3.amazonaws.com/0/227756/341e86f0-a683-23e8-d1d2-cfb51a069af9.png)
ここから↓
![mail2.png](https://qiita-image-store.s3.amazonaws.com/0/227756/f159b8c2-fdc6-5222-8bcd-f097a28aaa00.png)
今回はsmtpはdockerのホストです。ローカルでやるので認証もなにもなしなパターン。SMTPサーバーのアドレスにIPアドレスを書くと怒られるっぽいです。
一通り書いて"Send a test email to yourself"をポチればテストできます。送信先はいまログインしているアカウントのアドレスということに注意。

```
[claret@kadath curl]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/claret": 1 message 1 new
>N  1 Wekan                 Mon Sep 24 14:45  18/630   "SMTP Test Email From Wekan"
```

というふうに届きました。

## unable to verify the first certificate とか言われる時
SMTPサーバーのアドレスに```?ignoreTLS=true```を付けてみてください。私はそれで解決しました。
（公式のドキュメントには環境変数でなんとかと書いてあるが……）

# webhook = Mattermost連携
別々のコンテナであるWekanからMattermostにwebhookを送ります。
WebhookでMattermostに繋げる基本的な方法は省きます。GitLabとかと同じです。WekanとMattermostを連携したいと思う人はマニアックでその程度は知っていると思うので……GitLabとMattermostの連携は下記がわかりやすかったです。

> [CI/CD関連ツールを連携する - Mattermostへの通知編 -](https://qiita.com/kazuki43zoo/items/e91c1aec8dac0b6b3bb7)

しかし私にはよくわからないですが、GitLabもそうでしたが、ホストのインターフェースを使ったローカルIPアドレスでの指定では相手のポートとうまく通信できないみたいな雰囲気なので、docker network connectでmattermostがいるdocker networkにWekanをつなげておいてください。
そして設定したいボードを開いた状態で右上の三本線ボタンを押します。発信Webフックを押します。
![hook1.png](https://qiita-image-store.s3.amazonaws.com/0/227756/83003481-220d-c22a-f0b8-374b8fa42dfa.png)
ここでURLにwebhookのURLを入力します。上記のようにdocker networkで接続する場合はURLを調整してください。
![hook2.png](https://qiita-image-store.s3.amazonaws.com/0/227756/62621937-17c6-00cb-7149-efd567254c57.png)
うまくいけば登録後にタスクを足すことで、webhookを作成したChannelに通知が飛びます。

```
claret BOT
2:46 PM claret added "ぴよぴよ" to "ほげ"
http://192.168.10.105:58082/b/ZwQiLhbdfMxP6hn4F/board/PgQN3AzeFkJ6sA53W
```

ChromeだとURLをぽちっても灰色の画面にしかならないのは、ご愛敬というべきか……。

# 補記
## postfixは必要か？
不要っぽいです。
止めてたり削除してみたりしましたがメールは送れました。
ところでメールの送信テストでEHOSTなんとかってエラーが出ることがあります。（もう一度見ようと思ったら出なかった……）。
このときはSMTPサーバーのアドレスの後ろに":25"とかポート番号を書いてみると良いかもしれません。
新米SEのExcel Tips ①

#はじめに
筆者は4月からこの業界に入ったばかりの新人です。
Markdown記法の勉強も含めて、現場で身に着けた必要だと思うテクニックを備忘録がてらに書きます。

正直、先輩方からすれば「そんなの当たり前だろ」や「こんなことも知らないのは論外」
といった感じにはなってしまいますが、ほどほどに見守って頂ければと思います。
(ちなみに筆者はシート移動のショートカットすら知らなかったレベルです)

同じような境遇の新人エンジニアの方の目に留まり、役に立てれば幸いです。

なお、以下で紹介する各項目はMicrosoft Excel 2010,2013,2016で使えるものです。

#1. シート操作に関するショートカット

いきなりですが上で述べたものも含めて操作にまつわるショートカットについて載せておきます。
現場ではシートが何枚もある既存の資料を触る機会は多いので。

|         移動         	|       キー      	|           備考          |
|:--------------------:	|:--------------------:	|:-----------------------:|
| 前(左)のシートへ移動 	| Ctrl + PageUp   	| 長押しで左端のシートへ    	　|
| 次(右)のシートへ移動 	| Ctrl + PageDown 	| 長押しで右端のシートへ   	　|
| シートを再計算       	| Shift + F9      	| 計算式のあるツールなどで必要　|
| 新しいシートを挿入       	| Shift + F11      	| 今いるシートの左に挿入されます |

注意点としてPageUpとPageDownが矢印キー(↑↓→←)と一体化しており、
ファンクションキー(Fn)と同時に押さないと機能しないタイプのPCもあります。

#2. 改ページプレビュー
これは現場によって違うかもしれませんが、
印刷することを考えて成果物には適切な印刷範囲を指定してあげなくてはいけない場合があります。

それが改ページプレビューです。
これを設定することで、図の途中で印刷が別の用紙に分かれたりといったことがなくなります。

【1】改ページプレビュー設定の場所
![2018-09-24_133746.png](https://qiita-image-store.s3.amazonaws.com/0/266259/46b1e6e4-220c-5aef-9503-67ad18c7c2a2.png)
【2】シート(印刷)範囲の設定
![2018-09-24_135109.png](https://qiita-image-store.s3.amazonaws.com/0/266259/cc82af88-02ac-03ef-96a1-c57436889b62.png)
【3】ページ分割
![2018-09-24_140308.png](https://qiita-image-store.s3.amazonaws.com/0/266259/339b8676-f2d9-c626-647f-90d3f94c04b1.png)

雑な説明で恐縮ですが、図の場合も改ページを挿入してあげれば印刷時に切断されなくなります。
あとは印刷せずExcel上で作業しているときにも、どこまでがその書類の範囲かぱっと見で理解しやすい点があるでしょうか。

プレビュー初期状態で現れる青い点線は、単純な等間隔の改ページ位置なのでマズい場所があれば手動で動かしてください。青い太線になります。

#3. 文字列をセルへ分けて格納

これはExcelのテクニックというより周辺知識になってしまいますが、
文字と文字の間に[Tab]が入っているとそれを張り付けた場合自動でセルに分割してくれます。

例としては
**C:\dd\eee\ffff\hhhhh.txt**
というファイルパスの文字列があった場合、

一度テキストエディタの置換機能で
置換前：\\ (正規表現)
置換後：\t (正規表現)
と指定してあげれば\がTabに置き換わります。
↓
**C:^　dd^　eee^　ffff^　hhhhh.txt**

この状態でExcelに張り付けると、Tabのある位置でセルに分けて格納することができます。
ファイルの置き場所を表にまとめるといった作業をする際に覚えておかないと困るので載せておきます。

正規表現は使いこなせれば作業効率が飛躍的にアップする知識だと思います。
が、ここで説明できるボリュームの世界ではなく、自身もまだ浅くしか知らないため今後使えそうなものを見つけたら随時紹介するようにしようかと。。

#おわりに
今回はここまで、次回は条件付き書式などについて書こうと考えています。
拙い内容ですがお付き合い頂きありがとうございました。
python3の結果が"Unicodeencodeerror"だった場合

#自分によく起こること
何故だか知らないけど急に出てくるエラーが以下

nicodeEncodeError: 'ascii' codec can't encode character '\u5ead' in position 0: ordinal not in range(128)

何故かasciiで何かをしているようで、本来はここはutf-8であるべき箇所

以下のコマンドで少なくとも一時的に解消される。

export LC_ALL=ja_JP.UTF-8
export LANG=ja_JP.UTF-8
C#でFTP/SFTP機能を作る方法のまとめ

Unity上でFTP/SFTP機能を扱えるようにしたかったので、作り始めると自分の無知さと知見が溜まったことからこの記事を書こうと思いました。

**[注意点]**
C#の話しが出て来ますが、UnityのC#ではなく、**.NETのC#**として捉えてからUnityだと...という解釈をお願いします。

## 環境について
* MacBookPro 13
    * macOS High Sierra 10.13.3
    * 使ったFTPクライアントのアプリ
        * Cyberduck
    * **Unity 2017.4.5f1**
        * .NET 4.6
* **（FTP）Docker**
  * Ubuntu 16.04.5 LTS
* **（SFTP）GCP VMインスタンス**
  * Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-1018-gcp x86_64)

## 概要について
環境の概要ですが、[GCPのVMインスタンスに対してFTP（File Transfer Protocol）を最初していて、途中からSFTPでしか接続できないことが分かりました](https://qiita.com/gremito/items/d53560e3cd4a3b1acbe8)笑汗

なので一旦、FTP接続のサーバ側のテストに関しては、Dockerを使ってローカルにほぼほぼGCPと同じ環境を用意して、確認作業できるようにしました。

### DockerでFTPサーバを用意する方法について
最初は、 @nononote さんの[DockerでFTPサーバーやSFTPサーバーをたてるのーと](https://qiita.com/nononote/items/97905699bea0d9092b0f)を参考に作ろうとしていましたが、環境が違いすぎるので問題が起きた時のキャッチアップが面倒になるなぁと思い、途中からGCPと同じ環境を用意したいと作業を切り替えました。

そのため、[@engineer_osca](https://twitter.com/engineer_osca)さんの[DockerでUbuntu 16.04 LTSのイメージを利用してみよう](https://weblabo.oscasierra.net/docker-ubuntu1604/)を参考に用意しましたー

だがしかし、Ubuntuでvsftpdを用いたFTPサーバの構築が面倒なのですよねぇ...
いろんな記事を参考に設定しているもののなぜか

```
# service vsftpd start
 * Starting FTP server vsftpd
 * vsftpd failed - probably invalid config.
```

という感じでなかなか解決できない状況＾＾;

## C#でFTP
C#でFTPをするとなると無難に以下の2つを使うことになると思います。

- [FtpWebRequest](https://docs.microsoft.com/ja-jp/dotnet/api/system.net.ftpwebrequest)
- [FtpWebResponse](https://docs.microsoft.com/ja-jp/dotnet/api/system.net.ftpwebresponse)

Microsoftが用意しているドキュメントでFTPの実装方法や詳細を解説しているので、`FtpWebRequest`と`FtpWebResponse`の詳細は、[Docs < .NET < .NET Framework < .NET Frameworkのネットワークプログラミング < FTP](https://docs.microsoft.com/ja-jp/dotnet/framework/network-programming/ftp)を見てくださいー

## C#でSFTP
C#のSFTPですが、`FtpWebRequest`と`FtpWebResponse`だけでは実装できません。
名前にあるようにSSHをベースにFTPを実装する必要があるため、別のモジュール・ライブラリを扱う必要があるようです。

今のところ把握していることとしては、

- [sshnet/SSH.NET](https://github.com/sshnet/SSH.NET)
- [SFTP.NET](https://www.sftp.net/client-libraries)
- [Getting SSH.NET to work in Unity](https://answers.unity.com/questions/1484459/getting-sshnet-to-work-in-unity.html)
- [SFTP file upload](https://answers.unity.com/questions/1411931/sftp-file-upload.html)

という感じでできそうな感じはするもののもう少し調査・検証が必要かなという感じです。


## まとめ
一瞬、[C言語のレイヤーからFTP/SFTPの実装](http://x68000.q-e-d.net/~68user/net/c-ftp-1.html)をやろうかと考えましたが、先にすでにあるものを使って実現させて、余力があればすでにあるものがどうやって作られているのか把握する勉強になるのでC言語でのFTP/SFTPの実装をやろうかと考えています笑

さて、元々やりたいこととしては、Unity上でFTP/SFTPが扱えるようにすることなので、エディター拡張関連は全く考えていませんw
なので、先にFTPが実装できたらエディター拡張を作っていこうかと。

進捗があったら記事作るなりアップデートするなりする予定ですー
bundle execとbundle exec rails 〜の違い

bundle execとbundle exec rails 〜の違いがよくわかっていなかったのでメモ。

bundle execをつけるとそのプロジェクト固有の設定でコマンドを打つことができる。ただrailsはもともとプロジェクトルートを読み込んで実行してくれるのでrailsコマンドの場合はさほど違いがない。
PDOでDB接続メモ

#PDOでDBに接続する時の定型文

決まった形なので覚えること。

```ruby:qiita.rb
$dsn = 'mysql:host=サーバー名;dbname=DB名;charset=文字コード';
$user = 'ユーザー名';
$password = 'パスワード';

try{
    $db = new PDO($dsn, $user, $password);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
catch (PDOException $e){
    die('DB接続失敗'.$e->getMessage());
}
```
IoTブレーカー（Obniz＋サーボモーターで遠隔地からブレーカーを落とす）

#概要
玄関にあるブレーカーを遠隔操作で落とせるようにしました。
>スマホ／スマートスピーカー＞obniz>サーボ＞球を落とす＞ブレーカーが落ちる

![LINE_MOVIE_1536745529745_ME-convert-180924.gif](https://qiita-image-store.s3.amazonaws.com/0/181708/27a7edbf-3d62-fce7-2300-bd95d93a43a5.gif)
仕組みは単純で、サーボモーターでボールを押し出しているだけです。
![KIMG3705.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/71d0de7f-fae3-c365-4bc7-c49e5f562eb6.jpeg)

#材料
・Obniz
・サーボモーター
・重りになるボール（今回はテスト用としてガチャガチャのカプセルを使っています）
・紐
・L字金具

#コード
```JavaScript:IoTBreaker.html
<!-- HTML Example -->
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
  <script src="https://unpkg.com/obniz@1.10.0/obniz.js"></script>
</head>
<body>

<div id="obniz-debug"></div>
<h1>ServoMotor</h1>
<input id="slider" type="range"  min="0" max="180" /><br>
  <button id="on">ON</button>
<button id="off">OFF</button>

<script>
var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  var servo = obniz.wired("ServoMotor", {gnd:0, vcc:1, signal:2});
      servo.angle(45.0); // half position
        await obniz.wait(1000);
      servo.angle(180.0); // 180 position
  
  
    $("#on").on("click",function(){
      servo.angle(45.0); // half position
    });

  
    $("#off").on("click",function(){
      servo.angle(180.0); // 180 position
    });
};

obniz.onclose = async function(){
   $("#slider").off('input');
};
</script>
</body>
</html>
```
Google Cloud Functions を Google Cloud Pub/Sub からトリガーしてみる

# 本記事でやること

`Google Cloud Pub/Sub` から `Google Cloud Functions` をトリガーしてみます。

# 背景

諸事情により Google Cloud Functions を定期実行してみたいと思い調べてみると、この辺りの記事が引っかかりました。

- [Firebase Cloud Functionsで定期実行してみる \- Qiita](https://qiita.com/jun1009/items/4145072dbb243c3edf9f)
- [Google の Cloud Functions で、定期実行する方法を検討・採用する。 \- コワーキングスペース タネマキ](https://tane-maki.net/blog/diary/2018/cloud-functions-google-apps-script/)
- [Google Developers Japan: Cloud Functions for Firebase でジョブをスケジューリング（cron）する](https://developers-jp.googleblog.com/2017/04/how-to-schedule-cron-jobs-with-cloud.html)

なるほど。大きく分けると以下の2パターンがありそう。

1. GCP 内で完結する方法
    - App Engine Cron, Cloud Pub/Sub を使う
2. 外部サービスを使って定期実行してあげる方法
    - HTTP 関数を定期的に叩く

2番目の方法だと、一見簡単そうですが、そのままだと URL さえ知っていれば誰でも叩けることになり、認証の仕組みを入れようとすると面倒臭そうな印象。（参考 : [Cloud FunctionsでIAMを利用する \- Studio Andy](http://studio-andy.hatenablog.com/entry/cloud-functions-iam)）

ということで、今回は1番目の GCP 内で完結する方法を採用してみようと思いました。

まずは `App Engine Cron` は使わずに `Google Cloud Pub/Sub` から `Google Cloud Functions` をトリガーしてみることにしました。

**追記： 今は `Cloud Scheduler` があるので、定期実行に関しては、素直にそちらを使ってあげるのが良さそうです！ => https://cloud.google.com/scheduler/**

# 環境

- macOS High Sierra 10.13.6

```bash
$ gcloud --version
Google Cloud SDK 217.0.0
beta 2018.07.16
bq 2.0.34
core 2018.09.17
gsutil 4.34
```

# Google Cloud Functions を動かしてみる

私は [クイックスタート: gcloud コマンドライン ツールの使用  \|  Cloud Functions のドキュメント  \|  Google Cloud](https://cloud.google.com/functions/docs/quickstart?hl=ja) を参考に Google Cloud Functions 単体で動かしてみました。既に Google Cloud Functions を動かしたことがある人は、飛ばして良いと思います。

# region の設定

東京リージョンに設定します。

```bash
$ gcloud beta functions regions list # 利用できるリージョンの確認
$ gcloud config set functions/region asia-northeast1 # 東京リージョンに設定
$ gcloud config list
[core]
account = xxx@xxx.xxx
disable_usage_reporting = False
project = xxx
[functions]
region = asia-northeast1
```

- 参考
    - [gcloudのconfigの設定変更 \- Qiita](https://qiita.com/munaita_/items/dc1880087fa936757873)

# Google Cloud Functions を Google Cloud Pub/Sub からトリガーしてみる

ようやく本題です。
[バックグラウンド関数  \|  Cloud Functions のドキュメント  \|  Google Cloud](https://cloud.google.com/functions/docs/writing/background?hl=ja) を参考に進めていきます。

`Cloud Pub/Sub の例` を参考に、以下のようにしてみました。

```js
exports.helloPubSub = (event, callback) => {
  const pubsubData = event.data;
  console.log(pubsubData.message);

  callback();
};
```

[Google Cloud Pub/Sub トリガー  \|  Cloud Functions のドキュメント  \|  Google Cloud](https://cloud.google.com/functions/docs/calling/pubsub?hl=ja) を参考にデプロイする。

```bash
$ gcloud beta functions deploy helloPubSub --trigger-resource hello_world --trigger-event google.pubsub.topic.publish 
```

ちなみに

- https://console.cloud.google.com/cloudpubsub
- https://console.cloud.google.com/functions

から、Pub/Sub と Functions が作成されていることを確認できる。

動作確認

```bash
$ gcloud beta functions call helloPubSub --data '{"message":"Hello, GCF!!"}'
```

https://console.cloud.google.com/logs からログに `Hello, GCF!!` が出力されていることを確認できました。
golangでRailsのflash的なものを使う


```ruby
def update
  if @user.save
    redirect_to root_path, notice: "success!"
  else
    render :edit, alert: "failed..."
  end
end
```

このnotice, alertの仕組み(flash)をgolangで書いているwebappでも使いたい。
そして標準パッケージだけで完結させたい。

ということで実装してみた。

## flashにメッセージを登録する場所(handler)

こちらは実際のコードを簡易化させています。(ログインのセッション処理など省略)

```golang
// handler/register.go

func register(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()
	input := &input.Register{
		Name:     r.FormValue("name"),
		Email:    r.FormValue("email"),
		Password: r.FormValue("password"),
	}

	user, err := usecase.Register(input)

	if err != nil {
		flash.SetAlert(w, e.Error()) // 登録
		http.Redirect(w, r, "/", http.StatusBadRequest)
		return
	}


	flash.SetNotice(w, "success!!") // 登録
	http.Redirect(w, r, "/", http.StatusFound)
}
```


## 実際のflash実装

やっていることはシンプルで、

1. リクエストのたびにcookieからflashの情報を削除
    - これをhandlerのwrapperとして実装するのがポイント
2. handlerから受け取ったメッセージをcookieにセット

の２つ.

```golang
// flash.go

package flash

import "net/http"

// 受け取ったhandlerを処理する前に前回のレスポンスでセットしたflashをクリアするwrapper.
func ClearFlashMessage(h http.HandlerFunc) http.HandlerFunc {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		clearCookie(w, "alert")
		clearCookie(w, "notice")
		h(w, r)
	})
}

func clearCookie(w http.ResponseWriter, name string) {
	c := &http.Cookie{
		Name:     name,
		Value:    "",
		Path:     "/",
		HttpOnly: true,
		MaxAge:   -1, // MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'
	}
	http.SetCookie(w, c)
}

type Flash struct {
	Alert     string
	HasAlert  bool
	Notice    string
	HasNotice bool
}

func NewFlashFromCookie(r *http.Request) *Flash {
	var alertMsg string
	alert, _ := r.Cookie("alert")
	if alert != nil {
		alertMsg = alert.Value
	}
	var noticeMsg string
	notice, _ := r.Cookie("notice")
	if notice != nil {
		noticeMsg = notice.Value
	}
	return newFlash(alertMsg, noticeMsg)
}

func newFlash(alert, notice string) *Flash {
	return &Flash{
		Alert:     alert,
		HasAlert:  len(alert) > 0,
		Notice:    notice,
		HasNotice: len(notice) > 0,
	}
}

func SetAlert(w http.ResponseWriter, alert string) {
	setFlash(w, alert, "alert")
}

func SetNotice(w http.ResponseWriter, notice string) {
	setFlash(w, notice, "notice")
}

func setFlash(w http.ResponseWriter, msg string, name string) {
	c := &http.Cookie{
		Name:     name,
		Value:    msg,
		Path:     "/",
		HttpOnly: true,
		MaxAge:   100,
	}
	http.SetCookie(w, c)
}
```