OmniAICreator/Qiita-1.07M huggingface dataset:
G's ACADEMY Tips Time　-BootstrapでサクッとCSS-

## こんな人に向けて書いています
- デザインが苦手
- CSSテンション上がんね(¬_¬)
- 見た目にあまりこだわりがない

---
# そんなあなたにBootstrap

---
## Bootstrapとは？
- Twitter社が開発・提供を始めた最も有名なCSSフレームワーク
- いい感じにCSSが効くように用意された素材集
- モバイルファースト、レスポンシブ対応
- グリッドシステム採用
- 使い方はHTML側でClassを指定するだけ
- 賛否両論あるが、デザイン苦手勢には救世主

---
## HTML側でClassを指定するだけ

---
### もう大量にclass名振りすぎて管理できない。しかも新たに名前が思いつかない！という訳分かんない悩みはない。ステキすぎますね。

---
## display:flex; え、なにそれ美味しいの？
使いたいパーツをちょちょいっと選べば、爆速でこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273745/3310acc3-b848-9e86-da23-36743129bba1.png)

---
## コードを書くための準備
1. デスクトップに新しいフォルダを作成。
2. HTML用意して、headタグの中でBootstrapを読み込む
3. あとはhtmlにクラスをつけていくだけ

---
## Bootstrapの読み込み
- `bootstrap cdn` で検索
<img width="807" alt="スクリーンショット 2019-10-02 9.38.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273745/b7fc8c38-c4d0-7e86-fb1c-5cafa897da38.png">

---
- ページを開くとこうなっているので、CSSの欄のタグをまるごとコピーしましょう
<img width="1121" alt="スクリーンショット 2019-10-02 9.38.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273745/879cac7e-d805-13b3-202d-3ef83589d9c4.png">

---
- あとは、class名をこんな感じにつけるだけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273745/0917ddc1-b11e-a944-0d3f-ffef85f38bdc.png)

---
<img width="818" alt="スクリーンショット 2019-10-04 3.20.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273745/ac7baaf0-b2d3-ae7a-6272-fa7c72f2333b.png">

---
### ちなみに。
Bootstrapを読み込んでいなかったら、style.cssを用意して、最低これくらい書かないとダメなのです。

```css
.text-success {
  color: green;
}
.container {
  max-width: 720px;
  width: 100%;
  padding-right: 15px;
  padding-left: 15px;
  margin-right: auto;
  margin-left: auto;
}
.card {
  position: relative;
  display: -ms-flexbox;
  display: flex;
  -ms-flex-direction: column;
  flex-direction: column;
  min-width: 0;
  word-wrap: break-word;
  background-color: #fff;
  background-clip: border-box;
  border: 1px solid rgba(0, 0, 0, 0.125);
  border-radius: 0.25rem;
}
.card-img-top {
  width: 100%;
  border-top-left-radius: calc(0.25rem - 1px);
  border-top-right-radius: calc(0.25rem - 1px);
}
.card-body {
  -ms-flex: 1 1 auto;
  flex: 1 1 auto;
  padding: 1.25rem;
}
.card-title {
  margin-bottom: 0.75rem;
}
.card-text {
  flex: 1 1 auto;
  padding: 1.25rem;
}
```
---
## HTML側に書くclass名の調べ方

---
## Bootstrapチートシート
素晴らしい方が、こういうのを作ってくれています。感激。

https://hackerthemes.com/bootstrap-cheatsheet
コピペ → テキスト編集 → 終わり
<img width="1425" alt="スクリーンショット 2019-10-06 21.22.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273745/800bd62c-b061-9bf9-8b73-e351318e75fe.png">

---
## CSSチートですね😏

---
## おすすめ検索ワード
- bootstrap テンプレート
- bootstrap テーマ

ベースにBootstrapを使いつつ、デザインテンプレートとして使えるようにCSSをプラスアファしてくれているライブラリが見つかります。よりデザイン性を高めたいとか、Bootstrap的な配色に飽きてきたら取り入れると良さげ。

---
#### 余談: HTMLを全く触ったことない人向けに作った[資料です。](https://qiita.com/makimoch/private/0e9fa01a714a6a90d6c2)皆さんには当たり前すぎて退屈かもしれませんがよかったら読んでみてください。。。
Multiple commands produce 

# Multiple commands produce これが出ましたら

## 概要
ビルドを行おうとしたらこんなエラーが出ました。

//:-1: Multiple commands produce '/Users/yamadatakayuki/Library/Developer/Xcode/DerivedData/sevens-fmjcmstkdwmtzkeutizzbaxfjoff/Build/Products/Debug-iphonesimulator/sevens.app/README.md':
//1) Target 'sevens' (project 'sevens') has copy command from '/Users/yamadatakayuki/code/github/sevens/sevens/Reducer/LibraryDesutte/README.md' to '/Users/yamadatakayuki/Library/Developer/Xcode/DerivedData/sevens-fmjcmstkdwmtzkeutizzbaxfjoff/Build/Products/Debug-iphonesimulator/sevens.app/README.md'
//2) Target 'sevens' (project 'sevens') has copy command from '/Users/yamadatakayuki/code/github/sevens/sevens/UIKit/NankanoLibrary/README.md' to '/Users/yamadatakayuki/Library/Developer/Xcode/DerivedData/sevens-fmjcmstkdwmtzkeutizzbaxfjoff/Build/Products/Debug-iphonesimulator/sevens.app/README.md'
//3) Target 'sevens' (project 'sevens') has copy command from '/Users/yamadatakayuki/code/github/sevens/sevens/UIKit/SAConfettiView/README.md' to '/Users/yamadatakayuki/Library/Developer/Xcode/DerivedData/sevens-fmjcmstkdwmtzkeutizzbaxfjoff/Build/Products/Debug-iphonesimulator/sevens.app/README.md'

これが出たら同じファイルをビルドに含めないで〜

的な理由なので、ビルドから外すとビルドできます。
[Laravel + React.js] after emitting SizeLimitsPluginが出た時の対処法

# 記事にする目的
今回、Laravelで開発を行なっているときに、このエラーでかなり困ったので、自分用のメモとして残しておきます。
起こった事象に対する解決策を書く形なので、該当する方のみご覧ください。
また、解決はしたものの、勉強不足でなぜ解決できたかわかってないので、教えていただけたら幸いです。

# 開発中につまづいたこと
開発環境は、
 - Laravel Framework : 6.0.3
 - react : ^16.2.0
で、Laravelのviewの部分にReact.jsを使っています。

つまづいたのは、コンパイルをyarnを用いて`yarn run watch`で変更を監視して開発を行なっていて、
Reactで画像を表示させようとした時に、コンパイルがエンドレスに続いて、`after emitting SizeLimitsPlugin`という文字が出ていたところです。

その時のコードを簡易に表現したものがこちらです。
（参考 : https://create-react-app.dev/docs/adding-images-fonts-and-files）

```index.js
import demo from './demo.png';

function Demo() {
  return <img src={demo} alt="Demo" />;
}
```

これでコンパイルするとエンドレスに行われてしまいます。。。
ここで、解決策は以下のようになります。

```index.js
function Demo() {
  const demo = './demo.png';
  return <img src={demo} alt="Demo" />;
}
```
これで`yarn run watch`は正常に行われます。パスをインポートせずに定数として宣言すれば、
コンパイルが無限に行われることはないようです。

以上になります。

# 参考
 - https://create-react-app.dev/docs/adding-images-fonts-and-files
環境設定 git clone

## 背景
git clone を使いたいですよね。。。
windowsユーザーが使えるようになるととても便利です。
キーワードはChocolatey。
 
[金子邦彦研究室](https://www.kkaneko.jp/tools/win/chocolatey.html)様のwebサイトを参考にさせていただきます。
大変分かりやすく、勉強になります。

## Chocolatey インストール
コマンドプロンプトを[管理者として権限]で実行

```cmd:cmd_[管理者として権限]
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
```

## git インストール
一回閉じて、再度コマンドプロンプトを[管理者として権限]で実行

```cmd:cmd_[管理者として権限]
choco install -y git
```

## 環境変数
以下を設定する。

```
 C:\Program Files\Git\cmd
```
イメージ画像
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503403/3fa532ce-8ae4-e6e8-5d8f-6b6c666d28c1.png)

## 動作確認
適当なディレクトリを作成し、コマンドプロンプトを移動 (cd ディレクトリパス) します。

```cmd:cmd_[管理者として権限]
C:\Users\PIKOPIKO>cd C:\demo

C:\demo>git clone https://github.com/yusa0827/191003_py_hello_world
```

指定のディレクトリにgitファイル(中身はpyファイル)があれば成功です。

**実装できることを、心からお祈り申し上げます。**

## 参考文献
[金子邦彦研究室 厳選，よく使うツール (Chocolatey, git, cmake, wget, 7zip) のインストール](https://www.kkaneko.jp/tools/win/chocolatey.html)
[Chocolateyを使った環境構築の時のメモ](https://qiita.com/konta220/items/95b40b4647a737cb51aa)
[Chocolatey入門】導入から注意点、今後の可能性まで](https://qiita.com/kangetsu121/items/b6352b547cd32e71bc65)
自己紹介したら、FE聖魔ルーテのように返されるプログラム

#戦士ガルシアの息子ロス
少しでも楽しくプログラムをかけるように好きなゲームのFE（ファイアーエムブレム）要素を入れて書いています。Pythonは本格的に初めて1ヶ月ちょいくらいです。

#プログラム
import jaconv
from pykakasi import kakasi

sensi = input("父親の職業を入力（漢字かひらがなかカタカナ）：")
garusia = input("父親の名前を入力（漢字かひらがなかカタカナ）：")
namae = input("自分の名前を入力（漢字かひらがなかカタカナ）：")

kakasi = kakasi()#kakasiに、kakasi()を。kakasiは関数名、()は引数リスト
kakasi.setMode('J', 'K')#漢字とカタカナ
kakasi.setMode('H', 'K')#ひらがなとカタカナ
conv = kakasi.getConverter()

kata1 = jaconv.hira2hkata(sensi)
kata2 = jaconv.hira2hkata(garusia)
kata3 = jaconv.hira2hkata(namae)

print("そうですか。"+conv.do(sensi)+conv.do(garusia)+"ノムスコ"+conv.do(namae)+"、長い名前ですね。")

#やり方と参考
https://qiita.com/shakechi/items/d12641d6cad01479785f
http://xn--u9j207iixgbigp2p.xn--tckwe/archives/10599
https://qiita.com/komorin0521/items/8cd1eb0cdb4a9ede217e
などを参考にしました。

一つ目のリンク神。
jaconvとkakasiを使えるようにして、あとは特に難しいことはなしでシンプルに。

#ネタ元
https://www.nicovideo.jp/watch/sm1322743
（3分15秒〜）
Kubernetes操作コマンド虎の巻

# 内容
よく使うコマンドメモです
たぶんこれ知っていれば一通りいじれるのでは

## リソースをデプロイ
DeploymentリソースもServiceリソースも同じコマンド
`create` だと最初の一回だけ、 `apply` だとリソースファイルを修正後に動的に変更もできる

```
kubectl apply -f ./nginx-deployment.yml
```

## Podの状態確認
Pod状態を確認するのでとても重要

```
kubectl get pod
```

## Service状態確認
ネットワーク疎通のための情報を確認するために重要

```
kubectl get service
```

## Podの詳細情報を確認
runnnigにならない時は、とりあえず`describe`でチェック

```
kubectl describe pod nginx
```

## Podの状態を動的に見ることができる
コンテナイメージをダウンロードしてくる処理がある場合、結構時間かかったりするので、watchしておきたい

```
kubectl get pod --watch
```

## Deployment状態確認
Deploymentをデプロイしていると、Podを消しても自己再生します

```
kubectl get deployment
```

## PersistentVolume状態確認
共有ディレクトリや恒久的なファイル置き場として作成することがある

```
kubectl get pv
```

## PersistentVolumeClaim状態確認
Podは、直接PersistentVolumeは見に行かず、こちらのPersistentVolumeClaimを参照する
`describe`でVolume系のエラーが出ていたらとりあえずチェック

```
kubectl get pvc
```

## DNSなどKubernetes本体のリソース情報を確認
オプションなしでのデプロイだと`default`のNamespaceにデプロイされる
Kubernetes関連リソースは `kube-system` でデプロイされる

```
kubectl get service --all-namespaces
```

## DNS状態確認
一時的に使い捨てPodを起動して、名前解決を行わせることで、DNSが動作しているかチェック

```
kubectl run --image=centos:6 --restart=Never --rm -i testpod -- nslookup google.com
```

## リソース削除
Deployment,Service,PersistentVolumeなど全て同じ構文で消せます
消えない時は、とりあえず`--force`オプションをつけます

```
kubectl delete pod
```

## Podへログイン
ログを見たり、yamlに書いてあることを直接実行して切り分けをしたり

```
kubectl exec -it nginx /bin/bash
```

## イメージを指定してPodを起動
runオプションで起動します。Dockerと一緒

```
kubectl run -i centos7 --image=centos7
```

## タブ補完
- `.bashrc`に追記しておきます

```
source <(kubectl completion bash)
```
情報セキュリティ入門

<h1>はじめに</h1>
私が情報セキュリティについて学び始めるにあたって必要なことはメモしていく所存

<h1>情報セキュリティが満たすべき性質（CIA）</h1>

情報セキュリティは標準規格として `JIS Q 27001` が定義されている
情報セキュリティとは `機密性`、`完全性`、`可用性` を維持するもの
3つの単語の頭文字をとって情報セキュリティの `CIA` と呼ぶことがある

<h2>機密性</h2> 
*Confidentiality*
**許可されたものだけに情報へのアクセスを許可する性質**

- ユーザーIDとパスワードによってユーザーを識別し、不正アクセスを防ぐ。
- ユーザーを識別子 権限の付与を行うことで、権限を超えた情報操作をできないように制御する
- 許可されていない個人、エンティティ、プロセス対して情報を使用させず、開示しない

<h2>完全性</h2>
*Integrity*
**情報や情報の処理方法が正確で改ざんされていないことを表す性質**

- 不正アクセスによりデータの削除や改竄がされないようにする
- 正確さ及び完全さの特性

<h2>可用性</h2>
*Availability*
**許可されたものが必要なときに情報に正しくアクセスできる、異常をきたさないようにする性質**

- コンピュターウィルスやクラッカー／自然災害などあらゆる脅威から守りシステムがダウンしないようにする
- 許可された個人、エンティティ、プロセスが要求したときにアクセス及び使用が常に可能である特性
    - 可用性を高めるためには、システム管理と同じでストレージを2重にして耐障害性を上げるなど


<h1>情報セキュリティのAAR</h1>
更にAARを付け加えることもある

<h2>真正性</h2>
*Authenticity*
**利用者の身元を主張どおりであると保証する性質**

<h2>[重要！] 責任追跡性</h2>
*Accountability*
**５W1H（誰がいつどこでなにをした）を記録し、後で追跡できるようにする性質**

<h2>信頼性</h2>
*Reliability*
**業務や情報システムが正常に機能し、矛盾が生じたり異常な結果に終わることがない性質**

<h2>否認防止</h2>
*Non-Repudiation*
取引や操作の事実があとで、否認されることがないようにする性質
環境設定 OpenCV for C++

メモ代わりにピコピコします。
開発言語と実装環境とプロパティページと環境変数をピコピコします。

余裕があったら、スクリーンショットを載せれればいいかなとおもいます。

## 開発言語
・C++

## 実装環境
・Windows 10 64bit
・Visual Studio 2017 Community
・OpenCV ver 4.0.0


## プロパティページ
・C/C++ → 全般 → 追加のインクルードディレクトリ
C:\opencv\build\include
・リンカー → 全般 → 追加のライブラリディレクトリ
C:\opencv\build\x64\vc15\lib
・リンカー → 入力 → 追加の依存ファイル
Debug→opencv_world400d.lib
Releas→opencv_world400.lib

## PC内　環境変数
C:\opencv\build\x64\vc15\bin


## 参考文献
[Visual Studio 2017 Community DL link 1](https://docs.microsoft.com/ja-jp/visualstudio/releasenotes/vs2017-relnotes)
[Visual Studio 2017 Community DL link 2](https://www.visualstudio.com/thank-you-downloading-visual-studio/?sku=Community&rel=15)
[OpenCV 4.0.0 DL link 2](https://opencv.org/opencv-4-0/)
UE4でVS2019しかインストールしていない環境でVS2017が見つからないというエラーの対応方法

WARNING: Visual Studio C++ 2017 installation not found - ignoring preferred project file format.
ERROR: Unable to find Visual Studio 2017 toolchain; 'Latest' is an invalid version
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66029/82983c70-0c92-9327-a1a7-da9b7ff24167.png)

VisualStudio2017をインストールしていない際に、*Generate Visual Studio project files*を選択した時に出るエラーメッセージ。


[VC++チームブログC++ Binary Compatibility and Pain-Free Upgrades to Visual Studio 2019](https://devblogs.microsoft.com/cppblog/cpp-binary-compatibility-and-pain-free-upgrades-to-visual-studio-2019/)
上記のリンクでバイナリ互換性に関して説明があります。
VisualStudio2019のインストラーから過去のコンパイラをインストールする事が出来る為VisualStudio2017をわざわざインストールする必要はありません。


# 対象方法1

別プロジェクト(Blupeirntプロジェクト)を作成してエディター設定からソースコードの項目を変更します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66029/864d306c-d84e-8a34-5c9b-d2df298e7797.png)


# 対象方法2

設定iniファイルを編集してソースコードをアクセスするエディターをVisualStudio2019にします
対処方法1を直接設定ファイルを編集する事で対応する方法です

```:設定ファイルのパス
%USERPROFILE%\AppData\Local\UnrealEngine\4.22\Saved\Config\Windows\EditorSettings.ini
```

```ini:EditorSettings.ini
[/Script/SourceCodeAccess.SourceCodeAccessSettings]
PreferredAccessor=VisualStudio2017
```

|値|
|:--|
|VisualStudio2015|
|VisualStudio2017|
|VisualStudio2019|
|VisualStudioCode|
[SwiftUI] 画面の背景色を設定する方法


SwiftUIにおいて、画面全体の背景色を設定する方法はいくつかあります。

これが一番無難かと思います。

```swift
struct MyView: View {
  
  var body: some View {
    
    ZStack {
      Color.blue
        .edgesIgnoringSafeArea(.all)
      
      Text("Hello")
    }
    
  }
}
```

一応こんな方法も

```swift
struct MyView: View {
  
  var body: some View {
    
    Color.blue
      .edgesIgnoringSafeArea(.all)
      .overlay(Group {

        Text("Hello")

      })

  }
}
```
phpで月初、月末の日付をとる

いつも忘れるので。

# 月初
```
date('Y-m-1 00:00:00, $targetUxTime);
```

# 月末
```
date('Y-m-t 23:59:59, $targetUxTime);
```
※tは月の日数なので必ず最終日になる

# dateのformat
* [PHP Documentation](https://www.php.net/manual/ja/function.date.php)

# あれこれ
* strtotimeで"first date of month"とかでもできるけどこれが一番スマート感
[SwiftUI] Imageを指定した色で塗りつぶすには (tint)


SwiftUIにて、アイコンとなるImageを指定した色で塗りつぶす方法です。
他にも方法はあるかもしれません。

```swift
 Image("icon_name")
   .renderingMode(.template)
   .foregroundColor(.red)
```

## RenderingModeについて

`.renderingMode(.template)`　に関しては、xcassetsにてrendering modeを指定済であれば不要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8358/83b5a710-b78d-7d19-3f2d-a8163fa34ed3.png)
IBM Cloud functionsを触ってみた〜その2〜

[前回](https://qiita.com/K_M95/items/1cc94f03c91c7d17b4e2)はIBM Cloud FunctionsでLINE Notifyで通知をする部分をつくりましたが、Functionを起動するためのイベント（トリガー）をまだ設定していません。というわけで、今回はトリガーを設定することからやってみます。なお、この記事では[こちら](https://qiita.com/K_M95/items/1cc94f03c91c7d17b4e2#%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89)のコードで動作を確認できてるところから始めます。
# トリガーを選ぶ
Functionsの画面を開いたら左側のメニューから「トリガー」を選択します。初めての場合は以下のような画面が出るかと思いますので、```Create```をクリックします。

![スクリーンショット 2019-10-02 23.30.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/f1d90376-b337-3f06-61a9-97aa76d7e9f7.png)

すると以下のように設定可能なトリガーが表示されます。CloudantやGithubをトリガーにしたり、カスタムトリガーを使うことが出来たりします。今回はFaaSでよく使われるタイムトリガーを設定してみたいと思いますので、```Periodic```（左下の時計マーク）をクリックします。

![スクリーンショット 2019-10-02 23.34.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/48e1e913-b7e7-4587-9dd1-361fbde8c9fc.png)

#一定時間に通知する
ここからトリガーの設定を行います。Cronで設定も出来ますがここではPatternで簡単に設定します。今回は平日の朝7時にメッセージを通知するように設定します。このとき日時を設定するときはUTCですが、日本時間で今後の通知のタイミングが左に表示されるのでそこから時間を調整します。分単位で調整できるので、例えば「5分おきに通知」なんてこともできるようです。json payloadには特に値を設定する必要がないので、このまま```Create```で設定を完了させます。**一度作成すると、時間の編集は出来ないので時間を変更するときはまたはじめから作り直す必要があります。**

![スクリーンショット 2019-10-03 00.08.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/a607f871-810f-0af0-05a6-98e9185e12c1.png)

作成が終わると、トリガーの接続画面に移動します。では前回作成したアクションをこのトリガーと接続しますので、```Add```をクリックします。

![スクリーンショット 2019-10-03 00.21.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/e0c0fab8-ea97-ceee-a2a6-2f8667ef718c.png)

ここでは、新たに既存のサービスと接続したり、アクションを新規で作成することが出来ます。今回は前回作成したアクションを実行したいので、
①```Select Existing```タブから前回作成したアクションを選択して
②```Add```で完了
とします。

![スクリーンショット 2019-10-03 00.29.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/06152fc6-4238-094a-56e7-84575035db04.png)

これで設定完了です。あとは時間通りにLINEに通知が来たらトリガーは正常に動作出来ています。ここから天気予報APIを入れて天気予報を通知するなんてことも出来そうです。ただし、実行時間がかかるとタイムアウトになるので気をつけましょう。

# まとめ
というわけでIBM Cloud Functionsをさわってきましたが、使ってみて思ったメリット・デメリットを挙げてみます。

- メリット
    - 対応言語が豊富
    -  他のクラウドサービスにあるFaaSよりもシンプルにサーバーレスアプリを作れる（個人的な感覚）
    -  アイデア次第ではWatsonや他のIBMサービスと組み合わせて機能が拡張できる
    -  デバッグが分かりやすい
-  デメリット
    -  アプリを起動するときにはバックで動作しているdockerが立ち上がってからアクションを実行するので全体の動作が遅い
    -  拡張モジュールを使いたいときはCLIでの操作が必須
    -  ネットの情報が乏しい~~(IBM cloud全体そんな気がする…)~~
 
無料でも使えるので、手軽にサーバーレスでアプリを作りたいときの選択肢としてはいいと思います。
python Hello


# python Hello World
Markdown記法のヒント
使い方を含めて**ピコピコ**します。

適当にピコピコしますね

```py:hello_world.py    
print("ピ")
print("コ")
print("ピ")
print("コ")
```

# 参考文献
[Markdown記法 サンプル集](https://qiita.com/tbpgr/items/989c6badefff69377da7)
[Qiita マークダウン記法 一覧表・チートシート](https://qiita.com/kamorits/items/6f342da395ad57468ae3)
Rubyの拡張されたメソッドの定義した場所を探す

## 背景
先日書いた時期（[Railsのblank?が優秀だった](https://qiita.com/YNYS2020/items/badc0694117449d5d3d4)）の中で疑問が湧きました。`blank?` メソッドはどこに定義されているか、どうやって調べたらいいのか。

`String#blanK?` は、Rubyでは定義されておりませんでした。

```
irb(main):001:0> ''.blank?
Traceback (most recent call last):
        2: from /Users/yoshinori/.rbenv/versions/2.5.3/bin/irb:11:in `<main>'
        1: from (irb):1
NoMethodError (undefined method `blank?' for "":String)
```

じゃあ、なんで使えたんだろう。。
ということで、`String#blank?` についてはググるとRailsで用意されていることがわかりました。
しかし、もう少しマイナーなgemだったりしたらわからなかったかも...

## 良記事発見！！！

[Rubyでメソッドの定義場所を見つける方法](https://qiita.com/jnchito/items/fc8a61b421d026a23ffe)

```ruby
irb(main):001:0> ''.method(:blank?).source_location
=> ["~/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-5.2.3/lib/active_support/core_ext/object/blank.rb", 122]
```

どのgemのどのクラスのどの行で定義されているかが一発でわかりました。
最&高ですね。
C#パフォーマンスネタ

とりあえずネタ出し
パフォーマンスは実測値も載せないと信用ならないので、そのうちやる

## DateTable
- 使うならキャッシュを活かす
データ件数が数件ならどうでも良いけど、数万超えてくるとキャッシュは絶対に無視出来ない。
DateTableに対するデータ参照は、初回はおっそいが次回以降はキャッシュが作られるため非常に速い。
が、AddなどでDateTableが更新されるとキャッシュが効かなくなる。
そのため、Add→Selectを繰り返したりすると馬鹿みたいに高コストになる。
この場合、DefaulteViweに参照で使用するキー情報を設定するとかなり改善する。
（Addのコストは微増するが、参照が高速化する）

- そもそも使わない方法を検討する
ぶっちゃけ遅いしメモリ消費も大きいので、
どうしても使わないといけない場合以外、
別のコレクション型を使いたい。
listやDictionaryとか。

- フィルターの条件は複雑にしない
Selectのフィルターは、
条件をSQLぽっく書けて使いやすい。
ただし、条件をANDなどで複数繋げるより、
Selectの結果を、再度Selectする方が速い。
Chromeの安定版とBeta版を共存させる方法２

# 調査

次の記事を読んでChromeのBeta版をインストールする方法を調査した。

- [Chromeの安定版とBeta版を共存させる方法](https://qiita.com/oubakiou/items/b26444f0d691a3b43e3f)

3年以上前の記事のためかインストーラーを解凍すると書いてあったが解凍できなかった。

- [Chrome Release Channels - The Chromium Projects](http://www.chromium.org/getting-involved/dev-channel)

元の版に戻したとき互換性がなくなっているかもしれないのでプロファイルのバックアップを取っておくように書いてあった。


# Beta版をインストールしてみた

Beta版は "C:\Program Files (x86)\Google\Chrome Beta\Application\chrome.exe" にインストールされた。

元の安定版は "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" に残ったままで上書きされなかった。

プロファイルも
- %LOCALAPPDATA%\Google\Chrome Beta\User Data\Profile (Beta版)
- %LOCALAPPDATA%\Google\Chrome\User Data\Profile (安定版)
と分かれ上書きされなかった。

Beta版と安定版を同時に起動することもできた。


# 安定版、Beta版、Dev版、カナリア版

> [Chrome Release Channels - The Chromium Projects](http://www.chromium.org/getting-involved/dev-channel)
>
> **安定版**：　完全なテストをした版。マイナーリリースは約2〜3週間ごと、メジャーリリースは約6週間ごと。
> **Beta版**：　リスクを最小限に抑えながら、次のステップを確認したい場合。おおよそ毎週更新。
> **開発版**：　何が起こっているのかをすぐに確認したい場合。週に1、2回更新。
> **カナリア版**：　毎日リリースされ、このビルドはテストも使用もされていません。いわゆるナイトリービルド。
【42日目】Flashメッセージでリダイレクト先にデータを渡す

先日あげた[記事](https://qiita.com/untrustworth/items/01e7a7a0dec1ec3a6bed)で紹介した書籍「プロになるためのWeb技術入門」のなかで、「HTTPリクエスト」や「リダイレクト」の仕組みについて学んでおりました。

一方で今日は「Flashメッセージ」という技術を学びました。
これは簡単にいうと、リダイレクト先にメッセージを一時的に保存することができる機能です。

この二つの学習がちょうどリンクして、きちんと腑に落ちた感覚がありましたので、まとめたいと思います。


## １.　リダイレクトとは
#### 定義
リダイレクトとは、「ブラウザからのリクエストに対して、要求されたURLとは異なるURLに誘導すること」を言います。

#### 具体例
例えばログイン認証の流れを考えてみます。
ログインフォームにIDとパスワードを入力してログインボタンを押し、認証されると、商品一覧ページに遷移するような流れです。

まず、クライアントがブラウザ上のフォームにパラメータを入力してログインボタンを押します。
するとPOSTメソッドによってHTTP通信によるリクエストが、アプリケーション側のログインの判定をするスクリプトに向けて送られます。これが最初のリクエストです。

アプリケーション側では、その認証情報が一致したので、ステータス「３０２Found」によってレスポンスを返し、商品一覧ページに誘導します。

これを受けて、ブラウザは改めてGETメソッドによって、誘導されたURLへリクエストを送り、アプリケーション側からステータス「200 OK」とレスポンスすることで画面が遷移します。

このように、最初はログインチェックをしてくれとリクエストしていたのに、最終的に商品ページに誘導されています。
これがリダイレクト、ということになります。

#### ポイント
ごちゃごちゃと書きましたが、重要なことはHTTPプロトコルによる通信はステートレスなので、
①ログインチェックしてくれというリクエスト
②商品一覧へのリクエスト
この二つのリクエストの間でパラメータを保存しておくことができないということです。

そのため、例えばこういったログインという状態であったり、redirect元の変数だったりをリダイレクト先にも渡そうと思うと工夫が必要というわけです。
その方法がcookieであり、セッションでした。

## ２,　Flashメッセージ
#### Flashメッセージとは
Flashメッセージとは、「リダイレクト先にエラーメッセージなどを表示できる機能」のように見えますが、本質的にはちょっと違います。

Flashとはハッシュのようなもので、keyとvalueを設定し、ユーザーの「セッション」に保存できるという変数です。
ただし、保存できるのは、「その値が次に参照されるまで」という期限がついています。一度Flashメッセージが表示された画面を再読み込みすると、メッセージが消えてしまうのは、一度参照したことによって消去されるからです。
セッションに保存することができるため、リダイレクト先においてもkeyとvalueを保持することができています。

そしてリダイレクト先でメッセージのように表示されるというのは、リダイレクト先がviewで、htmlの中でFlash変数の値が出力されているからです。

#### 使い方
下記のとおりcontrollerでkeyとvalueを設定します。

```example_controller.rb
# 変数として定義する場合
flash[:key] = '出力したいvalue'
# redirect_toに続けて１行で書く場合
redirect_to url, flash: {key1: "表示したいvalue1", key2: "表示したいvalue2"}
```

そしてviewで出力します。

```example.html.erb
<%= flash[:key] %>
```

#### bootstrapを使う場合
bootstrapを使う場合、bootstrapのcssのクラスをFlashメッセージのkeyとすることで、文字色を変更できます。

```
success => 緑色
info => 青色
warning => 黄色
danger　=> 赤色
```

例えば、view側で、エラーがある場合に赤文字でエラーメッセージを表示する実装の例はこのようになります。

```ruby:_form.html.erb
<% if flash[:error_messages] %>
  <div class="alert alert-danger"> # bootstrapのclass
    <ul>
      <% flash[:error_messages].each do |msg| %>
        <li><%= msg %></li>　
      <% end %>
    </ul>
  </div>
<% end %>
```
IoT@Loft ハンズオン - スマートファクトリー IoT基盤構築プロトタイピング@目黒セントラルスクウェア 参加記

# はじめに
[10/2 (水) 18:30-21:00 IoT@Loft ハンズオン - スマートファクトリー IoT基盤構築プロトタイピング](https://iot-loft.connpass.com/event/146172/)に参加しましたので、質問等をメモしました。


# ハンズオン
ハンズオンは手順書を配布して各自自習、AWSの方が質問等を受け付けるという形式でした。
やったことは下の写真の通りです。

- 本物のセンサの代わりにCloud9を擬似センサとして、greengrassをインストール、Lambdaをエッジにデプロイしてデータの送信を行います。
- IoT CoreをGWにして、Kinesis経由でElasticsearchにデータを格納、kibanaでリアルタイム可視化します。
- AWS IoT Analisysでデータセットを用意し、QuickSightでBI（ハンズオン外）可視化をします。
- SageMakerで機械学習モデルを作成し、エッジにデプロイします。

![DSCPDC_0001_BURST20191002183827854.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/f06ef8a3-390f-6a59-21cd-9d0988d6807d.jpeg)

![DSCPDC_0001_BURST20191002183957694_COVER.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/c776e4bc-b4ef-c842-bce7-137937a1cd57.jpeg)

![DSC_0135.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/eef95173-7c8c-ad07-318a-12402c8b2528.jpeg)


下記は自分がした質問です。

### GREENGRASS グループのリソースはただのファイル送信機能？
モデルのファイルを送信する機能。他のファイルも送信できるかもしれないが、デバイスのファイル置き換えなどはシャドウを使用したほうが良い。

### DynamoDB は Kinesis Data Firehose が使えない？
現時点では未対応。
DynamoDBはスケールするので Kinesis Data Firehose を使用しなくてもある程度問題ない。
データが大量になってきたらロストの可能性があるので Kinesis Data Streams でバルク処理したデータを Lambda で分割する処理をする。

### topicを分けるベストプラクティスは？複数センサにどう対応する？
センサごとに分けても良い。topicの名前空間は7階層まで付けられるので、ある程度の区分分けができる。
特にデータ送信と操作系では分けた方が良い。

### DynamoDBで複数のキーを使用した検索をするにはどうすればいい？
基本的にはセンサIDをキーにし、検索キーをソートキーに指定するといった使い方をする。
または、ソートキーは前方一致検索が出来るので、検索の値をつないで"val1_val2_val3_val4"とすれば検索に使用できる。
または、1ドキュメントにデータをまとめるのではなく、"type"という項目をつくり、センサ1の"location"、"kind"のように情報を分散して格納することもできる。

### Amazon API Gateway と AWS Lambda でAPIを作る際、AWS Lambdaはリソース単位でつくるか、メソッド単位まで分割するか？
メソッド単位まで分割する事が多い。数が多い場合はサーバレスフレームワークをうまく利用する。リソース単位でまとめるのも有り。

### ルールクエリステートメントで「すべてのトピック」からサブスクライブするには？
ルールクエリステートメントを下記のようにする。

```SQL
SELECT * FROM "#"
```

# おわりに
データ収集から可視化、機械学習に、エッジでの推論まで盛りだくさんなハンズオンでした。
それぞれのサービスの使い方が分かったので、分析基盤を作っていけそうです。

![DSCPDC_0001_BURST20191002183710907.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/ee022688-e2e5-8074-a807-d0d2e7e4b316.jpeg)

![DSC_0133.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/b07243a5-3038-0361-0446-79492d8f26fa.jpeg)
【Powershell】PDFをドラッグ&ドロップで分割、結合する

PowershellでPDFを分割 / 結合するコマンドがなかったので、気軽に使えるスクリプトを作成しました。
- Kazatoki/pdf_edit_lib　https://github.com/Kazatoki/pdf_edit_lib

ソースコード自体はシンプルなものなので、本記事では使い方だけに焦点を当てております。
（GPLv3ライセンスのため、個々人でご活用いただければ幸いです。）

# 実現できること

- PowershellでPDFを編集（分割・結合・パスワード解除）
- ドラッグ & ドロップで、PDFを簡単に編集

# 環境

- Windows 10
- Powershell 5.0 以上
- PDFtk 2.02

# 環境構築

## Install PDFtk

PDFtkをダウンロードし、インストールします。
https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/

# pdf編集ツールをダウンロード

以下のリポジトリからzipファイルでダウンロードし、好きなフォルダに格納してください。
https://github.com/Kazatoki/pdf_edit_lib

##　gitを使う場合

[こちら](https://gitforwindows.org)からgitをインストールし、以下のコマンドを実行してください。

```
git clone https://github.com/Kazatoki/pdf_edit_lib.git
```

## インストール

インストーラー ```~/setup/installer.vbs``` を起動することで設定が完了します。
インストール後は、どこでも以下のコマンドが使用できるようになります。

- ```pdf_split.ps1``` : 指定したPDFファイルをページごとに、バラバラに分解します。
- ```pdf_join.ps1``` : 指定した複数のPDFファイルを、一つのファイルに結合します。
- ```pdf_unlock.ps1``` : 指定したPDFのパスワードを解除します。（要：パスワード入力）

ただし、この設定はPowershellを使用しているときしか反映されません。
アンインストールしたい場合は、```~/setup/uninstaller.vbs``` を実行してください。

# 使い方

「コマンドラインを使う方法」と「ドラッグ&ドロップで実行する方法」（推奨）があります。

## コマンドラインを使う方法

### pdf_split.ps1

PDFファイルを引数に指定することで、そのファイルを1ページごとにバラバラに分解できます。

```powershell
pdf_split.ps1 -filePath input.pdf [ -destPath destinationFolder ]
```

#### Example

```powershell
pdf_split.ps1 .\test.pdf 
```

以下のように、保存先の指定もできます。

```powershell
pdf_split.ps1 .\test.pdf $home\Documents
```

### pdf_join.ps1

選択した複数のPDFファイルを、一つのファイルに結合することができます。
結合したファイルは、参照先のファイルとおなじフォルダに保存されます。ファイル名の末尾には```"_combine"```が追記されます。
また、出力されるPDFのページ順は、指定したファイル名の昇順となります。

```powershell
pdf_join.ps1 input1.pdf input2.pdf [ input3.pdf ... ]
```

#### Example

```powershell
pdf_split.ps1 .\test1.pdf .\test2.pdf .\test3.pdf
```

※このコマンドは保存先を指定することができません。

### pdf_unlock.ps1

PDFファイルを指定し、パスワードを入力することで、パスワードを解除することができます。

```powershell
pdf_unlock.ps1 -filePath input.pdf [ -destPath destinationFolder ]
```

#### Example

```powershell
pdf_split.ps1 .\test.pdf 
```

以下のように、保存先の指定もできます。

```powershell
pdf_split.ps1 .\test.pdf $home\Documents
```


## ドラッグ & ドロップでPDFファイルを分割（結合）

インストール時に作成されたショートカット（ ```~/pdf_split.ps1```, ```~/pdf_join.ps1```, ```~/pdf_unlock.ps1```）を使用します。

各ショートカットアイコンの上に、PDFファイルをドラッグ＆ドロップすることで、ファイルの分割（split）、結合(join)、パスワード解除(unlock)を実行できます。

ファイルの出力先は、ドラッグ&ドロップしたファイルと同じ場所に作成されます。

以上
SplFileObject::fputcsv()で改行コード=CR+LFのCSVを出力する方法

PHPには[SplFileObject](https://www.php.net/manual/ja/class.splfileobject.php)というファイル操作用のクラスが標準で提供されています。
PHP5.4からは[fputcsv](https://www.php.net/manual/ja/splfileobject.fputcsv.php)というCSV出力用のメソッドも用意されていますが、このメソッドはLinux環境では改行コードが`LF`で出力されるようになっています。

今回は`SplFileObject::fputcsv`を使用して`CR+LF`のCSVを出力する方法をご紹介します。

## 環境

PHP 7.3.9

## 方法

[stream_filter_register](https://www.php.net/manual/ja/function.stream-filter-register.php)と[php://filter](https://www.php.net/manual/ja/wrappers.php.php#wrappers.php.filter)ストリームを組み合わせることで、`CR+LF`のCSVを出力することができます。

```php
<?php

$data = [
    ['東京都', '千代田区'],
    ['神奈川県', '横浜市'],
    ['埼玉県', '埼玉市'],
];

// 末尾改行コードをCR+LFにするフィルタクラスをストリームフィルタとして登録
stream_filter_register('CrlfFilter', CrlfFilter::class);

// php://filterストリームで登録したフィルタを設定する
$file = new SplFileObject('php://filter/write=CrlfFilter/resource=php://output', 'wb');

foreach ($data as $row) {
    $file->fputcsv($row);
}

class CrlfFilter
{
    public function filter($in, $out, &$consumed, $closing) {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = preg_replace("/\n$/", '', $bucket->data);
            $bucket->data = preg_replace("/\r$/", '', $bucket->data);
            $bucket->data = $bucket->data . "\r\n";
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}
```

## 参考サイト

[fputcsv の改行コードを CR+LF にするには](http://omoon.hatenablog.com/entry/20110527/1306475827)
[Stream Filtering with SplFileObject](https://nyamsprod.com/blog/2014/stream-filtering-with-splfileobject/)
Project Euler 034を解いてみる。「桁の階乗」

# Project Euler 034
[034](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2034)
>145は面白い数である. 1! + 4! + 5! = 1 + 24 + 120 = 145となる.
各桁の数の階乗の和が自分自身と一致するような数の和を求めよ.
注: 1! = 1 と 2! = 2 は総和に含めてはならない.


->[次の問題](https://qiita.com/radiol/items/77a90ac9210192a723b4)

## 考え方
これも総当り、やっていきます。
総当り範囲は、999999(6桁)：9!×6=2177280(7桁)、9999999(7桁)：9!×7=2540160(7桁)、99999999(8桁)：9!×8=2903040(7桁)となり、8桁以降は必ず各桁の階乗の合計が小さくなります。よって9!×7までを調べれば網羅できそうです。

## コード
```Python:euler034.py
from math import factorial


def main():
    answer = 0
    for i in range(3, factorial(9) * 7):
        sum_factorical = 0
        for digit in str(i):
            sum_factorical += factorial(int(digit))
        if i == sum_factorical:
            print(i)
            answer += i

    print('answer:', answer)

if __name__ == '__main__':
    main()
```

```text:結果
145
40585
answer: 40730
```

かなり計算に時間がかかってしまいます…　短縮案が必要です。
ついに解答のストックが尽きてしまいました。毎日更新できなくなりそうです。
Mermaid 紹介 記事 まとめ

# 目的

- Mermaid関連の記事をまとめてMermaidを世に広める。

# 記事まとめ

## Mermaidとは何ぞや！という方むけの記事

- [コード で フローチャート シーケンス図 ガントチャート等 を 描く① ～mermaidの紹介～](https://qiita.com/miriwo/items/babd1fc51adfa6bc60ad) 

## Mermaidが何かは分かった！じゃあどうやって記載するんだ！という方むけの記事

- [コード で フローチャート シーケンス図 ガントチャート等 を 描く② ～mermaidで図を描く～](https://qiita.com/miriwo/items/7e26f0d85829bb15e69c)

## 記載方法は分かった！書いた図を出力したいんだけど！という方むけの記事

- [コード で フローチャート シーケンス図 ガントチャート等 を 描く③ ～mermaidの図を出力する～](https://qiita.com/miriwo/items/223443768f545c39298c)

## フローチャートの詳しい記載ルールを知りたい！という方むけの記事

- [コード で フローチャート を 描く ～mermaid 記法①～](https://qiita.com/miriwo/items/24eb66a9800041d87ce3)

## シーケンス図の詳しい記載ルールを知りたい！という方むけの記事

- [コード で シーケンス図 を 描く ～mermaid 記法②～](https://qiita.com/miriwo/items/b607112ee4f392a2802a)

## Markdown Preview Enhanced でうまく図がプレビューされない方むけの記事

- [Markdown Preview Enhanced で 図 の プレビュー がうまくいかない 時の 対処法](https://qiita.com/miriwo/items/bd0e8563e7662f4b3dcd)

## そもそもプラグインの入れ方わからん！という方むけの記事

- [Visual Studio Code の プラグイン の 入れ方](https://qiita.com/miriwo/items/0518cfa1fd0d2edc1826)

## そもそもVisual Studio Codeの入れ方わからん！という方むけの記事

- [Visual Studio Code 導入方法 VSCode ダウンロードから日本語化対応まで～画像付き導入解説～　](https://qiita.com/miriwo/items/306769d90d910944e471)
Node.js, Express, sequelizeで開発を始める際の初期設定

# はじめに
タイトルのスタックでWebアプリケーションを開発するために、まず何をすべきかいいかを書く。

データベースはSQLiteを使う。

# 環境
* Mac
* Node.js v10.15.3


# 手順

## Expressの初期化

参考：https://expressjs.com/ja/starter/generator.html

```shell
npm install express-generator -g

express --view=pug myapp
cd myapp
npm install

# 起動確認
npm start
```

http://localhost:3000/ にアクセスできればOK

## sequelizeの初期化

参考：https://github.com/sequelize/cli

```shell
npm install sqlite3 sequelize
npm install --save-dev sequelize-cli

npx sequelize init
```

設定ファイルに記入

```
> cat config/config.json
{
  "development": {
      "dialect": "sqlite",
      "storage": "database.sqlite3"
  }
}
```

## DBのマイグレーション（おまけ）

```shell
# マイグレーションファイルとモデルのファイルを作成
npx sequelize-cli model:generate --name User --attributes id:integer,name:string,email:string

# マイグレーションを実行
npx sequelize db:migrate
```

SQLiteでの確認は[こちら](https://qiita.com/aki-takano/items/f6450bdf3675418f0ef0)を参考に。


以上。


# リンク
* https://expressjs.com/ja/
* https://sequelize.org/master/manual/getting-started
* https://github.com/sequelize/cli
* https://qiita.com/aki-takano/items/f6450bdf3675418f0ef0
AndroidStudioのプロジェクト名変更

#どんな記事？
生まれて初めてのAndroidStudioのプロジェクト名変更に失敗した。
手塩にかけてつくったアプリがもう起動できない。悲しい。

そんなふうに嘆いていたら、読んでください。助けになるかもしれません。
僕はこれを教えてくれた職場の後輩に心から感謝します。

#どんなやり方？
GitHubを使います。
言い忘れましたが、プロジェクト名を変更しようとして他のところで調べたやり方で失敗し、なおかつ直前でGitHubにプッシュしていた中途半端な運の人が対象の記事です。ここでだめならまたほかを探してください。諦めてはいけません。

#詳しいやり方
まずはGitHubのプロジェクト名を変更します。

![Screenshot 2019-10-02 at 19.54.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287607/360dc8c5-4072-22c0-d59b-cadfca4a9fc1.png)

この中の[Settings]をクリックします。

![Screenshot 2019-10-02 at 19.56.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287607/c34324c2-f15d-07c0-e954-b27b55bf67e3.png)

すると上のようなリポジトリ名変更欄がありますので、変更したいプロジェクト名に変更します。
当然ですがリポジトリ名が変わります。

次にAndroidStudio側です。

先程名前を変えたリポジトリをクローンします。
新しいプロジェクトとしてチェックアウトしてください。

![Screenshot 2019-10-02 at 20.07.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287607/f80c7781-1efe-7bdc-4594-75a9b78ec8e0.png)

こんな感じでできます。

すると！
…特に中身は何も変わっちゃいません。

ここでリファクタリングです。
左上をAndroidに切り替え、app配下の自分のmainディレクトリ上で右クリック。
以下のようなメニューが出たら、Refactorを押します。

色々警告されることもあるかもしれませんが失敗してもでえじょうぶだGitHubで生き返れる。いい世の中になったものだ。

迷わず[Refactor package] [Refactor directory]を実行します。

![Screenshot 2019-10-02 at 23.52.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287607/4a8ebb3c-f32e-566e-73bd-d11bce3b9ac3.png)

もう少しです、大切なアプリのためなので頑張りましょう。
上の画像の左上で[Android]となっている箇所をクリックして、[Project]に切り替えます。

するとたぶん、[旧プロジェクト名.iml]というファイルがあるはずです。
これの名前を新プロジェクト名に変更します。
このファイルを開くとまたもやにっくき旧プロジェクト名を見つけることができるので、そこも変えておきましょう。

![Screenshot 2019-10-02 at 23.56.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287607/6f6b5960-fff2-b316-7af1-2e6d52d28579.png)

画像でOldProjectとなっているところがそれです。
この時点で、ビルド時に赤いエラーが出ることは無くなるはずです。

さて、ビルドができたからと言って安心してはいられません。
インストールして実行するまでがアプリです。

結論いうと、まだできません。
先程の.imlの下の方を見てください。

![Screenshot 2019-10-02 at 23.59.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287607/7a512e53-3b50-7643-acdf-4765c81cd3e1.png)

最後の刺客はここにいます。
開いたらすぐわかります。

![Screenshot 2019-10-03 at 00.00.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287607/bc653544-4d51-580b-cfce-f5687c988f2c.png)

このプロジェクト名を書き換えます。

…
…
お疲れ様でした！
これにて再びアプリの元気な姿を見ることができました！


おまけです。
実はもう一箇所旧プロジェクト名が残っているかもしれません。
[AndroidManifest.xml]です。

リファクタリングでパッケージ名は大丈夫ですが、
プロジェクト名をそのままアプリ名にしていると残っています。
変えたい人はここも変えましょう。

以上です。

#そもそもどう駄目だったのか
他の方々が説明してくださっているように、Refactoringを実行し、imlも変更しました。AndroidManifest.xml,build.gradleの中身も書き換えましたがそれでも動きませんでした。どうしても赤いエラーがつきまといます。
一見ビルド成功したように見えますがログ画面に赤いエラーが出てきてました。

ここで紹介したやり方は上記のやり方の前にGitHubからのクローンを挟んだだけのことです。

#最後に
なにか間違っていること、補足などあればなんなりとお願いします。
【Java】拡張for文、forEach文の変数をimmutableにする

# 普通に宣言した場合
拡張for文、forEach文を普通に宣言すると以下のようになります。
`final`宣言していないため、再代入可能です（普通の`for`文は原理的に再代入が必須なので飛ばします）。

```java
List<Integer> intList = Arrays.asList(1, 2, 3, 4);

for(int i : intList) {
    i = 0; // 書き換えられる
}

intList.forEach(it -> {
    it = 0; // 書き換えられる
});
```

この記事では、これらの内容を再代入不能な形に書き換えます。

# 変数をimmutableにする
## 拡張for文の場合
`final`で宣言することで`immutable`にできます。

```java
for(final int i : intList) {
    i = 0; // final宣言しているため再代入不可でコンパイルエラー
}
```

## forEach文の場合
以下のように、カッコで括って型を指定することで引数を`final`にできます。

```java
intList.forEach((final int it) ->
    it = 0; // final宣言しているため再代入不可でコンパイルエラー
);
```

### 別解
一応ですが、無名クラスとして実装する場合も引数を`final`にできます。

```java
Consumer<Integer> finalConsumer = new Consumer<Integer>() {
    @Override
    public void accept(final Integer it) {
        it = 0; // final宣言しているため再代入不可でコンパイルエラー
    }
};
```

# お詫び
この記事は当初公開した際「**インデックスをimmutableにできるのはfor文、拡張for文、forEach文の内拡張for文だけ**」というタイトル・内容でしたが、@saka1029 様のご指摘の通り、これは誤りでしたので、タイトル・内容共に全面的に書き直しを行いました。

@saka1029 様、ご指摘ありがとうございました。
BindingAdapterでTextViewのdrawable[Left/Right/Top/Bottom]を実現する

自分用のメモも兼ねて。

DataBindingを使ってTextViewのdrawbleLeft(Start)を使うために
下記のような指定すると、実は上手く行きません。

```xml

<layout>
    <data>
        <variable name="icon" type="int" />
    </data>
    <TextView
        android:drawableLeft="@{icon}"
    />
</layout>
```

なぜなら、 この指定をするとcolorリソースとして認識されてしまうからなんですね。
DataBindingではIntergerとしてresource指定をすると勝手にcolorResourceとして認識されてしまうようです。

attrの定義を見れば分かりますが、

```xml
<attr name="drawableLeft" format="reference|color" />
```

こうなっています。

なので、

```kotlin
@BindingAdapter("drawableLeftFromResource")
fun drawableStartFromResource(textView: TextView, @DrawableRes res: Int) {
    val drawables = textView.compoundDrawablesRelative
    textView.setCompoundDrawables(
        ContextCompat.getDrawable(textView.context, res)?.apply {
            setBounds(0, 0, intrinsicWidth, intrinsicHeight)
        },
        drawables[1],
        drawables[2],
        drawables[3]
    )
}
```

のようなBindingAdapterを定義して、

```xml

<layout>
    <data>
        <variable name="icon" type="int" />
    </data>
    <TextView
        android:drawableLeftFromResource="@{icon}"
    />
</layout>
```

としてやると上手くいきます。

肝は

```kotlin
ContextCompat.getDrawable(textView.context, res)?.apply {
            setBounds(0, 0, intrinsicWidth, intrinsicHeight)
        }
```

の部分で、setBoundsをしてやらないとiconを差し込むための余白ができないので、アイコンが表示されません。

同じ要領でRight、Top、Bottomにも適用可能です。
DNS について調べたことをまとめる

## はじめに
仕事で DNS の設定などを行う案件にアサインされたため、この機会に DNS について調べました。
間違っている点があるかもしれませんがご了承ください。 （指摘コメントお願いします。）

## DNS とは
[Wikipedia: Domain Name System](https://ja.wikipedia.org/wiki/Domain_Name_System)
> Domain Name System（ドメイン・ネーム・システム、DNS）とは、インターネットを使った階層的な
> 分散型データベースシステムである。
> 現在では主にインターネット上のホスト名や電子メールに使われるドメイン名と、
> IPアドレスとの対応づけ（正引き、逆引き）を管理するために使用されている。

ブラウザのアドレスバーで `http://www.gooogle.com` と打つと裏ではこの `www.gooogle.com` 
というドメイン名はどこのホストなのか DNS に問い合わせて名前解決を行い、 IP アドレスを取得している。
TCP/IP の通信では IP アドレスがないと通信を行うことができないため、DNS は必須。

## 名前解決の方法
ドメイン名と IP アドレスの対応づけはその問い合わせ方向によって名前が異なる。

|問い合わせ |方向|
|:---:|:---:|
|正引き|ドメイン名 ⇨ IP アドレス|
|逆引き|IP アドレス ⇨ ドメイン名|

例えば、 正引きで `www.google.com` の IP アドレスを DNS サーバに問い合わせるとする。
まず最初にMac、Linux の場合、`/etc/resolv.conf` に書かれている `nameserver` に問い合わせを依頼する。
この nameserver というのは `リゾルバ` と言い通常、このリゾルバが DNS クライアントとなって
自分の代わりに DNS サーバに問い合わせを行ってくれる。
![Untitled Diagram (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353538/898eed9a-1695-ad65-b846-39fbadbdd9c5.png)
次にリゾルバは、自身がもつルートゾーンを管理する権威サーバに問い合わせを行う。
![Untitled Diagram (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353538/cf67a4b4-97f0-b63d-6454-fdfa04ee679a.png)
ルートゾーンを管理する権威サーバは世界で 
`a.root-servers.net. 〜 m.root-servers.net.` の 13 台存在し、
そのどれかが自身が持つ .com ゾーンの情報（.com ゾーンを管理する権威サーバの IP アドレス）を教えてくれる。

権威 DNS サーバとは、ゾーンファイルというドメイン名と IP アドレスのマッピングの情報を持つ DNS サーバのこと。
権威 DNS サーバはゾーンファイルの情報を元に名前解決の問い合わせに対して応答する。

> ちなみにここでは、IPv6 のエニーキャストと呼ばれる技術が使われている。
> エニーキャストでは、エニーキャストアドレスというある特定のグループに対して割り当てられた
> IP アドレスに問い合わせを行うと、一番近いホストが応答を返す。

![Untitled Diagram (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353538/443dd59f-2a21-5869-280d-31a47cdc2809.png)

.com ゾーンの情報を得たら、その権威サーバに google.com の情報を教えてもらい、
最終的に、www.google.com のゾーン情報を管理する権威サーバに www.google.com の IP アドレスを教えてもらって、リゾルバはクライアントに名前解決の結果を応答する。

## 補足
権威サーバに関連して

|種類|説明|
|:--:|:--:|
|コンテンツサーバ|ゾーン情報を持つサーバ <br> 権威サーバとも呼ばれる|
|キャッシングサーバ|クライアントからの名前解決の要求に対し、<br>応答結果を一定期間メモリにキャッシュするサーバ|
|コンテンツオンリーサーバ|キャッシングは行わず、<br>コンテンツだけを返すサーバ|
|キャッシングオンリーサーバ|キャッシングのみを行い、<br>コンテンツを持たないサーバ|

### おまけ
今回、初めて図を https://www.draw.io/ で書いてみました。
色とかこだわらなければパワポよりも簡単に図がかけるのでおすすめです。
AWS とかのアイコンの素材も豊富です。
CentOS 8でLAMP環境を構築してみた

# 手順

CentOS 7用の手順をもとに以下を作成。詳しくはこちらを御覧ください。

- https://github.com/tomgoodsun/centos8_lamp_configs

# 印象

- `yum`は一応エイリアスになっていますが、基本的には`dnf`コマンドを変わりに使う。
- 日時設定はNTPではなくChronyになっている。
- 大抵のリポジトリはEL8リポジトリを作ってくれているので一応大丈夫。MySQLとかはなかったけど。
- それ以外は、ミドルウェアの設定方法に手こずったけど、LAMP環境作るだけならCentOS 7とはさほど変わらないんじゃないかなと言う印象。
- minimalのISOがないみたいだけど。。。

# 参考

- [CentOS 8 と CentOS 7 の違い、yum やミドルウェアにも要注意](https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=3991)
Rubyの `OpenSSL::BN` で手軽に合同算術（余りの計算）

Rubyの数値クラスは基本的に `Numeric` のサブクラスだが、そうなっていなく隠れているものがある。それがopensslライブラリ内の [**`OpenSSL::BN`**](https://docs.ruby-lang.org/ja/latest/class/OpenSSL=3a=3aBN.html) 。（他にもあるかもしれないけど）

> OpenSSL内で利用される多倍長整数クラスです。
> 
> 通常多倍長整数を利用するには [`Bignum`](https://docs.ruby-lang.org/ja/latest/class/Bignum.html) を用いてください。

暗号化に利用する計算が目的のため、通常の整数クラスには無いメソッドがいくつか用意されている。そのひとつに**剰余をとりながらの演算**（[合同算術](https://ja.wikipedia.org/wiki/合同算術)）が挙げられる。

## 合同算術メソッドの一覧
通常の演算子 `+`, `-`, `*`, `/`[^divmod], `**` もあり `Integer` と混ぜて使えるが、それに加えて **`#mod_xxx`** というメソッドが用意されている。これらは引数に法（modulus）を指定する。

* 加算 : `#mod_add`
* 減算 : `#mod_sub`
* 乗算 : `#mod_mul`
* **累乗（[冪剰余](https://ja.wikipedia.org/wiki/冪剰余)）** : `#mod_exp`
* 自乗（平方剰余） : `#mod_sqr`
* **逆元（[モジュラー逆数](https://ja.wikipedia.org/wiki/モジュラ逆数)）** : `#mod_inverse`

このうち冪剰余とモジュラー逆数は、自力で効率よく計算しようとするとアルゴリズムの知識がそれなりに必要になる。これを標準ライブラリに任せられるのは嬉しい。

なお、冪剰余についてはRuby2.5から [`Integer#pow`](https://docs.ruby-lang.org/ja/2.5.0/method/Integer/i/=2a=2a.html) でもできるようになった。モジュラー逆数は[以前に自作してみたことがある](/HMMNRST/items/cea491b7c3c542252186)が、このクラスを知っていたらわざわざやらなかったかも。

```ruby:冪剰余とフェルマーの小定理
a = 12345   # any integer
n = 6700417 # prime number

# OpenSSL::BN
require 'openssl'

a.to_bn.mod_exp(n, n).to_i #=> a % n

# Integer (built-in class)
a ** n % n  #=> NaN (warning: in a**b, b may be too big)
a.pow(n, n) #=> a % n
```

```ruby:モジュラー逆数
63 * 27 % 100 == 1

# OpenSSL::BN
require 'openssl'

63.to_bn.mod_inverse(100).to_i #=> 27
64.to_bn.mod_inverse(100).to_i #=> OpenSSL::BNError: no inverse

# https://www.rubydoc.info/gems/numeric_inverse
require 'numeric_inverse'
using NumericInverse

63.inv      #=> (1/63)
63.inv(100) #=> 27
64.inv(100) #=> ArgumentError: modulus 100 is not coprime to 64
```

[^divmod]: [`Integer#divmod`](https://docs.ruby-lang.org/ja/latest/method/Integer/i/divmod.html)に似た[剰余付き除法](https://ja.wikipedia.org/wiki/除法の原理)。

## 利用例：RSA暗号の復号の計算
最近計算する機会があったので、 `OpenSSL::BN` でもやってみる。主な変数は以下の通り。

* 公開鍵 (n, e) は誰でも手に入る
	* n は2つの素数の積
	* e は適当な数[^e]（※満たすべき条件はある）
* 秘密鍵 (n, d) は鍵ペアの作成者しか知らない
	* n は公開鍵と同じ[^prime]
	* d は e と対になる数
* m と c はそれぞれ平文と暗号文（を数値化したもの）
	* m から c を求めるのが暗号化で、公開鍵によって誰でも可能
	* c から m を求めるのが復号で、秘密鍵によって鍵ペアの作成者のみ可能
		* 秘密鍵の d を知らずに復号できたら暗号解読成功

[Wikipedia英語版にある例](https://en.wikipedia.org/wiki/RSA_(cryptosystem)#Example)で復号を試す。公開鍵しか知らない状態でも、 n を素因数分解した2つの素数がわかれば、秘密鍵を求められる。

```ruby
require 'openssl'

n, e = 3233, 17 # public key (n, e)
c = 2790 # ciphertext

# discover that 3233 == 61 * 53
# --> get a private key (n, d)
l = [61 - 1, 53 - 1].inject(:lcm)
d = e.to_bn.mod_inverse(l).to_i #=> 413

# decrypt
m = c.to_bn.mod_exp(d, n).to_i #=> 65 (plaintext)

# encrypt again
c = m.to_bn.mod_exp(e, n).to_i #=> 2790 (ciphertext)
```

[^e]: 実際の公開鍵では固定値 65537 (0x10001) になっていることが多い。
[^prime]: 理論上は n だけでいいが、実際の秘密鍵には元となった2つの素数も記録されている。
MAMPでVirtual Host のローカル環境を構築する

MAMPを使ったローカル開発環境は、独学で学んでWordPressの構築をしてきた。

実務では、複数の案件に対応するため、VirtualHostを使って、ローカル環境を複数構築する事になる。

ローカル環境が一つだけだと、例えばWordPressを構築するとき、プラグインや記事を投稿したりすると、他の案件にも影響が出る。

一つの案件ごとにフォルダを作り、その案件フォルダをルートとしてローカル開発環境フォルダとする。

例えば、

- 企業名のフォルダ
    - root（案件名のフォルダ）
        - wordpressデータ

企業ごとに案件を管理するためのフォルダ分けをし、案件フォルダをルートとしてローカル開発環境を構築する。


#Virtual Host の設定を読み込む

MAMPであればここにある
/Applications/MAMP/conf/apache/httpd.conf


```conf:httpd.conf
# Virtual hosts
#Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
```

この記述のInclude部分のコメントアウトを外す。


```conf:httpd.conf
# Virtual hosts
Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
```


#ホストの設定

この場所のhttpd-vhosts.confを開く
/Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

```conf:httpd-vhosts.conf
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/Applications/MAMP/Library/docs/dummy-host.example.com"
    ServerName dummy-host.example.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "logs/dummy-host.example.com-error_log"
    CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "/Applications/MAMP/Library/docs/dummy-host2.example.com"
    ServerName dummy-host2.example.com
    ErrorLog "logs/dummy-host2.example.com-error_log"
    CustomLog "logs/dummy-host2.example.com-access_log" common
</VirtualHost>
```

この記述例を参考に、以下のコードを記述する

```conf:httpd-vhosts.conf

# { test01 Listen 10001
<VirtualHost *:10001>
 ServerName test01
DocumentRoot "/Applications/MAMP/htdocs/anken/test01"
</VirtualHost>
<Directory "/Applications/MAMP/htdocs/anken/test01">
 AllowOverride All
</Directory>
# }
```

`VirtualHost *:10001`
ホスト番号→案件ごとに被らない番号をつける

`ServerName:`
案件名をつける


`DocumentRoot "/Applications/MAMP/htdocs/anken/test01"`
案件フォルダをルートに指定する



##MAMPを再起動する。
ホストの設定を変更した場合は、一度MAMPを再起動しないと動かない。



http://localhost:10001/

http://localhost:10001/wp-admin/index.php

アパッチに接続（phpMyAdmin）

wp_settingの中の`siteurl`と`home`をhttp://localhost:10001/
に変更する。


この方法で、案件ごとにローカル環境が使えるので、　管理がしやすい。
sklearn.cross_varidationが使えない件

#sklearn.cross_varidationがimportできない
sklearn.cross_varidationからimportしようと思ったが下記のようなエラーが出る．

```SyntaxError: invalid syntax```

調べてみたあっさり原因が見つかった．


##cross_varidationの廃止
原因は，cross_varidationの廃止だったそうな．じゃあなに使えばいいのっていうと**sklearn.model_selection**というのを代わりに使えばいいらしい．
具体的には...

`from sklearn.model_selection import cross_val_score`

こんな感じ

大体のクラスや関数は置き換えなのでcross_validationを書き換えるだけでいいっぽい

ソースはここ
[ImportError: No module named 'sklearn.cross_validation'の対処](https://www.haya-programming.com/entry/2018/12/04/052713)
設計時に使うテンプレ


設計時のテンプレ作成

```
## 仕様書


## 設計の目的


#### 課題


#### 改善


#### 実装方針


## 決定事項


#### DB設計


### ロジック設計


### リクエストおよび、レスポンスのapiについて

#### リクエストメソッド
GET,POST,PUT,DELETEどれなのか？

#### リクエストURL


#### jsonレスポンス
* 変更がない場合はその旨を記載。jsonデータは書くように

## 確認事項


## 懸念事項や気づき

```


※ 決定事項と、確認事項、懸念事項と大きく3つにカテゴライズすることによって相手にわかりやすく伝わるようにした。
Akita🐶でがんばる状態管理

## 本記事について
- 本記事は、 [Classi Angular Night](https://classi-angular-night.connpass.com/event/144066/) での登壇時に使用したものです
- イベント後に詳細な説明を載せて記事化します

---
## Who am I?
```jikoshokai.json
{
  "name": "佐藤有斗（ゆいと）",
  "作ってるもの": "BtoB SaaS",
  "やってること": ["バックエンド", "フロントエンド", "インフラ"],
  "言語": ["Scala", "Typescript", "Python", "Ruby"],
  "スマブラ": { 
    "キャラ": "ネス",
    "世界戦闘力": 2000000
  }
}
```


---
## この発表の目標
- Akitaという状態管理ライブラリの認知拡大
- 新規アプリ開発時の選択肢に

---
# [コードはこちら](https://github.com/YuitoSato/akita-kawaii-sample)

---
## もくじ
- Akitaとの出会い
- Akitaとは
- AKita図解
- Store, Service, Query
- Entity Store
- 使ってみてよかった点
- 難しい点


---
## Akitaとの出会い
- Reduxのボイラーテンプレートに疲れていた
- シンプルなものがほしい
- でもオレオレRxJSはしたくない

---
## そこでAkitaですよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92468/c2edf007-d73f-9009-3685-145dea39b459.png)


---
## Akitaとは
- 状態管理ライブラリのひとつ
- ボイラーテンプレが少なくとてもシンプル
- ロゴがかわいい


---
## Akita図解
<img width="871" alt="スクリーンショット 2019-10-02 13.00.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92468/28e5da4e-a189-cb83-e735-dc8c82fa74aa.png">

---
## NgRxとの比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92468/ca007387-1889-aefa-89b9-937d2abe8d00.png)

---
## Akitaの3ロール
- 値を保持する**Store**
- 値を取得する**Query**
- 値を更新する**Service**（通信もする）


---
## Store
```ts
import { Injectable } from '@angular/core';
import { Store, StoreConfig } from '@datorama/akita';
import { Counter } from './counter';

@Injectable({ providedIn: 'root' })
@StoreConfig({ name: 'counter' })
export class CounterStore extends Store<Counter> {
  constructor() {
    super({
      count: 0
    });
  }
}
```


---
## Query
```ts
@Injectable({ providedIn: 'root' })
export class CounterQuery extends Query<Counter> {
  constructor(protected store: CounterStore) {
    super(store);
  }
}
```

---
## Service
```ts
@Injectable({ providedIn: 'root' })
export class CounterService {
  constructor(
    private counterStore: CounterStore
  ) {}

  set(countValue: number) {
    return this.counterStore.update({ count: countValue });
  }
}
```

---
## Component
```ts
export class CounterComponent implements OnInit {
  counter$: Observable<Counter>;

  constructor(
    private counterService: CounterService,
    private counterQuery: CounterQuery
  ) { }

  ngOnInit() {
    this.counter$ = this.counterQuery.select();
  }

  increment(current: number) {
    this.counterService.set(current + 1);
  }
}
```

---
## おさらい
<img width="871" alt="スクリーンショット 2019-10-02 13.00.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92468/28e5da4e-a189-cb83-e735-dc8c82fa74aa.png">

---
# 基本はこれだけ 🐕

---
# 応用編

---
## Entity Store
- コレクション構造に特化したStore
- コレクション操作に適したメソッドが生えている


--- 
# ここからは実際のコードで 🐩

---
## 使ってみてよかった点
- Rxjs周りの管理を丸投げできた
- ボイラーテンプレが少ない

---
## 難しい点
- n個のComponent × n個のStore
- AngularのServiceとAkitaのServiceが被る
- 状態管理しなくていいサービスをどう管理するか迷う


---
## 参考
- [今回のコード](https://github.com/YuitoSato/akita-kawaii-sample)
- [公式ドキュメント](https://netbasal.gitbook.io/akita/)
- [これ見ればこのLTいらないやんっていう記事](https://qiita.com/m-hamada/items/89ee8268f5205cf77e19)

---
## ありがとうございました🐕