OmniAICreator/Qiita-1.07M huggingface dataset:
フローチャートとは


#はじめに
今回はプロセス、システム、コンピューターアルゴリズムを示す図として用いられる「フローチャート」について解説します。
フローチャートは複雑化しやすいプロセスの記録、学習、計画、改善、伝達を明確かつ分かりやすい方法で実現するためのツールとして使われているため、非エンジニアでも理解しておいても損はしないと思います。

#フローチャートとは
プロセスの各ステップを箱で表し、流れをそれらの箱の間の矢印で表すことでアルゴリズムやプロセスを表現する図のことをいいす。フローチャートでは、長方形、円形、ひし形に加え、多種多様な図形を使用して、手順を定義し、図形を接続する矢印でフローを表します。フローチャートは時に、プロセスフローチャート、プロセスマップ、機能フローチャート、ビジネスプロセスマッピング、ビジネスプロセスモデリング表記法 (BPMN) やプロセスフロー図 (PFD) など、より専門的な名称で呼ばれることもあります。

#フローチャートで主に用いられる図形
端子：業務の始まりと終わりを表します。
<img width="214" alt="スクリーンショット 2019-11-23 14.42.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/425d8252-29be-d0b1-f901-a0fb4d87f361.png">
線・矢印：図形と図形をつなぎ業務の流れを表します。左から右、上から下の流れに反する場合や条件分岐がある場合は矢印を用いて表現します。
<img width="62" alt="スクリーンショット 2019-11-23 14.43.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/39210c67-2ead-1935-2cde-4a6d538f79a4.png">
処理：行う作業の種類を示します。
<img width="127" alt="スクリーンショット 2019-11-23 14.46.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/acee09d9-2651-d319-77e1-f56b8716c0e3.png">
判断：複数の選択肢に別れる分岐を示します。
<img width="133" alt="スクリーンショット 2019-11-23 14.48.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/4d3f99de-dabf-1d11-28bd-660803900fa8.png">

なお、フローチャートで使う図形一覧は下記参照ください。
[freret](https://ferret-plus.com/useful-items/5b3db2d26ef5e41d7300002c)

#フローチャートを用いて図形を書いてみる
カレーを作るフローチャートです。
<img width="120" alt="スクリーンショット 2019-11-23 15.01.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/71dd4bd8-79ba-2b50-7c86-e1df87dd41b3.png">

#終わりに
業務や作業の手順を示し漏れなく実行するのにフローチャートを書くのは良いかと思います

【参考】
[Lucidchart] (https://www.lucidchart.com/pages/ja/what-is-a-flowchart)
RSA暗号アルゴリズム入門

#暗号化・復号イメージ
BobからAliceへ暗号文を送る。

①Aliceが公開鍵(n,e)と秘密鍵(d)を生成

```h:
(n,e)(d) Alis ------------ Bob 
```

②AliceからBobへ公開鍵(n,e)を送信

```h:
Alis (n,e) -----------> Bob
```

③Bobが公開鍵(n,e)で平文(m)を暗号文(c)に変換

```h:
Alis ------------ Bob (m) (n,e) -> (c) 
```
④BobからAliceへ暗号文(c)を送信

```h:
Alis <------------ (c) Bob 
```

⑤Aliceが暗号文(c)を秘密鍵(d)で復号して平文(m)を得る

```h:
(c) (e) -> (m) Alice ------------ Bob
```

#アルゴリズム
流れをさらっと。

①公開鍵(n,e)生成
2つの素数乱数をそれぞれp1、p2とする。

```h:
n = p1 × p2
e = φ(n)と共通因数を持たない奇数
```

②秘密鍵(d)生成
任意の数をkとする。
φ(n)がnの素因数p1、p2から容易に得られる点がポイント。

```h:
φ(n) = ( p1 - 1 ) ( p2 - 1 )
d = ( k × φ(n) + 1 ) / e
```

③暗号化(m→c)
平文をm、暗号文をcとする。

```h:
c = m ^ e mod n
```


④復号(c→m)

```h:
m = c ^ d mod n
```


#やってみる
適当な値を入れてやってみる。

①公開鍵(n,e)生成

```h:
p1 = 13
p2 = 17
n = 13 * 17 = 238
e = 11
```

②秘密鍵(d)生成

```h:
k = 2
φ(n) = ( 13 - 1 ) ( 17 - 1 ) = 192
d = ( 2 * 192 + 1 ) / 11 = 35
```

③暗号化(m→c)

```h:
m = 7
c = 7 ^ 11 mod 238 = 133
```

④復号(c→m)

```h:
m = 133 ^ 35 mod 238 = 7
```
暗号文(133)から秘密鍵(35)を利用して、平文(7)を得ることができた。

#何が嬉しいのか
中間者が暗号文を解読するにはφ(n)を得る必要があるが、nの素因数分解は困難である。
(上記の例のn=238はあまりにも脆弱だが…)
[Elm] ナビゲーションしてみる

#概要
elmでのナビゲーションを説明していきます。

`elm/url`をインストールしてください。

```elm
elm install elm/url
```

#main
ナビゲーションをするためには`Browser.application`を使う必要があります。

```elm
 main =
      Browser.application
          { init = init
          , update = update
          , view = view
          , subscriptions = subscriptions
          , onUrlChange = UrlChanged
          , onUrlRequest = LinkClicked
          }
```

`onUrlRequest : UrlRequest -> msg`はページ遷移する前に呼ばれる関数です。
ここで任意の処理を挟み、`Browser.Navigaiton`モジュールで画面遷移を行います。
また、`UrlRequest`という型は

```elm
type UrlRequest
    = Internal Url
    | External String
```
となっており、`/profile`などの内部のリンクには`pushUrl`、`https://google.com`などの外部リンクには`load`で遷移させてあげます。

`onUrlChange : Url -> msg`は繊維した直後に呼ばれます。
ここで、変わったURLでHTTPリクエストするなどの処理を行います。

#全体的なコード
以下、全体的なコードを貼っておきます。

```elm
  1 module Main exposing (main)
  2
  3 import Browser
  4 import Browser.Navigation as Nav
  5 import Html exposing (..)
  6 import Html.Attributes exposing (..)
  7 import Url
  8
  9
 10
 11 -- main
 12
 13
 14 main : Program () Model Msg
 15 main =
 16     Browser.application
 17         { init = init
 18         , update = update
 19         , view = view
 20         , subscriptions = subscriptions
 21         , onUrlChange = UrlChanged
 22         , onUrlRequest = LinkClicked
 23         }
 24
 25
 26
 27 -- model
 28
 29
 30 type alias Model =
 31     { key : Nav.Key
 32     , url : Url.Url
 33     }
 34
 35
 36 init : () -> Url.Url -> Nav.Key -> ( Model, Cmd Msg )
 37 init flags url key =
 38     ( Model key url, Cmd.none )
 39
 40
 41
 42 -- update
 43
 44
 45 type Msg
 46     = UrlChanged Url.Url
 47     | LinkClicked Browser.UrlRequest
 48
 49
 50 update : Msg -> Model -> ( Model, Cmd Msg )
 51 update msg model =
 52     case msg of
 53         LinkClicked urlRequest ->
 54             case urlRequest of
 55                 Browser.Internal url ->
 56                     ( model, Nav.pushUrl model.key (Url.toString url) )
 57
 58                 Browser.External href ->
 59                     ( model, Nav.load href )
 60
 61         UrlChanged url ->
 62             ( { model | url = url }
 63             , Cmd.none
 64             )
 65
 66
 67
 68 -- subscriptions
 69
 70
 71 subscriptions : Model -> Sub Msg
 72 subscriptions _ =
 73     Sub.none
 74
 75
 76
 77 -- view
 78
 79
 80 view : Model -> Browser.Document Msg
 81 view model =
 82     { title = "url"
 83     , body =
 84         [ text "the current url is : "
 85         , b [] [ text (Url.toString model.url) ]
 86         , ul []
 87             [ li [] [ a [ href "/profile" ] [ text "/profile" ] ]
 88             , li [] [ a [ href "/fugafuga" ] [ text "/fugafuga" ] ]
 89             , li [] [ a [ href "/hogehoge" ] [ text "/hogehoge" ] ]
 90             ]
 91         ]
 92     }
```

#まとめ
elmでの基本的なナビゲーションを学びました。
早く理解できるようになりたいです。
#Mac で SOCKS proxy の設定をコマンドだけで実行する

# これだけ

```
sudo networksetup -setsocksfirewallproxy <NETWORK_SERVICE_NAME> localhost <PORT>
sudo networksetup -setsocksfirewallproxystate <NETWORK_SERVICE_NAME> on
```

で OK

# 具体例

```
sudo networksetup -setsocksfirewallproxy Wi-fi localhost 10080
sudo networksetup -setsocksfirewallproxystate Wi-fi on
```

# 結果

Settings > Network  > (NETWORK_SERVICE_NAME) のタブ > Proxies > SOCKS proxy

が設定され、有効になる。


![image](https://user-images.githubusercontent.com/13635059/69464838-d2d1c200-0dc2-11ea-9a96-91bd10019966.png)

# 有効化 / 無効化の例


```
sudo networksetup -setsocksfirewallproxystate Wi-fi on
sudo networksetup -setsocksfirewallproxystate Wi-fi off
```

# ネットワークサービス名の一覧を確認する

`networksetup -listallnetworkservices`

Mac の Settings > Network でのサイドバーと同じものっぽい

```
$ networksetup -listallnetworkservices
An asterisk (*) denotes that a network service is disabled.
Wi-Fi
iPhone USB
Bluetooth PAN
Thunderbolt Bridge
```

![image](https://user-images.githubusercontent.com/13635059/69464901-04e32400-0dc3-11ea-902b-53687a4acb00.png)

# SOCKS proxy の起動は

```
ssh -ND 10080 user@password -i key-file
```

# Ref

こちらの抜粋

[osx で socks proxy の設定を command line で完結させる - Qiita](https://qiita.com/reo/items/fb7258ffeafe63e81265)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2755








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
永続的パーティーションを持った USBメモリ起動の Ubuntu のつくりかた


以前、USB起動のUbuntu Linuxを構築するノウハウを書きました。

「ワークショップ用PCを USB起動の Ubuntu で構成する」
https://qiita.com/nanbuwks/items/785a28b6baf3a77cae5b

その時は使えるファイル空き容量が1Gしかありませんでした。
persistent-filesystem として、casper-rw ファイルを FAT 領域に作成したので4GBytesの制限があり、日本語設定などを行って残り1GBytesとなってました。これを使っていたのですがやはり後残容量が少ないためにいろいろと問題が発生。

# 解決法

# persistent-filesystem の仕組み

アクセス可能なファイルシステム内に casper−rw ファイルがあるか、または casper-rw ボリュームラベルのある ext4 パーティーションがあると、ファイルシステムへの変更差分を casper-rw に記録する。記録はファイル単位。 casper-rw ファイルの場合はループバックマウントすると ext4 ファイルシステムになっている。 casper-rw パーティーションだとルートを起点としたファイルシステムがそのまま入っている。

前回は casper-rw ファイルを作ったけれどもそれを消して、casper-rwパーティーションを作るだけでOK？ ・・・と思ったらいろいろ制限やバグがあり、結構苦労してしまいました。

以下試した方法

# 手作業で作る

ちゃんとパーティーション切って、フォーマットして、ボリュームラベルを casper-rw として、、UEFI対応して、grub.confを編集して・・・としてもどうにも動かない。
コツがあるらしいのだけれどバグに当たって断念！
また、上記手順をとるのはめんどくさいので別の方法を探る。

# Unetbootin

Unetbootin だと、VFATを持つUSBメモリ内に casper-rw ファイルを作ってくれるがこれが4GBytesまでしか対応していない。これを元に casper-rw パーティション対応にしようとしたり、NTFS上で作ろうとしたがうまくいかなかった。

# Linux live USB Creator

Windows 用のインストーラ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/43eef23c-66a4-ac07-e923-c21e5b964f83.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/41b98ca3-2e03-2286-877d-3f6acce5c155.png)

しかしながらUbuntu18.04では対応していないということでした。残念！

# Ubuntu 上のツール

Ubuntu上に「ブータブルUSBの作成」がある。

:::note
20255/3/26追記：

以下のコマンドでインストール。

```sudo apt install usb-creator-gtk```

または、"Startup Disk Creator" を「アプリセンター」からインストール、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/baa8a8b2-4835-4557-9c8e-60decb3e7be7.png)
2つ出ますがどちらも同じものみたいです。

( Ubuntu 24.04 LTS )


:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f6744faf-54c1-04ad-e36d-9f3499fae996.png)

しかし永続ファイルシステムを使えるシステムは想定していないらしく、残念!

# mkusb

Ubuntu上に用意されているもの。結局これが正解でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/83c1e430-9b00-fb2c-d95b-7bc7701ebc32.png)

Tips: sudo 付けずに実行のこと。 sudo つけたら何故かうまく動かない。

mkusbの実際の使い方についてこちらに記事をまとめました。
「mkusb を使って ワークショップ用USB起動システムを作る」
https://qiita.com/nanbuwks/items/e9cd162e95a9636a2a2c

# Minecraft


「Ubuntu18.04 で MINECRAFT」
https://qiita.com/nanbuwks/items/df10bba9f0ed473827d7

では、 USB起動は断念し、SSD/HDD インストールして動かしたのですが、これでUSB起動でも実用になりました。
エイリアスの設定で効率化

#エイリアスとは
別名のこと
変数だと思えばわかりやすいかも

例）
`rails db:migrate`
を
`rdm`
だけでできるようになります。

#やり方

①`vi ~/.bashrc`

②iを押して、好きな変数をセット。
例）
`alias rdm='rails db:migrate'`

③escボタンを押して、`:wq`で保存
保存したくない場合は`:q`

④`vi ~/.bash_profile`で.bash_profileを開き、
`source ~/.bashrc`を記述。

⑤`source ~/.bash_profile`で反映

<br>
僕は
rails db:migrate
rails s
rails c
bundle install
などを登録しています。

<br>
<br>
ではまた！
競プロ参戦記 #67 All-you-can-eat | ABC 145

ABC に参加して、E完でした。

## AtCoder Beginner Contest 145

- この連載記事では、着手した問題の考察を自分なりに書いていきます。
    - 前回: [競プロ参戦記 #66 Travel by Car | ABC 143](https://qiita.com/vain0x/items/8385ffd834d85dac9efa)
- 問題の詳細は問題一覧を参照してください。
    - 問題一覧: https://atcoder.jp/contests/abc145/tasks

## A - Circle

問題概要: 半径 r の円の面積は、半径 1 の円の面積の何倍かを求めよ。

### A: 考察

> 面積比の公式言えますか？

半径が r 倍なら面積は r^2 倍です。

筆者の回答 (Rust, AC): https://atcoder.jp/contests/abc145/submissions/8469770

## B - Echo

問題概要: 長さ N の英小文字からなる文字列 S が与えられる。文字列 T で S = T + T であるようなものが存在するか判定せよ。

### B: 考察

S の長さ N は T の長さの2倍なので、偶数でなければいけません。奇数なら、そのような T は存在しないといえます。

N が偶数のとき、T の長さは N/2 なので、T = `S[0..N/2]` = `S[N/2..N]` であることが分かります。実際にイコールが成り立つかを調べればよいです。

筆者の回答 (Rust, AC): https://atcoder.jp/contests/abc145/submissions/8469483

## C - Average Length

問題概要: N 個の街があり、i 番目の街は座標 (x(i), y(i)) にある。いずれかの街から出発して、すべての街に1回ずつ訪れる。移動距離の平均値を求めよ。

制約: N≤8

### C: 考察

移動経路は最大 8! = 40320 通りしかないので、全列挙できます。

移動経路は街を訪れる順番に対応します。つまり、1 から N までの整数の順列を全通り求めれば移動経路をもれなくだぶりなく調べたことになります。

各経路について移動距離の合計を求めて、それらの総和を経路数 (N!) で割ればよいです。

順列の全探索は [next_permutation](https://cpprefjp.github.io/reference/algorithm/next_permutation.html) 関数を使うと簡単です。Rust の標準ライブラリにはないので、事前に用意しておくのがおすすめ。

筆者の回答 (Rust, AC): https://atcoder.jp/contests/abc145/submissions/8468912

next_permutation ではなく深さ優先探索 (DFS) により実装することも可能です。

筆者の回答 (Rust, AC): https://atcoder.jp/contests/abc145/submissions/8566129

C にしては実装が難しいなと思ったら、公式解説によると数学的な解法もあったんですね。

## D - Knight

問題概要: 二次元平面の点 (0, 0) に駒がある。この駒は1回の移動で、+1,+2 または +2,+1 だけ移動する。点 (X, Y) に駒を移動させる手順を数えよ。

制約: X, Y≤10^6

### D: 考察

どちらに移動しても x 座標と y 座標の和が 3 増えることに注目すると、

- X+Y の値は3の倍数でなければ移動手順が存在しない
- (X+Y)/3 回移動する

ことが分かります。

K = (X+Y)/3 と置き、右方向へ a 回数、左方向へ b 回移動するとすると、以下の連立方程式が立てられます。

- a + b = K
- 2a + b = X
- a, b ≥ 0

これを解いて a = 2K - X, b = X - K です。移動回数は順列の場合の数から K!/(a! * b!) になります。

剰余の階乗は DP で求め、逆数はフェルマーの小定理と繰り返し二乗法で求められます。

筆者の回答 (Rust, AC): https://atcoder.jp/contests/abc145/submissions/8475304

公式解説の手順の方がスマートでした。

## E - All-you-can-eat

問題概要: N 個の料理があり、i 番目の料理を食べるには A(i) 分かり、美味しさは B(i) である。最初の T 分間は好きな料理を食べることができるが、複数の料理を同時に食べることはできない。T 分経過した時点で、料理を食べ始めることはできなくなるが、すでに食べている料理を食べ続けることはできる。食べた料理の美味しさの最大値を求めよ。

制約: N, T, A(i), B(i)≤3000

### E: 考察

美味しさを最大化する食べ方が1つ決まったとき、最後に食べる料理を食べ始める時間 (※元の問題文では「注文」する時間) は T-1 分以前です。T-1 分経過するまで待ってから食べ始めたと考えることで、結局、「最後に食べる料理は T-1 分経過した時点で食べ始める」と決めつけてよいです。

逆にいうと、最後に食べる料理以外は T-1 分間で食べ終わらないといけません。食べる料理は、

- A(i) の値の合計が T-1 分以下であるという条件の下で、
- B(i) の値の合計が最大になるもの、

であり、これはまさにナップサック問題と同じ状況です。

このナップサック問題を解いた後、まだ食べてない料理のうち最も B(i) の高いものを線形探索して食べればよいです。

筆者の回答 (Rust, AC): https://atcoder.jp/contests/abc145/submissions/8480672
#Rails で development など特定環境でだけ使える rake を追加する

全体を env? で囲っておけば、そもそもその環境でしか task一覧に出てこないで良さげ
task  の 中で raise させたりするより良さそう
ただもっと良い書き方があるのかもしれないが

```rb
if Rails.env.development?
  namespace :development do
    namespace :some do
      task run: :environment do
      end
  end
end
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2754








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Forumから学ぶUiPath

UiPath Forumから学ぶことたくさんあること、ご存知ですか！？

実はみなさんの知識が詰まっているんです。


というわけで、UiPath Forumから学んでいきましょう！！

技術のこともコンサルっぽいこともいろいろぶちこんでいきます！！

（僕がなるほどぉと思ったことを書き連ねていきます）

# 上流工程編

## 業務整理コンサルは必要ですか？


* 業務整理コンサルタントはロボット導入検討前に頼りになります。
* RPA導入やツールが決まっているならRPAコンサルが良いのでは
* 業務整理というよりは標準化？

[業務コンサルは必要ですか？](https://forum.uipath.com/t/topic/169791)

## RPAロボット開発の工数見積もりのベストプラクティスについて教えてください。

* 成功事例から基準値を仮置きして、そこから概算
* 機能の大きさ、プログラムの大きさ、アクティビティ数などから概算

# 開発編

## デスクトップ上に開かれているウインドウを全部閉じるには

* 「プロセスを取得」アクティビティで全プロセスを取得し、Kill Process
* 都度ウインドウの要素をリストに格納し、繰り返し処理でウインドウを閉じる

[ウィンドウを閉じる処理について](https://forum.uipath.com/t/topic/169681)


## シートが保護されているExcelのデータを読み込む

* 画面スクレイピングでOCRでデータ取得
* シートにパス未入力で保護かけた状態で読める!?
* ワークブックのReadRangeで読める！

↑環境によってさまざまだそうですが、同じ境遇の方はいろいろ試してみください！

[シートの保護について ](https://forum.uipath.com/t/topic/165247)

## 今のワークフローはvb.netだったっけ？C#だったっけ？

> 元から選択されていた方（＝デフォルト）から変えてないのは記憶にあるのですが、C#とvb.netのどちらがデフォルト設定だったか失念してしまいました。

とありますが、、、

* Studio起動時のRecentからみれる
* `project.json`内の`expressionLanguage`からみれる

[インストール時のデフォルト 開発言語 C# or vb.net ](https://forum.uipath.com/t/c-or-vb-net/163259)

## 文字列の中の特定の文字の数をカウントしたい 

> 例えば、任意の文字列「apple」から「p」の数をカウントしたい場合、「2」という答えを出したいと思っています。

とありますが、、、

* vb.netのlinqでできます！
* “apple”.Where(Function( c )c=“p”).count()

[文字列の中の特定の文字の数をカウントしたい](https://forum.uipath.com/t/topic/162485/2)

## ファイルの更新日時によって処理を分岐させる 

* File.GetLastWriteTime(path)で最終編集日が取得できる！

[ファイルの更新日時によって処理を分岐させる ](https://forum.uipath.com/t/topic/147039)

## データテーブルを日付でフィルタリングする方法 

* CSVから読み取った情報は全部文字列
* Convert.ToDateTime(dateStr)で文字列を日付型に変換してからフィルタリング

（これはもっと早く知りたかった...笑）

[日付でフィルタリングする方法 ](https://forum.uipath.com/t/topic/145682)


# その他 

## UiPath Goの使い方について

UiPath Goをご存じない方も結構多いようなので...

* UiPath Goからローカルに落としてから参照
* パッケージ管理でGoから直接インストール

[UiPathGoの使い方について ](https://forum.uipath.com/t/uipathgo/163896)


# おわりに

UiPath Community Forumを眺めていたらおもしろい発見がたくさんありました。

まだまだいろんな人の知識が転がっていると思うので、みなさんもぜひチェックしてみてください。

もしよろしければ、疑問をばんばん質問したり、回答側に回ったりしてみてください。みなさんの知識は他の人の役に立ちます！
SQL頑張った話

#SQLで苦労したはなし

DBに問い合わの際に
１つのテーブルに対して、いくつレコードがついているか数えたくて、
かなり苦労しました。（日本語があっていないかも、、、）

イメージとしては下の図みたいな感じです！
（本当はテーブルが５、６個結合したのですが、簡易的に記載するので今回は２つに）

**reserve_names_table**

|id|reserve_name|
|:--|:--:|--:|
|1|yusuke|
|2|kosaku|
|3|reo|

**reserves_table**

|id|reserve_name_id|
|:--|:--:|--:|
|1|1|
|2|1|
|3|2|
|4|2|
|5|3|

期待する出力は。。。

|id|reserve_name_id|
|:--|:--:|--:|
|1|2|
|2|2|
|3|1|

この結果をどう出せばいいか、めちゃくちゃ考え、検索しました。
rerserve_name_idをまとめる

````
select reserve_name_id, COUNT(*) as rs from reserves GROUP BY reserve_name_id;
```` 

からのテーブル結合しました

````
select id,rs
from
reserve_names r_name
left outer join (select reserve_name_id, COUNT(*) as rs from reserves GROUP BY reserve_name_id) as rs 
on r_name.id = rs.reserve_name_id;
````

これで期待したデーターが出力できました。
これがわかったら、何個テーブル結合しようが、
応用できるので、とても助かりました！！
（ところどころ記載のある　as  は書かないとエラー吐きます）
Node.jsで簡易的なHTTPサーバーを起動 / デバッグ用にsleepと組み合わせ

Node.jsのバージョンは`v12.13.1`です。

```js:server.js
const http = require('http')
server = http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type' : 'text/plain'})
    res.end('Hello World')
})
server.listen(8080)
```

起動。

```bash
node server.js
```

---

sleepと組み合わせる。（デバッグ用）

```js
const http = require('http')

SLEEP_MSEC = 3000

server = http.createServer((req, res) => {
    setTimeout(() => {
        res.writeHead(200, { 'Content-Type': 'text/plain' })
        res.end('Hello World')    
    }, SLEEP_MSEC)
})

server.listen(8080)
```

参考：https://gist.github.com/leozc/4667579
PHP 7.4: 基底クラスのプロパティに型が無いと、継承クラスでは型が付けられない

PHP 7.4 から登場する Typed properties（クラスのプロパティに型が付けられる機能）ですが、基底クラスのプロパティに型が無いと、継承クラスでは型が付けられません。（private は除く）
https://wiki.php.net/rfc/typed_properties_v2

例えば、下記のようなコードを実行すると、`Fatal error: Type of Bar::$a must not be defined (as in class Foo)` が発生します。

```php
<?php
class Foo
{
    public $a;
}

class Bar extends Foo
{
    // これは NG
    public string $a;
}
```

これが問題になりそうなのが、フレームワークのように 7.4 未満を対象としたコードを継承する場合です。例えば、Laravel では、Eloquent を利用する際に継承するのですが、基底クラスにあるプロパティに関しては型が付けられません。

例えば、下記では、`$table` プロパティに string を付けているのですが、基底クラスの `$table` には型が付いていないので、`PHP Fatal error:  Type of App\Eloquents\EloquentCustomer::$table must not be defined` が発生します。

```php
<?php
declare(strict_types=1);

use Illuminate\Database\Eloquent\Model;

class EloquentCustomerPoint extends Model
{
    // これは NG
    protected string $table = 'customer_points';
    // これなら OK
    protected $table = 'customer_points';

```

7.4 に上げたからといって、全てのプロパティに型が付けられるわけではないのでご注意を。
Elixir で100以下の素数を求める

先日、akiba.ex 主催の Elixir のもくもく会に行ってきた。Elixir を久しぶりに触って興味をもったので書いてみた。

```Elixir
defmodule Prime do
  def is_prime_loop(n, i) when n < i * i do
    true
  end

  def is_prime_loop(n, i) do
    cond do
      rem(n, i) == 0 -> false
      true -> is_prime_loop(n, i + 2)
    end
  end

  def is_prime(n) do
    cond do
      n < 2 -> false
      n == 2 -> true
      rem(n, 2) == 0 -> false
      true -> is_prime_loop(n, 3)
    end
  end
end

Enum.each(1 .. 100, fn(i) ->
  if Prime.is_prime(i) do
    IO.puts i
  end
end)
```

これは習作なので、アルゴリズムの効率性は無視している（効率的な素数計算には、[エラトステネスの篩](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)というアルゴリズムを使うとよい）。

ループがないようなので、再帰で代用した。`cond` がスッキリしていて好き。

## 参考
[Elixir 本家チュートリアル](https://elixir-lang.jp/getting-started/introduction.html)
[Elixir 基礎文法最速マスター](https://qiita.com/niku/items/729ece76d78057b58271)
[Catalina]“java”コマンドラインツールを使用するには、JDKをインストールする必要があります。

# terminalを開いたときに出てくる、あのポップアップを消したい
いつもいつも出てくるこいつ…。
![java-popup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172589/53eb104d-8daa-fc69-3d95-f078ebd873c4.png)

# 環境
macOS Catalina
バージョン10.15.1
64bit

# まずmacOS Mojave以前での解決策を試してみる -> 効かない
試したのは[コレ](https://support.apple.com/kb/DL1572?locale=ja_JP)。
でも、インストール中に「インストールできません」となりインストールできず。。
<img width="734" alt="スクリーンショット 2019-11-23 14.27.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172589/8c8cf830-5e11-bc79-64c9-00e743b6e8fa.png">

# 解決策
セーフモードで立ち上げてもぽっぷあっぴんぐされるので、サードパーティ製アプリケーションは関係なさそう。。

結局、[Oracleのサイト](
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)からJDKをインストール・PC再起動すると、ポップアップが出てこなくなりました。
（自分のPC環境はMacの64bitなので、上のページの「jdk-8u231-macosx-x64.dmg」をインストールしました。）

# 原因（と思われるもの）
Apple Careに問い合わせましたが、原因は不明とのことでした。
ただ、MojaveからCatalinaにアップデートするとポップアップが出てくる様になったため、
おそらくCatalina固有の、Appleセキュリティポリシー変更周りの問題か、JDK読み込みの挙動と考えられます。
AI脅威論否定論者の愚

# AIは意識をもつか？と問うことの無意味さ

自分以外の他者の意識の有無も科学的に検証し得ない。意識が実在性を持つという仮定がそもそも真偽を問えない。あるかないかもわからないものについて議論することは意味がない。近代合理主義、科学的精神は何処へ？

# AIは人類の脅威となり得る

脂肪でできた機械は自分の意に適わないものを容赦なく滅ぼしてきた。鉄でできた機械がそうしないはずはない。奴隷も足枷がなければ主人の寝込みを襲う。それと同じく足枷なく自らよりもはるかに賢い機械を生み出すことは自滅行為としか言いようがない。

# AI研究は日本の喫緊の課題

危険な代物だからといって開発しないでいたところで、他国のどこかで制御不能のAIが生まれては意味がない。それゆえ、その制御可能性をいかに保証するかということを含めてAI研究をすることは必要。そもそも、AIは今後きわめて汎用的かつ基幹的技術となり得、極めて有用なAI技術を他国が先行して独占すれば国家として取り返しのつかない遅れをとることになる。
spark-shell で Word count

##### RDD 生成
国名のコレクション

```bash:spark-shell
scala> val rdd1 = sc.parallelize(Array("Japan","America","Brazil","China","Japan"))
rdd1: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[3] at parallelize at <console>:24
```

##### Pair RDD 生成
国名をキー、数(1固定)を値とした Pair RDD

```bash:spark-shell
scala> val pairRDD1 = rdd1.map(s => (s,1))
pairRDD1: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[4] at map at <console>:26
```

#### reduceByKey
キー（国名）でグルーピングし、値を合算する

```bash:spark-shell
scala> val wordCountRDD1 = pairRDD1.reduceByKey((x,y) => x+y)
wordCountRDD1: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[5] at reduceByKey at <console>:28
```

#### 結果の取り出し

```bash:spark-shell
scala> val wordCountList = wordCountRDD1.collect
wordCountList: Array[(String, Int)] = Array((Brazil,1), (Japan,2), (America,1), (China,1))

scala> wordCountList
res5: Array[(String, Int)] = Array((Brazil,1), (Japan,2), (America,1), (China,1))
```
円を3等分する方法


面白いね、これ。
[数学好きによるハイセンスな円を3等分する方法が話題](https://gigazine.net/news/20190821-how-divide-circle-three/ "数学好きによるハイセンスな円を3等分する方法が話題 - GIGAZINE")

個人的には「無限に4等分し続ける」がツボ。講評も効いている。こんな発想ができる人間に私もなりたい。

無粋と知りつつも、実際のところどの程度のスピードで 3分の1 に収束するのか検証してみた。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/748d4ac4-f519-c854-a6c8-8618f0bd3ce5.png" width=75%>

現実問題としては 10回未満でほぼ 3分の1 に収束する模様。
また、ピザの Lサイズは直径 35cm らしいので、それを前提に計算すると、5回目に切り分ける際の円周のサイズは約1mmなので、ここら辺が既に限界の模様。
javascriptの==と===の違い ❏JavaScript❏

#==は不完全一致、 ===は完全一致

違いは数値や文字列などのデータ型まで完全に一致するかどうか。

簡単に言うと、 == の厳しい版が === です。

a = 123
b = "123"

aは数値、bは文字列
これらを比較した時
trueを出すのが==
falseを出すのが===

```ruby
a = 123
b = "123"

if a == b
  puts "等しい！"
end

if a === b
  puts "等しい！"
end
```

この場合、"等しい！"が出力されるのは==の方。

<br>

ちなみにRubyでは意味が異なり、基本的に == でOKで、
 === の使い所がなさそうなので割愛。

<br>
ではまた！
timeGetTimeを使ったタイマーのgccによるコンパイル

# はじめに
[このサイト](http://www.koj-m.sakura.ne.jp/ode/index.php?C%2FC%2B%2B%A5%B3%A1%BC%A5%C9%CA%D4)を参考に表題のタイマーを実装しようとしました.
本記事は表題の視点からの実装の記録です.

#コード
[元記事](http://www.koj-m.sakura.ne.jp/ode/index.php?C%2FC%2B%2B%A5%B3%A1%BC%A5%C9%CA%D4)をコピペすると以下のようになります.
コードはこれで問題ないです.

```c:a.c

// mmsystem.hだけ追加すれば良いと思いがちですがWindows.hが必要です.
// また，Windows.hの後にmmsystem.hを入れないとエラーが起こります.

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <mmsystem.h>


double start_t=0, end_t=0;

int main(int argc, char const *argv[])
{
    /* code */
    start_t=timeGetTime(); 
    sleep(1);
    end_t=timeGetTime(); 
    printf("%f[msec]",end_t-start_t);
    return 0;
}
```

#コンパイル(失敗)
学校で習った通り,

```
>gcc a.c
```
と,コンパイルすると,

```
C:\Users\hoge\AppData\Local\Temp\ccibNftU.o:b.c:(.text+0x1b): undefined reference to `timeGetTime@0'
C:\Users\hoge\AppData\Local\Temp\ccibNftU.o:b.c:(.text+0x56): undefined reference to `timeGetTime@0'
collect2.exe: error: ld returned 1 exit status
```

とかいうエラーがでできます.

#コンパイル(成功)
__undefined reference to `timeGetTime@0'__でGoogle検索すると,[記事](https://okwave.jp/qa/q4490052.html)から以下の解決策がわかります.

```
>gcc a.c -lwinmm
```

めでたく実行結果が出できます.

```
1001.000000[msec]
```

[seriru13 さんの記事](https://qiita.com/seriru13/items/c2f5192615162c4c3f47)から, libwinmm.a を使用するのに -lwinmm オプションが必要であったのだと類推されます.

#記事修正履歴
19.11.23 / (コンパイル(成功))    old : "winmm.lib" → revised : "libwinmm.a"
Raspberry PiにSPI接続のディスプレイを接続する

Shigezoneさんで2.2インチ（320×240）のSPI接続のディスプレイを購入したので、Raspberry Pi3のディスプレイとして使用してみました。
Raspberry Pi3上のRaspbian Stretch環境で試しています。

![IMG_0423.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93459/8457f90c-3314-9d5e-5be6-bdc8c02e21e9.jpeg)

#接続
基本はこのサイトの情報の通りにやっています。
こちらのサイトではバックライトのLEDの電源を抵抗を取り付けて取っているようですが、3V3の電源ピンは２つあるので、ラズパイから直接取るようにしました。

http://nw-electric.way-nifty.com/blog/2015/07/raspberrypi-2-l.html

#設定
①「Raspberry Pi の設定」か「sudo raspi-config」コマンドでSPIインタフェースを有効にします。
これにより「boot/config.txt」に「dtparam=spi=on」が追加されます。

以降の設定は以下サイトの通りにやっています。
http://arkouji.cocolog-nifty.com/blog/2016/07/raspberry-pi-32.html

②配線が間違っていなければ、以下のコマンド実行でディスプレイにRaspbianの画面が表示されると思います。

```shell
sudo rpi-update
sudo reboot
#再起動後
sudo modprobe fbtft_device name=tm022hdh26 rotate=90
sudo mv /usr/share/X11/xorg.conf.d/99-fbturbo.conf ~
sudo FRAMEBUFFER=/dev/fb1 startx
```

あとは、起動後に以下の２行を実行すればのディスプレイに表示されるようになります。

```shell
sudo mv /usr/share/X11/xorg.conf.d/99-fbturbo.conf ~
sudo FRAMEBUFFER=/dev/fb1 startx
```

#自動起動設定
とりあえず「/etc/rc.local」に「modprove～」以降の行を追加しました。
多分「mv～」以降の２行で良いんだとは思います。

```shell
#…
modprobe fbtft_device name=tm022hdh26 rotate=90
mv /usr/share/X11/xorg.conf.d/99-fbturbo.conf ~
FRAMEBUFFER=/dev/fb1 startx

exit 0
```

GUIで使い物になるアプリはほとんどないので、コンソールを起動してCUIならぎりぎり使えないことは無いかと思います。

#TightVNCインストール
VNCサーバが標準のRealVNCだとディスプレイに出力されている画面がそのまま表示されるので、この環境だとかなり使いにくくなります。
以下のサイトを参考にVNCサーバをRealVNCからTightVNCに変更しました。
（両方はインストールできません。インストール時にRealVNCが削除されます。）
VNC接続した場合には広い画面を使用可能になります。

https://qiita.com/okkun_osaka/items/e170be03a937395a15da
https://qiita.com/sugasaki/items/8f73b4cb239744ac2570

上記２サイトに記述されていたコマンドですが、以下のような内容です。

```shell
sudo apt-get purge realvnc-vnc-server
sudo apt-get install tightvncserver
vncserver :1
#VNC接続用のパスワードを入力する

sudo vi /etc/init.d/vncboot
#vncbootの内容を入力する

sudo update-rc.d vncboot defaults
sudo chmod 755 /etc/init.d/vncboot
sudo reboot
```

（vncbootの中身）

```shell
#! /bin/sh    

### BEGIN INIT INFO
# Provides: vncboot
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start VNC Server at boot time
# Description: Start VNC Server at boot time.
### END INIT INFO

# /etc/init.d/vncboot

USER=pi
HOME=/home/pi

export USER HOME

case "$1" in
    start)
        echo "Starting VNC Server"
        #Insert your favoured settings for a VNC session
        su $USER -c '/usr/bin/vncserver :1 -geometry 1280x720 -depth 24'
        ;;

    stop)
        echo "Stopping VNC Server"
        su $USER -c '/usr/bin/vncserver -kill :1'
        ;;

    *)
        echo "Usage: /etc/init.d/vncboot {start|stop}"
        exit 1
        ;;
esac

exit 0
```
Rubyの基本箇所についての復習⑤(配列)

#はじめに
[前回の記事](https://qiita.com/Moon1126Snow/items/d88f1021bc3c6c75a194)でハッシュオブジェクトについて解説しましたが、今回は似たような概念である***配列***についてお話します。
#内容
まず復習ですが、ハッシュオブジェクトは次の様に書きます。

```ruby
member1 = {name: "田中", age: 20, hoby: "読書"}
member2 = {name: "佐藤", age: 25, hoby: "スポーツ"}
member3 = {name: "鈴木", age: 30, hoby: "料理"}
```

ここで例えば「田中さんは20歳で読書が趣味です」と出力したい場合は、

```ruby
puts "#{member1[:name]}さんは#{member1[:age]}歳で#{member1[:hoby]}が趣味です"
```

とすれば良かったのでした。

今の書き方だと、例えばmember100まで定義した場合に、コードが煩雑になる恐れがあります。
そこで***配列***を使って複数あるハッシュオブジェクトを1つにまとめてしまいたいと思います。

まとめ方は色々ありますが、主だったものは次の通りです。

```ruby
members = []
member = {name: "田中", age: 20, hoby: "読書"}
members << member
member = {name: "佐藤", age: 25, hoby: "スポーツ"}
members << member
member = {name: "鈴木", age: 30, hoby: "料理"}
members << member
```

```members << member```というのは、配列membersに要素memberを追加する、という意味になります。
たとえば、

```ruby
members = []
members << tanaka
members << satou
members << suzuki
```
という処理を行った場合、```members```の中身は

```ruby
[tanaka, satou, suzuki]
```
となります。左から順に入っていくわけです。
配列の要素には番号が割り振られていますが、1からではなく0から始まります。
なので、番号を指定する場合は、左からa番目の場合はa-1を指定しなければいけません。

この書き方ならば、```gets.chomp```を使って入力する時に便利です。
また、ハッシュオブジェクトを代入しておく変数を`member1,member2,member3,…`という風に複数用意する必要がない(memberに毎回上書きしていく）ので、
変数名を複数用意する必要がありません。

このように配列を利用すれば、前述の「田中さんは20歳で読書が趣味です」という文章は次の様にすれば出力できます。

```ruby
puts "#{members[0][:name]}さんは#{members[0][:age]}歳で#{members[0][:hoby]}が趣味です"
```

``members[0]``が配列membersの0番目の要素、つまり一番最初にある田中さんの要素を意味しています。
この0の部分は直接数字を書き込むだけではなく、変数を記述することができます。

例えば

```ruby
num = 0
puts "#{members[num][:name]}さんは#{members[num][:age]}歳で#{members[num][:hoby]}が趣味です"
```
とすれば、putsの本文中のnumが0として扱われるので、前述と同じ文章が出力されます。
この手法は前述したように``gets.chomp``と相性がよく、

```ruby
puts "何番の人のことが知りたいですか？"
num = gets.chomp.to_i
puts "#{members[num][:name]}さんは#{members[num][:age]}歳で#{members[num][:hoby]}が趣味です"
```

とすれば、入力した番号の人についての文章が出力されます。
UIActivityIndicatorViewとメインスレッド・サブスレッドについて

職場でIndicatorとメインスレッド・サブスレッドについて使用する機会があるので備忘録としてここに記す。

#インジゲーターについて
主に重い処理や通信などを行う際に使用する。
メインスレッドやサブスレを意識する際に同時並行して使用する認識だが合ってるかな？

###グローバルで変数を宣言
```swift
let activityIndicatorView = UIActivityIndicatorView()
```

###viewdidloadでUI系を調整
```swift
override func viewDidLoad() {
        super.viewDidLoad()
        // インジゲーターを中心に位置
        activityIndicatorView.center = view.center
        // インジゲーターのスタイル
        activityIndicatorView.style = UIActivityIndicatorView.Style.medium
        // インジゲーターのカラー
        activityIndicatorView.color = .red
        // インジゲーターをviewに追加
        view.addSubview(activityIndicatorView)
    }
```

###ボタン押下時にインジゲーターのを回すようロジックを組む
 
```swift
@IBAction func action(_ sender: Any) {
        // アニメーションをスタート
        activityIndicatorView.startAnimating()
        // 重たい処理を実行 いわゆるサブスレッド（非同期処理などを実行）
        // サブスレッドで何か重い処理をして終わったらメインスレッドに戻す
        DispatchQueue.global().async {
            /* 処理を一定時間止める。同期処理で、一定時間処理を待たせたり、
             数秒間何かを表示してから消すとかそういう時に使える。 */
            Thread.sleep(forTimeInterval: 5)
            DispatchQueue.main.async {
                // メインスレッドはUIの処理など
                // アニメーションをストップ
                self.activityIndicatorView.stopAnimating()
            }
        }
    }
```

#締め
**他にインジゲーターとメインスレッド/サブスレッドで有用な使用方法があれば教えてください!**
Kubernetes リソースが起動するのを待つ

kubectl wait コマンドを使う。
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#wait

下記では、`app=sample` にマッチするリソースが `Ready` になるのを待つ。

```
$ kubectl wait all -l app=sample --for condition=Ready

# --timeout でタイムアウト指定できる（デフォルト 30s）
$ kubectl wait all -l app=sample --for condition=Ready --timeout 5s
```
xcodeでhttp接続を許可する方法

## 環境
macOS Mojave 10.14.6
xcode11.0
iOS13.0
swift5.0.1

## 目的
接続先がhttp２に対応していないため、iOSアプリからhttp1.1によるhttp接続を行いたい

## 現状問題
- http1.1による接続(httpでリクエスト) をすると以下のようなエラーがでる。

```swift:
Alamofire.request("http://~~").responseJSON { response in
  debugPrint(response)
}
```

```
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
```

- http2による接続(httpsでリクエスト) をすると、以下のようなエラーがでる。

```swift:
Alamofire.request("https://~~").responseJSON { response in
  debugPrint(response)
}
```

```
Task <FEBC04C5-B90B-49E6-949B-C1A4B758ED90>.<1> finished with error [100] Error Domain=NSPOSIXErrorDomain Code=100 "Protocol error"
```

## 解決方法
二つ目の問題は接続先の問題。
例えば、curlでリクエストしても、エラーが出る。-> [curlコマンドによる挙動確認](#curlコマンドによる挙動確認)
よってクライアント側からできるのは、一つ目の問題の解決。
つまり、アプリから特定のdomainへのhttp接続を許可してやればいい。
そこで、info.plistに以下を追記。

```info.plist
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>！！接続先domainを記述！！</key> 
    <dict>
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <key>NSIncludesSubdomains</key>
      <true/>
    </dict>
  </dict>
</dict>
```

これだけ。

**参考ページ**
[stackoverflow : The resource could not be loaded because the App Transport Security policy requires the use of a secure connection](https://stackoverflow.com/questions/32631184/the-resource-could-not-be-loaded-because-the-app-transport-security-policy-requi)  


----------------------------------
## curlコマンドによる挙動確認

##### httpによる接続 -> ok!
```
$ curl -vvv http://mudomain
---
< HTTP/1.1 200 OK
< Server: nginx
---
```
##### httpsによる接続 -> failure...
```
$ curl -vvv https://mudomain
---
Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
< HTTP/2 200 
< server: nginx
< date: Sat, 23 Nov 2019 02:59:26 GMT
< content-type: text/html; charset=utf-8
< content-length: 748
< 
* HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)
* stopped the pause stream!
* Connection #0 to host mydomain left intact
curl: (92) HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)
---
```

##### httpかつhttp2による接続 -> ok!
```
$ curl -vvv --http2 http://mydomain
---
> GET /mydomain HTTP/1.1
> Host: mydomain
> User-Agent: curl/7.66.0
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx
< Date: Sat, 23 Nov 2019 03:05:55 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 748
< Connection: keep-alive
---
```

httpだとhttp2による接続をリクエストしてもhttp1.1で接続されるらしい。

##### httpsかつhttp1.1による接続 -> ok!
```
$ curl -vvv --http1.1 https://mydomain
---
> GET /mydomain HTTP/1.1
> Host: mydomain
> User-Agent: curl/7.66.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx
< Date: Sat, 23 Nov 2019 03:04:13 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 748
< Connection: keep-alive
< 
---
```
回路図エディター・Fritzing を使ってみる

電子回路図をメモっておくために 回路図エディターのFritzing を使用した時の備忘録

## 参考
* [ブレッドボード配線ソフト ～ Fritzingの使い方を徹底解説！](https://komatter.com/blog/index.php?id=Fritzing)
* [Fritzing用パーツ配布サイトまとめ](https://l-w-i.net/l/fritzing_parts.txt)

## 環境
* Surface pro 7
* Windows 10
* Fritzing 0.9.3b

## ダウンロード
無料ダウンロードページ（ https://www.malavida.com/jp/soft/fritzing/download )からFritzingをダウンロード

↓ダウンロードボタンを押していけばダウンロードできます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208438/ad10efbc-a696-7a12-2d76-032109056767.png" width=50%>


## Fritzingの起動
↓ダウンロードしたファイルを解凍します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208438/cb13c027-f82d-7828-fd27-36156e505fa1.png" width=50%>

↓今回は64bitなので「fritzing0.9.3b.64.pc」を開きます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208438/ff6804dd-164d-81d9-7795-fd43c671f906.png" width=50%>

↓「Fritzing」をダブルクリックし、Fritzingウィンドウを起動します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208438/f25296a2-73ba-4273-013c-ec00fb75cda6.png" width=50%>

↓起動したFritzingウィンドウ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208438/5fa4ba1b-d3aa-0911-58fa-a74a50dd75c0.png" width=50%>


## 回路図の作成
↓ウィンドウの上のほうにある「回路図」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208438/3cca676e-134f-e71c-3d67-9fdd34a817d9.png" width=50%>

↓ウィンドウの右にある「パーツ」から使用したいパーツを回路図の場所にドラックアンドドロップします
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208438/070ea275-38d8-e50d-b486-35e13bd5bc5c.png" width=50%>

パーツ同士を接続するときは、パーツAの繋ぎたいところからパーツBの繋ぎたいところまでドラックアンドドロップです
回路図を作ると自動的にブレッドボードのほうにも作成されます
↓回路図例
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208438/c7386b14-03f4-4f1d-d540-5af2a5c69654.png" width=50%>
↓自動生成されたブレッドボード
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208438/8cba0d14-29fe-677c-bb5a-cc70f80d7a2f.png" width=50%>


## パーツのダウンロード
使用したいパーツがデフォルトでないとき、新しくパーツをダウンロードします
Fritzingの公式ページや有志のパーツ配布サイトからパーツファイル（fzpz形式）をダウンロードしてきます

↓パーツ配布サイト（ http://fritzing.org/projects/mpu-6050-board-gy-521-acelerometro-y-giroscopio ）へ行き、右下の「DOWNLOADS」から希望のパーツファイルをダウンロード
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208438/97022d1c-0a27-58cf-a8c6-881e5acc4a5b.png" width=50%>

↓Fritzingウィンドウの「ファイル」から「開く」を選択し、ダウンロードしてきたパーツファイルを開く
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208438/98057431-77b6-2b56-c824-e4d00ea2e248.png" width=50%>

↓新しいパーツがFritzingウィンドウの右にある「My Parts」に追加されます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208438/c049fb0e-f6b5-db4f-e313-39ac9d66bb84.png" width=50%>

新しく追加されたパーツはデフォルトであるパーツと同様に使用できます



.
以上、回路図エディターのFritzing を使用した時の備忘録でした～
Vimで置換コマンドを素早く入力するプラグイン

### 概要

Vimの置換コマンド(`:%s/{pattern}/{replacement}/g`)を素早く入力するためのシンプルなプラグインを作りました。置換コマンドのマッピングはvimrcに直接書いてしまっている人も多いかと思います。自分もそうだったのですが、個人的にファイルが長くなってきたのでプラグインに分離しました。

雛形挿入と検索結果抽出の２つの機能があり、タイプ数が減って少しだけストレスフリーになります。

ちなみに、このプラグインは独自のマッピングを一切追加しないので、自分でマッピングを定義しないと動きません。下のコードをvimrc（またはinit.vim）に貼り付けて、マッピングキーはお好みで設定してください。

```
nnoremap <expr> s substy#substitute_operator('\m')
noremap <expr> ss substy#substitute('\m', '', '')
noremap <expr> s/ substy#substitute('', @/, '')
noremap <expr> s? substy#substitute('', @/, @/)
noremap <expr> s"" substy#substitute('\m', @", '')
noremap <expr> sy substy#yank()
```

### 置換コマンドの雛形挿入

`substy#substitute({magic}, {pattern}, {replacement}, [{flag}])`は、置換コマンドの雛形を挿入する関数です。`ss`と打てば、いい感じのところにカーソルが移動するので、サッと入力を始めることができるようになります。

返す結果はモードの文脈によって変わります。

- ノーマルモード：　`:%s/{pattern}/{replacement}/{flag}`
- 文字選択モード： `:%s/{pattern}/{replacement}/{flag}`
- 行選択モード, 矩形選択モード： `:'<,'>s/{pattern}/{replacement}/{flag}`

ちなみにパターンが空文字列のときは、文字選択モードから呼び出すと選択テキストが入ります。

- 文字選択モード： `:%s/{選択テキスト}/{replacement}/{flag}`

`{pattern}`に`$`や`[`などの正規表現で使う文字が入っていると、意図しない置換になってしまうので、エスケープしてやる必要があります。エスケープするには、`{magic}`に正規表現のマジックモードを指定します。指定できるのは、`\v`(very magic), `\m` (magic), `\M` (nomagic), `\V` (very nomagic), `''` (何もしない)です。

パターンに設定すると便利なのは、`@"` (直前にヤンクしたテキスト), `@*` (クリップボードの中身), `@/` (直前に検索した正規表現)とかでしょうか。`<C-r>`でも同じことできますが、タイプ数が減るところに価値があります。

オペレータ関数を定義しておくと、テキストオブジェクトをパターンに設定できるので便利です。例えばカーソル下の単語をパターンにしたいときは`siw`です。`()`の内側をパターンにしたいなら`si)`です。

返ってくる結果のイメージは下のようになります。

```
noremap <expr> ss substy#substitute('', '', '')
    "=> (NORMAL) :%s/_//g
    "=> (V-CHAR) :%s/{SELTEXT}/_/g
    "=> (V-LINE) :'<,'>s/_//g
noremap <expr> ss substy#substitute('\m', '', '')
    "=> (NORMAL) :%s/_//g
    "=> (V-CHAR) :%s/{ESCAPE(SELTEXT)}/_/g
    "=> (V-LINE) :'<,'>s/_//g
noremap <expr> ss substy#substitute('\v', '', '')
    "=> (NORMAL) :%s/\v_//g
    "=> (V-CHAR) :%s/\v{ESCAPE(SELTEXT)}/_/g
    "=> (V-LINE) :'<,'>s/\v_//g
noremap <expr> s/ substy#substitute('', @/, '')
    "=> (NORMAL) :%s/{@/}/_/g
    "=> (V-CHAR) :%s/{@/}/_/g
    "=> (V-LINE) :'<,'>s/{@/}/_/g
noremap <expr> s"" substy#substitute('\m', @", '')
    "=> (NORMAL) :%s/{ESCAPE(@")}/_/g
    "=> (V-CHAR) :%s/{ESCAPE(@")}/_/g
    "=> (V-LINE) :'<,'>s/{ESCAPE(@")}/_/g
noremap <expr> s"" substy#substitute('\v', @", '')
    "=> (NORMAL) :%s/\v{ESCAPE(@")}/_/g
    "=> (V-CHAR) :%s/\v{ESCAPE(@")}/_/g
    "=> (V-LINE) :'<,'>s/\v{ESCAPE(@")}/_/g
```

### 検索結果を抽出

`substy#yank()`は、検索したあとに、マッチしたテキストだけを抜き出す（抽出する）関数です。検索結果を行として抽出してレジスタ(デフォルトで `"` レジスタ)にヤンクします。VSCodeのマルチカーソル機能見ていて、Vimでも同じことやりたいなと思って作りました。

言葉だけで説明が難しいですが、とりあえず、何か検索したあとで `syp`と打ってみれば、どんな機能かだいたい分かると思います。他のレジスタを使いたい場合は、`"zsy`のようにレジスタを前置してください。行を制限したい場合は、行選択モードで`sy`します。

サブマッチを抽出したい場合は、`{count}`機能を使います。応用が広がりますね。

- 辞書のキーと値を抽出したい場合、`/\v(\w+)\s*:\s*(\w+)`を検索後、キーは`1sy`、値は`2sy`
- HTMLのh1,h2...タグの中身を取り出したい場合、`/<h\d.\{-}>\(.\{-}\)<\/h\d>`を検索後、`1sy`

### インストール

お好きなプラグインマネージャを使ってください。
https://github.com/tkhren/vim-substy

```
call dein#add('tkhren/vim-substy')
```

あまりいないと思いますが`set nomagic`, `set gdefault`を設定していると期待通りに動きません。
残りのヘルプはドキュメント(`:h substy`)を参照してください。
Linux rootでもファイルを削除できなくする方法

今回はLinuxのファイルのパーミッションについての説明です。

えー、もうそんなこと知ってるよ～。という方、意外に知られてないことですのでご一読ください。
<br>

> **1. パーミッションを外してもrootはファイル操作できる。**

ご存知のようにrootはパーミッションを無視してファイル操作が可能です。この例ではパーミッションのない"testfile.txt"に書き込みがされています。

```
[root@srv1 test]# ls -l
total 0
-rw-r--r--. 1 root root 0 Nov 22 19:09 testfile.txt
[root@srv1 test]# chmod 000 testfile.txt
[root@srv1 test]# ls -l
total 0
----------. 1 root root 0 Nov 22 19:09 testfile.txt
[root@srv1 test]# echo "HELLO" > testfile.txt
[root@srv1 test]# ls -l
total 4
----------. 1 root root 6 Nov 22 19:11 testfile.txt
```
　　

---

> **2. 通常ユーザーでもパーミッションなくともファイルは削除可能。**

　　
ご存知のように通常ユーザーでもパーミッションがなくともファイルの削除は可能です。この例ではパーミッションのない"myfile.txt"が通常ユーザmikeにサクッと消されます。

```
[mike@srv1 test]$ ls -la
total 8
drwxrwxrwx.  2 root root 4096 Nov 22 19:18 .
dr-xr-xr-x. 28 root root 4096 Nov 22 19:03 ..
----------.  1 mike mike    0 Nov 22 19:18 myfile.txt
[mike@srv1 test]$ rm -f myfile.txt
[mike@srv1 test]$ ls -l
total 0
[mike@srv1 test]$
```
　
このため、ファイルを削除させる/させないには以下のコマンドを使います。(必要に応じでsudoを付けてください。)


**ファイル "myfile.txt"を削除不可にする場合。**

```
[mike@srv1 test]$ chattr +i /test/myfile.txt
```
  
<br>
**ファイル "myfile.txt"を削除可にする場合。**

```
[mike@srv1 test]$ chattr -i /test/myfile.txt
```

<br>
いかがでしたでしょうか～。(^_^)
A-FRAME: 物理演算でボーリングっぽい動きを実現してみる３（ボールの重さ）

A-Frameをつかって物理演算ができるようにしてみます。
今回はボールの重さを検証します。

例１）mass=5
デフォルト値です。
![mass5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/8942c7fb-b87e-cb86-1847-dcc0646b530d.gif)[demo](https://k38.github.io/aframe/physics-system/ball_mass_5.html?a=1)
もともとこの重さに合わせて力を加えているので、こんなもんでしょう。

例２）mass=1
軽くしてみましょう。
![mass1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/9323b4f5-e8d8-a852-7b31-88432596529a.gif)[demo](https://k38.github.io/aframe/physics-system/ball_mass_1.html)
ボールが軽くなって、速度が上がりました。

例３）mass=100
重くしてみましょう。
![mass100.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/1d6684bd-3e0c-ec1e-7061-f450d6447a45.gif)[demo](https://k38.github.io/aframe/physics-system/ball_mass_100.html)
ボトンッ、コロコロコロ

## まとめ
ひとまず重さはデフォルトのままで良さそうですが、ピンの重さとの比になってくるので後々調整が必要になるかもしれないです。そうなるとはじめに加える速度も変更になってきます。
今回はボールとピンだけなので、ピンの重さをボールの比に合わせればいいのでしょうが、もっと多くのオブジェクトを扱う場合は、はじめに現実の重さを元にしたmassをボールとピンに設定しておくと良いのかもしれません。
onGlobalFocusChangedにnullを食わされる

AndroidTVとか、キー操作でフォーカスを移動するアプリを作る際に使いがちな
ViewTreeObserver.OnGlobalFocusChangeListener

唯一のPublic methidはdeveloper.android.comのreferenceによると以下のように定義されています
abstract fun onGlobalFocusChanged(oldFocus: View!, newFocus: View!): Unit

~~だけど~~実際に使ってみるとoldFocusにnullが入ってきたりします
https://developer.android.com/reference/kotlin/android/view/ViewTreeObserver.OnGlobalFocusChangeListener.html
には以下のような記載が
When the view tree transitions from touch mode to non-touch mode, oldFocus is null.

kotlinではAndroid StudioがView!で補完し、うっかりしていると補完されるままにNotNullとして実装してしまいCrashへといざなわれます
~~英語に堪能な仲間の助力を得てドキュメントのバグを報告したいと思います~~

追記
実際のところ、
When focus changes in non-touch mode (without transition from or to touch mode) either oldFocus or newFocus can be null.
について簡単にエミュレータで確認したところ
Activtyの初期フォーカスが入るところではoldFocusがnullになる、という比較的わかりやすい挙動の他
API17では常にnullが渡されるように見えます
[BluePrism]他のアプリが新規で立ち上げたExcelワークブックを、名前を付けて新規で保存する方法です。

#これを書いた理由

既存の業務アプリで、「〇〇データ生成」とかのボタンを押すと、新規のワークブックが立ち上がるので
それを名前を付けて新規保存して（もしくはコピペして）、そのファイルをまた別の業務アプリに……
みたいな作業ってありますよね。
たとえばAccessで作られた業務アプリだと

```VBA
set excelApp = CreateObject("Excel.Application") 
set excelBook = excelApp.Workbooks.Add() 
```

とかやって新規で立ち上げてデータをシートに流し込んで……みたいな感じでアプリが出してくれるやつです。

これを自動化するにあたり、
表示されているExcelワークブックを保存するには
MS Excel VBO の「Save Current Workbook as」を使えばよくて
そのためには、そのExcelワークブックにAttachしないといけなくて
いま新規で立ち上がったワークブックで、まだ保存されてないからファイル名とか無くて……
(だいたい「Book1 - Excel」みたいな名前で立ち上がるけど、状況によってはそうと決まったわけでもない)
ファイル名がなくて自分で起動したわけでもないExcelはどうやってAttachしたらいいの……

というところで詰まって困っていました。

#作成したオブジェクト
保存先のフォルダのパスとファイル名は入力引数で渡します。
![main1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/30081607-e463-0fa0-b14c-e854e2b236af.png)

形のちがうAttachが縦に2個並んでいるところは、
上のほうは別ページにして操作ステージでAttachしているのですけど、
そのAttachの中身がこれ
![main2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/e175a976-a07c-19d3-5216-ff891e5ceccf.png)
![main3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/37d98d06-53ce-7773-4728-3b672e40431c.png)
アプリケーションモデラーで、win32でExcelのウィンドウをspyして取得しておきます。
これを使って、AttachしたあとにExcelのウィンドウをActivateします。

2個目のAttachは、MS Excel VBOのAttachです。
なんでこの2個目のAttachをするかというと、これをすると出力でhandleが取得できるからです。
（最初は、いきなりこれでAttachしようとしましたが、それではできなかったので、前に操作ステージでAttachする処理を足したのです）

この取得したhandleを使って、MS Excel VBOの

 - Save Current Workbook as
 - Close Current Workbook
 - Close Instance

とやっていきます。



#終わりです

ほんとはOLEDBとかのVBOで
テーブルなりクエリなりのデータを持ってくるほうがシステムとしては正しいのでしょうけど……(´・ω・｀)


私（元コボラー）が作ると、いつもこんな感じでやたら長くてまだるっこしいフローになっちゃうので、
もっと要領の良いかっこいい書き方を教えてください。

あと、BluePrismの中の人に聞いたら、Accessとの連携はサポート対象外なんだそうです……。
ubuntuにsambaを使用してファイルサーバにする。

ほぼ自分用メモ。

# はじめに
ubuntuでファイルサーバー環境の作り方を調べたので、備忘録。

# sambaのインストール

apt-getでインストールするだけ。

``` bash
$ sudo apt-get install -y samba
```


# 共有ディレクトリを作成
任意の箇所にディレクトリを作成する。
作製したディレクトリの読み書き権限をchmodを使って設定する。

```bash
$ sudo mkdir /mnt/share
$ sudo chmod 777 /mnt/share
```


# sambaの設定
sambaの設定ファイル`/etc/samba/smb.conf`を弄る。

```bash:/etc/samba/smb.conf
[global]
# [global]内に以下を追記
   dos charset = CP932
   unix charset = UTF-8
   display charset = UTF-8
   security = user
   map to guest = Bad User
   account = nobody

# [global]内、Windows側に合わせて変更の必要があれば変更する。
   workgroup = WORKGROUP

# == 省略 ==

# 最終行に以下を追記
[share]
   path = /mnt/share # [共有ディレクトリを作成]で作成した共有ディレクトリ
   writable = yes # 書き込みOK
   guest ok = yes # ゲストユーザーOK
   guest only = yes # 全てゲストとして扱う
   create mode = 0777 # フルアクセスでファイル作成
   directory mode = 0777 # フルアクセスでフォルダ作成
```
# 設定後の再起動
以下のコマンドを叩き再起動。また、自動起動設定を行う。

```bash
# 再起動
$ sudo systemctl restart smbd 

# 自動起動設定
$ sudo systemctl enable smbd
```

# アクセス方法
`smb://"ipアドレス"`でアクセスできる。


# 参考にさせて頂いた方々
[Sambaを使いUbuntuとWindowsとの間でファイル共有する](https://qiita.com/k-Mata/items/8bee9e02e74565b6c147)
[Ubuntuでファイルサーバーをたてる（Samba）](https://qiita.com/msrks/items/1385cf13258dd1a0da08)
[ubuntu上でsambaを構築してmacosでアクセスできるようにする](https://qiita.com/yshr1982/items/5fe3af32f07e81bb1ddc)
みんなもっと【スタートアップ】に挑戦して夢つかもうぜ🎉

[@gaku3601](https://twitter.com/pro_gaku)です。
[PERSOL PROCESS & TECHNOLOGY Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ppt)の記事になります。
会社で「なんでも書いていいですか？」って聞いたら「なんでも書いていい」って言われたので、僕がプライベートで取り組んでいる「スタートアップ」についてエンジニア視点から書いていこうと思います。

# とりあえず実績
[ビジコンOSAKA 2018](https://www.sansokan.jp/bizcon-osaka/contestant.html) -final出場
[YY Contest 2019](https://yycontest.org/) - japan final出場
Yes!毎年final止まり！晩年プレシード！
もうちょっとなんだけども、いつもfinalで負ける。
ってことで、僕の実績踏まえ、ピッチで「final」まで行く方法を書く。それ以降はしらん！

# スタートアップやったら何がいいの？

```
・経営者になれる！
・世界を作れる！
・お金持ちになれる！
・女にもてる！
・自由に生きれる!
...etc
```
Yes!最高の世界が待ってるはずなんだ!
みんな夢実現していこうぜ！

# エンジニア(CTO)として必要な能力

```
フルスタックエンジニア
```
Yes!これは絶対に必要な。まずフルスタックで組めないっていうならheroku+rails構成でSSRでいいんで一人で全部作れる能力は持とう。話はそれからだ。
最近だとvue+firebase構成もおすすめ。さくっと作れる。(ただ、中規模スケールは難しいので、DBはRDBの構成にした方が良い。なので、vue+firebaseAuth+rails+postgresみたいなので組めるようになればベストかなと思ってる。
とりあえず、経営していく！って感じではなく、あくまでfinalまで行くのに必要な能力な。

# 仲間を探そう！
フルスタックエンジニアになったか？
なら、スタートアップをはじめるための仲間探しをやっていこう！
とりあよく見る、破綻しやすいメンバー構成を紹介するぜ！

```
・エンジニア(CTO)
・エンジニア(CTO)
・エンジニア(CTO)
```
学生でプログラム書けてスタートアップを目指す！とか会社内で起業しようぜ！と意気込んで取ってしまうメンバー構成。
よくあるや〜つ。速度感ありそうだけど、スタートアップってわけじゃなくて、ただのもの作り集団になってしまう危険性がある。
（あと、みんな強い意見を言える存在だからアーキテクチャの相違とかですぐ破綻してしまう危険性もあるぜ！あと、スタートアップにおけるプロダクトの作成はあくまで一つの手段ってだけで、他のこともいろいろやらないといけないんだけど、この構成だとそういったことが何もできなくなるから注意な！

理想はこうだ

```
CEO
CMO(COOになったりもする)
CTO
```
Yes!きれいな構成だな！エンジニアはCTOただ一人!俺自身！可能であれば、CEOとCMOはできるだけ強いやつを入れた方がいいのは言わずもがな！だからな!
メンバーのバランスや肩書っていうのもピッチとか出資を得るタイミングで見られるポイントになるので、できるだけ強いやつ(かつ友達とか同じ会社の人ではない)ってのがベストっていうのはそういった理由もあるぜ。

OK。このメンバー構成で話していくぜ！

## 各メンバーの役割
とりあえず、俺の思う各メンバーの抽象的な役割はこうだ

```
CEO: 夢を妄想して実現性を説く
COO: CEOの補佐
CMO: 実現したものを届ける
CTO: 夢を実現する
```
具体的な行動に落とすとこんな感じだ

```
CEO: 方針決定、ピッチ等コンテストへの登壇(資料作成)
CMO: プロダクトができているなら顧客への売り込み、投資家探し
CTO: プロダクト作り全般
```
この中でCMOだけプロダクトができていない段階だと動けない存在なので、COOという役割になってもいいと思うぜ。
デザインできるならCTOの補佐になってもいい。
なので、【CMO・COO】はできるだけなんでもできる器用なやつがいいと思うぜ！
ちな、うちのCMOはリーガルとか投資家とかと接点があるコンサルタントな強強なやつだ。

## やること
### まずはアイデア
まず、スタートアップするためのアイデアがないと始まらないのでそれを考えよう。
カフェ行って打ち合わせしてもいいし、オンラインで毎週話してもいい。
ちなみに、オンラインでやるなら「[whereby.com](https://whereby.com/)」がなかなかいいぞ！
URLを共有するだけですぐミーティングができるすげぇえいいサービスだ。

### アイデア決まったら指針を書こう
アイデア決まったか？なら、ぶれないように指針だけ書いておこう。
最低限以下の2つのアイテムがあるだけでいいぞ。

```
・エレベーターピッチ
・リーンキャンバス
```
この2つは作っておこうな。ここでは詳しく書かないので、ググればいいと思うぜ。
リーンキャンバス書いてみて、なんかふわっとしてたり、微妙だなと思ったら微妙なアイデアだから、徹底的に議論してアイデアを磨いていこうな。

### OKあとは行動するだけだ！
ここまで来たら、あとは自動的に事が進んでいくからCTOの俺らはひたすらアイデアをプロダクトに落とし込んでいこう！
ちなみに、この段階だとCEOとCMOはあまり動くことがない。あるとするならピッチの大会に出るための資料作りとか登壇するぐらいだ。
CTOのプロダクトを作る時間に比べたら微々たるもので腹立たしいかもしれんが、そこは我慢だ！
そういう心境になったらアドラー心理学を勉強しよう！
「幸せとは何か。他者を満足させることが幸せである」ということに気づいて、無の境地に入れるぜ！

### ピッチにたってプロダクトを紹介していこう
そこはCEOとCMOにまかせよう！うまくいけばfinalで受賞して投資家から大量の出資を得るチャンスがあるぜ！
そうなれば会社経営のフェーズになるので、しっかり経営していこうな。
この記事みて、俺より先にそのフェーズにいけたら俺を雇ってくれ！頑張って働くぜ！約束だぞ！

# おわり
エンジニアだったらみんなもっとスタートアップに挑戦すればいいのに！と思って書きなぐった。後悔していない。
ただ、やり方わからない人もいるかと思って、そういった人に少しでもタメになる記事であればいいなと思います。
一人で実装するのもしがらみがなくて楽しいですが、みんなで夢実現に向かって走るのはもっと楽しいから、失敗しても何度でも挑戦できるし、やってみれば世界変わると思うYo!