OmniAICreator/Qiita-1.07M huggingface dataset:
【minecraft】自作カスタムヘッドURLの作り方

# はじめに・・・
Minecraftでは建築などに用いられるカスタムヘッドというものが存在する。

プラグイン開発をしているとこれがとても便利なのでその使い方を説明しておく。

それを自作する方法があるのでそれを紹介していく。
# １.まずはスキンを描こう。
描くのは頭部のみ。

簡単でしょ？

まずは以下のスキンをダウンロードして描いてね。
[[Steave](http://assets.mojang.com/SkinTemplates/steve.png)] [[Alex](http://assets.mojang.com/SkinTemplates/alex.png)]

完成したら自分のMinecraftアカウントに割り当てましょう。
# ２.UUIDを取得
MinecraftにはMCIDとは別にそのアカウントにあてられた変更できないUUIDというものがあります。

それを取得する必要があるのでNameMCにアクセスしてMCIDで検索します。
![alt](https://cdn.discordapp.com/attachments/672017404863315969/676841542350143488/8bcc5de11bb66a1c6a83d270e9a7b154.png)
`名前 | UUID | サーバーアドレス | スキン`という部分に自分のMCIDを書き込み検索してください。

たいてい１項目しかヒットしませんがもし複数ヒットした場合は自分のプロフィールを選択してください。

`Minecraft プロフィール`内のUUIDの２段目、`-`で区切られていないほうをコピーしておきましょう。
# ３.スキンを取得
`<UUID>`を先ほどコピーしておいたものに置き換えURLにアクセスします。
`https://sessionserver.mojang.com/session/minecraft/profile/<UUID>`

```
{"id":"1c2b6991e8ce4e5db4d8ec3f0cdc5f8e","name":"Monster2408","properties":[{"name":"textures","value":"eyJ0aW1lc3RhbXAiOjE1ODE0NDIzNTI2OTksInByb2ZpbGVJZCI6IjFjMmI2OTkxZThjZTRlNWRiNGQ4ZWMzZjBjZGM1ZjhlIiwicHJvZmlsZU5hbWUiOiJNb25zdGVyMjQwOCIsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS80ZDQ5NzFiNzFlMzBlMzJjNGJkNzY5YWEzMTk5Y2U3YmJmNmU1YmQ2YzlmNGYxYjAyNjEzNzkyYmQ4MzJkOWUwIn19fQ=="}]}
```
こちらがわたくしの取得したものですが、`"value"`というものが含まれております。このあとの`"`から`"`の間をコピーします。
# BASE64にデコード
[BASE64](https://www.base64decode.org/)にアクセスします。
`Type (or paste) here...`に先ほどコピーしたIDを貼り付けます。

`< DECODE >`というボタンをクリックして下のボックスるから`http://`から始まるURLを取得します。
私が取得したURL↓
`http://textures.minecraft.net/texture/c30a08a2e7d77cc58c2ef05b18560f5abcc45a04c6ec38f76b43135aa36db034`
# 実際に使用してみる
```java:CustomHead.java
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import org.apache.commons.codec.binary.Base64;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta;

import java.lang.reflect.Field;
import java.util.UUID;

public class CustomHead {
    public static ItemStack getSkull(String url) {
        ItemStack head = new ItemStack(Material.SKULL_ITEM, 1, (short)3);
        if(url.isEmpty())return head;

        SkullMeta headMeta = (SkullMeta) head.getItemMeta();
        GameProfile profile = new GameProfile(UUID.randomUUID(), null);
        byte[] encodedData = Base64.encodeBase64(String.format("{textures:{SKIN:{url:\"%s\"}}}", url).getBytes());
        profile.getProperties().put("textures", new Property("textures", new String(encodedData)));
        Field profileField = null;
        try {
            profileField = headMeta.getClass().getDeclaredField("profile");
            profileField.setAccessible(true);
            profileField.set(headMeta, profile);
        } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e1) {
            e1.printStackTrace();
        }
        head.setItemMeta(headMeta);
        return head;
    }
}
```
あとは`CustomHead.getSkull("URL")`で取得するのみ。
# さいごに
暇があったらコマンドで取得する方法調べときます（その時は追記します。）

じゃあ、おつ～
自動デプロイ後ローカルでいろいろ変更してデプロイしたらmigrationとunicornで詰まりデプロイできなかったので解決までの備忘録

#自動デプロイでかなり詰まったので備忘録として残します。  

- 初学者のため理解が不足しているところがあり、解決の過程で必要のない工程をしている可能性があります。
- もし他の改善策などご指摘いただけることがあればよろしくお願いしたします。


# エラー過程①

- 自動デプロイ完了後ローカルでデータベース構成などを変更
- 変更後自動デプロイ実行する。
- 途中でmigrationの実行で止る。

# 解決までの流れ①

- 原因の仮説としてはローカルでデータベースのテーブルやカラムの変更を行いrails db:migrate:resetを行ったためだと仮定し本番のデータベースもリセットすることにした。

- 関連の記事を探し、こちらで書かれているコードを参照、一度データベースを消してしまうという方法を取ってみたhttps://qiita.com/wacker8818/items/72d933f036ca0b75d124

- 無事データベースは削除され、改めてデータベースの作成とマイグレーションを実行したが落とし穴に会う。
    - ローカルに戻りアプリケーションのディレクトリで、自動デプロイを実行したがまたもマイグレーションの実行部分でエラーが起きた。
    - 何故かなと思ったが、エラー内容としては、マイグレーションファイル読み込み時に、追加したいカラムがもうあるよ的なエラーでした。
    -　理由は本番でデータベース削除の後にマイグレーションまで実行してしまったことだった。
    -　考えてみれば当たり前の話なのだが、この時点ではまだ修正したマイグレーションファイルも反映していないので、古いマイグレーションファイルをマイグレートして、さらにローカルで新しいマイグレーションの読み込みを実行していたのだ。
    -　なのでもし修正した方のマイグレーションファイルに、前に作ったマイグレーションファイルの設定と同じ記述があればエラーが起きるのは当たり前になる。

- なのでもう一度データベースを消してやり直ししてなんとかマイグレーションの自動デプロイは通った。



# エラー過程②
- ①通過後unicornstartでエラー発生し止る。


## 解決までの流れ②

```ruby:ターミナル
master failed to start, check stderr log for details
# エラー文
```

- エラー文を参考に調べた結果
    - このエラーの原因解決には（おそらく）本番環境でunicornのログを見てみるのが一番の近道らしいと聞いたので見てみる。
    - 何個かエラーらしきところは確認でき、どこのファイルのどこの行かまで詳しくログに書いてあったが簡単な記述ミスが起きているでけということで特にunicornが動かない原因だと考えなかった。
    - その後unicornのプロセスで見えないプロセスが裏で動いている可能性があると、指摘を受け調べてみたがその裏で動くプロセスの見方がわからなかった。
    - 詳しい方にいろいろ聞き本番環境のアプリケーションのディレクトリで下記のコマンドを実行。
 
```ruby:ec2-user(appディレクトリ)
sudo vim shared/tmp/pids/unicorn.pid
```
- vimファイルの一番上にpid番号らしき5桁の番号が保存されていたため直接消去しvimファイルを保存。
 - もう一度vimファイルを開いてちゃんと保存されているか確認。
 - これで解決できたと思いローカルに戻り自動デプロイを実行。
 - しかしまた同じunicorn実行の部分でエラーが起きた。

- ここでもう原因がわからず悩んだが、一番エラーの原因として可能性が低いと思っていた、以前unicornログで見たエラーを解決することを優先。
 - ここでのエラーはcontrollerでメソッド定義したときのendの数が足りなかったという単純なものだった。
 - その後ダメ元で自動デプロイを実行したらなんと通った!!

# unicornで止る原因(仮説)
- ローカルでエラーがあるものをmasterにmergeしてそのまま自動デプロイをするとエラーで止る。(特にデータベース、コントローラー関連のところ)
- 不要なプロセスが動いている。(killコマンドでプロセスを消す必要がある。)
- 途中で強制的にpidの接続が切れた場合、裏でも動いている可能性がある.

# 反省
- 一度マイグレーションしたデータベースのテーブルやカラムの変更を行う際は、しっかりと直接記述せずターミナルのコマンドで追加、または削除すること。
- 自動デプロイがしっかり完了したら基本的にエラーの原因はローカルでの変更が原因なので、実装と動作確認をしっかり行うこと。


### •　この記事を書いてみての反省
書く時はエラー文をしっかりコピーなどして参照しやすいようにしたほうがわかりやすく書くことができたと思う。
長々と文章ばかりでわかりづらいところが多いので、端的にもっと説明できるように文章力も磨いていく。
拙い文章を最後まで見てくださった方ありがとうございました。
これからも精進していきます。
Fedora31でDeep Learning環境構築


* 関連ソフトウェアバージョン
    * tensorflow-gpu: 2.1
    * cuda: 10.1
    * cudnn: 7.6.5(cuda 10.1用)
* RPM FusionのHowto/NVIDIAに従って、NVIDIAのドライバを入れる
    * https://rpmfusion.org/Howto/NVIDIA
* RPM FusionのHowto/CUDAに従って、CUDA・CUDNN関係のパッケージを入れる
    * https://rpmfusion.org/Howto/CUDA
* 以下のrpmも入れる

```
# dnf install libnvinfer-devel-6.0.1-1.cuda10.1 libnvinfer-plugin6-6.0.1-1.cuda10.1
```
* pipでtensorflow-gpuを入れる

```
pip install tensorflow-gpu==2.1
```

* https://keita-blog.com/data_science/keras-tensorflow-gpu の最後に書いてあるサンプルで動作確認

```
2020-02-11 23:52:11.291003: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1241] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 5201 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1660, pci bus id: 0000:06:00.0, compute capability: 7.5)
```
Linux VMでVSCode + Dockerの開発環境をつくる

VSCodeのRemote(Container) プラグインが便利だったので、VM上に開発環境を構築してみた。

Windows VM上には素直にDockerをインストールできない(ゲストOS上ではHyper Vオプションが無効)。

そこで、Linux VMでリモートデスクトップを使えるようにして、開発環境を構築してみた。

## 1. VM準備
- Cent OS 7でVMを作成する。

（Cent OS 8で後続の手順で環境構築すると、セットアップ直後はRDPでつながるが、再起動後にVMにSSHもRDPも接続できなくなる問題が発生したのでやり直した）

## 2. Remote Desktopをセットアップ
- VMにSSH接続して、Rootユーザーに切り替え。

```bash
  sudo su - 
```


- 以下サイトを参考に、RDPのパッケージをインストールする。[WindowsのRDPを使ってクラウド上のLinuxインスタンスに接続する - Qiita](https://qiita.com/yamada-hakase/items/a8efe626f598c5eb6f8c)


- RDP用ユーザーを作成。必要に応じてsudoリストに追加。

```bash
$ useradd sampleuser  
$ passwd sampleuser 
$ usermod -aG wheel sampleuser
```

- （お好みで）デフォルトの見た目をGNOMEクラシックからGNOMEに変更

```
echo 'DESKTOP="GNOME"' >> /etc/sysconfig/desktop
systemctl restart gdm.service
```

## 3. リモートデスクトップでVMに接続
リモートデスクトップアプリを使ってVMに接続する。

## 4. Visual Studio Code をインストール
- [公式サイト](https://code.visualstudio.com/download)からrmpファイルをダウンロードしてyumでインストール

```bash
cd ~/path/to/download/
sudo yum install code-1.42.0-1580986751.el7.x86_64.rpm
```

- Remote(Conteiner)プラグインをインストールする
VSCode上で「Remote(Conteiner)」プラグインを検索して、インストールする。

## 5. Dockerのインストール
- 以下のサイトを参考にDockerをインストールする 

[Install Docker on CentOS 7](https://qiita.com/ymasaoka/items/b6c3ffea060bcd237478)

- Dockerグループにユーザーを追加する

```
$  usermod -aG docker sampleuser
```

## 6. VS CodeでDocker実行
- 「リモートエクスプローラー」タブ内の「+」ボタンをクリック
- 「Open Folder in Container」 を選択し、ブランクフォルダーを選択
- 「Python 3」コンテナーを選択して実行
- Python 3 コードが実行できるコンテナーが起動する

<img width="1438" alt="image.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/fa52bd5e-f11c-1a17-20a9-3f19bd4c7fa1.jpeg">

##参考:コンテナ内のgitでsshキー認証が失敗する場合
- コンテナのterminalで一度 git fetch
- hostに接続するかの質問に一度yesと答えると、治る。

[Open ssh repository in container fails with host key verification · Issue #2087 · microsoft/vscode-remote-release · GitHub](https://github.com/microsoft/vscode-remote-release/issues/2087)
PackageCompilerX.jl はもう古くなったのでそれに依存のパッケージ，アプリを更新する

# 本日は

- 以前，PackageCompilerX.jl （以下これを`X付き`などと表記する）を用いた Plots.jl の高速化についての記事を書きました．
- 最近になってPackageCompiler.jlのメンテナーと X 付きのメンテナーやとそれらを囲むメンバーで協議が為された結果，既存のPackageCompiler.jlで管理されているファイルからX付きのリポジトリのコードにまるまる置き換える作業が行われました．
- X付きのを方を新しいcoolな名前にリネームする案や，既存の PackageCompiler.jl をいったん消してXをリネームするなどの議論がありましたが前者は良い名前がなかったのか流れで破棄され，後者は旧PackageCompilerに依存パッケージを（UUID，Manifesto .toml などの関係で）壊してしまうといった問題を抱えることになるのでこれも破棄されました．結果として古いPacakgeCompiler.jlの上にPackageCompilerX.jlのファイル群に置き直してCIやDocumentationの整備が行わています．
- 事の詳細は Julia の Slack か[Total rewrite of the package (aka make PackageCompilerX the new PackageCompiler)](https://github.com/JuliaLang/PackageCompiler.jl/pull/304) で閲覧することができます．

## え？ PackageCompilerX.jl どうなるの？

- リポジトリをみたらわかりますが，アーカイブされ read only になっています．メンテナンスは新しくなった PackageCompiler.jl で行われることになります．

## ということで

- 私の PackageCompilerX.jl の記事が思ったよりも読まれてしまったので情報を更新します．

# 更新の方法

X 付きのPackageCompilerの変更が　PackageCompiler.jl　に取り込まれましたが，tag 指定などでリリースされていないので次の方法で更新します．

```console
$ julia -q
julia> ; # press ; to enter pkg-mode
pkg> rm PackageCompiler # 古いものを削除
pkg> rm PackageCompilerX # 削除
pkg> gc # 念のためキャッシュを削除
julia> # 再び戻る
julia> using Pkg
julia> Pkg.add(PackageSpec(url="https://github.com/JuliaLang/PackageCompiler.jl",rev="master"))'
julia> using PackageCompiler # using PackageCompilerX としていた箇所を全て X を取り除く
```

- あとは PacakgeCompilerX.jl で使っていたAPIがそのまま使うことになります．

# 新しい PackageCompiler.jl

- 旧 PackageCompiler.jl → PackageCompilerX.jl → 新 PackageCompiler.jl と変遷されました．
- これによりCIの充実, ドキュメントの更新, Julia 1.3 より小さいバージョンのサポートを打ち切りが行われました．加えてARM用の対応が行われました．旧 の方では塩対応でしたが，ARM デバイスでも Julia を動かしたい動きがあったので更新のついでに改修が行われました．その過程でプルリクのレビューに私も参加することができ，ラズパイ３や４でも動くようになりましたこれは嬉しい．
AWSで複数アカウントを使い分ける方法【Google Chrome】

# はじめに

複数のAWSアカウントを使い分ける際、毎回ログアウトしてログインし直さないといけないのはさすがにたるい、ということで手軽な解決方法を調べました。

AWSとしては本番や開発といった環境、もしくは部署の単位でアカウントを使い分けることを推奨していると思っていますが（その方が開発から本番に接続できない（していない）ことを簡単に保障できるため）、その割にマネジメントコンソールでその機能がないのは色々不便というか片手落ちという感はありますが……。

# 前提

先述の通りマネジメントコンソールの機能ではできないので、今回はGoogle Chromeの機能を使います。
（理屈としては他のブラウザでもできそうですが、調べていないので何とも）

# 設定手順

まずはGoogle Chromeでユーザを作成します。
（Googleアカウントを作成するわけではないので注意）

右上のアカウントを選択し、「追加」を選択します。

![tejun1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319027/bad09379-f199-e20a-9acb-0f9bb6b26c3d.png)

次の画面でユーザー名を入力します。
アイコンは何でも良いですが、他と被らない方が使い分ける際にわかりやすいです。
デスクトップにショートカットがあると便利なので、作成にチェックを入れて「追加」を選択します。

![tejun2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319027/a6caafeb-e37d-ed43-5d60-d56c4e6e5afd.png)


正常に作成できたら、あとは接続したいアカウント/IAMユーザでマネジメントコンソールにログインすれば完了です。
ユーザを分けることで、認証情報も分けられるので、複数アカウントをログアウト無しに切り替えることが可能になります。

![tejun3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319027/d0bc8148-e556-8836-c731-556ddcfddf25.png)

# 補足

デフォルトだとブックマークバーが表示されないので、忘れずに表示させておきましょう。
また、ブックマークを登録する際、どこのアカウントor環境かがわかりやすい名前で登録しておくと、作業をしている時に間違えにくくなります。

![tejun4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319027/38c055c2-65e2-1ae2-3b16-06c28886ff78.png)

また、ユーザを追加するとChromeのアイコンにユーザのアイコンが表示されるのも地味にありがたいです。

![tejun5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319027/25e23b53-dd12-6097-65e7-1433d4563a61.png)
inputタグの値を配列形式で扱った時の備忘録（with Blade of Laravel）

###配列の値をControllerで受け取るってなんか難しくないか（？）
と始める前に思っていて、実際割とハマったので書き残しておこうかなと思います。

####配列形式でpostする書き方
```exaple.html

<input name="test[]" type="text"> 
//result 
//test[0]
<input name="test[0][1]['test']" type="text">  
//result
//test=[
     0 =>[
          0 => [],
          1 => [
　　　　　　　　　'test' => '',
　　　　　　　　　] 
         ]
     ]
```
少し落ち着いてきたら、最近使ったLaravelの機能群についても備忘録としてまとめてみようかなと思います。
【Go】メソッドの定義方法サンプルメモ

### 基本の形

```go
func (<レシーバー>) <関数名>([引数]) [戻り値の型] {
    [関数の本体]
}
```

### サンプル

```go:sample.go
package main

import (
	"fmt"
)

type myInt int

// 引数無し
func (i myInt) plusOne() myInt {
	return i + 1
}

// 引数あり
func (i myInt) plus(j myInt) myInt {
	return i + j
}

// レシーバーの変数名省略（呼び出し元の変数にはアクセスしない）
func (myInt) printHoge() {
	fmt.Println("Hoge")
}

func main() {
	var i myInt = 1
	result := i.plusOne()
	fmt.Println(result) // 2

	var j myInt = 4
	result2 := i.plus(j)
	fmt.Println(result2) // 5

	i.printHoge() // Hoge
}
```


### 参考

Go言語 - メソッド - 覚えたら書く https://blog.y-yuki.net/entry/2017/05/05/000000

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4863541783/kuredev-22/ref=nosim/" name="amazletlink" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/419XRomH%2BNL._SL160_.jpg" alt="改訂2版 基礎からわかる Go言語" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4863541783/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">改訂2版 基礎からわかる Go言語</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 20.02.11</div></div><div class="amazlet-detail">古川 昇 <br />シーアンドアール研究所 (2015-07-17)<br />売り上げランキング: 87,346<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4863541783/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>
Rails データベースの名前はどこで決まっている？

某スクールで用意されているファイルをクローンした際に
フォルダ名を変更していたにも関わらず、rake db:createを実行したら
元：example
名前変更：example1
と下記の様に既にDBが存在すると言われてしまった。
`example_development already exists`
`example_test already exists`

しかもexampleのままで作ろとしている！フォルダ名変えたのに！
じゃデータベース名はどこで定義されているのか？

##データベースの定義場所

データベースは**config>database.yml**で定義されています

この中には
開発環境  :development
テスト環境 :test
本番環境  :production
でのデータベースに関する情報が書かれています。
その中で:database: 名前とあるのでここを読み取り作成している。
なのでここを変更してあげれば解決します。
FactoryBotでtraitを使おう

# はじめに
`FactoryBot`でテストデータを作成するに当たって`trait`を押さえるのは必須かなと思います。

RSpecをこれから始める方向けにこの記事を書きます。

## traitを使ってみる

一例としてTaskのファクトリを作成する場面を想定して`trait`を使ってみます。

```ruby
# spec/factories/tasks.rb
FactoryBot.define do
  factory :task do
    title { 'Task' }
    status { :todo }
    from = Date.parse("2019/08/01")
    to   = Date.parse("2019/12/31")
    deadline { Random.rand(from..to) }

    trait :done do
      status { :done }
      completion_date { Time.current.yesterday }
    end
  end
end
```
次にspecファイルで通常のtask、`trait`を活用したtaskの二種類を書いてみます。

```ruby
let(:task) { create(:task) }
```
これは通常の書き方。
これにより、statusが`todo`の通常のtaskが作成可能になる。



次に`trait`を活用したtask（※ **想定場面はステータスが完了のタスクを作成したい時**）

```ruby
let(:task_done) { create(:task, :done) }
```
これにより、statusが`done`、completion_dateが`Time.current.yesterday` のtaskが作成できる。

この時`trait`を使わないと以下のようにコードが長くなります。

```ruby
{ create(:task, status: :done, completion_date: Time.current.yesterday) }
```

しかし、`trait`を使えば簡潔に書ける！

この記事で`trait`の便利さをわかって頂けたら幸いです。
以上です！！
DNSについて

##DNSについて
DNSについて少し学んだのでアウトプットしていく。

DNSとはDomain Name System(ドメイン・ネーム・システム)の略です。
ざっくり言うと、IPアドレスを調べてくれるサーバーがDNSサーバー

そのIPアドレスを使いリクエストを送りサーバーが受け取りレスポンスとしてブラウザに表示される流れとなっている。

自分の今までの認識だと

####ブラウザ→リクエスト→サーバー→レスポンス→ブラウザ表示
という流れだったのですが、
####ブラウザ→DNSサーバー（IPアドレスを取得）→ブラウザ（IPアドレスを持って）→リクエスト→サーバー→→レスポンス→ブラウザ表示
詳しく書くとこの様になるみたいです。
足りない部分は多々あるでしょうが、間違ってたらどんどん書いて欲しいです。

補足
IPアドレスとはインターネット上に接続された端末がもつ番号のこと。
インターネット上での住所の役割を担っている
【Go】関数の定義方法サンプルメモ

### 基本の形

```go
func <関数名>([引数]) [戻り値の型] {
    [関数の本体]
}
```

### サンプル

```go:sample.go
package main

import (
	"fmt"
)

// 基本の形
func plus(a int, b int) int {
	return a + b
}

// 戻り値無し
func printPlus(a int, b int) {
	fmt.Println(a + b)
}

// 戻り値＆引数無し
func printDummy() {
	fmt.Println("printDummy")
}

// 戻り値複数
// 元の値と、足し算した値を返す
func plus2(a int, b int)(int, int, int){
	return a, b, a + b
}

// 可変長引数
// アンダースコア変数
// https://qiita.com/penguin_dream/items/c1df36040b3fc6d42945
func printVariable(strs ...string) {
	for _, str := range strs {
		fmt.Println(str)
	}
}

// 名前付きの戻り値
func plusMinus(a int, b int)(add int, minus int){
	add = a + b
	minus = a - b
	return
}

func main() {
	result := plus(1, 2)
	fmt.Println(result) // 3

	printPlus(2, 3) // 5

	printDummy() // printDummy

	a, b , c := plus2(1, 2)
	fmt.Println(a) // 1
	fmt.Println(b) // 2
	fmt.Println(c) // 3

	printVariable("1", "2", "3")

	add, minus := plusMinus(2, 1)
	fmt.Println(add) // 3
	fmt.Println(minus) // 1
}
```

### 参考

Go言語 - 関数 - 覚えたら書く https://blog.y-yuki.net/entry/2017/05/03/000000

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4863541783/kuredev-22/ref=nosim/" name="amazletlink" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/419XRomH%2BNL._SL160_.jpg" alt="改訂2版 基礎からわかる Go言語" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4863541783/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">改訂2版 基礎からわかる Go言語</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 20.02.11</div></div><div class="amazlet-detail">古川 昇 <br />シーアンドアール研究所 (2015-07-17)<br />売り上げランキング: 87,346<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4863541783/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>
Xojo を Ubuntu 18.04 にインストール

# 問題あります！

この記事ではインストールの方法を示す。簡単にインストールはできる。
しかしインストールした後に問題がある。
Ubuntu 18.04.4 LTS で動かしたところ、 IDE の挙動が鈍すぎて実用にならない。
「Xojo でリモート開発」
https://qiita.com/nanbuwks/items/4743756186060c3c3d20
のような工夫が必要であることに注意。

# インストール

## 環境
Linux Ubuntu 18.04.4 LTS ( AMD64 )
xojo 2019r3.1

# ダウンロード

 xojo2019r31.tgz をダウンロードして解凍。

```

$ cd xojo2019r3.1/
$ ls
 Documentation       Extras   'Project Templates'   Scripts  'Xojo Libs'        appicon_128.png   appicon_48.png
'Example Projects'   Plugins  'Read Mes'            Xojo     'Xojo Resources'   appicon_32.png    xojo.xpm
$ ./Xojo
libocci.so.10.1: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません

```
と出ながらも起動した

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/838560c4-7dba-c424-e395-3656673d9e91.png)


ガイドウィンドウを閉じると初期メニューが出てきた


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/cf23b661-03d7-419a-9408-d9ef1f49a847.png)

# IDEの挙動がアレな件

「Xojo memo・備忘録: Xojo LINUX IDE 激遅！ very slow!」
http://k2y1972blog.blogspot.com/2019/07/xojo-linux-ide-very-slow.html
によると、

ubuntu16.04LTSでXojo2019r1.1 の組み合わせで

> いろいろ試したが、lightdmをやめgdmを使い、unityをやめxfceにするとWinやMacに比べるとまだ遅いが見違えるくらいに動作する。

とある、Ubuntu18.04 では、 

- lightdm → GDM
- Unity → GNOME3

となっているので、GNOME3 を XFce にするだけでいいかも。
Xojo について調べる



# 公式ドキュメントサイト
http://docs.xojo.com/

## 言語リファレンス
http://docs.xojo.com/Category:Language_Reference

参照性がとっても悪いので、以下にディープリンク。


言語リファレンス一覧
https://docs.xojo.com/Category:Language_Reference_Index

制御構造
https://docs.xojo.com/Category:Language_Code_Execution

言語仕様
https://docs.xojo.com/Category:Language

予約語？
https://docs.xojo.com/Category:Keywords


変数
https://docs.xojo.com/Category:Language_Variables

演算子
https://docs.xojo.com/Category:Language_Operators
比較演算子が記載されてなくてびっくり！ ここから辿ろう‼ → https://docs.xojo.com/%3D

数学関数、演算子など
https://docs.xojo.com/Category:Language_Math

データタイプ
https://docs.xojo.com/Category:Data_Types

リテラル
https://docs.xojo.com/Category:Language_Literals


メソッド一覧
https://docs.xojo.com/Category:Methods

エラー処理
https://docs.xojo.com/Category:Errors

エラーハンドリング
https://docs.xojo.com/Category:Errors_Error_Handling

# ダウンロードドキュメント
https://www.xojo.com/resources/learn.php
こちらから、PDF版と iBook版がダウンロードできる

## PDF 版
- Introduction to Programming with Xojo.pdf
- iOS Addendum.pdf
- Teacher Guide.pdf

## iBook版

これも同じ内容のようだ。

## RaspberryPi

RaspberryPi 用の PDF
「XojoPi Programming the Raspberry Pi with Xojo」
http://docs.xojo.com/Programming_the_Raspberry_Pi_with_Xojo

# 日本語リソース
http://docs.xojo.com/Resources:Japanese
から、
「Xojo Japanese Documentation」
http://cdn.xojo.com/Documentation/JP/Xojo%20Japanese%20Documentation.pdf
がダウンロードできる

# フォーラム

活発に投稿されている模様。
https://forum.xojo.com/
日本語のフォーラムもあるが、残念ながらこちらはほとんど投稿が無い。
https://forum.xojo.com/conversations/Japanese

# Amazon 書籍

無料配布しているPDF。過去にグレープシティで頒布していたもののようだ。その他の続編もあったらしいがそちらは入手できなさそう。
「Xojo ユーザーガイド: Book 1: 基礎 Kindle版」
https://www.amazon.co.jp/Xojo-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%AC%E3%82%A4%E3%83%89-Book-1-%E5%9F%BA%E7%A4%8E-ebook/dp/B01KWK39EG



# 非公式サイト

https://ifnotnil.com/
https://www.bkeeneybriefs.com/
http://www.xojozh.com/download/cht/LanguageReference.pdf
phpunit8に上げたらPHPUnit does not appear to be installed.と言われた

プロジェクトでphp7.3、fuelphp1.8.2を使っています。
しかし、phpunitのバージョンが5.6と古く、もうすぐサポートが切れてしまうためバージョンアップした際に出たエラーの解決について書いていきます。

# 前提
バージョンアップが完了しているわけではありません。
怒られたので、それの解決方法だけです。
もしかしたら、別の方法があるかもしれないので、その場合は是非コメントお願いします。

# やったこと
本当はdocker内でコマンド叩いていますが、長くなってしまうので必要なところだけ抜粋します。
phpunitのバージョンアップに伴って依存パッケージの更新も必要だったため更新しています。

```
./composer.phar remove phpunit/dbunit
./composer.phar remove phpunit/phpunit
./composer.phar remove phpunit/php-timer
./composer.phar require --dev phpunit/phpunit ^8.5.2
./composer.phar require --dev phpunit/php-timer ^2.1.2
./composer.phar require --dev kornrunner/dbunit
```

上のコマンドを入れ終わった後、testを実行すると、エラーが発生する。
5.6の時はこれで実行できていました。

```
$ php oil test
Uncaught exception Oil\Exception: 0 - PHPUnit does not appear to be installed.

	Please visit https://phpunit.de and install. in /省略/fuel/packages/oil/classes/command.php on line 189
Callstack:
#0 省略/oil(68): Oil\Command::init(Array)
#1 {main}
```

# 解決方法
公式サイトの方にバージョンの確認方法載っていたので、それで確認。
バージョンアップは問題なくされている。
https://phpunit.de/getting-started/phpunit-8.html

```
$ ./vendor/bin/phpunit --version
PHPUnit 8.5.2 by Sebastian Bergmann and contributors.
```

今までとパスが変わった？みたいです。
改めて、公式に沿って実行します。

```
$ ./fuel/vendor/bin/phpunit --bootstrap fuel/vendor/autoload.php ./fuel/app/tests
PHPUnit 8.5.2 by Sebastian Bergmann and contributors.



Time: 150 ms, Memory: 4.00 MB

No tests executed!
```

一旦、タイトルのエラーが出なくなりました。
ただ、テストが一つも実行されていません。

ファイルを指定せずにテストを実行する場合には、ファイル名を `*Test.php`としないといけないようです。。
これ全ファイルに適用するの結構たいへん。。
1ファイルだけ変更したところ、正しく実行されました。（エラーが出ている状態）

> Using tests instead of tests/EmailTest would instruct the PHPUnit command-line test runner to execute all tests found declared in *Test.php sourcecode files in the tests directory.

# まとめ
バージョンアップを始めた直後にphpunit9のリリースがされたため、これからアップデートをする方はそちらへのアップデートを検討されると良いかと思います。
Nuxtのaxios-moduleがbaseURLを決定する仕組みの解説と、Netlify FormsへPOSTするときの対策

#なにに困ったか
axios-moduleの`baseURL`は、**何も設定がない**場合は`http://localhost:3000`になる仕様です。[^time]

[^time]: 2020年2月11日現在。axios-module 5.9.5で確認。

**たとえ本番サーバで稼働していても。**

この影響で、静的にgenerateしたSPAをNetlifyにアップし、そこから`Netlify Forms`へPOSTする場合には、ひと工夫する必要があります。[^nuxt] [^kufuu]

[^nuxt]: 逆にいえば、サーバサイドでもNuxtが動作していれば（≒SSRできる状態なら）、そこの設定に基づいて適切に自動設定されます。

[^kufuu]: 実際、工夫なしでは、自分自身のサーバ（たとえば`https://myexample.netlify.com`）にPOSTしているつもりなのに`http://localhost:3000`を呼びだされ、CORSエラーになってしまいました。


#どうすればいいか
シンプルなのですが、`this.$axios.$post`の第1引数に`window.location.origin`を渡します。

```javascript
this.$axios.$post(window.location.origin, params)
```

たとえばこのSPAが`https://myexample.netlify.com`にあるとしたら、`windows.location.origin`も`https://myexample.netlify.com`になるので、そこに向けてPOSTされるようになります。


POSTするところ全体としてはこんな感じ。（responseの処理は省略）

```javascript
  methods: {
    async submit() {
      const params = new FormData()
      params.append('form-name', 'contact')
      params.append('name', this.name)
      params.append('email', this.email)
      params.append('message', this.message)
      params.append('bot-field', this.botfield)
      const response = await this.$axios.$post(window.location.origin, params)
    },
  }
```



#axios-moduleの該当箇所のコードを読み解く
実際のコードを確かめてみましょう。
コード全体は[ここ(GitHub)](https://github.com/nuxt-community/axios-module/blob/dev/lib/module.js)にあります。

まずはホスト名とポート番号の取得箇所の抜粋。

```JavaScript:axios-module/blob/dev/lib/module.js
  // Default port
  const defaultPort =
    process.env.API_PORT ||
    moduleOptions.port ||
    process.env.PORT ||
    process.env.npm_package_config_nuxt_port ||
    (this.options.server && this.options.server.port) ||
    3000

  // Default host
  let defaultHost =
    process.env.API_HOST ||
    moduleOptions.host ||
    process.env.HOST ||
    process.env.npm_package_config_nuxt_host ||
    (this.options.server && this.options.server.host) ||
    'localhost'
```

環境変数とかオプションでhost、portが設定されていなかったら、localhost:3000が選択されるようになっています。

ホストとポートは環境変数で指定できるので、これはNetlifyにアップした時にも設定できます。
なお、`this.options.server`は、`nuxt.config.js`のserverセクションを指しています。


もう1つ、プロトコルを決めている箇所の抜粋。

```JavaScript:axios-module/blob/dev/lib/module.js
  // HTTPS
  const https = Boolean(this.options.server && this.options.server.https)
```

プロトコルを決める仕組みはこれだけです。`nuxt.config.js`のserverセクションにhttpsの設定が入っていることが必須条件。

そのため、HTTPSを指定するのは`nuxt generate した成果物を Netlify にアップする`という条件では、クリアは困難と思われます。

よって、今回の条件下でHTTPSのAPIを呼びたい場合は、明示的に`window.location.origin`を設定する方法をとることになります。


#さいごに
単純に回避するだけでなく、理由までわかってすっきりしました。
そして、文書を調べるだけでなく、大元のソースコードを確認するのも大事ですね。
FortiGateとMTUでハマった話し

# はじめに
結構古いFirewall（J社）からFortiGateに更新した際に、特定の機種から特定の通信ができなかったのでハマった。原因究明のためイロイロ調べたのでメモ。どこかの誰かの助けになれば嬉しいけど、自分自身の理解も浅いためボチボチ整理していく予定。なお、まだ情報をまとめきれていないので順次アップデートしていく予定。

# 環境イメージ
```
[プロバイダのメールサーバ]---(インターネット)---(フレッツ系サービス)---[FortiGate]---[複合機]
```

# ハマった内容
あるメーカの複合機からメールを送る機能がある。トナー切れとか、故障とか、多分そんな用途に使うらしい機能だけと、FortiGateに更新した後からそのメールの送信ができない。切り分けしたところ、いくつかの事象が分かった。

* FortiGateのポリシーを複合機からはALL許可としたけどダメ。
* FortiGateのポリシーからUTMを全て外したけどダメ。
* 複合機からPingを打つ機能があるけど、メールサーバまでPingは飛ぶ。
* パソコンに複合機のIPアドレスを設定し、メールソフトで送信するとちゃんと送れる。
* 複合機の送信メールサーバ設定を、プロバイダのメールサーバから内部メールサーバに変更するとちゃんと送れる。

この事象から、メールサーバ側の問題では？と考えてメールサーバを運営しているプロバイダに問合せしたけど、何も設定変更していないとの回答で（当然だけど）した。このまま迷宮入りするところだったけど、環境を変えたのはFortiGateに更新しただけなので、FortiGateに原因があるのではと思い、ネットワークエンジニアに相談したところ「パケットキャプチャしたら？」とアドバイスをもらったので実施してみた。

# FortiGateでパケットキャプチャする方法
GUIで取れるとのことなので、その方法で取得してみる。
https://kb.fortinet.com/kb/documentLink.do?externalID=FD45907

# パケットキャプチャを解析してみた
FortiGateから複合機に対して、ICMPのタイプOx03（Destination Unreachable Message）のコードOx04（Fragmentation needed）が送られていた。その後、FortiGateからセッションを切っている様子。

# さらに調べた
Path MTU Discovery と言う仕組みが関係していそうな気がしてきた。

#### Path MTU Discovery とは
ルータが持つ回線によっては、より小さいMTUを持つ回線を使ってパケットを転送しようとした時において、「着信パケットが大きい」かつ「DFビットが設定されている場合」、そのパケットを破棄してICMPのタイプ 0x03（Destination Unreachable Message）のコード0x04（Fragmentation needed）を送信元のホストに返すらしい。そのICMPには調整が必要となった回線のMTU値(Next-Hop MTU)が含まれていて、受け取ったホストはそのMTU値に変更して再度パケットを送るため正常に通信できる様になる。

つまり「あなたが送ったパケットサイズが大きすぎて転送出来ないよ、このMTU値(Next-Hop MTU)に変更して送ってもらえませんか？」とお願いするイメージだと思う。

ただし、Path MTU Discoveryを使わず、ルータがフラグメンテーションする場合もある。

#### フラグメンテーションとは
ルータがパケットを転送しようとした時に、パケットサイズが送信インタフェースのMTU値を超えた場合、そのルータがパケットを分割してMTU値以下にするという機能らしい。ただし、ルータ側でパケットを分割する処理、受け取る側でパケットを再構築する処理の負荷があるし、「フラグメント攻撃（Fragment Attack）」にも利用されるため、最近ではあまり主流では無いらしい。

#### MTUとMSSについて
* MTU
https://tech.pjin.jp/blog/2017/07/28/%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%af%e7%94%a8%e8%aa%9emtumaximum-transmission-unit/

* MSS
https://tech.pjin.jp/blog/2017/07/04/%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%af%e7%94%a8%e8%aa%9emssmaximum-segment-size/

# 仮説
以下いずれか、もしくは全てが成り立つと考えた。

* 更新前のFirewall（J社）はフラグメンテーションしていたが、FortiGateはその機能が無い、もしくはデフォルト無効。
* 複合機が送信するパケットがはDFビットが設定されている。
* 複合機が頑なにMTU値を変更しない、もしくはFortiGateからのICMPが届かない。パソコンには届いているので複合機側で破棄している。
* もしかしたらPath MTU Discovery のブラックホール問題？

【図解】Path MTU DiscoveryブラックホールとPLPMTUD(RFC4821)による自動調整
https://milestone-of-se.nesuke.com/nw-basic/grasp-nw/packetization-layer-path-mtu-discovery/

# 仮説から取った対策
今回問題が発生しているのは複合機からのメール送信だけなので、FortiGateの対象ポリシーだけMSS値を上書き設定することにした。具体的にはWAN側インタフェースがPPPoEなのでMSS値を1414とした。値の根拠については下記を参照した。

MTU/MSSの変更方法を教えてください
https://csps.hitachi-solutions.co.jp/fortinet/faq/FG-11-0018/index.html

MTU / MSSを最適化する
https://yabe.jp/gadgets/optimizing-mtu-mss/

# 結果
メールが送信出来る様になったのでとりあえずはOK。
仮説の真偽については時間を作り検証してみたいと思う。
Twitter APIで使うBearer Tokenの取得方法

Twitter APIを使うのに[OAuth 2.0](https://tools.ietf.org/html/rfc6749)仕様の認証方式を試してみた。その際に必要となる`Bearer Token`の取得方法が若干面倒だったので書き残しておきます。

![auth-5.png.img.fullhd.medium.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/5826395a-a2cf-65fc-57e4-e875d5d0f538.png)

認証まわりの詳しい仕様は公式ドキュメントを読んでください。
[Application-only authentication — Twitter Developers](https://developer.twitter.com/en/docs/basics/authentication/oauth-2-0/application-only)

以下、Twitter Developersにアプリ登録済みで、開発環境はMac前提での解説です。
# Bearer Token credentialsを生成する

[Twitter Developers](https://developer.twitter.com/)の[[Apps](https://developer.twitter.com/en/apps)] -> 対象アプリの [Details] -> [Keys and tokens] にアクセスし、`Consumer Key(API key）` と `Consumer Secret(API secret key）` を取得します。

取得した`Consumer Key`と`Consumer Secret`を`:`（コロン）で連結し、Base64エンコードをかけます。


```
$ echo -n <CONSUMER_KEY>:<CONSUMER_SECRET> | openssl enc -e -base64 | tr -d "\n"
```


前述のコマンドを叩くと、以下のような`Bearer Token credentials`が生成されます。

```
eHZ6MWV2RlM0d0VFUFRHRUZQSEJvZzpMOHFxOVBaeVJnNmllS0dFS2hab2xHQzB2SldMdzhpRUo4OERSZHlPZw==
```

# Bearer Tokenを取得する

先ほど生成した`Bearer Token credentials`を使って、`Bearer Token`を取得します。
Twitterの[POST oauth2/token](https://developer.twitter.com/en/docs/basics/authentication/api-reference/token)にリクエストを投げます。

```
$ curl -X POST \
       -H "Authorization: Basic <BEARER_TOKEN_CREDENTIALS>" \ 
       -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" \ 
       -d "grant_type=client_credentials" \ 
       "https://api.twitter.com/oauth2/token"
```

リクエストが成功すると、以下のようなレスポンスが返ってきます。

```
{"token_type":"bearer","access_token":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%2FAAAAAAAAAAAAAAAAAAAA%3DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"}
```



`access_token` キーの値が`Bearer Token`です。

# Twitter APIでBearer Tokenを使う

実際にTwitter APIで使う際は、取得した`Bearer Token`を`Authorization`ヘッダに含める形となります。

```
$ curl -H "Authorization: Bearer <BEARER_TOKEN>" \ 
    "https://api.twitter.com/1.1/statuses/show.json?id=1218693176170434560" | jq
```

基本的な流れは公式ドキュメントの手順通りですが、具体的なコマンドの記載がなかったため地味に苦戦しました。
[Application-only authentication — Twitter Developers](https://developer.twitter.com/en/docs/basics/authentication/oauth-2-0/application-only)


ちなみにcurlでサクッとAPIのJSONレスポンス見る際は、jqコマンドが大変便利です。未導入の方はぜひインストールしてみてください。
[jqコマンドでcurlのJSONレスポンスを見やすくする - Qiita](https://qiita.com/unsoluble_sugar/items/8a1fcbec2d5e336ecbf3)
EmacsでVueファイルを編集するときの設定

Emacsでvueファイルの編集をするときの設定です。
ありがたいことにVueを書く機会が増えてきたので、ちゃんと設定しておこうかなと。
`vue-mode` という拡張を使ってみたけど、全然シンタックスハイライトしなかったので諦めました。
vue-modeはどうやら `mmm-mode` という拡張を使用しているとのことだったので、「じゃあmmm-modeとやらで自分で設定すれば良いんじゃね？」と思い設定したわけです。

## Vueファイル編集するときの設定

結論から。
色々と問題は有りますが、下記のような設定に落ち着きました。

```elisp
;; ************************************************************************
;; mmm-mode
;; ************************************************************************
(use-package mmm-mode
  :ensure t
  :config
  (setq mmm-global-mode 'maybe)
  (setq mmm-submode-decoration-level 2)
  (set-face-background 'mmm-default-submode-face "gray13")

  (mmm-add-classes
   '((vue-embeded-slim-mode
      :submode slim-mode
      :front "^<template.*lang=\"pug\">\n"
      :back "^</template>")
     (vue-embeded-web-mode
      :submode web-mode
      :front "^<template>\n"
      :back "^</template>\n")
     (vue-embeded-js-mode
      :submode js-mode
      :front "^<script>\n"
      :back "^</script>")
     (vue-embeded-scss-mode
      :submode scss-mode
      :front "^<style.*lang=\"scss\">\n"
      :back "^</style>")))

  (mmm-add-mode-ext-class nil "\\.vue\\'" 'vue-embeded-slim-mode)
  (mmm-add-mode-ext-class nil "\\.vue\\'" 'vue-embeded-web-mode)
  (mmm-add-mode-ext-class nil "\\.vue\\'" 'vue-embeded-js-mode)
  (mmm-add-mode-ext-class nil "\\.vue\\'" 'vue-embeded-scss-mode))
```

![Screenshot from 2020-02-11 23-29-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233666/15d49668-2270-83e4-e770-d6b120330872.png)

### 設定の解説

#### サブモードが適用されている範囲の背景色を設定する

背景色を `gray13` に設定しています。

```elisp
(set-face-background 'mmm-default-submode-face "gray13")
```

補足）
色指定は `#xxxxxx` 形式でも良いですが、 `M-x list-colors-display` でも確認できます。

![Screenshot from 2020-02-11 23-33-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233666/b68caa2d-bb68-7ce7-769a-79c9b309db7c.png)

#### サブモードの設定をする

```elisp
(vue-embeded-slim-mode ; サブモード名
 :submode slim-mode ; 適用させるモード名
 :front "^<template.*lang=\"pug\">\n" ; どこから
 :back "^</template>") ; どこまで
```

front と back は正規表現で指定します。
正規表現は `M-x regexp-builder` でtry and errorしながら設定しました。
Vueの場合は下記のようなケースがあるので、 `^` を指定してあげないとだめです。
（私のVueの書き方がおかしいのかもしれない気がしてきた。）

```vue
<template>
  <div id="hoge">
    <h1>Hoge</h1>
    <template>
      <h2>fuga</h2>
    </template>
  </div>
</template>

```

## mmm-modeについて

1つのメジャーモードの中で複数のメジャーモードを適用させることができるパッケージです。
例えば、 `hoge.rb` ファイルを開いたときにメジャーモードとして `ruby-mode` が適用される設定の場合、コードのとある箇所は `js-mode` を適用する、みたいなことができるようになります。（そんなことしたいシチュエーションは無いと思うが...）

cf. https://github.com/purcell/mmm-mode

## 最後に

- 予測変換が動かないぽい（company）
- 別に背景色は変えなくても良いかな
- たまにインデントが変な感じになる（特にslim-mode）
- 都度 `web-mode-reload` しないといけなさそう
    - 案1) saveのときにhookさせるか
- Land of Lispって本読み中だよ〜
- ~~VSCode便利すぎない？~~

## 参考

- https://totemn.hatenadiary.org/entry/20091205/p1
- https://r-takaishi.hatenadiary.org/entry/20111101/1320161117
- https://github.com/purcell/mmm-mode
Auth0がサブドメインで提供している機能一覧

Auth0はサブドメイン（xxx.auth.com）で様々なサービスや機能を公開していますが
一覧としてまとまっているドキュメントを見つけられなかったので、自分の知っている範囲で書き出してみます。

## status.auth.com
https://status.auth0.com/

<img width="409" alt="スクリーンショット 2020-02-11 23.44.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490013/bf585ab6-a5e3-e857-0c61-6b6d6e2f7eb3.png">

Auth0の稼働状況が公開されてます。

## support.auth0.com
https://support.auth0.com/

<img width="385" alt="スクリーンショット 2020-02-11 23.43.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490013/be21cb0d-cf8c-f50d-c2bc-aace623b9b47.png">

利用しているサブスクリプションの管理機能や、その他情報・文書がまとまっているページ。

* サブスクリプション管理
* お知らせ一覧
* サポートチケット管理
* テナント管理
* 使用状況確認
* ホワイトペーパーやSLAなどの文書一覧

## flows.auth0.com
https://flows.auth0.com/

<img width="714" alt="スクリーンショット 2020-02-11 23.42.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490013/f71325c2-48a6-8c78-f5b9-910ecbf73a84.png">

Universal Loginの画面遷移図みたいなのを表示してくれる。
実際のUniversal Loginみたいにロゴや色をカスタマイズ可能。

## explorer.auth0.com
https://explorer.auth0.com/

<img width="519" alt="スクリーンショット 2020-02-11 23.44.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490013/dcff2b21-33e1-beed-2e3d-5edb23c8df5a.png">

Auth0のテナント構成内容の俯瞰図を作成してくれます。
アプリケーションのアイコンをクリックすると、そのアプリケーションの処理フローが表示され、処理フロー上の各要素（RulesやMFA設定など）の内容も確認できます。

## uptime.auth0.com
http://uptime.auth0.com/

![スクリーンショット 2020-03-06 12.34.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490013/9c38f01a-4d8e-9cbb-76d7-6f9c2f5b1b9e.png)

Auth0のuptimeが公開されています。
【Python】Blueprintを使って大きなFlaskファイルを分割する

# はじめに
pythonのwebフレームワークであるFlaskを使ってWEBアプリをつくっていると、Flaskのファイルの行数が多くなってしまいがちなのでファイル分割を検討した。FlaskではBrueprintを使ったファイル分割が一般的なようで、今回Blueprintを使用してファイルを分割した。

# ディレクトリ構成
```  
├── main.py
├── COMP_A
│   └── func_A.py
├── COMP_B
│   └── func_B.py
└── templates
    ├── COMP_A
    │   ├── index_A_1.html
    │   └── index_A_2.html
    └── COMP_B
        ├── index_B_1.html
        └── index_B_2.html
```
メインプログラムはmain.pyとする。またこの他にコンポーネントA、Bがあるものと想定。  
各コンポーネント内のfunc_A.py、func_B.pyはそれぞれFlaskを使用するファイル。  

flaskでは、template配下にはhtmlファイルを格納するが、今回はtemplate配下にコンポーネントごとのディレクトリを準備して、htmlファイルを格納した。

# ソースコード

## func_A.py
```python
from flask import render_template
from flask import Blueprint

bpa = Blueprint('bpa', __name__, url_prefix='/A')

@bpa.route('/a1')
def app_a1():
    return render_template('COMP_A/index_A_1.html')
    #return "hello A a1"

@bpa.route('/a2')
def app_a2():
    return render_template('COMP_A/index_A_2.html')
    #return "hello A a2"
```

## func_B.py
```python

from flask import render_template
from flask import Blueprint

bpb = Blueprint('bpb', __name__, url_prefix='/B')

@bpb.route('/b1')
def app_b1():
    return render_template('COMP_B/index_B_1.html')
    #return "hello B b1"

@bpb.route('/b2')
def app_b2():
    return render_template('COMP_B/index_B_2.html')
    #return "hello B b2"
```
## main.py
```python
from flask import Flask

app = Flask(__name__)

from COMP_A.func_A import bpa
from COMP_B.func_B import bpb

@app.route('/')
def index():
    return 'Hello main'

app.register_blueprint(bpa)
app.register_blueprint(bpb)

if __name__ == '__main__':
    app.debug = True
    app.run(host='127.0.0.1',port=60000)
```
本来、Flask(__name__)で生成したappに対し、関数を登録していくが、別ファイルの関数の場合には、register_blueprintを使って  Brueprintをappに登録していく。  
この際、事前に別関数のBrueprintをimportするのを忘れないこと。

# 呼び出し
URLに以下を指定
```
127.0.0.1:60000/      #main.py   index()
127.0.0.1:60000/A/a１  #func_A.py  app_a1()
127.0.0.1:60000/A/a2  #func_A.py  app_a2()
127.0.0.1:60000/B/ｂ1  #func_B.py  app_b1()
127.0.0.1:60000/B/ｂ2  #func_B.py  app_b2()
```
URLはBrueprint指定時のPrefixと@xxx.route定義時のパスの組み合わせになる点に注意


# その他

- moduleを使ったファイル分割
flask.moduleを使ってファイル分割を行う方法もある様子。次回検討。

- redirect
redirectを行うときにはapp名を指定する必要がある。例えばb2にredirectするには以下のように書く。

```Python
return redirect(url_for('bpb.b2'))
```
GASでSplatoon2のLinebotを作ろうとして頓挫した話

タイトルの通り、GASでSplatoon2のLinebotを作ろうとしたら仕様に引っかかって頓挫したよっていう話。
私はプログラミング玄人ってわけではないので(JavaScriptに関してはほぼ初心者の域)細かな事はよくわかりません。間違ってたらごめんね。

# 作りたかったもの
リーグマッチとプライベートマッチの参加者募集をするbot。
｢リグマ21募集｣と送信するとルールとステージを表示した上でボタンを作成し、リグマのイベントを作成
参加ボタンを押せば参加登録がされ、人数が揃えば自動で締め切って時間になったら通知してくれる
的なbotを作ろうとした。
動作イメージはこんな感じ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575381/8d0c7368-aa39-7621-299a-ed96cec1de93.jpeg" width="500pt">

#使ったもの(使おうとしたもの)
GoogleAppScript
[Spla2 API]
GoogleSpreadSheet

#結論(なぜ頓挫したか)
GASの仕様に敗北した。

- Spla2 APIを使う際にuser-Agentを設定する必要がある(詳しくはSpla2 APIの公式ページへ)
- GASの仕様でuser-Agentが`Mozilla/5.0 (compatible; Google-Apps-Script)`に固定されてしまう([記事参照](https://qiita.com/uu4k/items/e20837cacc4fa19efe32))

というわけでGASからSpla2 APIを叩いてスケジュールを呼び出すことができなかった。詰みです。
こればっかりはどちらも悪くないしなあ...ってことでGASでの開発は諦めた。

#できたこと

- GASを使って自動応答botの作成
- ボタンの送信
- テキストとボタンの同時送信

とまあ調べれば誰でもできそうなところまで実装したうえで
「API叩いてみるか...そういえばuser-Agent設定せなあかんよな...どうやるんやろ...」
と調べたら[こんな記事](https://qiita.com/uu4k/items/e20837cacc4fa19efe32)が見つかってしまい「Oh...」と居もしない自分の中のアメリカ人が嘆いてしまったといった流れ。

#打開策
Spla2 APIを叩けるようにしないと話にならないので、潔く環境を変えることにした。
個人でサーバーを保有しているわけではないので(VPS持ってるけど3月に契約解除するので...)無料で使える運用サーバー...と考えてHerokuを使うことにした。
##使うもの
Python
Heroku
MySQL
[Spla2 API]
[Spla2 API]:https://spla2.yuu26.com/
<br>
今作っているところなので作ったらまた開発の流れとかコードとか公開しようかね...って思ったり思わなかったり。

#参考記事

- [GASでクローラ作る際に使った機能](https://qiita.com/uu4k/items/e20837cacc4fa19efe32)
Bashでインストーラーの<==>が動くやつを作る

[このスクリプト](https://github.com/mk-linux419/bash-installer-template.git)の解説です。
#最初の部分
```
bash test.bash >/dev/null 2>&1 &　#子スクリプトの実行
id=$! #子スクリプトのpidを取得
```
">/dev/null/ 2>&1"で子スクリプトの実行しているものをこちらで表示しないようにしています。
"$!"は直前のpidをの値が代入されます。それを"id"に代入しています。pidは子スクリプトの終了を感知するのに使います。
##子スクリプトの実行するところの最後に"&"をつけている理由
プログラムは上から下へ実行されていきます。これは、bashのスクリプトも例外ではありません。プログラムは基本的には前の動作が終わらない限り、次の動作には移りません。このスクリプトの場合、子スクリプトが終わるまで、次の動作には移れないのです。これはインストーラーとしては致命的です。しかし、bashでは最後に"&"をつけるだけで次の動作に移ることができます。
#名前等の定義
```
name="テスト" #名前の定義
action="テスト" #アクションの名前を定義
name_size=$(printf "$name" | wc -c) #名前のサイズを取得
action_size=$(printf "$action" | wc -c)　＃アクションの名前のサイズを取得

#名前が日本語か判断
#名前の先頭がaからｚまたはAからZでなければ"name_size"の再定義
if [[ ! $(echo $name | head -c1) == [a-z] ]] ||  [[ ! $(echo $name | head -c1) == [A-Z] ]]
then
    name_size="$(($name_size-$(($name_size/3))))" |
fi

#アクションの名前が日本語か判断
#アクションの名前の先頭がaからｚまたはAからZでなければ"action_size"の再定義
if [[ ! $(echo $action | head -c1 ) == [a-z] ]] || [[ ! $(echo $action | head -c1 ) == [A-Z] ]]
then
    action_size="$(($action_size-$(($action_size/3))))"
fi
```
##日本語か判断する理由
日本語か判断しているところをコメントアウト(先頭に"#"をつける)して実行すると、

```
コメントアウトしていないもの:テスト [テスト] [<==>　　                                                        ]
コメントアウトしたもの　　　:テスト [テスト] [<==>　　　                                                 ]
```
長さが変わりました。
日本語の表示にはUTF-8ってやつが絡んでくるですが"a"と"あ"じゃ文字の大きさが微妙に変わってきます。そのせいなのかわからないのですが、日本語だとこういうことが起きてしまいます。なので日本語かどうか判断しています。
#ウィンドウのサイズの取得等
```
# ウィンドウのサイズを取得
window_size=$(resize | grep "COLUMNS=" | grep -oP "[1-9][0-9]*")
# バーの長さを決定
if [ $window_size -gt 100 ]
then
    bar="<======>"
elif [ $window_size -gt 80 ]
then
    bar="<====>"
elif [ $window_size -gt 50 ]
then
    bar="<==>"
else
    bar="<>"
fi
```
とくに言うことはないです。"resize"を実行したときに出る表示を"grep"で取得しているだけです。
# バー関連
```
bar_tail="$(printf "$bar" | tail -c1)" #バーの最後、今回は">"を取得
bar_head="$(printf "$bar" | head -c1)" #バーの先頭、今回は"<"を取得
bar_size="$(printf "$bar" | wc -c)" #バーのサイズを取得
list="$(printf "$bar""$(printf "%0*d\n" $(($window_size-$name_size-$bar_size-$action_size-6)) | sed 's/0/ /g')\n")"
```
##最後の行の解説
```
#これで必要な空白の数を計算
#その１　$(($window_size-$name_size-$bar_size-$action_size-6)) 
#バーと必要な空白を表示
#その２ printf "$bar""$(printf "%0*d\n" #その１ | sed 's/0/ /g')\n"
```
そして、#その２を"list"に代入しています。
#表示
```
mode="1" #バーが左から右に移動
while : #無限ループ
do
  sleep 0.01
  #上書き表示
  printf "$action [$name] [$list]\r"
  #子プロセスが終了したらループを抜ける
  if [ -z "$(ps $id | grep -v "PID")" ]
  then
      break 2
  fi
  if [ "$mode" = "1" ]
  then
      #バー[] => []バー　みたいな感じで置き換えているだけです。
      list="$(printf "$list" | sed 's/'$bar' / '$bar'/g')"
      #バーが右端に来る、今回は"==>]"こうなったらモードが2になります。
      if [ "$(printf "[$list]" | tail -c2)" == "$bar_tail]" ]
      then
          mode="2" #バーが右から左に移動
      fi
  else
      #[]バー => バー[]　みたいな感じで置き換えているだけです。
      list="$(printf "$list" | sed 's/ '$bar'/'$bar' /g')"
      #バーが左端に来る、今回は"[<=="こうなったらモードが1になります。
      if [ "$(printf "[$list]" | head -c2)" == "[$bar_head" ]
      then
          mode="1"
      fi
  fi
done
echo -e "\n終了しました。" #バーなどとかぶらないように改行して表示しています。
```
#最後に
分からないところがあったら[twitter](https://twitter.com/mk_linux419)にDMください。
【備忘録】Ruby : 基本的なprocオブジェクトの使い方とyieldの使い方

参考: https://shinmedia20.com/ruby-proc

```ruby:sample.rb

addAB =  Proc.new { |a,b| a.to_i+b.to_i }
#ブロックをオブジェクト化
puts "和は#{addAB.call(2,4)}です。"
#callで実行することでオブジェクト化したブロックの処理を行える。
puts "三つ目の引数を加えた和は#{addAB.call(2,4,4)}"
#三つ目の引数は無視される


def sample(&sample_proc)
	#引数にブロックを渡すsampleメソッド
	#引数に&をつけることでブロックだと認識させている。
	puts sample_proc.call(2)
	#渡されたブロックに引数を2を渡して実行する。
end
sample { |n| n**4 }
#sampleメソッドに引数 { |n| n**4 } を渡している。
#sampleメソッド内でブロック変数2を渡してブロックを実行している。


def sample2 (&block)
	puts block.call(3)
end
sample2 { |n| n*n }
##出力値は 9


def sample3(&block)
	puts yield(5)
	# yield は引数で渡されたブロックを実行する
	# つまり渡された引数(ブロック)に対してcallメソッドを使わなくても良い。
end
sample3 { |n| n*n }


def sample4
	# sample3の引数(ブロック)の記述なしver
	puts yield(6)
end
sample4 { |n| n*n }


def sample5
	if block_given?
		#メソッドに引数としてブロックを渡したか判定
		#渡しているなら true , 渡していないなら false
	puts yield
	else
		puts "blockは渡されませんでした"
	end
end

sample5
## 引数を渡していない : expect => blockは渡されませんでした
sample5 { puts "blockです" }
## 引数を渡している : expect => blockです


```
dockerでCentOSのイメージを使ってみる

## 環境情報
* OS: Linux (centos 7.7.1908)
* docker: 19.03.5

## 手順
### centos7のイメージを取得
```
docker pull centos:7
```

実行結果

```
[root@centos-sample aky100200]# docker pull centos:7
7: Pulling from library/centos
ab5ef0e58194: Pull complete
Digest: sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
[root@centos-sample aky100200]#
```

### イメージの確認
```
docker images
```

実行結果

```
[root@centos-sample aky100200]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   5e35e350aded        3 months ago        203MB
hello-world         latest              fce289e99eb9        13 months ago       1.84kB
[root@centos-sample aky100200]#
```

### 起動
```
docker run -it -d --name centos7 centos:7
```

実行結果

```
[root@centos-sample aky100200]# docker run -it -d --name centos7 centos:7
fdc5ffc971420c60228330c1b9f7b4030878836e74f5590614774e8d35518694
[root@centos-sample aky100200]#
```

### プロセスの起動を確認
```
docker ps
```

実行結果

```
[root@centos-sample aky100200]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
fdc5ffc97142        centos:7            "/bin/bash"         About a minute ago   Up About a minute                       centos7
[root@centos-sample aky100200]#
```

### コンテナ内コマンドの実行
```
docker exec -it centos7 /bin/bash
```

実行結果

```
[root@centos-sample aky100200]# docker exec -it centos7 /bin/bash
[root@fdc5ffc97142 /]#
```

### まとめ
イメージの作成ができた。

## 参考
* [DockerでCentOS 7のイメージを利用してみよう | WEB ARCH LABO](https://weblabo.oscasierra.net/docker-centos7/)
Intel Parallel Studio XE のインストール

# What's this?
Intel Parallel Studio XE のインストールガイド
と言っても大した内容ではないけど.
環境は `mac OS 10.14.6 Mojave` で, `Intel® Parallel Studio XE Composer Edition for C++ macOS (2020 Initial Release)` と `Intel® Parallel Studio XE Composer Edition for Fortran macOS (2020 Initial Release)` をインストールします.

# Intel Parallel Studio XE Composer Edition for C++ のインストール
1. Intel Developper Zoneの[ここ](https://software.intel.com/en-us/parallel-studio-xe/choose-download#students)から自分が使用しているOS(ここでは`macOS`)を選ぶ.(アカウントがない人は作ってください)
2. `C++ macOS` を選ぶ.
3. `Full Package`, `Customizable Package` のどちらでも好きな方をダウンロードする.このとき, Serial numberを控えておく.
4. ダウンロードした`m_ccompxe_online_*.dmg`を開いて, 指示に従ってインストールする.
これでほぼ終わり(簡単).
 
# Intel Parallel Studio XE Composer Edition for Fortran のインストール
今時Fortran使うの?って思うかもしれませんが, 実際使うことあるので一応ね...
「Fortranなんて使わんわ」って人は無視してください.
手順はIntel Parallel Studio XE Composer Edition for C++とほぼ同じです.
1. `Fortran macOS` を選ぶ.
2. `Full Package`, `Customizable Package` のどちらでも好きな方をダウンロードする.このとき, Serial numberを控えておく.
3. ダウンロードした`m_fcompxe_online_*.dmg`を開いて, 指示に従ってインストールする.

# 環境変数の設定
`$HOME/.bash_profile` を編集して, ターミナルを起動するたびに環境変数を読み込むようにする.
`$HOME/.bash_profile` に次の1行を追加(デフォルトの`/opt/intel/`にインストールしたものとする).

```
source /opt/intel/bin/compilervars.sh intel64
```

`mkl` や `tbb` を使う場合は次も追加する.

```
source /opt/intel/mkl/bin/mklvars.sh
source /opt/intel/tbb/bin/tbbvars.sh
```

これで全て完了.
`c,c++` のソースコードをコンパイルする場合は

```
$ icc *.c
$ icpc *.cpp
```

`Fortran` のソースコードをコンパイルする場合は

```
$ ifort *.f90
```
Docker概要

# Dockerについて
コンテナ型の仮想環境を提供するソフトウェア。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499375/1e2468e2-18f8-a4f6-2686-94af8c311f3c.png)


## 主要な３つの機能
##  Dockerイメージを作る機能（build)
**DockerFile**というファイルに、インフラ情報（ライブラリや、ミドルウェアのインストールが記述されたファイル）を1つにまとめて、**Dockerイメージ**を作ることができる。
もしくは、Dockerコマンドを使って、手動で作ることも可能。

##  Dockerイメージを共有する機能(ship)
Dockerのイメージは、Dockerレジストリで共有することができる。
**Docker Hub**と呼ばれる、公式レジストリがある。
DockerHubには、Nginxや、ruby,pythonなどの公式イメージが置いてある。それらをコマンド１つでローカルPCのDocker上に構築することができる。
自作したイメージも、自由にDocker Hubに公開することができる。

## Dockerコンテナを動かす機能(run)
Dockerイメージを元にして、コンテナを作成することができる。
コンテナの起動/停止/削除は、Dockerコマンドを使うことによって可能となる。



## メリット：
- Dockerをインストールしている環境であれば、どこでも動くので、「開発、テスト環境では動いていたが、本番環境で動かない」というリスクを減らすことができる。
- 動作がとても軽い
- 自分自身も簡単に環境構築できるし、Dockerイメージを共有することにより、複数人での開発環境を簡単に揃えることができる。
iPadOS 13.4 beta 上の Swift Playgrounds で NavigationView

iPadOS13.4ベータ版でDoubleColumnNavigationViewStyleなNavigationviewが少しまともに動くようになったので、そのサンプルコードをメモ。

```swift
import SwiftUI

struct ContentView: View {
    static let items = Array(1...30)
    @State var selected: Int? = Self.items.first
    var body: some View {
        NavigationView {
            List(Self.items, id: \.self) { i in
                NavigationLink(destination: Secondary(item: i), tag: i, selection: self.$selected) {
                    Text("Item \(i)")
                }
            }
            .navigationBarTitle("Primary")
        }
    }
}

struct Secondary: View {
    var item: Int
    var body: some View {
        Text("Item \(item)")
            .font(.largeTitle)
            .navigationBarTitle("Secondary")
    }
}

import PlaygroundSupport

let controller = UIHostingController(rootView: ContentView())
PlaygroundPage.current.setLiveView(controller)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
    (controller.children.first as? UISplitViewController)?.preferredDisplayMode = .allVisible
}
```

![8254CAA7-1C42-4DB6-B5F0-F59866859E18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91569/3482d84b-2dbd-9d2c-4be7-3705c3e94e2c.png)


asyncAfterを使った手抜きコードだけど参考にはなるかと。