OmniAICreator/Qiita-1.07M huggingface dataset:
どうも、GVim大好きマンです。

## 皆さん、こんにちは。  
GVim大好きマンです。

## 突然ですが
僕の好きなエディタ、なんだか分かりますか？  
分かったら凄いですよ～

### [VSCode](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)？
たしかに優秀なエディタですし、使わないわけではありません。  
しかし、なんか合わないんですよねぇ...  
いろいろ機能があって、シンプルさに欠けるというか...  
サブとして使ってます。  

### [Atom](https://atom.io/)？
結構便利ですけど、いかんせん重い...  
PCはロースぺではないんですが、やっぱり軽いほうがいいですよね。  

### [Sublime Text](https://www.sublimetext.com/)？
Sublime Text、コイツは僕にとって特別なエディタです。  
一番はじめに触ったエディタなんです。  
まぁでも乗り換えました。  
「買え」ってうるさいですからね。  

### [Emacs](https://www.gnu.org/software/emacs/)？
あんまりその名前を出さないでもらえますか？  

### [Vim](https://www.vim.org/)かぁ～
限りなく近いですが微妙に違います。  
CUI操作、普段使いなら不必要な気がするんですよねぇ。  
***分かった人もいるんじゃないですか？***

## 正解は～
GVimでした～！  
え？  
最初から分かってた？  
まったまた～  
分かるわけないじゃないですかやだー。  

## それは置いといて
なぜ僕が、Vimmer、それもGVimmerなのか。  
GVimの魅力を解説していきたいと思います。  

### なぜVimか
#### シンプルな機能
Vimはとにかく標準の機能がシンプルです。  
おそらくメモ帳以下かもしれません。  

しかし、自分で設定ファイル（vimrc）を書き、プラグインをインストールしたら、  
あら不思議、最低限だが十分な機能を持つ、  
あなただけのテキストエディタの出来上がり！  

#### めちゃんこ軽い
めっちゃ軽いですこのエディタ。  
IDEの重さにイラついてる人見ると、  
「同じレベルの機能性で、めっちゃ軽いエディタあるのになぁ...」  
って思います。

#### 完全無料
コレ結構デカいです。  
Sublimeも、RubyMineも、コレで諦めましたからね。  

#### キーバインドがVimじゃないと無理
依存症です。

### なぜGvimか
「じゃあCUI版で良くね？」  
いや、GUI版の方がいいです！  
#### 操作が楽
僕が惚れたのは、キーバインドであり、CUI操作ではないんです。  
ファイルいじるときはマウスでポチポチ、  
コーディングモード入ったら、キーボードから手を離さない。  
これぞ最強の操作です。

#### 見た目設定できる
フォントとか、カラースキームとか、そーゆーのです。  
僕、形から入る人なんで。  

# みたいな感じです。
偉そうに語ってますが、  
正直、まだ全然GVim使いこなせてないです。  
修行、頑張らねば。

# 最後に
僕にGVimを与えてくださった「師匠」（学校の先輩です）に、  
そして最後まで読んでくださった、あなたに、  
感謝を申し上げます。  

ありがとうございました！  
これからもよろしくお願いします！
[Elixir] GenServerのCallとCast

この記事は [Elixir その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir2) 15日目です。

前日は、「[[Elixir] "Hello"と'Hello'](https://qiita.com/mnishiguchi/private/47e1da86b975dc7f5f7e)」でした。

本日もGenServer関連の話題です。`cast`と`call`についてのベストプラクティスについて考えたかったので、これをテーマにメモにまとめまることにしました。

## はじめに

GenServerの`cast`と`call`の使い分けは、Elixirを覚えたての頃は単純に思えました。結果を気にしないのであれば、`cast`って感じで。
しかしながら、実際はそんな単純な話ではありません。`cast`には投げた処理が成功したのかどうかがわからないという不安な要素があり、それで本当に良いのかきっちり考慮したいです。

結果がわからない |> 整合性に問題がでてくるかも |> ???

この件について、個人的に[Elixir in Action](https://www.manning.com/books/elixir-in-action-second-edition)の著者[Saša Jurić](https://www.theerlangelist.com/)さんのアドバイスがわかりやすく気に入ってます。

## Saša Jurićさんのアドバイス

第７章や１１章でガイドラインを提示されてます。

- 迷ったら`call`を使用する。そうすることによりシステム整合性が促進される。（簡単に整合性促進）
- パフォーマンスに問題が出てきたときに必要であれば、後日簡単にcastに変更できる。（整合性を犠牲にパフォーマンス促進）
- 処理の負荷が大きい場合、キュープロセス（中間プロセス）を用意し、そこから結果についての通知を２回（受付、完了）受けるようにすることもできる。(整合性とパフォーマンスの両立)
- 自前で中間プロセスを立ててもよいが、複雑なシステムの場合[GenStage](https://hexdocs.pm/gen_stage/GenStage.html)が便利。

詳しくは[Elixir in Action](https://www.manning.com/books/elixir-in-action-second-edition)を御覧ください。

## `call` - 「ブロックする」リクエスト

### 長所

- 整合性を促進
- 発信者プロセスは結果を受信できる。

### 短所

- 即応性の低下。
- 発信者プロセスはワーカープロセスのスループットに依存。

## `cast` - 「投げて忘れる」リクエスト

### 長所

- 即応性を促進。
- 発信者プロセスをブロックしない。

### 短所

- 整合性の低下
- 発信者プロセスは投げたリクエストの結果がどうなったのかわからない。

## そのプロセス必要がないかも？

> [... In any case, for something as trivial as sending an email in Elixir, I would send the e-mail within the request, especially if the user needs to open up the e-mail before proceeding.](https://dashbit.co/blog/you-may-not-need-redis-with-elixir) - José Valim

José Valimさんは、ちょっとしたメール送信するくないなら、リクエストのプロセス内処理するでと言ってます。

## さいごに

今後更に新しいことを学んだら、どんどん更新していこうと思います。Elixir楽しい。

---

明日は「[[Elixir] GenServerのアイドルタイムアウト](https://qiita.com/mnishiguchi/private/1bcef0e91a413879d79a)」です。引き続き、Elixirを楽しみましょう。

Happy coding!

- [Elixir その1 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir)
- [Elixir その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir2)
- [【毎日自動更新】QiitaのElixir LGTMランキング！](https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd) by @torifukukaiou
Docker Rails 起動してもコンテナが立ち上がらない問題

#場面：DockerでRailsの環境構築を行っている。
##原因

もし tmp/pids/server.pid というファイルが存在する場合は、起動に失敗してしまう。（Railsが既に起動中であると判断しているから。）

##手順

```
docker-compose down
```
①起動している場合は、上のコマンドを先に実行。

②tmp/pids/server.pid というファイルを削除する。

```
docker-compose up -d 
```

③docker-compose.ymlのあるディレクトリで次のコマンドを実行して、再度起動させる。

解決！！！
jib-maven-pluginとGitHub Actionsでコンテナイメージを作ってGitHub Packagesへデプロイする

[同じ内容をZennにも投稿しました。](https://zenn.dev/backpaper0/articles/deploy-to-gh-packages-by-gh-actions-with-jib)

---

## 概要

[jib-maven-plugin](https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin)を使ってコンテナイメージを作ってGitHub Packagesへデプロイする、というのをGitHub Actionsで行う方法です。

## jib-maven-pluginでコンテナイメージをビルドする

`jib-maven-plugin`では`build`ゴールでコンテナイメージをビルドしつつpushできます（ちなみに、コンテナイメージをビルドしつつローカルのDockerへ保存する場合は`dockerBuild`ゴールを使用します）。

`build`ゴールに必要な値のいくつかはシステムプロパティで渡せます。

|項目|システムプロパティ|
|---|---|
|コンテナイメージ|`jib.to.image`|
|バージョン|`jib.to.version`|
|push先のユーザー名|`jib.to.auth.username`|
|push先のパスワード|`jib.to.auth.password`|

コマンドの例は後ほど登場します。

## GitHub Actionsのワークフロー定義を書く

ソースコードのチェックアウトやJavaのセットアップ、Mavenローカルリポジトリのキャッシュなどは一般的なJavaプロジェクトと同様です。

コンテナイメージのビルドとpushもMavenを用いるので、一般的なJavaプロジェクトとそう変わりはありません。
前のセクションで解説した値を設定しつつ`mvn`コマンドを組み立てます。

pushするときのコンテナイメージ名は[Configuring Docker for use with GitHub Packages](https://docs.github.com/en/free-pro-team@latest/packages/guides/configuring-docker-for-use-with-github-packages)にあるように`docker.pkg.github.com/OWNER/REPOSITORY/IMAGE_NAME:VERSION`という形式です。
push先のユーザー名はGitHubのアカウント、パスワードはPersonal access tokenです。
[GitHub PackagesへJARをデプロイする](https://zenn.dev/backpaper0/articles/deploy-jar-to-gh-packages-by-maven)という記事でも書いたのですが、GitHub Actionsでは`secrets`コンテキストから`GITHUB_TOKEN`という名前でPersonal access tokenを取得できます。

以上のことから、コンテナイメージをビルドしてpushする`mvn`コマンドは次のようになります（ユーザー名は`backpaper0`、GitHubリポジトリ名は`demorepo`とします）。

```bash
mvn -B package jib:build \
    -Djib.to.image=docker.pkg.github.com/backpaper0/demorepo/demo \
    -Djib.to.version=latest \
    -Djib.to.auth.username=backpaper0 \
    -Djib.to.auth.password=${{ secrets.GITHUB_TOKEN }}
```

ワークフロー定義の例の全体は次の通りです。

```yaml
name: Building container image with Jib

on:
  push:
    branches: [ master ]

jobs:
  build:
    name: Build container image
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - uses: actions/setup-java@v1
        with:
          java-version: 11

      - uses: actions/cache@v2
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      - name: Build by Jib
        env:
          CONTAINER_IMAGE: docker.pkg.github.com/backpaper0/demorepo/demo
        run: |
          mvn -B package jib:build -DskipTests \
              -Djib.to.image=$CONTAINER_IMAGE \
              -Djib.to.version=latest \
              -Djib.to.auth.username=backpaper0 \
              -Djib.to.auth.password=${{ secrets.GITHUB_TOKEN }}
```

以上です。
swift アクセス修飾子　final

#finalとは
classにfinalをつけると継承できなくなる。
メソッドやプロパティにfinalをつけるとサブクラスでオーバーライドできなくなる。
これ以上は継承できない！最後ですよ！て言うイメージらしいです。
#使用例
DogクラスはAnimalクラスを継承できますが、
ChiwawaクラスはDogクラスを継承することが出来ません。

```swift
class Animal {
    
}

final class Dog: Animal {  //Animalを継承
    
}

class chiwawa: Dog {  //エラー（Inheritance from a final class 'Dog'）

}
```

#どんな時に使用するか
もう継承しない！って時に使用する。
プログラム実行時のパフォーマンス改善などが見られたりするそうですが、
詳しい事はわからないので、またわかったらまとめます。
Azure Application Gateway SSL証明書作成 PFX形式

# はじめに

Azure Application Gatewayを導入した際、AGWでSSL終端させるためにPFX形式の証明書を作成する必要があったので備忘録。

# 事前準備

今回はWindows環境で作成します。まずはopensslコマンドが使えるように以下のサイトなんかを参考にしてopensslをインストールします。

[Win32 opensslのインストール](https://rms.ne.jp/sslserver/basis/openssl_on_windows/)

次に証明書発行サービスから以下の情報を事前に取得しておきます。

* 証明書（-----BEGIN CERTIFICATE-----から始まるやつ） 
* 中間証明書（-----BEGIN CERTIFICATE-----から始まるやつ）
* プライベートキー（-----BEGIN RSA PRIVATE KEY-----から始まるやつ）

# pfx形式証明書の作成

```bash
openssl pkcs12 -export -in cert.pem -inkey privkey.pem -certfile chain.pem -out example.pfx
```

cert.pemが証明書、privkey.pemがプライベートキー、chain.pemが中間証明書
また、上記コマンドを実行するとパスワードの設定を促されるので任意のパスワードを設定しましょう。このパスワードはApplication Gatewayに証明書を設定する際に必要になるので大切に保管しておきましょう。

# おまけ

作成した証明書の情報は以下のコマンドで確認できます。特に有効期限とかはちゃんと確認しておいた方がいいかもです。

```bash
certutil -dump example.pfx
```
【備忘録】Docker-compose.yml (Rails + PostgreSQL)

# Docker-composeとは

> Compose とは、複数のコンテナを定義し実行する Docker アプリケーションのためのツールです。Compose においては YAML ファイルを使ってアプリケーションサービスの設定を行います。コマンドを１つ実行するだけで、設定内容に基づいたアプリケーションサービスの生成、起動を行います
https://docs.docker.jp/compose/overview.html

# 対象ファイル
https://github.com/naokikubo2/quickstart
上記URLに、docker環境でrailsの開発がすぐに初められるリポジトリがあります。
こちらでは、シェルスクリプトを利用して、1つのコマンドでdockerの様々なコマンドを自動的に処理可能です。
今回解説するのは、「docker-compose.yml」というファイルです。 

# composeのヴァージョン指定

```
version: '3'
```
Docker-composeのファイル形式のヴァージョンを表している。現状では3が最新。

# service 作成
- 下記の`db`, `redis`などはサービス名。任意の名前を設定できる。
- 1つのサービスで、1つのコンテナが起動する。

- マウント時に、`cachedオプション`を使用していますが、これにより速度をあげることができます。詳細は、以下参照。
  - Docker for Mac のボリュームの遅さを cached オプションで解消(https://qiita.com/koshigoe/items/52749db8836b4e3fbfc4)


## web: &app
```
  web: &app
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app:cached
      - bundle:/usr/local/bundle:cached
      - /app/.git
    environment:
      HOME: /app
      RAILS_ENV: development
    ports:
      - "3000:3000"
    tty: true
    links:
      - db

  (中略)

volumes:
  bundle:
    driver: local
```

- `build: . `の「ドット」：　docker-compose.ymlと同じディレクトリをビルドコンテキストとしている
　⇨ymlファイルと同じディレクトリに、webサービス用のDockerfileを作成しておく必要がある。
- `ports`：　コンテナ外部に公開するポート & マッピング先のポート
- `volumes` :
    - `.:/app:cached` ： バインドマウント。docker-compose.ymlの存在するディレクトリにをコンテナの`/app`ディレクトリにマウントしている。
    - `bundle:/usr/local/bundle:cached` ：　volumesに定義したbundleのvolumeをwebサーバのコンテナの`/usr/local/bundle`にマウントしている。名前を付けたvolumeをマウントする場合は、volumesに定義しておく必要がある。
- `link`　：　webサービスからdbサービスへのリンクを設定。

## DB

```
db:
    image: postgres
    ports:
      - "5432:5432"
    volumes:
      - data:/var/lib/postgresql/data:cached
    environment:
      POSTGRES_PASSWORD: postgres
```

DBはpostgresを使用しています。

# 以下オプション
以下のseviceは、webサービスを起動しても同時起動しない設定になってます。

## redis
```
 redis:
    image: redis
    ports:
      - "6379:6379"
    command: redis-server --appendonly yes
    volumes:
       - redis-data:/data:cached
```
Redisとは、オープンソースの永続化可能なインメモリデータベース（In-memory database）で、BSDライセンスで公開されています。
webアプリケーションのセッション管理に利用されます。また、HTMLコード片やページのキャッシュを行うことで、より速くwebページが表示される様にできます。

## chrome
```
chrome:
    image: selenium/standalone-chrome
    ports:
      - "4444:4444"
```
seleniumとは、webブラウザのテストを自動化するためのツール。webブラウザは、chromeを使用するイメージを利用するので、sevice名は、chromeにしています。

## spring
```
  spring:
    <<: *app
    command: bundle exec spring server
    ports: []
```
- springは、railsコマンドの高速化に使うサービス
- `<<: *app`：web serviceを継承
- commandとportsをオーバーライド

## solagraph
```
  solargraph:
    <<: *app
    command: bundle exec solargraph socket --host=0.0.0.0 --port=7658
    ports:
      - "8091:7658"
    links: []
```
- solargraphは、グラフ化を行う際に使用。


# 最後に
自分自身まとめながら、「今まで気にしていなかったけど、これは何だろう」という疑問を解消することができました。実践的に学んでいくのが一番なんだなと実感しました。（一方で、写経だけをしていては絶対に身につかない）
もし、記事が少しでも役立った場合はLGTMお願い致します！！
AWS-SAA-CO2に3回目で合格した反省とこれからの対策

まいど！
2020/08/01......この日から始めたAWS認定試験の学習。
2020/12/08......3回目の試験でようやくAWS-SAA-CO2に合格することができた。
中学で受けた英検3級以来の挑戦だった。
今回の記事では、使用した学習教材、自分の学習方法で効率が悪かった事、合格するために行った学習方法をメモとして残す。

##使用した教材と特徴
###書籍
- AWS認定ソリューションアーキテクト-アソシエイト教科書

> 黒い本。
> 出題範囲やその特徴がわかりやすく紹介されている。
> 問題数は少なめだが、流れを掴むにはもってこい。

- AWS認定アソシエイト3資格対策

> 唯一の3資格対策本。
> ソリューションアーキテクトの範囲を広く学習できる。
> 図解が豊富（IAM認証やSQSの学習で役立った）。

###動画教材(すべてUdemy)
- これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）

> 動画がとにかく丁寧。
> ハンズオンで頭に入りやすい。
> すべて終えるのに時間がかかる。

- 【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）

> 試験の難易度、雰囲気をある程度味わえる。
> 解説が丁寧。
> 問題数が豊富。

- AWS認定ソリューションアーキテクト アソシエイト試験：短期突破講座（300問の演習問題）

> ハンズオンなしのSAA試験特化型。
> 黒本の補完としておススメ。おススメ。

###問題集
- AWS WEB問題集で学習しよう

> ゴールドプラン（有料）の場合、1000問以上の問題にチャレンジすることができる。
> 解いていくうちに問題の癖や言い回しにある程度慣れることができるのでかなりおススメ。
> 一問一答形式。
> 解答を深堀る事で問題の知識だけでなく使われたサービスの理解を深めることができる。

##元々の知識量について
2020/08/01時点ではほぼない。IT用語もわからない状態。

##不合格の学習方法（私の場合）
1度目の試験は「受ける試験間違えたかな？」と思うくらい問題の内容がさっぱり分からなかった。
というのも、この時の私はUdemyのこれだけでOKと模擬試験問題集のみを学習し、問題については深堀することなく、「これだけ難しい問題やっておけば大丈夫でしょ！」という謎の自信に満ち溢れていた。結果は不合格。
![awssaaco23.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/25af120d-faba-e69c-157c-5e7a9de3f873.png)
2度目の試験では書籍を何度か読み、WEB問題集をひたすら解き、そして結果は不合格。40点足りなかった……。
![awssaaco22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/bae39fb5-127d-16d8-47a5-1df23566077e.png)
これらに共通して言えることは__「うわべだけの学習」__。これに尽きる。
Udemyの問題集だろうとWEB問題集だろうと書籍の問題だろうと、当然解答が付いている。
この解答をただ読んで「ふーんそうなんだ」とそれ以上調べようとせず、ただ問題のみを解いていた。
このうわべだけの学習を積み重ねることで学習した気になっていたのだ。もちろん、知識はある程度ついたが、試験基準を満たしていたか？と言われると、まったく足りていなかった。

頭を切り替えることにした。

##合格に繋がった学習方法
学習方法を__問題集__に絞り込むことにした。

特に以下3つを意識した。

> - 文中の知らない単語はすべて調べて頭に叩き込む
> - 自分の中で納得いく解答が得られるまでその1問に集中する
> - 不正解も「なぜ不正解なのか」すべて答えられるようにする

これだけ。
要するにWEB問題集を味わい尽くすのだ。実にシンプル。
色々なものに手を出して収拾がつかない現状を「問題集」に絞り込み、そこから得られる知識を最大限吸収するように努力した。

結果、ギリギリではあるものの合格に漕ぎ着けた。
![awssaaco2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867277/4b0b6586-04fa-dd21-e4cd-aad3419b20b7.png)
##見えてきた課題
3回試験を受けた結果、明白な課題も見つかった。
それはTCP/IP等の基礎知識だ。
AWSばかりに焦点を絞って学習してきたが、これだけではいずれ限界が訪れる。通信やそれらを取り巻く知識、そこがぽっかりと抜けているのだ。
基礎の基礎ともいえるこれらインフラの技術はやはり避けては通れぬ道。
良い機会なのでAWSの資格学習と並行してこうした基礎もしっかりと身に着けていきたいと思う。

##めちゃめちゃ良いUdemyの教材が出た！
- Udemy AWS認定ソリューションアーキテクト アソシエイト試験：短期突破講座（300問の演習問題）

こちらは筆者のおススメ。
これから試験に向けて学習するのであれば、黒本もしくはこれだけでOKを一通り終えた状態で、ぜひチャレンジしていただきたい。
高難易度な問題やユースケースを元に、図解や詳しい解説を交えながら「問題を読み解く力」を養ってくれる、そんな教材となっている。こちらをやり終えた後にWEB問題集等を解くことで、より理解した状態で試験に臨めるはずだ。
コロナ禍に供養

ども。
Hiro_Matsunoです。
大変申し訳無いのですが2つとも合わせます。
許してくださいm(_ _)m。
 [MAヒーローズ・リーグ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/heroesleague"MAヒーローズ・リーグ Advent Calendar 2020")
 [供養 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/kuyo "供養 Advent Calendar 2020")
双方ともの11日目です。

いつもはこんな手使わないんだけどどうしてもわびておきたいので合せ技します。
お許しください。

#なぜ供養なのか
正直言うと今年はコロナ禍。
これには誰も勝ててません。
それに実はもう7月に燃え尽きしてしまってました。
というのはOneJapanハッカソン東海のプロジェクトのコンセプトが3回変わるという痛い目にあいました。
やっぱ思うんだけど全員で企画ねったほうがまともだったかも。
あともう一つはずばり動画の壁です。
この壁はどうやっても破れません。
一眼レフやZX1持っていない人はどうしたんでしょう。
これって正直ハッカソンってやっぱ費用がすごくお金が出ちゃうのね。
言った気持ちになってしまいましたしUDCのプロジェクトをMAに持ってこうとして慌てた俺がとち狂う結果になり撃沈と相成りました。
今年の俺自身に供養したいと思います。
合掌🙏。

#本当はどうあればよかったのか
それを書いてしまうとどうしようもないのですが。
大きいスペースでこじんまりハッカソンでも良かったような気がします。
というのはやっぱりリアルが重要なんです。
ハッカソンって。
リモートでは何も伝わらないと以前自分がブログに書きましたがまさしくそのとおりでした。
俺の抜けたプロジェクト賞とってるじゃないですかorz。
燃え尽きなければいいなんて言わないでよ。
ほんとあのとき思ったのはリモートじゃなくリアルが重要ってことでした。
リアルで会うことを検討すべきだったと思います。
今年はMAが大困難を経験した年だと自分は思っています。
#まだやる気残ってる？
もちろん残ってますよ。
有り余ってますが正直コロナが怖い。
実はある事件以降肺疾患が怖いんです。
これはMAには関係ないのでこれ以上は書きませんがほんと怖かった数名を残してほぼ全員インフルエンザにかかったということがあったので。
正直次回はこじんまりでいいんでリアルハッカソンみんなやりましょうよ。
リモートでは本音言いづらいですし。
やっぱリアルが重要です。
#動画みんなどうやったんだろう
正直コレが一番の疑問です。
カメラってVlog用って8万以上するんですけどみんな手に入れられたんかしゃん。
それだし編集にも書き出しにもマシンパワーがいるんだけどなんとかなったのかが疑問がいっぱいです。
どう考えてみても俺の持ってるマシンではどうやっても太刀打ちできませんでした。
撃沈。
合掌🙏
正直Vlogカメラ持ってませんしその上MacBookAir2018Lateではどうやっても太刀打ちできませんでした。
開発では一番強いのにね。
あとは今年3月からリモートハッカソンだったので正直MA始まった頃にはリモート疲れしてしまっています。
そんなオイラたちに愛の手をという感じがします。
合掌🙏。
#これからのあり方は
やっぱり機材揃えようかなって思ってます。
ZX1買うところから初めて（それかiPhone12を動画モードにするのもありか）。
まだM1Mac買い時じゃないんですよね。
開発環境不備過ぎて。
でもそのうち良くなったらもう一つAWS無料枠作ってM1MacMiniやっちゃおうかなって感じもしなくてもないです。
とにかく何をするのにもリモートはお金がかかりすぎて心が痛いです。
やっぱリアルハッカソンがやりたいその気持ちでいっぱいです。

リモートで撃沈した自分に合掌🙏。
MAの皆様本当にリモートハッカソンお疲れさまでした。
正直動画の壁が超えられなくメンバも集められず今年は辞退しましたが。
来年はリアルでやりたいですねぇ。

2つ重ねてみんなすまぬ。
どうしても3つは書けんよ。
薬の副作用でまくりのHiro_Matsunoでした。
明日は両方とも誰もいない😭。

そんな所で今日はここまでにします。

お疲れ様でした。
JavaScriptでmousedown,upとtouchstart,end両方に対応して二回実行されないようにする

#mousedownとtouchstart

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button id="button">  ←これ
        ボタン
    </button>
</body>
</html>
```

この``button``に

## mousedown
```javascript
document.getElementById("button").addEventListener("mousedown",e => {
    //id"button"上でマウスのボタンが下がると実行される
});
```
こうする事でマウスボタンが下がる事を検知できます。

## touchstart
touchstartは

```javascript
document.getElementById("button").addEventListener("touchstart",e => {
    //id"button"上で画面に指が触れると実行される
});
```
これで画面に指が触れたときに処理を実行できます。

# 発生する問題
```javascript
document.getElementById("button").addEventListener("mousedown",e => {
    //マウスのボタンが下がった時に実行
});

document.getElementById("button").addEventListener("touchstart",e => {
    //画面が触れたときに実行
});
```
このように一つの要素``(button)``に対して``mouse〇〇``と``touch〇〇``の両方を指定した時、かつタッチでこの要素に触れた時に発生します。

この条件でタッチした時、

touchstart
↓
touchend
↓
mousedown
↓
mouseup

の順番で``mouse〇〇``も動作して二回クリックした事になってしまいます

# 解決方法

```javascript
let a = {};//適当に名前をつけてください。

function ck(click_or_touch,after_function){//この関数を使って問題を解決する
    if(a.status){//データがある時
        if(a.status == click_or_touch){//1000ms前の入力方法と同じ
            after_function();//処理を実行する
        };
    }else{//データが無い時
        a.status = click_or_touch;//入力方法を記録
        setTimeout(function(){
            delete a.status;//データを削除する
        },1000/*データが削除されるまでの時間(ms)*/);
        after_function();//処理を実行する
    };
};

document.getElementById("button").addEventListener("mousedown",e => {
    //マウスのボタンが下がると実行される
    ck("mouse",function(){
        //クリックされたときに実行したい処理
    });
});

document.getElementById("button").addEventListener("touchstart",e => {
    //画面に指が触れた時に実行される
    ck("touch",function(){
        //タップされた時の処理
    });
});

```

これで解決できます。

## 解説

aになっていますが適当に名前をつけてください。

```javascript
let a = {};//適当に名前をつけてください。
```

次に、この関数を一度通す事で 一秒間同じ入力方法しか使えないようにして対策をしています。

```javascript
function ck(click_or_touch/*←入力の種類を文字列で*/,after_function/*実行しても問題ない時に実行する処理*/){
    if(a.status){//さっきのaにデータがある時
        if(a.status == click_or_touch){//1000ms前の入力方法と同じなら
            after_function();//処理を実行する
        };
    }else{//aにデータが無い時
        a.status = click_or_touch;//aにデータを設定
        setTimeout(function(){//1000ms後にデータが削除されるようにする
            delete a.status;//データを削除する
        },1000/*データが削除されるまでの時間(ms)*/);
        after_function();//処理を実行する
    };
};

```

あとは

```javascript
document.getElementById("button").addEventListener("mousedown",e => {
    //マウスのボタンが下がると実行される
    ck("mouse",function(){ ←さっきの関数を実行する
        //クリックされたときに実行したい処理
    });
});

document.getElementById("button").addEventListener("touchstart",e => {
    //画面に指が触れた時に実行される
    ck("touch",function(){ ←さっきの関数を実行する
        //タップされた時の処理
    });
});
```

こうして さっき作った関数を実行すれば1000msの間 別の入力方法は受け付けなくなります。

### 注意
JavaScript初心者なのでバグがあるかもしれません。自己責任で使ってください。
Railsアプリでリファクタリング

#はじめに
　現在作成中のアプリケーションで、本日はリファクタリングを行ったので、意識したポイントをまとめておく。

##確認したこと

- 同じ記述はなるべく短くする。
- 同じ処理は変数にしたり、`def`でメソッドにする。
- URLを直接入力されて困る場合のアクセスは、トップページに返す。
- 無駄に改行しない。
- インデントを揃える。

リファクタリング後、同じように動作するかチャックする。



##最後に
　他にも、こんなパターンのリファクタリングをした方がいいなど、ありましたら、ご教授ください。
[JavaScript] すごく初歩のJavaScript (アロー関数)

#JavaScript (アロー関数)

JavaScript 自分用の覚え書きです。

アロー関数の書き方

```javascript:script.js
// functionでの書き方
const hello1 = function() {
  console.log("こんにちは！");
};

hello1();

// アロー関数での書き方
const hello2 = () => {
  console.log("こんにちは！");
};

hello2();
```
【Docker環境構築】長ったらしいコマンドをシェルスクリプトで省略化する

少しでも役立ったらLGTMお願いします！！

### 対象者
- rails tutorialを終えてアプリ開発しようとしている方
- Dockerで環境構築がしてみたい方
- 実戦から学んで行きたい方


### 参考資料
[初心者向けシェルスクリプトの基本コマンドの紹介]
https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337
[シェルスクリプトリファレンス]
https://shellscript.sunone.me/

### 初めに

Dockerの学習をしていると、こんなにコマンド長いのに、毎回打たなきゃいけないの？？って思ったことありませんか。
例えば、docker-compose run —rm　とかです。（学習のために敢えて、このコマンドを打つことも大切です）
この様な長ったらしいコマンドを省略する方法は、私の知る限り2種類です。
**1. シェルスクリプト作成**
**2. コマンドのエイリアスを設定**

今回、前者のシェルスクリプトに関して、ご紹介します。こちらの技術を選択した理由は以下の2点です。

- 1度シェルファイルを作ってしまえば、それを設置するだけでいいので、他の人に配ることが可能。⇨現場で使われる技術
- 初期化の設定から、コマンド1つ打つだけでまとめて実行できてしまう便利さ

### 対象ファイル
https://github.com/naokikubo2/quickstart
上記URLに、docker環境でrailsの開発がすぐに初められるリポジトリがあります。
シェルスクリプト は、「qs」という名前のファイルです。

### シェルスクリプト概要
まずは、中身にどんなコードが書かれているか、ザッとご紹介します。

**1. おまじない**
**2. そもそもPCにdockerがインストールされているかチェック**
**3. 環境に左右されるものは変数に代入**
**4. 予めメソッドを定義**

### シェルスクリプトの基礎知識

### qs.bashの解説

#### ①おまじない
```sh
#!/bin/bash
```
「初っ端からいきなり説明していないじゃないか」というツッコミはごもっともですが、しっかり理解したい方は、こちらを参照してみてください。
https://qiita.com/yn-misaki/items/6fcfab082dd664f10d4e

***
#### ②そもそもPCにdockerがインストールされているかチェック
```sh
dc=$(which docker-compose) # docker-compose command with full path
if [[ -x "$dc" ]]; then
    :
else
    echo "Please install Docker before run this command."
    exit 2
fi
```
- docker-composeコマンドがインストールされているかどうかチェック
- Exit 2は、コマンドが存在しない時のエラーコード（ただし、開発ルールによりけり）。
ちなみに、exit 0は正常終了、exit1はいわゆるエラー。


***
#### ③変数に代入してます
```sh
rm="--rm" # To destroy a container
app="web" # describe $application service name from docker-compose.yml
db="db" # describe database service name from docker-compose.yml
app_name=`pwd | awk -F "/" '{ print $NF }'` # get project dir name

define container name
app_container="${app_name}_${app}_1"
db_container="${app_name}_${db}_1"
```
- 4行目：awkは、縦棒の左の文字列から、抽出するコマンド
/で連結された文字の、$NF(一番末尾)を抽出する。つまり現在地pwdの末尾だから、アプリ名

***

#### ④予めメソッドを定義

```sh
echoing() {
    echo "========================================================"
    echo "$1"
    echo "========================================================"
}
```
- echoは、javaでいうsystem.out.println(); rubyでいうputsです。
- 強調して、ターミナルに表示させたい文字がある時、これを使います。

***
```sh
rm_pids() {
  if [ -f "tmp/pids/server.pid" ]; then
      rm -f tmp/pids/server.pid
  fi
}
```
rails serverを立ち上げた時に、server.pidが作られる（プロセス識別子：pid = process id）。何らかの問題が発生して、終了後にserver.pidが残ってしまった場合、これを削除しないと、rails serverが立ち上げられない。

#### ⑤本体(こんなコマンドが来たら、これを実行するを定義)
叩かれたコマンドをswitch文で分岐させて、実行内容を変えています。
①-④で作ってきたものが、ここで使われるわけです。

```sh
cmd=$1
shift
case "$cmd" in
    setup)
        create_project $* && exit 0
        ;;
    init)
        init_services $* && exit 0
        ;;

　　省略

    solargraph)
        solargraph_cmd $*
        ;;
    *)
        read -d '' help <<-EOF
Usage: $0 command
```

1行目：$1は、引数です。例えばprojectを作成するときに、本シェルスクリプトを実行するならば、シェルスクリプトのファイル名が「qs」なので

```
./qs setup
```
この場合、\$1は「setup」です。(ちなみに\$2は2番目の引数になる、\$0はスプリプト名)

- switchの基本の書き方は case 変数 in 条件・値) コマンド ;; esac です。
条件・値が変数と合う場合次のコマンドを実行します。
- exit 0 は先述の通り、正常を表すコードです
- \$*は、\$0を除く、\$1以降全て、つまり引数全てを意味しています。

### まとめ
コマンドを省略するための、シェルスクリプトについてまとめました。
この記事がある程度理解できた方は、例えばprojectを作成するときに、どの様な順序でシェルスクリプトが動いているのかみてみると、理解が深まると思います。
【2020年】Denoの入門に関する情報のまとめ

Deno Advent Calendar 2020 11日目の記事です🦕

今日は、Denoに入門する上で必要と思われる以下のような情報をまとめてみます。

* どうやってインストールすればいいの?
* エディタは何を使えばいいの?
* 入門する際はどこの情報を参照したらいいの?
* 質問はどこですればいいの?
* 最新情報はどこから得たらいいの?

## Denoってなに?

セキュリティや生産性を強く意識したTypeScript/JavaScriptランタイムです。
詳しくは、以下の記事も参照ください。

* [Deno ってなんだっけ?](https://qiita.com/kt3k/items/e1647683ad08ff6b6e95)
* [Denoとはなにか - 実際につかってみる](https://qiita.com/azukiazusa/items/8238c0c68ed525377883)
* [DenoとNode.jsの大きな違い](https://scrapbox.io/keroxp/Deno%E3%81%A8Node.js%E3%81%AE%E5%A4%A7%E3%81%8D%E3%81%AA%E9%81%95%E3%81%84)

## Denoに入門する上で必要なもの

* [Deno](#denoのインストール方法)
* [エディタ](#エディタは何を使えばいいの?)

## Denoのインストール方法

https://deno.land/#installation

#### Mac/Linuxユーザ向け

* 以下のコマンドを実行すると、Denoをインストールできます。`~/.deno/bin/deno`にインストールされるため、そこにPATHを設定してください。

```shell
$ curl -fsSL https://deno.land/x/install/install.sh | sh
```

* Macをお使いの場合は、Homebrewでインストールすることもできます。

```shell
$ brew install deno
```

* asdfをお使いの方は、[asdf-deno](https://github.com/asdf-community/asdf-deno)を使ってDenoをインストールすることもできます。
  * https://qiita.com/uki00a/items/c75f56627a4777abd74d

#### Windowsユーザ向け

* 以下でインストールできるようです (Powershell)

```shell
$ iwr https://deno.land/x/install/install.ps1 -useb | iex
```

* また、ChocolateyやScoopを使ってインストールすることも可能です。

## エディタは何を使えばいいの?

特にこだわりがなければ、Visual Studio Codeに[vscode-deno](https://marketplace.visualstudio.com/items?itemName=denoland.vscode-deno)をインストールすることをおすすめします。

`vscode-deno`で拡張を検索すると、3つほど拡張が見つかると思います。
このうち**denoland.vscode-deno**をインストールしてください。

![how-to-install-vscode-deno.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240412/ca6e79a6-065f-f272-b040-0e9ad8ed33d2.png)

vscode-denoをインストールした後、プロジェクトディレクトリに`.vscode/settings.json`を作成し、以下の設定を記述するとvscode-denoが動作するようになります。

```json:.vscode/settings.json
{
  "deno.enable": true,
}
```

## Denoに入門する上での情報源

Denoは変更が速いため、基本的には[公式マニュアル](https://deno.land/manual)を参照することをおすすめします。

とはいえ、公式マニュアルは英語で書かれているため、日本語の情報源もいくつか紹介します。

### [deno_website2_japanese](https://deno-ja.vercel.app/)

[tokiedokieさん](https://github.com/tokiedokie)によるDenoの公式サイトの日本語訳です :heart_eyes: 
公式マニュアルなどが日本語訳されています。

### [deno-jaのScrapbox](https://scrapbox.io/deno-ja/)

[逆引きDeno](https://scrapbox.io/deno-ja/%E9%80%86%E5%BC%95%E3%81%8DDeno)のページに、Denoの使い方などがまとめられています。

## Denoのコミュニティ

Denoにはいくつかのコミュニティが存在します。
困ったことや質問などがある際は、以下に投稿するとよいと思います。

* [Discordのhelpチャンネル](https://discord.gg/deno)
* [deno-jaのSlackチャネル](https://scrapbox.io/deno-ja/Slack%E3%81%AE%E5%8F%82%E5%8A%A0%E6%96%B9%E6%B3%95)

## Denoの最新情報

以下のあたりが比較的情報が速いと思います :thinking: 

* [Denoの公式ブログポスト](https://deno.land/posts)
* [Twitterの@deno_landアカウント](https://twitter.com/deno_land)
* [deno-jaのSlackチャネル](https://scrapbox.io/deno-ja/Slack%E3%81%AE%E5%8F%82%E5%8A%A0%E6%96%B9%E6%B3%95)
* [Discordのshowcaseチャンネル](https://discord.gg/deno)

## サードパーティモジュールの探し方

https://deno.land/x で公式のモジュールレジストリに登録されたモジュールを探すことができます。
基本的には、ここか[awesome-deno](https://github.com/denolib/awesome-deno)からモジュールを探すのをおすすめします。

## おわりに

この記事では、Denoの入門に関する情報をまとめました。
【1日目】Rust入門

# 【1日目】Rust入門

## 最終目標
実際にwebアプリに組み込んでみて、Web Assemblyの実力を感じてみる。

## 本日の目標
とりあえず公式通りにセットアップ、文法の理解は飛ばします。
https://www.rust-lang.org/ja/learn/get-started

## 環境
OS:Mac OS Catalina

## まずはインストール

```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```
このインストールにかかる時間1時間45分って聞いてたんですけど
あれ、一瞬...

## VS Codeのプラグイン

VsCodeにてrustと検索してRustっていうプラグインを入れました
機能一覧
code completion
jump to definition, peek definition, find all references, symbol search
types and documentation on hover
code formatting
refactoring (rename, deglob)
error squiggles and apply suggestions from errors
snippets
build tasks


##　プロジェクトを作成

公式ページの通りセットアップしていきます

hello-rustというディレクトリ に「Hello, world!」プロジェクトを生成

```
cargo new hello-rust
```

## 書いてみる

cargo.tomlファイルに追記

```
[dependencies]
ferris-says = "0.2"
```

buildを実行する

```
cargo build
```
cargo.lockに

```
[[package]]
name = "ferris-says"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f34f82e9a8b1533c027d018abd90b8687bf923be287b2617dfce4bea4ea3687"
dependencies = [
 "clap",
 "error-chain",
 "smallvec",
 "textwrap",
 "unicode-width",
]
```
追加されていますね

main.rsに実際に書いていきいます。

```
use ferris_says::say; // from the previous step
use std::io::{stdout, BufWriter};

fn main() {
    let stdout = stdout();
    let message = String::from("Hello fellow Rustaceans!");
    let width = message.chars().count();

    let mut writer = BufWriter::new(stdout.lock());
    say(message.as_bytes(), width, &mut writer).unwrap();
}
```

最後にプロンプトで実行

```
cargo run
```

## 所々解説
### mutについて
変数をミュータブルにするために使います
```
let num = 1;
num = 2 //error
```
```
let mut num = 1;
num = 2 //ok
```
### &について
参照するって意味。

参考　この記事が分かりやすかったです。
https://qiita.com/cactaceae/items/2c70a9947364c60ec100


## 所感
ここまで、他の言語やnpmなどを使ってきた人なら考えることも無くすんなり理解できそうな内容で、思ってたより敷居は低くなってるのかなって感じです。

## 今後
裏で文法事項を学習しつつ、簡単なプログラム作成を目指します。
BitVisorでAMD-Vi(IOMMU)隠蔽(リベンジ編)

昨年AMD-Vi(IOMMU)隠蔽をしようとして失敗していました:
https://qiita.com/hdk_2/items/f5619d9a5eeed2e5249d

もう一度チャレンジしてみます。

# 環境

昨年と同じです。

-    ASUS B350M-A
-    AMD Ryzen 7 2700
-    Debian GNU/Linux 10

# ACPI IVRSテーブル隠蔽方法を変える

昨年はテーブルの先頭を破壊する簡単な方法を用いました。今回は別の方法を使います。

```diff:
diff --git a/core/acpi.c b/core/acpi.c
--- a/core/acpi.c
+++ b/core/acpi.c
@@ -1463,6 +1463,7 @@ get_dmar_address (void *data, u64 entry)
        dmar->valid = true;
        return q;
 }
+#endif

 static u64
 alloc_acpi_pages (unsigned int npages)
@@ -1485,7 +1486,6 @@ alloc_acpi_pages (unsigned int npages)
        }
        return addr;
 }
-#endif

 static u64
 dmar_pass_through_prepare (void)
@@ -1865,6 +1865,18 @@ acpi_init_global (void)
        remove_dup_facs_addr (facs_addr, NFACS_ADDR);
        pm1a_cnt_found = true;
        save_mcfg ();
+       {
+               char *p = find_entry ("IVRS");
+               if (p) {
+                       printf ("Found IVRS %p\n", p);
+                       u64 addr = alloc_acpi_pages (1);
+                       void *q = mapmem_hphys (addr, PAGESIZE, MAPMEM_WRITE);
+                       memset (q, 0, PAGESIZE);
+                       unmapmem (q, PAGESIZE);
+                       printf ("Dummy IVRS at 0x%llx\n", addr);
+                       modify_acpi_table ("IVRS", addr);
+               }
+       }
 }

 INITFUNC ("global3", acpi_init_global);
```

そしてデバイス隠蔽も行い、起動してみると、成功しました!

```
$ dmesg|grep IVRS
$ dmesg|grep IOMMU
[    0.717641] AMD IOMMUv2 driver by Joerg Roedel <jroedel@suse.de>
[    0.717642] AMD IOMMUv2 functionality not available on this system
$ lspci -s 00:00.2
$ ls /sys/class/iommu/
$ cat /proc/cmdline |tr \  \\n|grep iommu
amd_iommu=on
iommu=pt
```

このように、IOMMUはデバイスもACPIテーブルも検出されず、amd_iommu=onを指定していてもIOMMUが使われなくなりました。

## 何をやったのか

`modify_acpi_table()`は昨年はなかった関数です。DMAR pass-through対応に伴い導入されました。`alloc_acpi_pages()`もそうで、上のdiffでは、`#ifdef DMAR_PASS_THROUGH`の中に入っていたのを外に出しています。

`modify_acpi_table()`はACPIテーブルのアドレスを変える関数です。ACPIテーブルのアドレスはRSDTおよびXSDTの中に書き込まれており、それらを書き換えるだけでなく、UEFI環境では、`SystemTable->BootServices->InstallConfigurationTable`関数をフックして、これが呼び出された時に書き換えを反映し直すという処理も追加します。これを使って、テーブルアドレスを書き換えて無効化するようにしました。

VMMのログを見ると以下のようにアドレスが出ています:

```
Dummy IVRS at 0xdaaa9000
```

そしてLinuxのログにもそのアドレスが出ていることが確認できます:

```
$ dmesg|grep -i daaa9000
[    0.000000] ACPI:      0x00000000DAAA9000 000000 (v00                 00000000      00000000)
```

さて、こんな仕組みが導入された経緯は、DMAR pass-throughの実装にあたり、DMARテーブルにRMRRを追加しテーブルサイズが大きくなることに対処する必要があったのがきっかけです。最初はテーブルアドレスの書き換えだけで済ませるつもりだったのですが、F社製PCにて、`SystemTable->BootServices->InstallConfigurationTable`関数が呼び出されるような状況(EFI Shellを起動した時など)において、書き換えた内容が失われるという事象が発生しました。その時、VT-d隠蔽(DMARテーブルの先頭4バイトを破壊)も機能しないという、昨年のIVRSテーブル隠蔽失敗と同様の問題があることを確認しました。どうやら、ACPIテーブルのコピーがメモリー上に残されていて、新たなテーブルの追加の際にそれらのコピーを元にすべてが再構築されるようでした。まぁ、テーブルの追加によってRSDTやXSDTのサイズが変わることを考えれば、再配置が必要になることは不思議ではありません。

そこで、ASUSもF社製PCと同じような動作をしているのではないか、と考えて今回の再チャレンジ成功となりました。
Vimに右足だけほんの少し踏み入れてみた。

# 疑問
テキストエディタ（VSCode）を使い始めて数ヶ月、**Vim**や**Vimmer**とよく聞くが一体何なのか？物は試しと実際に使ってみました。


## Vimとは
高機能なテキストエディタ。[GUI](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%82%AB%E3%83%AB%E3%83%A6%E3%83%BC%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9)を必要とせず[CUI](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%A6%E3%83%BC%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9)のみで何でもこなす凄いヤツ。ライバルに[Emacs](https://ja.wikipedia.org/wiki/Emacs)というエディタがあり、Vim派かEmacs派という[終わりなき聖戦](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E6%88%A6%E4%BA%89#:~:text=%E6%9C%80%E8%BF%91%E3%81%AE%E7%8A%B6%E6%B3%81-,vi%20%E3%81%A8%20Emacs%20%E3%81%AE%E9%81%95%E3%81%84,%E5%8C%BA%E5%88%A5%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A8%E3%81%AA%E3%82%8B%E3%80%82)が今でも続いている。

## Vimmer　とは
Vim使いのプログラマー。熟練になるには修行を必要とする。
独特の操作性、キーバインド（キーに対する機能の割り当て）は中毒性が高く、多くのフォロワー（信者）を生み出している。


## 必要最小限の環境でVimエディタを使ってみた。
※本格的に導入したい方、より詳しく知りたい方は[@okamosさんの記事](https://qiita.com/okamos/items/c97970ab34ff55ff3167)がおすすめです。  
ここでは、プログラミング学習数ヶ月の初学者によるVim体験になります。
普段使っているターミナルを使用しVimを体験します。
  
### 環境
- maxOS 10.15.7
- ターミナル（bashを使用）


### 1. ターミナルを立ち上げ、Vimを起動する。
```
$ vim
```

### 2. このように黒い画面にテキストメッセージが表示される。
（メッセージやバージョン番号はこれと異なる可能性があります。）

```
~
~                              VIM - Vi IMproved
~
~                               version 8.1.2292
~                           by Bram Moolenaar et al.
~                 Vim is open source and freely distributable
~
~                           Sponsor Vim development!
~                type  :help sponsor<Enter>    for information
~
~                type  :q<Enter>               to exit
~                type  :help<Enter>  or  <F1>  for on-line help
~                type  :help version8<Enter>   for version info
~
~
```
### 3.最も重要なVimコマンドを入力。
```
$ ESC:q!<return>
```
`ESC`は、左上のescキーです。`<return>`はエンターキーのことになります。上記のコマンドを入力すると、元のターミナル画面に戻れます。（強制終了）


`ESC:q!<return>`はVimにおいて**「最も重要なVimコマンド」**と呼ばれており、とりあず困ったらこのコマンドですぐに脱出できます。  
Vimは、上記の黒い画面でコマンド操作のみでファイルの中身を変更したり、移動したり色々できます。しかし、Vimを使い色々といじっている内に**「何が何だかよく分からない」**状況によく陥ることがあります。  
そんな時に、`ESC:q!<return>`コマンド！  
このコマンドさえ知っていれば、「あーでもない、こーでもない」と、色々とトライしてもすぐに元に戻すことができ、学習する上で役に立つと思います。


以上。 
Vimに右足だけほんの少し足を踏み入れてみました。
今後学習する上でガッツリ頭まで浸かれるように（Vimmerを目指し）精進していきたいと思います。


# あとがき（初投稿を終えて）
 
初めまして。 
数多くの記事の中からお読みいただきありがとうございます。 
2020年4月より、プログラミング学習を開始し、現在、書籍・オンライン教材等を活用し学習しています。

毎日、アレやコレや分からないことだらけですが、学習当初は、本当に酷く…特に、
### 「何が分からないか分からない状態」
に常に陥り、ひとり孤独に右往左往の日々でした…。

そんな中**Qiita**と出会い、今まで多くの**「分からない」**が**「分かった」**に変わり、
 [Qiitaへの思い](https://help.qiita.com/ja/articles/qiita-roots)にもありますが、プログラミング学習を進める上で、「役に立った」「助かった」という経験を多く得ることができました。  

今後はインプットだけではなく、Qiitaへの投稿によるアウトプットをすることで、プログラミングの理解をより深めていければと思っています。 
また、私と同じ初学者の**「役に立った」「助かった」**になれれば幸いです。

お読みいただきありがとうございました！
Twitterでソフトバンクのプレゼント当たったから倍率調べたかった

2020年11月25日
ソフトバンクホークスは見事日本一になりました。

夜はおなじみ和子の部屋(優勝特番生放送)で選手のインタビューを聞いていたところ、
https://twitter.com/HAWKS_official/status/1331653890010271745?s=20
こんな企画が
<img width="400" alt="softbank.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80717/6c3c8072-00eb-6b3c-7bad-ea842635a3ad.png">
`#和子の部屋キュンでスター`
こちらのハッシュで呟いたら、抽選で放送中に選手が書いたサインがあたるというもの

もちろん即応募です

そしたらなんと
<img width="300" alt="softbank.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80717/6ec68fb1-9735-2466-3ee7-7610dcce6a6a.jpeg">

当たりました！！！！！！！！

嬉しくて死にそうになりました。

そしてふと思ったのです

倍率はいかほどか



Twitterでどれくらい応募するためにハッシュタグがついたか見てみようと思い、TwitterAPI利用申請しました。

PHP使って解析してみようと思います。

ライブラリはこちらが有名みたいですが、
https://github.com/abraham/twitteroauth
ライブラリのエラーが解決できず・・・
なんでライブラリでsyntax出るんだろう。何かのバージョンだろうか。。
```PHP Parse error:  syntax error, unexpected ')' in /Users/username/work/twitter/src/TwitterOAuth.php on line 207```

こっち使いました
https://github.com/mpyw-junks/TwistOAuth

```php:自分の発言ならこんな感じ

<?php
 
require 'TwistOAuth.phar';
$api_key = 'xxxxxxx';
$api_secret = 'xxxxxxx';
$access_token = 'xxxxxxx';
$access_token_secret = 'xxxxxxx';

$connection = new TwistOAuth($api_key, $api_secret, $access_token, $access_token_secret);

// 自分のツイートを取得
$params = array(
  'count' => '2'
);
$user = $connection->get('statuses/user_timeline', $params);
var_dump($user); //過去2件の発言が取れるよ
```

いい感じの結果返ってきたのでリクエストは成功
次は検索

```php:ソフトバンクで検索
$params = array(
    'q' => 'ソフトバンク', 
    'count' => '2',
);
$tweets = $connection->get('search/tweets', $params)->statuses;
var_dump($tweets);
```
結構長い配列になってる。
ちゃんと解析しようとしたら時間かかりそう。。
ちなみにcount消したら15件出てきたっぽいです。

```php:ハッシュの検索
$hash_params = array('q' => '#和子の部屋キュンでスター' ,'count' => '10', 'lang'=>'ja');
$hash = $connection->get('search/tweets', $hash_params)->statuses;
var_dump($hash);
```
丁度先ほどサインが届いて、嬉しくてツイートしたのですが、上の検索で出てきたので一安心w
<img width="300" alt="softbank.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80717/1deaee43-722f-3e63-9e94-770886e09704.jpeg">

あ、2枚届くのか。
ということは、当選者は6名です。

では真面目に日付指定を

```php:日付指定こんな感じ
$hash_params = array('q' => '#和子の部屋キュンでスター' ,
  'count' => '10',
  'lang'=>'ja',
  'since' => '2020-12-11_00:00:00_JST',
  'until' => '2020-12-12_00:00:00_JST'
);
$hash = $connection->get('search/tweets', $hash_params)->statuses;
var_dump($hash);
```

`var_dump`の結果に自分のツイート出るから間違ってないはず。


```php:日付を優勝した日にして
$hash_params = array('q' => '#和子の部屋キュンでスター' ,
  'count' => '10',
  'lang'=>'ja',
  'since' => '2020-11-26_00:00:00_JST',
  'until' => '2020-11-27_00:00:00_JST'
);
$hash = $connection->get('search/tweets', $hash_params)->statuses;
var_dump($hash);
```
あ・・・あれ？カウント0だぞ・・・
調べたところ、どうやらTwitterAPIは1週間前までしか調べられないようでした。(この記事は2020/12/11に書いてます)
あとカウントもマックス100だとか。
期間の問題が解消されても、本気でやろうと思ったら100件以上の取得は最後に取得した日を保持して、日付の時間変えて何回かやらないといけないみたいです。

すみません、結局倍率は分かりませんでしたが、これを機にTwitterAPI触れたので勘弁してください。。


参考
Twitter APIでつぶやきを取得する
https://qiita.com/yokoh9/items/760e432ebd39040d5a0f
Brython　ajaxでpythonのrequestsもどきを作ってみる

#はじめに
タイトルの通り。
ほぼ忘備用です。
Brythonは全く触ったことない初心者が書いてます。

#目次
・[経緯的な](#経緯的な)
・[準備](#準備)
・[実行](#実行)
・[結果](#結果)
・[課題](#課題)

#経緯的な
pythonをjavascriptで動かすためにBrythonを触っていたところ、
そのBrythonではrequestsモジュールがサポートされていないことが分かった。

ので、
ajax使ってそれっぽいもの作ってみよう、ということに。

※Brythonについては[ここ](https://brython.info/index.html)読んで

#準備

さてここから本題。
上記の[ここ](https://brython.info/index.html)からBrython一式をダウンロード。
（今回は）不必要なものもあったので、それらを省略したパスがこんな感じ。


```
www----fonts
    L--tests----ace
             L--brython_test_utils
             L--editor.html
             L--editor.py
             L--tests_editor.py
             L--requests.py
             L--dom_js_tests.js
             L--jsobj_tests.js
```


拡張子ついてない物はファイルです。
（今回、特に触っていないので中身はそのまま使ってもらえば大丈夫かと）
この中で大事なのは自作したrequests.py。
この中にrequestsもどきを書いて、他で呼ぶ形にしています。


```requests.py
import json

def get(send_url,params="None"):
    from browser import document, ajax

    #paramsが設定されていた場合に実行(パラメータをセット)
    if params != "None":
        send_url = send_url + "?"
        params_count = len(params.keys())
        for paramskey in params.keys():
            send_url = send_url + paramskey + "=" + params[paramskey]
            params_count = params_count -1
            if params_count != 0:
                send_url = send_url + "&"
    
    req = ajax.Ajax()

    # send a POST request to the url
    # Bind the complete State to the on_get_complete function
    req.open('GET', send_url, False)
    req.set_header('content-type', 'application/x-www-form-urlencoded')
    req.send()

    return req
```

getが呼ばれたらsend_url(送り先)とparam(パラメータ)を受け取って、req.send()で送信。
返ってきた値をreturnで返しています。

「req.open('GET',send_url,False)」部分で、同期通信をしています。
FalseをTrueに変えれば非同期通信になりますが、空っぽのreqが返ることになるので一旦同期しています（多分スレッドとか使えば非同期でも最終的に値を返せる…はず）。

これで準備終わり。

#実行

localhostでいいのでサーバを立てて、~www/tests/editor.htmlにアクセス。
ボクはお手軽だったのもあってXAMPP使って立てました。
パスは環境に合わせて調整してください（~部分）。
下の画像のような画面が開けばOK（レイアウト変えてないのでBrythonの画面ままです）。

![スクリーンショット (1299).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708978/437172fa-419a-af70-671e-9dc700e0d885.png)

runのボタンを押すと、
左側に書いたPythonを実行し、その結果が右側に出力されます。

ではやっていきましょう。
今回は[こちら](https://randomuser.me/)のAPIをお借りしました。
ランダム生成された個人情報っぽい情報が取得できます。

実行するPythonはこちら

```oridin_requests.py
import requests
import json

url = 'https://randomuser.me/api/'
res = requests.get(url)

response = json.loads(res.text)
print(response)
result = response["results"][0]
#print("result" ,result)
#gender = result["gender"]
```

#結果
実行した結果がこちら。
途中で関係ないボタン等を削ったので見た目少し違ってます。
![スクリーンショット (1300).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708978/3a05a2d5-222d-8d21-eadd-ddc3a30521a1.png)

無事、requestsが動いているように見える動作ができました。
最後に行のコードもコメント外せば出力されます。
返ってきたレコードの一部を取得したい場合は、適当に使ってください。

#課題
（解決方法知ってるよ！って方がいればコメントで是非）
・非同期通信でも、最終的に画面で書いたコード部分に値を渡したい。
・一部APIでCORSのためか値を返してくれない（通信そのものが失敗している）。
　→「https://zipcloud.ibsnet.co.jp/api/search 」(パラメータで渡した情報の住所を取得するAPIです)」
　→APIの詳しいことは[こちら](https://zipcloud.ibsnet.co.jp/doc/api)（郵便番号検索API）
Flutter開発に便利なVS CodeのExtensions

最近お気に入りの[resocoder](https://resocoder.com/)さんの記事を紹介します。
VS CodeのExtensionについてです。紹介する記事は[こちら](https://resocoder.com/2019/07/04/vs-code-extensions-every-flutter-developer-should-have/)です。

# VS Code Extensions
Flutter開発する際は皆さんInstallされていると思います。

## 基本的なもの
- [Flutter](https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter)
- [Dart](https://marketplace.visualstudio.com/items?itemName=Dart-Code.dart-code)

多分Widgetをwrapしたりできるやつですね。これらのExtensionを消したことがないので詳しくはよくわかりません。


## その他便利Extensions
### [TabOut](https://marketplace.visualstudio.com/items?itemName=albert.TabOut)

`[]`や`{}`内でTabキーを押すと外に出られるというもので、IntelliJ等ではおなじみの人気機能らしいです。私の環境では何故か動作しなかったのですが。

### [Pubspec Assist](https://marketplace.visualstudio.com/items?itemName=jeroen-meijer.pubspec-assist)

VSCode内でpubspecを追加やソートできるというもの。
command palleteに例えば`flutter_bloc`と打つとpubspecに追加してくれます。pub追加時の面倒なコピーアンドペーストから解放されて便利です。

### [Awesome Flutter Snippets](https://marketplace.visualstudio.com/items?itemName=Nash.awesome-flutter-snippets)

`build`メソッドや`initState`メソッドのスニペットを提供します。


### [Advanced New File](https://marketplace.visualstudio.com/items?itemName=patbenatar.advanced-new-file)

pathを入力するとファイルを生成してくれるExtensionです。
Command + option + Nでpath入力boxが表示されます。

### [Bracket Pair Colorizer 2](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer-2)

対応する括弧が同じ色になって見やすくなります。


### [bloc](https://marketplace.visualstudio.com/items?itemName=FelixAngelov.bloc)

BLoC使用時に便利なExtensionsです。BlocやCubitの生成ショートカットやスニペットが提供されます。

### [Todo Tree](https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree)

TODO一覧を表示してくれます。


## まとめ
基本的にチュートリアルの写しです。
イメージがわかない場合は[こちら](https://www.youtube.com/watch?v=VHhksMa2Ffg&feature=emb_logo)の動画をみるとわかりやすいと思います。

いずれのExtensionも生産性があがり楽しく開発できるのでおすすめです。
サーチ画面におけるキーボードショートカット（２０２０版）

[去年もやりました](https://qiita.com/toshikawa/items/ced353b3fdb08581821b):sweat:

２０２０年はVersion8.1が出たということで、内部的なこととかは[オフィシャル](https://docs.splunk.com/Documentation/Splunk/8.1.0/ReleaseNotes/MeetSplunk)にお任せするとして、去年のキーボードショートカットからの追加分を紹介しておきます。

[Help reading searches](https://docs.splunk.com/Documentation/Splunk/8.1.0/Search/Parsingsearches)が元ネタです。 `Splunk keyboard shortcut`でググってもでない・・・ :confused: 

#コメント
ショートカットじゃないじゃんというツッコミがきそうですが、バージョン8.1といえばこれかな〜と思います。

```javascript:これまでのコメントの書き方
`comment("Search & Reportingのみ、別なAPPSでサーチするときには使えない")`
| rename COMMENT as "この書き方もできますよね"
| rex "(?<comment>(?# これもコメントに使える))"
```
とこれまでは、コメントを書くのもちょっと文字数をかける必要がありました。

```javascript:Version8.1以降のコメントの書き方
```どこでもコメントを書けるよ```
```
https://ideas.splunk.com/ideas/E-I-53
にて提言され、採用になったbackquote３つによるコメント記述

うまく処理できるのかな〜と思って、反対票を入れてましたね:sweat:

#検索履歴

動作|	Linux or Windows|	Mac OSX
|:-:|:-:|:-:
前のSPLを表示する|	Alt + P|	Ctrl + P
次のSPLを表示する|	Alt + N|	Ctrl + N
[Help reading searches](https://docs.splunk.com/Documentation/Splunk/8.1.0/Search/Parsingsearches)にひっそりと追加されています。
検索履歴自体の説明は[こちら](https://docs.splunk.com/Documentation/Splunk/Latest/Search/Interactivesearchhistory#Search_history_with_keyboard_navigation)

サーチ文を色々変えて試す時、ブラウザーの戻るボタンを使わなくてよくなったのは嬉しいですね。:smile:

#まとめ
去年も、さくっと書いた思い出があります。

:koala:もっと書くのに適した人がいるような気がするよ・・・・


Happy Splunking!
spark(3.0.1)からhdfs(hadoop-3.2.1)のファイルへアクセスする

Sparkからhdfs上のファイルにアクセスしようとすると、

connectionできない
input path does not exist 

などのエラーがでる。

Webで検索しても「これ」という記事がないのでまとめた。

個人的なポイントは、
<pre>
hdfs://192.168.76.216:9000/user/hadoop/random_data.txt
</pre>

パス名を正しく指定する場合、/user/が必要。

これをはっきり言っているところは、実は少ないのでは。。
https://docs.cloudera.com/runtime/7.2.2/scaling-namespaces/topics/hdfs-customize-the-hdfs-home-directory.html

ちなみにディレクトリも作っておきましょう

<pre>
$ hdfs dfs -mkdir -p hadoop 
</pre>

こちらの環境

■ Hadoop -> hadoop-3.2.1
■ Spark -> spark-3.0.1-bin-hadoop3.2
■ Scala -> 2.11.12

hadoopのcore-site.xmlを見て、パスを確認。

<pre>
$ cat /home/hadoop/hadoop-3.2.1/etc/hadoop/core-site.xml    

  property
     name fs.defaultFS name
    value hdfs://h-gpu05:9000 value
  property
</pre>

<pre>
$ hdfs dfs -ls                                                                                                                                                            
Found 12 items
-rwxrwxrwx   3 hadoop supergroup      25761 2020-12-11 17:47 random_data.txt
</pre>

spark-shellで、hdfs上のファイルが読めるか確認。

<pre>
Spark context Web UI available at http://h-gpu05:4040
Spark context available as 'sc' (master = local[*], app id = local-1607684979306).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 3.0.1
      /_/
         
Using Scala version 2.12.10 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_202)
Type in expressions to have them evaluated.
Type :help for more information.

scala> val file = sc.textFile("hdfs://192.168.76.216:9000/user/hadoop/random_data.txt")                                                                                                                   
file: org.apache.spark.rdd.RDD[String] = hdfs://192.168.76.216:9000/user/hadoop/random_data.txt MapPartitionsRDD[1] at textFile at <console>:24

scala> file.count
res0: Long = 100               
</pre>
複式簿記完全に理解した

## はじめに
この記事は「[完全に理解したTalk Advent Calendar 2020](https://qiita.com/advent-calendar/2020/easyeasy)」23日目の投稿記事です。

>完全に理解した、それはまさに「分かった気になったくらい」の理解できたくらいのもの！ 「覚えたての知識」や「この知識なら自信出てきた！」みたいなものから「あれ、ちょっと怪しいかも？」となり始めた知識まで自分が話したい知識をなんでもゆるーく話をしてみませんか！

>みんなにOUTPUTして、是非自分の実力を高めちゃいましょう！

>運営：　　Easy Easy
>イベント：完全に理解したTalk
>https://easy2.connpass.com/

## TL;DR

当記事は完全に理解したTalk#11で発表した内容を改めて記事化したものです。

[【オンライン】エンジニア達の「〇〇完全に理解した」Talk　#11](https://easy2.connpass.com/event/194418/)

[![thumbnail](https://files.speakerdeck.com/presentations/349a12cecb594e349c153d1846df9514/slide_0.jpg?16752827)](https://speakerdeck.com/ktky/fu-shi-bo-ji-wan-quan-nili-jie-sita)
[Speaker Deck 複式簿記完全に理解した](https://speakerdeck.com/ktky/fu-shi-bo-ji-wan-quan-nili-jie-sita)

## Why お金？
みなさん、日常的にお金は絶対使いますよね。
そう、世の中お金に溢れています。（私の持ち分は少ないですが。。。）
それはシステムの裏側も同様だと筆者は考えています。

例えば…

- ブログを書く
- アフィリエイトが発生する
- お金が発生する
- ブログシステムだが、お金のことも考慮しなければならない

となるかもしれません。
背後で発生するお金を管理するためにシステムがあると言っても過言ではないかもしれません。

## 複式簿記とは？
資料に記載のことの繰り返しとなりますが、要点は以下です。

- お金を5つの分類に分けて記したもの
- お金の流れを左右に分けて記したもの
- 決算書の元になるもの
- お金の流れが発生した原因を記したもの
- お金の流れが発生した結果を記したもの

詳細はこちらで完全に理解できます。
以降、当資料をご覧になった前提での記載があります。
[Speaker Deck 複式簿記完全に理解した](https://speakerdeck.com/ktky/fu-shi-bo-ji-wan-quan-nili-jie-sita)

## なぜ複式簿記をつけるのか？
究極の目的は`決算書を作るため`になります。
いわゆる3大諸表と呼ばれる`貸借対照表`、`損益計算書`、`キャッシュフロー計算書`というものがありますが、これのうち`貸借対照表`、`損益計算書`を作成します。

- 貸借対照表
資産、負債、資本を使って、会社の経済状況を記します。 
プラスとなる資産（現金など）がどれだけあって、マイナスとなる負債（借金）がどれだけあって、差し引いた資本がどれだけあるかを確認するための諸表です。

- 損益計算書
収益、費用を使って、会社がどれだけの利益をあげたかを記します。
プラスとなる収益（売上など）がどれだけあって、収益を上げるために使った費用（経費）がどれだけあって、この2つを差し引いた結果が利益になります。

## なぜ複式簿記を理解するのか？
システムがToCであれ、ToBであれ、最終的に行き着くところは企業会計だと筆者は考えています。
どのようなシステムでも背後でお金が動いている=複式簿記に仕訳が作られる、と考えています。
企業会計ではほぼ100％複式簿記が用いられます。（スタートアップなど規模が小さく、お金の流れが複雑ではない場合は単式簿記を用いることもあるかもしれません。）
背後で動いているお金がどのように処理されるか、管理されるかを理解すればシステム理解の助けになるかと思います。

## まとめ
お金の流れを理解することで、システム構築の直接の助けにはならないかもしれません。
しかし、業務の理解には大いに役立つと考えています。
システムは業務のために存在していることが多いため、業務の理解が進めばシステムの意味、価値、使われ方もイメージしやすくなるのではないでしょうか。
SharePoint のリストをExcelから作る

# 概要

最近Microsoft 365 Business Basicを契約し、まずはPower Automateを使いこなそうとしているのですが、
SharePointやTeamsと連携するようなことが多くありそうで、[リスト](https://support.microsoft.com/ja-jp/office/microsoft-365-%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B-93262a88-20ad-4edc-8410-b6909b2f59a5)を活用する機会が増えそうなので、一旦リストについて記事を作りました。

リストを作る方法は、[空白のリスト][Excelから][既存のリストから][テンプレート]の4つの方法で作ることができるようです。
この記事では、これらの方法のうち、`Excel`から作る方法についてまとめています。

# まずはExcelを用意する

以下のように、Group / Name / Address という3つの項目を定義したアドレス帳を用意しました。
このExcelは、SharePointのドキュメントに新規で作ったExcelとして用意しています。

![スクリーンショット 2020-12-11 19.17.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/2bc7dd99-f421-ecb8-fc82-2bc1c48c4934.png)

※ちなみに、このままではExcelからの取り込みに失敗する失敗例です。

# Excelからリストを作ってみる（失敗する）

[+新規] -> [リスト]でリストを作成ダイアログを表示し、`Excelから`を選択します。
![スクリーンショット 2020-12-11 19.25.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/744e6264-b1b5-a67e-0cb6-1490fc012d45.png)

SharePointのドキュメントにアップしてある`アドレス帳.xlsx`を選択して[次へ]ボタンを押下します。
![スクリーンショット 2020-12-11 19.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/53f48be9-b049-9be0-678a-42895e2f6e37.png)

すると、`このファイルにはテーブルがありません。リストとしてインポートするにはテーブルを定義する必要があります。`というメッセージが表示され、インポートに失敗します。
①〜④の手順にある通り、[テーブルとして書式設定]をしないと、正しくExcelからインポートすることができないようです。
![スクリーンショット 2020-12-11 19.26.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/fadf6aa3-4d57-d4b8-b18a-9d8df1343c15.png)

# Excelのデータをテーブルとして書式設定する

テーブル領域として、ヘッダーとデータを全て選択した状態で
[ホーム] -> [テーブルとして書式設定]から、任意の書式を選択して下さい。
※どの書式を選択しても違いは見た目だけです。
![スクリーンショット 2020-12-11 19.32.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/786a0003-a510-0cc1-fb93-c12ca0f3e58e.png)

先頭行をテーブルの見出しとして使用するにチェックをつけてOKボタンを押下します。
![スクリーンショット 2020-12-11 19.33.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/a9709bae-c57f-76d3-3ff2-72bd9424f735.png)

以下のような感じになります。
![スクリーンショット 2020-12-11 19.33.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/8f3b6e01-234a-f29a-b4d3-800bb5af73a3.png)

[デザイン]タブのテーブル名は、デフォルトだと「テーブル１」のような値となっていますが、日本語文字列を利用すると、その他のサービス（PowerAutomateやPowerAppsなど）で利用するときに不具合が起きることがあるようなので、英語名称に変更しておきます。
![スクリーンショット 2020-12-11 20.00.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/f94cb219-9e3f-af97-4e41-a0596200b597.png)

# Excelからリストを作る（成功）

上記までのセットアップで、Excelからリストを作る準備が整いましたので、やってみます。
取り込みの画面では、このような感じになります。

- デザインタブのテーブル名を設定した内容がコンボボックスに表示される
- リストには必ず「タイトル」という定義が必要になる（タイトルがリンク表示になって、詳細画面を表示するなどで利用されるようです。）

![スクリーンショット 2020-12-11 20.05.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/2c4a8f53-79d0-3842-4196-aaa6db0a9a68.png)

取り込みが完了すると事前に準備したデータも一緒にロードされています。
タイトルで指定された項目が左に来てしまうんですね。。。
![スクリーンショット 2020-12-11 20.08.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/0f5f03b4-58a2-cd45-9c4f-a3073508c197.png)

こんな感じでExcelから簡単に？SharePointのリストを作ることが可能です。