OmniAICreator/Qiita-1.07M huggingface dataset:
Excelのカラムを Ctrl + C した後、%Clipboard% を正規表現で/r /nを削除し「データ」をIf文で使えるようにする


msgbox,Excelプログラム　By SKojima@kuhen.org Ver.2020-12-01
msgbox,【F1】を押す「カラム」にデータがあれば表示


F1::

Gosub, Test1
Exit


Test1:

Clipboard=

send,{Down}

sleep,100

send,^c

ClipWait

Svar=%Clipboard%

sleep,100

;-------------------------------------------------------------------
; データの最後にある \r \n を正規表現で削除して空白かどうか判断する
;-------------------------------------------------------------------
Svar := RegExReplace(Svar,"\`r\`n", "")

    If (Svar = "" )
    {
      send,{ESC}
      sleep,100
    }
    else
    {
      MsgBox, データは %Svar% です
      
      send,{ESC}
      sleep,100
    }
    
 Return
PythonでMCプロトコルを使用してPLCのデータを取り出す

三菱電機株式会社製のPLCからデータを読み出す, 書き込む際には,
MCプロトコルという通信プロトコルを通信フォーマットでデータのやり取りを行う必要があります.  

すでにQiitaにはMCプロトコルの説明や実装を紹介する記事を先駆者様たちが投稿されていましたが,
この度PythonのMCプロトコルライブラリpymcprotocolを作成いたしましたので紹介いたします.


PyPI: https://pypi.org/project/pymcprotocol/
APIリファレンス: https://pymcprotocol.netlify.app/pymcprotocol.html
github: https://github.com/yohei250r/pymcprotocol

### 対応PLC
Qシリーズ, Lシリーズ, QnA, iQ-R, iQ-Lシリーズに対応.
__iQ-RシリーズのみQシリーズと異なるので, 明確に指定する必要があります。__
動作確認はQシリーズでのみ行っています。
(Aシリーズは3Eフレームには対応していないため, 現状は不可です.)


### 対応通信フォーマット
MCプロトコル3Eタイプ(バイナリ形式, ASCII形式)を実装しています.
4Eタイプは実装していますが未テストです。

### 対応コマンド
- 一括読み込み(ワード単位, ビット単位)
- 一括書き込み(ワード単位, ビット単位)
- ランダム読み込み
- ランダム書き込み(ワード単位, ビット単位)　　
- リモートRUN, リモートSTOP, リモートRESET, リモートPAUSE

に対応しています. 
その他のコマンドですが, 実装が簡単で使用されそうなコマンドを優先して実装する予定です. 
要望がありましたら教えて下さい。

### インストール
```console
pip install pymcprotocol
```

### PLCの設定
PLCのネットワーク設定でIPアドレス設定, MCプロトコル用のポート開放と, イーサネット通信形式の選択をしてください.  

### PythonからPLCへ接続
```python

import pymcprotocol

#Qシリーズがデフォルトです
pymc3e = pymcprotocol.Type3E()
#Lシリーズの場合はインスタンス化にplctypeを与えてください
pymc3e = pymcprotocol.Type3E(plctype="L")
#iQ-Rシリーズの場合はインスタンス化にplctypeを与えてください
pymc3e = pymcprotocol.Type3E(plctype="iQ-R")

#イーサネットの接続形式をASCIIにした場合はここで"ascii"を与えてください
#もしMCプロトコルのアクセス経路をデフォルトから変更する場合もこのメソッドから可能です.
pymc3e.setaccessopt(commtype="ascii")
#PLCに設定したIPアドレス, MCプロトコル用ポートに接続
pymc3e.connect("192.168.1.2", 1025)
```

### コマンド発行
```python
#D100からD110まで読み込み
wordunits_values = pymc3e.batchread_wordunits(headdevice="D100", readsize=10)

#X10からX20まで読み込み(ビットデバイスアクセス)
bitunits_values = pymc3e.batchread_bitunits(headdevice="X10", readsize=10)

#D10からD15まで与えた数値を書き込み
pymc3e.batchread_wordunits(headdevice="D10", values=[0, 10, 20, 30, 40])

#Y10からY15まで与えた数値を書き込み(ビットデバイスアクセス)
pymc3e.batchwrite_bitunits(headdevice="Y10", values=[0, 1, 0, 1, 0])

#"D1000", "D2000"をワード単位で読み込み
#"D3000"をダブルワードで読み込み. (D3001が上位16ビットD3000が下位16ビット)
word_values, dword_values = pymc3e.randomread(word_devices=["D1000", "D2000"], dword_devices=["D3000"])

#"D1000"に1000 "D2000"に2000を書き込み
#"D3000"に655362を書き込み. (D3001が上位16ビットD3000が下位16ビット)
pymc3e.randomwrite(word_devices=["D1000", "D1002"], word_values=[1000, 2000], 
                   dword_devices=["D1004"], dword_values=[655362])

#X0とX10にそれぞれ1と0を書き込み
pymc3e.randomwrite_bitunits(bit_devices=["X0", "X10"], values=[1, 0])

```

### リモート動作
```python
#リモートラン, 
#clear_mode=0: デバイスクリアをしません.
#clear_mode=1: ラッチデバイス以外をクリアして起動します. 
#clear_mode=2: デバイスをクリアして起動します. 
pymc3e.remote_run(clear_mode=2, force_exec=True)

#remote stop
pymc3e.remote_stop()

#リモートラッチクリア(PLCが停止していないとエラーになります)
pymc3e.remote_latchclear()

#リモート一時停止
pymc3e.remote_pause(force_exec=False)

#リモートリセット
pymc3e.remote_reset()
```

### まとめ
poetryでライブラリを作成すると本当に楽なのでおすすめです。
Railsしか使ったことない駆け出しエンジニアが、Goの環境構築してみた！

## なぜGoを入れるの？
2020/12/1 現在、本気でいきたい企業がGoを開発環境としているから！面接受けるからには、少しでも勉強しとかなきゃと息込んでやってみました！

なお、私の環境は
macOS Catalina ver.10.15.7です。

## 公式HPにGo！
git cloneとかで入れる方法もあるそうですが、せっかくだからGoの公式HPを参考にすることを決意！
### 1. [https://golang.org/doc/install](https://golang.org/doc/install)にGo！
### 2. Download Go for Macをクリックしてダウンロード
![627ee2cbc04080088f50a8c01127552d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696002/15a4cc89-7aa7-ddcb-fa7f-3a322b94de0e.png)
あら、かわいい…

### 3. インストールされているか確認
"The package should put the /usr/local/go/bin directory in your PATH environment variable."とのことので、コンソールにて

```go:コンソールにて
//ディレクトリ移動
% cd /usr/local/go/bin
//バージョンチェック
bin % go version
go version go1.15.5 darwin/amd64
```
とインストールできていたようです！よかった…

## 試しに簡単なコードを書いてみた
上の続きの[https://golang.org/doc/tutorial/getting-started](https://golang.org/doc/tutorial/getting-started)にも書いてあるように、試しにGoが書けるか、実際にGoファイルを作って試してみました。
### 1. 適当な場所に"hello.go"を作成
### 2. チュートリアル通りのコードを記述

```go:hello.go
//package→関数をグループしたもの的な？
package main

//「標準パッケージ」という、Goにあらかじめ用意された100種類以上の便利な機能。"fmt"はコンソール出力用のパッケージ
import "fmt"

//ここはJavaScriptと変わらない感じ。Printlnはconsole.logみたいなメソッド？？
func main() {
    fmt.Println("Hello, World!")
}
```
●Declare a main package (a package is a way to group functions).
●Import the popular fmt package, which contains functions for formatting text, including printing to the console. This package is one of the standard library packages you got when you installed Go.
●Implement a main function to print a message to the console. A main function executes by default when you run code in the file.
↓↓
この英文を読んだ感じ、これぐらいの理解しかできません（泣）
パッケージって、クラスみたいなもの？？
でも響きがかっこいい笑笑
### 3. 実際にコードがコンソール上で動くか確かめよう

```go:hello.goのコンソール上で
//rubyの時もこんな感じだったなあ…
$ go run hello.go

//実行結果
Hello, World!
```
ひとまず、コンソール上で動くのを確認しました！


次は、できたらGoの簡単なアプリ作っていければと思います！
flutter_blocを使ってみる その1

# はじめに
本日思いつきでひとりアドベントカレンダーを作ってしまいました。私は初学者なのと1日に使える時間が2時間程度なので、少しずつ進めていきます。


# flutter_blocを使ってみる
Flutterの状態管理としてBLoCパターンというものがあります。その中で一般的なライブラリである[flutter_bloc](https://pub.dev/packages/flutter_bloc)を使ってみます。

注: 現在は状態管理手法としてはBLoCパターンは主流ではないようです。これから始める場合は[provider](https://pub.dev/packages/provider)または[riverpod](https://pub.dev/packages/riverpod)を用いた方が良いと思います。

注2: BLoCの説明は[こちら](https://qiita.com/tetsukick/items/32d6cab8e176ecea2694)を参照してください。かんたんに言うとStreamを用いた状態管理手法です。

## 一歩目: 公式Exampleを動かしてみる
[公式のExapmle](https://pub.dev/packages/flutter_bloc/example)を動かしてみます。

<img width="300" alt="Simulator Screen Shot" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779879/424c08b6-bc82-07ca-2743-7abd594b94d3.png">

### Exampleの動作
Exampleはボタンを押すことで以下の動作をします
- A. 中央の数字が変化する
- B. カラーテーマが変わる
- （エラーを出す）

ExampleではこのA. をBLoC、B. をより簡易的なCubitを用いて実装しています。

### BLoCの動作
flutter_blocパッケージでのBLoCがする動作は、Eventを受け取ってStateを返すというものです。
通常はユーザーのボタンを押す等の操作をトリガーにしてUIからEventを受け取り、そのEventに応じたStateをUIに返します。
UIは受け取ったStateをもとにウィジェットを再構成します。
Exampleでは「+」「-」のボタンが押されることでそれぞれ数値を増加させるイベントと減少させるイベントをBLoCが受け取ります。
受け取ったイベントによってBLoCは初期値0のint型のStateを増減させてUIに返します。

### Cubitの動作
CubitはBLoCの簡易版で、UIからイベントを受け取らず、メソッド呼び出しを受け取ります。
Exampleではボタンを押されることでCubitのメソッドが呼ばれて、明暗のColorThemeが反転します。

### BLoC、Cubitの動作の概念図
いずれもウィジェットツリーの中のボタン等のUIからイベントまたはメソッド呼び出しを受け取り、BLoCまたはCubitが状態を変化させることでUIが再描画されるという図式になります。

![1_giaQZugU17XFsOU-7VhLdw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779879/7a70aa2e-452e-b7a8-90fc-900391ab2aff.png)


# まとめ
flutter_blocパッケージのExampleを使ってBLoCとCubitの動きの概要を説明しました。
明日はExampleのコードを使って学習をしてみます。
Railsのパフォーマンス向上

# はじめに
Railsのパフォーマンスの向上に関して、少しまとめます。

いろいろ、誤解や間違いがあるかもしれないので、問題ありましたら指摘していただけると助かります。

# N+1(includes)
N+１は100件のデータを取得する場合に、101回SQLが走る様な場合の問題のことです

例えば、

userモデルとuser_profileモデルが一対一の場合に

```ruby
@users = User.all

@users.each do |user|
  user.user_profile.comment
end
```

の様にすると

user_profile.commentの取得時に毎回SQLが走ってN+1が走ります。

このN+1の回避方法としては下記の様に`includes`を使うことで回避できます。

```ruby
@users = User.includes(:user_profile).all

@users.each do |user|
  user.user_profile.comment
end
```

# N+1(select)

includesで基本的なN+1は回避することができるのですが、下記の様な場合N+1は回避することができません。

userモデルとarticleモデルが一対多の場合

```ruby
@users = User.includes(:article).all

@users.each do |user|
  user.articles.count
end
```

みたいにするとincludesをしていても↓の様にsqlがN+1回分走ります。

```ruby
   (0.2ms)  SELECT COUNT(*) FROM "articles" WHERE "articles"."user_id" = ?  [["user_id", 1]]
   (0.1ms)  SELECT COUNT(*) FROM "articles" WHERE "articles"."user_id" = ?  [["user_id", 2]]
   (0.1ms)  SELECT COUNT(*) FROM "articles" WHERE "articles"."user_id" = ?  [["user_id", 3]]
   (0.1ms)  SELECT COUNT(*) FROM "articles" WHERE "articles"."user_id" = ?  [["user_id", 4]]
   (0.1ms)  SELECT COUNT(*) FROM "articles" WHERE "articles"."user_id" = ?  [["user_id", 5]]
   (0.1ms)  SELECT COUNT(*) FROM "articles" WHERE "articles"."user_id" = ?  [["user_id", 6]]
```


その場合は、自分はselectメソッドの中にサブクエリを記載します

```ruby
@users = User.all.select('(SELECT COUNT(*) FROM articles WHERE articles.user_id = users.id) article_count')

@users.each do |user|
  user.article_count
end
```

この様にすることで、単純にincludesするだけては解決できない、N+1も解決できます。

# exists

存在するかどうかのみを確認したい場合はpresent?よりexists?を使う方がパフォーマンスが良いです

発行されるSQLは下記の様に異なります。

```ruby
User.all.exists?
=> User Exists? (0.2ms)  SELECT 1 AS one FROM "users" LIMIT ?
```

```ruby
User.all.present?
=> User Load (0.4ms)  SELECT "users".* FROM "users"
```


present?の場合は、実際にusersのデータを全て取ってきてしまうのに対して、exists?は存在したら1を返すだけて、余計なデータを取ってくることはないので、早いです。

# pluck

自分の場合データのidのみを取ってきたい場合にpluckを使う
pluckを使わず、 map(&:id)みたいにするのと比べると、pluckはSQLで必要なカラムのみ取ってくるのと、ActiveRecordのオブジェクトを作ることもしないので早い

実際に発行されるSQL↓

```ruby
User.all.pluck(:id)
=> (0.3ms)  SELECT "users"."id" FROM "users"
```

```ruby
User.all.map(&:id)
=> User Load (0.6ms)  SELECT "users".* FROM "users"
```

# eachとfind_each

eachの場合は前件取ってきて、データをメモリに置くのに対して、
find_eachの場合は1000件ずつ持ってくる

件数が多い場合データをeachでループする場合はfind_eachを使う方が良いっぽい



# 終わりに

とりあえず、思いつくものを記載しました。
また、何か思いついたら追記していきます。

パフォーマンスに関してですが、基本的に

- selectやpluckを使ってSQLで取ってくるカラムを制限する
- N+1が起きない様にする

位で十分な気がしているんですが、どうなんでしょうか？
RPAについてわずかながら語れることを語る

いえらぶアドベントカレンダー1日目！頑張ります！


# 今年1年を振り返る
アドベントカレンダーなので、1年の振り返りとしてかければと思い、今年技術的な新しい部分でパッと思い浮かんだのが、「RPA」だったので、それについて記載。

開発する上であったRPAの技術とはちょっと離れたポイントをかければと、、、


※注意
マジで初心者が頑張って工夫しながら作っただけなので、温かい目で見てもらえると嬉しいのと、もっとこうしたほうが良いよという意見があれば、優しく優しく教えていただけると、喜びます。


# 引っかかった罠①　JSの文字コード

「あれ？RPAってjs使えるの？？なら困ったら全部jsで書いて、強引に動かせばいいや！」

→結果：エラー、、、


原因：jsファイルの文字コードが原因。
どうやらShift-JISしか受け付けてくれないようで、UTF-8で書いたら読み込むタイミングで怒られた。
しかもそういう系のエラーは特に表示してくれなかった、、、


# 引っかかった罠②　バージョン管理

「共通で使う関数作ったから、これ使ってね！」
「はぁーい！
　よし！ローカルでの挙動完璧！クライアントに配信してもらおう！！」

→結果：エラー、、、

原因：関数のバージョンが違った。

ローカルで開発しているときは、どんどんバージョンをあげたり、関数自体の中身を確認したいからと更新したりしてるうちに、その関数ファイルのバージョンがめっちゃ高くなってしまった。

その結果ローカルでは動くけど、いざクライアントの下で回そうとすると「そんな新しい関数はないです」って言われてエラー、、、
結局先輩の手を借りて、そこを直していただき無事配信した。


# ブレイクポイントを使えるようになったらいいよ！

「デバッグしてみよう」
→「あれ、、、エラーだ、、、このエラーの前に何が起こっていたんだ、、、？変数には何が入ってるんだ、、、？」

こんな時にはブレイクポイントを使いましょう。


デバッグとして回して、ブレイクポイントをいれておくと、その処理の直前で止まってくれる。
for文とかに入れておいて、その値がどうなってるの？というのを随時追いかけたり、格納されていると思った変数を見てみたらNULLだったりと色々発見することができます。

# 最後に

まだまだ勉強中！特に安定稼働のためにはどうすべきか。
自分の周りにはRPAについて詳しい人がいるので、その人のソースを盗んで、いつか自分が仕事をしなくても、全部ロボがやってくれるようにしたいなぁｗ
15分スプリントは無理だったのでデイリースプリントやってみた

# はじめに
デイリーでスプリントをやってみるとチーム内のフロー効率が上がったので、紹介します。

# 元ネタ
15分スプリントの元ネタはきょんさん（@kyon_mm）のフラクタルスプリントです。具体的なやり方は以下のページに貼ってある動画を参考にするといいと思います。
[15分スプリントの具体的な進め方について動画で話した #15min_sprint](https://kyon-mm.hatenablog.com/entry/2020/10/18/171650)

動画を見た方は分かると思うのですが、人間やめてるなと感じたので、自分たちはもう少しハードルを下げてデイリーでスプリント的なものをするようにしました。

# やり方
自分たちのチームでは現在、厳密にスクラムをやっていない状態ですが取り入れて効果があったので必ずしもフラクタルな構成にしなくてもいいと感じています。もちろん、スクラムの中に組み込んでもいいと思います。

大まかな流れは以下の通りです。

1. 業務開始すぐにデイリープランニングをする
2. 勤務中は毎時報告をする
3. 終業前にふりかえりをする

## デイリープランニング
デイリープランニングはJamboardを使います。たとえばですが、こんな感じでいつも作っています。ちなみに勤務は10時開始、19時終了で休憩が12時から13時の場合を想定しています。
![2020_11_24 - 12_4 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327865/e45901d5-c737-d001-f6f7-1bb65f38685c.png)

個々のタスクだけではなく、ミーティングやPRレビューなどもスケジュールに組み込むことで、PRレビューをボトルネックにしない効果などもあります。また、終業まできっちりタスクで埋めるのではなく1時間から2時間ほどバッファを持たせると、スケジュールで設定した課題をこなせる確率が上がるので慣れないうちはそうするほうがいいでしょう。

## 毎時報告
Slackなどのチームのチャンネルに対して、毎時で報告するようにしています。たとえばですが

```
12/3 11:00
進捗：1/3 OOの修正をする（20％）
困っていること：修正箇所が多いの
気付き：修正箇所が多いのでリファクタをこまめにするべき
```

のように書いてチャンネルに送信しています。

報告する内容は今のところ３つです。
### 進捗
進捗はデイリープランニングで決めた自分のスケジュールに対しての現在の状況と、現在作業中のタスクの内容、そのタスクの進捗状況の３つをまとめて報告します。例でいうと1/3の部分がデイリープランニングで決めた自分のスケジュールに対しての現在の状況で、（20%）の部分がそのタスクの進捗状況です。
### 困っていること
困っていることは、その言葉のとおり困っていることです。もし、ヘルプが必要であればメンションをつけるとわかりやすいと思います。
### 気付き
気付きは、なるべくチームに貢献できるような内容にしたほうがいいと思います。例えばですが、「OOの部分を教えてもらったが、ここが分かりにくかったので重点的に教えて欲しい」といったフィードバックや、「図を使って説明した方が分かりやすそうだった」といったチームパターンのようなものが好ましいです。

## ふりかえり
自分たちのチームは色々なふりかえりの手法を試していますが、毎時報告での困っていることや気付きをベースに思い出しながらやっていくといいでしょう。また、ふりかえりを残してそれをふりかえるためにもデイリープランニング同様、Jamboardを使用しています。

# 効果

以下のような効果があると感じています。

* イベントによる情報共有の強化でフロー効率が向上した
* チーム内の雰囲気の向上（話しかけやすい）
* １日の内容を忘れない（ふりかえりに役立つ）
* スケジュールを意識できる
* 記録を残すことができる

比較的、使う時間に対してのパフォーマンスが高いなという印象です。

# まとめ
デイリースプリントをやってみたよ、という紹介でした。ここで取り上げているものはあくまでプラクティスなので、取り入れればうまくいくものではないですが参考にはなるかなと思います。
最後にデメリットを挙げるとすると、人数が多いチームだとチャットが速く流れてしまうかもしれないので気をつけてくださいね
[python] yeo-johnson 変換をして歪度・尖度の減少量を見るメソッド

sklearn の [PowerTransformer](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.PowerTransformer.html) を使って yeo-johnson 変換を行うメソッドです。yeo-johnson 変換により分布が正規分布に近づきます。yeo-johnson変換を使用する際の参考にどうぞ。

- yeo-johnson 変換による歪度・尖度の絶対値の減少量を表示する様にしてあります。歪度・尖度はどちらも正規分布で0になるので、yeo-johnson 変換によりどのくらい正規分布に近づいたかの指標になります。

- yeo-johnson 変換を行う前に MinMaxScaler で正規化（最小値0、最大値1に変換）しています。これをしておかないと、``np.random.randn(30) / 100 + 10``という様に、分散が小さく平均が大きい標本で ``RuntimeWarning: divide by zero encountered in log`` という warning が出ます。（結果が全て同じ値になったりします。） 参考：https://github.com/scikit-learn/scikit-learn/issues/14959#issuecomment-602090088


```python
import pandas as pd

def yeojohnson(df):
    
    # 参照渡しされるので新規のものに変えておく
    df = df.copy()
    
    # 比較用に残しておく
    df_orig = df.copy()
    
    # yeo-johnson
    # 標準化は別にしても良い（standardize=Trueにしても良い）
    # mmなしだと、エラーが出たりするので先にやっておく
    # 参考：https://github.com/scikit-learn/scikit-learn/issues/14959#issuecomment-574253115
    # 参考：https://github.com/scikit-learn/scikit-learn/issues/14959#issuecomment-602090088
    from sklearn.preprocessing import MinMaxScaler, PowerTransformer
    mm = MinMaxScaler()
    pt = PowerTransformer(standardize=False)
    df[:] = mm.fit_transform(df[:])
    df[:] = pt.fit_transform(df[:])

    # 歪度・尖度を計算
    # 歪度：負：左長裾、0：正規分布、正：右長裾
    # 尖度：負：平、0：正規分布、正：凸
    # なので絶対値の差を見る
    df_diff = pd.concat([
        df_orig.skew(),
        df.skew(),
        df_orig.skew().abs() - df.skew().abs(),
        df_orig.kurtosis(),
        df.kurtosis(),
        df_orig.kurtosis().abs() - df.kurtosis().abs(),
    ], axis=1)
    df_diff.columns=[
        'skew (original)',
        'skew (yeo-johnson)',
        'skew abs decrease',
        'kurtosis (original)',
        'kurtosis (yeo-johnson)',
        'kurtosis abs decrease',
    ]

    display(df_diff)
        
    return df

# 使用例
from sklearn.datasets import load_iris
iris = load_iris(as_frame=True)['data']
yeojohnson(iris)
```

出力（歪度・尖度の減少量）：

![スクリーンショット 2020-12-01 午後9.43.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178570/c0a570fa-9609-37c3-a4a8-fb4b869ecd89.png)
プレゼンで大切な３つのポイント

un-T factory! Advent Calendar 4日目を担当します kitikitchen です。
フロントエンドエンジニアとして会社に所属しておりますが、ここ一年コーディングは全然やらずにプレゼンやLTばっかりやっていたのでQiitaに書けるネタがなくて焦ってます（汗）
Qiitaらしからぬ投稿で大変恐縮なんですが、その経験をふまえてプレゼンに関するコラム的な内容を投稿させてください。

- プレゼンが上手く出来ない
- プレゼンはできるけど相手の反応が薄い
- プレゼンのテーマ選定にいつも迷う
- そもそも俺の話を誰も聞いてくれない

と悩んでいる方の参考になれば幸いです。

## プレゼンとは？
プレゼンテーションの略で、簡単にいうと**相手に対しての提案**です。
語源は「プレゼント＝贈り物」らしいです。

## プレゼンで一番大事なことは
###伝わること。

伝わらないプレゼンは自己満足。
どんなにカッコいい資料を作っても、どんなに美しい言葉を並べても、**伝わらなければ意味がない**。

では、伝わるプレゼンをするためにはどうすればいいのか？

## プレゼンテクニックの数々
- ~~スライドを10枚にする~~
- ~~プレゼンは20分以内で終える~~
- ~~フォントのサイズは30ポイント以上にする~~
- ~~部屋にいるみんなとアイコンタクトをする~~
- ~~⽂字を減らす~~
- ~~読み上げはやめよう~~
- ~~謝るな！~~
- ~~聴衆の中に⾃分の⾝を置こう~~
- ~~結論を最初に述べる~~

といったプレゼンテクニックの話はしません。

成果を急ぐと小手先だけのテクニック習得に走りがちですが、基本の基、イロハのイ、守破離の守にあたる部分を疎かにしては本末転倒。

今回はテクニック以前の**"伝わる"**ことに着目した3つのポイントを紹介します。

## テクニック以前に大切な3つのポイント

### 1. テーマ選定は"言いたいこと"より"言うべきこと"
- 誰に向けたプレゼンなのか明確にする
- 独りよがりにならない
- 聞いてくれる相⼿がいることに感謝

当たり前のことですが、プレゼンには聞き手が存在します。
聞き手は社内の人なのか？お客さんなのか？デザイナーなのか？エンジニアなのか？
聞き手を明確にし、それに合わせたテーマ選定をする必要があります。

デザイナー勉強会という場で、JavaScriptのベストプラクティスみたいな話をしてもなかなか伝わらないと思います。
はじめにお伝えしたとおり「プレゼンは伝わらなければ意味がない」ので、テーマ選定では独りよがりに自分の言いたいことではなく、聞き手に対して言うべきことに絞り込むことで伝わる可能性がグッと上がります。

またなぜ"べきこと"なのかというと、当たり前の話ですが、聞いてくれる相手がいないと絶対に話は伝わりません。
自分の話を聞いてくれる相手がいる、場があることに感謝し、それに対してなにをお返しできるだろうか？という使命感から"べきこと"としています。

わざわざ言わなくても良いけど、言ってあげた方がその人のためになるだろうと思うことってありませんか？
一歩間違えれば「余計なお世話だ！」と諸刃の剣になりかねない行動は、相当な熱量を要するので、その人に対して関心がなければできませんよね。（そうでない人もいるかもしれませんが）

熱量って言葉以上に伝わるんです。

>[懇請の強度（こんせいのきょうど）](https://note.com/yusuke_hotta/n/neaf29aa5e9e0 "懇請の強度（こんせいのきょうど）")
>https://note.com/yusuke_hotta/n/neaf29aa5e9e0
>伝わるかどうか、それは【言葉そのもの＋懇請の強度】によって変わります。

間違っても「してあげてる」なんて驕りがあってはいけません。
それも伝わっちゃうので注意しましょう。


### 2. 説明は相手が知らないことを前提に
- 当たり前を当たり前だと思わない
- お年寄り相⼿に説明する気持ち
- 聞き⼿を⼀⼈も置き去りにしない
- ⾃分には関係ないとは思わせない

専門用語や難しい言葉は使わない以前に、自分が当たり前に使っている言葉や物事を相手の当たり前だと思わないこと。
年齢、性別、地域などによっても当たり前は変わってくるので注意してください。
もしそれが必要な場合は例え話などを用いて相手のわかりやすい言葉に置き換えてあげましょう。

例）「Nitendo Switch…簡単にいうとファミコンですね。」

また聞き手が複数人いる場合かつ途中から参加した人がいる場合などは、すでに知っている人前提に話を進めず、**おさらい**を挟んで聞き手を一人も置き去りにしないこと。
わからない用語や知らない話が出てくると人は「自分には関係のない話」と興味を失い伝わらなくなってしまう恐れがあります。


### 3. 最後は必ず次の行動へと促す
- 締め（まとめ）は感想だけで終わらない
- なぜこの話をしたのか？次にどうして欲しいのかを必ず伝える

何のためのプレゼンだったのか？
聞いてくれた人に対してどうして欲しいのかを必ず伝え、アクションを起こしてもらう。
そこまでできてはじめて伝わったといって良いでしょう。

恋愛で例えると「好きだ！」と告白するだけ終わってしまっては、相手が困ってしまいますよね？
必ず「付き合ってください！」と相手に次どうして欲しいのかを伝えましょう。
（付き合えるかどうかは別の問題として）

## まとめ
- テーマ選定は"言いたいこと"より"言うべきこと"
- 説明は相手が知らないことを前提に
- 最後は必ず次の行動へと促す

以上3つのポイントは、すべて相手ありきの話です。

結局のところ**"相手のことをどれだけ想えたか？考えられたか？"**
で伝わるかどうかが決まってきます。

**相手のことを想った提案（プレゼン）が一番伝わる**ということ。
思いやりが一番大事であり、プレゼンに大切なポイントなんじゃないかと思います。

もしプレゼンがうまくいかず悩んでいる方がいましたら、相手のことを想ってプレゼンできていたか今一度振り返って見てはいかがでしょうか。

## 最後に
プレゼンは苦手だという人も多いと思いますが、上記をふまえて一度プレゼンやLTに取り組んで見てほしいです。
人のために自分が何ができるか考えることや、自分の話を聞いてくれる人がいて、何かが良い方向に変わっていくことは楽しいですよ。

プレゼンは楽しい！

ありがとうございました。
GitHubって何？

# 投稿の目的
プログラミングの勉強を始めて3ヶ月程経ったので学んだことのメモをアウトプットとして記事に残します。
これからプログラミングの世界に入る人の手助けになれたら嬉しい限りです。
間違っていたり、言葉が違っていたり、表現が誤解されるような言葉があったら教えて下さい^^
言葉を長々と読みづらかったら申し訳ありません。少しずつなれてがんばります。



## 今回のテーマは「GitHub」についてです！
プログラミングをやる上でとても大切な役割をしてくれます！
（実務やってない私でもかなりの恩恵を受けています！）
今回は使い方ではなくこんなものだよ〜というのを説明するだけです。


### ズバリ！
GitHubとは何かというと
クラウド上で変更履歴含めてをプラグラムしたものを保存してくれる有能なやつ！SNSみたいなイメージです
Google Driveにあるドキュメントやスプレッドシートみたいなものです（使っている人は伝わると思う...）
（個人的見解です）

---
例えば
スマホで写真を撮ったあとに携帯に保存されますよね。
それをSNSに挙げます！そしてその写真はみんなが見れる！写真を加工したりも出来る。などなど
これのプログラミングバージョンだと私は思っています！


過去の変更履歴も残っているので自分がどのような過程でコードを記載したのか？とか見れます
これが公開されていれば他の人のも見れます！とても勉強になります。
変更履歴を保存出来るのでバックアップが残せるのです！
いつのアプリケーションを複数人で作成する際もGitHubが大活躍します！

自分のパソコンで変更したものをGitHubへ
そして他の作成する仲間達がGitHubの変更履歴から自分のパソコンへ上書き保存みたいなことが出来ます。
離れていても作業が複数人で進められるという優れものです！


使いこなせればかなり有用なツールです
コードを書くことと同時にGitHubの使い方を初心者のうちから慣れていたほうが良いと思いますよ


###GitHubを使う上で出てくる用語を一部紹介
|用語| 説明 |
|:-:|:-:|
|リポジトリ|ファイルやディレクトリを記録する場所（ここで変更履歴を保存しておける）|
|リモートリポジトリ| GitHubなどのサーバーで管理しているもので他者に共有出来る。オンライン上で保存するイメージかな|
|ローカルリポジトリ| 自分のPC上で管理しているもの。オフライン上で保存してあるイメージ。パソコンのDesktopとかにあるファイルとかと変わらない|
|コミット|ファイルやディレクトリを追加、変更、削除などした履歴を記録すること（コミットとセットでメッセージを残すことを心がける。後で振り返る時に何を行った記録なのか？というのが一目瞭然でわかるからです）|
|ワーキングディレクトリ|自分が作業するところ|
|インデックス|ワーキングディレクトリで行った作業をコミットする準備の場所みたいな位置です。これがあると作業した中身で一部を除いてコミットしたい場合（パスワードなど機密情報とか）に役に立ちます！これがないとパスワードがオンライン上でさらされることになってします可能性が出てくる|

###流れは

**リモートリポジトリ｛GitHub（オンライン上）｝**
↓↑
↓↑
リモートリポジトリのコピー｛自分のPCでリモートリポジトリの情報を確認する時に使うよ（オフライン上）｝
↓↑
**ローカルリポジトリ**
↓↑
［コミット］
↓↑
**インデックス**
↓↑
［作業した履歴を残す準備］
↓↑
**ワーキングディレクトリ**


---

文字だけで分かりづらいですがこの流れをプログラムをしながら要所要所で行います。


今回はここまでです！
Vuetifyのv-app-barコンポーネントのデカすぎたり謎の余白を解消する

# 起きた問題①
### ヘッダーでかすぎ
![スクリーンショット 2020-12-01 21.50.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518141/0f39fc31-eecf-4206-0d80-479195684bdf.png)

# 起きた問題②
### 謎の余白
![スクリーンショット 2020-12-01 21.49.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518141/440b12f1-1124-39d7-1c86-8c1efcd2ad6c.png)

# 起きた問題③
### 要素がかぶって見えなくなる
![スクリーンショット 2020-12-01 21.57.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518141/3e80b41a-eb8c-bb78-57f5-70bbbe03a817.png)


# 解決方法
全体に広がっている原因は、ナビゲーションバーの高さ調整が行われていないため。
<v-app-bar>タグにappと入力すると高さを自動変換してくれる。

要素がかぶって見えなくなる原因は<v-main>タグで囲っていないから。

```html
<template>
  <div>
    <v-app>
      <v-app-bar color="primary" app>
        <v-toolbar-title>Title</v-toolbar-title>
      </v-app-bar>
      <v-main>
        <slot />
      </v-main>
    </v-app>
  </div>
</template>
```

上記を実行すると
![スクリーンショット 2020-12-01 22.00.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518141/6b2a708a-b725-ab4c-4280-f9f48a98bab3.png)

あとは余白を整えるなりヘッダーをカスタムなりすればOK！
Herokuでデプロイしたときにapplication errorの対処法


初投稿です。
間違いがあるかもしれませんがそのときにはご指摘ください。

# 概要
Herokuでデプロイしたあとに本番環境でapplication errorが発生。
ログを見るように書いてあるのでログを確認してみると


```
heroku[router]: at=error code=H10 desc="App crashed" method=GET
```
と書いてある。調べてみるとどうやらアプリがクラッシュしてしまっているらしい。次に

```
herock run rails  c
```
を行うと最後のところに

```
/app/app/controllers/application_controller.rb:13: syntax error, unexpected
end-of-input, expecting end (SyntaxError)
```
とある。どうやらapplication_controllerでendの数が違っていた様子。
修正してアップしたら問題なくいけました。
サーバーへの接続の仕方

## やりたい事
サーバーにアクセスする

## 【方法1】 sshコマンド
下記コマンドをターミナルで実行する

```
ssh -i 鍵ファイル  -l 接続ユーザー　-p ポート番号 IPアドレス
```
または

```
ssh -i 鍵ファイル -p ポート番号 接続ユーザー＠IPアドレス
```

## 【方法2】 ~/.ssh/condigファイルとsshコマンド
`~/.ssh/config`ファイルを修正後、下記コマンドをターミナルで実行する

```~/.ssh/config
Host dev-server　　　　　　←適当な名前をつける
  HostName IPアドレス
  Port ポート番号
  User 接続ユーザー
  IdentityFile 鍵ファイル
```

```
ssh dev-server
```
PDFBox 2.0.21は複数行テキストフィールドの自動フォントサイズに対応

PDFBoxでPDFフォームに値を出力するときに、複数行テキストフィールドのフォントサイズを「自動」に設定しても期待通り動作するようになりました。すごくニッチなニーズだと思いますが、実際にこの制限で困っている身としては喜びしかないです。

* [PDFBox 2.0.21 Release Notes](https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310760&version=12348324)

> Sub-task
> * [[PDFBOX-3910](https://issues.apache.org/jira/browse/PDFBOX-3910)] - Support auto font sizing in multiline text fields

### Before

以前は、フォントサイズが自動かつ複数行オプションをONにしたPDFフォームがあっても、PDFBoxでテキストを出力すると自動的に文字サイズが調整されませんでした。そのため、途中改行が多かったり（下図2行目）、文字数が多かったり（下図3行目）すると、固定フォントサイズの場合と同様に文字が見切れる問題がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33668/7ff1bad0-4bfd-f9ea-dd8e-2faabee11e5f.png)

### After

PDFBox v2.0.21からは、このような場合にも期待通りに文字サイズが調整されてPDF出力されるようになりました。そのため、どれくらいの文字数を出力したいか事前に決まっていない場合でも、（文字は小さくなるものの）見切れることなく出力することが可能になります。いいね :thumbsup:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33668/9d9e4d02-c554-9c4e-0873-99bd26d0081a.png)

なお、フォントサイズには最大値と最小値が定められているようで、例えばあまりにも文字サイズが小さくなる場合は、それ以上縮小されなくなります。なので、従来どおり見切れてしまうことがあります（下図は、3行、5行、7行それぞれ出力して7行が収まらない例）。

　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33668/d667c71a-2d35-82c4-cce8-cb047d5cfd41.png)


### 蛇足

リリースノートでは v2.0.21 で対応したことになっていますが、実際には v2.0.19 から使えるようです。ただ、文字数が少ない場合に過剰に大きく表示されてしまう問題があるようなので、最新版を利用することをおすすめします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33668/0cc87713-41f6-9c92-0d94-9d9569448c22.png)

### まとめ

PDFBoxがとうとう複数行テキストフィールドの自動フォントサイズに対応してくれました。PDFフォームとPDFBoxを使って帳票出力する場合に表現の幅が広がるので、試してみてはいかがでしょうか。
GPU での Ethash 電力効率のメモ

VBIOS 書き換えなどせず, stock 状態 + powerlimit(+ クロックオフセット)での結果です.

GPU ベンダー, メモリベンダーや個体によって, 少しばらつきがあります.

* TITAN V : 70 Mh/s @ 125W (0.56 Mh/W)
* Radeon VII : 80 or 85 MH/s @ 160 W(0.5 MH/W)
  * Samsung メモリ 85 MH/s, Hynix メモリ 80 MH/s
* RTX 3070 : 55 MH/s @ 110W (0.5 Mh/W)
* RTX 3060 ti(推定) : 60 Mh/s @ 120W(0.5 Mh/W)
* RX5700 無印 : 49 MH/s @ 110W(0.44) 
* RTX 3080 : 90~93 Mh/s @ 220W(0.40 ~ 0.42)
* rx 6800(推定): 65 Mh/s @ 170W らしいが, 80 Mh/s @ 170W(0.47) という報告もあり

2020/12/01 現行製品(7nm or 8nm GPU)だと, 0.5 Mh/s が一つのラインと言えそうです.
(Titan V はすでに販売から 3 年経ってますが最高効率で別格)

2020/12/03 時点では, 3060 Ti(0.5 Mh/W) が, 8pin x 1 で済むモデルが多いのでおすすめそうです!
【Java】チェックボックスが選択されているかどうかを取得する

#プログラミング勉強日記
2020年12月1日
チェックボックスはクリックされるごとに選択状態と非選択状態になっている。その状態を取得する方法について紹介する。

#選択しているかどうか取得する
　チェックボックスが選択されているかどうかを取得するためにはJCheckBoxクラスの親クラスであるAbstractButtonクラスで用意されているisSelectedメソッドを使う。
　isSelectedメソッドは、ボタンが選択されている場合はtrueを、されていない場合はfalseを返す。

```java
if ([チェックボックス名].isSelected()) {
    // チェックボックスが選択されている場合
} else {
    // チェックボックスが選択されていない場合
}
```


#メモ
　isSelectedメソッドのように`is`で始まるメソッドは答えが真が偽になるので、if文の条件式に利用することができる。

#参考文献
[インタフェースButtonModel](https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/ButtonModel.html)
[チェックボックス（JCheckBox）の使い方](http://arkoak.com/java/2-4/)
[チェックボックスが選択か非選択かを取得する](https://www.javadrive.jp/tutorial/jcheckbox/index13.html)
量子コンパイラを作る。 その2

# 概要

量子コンパイラを作る。

# 成果物

https://embed.plnkr.co/plunk/EFJWjGRw7484JzZE

# 投入したソース。


```
make 4
in 0 1
out 2 3
and 0 1 3
xor 0 1 2
```

# 出力。


```
from blueqat import Circuit

print (Circuit(4).h[ : 2].cx[0, 3].cx[1, 3].ccx[0, 1, 2].m[ : ].run(shots = 1000))

```

# 実行結果


```
Counter({'0101': 272, '1110': 258, '1001': 249, '0000': 221})
```

以上。
FigmaのデザインをSwiftUIのコードに変換してくれる無料プラグインがあるらしい？？？

GitHubで便利そうなライブラリを探していたらこんなものを見つけました。

### [FigmaToCode](https://github.com/bernaferrari/FigmaToCode)

![https://www.figma.com/community/plugin/842128343887142055/thumbnail](https://www.figma.com/community/plugin/842128343887142055/thumbnail)

Figmaのデザインを`Flutter`、`tailwidcss`、`SwiftUI`にコンバートしてくれるらしい。
FigmaはUIKitしかサポートしてくれてないので、使い物になればかなり有り難い...

## 試しに使ってみた
今回はこちらのデザインをコンバートしてみようと思います。
ニューモーフィズムのサンプルデザインです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/fc18fe35-2b28-1128-d689-65243e8c75a8.png)

### コンバート結果

```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(spacing: 43) {
            Text("Neumorphism UI Kit")
                .fontWeight(.medium)
                .font(.largeTitle)
                .padding(.vertical, 49)
                .padding(.leading, 116)
                .padding(.trailing, 117)
                .frame(width: 693, height: 155)
                .foregroundColor(Color.init("text"))
                .background(Color.init("background"))
                .cornerRadius(98)
                .shadow(radius: 30)
            Text("Button / Switch / Progress / Pagination/ Selector ... and more")
                .font(.title)
        }
        .background(Color.init("background"))
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/926469f5-d0d4-4b31-3ae3-1d29b288d0b9.png)

## 使ってみて

結構、再現度の高いものに仕上がっているのではないでしょうか？
AutoLayoutを再現するにはこのようなポイントに注意しなければいけないようです。
![https://github.com/bernaferrari/FigmaToCode/raw/master/assets/examples.png](https://github.com/bernaferrari/FigmaToCode/raw/master/assets/examples.png)

個人的には画面全体ではなく各パーツを１つずつ変換していく形になると思うので、あまり関係ないかなと。  
絶賛開発中のプラグインなので期待していいのでは？

SwiftUIのアプリを来年から新たに開発予定なので、そのタイミングでもっと使ってみようかなって思います！
スクラム開発に出会って良かったなぁ〜って思った理由

社会３年目になります、@shira-shunです。
私は新人配属のときからスクラム開発を行なっているプロジェクトに参画し、２年ほど経験をいたしました。
フォーターフォール開発未経験者になります...

そんな私が、スクラム開発を行なっているプロジェクトで仕事できて良かった、成長できた点を説明したいと思います。


ちなみに入社直後の技術スキルはこれくらいでした。

- 情報系学科の大学を卒業
- Javaの入門はある程度できるくらい

## 最初からやりたいタスクに着手できた。
一番最初に配属された現場は新規プロジェクトでした。
私以外のメンバーは`ほぼ全員ベテラン`の構成。

正直、最初は全くついていける気がしなかったです...
ただ、スクラムで行っていたので、どのタスクも取ることが可能な状況でした。
何もできない私にとってはどのタスクもできる気がしなかったです。

でも、この状況が私にとって有り難かったです。
どの**タスクも着手できるチャンスがある**ってことに。

私がイメージしていた新人のタスクはまずは出来ることだったり、研修中に行ったことでした。
自分が伸ばしていきたい箇所のタスクを積極的に着手できる環境は嬉しかったです。

ちなみに最初に着手したタスクはGit関連の手順書のタスクで、ベテランの方に助けてもらいながら消化していました。
今では、Git職人と言われるほどの技術を身に付けることができました。

## 新人(若手)としてではなく同じ開発者として接してくれた。

私がいたチームは新人だろうが、何だろうが容赦無かった気がします。
スクラム開発ではフルスタック（技術力のある)な人材が必要であり、スキトラしていくのがチームが成熟していくための方法の一つです。

何も出来なかった私にも必ず意見を求められます。
最初はとりあえず何か発言をするのに精一杯でしたが、いつのまにか何か発言しないと気が済まない、いくらでも意見を言えるようになってました。

## レビュアを担当することができた。

レビューは２人で行うことをチームのルールにしていました。
そのため、まともにコーティングできない私でもレビュアをすることが沢山ありました。
個人的にはこのおかげで、一番技術力伸びた気がします。

最初はこんな感じでレビューしてました。

- どんな感じで実装しているのか
- タイポチェック
- スペルチェック

正直、大した指摘は出来ていなかったです。
それでも、技術力のあるベテランのソースコードを見るってことがかなり有り難かったです。
何度も、レビューしているとメンバーの癖もわかるようになってきました。

自分でコーディングしたものをレビューしてもらうこともスキルUPの方法だと思いますが、他の人のソースコードを見ることの方が重要なんじゃないかと思ってます。
今ではよく、OSSのソースコードを暇な時に見ています。

## お客様(プロダクトオーナー)と毎日会話していた。 

POはエンジニアではなかったため、スクラムチームの開発者に毎日相談してきます。
POからみたら全員エンジニアであり、自分より物知りだと思って接してきました。

私にも、めちゃめちゃ相談してくれました。
`「出来るだけPOの要望に答えてあげたい、分かりやすく説明したい」`と自然と思うようになります。
そう思いながらコミュニケーションしていると技術力と説明力がUPしてました。

他にもPOの本心が聞けたり、メンバーのベクトルが全員正しい方向に向かっているかわかったりとメリットしかなかったです。

ウォーターフォール開発だと新人がお客様と密に会話することって滅多にないと思うんですよね。
これって非常に勿体無いと思ってます。
今まで話していなかったお客様とそろそろ話せるようになろうねって言われても無理な気がします。

## 他のメンバーの技術を盗み放題。
よくあるスクラム開発って

- カンバン(タスク管理ツール)でタスクの状況を可視化
- ペアプロ
- モブプロ

こんな感じで他のメンバーがどんなことしているかだったり、どんなやり方で作業しているか丸見えだと思います。
何ヶ月か一緒に開発していると、他のメンバーの盗むべきものだったり、盗むべきものではないものが分かり始めます。

「あっ、この人マルチタスクしてるな」や「この人順調にバーンダウンしてるとさぼり癖あるな」だったり、
「コーディング終わってからレビュー出すまで早いな」や「ずっと雑談しながら作業しているな」と色々と発見ができました。

盗むべきものを盗んでしまえば、最強のエンジニアになれるやんって思いながら作業してました。


# 最後に
スクラム開発って、主体性のある人材が揃っていれば`最強のフレームワーク`だなって思います。
主体性がなければ、全く機能しないと思いますが。

今まで、ベテランの方にサポートして頂いたので、これからは後輩に同じ意識を持って仕事してもらえるように頑張っていこうと思います。
[Python]優先度付きキュー(heapq)　ABC141D

# 優先度付きキューについて
優先度付きキュー (Priority queue) はデータ型の一つで、具体的には

* **値の追加 　$O(\log{N})$**
* **値の削除 　$O(\log{N})$**
* **最小値(最大値)の取得 $O(1)$**

通常のリストだとそれぞれ $O(N)$ です。
**最小値(最大値)のみを得たい、のみに処理したい、を何回も繰り返すとき**に使います。


# Pythonでの使い方
Pythonでは優先度付きキューは **heapq** として標準ライブラリに用意されています。使いたいときはimportしましょう。

## 各メソッドについて
頻繁に使うメソッドは3つです。

* `heapq.heapify(リスト)`でリストを優先度付きキューに変換。
* `heapq.heappop(優先度付きキュー (=リスト) )`で優先度付きキューから最小値を取り出す。
* `heapq.heappush(優先度付きキュー (=リスト) , 挿入したい要素)`で優先度付きキューに要素を挿入。

**※** Pythonではheap化されたリストのクラスもリストであるためこのような書き方をしています。↓参考

```python
import heapq
a = [1, 6, 8, 0, -1]
print(type(a))  # <class 'list'>
heapq.heapify(a)
print(type(a))  # <class 'list'>
```

では、各メソッドの使い方について見ていきましょう。


```python
import heapq  # heapqライブラリのimport

a = [1, 6, 8, 0, -1]
heapq.heapify(a)  # リストを優先度付きキューへ
print(a)
# 出力: [-1, 0, 8, 1, 6] (優先度付きキューとなった a)

print(heapq.heappop(a))  # 最小値の取り出し
# 出力: -1 (a の最小値)
print(a)
# 出力: [0, 1, 8, 6] (最小値を取り出した後の a)

heapq.heappush(a, -2)  # 要素の挿入
print(a)
# 出力: [-2, 0, 1, 8, 6]  (-2 を挿入後の a)
```

なお、もちろんリストのheap化は行わなくても`heappop()`と`heappush()`は使用できます。しかし`heappop()`ではリストの先頭の要素が取り出される仕様になっているため、初回の`heappop()`を行う際は気をつけましょう。最初のリストが空のリスト`[]`であるような場合には`heapify`を行う必要がないので以下の通りで問題ありません。

```python
import heapq  # heapqライブラリのimport

a = [1, 6, 8, 0, -1]
# heapq.heapify(a)

print(heapq.heappop(a))  # 先頭の要素 (1) が取り出される！！！！
print(a)  # [-1, 6, 8, 0]

heapq.heappush(a, -2)  # 要素の挿入
print(a)  # [-2, -1, 8, 0, 6]

print(heapq.heappop(a))  # 最小値の取り出し
print(a) # [-1, 0, 8, 6]
```

## 最大値の取り出し
デフォルトのheapqは最小値を想定しています。最大値の時は、各要素に-1をかけた上で最小値を取り出し、-1をかけて最大値を復元します。以下のコードでは`map`関数で各要素を-1倍していますが、実際に問題を解く際には入力時に-1した方が高速です。

```python
import heapq
a = [1, 6, 8, 0, -1]
a = list(map(lambda x: x*(-1), a))  # 各要素を-1倍
print(a)

heapq.heapify(a)
print(heapq.heappop(a)*(-1))  # 最大値の取り出し
print(a)
```

```python:出力
[-8, -6, -1, 0, 1]
8
[-6, 0, -1, 1]
```

#[ABC141D](https://atcoder.jp/contests/abc141/tasks/abc141_d)

この問題は  **最大値を1/2することをM回繰り返す** だけでよいのですが、通常のリストを使うと、最大値の選定に $O(N)$ 、それをM回のため計算量が $O(NM)$ で間に合いません。
そこでheapqの出番です。heapqでは最大値の選定に $O(\log{N})$ 、それをM回のため計算量が $O(M \log {N})$ となり間に合います。以下が実装です。

```python:ABC141D.py
import heapq

n, m = map(int, input().split())
a = list(map(lambda x: int(x)*(-1), input().split()))
heapq.heapify(a)  # aを優先度付きキューに

for _ in range(m):
    tmp_min = heapq.heappop(a)
    heapq.heappush(a, (-1)*(-tmp_min//2))  # 負数の剰余演算を避けるため一時的に0以上の整数にしています
print(-sum(a))
```
　
当内容は、次を参考にした。
[【Python】優先度付きキューの使い方【heapq】【ABC141 D】](https://qiita.com/ell/items/fe52a9eb9499b7060ed6)
jqで名前からAWS EC2 Instance Idを取得

Nameが`test-ec2`のinstanceidをゲットする

```
aws ec2 describe-instances | jq -r '.Reservations[].Instances[]  | select(.Tags[]?.Key == "Name" and .Tags[]?.Value == "test-ec2") | {"instance-id": .InstanceId, "tags":.Tags}'
{
  "instance-id": "i-xxxxx",
  "tags": [
    {
      "Key": "Name",
      "Value": "test-ec2"
    }
  ]
}
```
固定翼機のテイクオフ方法について 

今年もアドベントカレンダーやてきましたねぇ。

Drone Bird 副隊長の藤井でございます。
ブログなんて書くの去年ぶりって、このカレンダーのやつしかブログ書いてませんわ。

さて、今年からDrone Birdにて、正隊員・準隊員の募集が始まりましたね。

https://dronebird.peatix.com/

これは災害地で活動する隊員が安全に活動できるように、保険加入やその他継続的な訓練を受けるための制度です。
Drone Birdのプロジェクトがボランティアでの市民参加型の被災地の地図作成プロジェクトなわけですが、
SDGsによるところの考え方に沿った実行をするわけです。

前振りが長いですが、
今年、注目のニュースといえば、西日本にSensefly社のeBeeXが一機配備されたこと！
一人でテンションが上がっておりますが、そうです。今から盛り上げるんです。

![IMG_9538.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322439/71676208-5989-8f18-804f-fa07745e0752.jpeg)

ん～かっこいいね～！
ぴっかぴか。

固定翼機はドローンを飛ばすよって方でも結構やったことない人が多い。
DroneBird はより広い撮影ができる固定翼機を災害の場では推奨している。
このeBeeXは、私が勝手に「いびーえっきゅす」くんと名付けました。知らんけど。

Drone Bird WestではこのeBeeXとParrot DISCO Pro AGを配備しています。
なので、訓練では実際にこれを飛ばしてもらいます。
飛ばしたいって方は入隊してね＾＾

飛ばし方は、
１．両方の羽の肩にあたる部分を持って、機体を水平にする。
２．機体を水平方向にシェイクする。（揺さぶる）
３．エルロン（両方の羽の後ろにある動く部分）が上下に互い違いに動きたり、そろって上下したりする。
４．プロペラが回り始める
５．頭のランプが青の時は、回転がまだ不十分。緑に変わる。（回転が十分になった）
６．斜め４５度に向けて、勢いよくはな～つ！！！

これでOK

Parrotの場合は、iPadなどの画面で「Start」ボタンを押すとプロペラが回り出す。
十分な回転になったらはな～つ！！！
です。

動画をGoPro8で撮って編集してみました。
ご参考に見てくださいませ。

https://fb.watch/25XppKwKXd/
JS オブジェクト,プロパティ,メソッドについて　(JSアウトプット)

##あいさつ
初めての人は初めまして！知っている人はこんにちは！
中学生バックエンドプログラマーのAtieです！
今回はJSの「**オブジェクト**」「**プロパティ**」「**メソッド**」について学んできたのでアウトプットします！
では！

##オブジェクト
オブジェクトとは「データと機能をまとめたもの」です

##プロパティ
プロパティとは「オブジェクト内のデータ」に相当します

##メソッド
メソッドとは「オブジェクト内の機能(関数)」に相当します

超ざっくり説明しました

##食べ物を例に説明
先ほどの説明だけではわかりずらいので「食べ物」でたとえてみます！

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920666/ececa848-f332-06c0-b9a5-a1e99a889575.png)

”食べ物”というオブジェクトの中に”果実”というオブジェクトが入っています
プロパティは”果物”メソッドは”甘い”
そしてその”果物”オブジェクトの中にバナナというオブジェクトが入っています
プロパティは”バナナ”メソッドは”86kcal”

同じようにりんごなどもあります

ではこれをコードで再現してみます

```main.js
let food = {
    fruits:[
        {
            name: "banana",
            kcal: function() {
                console.log('バナナのカロリーは86kcalです！');
            }
        },
        {
            name: "apple",
            kcal: function() {
                console.log('リンゴのカロリーは57kcalです！');
            }
        } 
    ]
}

console.log(food.fruits[0].name);
food.fruits[0].kcal();
console.log(food.fruits[1].name);
food.fruits[1].kcal();
```
大きく二つに分かれています
上がオブジェクトの定義部分です
オブジェクトを定義するには

```main.js
let オブジェクト名 = {
    //オブジェクトの内容
};
```
と定義します
中身を見てみましょう

```main.js
fruits:[
        {
            name: "banana",
            kcal: function() {
                console.log('バナナのカロリーは86kcalです！');
            }
        },
        {
            name: "apple",
            kcal: function() {
                console.log('リンゴのカロリーは57kcalです！');
            }
        } 
]
```
fruitsという配列の中にnameというプロパティとkcalというメソッドが入っています
メソッドの処理を実行するとコンソールに「バナナのカロリーは86kcalです！」などと表示されるようになっています
配列については今度解説します

オブジェクト内にアクセスする方法ですが二通りあります

.で区切ってアクセスする方法

```mian.js
food.fruits[0].kcal();
```
こんな感じです
基本この方法でアクセスしますが変数などにアクセスする場合などは二つ目の方法を使う必要があります

角カッコを使ってアクセスする方法

```main.js
food["fruits"][0]["kcal"]();
```
.で区切る場合に比べて少しわかりずらいですがいちようこの方法でもアクセスできます

##window document
最後にwindow documentについてです

JSはブラウザで動く言語。ブラウザ自体もオブジェクトで定義されていてメソッドやプロパティにアクセスできます
その機能を使うことでDOM操作やデータのやり取りができます

```main.js
window.fetch(); //外部とデータをやり取りする
window.document.getElementById("food"); //DOM要素のfoodという要素を収得する
```
documentは省略可能です
ほかにもたくさんwindowオブジェクトのメソッドがあります

例えばJSでよく使われる「console.log」や「alert」なども実はwindowオブジェクトのメソッドだったのです

```main.js
window.console.log("hello");
window.alert("hello");
```
これでも正常に実行できます

windowというオブジェクトを使うことでJSのお仕事である**データのやり取り**と**DOM操作**ができるようになります！

##まとめ
**オブジェクト**はデータと機能をまとめたもの
**プロパティ**はデータに相当する
**メソッド**は機能に相当する
ブラウザもオブジェクトで使うことでJSのお仕事の二つができるようになる

##最後に
今回の記事は少し短かったですがこれもかなり大切な概念です

ではまた！次の記事で！

[AtieのTwitter](https://twitter.com/Atie_BackendPG)
[しまぶーのIT大学さんのTwitter](https://twitter.com/shimabu_it)

##学習、参考動画
[【JavaScript入門 #3】オブジェクト・プロパティ・メソッドについて理解しよう【ヤフー出身エンジニアの初心者向けプログラミング講座】](https://www.youtube.com/watch?v=vD1qoNrU8FY)
laravel 6.x migrations-generatorがインストールできない問題対応

# 既存DBのmigrationsファイルを作成したい

migrations-generatorをインストールする

```
composer require --dev "xethron/migrations-generator"
```

larabel 6.xでは下記のようなエラーになる 

```
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - xethron/migrations-generator v2.0.0 requires way/generators dev-feature/laravel-five-stable -> no matching package found.
    - illuminate/support v5.7.9 requires nesbot/carbon ^1.26.3 -> satisfiable by nesbot/carbon[1.26.3, 1.26.4, 1.26.5, 1.26.6, 1.27.0, 1.28.0, 1.29.0, 1.29.1, 1.29.2, 1.30.0, 1.31.0, 1.31.1, 1.32.0, 1.33.0, 1.34.0, 1.34.1, 1.34.2, 1.34.3, 1.34.4, 1.35.0, 1.35.1, 1.36.0, 1.36.1, 1.36.2, 1.37.0, 1.37.1, 1.38.0, 1.38.1, 1.38.2, 1.38.3, 1.38.4, 1.39.0, 1.39.1] but these conflict with your requirements or minimum-stability.
   
    （省略）

    - don't install illuminate/support v5.0.4|don't install laravel/framework v6.18.20
    - Installation request for laravel/framework (locked at v6.18.20, required as 6.x) -> satisfiable by laravel/framework[v6.18.20].
    - Installation request for xethron/migrations-generator ^2.0 -> satisfiable by xethron/migrations-generator[v2.0.0, v2.0.1, v2.0.2].

Potential causes:
 - A typo in the package name
 - The package is not available in a stable-enough version according to your minimum-stability setting
   see <https://getcomposer.org/doc/04-schema.md#minimum-stability> for more details.
 - It's a private package and you forgot to add a custom repository to find it

Read <https://getcomposer.org/doc/articles/troubleshooting.md> for further common problems.

Installation failed, reverting ./composer.json to its original content.

```

ググると同じ問題に直面してるひとが多数。（https://github.com/Xethron/migrations-generator/issues/191）
これや　https://github.com/oscarafdev/migrations-generator

```
composer require oscarafdev/migrations-generator --dev
```
これを　https://github.com/kitloong/laravel-migrations-generator

```
composer require --dev "kitloong/laravel-migrations-generator"
```

試してみろと書かれているのがこれらもうまく行かない・・・

# 解決方法
laravelのバージョンの互換性の問題だしlaravelのバージョン下げてしまえばいい
そりゃそうでしょって話だが今回migrationsファイル作るだけなので
別プロジェクトをlaravel5.4で立ち上げてそこで作ったものをコピーすれば良いと考えた

# Version指定してlaravelをインストール

```
composer create-project "laravel/laravel=5.4.*" sampleproject
cd sampleproject
composer require oscarafdev/migrations-generator --dev
```
うまくインストールできた。
app.phpに下記を追加して

``` config/app.php
Way\Generators\GeneratorsServiceProvider::class,
Xethron\MigrationsGenerator\MigrationsGeneratorServiceProvider::class,
```
.envを修正して既存DBにつなげたあと

```
php artisan migrate:generate
Do you want to log these migrations in the migrations table? [Y/n] :
 > Y

 Next Batch Number is: 2. We recommend using Batch Number 0 so that it becomes the "first" migration [Default: 0] :
 > 0
```
でmigrationsファイル作成してくれました

ちなみに

```
php artisan migrate:generate table1,table2,table3,table4,table5
```
でテーブルの指定ができて

```
php artisan migrate:generate --ignore="table3,table4,table5"
```
で実行しないテーブルの指定ができるみたいです。



互換性の問題ってわかってるならあれこれやる前にバージョン下げてしまえばよいだけの話でした
【Ruby ~配列とハッシュ~】勉強メモ３

Rubyの復習。
ほぼ自分の勉強メモです。
過度な期待はしないでください。


配列
-
配列とは、複数の情報を順番にまとめて管理するときに利用するもの。
配列は、[値1, 値2, 値3]のように作成する。
配列に入っているそれぞれの値のことを要素と呼ぶ。
また、配列も1つの値なので、<b>変数に代入する</b>ことが出来る。

```.ruby:例
# 変数languagesに、配列を代入
languages = ["日本語", "英語", "スペイン語"]

puts languages
```

```.text:出力結果
日本語
英語
スペイン語
```
　

- 配列に値を追加

配列への要素の追加には、`<<`という演算子を使用。

```.ruby:例
languages = ["日本語", "英語", "スペイン語"]
languages << "フランス語"

puts languages
```

```.text:出力結果
日本語
英語
スペイン語
フランス語
```
　

- 配列の要素を取得

配列の要素には、前から順に「0, 1, 2, ...」と数字が割り振られる。
これをインデックス番号といいます。インデックス番号は、0から始まる。

配列の要素の取得の仕方は、`配列[インデックス番号]`とすることで、要素を取得することが出来る。

```.ruby:例
languages = ["日本語", "英語", "スペイン語"]

# インデックス番号が1の要素を出力
puts languages[1]

# インデックス番号が0の要素を使って「◯◯を話せます」となるように出力
puts "#{languages[0]}を話せます"
```

```.text:出力結果
英語

日本語を話せます
```
<br>

- 配列の値を変更

```.ruby:変更の仕方
languages = ["日本語", "英語", "スペイン語"]

# スペイン語をイタリア語に変更
languages[2] = "イタリア語"

puts languages
```

```.text:出力結果
日本語
英語
スペイン語
```
<br>

- lengthメソッド

配列が持つメソッドで、lengthメソッドは配列の要素数を返す。
つまり、配列の中にいくつ要素があるのか調べることが出来る。

```.ruby:変更の仕方
languages = ["日本語", "英語", "スペイン語"]

puts languages.length
```

```.text:出力結果
3
```
<br>

ハッシュ
-

- ハッシュとは

配列は複数の値を並べて管理するのに対して、ハッシュはそれぞれの値に<b>キー</b>と呼ばれる名前をつけて管理する。
ハッシュにおいては、データを<b>バリュー</b>、それに対応する名前を<b>キー</b>と呼び、
関係のある複数の値を管理するときに適している。
<br>

- ハッシュのつくり方

ハッシュは、`{キー1 => 値1, キー2 => 値2}`のように作る。
配列では要素を、[　]で囲みましたが、ハッシュの場合`{　}`で囲みます。
キーと値の間は、`「=>」`でつなぎ、また配列と同様に、要素と要素はコンマ（,）で区切りる。

```.ruby:使用例
exam = {"subject" => "Math", "score" => 80 }

puts exam
```

```.text:出力結果
{"subject" => "Math", "score" => 80 }
```
<br>

- シンボルを使った書き方

シンボルとは、見た目は文字列のようだが、実際の中身は数値になっている値の事。
シンボルの宣言は、文字列の先頭にコロン`:`をつける。

※文字列を扱うよりも、数値を扱うほうが処理速度は速くなる為、ハッシュのキーには、文字列よりもシンボルを用いることが多い。

```.ruby:シンボルを使った書き方
# 以下はどちらも同じ
hash = { :subject => "Math" }
hash = { subject: "Math" }  # よく使用される
```

<br>
過去投稿記事
-
[【Ruby ~基本(コマンド/メソッド)~】勉強メモ](https://qiita.com/k-yasuhiro/items/8803203b29d04664c866)
[【Ruby ~条件分岐~】勉強メモ２](https://qiita.com/k-yasuhiro/items/35ed5965e53796b32530)
Smode Designer(Ver.9)とは



#概要
[Smode](https://smode.fr/)は、フランスのSmodeTech社が開発しているリアルタイムコンポジットツールの総称です。

Smodeには二つのプロダクトがあります。

- [Smode Designer](https://smode.fr/designer-io-channels/)：ソフトウェア単体
- [Smode Station](https://smode.fr/station-2/)：Smode Designer ＋ メディアサーバー

この記事では主に__Smode Designer__について紹介します。

#機能
Smodeのもつ機能をすばやく紹介している動画が[こちら](https://youtu.be/XyuAbPf-jI0)ですので一度ご覧ください。

以下の機能をリアルタイムに行うことができます。

- 複数の2Dレイヤーを合成/エフェクト/マスク処理
- SphereやBox、パーティクルなどの3Dエレメントを配置/描画
- 様々な形状へのプロジェクションマッピング
- タイムラインを使ったアニメーション制御
- ループアニメーション制御
- 複数のプロジェクターやLEDスクリーンへの投影
- SPOUT出力

また、動画にはありませんが以下の機能もあります。

- ベジェ曲線を使用しての描画/.svgファイルの読み込み
- 赤外線や深度の各種センサーへの対応
- 3Dステージシミュレーション
- ライブカメラ入力

詳しくは以下にパンフレットが載ってますのでこちらもお時間あるときに目を通してみてください！
[Smode Designer パンフレット](http://www.smode-tech.jp/brochure/SmodeDesigner_JP_02.pdf)

#REQUIREMENTS
[公式HP](https://smode.fr/doc/quickstart/requirements.htm)

- __Windows(64bit)__ 8, 8.1, 10
- 最低1GB以上のディスクスペース
- 最低 DDR3 2133 memory 4GBと64 Bit CPU
    - Intel Core i7 以上
    - AMD Turion or Opteron family and greater
- 最低 1GBのGPUメモリ
    - NVidia GeForce 580 GTX 以上
    - NVidia Quadro 5000 以上
    - AMD FirePro V5900 以上
    - AMD Radeon HD 5xxx 以上
    
※
Intel, Matrox やその他の GPUはまだ対応していません
お使いのオペレーティングシステムとグラフィックカードのドライバが最新のものであることを確認する必要があります。
※
快適なビデオストリーミングには、高速なSSDドライブをお勧めします。

#事例紹介
[公式HP](https://smode.fr/usecases-2/)
フランスでは80％のSHOWやライブ現場で使用されており、ライブステージ、インタラクティブコンテンツ、プロジェクションマッピングなどの大規模な演出から、2D3Dの映像制作まで幅広く使われています。

![スクリーンショット 2020-12-01 195833.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272258/f96f7f28-7210-479f-90c0-baeadc28794e.png)

#Smode Designerを触ってみよう！
細々説明してきましたが、なによりも触ってみるのが一番！
__[こちら](https://smode.fr/shop/designer-demo/)__からDesignerのデモバージョンをDLすることができます。

そして、SmodeJapanの__[Youtubeチャンネル](https://www.youtube.com/channel/UC09rmeZ3yIyaMzDeRf93RoQ)__に日本語チュートリアルをアップロードしていっています。
今回のアドベントカレンダーでも解説などをしていく予定です！

また、その他の学習方法としては以下のようなものがあります

- [チュートリアル](https://smode.fr/support-resources/)
- [ドキュメント](https://smode.fr/doc/)
- [フォーラム](http://forum.smode.fr/)
- [サポート用Discord](https://discord.gg/k5KBHQH)
- [Facebookユーザーグループ](https://www.facebook.com/groups/smodeusers/)
是非参考にしてみてください。

※デモバージョンは全ての機能を使用することができますが、ファイルの保存ができません。
また、インプットやアウトプット、エンコードするものにウォーターマークが載ります。


#Special Thanks
今回の記事は @joe0hara 君が書いていた[Smode とは？](https://poisson.work/tutorial/what-is-smode/)をSmode Ver.9用に書き直したものです。素晴らしい雛形ありがとうございます！
SweetAlertでメッセージ表示

#SweetAlertでメッセージ表示
##基本情報
###本家
https://sweetalert.js.org/guides/#getting-started

##概要
JavaScriptの標準装備でアラート、メッセージを出しても良いが、ひと手間加えて、お洒落にメッセージを表示する。

##基本的な使い方
### メッセージを出すだけ

![4C2F4B81-4B95-43FE-A912-D86B9DBF3F8F_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78756/55facb81-499a-5435-6cb9-c9b992f848a0.jpeg)

```javascript:sweetAlertSample.js

function basicSample(){
    swal("基本の使い方");
}
```

### タイトルとテキストをつける

![B3D15906-35A7-4A0E-995A-A1EF9E1599DD_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78756/64260862-2011-3250-5d95-40d593c6d77a.jpeg)

```javascript:sweetAlertSample.js
function basicSample2(){
    swal("ここにタイトル！", "そして、ここにテキスト！");
}
```

### アイコンをつける

![D558C8C3-A779-4F5B-9EFA-0DCCB1B6ECF8_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78756/5a5b081e-1873-d98b-a7ef-72f639c9caea.jpeg)

```javascript:sweetAlertSample.js
function basicSample3(){
    swal("アイコンつき！", "ボタンも付いてる！", "success");
}
```

## アイコンの使い分け
使用可能なアイコンは4種類。

### success
![BFC66868-6CF5-4C00-A577-6D6410B5A979_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78756/b9a42b09-75b6-1421-7378-3ff31778968e.jpeg)

```javascript:sweetAlertSample.js
function iconSample1(){
    swal({
        title: "success",
        text: "successのicon",
        icon: "success",
        button: "OK",
    });
}
```

### error
![11E3B688-BDCB-46D3-81DC-7BBE81FB190B_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78756/99f26abf-9cfb-3263-afa6-e897871db00b.jpeg)

```javascript:sweetAlertSample.js
function iconSample2(){
    swal({
        title: "error",
        text: "errorのicon",
        icon: "error",
        button: "OK",
    });
}
```

### info
![A8A6915E-D6E7-4206-9D26-C51CB089CB34_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78756/2814b9e8-3efc-51d2-3098-1f9efddd24ef.jpeg)

```javascript:sweetAlertSample.js
function iconSample3(){
    swal({
        title: "info",
        text: "infoのicon",
        icon: "info",
        button: "OK",
    });
}
```

### warning
![EEBB3C38-9B60-4073-9001-5D9409729ADE_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78756/0e66836a-f09a-fa81-c923-7b3ece23a139.jpeg)

```javascript:sweetAlertSample.js
function iconSample4(){
    swal({
        title: "warning",
        text: "warningのicon",
        icon: "warning",
        button: "OK",
    });
}
```
エンジニアが学ぶマーケティング

#デジタルマーケティングとは
####マーケティングとは売れ続ける仕組み作り
一度だけ買ってもらうのではなく繰り返し買ってもらう。

####他者の成功事例を参考にするのは良いが、まずは自社の分析から

####顧客心理の変化
CMや広告→口コミの検索,SNS

34
マーケティングファネル
消費者の購買行動の図

デジタルの特徴
・検索性→個人でも情報の入手検討が簡単
・双方向性→企業の一方的な発信だけ出なく個人の口コミがわかる
・即時性→リアルタイムの情報がわかる

↓

顧客情報（うわさ、口コミ）が重要


データの量が増加
↓
分析が可能
↓
特に顧客の時間軸が把握できる
来店のタイミングごとの行動を把握できる
(初来店はカプチーノだけ、リピートしているうちにパンも買うようになった)
↓
新規顧客と継続顧客で別の試作が打てる

#売り上げを伸ばすには継続顧客を増やす
新規顧客を増やすよりも、継続顧客を伸ばす方が雪だるま式に売上が成長する。

個人LINE、電子決済(様々な情報を自動で記録できる)

継続顧客を作るのは難しい。

F2転換：継続顧客にすること

新規顧客と継続顧客の売り上げを年単位で分析

継続率は50%がボーダーライン

####階段図の作成
p.66

1,2,3年目の顧客構造を理解し、そこに施策を打っていくことで売上上昇

####F2転換　重要な3つのポイント
・どの商品を入り口とするか p95ユニクロ例
・商品を買ってから数日後など、節目のタイミングで顧客にアプローチする。
p.98 フィットネスクラブの例
p.100 音楽ストリーミングの例
・適切なアプローチを通して、顧客に覚えてもらう。
  p102
　コミュニケーションは最初の購入から30日以内
 F2転換は初回の体験から2ヶ月以内がタイムリミット

p108Jリーグの例
p110スターバックスの例

#新規顧客の獲得
広告、お試し商品→一押し商品
(ユニクロ→ヒートテック)

この商品をどういう人に使って欲しいかを考え(ペルソナ)
→p120 Yahoo Google facebook Twitterなど広告を変更する。

p.128
購入の直前(顧客が欲しいものが決まり、候補から選ぶ状態)のお客さんに広告できる
→リスティング広告、アフィリエイト広告

潜在層(商品、サービスを知らない)
→ディスプレイネットワーク広告、SNS広告

p.131
予約型広告→CM

運用型広告→SNS
実際の反応を見ながら、動的に変化できる。

p.134
Facebook,Instagram,Twitter,LINEそれぞれの広告メリット

p.140
広告コストの設計

p.145CPAという考え方。