OmniAICreator/Qiita-1.07M huggingface dataset:
【Android】スワイプで画面を切り替える(ViewPager)

自分用にメモ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/bc9256dd-51ee-a626-ff0a-edb0e9fc2446.gif" width=50%>

# 構成
・表示用レイアウト(activity_main.xml)
・スワイプの中身(fragment_view_pager.xml)

# レイアウト

レイアウト表示部分

```activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.viewpager.widget.ViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
```

スワイプの中身（この場合はテキスト表示）

```fragment_view_pager.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="60sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
```


# 処理

Adapterを作成し、それぞれのページを埋め込む

```MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        pager.adapter = PagerAdapter(supportFragmentManager)
    }

    private inner class PagerAdapter(fm: FragmentManager) :
        FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
        override fun getCount(): Int = 3
        override fun getItem(position: Int): Fragment = ViewPagerFragment(position)
    }
}
```

ページ番号を表示させる

```ViewPagerFragment.kt
class ViewPagerFragment(private val page: Int) : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View = inflater.inflate(R.layout.fragment_view_pager, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        number.text = page.toString()
    }
}
```
文字コード関連のLinuxコマンド

## この記事は

- タイトル通りです。
- ググればわかることしか書いてません。かんぜんに個人メモです。

## 自己紹介

Java（Spring Boot）のWebアプリ開発を主にやってます。

### コマンド
### 改行の有無を確認
```bash
od -c hoge.dat
```

### 改行を除去
```bash
tr -d '\n' < in.dat > out.dat
```

### 文字コードを確認
```bash
file -i hoge.txt
```

### iconvで対応する文字コード一覧の表示
```bash
iconv -l
```

### iconvで文字コード変換
- ASCIIからEBCDICに変換

```bash
cat file_s.txt | iconv --from-code=ASCII-US --to-code=IBM930 > out.txt
```

## 参考
  - https://end0tknr.hateblo.jp/entry/20090227/1235722211

## さいごに
以上です！
【Vue.js/Vuex】Vuexのstoreをモジュール分割した際、gettersに引数を渡す方法

##はじめに
私は業務未経験で現在エンジニアを目指して学習中のものです。そのためこちらの記事の信憑性は保証しかねます。
また記事の執筆も初めてですので拙い文章、伝わりづらい表現等あるかと存じますが、ご容赦ください。
##目的
タイトル通りモジュール分割したstoreのgettersを呼ぶ際に引数を渡したいです。
**Nuxt**を静的サイトジェネレータとして用いた**JAMstack**サイトを作成しています。Nuxtですので状態管理には**Vuex**を使用しているのですが、割と早い段階でファイルを分割したくなりました。
以下公式ガイドやQiita記事を参考に実装しました。
・[Vuex公式ガイド](https://vuex.vuejs.org/ja/guide/modules.html)
・[Vuexでモジュールと処理を細分化する](https://qiita.com/xKxAxKx/items/9f3d1d5dcf2717d95c90)
・[Vuex で modules を利用した際の getters の使い方]
(https://qiita.com/sutoh/items/7e0bd63f9cb47bf48db9)

```
└── store
    ├── index.js
    └── item.js
```

全ての投稿を`state`に格納しておりましたがコンポーネントから指定した投稿を取得するような仕組みにしたかったため、`getters`に引数を渡して投稿を取得しようとしました。（下記の例では6件分の投稿を取得しようとしています。）

```javascript:item.js

export const getters = {
  appearItem: (state) => (contentsIndex) => {
    return state.allItem.slice(contentsIndex - 1, contentsIndex + 5)
  }, 
}
```
##実装
モジュール分割した場合のgettersの呼び出し方は以下のようになります。

```javascript
this.$store.getters['item/appearItem']
```
以下のようなやり方ではうまくいきません。

```javascript
this.$store.getters.item.appearItem
```
そこで引数を渡す場合

```javascript
this.$store.getters['item/appearItem(index)']
```
こうすればうまくいくのではないかと考えましたが、結果はダメでした。

##結論
自分で調べられた範囲内ではピンポイントな答えが見つからなかったため思いついた手段をかたっぱしから試してみたところ

```javascript
this.$store.getters['item/appearItem'](index)
```
こう書くことでうまくいきました！
##まとめ
「もっとこうした方がいい」や「これはこのような理由で動いている」等の指摘をいただけますとありがたいです。
ここまでお付き合いいただきありがとうございました。
プロジェクト向けのPython環境整備

経験として、CentOSでPythonの環境整備の過程を記録する。

## Python 本体

安定の上、できるだけ新しいバージョンアップを用いる。

現時点ではPython 3.9が出たが，3.8.6の方がもっと安定と思うので、それを使う。

Linux自身が管理するパッケージはバージョン低いので、またCondaとやらが面倒臭いと思い、ソースコードよりコンパイルする方法を用いる。

まず開発用の諸々のツールをインストールする。それを略すると、Pythonとpipに不具合が出る可能性がある。

```bash
# CentOS
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel libsqlite3-dev
```

```bash
# Debian
apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget libsqlite3-dev libbz2-dev llvm xz-utils tk-dev
```

次は、Pythonのソースコードを入手せよ。[Pythonのサイト](https://www.python.org/downloads/)で探し、tgzをダウンロードする。

そして、rootとして実行する。

```bash
tar -zxvf Python-3.8.6.tgz  
cd Python-3.8.6
./configure prefix=/usr/local/python3 --enable-loadable-sqlite-extensions
make && make install

ln -s /usr/local/python3/bin/python3.8 /usr/bin/python3.8
ln -s /usr/local/python3/bin/pip3.8 /usr/bin/pip3.8
```

最後に`/usr/bin/python3`や`/usr/bin/pip3` がさきのリンクファイルにリンクする。すでに古いバージョンがあれば、削除して作り直すしかない。

## プロジェクトの独自の運行環境

Python 3.8.6 のような最近のバージョンはvenvという部品があり、それは十分と思う。

```bash
/usr/bin/python3 -m venv venv
```

運行は以下のように。

```bash
source venv/bin/activate || exit 1
python3 [PATH_OF.PY]
deactivate
```

## 依頼されたパッケージについて

第三者のパッケージを使うプロジェクトには requirements.txt が必要である。

```bash
source venv/bin/activate || exit 1

# ミラーを使う場合はそれを付き添い： -i "mirror_url"
pip3 install -r requirements.txt || exit 2

deactivate
```

## 常に出る問題

Ｄｅｂｉａｎにそう行うと、次のエラーが出るのが多い。

```
$ python3 -m venv venv
Error: Command '['/var/code/python-project/venv/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 2.
```

そこの　`/var/code/python-project/venv/bin/python3 -Im ensurepip --upgrade --default-pip`　を実行してみると、`subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1.`　が最後の一行として見える。

潜んでみろう。

```
$ lsb_release -a
Traceback (most recent call last):
  File "/usr/bin/lsb_release", line 25, in <module>
    import lsb_release
ModuleNotFoundError: No module named 'lsb_release'
```

ほかの資料によると、lsb_release　はＤｅｂｉａｎが持ってきたpythonのmoduleで、後でインテトールしたpythonのmoduleにはない。なので　`sudo find / -name lsb_release.py`　を用いて、システムについてきたやつを探してみる。やはり、`/usr/lib/python3/dist-packages/lsb_release.py`　が見つかった。コピーせよ。

```
sudo cp /usr/lib/python3/dist-packages/lsb_release.py /usr/local/python3/lib/python3.8/
```
【2020年11月版】circleciのステータスバッジをREADMEに表示させる方法

駆け出しのエンジニアではありますが、circleciを導入してみて、ふと`「READMEにあるcircle ciのバッジってどうやって表示するんだろう」`と疑問に思って、いろいろ調べてみたものの、なんか情報が古そう(多分circle ci自体のUIが変わったっぽい？)だったので、英語で調べていたら見つかりました。

今回はその備忘録です。
また、時間が経過するとやり方が変わるかもしれないですがその辺はご了承ください。

## Status Badgesの表示
[Adding Status Badges](https://circleci.com/docs/2.0/status-badges/)と言うCircleCIの公式ドキュメントに方法が記載されています。

ここでも方法を説明します。

```md

# テンプレート
[![<ORG_NAME>](https://circleci.com/<VCS>/<ORG_NAME>/<PROJECT_NAME>.svg?style=svg)](<LINK>)

# 例
[![CircleCI](https://circleci.com/gh/circleci/circleci-docs.svg?style=svg)](https://circleci.com/gh/circleci/circleci-docs)
```
以下ではマークダウンのURLの書き方についてまとめます。

|変数|説明|
|:--|:--|
|ORG_NAME|circleCIを導入したプロジェクトのgithubのuser名|
|VCS|VCSプロバイダー。githubなら"gh"、BitBucketなら"bb"|
|PROJECT_NAME|プロジェクト名。circleciを導入したもので、ダッシュボードに表示されている|
|LINK|ステータスバッジがクリックされたときに表示されるリンク|

![スクリーンショット 2020-11-10 23.15.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509690/34bf2d22-6fa2-1202-d520-f47db59007f5.png)

僕の場合はこんな感じになりました！！


ちなみに、バッジには様々なスタイルがあるそうで、[Shields io](https://shields.io/)にて、いろいろなスタイルが紹介されています。
変更の方法は、
`.svg?style=svg`の`style=svg`を上記のShields ioで紹介されているものに置き換えるだけです！
[Xcode/Swift5] returnの後の処理が意図せず実行される「Expression following 'return' is treated as an argument of the 'return'」に注意

開発環境はXcode 12.1です。

デバッグ中、何かの拍子に処理の途中に`return`させることがあります。

```swift
func hoge(){
    print("A")
    return
    print("B")
    print("C")
}
```

当然`print("A")`が実行されます。
で、衝撃なんですが、`print("B")`が**実行されます**。
# なぜ？？？？？？
もっと複雑なコードの中で同様の事態に遭遇し、20分ほど悩みました。
しかし実はwarningが出ています。複雑なネストの深いコードが影響してwarningが全文表示されず、私は「当然`code after 'return' will never be executed`と書いてあるのだろう」と考えて読みもしなかったのですが、これが大変な内容でした。
> Expression following 'return' is treated as an argument of the 'return'

つまり、`return`の次の部分が返り値と解釈されるよ、とのこと。
確かに、`print("B")`は`Void`を返します。関数`hoge`の返り値も`Void`です。ですから解釈は通ります。つまり冒頭のコードはこう解釈されていることになります。

```swift
func hoge() -> Void {
    print("A")
    return print("B")
    print("C")
}
```
`print("B")`が呼ばれるわけです。そんなつもりでコードを書いたわけではないのですが……。

warningを無視せず読み、変なところに`return`を書かず、素直にコメントアウトしよう、という気持ちになりました。
Python pywin32(win32com) Excel Range.Offset Range.Resize Range.Address


```py
    print( ws.Range("A1").GetOffset(3, 3).GetAddress(False, False) )
    print( ws.Range("A1").GetResize(3, 3).GetAddress(False, False) )
```

Offset  -> GetOffset
Resize  -> GetResize
Address -> GetAddress

https://thecodingforums.com/threads/328174/

https://stackoverflow.com/questions/63112880/

https://stackoverflow.com/questions/45580862/

https://qiita.com/feo52/items/150745ae0cc17cb5c866
Common Lispの外部ライブラリについてのまとめ

　Common Lisp 1年目です。
　Common Lispにはいろいろな外部ライブラリがあるので、そのいくつかについて簡単にまとめてみました。 (完成が遅れました、ライブラリを増やしてく予定です。)
## cl-ppcre
　正規表現関連のライブラリです。 Perl を使ってるっぽいです。

```lisp
;ロード
(ql:quickload :cl-ppcre)
```

### 分割
　cl-ppcre:split は文字列を分割してリストにして返します

```lisp
;(cl-ppcre:split 正規表現 分割される文字列)

(cl-ppcre:split " " "Hello World")
;=> ("Hello" "World")

(cl-ppcre:split " " "  a") 
;>("" "" "a")
;分割する文字が複数あると、空文字がリストに含まれます

(cl-ppcre:split "," "a,b,c,")
;=>("a" "b" "c")

(cl-ppcre:split "[,.]" "a,b.c,d,e.f")
;=>("a" "b" "c" "d" "e" "f")
;正規表現で分割
```

### 置換
　正規表現で置換をします。

```lisp
(cl-ppcre:regex-replace-all 置換前 文字列 置換後)

(cl-ppcre:regex-replace-all "[,.]" "a,b.c,d.e,f,g" " ")
;=>"a b c d e f g"

(cl-ppcre:regex-replace 置換前 文字列 置換後)
;最初のだけ置換します。

(cl-ppcre:regex-replace "[,.]" "a,b.c,d.e,f,g" " ")
;=>"a b.c,d.e,f,g"
```

## 詳細
* [逆引きCommon Lisp](https://lisphub.jp/common-lisp/cookbook/index.cgi?CL-PPCRE)
* [CLiki](https://www.cliki.net/CL-PPCRE)
* [GitHub](https://github.com/edicl/cl-ppcre)

## manifest
　入ってるライブラリのドキュメントなどをブラウザで表示します。

```lisp
(manifest:start) 
;=>"http://localhost:34603/"
;かえってきた URL にブラウザからアクセスするとドキュメントを見ることができます。

(manifest:stop)
;終了
```
↓スクリーンショット
![あ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599537/5532e631-6154-be48-cd80-639d5c1346d9.png)

http://localhost:34603/quicklisp のように、先程のURLの最後に quicklisp をつけると、 quicklisp のパッケージを管理することができます。
### 詳細
* [CLiki](https://www.cliki.net/manifest)
* [逆引き Common Lisp](https://lisphub.jp/common-lisp/cookbook/index.cgi?%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%EF%BC%88%E9%96%A2%E6%95%B0%E4%BB%95%E6%A7%98%EF%BC%89%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B)

## 終わりに
　ずっと寝てたら、アドベントカレンダーの期限が今日だったことを忘れてしまって...未完成のまま公開されてしまったので恥ずかしい思いをしてしまいました。まだ、載せたライブラリの数も少ないので、少しずつ増やしていきたいと思います。
スマホに草を生やそう(GitHub)


# 自己紹介
むちゃんです。
関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪の2回生です😁 (2020.11.30現在)

イベントなど回っているので是非大阪辺りの方は会いましょう！!

# GitHubってなんぞや??
* Git = バージョン管理を行うためのモノ
* GitHub = それをツールにしたモノって思ってもらって大丈夫です。

**この辺りを読んでもらえれば分かると思います。**
1. [知っておきたい知識](https://www.modis.jp/staffing/insight/column_30/)
2. [サルでもわかるGit講座](https://backlog.com/ja/git-tutorial/)

## なんでGitHubを使うの?
1. 自身の書いたソースコードを全世界に公開することができます。
2. バージョンを管理できるので変更やバージョンアップに対応できる

など色々あります。

**※この辺りは色んな記事があるので是非調べてみてください。**




## ここからが本題
### 今回の完成イメージ
![](https://i.imgur.com/KBMBu1D.jpg)


**スマホに草を生やしちゃいましたねww**
スマホを開いてこれが表示されていれば立派な**GitHubエンジニア**です。
<br>
**[個人意見]**
これをしたいからGitHub触ってみよう程度で思ってもらえたら僕的に嬉しいです😄

## やり方

**[流れ]**

1. GitHubの登録
2. リポジトリの作成 & commit
3. Contribution Graphs for GitHubのインストール
4. ウィジェットの設定

<hr>


### ①...GitHubの登録からcommitまで


この記事を参考にしてもらえると出来ます。

**[作成からcommitまで](https://note.com/mittimellan/n/n2e4fe2019575)**

<br>


### ②...Contribution Graphs for GitHubのインストール

ここからインストールできます。

[AppStore](https://apps.apple.com/jp/app/contribution-graphs-for-github/id1537192731?ign-mpt=uo%3D2)

<br>

### ③...ウィジェットの設定
インストールが完了後、ウィジェットから設定してもらえれば無事完成します🎉🎉

![](https://i.imgur.com/kkSY5hb.jpg)


# 完成
**これで画面の向こうのあなたも無事GitHubエンジニアになれましたね。**

**[もっと学びたい向け]**

GitHubについて詳しく学びたい方はこのミッションにチャレンジしてもらえれば良いと思います。
[GitHub実践ハンズオン](https://qiita.com/TakumaKurosawa/items/79a75026327d8deb9c04)

**これについては似た記事を以前まとめたので追加して紹介しときます**。
[以前まとめた記事](https://note.com/muchang0824/n/n8addbaa7d58c)


**以上お疲れ様でした！！🎉🎉**

# あとがき
今回は自分なりにGitHub関連について簡潔にまとめてみした😄

次回はまだエディタついてまとめてみたいと思います。

Twitter [<font color="green">@HomgMuchan</font>](https://twitter.com/HongMuchan)  ぜひフォロー待っています❗️
firebaseでデプロイ後cssやjsを反映させる方法

※firebaseでデプロイまでの知識がある前提で執筆致します。



結論から申し上げますと


■相対パス指定

■キャッシュ削除


です。


詳細についてですが、
publicディレクトリに格納するので、htmlファイルの絶対パス→相対パスへの変換はわかるのですが、キャッシュ削除の原因はいまいち分かりません。。。


まだまだ駆け出しの身ですのでアドバイスや間違いの指摘等ございましたら宜しくお願い致します。
駆け出しエンジニア の学習記録　3日目Git,GitHub 後編


<h1>メモ</h1>git editor 登録できてなかったので↓参考に
https://qiita.com/matyahiko2831/items/8eb2eabbd94ed335218e

<p></p>

エラー文
hint: Waiting for your editor to close the file..


GitHubにpushしたコミットをリベースするのはNG
git push -f　は絶対にNG

<h1>使用したコマンド</h1>
・git rebase -i <コミットID>　
↳ git rebase -i HEAD~3 3つ前からのコミットの順でrebaseしていく
・git tag tagを確認できる　（いつのコミットかわかるのでバグの時に対応しやすい）
・git tag -a <タグ名> -m"<メッセージ>"　

vim操作　
yy 一行コピー
dd 一行削除
esc コマンドモードに切り替え　
:wq　保存して終了
AWS日記21 (Amazon ElastiCache)

# はじめに
今回は Amazon ElastiCache を試します。
サポートされているエンジンのMemcached ( Amazon ElastiCache for Memcached ) を試します。
[Lambda関数・SAMテンプレート]
(https://github.com/tanaka-takurou/serverless-elasticache-page-go)



# 準備
[AWS SAM の準備をします](https://qiita.com/tanaka_takurou/items/cae7c19fc3aaf0031abb)

[Amazon ElastiCacheの資料]
[Amazon ElastiCache](https://aws.amazon.com/jp/elasticache/)


# AWS SAM テンプレート作成

AWS SAM テンプレートで API-Gateway , Lambda, Amazon ElastiCache の設定をします。

[参考資料]
[AWS SAM テンプレートを作成する](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/tutorial-lambda-sam-template.html)

### Amazon ElastiCacheの設定は以下の部分
```yaml
  ElastiCacheSecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupDescription: 'Elasticache Security Group'
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '11211'
          ToPort: '11211'
          CidrIp: '0.0.0.0/0'
  ElastiCacheCacheCluster:
    Type: AWS::ElastiCache::CacheCluster
    Properties:
      AutoMinorVersionUpgrade: 'true'
      AZMode: single-az
      CacheNodeType: cache.t2.micro
      Engine: memcached
      NumCacheNodes: '1'
      VpcSecurityGroupIds:
        - !GetAtt ElastiCacheSecurityGroup.GroupId
```


# Lambda関数作成

※ Lambda関数は aws-lambda-go を利用しました。Memcacheパッケージは bradfitz/gomemcache を利用しました。


### memcache に値を入れるには gomemcacheの Set を使う
```golang
func setItem(key string, value string) {
	if memcacheClient == nil {
		memcacheClient = getMemcacheClient()
	}
	memcacheClient.Set(&memcache.Item{Key: itemKey, Value: []byte(value)})
	return
}
```


### memcache から値を取得するには gomemcacheの Get を使う
```golang
func getItem(key string)(string, error) {
	if memcacheClient == nil {
		memcacheClient = getMemcacheClient()
	}
	it, err := memcacheClient.Get(key)
	if err != nil {
		return "", err
	}
	return string(it.Value), nil
}
```

# 終わりに
Redis( Amazon ElastiCache for Redis ) もサポートされているため、今後試していこうと思います。

<details><summary>参考資料</summary><div>

[Amazon ElastiCache](https://qiita.com/leomaro7/items/f031cfdd7d12d5d5ccc5)

[GoのMemcacheパッケージ比較](https://qiita.com/masahikoofjoyto/items/a62a1c2b6c4affca772f)

[Amazon　ElastiCache(Memcached)をPython3.7から操作](https://xp-cloud.jp/blog/2019/10/28/5837/)

[AWS 基礎入門チュートリアル – ElastiCache 構築・設定編](https://cloud-textbook.com/144/)

[Amazon ElastiCache の特徴](https://aws.amazon.com/jp/elasticache/features/)
ターミナルでCarthageの.sh実行のエラー：Build Failed Task failed with exit code 65

プロジェクトで使っているライブラリは、Carthageで管理しているものがあって、
ターミナルでPod Installではなく、
CarthageのコマンドやPodのコマンドが混じって書かれている。
そのファイルがxxx.shというファイル、
それをターミナルで実行した時には
Build Failed 
Task failed with exit code 65
...
This is usually indicates that project itself failed to compile.
please check the xcodebuild log for more details: /var/folders/...carthage-xcodebuild.sHeTHo.log

と出ました。冷静に分析しましょう。
言われた「 /var/folders/...carthage-xcodebuild.sHeTHo.log」へ入ってみると、
/bin/sh -c /Users/name/Library/Caches/org.carthage.carthageKit/Derived/...Script-xxxxx.sh

cp /Users/name/ExternalModules/... /users/name/...
cp: /Users/name/ExternalModules/...is a directory(not copied).
Command PhaseScriptExectution failed with a nonzero exit code
...
The following build commands failed:
PhaseScriptExecution Run Script Script-xxxxx.sh
(1 failure)

言われた「Script-xxxxx.sh」へ入ってみると
確かに「/Users/name/ExternalModules/...」の中身をあるpathへCopyすると書かれている

なんでこのコマンドが失敗だろうと思いながら、
Copy元の「/Users/name/ExternalModules/...」へ入ってみると、空っぽです。。。
だからCopy失敗しました。

前にMacの容量が足りなかった時にいっぱいCacheを削除してしまったせいかもしれない、
「/Users/name/ExternalModules/...」の中身を復元してみると、
無事に実行できました。



●勉強になったこと：
エラーlogを分析すること。Shellのコマンドをもっと勉強すること。
Shellで書かれていることが頻繁に出てくるので、Shellのコマンドが分からないなら、logを見てもしょうがいない。
今回は他人の知恵をお借りして、shellのコマンドをわかったら、logを見てどこに失敗していたことがわかって、
詳しく原因調査ができたことが解決のカギとなりました。
【JavaScript】JavaScriptにおけるクロージャーとは

※当方駆け出しエンジニアのため、間違っていることも多々あると思いますので、ご了承ください。また、間違いに気付いた方はご一報いただけると幸いです。

#クロージャーとは
####「外側のスコープにある変数への参照を保持できる」という関数が持つ性質のこと。
...なんのこっちゃ。

実際にクロージャーを用いたコード

```javascript
function outside() {

    let count = 0;

    function inside() {
        count = count + 1;
        return count;
    }
    return inside;
}
```
このような関数があるとします。
この時、

```js
const myCounter = outside();
console.log(myCounter);
```
このように、outsideを実行して、変数myCounterに格納し、中身をみてみると。

```js
>>  function inside() {
        count = count + 1;
        return count;
    }
```
当然、関数が返ってきます。

では、下のようにmyCounterを呼び出した結果をみてみると

```js
console.log(myCounter());

>> 1
```
この時、countは、 **「スコープチェーン」** によりoutside配下のcountの参照します。
スコープチェーンとは、
変数を参照する際には、現在のスコープから外側のスコープへと順番に変数が定義されているかを確認することです。
つまり、現在のスコープ

```js
    function inside() {  //ここ  }
```

に、countなんて定義されてないぞ！!しゃーない、外に見に行くか。はー、めんどくさ。

```js
function outside() {
    let count = 0;
}
```
おお、すぐいた！！
ということで、一つ外側のスコープoutsideにcountが定義されてたので
めでたく count が　0であることが分かりました。
そして、insideで定義された処理を実行した結果、当然返り値は

```js
>>1
```

となるのです。
では、二回実行するとどうなるか。

```js
console.log(myCounter());
console.log(myCounter());

>> 1
>> 2
```

となります。。。。なんでや。

これこそが **「クロージャー」** の動きとなります。

なぜ、このような挙動をとるのか。

JavaScriptの「静的スコープ」と「メモリ管理の仕組み」によります。

##「静的スコープ」について
JavaScriptのスコープには、どの識別子がどの変数を参照するかが静的に決定されるという性質があります。 

つまり、どこでinside関数を呼び出そうが、inside内のcountは、outside直下のcountを参照するということですね。

**「this」**という特別なキーワードだけは、呼び出し元によって動的に参照先が変わります。 

##「メモリ管理の仕組み」について
変数のデータはパソコンの上のメモリに保存されます。これは、決まったタイミングで解放しないといけません。メモリは有限だからです。
JavaScriptでは **「ガベージコレクション」** という「どこからも参照されなくなったデータを不要なデータと判断して自動的にメモリ上から解放する仕組み」をとっています。

逆にいうと、参照され続けている限りメモリには保存され続けます。
「関数の中で作成したデータは、その関数の実行が終了したら解放される」訳ではありません。

例えば

```js

function outX () {
  let x = 1;
  console.log(x);
}
outx();
```

この関数が実行された時、xが参照する1が保管されたメモリが確保されますが、関数終了後に、このメモリは解放されます。これは**「関数が終了したから」**ではなく**「xが参照されなくなったから」**です。

よって表題例の場合
内側の関数内から、外側の関数内の変数countを参照しているため、メモリが解放されず値を保持し続けるということですね。

よって一回目の

```js
myCounter();
```
が実行された段階で、countには　1　が格納され、メモリ上に保持されるので

二回目に

```js
myCounter();
```
が呼び出された時、返り値は　2　となります。

また、このように再度outside()を実行しなおしすと、

```js
const myCounter = outside();
const myCounter2 = outside();

console.log(myCounter()); // => 1
console.log(myCounter2()); // => 1
```

と、別々の関数が作り直されて　let count = 0が 各々で実行されるので、当然結果は上記のようになります。

##こんなことしなくても、関数内でプロパティーを定義したらいいやん。

と思われるかもしれません。

下記のcountUp関数は、自身のプロパティcountの値に　＋１　をして、呼び出し元に返却する関数です。

```js
function countUp() {
    // countプロパティを参照して変更する
    countUp.count = countUp.count + 1;
    return countUp.count;
}
// 関数オブジェクトにプロパティとして値を代入する
countUp.count = 0;
// 呼び出すごとにcountが更新される
console.log(countUp()); // => 1
console.log(countUp()); // => 2
```
これでも、プロパティとして値を保持し続けます。しかしクロージャーとの違いは、

**関数の外からでも値を変更できてしまう。**ということです。

```js
countUp.count = 0;
```
そもそもこの式が、外から関数のプロパティーの値を操作してますよね。
関数をconstで 変数に格納して定義したとしても、関数もオブジェクトでありミュータブルであるため、プロパティの値の変更は可能です。

詳しくはこっちの記事をごらんください。

https://qiita.com/sho_U/items/3d64d23fe31ed09e9dcb

上記のクロージャーだと、関数の外から直接countの値を変更することはできません。

関数の外から count = 100;　みたいなことをしても 関数スコープに阻まれるので操作できないのですね。

これこそがクロージャー（「閉ざされた。」）の由来であり、一番のメリットであります。この辺は勝手な想像ですが。

ということで　自分なりに学習したクロージャーについてでした。

。。。合ってますか？
【C#】WordファイルをPDFに一括変換する.NETアプリを作ってみた

タイトル通りの内容ですが、内部で使用している変換には`Microsot.Office.Interop.Word`を使用しています。

Google先生に聞くとこの辺りの情報は豊富ですし、COMオブジェクト故に「`Microsot.Office.Interop.Word`は使うな！」という意見も見つかりますが、PDF保存には必要な選択肢なので避けることはできません（ファイルの読書きだけならマネージドなライブラリを使用してもよさそうですが）。あと、保証が無いオープンソースのライブラリを使用することの是非もあります。個人で使用するならともかく、エンタープライズ向けアプリならその視点が必要では。

まぁ、有償であればPDF変換ライブラリはあるかもしれませんが。

本筋ではない補足ですが、OfficeファイルのPDF変換は他にも方法があり、Officeファイルの一括変換はAcrobat有償版で一応はできるのと、2つ目はやや面倒な方法ですが、プリンタドライバーの「Microsoft Print to PDF」を使用することも可能です。後者はWindows10に標準搭載されていますが、保存するファイル1つ1つの名称を都度聞いてくるので、やや手間です。

なので、同階層にあるWordファイルを一括変換するアプリを作ってみようと思いました。それが経緯です。

※ちなみに、これに関連して、ガベージコレクションのコーディング例を検証した記事は以下になります。

- [【.NET (C#)】COMオブジェクトのガベージコレクションの動作を検証してみた](https://qiita.com/yuki_h3/items/e7c709d604446284e824)

## 必要な環境
- .NET Framework 4.6.1 or later
- MS Wordがインストールされていること（2013, 2019のWordで確認）
- OSはWindows 8.1と10で確認済

## 画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323247/350b0bcc-7d00-78f4-1f0c-a2c8c698b987.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323247/14aec7de-887a-196e-85f1-be765f10f5ab.png)

##アップロード先

一応、ソースをGitHubにアップロードしています。

- [WordToPDF (GitHub)](https://github.com/yukgithub/WordToPDF)

英語が下手なのはご容赦下さい。

##注意点

マイドキュメントなどをリダイレクトしている場合（VDI環境でやるやつ）、それらの特殊フォルダの中で実行するとパスが上手くとれないと思います（￥￥で始まるネットワークパスが入るはず）。この辺りは要調査中。

##開発に当たっての所感等

`Microsfot.Office.Interop.Word`がCOMオブジェクトで、パフォーマンス及びガベージコレクションに関する問題があることは一応は知っていたので、マネージドなライブラリがないか探したが、見つからず（有償ならあるようだが）。

Word, Excelファイルはそもそもが**Office Open XML**と呼ばれる規格で実態はXMLで構成されているが、NuGetで公開されている他のOSSライブラリに関しても、あくまでファイルの読書きができるのみで、PDF変換はできない（考えれば分かることだが）。

従って、あまり使用したくはなかったが、この選択に落ち着いた。

.NETからCOMオブジェクトを使用する際に注意すべきガーベジコレクション（GC）の動作については、別のQiita記事で公開する予定。
[87, 101, 32, 97, 114, 101, 32, 116, 104, 101, 32, 65, 108, 99, 104, 101, 109, 105, 115, 116, 115, 44, 32, 109, 121, 32, 102, 114, 105, 101, 110, 100, 115, 33]

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

# はじめに
- 気になりますよね
- ぜひIExを起動してご確認ください

```elixir
$ iex

iex> [87, 101, 32, 97, 114, 101, 32, 116, 104, 101, 32, 65, 108, 99, 104, 101, 109, 105, 115, 116, 115, 44, 32, 109, 121, 32, 102, 114, 105, 101, 110, 100, 115, 33]
'?????'
```

- まずは[Elixir](https://elixir-lang.org/)をインストールしてください
- 手前味噌な記事ですが[インストール](https://qiita.com/torifukukaiou/items/d04d0273749c41eb50af#0-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)などを参考にしてください

# ヒント

## elixir means that a magic liquid that is believed to cure illnesses or to make people live forever.
- 不老不死の霊薬っちゆうことですね

> Elixir (エリクサー) は並行処理の機能や関数型といった特徴を持つ、Erlangの仮想マシン (BEAM) 上で動作するコンピュータプログラミング言語である。ElixirはErlangで実装されているため、分散システム、耐障害性、ソフトリアルタイムシステム等の機能を使用することができるが、拡張機能として、マクロを使ったメタプログラミング、そしてポリモーフィズムなどのプログラミング・パラダイムもプロトコルを介して実装されている。

[Elixir (プログラミング言語)](https://ja.wikipedia.org/wiki/Elixir_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))

## alchemist means that a person who studied alchemy.
- 錬金術師のことですね
- [Elixir](https://elixir-lang.org/)というプログラミング言語の使い手はアルケミストと呼ばれます
- [アルケミスト 夢を旅した少年](https://www.amazon.co.jp/dp/404275001X)は世界的ベストセラー作品(小説)です

## 影響を受けた楽曲
- [YouTube](https://www.youtube.com/watch?v=04854XqcfCY)

# 補足
- タイトルに書いた数字のリストは専門家の間では[Charlists](https://hexdocs.pm/elixir/List.html#module-charlists)と呼ばれるものです
- タイトルのようなリストの作り方は以下の通りです

```elixir
iex> IEx.configure(inspect: [limit: :infinity, charlists: :as_lists])
:ok

iex> "your string" |> String.to_charlist()                           
[121, 111, 117, 114, 32, 115, 116, 114, 105, 110, 103]
```

- (これで好きなだけ記事がかけそうですね:santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:)
    - だめかな :sweat_smile: 

# Wrapping Up :christmas_tree::christmas_tree::christmas_tree::christmas_tree::christmas_tree:  
- アドベントカレンダーに参加する敷居をさげました
    - 下げすぎ？ :relaxed:
- Enjoy [Elixir](https://elixir-lang.org/) !!! :rocket::rocket::rocket: 
- せっかく[Elixir その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir2)ができたので、埋めていきますよ :rocket::rocket::rocket: 
    - アドベントカレンダーに参加するのがはじめての方は、 @piacerex さんの [Advent Calendarの参加／書き方ガイド（NeosVR resoの解説も）](https://qiita.com/piacerex/items/15b21f39c228a95d2bda)をご参照ください！
【備忘録】htmlのselectで特定のものを選んだときに追加項目を出し、かつ必須項目に設定する

##やりたいこと
formのselect(プルダウンメニュー)で特定のものを選んだら
1.追加項目を出す
2.追加項目に必須項目を設定する

![Qiita01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515516/f5866dc5-ac31-0ac0-66da-fe5b40c97772.gif)


##結論
jsを使って入力可否を入れ替える。

```html:index.html
<form method="post" action="〇〇.php" name="〇〇_form">
  <!--もともと表示している項目-->
  <table>
    <tr>
      <th>生産地</th>
      <td><input name="生産地" type="text" id="name" required></td>
    </tr>
    <tr>
      <th>種類</th>
      <td>
        <select name="種類" id="fruitstype" onchange="entryChange();" required>
          <option hidden value="">選択してね</option>
          <option value="ぶどう">ぶどう</option>
          <option value="りんご">りんご</option>
        </select>
      </td>
    </tr>
  </table>
  <!--りんごが選ばれたら表示したい項目-->
  <table id="fruitstypeID">
    <tr>
      <th>品種</th>
      <td><input class="fruitstype-additional-items" size="30" type="text" name="品種" required /></td>
    </tr>
    <tr>
      <th>糖度</th>
      <td>
        <select class="fruitstype-additional-items" name="糖度" required>
          <option hidden value="">選択してね</option>
          <option value="あまい">あまい</option>
          <option value="あまくない">あまくない</option>
        </select>
      </td>
    </tr>
    <div>
      <input type="submit" value="確認" />
    </div>
</form>

```

```javascript:script.js

function entryChange() {
  if (document.getElementById('fruitstype')) {
    id = document.getElementById('fruitstype').value;
    //りんごが選ばれたら
    if (id == 'りんご') {
    //追加項目を表示
      document.getElementById('fruitstypeID').style.display = "";
    //追加項目の入力を有効化
      $('.fruitstype-additional-items').removeAttr('disabled');
    //りんごが選ばれなかったら
    } else if (id != 'りんご') {
    //追加項目を非表示
      document.getElementById('fruitstypeID').style.display = "none";
    //追加項目の入力を無効化
      $('.fruitstype-additional-items').attr('disabled', 'disabled');
    }
  }
}
window.onload = entryChange;
```

###考え方
必須項目であるrequiredをつけ外しするのではなく入力可否であるdisabledをつけ外しする。
ぶどうを選んだときでも追加項目が入力可能のままだと確認画面で入力されていないまま表示されてしまうが、disabledを設定することによって確認画面での表示も、必須項目未入力判定も出ない。


##他に試した方法
1.PHPの条件分岐(ボタンを押すなどして受け渡しをしなければ発動しないので違う)
2.非同期ajax（その画面のままやるなら非同期型、もっと単純なはず）
3.requitedのつけ外し（思ったままシンプルに）
$('.fruitstype-additional-items').attr('requited');が出来るんじゃないかと思っていたが、出来なかった。


##まとめ
「requitedのつけ外し」ができそうで出来なくてかなり時間を使いました。requitedのつけ外しはこんなにシンプルじゃなければ出来るようなので機会があればそっちもやってみたいな…と思います。機会があれば……
【初心者向け】IT業界における３つの業種を解説【注意点や裏話もあり】

<br>
転職するにあたり、IT業界の業種についてある程度の知見が溜まってきたので、今回はアウトプットがてら、その説明をしようと思います。
<br>
<br>

## IT業界の３つ業種
結論、IT業界は３つの業種に分ける事ができます。

<ul>
  <li>自社開発</li>
  <li>受託開発</li>
  <li>SES</li>
</ul>

それぞれ詳しく解説していきます。
<br>
<br>
<br>

## 自社開発
いわゆるスタートアップ企業やベンチャー企業のことで、その名の通り自社で何かプロダクト(製品)を開発している企業になります。

>スタートアップ企業とは既存のビジネスモデルではなく、新しいビジネスモデルを立ち上げていく会社のことです。(法人で無い場合もあります。)

<br>

### 特徴

自社開発は、1からプロダクトを作り上げる(またはブラッシュアップしていく)仕事です。

他の業種だと基本的にクライアント(仕事の依頼者)からの要望を聞き、それに合わせてプロダクトを作っていくのですが、自社開発の場合は自分達で顧客のニーズに合わせた製品を作り上げることになります。

また仕事に置いて裁量の幅が大きいのも、特徴の一つです。そのため、自分が考えたアイデアや技術を元に、プロダクトを作っていくなども、場合によっては可能です。
<br>

### 難易度
自社開発は、就職や転職が最も難しいと言われています。理由は主に２つです。
<br>

#### 即戦力が必要
１つ目の理由は、企業のキャッシュポイントが関係してきます。

そもそも自社開発におけるキャッシュポイントは、プロダクトが完成したのち、ユーザーにお金を落としてもらう、と言う部分になります。そのため立ち上げ初期の段階では、企業のキャッシュが尽きる前にプロダクトを完成させる必要があり、スピーディな開発を求められます。

よって、例え未経験であってもある程度の技術力が要求され、即戦力となれるような人材が求められるので、難易度が上がります。
<br>

#### 柔軟な思考力
２つ目の理由は、社員一人一人の裁量が広い点に関係してきます。

自社開発の場合は、良くも悪くも社員一人一人に与えられる裁量の幅が、他の業種と比べて広いです。つまり、より良くしようとチャレンジする事もできれば、現状維持のまま同じような仕事を続けることもできてしまいます。

企業が採用したがるのは、圧倒的に前者になり、要は柔軟な思考力を要求されると言う事です。これが自社開発が難しいとされる、２つ目の理由です。
<br>

### 注意点
自社開発は転職市場に置いても崇拝される事が多いですが、注意点もあります。

勘の言い方ならお気づきかもしれませんが、自社開発は自分たちのプロダクトで売り上げが上がらなければ、収益は0です。となると、会社が潰れてしまう危険性も、実は他の業種より高いと言えます。

後に紹介する受託開発もしながら、自社開発もしている所であれば、即座に潰れてしまうと言う可能性は少ないと思いますが、そうで無い場合は本当にビジネスとして成り立つプランが、その会社にはあるのか？と言うことも、考えた方が良いかもしれません。
<br>
<br>
<br>

## 受託開発
自社で何かアイディアを出して、それを製品にするのが自社開発なのに対して、受託開発は他の企業から依頼を受けて、その案件をこなす企業になります。
<br>

### 特徴
企業のクライアントから業務を自動化するためのシステム開発や、経費削減などを目的としたアプリケーションの開発など、幅広い開発が経験できるのが、受託開発の特徴です。
<br>

### 難易度
自社開発の次に難しいと言われているのが、この受託開発です。

受託開発の場合は、自社開発とは違って依頼を受ける事ができれば、その時点で収益が発生します。そのため、自社開発ほどの即戦力はあまり求められない傾向に有ります。

しかしこのコロナ禍が原因で、受託開発も案件が少なくなってきているようなので、自社開発ほどの難易度では無いものの、以前と比べると就職や転職の難易度は上がってるようです。
<br>

### 注意点
受託開発は企業から依頼を受けて収益を上げていくのですが、場合によってはその依頼した企業も、他の企業から依頼されていた(３次受け)などがあります。

IT業界では企業ごとに専門としている分野が異なるので、3次受けや4次受けなどは、ザラにあるようです。(場合によっては7~8次受けなども)

上の方の下請けなら大丈夫だと思いますが、あまりに下の方で受けてしまうと、どうしても収益が上がりにくいビジネスモデルになってしまいます。

下請けが悪などでは無いのですが、ここら辺も情報収集できるのであれば、やっておいて損は無いはずです。
<br>
<br>
<br>

## SES
最後のSESは、わかりやすく言うとエンジニアの派遣を行っている会社です。

>厳密に言うと派遣ではなく、準委任契約と呼ばれる契約形態で、エンジニアの人材を企業に提供している会社をSESと呼びます。

### 特徴
補足で書いた準委任契約について説明すると、受託開発などの業務委託は成果物単位で報酬が支払われるのですが、準委任契約は拘束時間で報酬が支払われる契約形態の事を指します。

これを企業単位で行っているのが、SESになります。
<br>

### 難易度
IT業界の中で、最も就職や転職がしやすいのが、このSESになります。

と言うのも、SESが採用する際に見ている点は、技術力よりも人柄になるためです。例えばクライアントにエンジニアを提供した際に、技術力はあったとしてもエンジニアが何か不祥事を起こしてしまったら、責任はSES側が追う事になります。

それらの問題を極力避けるために、多少技術力が乏しくても、人柄が良ければ採用すると言うのがSESで、IT業界の中でも比較的、就職や転職はしやすいと言われています。

### 注意点
SESは、エンジニアを提供してなんぼの商売です。そのため、悪質なSESでは、企業に自社のエンジニアを採用してもらえるように、実務経験の詐称を強いられる事があるみたいです。(実際に現役のエンジニアさんから聞いた話です。)

ほとんどのSESでは、そのような事は無いと思いますが、もし何か違和感を感じたら、念のため企業の口コミなどを調べておくと良いかもしれません。
<br>
<br>
<br>

## まとめ
IT業界は幅広い業種がありますが、どの分野でも大抵はこの３つの業種で分ける事ができます。業界を知っておくことは、就職や転職においても失敗しないために身につけた方が良い知識です。

面接を受ける前などには、その会社のことも調べて、どの業種なのかはしっかりリサーチしておくと、良いかもしれません。

最後まで読んでいただき、ありがとうございました！
<br>
<br>
<br>

筆者：yuki｜学習10日目で初案件獲得→現在はフルスタックエンジニア転職に向けて学習中
Qiita：https://qiita.com/yuki4839
Twitter：https://twitter.com/yuki35522891
#lesson 1 tableau public で100万行以上（エクセルでは無理）のオープンデータを公開 まずはアップしてみよう。

# 100万行以上のオープンデータの公開をtableau public でおこなってみませんか？

## 対象者

この記事は、公的機関のデータ公開担当者を念頭においています。100万行以上の表形式データを利用者にオンラインで、自由にグラフ化出来る形式でtableau public で公開する方法を紹介します。

国や公共機関のデータは、[オープンデータ](https://www.soumu.go.jp/menu_seisaku/ictseisaku/ictriyou/opendata/)として公開されることが進んでいます。

## データ公開で重要なこと

- **入手可能（今は簡単になりました）**
データ公開で重要なことは、データの入手可能でかつ容易なことです。幸いなことに、今は、インターネットの時代です、データはいくらでもインターネット上公開な可能です。東京都は、[コロナ関係のデータを、github でCSV形式で公開](https://github.com/tokyo-metropolitan-gov/covid19/tree/development/static/data)しています。github 以外には、データを公開するサービスは多々あります。CSV形式になっていれば、公開するのは簡単です。

- **活用可能（難しいけど、tableau public なら簡単）**
東京都は、このデータを加工して、[都内の最新感染動向](https://stopcovid19.metro.tokyo.lg.jp/)として公開しています。活用してもらうためにはグラフ化などの可視化がかかせません。でも、東京都のように本格的につくりこむのは、手間がかかります。そこで、tableau public をつかってできるだけ、活用もできるデータ公開をしてみませんか？　というのがこの記事の目的です。

## tableau public にデータをアップしてみよう
- **tableau public** とは、一言でいうと無料のデータ公開しかつ視覚化できるサービスです。詳しくは、[こちら](https://public.tableau.com/ja-jp/s/about)を見てください。公開出来るデータは、10Gまでなのでかなり余裕です。ただ、データは公開が必須です。でもオープンデータなら問題はないですね。

- **貿易統計からつくった練習用データをtaleauにアップ**
[custom_y_hs2_from_1998.csv](https://www.dropbox.com/s/9pww8bxq05ylpg1/custom_y_hs2_from_1998.csv?dl=0)　[kaggle](https://www.kaggle.com/zanjibar/japantradestat?select=custom_y_hs2_from_1998.csv) にもアップしてあります。データは、1998~2019 年までの税関別の貿易統計のデータです。レイアウトは、こんな感じです。

|項目名|データの型|備考|
|---|---|---|
|Year|整数|年|
|exp_imp|整数| 輸出入の区別 　0: 輸出  1: 輸入|
|Country|整数| 国のコード|
|Custom|整数| 税関コード|
|hs2|文字列|貿易コードの上２桁|
|Q1|数量１| 数量には２種類あるが、ほとんどはQ2|
|Q2|数量２| 数量として扱う|
|Value|整数| 1000円単位|

**tableu publicに登録** 
まず、登録してみましょう。[ここ](https://public.tableau.com/s/)で登録です。右上の登録ボタンを教えて、指示にしたがって、メールアドレスを登録してください。確認メールがくるのでその内容にしたがって登録確認してください。

**tableau desktop をdownload**
desktop 用のアプリケーションをダウンロードするようにと促されますので、ダウンロードしてインストールしてください。これで準備完了です。

**データのアップロード**
tableau desktop を開いて、データをアップロードして、輸出入別のグラフを作成しましょう。
[動画](https://www.youtube.com/watch?v=I-CxpxJzm64)を見ればできるでしょう。データタイプや、ディメンジョン、メジャーで注意点があります。
M1でLinux仮想を動かす(QEMU)

今朝、[M1でLinux仮想を動かす(SimpleVM)](https://qiita.com/bellx2/items/3a860c02080a520bd5a8)というエントリーを書いたのだが、家に帰ってきたらQEMUを使って、もっとお手軽＆簡単にGUIまで動くものを見つけました。

![スクリーンショット 2020-11-30 23.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/4ceaed61-426a-f839-e725-93a425b89ccb.png)


# 用意する物

* M1搭載Mac
* [ACVM](https://github.com/KhaosT/ACVM/releases/)
* 動作させたいARMディスクイメージ

※Windows ARM64もディスクイメージあれば動くらしいよ（未確認

# 使い方

* [ACVM](https://github.com/KhaosT/ACVM/releases/)をダウンロードします（バイナリー）
* 設定はなんとなく1コア2GBくらいでも十分な感じです。
* イメージをドロップします
* Start

...なんかやること無くなっちゃったぜぃ。

# 参考

[[SUCCESS] Virtualize Windows 10 for ARM on M1 with Alexander Graf's qemu hypervisor patch](https://forums.macrumors.com/threads/success-virtualize-windows-10-for-arm-on-m1-with-alexander-grafs-qemu-hypervisor-patch.2272354/)

# ぶつぶつ

これはQEMUに引数を渡すだけのUIラッパーだけど、ドロップするだけになって簡単になりました。

こんな感じで作るといいんだなーと思いながら、ソースコードを見ているのでした。さくっとMacアプリ作れるのカコイイ。
CSSで中央寄せする方法

#はじめに
　よく使う要素の中央寄せ。いまだにうまく動いてくれないことが多々あるが、今日の学びでこれだけは！

##インライン要素とブロック要素
それぞれの特徴についてはここではあげないが、そもそもインライン要素とブロック要素とで、中央寄せの方法が違うことを理解する。

###インライン要素の場合

「インライン要素」という文字を中央寄せしたいとして、

```html
<div class="parent">
    <span class="inline">
        インライン要素
    </span>
</div>
```

```css
.parent {
 text-aline: center;
}
```
<font color=red>親要素</font>に`text-aline: center;`を当てる。


###ブロック要素の場合

「ブロック要素」という文字を中央寄せしたいとして、

```html
<div class="parent">
    <div class="block">
        ブロック要素
    </div>
</div>
```

```css
.parent {
 width: 500px
}

.block {
 width: 20px
 margin: 0 auto;
}
```
<font color=red>中央寄せさせたい要素自体に</font>に` margin: 0 auto;`を当てることで、親要素の大きさの中央に寄る。

##終わりに
　恥ずかしながら、あまりブロック要素・インライン要素を意識していなくて、毎回` margin: 0 auto;`をして、うまくいかずに悩んでいた。
ansible-lintとyamllintは開発サイクルのどの位置に入れるべきか考えてみた

この記事は[Ansible Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ansible_01)第1日目の記事になります。

今回はansible-lintとyamllintはAnsible Playbook / Roleを作成する際に開発サイクルの中のどこで実行されるべきか考えてみたいと思います。

## 開発サイクルの各linter実行ポイントの定義

今回は以下の実行ポイントをあげます。

- クライアントサイド（開発者個人のマシーン)
- CIサーバ

## スコアの説明

ansible-lint、yamllintをそれぞれのポイントで実行する際の実行のしやすさを点数化します。点数計算の基準となる指標は以下の通りとします。

- 強制力
- Shift left度
- 保守性

### 強制力

linterを利用することを開発者に強制しやすいかどうか。

例えばIDEやエディターでlinterを実行する場合は各個人でlinterをインストールする必要が出て来ます。そのため開発者のスキルにより強制できない場合があります。

一方CIサーバ側に組み込む場合はほとんどの場合は必ずlinterを強制する事ができます。

A: 強制力が高い
.
.
.
F: 強制力が低い

### Shiftleft度

開発ライフサイクルの早い段階でlinterを実行できるかどうか。

例えばIDEやエディターでlinterを実行する場合git commit前にlinterがコードの異常を検知する可能性が高くなります。

一方CIサーバ側で実行する場合はgit push後になり異常検知が遅くなります。

A: 検知の位置が速い
.
.
.
F: 検知の位置が遅い

### 保守性

linterのバージョンアップ、設定ファイルのアップデート等に追従できるか

例えばIDEやエディターでlinterを実行する場合はlinterのバージョンアップは各開発者任せになります。そのため開発者のスキルレベルによってはバージョンアップの追従等が困難になる可能性があります。

一方CIサーバ側で管理する場合はCIサーバの管理者側の裁量により行えるため保守が容易になると考えられます。

A: 保守しやすい
.
.
.
F: 保守しにくい

## スコア化

実際にこれらの要素と指標を点数化すると以下の通りになります。

|実行ポイント|強制力|Shiftleft|保守性|
|---:|:---:|:---:|:---:|
|クライアントサイド|F|A|F|
|CIサーバ|A|F|A|

チーム全体の技術力が上がればlinterを開発サイクルの速い位置で実行出来るため試行回数が上がり開発速度が上がると考えられます。

ただし仮にチームに技術力が足りなくても最後はCIツールで解決出来ると言う側面もあります。

チームの技術力によりLinterの実行ポイントを徐々に左側（開発サイクルの初期の方）へ動かしていくとよいでしょう。

![スクリーンショット 2020-11-25 18.55.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79373/b0cdb82b-983e-568c-62ce-044249e90cf4.png)


## 具体的なCIパイプラインの組み方

そうは言ってもクライアント側でのlinterの処理結果に関係なく**CIサーバ側でlinterを必ず実行するパイプラインを組んでいるチームは多い**と思います。なのでCIサーバにlinterを組み込むケースをいくつか考察してみます。

### チームのスキルレベルがあまり高くない

パイプラインを直列に組むと良いです。ただしCIクレジット節約のため**CIが実行されている間は次の処理が実行されないように排他ロックを掛けます**。

![スクリーンショット 2020-11-30 23.04.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79373/f95e6c24-056c-7174-bb70-25a9ea2ba7aa.png)

|メリット|メンバーのスキルが高くなくても良い|
|---|---|
|**デメリット**|**CIの実行時間が長くなる**|

### チームのスキルレベルが高い

パイプラインを並列に組みます。ただしCIクレジット節約のため**CIが実行されている間は次の処理が実行されないように排他ロックを掛けます**。

![スクリーンショット 2020-11-30 23.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79373/c5f732e3-fac2-83c4-f35b-dad11ed69af7.png)

|メリット|CIの実行時間が短くなる|
|---|---|
|**デメリット**|**クライアント側でlintの不具合の検知に失敗すると待ち時間が発生する**|

### CIリソースを札束で買える（富豪開発環境が用意できる）

パイプラインを並列に組みます。またAWS EC2での開発ならインスタンスがいくつも起動出来るようにMolecule側で設定します。

![スクリーンショット 2020-11-30 23.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79373/c5f732e3-fac2-83c4-f35b-dad11ed69af7.png)

|メリット|CIの実行時間が短くなる、待ち時間が発生しない|
|---|---|
|**デメリット**|**金銭的に負担が大きい**|

## 結論

CIにリソースを突っ込めるチームが一番強く最終的に**時間は金で解決出来る**と言う事が分かりました:relaxed:
お祝いとご挨拶

ConoHa Advent Calendarの時期がやってきました。
おめでとう…！
初日を務めさせて頂きます、
きりお@reboonhatと申します。よしなに。

本日から31日迄の間にたくさんの記事が投稿されると思いますので、サクッとConoHa/美雲このはの魅力をお伝えできればと思います。


１、そもそもConoHaとは？
![スクリーンショット 2020-11-30 23.09.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905282/16ee36fe-8c6a-894c-aee3-e33271a8c93d.png)
　**国内最強**のホスティングサービスです。
特に**初期費用・最低利用期間なし**で使える、格安（月額400円〜）且つ国内最速を謳っているレンタルサーバーサービスのConoHa wing。これは本当にヤバい。
速い。安い。強い。~~可愛い。~~
一ユーザーの偏見まじりの見解ですが、ブログ運営やサイト開設ならまずココで間違いない（断言）。
https://www.conoha.jp/conoha/wing/
**ConoHa VPS**や**ConoHa for Windows**など、まだまだ紹介したい所はあるが後続のライターに任せる事にする。


２、美雲このはとは？

![スクリーンショット 2020-11-30 21.48.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905282/b12e1ba7-0441-07c3-8e28-c13d6c754c95.png)
 な ん だ こ の 美 少 女(CV.上坂すみれ)！？！？

図鑑によると栃木の神社から**神様**に成る為に東京へ飛び出してきた座敷童子の末裔のようだが・・・？▽
以下プロフィール（オフィシャルサイトより抜粋）
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
・名前：美雲このは（みくも　このは）
・年齢：年齢という概念はないが、人間で言うと13歳くらい
・身長：150cm+α
・体重：ひみつ
・長所：勉強熱心・わりと機転がきく
・長所：いじわると勘違いされる振る舞いをしがち
・好きなこと：アニメを見たりゲームしながらのごろごろ
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
　~~３サイズがないなぁ（ﾎﾞｿ）。~~
ConoHaの応援団長としてTwitterで広報活動を行なっているほか、Youtubeに遊んでみた、踊ってみた動画を投稿するなど日々頑張っている様子が窺える。
**めっちゃ可愛かった。投げ銭はできなかった。グッズを買います（血涙）**

そして天真爛漫に頑張りつつも時折見せるおっちょこちょいな一面や、
悪戯っ娘のような側面（JKのスカートを捲っていた前科有）、
　また（一部）ユーザーへのリプから所謂ギャップのような愛らしさを感じとることができる。
例年季節の衣装をお披露目してくれるので目の保養にもなる。顔がいい。可愛い。助かる。僥倖。謝謝。I'm lovin'it.

　しれっと前述したがこのはグッズなる物がオフィシャルサイトにて販売されている。
ConoHaサービスを利用できるイラスト付きのギフトカードや食品、ラバスト、クリアファイルなど…美雲このはに少しでも魅力を感じることがあれば是非、購入を検討してもらいたい。CDもあるぞ！
![スクリーンショット 2020-11-30 23.24.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905282/0107ac6a-921a-1743-4750-6c36c1d4c51c.png)

因みに大変、大変可愛らしい従姉妹（CV.内田真礼）の存在も確認されている。~~がそちらに力みすぎる記事を書くと座敷童子の祟りが怖いので割愛~~
~~あとNGワードはおっさn。なんでだろうね（棒）~~
補足だが合言葉は*＃清楚可愛い*……らしい。
…ん？本当？そうかな…？せやろか？うわ何をするやめr

美雲このはオフィシャルサイト
https://conoha.mikumo.com/?btn_id=conoha-wing_mikumo
このはチャンネル
https://www.youtube.com/channel/UCgff33fL0MMgjVVWMhd9ZyA
このはの過去〜現在に至るまでの軌跡が４コマ漫画で読めるのでこちらも併せて読んで欲しい。
https://conoha.mikumo.com/comic/
Vim patchダイジェスト [2020/10]

[Vim](http://www.vim.org/)のリリースされた[patch](https://github.com/vim/vim/commits/master)の説明です。
([8.2.1778](https://github.com/vim/vim/commit/5366e1aecfff4546df6af86cf98013f23ed5c3bd) ～ [8.2.1931](https://github.com/vim/vim/commit/fbcbffe1ad327f4f0da518abfd5fd7be7fec22b5))
**新機能、大幅な仕様変更には、:four_leaf_clover:が付いています。**
Vim9 scriptの実装/仕様変更/不具合修正も頻繁におこなわれています。

* [8.2.1931](https://github.com/vim/vim/commit/fbcbffe1ad327f4f0da518abfd5fd7be7fec22b5): Vim9: コンパイル時に`extend()`の引数をチェックしていない件を修正しました。
* [runtimeファイル更新](https://github.com/vim/vim/commit/cb80aa2d53e56d3aba3b3c439fb467f29a750c5e): [Todo](https://github.com/vim/vim/commit/cb80aa2d53e56d3aba3b3c439fb467f29a750c5e#diff-fb7eed53e3f2993f9d82c748206eaca82fd1d054a417c6de477bb54373d85643)更新。helpファイル更新。他。
* [8.2.1909](https://github.com/vim/vim/commit/8133cc6bf454eb90bb0868f7cf806fce5c0c9fe6): :four_leaf_clover:`'statusline'`に指定できる項目数が80に制限されているのを撤廃しました。(メモリーを動的に割り当てるようにしました)
* [8.2.1902](https://github.com/vim/vim/commit/e974fa7b2b98e53a59d5ef16a6a1291f12a32e33): 既存のバッファに対して`:badd`を使うと、デフォルトのオプション値が変更されてしまう件を修正しました。(関連patch: [8.2.1904](https://github.com/vim/vim/commit/89b693e5627715cde080c3580c7b641c9bf0c06a))
* [8.2.1893](https://github.com/vim/vim/commit/8ded5b647aa4b3338da721b343e0bce0f86655f6): :four_leaf_clover:`matchfuzzy()`の第3引数{dict}の項目に`matchseq`を追加しました。この項目を指定し、{str}に空白で区切られた複数の単語が含まれている場合、与えられた順番の単語を含む一致のみを返します。`matchseq`未指定時は、すべての単語を含む文字列のリストを返します。
* [8.2.1882](https://github.com/vim/vim/commit/c58f5456e5c5f21193e960cecc434e367ef1281e): :four_leaf_clover:`v:disallow_let`を削除しました。(関連patch: [8.2.1788](https://github.com/vim/vim/commit/016faaa1b2fe242022725b29e1353c42105d045c), [8.2.1791](https://github.com/vim/vim/commit/1bdae4032359081325578cc74739a0a097e008ff))
* [runtimeファイル更新](https://github.com/vim/vim/commit/4f4d51a942cc2c6b3e936ee0f93f00c2d000065c): [Todo](https://github.com/vim/vim/commit/4f4d51a942cc2c6b3e936ee0f93f00c2d000065c#diff-fb7eed53e3f2993f9d82c748206eaca82fd1d054a417c6de477bb54373d85643)更新。helpファイル更新。他。
* [8.2.1794](https://github.com/vim/vim/commit/92f26c256e06277ff2ec4ce7adea1eb58c85abe0): :four_leaf_clover:falsy演算子(`??`)を追加しました。(これは「null合体演算子(null coalescing operator)」とも呼ばれますが、複雑すぎるため、単にfalsy演算子と呼びます)。左辺が真の場合は左辺の結果を返し、偽の場合は右辺を返します。
* [8.2.1784](https://github.com/vim/vim/commit/fa79be6b10e1d34fd697a56e85f6c0ce101f3d62): :alien:[GitHubでCodeQLによるセキュリティの脆弱性に対するコードスキャンが利用可能になった](https://github.blog/2020-09-30-code-scanning-is-now-available/)ので、有効にしました。(関連patch: [8.2.1831](https://github.com/vim/vim/commit/ef16c90423ae579927e6294c1ccfd17c5a1c113c))

---
#### 凡例

|表記|意味|
|:------|:------|
|:four_leaf_clover:|新機能、大幅な仕様変更|
|:alien:|Vim開発者向けの追加、変更|
|`'hoge'`|オプション (`:h options`参照)|
|`:hoge`|Exコマンド (`:h :index`参照)|
|`hoge()`|組み込み関数 (`:h functions`参照)|
|`v:hoge`|Vim定義済変数 (`:h v:`参照)|
|`+hoge`|feature (`:h +feature-list`参照)|

---
#### 方針
[こちら](http://qiita.com/h_east/items/23cd0d10932505072e6b#%E6%96%B9%E9%87%9D)を参照。
Nuxtでlayout適用時にページが表示されないときの解決策

# Nuxtでlayout適用時にページが表示されない


## 起きていること
layoutを適用した場合、pagesの\<template>タグで設定した内容が表示されない。

```vue:SamplePage.vue
<template>
  <div>
    <!-- いい感じのコンテンツ -->
  </div>
</template>
<style>
</style>


<script>
export default {
  layout:'MyLayout'
};
</script>
```

## 解決策
layoutでは、\<nuxt/>タグが必要です。
この\<nuxt/>タグがlayoutに存在している場合、パスと一致するページ(pagesフォルダ内のファイル)を呼び出します。
Unity絡みのメモ

Unity絡みでキレ散らかしたり、時間食われた内容を都度都度メモってく。
#####履歴
2020/12/03 1件追加。

###Unityでビルドした後、VisualStudio上でのキー入力の挙動がおかしくなる
【環境】
VisualStudio 2019
Unity 2020.1.13
【状況】
ソースコード内を選択し文字入力箇所がコード内であっても、十字キーやBackSpaceキー、そしてctrl+cやctrl+sなどのショートカットキーが効かない。
(例：十字キー左を押すとなぜかソースコードの拡大率の部分の編集になる)
なお、ツール→オプション→環境→キーボード→リセットも効果なし。
【対処】
方法１.VisualStudioを一度落として再度立ち上げる。
方法２.別ソースコードが開かれている場合、編集ソースコードを切り替える。(その後元のコードに戻ると直ってる)

###WebViewでpdfファイルにアクセス
UnityのWebview実装方法に関しては下のURLを見てね。
→https://developers.wonderpla.net/entry/2020/06/11/102725
webViewObject.LoadURL()で呼び出すpdfのURLの前に「 https://docs.google.com/gview?embedded=true&url= 」を付ければOK。

```js:webviewDEpdf.js
//～前略～
String pdf_url="https://hogehage.com/hage.pdf";
String gdoc_url = "https://docs.google.com/gview?embedded=true&url=";
webViewObject.LoadURL(pdf_url + gdoc_url);//こんな感じ
```
参考：https://stackoverflow.com/questions/2655972/how-can-i-display-a-pdf-document-into-a-webview
Hexo環境を構築する

# Hexo環境の構築
## 作業環境
|         | バージョン |
|:--------|:---------|
| Macbook | Macbook Air 13インチ(Mid 2013) BigSur |
| Home-brew | 2.5.12 |
| nodebrew | 1.0.1 |
| Node.js | 14.15.1 |
| npm | 6.14.8 |

## Node.js(npm)のインストール
homebrewは環境が揃っていたので、まずはNode.js(npm)をインストールしていきます。
### nodebrewをインストール
Node.js(npm)のバージョン管理ツールであるnodebrewをインストールし、その後npmをインストールします。

```
brew install nodebrew
```
### Node.jsのインストール
nodebrewがインストールできたら、nodebrewを使ってNode.js(npm)をインストールします。
特にバージョンの指定はないので、安定版を意味する「stable」を指定します。最新版を使用したい場合は、最新版を意味する「latest」を指定します。

```
nodebrew install-binary stable
```
インストールコマンドを実行したところ、以下のようなエラーとなりました。

```
Fetching: https://nodejs.org/dist/v15.3.0/node-v15.3.0-darwin-x64.tar.gz
Warning: Failed to create the file 
Warning: /Users/take/.nodebrew/src/v15.3.0/node-v15.3.0-darwin-x64.tar.gz: No 
Warning: such file or directory

curl: (23) Failed writing body (0 != 979)
download failed: https://nodejs.org/dist/v15.3.0/node-v15.3.0-darwin-x64.tar.gz
```
回避策として、ディレクトリを作成します。

```
mkdir -p ~/.nodebrew/src
```

### Node.jsの有効化
nodebrewでは、複数のNode.jsをインストールして使い分けることができます。
インストールしたNode.jsを使い分けるために、使用したいバージョンを有効化します。

```
nodebrew use v14.15.1
```
指定するバージョンはインストール済みのバージョンの中から指定します。
インストール済みのバージョンは以下のコマンドで調べることができます。

```
nodebrew ls
```

### Node.jsへのパスを通す
Node.jsのコマンドが簡単に使えるようにするため、パスを通します。
この後npmを使ってHexoをインストールするので、ついでにnpmでインストールされるモジュールへのパス($HOME/node_modules/.bin)も追加しています。
~/.zprofileへ以下のように追記します。

```
export PATH=$PATH:$HOME/.nodebrew/current/bin:$HOME/node_modules/.bin
```
ちなみにbashを使っている場合は、~/.bash_profileに同じ内容を記載してください。
記載したら、一度ターミナルを閉じます。
以下のコマンドでプロファイルを読み込み直しても良いです。

```
source ~/.zprofile
```

# Hexoのインストール
いよいよHexoのインストールをしていきます。

```
npm install hexo-cli
```

先ほどプロファイル設定しておいたので、以下のように普通のコマンドのように使えます。

```
hexo -v
```

Hexo環境はこれで完成です。
あとは

```
hexo init blog
```
とすれば、blogというディレクトリが作られて、その下でHexoブログを始められます。
【Python】virtualenvで仮想環境を作成する(コマンドプロンプト)

自分用メモ。Windows。
コードの頭に">>"とついているのは、コマンドプロンプトで打ち込むコマンド。
### 前提
Pythonがすでにインストールされてある。

### 環境を作成したいディレクトリを開く
```
>> cd C:\Users\UserName\Documents\MyApp
```
または、エクスプローラーでディレクトリを開いて、パスに「cmd」と打ち込むと、そのディレクトリでコマンドプロンプトが開ける
![flasknote 2020_11_30 22_41_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719632/c29a673f-13be-1b98-214c-5457a0b4ab37.jpeg)

### virtualenvで仮想環境を作成

virtualenvをまだpipでインストールしていない人は、次のコマンドでインストールする。

```
>> py -m pip install virtualenv
```
次のコマンドで仮想環境を作成する

```
>> py -m virtualenv .venv
```

(自分のPCでは)pipやvirtualenvの環境変数は設定されていないので、 それらのコマンドを走らせることはできない。
"py -m" をつけると、pythonがすでにpipでインストールされたライブラリからコマンドをとってきてくれる。
正直この辺の原理はよく知らない。

これで、".venv"というフォルダが作成される。中には色々ファイルがある。
今後、pipでインストールするライブラリは、この.venvの中に入っていく。

.venv　の部分は、"hoge"でも何でもいい。
でも通例として venvか .venv と名付けることが多い(ように思われる)。
.venvとつけておけば、そのフォルダが仮想環境のフォルダとすぐに分かるから、そうしたほうがいい。

### 仮想環境に切り替える
このままだと、仮想環境を作成しただけであって、"いま、この仮想環境を使用していますよ～"ということにはなっていない。
作成した仮想環境を使用中にするには、次のコマンドをうつ。

```
>> .venv\Scripts\Activate
```

これは、さっき作成された.venv/Scriptsフォルダ内のActivateを実行している。
こうすると、コマンドプロンプトの頭に(.venv)とつくようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719632/47a99cf3-eaa8-ebdc-a4be-4aaecb375a35.png)

### 仮想環境内でライブラリをインストールする
コマンドプロンプトの頭に(.venv)がついている状態で

```
>> pip install hogehoge
```
のようにpipでライブラリをインストールすると、仮想環境内にインストールされる。
仮想環境の使用中は、py -m　はいらない。

### 仮想環境を終了する
仮想環境の使用を終了するには、次のコマンドをうつ。

```
>> deactivate
```

### 仮想環境作成時の注意点
仮想環境のディレクトリの場所や、フォルダの名前を変更することはできない。
変更すると、パスを上手く参照できなくなるみたい。
Vue.jsでプロジェクトを作成し、起動してみる（かなり初心者向け）

前回の続きです。

Vue.jsがのインストールまで完了したら、プロジェクトを作成してみましょう。

前回と同じように今回もVSCodeのコマンドラインから作業を実行します。

VSCode起動→［View］→[Terminal]でコマンドを起動します。

流れとしては下記です
①プロジェクトを作成したいディレクトリに移動
②プロジェクト作成コマンドの実行
③開発サーバーの実行
順を追って説明していきたいと思います。


①プロジェクトを作成したいディレクトリに移動
チェンジディレクトリコマンドでプロジェクトを作成したいディレクトリに移動します。

![チェンジディレクトリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865589/2cfb22dc-1611-2887-e783-4cd30a9f2740.png)

cd プロジェクトを作成したいディレクトリにフルパス

でエンターキーを押すと移動ができます

②プロジェクト作成コマンドの実行

１．プロジェクト作成コマンドの実行
![プロジェクト作成コマンド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865589/8c44990d-faec-ae87-5932-1eafbca2fd55.png)

vue project 〇〇〇〇（作成したいプロジェクト名）

でエンターキーを押すとプロジェクト作成コマンドが走り下のような画面が出力されます。


２．プリセットの設定
![プロジェクト作成①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865589/552ffa78-047d-c7be-a1e3-2d890b9be914.png)

「プリセットの設定を選んでください」と聞かれています。
今回はとりあえずお試しで作成するので、一番下の”Manually　select feautures”（手動）を選びましょう。


３．必要なパッケージの選択
![プロジェクト作成②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865589/24b056c2-c140-00fd-1570-257b4e64b08c.png)


これは後からでも変更可能なのでこのままでエンターキーを押して進みます。


４．Vue.jsのバージョン選択
![プロジェクト作成③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865589/8aebfb4f-33a2-6b54-c200-13ff2bd8d2a6.png)

今度はVue.jsのバージョンを「２」にするか「３」にするかの選択項目が出てきました。
私も詳しい違いはよくわからないので今度調べてまた記事にしようと思います。
今回はとりあえず「２」を選びます。


５．ESLintのプリセット選択
![プロジェクト作成④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865589/7057a7b6-78d4-cbe8-7dc7-435597783814.png)


「Eslint　+ Standard Config」を選択しましょう（スタンダードなもの）


６．リントの実行タイミング

![プロジェクト作成⑤.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865589/4b43f26c-8fb4-5411-7a2c-2ff5fd6e2581.png)

そのままで大丈夫です（Lint on save)


７．各種設定を個別ファイルに書き込むか？package.jsonに書き込むか？

![プロジェクト作成⑥.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865589/b1dc2664-d754-b6b7-71dc-6eb621e08891.png)

今回は個別で設定します。



８．最後にこの設定で良いか？確認メッセージが表示されます。
yキーを押した後、エンターキーを押しましょう。

その後もう一度エンターキーを押します。
そうするとプロジェクト作成コマンドがザザっと流れますのでしばし待機しましょう。

![プロジェクト作成⑦.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865589/46a46f10-cc62-bf3e-48ac-6bffe35e7222.png)

この赤枠のようなメッセージが出たら作成成功です！！✨✨✨


③開発サーバーの実行
プロジェクトが無事に作成できましたので、開発サーバーを実行します。

![開発サーバーの実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865589/5b8a4574-2702-1ed7-9f75-80a84cf7cc7b.png)

まず、チェンジディレクトリコマンドで作成したプロジェクト名のフォルダに移動します
cd project-hogehoge

その後、「npm run serve」と入力しエンターキーを押します。
サーバーへの接続が開始されます。

![開発サーバーへの接続成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865589/901861b4-b248-f332-739a-44a807602062.png)


接続が完了するとこのような画面が表示されます。
赤枠に表示されているURL（httpから始まるもの）をブラウザに入力して接続してみましょう。

![Vue画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865589/03d028b7-31a8-6d4a-4cdb-3e9cd3ba41db.png)

このような画像が表示されたラプロジェクトの作成と起動は成功です！！！