OmniAICreator/Qiita-1.07M huggingface dataset:
UE4　マテリアルやメッシュが適用できない問題の解決法

#問題
ドラックアンドドロップで適用させようとすると枠が緑になるのに適用させれないバグが発生。
![Desktop Screenshot 2021.03.26 - 23.16.18.82.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/912815/7b8db99f-f189-1d30-34e2-e3ae11d2d992.png)

#解決方法

ファイルに　`　が含まれてた

だけ


qiitaで一番短い記事かもしれない
SQLite3をソースからインストールしたのに、PHPからSQLite3を使おうとすると元々入っていたSQLite3を使ってしまう問題

#### 環境
・OS：CentOS7
・Apache2.4
・PHP7

#### 問題点
デフォルトで入っていたSQLite3のバージョンが古かったので、最新のSQLite3をソースからインストールしたのですが、PHPからSQLite3を使おうとしたら、デフォルトで入っていた古いSQLite3を見てしまう問題が発生しました。


#### 解決策と参考リンク

これだと新しくSQLite3をインストールした意味がないので、PHPから新しくインストールしたSQLite3を使えるようにする。

解決策ですが、まず、SQLite3をソースからインストールする時に、configureコマンドでCFLAGSオプションを指定するようにしました。

```shell
$ CFLAGS="-DSQLITE_ENABLE_COLUMN_METADATA=1" ./configure
```

また、環境変数LD_LIBRARY_PATHにインストールしたSQLite3のライブラリが入っている/usr/local/libを指定しました。

参考リンク
[【PHP7】PDOでソースからインストールした最新バージョンのSQLite3を使う](https://it-jog.com/php/usesqlite3bypdo)
[(Amazon Linux2(ec2),CentOS7)SQLite3の最新バージョンをインストールする](https://it-jog.com/sqlite/installnewsqlite3)
Gitを学ぶ 2日目 Gitコマンドの続き

# はじめに
　この記事は現代のソフトウェア開発では欠かせない技術となっているGitについて、記事の著者が学習した内容をアウトプットするためのものである。したがって、この記事に書かれた内容は必ずしも正しいとは限らない。
　もし、間違っていることを書いていたり、誤解していることなどが見受けられたら、是非コメント等にて教えていただけるとありがたい。また、著者は「[いちばんやさしいGit&Githubの教本](https://www.amazon.co.jp/%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E3%82%84%E3%81%95%E3%81%97%E3%81%84Git-GitHub%E3%81%AE%E6%95%99%E6%9C%AC-%E4%BA%BA%E6%B0%97%E8%AC%9B%E5%B8%AB%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86-%E5%85%B1%E6%9C%89%E5%85%A5%E9%96%80-%E3%80%8C%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E6%95%99%E6%9C%AC%E3%80%8D%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/429500524X)」を用いて学習を行っている。本記事にて興味が湧いた方はぜひご購入いただきたい。

前回の記事
[Gitを学ぶ 1日目 Gitとは](https://qiita.com/drafts/88d3cac8c934d0186713/edit)

## 変更の取り消し
　バージョン管理を行っていると、変更を取り消したいと思うこと出てくる。そこで用いられるコマンドがgit checkouとgit resetである。

　git checkoutは直前にコミットした状態まで戻すことで、ワークツリーの変更を取り消すことができる。
git checkout -- FilePath とすることで、直前にコミットした状態まで戻す。この操作は厳密にはステージングエリアの状態を戻すコマンドである。

```shell:ワークツリー変更の取り消し
$ git checkout -- FilePath
```

 git resetはgit reset HEAD FilePath とすることで、ステージングエリアの状態を最後のコミットと同じ状態にリセットする。HEADはローカルリポジトリにおいて、最後にコミットした状態を意味する。

```shell:ステージングエリアへの登録の取り消し
$ git reset HEAD FilePath
```

## Gitの管理下にあるファイルを削除する
　Gitの管理下にあるファイルを削除する場合、そのファイルを削除しただけでは不十分である。削除した内容をステージングエリアに登録し、コミットしなければならない。しかし、git rmコマンドを使うことでこれらのことを自動的にしてくれる。このコマンドを実行すると、ワークツリーからファイルやディレクトリを削除し、削除した状態をステージングエリアに登録する。ディレクトリを削除するときは-rオプションをつける。

```shell:ファイルをGit管理下から削除
$ git rm FilePath
```

```shell:ディレクトリをGit管理下から削除
$ git rm -r DirectoryPath
```

## Gitで管理しないファイルを設定する
　Gitでバージョン管理すべきでないファイルも存在する。例えば、アプリケーションのビルド時に自動生成されれるログやパッケージファイル、セキュリティに関することが書かれたファイルといったリモートリポジトリで共有すべきでないものである。
　そこで、.gitignoreファイルというテキストファイルをローカルリポジトリに配置し、そこにGit管理下に置きたくないファイル名やディレクトリ名を書くことで、Git管理下から外すことができる。
　手順は以下の通りである。

```shell:.gitignoreで設定
$ touch .gitignore      # .gitignoreファイルを作成
$ vim .gitignore        # .gitignoreファイルを編集
$ git add .gitignore    # .gitignoreファイルをステージングエリアに登録
$ git commit -m ".gitignoreファイルをGit管理下に追加"
```
なお、.gitignoreファイルの書き方に迷ったら以下のGitHub社のリポジトリを参考にすると良い。
[.gitignoreファイルの書き方](https://github.com/github/gitignore)

今回の記事はこれにて終了とする。

次回の記事
未投稿
はじめてのDjango〜プロジェクトを作成する〜

## はじめに
あいかわらず、Mac M1に苦戦しまくっています。(クソ初心者が購入するんじゃなかったと、軽く後悔もしています。私がバカですね。。。)
今もtensorflowをいまだにインストールできず、ニューラルネットワークもチマチマしかできていません。。。
そんな中、pythonの勉強になればと思い、Djangoに手を出していました。
ここでは、すぐ忘れている私自身のために、備忘録として書いていきます。

# Djangoとは
そもそもDjangoとは、Pythonで実装されたWebアプリケーションフレームワークです。
基本的な機能は、標準装備されており、必要に応じてカスタマイズしていくという、初心者でも優しいフレームワークです。

## プロジェクトを作成する
はじめてなので、プロジェクトを作成して、ローカルサーバーを起動するまでを書いていきます！

### 前提
端末はMac M1です。
conda環境で構築します。
(Mac M1の場合は、miniforgeをインストールしてconda環境を構築してください。)

### condaでDjango環境を作る
ターミナルを開いて、condaのデフォルト環境(base)の起動します。

```terminal:ターミナル
conda activate
```

デフォルト環境(base)上で、次に新たにconda環境を作る。(pythonのバージョンは、3.9にしています。)

```terminal:ターミナル
conda create -n ●●(新しい名前を付ける) python=3.9
```

新しく作ったconda環境を起動します。

```terminal:ターミナル
conda activate ●●(新たに付けたconda環境の名前)
```

新しく作ったconda環境の中にDjango パッケージをインストールします。

```terminal:ターミナル
conda install django
```

Django パッケージがインストールされているかを確認するために、インストール済みパッケージ表示します。

```terminal:ターミナル
conda list
```

以下のようにパッケージを表示した中に、djangoがあれば、インストール成功です！

```terminal:ターミナル
# Name                    Version                   Build  Channel
asgiref                   3.3.1              pyhd3eb1b0_0  
ca-certificates           2020.12.5            h4653dfc_0    conda-forge
certifi                   2020.6.20          pyhd3eb1b0_3  
django                    3.1.7              pyhd3eb1b0_0  ←　ここです！！
```

### djangoでローカルサーバーを起動する。
djangoのインストールが完了したら、新しくdjangoプロジェクトを作っていきます。(ここでプロジェクトのフォルダが作成されます。事前に作りたいディレクトリに移動しておきます。)

```
django-admin startproject ★★(新しいプロジェクト名)
```

★★(新しいプロジェクト名)フォルダに移動します。

```terminal:ターミナル
cd ★★(新しいプロジェクト名)
```

マイグレート(データの統合、移動)をします。

```terminal:ターミナル
python manage.py migrate
```
マイグレートできているかを確認するために、対話的にSQLを実行できるモードにします。

```terminal:ターミナル
sqlite3 db.sqlite3
```
"sqlite>"になったら、以下のコマンドを打って、テーブル一覧を確認する。
以下のテーブルが表示されたら、マイグレートできています。

```terminal:ターミナル
sqlite> .tables
```

```terminal:ターミナル
auth_group                  auth_user_user_permissions
auth_group_permissions      django_admin_log          
auth_permission             django_content_type       
auth_user                   django_migrations         
auth_user_groups            django_session  
```

[Ctrl + c] で対話モードから戻り、ローカルサーバーを起動します。

```terminal:ターミナル
python manage.py runserver
```
以下のコメントが出てきたら、ローカルサーバーが上手く起動したことになります。コメント内に "http://127.0.0.1:8000/" というポート番号が記載されているので、ブラウザで http://127.0.0.1:8000/ にアクセスしてください。

```terminal:ターミナル
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
March 26, 2021 - 12:38:45
Django version 3.1.7, using settings 'helloworld.settings'
Starting development server at http://127.0.0.1:8000/
```

このページが出てきたら、サーバーが起動できています。
![スクリーンショット 2021-03-26 22.56.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226672/64ff5e64-cb55-5440-b941-babee312b5a2.png)

[Ctrl + c] のコマンドを打てば、サーバーが止まります。

## 参考資料
以下を参考にさせていただきました。

M1 MacにPythonインストールして開発環境構築してみた
https://note.com/osmszk/n/n277447e8c2a4

はじめての Django アプリ作成、その 1
https://docs.djangoproject.com/ja/3.1/intro/tutorial01/
[JS] 配列 / forEach

v　　　　　値
i　　　 　　添字
ary  　　　　配列


```js
const arry = [1,2,3,4,5];

arry.forEach(function(v, i, ary) {
  console.log(v, i, ary);
})

for(let i = 0; i < arry.length; i++) {
  const v = arry[i];
  console.log(v);
}
```

[![Image from Gyazo](https://i.gyazo.com/f20871ba79089166a2fe561af96fee1d.png)](https://gyazo.com/f20871ba79089166a2fe561af96fee1d)
AutoLayoutのAdd New Constraints

今回アプリ作成練習で学んだAutoLayoutの一部を記録しておきます。

▼AutoLayoutとは？
iPhoneやiPadなど、サイズが違ってもパーツを自動で調整してくれる機能
そのためには、事前に条件を設定してルールとして決めておく「制約(Constraint)」が必要

なんか難しく聞こえるが、要は事前にこうしてねって設定するだけのようです。

▼AutoLayoutの５つの役割

①Update Frames
AutoLayoutの値と実際の表示の「差」を解消

②Align
パーツを中央に配置や左揃えで配置などの制約

③Add New Constraints
パーツの高さや横幅、余白などの設定

④Resolve Auto Layout lssues
足りない制約を自動で設定、パーツを制約通りに表示したりする機能

⑤Enbed in Stack
パーツにまとめて制約を設定するときに利用


５つの役割があるが、今回は勉強した③Add New Constraintsにのみ触れます。


Add New Constraintsは、横幅や高さ、余白の設定に使用する役割を持っています。
初期の設定で「Constrain to margins」というのにチェックが入っています。

これは、デフォルトで20pxの余白が入っているので、自分で指定したい場合には、必ずチェックを外す必要がある。
チェックを外せば自分で好きな余白に設定できるが、デフォルトでいい場合はチェックありでもOKです。

Add New Constraintsの設定をする中で一番大事なのはこれかなと個人的に思いました。
あとは自分で好きな余白や高さを決めて反映させるだけなので。

AutoLayoutの他の機能については、また勉強したら記録して残したいと思います。
jsで入力項目を出し分けしていた時、戻るボタンでも項目を出したままにする方法

# どうも7noteです。戻るボタンに悩まされるのを解決

戻るボタン（ブラウザバック）をすると、ページロードされるのでjavascriptで出し分けていた内容がもとに戻ってしまう現象を解決。

問題はページロードが起こり初期状態になることなので、解決策としてはページを読み込んだ時にも項目の出し分け処理をするような作りにします。

※前提材料（[ラジオボタンの選択で項目を出し分ける方法](https://qiita.com/7note/items/4046c8e54ee8d00bcb16)）

## ～問題が起こる流れ～

**①ラジオボタンで項目が変わるフォームがある**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/535ec239-0cff-1d69-1d79-7b7ebbece00c.gif"  width="300" >

**②googleを選択したあと入力確認画面に行き、「戻るボタン（ブラウザバック）」を押す.
**

**③すると、ラジオボタンはGoogleが選択されているが、テキストボックスは見えなくなっています。**

（ブラウザバック後の画面）
![名称未設定-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/e2efe6b6-b7a5-c5c6-4acc-c9b8e29b0d14.jpeg)
**↑「画面が戻ってもここに入力フォームをだしたままにしたい」というのが今回の話。**

## 解決方法

出し分けを行なっているjsを**ページロード時にも起動させることで解決**する。

```script.js
$(function(){

  /* ページロード時にも関数を動かす */
  changeItem();
  
  /* nameがengineのラジオボタンが変更された場合の処理 */
  $( 'input[name="engine"]:radio' ).change( function() {
    
    /* 関数を動かす */
    changeItem();
  });

  function changeItem(){

    /* nameがengineのラジオボタンで選択されている値を取得 */
    var selectdata = $("input[name='engine']:checked").val();

    /* その値が`google`だったら追加質問項目を表示。違えば非表示にする */
    if(selectdata == "google"){
      $(".google_only").show();
    } else {
      $(".google_only").hide();
    }
  }

});
```
※jqueryを使用しています。

## まとめ

出し分けの処理を関数にして、ページロード時、もしくはラジオボタンの値が変更されたときに起動するような仕組みにしておけば大丈夫です。

フォームは入力画面、確認画面をそれぞれデバックするのではなく、使うユーザーが実際に行いそうな動作や処理を想像して動かしてみる必要性がありますね。

#### おそまつ#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
ps auxの出力結果をCSVに出力するシェルスクリプト

プロセスごとのCPU負荷計測用に作成したスクリプトです。

一定周期の出力結果を1つのCSVファイルに追記していくパターンと
ダンプした時間帯ごとにCSVファイルを分割するパターンの2パターンで作成してみました。
用途に応じて使い分けも可能です。

#パターン①：一定周期の出力結果を1つのCSVに追記していく
作成したシェルスクリプトはこちら。

```record_ps_aux.sh
while true;
do 
date
date "+%Y/%m/%d %H:%M:%S" >> ps_record.csv;
ps aux | awk '{ printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11);}' >> ps_record.csv;
sleep 10; #10sec周期で実行
done; 
```
10秒周期でps -auxコマンドの出力結果を1つのCSVファイルにどんどん記録していくものです。コンソール上にはdateコマンドにより記録した時間のタイムスタンプが出力されます。
後でExcelでの編集が容易になるよう、awkを使ってタブ区切りで出力するようにしています。

見ての通り、無限ループで実行しているため、計測終了後にCtrl+Zで強制終了する必要がありますのでご注意ください。

#パターン②：ダンプした時間帯ごとにCSVファイルを分割する

```record_ps_aux2.sh
while true;
do 
date
ps aux | awk '{ printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11);}' > ps_record_`date +%Y%m%d_%H%M%S`.csv;
sleep 3600;
done; 
```
こちらはps -auxコマンド実行した時間ごとに出力するCSVファイルを分ける形式です。
dateコマンドの出力結果を出力先ファイル名の末尾に記載することで、タイムスタンプごとのCSV出力が可能となります。

こちらも無限ループで回してるため、計測終了後に強制終了するのを忘れずにお願いします。

#おわりに
もう少しうまい書き方などありましたら、ぜひご教示いただけると嬉しいです。
エラー Couldn't inline method call 'userProfileChangeRequest' into

#FirebaseのAuthenticationでユーザープロフィール更新時に謎のバグ
Kotlinでfirebaseのプロフィール更新時に

```
Couldn't inline method call 'userProfileChangeRequest' into
```

っ出てビルドが通らない。
理由は不明だけど、下記でビルドが通ったので、もしものときに誰かの役に立てばと思って書き残します。

##バグの出たコード
```Kotlin
val profileUpdates = userProfileChangeRequest {
    displayName = "ユーザー名"
}
```


##バグが回避できたコード
```Kotlin

val profileUpdates = UserProfileChangeRequest.Builder()
        .setDisplayName("ユーザー名")
        .build()
```
過去の日付のテキストファイルを一括作成するPowerShellスクリプト

#趣旨

ログファイルの定期削除ツールの開発をすることになって、作成日時や更新日時が過去のファイルが大量に必要になった。

なので、掲題のPowerShellスクリプトを作った。
# Powershell ソースコード

```powershell
#フォルダのパスを定義
$logFolderPath = "C:\work\Logs\"

#フォルダを作成
New-Item $logFolderPath -ItemType Directory

#何日分のファイルを作成するか
$days = 365

for($i=0;$i -lt $days;$i++)
{
    #ファイルパスを定義
    $today = Get-Date
    $targetDay = $today.AddDays(-$i)
    $logFile = $logFolderPath + "Log_hogehoge_" + $targetDay.ToString("yyyyMMdd") + ".txt"

    #本文
    $message = "dummy"

    #テキストファイルを出力
    Write-Host $targetDay.ToString("yyyy/MM/dd")
    $message | Out-File $logFile -Append -Encoding UTF8

    #作成日時、更新日時、アクセス日時を更新
    Set-ItemProperty -Path $logFile -Name CreationTime   -Value $targetDay.ToString("yyyy/MM/dd")
    Set-ItemProperty -Path $logFile -Name LastWriteTime  -Value $targetDay.ToString("yyyy/MM/dd")
    Set-ItemProperty -Path $logFile -Name LastAccessTime -Value $targetDay.ToString("yyyy/MM/dd")
}
```
#実行結果のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/7c35735a-a469-3bc2-4741-02182be341f5.png)
新一二年生のためのくりかえし算数ドリル緊急回避プログラム

https://qiita.com/wakou-qiita/items/ce9b8664eb50f15acb69

新一二年生の皆さん。おはようございます。
今日は、逆ポーランド記法の計算の仕方を教えます。

# 注意：
まだ割り算を習っていない皆さんには、割り算を教えてはいけないので、
割り算の計算方法は教えません。

# 準備
- Node.js 14.16.0 (ほかの言語でもできる)
- Windows10 (かそれ以外)

# 方法
やり方を教えます。
よく見てください。
1. 逆ポーランド記法の式が入った配列をexpに代入する。
2. 計算する関数calcを用意する。
3. 配列stackを用意する。
4. 6までをexpが空になるまで繰り返す。
5. expをshiftする。
6. 5の値が数値だったら、stackにpushし7まで飛ばす。演算記号だったら、5に進む。
7. stackから2こ切り出し、それを使ってfuncを実行する。 
8. stackからpopし、値をreturnする。

# お手本

```js
var exp = []//"逆ポーランド記法の式"// //1
var calc = {"+":args=>args[0] + args[1],"-":args=>args[0]-args[1],"*":args=>args[0]*args[1]}//2
var stack = []//3
while(exp.length) {//4
  var now = exp.shift()//5
  if(!isNaN(now)) {//6
    stack.push(now)
  } else {
    var args = stack.splice(-2);
    stack.push(calc[now](args))
  }
}
var result = stack.pop();
```

#清書

では、清書しましょう。

```js
function exe(porn) {
  var calc = {
    "+":p=> p[0]+p[1],
    "-":p=> p[0]-p[1],
    "*":p=> p[0]*p[1],
  }
  return porn.reduce((res,now)=> {
    if(calc[now]) {
      res.push(calc[now](res.splice(-2)))
    } else {
      res.push(now)
    }
    return res;
  },[]).pop()
}
```

### 完成です。

このJSプログラムをまとめます。

```js
function toPN(formula) {
  var priority = {"+":1,"-":1,"*":2};
  return formula.split(" ").reduce(($,now)=> {
    if(priority[now]) {
      if(priority[$[1][0]]>= priority[now]) $[0].push($[1].shift())
      $[1].unshift(now)
    } else $[0].push(+now)
    return $;
  },[[],[]]).flat()
}

function calc(porn) {
  var func = {
    "+":p=> p[0]+p[1],
    "-":p=> p[0]-p[1],
    "*":p=> p[0]*p[1],
  }
  return porn.reduce((res,now)=> {
    if(func[now]) {
      res.push(func[now](res.splice(-2)))
    }else res.push(now)
    return res;
  },[]).pop()
}

function exe(exp) {
  return calc(toPN(exp));
}

```
## ちなみに、動くかどうかは知りません。（未テスト）
終わります。
Cannot find module 'agentkeepalive' が出てnpmのアップデートに失敗するときの対処

npmのアップデートでときどきエラーが発生するので、その対処法についてまとめる。


## エラー内容
npmは最新バージョンがリリースされるとnpmコマンド実行時に、最新バージョンに更新するコマンドを叩くように促してくる。
![スクリーンショット 2021-03-26 22.33.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331211/353d5b65-721d-2096-4a5f-c6f1f87bb1cb.png)
言われた通りにv7.7.5にアップデートするべく

```
$ npm install -g npm@7.7.5
```

もしくは

```
$ sudo npm install -g npm@7.7.5
```

を実行するのだが、
![スクリーンショット 2021-03-26 22.36.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331211/eae669d3-a8e8-22e0-25cb-2ed44fa6d992.png)

```
npm ERR! code MODULE_NOT_FOUND
npm ERR! Cannot find module 'agentkeepalive'
```

というエラーメッセージが出る。

## 対処法

```
$ npm install -g agentkeepalive --save
```

を実行してから、再度

```
$ sudo npm install -g npm@7.7.5
```

を実行すると良い。

当然のことながら、 `npm@7.7.5` は各自最新バージョン情報を記述すれば良い。
`npm@latest` でも可能。

## agentkeepaliveって何だ？

https://www.npmjs.com/package/agentkeepalive

https://github.com/node-modules/agentkeepalive#readme

先ほどの対処では、agentkeepaliveをインストールしている。
軽くググって調べてみたが、正直よくわからなかった。
ts-nodeの環境構築中だったのが関係しているかも、という程度。

## 参考
https://github.com/nvm-sh/nvm/issues/2438
小学校低学年のための算数ドリル回避プログラム

小学生の皆さん。
算数ドリルめんどくさくないですか？
僕はめんどくさかった記憶があります。
**九九覚えるのとか、めんどくさいですよね。**
***
**実は、**
九九を覚えなくてもJavaScriptを覚えれば
算数ドリルを解くことができます！！
今日は小学生の皆さんに、”けいさんロボット”の作り方を教えます。

## 注意:
始める前に、注意です。
よく聞いてください。

- まだ、低学年の皆さんは、割り算を習っていないと思います。
  - そのため、この”けいさんロボット”は割り算を行うことができません。

## 手順：
手順を説明するので、よく聞いてください。
わからないことがあったら先生に聞いてください。

1. 中間記法から、逆ポーランドに変換する。
2. 計算する。  

## 準備：
持ち物を用意してください。

・Node.js 14.16.0 (ほかの言語でもできる)
・Windows10 (かそれ以外)

## 製作:
### パース:
####先生のお話:
まず、手順①の中間記法から逆ポーランド記法へのパースをやりましょう。
中間記法というのは、

```
1 + 1 //(= 11)
```
のような、普通の書き方です。
逆ポーランド記法は、

```
1 1 + //(= 11)
```
のような書き方で、コンピュータが処理しやすい書き方です。
逆ポーランド記法へのパースはこのように行います。

#### よていひょう:
1. 式をtokenで区切りexpに保存する。(配列)
2. stack(配列)を用意する。
3. result(配列)を用意する。
4. 演算子の優先度を定義する。(関数)
5. 11までを繰り返す。 
6. expの先頭をshiftする。
7. 取り出されたものが数値だったらresultにプッシュ。11まで飛ばす。
8. 取り出されたものが演算子だったら、  
stackの一番後ろの演算子と優先度を比べる。9に行く。
9. stackの一番後ろの演算子の優先度が高いか同じなら、  
ポップしてresultにプッシュする。10に行く
10. 演算子をstackにプッシュする。
11. expがもう無かったら、繰り返しを止め、12に行く。
12. stackに演算子が残ってたら、  
後ろからポップしてプッシュするのを演算子が無くなるまでやる。

これをそのままコードに表しましょう。

#### お手本
```js
var exp = "式".split(" ")//1
var stack = []//2
var result = []//3
var priority = {"+":1,"-":1,"*":2};//4
function loop() {//5
  var now = exp.shift();//6
  if(!isNaN(+now)) {
    result.push(+now);//7
  } else {
    if(priority[stack.slice(-1)[0]]>= priority[now]) {//8
      result.push(stack.pop())//9
    }
    stack.push(now)//10
  }
  if(!exp.length)return;//11
  loop()//5
}
if(stack.length) {//12
  while(stack.length)result.push(stack.pop())//12
}
```

#### 清書
では、小学生の皆さん。清書してみましょう。
題名は、関数名として書いてください。
コメントアウトはバックスペースで丁寧に消してください。
***
***
```js
function PornConv(formula) {
  var exp = formula.split(" ")
  var stack = []
  var result = []
  var priority = {"+":1,"-":1,"*":2};
  for (now of exp) {
    if(priority[now]) {
      if(priority[stack[0]]>= priority[now]) {
        result.push(stack.shift())
      }
      stack.unshift(now)
    } else {
      result.push(+now);
    }
  }
  result.push(...stack)
  return result;
}
```

よくできました。:upside_down:
では計算しましょう。

### 計算:
#### 先生のお話:
__計算は簡単です。__
演算子が来たら、その演算子通りに__計算するだけ__です。

例えば、[1, 1, "+"] というパース結果の答えは、
２です。
では計算してください。
導電布タッチセンサーモジュール nüno ver.2 にファームを書き込む


導電布タッチセンサーモジュール nüno ver.2 はマイコンとして TWELITE が搭載されています。

ファームウェアをアップデートしたり、自分で作ったファームウェアで使えるように、書き込みキットを作りました。

洗濯バサミ型治具と、メスメスジャンパー6本
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/031eec01-d8f3-bfff-1909-dcb041fa4bac.png)



このセットに更にFT-232モジュールが必要となります。FT-232モジュールとして、一般的な USB シリアルモジュールではなく TWELITE-R2 モジュールを使用します。こちらだとリセットやプログラムモードの変更が自動で使えるためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b211cebe-6836-69b1-3c1f-5f7d7f1e2729.png)
TWELITE-R2モジュールは秋月電子で￥1500で購入できます。
https://akizukidenshi.com/catalog/g/gM-15095/

 nüno ver.2 モジュールの書き込み端子。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e7d05133-9fe8-e8ff-49c8-5210618c9fd7.png)



以下のように接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6b693927-16e7-c2fc-646b-019cafcb7bfd.png)

|色|nüno ver.2|TWELITE R2|
|:---:|:---:|:---:|
|青|TX|TX|
|白|RX|RX|
|橙|VCC|VCC|
|黒|GND|GND|
|黄|PRG|PRG|
|緑|RST|RST|

 nüno ver.2 モジュール側
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a065bc5f-afbf-75e5-268f-0ab3eba5f7b4.png)

TWELITE-R2側
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1965c987-cae3-1b62-b23d-d10cbc4fb9db.png)

書き込みの手順などは以下の記事の通り行いました。
「TWELITE STAGE on Ubuntu 20.04」
https://qiita.com/nanbuwks/items/4ce2447b7b9ec0d21287
【ROS】C++ エラー terminate called after throwing an instance of 'ros::TimeNotInitializedException'

```
terminate called after throwing an instance of 'ros::TimeNotInitializedException'
  what():  Cannot use ros::Time::now() before the first NodeHandle has been created or ros::start() has been called.  If this is a standalone app or test that just uses ros::Time and does not communicate over ROS, you may also call ros::Time::init()
```

原因:nodehandleをclass内に定義していた
対策:nodehandleをメインですぐに生成し,classに入れて使う.

![Screenshot from 2021-03-26 22-24-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/981e7182-435e-52d4-d9a6-29c4e6af8193.png)

https://github.com/wsnewman/ros_class/blob/master/example_ros_class/src/example_ros_class.cpp
Macで/dev/ttyをコンテナに渡せなかったので、socatでシリアル通信のエミュレートした。

# はじめに
普通にやってたらコンテナからUSB接続のシリアル通信デバイスにアクセスできないので調べた。
開発環境を共有したいので、なんとかコンテナでやる方法ないか調べてみた。


# Dockerコンテナで、シリアル通信のための`/dev/tty`を使えるようにしたい。
## Docker run
`docker run`するときに渡せる。

```
docker run --device=/dev/ttyUSB0:/dev/ttyUSB0 --rm -it debian
```

ここ参照。
[DockerコンテナからUSBデバイスへのアクセス | Armadillo](https://armadillo.atmark-techno.com/blog/10899/4191)

## Docker compose
docker-compose.ymlだと、こんな感じでUSBシリアルの接続情報を渡せる。

```yml
devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"
```

ここ参照。
[Compose file version 3 reference | Docker Documentation](https://docs.docker.com/compose/compose-file/compose-file-v3/#devices)

名前がわからないときは、`/dev`をわたしちゃうこともできるらしい。
ただ、Version 3は対応してないらしい・・・
[docker-compose device wildcard - Stack Overflow](https://stackoverflow.com/questions/56441225/docker-compose-device-wildcard)

## そもそも
Macには対応してないらしい・・・
[Exposing a tty serial device requires privileged and doesn't work · Issue #900 · docker/for-mac](https://github.com/docker/for-mac/issues/900)

# シリアル通信をエミュレートすることにした。
mockをどこで作るかみたいな話になるかなと思うけども、エミュレートする方法があったので、試してみた。

## socat
なにか送ったら、なにか返してくれるやつが欲しかったので、こんな感じで試してみたらいい感じやった。

```bash
socat PTY,link=./virtual-tty,raw,echo=0 EXEC:cat
```

- linkで普段`/dev/tty*`とかのポート名を指定できる
- EXECでコマンド渡せる
- 2つ設定を並べたらインプットとアウトプットにしてくれる

ここらを参考にした。
[socatで仮想シリアルポートを作る - Qiita](https://qiita.com/uhey22e/items/dc41d7fa1075970e66a1)
[Virtual Serial Port for Linux - Stack Overflow](https://stackoverflow.com/questions/52187/virtual-serial-port-for-linux)
[c++ - Emulate serial port - Stack Overflow](https://stackoverflow.com/questions/22568878/emulate-serial-port)
[Emulate serial port - DebugCN](https://www.debugcn.com/en/article/57114232.html)

## go
こんなコード使って動作確認してみた。

```go
package main

import (
	"log"
	"github.com/tarm/serial"
)

func main() {
	c := &serial.Config{Name: "./virtual-tty", Baud: 9600}
	s, err := serial.OpenPort(c)
	if err != nil {
		log.Fatal(err)
	}
	sendMessage := "hoge1"
	log.Println(sendMessage)
	_, err = s.Write([]byte(sendMessage))
	if err != nil {
		log.Fatal(err)
	}

	buf := make([]byte, 128)
	n1, err := s.Read(buf)
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("%q", buf[:n1])
}
```

```bash
$ go run main.go 
2021/03/26 08:30:46 hoge1
2021/03/26 08:30:46 "hoge1"
```

# おわりに
謎技術だったコンテナと少し仲良くなれてよかった。
ペリフェラルっぽいところ関係する開発やとコンテナめんどそうやなと思ってたけど、そこそこどうにかなりそうなので、敷居がさがった。良い感じ。
[Swift] AutoLayoutのエラーログをしつかり読み解こう！

本記事では、AutoLayoutでエラーログが発生した際のアプローチについてご紹介します。

# 発生した問題

AutoLayoutでレイアウトに制約を設けて実装した際、以下のエラーログが発生しました。

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477704/1359766a-404a-efba-b211-ae574ced5ba0.png)

この際にやるべきアプローチを紹介します。

## アプローチ： ログを読み解く

以下をご覧ください。

```
Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000035d9f90 [対象のUIやレイアウト箇所]  (active)>
```

Will attempt to recover by breaking constraintの部分は、「制約を取り除いて表示している」ことを意味しています。
そのため、[対象のUIやレイアウト箇所]の部分について、もう一度制約を見直し再構築することで上記のようなエラーログが解消できるということになります。

（自分の場合は、冗長な制約があると怒られていたため消すことで解消できました。）

また、どのUIのエラーログがわからない場合があります。
その時は、`width == 382`などを参考にすると良いです。

さらに、[Why The Failure, Auto Layout?](https://www.wtfautolayout.com/?example=true)というサイトにエラーログを入力することで、わかりやすく可視化してもらえます。

![スクリーンショット 2021-03-26 21.09.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477704/1dbb2d8f-603a-378e-f1de-9df7247e269e.png)
![スクリーンショット 2021-03-26 21.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477704/8dc00c6f-92b1-c117-1a27-d3c1c7e1453e.png)

# 最後に

今回はAutoLayoutのエラーログが発生した時のアプローチについて紹介しました。
他の記事でも別のやり方が載っているのでそちらも参考にしてみてください。

# 参考資料

- https://qiita.com/akatsuki174/items/6935bb6ff64f4df51c5a
- https://qiita.com/akatsuki174/items/ccf394c03677ac62191e
Amazon CloudWatch

#CloudWatch
AWSリソース、アプリケーション、オンプレミスのモニタリングサービス

#CloudWatch Metrics
CloudWatchに発行されたメトリクスを収集、統計取得

**(1) メトリクス**
・ColoudWatchに発行された時系列のデータポイントセット
・名前を持つ
・メトリクスは作成されたリージョンにのみ存在

**(2) 名前空間**
・CloudWatchメトリクスのコンテナ
・異なる名前空間のメトリクスは相互に切り離される

**(3) ディメンション**
・メトリクスを一意に識別する名前

**(4) メトリクスデータの作成**
・基本は1分、カスタムメトリクスの高解像度利用で最短1秒
・EC2では基本モニタリングで5分、詳細モニタリングで1分ごとにメトリクス作成
・**メトリクスデータの使用期間**
　１分未満：３時間
　１分：１５分
　５分：６３日
　１時間：１５ヶ月

**(5) CloudWatchカスタムメトリクス**
・標準メトリクス以外の独自のメトリクスも監視可能

**(6) 統合CloudWatchエージェント**
・メトリクスとログの両方を単一のエージェントで収集
・agent、metrics、logsの3つのセクションを持つJSONファイルを設定
　ファイルの格納パス
　データの取得頻度
　取得対象

#CloudWatch Alarms
・メトリクスをモニタリングしてアラームを発行
・条件指定で、自動アクション実行が可能
・**アラームの種類**
　OK：正常値
　ALARM：異常値
　INSUFFICIENT_DATA：判定不能

**M out N(N個中M個)のアラーム設定**
・アラームを発生させるデータポイント数を設定可能

#CloudWatch Logs
・AWSサービスおよび顧客システムのログ監視、保存、アクセスを提供
・エージェント経由でログメッセージをCloudWatchエンドポイントに転送
・ログデータの保存期間を設定可能(1日〜永久保存)
・S3へのログのエクスポートが可能

**CloudWatch Logs メトリクスフィルタ**
・ログデータから特定の文字列のフィルタリング可能

**loudWatch Logs Insights**
・CLoudWatch Logs のログデータをインタラクティブに検索して分析

#CloudWatch Events
・リソース変更のイベントに応答してアクションを実行
・システムイベントをトリガーとして、ターゲットがイベントを処理
Windows10にEmacsキーバインディング設定

# はじめに

[R StudioでEmacsキーバインディング設定](https://qiita.com/honda28/items/179d3c6335ff31d8b523)で Rstudio に対して、（Backspace などは不十分な部分はあるが）Emacs キーバインディングを設定した。
RStudioサーバーにて再度キーバインディングを設定するも、Backspace はおろか Ctrl+n（1行進む）も Chrome ですでに割り当てられている（ Ctrl + h は履歴、Ctrl + n は新規ウィンドウ ）ため、使えない。これは不便ということでそもそもの Windows 上のキーバインディング変更を試みた。
[Windows 10でも「Emacs風キーバインド」を使おう【AutoHotKey】](https://linuxfan.info/windows-emacs-keybindings)を参考にした。

# AutoHotKey

参考記事のタイトルに書いてあるとおり、AutoHotKey なるソフトを使用する。[AutoHotKey](https://www.autohotkey.com/) にて [Download] [Download Current Version] でインストールファイルをダウンロードし、インストール。[usi3/emacs.ahk](https://github.com/usi3/emacs.ahk/blob/master/emacs.ahk) から emacs.ahk をダウンロードして実行すると、Emacs のように扱うことができる。
[WPF]ReactiveProperty を使用して ViewModelにViewのインスタンスを渡す。

※この記事に書かれている方法は、MVVMの原則を壊す恐れがあるため、推奨される方法ではありません。それをご理解の上無理矢理実装したい方向けの記事になります。

最近WPFを書き始めたのですが、MVVMでコードを書いてる時にViewModelでViewのインスタンスが欲しいなーって思うことが時々あったので、取得する方法を忘却録として書いておきます。
個人的にはReactiveProperty無しでC#+WPFでMVVMなコードを書く気にはならないです。
環境: .NET FrameWork4.8,Visual Studio Community 2019
(.NET Coreでも.NET5でもVisual Studio2017 Expressなんかでも動くと思います)
#準備

まず前提条件として、View.XamlのDataContextでViewModelを参照します。
PrismなどのMVVMフレームワークを使用しているなら自動的に登録されていたりしますが、そうでないならWindowやUserControlの下にこういった感じで指定します。

```xml:MainWindow.xaml
  <Window.DataContext>
     <local:MainWindowViewModel/>
  </Window.DataContext>
```


①プロジェクト→Nugetパッケージの管理より、ReactiveProperty.WPFを追加します。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374084/7dcad904-9494-036f-2b9d-7901837d9340.png)
②View.xamlに以下の参照を追加します。

```xml:MainWindow.xaml
xmlns:bh="http://schemas.microsoft.com/xaml/behaviors"
xmlns:rp="clr-namespace:Reactive.Bindings.Interactivity;assembly=ReactiveProperty.WPF"
```

③ViewModel.csに以下の参照を追加します。

```csharp:MainWindowViewModel.cs
using System.Windows;
using Reactive.Bindings;
```


#取得方法

View.xamlにてEventToReactiveCommandを使い、Loadedイベントをコマンドに変換してViewModelに渡します。

```xml:MainWindow.xaml
<!--参照の定義の下、ボタンなどの要素の上に書きます。-->
  <bh:Interaction.Triggers>
      <bh:EventTrigger EventName="Loaded">
          <rp:EventToReactiveCommand Command="{Binding LoadCommand}" />
      </bh:EventTrigger>
  </bh:Interaction.Triggers>
```

受け取ったコマンド内のRoutedEventArgs.SourceからWindowのインスタンスを取得します。
他で使えるように、適当な変数にでも入れておきましょう。

```csharp:MainWindowViewModel.cs
    public class MainWindowViewModel{

        public ReactiveCommand<RoutedEventArgs> LoadCommand { get; }
        private MainWindow _mainWindow; 

        public MainWindowViewModel() {

            //必要に応じて.addToやClassTerminateなどでオブジェクトの解放を定義しておきます。 
            LoadCommand =
                new ReactiveCommand<RoutedEventArgs>()
                    .WithSubscribe(e => _mainWindow = (MainWindow)e.Source);

           //例えばこんな感じのコマンドを作ってウィンドウを閉じることが出来ます。
           //このコードはメンバ定義もバインディングもしてないのでこのままでは動きません。
           hogehogeCommand=
               new ReactiveCommand()
                   .WithSubscribe(() => _mainWindow.Close());

        }
    }
```

#所感
WindowやWindow内に読み込んだUserControl自体の状態をどこで管理したら良いかよくわからない。
(呼び出したWindowのViewModelに責務があるのか、DIに登録したModelと繋いだほうがいいのか･･･とか)
CPU,メインメモリ,キャッシュメモリについて

```
キャッシュメモリと主記憶との間でブロックを置き換える方式にLRU方式がある。この方式で置換えの対象になるブロックはどれか。

①一定時間参照されていないブロック
②最後に参照されてから最も長い時間が経過したブロック
③参照頻度の最も低いブロック
④読み込んでから最も長い時間が経過したブロック
```

#CPUとは（中央演算処理装置）
パソコン上のハードウエアとソフトウェアから受け取るすべての指示を処理するパーツ。
役割▶ソフトウェア、ハードウエアをユーザーが利用できるような状態にします！！ソフトとハードから送られてくる情報をCPUが処理する。
　　　写真編集と動画編集はCPUに負荷がかかる。

#メインメモリとは
コンピューター内でのプログラムやデーターを一時的に保持するための装置です。CPUが直接メモすることができます。
この子は処理がめっちゃ早いですw早いんですけど、電源を落とすと記憶内容が失われます。なので、長期的に保存する場合は、ハードディスクとか外部記憶装置を利用して保存します！！

#キャッシュメモリとは
CPUとメインメモリの仲介役です。メインメモリよりは容量は少ないけど高速なメモリなのでよく使うメモリだけ保存します。SP秘書みたいな感じです😎


#仮想メモリとは
現在のコンピューターは上記のように万能になっていて、なおかつ大容量になっていますが、同時に複数のページや複数のプログラムを起動することにより、メモリが足りなくなってしまいます。
そうなると困ってしまいますので、OSにはメモリの中で今後使われる可能性が低いページをハードディスクに一時的に避難させてメモリを空けることです。
*ハードディスク〜主記憶装置に移動させる▶ページイン
*主記憶装置〜ハードディスクに移動させる▶ページアウト

またこの移動にも、アルゴリズムが存在します。

①FIFO
最初にページインしたページ

②LFO 
利用された回数が最も少ないページ

③LRU
最後に利用してから最も時間が経過しているページ。

以上を考えると答えは、2番になるかなと思います👍
【Vue2.x】./assets下の画像をコンポーネントに受け渡して表示する

ときに

+ 画像が表示されない
+ エラー Cannot find module '@/assets/piyo.png' が出る

で悩んだのでメモする

## 成功例
```Hoge.vue
<template>
  <FugaComponent
    :img="img"
  />
</template>

<script>
import FugaComponent from './FugaComponent.vue'

export default {
  components :{
    FugaComponent
  },
  data: ()=> ({
    img: require('@/assets/piyo.png')
  }),
}
</script>

```


```FugaComponent.vue
<template>
  <img v-bind:src = "img" />
</template>

<script>
export default {
  props: ['img']
}
</script>

```

###参考サイト
[【Vue.js】なぜかimgが表示されない時の解決法とその理由 - ryoのぼやき](https://greko-engineer.hateblo.jp/entry/2020/03/05/231242)
[nuxt.jsで:src=&quot;require(変数)&quot;で画像パスを指定する時に。。 - Qiita](https://qiita.com/ryo2132/items/ed5e3f5eee1ba0c4c625)
VueでLazyLoadを実装

#概要
画像の読み込みが少し遅れて、読み込み時に一瞬レイアウトが崩れてしまうのを阻止したかったのでLazyLoadを導入しました。

#実装
Vue-Lazyloadモジュールを使用しました。

https://github.com/hilongjw/vue-lazyload

インストール

```
npm i vue-lazyload -S
```

または

    yarn add vue-lazyload


インポートします。

```app.js
import VueLazyload from 'vue-lazyload'
Vue.use(VueLazyload)
```

必要に応じてエラー時に表示する画像や事前ロードの大きさなど色々設定できます。
詳細はこちら↓

https://github.com/hilongjw/vue-lazyload#constructor-options


```.vue
<template>
<div>
    <ul>
        <li v-for="post in posts" :key="post.id">
            <img v-lazy="post.imgUrl" />
        </li>
    </ul>
</div>
</template>
```

指定したい画像に`v-lazy`を指定してあげることで適用することができます。

#参考文献
https://www.kabanoki.net/2099/
Rubyのぼっち演算子(&.)にはメソッドだけでなく演算子も渡せる

Rubyでは、あるオブジェクトのメソッドやインスタンスのインスタンス変数にアクセスする際、アクセス元（[レシーバーというそうです](https://qiita.com/sentencebird/items/87b6ef7c99e9eb9a4b20#comment-6029c456ead22657925d)）がnilの場合はエラーとなる。それを防ぐために返り値wをnilを変えるのが`&.`演算子です（self navigation operator, ぼっち演算子というらしい）

```ruby

# もし@userが未定義（nil）のとき
article = @user.article  # => NoMethodError: undefined method `artcile' for nil:NilClass
article = @user&.article # => nil
```

~~これはメソッドにも演算子に対しても使えます~~
演算子もいくつかを除いてメソッドとして実装されているため、同じ挙動をします


```ruby

nil + 10   # => NoMethodError: undefined method `+' for nil:NilClass
nil &.+ 10 #=> nil

nil << 10   # => NoMethodError: undefined method `<<' for nil:NilClass
nil &.<< 10 # => nil

# 次の2つの式が同値になる
@user.article && @user.article == Article.last
@user.article &.== Article.last
```

---
- https://aaronlasseigne.com/2016/01/04/rubys-new-safe-navigation-not-equal-operator/
- https://www.ruby-lang.org/ja/news/2015/12/25/ruby-2-3-0-released/
- https://techracho.bpsinc.jp/hachi8833/2017_11_21/48340
PHPのprintf()やsprintf()でのエスケープシーケンス

```php
printf("%"); //=> Warning: printf(): Too few arguments ...
printf("%%"); //=> "%"
```

printf()やsprintf()でのエスケープシーケンスは、```%```　らしい。

## 参考
[PHP - Warning: printf(): Too few arguments strange issue - Stack Overflow](https://stackoverflow.com/questions/11515142/php-warning-printf-too-few-arguments-strange-issue)
> https://www.php.net/sprintf
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136617/2b24270f-e67f-cb09-ce0f-2e7f9d55f53b.png)
Roo / Ruby on Rails Gem 日本語訳(1)

**今回実務で扱ったRubyonRailのGem`Roo`についてまとめました。
ソースコード: https://github.com/roo-rb/roo**
**今回の投稿の続きはこちらです。
→[Roo / Ruby on Rails Gem 日本語訳(2)](https://qiita.com/tako_tako/items/0ec086e280c74fe86701)**
# 投稿動機

**→実務で扱ったGemを復習する
→Githubなどのソースコードにビビらないようになりたい
→将来実務で英語を使いたいので、そのポートフォリオの一環として作成したい**

**また、最後にも記載しますが著作権に関して疎いので、この記事が著作権違反にあたらないと認識して投稿しています。
なので、著作権を侵害するつもりもありませんし、もし著作権違反になるようであればすぐにこの投稿を削除します。**

**I will mention at the end, I am not familiar with copyright, so I am posting this article recognizing that it does not violate copyright.
So I don't intend to infringe copyright, and if it does, I'll delete this post immediately.**

# Roo
**Rooは一般的なスプレッドシートに対して使用できます。
・Excelファイル 2007 - 2013(xlsx, xlsm)
・LibreOffice / OpenOffice.org ファイル (ods)
・CSVファイル**

>**Excelファイル 97, Excelファイル 2002 XML, Excelファイル 2003 XMLの場合
→[roo-xls](https://github.com/roo-rb/roo-xls)(xls, xml)**
**グーグルスプレッドシートの読み書きする場合
→[roo-google](https://github.com/roo-rb/roo-google)**

## インストール
**Gemをインストールするには,**

```
$ gem install roo
```
**もしくは、`Gemfile`に追加してください。**

```Ruby:Gemfile
gem "roo", "~> 2.8.0"
```

# 使い方
**スプレッドシートを開きます**

```
require 'roo'

xlsx = Roo::Spreadsheet.open('./new_prices.xlsx')
xlsx = Roo::Excelx.new("./new_prices.xlsx")

#扱うスプレッドシートが曖昧な場合`extension:`を使いましょう
xlsx = Roo::Spreadsheet.open('./rails_temp_upload', extension: :xlsx)

xlsx.info
# => スプレッドシートのデータが帰ってきます
```
**`Roo::Spreadsheet.open`ではパスでもファイルの名前でもどちらでも使えます。**

### シートの操作
```
ods.sheets
# => ['Info', 'Sheet 2', 'Sheet 3']   # シート内にある配列

ods.sheet('Info').row(1)
ods.sheet(0).row(1)

# `ods.default_sheet`に配列の最後を入れる場合
ods.default_sheet = ods.sheets.last
ods.default_sheet = ods.sheets[2]
ods.default_sheet = 'Sheet 3'

# each文を使って繰り返し処理をする場合
ods.each_with_pagename do |name, sheet|
  p sheet.row(1)
end
```

### `rows`や`columns`にアクセス
**`Roo`はエクセルの列や行に番号をつけて使います。 
なので、`1`が最初のインデックスで、配列のように`0`ではありません**

```
sheet.row(1)
# シートの最初の行(row)が帰ってきます。

sheet.column(1)
# シートの最初の列(columun)が帰ってきます。
```

**ほとんどのメソッドがシートの引数を用いています。
もしパラメーターを省略するなら、下記のように便利なメソッドを使用します。**

```
sheet.first_row(sheet.sheets[0])
# => 1             # 1番目の行
sheet.last_row
# => 42            # 最後の行
sheet.first_column
# => 1             # 最初の列
sheet.last_column
# => 10            # 最後の列
```

### `cell`にアクセス
**下記の方法でシートの一番左上の`cell`にアクセスできます。**

```
sheet.cell(1,1)
sheet.cell('A',1)
sheet.cell(1,'A')
sheet.a1
```

**今回はここまでです。
続きはこちらです。
→[Roo / Ruby on Rails Gem 日本語訳(2)](https://qiita.com/tako_tako/items/0ec086e280c74fe86701)**

## 最後に
**著作権に関して疎いので、この記事が著作権違反にあたらないと認識して投稿しています。
なので、著作権を侵害するつもりもありませんし、もし著作権違反になるようであればすぐにこの投稿を削除します。**

**I am not familiar with copyright, so I am posting this article recognizing that it does not violate copyright.
So I don't intend to infringe copyright, and if it does, I'll delete this post immediately.**
2つの連番画像からそれらを横に並べたGIFを作成する

以下の2つの連番画像から

![スクリーンショット 2021-03-25 21.29.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154305/78f2ec7b-852f-9722-8435-cd5c3f1919a8.png)
![スクリーンショット 2021-03-25 21.29.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154305/15b55c70-4fe4-b2ca-2b5a-728c25f20444.png)

それらを横に並べたGIFを作成します。
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154305/60c82e60-1959-acae-5875-6521bc1604dd.gif)

# 事前準備
まず準備としてImageMagickを使用できるようにする必要があります。
（インストール方法はImageMagick install等で調べれば出てきます）

# 環境
- mac OS 10.15.7

シェルスクリプトを使用するので、シェルスクリプトが実行できる環境でないとできません。

# シェルスクリプト

``` create_two_gif.sh
if [ ! -e output ]; then
    mkdir output
fi

for i in `seq -f %04g 0 29`
do
    convert +append akane/akane_$i.png aoi/aoi_$i.png output/test$i.png
done

convert -delay 10 -loop 0 output/*.png output.gif
rm -R output/
```

gist：https://gist.github.com/kanatanomirai/1ceb1dff5e65ea16d1abd540f182caa2

gistから`Download ZIP`でスクリプトをダウンロードしたら、GIFにしたい連番画像等に合わせてこのスクリプトを変更しましょう。

## 変更する前に…
- ファイル名にはカッコ（）などの記号は含めないようにしてください。
- ファイル名の連番部分は001,002,…というように0埋めをしてください。

## 変更する箇所

```
for i in `seq -f %04g 0 29`
```
上記はファイル名の連番が0000~0029の場合です。
例えば連番が001~050の場合は以下のように変更します。

```
for i in `seq -f %03g 1 50`
```

```
convert +append akane/akane_$i.png aoi/aoi_$i.png output/test$i.png
```

上記は画像を横に並べるコマンドです。

```
akane/akane_$i.png aoi/aoi_$i.png
```

ディレクトリの部分を画像のあるディレクトリに変更します。
また、ファイル名の部分を画像のファイル名に合わせて変更します。`$i`は連番部分です。
ちなみに`+append`を`-append`にすると縦に並べることができます。

```
convert -delay 10 -loop 0 output/*.png output.gif
```

`-delay 10`はGIFの画像間の秒数（1/100秒）です。
この場合は1秒で10枚動きます。
`-delay 100`にすると1秒で1枚動きます。

`-loop 0`はループ回数です。0にすると無制限になります。

# 実行
スクリプトを変更したら、以下のコマンドを実行します。

```
sh create_two_gif.sh
```

コマンド実行したディレクトリに`output.gif`が作成されます。
routingについて

以下の記事がとても分かりやすい。

Railsのルーティングを極める(前編): 
https://techracho.bpsinc.jp/baba/2020_11_18/15665

Railsのルーティングを極める (後編): 
https://techracho.bpsinc.jp/baba/2020_11_20/15619
submitする前に入力チェックがしたい

##やること
- submitする前に入力チェックして、メッセージを表示したい。

##方法

```html:html
<input class="form-control " name="textform" required="required" type="text" value="" />

<button type="button" id="submitButton"> submit</button>
```

```js:js
$("#submitButton").on("click", function () {
    if ($("input[name=textform]").val() == "" ) {
        $('#validationModal').modal();
        return false;
    }
});
```
CGを作りたい。独学Blender勉強記録【1~2日目】



「CGを作りたい！」と思ったので、独学でCGの勉強を始めます。

情報の整理のために、定期的に記録をつけながらやる予定です。

#勉強を開始する！！

##どうやって勉強するのか？

とりあえず、過去に自分でまとめた「勉強方法」を参考に勉強を始めます。

https://khufrudamonotes.com/my-study-method

『何かを「難しい/分からない」と感じる原因の大半は、「専門用語の意味を知らないから」
「○○　やり方」「○○　勉強方法」「○○　初心者」でググって、まずは分からない単語を片っ端から拾い集めろ』 

と かつての僕は言っています。

というわけで…

https://online.dhw.co.jp/kuritama/free-software-useful-for-creating-3dcg/

https://sadaji-note.com/3dcg_dokugaku

ググって出てきたページを読んでCGの情報収集をやりつつ、「分からない単語」が出現したらGoogleドキュメントにコピペしていきます。

そして、ある程度「分からない単語」が溜まったら、「分からない単語」を調べてメモを"自分用の辞書"にしていきます。

###「分からない単語」のメモ(の一部を紹介)

####・モデリング
広義の意味での模型（モデル）を組み立てる事を言う。
モデリングが終わってアニメーションさせるまでに「ボーンを入れる」→「スキニング」→「リギング」と3つの工程が必要。

####・ボーン
スケルトンの各ジョイント間を接続する骨構造。

####・スケルトン
人間や動物などの関節をもった3DCGキャラクターにアニメーションを設定する際に用いる機能。

####・スキニング
3Dモデルに対してボーンの影響範囲を設定する作業。

####・リギング
アニメーターがキャラクターを動かすための仕組み（リグ）を作ること。

(どの業界にもいろんな専門用語があるんだなぁ…)

###…調べているうちに、便利そうなサイトを発見する

https://entry.cgworld.jp/terms/

しばらく読みました。
しばしばアニメで目にする演出の中には、「板野サーカス」や「金田パース」など実際のクリエイターの人名からくる技法名もあるんですね。面白いです。


#3DCGソフトは、「Blender」を使うことにした。

https://blender.jp/

以前から名前は知っていたオープンソースの3DCGソフトの「Blender」。
やはり無料で始めるには「Blender」が良さそうです。

ちなみに、CG業界でよく使われているらしい「Maya」は年間￥272,800だとか。
(音楽で言うところの「Pro Tools」みたいなものかな？)

流石に簡単には手が出せない価格。

##YouTubeで初心者向けBlenderを見る

いろいろな初心者向け動画がYouTubeに上がっています。よい時代だ！

10数年前に「作曲がしたい！」と思ったものの、DTM関連の情報を得るのに苦しんでいた頃とは大違いです。笑

いくつか見た動画を紹介します。
 
https://youtu.be/-pYImGJ0wwA

ダウンロードの方法から説明してくれているので、分かりやかったです。

視点操作と基本的なショートカットキーを覚えました。(すぐ忘れそうなのでメモしながら)

https://youtu.be/ZTrplzVEN5w

初心者は、「サイコロ」　→　「宝箱」　→　「車」　の順番でモデリングすると良いらしいです。

また、のちのち複雑なモデリングをする場合は「○○ blueprint」で検索すると便利らしいですね。なるほど。

##さっそく、Blenderで「サイコロ」を作る

最初に情報収集で読んだサイトにも、「CGはひたすらチュートリアルをこなせ！」と書いてありました。

なので、最初のモデリングにオススメらしい「サイコロ」をYouTubeで動画を見ながら愚直に作ります。

https://youtu.be/oOtUtLwy-p8

色々試しながら1時間ほどで…

![dice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486558/9ba860df-0839-60be-ab78-4be2113b0d3a.png)

とりあえずできた！ｲｪｱｱｱ!!(๑˃̵ᴗ˂̵)و


###若干つまづいたポイント

#####・立方体の見えない裏側の頂点を選択する方法

https://original-game.com/blender-selection-method-list/

#####・オブジェクトに色を付ける方法

色を付けたい部分を選択した上で
マテリアルプロパティ→マテリアルスロットを追加→新規→ビューポート設定→色を決める

###引き続き頑張ります！

勉強記録(更新されていく予定)↓

https://khufrudamonotes.com/category/3dcg
RPAが注目されている背景

#プログラミング勉強日記
2021年3月26日
RPAについては[昨日の記事](https://qiita.com/mzmz__02/items/d3a82a59b3941796d364)でまとめたが、そもそもなんでRPAが注目されているのか気になったのでまとめてみた。

#注目されている背景
　RPAについて簡単に説明すると、人間が行う業務を自動化するツール。RPAは業務改善や働き方改革につながる技術として注目を集めている。今日はなぜRPAが注目されているのかまとめていく。


##人手不足の改善
　RPAは24時間365日ずっと働けるので、人手不足解消につながる。特に、少子高齢化が進んで人手不足が深刻化している日本では注目されている。

##働き改革の実現
　政府がいう「働き方改革」は少ない労働力で生産性を維持することを目的の1つとしている。ロボットによって業務を自動化して仕事を行うことで、少ない労働力でも生産性を維持することができる。

##競争力の強化
　日本よりも先に欧米は注目していて、多くの企業でRPAの導入が進んでいる。世界的な競争にも負けないためにも、日本の企業もRPAを導入して導入効率化、生産性向上を進める。


#参考文献
[【超・初心者向け】RPAとは？図解でわかりやすく簡単に説明！](https://service.biztex.co.jp/knowledge/1583/#RPA-4)
[３分でわかるRPAとは何か？注目される背景～今後の進化まで](https://www.persol-pt.co.jp/persolrpa/rpalounge/column1/)
シンプルで使いやすい日付変換ツールを作ってみた

# はじめに

こんにちは、システム開発チーム「presto」です。
開発業務（プログラミング中）に「こんなツール、あんなツールが身近なところにあったらいいなぁ」と思ったことはありませんか？

ここではそんなツールをVuetifyを使って作ってみたので紹介させてください。

# 日付変換ツール

今回紹介させていただくのは、[日付変換ツール](https://web-tools.presto-service.com/date-converter)です。

画面は以下の通りです。

![日付変換ツール](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227155/1b952171-19d3-8408-fd65-cffb734ad204.png "日付変換ツール")

# 使い方

使い方は以下の通りです。

1. 時刻を指定する
2. ほしいフォーマットの時刻をコピーする

## 1. 時刻を指定する

指定したタイムゾーンの現在時刻が表示されます。
![時刻を指定する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227155/b72f5538-3c9b-3154-9b0a-3ad8008865d5.png "時刻を指定する")

時刻の指定方法は2通りあります。

1. テキストフィールドを直接編集する
2. 操作ボタンから編集する

### 1.1. テキストフィールドを直接編集する

テキストフィールドを直接編集する場合は、所定のフォーマット「`YYYY-MM-DD HH:mm:ss`」に則って入力します。

以下の画像のように、時刻で表せない数字などもNGです。
![時刻で表せない数字などもNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227155/1887c8a0-ce63-ea47-9490-f2c334f1f76a.png "時刻で表せない数字などもNG")
入力した時刻がフォーマットに則っていないと、画面の下にエラーメッセージが表示されます。
![エラーメッセージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227155/528a11b8-adbd-0c0f-7651-3fa93bad033a.png "エラーメッセージ")

### 1.2. 操作ボタンから編集する

操作ボタンから編集する場合は、テキストフィールドの時刻からの相対的な時刻を表示します。

時刻を操作するには上部のボタンを操作してください。
![時刻操作ボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227155/b8e22cb4-e35c-ba01-4772-1b6c79bfa213.png "時刻操作ボタン")

日付を操作するには下部のボタンを操作してください。
![日付操作ボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227155/e44c0dbf-99ed-2ff2-5e4d-99952ba36840.png "日付操作ボタン")

## 2. ほしいフォーマットの時刻をコピーする

デフォルトで用意しているフォーマットは以下の通りです。
これらのテキストフィールドをクリックすることでコピーすることができます。

|フォーマット形式|
|:-:|
| ISO 8601 形式 |
| スラッシュ区切り |
| スラッシュ区切り (日付のみ) |
| 区切りなし |
| 区切りなし (日付のみ) |
| UnixTime (ミリ秒) |
| ロケールに合わせた形式 |
| フォーマット指定 |

![フォーマット形式1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227155/0c23e643-7b19-b2c0-7e48-cda71c4e0e0f.png "フォーマット形式1")
ロケールに合わせた形式では、「ja（日本）」と「en（米国）」のロケールで標準とされるフォーマットに変換します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227155/5dc3523d-feca-cfe3-0e7f-88a607e3e657.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227155/a2f755bc-c0f8-7a84-443a-e6763967dc52.png)
フォーマット指定では、任意のフォーマットを指定することで、時刻をそのフォーマットに則った形式で表示します。
![フォーマット指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227155/4db069e3-bce9-728c-356a-a1959ba00a8e.png "フォーマット指定")
使用可能なフォーマットは、moment.jsのフォーマットに対応しています。
[format Moment.js | Docs](https://momentjs.com/docs/#/displaying/format/)

# まとめ

今回は、[日付変換ツール](https://web-tools.presto-service.com/date-converter)の紹介をさせていただきました。

[画像Base64変換ツール](https://web-tools.presto-service.com/image-base64-converter)の紹介もしていますので、良ければ合わせてご覧ください。

https://qiita.com/presto/items/21a6713a108da35075c0

今後もよろしくお願いします。
ありがとうございましたー！
myqlでダンプとかリストアとか


※ ほしい形式でダンプ

```mysql
// csvでダンプ１
mysqldump -hpachinko.hostname -ugundum -p -tab=/tmp/output.csv --fields-terminated-by=, db_name

// csvでダンプ２
mysql -h "pachinko.hostname" -u -pgundum db_name -e "select * from awesometable;" | sed -e 's/^/"/g' | sed -e 's/$/"/g' | sed -e 's/\t/","/g' > /tmp/my_awesome_out.csv
```

※基本的なやつら
https://qiita.com/PlanetMeron/items/3a41e14607a65bc9b60c
【C#】画面メッセージを出したい

##やること
- 画面メッセージを出したい。
- JavaScriptのalertは[使いたくない。](https://qiita.com/dsuzu88/items/4e7b38a35fd18c781896)

##出し方

```c#:CS
TempData["MESSAGE"] = "メッセージ";
```

```html:_Layout.cshtml
@if (!String.IsNullOrEmpty((string)TempData["MESSAGE"]))
{

    <!-- モーダル・ダイアログ -->
    <div class="modal fade" id="messageModal" tabindex="-1">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal"><span>×</span></button>
                    <h4 class="modal-title">メッセージ</h4>
                </div>
                <div class="modal-body">
                    @TempData["MESSAGE"]
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">閉じる</button>
                </div>
            </div>
        </div>
    </div>

    <script>
        window.onload = function viewModal() {
            $('#messageModal').modal();
        }
    </script>
}
```
【Win10】alertのせいでsubmitができなくなった話

##起こったこと
* 画面の確認メッセージや登録メッセージに**alert()**や**confirm()**を使っていた。
* 出力されたメッセージの**「このページにこれ以上メッセージの作成を許可しない」**にチェックを入れた。
* **confirm()**のOKでsubmitするようにしていたが、メッセージが表示されなくなったため、ボタンを押下しても、**sumitできなくなった。**

##対処
画面メッセージの表示方法をBootstrapやjQueryで代用した。
【ASP.NET】要求の長さの最大値を超えました。

##起こったこと
- 画面からファイルをアップロードすると**「要求の長さの最大値を超えました。」**と表示された。

##原因
- デフォルトで4MBまでという制限が掛っているため。

##対策
- Web.config の httpRuntime プロパティに最大値を設定すればOK。

例として10MBを指定する場合

```config:Web.config
<configuration>
  <system.web>
    <httpRuntime maxrequestlength="10240">
  </system.web>
 </configuration>
```

- プロパティの最大値を超えるファイルを添付した場合はエラーが出るので、Javascriptで制御する。

```HTML:HTML
<input type="file" id="example" multiple>
```

```javascript:JavaScript
var mb = 10 // 制限サイズ(MB)
var message = `ファイルサイズは${mb}MB以下にしてください。`;
const sizeLimit = 1024 * 1024 * mb;　// 制限サイズ
const fileInput = document.getElementById('example'); // input要素
// changeイベントで呼び出す関数
const handleFileSelect = () => {
  const files = fileInput.files;
  for (let i = 0; i < files.length; i++) {
    if (files[i].size > sizeLimit) {
      // ファイルサイズが制限以上
      alert(message); // エラーメッセージを表示
      fileInput.value = ''; // inputの中身をリセット
      return; // この時点で処理を終了する
    }
  }
}
// フィールドの値が変更された時（≒ファイル選択時）に、handleFileSelectを発火
fileInput.addEventListener('change', handleFileSelect);
```

##参考
https://dotnet.programmer-reference.com/aspnet-maxrequestlength/

https://code-kitchen.dev/html/input-file/#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E5%88%B6%E9%99%90%E3%81%99%E3%82%8B
DockerfileでRUNをまとめた場合のイメージサイズの変化を確認してみた。

DockerfileではRUNをまとめることでイメージサイズ削減ができるとよく耳にします。
実際に試したことがなかったので試してみました。

2つのDockerfileから作成したイメージのサイズを比較してみました。

各Dockerfileの違いは以下です。
　・dockerfile01：RUNを複数使用している
　・dockerfile02：&&でコマンドを繋げてRUNをまとめている

```dockerfile:dockerfile01（RUNを複数使用している場合）
FROM centos:7

# php, apacheインストール
RUN yum install -y "https://repo.ius.io/ius-release-el7.rpm"
RUN yum update -y
RUN yum install -y mod_php74 php74-cli httpd24u

CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
```


```dockerfile:dockerfile02（&&でコマンドを繋げてRUNをまとめている場合）
FROM centos:7

# php, apacheインストール
RUN yum install -y "https://repo.ius.io/ius-release-el7.rpm" \
      && yum update -y \
      && yum install -y mod_php74 php74-cli httpd24u

CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
```

以下のコマンドを実行してイメージを作成します。

```console:イメージ作成(ビルド)
$ docker image build --no-cache -f ./Dockerfile01 -t centos7:test01 .
$ docker image build --no-cache -f ./Dockerfile02 -t centos7:test02 .
```
```console:サイズ確認
$ docker image ls
REPOSITORY   TAG      IMAGE ID       CREATED              SIZE
centos7      test02   81a7d6c540ff   About a minute ago   509MB
centos7      test01   7fdd86edf40d   4 minutes ago        761MB
```

761MBから509MBになっています。
RUNをまとめるだけで、イメージサイズが減ることが確認できました。

ただし、どんな場面でもRUNをまとめれば良いとは限らないという話もあるため、
その時々で判断する必要はありそうです。

https://future-architect.github.io/articles/20210121/

今回は以上です。

補足：
確認用のDockerfileには含めませんでしたが、
以下のように`yum clean all`をするとさらにイメージサイズを減らせます。

```dockerfile:dockerfile03
FROM centos:7

# php, apacheインストール
RUN yum install -y "https://repo.ius.io/ius-release-el7.rpm" \
      && yum update -y \
      && yum install -y mod_php74 php74-cli httpd24u \
      && yum clean all

CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
```

```console
$ docker image build --no-cache -f ./Dockerfile03 -t centos7:test03 .

$ docker image ls
REPOSITORY   TAG      IMAGE ID       CREATED          SIZE
centos7      test03   aa24f2e8f667   27 seconds ago   385MB
centos7      test02   81a7d6c540ff   6 minutes ago    509MB
centos7      test01   7fdd86edf40d   8 minutes ago    761MB
```
awkでごにょごにょ

### 整形したい

```awk
// csvの内容を整形して都合の良い形で別ファイルに出力（ヘッダー、" 削除、からの整形）
cat out.csv | awk 'NR>2 {print last} {last=$0}' | awk '{gsub(/\"/,"")};1' | awk -F "," '{ printf "文字列なにか" $1 "文字列なにか" $2 "\n"; }' > new-out.txt
```
法律文書における単語の共起

法律文書において共起される単語ペアを列挙する。
前記事までn-gramで頑張っていたけれど本記事ではおとなしくMeCab利用。

# 参考
以下を参考にさせて頂いた。ただし、元記事ではグラフまでやっているが、本記事では頻出のペアを表示するまで。
[3. Pythonによる自然言語処理　2-1. 共起ネットワーク](https://qiita.com/y_itoh/items/7aa33ba0b1e30b3ea33d)

# 異なる点
元記事から手を加えた点だけ記載する。

## 利用しない単語
元記事では、名詞の共起をやっていた。本記事でもその点は同じ。名詞の中でも数（数詞）ではないものは削除した（あらかじめ削除したほうが良かったかも）点は異なる。法律の文書に〇〇条などの表現が邪魔になりそうな感じがした。


```python
noun_list = [[v.split()[2] for v in m.parse(line).splitlines() if (len(v.split())>=3 and v.split()[3][:2]=='名詞' and v.split()[3][3::]!='数')] for line in lines]
```

追加したのは以下の部分のみ（だったと思う）。

```python
and v.split()[3][3::]!='数'
```

v.split()[3]がMeCabの品詞で「名詞-一般」や「名詞-数」など。v.split()[3][3::]が「一般」や「数」の部分。

##出力データ作成
cnt_pairsはタプルのリスト。元記事と変数名は同じ。
[((単語X1, 単語X2), 出現回数N1), ((単語X3, 単語X4), 出現回数N2), ...]のような感じになっている。


```python
[tap[0] for tap in cnt_pairs.items() if tap[1] > 300]
```
出現回数が300以上のものをリスト化している。

```shell-session
[('規定', 'こと'),
 ('項', '規定'),
 ('規定', '者'),
 ('者', 'こと'),
 ('者', '者'),
 ('場合', '者'),
 ('場合', 'こと'),
 ('者', 'とき'),
 ('とき', 'こと'),
 ('者', '人'),
 ('者', '請求'),
 ('人', '人'),
 ('人', 'こと'),
 ('条', '規定'),
 ('とき', '者'),
 ('条', '条'),
 ('条', '項'),
 ('項', '条'),
 ('人', '者'),
 ('規定', '規定'),
 ('権', '者'),
 ('者', '権'),
 ('条', '準用'),
 ('債務', '者'),
 ('債務', 'こと'),
 ('相続', '相続'),
 ('相続', '人'),
 ('債権', 'こと'),
 ('債権', '者'),
 ('者', '債務'),
 ('者', '債権'),
 ('債務', '債務')]
```

# コーパス
[コーパス](https://raw.githubusercontent.com/foj05123425/lawtech/main/%E6%B0%91%E6%B3%95.txt)