OmniAICreator/Qiita-1.07M huggingface dataset:
Scrum Fest Sapporo Day 1 Coach's Clinicでふりかえりの相談を実施しました

# Scrum Fest Sapporo Day 1 Coach's Clinic

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221788/601ffe30-31c7-9c84-87ad-1fdaa88b1a6f.png)

2020/11/06に開催されたScrum Fest Sapporo 2020 Day 1にて、Coach's Clinicが開催されました。
Coach's Clinicは、アジャイルコーチ陣に自由に相談できる場で、今回は初のオンライン開催とのこと。
1回20分×4のセッションで、悩みのある人が自由にコーチをアサインして、相談の場を作っていくやり方で行われています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221788/60c51d54-006e-3288-304d-20a4d1f76e83.png)

私はコーチとして4セッション＋雑談の1セッションで計5回参加してきました。
（私は右から2人目です）

# ふりかえりに関する相談

ふりかえりに関する悩みをいくつか受けてきましたので、相談内容をプライバシーに触れないよう汎化して紹介したいと思います。
ここでの回答は質問者のコンテキストに応じた回答ですので、すべての現場で使えるわけではないことをご了承ください。

## Q. ふりかえりで発言が自分だけ。どうやったら議論が活発になりますか？

ふりかえりを導入後間もない状態。
司会をやっているとき、私がそれぞれの話を解釈して、反応して、じゃあ次の人、になります。
メンバーの特性として、普段からあまりしゃべらない大人しいメンバーが多いです。

**A. ふりかえりであなたがチームに「どういう風にふりかえりをしてほしいか」を伝えてみましょう。**
チームにあなたの気持ちはちゃんと伝わっていないかもしれません。
また、「どのようなふりかえりにしたいか」もチーム全員で話してみるのもいいでしょう。

会話が弾まなくとも、チャットでの反応がいいメンバーでしたら、「喋らないふりかえり」をするのもアリです。
「みんなで意見を出し合って」というスタイルにこだわらなくてもよさそうです。

オンラインでテキストコミュニケーションのみで行うふりかえりのやり方もあります。
[ふりかえりで陣取りゲーム！～ふりかえりの手法紹介：Blokus](https://qiita.com/viva_tweet_x/items/4249d32931007dde1851)

チームのコミュニケーションの特性を活かしてみましょう。

## Q. ふりかえりが反省会になってしまいます。どうすればいいでしょうか？

スクラムをやっていたものの、反省会のような雰囲気のふりかえりしか経験したことがありません。
ふりかえりにいい印象を持っていません。
次回、自分でチームを作るときに、ふりかえりをどう始めればいいでしょうか。

**A. ふりかえりを全員で作っていく意識を持つとよいでしょう。**
チームのルールを全員で作ると、チームがふりかえりに参加する意識を持ちやすくなります。

ふりかえりの場を作る手法である「[DPA](https://qiita.com/viva_tweet_x/items/97e819c626979b78947a)」を使い、全員でふりかえりの場を作り上げていきましょう。

また、ふりかえりの期待値を下げる、ハードルを下げる、というのも重要です。
「ふりかえりは問題をすべて解決する」という思い込みを捨て、チームの状況を共有するところから始めるだけで十分です。
慣れてきたら、アクションを少しずつ出して、カイゼンしていく様子がチームで自覚できるようになるとよいでしょう。

## Q. ふりかえりを組織に広げていくためにどうすればいいでしょうか

1チームでふりかえりを定着できていますが、他のチームにも少しずつふりかえりを広げていきたいです。
まずは興味を持ってもらった人に「日報」を全員でやってもらおうと思っています。
他にも、いいやり方はないでしょうか。

**A. 興味を持ってもらった人から始める、というのは非常によい手です。**
日報は「内省」の文脈が強く、自分一人での学び・気付きを吸収することに特化しています。
もし、スクラムの「スプリントレトロスペクティブ」のようなカイゼンの文脈のふりかえりを根付かせたいのであれば、相互作用が必要です。
例えば、全員で業務終了前10分間、一緒に日報を書いて、コメントしあう時間を作るといったやり方をすると、相互作用を生みやすくなります。

## Q. 楽しいふりかえりってどんなものでしょうか？

A. Scrum Fest Sapporo 2020 の私のセッションで（別記事に起こします）詳しく解説します。

## Q. ふりかえりで文句が多いです。どうすればいいでしょうか？

**A. 文句を言っちゃだめ、というわけではないです。**
むしろ、文句だけを言う会というのを作っても面白そうですね。
「これ以上文句が出てこない、ぐうの音も出てこないほどストイックに文句を出せ！」というふりかえりをすると、逆に盛り上がりそうです。
このやり方は楽しそうなので、私もやってみます。

# フィードバック

参加した5名の方から、色々とフィードバックを頂きました。ありがとうございます。

- 答えを求めているはずなのに、問いかけされていくうちに自分で「これやってないなー」「こういうことか」と気づかされました。
- ぼんやり不安に感じたことを評価してもらえて助かりました。
- 考えていなかった視点に気づかさせてもらえました。
- ふりかえりについてすっきりしました
- 自分たちのふりかえりのハードルが高かったのが問題だったと気付きました
    - 1回ふりかえりをやって全て変わると思わない。ふりかえりを続けて会話をしてチームの状況を確認する
    - チームの入れ替わりのたびにチームのルールを作り直すことで、チームの参加意識が変わる
- ストイックに毒を吐く、毒以外吐いては行けない時間、は本気でやってみたいと思います。楽しみ。

# ふりかえりに関する悩み

他の悩みについては、以下のQiita記事でも紹介しています。
[ふりかえりに関する記事まとめ](https://qiita.com/viva_tweet_x/items/50bb65d3f817b23c03d2)

また、[ふりかえりam](https://anchor.fm/furikaerisuruo/)でも悩みについて回答していきますので、そちらもご参考にしていただければと思います。
[Java]文字列結合の実行速度比較（＋演算子 vs StringBuilder）

## はじめに
"ほげ"を10万回繰り返して連結してみます。

## ＋演算子
```java
String result = "";
  for (var i = 0; i < 100000; i++) {
  result += "ほげ";
}
```

## StringBuilder
```java
var builder = new StringBuilder();
for (var i = 0; i < 100000; i++) {
  builder.append("ほげ");
}
var result = builder.toString();
```

## 実行結果
|               | 実行時間（ms） |
| :-------------: | :--------------: |
| ＋演算子      | 5709           |
| StringBuilder | 9              |


## まとめ
圧倒的StringBuilderの勝利。
＋演算子で連結する方法は、内部的にはStringオブジェクトの生成/破棄を繰り返し行なっている分、時間がかかってしまうようですね。
現場で使えるシグナルハンドラ(Go言語編)

シグナルを受け取ってプログラムを終了する方法

```
func main() {
	sigs := make(chan os.Signal, 1)
	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
	go func() {
		s := <-sigs
		fmt.Println("Got signal:", s)
	}()
	fmt.Println("loop start")
	for { // 無限ループ
	}
}
```

https://play.golang.org/p/3f2C_JYzc94

# 参考

- https://golang.org/pkg/os/signal/
- https://gobyexample.com/signals
現場で使えるゴルーチン(errgroup.Group編)

errgroupを使って複数の非同期処理を最後にまとめてエラーハンドリングする方法

```
func main() {
	eg := errgroup.Group{}
	for i := 0; i < 5; i++ {
		i := i // ← ここがポイント
		eg.Go(func() error {
			fmt.Printf("i:%d\n", i)
			return nil
		})
	}
	if err := eg.Wait(); err != nil {
		fmt.Printf("err:%v\n", err)
	}
}
```

https://play.golang.org/p/MCkoaPl14ZY

# 参考

- https://godoc.org/golang.org/x/sync/errgroup
- https://golang.org/doc/faq#closures_and_goroutines
- https://deeeet.com/writing/2016/10/12/errgroup/
rails new から heroku openまで

#はじめに
railsチュートリアルで１章と２章を読み、AWScloud9は使わず、ローカルでherokuへデプロイを試みました。
チュートリアルどおりにやっても上手くいかず...
また、流れをまとめたかったので、以下に備忘録として記載します。

３章以降については未読ですので、今後エラーがあるかもしれません。
その場合は分かり次第こちらを更新しようと思います。
初学者が書いてますので、ご指摘ありましたらコメントお待ちしております。

参照：[Railsチュートリアル](https://railstutorial.jp/)


**2020.11.10〜 ３章以降のGemfile更新しました！**
→[RailsチュートリアルGemfile編集(３章〜）
](https://qiita.com/saya9875/items/f648a22a21b54c81c875)

#ローカル環境
・MacOS
・Ruby 2.6.6
・Rails 6.0.3.4
・ターミナルとVScode使用

#rails new
ターミナルを開き、railsのフォルダを作りたい場所まで行きます。
今回はデスクトップに作成してみました。

```
% cd Desktop
```

新規のrailsフォルダを作成します。
newの後にフォルダ名を入れることで、その名前で作られます。
今回はpractice_appという名前にします。

```
% rails new practice_app
```
webpacker successfully installed 🎉　🍰
上記が表示されれば無事作成されていると思います。

ちなみにこの段階で、ディレクトリを移動してサーバー立ち上げをすると成功します。
もし成功していない場合は、事前の環境構築が終わっていない可能性がありますので、エラー文をご確認ください。

```
% cd practice_app
% rails s
```
次に、サーバーに
hello, world!
という文字を表示させるよう、VScodeでファイルを編集します。
これをやっておかないで空の状態だとherokuでエラーが出ました...
※[チュートリアル](https://railstutorial.jp/)の３章でも、デフォルトのページのままherokuを使わない方がいいということを書いていますね。

VScodeで下記二つのファイルを編集してください。

**まずapp/controllers/application_controller.rbを開きます。**
def ~ endまでを追記します。

```
class ApplicationController < ActionController::Base
  def hello
    render html: "hello, world!"
  end
end
```

**次にconfig/routes.rbを開きます。**
root~の一文を追記してください。

```
Rails.application.routes.draw do
  root 'application#hello'
end
```
ちなみにこの段階で、

```
% rails s
```
をすると、白い背景に「hello, world!」という文字列が表示されます。

#Gemfileの編集
herokuへデプロイするなら避けては通れないGemfileの編集...
チュートリアル通りにコピペしても私の場合は上手くいきませんでした。
そこで、デフォルトの状態から最低限だけ編集することにしました。

```
gem 'sqlite3', '~> 1.4'
```

上記を切り取り、
group :development, :test do
の下に貼り付けます。

```
group :production do
  gem 'pg', '1.1.4'
end
```
次に、上記をコピーして、group :test do ~ end
の下に貼り付けます。

**そして絶対に忘れてはいけないのが**

```
% bundle install --without production
```
ちなみにGemfileをチュートリアルに合わせると上記でエラーになります...
bundle updateをすれば大丈夫とのことですが、私はそれすらもエラーになりました。
調べるとzshファイルで権限をいじった方がいい?とのこと。
よく分からなくて挫折しました。

参照：[gem installでpermissionエラーになった時の対応方法](https://qiita.com/nishina555/items/63ebd4a508a09c481150)

--without productionオプションは一度すると記憶されるため、二回目以降は省略しても大丈夫だそうです。
[Railsチュートリアル3章](https://railstutorial.jp/)

#GitとGitHub
※GitもGitHubもアカウントが作成されている前提で進みます。

```
% git init
% git add -A
% git commit -m "任意のコメント"
```
上記コマンドまで完了したら、GitHubを開き、New repositoryを選択し、Create repositoryボタンを押します。

そうすると読み込んだページに、githubへpushするためのコマンドが出てきます。
それをコピーしてターミナルで実行します。

```
% git remote add origin https://github.com/<あなたのGitHubアカウント名>/practice_app.git
% git branch -M main
% git push -u origin main
```
チュートリアルだとmasterとなっていますが、上記はmainになっています。
自分なんかやらかしたか...と不安になりましたが、こんな理由があったようです。

[GitHub、これから作成するリポジトリのデフォルトブランチ名が「main」に。「master」から「main」へ変更
](https://www.publickey1.jp/blog/20/githubmainmastermain.html)

#herokuへデプロイ
ここまで上手くいけば、あとはデプロイするだけ！
下記コマンドを実行します。

```
% heroku create
% git push heroku main
```
チュートリアルだとmainではなくmasterですね。
私の場合はmainでないとできませんでした。

上記コマンドを実行すると、出力結果に所々、黄色で「warning」と出てきますが、
赤字の「error」でなければ無視して大丈夫なのでしょうか？
これについても次回までの課題です。

そして最後に！！

```
% heroku open
```
を実行して、「hello, world!」の文字列が出てくれば終わりです！

もし上手く行かないときは

```
% heroku logs
```
をしてエラー文を確認しましょう。


#最後に
私はここまでたどり着くまで10時間以上かかりました。
今も苦しんでいる初学者の方が一人でも救われますと幸いです。
Vue + firebase functionsでfunctionsのリージョンを変更する方法

firebase functionsのデフォルトのリージョンは`us-central1`になっている。
firebase functionsのリージョンを`asia-northeast1`に変更し、Vueから呼び出すサンプルを記載する。

## firebaseサンプル(一部抜粋)

- functionsに`region('asia-northeast1')`を追加する

```javascript:functions/index.js
const functions = require('firebase-functions');

exports.helloWorld= functions.region('asia-northeast1').https.onRequest((request, response) => {
  return response.send('HelloWorld')
});
```

## Vueサンプル(一部抜粋)

- functionsのリージョンを変更してもVue側は`us-central1`を見に行ってしまうので、明示的に伝える必要がある
- `firebase.app().functions('asia-northeast1')`のように`functions()`にリージョン名を渡すことで呼び出し先を変更できる

```javascript::HelloWorld.vue
firebase.app().functions('asia-northeast1').httpsCallable('getMatches')
```
[Rails]scopeを使いこなす！

# scopeの解説
modelにscopeを設定して、コントローラー等で呼び出す。

-例-
Userモデルでscopeを設定する。
usersコントローラーで呼び出している。

```app/models/user.rb

class User < ApplicationRecord
  ...
    # scope : 呼び出す名前, -> { 処理 }

    # deletedカラムがfalseであるものを取得する
    scope :active, -> { where(deleted: false) }
    # created_atカラムを降順で取得する
    scope :sorted, -> { order(created_at: :desc) }
    # activeとsortedを合わせたもの
    scope :recent, -> { active.sorted }
  ...
end
```

```app/controllers/users_controller.rb

class UsersController < ApplicationController
  ...
  def index
  # @users = モデル.scope名

    @users = User.recent
  end
  ...
end
```

##lambdaの使い方
lambdaとは、無名関数です。
さらに無名関数の正体は、RubyのProcオブジェクトというものになります。
無名関数とは、そのままの意味で「名前のない関数」です。
下記コードのようなものが無名関数と呼ばれます。(※どちらのコードも同義です。)

```ruby

nameless_func = lambda { |n| n**2 }
nameless_func.(5)
#=> 25

scope :nameless_func, -> { |n| n**2 }
nameless_func(5)
#=> 25
```



##メリット
- モデルのscopeを定義することにより、複数のクエリを一つのメソッドとしてまとめられる。
- コントローラーで複数のクエリを書くよりもscopeを使えば、コードがスッキリする。
【R】 dplyr::group_nestを使って集計する

###はじめに
これまでRはちょっと難しそうだなと感じがしていて、複雑な統計計算以外には使っていなかったのですが、tidyverseが意外と簡単そうな気がしましたので、最近また使い始めました。なかでも、tidyverseのdplyrパッケージにあるgroup_nestが便利そうなのですが、使い方がよくわかりませんでした。

データとして、国土交通省が公開している
[これまでに公表した面積調（昭和63年以降）](https://www.gsi.go.jp/KOKUJYOHO/OLD-MENCHO-title.htm)にある「令和元年7月以降（令和2年7月まで)[CSV:154KB]」を読み込んで集計してみました。

```R
library(tidyverse)
library(magrittr)

area_data <- read_csv("R1_R2_all_mencho.csv", skip=4, locale=locale(encoding="CP932"))
```

このファイルのエンコードはCP932になっており、ヘッダの文字に㎡が使われています。
はじめに`read.csv("R1_R2_all_mencho.csv", skip=4, fileEncoding="CP932")`で読み込んでみたのですが、㎡がうまく扱えませんでした。

市区町村以外のデータも含まれていましたので、市区町村だけのデータにします。

```R
area_data %<>% select(1,2,4,5) %>% rename(`面積`=starts_with("令和"))
area_data %<>% filter(!is.na(`市区町村`) & !str_detect(`市区町村`, "\\(") & !is.na(`標準地域コード`))
area_data %<>% select(-`標準地域コード`)
```

area_dataにはこのようなデータが入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171895/046798da-a789-5f0c-fb57-8d46c63df26d.png)

###都道府県別に集計する

```R
g1 <- area_data %>% group_nest(`都道府県`)
```

都道府県別にグループ化しています。説明があとになってしまいましたが、ここではRStudioを使っています。g1の表示です。各都道府県が1行になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171895/c59fbdd2-1e04-b639-ed62-14c170905cc2.png)
data列の表アイコンをクリックすると、その都道府県のデータが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171895/72bd222f-a0bc-e362-c46d-f7a5440b0efe.png)

data列のデータ全体は`g1$data`で表示されます。都道府県別に分割されたtibbleのリストです。group_splitと似た形式になっていますが、group_nestでは都道府県が抜けています。

今回は、市町村合併で減少しましたが「村」について集計して見ます。
まず、tibble(またはdata.frame)データから、村だけを取り出す関数を作ってみます。

```R
mura <- function(x){filter(x, str_ends(`市区町村`, "村"))}
```

「市区町村」で村で終わるものだけを取り出します。グループ化前のarea_dataデータを使って試してみます。
`mura(area_data)`
村だけが抽出されてることがわかります。
次にgroup_nestされたデータに適用してみます。上に示した`g1$data`出力を処理できるようにすると良いのですが、..
purrrにあるmapを使います。`map(g1$data, ~mura(.))`とすると村だけに絞り込まれたリストが返されます。

```R
g1 %<>% mutate(`村`=map(data, ~mura(.x)))
g11 <- g1 %>% unnest(`村`) # おまけ
```

これで「村」列に村だけに絞り込まれたデータが追加され、g11には展開されたデータが入ります。わざわざ関数を作らなくても、無名関数で

```R
g1 %<>% mutate(`村`=map(data, function(x){filter(x, str_ends(`市区町村`, "村"))}))
g1 %<>% mutate(`村`=map(data, ~filter(.x, str_ends(`市区町村`, "村"))))
```

のように書くこともできます。
次に、村の数と面積合計を集計してみます。

```R
g1 %<>% mutate(`村数`=map_int(`村`, nrow))
g1 %<>% mutate(`村面積合計`=map_dbl(`村`, ~sum(.x$`面積`)))
```

mapの中の関数をどう書いていいのかよく分からなくなってしまいます。その時は上に書いたように別に関数を作って確認しています。
ここではmapではなくmap_intやmap_dblとしています。mapだとリストを返し、そのままでは数値としての処理ができなくなってしまいます。(unnestを使えばできますが)数値ベクトルにしておく必要があります。

goup_nestだと表の中に全データが残っていますし、RStudioを使うとデータ構造がわかりやすく表示できますので便利です。
yaml

```py
import yaml

with open('config.yml', 'w') as yaml_file:
    yaml.dump({
        'web_server': {
            'host': '127.0.0.1',
            'port': 80
        },
        'db_server': {
            'host': '127.0.0.1',
            'port': 3306
        }
    }, yaml_file)

with open('config.yml', 'r') as yaml_file:
    data = yaml.load(yaml_file)
    print(data, type(data))
    print(data['web_server']['host'])
    print(data['web_server']['port'])
    print(data['db_server']['host'])
    print(data['db_server']['port'])
```
出力結果：

```txt
{'db_server': {'host': '127.0.0.1', 'port': 3306}, 'web_server': {'host': '127.0.0.1', 'port': 80}} <class 'dict'>
127.0.0.1
80
127.0.0.1
3306
```
Visual Studio Officeアドイン　配布方法

先日、Visual StudioでOfficeアドインを作成する方法について書いたのですが、アプリの配布方法について書いていなかったので、補足として記事を書こうと思います。
↓以前に書いたOfficeアドイン作成方法の記事のリンクです。
https://qiita.com/NagaJun/items/c7c6964a12a8a945726e
##インストーラーの作成
まず、配布したい作成済みのアドインのプロジェクトを開きます。
下記画面の様になるかと思いますので、プロジェクトを右クリックし、項目の中から「発行」を選択して押下してください。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/3860a24b-bda2-5394-2e46-0a978596a4b6.png)
下記の様なウィンドウが立ち上がるかと思いますので、それぞれの設定を行いながら、「次へ」を押下してください。
今回の例としては下記の様にしています。配布先はローカルに落とすので「CD-ROM/DVD-ROM」を選択します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/853f7368-72ec-9158-d4f2-d59691377f1e.png)
設定が終わり、「完了」を押下すると、Visual Studioのコマンドラインが走ります。
それが完了したらインストーラーの完成です。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/44edc328-a61a-3723-90ba-da37ca0c67aa.png)
今回の例の通りに行った場合、プロジェクトを右クリックして「エクスプローラーでフォルダーを開く」を押下すると、インストーラーが格納されたフォルダーを開くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/f7b9cc0d-4046-88d3-8bae-89c3ef59a6f2.png)
配布する場合は「公開」フォルダーをコピーすることで、他のユーザーでも今回作成したアドインを使用することができるようになります。
インストーラーは公開フォルダー下の「setup.exe」を実行することで起動することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/1ea38249-996a-64d0-aa3b-1700c552359a.png)
ちなみに、アドインの実行ファイルは「.vsto」ファイルがそれなので、今回の様にインストーラーを作成せずともプロジェクトフォルダー内の「bin\Debug」下に「.vsto」ファイルが作成されているので、「Debug」フォルダーを配布することでも他のPCで使用することはできます。
（この方法で配布する場合は「Debug」ではなく「Release」でビルドするのが一般的ですが）
また、インストーラーの細かい設定を行いたい場合は、プロジェクトの「プロパティ」を開いて、「公開」の項目を変更することで設定することができます。
##まとめ
今回は先日書いた記事の続きということで書かせていただきました。
この記事とは別に、近日中にOfficeアドインでイベントを処理する方法について書こうかと思います。
【Python】wikipediaのAPIを使ってデータ収集をしてみた

#はじめに
wikipediaのデータはローカルに大量にあるのでいらなかったのですが、少しだけデータが欲しいというときにwikipediaのAPIに出会ったのでその時の記録です。
#環境
動作可能OS(windowsでもmacでも動きます)
┗mac OS Catalina 10.15.7
┗Widows 10
Python 3.8.3
#インストール
これだけです。
pip install wikipedia
#wikipediaの要約部分を収集
検索ワードを入力するとその単語に関係する記事を勝手に検索してくれます。
**python3 wikipedia_data.py 検索ワード**
で実行できます。
実行結果、すなわちwikipdiaの記事データはwikipedia.txtに保存されます。

検索ワードに問題があるときは、
**wikipedia.exceptions.DisambiguationError: "検索ワード" may refer to:**
という文の後に、候補を提示してくれるので、そのワードで再検索するとうまくいきます。

稀に長文のエラーは出ることがありますが、APIの性質上、おそらく何らかの影響で通信にエラーが出てると思います。
なので、上記のエラー以外が出てても無視して、もう一度実行すれば成功すると思います。

```wikipedia_data.py
import sys
import wikipedia

# 言語を日本語に設定
wikipedia.set_lang("jp")
# テキストファイルを開く
f = open('wikipedia.txt', 'a')

args = sys.argv
word = args[1]
# 検索ワードを用いて検索
words = wikipedia.search(word)

if not words:
    print("一致なし")
else:
    #検索ワードがヒットすれば要約を取得
    line = str(wikipedia.summary(words[0]))
    f.write(word)
    f.write(line.rstrip())
    print("success!")

f.write("\n" + "EOS" + "\n")
f.close()
```
#wikipediaAPIの使用方法
英語の公式チュートリアル↓
https://wikipedia.readthedocs.io/en/latest/code.html

だけでは味気ないので、使いそうなものを簡単に抜粋して要約してみました。
(これだけわかれば十分だと思いますが、かなり端折った部分が多いので、使いこなしたいなら自分でチュートリアルを見てください)

<table>
<tr>
<td>メソッド</td>
<td>概要</td>
</tr>
<tr>
<td>wikipedia.search("検索ワード", results=10)</td>
<td>検索ワードに対する最大10までの検索結果をリストで返します</td>
</tr>
<tr>
<td>wikipedia.summary("検索ワード", sentences=0)</td>
<td>検索ワードに対する記事の要約文を取得します</td>
</tr>
<tr>
<td>wikipedia.page("検索ワード")</td>
<td>検索ワードに対する記事全体をオブジェクトとして取得します<br>生成したオブジェクトに.contentをつけると記事全体をテキストデータとして取得できます</td>
</tr>
</table>
#終わりに
今回もお疲れ様でした。
wikipediaのデータは大量になら簡単に手に入るけど、数十件など少しだけ欲しいときにはこの方法がいいかもしれませんね。
もし他になにか方法を知っている方がいればコメントで教えてください。
毎回思いつきで記事を書いてるので、次に何を書くかはわかりませんが、また何か書きます。
それでは。
JavaのGCの種類

JavaのGCの種別について調べる機会があったので、簡単にまとめてみた。

# ４種類のGC
以下の４種類のGCがある。

* シリアルGC
* パラレルGC
* コンカレント マーク＆スイープGC(CMS)
* ガベージファーストGC(G1GC)

## シリアルGC

シングルスレッドでマーク＆スイープとコンパクションを行う。
昔はこのシリアルGCがデフォルト、シングルコア環境で利用。

## パラレルGC

マルチコア環境ではデフォルト
マルチスレッドでマーク＆スイープとコンパクションを行う。

## コンカレント マーク＆スイープGC(CMS)

GCを二つのフェーズに分け、極力アプリケーションの停止を抑える方法

* アプリケーションと同時にGCを実行するフェーズ
* アプリケーションを止めてGCを実行するフェーズ

スレッド同士の協調処理などにCPUリソースを使うため、アプリケーションのスループット低下が見込まれるが、アプリケーション全体の停止時間が短くなる。その結果GCがレスポンスタイムに与える影響が小さくなる。

CPUの使用率が高い場合、性能が劣る場合がある。その際はパラレルGCを使う。

## ガベージファーストGC(G1GC)

ヒープを「リージョン」と呼ばれる小さい領域に分割して使用する。
レスポンスタイムの短縮が見込める。
Java7で追加

4G以上のメモリで最大限の性能が発揮されるように設計されているらしいが、メモリとはヒープメモリのこと？それともVMのメモリのこと？どっちだろう。

---

# GCの歴史

- Java6までのGC
シリアルGC、パラレルGC、CMSの３つ。結局フルGCでOLDとNEW領域両方を掃除するので、ヒープサイズが大きくなるとアプリケーションの停止時間が延びる。まーCMSは短くなるように頑張っているが・・
- Java8まではシリアルGC、パラレルGCがデフォルト
- Java9以降ではG1がデフォルト

# 使い分け

スループットとレスポンスタイムを考慮する。

- シリアルGC、パラレルGC（アプリケーション停止型）
    - シングルコア、マルチコアでのデフォルト（本当？）のGC
    - スループット重視、でもGCで止まる時間が長くなるのでレスポンスタイムの要件を満たせないことがある。
- CMS、G1GC（アプリケーションと並行でコンカレント処理型）
    - マルチコア環境において、パラレルGCではレスポンスタイムの要件が満たせない場合に選択
    - スループットが低下する恐れがある
VIMの設定

#VIMを使いやすいように設定してみる
ヘタレなので、キー移動にhjklとか覚えてられないので、矢印キーとBackSpaceキーを使えるようにしてみる。

##設定

```Bash:command
echo set nocompatible >> ~/.vimrc
echo set backspace=indent,eol,start >> ~/.vimrc
```

以上です。
configparser

```py
import configparser

config = configparser.ConfigParser()
config['DEFAULT'] = {
    'debug': True
}
config['web_server'] = {
    'host': '127.0.0.1',
    'port': 80
}
config['db_server'] = {
    'host': '127.0.0.1',
    'port': 3306
}
with open('config.ini', 'w') as config_file:
    config.write(config_file)
```
Linuxコマンドの便利ショートカットキー！！！

Linux勉強していますが、ショートカットキーである講師の方がまとめてくれたものがありますので、そちらを共有したいと思いました。

![スクリーンショット (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622352/451e5ee2-8613-daa3-09fd-8abe55499e01.png)
![スクリーンショット (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622352/e6a547a8-bd05-aca4-481d-089fd1a6faab.png)
![スクリーンショット (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622352/6224db45-38b0-2858-3799-5275cff29b18.png)
![スクリーンショット (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622352/03987c7b-f3fa-2541-0088-ba66c5a636be.png)

一つ申し訳ないのが、「OO人がここにメモしています」っていう文章が消えなかったです。

ブックマークにして必要な時に見返すことをお勧めします！

参考資料
https://www.udemy.com/course/unscared_linux/
sambaの設定

#Raspberry Pi 3 Model Bにsambaをインストールしてみる

##環境
- Raspberry Pi 3 Model B
- OS : Raspberry Pi OS (32bit)
    - Linux raspberrypi 5.4.51-v7+

##インストール
- コマンド

```Bash:command
# sambaのインストール
sudo apt-get install samba samba-common-bin
# sambaディレクトリの作成
sudo mkdir /var/samba
# sambaユーザの作成
sudo useradd smbuser
sudo passwd smbuser
# sambaディレクトリに権限付与
sudo chown smbuser:smbuser /var/samba/
# sambaユーザをデータベースに追加
sudo pdbedit -a smbuser
# smb.confの編集
sudo cp -p /etc/samba/smb.conf /etc/samba/smb.conf.org
sudo vi /etc/samba/smb.conf
```

```configuration:/etc/samba/smb.conf
[share]
   comment = Share Folder
   browseable = yes
   path = /var/samba
   writable = yes
   valid users = smbuser
   force user = smbuser
[pi]
   path = /home/pi
   read only = No
   guest ok = No
   force user = pi
```

あとは再起動すれば繋がります
【SpringBatch】Tasklet内部でトランザクション管理

# 概要

SpringBatchでTaskletを使ってトランザクション処理を書いていたのですが、
「あれ、commitされない…」という事象に当たったので解決方法を残しておきます

# 利用ライブラリ

- org.springframework.boot:spring-boot-starter-batch:2.3.5.RELEASE
- org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.3

# 問題のコード

サンプルですが、`@Transactional`を使ってトランザクション管理をしようとしています

```java:Sample.java
@Transactional(rollbackFor = Throwable.class)
public class Sample {
    // トランザクション処理を行うメソッド
    public doTransaction {
        // DBへのinsert, update, deleteなど
    }
}
```

期待としては`doTransaction`メソッド実行後にcommitが実行される
と思っていたのですが、実行されない…

# 解決方法

`@Transactional`で`propagation = Propagation.REQUIRES_NEW`を設定すればOK！

```java
@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRES_NEW)
```

デフォルトでは`Propagation.REQUIRED`が設定されているのですが、
これは

- トランザクションがすでに存在すれば、そのトランザクションを利用
    - 親のトランザクションが終了しないとcommitされない
- トランザクションが存在しなければ、新規に作成

という動作になる設定のようです。
（推測ですが）SpringBatchで生成した親トランザクションがいたので、そのトランザクションに吸収されていたようです。

`Propagation.REQUIRES_NEW`を指定すると、既存のトランザクションの有無によらず、
新しいトランザクションが生成されるようになります😊
amazon linux2(aws)にkube環境構築する手順～（おまけつき）

## 前提条件
・作りたてのamazon linux2(centos)


## 1.ec2にdocker環境構築まで
まずここを参考にamazon linux2 へdocker構築する。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html

```
インスタンスでインストールされているパッケージ更新
sudo yum update -y

yum install git-all
pip3 install boto3

yum -y install python3
pip3 install awscli --upgrade

sudo pip install --upgrade awscli --ignore-installed six

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install


最新の Docker Community Edition パッケージをインストールします。
#amazon linux2
sudo amazon-linux-extras install docker

#amazon linux
sudo yum install docker

#Docker サービスを開始します。
sudo service docker start

#ec2-user を docker グループに追加すると、sudo を使用せずに Docker コマンドを実行できます。

sudo usermod -a -G docker ec2-user
#ログアウトし、再びログインして、新しい docker グループアクセス権限を取得します。
#これは、現在の SSH ターミナルウィンドウを閉じて、新しいウィンドウでインスタンスに再接続することで達成できます。
#新しい SSH セッションには適切な docker グループ権限があります。

#ec2-user が sudo を使用せずに Docker コマンドを実行できることを確認します。

#docker環境が出来ているか確認
docker info
docker --version

```


## kubernetes環境構築まで

```
curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.9/2020-08-04/bin/linux/amd64/kubectl

chmod +x ./kubectl

sudo mv ./kubectl /usr/local/bin
mkdir -p $HOME/bin && mv ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin

echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile

kubectl version --short --client

aws eks describe-cluster --name eks-from-eksctl --region us-west-2

```

## kind cluster構築
本家の構築方法以下を参照
https://kind.sigs.k8s.io/docs/user/quick-start/

```
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.9.0/kind-linux-amd64
chmod +x ./kind
mv ./kind /some-dir-in-your-PATH/kind

```
【初心者向け】「Google Analytics 超入門&EC-CUBE最新情報！」 | EC-CUBE名古屋 vol.77

# 今回は文字が多いので Qiita スライドモードでお送りします

----

## 自己紹介

- 名前: 大河内健太郎(@nanasess) 年齢: 43才
- 出身: 愛知県西尾市一色町
- 在住: 大阪市(四天王寺の近く)
- 前職:寿司屋の板前
- 資格: 調理師・ふぐ処理師
- EC-CUBE コミッター・公式エバンジェリスト
- 最近のマイブーム: 腸炎

----

# Google Analytics 超入門

----

## Google Analytics = アクセス解析ツール

- 最近新バージョンがリリースされました
- 今日は新しいバージョンを交えつつ、みなさん慣れている旧バージョン中心にお話しします

----

# 何の目的でアクセス解析をしていますか？

----
## アクセス解析は手段であって、目的ではない

- 事実を知るための手段
- 事実を知って、改善につなげる

----

# (おまけ)アクセス集中の要因を探るテクニック

----
## 改善につなげるためには

- 解析結果から、「ユーザーの気持ち」を読みとる
- 優れたユーザー体験を提供できるよう改善する
- [「UI/UXデザインでサイトを改善しよう」EC-CUBE勉強会 vol.16](https://www.slideshare.net/nanasess/uiuxeccube-vol16-37610773) を復習しよう

----

# アクセス解析から、ストーリーボードとメンタルモデルを作ってみよう

----
## まとめ

- アクセス解析は事実を知る手段
- 何より改善することが重要
- ストーリーボードとメンタルモデルを作って改善点を考えよう

----

# EC-CUBE 最新情報

----
## EC-CUBE 最新情報

- [Grow with Google「はじめてのオンラインショップ 支援プログラム」](https://www.ec-cube.net/press/detail.php?press_id=258)
- [Google Site Kit 対応](https://www.ec-cube.net/products/detail.php?product_id=2158)
- [Google Merchant Center 連携](https://www.ec-cube.net/press/detail.php?press_id=260)
- [オリコと資本業務提携](https://www.ec-cube.net/press/detail.php?press_id=259)
- [2.17向けの決済モジュールも揃ってきました](https://www.ec-cube.net/products/list.php?mode=&category_id=3&maker_id=0&keywords=&ecversion_id=0&partner_id=0&orderby=date&ecversion=2.17&protype=all&disp_number=30&price_type=&product_type=&price_max=&price_min=&pageno=1&product_id=&classcategory_id1=&classcategory_id2=&product_class_id=&quantity=)

----

# 質疑応答

----
CSSでテーブルからはみ出した部分を省略する

## 実装例

テーブルからはみ出た部分を…で省略する方法です。
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="y_m_z_k" data-slug-hash="BazOmeY" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="BazOmeY">
  <span>See the Pen <a href="https://codepen.io/y_m_z_k/pen/BazOmeY">
  BazOmeY</a> by yamazaki (<a href="https://codepen.io/y_m_z_k">@y_m_z_k</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 詳細

HTMLは省略しますが、CSSの必要な部分だけ抜き出すとこのようになります。

```css
.my-table {
    width: 500px;
    table-layout: fixed;
}

.my-table * {
    width:100px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
```

### 手順
CSSで以下の2つの手順を適用する必要があります。
1. まずはテーブルの横幅を固定します。
2. 次にテーブルの幅からはみ出した部分を省略します。

#### 1.テーブルの横幅を固定
テーブルの横幅を500pxに固定してセルの横幅を100pxに固定しています。
この時table-layout: fixed;も設定しないと固定されないので注意が必要です。

#### 2.テーブルの幅からはみ出した部分を省略
固定したらセルの幅より文字が長い場合にセルから突き抜けてしまうので、
突き抜けた部分を非表示にして省略記号をつけます。
主にCSSのこの部分です。

```
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
```
## 最後に
こちらの記事でもう少し細かく説明しているので、気になった方はぜひ見に来てください！
https://masa-enjoy.com/css-table-design
Android StudioのADVmanager エラー対処 ”Unable to locate adb”

#概要
Flutter学習用に環境構築をしていたところ、ADVmanagerを起動すると**”Unable to locate adb”**がでてきてそこそこ時間を潰したので記録。
###バージョン
Android Studio ver4.1

##こんな人のため
- macも同時で環境をそろえていていたのでmacとwindowsユーザーどちらも同じ対応で直った。
- インストール手順方法や動画をみながら操作した直後の確認作業で起こったので意味不明の手探り状態からの人
- 似たような事象に、Platform-Toolsフォルダ内が破損等で起こった対処法はあったが、自分の環境は壊れていなかった。
- エラーがでていても、demoカウントプログラムはビルドして問題なく動くけど毎回エラー表示が気になる。

##解決方法
AndroidStudioのツールバーから、**Tools>SDKmanager**をクリックしてAndroid SDKの画面を出す。
**画面右側上部**にあるAndroid SDK Location: の行の、**Edit**を押す。
![sdk1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/809299/8602ba95-ccef-1537-4844-7e40b0aacbae.png)
SDK Components　Setup画面がでるが特に何も変更せず**Next**を押し、**Finish**が表示された押して完了。

ADVmanagerを起動するとエラー文も出てこないと思います。

##まとめ
学習を始めようとした矢先にコレだったので、出鼻をくじかれそうなほかの方の時間が少なくなれば幸いです。
HTTPSの圧倒的防御力(セキュリティ)をイラストで紹介します

## 前提知識:HTTPと通信プロトコルについて
HTTPとはホームページ(Webブラウザを起動して最初に表示されるページ)を見るときの使うルールの1つ。
ホームページのファイルとかを受け渡しするときに使うルールです。
これが俗にいう**通信プロトコル**です。○○通信をするときは××なルールに従ってやり取りしようねという事。プロトコルを日本人に例えると「会話する時は日本語使いましょう」みたいな感じ。いきなり宇宙語で話されても99%の人が理解できないですよね?会話1つとってもルールが自然と出来上がるものです。
![スクリーンショット 2020-11-02 23.06.28（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/dbe002cd-99df-93a3-ad2f-e2fe04f8a683.png)

## HTTPSとは?
HTTP over SSL/TLSの略。HTTPで送受信するデータを暗号化しましょうというルールを追加したもの。これにより悪い人にデータを見られても悪用されにくい

## HTTPSの3つのバリア
###盗聴防止
悪い人に通信のデータを見られてもデータを暗号化しているので比較的安心!
![スクリーンショット 2020-11-07 11.04.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/aebc2c13-b04b-3ff6-38b1-ec979b2d992e.png)



### 改ざん防止
個人情報のなどを勝手に変えられないようにメッセージダイジェストというのが存在します。これはあるデータを送信する時は下記の2つをwebサーバーに送ります。

①データ本体
②データの一部を切り取った値(ハッシュ値)

データの改ざんを行った場合、①が変更される。
受け取りのwebサーバーは①と②が違う!と判断してデータ改ざんされたと判明します。![スクリーンショット 2020-11-07 11.05.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/b2a1e6bc-ab5b-8304-cfea-ac9691d9a109.png)


### なりすまし防止
ドメイン(ネットの住所)の使用権があることを証明すること。 ドメインについてはこちらをご覧ください。 この通信先のサーバが正当な所有者のものであることを保証するものをSSLサーバ証明書といいます。ざっくりとした言い方をすると

>自分は怪しいものではないです。ほらこれが身分証(SSLサーバ証明書を見せる)

といった感じ。
![スクリーンショット 2020-11-07 11.05.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/f001d724-3d4e-3d14-0918-8821db9801bb.png)



## HTTPSのやり取り
Webブラウザとwebサーバーに置いていきなりHPPTSの通信が始まる訳ではない。
HTTPSの通信を開始するのに下記の4フェーズが存在します。

**1.暗号化の決定**
暗号化する方法は多数存在するのでwebブラウザとwebサーバーの両方が利用可能な暗号方式を決める。この段階では主に下記の2つを決めます。

- HTTPSで利用するSSLまたはTLS(インターネット上の通信を暗号化する仕組み)を決める
- バージョンや改ざん防止に利用されるメッセージダイジェスト(データの一部)の方式を決める

**2.本人確認**
webブラウザが見ようとしているページのwebサーバー(相手)が本当に正しい存在なのか確認するフェイズ。
証明方法はSSLサーバー証明書により確認。正しい存在か確認できない場合はwebブラウザに警告表示されます。

**3.鍵の交換**
WebサーバからSSLサーバー証明書を受け取ったwebブラウザは、自分のやり取りしているサーバが本物を確認します。確認して本物だった場合それぞれを暗号化します。そしてそれが暗号化してる限り誰も読めません。
Webサーバとwebブラウザはデータを暗号化したり解除したりする鍵を持っているのでそれを交換します。そうするとお互いは相手のデータを暗号を解いたり、再び暗号化できるようになります。

**4.最終確認**
お互いに暗号の方法に問題ないか確認します。これでOKならHTTPSによる暗号化通信が始まります。
![スクリーンショット 2020-11-07 11.10.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/c88cb09a-328a-cddf-854c-4bc15a2f47b5.png)
JavaScriptオブジェクト

### 配列
```
末尾に要素を追加→push()
末尾の要素を削除→pop()
先頭に要素を追加→unshift()
先頭の要素を削除→shift()
a.splice(変化が開始する位置,削除数)
splice(変化が開始する位置,削除数,追加する要素)
```

### スプレッド構文
```
const otherScore = [10,20];
const scores = [20,40,30, otherScore];
```
では、配列の中に配列ができてしまう。


```
const otherScore = [10,20];
const scores = [20,40,30, ...otherScore];
```
スプレット構文を使うことで
[20,40,30,10,20]という配列ができる。

### forEach
```
  const scores = [80,90,40,70];

  scores.forEach((score,index)=>{
    console.log(`Score${index}:${score}`);
  });
```

### map

```
  const prices = [180,190,200];
  
  const updatedPrices=scores.map((price) => {
    return price + 20;
  });
  console.log(updatedPrices)
  
  20ずつ増えた配列が表示される
```

### filter

```  
const numbers = [1,4,5,8,10];


  const evenNumbers = numbers.filter((number)=>{
    if(number % 2 === 0){
      return true;
    }else{
      return false;
    }

  });
  console.log(evenNumbers);
}
偶数のみ別の配列で抽出される


↓　省略

const evenNumbers = numbers.filter(number => % 2 === 0);

console.log(evenNumbers);


```

### object

```
{
  const point ={
    x: 100,
    y: 180,
  };

  const keys = Object.keys(point);
  keys.forEach(key =>{
    console.log(`Key: ${key} Value: ${point[key]}`);
  });
  
  Key:x Value: 100
  Key:y Value: 180
  が表示される

  const points =[
    {x: 30, y:20},
    {x: 10, y:50},
    {x: 40, y:40},
  ];

  console.log(points[1].y);
  50が表示される

}
```

### 変数の挙動
```
  let x = [1,2];
  let y = x;
  x[0] = 5;
  console.log(x);//[5,2]
  console.log(y);//[5,2]
  場所が保存されるので同じになる
  
  let x = [1,2];
  let y = [...x];
  x[0] = 5;
  console.log(x);//[5,2]
  console.log(y);//[1,2]
  スプレッド演算子を使うとxの値が展開され値そのものが代入される
```

### 文字列

```
 const str = 'hello';

 console.log(str.length);
 5

 console.log(str.substring(2,4));
 ll

 console.log(str[1]);
 e
```

### join(配列の要素を文字列として結合)

```
  const d = [2019,11,14];

  console.log(d.join('/'));
  2019/11/14と表示される
```

### split(文字列を分割し配列にする)

```
  const t = '17:08:24';
  console.log(t.split(':'));
  ["17","08","24"]となる

  const [hour,minute,second] = t.split(':');
  console.log(hour);
  17
  console.log(minute);
  08
  console.log(second);
  24
```
プログラマーの仕事一般のWBS

- 準備
   - 来週行う作業の完了定義は何か確認
   - 来週行う作業に必要な準備ができているか確認
- コードを書く
   - 仕様の把握
      - 資料を読む
         - 資料の場所の把握
         - 資料の意義の把握
      - 既存のコードを読む
         - コードのどこを読んだら良いか把握 参考：[コードの読み方](https://qiita.com/satoru_pripara/items/ab747013a8d37ecc3f5d)
      - 人に聞く
         - 誰に聞いたら良いか（いわゆるコミュニケーションパス）の把握 
- 書いたものの動作の確認
   - 動作確認の方法を確立
- 出来上がったもののデリバリ
   - CI/CDの設定
      - CI/CDの把握・作成 
   - 他の人（PMなど）に成果物を見てもらって、バグ・違和感がないかチェックする
   - 確認事項があることが判明したら確認する。
- 進め方の改善
- 手が空いた際の報告
   - 慢性的に手が空くようであれば、自分のスキルが上がってきたということであるので、もう少し難易度が高く自分の役割を広げられそうなタスクがないか尋ねる。
【Arduino IDE】 書き込み時のエラーいろいろ

Arduino IDE 書き込み時にハマったエラーの解決策を備忘録を兼ねて投稿します。

###error: stray


```
error: stray '\343' in program
error: stray '\200' in program
```

全角空白や無効な文字があったときのエラーなので、修正したらエラーが出なくなりました。


<BR>

###スケッチが大きすぎます

```
最大327680バイトのRAMのうち、グローバル変数が59500バイト（18%）を使っていて、ローカル変数で268180バイト使うことができます。
スケッチが大きすぎます。http://www.arduino.cc/en/Guide/Troubleshooting#size には、小さくするコツが書いてあります。
ボードM5Stack-Core-ESP32に対するコンパイル時にエラーが発生しました。
```


ツール > Patition Scheme:"No OTA(Large APP)"

にしたら直りました。


参考URL
https://qiita.com/TwDaiki/items/e8661b35eccc0c227504

<BR>

###そのポートは存在しないか、ボードが接続されていません。

```
serial.serialutil.SerialException: could not open port 'COM4': WindowsError(2, '\x8ew\x92\xe8\x82\xb3\x82\xea\x82\xbd\x83t\x83@\x83C\x83\x8b\x82\xaa\x8c\xa9\x82\xc2\x82\xa9\x82\xe8\x82\xdc\x82\xb9\x82\xf1\x81B')
Failed to execute script esptool
シリアルポート「Failed to execute script esptool」が選択されていますが、
そのポートは存在しないか、ボードが接続されていません。
```

以下のどれかで直りました。

・シリアルポートをちゃんと選択する。
・シリアルモニタを開いてたら閉じる。
・他のArduinoのファイルを開いてたら閉じる。

<br>

###【M5Stack】スケッチの書き込み中にエラーが発生しました

```
Connecting........_____....._____....._____....._____....._____....._____.....____
スケッチの書き込み中にエラーが発生しました

A fatal error occurred: Failed to connect to ESP32: 
Timed out waiting for packet header
```

USB Type-C　を上下逆に差し替えたら直りました。


<br>
「[Windows] そのexeがx64かx86かを見分ける方法 Part2」をmacOSのGoで確認

何気に遥佐保さんのブログ記事「[[Windows] そのexeがx64かx86かを見分ける方法 Part2](http://h-sao.com/blog/2020/11/07/how-to-check-x64-or-x86-windows-binary-part2/)」をGoで確認してみました。

Goはクロスコンパイルができますからね。ブログ記事投稿のツイートから20分ほどで確認できました。

１．x64(amd64)用とx32(386)用のGoのソースコードを書く。（違いは出力メッセージのみ）

```
$ cat main64.go 
```
```Go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("GOOS=windows GOARCH=amd64")
}
```
```
$ cat main32.go 
```
```Go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("GOOS=windows GOARCH=386")
}
```

２．macOS上でGoのソースコードをx64(amd64)とx32(386)でコンパイル。

```
$ GOOS=windows GOARCH=amd64 go build -o main64.exe main64.go 
$ GOOS=windows GOARCH=386 go build -o main32.exe main32.go
```

３．ファイルの生成を確認。

```
$ ls main*
main32.exe main32.go  main64.exe main64.go
```

４．fileコマンドで確認。

```
$ file main32.exe 
main32.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows
$ file main64.exe
main64.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
```

やったね！q@w@p
【Rails】多対多 の関連付けで、中間テーブルに複数レコードを登録する方法

# 実装したい機能
多対多のモデル関係で、チェックボックスで、選択した値を複数、中間テーブルに登録させたい。
実装する際に、かなりハマってしまったので備忘録として残しておく。


## 環境
`Rails 5.2`
`Ruby 2.5.1`
`MacOSX`


## モデル関係
- プロジェクトモデル

```Ruby
class Project < ApplicationRecord
  has_many :project_phases, dependent: :destroy
  has_many :mst_phases, through: :project_phases
end
```
- プロジェクト工程

```Ruby
class ProjectPhase < ApplicationRecord
  belongs_to :project
  belongs_to :mst_phase
end

```

- 工程マスタ

```Ruby
class MstPhase < ApplicationRecord
  has_many :project_phases
end
```
工程に関しては、マスタテーブルで、projectモデル側を参照させないため`project_phase` モデルのみを関連付けしています。

## View

```Ruby
<%= form_with model: @project, local: true do |f| %>
  <label>プロジェクト名</label>
  <%= f.text_field :project_name %>

  <label>プロジェクト工程</label>
  <%= f.collection_check_boxes :mst_phase_ids, MstPhase.all, :id, :phase %>
<% end %>

```

## Controller

```Ruby
class ProjectsController < ApplicationController

  def new
    @project = Project.new
    @project.project_phases.build
  end

  def create
    @project = Project.new(projects_params)
    
    if @project.save
      redirect_to project_path @project
    else
      render action: 'new'
    end
  end

  private
  def projects_params
    params.require(:project).permit( :project_name, mst_phase_ids: [])
  end
end

```
ポイントは`StrongParameter`で`has_many`関係にあるモデルを配列で受け取るように設定すること。

パラメータの名称は以下の要領で記載するとよい。

```Ruby
モデル名_ids
```

配列で受け取ったパラメータに対して特に特別なロジック等は実装する必要がないため、配列の要素数分、レコードをテーブルに登録してくれる。
Rails便利。。。。。
Unity Hub から Unity は起動するが、途中で落ちて Unity プロジェクトが開けない

昨日まで何食わぬ顔していた Unity が開けなくなった話。

## TL;DR
Unity のライセンスが MACアドレスと紐づいているので、
ネットワークアダプタを無効化するとライセンス認証が正常に通らず、プロジェクトが開けなくなる。

## 前提
* Windows10
* Unity 2019.2.19
* 使えるネットワークアダプタ複数

## 現象
* Unity Hub から Unity は起動する
* Unity プロジェクトを開いている途中で落ちてしまう

## 解決方法
無効になっているネットワークアダプタを有効にする。

## 詳細
プロジェクトが開けないので、なんだろうと思っていてぶつかった記事がこれ。

[Unity Hubでプロジェクトを開けない](https://tadtadya.com/unity-hub-can-not-open-project/)

これを読んではっとしたのが、オンボードの無線LANを無効にしたことでした。
オンボードの無線LANが弱いので、USBの無線LAN用の子機を付けて、ネットワークの改善をしたところだったのです。

この記事ではライセンス登録は有線LANとなっていますが、有線無線関係なく、
ライセンス登録時に使っていた機器が対象となっているようです。
無効にしていたオンボードの無線LANを有効にしたら無事に開くようになりました。

Unity ライセンスとMACアドレスが紐づいていることを知らないとはまりますね。
【JavaScript】モーダル・グロナビを開いている時のスクロールを禁止する

## 概要
モーダルなどを開いているときには、裏のコンテンツはスクロール禁止にした方がUX的に良いと思います。

iOSのせいで`overflow:hidden`だけではきかないので、jsで実装していきます。
jsでcss（positionとtopのみ）を操作するので、cssファイルを編集する必要はありません。

* 開く
* 閉じる
* toggle

## 開く
1. bodyに`top:スクロールY`と`posiiton:fixed`を付与（posiiton:fixedを付けた時点でスクロール量0）になるので、fixedより先に

```javascript
//裏のスクロール禁止
const noScrollAdd = () => {
    const body = document.body;
    body.classList.add("noscroll");
    // モーダルが開いたら、bodyにfixedを付与
    let scrollY =
        window.scrollY ||
        document.documentElement.scrollTop ||
        body.scrollTop;
    body.style.top = "-" + scrollY + "px";
    body.style.position = "fixed";
};
noScrollAdd();
```

## 閉じる

1. topの値を変数に保管しておく（position空にする前）
2. bodyのposition,topを空に
3. topの変数をWindow.scrollTo()に入れる

```javascript
//裏のスクロールできるように
const noScrollRemove = () => {
    const body = document.body;
    // レイヤーが閉じたら、topをscrollTopに
    let top = body.style.top;
    body.style.position = "";
    body.style.top = "";
    window.scrollTo(0, parseInt(top || "0") * -1);
    body.classList.remove("noscroll");
};
noScrollRemove();
```

## toggle
```javascript
//スクロール禁止
const noScrollToggle = () => {
  const body = document.body;
  if (body.classList.contains('noscroll')) {
    // レイヤーが閉じたら、topをscrollTopに
    let top = body.style.top;
    body.style.position = '';
    body.style.top = '';
    window.scrollTo(0, parseInt(top || '0') * -1);
    body.classList.remove('noscroll');
  } else {
    body.classList.add('noscroll');
    // モーダルが開いたら、bodyにfixedを付与
    let scrollY = window.scrollY || document.documentElement.scrollTop || body.scrollTop;
    body.style.top = '-' + scrollY + 'px';
    body.style.position = 'fixed';
  }
}
noScrollToggle();
```

## cssの崩れ防止
`body`を`position:fixed;`すると、100%以上に拡大することがあるので、`width:100%;`にしておきましょう。

```css
body {
    width:100%;
}
```
【 Kendo UI 】gridの変更を反映したい。

画面イベントによるデータの変更などでgridのヘッダ項目を変えたい場合があると思います。
嵌らない人もいらっしゃると思いますが、その対策を紹介します。

cmtフィールドの見出しを変えたい状況です。以下のコードだと反映されません。

```javascript:javascriptWithJquery

      var cmtField = {field: "cmt", title: "コメント", width: "50px"};
      if (needsChange) {
        cmtField = {field: "cmt", title: "振替先ユニット", width: "50px"};
      }

     var grid = $("#hoge").kendoGrid({
        dataSource: $scope.dataSource,
        scrollable: false,
        editable: true,
        columns: [
          {field: "cd", title: "コード", width: "80px"},
          {field: "cd_nm", title: "コード名", width: "150px"},
          cmtField,
          {field: "ord", title: "表示順序", width: "80px"},
          }
        ]
      });
```

`setOptions`を実行することで再描画してくれるようになります。

```javascript:javascriptWithJquery
      var cmtField = {field: "cmt", title: "コメント", width: "50px"};
      if ($scope.grp_cd) {
        cmtField = {field: "cmt", title: "振替先ユニット", width: "50px"};
      }

     var grid = $("#hoge").kendoGrid({
        dataSource: $scope.dataSource,
        scrollable: false,
        editable: true,
        columns: [
          {field: "cd", title: "コード", width: "80px"},
          {field: "cd_nm", title: "コード名", width: "150px"},
          cmtField,
          {field: "ord", title: "表示順序", width: "80px"},
          }
        ]
      });
      grid.data("kendoGrid").setOptions({});
```

`Dart`の`setState`とかと同じですね。
Scrum Fest Sapporo Day 2 参加レポート「遠くにいるチームメンバーと、空間を超えて会える場を作った話」

# Scrum Fest Sapporo Day 2 「遠くにいるチームメンバーと、空間を超えて会える場を作った話」

2020/11/07に開催されたScrum Fest Sapporoの発表です。
https://confengine.com/scrum-fest-sapporo-2020/proposal/14193

# チーム参加してきました

[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html) のチーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu?slide=3)」にて参加してきました。
チーム7人中、3人で参加して、その場で実況しつつ、記事も作っています。

# バーチャルワークプレイスの話

遠くにいてもメンバーがそこにいるかのように働ける。
ヘッドマウントディスプレイとコントローラーを使って、バーチャル上で人に会える。
フルリモートでやって、壁にいっぱい付箋を貼って、みたいなのをやりたかったが、Miroとかを使ってもふべｎ不便だった。
自分たちで作り始めた。

# バーチャルワークプレイスについて

[紹介動画はこちら](https://www.facebook.com/ricoh.jp/videos/808565413001238/)
パソコンを使ったり、空間ディスプレイをやったり。
VRの中でPCの資料やアプリを使える。空間の保存・復元が出来るので、前回の続きから再開もできる。


# 今日伝えたいこと

**未来は僕らの手の中**

- 企業のSEでも事業が立ち上げで来たということと、そこの学び
- バーチャルの可能性と、未来の働き方を知るきっかけになってほしい。

# 経歴

- 2003 / 入社。ガチガチのWFプロジェクト。
- 2009～ / サービス開発
	- 全天球（天体）アプリをOculus Riftで作った。
	- 未来を感じた。**人生をかけてそのプロダクトにはまっていくことになる**
	- Global Game Jam（72時間でゲームを作る）など、社内→社外イベントで色々やってきた。

# VRの事例

- 大きい機器を展示会場に持っていけないので、VRで見学できる
- 工場見学ができる
- イベントによるブランドプロモーション

# VR事業へ

VRで、リアルよりも便利に働ける世界へ

- "働く"の痛みをなくし
- "働く"の喜びを高める

# 好きなことを事業にしていくやり方は？

**JUST DO IT!**

社内で勉強していてもチャンスがなければ何もなかったはず。
運もあるかもしれないけれど、会社をやめてもどこかでできるような技術ができていれば大丈夫

# バーチャルの可能性、未来の働き方

バーチャル＝実質。実質現実。
フルデジタルの現実。
デジタルで出来ることが現実で出来る
ノーコストtで、複製や保存、圧縮などできる。
空間を超えてコミュニケーション、保存ができるのでタイムシフトして体験できる。ハプティクスで感覚も体験できる。
こういう捉え方をすると様々なことができるように思えてくる。

# チームビジョン

- バーチャルでリアルよりも便利に働ける世界へ
- 3つの変革
	- Commuication
	- Information
	- Automation

# チーム

１週間のイテレーション
水曜日にビジネスサイドも交えた全体定例、金曜日に開発定例
全体定例も全員VR！
フィードバックループが早い。
自分たちの働く環境を自分たちで便利にしていっている。←ここが面白い

バーチャル空間では参加者の顔の向きとかが表示されていて、どっちを向いているかなどがわかる。

# 活用シーン

- 会議・コミュニケーション
	- 機器コストがかかる
	- 将来的に機器が小さくなるなどで活用が進むと考えている
- 建設分野での活用

# 建築向けの動画

建築物の実寸台オブジェクトと、ミニチュアのオブジェクトを用意。
ミニチュアオブジェクトを使いながらその日の作業のブリーフィングをしてから、実寸台のオブジェクトを使って詳細を会話していく。
距離の計測機能も実装。


# 建築の話

設計の段階からプログラマーが入っていって、デジタルなデータを使いながら検討をすすめる。
アーキテクチャー⇔ソフトウェア


# [ケビンリンチ](https://ja.wikipedia.org/wiki/%E3%82%B1%E3%83%B4%E3%82%A3%E3%83%B3%E3%83%BB%E3%83%AA%E3%83%B3%E3%83%81)

アレグザンダーの師匠
要素をどう見つけるか。という観点を持っていた人。


# 本日話さなかったこと
- 3Dエンジン、VR開発の学習ステップ
- 社内での新しいことの始め方、広げ方
等々


# まとめ
VRで、リアルよりも便利に働ける世界へ
フルデジタルの現実だと思うとより想像が広がる

# 感想

（チーム全員の感想です）

- 明るい未来が来るなと感じました。実現可能な近未来で、使ってみたい！と思える内容でした。
- VRってあまり今までかかわりがなかったから、仕事で使うにはまだまだかと思っていたけど、もう現実世界でも実用可能なレベルまで近づいてきてるんだなーと思ってすごくわくわくしました。
- 未来感のある話で興味深かった。VRで働き方を変えてくれることに期待。なにより楽しく活動しているのが伝わってきました。
ユーザー新規登録時に、ActiveRecord::NotNullViolation というエラーが出たのとそれに対処した話。

## ユーザー新規登録におけるエラー

ユーザー管理機能を実装中に下記のエラーが出ました。
![151aa02ffd6f364ebe9ba332e3ba4fde.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665867/23abb1f1-b63c-1bc8-27bd-c7eb4ddb3393.png)

#### 白抜きのエラーについて

```
ActiveRecord::NotNullViolation in Devise::RegistrationsController#create
```

参考のサイトで調べてみると

```
「このエラーはDB制約上、NULL にしてはいけない項目が NULL のまま保存が実行されたことによるエラー」
```
とありました。
#### 確認したこと
##### ①マイグレーションファイル
上記の画像エラー文に

```
Mysql2::Error: Field 'prefecture_address' doesn't have a default value
```
とあったため、これを確認するためにマイグレーションファイルを確認しました。
画像をご覧ください。
![2d3be4158c0f509fdaaba70a1ae46896.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665867/319387f3-ea87-446a-adbe-338094eb6d20.png)

マイグレーションファイルでそのように設定しているのでここは特に問題なさそうです。
##### ②コントローラー
マイグレーションファイルで設定しているのなら、受け手が受けてないのではないかと思い、次はコントローラーを確認します。
![controller.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665867/f29d6b4a-5028-d5e5-e502-6a7762020ab6.png)
こちらもマイグレーションファイルで指定した通りのカラム名になっていました。

##### ③ビュー
マイグレーション、コントローラーできたのでビューを確認してみようかなとなりました。(ここで若干焦り出します。)
ビューの画像が下記の通りです。![5bf9c8d818125e51fd7a384acda259f7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665867/9083fbfd-2a4b-add1-404c-9872f158aff0.png)
わかりましたでしょうか…
マイグレーションファイル、コントローラーではprefecture_addressとなっていたのが、ビューファイルではprefecuture_addressとなっていたのです。

#### コードの修正
ビューの修正を終えて新規登録を行ったところ無事登録ができておりました。

## 最後に
基本的にエラーが出たときにNoRouteMatches程度で焦る筆者(一応NoRouteMatchesは克服したつもり)ですので、今までみたことのないエラーが出たときは「ああ…終わった…」と思いました。今回の場合sourceのコードがどこのファイルのことを指しているのかがわからなかったので焦りようは半端なかったです。

エラーを調べてみて、サイトでヒットしたのは幸運でした。
これを機会にエラー耐性をつけていこうと思います。
失礼します。

## 参考文献
【teratail】
devise機能を導入してログイン・新規作成時のエラー
https://teratail.com/questions/235508
【Vue】v-on:submitに.preventをつける理由

todoリストを例に説明していきます。

inputの値を取得して、submitイベントでtodoリストに追加していくというものです。
※todoリストに追加していくロジックは今回関係ないので省略します。

```vue
<form @submit.prevent="addTodo">
  <input type="text" ref="comment">
  <button type="submit">追加<button>
</form>
```

入力・追加のコンポーネントを作っているときに、2点の疑問が起こりました。

- submitイベントが`<button>`ではなく、`<form>`についているのはなぜか
- submitにpreventを付ける必要があるのか

## submitイベントが`<button>`ではなく、`<form>`についているのはなぜか

vue以前の理解不足でしたが、submitイベントは`<button>`や`<input type="submit">`ではなく、`<form>`で発生するものでした。

>submit イベントは `<form>` 要素自身で発生するものであり、その中の `<button>` や `<input type="submit">` で発生するものではないことに注意してください。

>submit イベントは、ユーザーが送信ボタン (`<button>` または `<input type="submit">`) を押したり、 Enter キーをフォーム内のフィールド (例えば `<input type="text">`) の編集中に押したりしたときに発生します。このイベントは `form.submit()` メソッドを呼び出した場合には送信されません。

https://developer.mozilla.org/ja/docs/Web/API/HTMLFormElement/submit_event

## submitにpreventを付ける必要があるのか

submitイベントが本来、action属性での画面遷移を想定しているので、意図しない画面遷移を避けるためにpreventを使います。

todoアプリではsubmitしたときに画面遷移を意図しているわけではないので、preventを付けるということでした。
回帰モデルの残差二乗和

回帰モデルで扱われる残差二乗和(誤差)の式の備忘録メモ

# 線形回帰の残差二乗和

```math
\sum_{i=1}^{n} (y_i - \hat{y}_i)^2
```

# ラッソ回帰の残差二乗和

```math
\sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \alpha \sum_{k=1}^{d} |\omega_k|
```

$$\alpha: 正則化項, \sum_{k=1}^{d} |\omega_k|: 切片以外の全てのパラメータの絶対値の和$$

## scikit-learnの場合
scikit-learnでは以下の式が残差二乗和として用いられている。

```math
\sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + 2 \cdot n \cdot \alpha \sum_{k=1}^{d} |\omega_k|
```

# リッジ回帰の残差二乗和

```math
\sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \alpha \sum_{k=1}^{d} |\omega_k|^2
```

$$\alpha: 正則化項, \sum_{k=1}^{d} |\omega_k|: 切片以外の全てのパラメータの絶対値の二乗の和$$

# Reference
* [Pythonと実データで遊んで学ぶ データ分析講座](https://www.amazon.co.jp/dp/B07VRZRR1G/)
【Swift】Tab Bar Controller のBar Itemの順番を入れ替える方法【初心者】

#はじめに
Tab Bar Controllerの Bar Itemの移動方法がわからなかったので調べました。
メモとして記事に残しておこうと思います。

#Tab Bar ControllerをView Contorllerに繋ぐ
Bar Itemはsegueを繋いだ順に左から①②③と並びます。
![スクリーンショット 2020-11-06 18.13.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683624/7acf952a-9010-3ca7-9c62-73e5e1326503.png)
この時に、本当は①③②の順番に並べたかったとします。

#間違えた順番のBar Itemの並び順の図
![スクリーンショット 2020-11-06 18.10.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683624/3613c49e-325c-10a3-e31e-47fce6c29ffa.png)
#Bar Itemの移動方法
Bar Itemをドラッグして移動するだけで、位置を入れ替える事ができます。
![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683624/424127a7-bd4d-7427-8968-b11e19c15190.gif)



#正しい順番のBar Itemの並び順の図
Bar Itemが①②③→①③②に並び順が変わりました。
![スクリーンショット 2020-11-06 18.24.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683624/1547f51f-e5dc-5ed2-3455-c98927ebbe22.png)

#終わりに
初学者のため、もし間違いがあれば教えていただければ幸いです。

#参考サイト
https://tsurunaga.hateblo.jp/entry/20120308/1331171469
【JavaScript】配列とオブジェクトの使い分けをざっくりと

#プログラミング勉強日記
2020年11月7日
配列とオブジェクトの使い分けについてざっくりとメモる


#配列を使う時
* やることリストのようにデータを縦方向に並べたい時
* データを数字で整理したいとき
* 都道府県名、持ち物リスト、学校のクラス名簿など


#オブジェクトを使う時
* 横方向にデータを並べたい時
* ゲームのハイスコアデータ、PCやスマホのスペック、ある商品の価格と在庫数

#課題
* 縦横に広がる場合は、どうするのか？
* まだまだ理解できていないため、今後、学習していく中でわかってきたら記事を更新する。


#参考資料
[確かな力が身につくJavaScript「超」入門 (確かな力が身につく「超」入門シリーズ) ](https://www.amazon.co.jp/%E7%A2%BA%E3%81%8B%E3%81%AA%E5%8A%9B%E3%81%8C%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8FJavaScript%E3%80%8C%E8%B6%85%E3%80%8D%E5%85%A5%E9%96%80-%E7%A2%BA%E3%81%8B%E3%81%AA%E5%8A%9B%E3%81%8C%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F%E3%80%8C%E8%B6%85%E3%80%8D%E5%85%A5%E9%96%80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E7%8B%A9%E9%87%8E-%E7%A5%90%E6%9D%B1-ebook/dp/B017AP49IQ/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2OXHHN5YX0WWA&dchild=1&keywords=javascript&sprefix=java%2Caps%2C275&sr=8-5)
Photoshopで簡単なアニメーション

#簡単なアニメーション
Photoshopの　ウインドウ＞タイムライン　で簡単なアニメーションができます。
![スクリーンショット 2020-11-07 10.04.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633943/0b4d6bad-d4b7-f8d0-b1d1-e3ab2c09cd16.png)