OmniAICreator/Qiita-1.07M huggingface dataset:
form作成の際に便利なinputのtype属性とpreg_match関数

こんにちは。
HTMLやPHPを用いて情報登録フォームなどを作成する際、
入力情報に制限をつけて正確な情報入力をうながす方法があります。
今回は主にinputにつけるtype属性とPHPのif文で使用するpreg_match関数を、
それぞれ一覧でご紹介します。

##inputのtype属性
inputタグはそもそも`<form></form>`に含まれるタグで、
入力や送信をコントロールします。
type属性をつけることでさらに細かい情報の種類を指定することが可能になります。

**text**・・・1行の短いテキストボックスを作成することができます。 
**search**・・・検索用のテキストボックスを作成することができます。
**url**・・・URL用のテキストボックスを作成することができます。
**password**・・・パスワード用のテキストボックスを作成することができます。入力した文字がアスタリスクに変換されます。
**datetime**・・・UTC（協定世界時）の日時を入力する欄を作成することができます。
**date**・・・日付を入力する欄を作成することができます。
**checkbox**・・・チェックボックスを作成することができます。選択肢の中から複数のチェックボックスを選択することができます。
**radio**・・・ラジオボタンを作成することができます。複数の選択肢の中から1つだけ選ぶことができるもので、チェックボックスとは異なります。
**submit**・・・送信ボタンを作成することができます。接続済みのデータベースにこれまで入力した情報を送信します。
**reset**・・・リセットボタンを作成することができます。
**hidden**・・・画面上には表示されない隠されたデータをサーバーに送信する際に使用します。

##preg_match関数
入力された文字データが妥当なものか（正規表現）を判断する際に使われます。

**数値**
入力された文字列が0から9の数字のみで構成されているかをチェックすることができます。
`if (preg_match('/^[0-9]+$/', $data))` 

**英字**
入力された文字列がaからｚまたはAからZの英字小文字・大文字のみで構成されているかをチェックすることができます。
`if (preg_match('/^[a-zA-Z]+$/', $data)) `

**メールアドレス**
入力された文字列が0から9の数字またはaからzの英字と@の組み合わせで構成されているかどうかをチェックすることができます。
`if (preg_match('|^[0-9a-z_./?-]+@([0-9a-z-]+\.)+[0-9a-z-]+$|', $mail)) `

**日本語**
入力された文字列がひらがな、カタカナ、漢字で構成されているかをチェックすることができます。
`mb_regex_encoding("UTF-8");
if (preg_match("/^[ぁ-んァ-ヶー一-龠]+$/u",$name))`


##まとめ
以上、今回はform作成の際に用いられるinputのtype属性とpreg_match関数の代表的なものをご紹介しました。
ここで取り上げたもの以外にも種類がありますので、用途にあったものを調べて使ってみてはいかがでしょうか。
isじゃなくてif

# もしエラーだったら・・・
Excelで私的頻出関数のVLOOKUP関数は、検索対象の文字列が存在しない場合、`#N/A` と表示されてしまい、その関数を含む全ての関数がエラーになる。

それを防ぐために、
「Aがもしエラーだったら、B、正しかったらAをそのまま表示」
のような式を良く書いていた。

```sample.xlsx
IF(ISERROR(VLOOKUP(E3,$B$3:$C$6,2,FALSE)),$C$7,VLOOKUP(E3,$B$3:$C$6,2,FALSE)
```

![長い方.png](https://qiita-image-store.s3.amazonaws.com/0/265477/6e775c2f-972c-b61d-9708-842a22f1385e.png)

# 二回も同じ式を書くのは正直面倒
上記のような単純な式であれば、そこまでの手間は無いが、中には入れ子の入れ子の入れ子のような関数もある。
そんな時に、何度も同じ式を書く。
一発で正解を導き出せれば良いが、何度も修正するときに同じ式にも修正を入れる。
修正を入れ忘れようもんなら、もう何がなんだか状態になる。

そんなことは自明である。

# そこでタイトル ISじゃなくてIF
「Aがもしエラーだったら、B、正しかったらAをそのまま表示」
Aを何度も書くことなく、これを実現できるのが、ISじゃなくてIF。

```sample.xlsx
IFERROR(VLOOKUP(E3,$B$3:$C$6,2,FALSE)),$C$7)
```

![短い方.png](https://qiita-image-store.s3.amazonaws.com/0/265477/f57d26db-c9c7-00c5-88da-643385207a73.png)

これで式も短くなって見やすいし、修正も1回で済む。
もっと早く知りたかった・・・。
CSV


```csv

     0         1      2
お客様管理番号,伝票番号,出荷日
662343224433391,30333333704,2018/11/12
233432244331533,03333337073,2018/11/12
989833432244335,40133333694,2018/11/12
394034322443308,40121158703,2018/11/12
487634322443323,40134455405,2018/11/12
034322443332332,40121158691,2018/11/12

取り出し方

CSV.read(file_path, encoding: Encoding::SJIS, headers: true).each do |row|
  puts row[0], row[2]
end


```
zipコマンドでmacOS用アプリケーション(.app)を圧縮する場合は-yオプションをつける

## 困ったこと

Electronで作成したmacOS用のアプリケーションを「zip -r」コマンドで圧縮して解凍するとファイルサイズがめちゃめちゃ大きくなっている(140MB -> 350MB)

## 原因

アプリケーション内部にシンボリックリンクがあり、「zip -r」で圧縮するとシンボリックリンクが実ファイルに置き換えられてファイルサイズが大きくなる

```shell
$ ls -al Hoge.app/Contents/Frameworks/Electron\ Framework.framework
total 0
lrwxr-xr-x  1 user1  staff    35B 11  8 13:39 Electron Framework -> Versions/Current/Electron Framework
lrwxr-xr-x  1 user1  staff    26B 11  8 13:39 Libraries -> Versions/Current/Libraries
lrwxr-xr-x  1 user1  staff    26B 11  8 13:39 Resources -> Versions/Current/Resources
drwxr-xr-x  4 user1  staff   128B 11  8 13:39 Versions
```

## 解決策

-yオプションをつけてシンボリックリンクを実ファイルに置き換えずに圧縮する

```shell
$ zip -ry Hoge.zip Hoge.app
```
PostgreSQLの同一カラムで部分一致検索を複数行う方法

通常、部分一致の検索を複数行う場合には、以下のようにやるかと思います。

```sql
select * from hoge where name like 'uno%' or name like 'dos%';
```

ですが、カラムが同一であれば、以下のようにまとめることが出来ます。

```sql
select * from hoge where name ~~* any(array['uno%', 'dos%']);
```

更には、副問合せを使ってこんな風にすることも。

```sql
select * from hoge where name ~~* any(select name || '%' from fuga);
```

なかなか便利で、重宝します。
Nextcoudサーバ間でのファイル共有

#はじめに
Nextcloudを使い始めると、基本的にはそのNextcloud内の[ユーザやグループ同士でファイル共有](https://qiita.com/mmisu/items/1a7f66c94ca4d8a66b49)をしますよね。それでアカウントがない社外ユーザなんかは、[URLリンク共有](https://qiita.com/mmisu/items/2b646b39f97ebb74a8f8)で一時的にダウンロードしてもらったりします。今回は、Nextcloudサーバ間でのファイル共有を紹介します。（Nextcloudを利用する企業や団体が増えていけば・・・という事を願って。）

#プラグイン
まず、Federationというプラグインを有効にします。
![画像64.png](https://qiita-image-store.s3.amazonaws.com/0/308127/c655a4e8-ee25-029f-c982-e476b92a46a1.png)

#設定方法
管理者画面の共有設定の下の方に、「統合されたクラウド共有」という項目が追加されています。上から2つの項目にチェックが入っている必要があります。
・ユーザがこのサーバから他のサーバーに共有することを許可する→アウト側
・ユーザが他のサーバからこのサーバーに共有することを許可する→イン側
![画像65.png](https://qiita-image-store.s3.amazonaws.com/0/308127/b2e53790-0f14-76f8-ea57-b933b10ec274.png)
ファイル操作画面に戻りまして、共有したいフォルダやファイルの共有設定画面を表示します。ユーザ名やグループ名を入力する欄に、以下のような形式で入力します。

・ユーザ名＠NextcloudサーバのFQDN

例として、ユーザ名：mmisu、FQDN：nextcloud.stylez.co.jpの場合は、
mmisu＠nextcloud.stylez.co.jp

そうすると、リストにmmisu＠nextcloud.stylez.co.jp（リモート）と候補が表示されますので、クリックします。
![画像66.png](https://qiita-image-store.s3.amazonaws.com/0/308127/e96e7847-5536-455c-6d7d-eac87b6bd28e.png)


普通の共有みたいに、権限も設定できます。
![画像67.png](https://qiita-image-store.s3.amazonaws.com/0/308127/648617f4-b701-f5fe-2b14-3b003f929ffe.png)

次は、共有された相手の方です。共有されたユーザの画面右上のアナウンスアイコンをクリックすると、サーバ間共有された旨の通知がきています。
![画像68.png](https://qiita-image-store.s3.amazonaws.com/0/308127/14c8bd8e-02a7-d06b-dd00-2f6e74b5a35f.png)
Acceptをクリックすると、共有されたフォルダが表示されました。
![画像69.png](https://qiita-image-store.s3.amazonaws.com/0/308127/6ce45609-cf57-1e34-d95d-99a8db66382d.png)

#まとめ
これも昔っからある機能（ownCloud7系の頃から）なのですが、正直あまり使っている人をみたことがないです。でも、これからNextcloudを使う人が増えてきたら、こういう事も日常茶飯事に行われるのかなーなんて夢みたいな事を語ったりして・・・。

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
WindowsのGUIアプリやDLL内からのprintfを画面表示する方法

## AllocConsole()を使います

AllocConsole()を使うとコンソールアプリでなくとも新規にコンソールを開くことが出来ます。
さらに標準出力(標準エラー出力)をそのコンソールに向けることが出来るので、printfデバッグが出来て色々捗ります。

### 例

これはDLLの実装使例です。

```mydll.c
#include <windows.h>
#include <stdio.h>

__declspec(dllexport) void __cdecl Function1(void) {
    printf_s("%s\n", __func__); /* 標準出力 */
    /* または */
    fprintf_s(stdout, "%s\n", __func__); /* 標準出力 */
}

__declspec(dllexport) void __cdecl Function2(void) {
    fprintf_s(stderr, "%s\n", __func__); /* 標準エラー出力 */
}

/* 新規にコンソールを開く */
void CreateConsole(void) {
    FILE* fp;
    AllocConsole();
    freopen_s(&fp, "CONOUT$", "w", stdout); /* 標準出力(stdout)を新しいコンソールに向ける */
    freopen_s(&fp, "CONOUT$", "w", stderr); /* 標準エラー出力(stderr)を新しいコンソールに向ける */
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    switch (fdwReason) {
    case DLL_PROCESS_ATTACH:
        CreateConsole();
        break;
    }
    return TRUE;
}

```

## 参考にしたページ
* [MSDNのAllocConsole](https://msdn.microsoft.com/ja-jp/library/cc429163.aspx)
* [Windows GUIプログラムでデバッグ情報をコンソールを表示させる](http://cammy.co.jp/technical/2016/04/29/windows-gui%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%A7%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%83%85%E5%A0%B1%E3%82%92%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%82%92%E8%A1%A8%E7%A4%BA/)
Unity　uGUIをドラッグで動かしてステージを選ぶ

# Unity　uGUIをドラッグで動かすには

完成イメージです．
![h5fyv-6t500.gif](https://qiita-image-store.s3.amazonaws.com/0/171702/3d21f278-9607-680b-5043-c56104929502.gif)

動かすためには，
IDragHandlerのインターフェースを継承する必要がある．
OnDrag関数はドラッグが発生しているとき，カーソルが移動するたびに呼び出される．

以下のようなスクリプトを作成する．

```
using UnityEngine;
using UnityEngine.EventSystems;

public class SlideController : MonoBehaviour, IDragHandler {

    public RectTransform m_rectTransform = null;

    public void OnDrag(PointerEventData eventData)
    {
        m_rectTransform.position += new Vector3(eventData.delta.x*0.01f, 0f, 0f);
    }
}

```
OnDrag関数のPointerEventData からドラッグのデータを受け取り，動かしたいオブジェクトのRectTransformをいじると動きます．

このスクリプトを動かしたいオブジェクトに着けてRectTransformに自身を入れてあげれば動かすことが可能です．

![スクリーンショット 2018-11-08 13.44.51.png](https://qiita-image-store.s3.amazonaws.com/0/171702/36558972-2bff-b485-ad93-d202f88adfc4.png)
AWS 認定デベロッパー – アソシエイト  (2018 年 6 月リリース)　勉強方法

# はじめに
AWS 認定デベロッパー – アソシエイト  (2018 年 6 月リリース)に合格しましたので、勉強方法を共有します。

## 試験概要
開発者ロールとして初級くらいの認定になります。
模擬試験が用意されており、2000円掛かりますが、試験の雰囲気を知ることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/119101/afe32ecb-7ac9-e1b1-155b-00e90ac7e489.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/119101/29a180b6-9713-308f-db7c-6b3e59db0fed.png)


## 私のレベル
AWSは趣味レベルで2,3年ちょこちょこ触っており、Azure, GCPの資格は持っているという感じです。

- Google Cloud Certified Professional - Cloud Architect
- Azure 70-532
- Azure 70-533
- Azure 70-534

## 受験した感想
難しくはない。GCPと同じくらいの難易度。
lambda, dynamoDB, codebuild, api gateway, cloudwatch, IAMについてある程度知っておけば大丈夫。

# 試験を受けるまでやったこと
以下の流れで3日くらいかけて行いました。合計10〜15時間くらいだと思います。

- 古いほうのサンプル問題見る
- AWS認定ソリューションアーキテクト本読む
- 模擬試験受験
- わからなかったところをググる
- blackbelt、FAQ見る
- 本試験

## 古い方のサンプル問題見る
古いリリースのほうですが、参考にはなると思い一応こちらも見ました。実際参考になるかと思います。

https://d1.awsstatic.com/training-and-certification/docs-dev-associate/AWS%20Certified_Developer_associate_examsample_JP.pdf

## AWS認定ソリューションアーキテクト本読む
有名なこちらの本も一応読んでおきました。
読んでおいたほうが良いと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/119101/4082d210-13b4-8543-e2e6-561048822661.png)

https://www.amazon.co.jp/dp/B01LZ2CBKB/

## 模擬試験
次に模擬試験を受けました。
本番試験を申し込むマイページ的なところで模擬試験の申込みができます。2000円掛かります。
支払いを済ませるとすぐに受験することができ、30分の時間制限内で20問に回答します。
各問題ごとにスクショを撮っておきました。コピペもできるようです。
個々の問題の回答、解説は出ませんが以下のような結果がメールで送られてきます。

```
AWS Certified Developer - Associate - Practice (Released June 2018) を受験いただき誠にありがとうございました。本試験受験前の準備対策のご参考まで、以下の情報をご確認ください。 

総合スコア:  80% 

トピックレベルスコア: 
1.0  Deployment: 75% 
2.0  Security: 100% 
3.0  Development with AWS Services: 85% 
4.0  Refactoring: 66% 
5.0  Monitor and Troubleshooting: 50% 
```

## わからなかったところをググる
模擬試験中で自信がなかったところをググります。大体公式ドキュメントが出てくるのでそのページとリンクが貼られているページを読みました。

## blackbelt、FAQ見る
自信がないサービスについては下記からスライド見たり、そのサービスのFAQを見ました。FAQは結構役立ちます。
https://aws.amazon.com/jp/aws-jp-introduction/

## 本試験
テストセンターで受験しました。AzureやGCPの試験と違って、カメラ付きのPCで受験します（キオスクというらしい）。
席につくとlive chatでIDをスキャンせよと言われます。
キオスクにあるリーダーに免許証をスキャンさせ、次にクレジットカードをカメラに向けて提示します。
終わったら免許証等をしまいます（私は一旦退室してロッカーに戻しました）。
あとは受験するだけですが、受験中も常にカメラ越しに監視されており、両手を机の上に常においておき、顔に手を当ててはいけないそうで、やりにくかったです。
65問、74分で終了しました。
最後に10問くらいアンケートがあり、回答送信すると結果がすぐ表示されます。
結果が表示されたあとはどうしたらいいかわからなかったのですが、右上からログアウトしそのまま退室しました。

# 最後に
全体的に見て難易度は高くない試験だったので、ある程度AWS触ったことがある人なら合格すると思います。
閲覧ありがとうございました。
M5BALAでライントレース （赤外線ライン検出センサー編）

#概要

M5BALA + M5Stack FIRE に赤外線のライン検出センサーを接続しライントレースをさせてみました。

- M5Stack FIRE に赤外線のライン検出センサーを接続
- 線の検出によって左右の回転を制御することでライントレースを行う

##環境

- M5BALA + M5Stack FIRE
- M5UI.Flow (Firmware 0.8.2 で確認)
- ライン検出センサー Seeed Studio Grove Line Finder v1.1

#ライン検出センサーの実装

ライン検出センサーを PORT B に接続し、輪ゴムで固定。センサーの重みで前のめりになるので後ろにも付属のレゴの部品でバランスを取りました。
![IMG_1882.jpeg](https://qiita-image-store.s3.amazonaws.com/0/133064/bbae8e8c-16b4-49df-42af-f940035add36.jpeg) ![IMG_1884.jpeg](https://qiita-image-store.s3.amazonaws.com/0/133064/9edb912d-b9fb-51f5-ea1f-1640519e6b37.jpeg)



#実行例

バランスを取りながらでは、あまり複雑な線のトレースは難しいので、単純なコースですが。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">M5BALAでライントレース、前回よりもちょっと難しく（単純な楕円がひょうたん型になった程度ですが）してみましたが、プログラムはシンプルなものです。左右の動きのパラメータの調整が微妙なところ。<br>「M5BALAでライントレース」<a href="https://t.co/CxOklcLnfH">https://t.co/CxOklcLnfH</a><a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://twitter.com/hashtag/M5BALA?src=hash&amp;ref_src=twsrc%5Etfw">#M5BALA</a> <a href="https://t.co/e2HI0E2eOm">pic.twitter.com/e2HI0E2eOm</a></p>&mdash; 稲澤祐一 (@inasawa) <a href="https://twitter.com/inasawa/status/1060392938788679680?ref_src=twsrc%5Etfw">2018年11月8日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

#M5BALA制御用プログラム

以下のプログラムを M5UI.Flow から実行しました。

```python:m5bala_line_trace.py
from m5stack import *
from m5bala import M5Bala
import i2c_bus
import machine

m5bala = M5Bala(i2c_bus.get(i2c_bus.M_BUS))

# ライン検出センサーを PORT B に接続
ir_rx = machine.Pin(36, machine.Pin.IN)

# スレッドを使うと不安定（途中で止まってしまう）だったので
# スレッドを使わずに動かしました。
#m5bala.start(thread=True)

# 左右の動き＆前進のためのパラメータは実際の動きに合わせて要調整。
line_trace = [15, 50]

while True:
    # センサーの値が 1 (反射無し＝黒線上）
    # センサーの値が 0 (反射有り＝黒線から外れた）
    # センサーが黒線上にあれば左へ、黒線から外れたら右へ
    # 黒線の左側に沿って進む仕組みです
    rx = ir_rx.value()
    if rx == 1:
        m5bala.left  = line_trace[0]
        m5bala.right = line_trace[1]
    else:
        m5bala.left  = line_trace[1]
        m5bala.right = line_trace[0]
    
    m5bala.balance()
```
a_{n+1}=p+q a_n^2の収束発散

$p\ge 0$および$q\ge 0$とします。次の漸化式で定義される数列$a_n$の収束、発散を考えてみます。

```math
\left\{
\begin{array}{lcl}
a_0&=&0 \\
a_{n+1} &=& p+qa_n^2 
\end{array}
\right.
```

# q=0の場合

$q=0$の場合は、$p$に収束します。

```math
\lim_{n\rightarrow \infty} a_n = p
```

# q>0かつpq>1/4の場合

$q>0$かつ$pq>\frac{1}{4}$の場合は、収束しません。
なぜなら、収束するとすると、$\alpha=p+q\alpha^2$つまり$q\alpha^2-\alpha+p=0$を満たす$\alpha$が存在するはずです。しかし、この$\alpha$についての2次方程式の判別式$D$を計算すると次のように負になります。

```math
D=1-4pq<0
```

つまり、$q\alpha^2-\alpha+p=0$を満たす$\alpha$は存在しません。
よって$a_n$は収束しません。では$a_n$の挙動はというと、$a_n\ge np$なので$\lim_{n\rightarrow \infty}a_n=\infty$です。

# q>0かつpq≤1/4の場合

この場合は$\frac{1-\sqrt{1-4pq}}{2q}$に収束しますので、以下で示します。

まず、$\alpha=\frac{1-\sqrt{1-4pq}}{2q}$とおきます。すると、$0\le \alpha\le \frac{1}{2q}$です。
また、$q\alpha^2-\alpha+p=0$を満たすので、

```math
\begin{eqnarray}
\alpha-a_{n+1}
&=& \alpha-p-qa_n^2 \\
&=& q\alpha^2-qa_n^2 \\
&=& q(\alpha+a_n)(\alpha-a_n)
\end{eqnarray}
```
となります。この式から考えると、全ての$n$について$0\le a_n\le \alpha$がわかります。すみませんがここで場合分けが発生します。

## pq<1/4の場合

上の式をさらに変形すると次のようにできます。

```math
\frac{\alpha-a_{n+1}}{\alpha-a_n}
=q(\alpha+a_n)\le q(\alpha+\alpha)=2q\alpha
```

ここで$2q\alpha$は$n$によらない$1$より小さい数なので$\alpha-a_n$は$0$に収束するといえます。$q>0$だったので、$a_n$は$\alpha$に収束します。

## pq=1/4の場合

この場合は$\alpha=\frac{1}{2q}$です。
$z_n=q(\alpha-a_n)$とおくと、$z_n$についての漸化式は次のようになります。

```math
\begin{eqnarray}
z_{n+1}
&=& q(\alpha+a_n)z_n \\
&=& q(2\alpha+a_n-\alpha)z_n \\
&=& (2q\alpha - z_n)z_n \\
&=& (1-z_n)z_n
\end{eqnarray}
```

また、$z_0=q(\alpha-0)=\frac{1}{2}$となります。$z_n$は別の記事で証明したように$0$に収束します。$q>0$だったので、$a_n$は$\alpha$に収束します。

ここでは$pq$によって2つの場合に分けましたが、どちらも$\alpha$の表記は同じになります。

# まとめ

$p\ge 0$および$q\ge 0$とする。数列$a_n$は次の漸化式で定義されるものとします。

```math
\left\{
\begin{array}{lcl}
a_0&=&0 \\
a_{n+1} &=& p+qa_n^2 
\end{array}
\right.
```

この数列の極限は次の通りです。

```math
\lim_{n\rightarrow \infty}a_n=
\left\{
\begin{array}{ll}
p& (q=0) \\
\infty & (q>0, pq>\frac{1}{4}) \\
\frac{1-\sqrt{1-4pq}}{2q} & (q>0, pq\le \frac{1}{4})\\
\end{array}
\right.
```
git checkout -t でちょっと幸せになれる

## 概要
みなさまは `git checkout -t` を使ったことはありますか？これを使うと既存のリモートブランチをローカルに作成する作業が少し楽になります。

以下の3つのコマンドは全て同じ結果になります。**リモートブランチから新しいブランチをローカルに生成し、さらにそのブランチへ移動する** という動作をさせるコマンドです。

### <font color="green">branch + checkout</font>

最初に覚えたのはこれです。

```sh
git branch proj/exampleWorks origin/proj/exampleWorks
git checkout proj/exampleWorks
```

### <font color="orange">checkout -b</font>

次に｢それコマンド1回で済むよ｣と教えてもらったのがこれです。

```sh
git checkout -b proj/exampleWorks origin/proj/exampleWorks
```

### <font color="red">checkout -t</font>

そして今回紹介するコマンドです。さらにタイプ量が少なくなりました。

```sh
git checkout -t origin/proj/exampleWorks
```

### *さらに追加情報
@uasi さんより proj/exampleWorks が複数の remote に存在する状態でなければ、下記コマンドだけで checkout が可能であることをコメントでご教示いただきました。origin のみで開発しているリポジトリであれば、こちらが一番スマートかと思います。

```
git checkout proj/exampleWorks
```


## 解説
- [Git - git-checkout Documentation](https://git-scm.com/docs/git-checkout#git-checkout--t)

> If no -b option is given, the name of the new branch will be derived from the remote-tracking branch, by looking at the local part of the refspec configured for the corresponding remote, and then stripping the initial part up to the "*". This would tell us to use "hack" as the local branch when branching off of "origin/hack" (or "remotes/origin/hack", or even "refs/remotes/origin/hack"). If the given name has no slash, or the above guessing results in an empty name, the guessing is aborted. You can explicitly give a name with -b in such a case.

`-t` オプションは対象のリモートリポジトリとブランチを指定するオプションです。そして、`-b` オプションは実は省略が可能です。 `-b` オプションを省略すると、ローカルに作成されるブランチ名はリモートリポジトリのブランチの名前がそのまま使われます。

これを利用して リモートブランチから新しいブランチをローカルに生成し、さらにそのブランチへ移動するという動作をより少ないタイプ量でサクッと行うことができます。`-b` オプションの省略分だけタイプ量を減らすことができるわけですね。


## 最後に

知らなくてもたいして困ることはないですが、知っているとほんのすこしブランチ作成が楽になります。もしご存知なかったかたはぜひ試してみてください。

## 参考
https://git-scm.com/docs/git-checkout

https://qiita.com/otukutun/items/5dfd4613cac209b5b883
Editorconfig, Linter, Prettier についてざっくり理解する

## はじめに

この記事は Editorconfig, Linter, Prettier をざっくり理解するための記事です。
対象読者は下記です。

- これらのツールは使ったことがないけれど気になっている人
- これらのツールの使い方は知っているけど誰かに説明しろと言われたらしどろもどろになってしまう人

## ざっくり理解する

### Editorconfig

Editorconfig は**エディタの設定**を制御するものです。エディタの設定というのがみそです。

お使いのエディタに Editorconfig プラグインをインストールすることで、エディタの改行コードや文字コードなどの設定を `.editorconfig` ファイルによって制御できるようになります。エディタの設定で変更することができない設定は `.editorconfig` で制御することはできません。

具体的には以下のような設定項目（一部エディタによって使えないものもある）があり、これらを拡張子ごとに個別に `.editorconfig` に記述します。

- 改行コード
文字コード
- タブを使うかスペースを使うか
- インデントの幅
- ファイル最終行に空行を入れるか
- 行末尾の空白を取り除くか
- 行の長さを最大何文字まで許可するか

[Editorconfig](https://editorconfig.org/)

### Linter

Linter は `.eslintrc` などの設定ファイルにルールを記述することによって、特定の言語の書き方をルールに沿った形に縛ることができます。それによってコードの可読性や品質が担保されます。
ソースコードがルールに沿った書き方がされていない場合には警告/エラーを出すことができます。警告かエラーかといった設定もルールごとに個別に設定できます。

Linter のルール群には2つのカテゴリが存在します。
1. コードフォーマットに関わるルール
2. コードの品質に関わるルール

Linter は、JavaScript 用の ESLint やTypeScript 用の TSLint のほかに、CSS, SCSS などに使われる stylelint などがあります。その他言語用の Linter もたぶんいろいろあったと思います（pylint, HTMLHint とか・・・。JSLint は消えた。）。

余談ですが、最近のモダンなエディタ にはほぼ Linter のプラグインが入っているので、それを有効にするとコード編集中にリアルタイムで警告/エラーを出してくれるようになるのでおすすめです。

[ESLint](https://eslint.org/)
[stylelint](https://stylelint.io/)
[HTMLHint](https://htmlhint.io/)

### Prettier

Prettier は **コードフォーマットに関わるルールのみ**を取り扱います（前述の Linter のルール 1）。

対応する言語はもともと JS関連のみでしたが（たしか）、現行の `v1.15.0` では JSON, CSS, HTML, Markdown, Vue, Angular などにも対応しています。

特定の言語へのルールを細かく設定できる Linter に対して、Prettier は様々な言語（Web系）のフォーマットルールを一元管理できることができます。

[Prettier](https://prettier.io/)

## おわりに

以上です。
より深く理解したいと思ったなら、本記事にも記載しているそれぞれの公式のURLを踏んでみましょう。

間違いや誤解を生むような表現などを発見しましたら指摘して頂けると幸いです。
第43話 ラマヌジャンの定数

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第43話です。

```math
(\frac{1}{\pi}\ln 884736744)^2\simeq43
```

この式を書き直すとこうなります。

```math
e^{π\sqrt{43}} \simeq 884736744 = 123(92 − 1)^3 + 744
```

要は、eにルートと円周率乗したら整数に近くなるよ、という意味の式です。

他にもこんな感じの式はあります。

```math
e^{\pi\sqrt{67}} \simeq  123(212 − 1)^3 + 744\\
e^{\pi\sqrt{163}} \simeq  123(2132 − 1)^3 + 744
```

最後の数はラマヌジャンの定数と呼ばれます。

全盛期のラマヌジャン伝説
・自身の考案した式で、世界最高峰の円周率の桁数を求める
・式の証明を聞きにいったら、未証明の式が増える
・寝てたら女神が新しい式を教えてくれる
・自身が死んだ後も自分の名前を冠した定数が発表される ←(ｲﾏｺｺ)

ラマヌジャンの定数はラマヌジャンの死後発表された数です。
遺稿が見つかったとか証明が完了した、という理由ではなく、
そもそも考案者はラマヌジャンではありません。

1975 年のエイプリルフールにマーティン・ガードナーが
「ラマヌジャンも予想した通り、この数は整数になる」と言い出したのが発端です。

ラマヌジャンの定数はかなり整数に近いです。

```math
e^{π\sqrt{163}} = 262537412640768743.99999999999925 ⋯
```

倍精度浮動小数点数(double 型)ですら整数とみなされる数です。
この数は超越数なので整数になるわけがないのに、計算してみると整数になる、
エイプリルフールとしては良い冗談だったでしょう。

もちろん、これがこんなにも整数に近いのは理由があります。
この数は楕円モジュラー関数というもので計算できます。

```math
j(τ) =\frac{1}{q} + 744 + 196884𝑞 + 21493760q^2 + ⋯
```

例えば、$e^{π\sqrt{43}}$であれば、q=1/884736700 を入れて計算します。
そうすると、この数はかなり小さいので、最初の2 項以外はほとんど0 になります。

```math
e^{π\sqrt{43}} = 884736700 + 744 + 0.0002225 ⋯+ 0.000000000027…
```

もちろん、$e^{π\sqrt{163}}$はもっと0に近いqを使うので、もっと整数に近づきます。

ところで、43,67,163 という数に見覚えがないでしょうか…。
第41 話に出てきたヒーグナー数です。やはり虚二次体の類数が1 というのに関係しています。
j(τ)というのが、虚二次体に関わる式なんですね。

43より小さいヒーグナー数でも同様の事が起きますが、
q の値が0 に近くないので、そんなに整数に近づかないのでインパクトにはやや欠けます。
Google Drive にて作成した図(drawings) を Markdown 上で見れるようにしたい

## :warning: 注意点

+ :no_good: こちらではありません
    + Google Drive上に保存したイメージファイル
+ :ok_woman: 今回はこちらの話です
    + Google Drive上にて作成・保存した図形描画(drawings)


## やり方

### 1. Google Drive にて、図形を作成

![drawings-01.png](https://qiita-image-store.s3.amazonaws.com/0/25582/10d7d8cd-4726-d330-f8a2-b613487caa7c.png)


### 2. ツールバーから、 `ファイル` を選択

![drawings-02.png](https://qiita-image-store.s3.amazonaws.com/0/25582/dcc9c4af-9b2d-636c-c04d-46a4c1eff785.png)



### 3. `ウェブに公開` を選択

![drawings-03.png](https://qiita-image-store.s3.amazonaws.com/0/25582/1fb0b2b4-e1a7-ce9e-87e8-afe394f616e0.png)


### 4. 以下のようなポップアップが出てくるので、 `公開` をクリック

![drawings-04.png](https://qiita-image-store.s3.amazonaws.com/0/25582/c2b9ecb6-2183-79ff-bb80-48c452994dab.png)


### 5. 以下のようなポップアップが出てくるので、 `OK` をクリック

![drawings-05.png](https://qiita-image-store.s3.amazonaws.com/0/25582/fb4bcbf9-feb2-88fd-c1b8-a74ff72e631a.png)


### 6. リンクが生成されるので、それをコピーする

![drawings-06.png](https://qiita-image-store.s3.amazonaws.com/0/25582/22524aee-630b-9b1c-7763-8888ded2d8a4.png)


### 7. コピーしたURLをMarkdownに貼り付ける

+ 形式

```
![](コピーしたURL)
```

+ デモ

![](https://docs.google.com/drawings/d/e/2PACX-1vTVlxu8AkysmuMcEc1p7jikU_QLwesyOITyiU5-n5XYIqmhQir4RzfmKkvIK14Mi17xZeMdrhgbi75h/pub?w=960&h=720)


## :warning: 注意事項

+ `共有可能なリンク` はそのファイル自体へのリンクであり、今回のような完全に図としてのアクセスとは違うので、Markdownに `図として` 貼り付けることは出来ません
+ 逆にそのファイル自体にアクセスしてほしい場合(共同で作業する時など)は、 `共有可能なリンク` を使用しましょう

## Repository

簡単ですが、以下のRepositoryに内容を纏めてあります

https://github.com/iganari/zatsu/tree/master/googledoc-images/drawings
SLA ダウンタイム許容時間の早見表

#概要
SLA 定義における累積的な許容ダウンタイムの一覧表となります。

| SLA     | 週間ダウンタイム | 月間ダウンタイム | 年間ダウンタイム |
|:--------|:----------------|:---------------|:---------------|
| 99%     | 1.68 時間       | 7.2 時間        | 3.65 日        |
| 99.9%   | 10.1 分         | 43.2 分         | 8.76 時間      |
| 99.95%  | 5 分            | 21.6 分         | 4.38 時間      |
| 99.99%  | 1.01 分         | 4.32 分         | 52.56 分       |
| 99.999% | 6 秒            | 25.9 秒         | 5.26 分        |
Ubuntu 16.04 開発環境お膳立て

# 環境
```bash
$ cat /proc/version
Linux version 4.15.0-38-generic (buildd@lcy01-amd64-023) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)) #41~16.04.1-Ubuntu SMP Wed Oct 10 20:16:04 UTC 2018

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.5 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.5 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
```


# 日本語化
以下のサイトを参考に日本語化します。
[Ubuntu 16.04 LTS : 日本語環境にする](https://www.server-world.info/query?os=Ubuntu_16.04&p=japanese)
最後のテキスト入力の設定時に、デフォルトで日本語、英語、Mozcの3つが選択されています。
「Mozc」は日本語入力に対応します。
「日本語」と「英語」は、英数字入力に対応します。
「日本語」はキーボードが日本語配列、「英語」はキーボードが英語配列の場合に使います。
日本語のキーボードを使用しているので、「英語」は削除しましょう。

# Vimのインストｰﾙ

デフォルトでは、viで方向キーを押すとABCDが入力されてしまいます。
Vimをインストールすれば解決します。
参考： [UbuntuのVimがおかしいな、と思ったときの対処法](https://did2memo.net/2015/12/23/ubuntu-vim-install/)

```bash
sudo apt-get install vim
```

# chromeのインストール
公式サイトよりインストールできます。
https://www.google.com/intl/ja_ALL/chrome/

# SubilmeTextのインストール
ubuntu software centerからインストールできます。

SublimeTextでは様々な設定できます。今回はタブの設定をしてみましょう。
まず、SublimeTextを起動し、ウィンドウ上部のpreference > settingsをクリックし設定ファイルを表示します。
次に、右側に表示されている設定ファイルに以下を追加してください。

```
"tab_size": 2,
"translate_tabs_to_spaces": true,
```

タブキーを押すと、半角スペースが2つ入力されるようになりました。

# Atomのインストール
公式サイトよりインストール出来ます。
https://atom.io/

# GithubへのSSH接続設定
このサイトが参考になります。
[gitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)

# GitKrakenのインストール
GitKarkenは、Linuxでも使用可能なGitのGUIクライアントです。

公式サイトよりダウンロード出来ます。
https://www.gitkraken.com/
Free Downloadを押すといくつか選択肢が表示されると思います。
Ubuntu 14.04 LTS (.deb)を選択してください。
クリックするお、自動でダウンロードが開始されます。
ダウンロードが完了すると、ubuntu software centerが開くので、そのままインストールしましょう。

# Slackのインストール
ubuntu software centerからインストールできます。

# Rails & PostgreSQLの導入
こちらの投稿を参考にしてください。
[Ubuntu 16.04 に Rails & Postgresqlを導入](https://qiita.com/Masahiro_T/items/947261fed48a2a58f8fc)

# その他
### ubuntuのキーボードショートカット一覧
Superボタン（Windowsロゴが描かれたボタン）を長押しすると表示されます。

### sudo apt-get update に失敗するとき
[Ubuntu16.04.3 LTSでapt-get updateに失敗する](https://qiita.com/on-vegetable/items/8f821be0641d0dbb7631)

### 端末起動時のディレクトリを変更したい
こちらを参考にしてください。
[ubuntuの端末起動時のパスを変えたい](https://teratail.com/questions/107053)
macでEC2にssh＆scpしてみる

#環境
macOS 10系
CentOS 7.5

#ssh

デフォルトのターミナルから以下の構文に従います。
初回ログインはデフォルトのcentosユーザ、EC2インスタンス作成時のキーファイル（証明書）を使用します。

```
$ ssh centos@EIP -i /キーファイルの保管ディレクトリ
```

2回目以降にパスワード認証にしたい場合は以下の手順でsshd_configを編集します。


```
$ sudo su -
# passwd
# vi /etc/ssh/sshd_config
# systemctl status sshd
# systemctl restart sshd
# systemctl status sshd
```

参考にしたサイト
>https://qiita.com/uhooi/items/ab845b06b136e623e51d

#SCP
同じくデフォルトのターミナルから以下の構文に従い入力すればOKです。

```
■ファイルのアップロード（ローカル→リモート）
$ scp 転送したいファイルを置いているディレクトリの絶対パス/ファイル名 EC2のrootユーザ名@EIP:転送したいディレクトリの絶対パス

■ファイルのダウンロード（リモート→ローカル）
$ scp EC2のrootユーザ名@EIP:転送したいファイルを置いているディレクトリの絶対パス/ファイル名　転送したいディレクトリの絶対パス
```

##実例
・転送したいファイルと絶対パス：/Desktop/okome.war
・EIP：13.1.1.1
・EC2のrootユーザ名/パス：root/okome
・転送したいディレクトリ：/usr/tomcat/webapps

```
$ scp /Desktop/okome.war root@13.1.1.1:/usr/tomcat/webapps/
okome@13.1.1.1's password: #okome

# .ssh/configなんかでホスト名やユーザ名を指定している場合は以下のように書く
$ scp /Desktop/okome.war Hostname:~/

```

フォルダをダウンロードする際は-rオプションが必要です。

```
$ scp -r root@13.1.1.1:/usr/tomcat/webapps/okome /Desktop
okome@13.1.1.1's password: #okome
```

#補足
よく使うわりにすぐ忘れるので備忘録です。
短すぎるので投稿をためらいました。。どなたかのお役に立てますと幸いです。
Docker で October CMS の開発環境を構築する方法【Laravel ベースの CMS】

# 手順

## 0. Docker をインストールしてください
### Docker のインストールは省略

## 1. cd コマンドでホームディレクトリに移動
```
$ cd
```

## 2. mkdir コマンドでディレクトリを作成
```
$ mkdir october
```

## 3. cd コマンドで october ディレクトリに移動
```
$ cd october
```

## 4. october を clone する
```
$ git clone https://github.com/octobercms/october.git blog
```

## 5. cd コマンドで october プロジェクトに移動する
```
$ cd blog
```

## 6. Docktober も clone する
```
$ git clone https://github.com/leocavalcante/Docktober.git .docker
```

## 7. docker-compose コマンドで built する
```
$ docker-compose -f .docker/docker-compose.yml up -d --build
```

## 8. composer install する
```
$ docker-compose -f .docker/docker-compose.yml exec php composer install
```

## 9. Web ブラウザで localhost:8000 にアクセスする
<img width="1174" alt="スクリーンショット 2018-11-08 12.32.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/88460/8d985477-5131-b2f3-07ad-9c8d50f404f7.png">
Bootstrap を Vue.js で使ってみよう

## Bootstrap is 何？

公式によると
> ### Bootstrap
> Build responsive, mobile-first projects on the web with the world's most popular front-end component library.
>
> Bootstrap is an open source toolkit for developing with HTML, CSS, and JS. Quickly prototype your ideas or build your entire app with our Sass variables and mixins, responsive grid system, extensive prebuilt components, and powerful plugins built on jQuery.

なツールキットです！

アプリのデザインって、全部を行おうとするとなかなかに大変ですよね。

デザインに時間を割けない時などに Bootstrap を利用すると、ボタン、アラート、モーダル、インプット要素．．．画面を構成するあらゆる要素を統一感のあるテーマで簡単に作成できるようになります！

それに、何よりオシャレですね！！

:link: [Bootstrap 公式](https://getbootstrap.com/)

:link: [Bootstrap + Vue 公式](https://bootstrap-vue.js.org/)


## Bootstrap をインストール

まずはプロジェクトへ移動して。

```shell
> cd my-project
```

次のコマンドでインストールします。

- Yarn を使った場合

```shell
> yarn add bootstrap-vue
```

- npm を使った場合

```shell
> npm install bootstrap-vue
```



## Vue.js で使うには？

`main.js` に次のようにコーディングします。

```javascript:src/main.js
import Vue from 'vue'
import App from './App.vue'

/* ここから */
import BootstrapVue from 'bootstrap-vue'
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'
Vue.use(BootstrapVue)
/* ここまで */

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')
```

後はテンプレートに Bootstrap の専用タグを埋め込むだけで使用することができます。



## 確認しよう

About ページにボタンを表示してみましょう！

```vuejs:src/views/About.vue
<template>
  <div class="about">
    <h1>This is an about page</h1>
    <b-button
      size="lg"
      variant="outline-primary">
      Bootstrap Button
    </b-button>
  </div>
</template>

```

アプリ起動して。

```shell
> yarn serve
```

[http://localhost:8080/](http://localhost:8080/about) にアクセスです！

![Bootstrap Button.gif](https://qiita-image-store.s3.amazonaws.com/0/135956/ca8f3425-1a9f-ecc2-f182-1d1fd5435c58.gif)


いえい！



コンポーネントの種類や、使い方はこちらをご覧ください。

:link: [Bootstrap - Components](https://bootstrap-vue.js.org/docs/components)


## まとめ

インストールの際に、生の Bootstrap ではなくて、Vue.js 専用のものをインストールするのがポイントですね！

（私は間違えたぞ！）

プログラマーさんはデザインが苦手って言う人が多い気がします。

そういう方でもオシャレなアプリを作れる Bootstrap は素敵ツールですね！



## インデックスページから来た人向け

オシャレなボタンが表示されると洗練された感じが出てきますよね～（いつも同じこと言ってる）

これから少しづつ機能を増やしていきますので、よかったら他の記事も見てみてください！


:link: [Vue.js 初心者がなにか作りきってみる（願望）](https://qiita.com/kurararara/items/9c4f78eb42e657221c06)
Vue.js をどうやって学ぶか



## はじめに

学び始めようとして、多くの、というかほとんどの記事で HTML「の一部」、JavaScript「の一部」しか記載が無く、全体としてどう書いてどう動くのか＿＿言い換えるとどのように運用するのか＿＿さっぱりイメージがつかなかったのです。

CODEPEN や JSFiddle などは、ちょっとした動作確認には手軽かもしれませんが、それを運用環境にしている人は居ませんよね？

## 完全な動作環境

ネット上のサンプル（その「一部」だけが書かれているようなもの）は、以下の HTML に当てはめると動作します。

```html:test.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <!--ここで Vue を読み込む-->
        <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    </head>
    <body>
        <!--ここにHTMLを記述する-->
        <script>
            // ここにVueを記述する
        </script>
    </body>
</html>
```

Vue.js を CDN(Content Delivery Network) から読み込んでいますが、この部分をダウンロードした Vue.js にすればオフラインで学ぶことが出来ます。

```html:offline_learn.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <!--ここで Vue を読み込む-->
        <script src="vue.min.js"></script>
    </head>
    <body>
        <!--ここにHTMLを記述する-->
        <script>
            // ここにVueを記述する
        </script>
    </body>
</html>
```

ローカルに環境（上記 HTML ファイル）ができたら書籍や[こちら](http://www.tohoho-web.com/ex/vuejs.html#methods)などを写経して学ぶことが出来るでしょう。<-リンク先はサンプルが１ページに収まっているのでオフラインで学びたい場合は PDF に印刷したりするのが良いでしょう。
ファイルの解凍

### 圧縮ファイルが複数のフォルダに分散されてあったのでその解凍方法
例） /gameに 001~1000までのフォルダがありその各配下に 001.log.gz~100099.log.gzまでの名前の圧縮ファイルが100個ずつある



```:game/.
gzip dr ./*
```
Google Colab環境でt分布の確率密度関数を出力する

最近話題のGoogle Colabを試してみたかったので、動作確認も兼ねてColab環境でt分布の確率密度関数を描画してみました。

## Google Colabでの前準備
[Colab](https://colab.research.google.com/)にアクセスし、`「ファイル」 > 「Python 3 の新しいノートブック」`を選択。
あとは実行したいPythonのコードをエディタ上に貼り付けるだけです。

## t分布の確率密度関数を出力

```python
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-6, 6, 1000)
fig,ax = plt.subplots(1,1)

linestyles = [':', '--', '-.', '-']
deg_of_freedom = [1, 3, 10, 30]
for k, ls in zip(deg_of_freedom, linestyles):
  ax.plot(x, stats.t.pdf(x, k), linestyle=ls, label=r'$k=%i$' % k)

plt.xlim(-6, 6)
plt.ylim(0, 0.45)

plt.legend()
plt.show()
```

## 実行結果
<img width="490" alt="t_python.png" src="https://qiita-image-store.s3.amazonaws.com/0/134341/3fe19bfd-c7c1-8a27-d37c-80b23426a9a4.png">

## まとめ
Colabを使うと環境構築のストレスがないので、今回のようにサクッと試してみたい場合に最適ですね。
調べてみるとGPUやTPU環境も試せるとのことなので、TensorFlowやKerasを試す環境としても使えそうです。


## 参考記事
[社内統計学勉強会]カイ二乗分布とt分布をPythonで描画する
https://techblog.gmo-ap.jp/2018/08/21/%E7%A4%BE%E5%86%85%E7%B5%B1%E8%A8%88%E5%AD%A6%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%82%AB%E3%82%A4%E4%BA%8C%E4%B9%97%E5%88%86%E5%B8%83%E3%81%A8t%E5%88%86%E5%B8%83%E3%82%92python%E3%81%A7%E6%8F%8F%E7%94%BB/
Python 同じ名前のファイルが在ればリネームする。

## 

`` ./test.txt `` というファイルが予め在れば、 
`` ./test(001).txt `` とリネームされる。

```
import os
import re
import shutil

filePath = "./test.txt"
# 値はフルパスで渡す
go = duplicate_rename(filePath)
# ファイルを移動
shutil.move(filePath, go)

# 同じファイル名が存在するかチェック
def duplicate_rename(value, count=1):
    if os.path.exists(value):
        # 存在した場合

        # フルパスから「フルパスタイトル」と「拡張子」を分割
        ftitle, fext = os.path.splitext(value)

        # タイトル末尾に(数値)が在れば削除する。
        newftitle = re.sub(r'\(\d{3}\)$', "", ftitle)

        # (001) という文字列を作成
        addPara = '(' + '{0:3d}'.format(count) + ')'

        # フルパスタイトル + (001) + 拡張子のファイル名を作成
        fpath = os.path.join(newftitle + addPara + fext)

        # リネームしたファイルを表示
        print('Rename: %s' % fpath)

        # 再度渡してリネームしたファイル名が存在しないかチェック
        return (duplicate_rename(fpath, count + 1))
    else:
        # 存在しない場合
        return value
```

# 更新
* 2018/11/10 二つ以上同じ名前のファイルがあると、 `` text(002).txt `` ではなくて、 `` text(001)(002).txt `` となってしまっていたのを改善。

# 別の方法を思いついたので書き込み
上記の方法は再帰と``import re``で正規表現も使用して書いたもので、今回はWhile を用いてループ処理で行うようにしたから``import``も``os``のみで良いようにした。

```
import os
import shutil

file_path = './test.txt'
 
def duplicate_rename2(file_path):
    if os.path.exists(file_path):
        name, ext = os.path.splitext(file_path)
        i = 1
        while True:
            # 数値を3桁などにしたい場合は({:0=3})とする
            new_name = "{} ({}){}".format(name, i, ext)
            if not os.path.exists(new_name):
                return new_name
            i += 1
    else:
        return file_path

# ファイル名
new_path = duplicate_rename2(file_path)
# ファイルを移動
shutil.move(file_Path, new_path)
```
一からはじめるDocker

# Docker
## はじめに
* 現在更新中！汗

## メリット
* 環境イメージ化するので、クラッシュしてもすぐに再構築できる
* Docker composeを利用すると尚構築が早い

## デメリット
* 強いて言うならコンテナやサービスの仕組みを理解しないと取り扱いがわからない

## Docker composeについて

### コマンド
* [docker-composeとdockerコマンドまとめ](https://qiita.com/tomo62/items/d966908cbc79a4c52dc7)

```text:Terminal
# サービスを構築するまたは再構築
$ docker-compose build

# コンテナの作成と開始
$ docker-compose up

# サービスの停止
$ docker-compose stop

# コンテナの停止
$ docker-compose down

# サービスの再起動
$ docker-compose restart

# コンテナ一覧(docker)
$ docker ps
# -a 詳細出力する

# 指定したコンテナに入る
$ docker exec -it %コンテナID or コンテナ名% /bin/bash[bash]

# 特定のコマンドを実行
$ docker-compose run %コンテナID or コンテナ名% bundle install

# イメージの一覧
$ docker image[docker-compose image]

# ログの出力
$ docker-compose logs
```

## トラブルシューティング
### Rails
* [Rails アプリケーションを Docker を使って開発する、ほとんどの人が通る（であろう）道](https://qiita.com/kmt/items/89c31d647bf42bf2300c)
  * A server is already running. Check /app/tmp/pids/server.pid.

```text:Terminal
docker-compose up
docker-compose ps

# CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                    PORTS                    NAMES
# 2d3a1d06d638        hoge_server_2_sidekiq   "sidekiq"                42 minutes ago      Up 36 minutes             3000/tcp                 hoge_server_1_sidekiq_1
# fb66a36488ff        hoge_server_2_web       "bin/rails server"       42 minutes ago      Exited (1) 17 seconds ago                          hoge_server_1_web_1
# 6e34f2b27982        mysql:5.6               "docker-entrypoint.s…"   42 minutes ago      Up 36 minutes             0.0.0.0:3306->3306/tcp   hoge_server_1_mysql_1
# c57e2443ae75        redis:3.2-alpine        "docker-entrypoint.s…"   42 minutes ago      Up 36 minutes             0.0.0.0:6379->6379/tcp   hoge_server_1_redis_1
# 5235664dfddf        minio/minio             "/usr/bin/docker-ent…"   42 minutes ago      Up 36 minutes (healthy)   0.0.0.0:9000->9000/tcp   hoge_server_1_minio_1

# ログを確認してみる
docker-compose logs

# web_1 | => Booting WEBrick
# web_1 | => Rails 4.2.4 application starting in development on http://0.0.0.0:3000
# web_1 | => Run `rails server -h` for more startup options
# web_1 | => Ctrl-C to shutdown server
# web_1 | A server is already running. Check app/tmp/pids/server.pid.
# web_1 | Exiting
```

docker-compose kill や 何かの拍子でコンテナが終了すると起きる
pid は、開発用WEBサーバを起動するときに tmp/pids/server.pidに書き込まれる
終了するときに削除される
server.pid に pid が書かれていると開発用WEBサーバが起動中（プロセスがある）と判断される
pid の情報を削除

## ノウハウ
### MySQLコンテナに外部からアクセスする方法
* [DockerのMySQLコンテナに外部からアクセスする方法まとめ改](https://qiita.com/saken649/items/00e752d89f2a6c5a82f6)
Python * Seleniumで現在表示しているURLを表示する

#概要
PythonでSeleniumを使って現在表示しているURLを表示する際に、少し詰まったのでメモします。

#環境
Python 3.7
Selenium 3.14.1

#コード
前提として Selenium、timeがインポートされており、ブラウザドライバーの起動ができる状態が必要です。

```python
driver.get("任意のURL")
time.sleep(1)
print(driver.current_url)
```


#補足

```python
url = driver.current_url
print = (url)
```

のように変数に格納するとなにも表示されませんでした。
既約分数

[lowest terms | CreateJS](http://labo.project-nya.jp/createjs/lowest_terms/)

分数を「既約分数」として表示するための関数

```js
////////////////////////////////////////
// 既約分数の取得
////////////////////////////////////////
function getLowestTerms(a, b) {
	var ta = a;
	var tb = b;
	var d;
	while (d = b%a) {
		b = a;
		a = d;
	}
	ta /= a;
	tb /= a;
	return {a: ta, b: tb};
}
```
コマンドプロンプトの文字コードを変更する

# コマンドプロンプトの文字コード
Windowsのコマンドプロンプトの既定の文字コードはShift_JIS。
gitとか使ってると、ログが文字化けするのでUTF-8に変更する。

文字コードの変更方法は2つある。

- chcpを使う
- 環境変数を設定する

が、何故か前者ではgitなどの日本語は文字化けしたまま。
「<３５><８９><Ａ４><７２>」 こんなやつ。

なので後者を使う。

## その時だけ変更したい場合

今使っているその間だけ変更できればいい場合は、立ち上げているコマンドプロンプト上で

```
> set LANG=ja_JP.UTF-8
```
と入力すれば、適応される。

この場合は、ウィンドウを一度閉じてしまうと、またデフォルトのShift_JISに戻ってしまう。

## 変更させたままにしたい場合

システムのプロパティで行う環境変数の設定を行う。
システムプロパティを開いて、環境変数の変更ダイアログを開く。
ユーザーの環境変数で、新規をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/252067/4df2a7ef-7905-a2d5-6fd4-9e1989099066.png)

図のように設定して、コマンドプロンプトを再起動すれば、変更が適応される。
KotlinでMoshiを使って、Json → List<Class>, List<Class> -> Jsonを行うExtension

ToDo あとで説明書く予定（まずコードのみ）
変換したJsonはPreferencesに保存を想定

```kotlin:StringExtension.kt
/**
 * JsonのStringを特定クラスのListに変換する
 */
inline fun <reified T> String.jsonToList(): List<T>? {
    val moshi = Moshi.Builder().build()
    val listMyData = Types.newParameterizedType(List::class.java, T::class.java)
    val jsonAdapter: JsonAdapter<List<T>> = moshi.adapter(listMyData)

    try {
        return jsonAdapter.fromJson(this)
    } catch (e: Exception) {
        LogUtils.d("ERROR:", "JsonParseError : ${e.message}")
    }
    return null
}

/**
 * JsonのStringを特定クラスに変換する
 */
inline fun <reified T> String.jsonToObject() : T? {
    val moshi = Moshi.Builder().build()
    val jsonAdapter: JsonAdapter<T> = moshi.adapter(T::class.java)

    try {
        return jsonAdapter.fromJson(this)
    } catch (e: Exception) {
        LogUtils.d("ERROR:", "JsonParseError : ${e.message}")
    }
    return null
}
```
オブジェクト指向言語で、関数型プログラミングに慣れたい人向けの「圏論アレルギー処方箋」

# はじめに
本記事は、オブジェクト指向をざっくり理解している人向けに書きます。

# オブジェクト？
そもそも、オブジェクトの捉え方ですが…
それは圏論の言葉で言うと「圏」であり…

##それ難しいから（笑）
そもそもから話そうではないか我が友よ（笑）
**そもそも数学嫌いが多いじゃないか**
**重要なのは対話じゃないか**

## アレルギーの方へ…
例えば、**1+1=2**　という数式で説明します。
実は、**証明できます**。
しかし、そんな事をしなくても自明の理（**当たり前**）です。
この、**ある値がとり得る当たり前の図式** を結論だけ言って整理すると…
（間はめちゃくちゃ長いです）
1に1を足す**と2になる**という**メソッド**で切り出せるということになります。
（すごく乱暴です。）
こういう、**当たり前の図式**　の事を、**自然変換**という名前で読んでいるだけです。

で、それを、分かりやすい言い方に変えると**メソッド**になります。
分かりづらいなら、
x+y=z
xにyを足す**と** z **になる**
という**動詞**だということに着目してください。
これを普段のオブジェクト指向から説明すると、
オブジェクトAをupdateする**と**Aの各プロパティは B **になる**
つまりは、**メソッド**はオブジェクトが持つ**自明の理**を実装しているに過ぎません。

## メソッドが自然変換だと考えたら出来ること
ここもゴニョっと言えますが…
乱暴に片付けてしまうと、オブジェクトが持っているプロパティが、ある値になる。
それは、～～～～～～の理由で…

という風に記述しますよね。
つまり、あまりにも長いメソッドは、**リファクタリング**をします。
細かい記述に書き直せるというわけです。
この**リファクタリング**されたメソッドは、もしかすると
オブジェクトが持っている値を**直接書き換えない**場合が多いのではないでしょうか？

ところが、リファクタリングしても、切り出したメソッドの再利用価値が低いなどということも考えられます。

## メソッドの分解 = 自然変換の分解
あるメソッドは、リストをイテレート（巡回）した結果を返すとします。
イテレートの際は、必ず幾つかの約束を果たさねばなりません。

よくある設計ですよね？
そこで、意気揚々とリファクタリングします。
実は、リファクタリングは、自然変換の分解です。
分解すると、より小さなメソッド（つまり関数）に切り出せます。
そういった概念を、「圏論」の言葉でいうと「関手」、「射」と読んでいるだけです。

つまり、関数型プログラミングの最初の理解に大切なことは。

## メソッド内だけで、関数型プログラミングをする
本当にミクロな書き方が出来ると思います。
そういうところで便利さが分かってくると面白くなってきますので、
怖がらずにまずは
**ラムダ（無名関数）**
を使った表現に変えてみることから、初めてみてください。
[VSCode]HTMLファイル以外でもEmmetを使えるようにしたい！

#テンプレートエンジン用のファイルを書くときに少し困った
　最近、必要に迫られてJS用のテンプレートエンジンnunjucksを触っております。
　そこでテンプレート用のファイル(.njk)を書き始めようと思い、新規作成していつものようにEmmet記法を使ってみたら、さっぱり動いてくれなかったのです。

　HTMLを書くのにEmmetが動いてくれないのは結構面倒なので、やり方はないかなーと調べてみたらありました。
## 解決策1 - 各種ファイルをHTMLに関連付ける。
　中身はほぼHTMLならば、何でもかんでもHTMLと認識させればいいわけで……
　**画面右下にある「言語モードの選択」をクリック→「HTML」を選択する。**
　これで対象のファイルはHTMLモードで書けますので、普通にEmmetが使えます。ただしこの解決策だと、テンプレート固有の構文（ **{% extends "hoge.html" %}** みたいなの）は全くハイライトされません。せっかくテンプレートファイルをいじるんだから、そういったものもハイライトして欲しいです。

## 解決策2 - emmet.includeLanguagesで設定する。

　拡張機能もしっかり効かせたい方はこちら。というか今回の記事はこちらがメインです。
　設定ファイルに"emmet.includeLanguages"というプロパティがありますので、そこをいじればいけるみたいです。

```json:settings.json
{
    "emmet.includeLanguages": {"nunjucks": "html"}
}
```

　この要領で、他のテンプレートエンジン用のファイルタイプも指定すれば行けるみたいですね。(例えばLaravel bladeテンプレートとか……)

# 参考サイト
Emmet is not working with nunjucks files · Issue #7 · ronnidc/vscode-nunjucks
https://github.com/ronnidc/vscode-nunjucks/issues/7

Emmet | 非公式 - Visual Studio Code Docs #他のファイルタイプで Emmet 略語
https://vscode-doc-jp.github.io/docs/userguide/emmet.html#%E4%BB%96%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%97%E3%81%A7-Emmet-%E7%95%A5%E8%AA%9E
【C#】Project Euler 2,3,4問目

#はじめに
C#を用いてProjectEulerに挑戦している人の記録です。VisualStudioで、1つのフォームアプリの中に問題番号のボタンを作成し、そのボタンをクリックすると結果をラベルに表示するという形式でやっています。
#2問目
フィボナッチ数列の項の値が400万以下の, 偶数値の項の総和を求めよ.

            long Sum = 2;
            int[] Fibonacci;
            Fibonacci = new int[100];
            Fibonacci[1] = 1;
            Fibonacci[2] = 2;
            for (int i = 3; i < 100; i++)
            {
                Fibonacci[i] = Fibonacci[i - 2] + Fibonacci[i - 1];
                if (Fibonacci[i] > 4000000) break;
                if (Fibonacci[i] % 2 == 0)
                {
                    Sum += Fibonacci[i];
                }
            }
            label1.Text = "Answer = " + Sum;

配列を宣言して順番にフィボナッチ数列を格納する方法を用いました。ですが、よりスマートなコードにする方法はあります。例えば、再帰呼び出しを使うと前の結果を保存しなくても結果を出すことができます。いろいろ考えてみてください。

#3問目
600851475143 の素因数のうち最大のものを求めよ.

       　　 var Number = 600851475143;
       　　 var i = 2;
            while (i < Number)
            {
                if (Number % i == 0)
                {
                    Number /= i;
                }
                else { i++; }
            }
            if (Number < i) { Number = i; }
            string Answer = Number.ToString();
            label1.Text = "Answer= " + Answer;
600851475143を2,3,4,...と順に割れるだけ割って、割り切れた数字と最後に残った数字を比べて大きいものを答えとしました。最後に残った数字が大きい可能性もあるため、比較する必要があります。
#4問目
3桁の2数の積で，回文になる最大のものを求めよ．

            var Max = 0;
            var Element1 = 0;
            var Element2 = 0;
            for (int i = 100; i < 1000; i++)
            {
                for (int j = 100; j < 1000; j++)
                {
                    int Number = i * j;
                    string NumberString = Number.ToString();
                    string ReverseString = new string(NumberString.Reverse().ToArray());
                    if (ReverseString == NumberString)
                    {
                        if (Max < Number)
                        {
                            Max = Number;
                            Element1 = i;
                            Element2 = j;
                        }
                    }
                }
            }
            label1.Text = "Answer= " + Element1 + "X" + Element2 + " = " + Max;
3桁の数字の掛け算に関して全通り試しています。文字列の反転に関して少し詰まりました。Reverse()メソッドが使えなかったのですが、new stringとToArray()して配列扱いにしてから文字列にすることで使うことができました。
#おわりに
私はC言語を学生時代に少しやった程度ですが、C#も基本的にはC言語の経験があれば多少はできるということが分かりました。しかし、進めていくなかでプログラミングの基本を案外忘れているものだと感じました。錆び付かないよう、勉強していこうと思います。
Laravelの日時に関するバリデーション実例メモ

## 想定環境
- Laravel5.5以降
- 入力フォーム  
「開始日時」(start_datetime)  
「終了日時」(end_datetime)  
がある

## 実例
1・片方入力された場合はどちらも必須にする判定

```
public function rules()
{
　　$rules = [ 
　　　'start_datetime' => 'nullable|required_with:end_datetime',
　　　'end_datetime' => 'nullable|required_with:start_datetime'
  　];
}
```
2・終了日が開始日の後であるか判定

```
public function rules()
{
  　$rules = [ 
　　　'end_datetime' => 'after:start_datetime'
    ];
}
```

3・入力された内容が指定された形式か判定

```
public function rules()
{
  　$rules = [ 
　　　'start_datetime' => 'date_format:"Y/m/d H:i:s"',
　　　'end_datetime' => 'date_format:"Y/m/d H:i:s"'
    ];
}
```

または下記を追加。

```
public function rules()
{
  　$rules = [ 
　　　'start_datetime' => 'regex:/[0-9]+\/[0-9]+\/[0-9]+\s-\s[0-9]+\/[0-9]+\/[0-9]+/',
　　　'end_datetime' => 'regex:/[0-9]+\/[0-9]+\/[0-9]+\s-\s[0-9]+\/[0-9]+\/[0-9]+/'
    ];
}
```
EgretEngineのゲームループの回し方

# 2種類のゲームループの回し方
いくつかサンプルをみていると、ゲームループの回し方に複数あることに気づきました。

## ループの起動パターンA

```ts
this.addEventListener(egret.Event.ENTER_FRAME, this.loop, this);
```

## ループの起動パターンB

```ts
egret.Ticker.getInstance().register(loop, this);
```

# APIドキュメントを確認してみる

## パターンA: `egret.Event.ENTER_FRAME`

> Event.ENTER_FRAME
> [Broadcast Event] 次のフレームが開始されると、このコールバックが呼び出されます。このオブジェクトが表示されているかいないか関係なくこのイベントは発生します。

## パターンB: 
http://developer.egret.com/cn/apidoc/index/name/egret.Ticker

> `Public register( listener:Function,thisObject:any ,priority:number ):void`
> Language version: Egret 2.4
> Runtime version: Web, Native
> フレームを処理するコールバックを登録する。同じコールバック関数が登録された場合は無視されます。このメソッドの代わりに`egret.startTick`を使うことが推奨されています。
> 引数:
> `listener:Function` フレーム処理のコールバック関数、第一引数に前のフレームと今回のフレームとの間のインタバールが渡されます


## 本命パターン？の`egret.startTick`
http://developer.egret.com/cn/apidoc/index/name/egret.globalFunction

どこにも`startTick`なるメソッドはないｗ

## `startTick`のサンプルとドキュメント
http://developer.egret.com/cn/github/egret-docs/Engine2D/timeControl/timeControl/index.html

> ## 時間制御
> ### 2.Ticker heartbeat
> グローバル関数の`egret.startTick` (停止は`stopTick`)により、60フレーム毎にコールバック関数が呼び出されます。`ENTER_FRAMEイベント`とは異なります。`ENTER_FAME`イベントはフレーム毎に発生します。フレームレートを変更すればコールバックの呼び出し間隔も変わります。`startTick`はフレームレートに影響されません。
> サンプルコード:
>
> ```ts
       this.time = egret.getTimer();
        egret.startTick(this.moveStar,this);
    }
    private moveStar(timeStamp:number):boolean {
        var now = timeStamp;
        var time = this.time;
        var pass = now - time;
        console.log("moveStar: ",(1000 / pass).toFixed(5));
        this.time = now;
        return false;
    }
```

## `ENTER_FRAME`のサンプルとドキュメント

> ### 3. Frame event
> フレームイベント`ENTER_FRAME`は次のフレームの開始時に発生します。設定されたフレームレートに依存します。 

# 結論
1. `egret.DisplayObject#addEventListener(egret.Event.ENTER_FRAME,...);` を使いましょう
2. index.htmlで指定したフレームレートが有効になります
【jQuery】margin/paddingを含めた高さの取得方法

## 【jQuery】margin/paddingを含めた高さの取得方法

① \<div> 要素の通常の高さ（elementの高さ）を取得する場合  

```Javascript
var h = $("div").height();
```
② \<div>要素のpaddingとborderまで含む高さを取得する場合  

```Javascript
var h = $("div").outerHeight();
```

③ \<div>要素のmarginを含む高さを取得する場合  

```Javascript
var h = $("div").outerHeight(true);
```


##注意点
大文字小文字を区別して書くこと！

正：outerHeight
誤：outerheight

Heightの「H」を小文字で書くと動作しません。


## 参考

[【jQuery】margin/paddingを含めた高さの取得方法](http://hainare.info/archives/149)
varchar の数値を sort して出力

以下 code テーブルが varchar の場合、
sortしても順番通りにならない。

```sql
mysql> select code from books
 order by code asc;
+---------+
| code    |
+---------+
| 1       |
| 10      |
| 100     |
| 1000    |
| 10000   |
| 100000  |
| 1000001 |
| 1000002 |
| 100001  |
| 100002  |
+---------+
```

* cast を使う。 (mysql 4.0.2以降で対応)


```sql
mysql> select code from books
 order by cast(code as signed);
+---------+
| code    |
+---------+
| 1       |
| 10      |
| 100     |
| 1000    |
| 10000   |
| 100000  |
| 100001  |
| 100002  |
| 1000001 |
| 1000002 |
+---------+
```
JavaScript:ジェネレータをアロー関数で書いとったわ

[イテレーターとジェネレーター](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Iterators_and_Generators)
[JavaScript の ジェネレータ を極める！](https://qiita.com/kura07/items/d1a57ea64ef5c3de8528)
[JSのジェネレーター関数の書き方まとめ](https://qiita.com/keng0o/items/b8e490ebd64a51f3ea4e)

多分普通は

```js:
const g = function*(){}
```
みたいにするんです。きっと。
ぼくもそのつもりで書いていたんですけど、

```js:
const g = () => function*(){}()
```
っていう順番で書いてました。あれ?
他のアロー関数に見た目あわせちゃってました。
これでも動いてるみたいです。

たとえば、配列の要素を返すジェネレータだと：

```js:
//文
function* arrayToGen(xs){ 
  yield* xs 
}

//式
const arrayToGen = function*(xs){ 
  yield* xs
}

//アロー関数
const arrayToGen = xs => function*(){ 
  yield* xs
}()
```
メリット

+ 見た目が好き

デメリット

+ 最後の()を忘れがち


何か問題があればコメントよろしくです。
FileMakerチートシート

## FileMakerチートシート

FileMaker ver.11が対象

### 概念／注意事項
* 1画面に必ず1つのテーブルを作成する必要がある。
* データ表示が不要な画面は仮テーブルにダミーデータを1件追加して紐づけを行う。
* データを抽出後、レイアウトを切り替えると、抽出条件が適用されたままデータが画面に表示されてしまう。

### したいこと逆引き

* ステップ実行でスクリプトを参照したい
 * メニューバー：ツール（Alt+t）→スクリプトデバッガ（Alt+d）→画面上のオブジェクトを選択→ステップイン（F6）

* レイアウトを参照したい／オブジェクトの情報を知りたい
 * レイアウトモード（Ctrl+l）。終了時は画面右上の「レイアウトの終了」

* 表形式でデータを見たい
 * メニューバー：表示（Alt +V）→表形式(Alt+E)

### よく使うスクリプト

* FileMaker上で扱っている全件数を対象に抽出
<pre>検索モードに切り替え []
フィールド設定[抽出対象項目;"抽出条件"]
検索実行 [] </pre>

* 画面上に表示されているデータを抽出
<pre>検索モードに切り替え []
フィールド設定[抽出対象項目;"抽出条件"]
レコードを対象外に（抽出対象を表示対象外とする場合）
対象レコードの絞込み []</pre>

* コメントアウト
<pre>
 \# コメント 
 // コメント
</pre>

* If～Else分岐
<pre>If [XXX]
XXXXX TODO ここ追記</pre>

* for文
<pre>for [XXX]
XXXXX TODO 追記</pre>

* ダイアログボックス表示
<pre>カスタムダイアログを表示["表示メッセージ"]　（OKボタンのみ）
</pre>

* 外部スクリプトの実行
<pre>スクリプト実行[「実行したいスクリプト名」]</pre>
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/59345/6e66f931-8c27-8ebf-f6bc-97bf77a79276.jpeg)

* 置換
<pre>フィールド内容の全置換 [ TODO 追記 XXXX]</pre>