OmniAICreator/Qiita-1.07M huggingface dataset:
css　子セレクタ

cssを使っている際に出てくる>(山かっこ）


div > p{
    color: red;
}


これは子供セレクタ、子セレクタというらしく、直接の子どもにしか適用されない模様。

```css
div {
    background-color: bisque;
    width: 100px;
    height: 100px;
}
div p{
    color: blue;
}
div >p{
    color: red;
}
```

```html
    <div>
        <p>あああ</p>
        <p>いいい</p>
        <div>
            <li>
                <p>ううう</p>
            </li>
        </div>
    </div>
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/5f73b5b6-e1c3-98ac-6273-a81d2a8dc238.png)
学ぶこと、習うこと

#話の内容

学ぶことと、習うことは、本質的には違うということ

#学ぶこと

これまで自学ということで、PYTHON、WEB-APP開発、AI関連をずっと書籍や、YOUTUBE動画を見て、
ずっと独学で取り組んできた。

苦節３年を要して、購入した書籍は１００冊以上に及ぶ・・・

しかしながら、実情はどうであったかと言えば、やはり最初は理解できず、
それこそ、何回もの消化不良や、挫折など、いま思えば苦労の連続であった。

#習うこと

自分は、どちらかというと実家が貧しかったため、常日頃から国公立以外は
受験させてもらえず、家庭教師や塾の類に行かせてもらえた記憶がない。

そんな中で、唯一させてもらえたのは、進研ゼミなどの
通信教育であった。

結局は、最終的に独学に近いことしか、これまでやってきていなかったので
プログラムのスキルなど、人から教えてもらったことは一切ない
（もちろんながら、今の仕事も製造業なので、そもそもプログラムなんぞは、
箸にも棒にも引っかからない環境である。）

#E資格

そんな中、ＡＩのＧ検定に合格して、次にＥ試験を目指すわけだが、
ここで「認定プログラム］を終了しないと、この資格が取れないという状況に直面した。

もちろん、これまでの流れから言えば、Ｅ試験の問題集で
独学で受験を考えていたが、これが必須ということであれば、
これは避けては通れない道のりである。

年初から、さんざん悩んでいたが、嫁さんから言われた一言で、
この高い授業料を払う決意をすることとなった。

（なんせ一番安いもので、１０万であったが、それでも年末からは、
今年は節約で進めていくつもりだったので、意図せぬ出費である。）

#近況

そんなことはさておいて、最近はウェビナーを毎日、垂れ流しで聞くようになった。

ＡＩの書籍と言えば、これまで本屋で数々を読み漁ったのであるが、
さっぱり頭に入らなかったが、人から教えられると、不思議なもので
分かりやすく自分の腑に落ちてくる・・・
そんな感じを受けている。

つい最近のことであるが、業務で開発しているWEB-APPにおいても
JQUERYのわからない点で、躓いていたことが、TERATAILの質問サイトで
いとも簡単に教えていただき、問題を解決することができた。
（もちろん、そこからはソースの解読をして、独学スタイルに吸収していくのであるが・・・）

#思うに

最初の話に戻るのであるが、やはり学ぶことと習うことというのは、
ほんとうに違うのだなと思った。

学んで習うのか、習って学ぶのか？
時にそれは同じことの裏返しなのかもしれない。

習っても、吸収できなければ意味がない・・・
学んでも、解決できなければ意味がない・・・

この段階まで来ると、やはり独学の限界（つまり書籍レベルでの知識では、解決できないフェーズに突入した）
と言えるのかもしれない。

#あとがき

これからは、インターネットやＳＮＳを通じて、質問を投げかけて、
教えを被るという姿勢で、進めていくことが大事である。
（いま考えると、やはり時間の高率化という面でも、
自分で調べる時間の間に、質問をするほうがずっと楽という気がする。）

もちろん、何も知らずに質問するのは、失礼に当たるので
最低限は自分がやったことを、残しておくことは必要ではあるが・・・
該当のポートのプロセスをワンライナーで終了させる

##  はじめに
たまに`npm start`でプロジェクトを実行しようとすると、下記の様なメッセージが表示されることがある。![スクリーンショット 2021-01-16 5.59.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502753/54be9545-06bd-d00d-dd69-ccdef7afa2e9.png)

ポートが被っているので他のポートを使って、実行しますか？
的なメッセージである。

上記の様に時々プロセスを実行したいのにポートが被っていて、つまずくことがあり、
該当のポートで起動しているプロセスを止める方法を共有致します。




##  コマンド
```
lsof -i :[ポート番号] -t | xargs kill
```

##  例
``` 
lsof -i :3000 -t | xargs kill
```

##  解説
### lsof
プロセスが開いているファイルを表示するコマンド

|  オプション| 意味  |
| ---- | ---- |
| -i  |  待機ポートを確認する(ネットワークソケットファイルを表示する)|
| -t  |  プロセスIDを表示する|

### xargs
標準入力やファイルからリストを読み込み、コマンドラインを作成して実行する

### kill
実行中のプロセスを終了

### lsof -i :3000 -t | xargs kill
3000ポートで起動しているプロセスを探し、
プロセスIDを`xargs kill`に渡す。

xargsでは`lsof -i :3000 -t`からもらった、
プロセスIDを使って、killを実行する

## 参考
[lsofコマンド入門](https://qiita.com/hypermkt/items/905139168b0bc5c28ef2)
【　jQuery　】タイピングアニメーションを実装

# はじめに
ポートフォリオサイトの見栄えをよくするため、jQueryのプラグインを使いタイピングアニメーションを実装しました。
ものすごく簡単に出来たので備忘録としてまとめたいと思います。

実装イメージ↓
![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772095/026ec1e4-aba7-8367-7879-f55152d6b624.gif)

# 目次
[1.htmlの記述](#1-htmlの記述)
[2.cssの記述](#2-cssの記述)
[3.jQueryの記述](#3-jQueryの記述)

## 1. htmlの記述

```php:index.html
<body>
  <div class="typing">
    <div class="typed_wrap">
      <h1><span class="typed"></span></h1>
</body>
```

## 2. cssの記述

```php:style.css
.typing {
    height: 100%;
    width: 100vw;
    position: relative;
    background-image: url('images/my-icon.JPG');
    background-size: 100vw 100vh;
 }
 .typed_wrap {
   position: absolute;
   width: 100vw;
   text-align: center;
   top: 50%;
   left: 50%;
   transform: translate(-50%, -50%);
   background: rgba(7, 6, 6, 0.5);
 }
 .typed_wrap h1 {
   color: #FFF;
   font-family: 'Times New Roman', Times, serif;
   font-size: 3rem;
   height: 200px;
   line-height: 200px;
 }
 .typed::after {
   content: "|";
   animation: blink 0.7s infinite;
 }
 @keyframes blink {
   50%{opacity: 0;}
 }
```

### `typing`
背景画像になる一番下の層です。
cssで画面いっぱいまで広げます。
また上の層の`typed_wrap`の位置調整のために`position:relative`を設定します。

### `typed_wrap`
`position:absolute`で画面中央になるように位置を調整します。
`text-align:center`でタイピングされる文字が中央になるように設定。
`background`で背景を半透明になるように調整

### `typed_wrap h1`
文字の大きさや文字の色、字体はお好みで調整可能です。
`height`と`line-height`の値を一致させて上下も中央になるように設定します。

### `typed::after`
spanタグに擬似クラスを付与してタイピングされた文字の最後にバーを設置します。
アニメーションの内容はお好みですが、今回は`blink`を設定し、0.7秒毎に点滅するようにします。
`@keyframes`でアニメーションの開始から終了までの詳細を設定出来ます。
`50%{opacity: 0;}`と記述することでアニメーションの中間地点で透明になるという意味になります。
詳しくは[この記事が参考になります](https://qiita.com/7968/items/1d999354e00db53bcbd8)

## 3. jQueryの記述
まずは、jQueryと`Typed.js`というプラグインを読み込みます。
bodyの閉じタグの前に記述します。
これでjsファイルでTyped.jsのメソッドを使えるようになります。

```php:index.html
<body>
.
.
.
  <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/typed.js/1.1.1/typed.min.js"></script>
</body>
```
jQueryを記述します

```php:index.js
$(function() {
  //タイピングアニメーション
  $('.typed').typed({
    strings: ["welcome to My Portfolio.", "Let's scroll down."],
    typeSpeed: 100,
    startDelay: 1000,
    backSpeed: 20,
    loop: true,
    loopCount: Infinity,
    showCursor: false,
    backDelay: 500
  });
});
```
`$('.typed')`でspanタグの要素をとってきます。`.typed`がプラグインで使えるメソッドです。

**設定できる内容は以下の通りです。**

* **strings**: タイピング入力させる文字を指定します。
* **typeSpeed**: タイピングのスピードを指定します。
* **startDelay**: タイピングがスタートするまでの時間を指定します。
* **backSpeed**: バック（文字を削除）するスピードを指定します。
* **backDelay**: バック（文字を削除）するまでの時間を指定します。
* **loop**: タイピングをループさせるかを指定します。（true、false）
* **showCursor**: カーソル文字を指定します。
* **loopCount**: ループさせる回数を指定します。
* **contentType**: テキストがhtmlかtextかを指定します。

ここまででタイピングアニメーションを実装できると思います！
js部分の数値もお好みで調整可能です。

# おわりに
実装は以上になります！
最後まで読んでいただきありがとうございました！
お疲れさまでした。。。
MeCab


http://taku910.github.io/mecab/
ここから、ダウンロードさせて頂いた　MeCab 本体 mecab-0.996.tar.gz　と
MeCab 用の辞書 mecab-ipadic-2.7.0-20070801.tar.gz　を使用する。

```
 % tar zxfv mecab-0.996.tar.gz
 % cd mecab-0.996
 % ./configure 
 % make
 % make check
 % su
 % make install
```

```
% tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
% cd mecab-ipadic-2.7.0-20070801
% ./configure
% make
% su
% make install
```

この時僕の環境では以下のエラーが発生した。
```
error while loading shared libraries: libmecab.so.2: cannot open shared object file: No such file or directory
```

ライブラリが認識されていなかったので以下を実行して再度トライ
```
% sudo ldconfig
```

これで無事完了
Ubuntu Ethernet driver 導入メモ

MSI Z490-A Pro、Ubuntu20.04が有線LANを認識しなかったので、
その時のDriver導入メモ。

１．カーネルバージョンチェック
　　$ uname -r
   5.8.0-38-generic

２．ネットワークチップチェック
　　$ lspci | grep Ether
   03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 04)
   Realtek RTL8125の2.5Gbeのドライバが必要。 
３．ドライバの有無チェック
　　$　ls /lib/modules/5.4.0-54-generic/kernel/drivers/net/ethernet/realtek/
   8139cp.ko  8139too.ko  atp.ko  r8169.ko
　　R8125がないので、導入が必要。
４．RTL8125ドライバ用ファイルのダウンロード
https://www.realtek.com/en/component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-pci-express-software
　　Unix(Linux)の2.5G Ethernet LINUX driver r8125 for kernel up to 5.6をダウンロード
５．RTL8125.koの作成
　４．でダウンロードしたファイルを解凍
　$ sudo bash ./autorun.sh
  で、3.のディレクトリに作成される。







# 参考
https://qiita.com/bunnyhopper_isolated/items/40aea93b72fb11a0d6a0
FreeBSD 12.2-RELEASE / fcitx-mozc on lxde 設定備忘

FreeBSD 12.2-RELEASE / fcitx / mozc on lxde 設定備忘
--
FreeBSD 12.2-RELEASE / fcitx / mozc on lxde 設定備忘、主に自分用です。
### .xprofile
```
$ cat .xprofile 
export LANG=ja_JP.UTF-8
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
setxkbmap -layout jp
```

### .xinitrc
```
$ cat .xinitrc
ck-launch-session dbus-launch --exit-with-session startlxde
exec startlxde
```

### LXSession 設定
自動立ち上げに下の2項目を追加:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159724/1a7e5065-0d69-96b1-ab36-d8713b3f17a7.png)

```
/usr/local/bin/mozc start
fcitx -r -d
```

これをすることでFcitx設定で、入力メソッドがブランク(選択不能)になる症状を回避できます。13-CURRENTでも同様です。
Androidアプリの手動公開（管理対象の公開）【2021年1月12日時点】

[こちらの記事](https://qiita.com/white_raichi/items/752d92a0ce518101c0e6)を参考にしてGoogle Pay Consoleで時間指定公開機能で手動でアプリリリースしていたのですが。
いつの間にか時間指定公開が「管理対象の公開」という機能に変わっていたので手順残します。

## Google公式ドキュメント
[管理対象の公開機能を使ってアプリの変更を公開するタイミングを管理する](https://support.google.com/googleplay/android-developer/answer/9859654?hl=ja)
こちらに書いてあるはずなのですが（個人的に）情報過多でいまいちピンとこなかったです。

## 管理対象の公開とは？
以前の「時間指定公開」と同じことができるのですが、どうやら機能改善してるようです。
- 保留中や審査中の変更時でも管理対象の公開オンオフを切り替えることができる
- 時間指定公開オンの設定中で保留中の変更があった場合、承認されないと公開できないが管理対象では審査中の変更があっても承認済の変更は公開することができる

つまり、公開する項目を審査単位でわけて公開することができるようになったということのようです。

## 手順
### リリースの作成
新しいリリースを作成し保存しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/a28eef4d-7b95-d13a-507f-afa34b7917ef.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/d7b0f231-1231-717f-4b70-47b60ad6a99d.png)

まだ公開ボタンは押さない。

### 管理対象の公開をオンにする
左のメニューから公開の概要をクリックし、管理対象のステータスの[管理]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/aee0ba57-8db6-8805-4715-319e7d9c0b74.png)

「管理対象の公開をオンにしました」のラジオボタンを選択して[保存]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/53364101-8263-927f-522c-6449a5712404.png)

オンになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/10b7eb9a-8d80-4e55-d48b-1d5e8c5a67db.png)

### 審査に出す
この状態でリリース編集からプレビュー画面を開き
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/dd7384e7-8994-0da0-a5e3-653b5ab1b78e.png)

右下の[製品版としての公開を開始]をクリックすると公開しますか？のポップアップが起動するので勇気を出して公開ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/7f3d5c56-86d3-4ad0-1032-d171c9ddaf10.png)

審査中に変わる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/d401a164-c722-80a2-4101-32639daa4db6.png)

## 審査通過
承認されると以下の状態になります。確認して公開をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/a37f0d82-0791-7391-ab35-7a53944f829e.png)
ドキドキ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/8fb8e45c-f122-cd25-85b9-d627917f55c3.png)

すんなり公開されたっぽい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/0cdc870a-149e-3aa8-1cb8-518aed80f9d4.png)
Githubで使っているBOT５つ

# Dependabot for Elixir
https://dependabot.com/elixir/

脆弱性をサーチします。

## Create Issue Branch
https://github.com/marketplace/create-issue-branch

Issueを作ったときにブランチも作ります。

## Auto Assign
https://probot.github.io/apps/auto-assign/

ymlで設定を記載して自動でPRなどのアサインをします。

## Delete merged branch
https://probot.github.io/apps/delete-merged-branch/

マージしたらブランチを消します。

## WIP
https://github.com/settings/installations/14106577

PRのタイトルにWIPがついてるとマージしないようにします。
Installing R-4.0.3 from source

# Objectives
While trying to build R-4.0.3 from source files, I noticed some requirements needed more than what I used for R-3.x.x. I hope some readers find this article useful for using R.

# Index
. [Platforms/OS's](#Chapter1)
. [Prerequisites](#Chapter2)
. [Variables](#Chapter3)
. [Configurations](#Chapter4)
. [References](#reference)

<a id="#Chapter1"></a>
# Platforms/OS's
. RHEL7 and SLES 15.

<a id="#Chapter2"></a>
# Prerequisites
. Intel Compilers
. GCC Compilers
. TeX Live
. Texinfo
. PCRE2
. Cairo

<a id="#Chapter3"></a>
# Variables
```
export CC=icc
export F77=ifort
export CXX=icpc
export F90=ifort
export FC=ifort
export AR=xiar
export LD=xild
export MKL="-lmkl*gf*lp64 -lmkl*core -lmkl*gnu**thread -dl -lpthread"
export PATH=/dir1/texlive/bin:/dir1/texinfo/6.6/bin:/dir1/pcre2/bin:$PATH
export LD_LIBRARY_PATH=/dir1/texinfo/lib/texinfo:/dir1/zlib/lib:/dir1/bzip2/lib:/dir1/xz/lib:/dir1/pcre2/lib:/dir1/cairo/lib:/usr/lib64:/lib64:$LD_LIBRARY_PATH 
export LDFLAGS="-L/dir1/zlib/lib -L/dir1/bzip2/lib -L/dir1/xz/lib -L/dir1/pcre2/lib -L/dir1/cairo/lib -lcairo" 
export CFLAGS="-I/dir1/zlib/include -I/dir1/bzip2/include -I/dir1/xz/include -I/dir1/pcre2/include -I/usr/include" 
export CPPFLAGS="-I/dir1/pcre2/include"
```
<a id="#Chapter4"></a>

# Configurations
```
./configure --prefix=/dir2/r/4.0.3 --with-blas=-lmkl_rt -with-lapack=-lmkl_rt --enable-memory-profiling --with-x --with-cairo --with-libpng --with-jpeglib --with-recommended-packages=no --enable-R-shlib
```

<a id="#reference"></a>
# References
- [Intel Compilers](https://software.intel.com/)
- [GCC Compilers](https://gcc.gnu.org/)
- [TeX Live](https://www.tug.org/texlive/)
- [Texinfo](https://www.gnu.org/software/texinfo/)
- [PCRE2](https://www.pcre.org/current/doc/html/)
- [Cairo](https://www.cairographics.org/)
爆速ESlint + Prettierのセットアップ in Next.js with TypeScript and React hooks

## 注意
自分のメモ用です[[参考]](https://dev.to/onygami/eslint-and-prettier-for-react-apps-bonus-next-js-and-typescript-3e46)
以下をやると npm run lint や　npm run format でコードがきれいになります。
また、git commit 時にちゃんとコードがきれいかチェックしてくれます。

## 環境(動いた環境)
- "typescript": "^4.1.3"
- "react": "17.0.1"
- "next": "10.0.5"


## インストール
```terminal
npm i -D eslint prettier eslint-plugin-react eslint-plugin-react-hooks eslint-config-prettier eslint-plugin-prettier eslint-plugin-jsx-a11y @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-plugin-simple-import-sort husky lint-staged
```

## プロジェクトルートにファイル作成 
```terminal
touch .eslintrc.js .prettierrc .eslintignore .prettierignore
```

```javascript:.eslintrc.js
module.exports = {
    root: true, // Make sure eslint picks up the config at the root of the directory
    parser: '@typescript-eslint/parser',
    parserOptions: {
        ecmaVersion: 2021, // Use the latest ecmascript standard
        sourceType: 'module', // Allows using import/export statements
        ecmaFeatures: {
            jsx: true // Enable JSX since we're using React
        }
    },
    settings: {
        react: {
            version: 'detect' // Automatically detect the react version
        }
    },
    env: {
        browser: true, // Enables browser globals like window and document
        amd: true, // Enables require() and define() as global variables as per the amd spec.
        node: true // Enables Node.js global variables and Node.js scoping.
    },
    plugins: ['simple-import-sort'],
    extends: [
        'eslint:recommended',
        'plugin:@typescript-eslint/eslint-recommended',
        'plugin:@typescript-eslint/recommended',
        'plugin:react/recommended',
        'plugin:react-hooks/recommended',
        'plugin:jsx-a11y/recommended',
        'prettier/@typescript-eslint',
        'plugin:prettier/recommended' // Make this the last element so prettier config overrides other formatting rules
    ],
    rules: {
        'prettier/prettier': ['error', {}, { usePrettierrc: true }], // Use our .prettierrc file as source
        'react/react-in-jsx-scope': 'off',
        'react/prop-types': 'off',
        '@typescript-eslint/explicit-function-return-type': 'off',
        'simple-import-sort/imports': 'error',
        'jsx-a11y/anchor-is-valid': [
            'error',
            {
                components: ['Link'],
                specialLink: ['hrefLeft', 'hrefRight'],
                aspects: ['invalidHref', 'preferButton']
            }
        ]
    }
};
```

```:.prettierrc
{
  "semi": true,
  "tabWidth": 4,
  "printWidth": 100,
  "singleQuote": true,
  "trailingComma": "none",
  "jsxBracketSameLine": true
}
```

```:.eslintignoreと.prettierignore
node_modules
.next
```

# package.jsonに追記

```json:package.json
{

  ...

  "scripts": {
    ...

    "lint": "eslint --fix .",
    "format": "prettier --write './**/*.{js,jsx,ts,tsx,css,md,json}' --config ./.prettierrc"
  },

  ...

  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "./**/*.{js,jsx,ts,tsx}": [
      "eslint --fix"
    ]
  }

  ...

}

```
【Ruby初心者向け】puts print pの違いとは？実は明確な使い分けの方法があるんです！

Rubyを学習していたら、誰しもがputsメソッドやprintメソッド、pメソッドをよく見かけると思いますし、使うことも多々あるでしょう。

しかし、それぞれの違いをしっかりと理解していない人も少なくないのではないでしょうか。

というのも、私自身がその一人でした。

ある参考書ではputsを使って文字列などを出力しているけど、またある学習コンテンツではpを使って出力を行っている。そう思ったらprintメソッドというものもあるというのを知りました。

当時、Rubyの学習を始めたばかりで、それぞれの違いがわからない私は、どれを使ったら良いのかわからず混乱してしまいました。

当記事では、そのような方に向けてputs print pの3つのメソッドについて解説しています！

といってもそこまで難しいことでもないので、簡単に習得してしまいましょう！

## puts、print、pメソッドの明確な違いとは？

簡単にいうとputs、print、pメソッドの違いとは、対象者の違いにあります。

putsとprintは一般ユーザー、pは開発者が対象者です。これがどういうことかというと、出力したい値が誰に向けたものかということです。

例えば、自身で開発したアプリケーションがあるとします。そのアプリケーションが実行される過程で、ユーザーに向けた何かを表示したい場合、putsやprintを使用します。

しかし、ここで注意が必要なのは、printは出力したいことの内容に改行がされないということです。

開発者側からしても、ユーザー側からしても、何か長い文章などが出力される時などに改行が行われないのはとても不便だと言えます。

ですので、一般的には一般ユーザに向けた出力をする場合はputsを使用します。

一方で、pは開発者に向けたメソッドです。

pのputsやprintとの大きな違いは、引数で渡されたオブジェクトがそのまま戻り値となるということです。

例えば、このようになります。

```Ruby
# 以下の内容を実行します。また、わかりやすくするためにirbなどで実行するための記述は省きます。
p "ダブルクオートも含まれた状態で出力されます" 

"ダブルクオートも含まれた状態で出力されます" # 出力内容
=>"ダブルクオートも含まれた状態で出力されます"

# putsで出力した場合
puts "ダブルクオートも含まれた状態で出力されます"

ダブルクオートも含まれた状態で出力されます # 出力内容
=> nil
```

どうでしょうか？意外と3つのメソッドには大きな違いがあることが分かったのではないでしょうか。

## まとめ

puts、print、pメソッドはそれぞれ同じ引数を扱っていても、違う出力結果を表示することがわかりました。

初心者目線でいうと、それぞれの対象ユーザを気にして使っていくことをお勧めします。

簡単に、一般ユーザに向けた出力内容を求める場合はputsメソッド、開発者向けの出力内容を求める場合ならpメソッドを使えば良いでしょう。
ニコニコ動画のページからタイトルetc.を取り出す


chrome拡張機能を作るときに必要になったので。

# タイトル
```javascript:title
var row_data = document.getElementById('js-initial-watch-data').getAttribute("data-api-data");
var title = JSON.parse(row_data).video.title;
```

# タグをリストで
```javascript:tags
var row_data = document.getElementById('js-initial-watch-data').getAttribute("data-api-data");
var tags = JSON.parse(row_data).tags;
for(var i=0; i<tags.length; i++){
  console.log(tags[i].name);
}
```

# あとがき
ニコニコ動画はjs-initial-watch-dataというIDの要素のdata-api-data属性にjson形式で様々なデータがくっついています。
このデータには今回取り出したような動画タイトルやタグのほか、コメントも含まれています。

質問、誤りなどあったらコメントください。
LaraveのhasOneとbelongsToの違い

参照先 or 参照される側 or 外部キーがある側は、belongsTo
参照元 or 参照する側 or 外部キーがない側は、hasOne

```php5:UsersMedel.php
[id,name] //だとする
    public function profile()
    {
        return $this->hasOne(Profiles::class, 'user_id', 'id');
    }
```

```php5:ProfilesMedel.php
[id,memo,address,user_id] //だとする
    public function profile()
    {
        return $this->belongsTo(Users::class, 'user_id', 'id');
    }
```
[Django] Formからの値の取得

#実行環境
実行環境は以下の通りです。
Python3 -- Python 3.9.0
Django -- 3.1.3

#Djangoで、Formからの値の取得について
今回、Djangoでwebアプリを作成していく際にFormからの値の取得方法に困ったので、メモがてらに記述しておきます。
また、Djangoの学習を始めたばかりで非効率的なコードばかりですが、何かあればご指摘いただければ幸いです。

##シチュエーション
Formで選択したオブジェクトの値を取得し、そのオブジェクトのチェックボックスをTrueにするというシチュエーションです。具体的には、事前に登録しているスケジュールをFormで選択し、そのスケジュールを「今月のスケジュール」と設定し、表示するという実装を行いました。

Scheduleのモデルを以下に示します。

```models.py
class Schedule(models.Model):
    """スケジュール"""
    holdmonth = models.CharField('開催年月', help_text="○年○月", unique=True)
    theme = models.TextField('テーマ', max_length=50)
    now = models.BooleanField('現在のテーマを選択',default=False)
```

このモデルのnowというフィールドがTrueのスケジュールを「今月のスケジュール」とします。
設定したいスケジュールを選択するために、以下のようなForm、及びViewを作成しました。

```forms.py
class ScheduleSelectForm(forms.Form):
    choice = forms.ModelChoiceField(models.Schedule.objects, label='開催年月', empty_label='選択してください')
```


```view.py
def schedule_select(request):
    if request.method == "POST":
        form = ScheduleSelectForm(request.POST)
        if form.is_valid():
            selected_schedule = form.cleaned_data.get('choice')
            data = Schedule.objects.all().filter(holdmonth=selected_schedule).last()
            #他のテーマのチェックを外す
            if Schedule.objects.all().filter(now=True).exists():
                before_now = Schedule.objects.all().filter(now=True).last()
                before_now.now = False
                before_now.save(update_fields=['now'])
            else:
                pass
            data.now = True
            data.save(update_fields=['now'])
            params = {'message': '教室スケジュール', 'data': data}
            return render(request, 'MySite/admin_page.html', params)
    else:
        form = ScheduleSelectForm()
    context = {'form':form}
    return render(request, 'MySite/schedule_select.html', context)
```

Formで選択した

```
selected_schedule = form.cleaned_data.get('choice')
```

とすることで、Formで選択した値を取得できます。
○○.is_valid()　で、フォームに入力された値にエラーがないかバリデートを行い、
○○.cleaned_data('フィールド名')　で、バリデート後のデータを型に応じて整形して返すようです。
これらのを理解しておらず、なかなかFormで選択した値を取得できませんでしたが、上記のメソッドでFormからの値を自由に扱えるようになりました。
Berry Condaのインストール

# はじめに
Spyder や Jupyter Notebook 単体をラズパイ上にインストールして使いたかったのだが、Jupyter Notebookが上手く動作しない。
ということで、Berry Condaというものをインストールしてみた。
SpyderとNotebookはアンインストールしていない。

参考サイト：
- [RaspberryPi(ラズパイ)にcondaの環境を整えて色々やってみた - Qiita](https://qiita.com/rsm223_rip/items/c6105d22ba360623530a)
- [RaspberryPiでcondaを使いたいしpython3.6も使いたい - Qiita](https://qiita.com/saragai/items/52de118c1aef1efeb284)
- [Raspberry Pi (ラズパイ) にAnaconda (Berry Conda) をインストールする方法 | urashita.com 浦下.com (ウラシタドットコム)](https://urashita.com/archives/26622)

# installerのダウンロード

```
$ wget https://github.com/jjhelmus/berryconda/releases/download/v2.0.0/Berryconda3-2.0.0-Linux-armv7l.sh
```

# installerの実行
```
$ chmod +x Berryconda3-2.0.0-Linux-armv7l.sh
$ ./Berryconda3-2.0.0-Linux-armv7l.sh
```

色々聞かれるのを**「yes」**と**「Enter」**で切り抜ける。

# condaの実行
新しいターミナルを立ち上げる。←ここ重要

pyhonのバージョンの確認

```
$ python3 -V
Python 3.6.1
```

入っているパッケージの確認

```
$ conda list
```

パッケージがバーッと表示されるはず。

# まとめ
今回はここまで。
どうやって使うのだろうか。
【Python】繰り返し処理_個人的備忘録

#繰り返し処理(while命令)
"""
【構文】
while 条件式
　　　－－条件式がTureである間、繰り返し処理する
"""
i = 1
while i < 5:
　print(i,'番目のループ')
　i += 1

"""
インデントに注意！
i += 1が認識されず、ずっとループしていた。
"""
Raspberry PiのI2Cをコマンドラインでセットアップ

## 概要

Raspberry PiのI2Cをコマンドラインでセットアップする方法について記載します。

## 手順

### 有効化

1. I2Cを有効化する。

    ```shell
    sudo raspi-config nonint do_i2c 0
    ```

1. 次のエラーが表示されるが、無視して構わない。

    ```text
    modprobe: ERROR: ../libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file '/lib/modules/5.4.79+/modules.dep.bin'
    modprobe: FATAL: Module i2c-dev not found in directory /lib/modules/5.4.79+
    ```

1. リブートする。

    ```shell
    sudo reboot
    ```

### 無効化

1. I2Cを無効化する。

    ```shell
    sudo raspi-config nonint do_i2c 1
    ```

1. リブートする。

    ```shell
    sudo reboot
    ```

### 確認方法

1. I2Cが有効か確認する。

    ```shell
    raspi-config nonint get_i2c
    ```

- I2Cが有効な場合

    ```text
    0
    ```

- I2Cが無効な場合

    ```text
    1
    ```
TailwindCSSを初めてインストールするときのメモ

:::note warn
注意
この記事は Tailwind CSS v2系向けに書いた記事です。最新の v3系のインストール記事も以下に書きましたのでご覧いただければ幸いです。
:::

https://qiita.com/Masahiro111/items/251c370acb20156218de

Tailwindをインストールするには、「npm経由でインストールする」場合と「CDNでTailwindのファイルを読み込む」場合の2通りのやり方があります。

## ケース①　npm経由でインストールする

まずは、Tailwindをインストールしたいフォルダを作成して、そのフォルダに移動し`npm init`コマンドで初期化処理を行いましょう。`-yフラグ`を使用して`package.json`ファイルをさっと作成します。

```
$ npm init -y
```

TailwindやPostCSS、そのプラグインをインストールします。

```
$ npm install tailwindcss@latest postcss@latest autoprefixer@latest
```

続けて、構成ファイルを作成します。

```
$ npx tailwindcss init
```

するとルートフォルダの中に `tailwind.config.js`が作成されます。

```js:tailwind.config.js
module.exports = {
  purge: [],
  darkMode: false, // or 'media' or 'class'
  theme: {
    extend: {},
  },
  variants: {
    extend: {},
  },
  plugins: [],
}
```

次に、ルートディレクトリに`src`フォルダを作成して、その中に`tailwind.css`を作成し以下のような内容で保存します。

```css:src/tailwind.css
@tailwind base;
@tailwind components;
@tailwind utilities;
```

そして、ビルドすると成型されたtailwindファイルが出力されます

```
$ npx tailwindcss-cli@latest build ./src/tailwind.css -o ./dist/tailwind.css
```

`./src/tailwind.css`が入力元のファイル、`./dist/tailwind.css`が出力先のファイルになります。

## ケース②　CDN経由でTailwindを読み込む

「npm経由でやるのめんどくさい！」という方は、もちろんCDN経由でもTailwindを使用することが可能です。

```
<link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
```

上記コードを`<head>`内にペーストすれば完了です。

ただし、npmでインストールしてビルドされたTailwindのファイルと比較して、CDN経由で読み込まれたはファイルでは利用できない機能があります。

- Tailwindのデフォルトテーマをカスタマイズすることができない
- サードパーティ製のプラグインを導入できない

などです。CDN経由でのインストールでは少々制限がでてきますので。細かいところまで手が届くようなカスタマイズをしたい方は、是非npm経由でのインストールをお勧めします。
【JavaScript】クリックしたときにポップアップを表示する

# イメージ図
![ポップアップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639395/1c3115a7-4750-2612-64f1-10c7dce71e47.png)

# HTML
```html
<button id="click-btn">クリック！</button>
<div id="popup-wrapper">
  <div id="popup-inside">
    <div id="close">x</div>
      <div id="message">
      <h2>あの人気のマンガが...</h2>
      <p>今なら80%オフ！</p>
      <a href="#">ゲットする</a>
    </div>
  </div>
</div>

```

# CSS
```css
#click-btn {
  display: block;
  margin: 20px auto;
  background-color: purple;
  color: white;
  border: 0;
  padding: 6px 10px;
}

#popup-wrapper {
  background-color: rgba(0, 0, 0, .5);
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: none;
}

#popup-inside {
  text-align: center;
  width: 100%;
  max-width: 300px;
  background: white;
  margin: 10% auto;
  padding: 20px;
  position: relative;
}

#message a {
  background: purple;
  color: white;
  text-decoration: none;
  padding: 6px 10px;
}

#close {
  position: absolute;
  top: 0;
  right: 5px;
  cursor: pointer;
}
```

# JavaScript
```javascript
const clickBtn = document.getElementById('click-btn');
const popupWrapper = document.getElementById('popup-wrapper');
const close = document.getElementById('close');

// ボタンをクリックしたときにポップアップを表示させる
clickBtn.addEventListener('click', () => {
  popupWrapper.style.display = "block";
});

// ポップアップの外側又は「x」のマークをクリックしたときポップアップを閉じる
popupWrapper.addEventListener('click', e => {
  if (e.target.id === popupWrapper.id || e.target.id === close.id) {
    popupWrapper.style.display = 'none';
  }
});
```
【3行で説明】プログラミングスクールの技術記事を検索結果に表示させない方法

※単純に初歩的すぎる記事を見る必要がなくなった時に使う方法です。**他意はありません。**
1.Chromeで[この拡張機能（uBlacklist）](https://chrome.google.com/webstore/detail/ublacklist/pncfbmialoiaghdehhbnbhkkgmjanfhe?hl=ja)を入れる。
2.表示してほしくないサイトに行く、または調べる
3.拡張機能のボタン（ブラウザ右上のパズルのようなマーク）から選択して、ブロックを押す。
アンチウイルススキャンの影響で、ASP.Net Core アプリのプロセスが開始しないことがある

# はじめに

「英語の技術情報、せめてタイトルだけでも日本語で展開してみようかな！？」ということでやってみます。(関係者には個人の情報発信レベルなら出典元を明記してもらえればOKだろう、と伺いました)

# 元ネタ

[ASP.Net Core Application process failed to start due to Anti-virus scanning](https://techcommunity.microsoft.com/t5/iis-support-blog/asp-net-core-application-process-failed-to-start-due-to-anti/ba-p/2061026)
拙訳 : アンチウイルススキャンの影響で、ASP.NET Core アプリのプロセスが開始しないことがある

# まとめ

アンチウイルスソフトウェアのウイルススキャンの影響で、ASP.NET Core アプリケーションがエラーとなる場合があるそう。

ブラウザからアクセスする際、`HTTP Error 502.5 - Process Failure` が返され、サーバ (IIS) 側のイベントログにも、`Source: AspNetCoreModuleV2`、`Event ID : 1020` のエラーが出力される、とのことです。

> Application '/LM/W3SVC/1/ROOT/Site' with physical root '<path>' failed to start process with commandline '<path><application>.exe ' at stage 'CreateProcessW', ErrorCode = '0x80070002', assigned port xxx, retryCounter '0'.

いくつか原因は考えられるものの、ウイルススキャンの対象から関連のファイルを外してみるよう示唆されています。

その際、下記の情報に対象とすべきファイル／フォルダがまとまっているので参考にすると良いです。

[Antivirus Exclusion List for ASP.NET applications hosted on IIS - Microsoft Tech Community](https://techcommunity.microsoft.com/t5/iis-support-blog/antivirus-exclusion-list-for-asp-net-applications-hosted-on-iis/ba-p/343006)
PIC Timer1割り込みの使用方法　(PIC16F1769)

ここで説明するのは，PIC16F1769において，Timer1のクロック源に内部クロックを使用する場合である．
文中の`INTCON = 0bxx000000;`などのxは，これから設定するビットを表す（xのまま書き込むわけではない）

主な操作レジスタ
---
* INTCON
* T1CON
* PIE1
* PIR1
* TMR1H，TMR1L
* ( T1GCON )

1．INTCONレジスタの設定
---
```c
INTCON = 0bxx000000;
```
`GIE`：セットで全てのアクティブな割り込み有効（1ビット）
`PEIE`：セットで全てのアクティブな周辺モジュール割り込み有効（1ビット）

2．T1CONレジスタの設定
---
```c

T1CON = 0bxxxx000x
```

`CS`：クロック源選択（２ビット）
`CKPS`：プリスケーラ比選択ビット（2ビット）．大きいほど割り込みの周期が長くなる．
`ON`：Timer1 ON（１ビット）

※CSビットの選択のFOSC/4という表記は，PIC内部の1命令がクロック4周期で進むことに由来するものであり，INTOSC = 8MHzのときにTimer0のクロック源が8 / 4 = 2MHzになる，という意味ではない．

3．PIE1レジスタの設定
---
```c

PIE1 = 0b0000000x;
```
`TMR1IE`：セットでTimer1オーバーフロー割り込み有効（1ビット）

4．PIR1レジスタの設定
---
```c

PIR1 = 0b0000000x
```
`TMR1IF`：1 = TMR1レジスタがオーバーフローした　0 = TMR1レジスタはオーバーフローしていない

**割り込みを繰り返し行うには，割り込み発生後にTMR1IFレジスタをクリアする必要がある．**

5．TMR1レジスタの設定
---
TMR1HとTMR1L合わせて16ビットのカウンタで，１命令サイクル毎に+1される．（プリスケーラで変更可）．

最初に設定した値からカウントアップされ，65536(0xFFFF)から0へオーバーフローしたときに割り込みが発生する．

**割り込みを繰り返し行うには，割り込み発生後にTMR1レジスタを初期化する必要がある．**

4．プリスケーラ比・TMR1H，TMR1Lレジスタの初期値の検討
---
**例：INTOSC = 8MHz，100ms毎にTimer0割り込みを発生させたい場合**
Timer1のクロック源をシステムクロック(FOSC/4)に設定（TMR0CS = 0）した場合，INTOSC = 8MHzであるから1命令サイクルは (1 / 8000000) * 4 =  0.5 (μs)となる．

プリスケーラが無い場合，割り込みの発生間隔は最大でも32 ms  (0.5μs * (65535+1)命令サイクル ≒ 32ms)  であり100msには程遠いため，プリスケーラを使用する必要がある．

比を最大の1：8に設定  (CKPS：11)  すると，TMR1レジスタのカウントアップの周期は8倍になり 0.5 (μs) *  8  = 4 (μs) となる．
このとき，割り込みが発生する 間隔は最大で 0.5 (μs) * ( (65535+1) * 8 )命令サイクル ≒ 262 (ms)   となる．

あとはTMR1レジスタの初期値を調整して，割り込み周期を100msにする．
割り込みが発生する 間隔を100ms間隔に調整するには，TMR1H，TMR1Lレジスタにあらかじめ値を与えてゲタをはかせておく．これによりオーバーフローまでのカウント回数を減らし，周期を短くすることができる．
100 (ms) / 4 (μs)  = 25000 より，
65536 - 25000 = 40536 から，TMR1レジスタのカウントアップを始める．

CでTMR1レジスタの初期設定を書くと以下のようになる．

```c

TMR1H = 40536 >> 8
TMR1L = 40536 & 0x00FF
```

上記記法だが，`TMR1 = 40536` のようにH/L分けずに直接代入することも出来た



参考ページ
---

Wak-tech 【PICマイコン】タイマー割り込みを使って時計を作る【PIC16F1938 TMR1】 
https://wak-tech.com/archives/292

MICROCHIP　PIC16(L)F1764/5/8/9　日本語PDFデータシート
https://akizukidenshi.com/download/ds/microchip/PIC16F1764_PIC16LF1769_j.pdf
Edge TPUコンパイラを使用するためのDocker作成

# はじめに
Edge TPUはラズパイ以外にもMacやWindowsでも使えますが、コンパイルはDebianベースのLinuxしかでかできないようなので、MacやWindowsでもコンパイルできるようにDockerを用いてコンパイルできるようにしました。

# Dockerfileの作成
Dockerfileとして以下を作成

```docker

FROM debian:buster-slim

RUN export DEBIAN_FRONTEND=noninteractive \
 && apt-get update \
 && apt-get install --no-install-recommends -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
 && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - \
 && echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" > /etc/apt/sources.list.d/coral-edgetpu.list \
 && apt-get update \
 && apt-get install edgetpu-compiler \

WORKDIR /home/edgetpu-compiler

ENTRYPOINT ["edgetpu_compiler"]

```

# Docker build
作成したDockerfileを以下のコマンドでビルド

```
docker image build -t edgetpu-compiler .
```

# 量子化モデルの準備
dockerfileと同じディレクトリにディレクトリを作成

```bash

mkdir model
```
modelディレクトリにINT8で量子化済のtfliteを格納。

# EdgeTPUコンパイル
以下のコマンドでINT8で量子化済のtfliteモデルをEdegTPU用のモデルにコンパイル

```
docker run --rm -it -v $(pwd):/home/edgetpu-compiler edgetpu-compiler model/{MODEL}
```

`{MODEL}`の部分には先ほど準備したINT8で量子化されたtfliteを指定。{MODEL}_edgetpu.logと{MODEL}_edgetpu.tfliteの様なファイルが作成されていれば、コンパイルが成功していると思います。

# 最後に
Linux環境がなくても、MacやWindowsでも簡単にEdgeTPU用のモデルにコンパイル、EdgeTPUで推論することができます。

#参考
この記事は以下の情報を参考にして執筆しました。
- [Dockerコンテナ上でEdge TPUコンパイラを使う](https://tech-blog.optim.co.jp/entry/2020/03/09/160000)
PIC16F1769で電子ボリュームLM1972Mを鳴らす

PICマイコンでSPIモジュールを設定・使用する方法をまとめた．
![2011280245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297277/331fa70e-feae-76a6-f788-e04cb8eb759a.png)


はじめに
---
PICでのSPIモジュールの設定には，MPLAB IDEのMCC機能を使用する方法があるが，今回はこれを使用せず，レジスタの設定を直接mainファイルに記載する方法を紹介する．（実際は初期設定に少しMCUを使用する）

なお，本記事では電子ボリュームLM1972との通信を目標とした設定方法を紹介していくため，PICをslaveとした使用方法など，説明を省く部分もある．

使用するマイコンには，PIC16F1769を採用している．


初期設定
---
はじめMCCは使用しないと言ったが，やはりクロックやピンの初期設定など，あまり後で弄ることのない部分はMCCを使用して設定したほうが効率的である．今回はクロックに内部クロック8MHzを使用した．

ピン設定であるが，まずSPIで送信を行うにはSDO，SCK，SSの3つのピンが必要となる．大抵のGPIOピンはピン選択機能でモジュールの機能を割り当てることが出来るので，空いているピンを適当に3つ選べばよい．

今回はSDOにRA2，SCKにRC5，SSにRC4を選択した．3つのピンはMCCを使ってデジタル出力に設定しておく．

１．RxyPPSレジスタの設定
---
RxyPPSレジスタで，ピンの機能をSCKとSDOに設定する．レジスタ値はSCKなら0x12，SDOなら0x14である．
今回はRC5にSCK，RA2にSDOの機能を割り当てるため，以下のようになる．

```c
RC5PPS = 0x12;          // RC5:SCK
RA2PPS = 0x14;          // RA2:SDO
```


２．xxxPPSレジスタの設定
---
SSPCLKPPSと SSPSSPPSは，それぞれSCKとSSをどのピンに割り当てるかを決めるレジスタである．ここが分かりにくいポイントで，RxyPPSレジスタの設定だけではSPIを使うことは出来ないのである．

レジスタの値の詳細については，マイコンのデータシートを参照していただきたい．

```c
SSPCLKPPS = 0b00010101; // SCK:RC5
SSPSSPPS = 0b00010100;  // SS:RC4
```

なぜRxyPPSと違い2進数で書いているかというと，このレジスタは使用するポートにより値が全て異なるため，間違いを避けたいからである．


３．SSP1STATレジスタの設定
---
このレジスタでは，主にbit6のCKEビットを操作してクロック位相（エッジ）を設定する．

1：active to idle
0：idle to active

LM1972のデータシートを参照すると，クロック位相はidle to activeとなっているため，CKEビットはクリアしておく．

```c
SSP1STATbits.CKE = 0;   // idle to active
```

４．SSP1CON1レジスタの設定
---
このレジスタでは，SSP1STATと同様にSPIのモードを設定する．
まず，必ずSSPENビットをセットしてSPIのピン設定を有効にしておく．
それから，CKPビットを操作してクロック(SCK)の極性を選ぶ．

1：idle High
0：idle Low

LM1972のデータシートを参照すると，クロック位相はidle Lowとなっているため，CKPビットはクリアしておく．

0~3bitのSSPMでは，マスター/スレーブの選択，クロック周波数(SCK)の選択を行う．
LM1972のデータシートを参照すると，基本クロック周波数は2MHzとなっているため，クロックはFOSC/4とする．また，PICマイコンはmasterの役割を担う．
SSPMビットはモードにより様々な値のパターンがあるため，詳細については使用するマイコンのデータシートを参照すること．

```c

SSP1CON1 = 0b00100000;  // Enable SerialPort / idle Low / CLK:FOSC/4
```


参考文献
---




SPI通信の使い方
http://www.picfun.com/f1/f05.html

SPIの基本を学ぶ | アナログ・デバイセズ
https://www.analog.com/jp/analog-dialogue/articles/introduction-to-spi-interface.html

桐井研究室　LM1972を使った電子ボリューム。
http://kirylabo.blog.fc2.com/blog-entry-81.html

SAKURA87.net　Arduino Unoで電子ボリューム（LM1972M）を動かす 
https://sakura87.net/archives/4342

氾濫原　LM1972 デジタルボリューム 
https://lowreal.net/2018/02/20/1

氷精工房　電子ボリュームを使ってみた 
http://www.maroon.dti.ne.jp/jyaku9/koneta/koneta6/koneta.html

SPI通信の使い方 
http://www.picfun.com/f1/f05.html

MICROCHIP　PIC16(L)F1764/5/8/9　日本語PDFデータシート
https://akizukidenshi.com/download/ds/microchip/PIC16F1764_PIC16LF1769_j.pdf
AWS Lightsail 入門3 基本設定（管理画面）

## 本記事の内容
- Lightsailインスタンスに対して、管理画面上での基本設定（静的IP、ファイアウォール）を行う。

※OSの基本設定は、次回の記事にまとめる。

## 前提条件
- Lightsailインスタンスを作成済み。

[AWS Lightsail 入門1 インスタンス作成](https://qiita.com/s8ta/items/fd274b05b083bcf36dba)

## 静的IPの設定
LightsailインスタンスのパブリックIP（グローバルIP）は通常、インスタンス停止時に開放され、次回起動時にはアドレスが変わる。
インスタンス再起動の度にPC上の接続設定を変更するのは手間なので、「静的IP」機能でパブリックIPを固定する。

### 静的IPの注意点
Lightsailの静的IPは無料で利用できる。
ただし、インスタンスに1時間以上割り当てられていない未使用の静的IPは、0.005ドル/時間課金される。これは、Lightsailの最安プラン（3.5ドル/月、0.0047ドル/時）よりも高い。

インスタンスの削除時は静的IPがデタッチ（割り当て解除）され、アカウントには残る。課金を防ぐためには、静的IPを1時間以内に削除するか、他のインスタンスにアタッチする。

### 静的IPの設定手順
Lightsail管理画面を開き、対象インスタンスを選択後、
[ネットワーキング]タブの[静的 IP の作成]を選択。
<img width="80%" alt="aws-lightsail-03-001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010477/3cac8bbe-4394-7900-9a1c-b1b63503d514.png">

[作成]を選択。

<img width="80%" alt="aws-lightsail-03-002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010477/887c33b0-0a80-f87a-03e8-bee817660207.png">

静的IPが作成され、インスタンスにアタッチされる。
インスタンスの停止と開始を行い、パブリックIPが変化しないことを確認しておく。

<img width="80%" alt="aws-lightsail-03-003.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010477/79b0c6d8-c9ae-14a0-7e50-1af47db43e70.png">

※静的IPの設定により、パブリックIPが変わるので、SSHクライアントを設定済みの場合は、接続先IPアドレスを変更する。

## ファイアウォールの設定
CentOSのインスタンスは、デフォルトではSSH（22番）とHTTP（80番）のポートに対して、どこからでも接続できるようになっている。
Lightsailのファイアウォールは接続元のIPアドレスを制限できるので、利用者のみに絞ることで安全性を高める。
※SSHはパブリックIP、OSユーザー名、SSHプライベートキーが無ければ接続できないので、デフォルトでも十分なセキュリティだが、本設定でより強固になる。

### 自身のグローバルIPの確認
下記サイトで確認。
[cman.jp > サーバ監視TOP > サーバメンテ支援 > IPアドレス確認](https://www.cman.jp/network/support/go_access.cgi)

### ファイアウォールの設定手順
Lightsail管理画面を開き、対象インスタンスを選択。
[ネットワーキング]タブ内、[IPv4 Firewall]の[SSH]の行にある編集アイコンを選択。

<img width="80%" alt="aws-lightsail-03-004.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010477/23e9e89c-26a2-6639-8e61-41b9cc92dcae.png">

[IP アドレスに制限する]にチェックし、[送信元 IP アドレス]に自身のグローバルIPを入力後、[保存]を選択。
<img width="80%" alt="aws-lightsail-03-005.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010477/de269022-f31a-b75a-10ef-91e4386f9213.png">

[HTTP]の行も同様に設定する。
Webサービスを一般公開するのであればHTTPの制限は不要だが、開発や学習が目的であれば、利用者のみに制限した方が良い。

設定後、SSHクライアントから接続できることを確認しておく。
また、試しに異なるアドレスを設定すると接続エラーになり、本設定で接続元IPアドレスによる制限ができていることを確認できる。

### 送信元IP制限について補足
送信元IPの制限は、利用者以外の接続を困難にするだけで、確実に防ぐわけではない。
マンションタイプの回線のように、グローバルIPが全世帯共通の場合、同一マンションの人は接続可能となる。
また、送信元IPを偽装する「IPスプーフィング」という攻撃手法もあるため、他のセキュリティを併用する必要がある。
本設定のみで、機密情報を公開することは避ける。

## まとめ
静的IPの設定でインスタンスのパブリックIPが固定され、扱いやすくなる。
ただし、インスタンス削除時の静的IPの削除漏れには注意したい。
また、ファイアウォールで接続元を制限することで、安全性が高まる。
PHPによる型の比較について

## 概要
以下の記載によるとPHPは比較対象の型は異なっていてもTRUEになってしまうらしい。
https://www.php.net/manual/ja/migration80.incompatible.php
0 == "0" はTRUEになるから、型の一致まで検証するなら 0 === "0" にする必要があるようです。

## 実践(PHP)
PHPで簡単な処理を書いてみました。
本当に0 == "0"はtrueになるみたいです。

```php
<?php
if (0 == "0") {
  echo "true";
} else
  echo "false";
?>
```
```
実行結果
% php test.php 
true
```
次は以下のコードで実行してみます。
変更点は「if (0 == "0")」が「if (0 === "0")」に変わっただけです。

```php
<?php
// 比較対象の型も検証する
if (0 === "0") {
  echo "true";
} else
  echo "false";
?>
```
```
実行結果
% php test.php 
false
```
型の検証まで行うとfalseになることを確認できました。

## 実践(Ruby)
Rubyだと「0 == "0"」は数値と文字列は比較不能なのでfalseになりました。
これは想定通りです。

```ruby
if 0 == "0" then
  puts "true"
else
  puts "false"
end
```
```
実行結果
% ruby test.rb 
false
```
## 実践(Python)
Pythonでも「0 == "0"」は型が違うのでfalseになりました。
これも想定通りです。

```python
if 0 == "0":
    print("true")
else:
    print("false")
```
```
% python test.py 
false
```

## まとめ
PHPはRubyやPythonと設計思想が違うようです。
PHPは比較対象の内容が合ってればいい、ということで数値の0も文字列の0もtrueになっちゃうみたいですね。
[XCode, M1] no such module in simulator

#no such module 'RxSwift'の場合Podfileに以下を追加

TARGETS -> Build Settings -> Architectures -> Excluded Architecturesに「arm64」追加

```
post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end
```

*実機にするときは「arm64」削除必要
Vue.js + TypeScript で@Componentをつけ忘れていたら、変更内容がうまく反映されずにはまった話

Vue.js + TypeScript で開発をしている時に、 `Props` を更新したり、template部分を変更しても、うまく反映され図にかなりはまってしまい、修正に時間がかかってしまった。

結果、 `@Component` をつけたら、全てが解決した。
なぜ、解決したかも踏まえた、勉強してしっかりまとめておこうと思う。

# 発生事象

Vue.js + TypeScript で、以下の形式で `.vue` ファイルを使用して開発を行っていた。

```typescript
@Component({})
export default class MyComponent extends Vue {
...
}
```

そうすると、以下のような問題が発生した。

- `data` で設定した場合は画面に反映されるが、 `Prop` で設定すると画面に反映されない。
- `template`　で設定した内容が反映されない。

# 解決内容

調べて見ると、共通点として、 `@Component` を指定しているもののみが上記の事象が反映していることに気づく。
`@Component` をつけてみると、全てがうまくいった。。。

公式ドキュメントを見ると、 `@Component` をつけることは必須とのことでした。。。
https://jp.vuejs.org/v2/guide/typescript.html

すごいシンプルなことだったけど、すごいはまって、1-2日使ってしまったので、メモがてら残しておきます。
時間があれば、この辺りの仕組みも少し勉強したい。。。

# 参考サイト
https://jp.vuejs.org/v2/guide/typescript.html
Learning Music Helps You Read: Using Transfer to Study Linguistic Structure in Language Models

# はじめに
こんにちは、@shoot16625です。
気ままに論文読んでいきます。
間違いがありましたら、コメントいただけると幸いです( ^ω^) 

# 論文情報

`Learning Music Helps You Read: Using Transfer to Study Linguistic Structure in Language Models`

- 著者：スタンフォード大のドクターの方
- https://arxiv.org/pdf/2004.14601.pdf
- https://github.com/toizzy/tilt-transfer
- https://ai-scholar.tech/articles/natural-language-processing/TransfertoStudy
    - AI-SCHOLARでも紹介されているので、合わせてどうぞ

# コレは何？

- 音楽とかJavaコードで事前学習させたLSTMでも、そこそこ精度出せたよ
- このモデルを使って、LSTMが文法構造を学習していることを分析していくよ

# どこがすごいの？

- 既存研究では、モデルの解釈のために、アクティベーション層を可視化したり、特徴的な入力を加えてみたりしている
- 我々は、転移学習がどの程度機能するかで、モデルの学習度合いを測定してみる

# 手法のキモはどこ？

- L1で事前学習（音楽など）
- L2でファインチューニング（スペイン語）
    - 構造的な情報は学習されないのでOK
    - 単語埋め込み自体には、単語同士の文法関係は反映されていないのでOK
    - L1とL2の関連性を排除するために、語彙インデックスはシャッフルしている


![スクリーンショット 2020-12-31 13.59.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/eee91013-5bf6-edd3-c752-82522f9b4e14.png)

# どんな実験したの？

![スクリーンショット 2020-12-31 22.45.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/f5ab0dd7-0308-3046-7f67-ec3a5cf94c26.png)


## 実験1

- ランダムなスペイン語コーパスで事前学習させると、どの程度のperplexityになるか確認
    - zip則ベースの物とも確認

> ジップの法則とは、出現頻度が k 番目に大きい要素が、1位のものの頻度と比較して 1/kに比例するという経験則である

- 図４より、語彙数に対して、perplexityはとても小さい値となっている
    - ファインチューニングの効果

![スクリーンショット 2021-01-01 15.29.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/4f9507fc-8eab-d2c4-ab00-af29b5e53298.png)


## 実験2

- 音楽やコードを事前学習に使用した場合と比較
- 図４より、ランダムデータの場合と比べて、精度が向上していることがわかる
    - 音楽データに関しては310トークンしかないにもかかわらず。
    - javaの方が精度は良い

## 実験3

- 文章の再帰的構造が精度の向上に効いたのではないか？
    - Nesting Parentheses corpusを作って同様の実験
        - 入れ子な構造
        - 図3の数字が適当なトークンで、かっこの始まりと終わりの関係になっている
    - ↑だけだと、弱くない？
    - Flat Parentheses corpusも作った
        - ランダムzipコーパスと似ているはず
- 図４より、ランダムコーパスと比べて遥かに精度が良いことがわかる
    - コレは、文法構造がモデルの学習に役立つことを示している
- 図４より、精度差がないことがわかる。
    - Nesting Parenthesesのような階層構造は埋め込みに不必要であると言える
- Flat Parentheses corpusの方が、zipコーパスより精度が良いことがわかる
    - トークンの配置の仕方による

## 実験4

- より細かい言語間の関連性について
- WALS構文距離を測定
    - 様々なL1言語とスペインL2との類似度を測る
- 図５より、インド・ヨーロッパ語属との相関が高め
- 他言語でも、それなりに転移学習が可能

![スクリーンショット 2021-01-02 13.36.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/b8e0477b-5a10-92a5-df20-fe3fb284e86d.png)


# 次何やるき気？

-  the Test for Inductive bias via Language model Transfer (TILT)
    -  似たような評価をしたい


# 所感

- 文法の学習ができている
- Flat Parentheses corpus で分析するのが、良さそう
Python　Webスクレイピング　selenium


今年エンジニア転職を目指しているものです。
エンジニアへ転職することをも目標にしている方が多いですが
僕も転職できるように頑張ります！
今日学んだことをアウトレットしようと思います。

browser = webdriver.Chrome('chromedriver.exe')
ulr='https://www.google.com/'
browser.get(ulr)

この分でGoogleのブラウザに接続することができます。
from selenium import webdriverをはじめに書いてください。
簡単に書かせてもらいました。
良ければ参考にしてください。
Goで現在時刻のテストどうする話（めっちゃ薄いライブラリ作った）

# どういう記事？
現在時刻が絡むテストってGolangではどうするんだろうと思い調べた。
しっくりくるのがなかったので欲しい機能だけ入れたライブラリを作った。

# 調べた内容

@tomtwinkle さんの記事:[[Golang]テスタブルな現在時刻取得処理を作る](https://qiita.com/tomtwinkle/items/4dee6ed4e81784c66cd2) では以下3つの方法が紹介されてた。

* monkey.Patch
* flextimeパッケージ
* contextで引き回す

他には[Kentaro Kawanoさんの資料](https://www.slideshare.net/kawaken/golang-testingfortime-77668188) も参考になった。

* clockパッケージ
* 外部からの注入


でも、なんか、こう、もっと簡単でいいだよなー。。。

# 作ったもの

って思ってめっちゃ薄いライブラリ作ってみた。
https://github.com/bubusuke/xtime

## 考えたこと
flextimeやclockとやろうとしていることは同じ。time.Now()をラップしてて置き換えできる。
でもこのふたつ、自分としてしっくりきてなかった。

flextimeは排他制御しててちょっと気になる。（[この記事](https://hnakamur.github.io/blog/2020/08/07/mock-time-in-go/)にも記載あり）
あと、flextimeって名前長い（コーディング短くしたい）。
clockはtimeと名前違いすぎてちょっと気になる。

## 特徴
名前：timeっぽく、でも短い名前にしよう。　→　xtime
機能：絞りに絞る！　→　ふたつだけ。
　　`xtime.Now()` って使うだけ。
　　~~テストの時は`xtime.Mock( ${xtime.Now()で返ってくる値} )`で時間変えるだけ。~~
　　テストの時は`xtime.Mock( ${xtime.Now()で実行する関数} )`で時間変えるだけ。
使い方：
　　既存のソースでtime.Now()を使っている部分をこれに置き換えれば使えます。

*〜〜修正：2021/01/16 初回投稿後〜〜*
*より柔軟に設定できるよう `xtime.Mock` の引数を値→関数に変えました。*
*これでテストケースに記載したような実行毎に時間が進むMockを作ったり、Mockをリセットしたりできるようになりました。*


git公開してますが、以下にソースも載せます。

---
ソース

```xtime.go
package xtime

import (
	"time"
)

var now func() time.Time = time.Now

// Mock overwrites return value of xtime.Now().
// You must not use this function except for in test.
func Mock(fn func() time.Time) {
	now = fn
}

// Now returns the value of time.Now().
// If the Mock function has been executed in advance, the value set by Mock is returned.
func Now() time.Time {
	return now()
}

```

---
テスト

```xtime_test.go
package xtime_test

import (
	"testing"
	"time"
	"xtime"
)

type incrementalMock struct {
	i time.Duration
	t time.Time
}

func (m *incrementalMock) Now() time.Time {
	m.i++
	return m.t.Add(time.Second * m.i)
}

func TestNow(t *testing.T) {
	// case 1.
	// Default xtime.Now behavior
	// 'xtime.Now() == time.Now()' become false due to the μ second level execution time difference.
	if !(xtime.Now().Sub(time.Now()) <= time.Second*1) {
		t.Error("Default xtime.Now() must be same to time.Now().")
	}

	// case 2.
	// Constant value Mock
	mockTime := time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC)
	xtime.Mock(func() time.Time { return mockTime })
	if xtime.Now() != mockTime {
		t.Error("xtime.Now() must be same to MockTime.")
	}

	// case 3.
	// Incremental value Mock
	incMock := &incrementalMock{
		i: 0,
		t: mockTime,
	}
	xtime.Mock(incMock.Now)
	if xtime.Now().Sub(mockTime) != time.Second*1 {
		t.Error("xtime.Now() must be same to MockTime+1sec.")
	}
	if xtime.Now().Sub(mockTime) != time.Second*2 {
		t.Error("xtime.Now() must be same to MockTime+2sec.")
	}

	// case 4.
	// reset
	xtime.Mock(time.Now)
	// Same to 1st test case.
	if !(xtime.Now().Sub(time.Now()) <= time.Second*1) {
		t.Error("Default xtime.Now() must be same to time.Now().")
	}

}
```
自分がよく使うショートカット 

## ショートカットを紹介する前に
macでは特定のキーが記号で表示されるため、キーと記号の対応表を下記にまとめました。
後述するショートカットキーのまとめでは、以下の表を元に読み替えてください。

| キー | 記号 | 
|:--|:--|
| command | ⌘ |
| shift | ⇧ |
| option | ⌥ |
| control | ⌃ |
| caps lock | ⇪ |

## vscode
| 動作 | コマンド |
|:--|:--|
| 矩形選択(マウス) | ⇧ + ⌥ |
| 矩形選択(キーボード) | ⇧ + ⌥ + ⌘ + (↑ or → or ↓ + ←)|
| カーソル行を上にコピー | ⇧ + ⌥ + ↑ |
| カーソル行を下にコピー | ⇧ + ⌥ + ↓ |
| ターミナルを出す | ⌘ + j |
| ターミナルからエディタへカーゾルを移動 | ⌘ + 1 |
| 置換 | ⌥ + ⌘ + f |
| サイドバーの表示、非表示 | ⌘ + b |

## vim
| 動作 | コマンド |
|:--|:--|
| ノーマルモードにする | esc |
| インサートモードにする | i |
| 上書きモードにする | R(大文字のR) |
| 矩形選択 | ⌃ + v |
| 次の単語へ移動 | w |
| 前の単語へ移動 | b |
| 行の先頭に移動 | 0 |
| 行の末尾に移動 | $ |
| 直前の操作を取り消す(⌘ + z 見たいなもん) | u |
| カーソルの下に１行追加 | o |
| カーソルの上に１行追加 | O(大文字のO) |
| 行の削除 |dd  |
| 行番号の表示 |コマンドモードで :set number を入力 |
| 行番号の非表示 |コマンドモードで :set nonumber を入力 |
| カーソルを一番下に移動 |コマンドモードで ⇧ + g |
| カーソルを一番上に移動 |コマンドモードで gg|

## finder
| 動作 | コマンド |
|:--|:--|
| 隠しファイルの表示 | ⇧ + ⌘ + . (ドット) |
| 隠しファイルの非表示 | ⇧ + ⌘ + . (ドット) |
| ファイルのパス取得 | ⌥ + ⌘ + c |
| パスを指定して移動 | ⌘ + ⇧ + g |

## スプレッドシート
| 動作 | コマンド |
|:--|:--|
| 罫線を引く | ⌥ + ⇧ + 数字(1~4) |
| 当日日付の入力 | ⌘ + ; |
| 現在時刻の入力 | ⌘ + ⇧ + ; |

## EXCEL
| 動作 | コマンド |
|:--|:--|
| 当日日付の入力 | ⌃ + ; |
| 現在時刻の入力 | ⌘ + ; |

## Mac
| 動作 | コマンド |
|:--|:--|
| フルスクリーンにする | ⌃ + ⌘ + f |
| スクリーンロック | ⌘ + ⌃ + q |
Microsoft365のadmin普通使いをやめる

# Office365のadmin普通使いをやめる

　反省文です。

## 背景・目的・読み手
### 背景
　個人的に買ったテナントでadminをそのまま使っていたものの、流石にセキュリティ的にまずいため、adminとは別のユーザアカウントを作成し、そちらに情報を移動することにしました。
　いろいろなデータを移すのが手間だったり、移せていないものなどもあるため、手順をまとめておきます。

### 目的
　同じようなadminをそのまま使っているユーザの移行のきっかけになればということで投稿します。

### 読み手
　Microsoft365テナントのadminをそのまま普段使いしている管理者。



## 移行手順

### １．移行用ユーザアカウントを作成
　管理ポータルから普段遣い用のIDを作成します。パスワードは必ずadminアカウントとは別のものとしてください。

### ２．adminアカウント表示名・パスワード変更
　表示名の変更は[ユーザー名とメール アドレスを変更する \- Microsoft 365 admin \| Microsoft Docs](https://docs.microsoft.com/ja-jp/microsoft-365/admin/add-users/change-a-user-name-and-email-address?view=o365-worldwide)を参考にすると良いです。

　またadminのパスワードについてはこの機会に見直しをかけましょう。変更後は必ずプライベートモードのブラウザなどから変更後のパスワードでログインできることを確認しましょう。

### ３．移行用ユーザアカウントへTeams/SharePointの権限追加
　adminで参加しているテナント内のチームやサイトへの権限を追加しておきます。念の為adminの権限もしばらく残しておき、何かあった場合に対応できるようにしておきます。


### ４．メッセージセンターのメール通知設定
　今回作成した移行用ユーザアカウントまたはよく使うメールアドレスにメッセージセンターのメールが届くようにしておきます。

### ５．OneDriveのデータ移行
 こちらの手順が参考になります：
[OneDriveのデータ移行（退職者データを引き継ぐ方法） \- ひとり情シス](https://1manit.work/windows/office365/onedrive/take-over-move/)

　なお、ファイル数が多い場合はこの方法では移せないことがあります。その場合は、複数回に分けて移すか、OneDriveアプリにadminと移行用ユーザアカウント両方登録し、移行することも可能です（データ量によってはかなり時間がかかる点は注意）

　また、adminのonedriveのルートを移行用ユーザアカウントのOnedriveにリンクしておくことで、移行用ユーザアカウントのサブフォルダのように使うことも可能です。


### ６．移行用ユーザアカウントへライセンスの移行or追加
　ライセンス数がユーザ数ピッタリの場合、adminアカウントに登録されているE3などのライセンスを移行用ユーザアカウントへ移す必要があります。管理センターでadminアカウントに割り当てられているライセンスのチェックを外し、移行用ユーザアカウントへ登録します。

　ライセンス数に余裕がある場合は、adminアカウントに登録されているライセンスはそのままで、移行用ユーザアカウントへ新たにライセンスを割り当てててもOKです。


### ７．移行用ユーザアカウントでの稼働確認（Teams/Office/Outlook）
　各サービスに移行用ユーザアカウントでログインし、稼働に問題がないことを確認していきます。

　表示名を変更している場合、Teamsのこれまでのチャットも全て新表示名となります。チームメンバーには断りを入れておくと良いです。

　Excelなどは切り替え直後「ライセンスのない製品」と出ることがあります。この場合は暫く待つ、再起動などでライセンス認証が通るようになります。


## 移行できないもの
　以下情報は移行ができないようです。

### Office製品の「最近使ったアイテム」「ピン留め」
　ユーザに紐付いているため移行出来ない。ピン留めはかなり便利だったので1から設定し直すのが面倒ですが仕方ないですね…。

### Microsoft Whiteboardのデータ
　他の参加者を自分のホワイトボードに呼ぶことが可能なので、今回のケースではadminが作ったホワイトボードに移行用ユーザアカウントを呼ぶことで再アクセスは可能です。

　[Microsoft Whiteboard のヘルプ \- Office サポート](https://support.microsoft.com/ja-jp/office/microsoft-whiteboard-%E3%81%AE%E3%83%98%E3%83%AB%E3%83%97-d236aef8-fcdf-4b5e-b5d7-7f157461e920)に以下記載があるにも関わらず、具体的な所有権の変更方法が不明なのが辛い。
> IT 管理者に連絡し、転送するホワイトボードの所有権の変更を依頼してください。



## エラーメッセージ等

　移行直後はこの辺が出ることがあった。都度別名保存などで対処。
[「アップロードはブロックされました」、「このファイルを保存してサインイン」または「コピーの保存」エラーメッセージを解決する方法 \- Office サポート](https://support.microsoft.com/ja-jp/office/%E3%80%8C%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%AF%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%8D%E3%80%81%E3%80%8C%E3%81%93%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%A6%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%80%8D%E3%81%BE%E3%81%9F%E3%81%AF%E3%80%8C%E3%82%B3%E3%83%94%E3%83%BC%E3%81%AE%E4%BF%9D%E5%AD%98%E3%80%8D%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-32c7340c-f5fb-4ca0-a829-65d8120f81f8)
Nuxt.jsでVuetifyのクラスやカラーパックが効かない

## どんな状態か
`<v-row>`や`<v-btn>`のようなコンポーネントは使えるが、`mx-auto`や`text-center`、`red`といったVuetify独自のクラスが一切効かない…

## 原因と解決策
`<nuxt>`コンポーネントを`<v-app>`で囲っていなかったのが原因。
上記の問題が起きている時はv-appの部分をdivタグにしていた

```default.vue
<template>
  <v-app>
    <nuxt />
  </v-app>
</template>
```
上記のようにすることでちゃんと動くようになった。


[公式サイト](https://vuetifyjs.com/en/components/application/)にも

> The v-app component is **REQUIRED** for all applications.

と書いてあった。

Nuxtプロジェクト作成時に自動生成される`default.vue`が長かったので、中身を確認せずに`v-app`も含めたtemplate内部を全て書き換えてしまったのが敗因😫

## 公式サイト
- [Application service — Vuetify](https://vuetifyjs.com/en/components/application/)