OmniAICreator/Qiita-1.07M huggingface dataset:
Microsoft Storeのボタンが押せないのだが

# はじめに
Microsoft Storeを通じてUbuntuをインストールしようとしたら、ボタンを押しても反応しなかったという話。
ほかのアプリケーションでも同様に反応しなかった。

# 対処していく
とりあえず公式の言ってる通りに直してみよう。
上から順に、ダメだったら次の方法、って感じでやっていくらしいです。

## 時刻/タイムゾーンの設定
設定から、`時刻を自動的に設定する`を有効にしてみます。
これでできれば万歳ですが、まぁ無理でした。

## Windows Updateする
が、無理。

## Storeのリセット
検索ボックスで`WSReset`と入力し、コマンドを実行します。
コマンドプロンプトが消えて、ストアが起動したら作業終了です。

が、ダメ。

## Storeのコンポーネントの再登録
PowerShellを管理者権限で実行し、以下を実行してみる。
実行の際はStoreは閉じましょう。

```powershell
Get-AppXPackage -AllUsers |Where-Object {$_.InstallLocation-like "*SystemApps*"} | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"}
```

「展開中の進行状況……」みたいなのがたくさん出てきます。
同時に、何やら赤文字のエラーがいっぱい。
Storeと関係なさそうなところのインストールができないって話だったのでとりあえず無視。

終わったらPCを再起動します。

## アカウントを作り直してみる
新しくアカウント作ってみて、動作確認をしろと言われましたが、ちょっと面倒なので飛ばすことに……

## ウイルス対策ソフトの一時無効化
これは怖いのでいったん保留

## プロキシ設定の解除
保留

## Storeのコマンドでの修復
コマンドプロンプトを管理者権限で起動し、以下を実行してPowerShellを使用します。

```powershell
PowerShell -ExecutionPolicy Unrestricted
```

`system32`って出てきたら以下二つを実行する。

```powershell
PS C:\WINDOWS\system32> $manifest = (Get-AppxPackage Microsoft.WindowsStore).InstallLocation + "\AppxManifest.xml"
PS C:\WINDOWS\system32> Add-AppxPackage -DisableDevelopmentMode -Register $manifest
```

公式ドキュメントに載っているのはこれだけでしたが、無理そう。
こうなると、アカウント周りでバグってそうなので次へ。

# アカウントをいじってみる
## 別アカウントを追加
とりあえず別アカウントでもサインインしてみるけどうまくいきません。

## 別アカウントを使用
いったん最初のアカウントからサインアウトして、別のアカウントでサインインしてみるけど、これもダメ。

## サインアウトしてもう一度サインインしてみる。
これでもうまくいきません。

## サインアウトした状態でやってみる
`入手`ボタンを押せばサインインを求められるので、サインインしてみる……
…………おや……？

なぜかいけました。

# まとめ
とりあえずいろいろやってみましたが、サインアウトした状態で行けるようになるとは……
結局原因はよくわかりませんでしたが、よくある症状ではあるようなので何かの参考になればと思います。

# 参考
[Windows 10 でストア アプリが正常に動作しない場合の対処方法](https://sway.office.com/ed01xaxv1uWPVVYI '公式ドキュメント')
IDE（PhpStorm）で即時デプロイをする

はじめに
担当した案件で、実装したソースの動作確認をサーバー上で行いたい場合、WinSCPなどのFTPツールで手差しでアップする必要がありました。修正→デプロイの作業はなかなか面倒なので、自動化できないかと思って調べ、自動でデプロイできる様になったので、やり方を共有したいと思います。

サーバーの構成
------
前提として担当しているサービスのWebサーバーには踏み台サーバーからの接続を必須とされている背景があるため、上記の用な構成で開発サーバーにソースをアップします。


手順1
----
Teratermでポートフォワードの設定をする
※前述の通り踏み台サーバーを経由する必要があるため

Teratermの「設定」→ 「SSH転送」→ 「追加」を押し以下の様に設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1671734/68028db4-bb19-f6ab-fa33-eca547de80b5.png)
ローカルのポート : 任意（今回は10022を使用）
リモート側ホスト : デプロイするサーバーのIP（IP間違えると大事故になるので、注意）
ポート          : 22



手順2
----
PhpStormで自動デプロイの設定をする
1.リモートサーバーの設定
　「File」→「Settings」→ 「Deployment」を選択し「＋」をクリックし「sftp」を選択

2.サーバー名を入力
　例）【開発】〇〇システム

3.リモートサーバーの設定
　SSH configurationの右の「...」ボタンをクリックし、以下の様に入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1671734/879fc9f9-608c-4f4a-09e8-56d573a0e010.png)

Host : localhost （ポートフォワードしてるため）
※ 直接サーバーに接続する場合はサーバーのIPでOK
Port : 22
User name/Password : デプロイしたいサーバーのログイン情報
Test Connection で成功したらApplyを押して閉じる

4.ローカルとリモートで同期させるディレクトリを設定
Mappingsタブを開き、Deployment pathを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1671734/ed042d5e-c0db-afe8-e1d6-36e59f385402.png)

Local path : ローカルでソースを置いているディレクトリ
Deployment path : サーバー上で同期させるディレクトリ

5. ファイル同期設定
　「File」→「Settings」→ 「Deployment」→ 「Options」で
　Upload changed files automatically to the default server を 「Ctrl + S」にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1671734/c3f5fb2c-672c-fa3a-6220-1050482f361a.png)
※自動デプロイしたくない場合は「Never」にする

注意点
-----
・サーバーに直接ソースが反映されるので、接続先のミスは即事故につながります。確実に開発サーバーに接続するようにしてください。
・変更したファイルだけでなくMappingしたディレクトリ配下のソースすべてが反映されるので、Gitで管理されてるプロジェクトでの使用をオススメします。
Laravelでデータベースのcreated_at, updated_atの自動更新を無効化する

新規登録機能を実装するとき、usersテーブル、menテーブル(男性), womenテーブル(女性)テーブルを作成して、ユーザー情報を保存するときに男性、　女性で保存する情報を変えるためにテーブルを分けました。
このときにusersテーブルのupdated_at . created_atで更新、　作成日を管理できるので, men ・　womenテーブルにはupdated_at・created_atカラムを作成しませんでした。
men. womenにデータを保存する処理を行ったときに下記ののようなエラーが発生しました。


## エラー内容

``` 
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'updated_at' in 'field list'
```
テーブルにupdated_atカラムがないですよってエラーが発生。



## 解決用法
```php:app/Man.php
public $timestamps = false;
```
モデル内でタイムスタンプをfalseにすると解決。
Eloquentはデフォルトだとupdated_at, created_atを自動更新するので自動更新をしたくない場合はここをfalseに変えてあげれば自動更新を止める事ができます。
matlabでBLEを使う⑨CO2センサ・ボードSCD-30のセントラル

　　こちらの記事では、BLEのペリフェラルを作りました。CO2、温度、湿度を送ってくれます。

　　[CO2センサを使う④AdafruitのSCD-30ボードをArduino Nano RP2040 ConnectにつないでBLEペリフェラルに（3）](https://www.denshi.club/cookbook/sensor/co2/co24adafruitscd-30arduino-nano-rp2040-connectble3.html)

　これをmatlab（R2021a update3）で受けます。

###AdafruitのSCD-30ブレークアウト・ボードの概要
　Arduino Nano RP2040 ConnectとはSTEMMA QTコネクタでつなぎました。

<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/6ff60f99-369a-591e-da88-775a2d2c5701.png">
　

- 電源電圧　3.3/5V
- 測定範囲　400～10000ppm
- 確度　±（30ppm + 3％）
- 消費電流　19 mA @ 2秒間隔の測定
- 完全に校正および線形化
- インターフェース　I2C、アドレス0x61、信号は10kΩでプルアップ
- 温湿度センサSHT31がオンボード

###プログラム
　CO2_UUID、Temperature_UUID 、Humidity_UUID はキャラクトリスティック用です。subscribe()はnotifyのONを要求します。Arduino Nano RP2040 Connectでは200msごとにCO2の値が変われば、新しいデータを用意します。CO2のデータは、常に変化しています。
　室内では400～500ppm、人が近くにいれば1000ppm前後まで上がります。

```matlab
clear
scan = blelist("Timeout", 30);
RP2060_address="84CCA82E1F5E";  % scanで見つかったアドレスを代入
b = ble(RP2060_address);
bb = b.Characteristics;

ServiceUUID =      "F000AA30-0451-4000-B000-000000000000";
CO2_UUID =         "F000AA31-0451-4000-B000-000000000000";
Temperature_UUID = "F000AA32-0451-4000-B000-000000000000";
Humidity_UUID =    "F000AA33-0451-4000-B000-000000000000";

c10 = characteristic(b, ServiceUUID, CO2_UUID);
subscribe(c10);
c11 = characteristic(b, ServiceUUID, Temperature_UUID);
subscribe(c11);
c12 = characteristic(b, ServiceUUID, Humidity_UUID);
subscribe(c12);

CO2 = hex2numS(read(c10))
Temperature = hex2numS(read(c11))
Humidity = hex2numS(read(c12))

function  shortF = hex2numS(decimal4)  % IEE754の単精度浮動小数点数の形式：binary32
     data11 = num2str( dec2bin( decimal4(1),8  ));  % リトル・エンディアンを
     data12 = num2str( dec2bin( decimal4(2),8  ));  % ビッグ・エンディアンに変更
     data13 = num2str( dec2bin( decimal4(3),8  ));
     data14 = num2str( dec2bin( decimal4(4),8  ));
     data111 = strcat(data14,data13,data12,data11);

    f = (-1)^str2num(data111(1));        % 符号

    sisuu = data111(2:1:9);
    kasuu = ("1"+data111(10:1:end));
    k = bin2dec(kasuu)/(2^23) ;          % 仮数
    s = 2 ^ (bin2dec(sisuu) -127) ;      % 指数

    shortF = f * k * s;
end
```

　実行結果です。
![sdc30g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/fbc43d3b-d72f-d5f1-35e4-0960d7358fab.png)
【Spigotプラグイン】IntelliJ IDEA Minecraft 1.17更新の方法

必要なこと
- IntelliJ IDEAの更新
- JDK 16のインストール
- プロジェクトとGradleの設定

# IntelliJ IDEAを更新する必要がある
IntelliJ IDEAを更新せずに手動でMC1.17に対応しようとしたが、
`Could not initialize class org.codehaus.groovy.reflection.ReflectionCache`
とエラーが表示されたり、Gradleが更新できなかったりして、ビルドできなかった。

IntelliJ IDEAから **ヘルプ > 「更新の確認」または「アップデートの確認」** で更新できるが、
Cドライブが2GB空いていないとインストールできず、
最初からダウンロードすることになるので注意。
他のドライブを使用することはできない。

# スプラッシュ画面が出ない
上記の容量の問題があったので、
一度（アプリ一覧から）アンインストールし、最新版を[こちら](https://www.jetbrains.com/ja-jp/idea/download/)からダウンロード、インストールしたが、
IntelliJ IDEAが壊れてエラーが出た。
（ `com/intellij/openapi/util/text/StringUtil.pluralize` のようなエラー）

スプラッシュ画面すら出なくなってしまったので、
再度（インストーラーから）アンインストールし、インストールして、
PCを再起動してから起動すると無事正常に起動した。

# JDK 16のインストール
新しいIntelliJ IDEAでは、プロジェクトを開いている状態で **ファイル > プロジェクト構造... > プロジェクト > プロジェクト SDK** からSDKを選択するメニューを開き、「**JDK のダウンロード...**」を押すことでできる。

こちらからもダウンロードできる。
https://www.oracle.com/java/technologies/javase-jdk16-downloads.html
手動でインストールしたJDKは、上記の「JDK のダウンロード...」と同じメニューから追加する。

# Minecraft Developmentプラグインをインストール
IntelliJ IDEAの **ファイル > 設定 > プラグイン** から`Minecraft Development`を検索し、インストール。
インストールが完了したらIntelliJ IDEAを再起動する。

# プロジェクトとGradleの設定
新しいバージョンのIntelliJ IDEAでプロジェクトを開いたら、
次の変更を行うことでMinecraft 1.17に更新できる。

## 次のファイルを削除
- `gradlew`
- `gradlew.bat`
- `プロジェクト名.iml`

## `settings.gradle`に次の内容を追加
`rootProject.name = 'プロジェクト名'`

## `plugin.yml`を編集
- `version: @version@`を`version: バージョン名`に変更
  - バージョン名は`gradle.properties`の`pluginVersion`か、`build.gradle`の`version`にある
- `api-version: マイクラのバージョン`を`api-version: 1.17`に変更

## `build.gradle`を編集し、次のように変更
- `import org.apache.tools.ant.filters.ReplaceTokens`を削除
- `group = pluginGroup`を`group = 'パッケージ名'`に変更
  - パッケージ名は`gradle.properties`の`pluginGroup`にある
- `version = pluginVersion`を削除

### dependencies
- `testCompile group: 'junit', name: 'junit', version: '4.12'`を削除
- `compileOnly 'Spigot Maven リポジトリ'`を`compileOnly 'org.spigotmc:spigot-api:1.17-R0.1-SNAPSHOT'`に変更

### 次のコードを削除
```gradle
processResources {
    from(sourceSets.main.resources.srcDirs) {
        filter ReplaceTokens, tokens: [version: version]
    }
}
```

## `gradle.properties`を編集し、次の項目を削除
- `pluginGroup=パッケージ名`
- `pluginVersion=バージョン名`

## `.idea`ディレクトリ（エラーが発生する場合）
- `modules.xml`ファイルを削除
- `プロジェクト名.iml`ファイルを削除

# こちらも参照
- [【Minecraft Fabric】1.16から1.17へ移行するにあたって少し戸惑った話。初心者が移行時に躓くポイントをぶっ壊す！](https://qiita.com/noriokun4649/items/35763e6e35b80c976dfd)
社会人2年目になって思うことあれこれ

社会人2年目になって思ったことを殴り書きしています。

# "完了"報告ではなく"経過"報告
何か作業をする際にはメンバ・リーダーの方に作業状況の報告という行動が必ず発生しますが、社会人を1年間経験して思ったことがあります。
それは**経過報告のほうが重要**だということです。
配属当初は完了報告というものは意識していましたが、それよりも求められているのは

- **いつまでに終わりそうか** 
- **作業内容・実装内容は間違っていないか**

だと気が付きました。
これらは作業完了で報告していては遅いので、作業途中での報告が必要になります。
## 実際にやった方法
**担当タスクのコメント欄にやったことを残していく**

- タスクツールの中にはコメント欄が備わっているものがあります。そのため、担当していたタスクのコメント欄に「調べたこと・これからやること・分かったこと」などを逐一残しました。
- この行動でメンバの方から追加で情報やアドバイスを頂けることがあるので作業の共有方法としては有効化と思いました。
- 分報を利用することも共有方法として活用してもいいかもしれません。
  - https://note.com/reoleo/n/n102308f5b4e3

# 付箋アプリは有能
デスクトップにメモを張り付けられる付箋アプリを利用することで、これから行うべき作業の整理や作業に関するメモが捗るようになりました。
使っているのは[Simply Sticky Notes](https://freesoft-100.com/review/simplestickynotes.html)です。

メリット

- PC起動時にデスクトップにメモが表示されるので今日やることの整理ができる
- (Simply Sticky Notesの場合)`Alt+N`で新規の付箋を作ることができる為、瞬時にメモを取ることができる
- よく使うサイトURLやファイルの場所を書いておくことでショートカットになる

注意

- **画面共有には気を付けてください**

# やったことの無い分野に入門する方法
## eLearningの講座を受ける(Udemyとか)
右も左もわからない分野に入門するためには基礎～応用を体系的に学べる方法が必要だと思います。
その点でeLearningは有効な勉強方法の一つだと思います。
eLearning講座の中には初心者用に基礎(言語の書き方・ツールの使い方)～応答(アプリを作るまで)を一通り学べるものもあるので、全体的な概要を掴むためには手っ取り早いと思います。
## サーベイ論文を読む
サーベイ論文とは既存の関連論文を網羅的にまとめたものです。
そのため、今までどんな取り組みが行われたか・どのような技術があるかを確かめることができます。
`VR サーベイ論文`みたいな感じで調べてみると色々出てきます。

# 目的を先に意識する
これはこれから特にやっていきたい部分でもあります。
「どうして今この作業をやっているのか(作業の目的を考える)」ではなく「この目的を達成したいから、この作業をしている(目的を踏まえて作業を考える)」と考えることが大事だと思います。
どうしてこれが必要なのか、それは以下の2点の理由からです。

- 作業の質が向上していく
  - 元々の目的を覚えておくことで、「今の作業の他にやっておいたほうがいいことがあるのでは」といい意味で疑いが生まれると思います。
- お客様に提案する際に納得してもらうため
  - お客様に「こういう技術が使えそう・こういう機能・要素があったほうがいいのではないか」提案することがありました。
  - その際には**ストーリーを展開して納得してもらう**ということが必要だと知りました。
  - このストーリーとは「目的に達成にはこの要素が必要。→だからこの機能を実装」という目的→手段の順番で掘り下げたものです。
  - ストーリーの始まりは目的なので、当然目的が分かってないと作ることができません。
これらの点から目的を先に意識しておくことは重要だと思います。

***
社会人を1年経験して思ったことを書き連ねました。
お読みいただいた中で何か思うところがありましたら、幸いです。
【Git】git stashしたファイル群の中から特定のファイルのみを取り出す方法

# はじめに
git を利用していると・・・・
「作業途中で他の作業をしないといけなくなった。コミットはしたくないけど、変更したファイル群を残しておきたい」 

「`git rebase -i` コマンドを使いたいけど、以下のようなエラーが出たので、ファイル群を一時退避しておかないといけない。」

```
error: cannot rebase: You have unstaged changes.
error: Please commit or stash them.
``` 

というときに `git stash` コマンドを利用すると思います。

ただ、作業を再開する場合に特定のファイルのみを取り出したい場合があるかと思います。

今回は、git stashしたファイル群の中から特定のファイルのみを取り出す方法を記載します。

# stashしたファイル群から特定ファイルを取り出す
```bash
# stashリストを確認
$ git stash list
# 出力例
stash@{0}: WIP on test: xxxx
stash@{1}: WIP on commit-sample: xxxx

# とあるstashリストのファイルの差分を確認する
$ git diff stash@{[番号]}　[ファイル名]
# stashしたファイル群から特定ファイルを取り出す
$ git checkout stash@{[番号]} [ファイル名]
```
DPMI32でCコード

DPMIで32ビットに移行した後にCのコードを引っ付けてみました。

16bitの処理は前と同じです。

32bitのアセンブラを以下のようにします。

```
;--- this is a 32bit DPMI application.

    .386
    .model small

    .dosseg    ;ensures that segments are ordered: code

    .code
    PUBLIC start
    PUBLIC printstring_
    EXTERN hello_:BYTE

start:
    call near ptr hello_
    mov ax, 4C00h   ;normal client exit
    int 21h

;--- print a string in protected-mode with simple
;--- DOS commands not using pointers.

printstring_:
    mov esi, eax
printstring:
    lodsb
    and al,al
    jz stringdone
    mov dl,al
    mov ah,2
    int 21h
    jmp printstring
stringdone:
    ret

    end
```

Cのコードはこうしました。

```
#pragma off (check_stack);

void printstring(char *);

hello()
{
        printstring("Hello World!!\n");
}
```

Open Watcomは標準でスタックチェックの__CHKの呼び出しが入るので、それをprogmaで止めてます。またstdioを使わないためにアセンブラで文字列出力ルーチンを用意してます。

DOS -> ASM -> C -> ASM -> C -> ASM -> DOSになっています。

Cからの呼び出し規約はwdisで確認しました。

これでアセンブリとコンパイルするとHello World!!できます。

![IMG_20210625_090100.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/a373d7b1-11f2-57d9-1d47-646633a8f272.jpeg)

https://github.com/yamori813/ow-pc98/tree/main/dpmi

リンクのときにsystemがdosなのに32bitコード入ってるよって警告でますが、ちゃんと動くexeが作られます。

```
Warning! W1080: file start.o is a 32-bit object file
Warning! W1080: file main.o is a 32-bit object file
Warning! W1080: file hello.o is a 32-bit object file
```

Open WatcomではDOS/4Gという仕組みでDOSの32Bit環境をサポートしていてそのライブラリはあるようなのですが、使い方がよくわかりません。
RSpecでCookies（永続ログイン）のテストをする方法

#「show_me_the_cookies」をインストールする

詳細はこちらを参照してください。

https://github.com/nruth/show_me_the_cookies


Capybaraの統合テストでブラウザのCookiesを扱うメソッドがいくつか用意されています。

```
  # puts a string summary of the cookie
  show_me_the_cookie(cookie_name)

  # returns a hash of the cookie
  # form: {:name, :domain, :value, :expires, :path}
  get_me_the_cookie(cookie_name)

  # puts a string summary of all cookies
  show_me_the_cookies

  # returns an array of cookie hashes
  # form: [{:name, :domain, :value, :expires, :path, :secure}]
  get_me_the_cookies

  # deletes the named cookie
  delete_cookie(cookie_name)

  # removes session cookies and expired persistent cookies
  expire_cookies

  # creates a cookie
  create_cookie(cookie_name, cookie_value)

  # creates a cookie for the path or domain
  create_cookie(cookie_name, cookie_value, :path => "...", :domain => "...")
```

早速インストールしていきます。

```Ruby:Gemfile
group :test do
 gem "show_me_the_cookies"
end
```

```
% bundle install
```

spec/rails_helper.rbに下記を追加します。

```Ruby:spec/rails_helper.rb
RSpec.configure do |config|
  config.include ShowMeTheCookies, :type => :system #Feature Specの場合は「:feature]
end
```

これで準備完了です！

# テストコードを記述する
筆者はFactoryBotを使用しています。

```Ruby:spec/users_login_spec/rb
RSpec.describe 'ユーザーログインテスト', type: :system do
  let(:user) { FactoryBot.create(:user) }

   describe 'ログイン状態の保持のテスト' do
      it '「ログイン状態を保持する」を選択してログインする' do
        visit login_path
        fill_in 'session[email]', with: user.email
        fill_in 'session[password]', with: user.password
        check 'ログイン状態を保持する'
        find('#login-btn').click
        expect(get_me_the_cookie('remember_token')).not_to eq nil
      end

      it '「ログイン状態を保持する」を選択しないでログインする' do
        visit login_path
        fill_in 'session[email]', with: user.email
        fill_in 'session[password]', with: user.password
        find('#login-btn').click
        expect(get_me_the_cookie('remember_token')).to eq nil
      end
   end
end
```

これで無事に永続ログインのテストができました！
97~127までの数値をキャストで文字にする

97~127までの数値(int型)をキャストで文字(char型)にするプログラムです。
この機能は初めて知りました。

```Java
// 新規作成  2021/6/25
// Aunthor  乃木坂好きのITエンジニア

public class CharTest {
	public static void main(String[] args) {
//配列を定義する
		int[]  moji = {96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127};
//拡張ループ文で数値(int型)を文字(char型)に変換してループ文を回す
		for(int i:moji) {
			System.out.println((char)i);
		}

	}
}
EdgeのIEモードの画面に対して開発者ツール(F12)を使う方法

# IEモードの場合F12が使えず困っていませんか？

**IEChooser.exe** を使えばIEモードのEdgeでも開発者ツールが利用できます。

## 使い方

### 1. 開発対象の画面を開く

開発者モードで開きたい画面を先にEdgeのIEモードで開いておきます。

### 2. IEChooser.exeを起動

以下の場所にあるIEChooser.exeを起動します。

```:bat
> C:\Windows\System32\F12\IEChooser.exe
```
### 3. 一覧に1で開いた画面名(titleタグの値)が出ますのでそれを選択

普通はこれで開発者モードが開きますが、開かない場合は、
**「Microsoft Edge 開発者ツールの詳細について、ここをクリックしてください。」**
を一度クリックすると開きます。（バグかな？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45117/6002073a-7f6e-d03d-56b3-aacfc65d6de6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45117/d972efad-9bd6-a6f5-0f21-5a3017b58315.png)

おしまい！
ArduinoUNOと温度,S-5851で液晶温度計 (Arduino)(AQM0802A)


1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり



```c++


#include <Wire.h> //I2C library

//STM32G031J6M6
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5

// I2C temperature sensor - see table 1 of data sheet.  Resistor selects address. 
#define S5851A  0x48
#define I2Cadr  0x3e  // 固定

int     tempval;                //温度
char    data_read[2]={'@','t'}; //i2cバッファー
int     ii;                     //ループカウンター

char INIT_com[]={0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41};

char INIT_cls[]={0x0,0x1};

void i2c_led_w(char *buff1){
  Wire.beginTransmission(I2Cadr);
  Wire.write(buff1[0]);
  Wire.write(buff1[1]);
  Wire.endTransmission();
  delay(2);
}//i2c_led_w

void setup()
{  
  delay(3000); //not delete  //031

  //i2cの初期化
  Wire.begin(); // initialise the connection //767 UNO
  //Wire.begin(sdaPin,sclPin); //STM32G031J6M6

  //液晶の初期化
  for(ii=0;ii<11;ii++){
    i2c_led_w(&INIT_com[ii*2]);
  } //for

} //end setup

void loop()
{

  //画面のクリア
  i2c_led_w(INIT_cls);

  //0番目のレジスター
  Wire.beginTransmission(S5851A);
  Wire.write(0);
  Wire.endTransmission();
  delay(1);

  //温度の読み込み
  tempval = 99;
  Wire.requestFrom(S5851A, 1);
  while(Wire.available())  {    // 要求より短いデータが来る可能性あり
    tempval = (int)Wire.read(); // 1バイトを受信
  }//while

  //液晶に表示
  data_read[1] = '0' + (tempval / 10);
  i2c_led_w(data_read);
  data_read[1] = '0' + (tempval % 10);
  i2c_led_w(data_read);

  delay(1000); //1秒待つ
}//loop




```


![i2c_lcd_s5851_uno_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1f90d78a-2f72-048d-1d18-30bc3a726cb0.jpeg)


![i2c_lcd_s5851_010_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d83dba17-3f84-f47a-d7b6-7e39f90111ac.jpeg)
ESLint + Prettier 組み合わせ時のトラブルシューティング

# Prettierを使用している環境でESlint（静的解析）をかけるとエラーが発生する。
ESlintとPrettierのデフォルトルールの内、相反している箇所が複数あるので、修正が必要です。
本投稿ではESLint側の設定ファイル`.eslintrc.js`のrules部分を修正して対策を行います。

```typescript:.eslintrc.js
  "rules": {
    "quotes": ["error", "double"],
    "object-curly-spacing": ["error", "always"],
    "space-before-function-paren": ["error", "always"],
    "max-len": ["error", { "code": 一行の上限文字数 }],
  }
```

その他必要に応じてルールの追加が必要かも知れませんので、まだエラーが出る場合は下記のルール一覧を参照してみてください。

https://eslint.org/docs/rules/

Prettier側でエラー解除できた方がいらっしゃいましたら、コメントを頂けると幸いです。
レポートの学習のための資料（おそらく上級編）

自分の学習用

[Documentation Count Unique Values in Report Results](https://help.salesforce.com/articleView?id=sf.reports_count_unique_values.htm&type=5)

[Tips & Tricks: "The Power of One" the Greatest Formula Ever Written*](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A7RsPSAV)



[Tips & Tricks: Creating Sales vs. Goal Reports and Dashboards](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A7SLeSAN)



#レポート関係の回答

[Dashboard update impossible](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000BrEhuSAF)

#パワー・オブ・ワン」史上最高の数式【和訳】
最初にお礼を言いえます。分析のDemiGodであるTom Tobin（「ThePower ofOne」を教えてくれた男）に考えを伝えます。次に、レポートでカウントするオブジェクトに新しいカスタムフィールドを作成します（私のアドバイス：Salesforce組織内のすべてのオブジェクトで作成してください）。

1. フィールドタイプの選択：数式を選びます

2. 出力形式の選択：数値を選びます (0 decimals)　フィールドに「PowerofOne」という名前を付けないでください。

3. 数式を作成する 1 とだけ入れます。それだけれしいです。

```
1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4016716e-5a20-2e23-74fb-2a7cb25ef288.png)

次に、レポートを実行します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f18026e5-210a-3d6b-ea25-9f5d566f7291.png)

これで、商談所有者の数、取引先の数、商談の数、商談製品の数、電球、ウィジェット、壁にビールのボトルを取得できます。
「技術力」とは


https://www.weblio.jp/content/%E6%8A%80%E8%A1%93%E5%8A%9B

「技術力で殴る」というフレーズをTwitterで見かけたので考えた小編。
例えば「東京から大阪まで行く」という問題を達成するために

- 飛行機
- 電車
- 車
- 自転車
- 徒歩

という手段があったとして最も技術力の高い手段はこの場合「飛行機」なのだろうか。
しかし飛行機は

- 値段が高い
- 搭乗手続き、荷物手続き等

のオーバーヘッドがある。

目的地へのトータルでの移動時間と値段を考えると最も効率のいいのは電車（新幹線）だったりする。その場合「電車」が技術力が高いということなのだろうか。

あるいはこのご時世で感染対策を考えたいなどという顧客要件を入れたら「車」かもしれない。
そうなってくると一般的な意味では「技術力」と「実際に選択される手段」、「実用性」みたいなものは別物になりそう。

とか考えていたらこんな記事があったので腹落ちした。

https://qiita.com/m96-chan/items/3f4ba8b33125ab22c377

## 結論

「技術力」はもっと分解して考えて使いたい。でも技術力でも人間力でも判断力でもなんでもいいけど殴るの良くないですよね。

というポエムでした。
spconv1.2をubuntu18.04にインストールする

# 背景
spconvが必要になったので、インストールのメモ

# テスト環境
* ubuntu18.04
* cuda10.2
* cudnn8.2
* nvidia-driver 440.100
* python3.6.9
* pytorch1.9



# インストール

cudnnをdownloadしてdebian packageをinstall
https://developer.nvidia.com/rdp/cudnn-download

```
sudo dpkg -i libcudnn8_8.2.1.32-1+cuda10.2_amd64.deb
```

pytorch1.6以上をオススメ(それより前のはバグがありました)

```
pip3 install -U torch torchvision
```

spconvをclone

```
git clone git@github.com:traveller59/spconv.git
```

boostが必要らしい

```
sudo apt-get install libboost-all-dev
```

submoduleのupdate

```
git submodule init
git submodule update
```

spconvのinstall

```
python3 setup.py bdist_wheel
cd ./dist/
pip3 install spconv*.whl
```



#cudnnが見つからない場合


もしcudnnが見つからないエラーが出たら試す

```
export CUDNN_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$CUDNN_LIBRARY_PATH
export CUDNN_INCLUDE_PATH=/usr/include:$CUDNN_INCLUDE_PATHUDE_PATH
```
エクセル2019のVBAで時刻を検索するコード

エクセルVBAで、時刻を検索するコードを作るのに大変苦労したので、メモを残す。
エクセルのバージョンは、2019。

## 準備
```
'
' あらかじめ、時刻を表す各セルを選択し、次のような「書式設定」を行っておく
'
    Selection.NumberFormatLocal = "h:mm"
```

## 時刻を検索するコード（２種類）
```
'
' 「What:=」や「What:=TimeValue(」に続く「Time」には、「"21:00"」・「"0:00"」などが入る。
'
' (1)「6:00」等を検索する（数式検索「LookIn:=xlFormulas」）
'
    Columns("A:A").Select		' 検索範囲を作っておく
    Selection.Find(What:=TimeValue(Time), After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Select
'
' (2)「0:00」等を検索する（値検索「LookIn:=xlValues」）
'
    Columns("A:A").Select		' 検索範囲を作っておく
    Selection.Find(What:=Time, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
        xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False).Select

```

## 終わりに
エクセルのVBAコードは、マクロの記録通りでも一筋縄ではいかない場合がある。
特に、Findメソッドで時刻を検索しようとすると、検索対象のセルの「書式設定」によって、うまく検索できない場合があって、本当に苦労した。
TypeScriptのバージョン変更

VScodeでTypeSctipt（ts）とreactを使ってwebアプリを作っているときに```'--jsx' オプションの引数は 'preserve', 'react-native', 'react' である必要があります。```というエラーが出てきた。Qiitaの他の記事を見るとtsのバージョンが違うため、このエラーがでていると書いてあった。VScodeの右下の部分から、バージョンを変えれるが```ワークスペースのバージョンを使用```が出てこず、VScode内ではバージョンを合わせられなかった。
なのでターミナルで
```npm init 
 npm install --save-dev typescript```
を打ち込むと```ワークスペースのバージョンを使用```VScode内が出てきたため、バージョンを合わせたら、エラーがなくなった。
桜斗プロジェクト：新OS「寧和(Bridge)」プレイントロダクション

## はじめに - Introduction

新しい時代に求められるOS，もといデバイスはどのようなものでしょう．それは人々が出会い，つながり，学び，考え，作り，遊び，あるいは発表する架け橋であり，結節点であり，港であり，門でなければなりません．機能的であり，複雑なことができる高い機能をもちますが，その反面，シンプル・簡潔でそのうえ上品かつ美しい操作性と外観をも持ちます．

What is kind of OS, or rather a device, needed in the new generation? It should be a gate, a dock, a hub, or bridge that people meet, connect, think, learn, create, play, and produce. It may be functional, smart that have capability for complex things and however have simple, elegant, and beautiful operability and appearance.

## クロスプラットフォームとシングルトン・アクセス - Cross-Platform and Singleton-Access

適応する全てのデバイスで同じようにOSが動作し，そしてアプリケーションなどのソフトウェアが同じように動作するプラットフォームを持ちます．またデスクトップから展開できるパレットをもち，全てのインストール済みソフトウェアは一か所からアクセス可能となります．既存のファイルはそれ自身を選択することで対応するソフトウェアが自動的に起動され，またパレットからソフトウェアを起動すると新しいファイルが作成されます．

The OS will run the same on all devices it is adapted to and have a platform that applications and other software will run the same on. It has a palette that can be explored from the desktop, and all installed software is accessible from one place. Selecting an existing file will automatically launch its corresponding software, and by direct launching from the palette will create new file.	

## ソフトウェアとシングルトン・マネジメント - Software and Singleton-Management

ソフトウェア及びパッケージは統一的な機構を介してホストされ，入手・インストールされます．公式のストア・ホストサイトのほか，開発者はその提供するソフトウェアやパッケージを任意の場所からホストできますが，いずれの場合も，この機構のネットワークに登録することで，ユーザは一か所からソフトウェアやパッケージを探し，入手することができるようになります．　また，入手・インストールを一元化することにより，保有するソフトウェアやパッケージを容易に管理することができるようになり，デバイス間の連携や共有，移行もシンプルにできるようになります．

Software and packages are hosted, obtained and installed through a common structure. In addition to the official stores and host sites, developers may host their software and packages from any location, although in all cases, by registering with the network, it allows users to find and obtain software and packages from a single location. Besides, the integrating the acquisition and installation of software and packages, provide users will be able to easily manage their software and packages, and simplify inter-device collaboration, sharing and migration.

## マルチデバイスと分散システム - Multi-Device and Distributed-Device

(執筆中)

## 最後に - At Least

私たち桜斗プロジェクトでは、この新OS「寧和(Bridge)」をはじめとする様々なシステムを研究開発しています。プロジェクトへの参加を歓迎していますので、興味を持った人は是非お声掛けください。

We, Chetro project, are researching and developing this new OS "寧和(Bridge)" and various other systems. We welcome you to join our project, so please contact us if you are interested.
[Rails] radio_buttonとlabelタグのfor属性による連携

## 環境

```
Rails 6.0.3
ruby 2.6.3
```

## 本題
本記事はRailsでラジオボタンとlabelタグの連携の仕方について記述したものです。

![スクリーンショット 2021-06-23 16.50.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991598/8e2ac485-96b4-ba3a-4483-b22954ccf7aa.png)

連携をするとlabelタグの要素をクリックするだけでラジオボタンを選択することができます。
![スクリーンショット 2021-06-23 16.50.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991598/e53eec44-2a77-5370-65cd-489c2a69e570.png)

##やり方
連携するにはラジオボタンの`ID`とラベルの`for`の値を一緒にしなければなりません

```
<%= f.radio_button(:check_age, "成人") %>
<%= f.label(:check_age, "成人")  %>

<%= f.radio_button(:check_age, "未成年") %>
<%= f.label(:check_age, "未成年") %>
```

しかしこれらのコードでは適切に設定されないので`label`に`value`オプションを指定します。

```
<%= f.radio_button(:check_age, "成人") %>
<%= f.label(:check_age, "成人" ,value: "成人")  %>

<%= f.radio_button(:check_age, "未成年") %>
<%= f.label(:check_age, "未成年" ,value: "成人") %>
```

## 参考
https://blog.yuhiisk.com/archive/2018/05/14/rails-radio-with-label-for.html
初学者にVSCodeは向かない

初学者にVSCodeは向かない。

プログラミングブームの昨今エディタとして最も囃し立てられているVSCodeだが、プログラミング学習初期の頃このエディタに手を出して私は挫折した。

フォルダ、ファイル、コマンドプロンプト、プログラミング言語すらここでインストールするというオールマイティさが初学者に挫折を強制させるからだ。

VSCodeさえ理解出来ないならエンジニアに向いていない、そんな事で一々噛み付いてくる人間なら相手にするだけ無駄だし、そんなもので諦めて欲しくない。

地頭的に芳しくない自分を最下層と自負してそれでも一年間無為に過ごしてしまった教訓からここに記しておく。

代替手段ではAtomを強く勧める。

エディタとしての機能だけを先ずは使いこなしてそれはそれと理解して欲しい。

よって拡張機能も特に入れる必要はない。

phpファイルを作成したらそれが自分のプロジェクトフォルダに保存され、それをそのままPC操作の一環として肌に馴染ませる程度が初期の段階では重要だと思う。

拙い文章で恐縮だが自信が無いエンジニア志望に届く事を祈る

追記:

挫折した場所というのは沢山あって細かく言えばキリがないが、VSCodeの話で言えば

・自分で作りたいと思ったものを作成する際に参考するサイトや動画がVSCodeを使っていて、フォルダやファイルの構造が訳がわからなくなった。
・Pythonをやる際にPythonが何処にインストールされたのか、パソコンとVSCodeのフォルダが別々のものに感じられて可視化しにくい。
・XAMPPのコマンドプロンプト部分がVSCodeには内包されていて、それがエディタとコマンドプロンプトの機能を頭で認識し辛くしている。
・VSCodeでフォルダ作成の際、フォルダ名を参考サイトのように記入しても警告音が出て記入出来なかった。
・VSCodeがエディタという機能として認知されてるが故にそれ以外の機能として初学者には理解しにくい。

などである。

　言語という括りで言えば、JavaScript、Pythonなどで自分は挫折した。
　拡張機能を入れずに使うというのは挫折しにくいかもしれないが、それなら豊富な機能を併せ持つVSCodeを使う必要は無い。
　言語化が稚拙だが、初学者であるならば何が分からないのか分からない状態が常だと思うしやはり経験上最低でも、何か一つHTML、CSS以外でデプロイまで行ってから手を付けることを薦める。
超初心者向けReact参考書モドキ

<h1>Reactとはなんぞ？</h1>
<p>業務でReactを扱うことになったので、自身の参考書程度に記しておきます。
※あくまで自身の確認程度などでとても分かりづらいと思われます。
-------------------記述途中-----------------------------------

<h2>Reactとは</h2>
<p>ReactはFaceBook社が開発したJavascript用のフレームワークでありUI開発に優れている
前提条件としてHTML、CSS、Javascriptの知識がなければならない。
Web向けに構築する場合はReactDOMと連携して使用。

<h2>Reactの特徴</h2>
・コンポーネント：
　　〇　画面の各要素をコンポーネントを組み合わせるという形で構築する。
　　〇　コンポーネントは自分で作成したカスタムタグと考えることができる。
・JSXで画面要素を記述
　　〇　コンポーネント内に画面とソースコードを見通しよく記述できる。
　　〇　デメリット　JSXは何らかのツールで変換処理する必要がある。
・Javascript内の変数への変更が自動的にDOMに伝わる
　　〇　これをリアクティブプログラミングと呼ぶ
　　〇　コーディングをアプリケーションロジックの作成に集中できる。
・仮想DOM（VirtualDOM）
　　〇　実際のDOM（≒ブラウザ画面）の書き換えが効率的に行える。

<h2>関数宣言</h2>
Reactでの関数の宣言はJavascriptと同様に
function句と"=>"の記号を利用したアロー関数式の2つを利用することが可能。
アロー関数式は以下の様に利用する。

```
const printMessage = () => {
   console.log('Hello, World');
};
printMessage(); //Hello, Worldと表示
```
<h2>配列の宣言とオブジェクトの宣言</h2>
ここはシンプルに

```
オブジェクトの宣言： const object = { name: '田中', age;30 };
配列の宣言：　const array = ['first', 'second'];
```
さらに既存の配列利用して新しく配列を宣言する際にはスプレッド演算子(...)というものが使われる。

```
const array1 = ['first', 'second'] //通常の配列宣言
const array2 = [...array1, 'third']　//スプレッド演算子を利用した配列宣言
```
オブジェクトも同様にスプレッド演算子を利用することができる。

<h2>配列操作</h2>
配列には操作するための各種メソッドが定義されている。
配列名.mapは配列内の各要素に一律の加工を施すことができる。(map関数)
配列名.filterは配列内で条件に合う要素を残す。(filter関数)
配列名.reduceは配列内の各要素を順次処理していき一つの結果とする。(reduce関数)
以下コード例

```
const array = [10, 20, 30, 40, 50]; //配列の宣言
map関数：const example1 = array.map(element) => `内容: ${element}`);
// example1には次の内容が格納される。 ["内容：10”, "内容：20", "内容：30" ,"内容：40", "内容：50"]

const example2 = array.filter((element) => element > 21);
// example2には次の内容が格納される。[30, 40, 50]

const example3 = array.reduce((sum,element) => sum = sum + element);
// example3には次の内容が格納される。150 すべての要素を足した結果。

<h2>Reactでの条件演算子</h2>
Reactでは通常のif文で条件によって値を返すことができないため、

```
flag? 'true', 'false';
```
と上記の様に条件演算子を用いる。

<h2>React用ステートメント</h2>
```
import React from 'react';
import ReactDOM from 'react-dom';
```
この2つのステートメントはWebアプリケーションを作成するうえで必ずインポートしなければならない
<h5>JSXとは？</h5>
JavascriptにHTMLを直接記述することができる。

```
例：<div>Hello World</div>
```
というHTML文を記述するとするこれをReactでは

```
React.createElement('div', null, 'Hello World')
```
といったJavascript文に変更される。
注意点：HTML属性classはclassNameに変更する必要がある。
　　　　HTML属性forはhtmlForに変更する必要がある。
<h5>レンダリング</h5>
コンポーネントを画面上に配置し機能させることをマウントといい
コンポーネントが排除されることをアンマウントと呼ぶ

<h2>フック（Hooks）</h2>
フックとは、関数ベースのコンポーネントに、状態(state)や特定のタイミングで機能する関数を
定義できるようにしたReactの拡張機能である。
種類として
状態フック：関数コンポーネント状態を追加するためのもの。（後述するuseState）
副作用フック：Reactの外へ何かしらの影響を与える（もしくは外から影響を受ける）処理を記述する（後述するuseEffect）
Refフック：useRef関数を使って利用する。
<h5>フックのルール</h5>
・関数ベースのコンポーネントのトップレベルでのみフック関数を呼び出す。
・コンポーネントとして作成されている関数からのみフック関数を利用できる。
通常のJavascript関数からフック関数を呼び出すことはできない。

<h2>useState関数</h2>
現在のState(現在の状態）とそれを返すための関数をペアにして返す関数である。
使用方法

```
import React, { useState } from 'react';
```
まずは上記コードを記すことでReactの機能にuseState関数が提供する機能を追加する。
状態の定義

```
const [状態変数(flagなど),  状態変更関数(changeFlagなど)] = useState(状態の初期値(この場合だとtrue,falseなど);
```
状態の変化
ここでは例としてonclickを利用して状態変数を変化させます。

```
<input type="button" value="true"
onclick={ () => changeFlag(true)} />
```
の様に記述することでchangeFlagにtrueが格納され状態の変化が可能となる。
Pub/Subのacknowledgeについてメモる

# acknowledgeとは

acknowledge とは、subscriberが、subscriptionに「俺ちゃんとメッセージを受け取ったよ」とsubscriptionに伝えること。


## pushの場合

push型のメッセージキューを考える。acknowledgement deadlineが10秒の場合、subscriptionがsubscriberにメッセージをpushしてから10秒間(=acknowledgement deadline)待つ。それだけまってsubscriberからacknowledgement(≈successful HTTP status)が届かない場合は、subscriptionはメッセージ送信に失敗した見なし、再び同じメッセージを送信する。(10秒後ぴったりに再送するというわけでは多分なくて、最低10秒待つのだという認識)

## pullの場合

一旦pullした後、改めてsubscriberからsubscriptionに受け取った旨を伝える通信をする(?)

# Ref


- https://cloud.google.com/pubsub/docs/subscriber
    - 全てはここに書いてある。
awkでカンマ編集

大昔、テキスト処理で数値のカンマ編集を実装（笑）する関数を書いていた記憶があったので、掘り起こし。たまたま必要になったものでwww

```

ykishi@dezembro /tmp % cat foo.sh 
#!/bin/sh

awk 'BEGIN{
  print comma(1234567890);
  print comma(123456789);
  print comma(12345678);
  print comma(1234567);
}
function comma(val) {
  a = val + "";
  len = length(a);
  s = len%3;
  from = len;
  to = from - s;
  buf = "";
  while( from > 0 ){
    if( from != to ){
      if( buf == "" ){
        buf =  substr(a, len - from + 1, from - to) + "";
      } else {
        buf = sprintf("%s,%s", buf, substr(a, len - from + 1, from - to) )
      }
    }
    from = to
    to -= 3;
  }
  return buf;
}'

ykishi@dezembro /tmp % ./foo.sh 
1,234,567,890
123,456,789
12,345,678
1,234,567
ykishi@dezembro /tmp % 
```
localhost以外のポートで接続する方法[Rails] Blocked host

## **エラー内容**

Rails6の開発環境において、localhost以外のドメイン名でブラウザにアクセスした以下のエラーが発生したので、その解決方法を記載します。

![スクリーンショット 2021-06-24 19.40.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779676/1727f5a6-fefd-c86e-3ec4-ac78ef839078.png)



## 原因

Rails6からの設定だそうです。"DNSリバインディング攻撃防止"の目的で、許可されていないドメイン名からのアクセスを拒否する機能です。デフォルトでは`localhost`が登録されている為、これまではエラーが発生しませんでした。解決策は以下の2つです。

## 解決策1

ホワイトリストに許可したいhostを追加する。

```ruby:config/environments/development.rb
Rails.application.configure do
	:
  config.hosts << "許可したいホスト名"
	:
end
```

## 解決策2

ホワイトリスト全体をクリアする。この場合は、すべてのホスト名に対するリクエストを通過させることができます。

```ruby:config/environments/development.rb
Rails.application.configure do
	:
  config.hosts.clear
	:
end
```
私がTailwindCSSを愛用する理由

# TailwindCSSという言語

私は、**TailwindCSSは言語**だと思っています。

class属性の中にプログラムできる言語です。

デフォルトで用意されているものだけでもかなり有用ですが、**頻出するパターンに合わせて専用の言語にカスタマイズすることができます**。

それだけでもかなりワクワクするのは、私だけなのでしょうか？

# 人間工学的

私がTailwindCSSが人間工学的だと思う理由は、マークアップ内に記載していくスタイルが標準的[^1]であるからです。

[^1]: `@apply` ディレクティブを使ってCSS内でクラスを作ることはできます

なぜそれが人間工学的かといえば、**エディタ内での移動を最小限に抑えることができるから**です。

import文を書いたり、クラス名を付けてCSSを書いたり、新しいコンポーネントファイルを作る手間はなるべく避けたいのです。CSS-in-JS のために変数を定義して、それを参照するために変数の中を確認するのすら億劫なのです。

もちろんコンポーネント化を捨てたわけではありませんが、その**目的の多くが「ほんの少しのTailwindCSSコード」で代替できてしまう**のです。

私と同じ"怠惰なプログラマ"はTailwindCSSをきっと気に入るはずです。

# ちょうどよく頭を使える

例えば「丸角でパディングが入った、背景がプライマリカラーで文字が白のボタン」が必要になったとします。

TailwindCSSなら、HTML標準の`button`要素と組わせて、「」内の説明をありのままに表現するだけです。

```html
<button class="rounded p-4 bg-primary-500 color-white">click me</button>
```

TailwindCSSを使わずに、Buttonコンポーネントを作り、属性を用意し、color属性に `'primary' | 'secondary'` を設定できるようにしたりすることが多いかもしれません。

その結果、全く違うデザインのボタンが出現して、違う名前でコンポーネントを作った結果ロジックが分散したり、**バリエーションに対応するために属性を増やして、組み合わせで制御しようとしてコンポーネントの実装が複雑になっていく**のです。

TailwindCSSには**CSSと同程度に汎用的な部品であるユーティリティが用意されています**。

属性の組み合わせを考えなくても、**ユーティリティの組み合わせで十分表現できます**。

「丸角でパディングが入った、背景がプライマリカラーで文字が白のボタン」

これに命名せずとも、**文章をそのままに表現することで同じ目的が達成されます**。

Buttonコンポーネントを使う側は、使える属性を調べる必要がありますが、TailwindCSSでは**すでに用意されている「言語」から慣れ親しんだ用語を使って、今カーソルを置いているその場所でコーディングを終わらせればいい**のです。

「ユーティリティを組み合わせる活動」は、私にとって「ちょうどよく頭を使う活動」で、その点がとてもうれしいのです。

（※ ちょうどよくない！難しい！ユーティリティを覚えるのが大変だ！と感じるなら、それはCSSそのものへの不理解が原因ですので、CSSの勉強を頑張ってください。）

# 「デザイン」という活動との親和性

よくあるコンポーネント活用の謳い文句はこうです。

「一度UI部品を作ってしまえば、それを使いまわして、迅速にUIを構築できる」

しかし、多くのデザイナーは「好きに作れ」と言われて、UI部品なんていう考え方はしないでしゅお。

効果的に見せるために、細部を変えるかもしれません。（神は細部に宿りますから）

プログラマは文句を言って、「この二つのボタンのデザインを合わせてくれ」とかあるいは「Atomic Designを導入しよう」と言い出すかもしれません。

優しいデザイナーはそれに応えて、「同じもの」としてボタンを２つ作るでしょう。

プログラマはそれを見てまた文句を言うでしょう。

「この２つは、今のコンポーネントの実装を大きく変える必要がある！」

このようなやり取りの末に、"実装に合わせてデザインを行う"というような本末転倒な状況に陥ることのをよく見たことがあります。（開発目線でのフィードバックや交渉を否定しているわけではありません）

そうしてできたデザインや要件定義は、どこか人間的でなく使い勝手の悪いものになります。

**過度に機械的プロセスを求めるあまり、デザイナーの思考プロセスまでもが機械的になってしまう**からです。

（もちろん入力項目欄が１００も２００もあるような場合は話は別かもしれませんが、そうなっている時点で使い物にならないことに気づくべきでしょう）

デザインという人間の芸術的な活動を柔軟に受け入れるには、汎用的な部品をデザインに合わせて組み合わせるという「ちょっとした生産的活動（つまり、プログラミング）」を拒まないプログラマとしてのメンタルモデルが必要になります。

ReactやVueの提供する「コンポーネント機能」に「UI部品」としての役割を過度に求めていては、そういったメンタルモデルとは逆の方角へ進んで行ってしまいます。

一方のTailwindCSSは、そういった心構えを無理なく心に宿してくれます。

そういう面で私はTailwindCSSが好きなのです。

# 終わりに

あるポエムを読んで、TailwindCSSに関してフロントエンドプログラマたちが日夜激論を繰り広げているというようなことを知りました。

これだけTailwindCSS愛を書いておきながら私は、「そんなことどうでもよくないか？」とか思ったりしていたことは内緒です。

そして参戦はしたくないが、他人が書いたTailwindCSSに関する素晴らしい記事（批判する記事でも、肯定する記事でも多くのことが学べる記事ばかり）を見て、私も何か書いてみたいという気持ちになり、結果何の学びもなさそうな記事を生み出すに至った次第です。

私自身は、TailwindCSSにはまだまだ問題が多く残っていると思っています。

主に、PurgeCSSという「妥協案」とShadow DOM内での利用に関するものです。

この２つは、もしかするとTailwindCSSを言語として捉える見方を突き詰めれば解決するのではないかとも思っています。

例えば、`class`属性ではなく専用の`data-tw`属性に書くようにして、言語としてパースすることでどうにか解決に向かうのではないかと思っているのです。（だったら自分でやりなさい、というご指摘はその通りでございます）

ベーススタイルも、`tw-button`というカスタムコンポーネントを作っておいて、ボタンのCSSリセットのみ当てておけばいいような気がしているのですが、今のTailwindCSSでそれができるかはちょっと悩ましいのです。（CSSをパースすればたぶんできる）

そんなこんなことを考えつつも、仕事ではふつうにSassを使っている不届きものがお送りしました。

ここまでご精読いただき、まことにありがとうございます。

もし興味を持ったら、ぜひTailwindCSSを導入し、カスタマイズすることで自分やプロジェクトだけのものにしてもらえたら嬉しい限りでございます。
VSCodeとGitの連携方法

##概要
* VSCodeからGitを使えるようにした際の備忘録
* VSCodeとGit連携しておくと、Gitのコマンド入力（Pull/Push..etc)やブランチのチェックアウトが簡単にできるので便利◎

##環境
* Windows10 Home  x64-based PC
* Ubuntu 20.04.2 LTS
* git version 2.32.0.windows.1
* Visual Studio Code ver:1.57.1



##実施内容
###1.Gitインストール

* ↓の手順でGitをインストール

https://qiita.com/nutsOst/items/86d00e6f31a66210b5da

* ↓のコマンドを実行 (Ubuntu上で実行した)

```
git config --global user.name {ユーザー名}
git config --global user.email {メールアドレス}
```

###2.VSCodeインストール

↓のリンクからVisual Studio Codeをインストール

https://azure.microsoft.com/ja-jp/products/visual-studio-code/

###3.連携

* 任意のフォルダをVSCodeで開く
* ``Ctrl+Shift+@`` でターミナルを開く
* ターミナルで``git init``を実行
* 
```
実行結果
PS C:\Users\~~> git init
Initialized empty Git repository in C:/Users/~~/.git/
```

* 左下に↓のようにBranch名が表示されていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/f894538b-39d3-f7ca-53ce-ddf34a27f84f.png)
[Swift] 前月末、翌月初めの日付を簡単に取得する方法

DateComponentsを使用して月末を取得する良い方法がないか調べていて見つけました。
#前月末
dayに0を入れると前月末の日付を返してくれます。

```Playgrounds.swift
let cal = Calendar.current
var comp = DateComponents(year: 2021, month: 6, day: 0)
let date = cal.date(from: comp)
print(date) 

// 2021/05/31


let cal = Calendar.current
var comp = DateComponents(year: 2021, month: 5, day: 0)
let date = cal.date(from: comp)
print(date)

// 2021/04/30


let cal = Calendar.current
var comp = DateComponents(year: 2020, month: 3, day: 0)
comp.isLeapMonth = true  //閏年
let date = cal.date(from: comp)
print(date)

// 2020/02/29
```

#翌月初め
dayにその月の日数を超える値を渡すと翌月の超過した分の日を返してくれます。
この性質を利用して、例えば、6月なら31を渡すと翌月1日を返してくれます。

```Playgrounds.swift
let cal = Calendar.current
var comp = DateComponents(year: 2021, month: 6, day: 31)
let date = cal.date(from: comp)
print(date) 

// 2021/07/01
```
(Chrome) Clipboard Read-only Filesの安全性を調べてみた

Chrome 91でリリースされた Clipboard Read-only Filesの挙動とセキュリティを調べてみた。
結果、仕様上は安全なことが分かった。

# Clipboard Read-only Files とは

クリップボード上のファイルをブラウザ側がread-onlyで読み取ることができる機能。

以下htmlにアクセスしてから貼り付け （MacならCmd + Vまたは編集>貼り付け) すると、
コンソールにファイルの内容を表示できる。

```html
<html>                                                                                   
  <script>
    window.addEventListener('paste', onPaste);
    async function onPaste(e) {
      let file = e.clipboardData.files[0];
      console.log(await file.text());
    }
  </script>
</html>
```

Chromeはdrag & dropによるDataTransferを既にサポートしているが、
それをクリップボードでもサポートしようとして実装したものとのこと。
用途として、ファイルをe-mailに添付するときにdrag & dropではなく単にCtrl+C, Ctrl+Vで添付する、などがある。
参考: [Feature: Clipboard: read-only files support](https://www.chromestatus.com/feature/5671807392677888)

# セキュリティ

「ユーザー操作がなくても勝手にクリップボード上のファイルの中身を読み取れるかどうか」試してみた。

```javascript
document.dispatchEvent(
  new KeyboardEvent("keydown", {
    key: "v",
      ctrlKey: false,
      bubbles: true,
      metaKey: true
  })
);
```

で貼り付けのKeyboardEventを発生させても`paste`は呼び出されなかった（セキュリティ的に当然だが)。

### 理由

> paste イベントは、 ユーザーがブラウザーのユーザーインターフェイスで「貼り付け」操作を行ったときに発生します。

に「ユーザーがブラウザーのユーザーインターフェイスで」と書いてあるとおり、ユーザーが明示的に操作したときでないと発生しない。clipboardDataを読み込めるかどうかも同様。
参考: [Element: paste イベント](https://developer.mozilla.org/ja/docs/Web/API/Element/paste_event)

なお、無理やりcreateしても意味なし

```javascript
function triggerEvent(event) {
  var evt = document.createEvent("HTMLEvents");
  evt.initEvent(event, true, true );
  return document.getElementById("body").dispatchEvent(evt);
}
triggerEvent("paste")
```

```console
xxx.html:16 Uncaught (in promise) TypeError: Cannot read property 'files' of undefined
    at onPaste (xxx.html:16)
    at triggerEvent (xxx.html:10)
    at xxx.html:51
```

### 注意

ブラウザ上での`copy`イベントはキャンセル可能なので

```javascript
window.addEventListener('copy', (e) => {
  e.preventDefault();
});
```

で妨げられる。よって、例えば

1. 何らかの理由でユーザーが事前にファイルをクリップボードにコピーした
1. ユーザーがWebサイト上でテキストをコピーする
1. しかし、コピー操作は妨げられている
1. ユーザーがクリップボード上にテキストがあると信じる
1. ユーザーがWebサイト上でテキストを貼り付けようとする
1. ファイルの中身が読み取られてしまう

ということはあり得る。
また、1を期待して「このサイトを閉じるにはCmd + Vを押してください」などと表示して貼り付け操作を促すこともなくはなさそう。

# 結論

ユーザーの明示的な操作がないとクリップボードの中身は読み込めないので仕様上は安全だが、クリップボード上にファイルがある状態での貼り付け操作を誘導することは可能。
【ClickHouse】case式の代わりに if を使ってクエリをスッキリさせる

ClickHouseの **if** が便利だったのでメモがてら投稿します。

https://clickhouse.tech/docs/en/sql-reference/functions/conditional-functions/#if

# サンプル

下記のようなテーブルを想定します。

```
-- ┌─id────────┬─os────────┐
-- │ 1         │ 1         │
-- │ 2         │ 1         │
-- │ 3         │ 2         │
-- ...
-- └───────────┴───────────┘
```
`os` には
- Androidのときは `1`
- iOSのときは `2` 
となるように 1 or 2 が入っているものとします。（1, 2以外は入らないこととする）

そのままだとパッと見たときに、 `os` が1, 2だとどっちがどっちなのかわかりにくいので、1の場合は `android` 、2の場合は `ios` とラベルを付けて表示してみます。

↓イメージ

```
-- ┌─id────────┬─os────────┐
-- │ 1         │ android   │
-- │ 2         │ android   │
-- │ 3         │ ios       │
-- ...
-- └───────────┴───────────┘
```

# case式を使った場合


```sql
SELECT id,
       CASE
           WHEN os = 1 THEN 'android'
           ELSE 'ios'
       END AS os
FROM table
```
`os` は 1 or 2 なので、1なら `android` 、それ以外なら `ios` としています。

まぁこれでも十分ではあるのですが、ifを使った場合、もっとスッキリ書くことができます。

# ifを使った場合

```sql
SELECT id,
       if(os = 1, 'android', 'ios') AS os
FROM table
```

1行でスッキリ書くことができました。

`if(条件, trueのとき, falseのとき)` という感じに直感的に記述できます。

可読性も高いので、使えるところでは積極的に使っていきたいところです。

# （おまけ）三項演算子もあります
ClickHouseでは三項演算子もあるようでした。

```sql
SELECT id,
       os = 1 ? 'android' : 'ios' AS os
FROM table
```
iOS 15 で追加された Location Button

_※本記事は、[一般に公開されている情報](https://developer.apple.com/videos/play/wwdc2021/10102/)を元に作成しています。記事中の画像はWWDCのスライドのものを引用させて頂いております_

- [Meet the Location Button \- WWDC 2021 \- Videos \- Apple Developer](https://developer.apple.com/videos/play/wwdc2021/10102/)

## iOS 15 から Location Button が追加された

これは**「必要なときに一度だけ位置情報の利用を許可する」**を簡単に実現できるボタンです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/5628a385-eec8-69ce-031c-ec046ee17717.png)

今までは次のように「Current Location」のような `UIButton` を自分で生成し、`requestWhenInUseAuthorization()` を呼んでいたと思います。

```swift
let button = UIButton()
button.setTitle("Current Location", for: .normal)
button.addTarget(self, action: #selector(showNearByParks), for: .touchUpInside)

@objc func showNearByParks() {
    self.locationManager.requestWhenInUseAuthorization()
    self.locationManager.startUpdatingLocation()
}
```

iOS 15 からは次のように書けます。

```swift
let button = CLLocationButton()
button.label = .currentLocation
button.addTarget(self, action: #selector(showNearByParks), for: .touchUpInside)

@objc func showNearByParks() {
//    self.locationManager.requestWhenInUseAuthorization() <-- 不要に
    self.locationManager.startUpdatingLocation()
}
```

つまり、位置情報の使用許可リクエストを `CLLocationButton` が自動でやってくれます。

## もちろん SwiftUI にも対応

LocationButton はもちろん SwiftUI にも対応しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/5d95373f-faee-2be6-df61-bed18e522e5a.png)

位置情報の使用許可リクエストもセットでやってくれるので、実装がだいぶ楽になりそうですね。

## 様々な形状にカスタマイズ可能

この Location Button は様々な形状にカスタマイズ可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/85df18ed-f8e0-0753-aa5d-da415bc1ccdd.png)

通常のボタンと同じように `tintColor`, `backgroundColor`, `cornerRadius` などのプロパティが利用可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/0e37e9ec-9ba7-47ed-7afe-b9dd95b6fd46.png)

ただし例外もあります。たとえばアイコンと背景色を同じにしてしまうとユーザが何のボタンなのか認識できなくなってしまうため、この場合は警告が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/2a066054-1556-89b3-d50c-c9360f57bda4.png)

## （動作確認中）位置情報の使用を拒否しているユーザーにも有効？

実はここが一番の重要ポイントだと思っているのですが、過去に位置情報の使用を拒否したユーザーが LocationButton を押すとどうなるでしょうか？

> If someone, who has chosen "Don't Allow" authorization on your app in the past taps our new Location Button, they will see this button introduction prompt and have the opportunity to move your app back to NotDetermined and use Location Button going on forward. 

その際には **許可ステータスを `NotDetermined` に戻し、再び位置情報を提供するかどうか選択する機会が得られる** とのことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/88b609af-2b0a-68f8-cd1b-be4220f71914.png)

いちど位置情報の使用を拒否されたユーザーに、再び許可をリクエストできるようになったのは大きなアップデートですね :smiley: 


しかし、残念ながら Xcode 13 beta 1 の時点ではこの動作を確認できませんでした。（動作を確認できた方がいましたら教えて下さい！）


## まとめ

昨年に引き続き、Appleがよりプライバシー保護に力を注いでいる印象を受けました。
LocationButton を使用するとユーザーが現在地を共有するタイミングをより細かく制御できるため、ユーザーとの信頼を得ることができそうですね。
市場価値０の34歳からのテックキャンプ卒業からの転職

# 34歳から転職できた
70日のカリキュラム、20日就活で受託開発会社へ就職
結果から言うと、本当に運が良かったというのが一番です。
学歴や経歴があるか、戦略的に入学しないとこの年齡で未経験転職は厳しいのかもしれません
私自身は副業でネットショップを立ち上げた経緯があったので、主体性を評価していただき入社出来ました。

## 就活
なんと１社目に応募した会社で就職出来ました！
ただ選考期間中に応募した１４社は書類選考落ち全滅
・求人サイトwantedlyのみ

## プロフィール経歴
・３４歳
・男
・高卒
・飲食店店長
・家具職人
・家族あり
・簡単なエクセル、ホームページ・ビルダーの技術くらい
・副業でネットショップ

## テックキャンプ入学経緯

副業でネットショップを始めてからITに興味を持ち転職を決意、妻をなんとか説得しテックキャンプ（オンライン）に入学

## 入学準備

・学費約70万
・macbook約15万
・プロゲートでHTMLとCSSだけ一周していた
・勉強に集中出来る環境
・ノイズキャンセリングイヤホンおすすめ

## テックキャンプでの学習

教材と質問出来る環境、チームメイトとのアウトプット、勉強環境はとても良いです！
オンラインなので、家の環境を整える必要はありましたが（家族への周知、理解）
　まったくのIT初心者のまま行くのは無謀かもしれません。
プロゲートなど予習してから行くべきと今は思います。
でも１４日間は返金保証があるので、試せばいいとも思う

１日８時間以上の学習！休み無し！今までこんなに椅子に座っていた事がなかった！
少し予習していったHTML・CSSは２〜３日で内容終わり、RubyとRailsの予習をしっかりしとけば良かったと切に感じました。
理解できず「わからんわからん」の日々、モヤモヤしながらカリキュラムを先に進めて行く
チームメイトもわからん状態であったので少し安心。自分だけでは無かった。
最終課題でフリマアプリを作成するのだがそこで急激に理解が深まった感じがする。
今ようやくカリキュラムが理解出来る。そしてわかり易く書いてあった。

## 良かった点

### メンターのクオリティが高い
どのメンターさんも親切丁寧でわかりやすく教えていただけます。
後半からは質問の仕方にもルールが出来たり、直接の答えは教えてもらえなかったりしますが、それも身につきます

### チームメイトとのアウトプットの時間
チームメイトとアウトプットするので強制的に学習する事になります。
勉強してなかったらアウトプット出来ないため、真面目に取り組むしかありません。

### キャリアアドバイザーの指導も的確
担当してくれたCAさんも就活のプロであって、履歴書、職務経歴書のアドバイスも的確です。

### ライフコーチの存在
希望すればやる気を出させてくれるライフコーチとも一週間に一回面談出来ます。
雑談で息抜きになったし、楽しい時間で結果やる気が出てました。

### 一日が充実する
瞑想からはじまり、学習アウトプットを繰り返し気付けば20時ってな感じで70日間はあっと言う間です！

## 悪かった点
あまりないのですが、強いて言うならば
### RubyでなくPHPが良いのでは？
テックキャンプ開始当初は良かったのかもしれませんが2021年現在は同じ難易度の言語としてはPHPの方が圧倒的に求人が多いです。
1年で言語の価値が変わる世界みたいなので、仕方のない事ですが。
でもRubyを勉強していたらPHPの学習コストは低いらしく、早い人は２周間くらいでそれなりになるとか。

# テックキャンプ入学を考えている人へ
### 戦略的に予習をして入学する
プロゲートなどでRubyとRalisの予習は最低限、あとHTMLとCSS
できれば一度Railsを使ってアプリを作成しているくらいまでいけれれば最高のスタートを切れると思います。
理解も深まり、ポートフォリオも充実させる事が出来、就活にすんなり入れると思います。

### 家族持ち34歳からの転職はきつい
実際きついと思います。ホント無謀でした。家族スイマセン。
そして就職していまからがようやく始まりですが、何年間は苦労をかける事になると思います・・・
ただ生涯年収で考えると増えると思うので許してネ（予定）

### 転職後の年収
200〜300万スタートくらいが一般だそうです。
なにかしらの市場価値のある方は違うと思いますが、全くの未経験での話
ただ、就活して思ったのは「一年の実務経験」があれば好条件なものはある
という事、一年フルコミットで転職もあり！？

### 転職後も勉強は継続
先にも書きましたが１年で言語の価値が変わる世界らしいので日々勉強が必要だそうです。
仕事終わって勉強！休日も勉強！という感じかもしれません。


# 良かったの？まとめ
### 現段階では判断できず！
学習を行う日々は苦しいながらも充実しておりました、チームメイトとも卒業後の今でも週イチでみんなでZOOMしてます。
自己研鑽の期間約３ヶ月と約90万を投じたこの投資はどの位の価値を産むのか。
現段階では判断しかねます！これからの頑張り次第なのでしょうね！
お目汚しすいません、ご拝読ありがとうございました。
LaTeX小技

# はじめに
この記事は，そりゃそうだろって感じなのですが，ちょっと役に立つ（かもしれない）ことを書いています．
当然と言えば当然なのですが，いざ気づくと「それ便利だなぁ～」と感心してしまったのでまとめておきます．
参考にする人は参考にしてください

# 字体を定義しなおす
数式をたくさん入れるとき，\mathrm{d}や\mathrm{T}と打つのもめんどくさい！
そんなときに\rmdや\rmTで定義しておくとすぐに打てて便利です

# プリアンブルをスタイルファイルでまとめる
プリアンブルをまとめたスタイルファイルを作ってみてはいかがでしょうか？
コピペで新しいファイルを作るちょいダサ行為をしなくても，新しいTeXファイルを作れるようになります

# 行列作成にbmatrixを使う
私はこれまで行列は\left[\right]とarrayを使っていたのですが，それを一括でやってくれるものを見つけました
それがbmatrixです．
とっても便利なのでぜひ使ってみてください．

# 終わりに
初歩も初歩のことばかりで学びはあまりなかったかもしれません．
しかも，書いてみるとそこまで項目もなかったですね．
まぁどこかの誰かの役に立てば幸いです．
形態素解析（mecab - NEologd）

#背景
Twitterのテキスト分析に向けた形態素解析の練習。
mecabに新規辞書（NEologd）を導入して、ネットやSNS上での使用頻度が高い固有名詞を識別できるか確認。

#環境
Mac OS Catalina
Python 3.8.3
（mecab自体はインストール済）

#mecab-ipadic-neologd
##辞書インストール
以下、GitHubに記載の手順に従い、ターミナルで実行。
[GitHub_mecab-ipadic-neologd](https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md "mecab-ipadic-neologd")

* git clone
* 
```
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
```

* 以下を実行して、結果確認で"yes"を入力
初回インストール完了後は、同様の手順で最新版辞書に更新

```shell
$ ./bin/install-mecab-ipadic-neologd -n
```

##実行結果
コード

```python:test.py
import neologdn
import MeCab

text="天気の子を見た"

neologd_tagger = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
print(neologd_tagger.parse('天気の子を見た'))
```

出力

```
天気の子	名詞,固有名詞,一般,*,*,*,天気の子,テンキノコ,テンキノコ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見	動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
```

##mecab-IPAdicとの比較
コード

```python:test2.py
import neologdn
import MeCab

text="天気の子を見た"

neologd_tagger = MeCab.Tagger()
print(neologd_tagger.parse('天気の子を見た'))
```
出力

```
天気	名詞,一般,*,*,*,*,天気,テンキ,テンキ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
子	名詞,一般,*,*,*,*,子,コ,コ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見	動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
```
「天気の子」が固有名詞として認識されていない。

#参考にさせていただいた記事
1. [2019年末版 形態素解析器の比較](https://qiita.com/hi-asano/items/aaf406db875f1c81530e)
2. [Mac に MeCab と NEologd 環境の構築と辞書のカスタマイズ](https://hakasenote.hnishi.com/2020/20200721-mecab-custom/)
3. [mecab + NEologd + python3 で形態素解析](https://qiita.com/sudo5in5k/items/f89d9dc1bec1ed221ede)