OmniAICreator/Qiita-1.07M huggingface dataset:
全力回避フラグちゃん!のチャンネルの人気は本当にほぼフラグちゃんで成り立っているのか？【検証】【可視化】

# はじめに

[【特別編】登録者争奪バトル#03「大混戦」【Plottコラボ】【アニメ】](https://www.youtube.com/watch?v=j_b7quWBJ70) の生存フラグさんの発言 (11:02-11:05) にて，全力回避フラグちゃん! のチャンネルの人気がほぼ死亡フラグで成り立っているという発言を受け，実際どのくらいチャンネルの人気を担っているのかを数字化してみたかったので，本記事を作成しました．

予想としては9割9分程度だと思っています．

今まで書いた記事はこちら↓↓
- [「全力回避フラグちゃん!」チャンネルの動画をグラフ化するとどうなるのか？【Python】【グラフ化】](https://qiita.com/mypsychology0/items/7f5dace26c4c375754e5)
- [全力回避フラグちゃん! の動画再生数の分布を調べてみた【Python】【グラフ化】](https://qiita.com/mypsychology0/items/1844f675717025970325)
- [全力回避フラグちゃん!の動画の再生数と評価/コメント数をグラフにしたらどうなるのか？【Python】【グラフ化】](https://qiita.com/mypsychology0/items/409e0597509e568b60aa)
- [全力回避フラグちゃん!で少しわかるYouTube Data API Channels リソースから取得できる主な情報](https://qiita.com/mypsychology0/items/f161fef45ee6a02ef9fa)


## 注意事項
2021/1/10 18:30時点で取得した情報を利用しています．
出現のカウントは，目視でやっています．基準は上記過去記事の「全力回避フラグちゃん!」チャンネルの動画をグラフ化するとどうなるのか？【Python】【グラフ化】に書いています．
<b>データを取得及び，データセットを自動作成するプログラムを使用しています．関連リンクのGithub に用意していますので，ご自由にご使用ください</b>

# 用いたデータセット/手法

YouTube Data API のVideos リソースを使用し，2021/1/10 18:30時点において，全力回避フラグちゃん! のチャンネルにアップロードされている全225本の動画再生回数を取得し，あとは全動画を見て各3フラグの登場を各動画と並べます．
そして，再生回数で人気の割合を計算していきます．複数のフラグが登場している回は，その再生回数を登場しているフラグの数で割ります．

例えば，フラグちゃん単独回で再生回数が30万ある場合は，フラグちゃんに30万ポイント追加，フラグちゃんと生存フラグさんが登場している回で50万回再生の場合はフラグちゃんと生存フラグさんに25万ポイント追加，全員が登場して90万回再生の場合は全員に30万ポイント追加...という形で計算していきます．
1ポイント = 1再生回数  です．

最後に，積み重なったポイントをチャンネルの再生回数で割れば，各フラグがどのくらいチャンネルの人気を担っているかの割合が計算できるという形です．

なお，集計時点でのチャンネルの再生回数は1億7533万9459回です．

# 集計結果

集計結果です．分類は下記の7通りになります．

|No.|分類  |回数 | ポイント (再生回数) |
|:-:|---|:-:|:-:|
|1| 死亡フラグちゃん 単独 | 175 | 135,636,416 |
|2| 生存フラグさん 単独 |5 |4,762,163 |
|3| 恋愛フラグさん 単独 | 4 | 2,088,986 |
|4|死亡フラグちゃん & 生存フラグさん|24|20,550,308|
|5|死亡フラグちゃん & 恋愛フラグさん|4|2,578,599|
|6|生存フラグさん & 恋愛フラグさん|1|397,658|
|7|全フラグ登場|12|9,385,329|
|-|合計|225|175,339,459|

これを先ほどの計算方法でポイントを計算していくと，結果は下記の通りになります．
おまけで，225話の中でどれだけの割合登場しているかも書いています．この数字は重なっている部分があるので，全部足した場合割合は100 を超えます．

|No.|分類  |ポイント (再生回数) |人気の割合 [%]|登場割合 [%]
|:-:|---|:-:|:-:|:-:
|1| 死亡フラグちゃん  | 150,329,313 |85.71|95.56|
|2| 生存フラグさん  |18,364,589 |10.47|18.67 |
|3| 恋愛フラグさん   | 6,705,558|3.82|9.33|

## 結果のグラフ化

上記の結果をグラフにしました．

![全力回避フラグちゃん人気割合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989429/200e004f-9ed1-d64b-eb32-2dc8a93a75f0.png)

# 簡単なまとめ
- 登場回の再生回数で集計したら，フラグちゃんはチャンネルの人気の割合を85 % 以上担っているのが分かった
- チャンネル登録者数に換算すると，約 371,124 人以上はフラグちゃんのファン (現在433,000人)
- 生存フラグさんの言う通り，ほぼ(8.5 割以上)チャンネルの人気を担っていた (予想よりは少なかった)
- 生存フラグさんも1割以上人気を担っているのが分かった
- フラグちゃんは95 % 以上の確率で話に登場していた

# 今後の予定
他にも気になることがあったら，可視化していく予定です．

# 今回紹介した動画
- [【特別編】登録者争奪バトル#03「大混戦」【Plottコラボ】【アニメ】](https://www.youtube.com/watch?v=j_b7quWBJ70)

# おわりに

ここまで読んでいる人はいないと思いますが，もしいたらまずは，以下のリンクから<b>全力回避フラグちゃん!</b> チャンネルとフラグちゃんのTwitter をフォローしてください．この記事を読むより大切なことです．
大事なことなのでもう一度，<b>チャンネル登録</b>と<b>Twitter のフォロー</b>をよろしくお願いいたします．

...だれか忘れてる？

# 関連リンク
- YouTube Data API Channels リソース  https://developers.google.com/youtube/v3/docs/channels?hl=ja
- 全力回避フラグちゃん! https://www.youtube.com/channel/UCo_nZN5yB0rmfoPBVjYRMmw/videos
- 株式会社Plott / Plott Inc. https://plott.tokyo/#top
- フラグちゃんのTwitter https://twitter.com/flag__chan
- Github  https://github.com/uky007/flag_analysis
Ubuntu 20.04 RTX 3090 cuda cuDNN driver インストール備忘録

Ubuntu 20.04 RTX 3090 cuda cuDNN driver インストールの備忘録です。


2022/6/5 Docker Ver　https://qiita.com/Hachimaki/items/5e7b1245bb15cef5bf9a メモ作りました。

#実施した手順
　1) PytorchのHPで、cudaのVersionチェック　→cuda 11.0にした。

　2) nouveauを無効化
   /etc/modprobe.d/blacklist-nouveau.conf をつくって、
　　blacklist nouveau
　　options nouveau modeset=0　を書く。

　　sudo update-initramfs -u
　　sudo reboot
　　で適用

https://k-hyoda.hatenablog.com/entry/2020/07/09/223907

　3)　cuda Toolkit 11.0　を サイトにしたがってインストール
　　ただし、最後
　　　sudo apt-get -y install cuda
　　　は、
　　　sudo apt-get -y install cuda-11-0

https://developer.nvidia.com/cuda-11.0-update1-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=2004&target_type=deblocal

　4)　cuDNNのバージョンをAmpereとcuda11.0から　8.05にした。
　https://docs.nvidia.com/deeplearning/cudnn/support-matrix/index.html

　5)　cuDNN8.05　for cuda11.0を　サイトからダウンロード
　https://developer.nvidia.com/rdp/cudnn-download

　6)　cuDNNをサイトにしたがって、dpkg インストール
　https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#installlinux-deb

　7) .bashrcにパスを書く
　　export PATH="/usr/local/cuda/bin:$PATH"
　　export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"

　　source ~/.bashrc
   で適用する。


　8)　最新のDriverをインストール　ここでは、　460
         sudo apt install nvidia-driver-460

libnvidiaがじゃましてインストールできないとエラーがでたら、
sudo apt-get purge libnvidia*
で削除。


　9)　python　で　
　　　import torch
     torch.cuda.is_available()
     を入力して、
　　　True
     が出ることを確認



# Driver cuda cuDNN 削除
sudo apt-get purge 'nvidia-\*'
sudo apt-get purge 'cuda-\*'
sudo apt-get purge "libcudnn8\*"
sudo apt autoremove
sudo apt update
sudo apt upgrade

https://contentsviewer.work/Master/Ubuntu/Install/nvidia-tf/nvidia-tf




# その他参考
STM32 nucleoを使う (6) タイマー


#はじめに
組込み系ではタイマーが必要不可欠です。まずタイマー割り込みを使って周期的な動作をさせてみます。

#タイマーの種類
STM32には多くのタイマーが搭載されています。
高機能タイマー　TIM1/TIM8/TIM20
汎用タイマー TIM2/TIM3/TIM4、TIM16/TIM17
基本タイマー TIM6/TIM7
タイマー割り込みであれば基本タイマ―を使うのが簡単です。

#基本タイマ
基本タイマのTim7を使ってみます。
10ms毎にタイマー割り込みを発生させ、1秒毎にLED出力を反転させます。
Tim7はAPB1の配置されているのでクロックはTIM1CLKになります。クロックをプリスケーラ―で分周しカウンタ値と一致すると割り込みを発生させます。
![V004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68712/c5a599b8-4c70-f122-0cc0-b02300613047.png)

##CubeMx設定
Clock Confiigurationタブを選択しクロック設定を表示させます。
クロックの設定を確認します。APB1のタイマークロックは72MHzです。
![V002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68712/1d383cf9-6558-b688-ca2f-c309c03ede1b.png)

Pinout & Configurationを選択し、Timersを広げ、TIM7をクリックします。
まずModeのActivatedにチェックを入れます。
Parametar Settingsタブを表示します。

10msを作るにはいくつカウントさせればよいかというと

```math
\frac{10ms}{\frac{1}{72MHz}}=720000
```

プリスケーラの値を64とすると

```math
\frac{720000}{64}=11250
```

カウンタは0から始まるので1を引いた値11249となります

Prescalerに64、Counter Periodに11249を設定します。
![V001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68712/c5c9804f-7050-fc03-0302-f1eab6422e76.png)

割り込みを有効にします。NVIC Settingタブを選択し、TIM7 global interruptのEnabledにチェックを入れます。
![V003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68712/b5efded8-0b5c-a80d-f8be-04ae9b7807f3.png)


##割り込みハンドラー
割り込みの種類がtim7によるものかチェックします。
カウンタをインクリメントし100を超えたらLED出力を反転させます。

```C++
/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
	static unsigned char count = 0;

	if(htim == &htim7) {
		count++;
		if (count >= 100) {
			HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
			count = 0;
		}
	}
}
/* USER CODE END 0 */
```
Tim7の初期化終了後にHAL_TIM_Base_Start_IT()を呼びTim7を実行させます。

```C++
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_TIM7_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim7);	/* tim7 Start */
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
```
1秒毎にLEDが点滅します。
STM32の使い方を学習した内容をまとめています。内容に不備等ありましたら連絡お願いします。
pangolin x python x mac os build failed 備忘録　未解決

## 概要
pangolin https://github.com/stevenlovegrove/Pangolin
をmac でpythonbindingをつかってビルドしようと思いましたが、解決できないエラーに悩まされました。


## メモ１
https://github.com/stevenlovegrove/Pangolin
ここから普通にpython3.6系を使い、ビルドしようとした時のこと。

ffmpeg に関するエラーが出たので、まずはcmake のフラッグで
`-DBUILD_PANGOLIN_FFMPEG=OFF`
を用いた。
もしくは、`CMakeModules` フォルダの中の`FindFFMPEG`をいったん退避させてみた。

その後、`cmake --> make -j`  にて


```
[  0%] Building CXX object src/CMakeFiles/pangolin.dir/display/display.cpp.o
[  1%] Building CXX object src/CMakeFiles/pangolin.dir/video/video.cpp.o
[  2%] Building CXX object src/CMakeFiles/pangolin.dir/fonts.cpp.o
[  2%] Linking CXX shared library libpangolin.dylib
Undefined symbols for architecture x86_64:
  "_libintl_bind_textdomain_codeset", referenced from:
      _PyIntl_bind_textdomain_codeset in libpython3.6m.a(_localemodule.o)
  "_libintl_bindtextdomain", referenced from:
      _PyIntl_bindtextdomain in libpython3.6m.a(_localemodule.o)
  "_libintl_dcgettext", referenced from:
      _PyIntl_dcgettext in libpython3.6m.a(_localemodule.o)
  "_libintl_dgettext", referenced from:
      _PyIntl_dgettext in libpython3.6m.a(_localemodule.o)
  "_libintl_gettext", referenced from:
      _PyIntl_gettext in libpython3.6m.a(_localemodule.o)
  "_libintl_setlocale", referenced from:
      _PyLocale_setlocale in libpython3.6m.a(_localemodule.o)
  "_libintl_textdomain", referenced from:
      _PyIntl_textdomain in libpython3.6m.a(_localemodule.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [src/libpangolin.dylib] Error 1
make[1]: *** [src/CMakeFiles/pangolin.dir/all] Error 2
make: *** [all] Error 2

```

このエラーが解決できない。



## メモ２
https://github.com/uoip/pangolin
このレポジトリを使い、同じようにビルドを試した。
ffmpegに関してはメモ１にあるように対処した。

その際、
https://github.com/uoip/pangolin/issues/35
ここと同じ問題が発生したため、
ここで提案されているようにinclude のパスを全て絶対パスで上書きした。
（`eigen, gl` で同じように対応）
その後、ビルドは通り、`pangolin.cpython-36m-darwin.so`
が生成されたものの、インポートの際に

https://github.com/uoip/pangolin/issues/26
ここにあるようにセグフォ(11)した。


## メモ３
ubuntu18系でも試したところ、Pangolinはビルドがうまくいき、importも問題なくできた。
しかしながら、同様にビルドしたかった`g2opy`がこちらではビルドできず、(macではこちらはビルドできる、、)
いったん断念。


以上`pangolin` のビルドに関する備忘録。
Unityでドット絵を拡大してぼけてしまったときの対処法


#はじめに
ドット絵でゲーム制作をしているときに、ドット絵がぼけてしまったときの対処法を自分なりにまとめてみました。

#環境
unity 2019.4.17f1
windows10
#やったこと
![Inkedスクリーンショット 2021-01-11 132106_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866543/0168bce6-47b9-de25-43bb-d2e85fc4bc1f.jpeg)
上の画像の赤線の部分の<font color = " Red"><strong>フィルターモード</font>と一番下から二番目の<font color = "Red"><strong>圧縮</font>を変更します。
##それぞれ変更するとどうなるのか
<font color = "Red"><strong>フィルターモード</font>をバイリニアからポイントなしに変更するとドット絵を拡大した場合にその絵がぼけなくなります。
<font color = "Red"><strong>圧縮</font>を変えると拡大した場合などに色が汚くなる部分がなくなります。(自分でも説明しづずらいので、あとで比較するところを見れば言ってることがわかると思います。)

##実際に比較してみる
![スクリーンショット 2021-01-11 135640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866543/c12cb28a-5fbb-fa3b-c69d-446358324f66.png)
上の画像は32*32で作ったハートのドット絵をunityで10倍にしたものを比較しています。
一番左のなにもしていないとドット絵はぼけていてそして色もなんか汚くなっている部分があります。
真ん中の圧縮の部分だけを変更すると色は治りましたが、ドット絵がぼけています。
一番右の圧縮とフィルターモード両方変更するとドット絵も鮮明に見え、色も汚くなっていません。

#最後に
今回は私がドット絵をやるうえで役に立ったことをまとめてみました。
twitterやってます。是非フォローお願いします。
url →　https://twitter.com/Upon08126956
gradleプロジェクトでバージョンを自動指定

# 背景

Javaプロジェクトを開発している時に、今まではリリースのたびにbuild.gradleのversionを書き換えていました。こういう感じのやつですね。

```
version = '1.2.0'
```

この運用だと、以下の点で問題がありました。

- リリースの度にbuild.gradleに対して変更が必要。場合によってはコンフリクトの原因にもなる。
- リリース後に再びbuild.gradleのversionにバージョンを上げて-SNAPSHOTを付ける必要がある（例：1.2.0をリリースしたら、1.3.0-SNAPSHOTに変更する）。これを忘れてpublishすると、リリースしたバージョンが上書きされてしまうので。
- 新しいブランチで開発中に、連携テストをするため暫定的にリリースしたい場合、build.gradleでユニークなバージョンを指定してpublishする必要がある。
- ローカルにコミット漏れがある状態でリリースしてしまったことがある。

最初、`build.gradle`内でgitコマンドを利用できる[grgitプラグイン](http://ajoberstar.org/grgit/grgit-describe.html)を利用して簡単なスクリプトを書こうと思ったのですが、コード量が膨らみそうになりました。そこで、自前のプラグインを書こうか考えていたところ、[nebula-releaseプラグイン](https://plugins.gradle.org/plugin/nebula.release)というものを見つけました。非常に機能が豊富そうだったので、これを利用してこの問題を解決することにしました。

# build.gradleの設定
nebula-releaseプラグインに関する説明は[nebula-release-pluginリポジトリ](https://github.com/nebula-plugins/nebula-release-plugin)にあります。プラグインの適用は、build.gradleに以下の設定を追加します。設定は他にも色々あるのですが、まずはこれだけ。

```
plugins {
    id 'nebula.release' version '15.3.1'
}
```

# ビルドしてみる
## 開発時
まずは`./gradlew build`を実行してビルドしてみます。すると、以下のファイルが生成されました。

```
$ ls build/libs/
nebula-test-0.1.0-dev.3+618c605.jar
```

この命名については、[Tasks Provided](https://github.com/nebula-plugins/nebula-release-plugin#tasks-provided)に記載されており、プロジェクト名の後ろに`<major>.<minor>.<patch>-dev.#+<hash>`が付いています。`#`が前回リリースからのコミット数、`hash`がコミットのハッシュ値の一部となっているため、コンフリクトを起こすことはまずありません。また、コミットされていないファイルがある場合は、`nebula-test-0.1.0-dev.3.uncommitted+618c605.jar`のように`uncommitted`が自動的に付与され、この状態ではリリースできないようになっています。

本番環境ではなく開発環境にデプロイしたいような場合に、先ほどのユニークなバージョンではなくSNAPSHOTバージョンでビルドしたい場合は、`./gradlew build snapshot`を実行します。

```
$ ls build/libs/
nebula-test-0.1.0-SNAPSHOT.jar
```

## リリース時
リリース時には、`final`パラメタを追加します。こうすると、「プロジェクト名＋バージョン」のみが付いたファイル名が生成され、現在のバージョンでタグ付けされます。

```
$ ./gradlew final
Inferred project: nebula-test, version: 0.1.0

> Task :release
Tagging repository as v0.1.0
Pushing changes in [v0.1.0] to origin

BUILD SUCCESSFUL in 6s
7 actionable tasks: 4 executed, 3 up-to-date
$
$ ls build/libs/
nebula-test-0.1.0.jar
```

次に再度`./gradlew build`を実行すると、次のマイナーバージョンで生成されます。

```
$ ls build/libs/
nebula-test-0.2.0-dev.0+726f7c6.jar
```

## メジャーバージョン・パッチバージョンのリリース
特にパラメタを指定せずにリリースする場合はマイナーバージョンを上げてリリースされますが、メジャーバージョンやパッチバージョンを上げたい場合は、それぞれ以下のようにパラメタを指定します。

- メジャーバージョン：`./gradlew final -Prelease.scope=major`
    - 例：0.3.0 -> 1.0.0
- パッチバージョン：`./gradlew final -Prelease.scope=patch`
    - 例：0.3.0 -> 0.3.1

# その他メモ
nebulaプラグインを使っていて気付いた点を共有します。

## リリース時にpublishも行う
`build.gradle`に以下の行を追加して、依存関係を加えます。

```
tasks.release.dependsOn tasks.publish
```

複数のサブプロジェクトから成る場合はこのような感じで。

```
tasks.release.dependsOn ":sub1:publish", ":sub2:publish", ...
```

## タグ名のプレフィックスを除く
`./gradlew final`でリリースする際、通常は`v1.2.0`のように先頭に`v`が付くのですが、これを付けたくない場合は`build.gradle`に以下の行を追加します。

```
project.release.tagStrategy.prefixNameWithV = false
```

## AWS CodeBuildとの連携
nebulaプラグインはgitの履歴から最新のタグを探すため、必ず全てのgitの履歴が必要となります。もし[AWS CodeBuild](https://aws.amazon.com/jp/codebuild/)を利用している場合は、ソースの設定の「Gitのクローンの深さ」で`Full`を指定することで正しくバージョンを取得することができます。
![depth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377165/7aba5964-30f3-ef9c-21a5-31ff8c34a918.png)
fbterm で PDF を眺める

# fbterm で PDF を眺める

`w3m` (`w3m-img`) はインライン画像を表示することができます． __jfbterm の上で__． と思っていたら最近は fbterm の上でも表示できるようです． ありがたい．

`ranger` はそんな `w3m` の力を借りて画像のプレビューができます． 設定ファイルを少しいじれば pdf や動画ファイルのプレビューもできます．

![sc1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305403/2f68a1d8-91a8-144d-df0f-27e18ce1a53c.png)
![sc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305403/bf425202-c0b9-a4df-92a0-02380741936e.png)



## ということは

`ranger` は PDF を表示できるので私たちにもきっとできます． まずは PDF を画像にします．

`ranger` はどのようにして PDF をプレビューしているのでしょうか． その答えは **$HOME/.config/ranger/scope.sh** にあります． そんなファイルがない場合は `ranger --copy-config=all` してください． 162 行目辺りに次のようにあります:

```:$HOME/.config/ranger/scope.sh&nbsp;(162)
## PDF
application/pdf)
    pdftoppm -f 1 -l 1 \
    ...
```

なるほど PDF を画像に変換するには `pdftoppm` を使うようです． 詳しい使い方は `man pdftoppm` で得られます． 得てください．

```:PDF&nbsp;を画像に変換するコマンド
$ pdftoppm -png ＰＤＦファイル名 画像ファイルのプレフィクス
```

## 画像 (と化した PDF) を表示する

`w3m` はインライン画像を表示できるので `w3m` のために HTML を書きます． しかし彼は css を読めないことに気をつけてください． HTML 4.01 Transitional 以下で書きましょう．

```html:w3m&nbsp;のための&nbsp;HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>ほげほげ.pdf</TITLE>
</HEAD>
<BODY>
<CENTER>
<DIV><IMG SRC="path/to/image/page-01.png" WIDTH="80%"></DIV>
<DIV><IMG SRC="path/to/image/page-02.png" WIDTH="80%"></DIV>
...
</CENTER>
</BODY>
</HTML>
```

そしてこの HTML を `w3m` で読めば画像に変換された PDF を眺めることができます．

![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305403/04be8a24-c6e4-48fb-58b1-2979eb08eb31.gif)

## 面倒なんじゃい

私たちはなんとか PDF を眺めることができました． しかし PDF を眺めたいと思うたびにこの操作を行うことはとても面倒です． 私たちにできる大抵のことはコンピュータにもできます．

次のようなシェルスクリプトを書きます． ファイル名は __PDF-wo-Miru__ (PDF を見る) から **pdfm.sh** です．

```sh:pdfm.sh

#!/bin/sh

if [ $# -ne 1 ]; then
	echo "Usage: `basename $0` pdf-file"
	exit 1
fi

TEMPDIR=`mktemp -d`
TEMPBASE="$TEMPDIR/pdfm"
TEMPHTML=`tempfile -s.html`

pdftoppm -png $1 $TEMPBASE

cat << EOF > $TEMPHTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>$1</TITLE>
</HEAD>
<BODY>
<CENTER>
EOF

find $TEMPDIR/*.png | sort | while read line
do
	echo "<DIV><IMG SRC=\"$line\" WIDTH=\"80%\"></DIV>" >> $TEMPHTML
done

cat << EOF >> $TEMPHTML
</CENTER>
</BODY>
</HTML>
EOF

w3m $TEMPHTML

rm -rf $TEMPHTML $TEMPDIR
```

完成したら `make pdfm` と実行して，生成された **pdfm** を **$HOME/bin/** あたりにぶち込んで置きましょう．

---

## おわりに

おわりです．
Blenderのテキストエディッタで日本語コメントを入力する

BlenderのWindows環境ではテキストエディットではUnocodeの日本語表示はできるものの
インラインでの日本語入力はできるようになっていません。

アドオンの開発等では通常は他のエディッタを使うことが多いのであまり問題にはならないものの
ちょっとしたテスト用のコードを書いたり、メモ書きをするときに日本語入力ができないのは不便に感じたので
開いているテキストの　選択行の末尾にコメントとしてマルチバイト文字を入力できるアドオンを作ってみました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/c26e5d0b-ca91-1562-eed2-e37479bd3aa6.png)
テキストタブにImput Multibyte Comment というパネルと入力欄を追加します
（パネル等ではWindows環境でも日本語入力ができるため。Macではここも入力に対応しないはず）

```py:y_TexteditInputComment.py
bl_info = {
    "name" : "Input multibyte character Comment",
    "author" : "Yukimituki",
    "description" : "",
    "blender" : (2, 80, 0),
    "version" : (0, 0, 1),
    "location" : "",
    "warning" : "",
    "category" : "Generic"
}

import bpy
import os
from bpy.props import StringProperty, FloatVectorProperty, BoolProperty

class TEXT_PT_ImputComment(bpy.types.Panel):
    bl_label = "Input Multibyte Comment"
    bl_space_type = 'TEXT_EDITOR'
    bl_region_type = 'UI'
    bl_category = "Text"
    
    # 描画の定義
    def draw(self, context):
        layout = self.layout
        layout.prop(context.scene, "textedit_comment_txt")
        row = layout.row()
        row.operator("comment.imput")

class TEXT_OT_textimput(bpy.types.Operator):
    bl_idname = "comment.imput"
    bl_label = "imput comment"
    def execute(self, context):
        text = context.space_data.text
        if not text:return {'FINISHED'}
        bpy.ops.ed.undo_push() #アンドゥが効くように現在の状態を記録
        # 選択部分の最終行の取得
        end_line = text.select_end_line_index
        input_text = context.scene.textedit_comment_txt
        text.lines[end_line].body += "# %s" % (input_text)
        return {'FINISHED'}


classes = (
    TEXT_PT_ImputComment,
    TEXT_OT_textimput,
    )

    
#####################################
def register():
    Scene = bpy.types.Scene
    Scene.textedit_comment_txt = StringProperty(name='text')
    for cls in classes:
        bpy.utils.register_class(cls)


def unregister():
    Scene = bpy.types.Scene
    del Scene.textedit_comment_txt
    for cls in reversed(classes):
        bpy.utils.unregister_class(cls)


if __name__ == "__main__":
    register()
#######################################
```

動くのを確認した程度のシンプルなものですが　何かの手助けになれば幸いです
Let's Encrypt SSL化(apache) がQiitaで検索した手順通りで進めても一時ファイル作成するコマンドで落ちる

# Apacheサーバーをssl化
Apacheサーバーをssl化したくてググってたらまぁいっぱい記事が出てきてたから、
あーこれ余裕ー ( ´_ゝ`)フーン
とかって思ってたら割と時間溶かしたのでメモ。

![スクリーンショット 2021-01-11 13.34.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/a69347b9-7ec0-871e-0957-85ae99bcd486.png)

## 問題点
certbotの導入は色々な記事に載ってるので、調べれば素晴らしい記事がいっぱい出てくると思います。自分はこちらを参考にさせていただきました。感謝

[Let's Encryptで無料SSL化(apache)](https://qiita.com/JXnj8uVrUkiBh90/items/761545587cdb263c6479)

## 記事通り進めたけど。。。`Type: unauthorized`エラーが出る。。。

色々な記事で紹介されている通り、こんな感じのコマンドをうつ。
そうすると指定されたドキュメントルート（アプリのメインルート）に一時ファイルが作成されてそのファイルに80番ポートからアクセスできるかを確認してアクセスできたらOKということで認証完了するみたいだけれどもここがなぜかできない。

```bash
$ certbot certonly –webroot -w [ドキュメントルート] -d [SSLをかけたいドメイン・URL] –email [メールアドレス]
```

しかし！`Type: unauthorized`が出て先に進めない。

```
Domain: mydomain.com
Type:   unauthorized
Detail: Invalid response from
http://mydomain.com/.well-known/acme-challenge/rwH-dBrZhXrgii7uiGmccp8GFMOdv1RRRHrBSVfkWuU


To fix these errors, please make sure that your domain name was
entered correctly and the DNS A/AAAA record(s) for that domain
contain(s) the right IP address.
```

# 解決方法

@s-katsumataさんの記事に書いてあったもので解消できました。ありがとうございます。mm

[certbot(LetsEncrypt)でエラー/Invalid response from](https://qiita.com/s-katsumata/items/2286052aa8d375c26a39)

`--webroot`でなく`--apache`オプションを付与して証明書を再取得するだけ。これだけで本当にいけた！


```bash
$ certbot certonly --agree-tos --non-interactive -d [ドメイン名] --webroot -w [ドキュメントルートのパス] --email [管理者のメールアドレス]
```

を

```bash
certbot certonly --agree-tos --non-interactive -d [ドメイン名] --apache -w [ドキュメントルートのパス] --email [管理者のメールアドレス]
```

に変えたらできました。


## LGTM第一号、わーい
個人的にはLGTMってちょっと上から目線なのであまり好きではありませんが、まぁこれしかないので許してください。mm

LGTMをTYFUGQ(Thank You for Your Great Qiita)とかにして欲しい。
なげえかw
じゃあ、THXで（Thank you!/Thanks!!）がいいかな

![スクリーンショット 2021-01-11 13.43.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/50d069b2-330d-0bdc-643e-449888699ca3.png)

# はてなブログ
こっちでもなんか書いてるよー
**勉強したことについてまとめるサイト**
- 勉強したことをまとめるだけのサイト、数学、プログラミング、機械学習とか - 
https://learn-programing.hatenablog.jp/
【JavaScript】addEventListenerの使い方

#プログラミング勉強日記
2021年1月11日
今日はaddEventListenerの使い方を簡単にまとめる。

#addEventListenerとは
　マウスによるクリックやキーボードからの入力といった様々なイベント処理を実行するメソッド。
　一般的な書き方は、イベントの種類と実行するための関数を指定する。第1引数にイベントの種類、第2引数に関数、第3引数にイベント伝搬の方式をtrueかfalseで指定する。第3引数は通常はfalseを指定する。

```js:基本的な書き方
対象の要素.addEventListener(種類, 関数, false);
```

##外部の関数を設定する
　関数をイベント処理の外側で定義する。関数内の処理が複雑な場合やファイルが複数に分かれている場合に使われる。

```js
対象の要素.addEventListener(種類, 関数, false);

function sample() {
  // 処理を記述
}
```

##無名関数を設定する
　一般的に使われる方法で、第2引数にそのまま関数を記述する。単純な処理を記述する場合によく使われる。

```js
対象の要素.addEventListener(種類, function() {
  // 処理を記述
}, false);
```

##アロー関数を設定
　無名関数をES2015の書き方にしたパターンである。

```js
対象の要素.addEventListener(種類, () => {
  // 処理を記述
});

```

#イベントの種類


| イベント種類 | 内容 |
|:--:|:--:|
|load | Webページの読み込みが完了したとき（画像などのリソースすべて含む）|
| DOMContentLoaded | Webページが読み込みが完了したとき（画像などのリソースは含まない） |
| click | マウスボタンをクリックしたとき |
| mousedown | マウスボタンを押しているとき |
| mouseup | マウスボタンを離したとき |
| mousemove | マウスカーソルが移動したとき |
| keydown | キーボードのキーを押したとき |
| keyup | キーボードのキーを離したとき |
| keypress | キーボードのキーを押しているとき |
| change | フォーム部品の状態が変更されたとき　|
| submmit | フォームのsubmitボタンを押したとき |
| scroll | 画面がスクロールしたとき |

#サンプルコード
　クリックイベント処理の簡単なサンプルコード

```html
<!DOCTYPE html>
<html>
  <body>
 
    <h1 id = "idName">クリック前</h1>
    <button id = "btn">クリック</button>
 
    <script>
	  var btn = document.getElementById('btn');
 
	  btn.addEventListener('click', function() {
		var mydiv = document.getElementById("idName");

		mydiv.innerHTML = "クリック後";
  
      }, false);
    </script>
 
  </body>
</html>
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/c370b24a-802b-eb61-3703-60afc54285df.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/8bda0719-17f2-9d8a-0506-9bf232a78222.png)


#参考文献
[【JavaScript】addEventListenerで関数に引数をわたす](https://note.com/yamanoborer/n/n2e4cc40328b7)
[【JavaScript入門】addEventListener()によるイベント処理の使い方！](https://www.sejuku.net/blog/57625)
【Workato】MS Teams Workbotからダイレクトメッセージを送信する

#Teams Workbotからユーザにダイレクトメッセージを送る方法
先日WorkbotからユーザへのDM(Teamsのbotの用語だとProactive messaging)がWorkatoでサポートされたので、試してみました。
TeamsでDMのサポートをしたiPaaS製品はWorkatoが初？なのではないかと思います。(PowerAutomateを除いて)
[ドキュメントのページ](https://docs.workato.com/workbot-for-teams/proactive-messaging.html)

##Get user by User Principal Nameアクション
今回追加されたのがこの「Get user by User Principal Name」アクションです。
![スクリーンショット 2021-01-11 12.42.00（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/20faa659-025f-ecab-c810-d2898040b579.png)

このアクションはメールアドレスを入力するとそのユーザ情報が取得できるというものです。

##使い方
まず、通知したいユーザのメールアドレスを入力します。今回はServicenowのチケットの担当者のメールアドレスを入れておきます。
![スクリーンショット 2021-01-11 12.45.23（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/453cbb4f-bbfd-d420-5410-926de95a6d0d.png)

その下にTeamsにメッセージをポストするアクションを追加します。
そのとき、「Message Recipient」（メッセージ受信者）の入力タイプを「Enter custom value」に切り替えます。
![スクリーンショット 2021-01-11 12.48.57（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/526c8b06-a9b4-1912-c504-02958b6b6dd9.png)

そのフィールドに「Get user by User Principal Name」アクションで得られる`ID`というデータピルを入力すれば、そのユーザにダイレクトメッセージが送信されます。
![スクリーンショット 2021-01-11 12.49.09（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/b2f570cc-7321-7c24-4572-8be5672980ec.png)

##追記
Custom OAuth profileを使ってカスタムWorkbotを使ってる場合、Custom OAuth profileの`Application ID`を追加しなければいけません。
![スクリーンショット 2021-01-11 22.30.33 1（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/5250f875-5698-5d08-fa65-4e72509941d9.png)
crontabでdocker-compose execを実行すると"the input device is not a TTY"が出る

## 解決策
-Tのオプションを使う

### 問題があった時の設定
```
0 4 * * * docker-compose exec {container_name} {some_command}
```
### 解決後の設定
```
0 4 * * * docker-compose exec -T {container_name} {some_command}
```

### 原因
よくはわかっていないが、docker-compose execはデフォルトで擬似ttyが割り当てられてしまう。
それを解除するオプションが `-T`とのこと。

> -T
Disable pseudo-tty allocation. By default `docker-compose exec`allocates a TTY.

### 参考
https://docs.docker.com/compose/reference/exec/
Javaインストール後の実行環境テスト

# 最終確認
インストール、Version確認後
VSCordでフォルダを作成し、期待する結果が出力されるまでテストする
[Javaの環境構築はこちら](https://qiita.com/coxcoa/items/73162a55d9fda61fc1bd)

# 実行環境テスト

```
# テスト用ディレクトリを作成
$ mkdir -p ~/java/test

# ディレクトリへ移動
$ cd ~/java/test

# テスト用のファイルを作成
$ touch test.java

#　テスト用のファイルを編集
$ vi test.java
```

```go

//test.java

class Main {
  public static void main(String[] args) {
    String msg = "";
    msg += "Hello ";
    msg += "World!";
    System.out.println(msg);
  }
}
```

```
# 作成したディレクトリへ移動
$ cd ~/java/hello

```
:wqで保存

#### 実行する

```
$ java test.java
```
```
Hello World
```

#### 実行環境テストはクリア！
Apache 設定後、PHPが動作しない時の対処法

PHPが動作しなくなった時の解決方法をメモで記載しました。

## 環境

macOS Catalina
Apache 2.4.43 (Unix)
PHP バージョン7.2

## 背景
macにデフォルトであるApacheを停止し、
Homebrew で新たに Apache httpd をインストールして環境を構築したかった。

Apache の設定ファイルをいぢった後、PHPのバージョンを確認したら以下のエラー文で怒られました。

```
$ php -v 

dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
```

下記URLの記事を参考にして、コマンドを実行しても解決しなかったので別の方法を試しました。

[参考記事](https://stackoverflow.com/questions/59006602/dyld-library-not-loaded-usr-local-opt-openssl-lib-libssl-1-0-0-dylib)

```
Calling `brew switch` is disabled! Use `brew link` @-versioned formulae instead.
```

# 解決方法

先ずは Homebrewに悪いところがないか お医者さんに見てもらう。

```
$ brew doctor
```

そうすると以下の文章が表示されました。

```
Some installed formulae are deprecated or disabled. 
・・・
php@7.2
```

インストールしたformulae（パッケージ）が非推奨もしくは無効らしい。
私の場合、php@7.2 を下記コマンドでアンインストール。

```
$ brew uninstall php@7.2
```

インストールするPHPを検索

```
$ brew search php
```

そしてインストール

```
$ brew install php@7.2
```

インストールしたらパスを通し、紐付ける。

```
$ export PATH="/usr/local/opt/php@7.2/bin:$PATH
$ brew link php72
```

意図したバージョンが表示されるか確認

```
$ php -v
```

Apache を再起動

```
$ sudo apachectl restart
```

ターミナルを再起動すると、動きました。
Javaの環境構築

# 環境構築に必要なもの
Java、VisualStudioCode、Javaの拡張機能の3つをインストール

### ❶Javaのインストール

```
//ターミナルを開く
$ javac -version  //JDKがインストールされているか確認
```
バージョンが出てこなかったら[Javaインストールページへ](https://www.oracle.com/java/technologies/javase-downloads.html)
### 一覧から選択後、インストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958284/49b9f1f5-4cdc-8ad3-27a0-34787b152a8b.png)

### バージョンのアップデート

```
//バージョンが古い
$ javac -version
javac 11.0.9.1
```
```
//インストール後
$ javac -version
javac 15.0.1
```
### 最新のバージョンになっていない
```
//インストール済みのJavaを確認
/usr/libexec/java_home -V

Matching Java Virtual Machines (2):
    15.0.1, x86_64:	"Java SE 15.0.1"	/Library/Java/JavaVirtualMachines/jdk-15.0.1.jdk/Contents/Home
    11.0.9.1, x86_64:	"AdoptOpenJDK 11"	/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home

```
[こちらの記事を参考にさせて頂きました](https://qiita.com/aoyaman/items/fdbc1b35ce841f730afc)

### ❷VisualStudioCodeのインストール

[VisualStudioCodeインストールページ](https://code.visualstudio.com/download)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958284/2a292c96-cbaa-db9c-81f6-8a49ebeb723b.png)

####インストール後
左のバーを(アクティビティバー)
四角のアイコンをExtensions
ここで、拡張機能をインストールできる

```
VisualStudioCodeを開く
表示が英語になっているので、日本語に変更
「Japanese Language Pack for Visual Studio Code」と検索
「Japanese」と入力すると、候補が出てくる
インストールをクリック
インストールが終わったらVisualStudioCodeを再起動
表示が日本語になる
```

### ❸Javaの拡張機能のインストール
```
VisualStudioCodeのextensionsで
「Java Extension Packvscjava.vscode-java-pack」を検索して、インストール
```

### 環境構築が完了したので次回は実行環境テスト！
Javaについて触れてみる

# Javaとは

```
C++やC言語を元として開発されたプログラミング言語(コンパイラ言語)
Googleが開発に用いている“Google三大言語（Java、C++、Python）”の1つ
```
### 開発できるもの
```
・Webアプリ・Webサービス
・デスクトップアプリ
・スマホアプリ
・組み込み系
・IoT...
```

RubyやPHPは初心者向けで比較的簡単に扱え、小規模向けでもあるが
Javaの場合は少々複雑だが、非常に幅広い分野のプログラムを作ることができる

### Javaのメリット
```
・実行環境を選ばない
・実行速度が速く安定性がある
・セキュリティ性が高い
・拡張性・再利用性がある
・メモリー自動管理機能
```

### Javaのデメリット
```
・オブジェクト指向に慣れる必要がある
・小規模なプログラムやシステムの場合、逆に時間がかかる
```

### カッコいいスローガン

```
Write once, run anywhere
（一度プログラムを書いてしまえば、どのコンピューターでも動く）
```

#### 次回は環境構築を行います！！
Go言語-ポインタ

# ポインタ
プログラミング基本からGoの理解を文字におこして行こうと思います！

### ポインタとは
アドレスは値
整数や文字列のように操作したり変数に代入することができる
Goではアドレスをポインタと呼んで扱っている
ポインタが代入された変数をポインタ型変数という

### ポインタ型変数の定義
```go
func main() {
  name := "tanabe"  //nameの値がstring型なので*string型になる

  var namePtr *string = &name
  fmt.Println(namePtr)

//コンソール
0xc421100230  //ポインタが出力
```

ポインタ型変数を定義するには
変数のデータ型に「*(アスタリスク)」をつけて宣言

ポインタ型変数namePtrを定義し、&nameで取得したポインタを代入している

### ポインタからアクセスする
```go
func main() {
  name := "tanabe"

  var namePtr *string = &name
  fmt.Println(*namePtr)  //namePtrが示す変数の値を出力
}

//コンソール
tanabe  //値が出力される
```
ポインタ型変数を定義するには
変数のデータ型に「*(アスタリスク)」をつけて宣言

### ポインタを使って値を更新する
```go
func main() {
  name := "tanabe"
  var namePtr *string = &name
  *namePtr = "naito"
  fmt.Println(name)  //namePtrが示す変数の値を出力
}

//コンソール
naito  //更新した値が出力される
```
ポインタ型変数を使用して、値を直接更新することもできる
更新するには「*変数名 = 更新する値」と記述

「*namePtr = "naito"」で、変数nameを更新

### 引数にポインタを指定する
```go
func main() {
  name := "tanabe"
  changeName(&name)  //ポインタを引数に指定
}

func changeName(namePtr *string) {  //stringのポインタ型で受け取る
}
```
ポインタを別の関数に引数として指定する場合
受け取る関数には対応したポインタ型の引数を用意する必要がある

### 別の関数でポインタを使用し更新する
```go
func main() {
  name := "tanabe"
  changeName(&name)  //ポインタを引数に指定
  fmt.Println(name)
}
func changeName(namePtr *string) {  //stringのポインタ型で受け取る
  *namePtr = "naito"
}

//コンソール
naito
```
ポインタを引数として指定することで
別の関数からでもポインタを使って元の変数を更新することができる

### 変数を引数に指定する
```go
func main() {
  totalScore := 0
  fn(totalScore)
...
}
func fn(totalScore int) {
...
}
```
変数totalScoreを引数に指定する場合
その変数自体が渡されるわけではない

変数totalScoreの値がコピーされ、新しい変数に代入（値渡し）

### 渡した値を更新する
```go
func main() {
  totalScore := 0
  fn(totalScore)
  fmt.Println(totalScore)  //totalScoreの値を出力
...
}
func fn(totalScore int) {
  totalScore += 10  //fn関数のtotalScoreのみ値を更新
}
//コンソール
0  //元の値が出力される
```
main関数とfn関数のそれぞれの変数totalScoreは、別の変数
そのため、fn関数のtotalScoreを更新しても
fn関数のtotalScoreのみ値が更新される

### ポインタを見比べる
```go
func main() {               func fn(totalScore int) {
  totalScore := 0             totalScore += 10
❶fn(totalScore)
❷fmt.Println(totalScore)     ❶fmt.Println(totalScore)
  fmt.Println(&totalScore)    　fmt.Println(&totalScore)
}                           }

//コンソール
❶fn関数のtotalScoreの値とポインタ
10  //元の値が出力される
0xc421100230

❷main関数のtotalScoreの値とポインタ
0
0xc421100052
```
main関数とfn関数のそれぞれのtotalScoreを出力すると
それらが実際に別の場所にある変数であることがわかる

# 引数のまとめ

### 引数に整数などの値を指定した場合
```go
func main() {
  a := 10
  calculate(a)
  fmt.Println("引数に整数を指定した場合:", a)
}
func calculate(a int) {  //整数などの値を受け取る
  a += 1
}

//コンソール
引数に整数を指定した場合:10  //main関数の変数aはスコープが違うのでこのまま
```
calculate関数は受け取った引数に1を足す関数

変数aを引数に指定した場合、値がコピーされ別の変数が生成
よってcalculate関数で値を更新しても、main関数の変数aは更新されない

### 引数にポインタを指定した場合
```go
func main() {
  b := 10
  calculate(&b)  //ポインタを渡す
  fmt.Println("引数にポインタを指定した場合:", b)
}
func calculate(bPtr*int)  //ポインタを貰う
  *bPtr
}
//コンソール
引数に整数を指定した場合:11  //main関数の変数bは値が更新される
```
ポインタを引数に指定すると、calculate関数から元の変数の値を更新できる
このとき、受け取る引数はポインタ型を指定することに注意
Go言語-アドレス

# アドレス
プログラミング基本からGoの理解を文字におこして行こうと思います！

### アドレスとは
コンピュータにはメモリと呼ばれる作業場所のようなものが存在
変数はそのメモリに記録され、その場所をアドレスという

「0xc420010230」のように16進数で表現されることが多い
16進数とは、数字を数えるときに16で繰り上がるようにする数え方

### アドレスの取得
```go
func main() {
  name := "tanabe"
  fmt.Println(name)   //nameで値を取得
  fmt.Println(&name)  //&nameでアドレスを取得

//コンソール
tanabe
0xc421100230
```
変数のアドレスを取得するためには、「&変数名」とする
メモリ上の記録する場所はコンピュータによって変わるため
プログラムを実行する度に違うアドレスを出力する場合もある
【環境変数】go getでパッケージがインストールされるディレクトリは$GOPATH/bin。設定していない場合は$HOME/go/binに入る。

どうも、たかふみです。
少し前から会社の同期とGoでLINEBotの開発を行なっています。

開発で使うライブラリをインストールするため、`go get`をした後、コマンドを実行したのですが`wire: not found`と表示されてしまいました。

**「`go get`でインストールしたものってどこにインストールされるんだっけ？」**ということで、今回は`go get`によるインストール先や$GOPATHについて調べた内容をまとめておきたいと思います！

### ■結論
`$GOPATH`を設定していなければ$HOME/binにインストールされる。
`go get`でインストールされたライブラリは$GOPATH/binにインストールされる。

### ■`go get github.com/google/wire/cmd/wire`を実行
DIライブラリ「wire」をインストールするために`go get`を実行。wireコマンドを実行したところ下記のように表示。

```
/go/src/github.com/go-server-dev # wire
ash: wire: not found
```

パスが通っていないのが原因と考えました。そこで出たのが**「`go get`でインストールしたものってどこにインストールされるんだろう」**という疑問。

### ■`echo $GOPATH`で確認
調べてみると`$GOPATH/bin`にインストールされることが分かったので、`echo`で＄GOPATHを確認。

```
echo $GOPATH

```
何も出ませんでした。確かに設定した覚えはありません。


### ■そもそも`$GOPATH`とは何か

>The GOPATH environment variable specifies the location of your workspace. 
引用:https://github.com/golang/go/wiki/SettingGOPATH

`$GOPATH`とは**ワークスペースの場所**とのこと。また、`go help gopath`より、`go get`でインストールしたパッケージについては`$GOPATH`で設定されたディレクトリにインストールされるとありました。

そうなると、`$GOPATH`を設定していない僕の環境ではどこへインストールされているのでしょうか。。。

### ■設定していない場合は`$HOME/go`にインストールされる
githubのwikiに書いてありました。

> If no GOPATH is set, it is assumed to be $HOME/go on Unix systems and %USERPROFILE%\go on Windows.
https://github.com/golang/go/wiki/SettingGOPATH

設定していない場合は`$HOME/go`と見なされるようです。
確認したところ、今回インストールしたパッケージ「wire」が`$HOME/go/bin`に入っていることを確認しました。

```
/go/src/github.com/go-server-dev # echo $HOME
/root
/go/src/github.com/go-server-dev # ls /root/go/
bin  pkg  src
/go/src/github.com/go-server-dev # ls /root/go/bin/
wire
```

### ■`$GOPATH`を設定しておく
きちんと`$GOPATH`を設定しておきます。

```
/go/src/github.com/go-server-dev # vim ~/.bash_profile

↓vimで記述
---
export GOPATH=$HOME/go
---

/go/src/github.com/go-server-dev # source ~/.bash_profile
/go/src/github.com/go-server-dev # echo $GOPATH
/root/go
```
`echo $GOPATH`で設定したパスが表示されることが確認できました。

### まとめ：$GOPATHは明示的に設定しておいた方が良さそう
`go get`でインストールされる場所を把握するためにも、開発に入る前に`$GOPATH`は設定しておいた方が良さそうです。設定していない場合は`$HOME/go`にインストールされることをお忘れなく！

それでは！

#### 参照
>SettingGOPATH
https://github.com/golang/go/wiki/SettingGOPATH

>GOPATH は適当に決めて問題ない
https://qiita.com/yuku_t/items/c7ab1b1519825cc2c06f

>GOPATHの設定とgo get
http://kodama-tech.hatenablog.com/entry/2016/12/14/002115

>[備忘録]Go言語のGOPATHやパッケージについて
https://qiita.com/chano2/items/ea76cc503e651f07bfb0
HotSpot VMについて

## この記事は何？

Javaの内部とかに全然詳しくないプログラマがHotSpot VMについて調べた話

経緯

- Stringの内部実装について調べる
- `@HotSpotIntrinsicCandidate` <- なんだァ？てめェ……
- HotSpot VMなるものが関係してるらしいので調べる

## ざっくり言うと

HotSpot VM: HotSpotを実装したJVM
HotSpot: オラクルのJVM高速化記述

非常に粗くまとめると「よく使われる部分をキャッシュしておき、Javaの実行を早くする技術」のこと

経験的に少数の処理がよく呼び出され、そのほかはあんまり呼ばれない（例えば処理全体の2割が8割の実行時間を占める、など）。そのためその2割をキャッシュしておけば早くなる、と言うことらしい

## もうちょっとだけ詳しく

Javaを実行する際、人間の書いたJavaコードはバイトコード（JVM語）に変換され、そのJVM語をJVMインタプリタが解釈してプログラムが実行される。
HotSpotがなければヒープ領域にあるJavaコードをJVMが逐一解釈して処理が実行されるが、これでは処理速度が遅いと言う問題がある。
HotSpotは同じバイトコードがJVMに何度も呼ばれた場合、その部分を機械語にコンパイルしてキャッシュしておく。こうして、プログラムの中のよく呼び出される部分の処理が高速化される。

## 詳細は以下の参考記事

https://www.atmarkit.co.jp/fjava/special/jvmhistory/jvmhistory01.html
https://www.atmarkit.co.jp/ait/articles/0403/11/news096.html
https://ja.wikipedia.org/wiki/HotSpot
デメテルの法則


#デメテルの法則に沿わない、ダメな例

```java
// NG。以下のようなコードを書くべきではない
class A {
  private B b;

  public B getB() {
    return b;
  }
}


class B {
  public void hoge() {
    System.out.println("hoge");
  }
}

class Test {
  public static void main(String[] args) {
    new A().getB().hoge();
  }
}

```

#デメテルの法則に沿う、良い例

```java
// OK。以下のようなコードが望ましい
class A {
  private B b;

  public void hoge() {
    b.hoge();
  }
}


class B {
  public void hoge() {
    System.out.println("hoge");
  }
}

class Test {
  public static void main(String[] args) {
    new A().hoge();
  }
}

```

#なぜデメテルの法則に沿うようにするとよいのか？
例えば、クラスBのメソッド名が「hoge」から「fuga」に変わった場合、デメテルの法則が適用されている方のコードはTestクラスの中のコードを変更する必要はない。しかしデメテルの法則が適用されていない方のコードは、Testクラスのコードも変更する必要がある。（つまり、変更箇所が増える）

```java
class A {
  private B b;

  public void hoge() {
    // ↓ここを変えた
    b.fuga();
  }
}


class B {
  // ↓ここを変えた
  public void fuga() {
    System.out.println("fuga");
  }
}

class Test {
  public static void main(String[] args) {
    new A().hoge();
  }
}

```
javasript, jquery（ユーザー追加）

#初めに
　Sakura EditorでJqueryでユーザー追加ページを作成する。
#Sakura Editorのダウンロード

https://sourceforge.net/projects/sakura-editor/

#HTMLページを保存する
```HTML
<html>
  <head>
   <title>タイトル</title>
   <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
   <script> 
    $(document).ready(function(){
        // マインオブジェクト
		var $main  = $("#main-id");

		// テーブルオブジェクト
		var $table = $("<table>"); 

		// クラス定義
		var Row = function(table) { // table：変数

		   // プロパティ
		   var $tr        = $("<tr>");                      // 行オブジェクト
		   var $td        = $("<td>").html("ユーザー名："); // カラムオブジェクト
		   var $input     = $("<input>");                   // インプットオブジェクト
		   
		   // ユーザー削除ボタン
		   var $deleteUserBtn = $("<button>").html("削除");
		   $deleteUserBtn.click(function() {
		        this.closest("tr").remove();
		   });

		  // 追加メソッド
		  this.addRow = function() {
		    // 行を追加
		    table.append($tr.append($td.append($input).append($deleteUserBtn)))
		  };
		};

		// ボタンオブジェクト
		var $buttonAdd = $("<button>").html("ユーザー追加");

		// ボタンクリックイベント
		// ボタンをクリックすると、行が追加される
		$buttonAdd.click(function() {

		    // インスタンス作成
		    var row = new Row($table);

		    // クラスのメソッドを呼ぶ
		    row.addRow();
		});

		//親オブジェクトに子オブジェクトを追加
		$main.append($buttonAdd).append($table);
	});
    </script>
  </head>
  <body id="main-id">
  </body>
</html>
```
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/e212b68d-7476-085d-ab7c-bac546435582.png)

HTMLで保存して、実行する
![キャプチャ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/1b02343e-21f2-f0df-33aa-3fe5fa96cce0.png)

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/54b27d88-6e07-568d-4c30-53a5f45682b8.png)

![無題１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/e9c14f4b-421f-8b38-a168-1be638559ec4.png)

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/22e0288e-e63d-08a2-940f-125851487ef2.png)



以上
Ruby 基礎文法の復習

Rubyの基礎学習が一通り終わり、違う教材で復習をしていた時に重要だと思った点や知らなかったテクニックを備忘録的にまとめたものです。

# .classと.methods（オブジェクトに対して使用できる）
- .class  
クラスが分かる  
- .methods  
そのオブジェクトの持っているメソッドが分かる

# 破壊的メソッド（!がつく）
元の値を書き換えてしまうメソッドのこと
（例）.upcaseメソッド（値を大文字に変えて出力）
name = "tarou"

puts name.upcase #"TAROU"
puts name #=>"tarou"

puts name.upcase! #"TAROU"
puts name #=>"TAROU"

#真偽値を確認（?がつく）
name = "tarou"
p name.empty? #false
p name.include?("r") #true

#配列の添字
- マイナス数字
[-1]とすると、末尾から1つ目
[-2]とすると、末尾から2つ目

- 範囲指定
[0..2]と指定すると、0〜2の値を取得
[0...2]で、0〜2の直前

# ハッシュでよく使うメソッド
- size ・・・ 要素の数を取得（配列でも使える）
- keys ・・・ キーの一覧を取得
- values ・・・ 値の一覧を取得
- has_key?("name") ・・・ キーがあるかどうか

# 変換
- to_i ・・・ 整数（integer）
- to_f ・・・ 小数点あり（float）
- to_s ・・・ 文字列（string）
- to_a ・・・ 配列（array）
- to_h ・・・ ハッシュ（hash）　　

（例）配列とハッシュの変換
scores = {taguchi: 200, fkoji: 400}
scores.to_a => [[:taguchi, 200], [:fkoji, 400]]
scores.to_a.to_h => {:taguchi=>200, :fkoji=>400}

# %記法
- ダブルクォーテーション
"文字列" ・・・ %Q(文字列) もしくは %(文字列)で書ける※Qは省略可能

- シングルクォーテーション
'文字列' ・・・ %q(文字列)で書ける

### 何が便利か？
文字列の中にダブルクォーテーションやシングルクォーテーションを記述したい時に、表記が分かりやすい

【he\"llo】と記載したい場合
=> puts "he\"llo"
=> puts %Q(he"llo)
=> puts %(he"llo)

【'he\'llo'】と記載したい場合
=> puts 'he\'llo'
=> puts %q(he'llo)
  

【配列の場合の%記法】%W もしくは %w  
【p ["red", "blue"]】
=> p %W(red blue)
  
【p ['red', 'blue']】
=> p %w(red blue)

# forを使った繰り返し処理
forは何らかの集合的なオブジェクト（配列やハッシュ）や、範囲を表すオブジェクトの要素数分だけ何らかの処理を繰り返すことができる命令である

```Ruby
for i in 10..20 do
  p i
end

#eachへの書換えも可能
(10..20).each do |i|
  p i
end
```

```Ruby
for color in ["red", "green"] do
  p color
end

#eachへの書換えも可能
["red", "green"].each do |color|
  p color
end
```

```Ruby
for name, score in {taro:100, jiro:200} do
  puts "#{name}: #{score}"
end

#eachへの書換えも可能
{taro:100, jiro:200}.each do |name, score|
  puts "#{name}: #{score}"
end
```

# クラス（クラスメソッド、クラス変数、定数）
- クラスメソッド
def self.メソッド名
end

- クラス変数
@@変数名

- 定数
大文字から始まる（慣習的に全て大文字で記述）


```Ruby
（例）
class User

  @@count = 0 #クラス変数

  VERSION = 1.3 #定数

  def initialize(name) 
    @name = name
    @@count += 1
  end

  def sayHi #インスタンスメソッド
    puts "hi! i am #{@name}"
  end

  def self.info #クラスメソッドを定義
    puts "#{VERSION}: User Class, #{@@count} instances."
  end

end

ichiro = User.new("ichiro")
jiro = User.new("jiro")
saburo = User.new("saburo")
User.info #クラスメソッドの実行（クラスから直接呼び出せる）
p User::VERSION #定数をクラスの外から呼び出す場合はコロン2つ記述
```

#　クラスの継承
class Miniuser < User （Userクラスの情報が継承される）
User: 親クラス、もしくはSuper Class と呼ぶ
MinUser: 子クラス、もしくはSub Class と呼ぶ

子クラスで親クラスで定義したメソッドを上書きすることも可能（オーバーライドと呼ぶ）

# privateのポイント（メソッドのアクセス権）
- レシーバーを指定できない
- Sub Class（子クラス）から呼び出せる（Rubyの特徴）
- オーバーライドできる（Rubyの特徴）

※Rubyのprivate指定は他の言語のオブジェクト指向プログラミングと動作が異なるようである

# モジュールについて
開発規模が大きくなると、メソッド名などが他の人が作ったものと被ってしまい、それが原因でエラーになってしまうことがある。そのような場合に、モジュールを使うと命名した名前が衝突せずに便利である。
モジュールの特徴としてはメソッドや定数をまとめることができるが、インスタンを生成したり継承したりはできない。

```ruby
#モジュールの作り方
module Car #大文字から始める

  VERSION = 1.3 #定数を作れる

  def self.go
    puts "going..."
  end

  def self.stop
    puts "stopping..."
  end

end

#モジュールの実行
Car.go
Car.stop
```

# モジュールについて その2
モジュールの用途にミックスインというものがある。
単に機能としてクラスに提供する場合に使用。
メソッドを生成する際に、selfを付けずにインスタンスメソッドとすることにより、他のクラスのインスタンスメソッドとして使用でき、これをミックスインという。
その際、クラス側では「include モジュール名」を記述する。
Mac CatalystでInserted menu has duplicate submenuエラー

Catalystのエラーというより、UIMenuやUIMenuBuilder周りのエラーなのですが、タイトルのエラーに出くわすことがあります。

# 発生したエラー
「Inserted menu has duplicate submenu...」

# 発生状況
「UIMenuBuilderに対して、`builder.insertChild(menu, atStartOfMenu: xxx)`を呼び出そうとしたとき」

# 解説

特に`input`や`modifierFlags`の重複も見受けられないのに上記の問題が発生している場合は、`action`で複数のコマンドに同じセレクタを渡していないか確認してください。

自分が遭遇したケースでは、とりあえずメニューの外見だけ実装しようと思って

```swift
@objc func fakeImplementation(_ sender: Any?) {
    fatalError("MUST IMPLEMENT")
}
```

というメソッドを定義して`action: #selector(fakeImplementation(_:))`で渡して利用していたのですが、これが問題でタイトルのエラーが発生していました。

同一サブメニュー内で同じアクションを利用しているとエラーが起きますが、例えば同じファイルメニュー内の別の場所で同じactionを参照するコマンドが2つ存在する場合でも、不正な表示を引き起こし得ます。

仮説ですが、Equatableの実装でactionだけを見ているとか、メニューの登録の際にactionを見て被り判定をしているとかがあり得そうです。

解決方法としては「ちゃんと別々のアクションを渡す」になりますが、仮実装中の解決方法としては、それぞれ対応するfakeメソッドを用意してください。

```swift
@objc func fakeActionFoo(_ sender: Any?) {
    fatalError("MUST IMPLEMENT")
}

@objc func fakeActionBar(_ sender: Any?) {
    fatalError("MUST IMPLEMENT")
}
```
TimeMachineからのデータ移行・復元がエラーになった場合のデータ救済方法

# Mac miniが故障？したのでバックアップ→復旧したかった
* Mac mini (2018)から出力していたLGのモニタがブラックアウトを繰返していた。
* LGモニタ以外（我が家にあったのはナナオのモニタ）でも発生した。
* ブラックアウトは常に繰返すわけではなく長時間使用しているとたまに発生、一度発生すると何度か短時間に発生。
* ケーブルもHDMIやThunderbolt3のケーブルを家にあったものから新品購入したものまで試してみたけど直らず。
* Appleのサポートチャットで修理という流れになった。
* 今回はその修理時に行ったTimeMachineへのバックアップ、TimeMachineからの復元でトラブルが発生したのでそれをまとめたいと思う。

# TimeMachineのバックアップ先として使用したストレージ
* Drobo5N(https://www.drobo-jp.com/products/pdr5n.html)
    * 購入して4年くらいほぼ放置していた（試しに使った程度）
    * 改めて今回セットアップしてストレージとして利用可能であることを確認
* 修理に出す前にDrobo5Nをバックアップ先としてTimeMachineを設定。
    * バックアップ容量はおよそ1TB（990GBくらいだった）
    * 初回バックアップ時は20時間かかった
    * 夕方バックアップ開始、一晩放置して翌日の昼間に終わっていることを確認してシャットダウン
    * 回収に来たクロネコヤマトにMac miniを裸で渡して回収完了。修理を待つ。

# Mac mini帰還後のトラブル
* 中1日で無事に戻ってきたMac miniだが、ロジックボードが交換されたので、当然オンボードになっているSSDも交換された。つまりデータはなくなりました。
* BigSurがクリーンインストールされている状態。からの復旧
* BigSur初回起動時に表示されるデータ移行の画面でTimeMachineから復元するを選択して進めるも、エラー発生。
* どうにもできなくなったので、復元は諦めて一旦初回起動時のウィザード的なのを終わらせる
* データ移行アシスタンスを起動して復元を試みるも、Drobo5Nがリストに出てこない
* smb://Drobo5N/sharefolder を入力してバックアップされた時点データの閲覧まではできた
* 移行するデータの種別はすべて選択した状態でデータ移行を開始
* これは何度か行ったが、何度やっても移行するデータのカウント中に止まってしまって実際にコピーが始まらない
* たまに始まるときもあるが途中でエラー、もしくは完了じゃないのに完了ステータスになってしまいデータ移行が不完全。
* 直接TimeMachineのバックアップデータ（*.sparsebundle）をマウントしてTimeMachineから見てみた
    * 現在しかデータがなく、過去に遡れない。
    * マウントしたデータを直接見てみると、 `2021-01-08-140145.inprogress` というフォルダだけが見えていて他に何もない。
        * .inprogressフォルダはTimeMachineで何かエラーが起きて中断したりしたときに生成されるもののようで、基本消すことができない。（消せばいいという記事がいくつか出てきたが。）
        * .inprogressフォルダはTimeMachineが正常に動作すれば解消されるので一度バックアップ先をきれいにしてから再度バックアップするといいです、という記事を見かけたが、今回そんなことは物理的に不可能（バックアップ元はもうない）なので.inprogressフォルダをどうにかする方法は諦める
* `mount`コマンドでマウントしているストレージを改めてみてみると、`TimeMachine`としてマウントしたsparsebundleと共有フォルダとしてマウントしたTimeMachineのフォルダが `/Volumes`の下に存在していた。
    * 何度かmountとunmountを繰り返していたので気が付かなかったが、`/Volumes/.timemachine/UUID`的なフォルダがマウントされていた
* `.timemachine`フォルダの下に実際にバックアップを取得した時のデータがあったので必要なものをここから手動コピーしてサルベージ完了した。

# まとめ
* TimeMachineのバックアップを初めて行うときはちゃんと復元できるか試しておこう。
    * 今回は時間がなかったので確認までできなかったが時間ある人は絶対にやっておいたほうがいい。
* 仮に復元でコケてもバックアップされたデータが消えていることはないので落ち着いて探せばデータは見つかる。
    * 今回の.timemachineフォルダが/Volumesにマウントされていたのが何がトリガーだったのかはまだ追えていないが、同じトラブルに見舞われてしまった人の参考になれば幸い。
* Macが修理されて戻ってくる場合、新品でない場合でも中身が別物になっていて、厳密には同一機体ではなくなっていることがある（？）ので注意しておこう。
【備忘メモ】Microsoft Office を32ビット版から64ビット版に変更する

# 概要

自宅PCの**Excel**が**32ビット版**でしたので、**64ビット版**に変更しました。
Officeをインストールする際に明示的に指定をしなければ、**Office2016までは32ビット版**、**Office2019以降は64ビット版**がインストールされるようです（参考：[永続ライセンス版Officeを32bitから64bitに変更するには](https://qiita.com/mindwood/items/039d4a192b6906c562f6)）。

以下、至って簡単な内容ですが、備忘として作業内容を残しておきます。
ここで使用している製品は**Office Home & Business Premium**です。
**Office Professional 2016**については[こちらの記事](https://qiita.com/mindwood/items/039d4a192b6906c562f6)を参考にした方が良いと思います（インストール方法が異なるようです）。

Excelのバージョンは、メニューバーの「ファイル」→「アカウント」→「Excelのバージョン情報」から確認できます。
![2021-01-11 104114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/43197baf-5f15-e8cb-9c9e-926b845dd80c.png)

手順は簡単で、**32ビット版のOfficeをアンインストール**して、**64ビット版のOfficeを再インストール**するだけです。

# 注意点

- 再インストールする際には、**初回インストール時のMicrosoftアカウントとパスワード**が必要です。
- ここで説明する方法は**あくまで一事例**です。
- 製品ごとにライセンス内容が異なりますので、**説明書をよく読んでから**ご自身のライセンス・環境に合わせた方法で実行してください。
- アンインストール、再インストールで生じた不具合などの責任は負いかねますので、**自己責任**にて実行してください。

# Officeのセットアップファイルのダウンロード

**32ビット版のOfficeはインストールされたまま**で作業を進めます。
実際に64ビット版のOfficeがインストールできる状態になってから、32ビット版をアンインストールすれば大丈夫です。

再インストールするは、**初回のインストール時に作成したマイアカウントページ**から行います。
私の手元の説明書では、次のURLがマイアカウントページとして指定されています。
www.office.com/myaccount
ログインするには、「Microsoftアカウント」と「パスワード」が必要です。

ログイン後のページから「**自分のサブスクリプションと Office 製品をすべて表示する**」を選択します。
![2021-01-11_11h01_46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/7d35cb82-14bf-b016-c404-c9aaed3d083d.jpeg)

「サービスとサブスクリプション」ページから該当製品部分の「**インストールする**」をクリックします。
![2021-01-11_11h09_40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/c2c61324-fba4-5cea-0e83-b93620b9ee78.jpeg)

「ダウンロードページ」のうち「**その他のオプション**」をクリックします。
![2021-01-11_11h11_44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/20d79570-b7fa-721b-c040-b63f52184e1a.jpeg)

次に、表示されたページの「バージョンを選択する」リストから「**64ビット版**」のOfficeを選択します。
Office2016までの**規定のバージョンは32ビット版**となっていますので、ここで64ビット版を選択する必要があります。
![2021-01-11_11h13_35.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/68a0ee50-4cec-3c81-4523-1e286d26b2ff.jpeg)

最後に「**インストールする**」ボタンをクリックすれば、ダウンロードが開始されます。
![2021-01-11_11h13_56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/957961df-31d0-446b-6544-6a8052501506.jpeg)

# Officeの再インストール

次のようなセットアップファイル「**OfficeSetup.exe**」がダウンロードされていると思います。
![2021-01-11 113240.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/0f76bb8e-1c50-b8e7-5cd7-608e60a7e692.png)

このセットアップファイルからインストールを実行しようとすると、**32ビット版のOfficeをアンインストールしてから実行してください**という旨のメッセージが表示されます。

ここで、Windowsの設定ページから「アプリと機能」ページを開いて、32ビット版のOfficeをアンインストールします。
![2021-01-11 114050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/8b72501d-3134-5179-d962-9f3ee1081f71.png)

32ビット版のアンインストールが完了したら、先ほどのセットアップファイル「**OfficeSetup.exe**」から64ビット版のインストールを実行して完了です。

以上
[Laravel]LaravelでBLOB型のMigrationに失敗した件

#LaravelでのMigrationに失敗した件について。

LaravelでMigrationしたところ、

```
Method Illuminate\Database\Schema\Blueprint::blob does not exist.
```

とのエラーが出ました。

##環境

- windows10
- laravel6
- php(7.4.6)

##結果
Laravelにはblog型はないとのこと。
代わりにbinary型が用意されているとのことでした。

さっそくデータ型を変更。

```hoge_table.php

   public function up()
    {
        Schema::create('hoges', function (Blueprint $hoge) {
            /****省略****/
            $hoge->binary('****');
        });
    }

```

通りました😊

次からはきちんと確認すべきですね。。

[参考](https://stackoverflow.com/questions/58427618/how-to-use-data-type-as-blob-during-migration-in-laravel-6)
【基本情報】ファイル管理

###ファイルとは文書のこと

データは、ファイルとして補助記憶装置に記録される。

代表的なファイル形式

* テキスト形式
* CSV形式（個々のデータに区切る⇨表形式のデータを保存することに特化）
* PDF
* 画像用のファイル形式
BMP、JPEG、GIF、PNG
* 音声用のファイル形式
MP3、MIDI
* 動画用のファイル形式
MPEG

###文書をしまう場所がディレクトリ
サブディレクトリ、、、ディレクトリの中に含まれるディレクトリのこと
ルートディレクトリ、、、階層構造の一番上位に位置するディレクトリのこと
カレントディレクトリ、、、自分が今開いているディレクトリのこと

###ファイルの場所を示す方法
パスを用いてその場所を指し示す。

#####絶対パスの表記方法
* ルートディレクトリは「/」または「￥」で表す。
* ディレクトリの次の階層の間は「/」または「￥」で区切る。

#####相対パスの表記方法
* ディレクトリの次の階層の間は「/」または「￥」で区切る。
* カレントディレクトリは「.」で表す。
* 親ディレクトリは「..」で表す。 

###汎用コンピュータにおけるファイル
汎用コンピュータとは、企業の基幹事業などで利用される大型のコンピュータ

汎用コンピュータにおけるファイルは、一連のデータをまとめたもの。レコードの集合がファイル。

#####ファイルへのアクセス方法
* 順次アクセス（シーケンシャルアクセス）
* 直接アクセス（ランダムアクセス）
* 動的アクセス（直接アクセスの後、順次アクセス）

######順編成ファイル
順次アクセスのみが可能
先頭から順に記録

######直接編成ファイル
直接アドレス方式と関節アドレス方式がある。

![C5BCE78A-026A-4611-9583-6733C4D7921C_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696517/228cea59-09ac-2a7a-3cfd-20e46356c77f.jpeg)

ハッシュ関数による計算の結果が重複することで、異なるレコードが同じアドレスで衝突すること、これをシノニムという。
これは多発すればするほどアクセス速度が落ちる。

######索引編成ファイル
索引域（直接アクセスでジャンプできる）
基本データ域（順次アクセス）
あふれ域
の三つの領域で構成される。

######区分編成ファイル
メンバと呼ばれる順編成ファイルを複数持ち、それらを格納するメンバ域と、各メンバへのアドレスを管理するディレクトリ域とで構成される。

メンバを丸ごと追加、削除するのは柔軟に行えるが、レコード単位の挿入や削除は順編成ファイルの欠点を引き継ぎ、苦手である。