OmniAICreator/Qiita-1.07M huggingface dataset:
「ローカルにコピー」のデフォルトの振る舞いは状況により異なる

今回はVisual Studioで開発をしている過程で遭遇した事象についてのお話です。

# Problem

OracleDBのアンマネージ・コードのドライバ `Oracle.DataAccess.dll` に依存するアプリケーションを構築・運用。
あるときまでは、Visual Studio（msbuild）のビルド成果物に当該アセンブリが含まれていたのだが、何かをきっかけにして含まれないようになってしまった。

このかん `.csproj` ファイルの参照設定に変化はない。
当該アセンブリを参照する `<Reference/>` の子要素は `<SpecificVersion/>` と `<HintPath/>` のみで、 `<Provate/>` は存在しなかった：

```xml:ClassLibrary1.csproj
    <Reference Include="Oracle.DataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\Lib\Oracle.DataAccess.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />

```

Visual Studioから見ると`<Private/>` に対応する設定項目である「ローカルにコピー」は `True` となっている：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/5bb410f5-6520-d689-5c64-925496ed5c73.png)


# Solution

「ローカルにコピー」（CopyLocal）を一旦 `False` にしたあと `True` にする。
あるいは、`*.csproj`ファイルをテキストエディアなどで開き、`<Reference/>` の子要素に `<Provate/>`を追加する：

```xml:ClassLibrary1.csproj
    <Reference Include="Oracle.DataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\Lib\Oracle.DataAccess.dll</HintPath>
      <Private>True</Private>
    </Reference>
```

この状態でビルドするとビルド成果物に当該アセンブリが含まれるようになる。
なぜこのような挙動になるのか、あれこれ調べてみたがわかっていない。

[Microsoft社のリファレンス](https://docs.microsoft.com/en-us/dotnet/api/vslangproj.reference.copylocal?view=visualstudiosdk-2022)によれば、「ローカルにコピー」（CopyLocal）ないし `<Private/>` のデフォルトの振る舞いは状況により異なる：

> The project-assigned value of CopyLocal is determined in the following order:
> * If the reference is another project, called a project-to-project reference, then the value is true.
> * If the assembly is found in the global assembly cache, the value is false.
> * As a special case, the value for the mscorlib.dll reference is false.
> * If the assembly is found in the Framework SDK folder, then the value is false.
> * Otherwise, the value is true.

つまり

> 「ローカルにコピー」の値は次の順序で決定される：
> * 別プロジェクトへの参照の場合、値は `True` 
> * 当該アセンブリがグローバル・キャッシュ・アセンブリに存在する場合、値は `False`
> * 特殊ケースとして、アセンブリがmscorlib.dllへの参照である場合、値は `False`
> * 当該アセンブリがフレームワークSDK内に存在する場合、値は `False`
> * それ以外の場合、値は `true`

コピーするかしないかはかなりの程度状況依存ということである。

ただ、今回ここで示されている条件はどれも変化していない。。
おまけに、今試みに手元にあった Visutal Studio 2022で実験をしてみると、当該アセンブリがグローバル・キャッシュ・アセンブリに存在し かつ  `<Private/>` 要素なしの場合でもアセンブリはコピーされている。。。

結局「なぜ」はよくわからないのだが、「ローカルにコピー」のデフォルトの振る舞いは状況により異なる。
アセンブリがコピーされない問題に遭遇したら上述の通り、明示的にコピーを指示するべし。
利用目的の通知または公表

### [全体の目次](https://qiita.com/tetz1/items/da4eb31b920f2acf4349)
---

# 利用目的の通知または公表
 **[（個人情報の保護に関する法律についてのガイドライン（通則編）- 定義 - 3-3-3）](https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a3-3-3)** 


### 個人情報を取得した場合は、速やかに、その利用目的を本人に通知、または、公表しなければならない （＊あらかじめその利用目的を公表している場合を除く）

#### 通知、公表が必要な例
- 例）インターネット上で本人が自発的に公にしている個人情報を取得した場合（単に閲覧しただけの場合を除く）
- 例）インターネット、官報、職員録等から個人情報を取得した場合（単に閲覧しただけの場合を除く）
- 例）個人情報の第三者提供を受けた場合

＊「本人に通知」「公表」については下記を参照
<details>
<summary><B>「本人に通知」とは？ </B></summary>
（個人情報の保護に関する法律についてのガイドライン（通則編）- 2-14（本人に通知））

>「本人に通知」とは、本人に直接知らしめることをいい、事業の性質及び個人情報の取扱状況に応じ、内容が本人に認識される合理的かつ適切な方法によらなければならない。
>
>【本人への通知に該当する事例】
> 事例1）ちらし等の文書を直接渡すことにより知らせること。
> 事例2）口頭又は自動応答装置等で知らせること。
> 事例3）電子メール、FAX等により送信し、又は文書を郵便等で送付することにより知らせること。

https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a2-14
</details>

<details>
<summary><B>「公表」とは？ </B></summary>
（個人情報の保護に関する法律についてのガイドライン（通則編）- 2-15（公表））

>「公表」とは、広く一般に自己の意思を知らせること（不特定多数の人々が知ることができるように発表すること）をいい、公表に当たっては、事業の性質及び個人情報の取扱状況に応じ、合理的かつ適切な方法によらなければならない。
>
>【公表に該当する事例】
>事例1）自社のホームページのトップページから1回程度の操作で到達できる場所への掲載
>事例2）自社の店舗や事務所等、顧客が訪れることが想定される場所におけるポスター等の掲示、パンフレット>等の備置き・配布
>事例3）（通信販売の場合）通信販売用のパンフレット・カタログ等への掲載

https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a2-15
</details>


# [利用目的の通知または公表」の例外](https://qiita.com/tetz1/items/02a4526ad1f298c27f11)
＊上記をクリックしてください。該当ページへ飛びます
【Shopify Liquid】メタフィールドに登録したJSONを取得する

ShopifyのメタフィールドにJSON形式で登録したデータをLiquidで取得する方法を記載します。

以下のようなJSONを`json`というネームフィールドで登録しているとします。
```json
{
  "name": "taro",
  "age": "30",
  "country": "japan"
}
```

`name`フィールドを取得したい場合は以下のように記述します。
```liquid
{{ blog.metafields.custom.json.value.name }}
```

すべてのフィールドを取得したい場合は`for`を使います。
```liquid
{%- for metafield in blog.metafields.custom.json.value -%}
  {{ metafield.name }}
  {{ metafield.age}}
  {{ metafield.country}}
{%- endfor -%}
```

当初、以下のように記述していましたがこれでは値を取得できませんでした。
```liquid
// NG
{{ blog.metafields.custom.json.name }}
```
Voltaを使うためのNode環境見直し記録

# はじめに

個人の記録です。環境が異なる場合もありますことをご了承ください。

## 動機と魅力

- [Volta](https://volta.sh/)を知った。（winとmacで動作するnodeバージョン管理）
- 管理ツール統一で作業の手間を減らせる。（使い方忘れてググる手間）
- プロジェクトごとにバージョン管理可能。

## 導入前の環境

- macOS Monterey ver.12.4　👉 nodebrew → nvm → nodenv → Volta
- Windows 10 Pro ver.21H2　👉 nvm →  Volta

## いったんきれいにする

### 【Win10】nvm アンインストール

アプリと機能から NVM for Windows をアンインストールすればOK。

```text
下記インフォメーションがポップアップ、「OK」　をクリック。

Removing NVM for Windows will remove the nvm command and all versions of node.js, including global npm modules.

下記質問がポップアップ、「はい」　をクリック。

Are you sure you wanto to completely remove NVM for Windows and all og its components?

正常に削除された案内がポップアップ、「OK」　をクリック。

NVM for Windows was successfully removed from your computer.
```

### 【Win10】確認

Git Bash で以下を実行しバージョンが出なければOK。

```bash
node -v
npm -v
nvm version
```

---

### 【macOS】nvm アンインストール

- `~/.nvm` ディレクトリを削除すればOK。
- `~/.zshrc` の nvm 関連を削除。

```.zshrc
# 削除（他にも2,3行あったが記録漏れ）
$NVM_DIR="$HOME/.nvm"...
``` 

### 【macOS】 nodenv アンインストール

- 念のため以下を実行すると、「そんな樽はねえ」と言われた。

```bash
brew uninstall nodenv

No such keg: /usr/local/Cellar/nodenv
```

- anyenv経由でインストールしたのだった。

```bash
brew uninstall anyenv
```

- `~/.zshrc` の nodenv 関連を削除

```.zshrc
# 削除
export PATH="$HOME/.nodenv/bin:$PATH"
eval "$(nodenv init -)"
```

### 【macOS】残党を削除

```bash
which anyenv
rm -rf #上記実行で出力したpath

which node
rm -rf #上記実行で出力したpath
```

### 【macOS】homebrew をすっきりんこ

```bash
brew doctor
brew cleanup
```

### 【macOS】確認

バージョンが出なければOK。

```bash
node -v
npm -v
```

## Volta インストール

### Win10

[公式サイト|Windows Installation](https://docs.volta.sh/guide/getting-started) に従い、インストーラーで実行する。

### macOS

下記コマンドを実行。

```bash
curl https://get.volta.sh | bash
```

## インストールの確認

シェルを再起動し、下記コマンドを実行。バージョンが表示されればOK。

```bash
volta --version
```

### Win10

以下のパスが自動で追加されている。

- ユーザ環境変数 Path　👉　：\Users\{USER}\AppData\Local\Volta\bin
- システム環境変数 Path　👉　：\Program Files\Volta

### macOS

`.zshrc` に以下が追加されている。

```.zshrc
export VOLTA_HOME="$HOME/.volta"
export PATH="$VOLTA_HOME/bin:$PATH"
```

## 使い方

下記コマンドを必要に応じて実行。
```install``` コマンドを実行すると、デフォルトバージョンに設定される。 

```bash
# NodeのLTS版がインストールされる
volta install node

# 最新バージョンをインストール
volta install node@latest

# 特定バージョンをインストール
volta install node@14.15.5

# 14系の安定板がインストールされる
volta install node@14

# Volta 管理下の各種バージョンを確認するのに使用
volta list

# Volta で管理しているツールを一覧で見る
volta list all
```

バージョン固定は プロジェクトルートで `volta pin` コマンドを使用する。

```bash
# Nodeのバージョンを固定
$ volta pin node@14.17

# npmのバージョンを固定
$ volta pin npm@6.14
```

`volta pin` コマンドは、選択したバージョンのツールを使用するようにプロジェクトの `package.json` ファイルを更新する。

```package.json
"volta": {
  "node": "14.17.3",
  "npm": "6.14.13"
}
```


## わすれがちコマンド一覧表

|コマンド|内容|
|:--|:--|
|exec $SHELL -l|シェルの再起動|
|source ~/.zshrc|PATHを通す|
|echo $SHELL|デフォルトシェルの確認 |
|ls -a|隠しファイルを表示|

## 参考

### アンインストールの参考

- [Node.js を完全にアンインストールする](https://qiita.com/ucan-lab/items/a662532f1ce46f152c4e)
- [インストールしてあるNode.jsやnpmをアンインストール](https://ima-wc.jp/blog/1357)

### インストールの参考

- [Volta公式](https://docs.volta.sh/guide/getting-started)
- [Node.jsのバージョン管理にVoltaを推したい](https://zenn.dev/taichifukumoto/articles/how-to-use-volta)
CentOS7でzipコマンドが使えない（自分用メモ

VM上のzipコマンドが使えない
下コマンドでzipが入っているか確認する

$ yum list installed | grep zip

→そもそもzipコマンドが入っていなかった

なので、下コマンドでインストールできるかinfoオプションをつけて確認する


$ sudo yum --enablerepo=epel,remi,rpmforge info zip

確認できたらインストールを行う（zipコマンドを解凍するunzipコマンドも同時にインストール）

$ sudo yum install zip unzip


これでzip、unzipコマンドが使用できる様になる
JPCERT/CC とは

## 勉強前イメージ

しーさーと的な？

## 調査

### JPCERT/CC とは

Japan Computer Emergency Response Team Coordination Center の略で、日本語ではJPCERT コーディネーションセンターと呼ばれています。
日本国内のセキュリティインシデント等の報告の受け付けや支援、状況の把握、分析、再発防止のための対策の検討や助言などを行っています。
特定の企業や政府機関とは別の中立機関として民間の非営利団体になります。
元々は1992年頃に有志によるボランティアから発足しました。
FIRST(国際的なCSIRTが集まるフォーラム)に日本で初めて参加したり、APCERT(アジア太平洋地域のCSIRTが集まる団体)の事務局もつとめています。

JPCERT/CCの主な活動は以下の8つです。

- インシデント対応

インシデントが発生した際の報告の受付や対応の支援などを行います。

- 脆弱性情報ハンドリング

調整機関として、脆弱性の公表の前に開発者に連絡しパッチ対応を依頼したり
海外の関係機関とも連携して脆弱性情報を世界で同時に公表するために調整を行ったりしています。

- 定点観測の運用

セキュリティ上の脅威となるトラフィックの観測を行うシステムの運用をしています。
また、その結果から注意喚起などを行います。

- 早期の警戒

社会的に大きなシステムなどを運用する企業や組織に対してリスク軽減のための早期警戒情報の発信や
セキュリティ演習の実施、今後の傾向予測などを行っています。

- 国際連携

国際的なCSIRTのコミュニティへ参加し活動を行い、窓口の確保や脅威の傾向の共有を行っています。

- アーティファクト分析

攻撃ツールや関連の技術に関して分析調査を行い、インシデントの再発防止などに役立てています。

- 制御システムセキュリティ

国民生活の基盤となる社会インフラのセキュリティ対策を促進するために、セキュリティのガイドラインやカンファレンスの提供、
また個別の注意喚起を行っています。

- 関係組織やコミュニティとの連携

驚異の情報や対策に関する情報収集など、JPCERT/CCを円滑に行うために
様々な組織やコミュニティなどと連携の活動を行っています。

## 勉強後イメージ

日本のCSIRTの団体ってことかな？
日本内のセキュリティの情報を集めたりとか海外と連携したりとかしてくれる人たち。

## 参考

- [JPCERT/CCについて](https://www.jpcert.or.jp/about/)
- [はじめてのJPCERT/CC](https://www.jpcert.or.jp/about/brief/)
[Git / windows] git reset HEAD@{n} すると error: unknown switch `e' が発生する

# 症状

タイトルの通り。

私の場合こうなりました。

```powershell:powershell
> git reset --hard HEAD@{12}
error: unknown switch `e'
usage: git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]
   or: git reset [-q] [<tree-ish>] [--] <pathspec>...
   or: git reset [-q] [--pathspec-from-file [--pathspec-file-nul]] [<tree-ish>]
   or: git reset --patch [<tree-ish>] [--] [<pathspec>...]
   or: DEPRECATED: git reset [-q] [--stdin [-z]] [<tree-ish>]

    -q, --quiet           be quiet, only report errors
    --no-refresh          skip refreshing the index after reset
    --mixed               reset HEAD and index
    --soft                reset only HEAD
    --hard                reset HEAD, index and working tree
    --merge               reset HEAD, index and working tree
    --keep                reset HEAD but keep local changes
    --recurse-submodules[=<reset>]
                          control recursive updating of submodules
    -p, --patch           select hunks interactively
    -N, --intent-to-add   record only the fact that removed paths will be added later
    --pathspec-from-file <file>
                          read pathspec from file
    --pathspec-file-nul   with --pathspec-from-file, pathspec elements are separated with NUL character
    -z                    DEPRECATED (use --pathspec-file-nul instead): paths are separated with NUL character
    --stdin               DEPRECATED (use --pathspec-from-file=- instead): read paths from <stdin>
```



# Environment

gitのバージョンは以下の通り

```powershell:powershell
> git --version
git version 2.37.0.windows.1
```

# 対策

これだとダメなんですが、

```powershell:powershell
> git reset --hard HEAD@{12}
```

こうするといけました。

```powershell:powershell
> git reset --hard 'HEAD@{12}'
```

クォーテーション`'`で囲んであげればいいんですね。

# 終わりに

日本語の記事がなくて焦ったので記事化。
これって結構初心者でも躓くところだと思う。

とはいっても、初心者は`git reflog`使わないか。。。


# 参考にした記事

https://github.com/dahlbyk/posh-git/issues/106
Python for文 初心者

# １．はじめに

初投稿です。
至らぬ点や間違いはご指摘くださると幸いです。
自分用の記事ですが、同じPython初心者の方向けにも書いてみました。

私はプログラミング初心者です。今年の新卒で、会社の研修でJavaは１か月半ほど学びました。現在は色々あってPythonの勉強をしている最中なのですが、今回はfor文についてまとめていきたいと思います。

# ２．for文の基本的な書き方

**for 変数名 in 何らかのオブジェクト:
 　　実行する処理**

例文）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732993/968f44a7-56cd-f18f-bf8d-5974c763d874.png)
するとこのように表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732993/10209645-a1c7-0f31-49d6-9d5fb8ba3c06.png)
これは変数 i に wordList の①'おはよう',②'こんにちは',③'こんばんは',④'おやすみ' が1つずつ格納され、
print()関数で出力されているためです。

１）変数wordListに①「おはよう」格納→print()関数で出力
　　　　　　　　　　　↓
２）変数wordListに②「こんにちは」格納→print()関数で出力
　　　　　　　　　　　↓
３）変数wordListに③「こんばんは」格納→print()関数で出力
　　　　　　　　　　　↓
４）変数wordListに④「おやすみ」格納→print()関数で出力


# ３．range()関数の使い方

基本的な書き方は先ほどと変わりません。

**for 変数名 in range():
 　　実行する処理**

例文）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732993/9b045107-ba8b-0111-484b-0a6f2385288c.png)
するとこのように表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732993/9f99fba5-8b35-3224-b29a-06137a090b76.png)
これは range()関数でfor文で**ループさせる回数を指定している**ためです。
今回は 0,1,2,3,4 の5回分ループさせています。

# 4.for文　＋αで覚えるべき内容
最後に、他にも「こんな書き方があるよ」というのを一例ですが、まとめて紹介しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732993/d5a63c38-a401-fcb7-da8c-466b8cf19e7c.png)
一応実行結果も載せておきます。
①４～５行目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732993/68fcffcd-75af-5676-3dc0-0cd2b5fcd7b2.png)
②７～９行目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732993/2bd37652-feab-2207-603c-ade7fafaa807.png)
③１０～１６行目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732993/b14de8f7-ae56-a8a9-e443-1878524a0c68.png)

①これはrange()関数に2つ値を指定すると**1つ目を開始、2つ目を終了する値**として受け取ってくれるというものです。
 ※ここで気を付けなければならないのが**終了値は表示されない**ということです。

②今度は開始・終了値を指定したうえに、**3つ目の値を設定すると増加値**として受け取ってくれます。
 これで上の実行結果のように10までの数字の偶数だけを表示させることもできるようになります。

③最後はcontinue文とbreak文です。**continueは指定した値をスキップ**してくれ、**breakは指定した値がきたらループを止めて**くれます。
 今回は「3」でcontinue、「8」でbreakにしているので上記のような結果になります。
 ※このときも8は表示されないので注意してください。

# ５．おわりに
 以上になります。
初心者なので勉強不足による間違いがあったらご指摘ください。
Py-EVM(Ethereum Virtual MachineのPython実装)をインストールしてみた

Python実装のEthereum Virtual Machineのソースコードを見たかったので、ソースからPy-EVMをインストールしてみました。

（０）環境
>Windows 10, WSL2, Ubuntu 20.04

（１）ソースをダウンロードして適当なフォルダへ展開

[ethereum / py-evm](https://github.com/ethereum/py-evm)

（２）あとは惰性で。。。

```
sudo apt update
sudo apt upgrade
sudo apt install python3.9-dev
sudo apt install python3-pip
pip install virtualenv
virtualenv -p python3 venv
source venv/bin/activate
cd [ソース展開フォルダ]
pip install -e ".[dev]"
```

おしまい
cscの作法 その251

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
hex文字ファイルからexeを作れ。

# 方針

- File.ReadAllText　読み込み
- BinaryWriter　書き込み
- Replace Split　整える
- Convert.ToByte　変換

# サンプルコード

```
using System;
using System.IO;
using System.Text;

class test0 {
	static void Main(string[] args) {
		string src = File.ReadAllText("KEYCODE.hex");
		src = src.Replace("  ", " ");
		src = src.Replace("\r\n", "\n");
		string[] lines = src.Split('\n');
		string FileName = "keycode1.exe";
		FileStream filStream = new FileStream(FileName, FileMode.Create, FileAccess.Write);
		BinaryWriter bw = new BinaryWriter(filStream);
		foreach (string line in lines)
		{
			string[] hexValuesSplit = line.Split(' ');
			foreach (string hex in hexValuesSplit)
			{
				byte value = Convert.ToByte(hex, 16);
				Console.WriteLine("hexadecimal value = {0}, byte value = {1}", hex, value);
				bw.Write((byte) value);
			}
		}
	}
}

```

# 実行結果


```

hexadecimal value = 74, byte value = 116
hexadecimal value = 69, byte value = 105
hexadecimal value = 2d, byte value = 45
hexadecimal value = 53, byte value = 83
hexadecimal value = 63, byte value = 99
hexadecimal value = 72, byte value = 114
hexadecimal value = 65, byte value = 101
hexadecimal value = 65, byte value = 101
hexadecimal value = 6e, byte value = 110
hexadecimal value = 20, byte value = 32
hexadecimal value = 53, byte value = 83
hexadecimal value = 61, byte value = 97
hexadecimal value = 76, byte value = 118
hexadecimal value = 65, byte value = 101
hexadecimal value = 72, byte value = 114
hexadecimal value = 2e, byte value = 46
```


以上。
【Python】andで繋いだ条件式はFalseになった時点で以降の条件式が無視される

どこかに記事がありそうな気もしますが、備忘録もかねて…。

## 実際にやってみる
以下のようなコードを実行する。

```python:sample.py
a = 0

if b == 1 and a == 1:
    print('passed')
else:
    print('failed')
```

変数 b は定義されていないが、一つ目の条件式に登場する。

### 実行結果
```
$ python sample.py

Traceback (most recent call last):
  File "aaa.py", line 3, in <module>
    if b == 1 and a == 1:
NameError: name 'b' is not defined
```

変数 b が定義されてないというエラーが出る。当然である

## 条件式の前後を入れ替える

コードを以下のように変更する。

```python:sample.py
a = 0

if a == 1 and b == 1:
    print('passed')
else:
    print('failed')
```

変数 a は定義されているが、値が一致しない。
変数 b は and の後に登場する。

### 実行結果
```
$ python sample.py

failed
```

エラーが出ることなく処理が完了した。

## まとめ

どうやら and で繋いだ条件式の場合、False になった時点でそれ以降の式を無視するらしい。
インタープリタなのでそういうもんなんでしょうかね。
【VSCode】Tailwind CSS IntelliSense で補完が効かない場合

## 前書き
VSCodeの拡張機能の `Tailwind CSS IntelliSense`を入れてみたものの、補完が反応せず、色々試した結果解決しました、それのメモ書きです。

https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss

## 前提条件

- `Tailwind CSS IntelliSense`をインストール。

![271BB4E8-7A17-4D45-903D-7F7D2C45A6F9_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/6fda27b3-d7d7-051d-84e1-f904d6ef8592.jpeg)


- ワークスペースに`tailwind.config.js`が存在すること、なければ作りましょう

```
npx tailwindcss init -p
```

- vscodeの`settings.json`に下記の内容を追記

```
 "editor.quickSuggestions": {
    "strings": true
  }
```

以上の作業終えても補完効かなかった場合、*vscodeのバージョン*を上げましょう!:point_up_tone1:
pythonでutf-8の文字コードを使って正規表現で特定の文字（文字コード）が含まれるか判定

### タイトルの内容を実現しようとした背景から書きます

## 背景
#### やりたかったこと
例として、『ゼロ幅スペース』（UTF-8 :「E2 80 8B」）<b>など</b>がファイル中に含まれているかチェックしたかった

“あ”のような通常の文字であれば、ソースコードに書けますが
『ゼロ幅スペース』の場合は書いてしまうと（たとえコメントを書いていても）
わかりにくいと思い、「この文字コードを指定している」と明示しようと
考えた次第です。

それに加えて、入力データ中でチェックしたい文字コードは『ゼロ幅スペース』だけではないと判断できたので、文字コードの範囲を指定して**正規表現**でチェックをしようと考えました。

#### なぜ文字コード（utf-8）で指定しようとしたか
想定していない文字コードが文字化けをしたときに、xddコマンドで調べると表示されるのはutf-8のコードだった。

文字化けした
　-> xxdコマンドで原因となる文字コードを特定
　　->  utf-8で表示された文字コードをpythonでチェックしたい

#### ネックになった部分
・utf-8をPythonのコード中で記述する方法がわからなかった  
　『ゼロ幅スペース』はunikcodeであれば　「'\u200B'」と書けばいいことはわかった
・正規表現で文字コードを指定する方法がわからなかった

<span style="font-size: 60%;">※　上記２がわからなかったので、いわば「わからないことがわからない」状態で質問をしてしまい、ご迷惑をおかけしましたこと、この場をお借りしてお詫びします。</span>

#### 解決方法
・decode('utf-8')を使ってutf-8の文字コード指定　コードを指定して変数に文字を一旦入力
・上記の変数を正規表現で使うため、compileを使用
　
#### 解決方法（Code）

```
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import re
import sys

searchstr = "今日の気温は25℃です"

# 正規表現パターンオブジェクトの生成(コンパイル)
str1 =  b'\xe3\x81\x82'.decode('utf-8')  # “あ”
str2 =  b'\xe3\x82\x93'.decode('utf-8')  # “ん”
print(str1)
pattern = re.compile(r'['+str1+'-'+str2+']')
print(pattern)
str1 = 'あ'
# matchメソッドで文字列を検索
print(  pattern.search(searchstr) )
print()

# 正規表現パターンオブジェクトの生成(コンパイル)
str1 =  b'\xe2\x84\x80'.decode('utf-8')  # “℀”
str2 =  b'\xe2\x84\x8F'.decode('utf-8')  # “ℏ”
print(str1)
pattern = re.compile(r'['+str1+'-'+str2+']')
print(pattern)
str1 = 'あ'
# matchメソッドで文字列を検索
print(  pattern.search(searchstr) )
```

[結果]
```
あ
re.compile('[あ-ん]')
<_sre.SRE_Match object; span=(2, 3), match='の'>

℀
re.compile('[℀-ℏ]')
<_sre.SRE_Match object; span=(8, 9), match='℃'>
```
Salesforceでレポートを作成しよう～過去60日間商談が作成されていない取引先一覧の表示

本橋孝昭です。
Salesforceのレポートでこんなことしたい。という要望があるので作成方法をご紹介します。


### やりたいこと：
過去60日間商談が作成されていない取引先一覧の表示



こちらについてクロス条件を使用したレポート作成が可能です

参考ヘルプ：クロス条件の作成
https://help.salesforce.com/s/articleView?id=sf.reports_cross_filters_create.htm&language=ja&r=https%3A%2F%2Fwww.google.com%2F&type=5


クロス条件を作成するにはこちらをクリックします
![クロス条件.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/0ce6c586-5c9a-7851-7228-f70806f386c6.png)


そして以下のように設定します

取引先：関連しない　商談
作成日
次の文字列と一致する　過去60日間

![クロス２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f4d8e8f8-e7b4-f211-647a-1cd8cfe4fc95.png)


以上で完成です。
なお、今回「過去60日間」のように相対日付を作成しましたが、
相対日付は以下のヘルプのように他にも作成可能です。

ぜひ他の相対日付も使用し応用してみてください

リストビューとレポートで使用する相対日付
https://help.salesforce.com/s/articleView?id=000316282&type=1
Symfonyのコントローラにおけるパラメータ取りだし

# Symfonyのコントローラにおけるパラメータ取りだし

## Symfony\Component\HttpFoundation\Request のプロパティ
| アクセス | class | 説明 |
| -- | -- | -- |
| ->query | ParameterBag | URLのクエリパラメータ |
| ->request | ParameterBag | POSTのリクエストパラメータ |
| ->attributes | ParameterBag | Routeアノテーションで定義したパスパラメータ |

## Symfony\Component\HttpFoundation\Request のメソッド
| アクセス | 型 | 説明 |
| -- | -- | -- |
| ->get('name') | string | 値 |

## ParameterBag で使用可能な取りだし方法
| アクセス | 型 | 内容 |
| -- | -- | -- |
| ->all() | KV array | すべてのパラメータ |
| ->has('name') | boolean | 'name' のパラメータ有無 |
| ->get('name') | string | 値 |

## Routeアノテーションの暗黙に定義される名前
| 名前 | 型 | 説明 |
| -- | -- | -- |
| _route | string | Routeでつけた最終的な name |
| _route_params | KV array | 呼び出されたときのパラメータ |
| _controller | string |クラス名::メソッド名 |
【Node.js】Node.jsでExcelのフォーマットを崩さず加工

## 導入：スマホアプリエンジニア目線
×：スマホアプリ内部でフォーマットを崩さずにエクセルを編集・書き出しをする
○:サーバーサイドでエクセルの編集・書き出し(アプリにレスポンスでExcelを投げる)をする

## 早速Node.js + Herokuでアプリを作ることに
Node.jsは初心者なのでお手柔らかに、、(アロー関数等を使えばもっと綺麗になると思います。)
今回は無料で使えるHerokuを用いてサーバーアプリを作ることにしました。
・Heroku
参考：https://jp.heroku.com/free

・Nodeの環境構築
各OSによって違いがあるので今回は省略

・expressを導入(Webフレームワーク)
参考：https://expressjs.com/ja/

・xlsx-populateを導入
参考：https://github.com/dtjohnson/xlsx-populate#xlsx-populate

### xlsx-populateに決定した理由
・今回はテンプレートのExcelファイルに追記したいのでフォーマットが崩れないものを選んだ


## 以下、コードで説明

・導入したフレームワークをインポートする
```node.js
const XlsxPopulate = require('xlsx-populate');
const express = require('express');
const app = express();
```

・JSONオブジェクトを認識するコード
・Herokuで使うためにポート3000番を解放
(他、今回は使わないコードも記載。)
```node.js
app.use(express.urlencoded({
    extended: true
}));
app.use(express.json());

app.listen(process.env.PORT || 3000);
console.log('Server is online.');
```

・スマホアプリからPostでリクエストする
スマホアプリからリクエストするときにbodyにJsonを付与する。

```node.js
app.post('/createExcel', function(req, res) {


  console.log(req.body);
  

  const json = req.body;

  //. テンプレート
  const templateFile = './01.xlsx';

  //. 出力先(Herokuではtmp以下にファイルを一時保存する)
  const outputFilePath = '/tmp/' + json.excelName + '.xlsx';

  XlsxPopulate.fromFileAsync(templateFile).then( book => {
    // 0番目のsheetに書き込む
    var sheet1 = book.sheet(0);
    for (const [key, value] of Object.entries(json.cell)) {
      sheet1.cell(key).value(value);
    }
    // outputFilePathnに書き出し
    book.toFileAsync(outputFilePath).then( result => {
      // resで端末にダウンロードさせる
      res.download(outputFilePath);
    });
  });
})
```

・json一例
```json
{
    "excelName":"書き出したいエクセル名",
    "cell":
    {
        "D8":"D8に入れたい内容",
        "F8":"F8に入れたい内容"
    }
}
```

## コード全体
```node.js
const XlsxPopulate = require('xlsx-populate');

const express = require('express');
const app = express();

// urlencodedとjsonは別々に初期化する
app.use(express.urlencoded({
    extended: true
}));
app.use(express.json());

app.listen(process.env.PORT || 3000);
console.log('Server is online.');

app.post('/createExcel', function(req, res) {


  console.log(req.body);
  

  const json = req.body;

  //. テンプレート
  const templateFile = './01.xlsx';

  //. 出力先
  const outputFilePath = '/tmp/' + json.excelName + '.xlsx';

  XlsxPopulate.fromFileAsync(templateFile).then( book => {
    var sheet1 = book.sheet(0);
    for (const [key, value] of Object.entries(json.cell)) {
      sheet1.cell(key).value(value);
    }

    book.toFileAsync(outputFilePath).then( result => {
      res.download(outputFilePath);
    });
  });
})
```

## できそうなこと・今回妥協したこと
・文字、Cell等にプロパティをつける
・入力した値でExcel内のマクロ(関数)を実行させる

アロー関数使ったら！と意見がありましたので時間見つけて修正しておきます。

## 最後に
iOSアプリ開発をしています。
主にSwiftですが、最近は熱が入ってきてFlutterも🦾
色々やってます。もし良かったら見てってください。

https://sogablog.net/
【もう迷わない！】データ分析実務スキル検定勉強法

<h1>はじめに</h1>
この記事はデータ分析実務スキル検定を取得したいけど勉強法が分からない、やるなら効率的に勉強したいという人におすすめです。
この資格は比較的新しいので、勉強法などがまとまっている記事は多くありません。そこで、自分の経験と自分が調べた合格体験記を踏まえた勉強法をまとめたいと思い、この記事を書いています。

<h1>この記事でわかること</h1>
<ul>
<li>データ分析実務スキル検定に合格するための具体的な勉強法</li>
<li>おすすめの教材</li>
</ul>

<h1>前提</h1>
学習を始めた時点では、
<ul>
<li>SQLは学習し始めて2か月程度</li>
<li>Pythonは学習し始めて1か月程度</li>
<li>大学時代に統計学を専攻していたため統計学の基礎知識はある</li>
<li>機械学習は全く分からない</li>
</ul>
というような感じでした。ですが、実務で使用した経験はないので、まだまだ知識は浅いです。

<h1>おすすめの教材</h1>
<ul>
<li>公式テキスト</li>
<li>Udemy　演習形式で学ぶ】「データ分析実務スキル検定(CBAS)」合格への道(データ分析実務スキル証明資格で高得点を目指す講座)←定期的にセールをやっているので安くなったら買いましょう。</li>
Udemyの講座は<a href="https://www.udemy.com/course/cbas-prep/">こちら</a>で購入できます。
</ul>

<h1>結果</h1>
<B>81点</B>/94点で合格でした。<br/>
全体の難易度は模擬試験とあまり変わらなかったです。







<h1>データ分析実務スキル検定の特徴</h1>
<ul>
<li>問題数は60問で試験時間は90分</li>
<li>合格ラインは94点満点中64点以上(約68%)</li>
<li><B>マーク式だが複数回答の問題が多数(消去法が使えない)</B></li>
<li>試験結果はすぐにわかる</li>
<li>詳しくは<a href="https://cbas-exam.jp/">こちら</a>から</li>
</ul>

<h1>おすすめの勉強法</h1>
<p>グーグルで調べた合格体験記と自分の体験を踏まえると以下の順番が最適だと思います。</p>
<ol>
<li>公式テキストをざっと読む(理解度7割程度)</li>
<li>時間を測って公式テキストの模擬試験(15章)を解く</li>
<li>答え合わせをする前に時間無制限でわからなかった問題を解いてみる</li>
<li>答えあわせをして弱い単元をUdemyの講座で補足する</li>
<li>正解率(理解度)が9割に達するまで2~4を繰り返す</li>
</ol>

<h1>1.公式テキストをざっと読む(理解度7割程度)</h1>
まずは公式テキストをざっくりと読みましょう。SQLやRでは何ができるのか？どのような手順でプロジェクトは進んでいくのか？など<B>全体をとらえるイメージ</B>を持つのが良いと思いました。細かい理解は後でよいので「SQLはデータの加工ができて、2つ以上のテーブルを結合することもできるのか」程度で大丈夫です。

<h1>2.時間を測って公式テキストの模擬試験(15章)を解く</h1>
ここでは1問にかけられる時間や設問ごとの難易度を把握しましょう。自分が初めてこの模擬試験を解いた際に思ったことは、
<ul>
<li>SQL、R、Pythonの問題は単一回答が多いから得点源とするべき</li>
<li>統計学と機械学習は複数回答の問題があるので理論や仕組みをしっかり理解する必要がある</li>
<li>エクセルはピボットテーブル+簡単な関数の知識が問われる</li>
ということです。
</ul>

<h1>3.答え合わせをする前に時間無制限でわからなかった問題を解いてみる</h1>
ここでは自分の理解度を把握しましょう。間違った問題が時間がないから解けなかったのか、そもそも理解が足りていなかったのかがわかると思うので、時間無制限でしっかり考えてみましょう。時間無制限といってもこの試験は複雑な計算問題などは出題されないのであまり時間はかからないと思います。


<h1>4.答えあわせをして弱い単元をUdemyの講座で補足する</h1>
自分ができなかった単元をUdemyの講座で復習しましょう。Udemyの講座の良いところは<B>解説がついている</B>ところです。模擬試験は解説が載っていないので、復習が難しく理解の定着が難しいです。そのため、わからなかった部分はまずは公式テキストで調べ、それでもわからなかったらUdemyで補うというスタンスが効率がいいです。(Udemyの講座は端的にとてもよくまとまっているので時間がある方は全単元を視聴することをおすすめします。)
<br/>また、この資格は模擬試験が1つしかないので、SQL、R、Pythonはコードを1行ずつ見ていって1つでもわからない要素があったら復習をしましょう

<h1>5.正解率(理解度)が9割に達するまで2~4を繰り返す</h1>
最終的には模擬試験の正解率(理解度)9割を目指しましょう。同じ問題を何度も解いていると選択肢を見るだけで正解が分かってしまう現象が発生するので、正解が分かったとしてもなぜその選択肢になるのかを考えて<B>理解度9割</B>を目指しましょう。

<h1>おわりに</h1>
あくまで自分なりに勉強方を羅列しただけになりますが、データ分析実務スキル検定を受ける皆さんの参考になればうれしいです。ここまで読んでいただきありがとうございました。
vCenterでShellモードに入る方法

いつも忘れるのでメモ・・・

https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.vcenter.configuration.doc/GUID-8F0E13E2-8227-4EC4-A863-758D48EBC72D.html

```
Command> system.version.get
Version:
   Product: VMware vCenter Server Appliance
   Installtime: 2019-07-08T18:44:10 UTC
   Summary: Patch for VMware vCenter Server Appliance 6.5.0
   Releasedate: May 14, 2019
   Version: 6.5.0.24000
   Build: 13638625
   Type: vCenter Server with an embedded Platform Services Controller
Command> shell
Shell is disabled.

Command> shell.set --enabled true
Command> shell
    ---------- !!!! WARNING WARNING WARNING !!!! ----------

Your use of "pi shell" has been logged!

The "pi shell" is intended for advanced troubleshooting operations and while
supported in this release, is a deprecated interface, and may be removed in a
future version of the product.  For alternative commands, exit the "pi shell"
and run the "help" command.

The "pi shell" command launches a root bash shell.  Commands within the shell
are not audited, and improper use of this command can severely harm the
system.

Help us improve the product!  If your scenario requires "pi shell," please
submit a Service Request, or post your scenario to the
https://communities.vmware.com/community/vmtn/vcenter/vc forum and add
"appliance" tag.
```
threadingをやめてasyncio&aiohttpで楽にPythonスクレイピングを行う

効率的なスクレイピングを行うにはリクエストとレスポンス間の待ち時間をなくすこと。これを実現するためにはthreadingモジュールでマルチスレッドか、asyncモジュールで並列処理をするかだ。

マルチスレッドは気軽に実装できる反面、デバッグが困難になる。asyncの非同期処理はコード量がやや増えるが、デバッグが楽。

この記事を呼んで我に返った

https://qiita.com/Toyo_m/items/992b0dcf765ad3082d0b

よし、threading使うのやめて、async使おうってことで試作したコードが以下

やっていることは、リクエストをしてスリープを１秒間を５回実行する（※スリープの理由は逮捕は嫌なので）

ネット環境によるのだろうけど、5回で２秒近くの処理時間の差が生まれる

```python3
import aiohttp
import asyncio
import time
import requests

url = 'https://qiita.com/osorezugoing/items/4ea5249c43c0ba8b89aa'
start_time = time.time()
res_list = []
tasks = []
# 計測結果
normal_exec_time = 0
async_exec_time = 0


def normal_request():
    """同期処理を５回実行
    1. リクエスト
    2. レスポンスの到着を待機
    3. 1秒間スリープ
    """
    global normal_exec_time
    print('normal_request')
    for i in range(5):
        res = requests.get(url)
        res_list.append(res)
        print(i, 'request interval')
        time.sleep(1)
    # 経過時間計測
    normal_exec_time = time.time() - start_time
    print("--- %s seconds ---" % (normal_exec_time), '\n')


def async_request():
    """非同期処理を５回実行
    1. リクエスト
    2. 1秒間スリープ
    3. 1と2を5回実行
    3. レスポンスの到着を待機
    """
    global async_exec_time
    print('async_request')

    async def _req(i):
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as response:
                res_list.append(response)
                print(i, 'request interval')
                time.sleep(1)

    async def _run():
        # 非同期オブジェクトをtaskへ追加
        for i in range(5):
            tasks.append(_req(i))
        # taskのすべての処理を待機
        await asyncio.gather(*tasks)

    # この記述は実行環境がwindowsのため
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
    # 非同期処理実行
    asyncio.run(_run())
    # 経過時間計測
    async_exec_time = time.time() - start_time
    print("--- %s seconds ---" % (async_exec_time), '\n')


if __name__ == '__main__':
    # 同期処理
    normal_request()
    # 非同期処理
    start_time = time.time()  # 初期化
    async_request()
    # 同期と非同期の処理時間の差
    print('diff: ', normal_exec_time - async_exec_time)

```

```
normal_request
0 request interval
1 request interval
2 request interval
3 request interval
4 request interval
--- 7.513632774353027 seconds --- 

async_request
0 request interval
4 request interval
1 request interval
3 request interval
2 request interval
--- 5.4084553718566895 seconds --- 

diff:  2.105177402496338
```

さあ、これから新しいブランチ切って始めますかー
sassの@importが廃止になる、Dart Sassに置き換える時メモ

## Sassについて
今まで特に意識することなくなんとなく使っていましたが、
`@import`が廃止になると知り軽く調べてみました。
SassにはDartSass、LibSass、RubySassの3種類が存在するらしい。
ですが、LibSassとRubySassに関しましては既に非推奨になっていて、
Sass公式では、DartSassを推奨しているようです。

## `@import`が廃止になり、`@use`、`@forward`が追加された
`@import`には色々な障害があったらしく、それらを解決するために
`@use`と`@forward`が追加されたようです。

## `@import`から、`@use`、`@forward`に書き換える
単純にscssを読み込んでいる場合は、下記のように置き換えれば大丈夫です。
```_base.scss
html {
  font-size: 10px;
}

```

```diff_scss 
// sample.scss
- @import "./base";
+ @use "./base";

```

たとえば`_color.scss`を読み込み変数を使用する場合は、
下記のように書き換えれば使用できます。
```_color.scss
$color-black: #000;

```

```diff_scss 
// sample.scss
- @import "./color";
+ @use "./color";

- color: $color-black;
+ color: color.$color-black;
```
また、`@use`で読み込んだファイルに`as`をつけることで名前空間を指定することができます。
```_color.scss
$color-black: #000;

```

```sample.scss
@use "./color" as c;

color: c.$color-black;
```

mixinを読み込んで使用する場合が下記のようになります。
変数を読み込む時と似たような感じです。
```_fontSize.scss
$baseSize: 10px;

@mixin baseSize() {
  font-size: $baseSize;
}
```

```sample.scss
@use "./fontSize";

@include mixin.baseSize();
```

他のscssファイルを経由して使用する時は下記のようになります。
```_color.scss
$color-black: #000;
```
```_fontSize.scss
$baseSize: 10px;

@mixin baseSize() {
  font-size: $baseSize;
}
```

```diff_scss 
// _base.scss
- @import "./color";
+ @forward "./color";

- @import "./fontSize";
+ @forward "./fontSize";
```

```diff_scss 
// sample.scss
- @import "./base";
+ @use "./base";

html {
 color: base.$color-black;
 @include base.fontSize();
}
```

#### 除算演算子（/）を使う時は、sass:mathを使用する
```diff_scss
+ @use "sass:math";

.div {
-  width: (100% / 3);
+  width: math.div(100%, 3);
}
```
calc()関数を使い内部に(/)を使う場合は、今まで通り
`calc(100% / 3)`
のように書いて大丈夫なようです。

自分が差し当たって使用したのは上記くらいでした。
もっと変わった部分があるみたいですが、おいおい追記していきたいと思います。
nuxt vue-pdf利用方法

### 前提条件
- nuxtのアプリケーションを利用
- 画面上にpdfデータをプレビュー表示したい
- APIからはPDFのblobデータが返ってくる


## 手順
1. ライブラリインストール
1. 実装


### 1. ライブラリインストール
```
$ yarn add vue-pdf@4.2.0
$ yarn add pdfjs-dist@2.7.570
```
最新のバージョンをインストールするとエラーになるためバージョン指定でインストール
バージョンは以下のisuuesを参考にしました
https://github.com/FranckFreiburger/vue-pdf/issues/338
https://github.com/FranckFreiburger/vue-pdf/issues/315

### 2. 実装
```vue

<template>
  <div>
    {{ currentPage }} / {{ pageCount }}
    <pdf
      :src="src"
      @num-pages="pageCount = $event"
      @page-loaded="currentPage = $event"
      :page="currentPage"
    />
  <//div>
</template>

<script>
import pdf from 'vue-pdf'

export default {
  components: {
    pdf
  },
  data() {
    return {
      src: null,
      pageCount: 0,
      currentPage: 1,
    }
  },
  mounted() {
    // blobにはAPIからとってきたPDFのblobデータが入っている想定
    const arrayBuffer = await blob.arrayBuffer()
    const typedArray = new Uint8Array(arrayBuffer)

    this.src = pdf.createLoadingTask({
      data: typedArray,
      cMapUrl: 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.7.570/cmaps/',
      cMapPacked: true,
    })
  }
}
</script>
```
[Linux] よく使うfindコマンドオプション

# 概要

よく使うファイル検索だけをまとめた。
これらは、VSCodeなどの統合開発環境を使うことのできない環境では、大変お世話になります。

色々なoptionを網羅的に書いてあるサイトもあるが、どれが自分にとって必要なコマンドなのかわかりにくい。

基本的にはこれだけで十分。

# 検索コマンド

## 1. ファイル名を再帰的に検索

`hoge`という文字列を含むファイル名のファイルを検索

```bash
$ find ./ -name *hoge*
```

## 2. directory名を再帰的に検索

`hoge`という文字列を含むディレクトリ名のディレクトリを検索

```bash
$ find ./ -name *hoge* -type d
```

## 3. 指定したディレクトリ内のファイル内文字列を検索

`./dir`ディレクトリの中にあるファイルの内、
ファイル内に`hoge`という文字列を含むファイルを検索

```bash
$ find ./dir -type f -print | xargs grep -n hoge
```

# 参考

find コマンド以外にも便利なコマンドや記事をメモしておく

## ディレクトリを zip ファイルに格納

```bash
$ zip archive -r target_directory
```

## 複数ファイルの拡張子をまとめて1発置換

https://qiita.com/fujieee/items/6c3fcca4de52b84a03c1
mpg123のラッパースクリプト

こんな感じのスクリプトにしています。

```sh:jazz.sh
#!/bin/sh

if [ $# -eq 0 ]; then
        echo "jazz.sh [wbgo|wwoz|wayo|sakura]"
        exit 1
fi

while getopts bk option
do
  case $option in
    b)
     BG="yes"
     ;;
    k)
     KI="yes"
     ;;
    \?)
      exit 1
  esac
done

shift `expr "${OPTIND}" - 1`
if [ $# -ge 1 ]; then
case $@ in
        "wbgo" )
ST="http://wbgo.streamguys.net/wbgo128"
SR="48000"
        ;;
        "wwoz" )
ST="http://wwoz-sc.streamguys1.com/wwoz-hi.mp3"
SR="44100"
        ;;
        "wayo" )
ST="http://streaming.wayofm.org/wayo-192"
SR="48000"
        ;;
        "sakura" )
ST="http://kathy.torontocast.com:3330/stream"
SR="44100"
        ;;
        * )
echo "station incorrect"
        ;;
esac
else
  killall mpg123
fi

if [ -n "${ST}" ]; then
N=`awk '/default/{gsub("pcm","");gsub(":","");print $1}' /dev/sndstat`
sysctl dev.pcm.${N}.bitperfect=1 > /dev/null
sysctl dev.pcm.${N}.play.vchanrate=${SR} > /dev/null
if [ -n "${BG}" ]; then
/usr/local/bin/mpg123 --no-control --utf8 ${ST} > /tmp/jazz.log 2>&1 &
else
/usr/local/bin/mpg123 --utf8 ${ST}
fi

fi

```

sakuraは日本のJAZZステーションです。けっこういいですよ。
SQLのテンプレート(SQL Server)

たまにしか使わないSQLをメモ、メモ…

### １．テーブルのコピー関連
#### ・テーブルの構造コピー(カラム名、主キー等すべて同じクローンテーブル作成)
判らんかった。
SQLマネージメントスタジオで、テーブルのコピー＞新規作成＞…
で元テーブルのCreate文(主キーなどのCreate文含む)を作成し、テーブル名を変更してクローンテーブルを作成した。

#### ・同じ構造のテーブルへの「データのみ」まるっとコピー

```sql
INSERT INTO [コピー先テーブル]
SELECT * 
FROM [オリジナルテーブル]
```

### ２．日付関連
#### ・日付と時刻を合体させる方法
```sql
DECLARE @Day VARCHAR(10) = '20140801'
DECLARE @Time VARCHAR(10) = '10:10'

SELECT CONVERT(DATETIME, CONVERT(VARCHAR, @Day, 111) + ' ' + CONVERT(VARCHAR, @Time, 108))
```
herokuの本番環境URLを調べる

ちょっと時間が空いてしまいましたが、本日も頑張っていきましょう。

今日はシンプルです。herokuへのデプロイがスムーズにできるようになったのですが、
本番環境URLがわからなくなり、困ったので調べて解決できました。

ターミナル上で、以下コマンドを実行します。

```php
$ heroku domains
```

実行結果
```
=== pacific-gorge-95654 Heroku Domain
pacific-gorge-数字.herokuapp.com
```

この「pacific-gorge-数字.herokuapp.com」がURLです。これにアクセスすればOKです。

今回は以上です。
ドメイン駆動設計入門 #1 ドメイン駆動設計とは

### はじめに

本投稿より「ドメイン駆動設計入門」について週1~2本くらいの投稿ペースで読み進めていきます。適宜気になったポイントや大事だなと感じた点を記事に記載していく予定です。
※本のリンクは[こちら](https://www.amazon.co.jp/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E3%83%9C%E3%83%88%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E6%9C%AC-%E6%88%90%E7%80%AC-%E5%85%81%E5%AE%A3/dp/479815072X/ref=cm_cr_arp_d_product_top?ie=UTF8)

### 今日の内容
chapter1 : ドメイン駆動設計とは

### ドメイン駆動設計とは何か

ドメイン駆動設計は、エリック・エヴァンズが提唱した、ユーザが従事する業務に合わせてソフトウェアを開発する手法。
知識は取捨選択される必要があります。そして、ユーザにとって役に立つソフトウェアを開発するためには、価値ある知識と無価値な知識を慎重に選り分けて、選び抜かれた知識をコードに落とし込む必要があります。
価値あるソフトウェアを構築するには、利用者の問題を見極め、解決するための最善手を常に考える必要があり、ドメイン駆動設計は、上記のような洞察を繰り返しながら設計し、ユーザとそのユーザを取り巻く環境を実装を結びつけることを目的としている。

### ドメインモデルとは何か
モデルとは現実の事象あるいは概念を抽象化した概念である。現実をすべて忠実に再現できるわけではないため、必要に応じて取捨選択する必要がある。ex."ペン"という言葉の性質を抽出するとき、小説家にとっては「文字を書くもの」であり、文房具屋にとっては「商品」である

ドメイン駆動設計では、<b>ドメインの概念をモデリングして得られたモデル</b>をドメインモデルと呼ぶ。
※ドメインモデルはあくまでも概念を抽出化した知識に留まる。なにかしらの媒体で表現することで問題解決の力を得ることができる

ドメインモデルをソフトウェアで動作するモジュールとして表現したものがドメインオブジェクトです。
どのドメインモデルをドメインオブジェクトとして実装するかは重要な問題で、開発者は真に役立つモデルを取捨選択する必要があります。利用ユーザの問題解決に何ら関わりのないものを、ドメインオブジェクトとして実践するのは時間の無駄となってしまいます。

### ドメイン駆動設計の実践を難しくするもの
ドメイン駆動設計はソフトウェア開発をテーマにしている。ソフトウェア開発の現場には、関係者が複数存在する。ドメイン駆動設計のトピックは実装だけにとどまらず、関係者とのコミュニケーションやチームビルディングと密接に関わるものが存在する。開発者個人だけでなく、多くの関係者を巻き込む必要があるといえる。
実際に上記で記載したドメインモデルを形作る作業を開発者だけで完結することは不可能です。ドメインの概念に対するとらえ方はドメインの実践者の視点が欠かせない。
またドメイン駆動設計にかかわらず、設計はある種の理想としての側面がある。重要なのは理想を無理やり現実に当て込むことではなく、現実に適合させるために、とるべき手段を考え選択すること。理想を掲げ、妥協しなくてはならないときに、どこを妥協するのか悩むのもまたソフトウェア開発の楽しみの一つである。


### なぜいま、ドメイン駆動設計か
ソフトウェアは変化するもの。ごく最初期の局所的な開発速度を優先したソフトウェアは、柔軟性に乏しく、変化を吸収しきれない。
ドメイン駆動設計はドメインと向き合うことで分析から設計そして、かいはつまでが相互作用的に影響し合うよう努力を重ねることを求めており、
ソフトウェアの最初期よりも、変化に対応するときに真価があらわれる。プログラムは動かすだけなら簡単だが、動かし続けることは難しい代物であり、システムを長期的に運用したいならば、ドメイン駆動設計をいまこそ学ぶべきである。


### 本書以外の参考
・ドメイン駆動設計入門【DDDをわかりやすく解説】
https://rakusui.org/ddd/
・ドメイン駆動設計とは何なのか？ ユーザーの業務知識をコードで表現する開発手法について
https://codezine.jp/article/detail/11968
PaperMCでSeedCracking対策を行う方法

こんにちは、Unknown(Akkey57492)です。
この記事では、Minecraftサーバーのシードクラッキング対策の方法を紹介します。
# そもそもSeedCrackingとは?
SeedCrackingは、そのままの意味で`ワールドのシード値を特定する行為`を言います。
構造物や木の配置、形やチャンクからシード値を計算して特定することが出来ます。
このシード値特定はネザーでも、バイオームによっては特定できるみたいです。
# なぜCrackingを行う?
このCrackingは殆どの場合、サバイバルサーバーで行われます。
Anti-Xrayを回避して鉱石を投下したり、構造物を不正に見つけるのに使われます。
シード値で疑似的にXrayを行う行為を「SeedXray」と言います。
- 鉱石を手に入れたい
- Anti-Xrayがある
- SeedXrayをするためにシード値を手に入れたり
- SeedCrackingをしよう

となるわけですね。
# 本題
さて、実際に対策していきましょう。
この方法は簡単であり、サーバーのファイルを少しいじるだけでできます。
サーバーの`paper.yml`を開いて
```yaml
feature-seeds:
  generate-random-seeds-for-all: false
```
を
```yaml
feature-seeds:
  generate-random-seeds-for-all: true
```
に変更します。
後は再起動するだけでこの設定が適応されます。

# これは何?
この設定は、構造物のシード値をランダムに設定してしまう方法です。
エンドシティやエンドゲートウェイの位置をランダム化して、クラッキングを困難にします。
クラッキングには、そのような構造物を使用するため多少なりとも効果があるでしょう。
ただ、PaperMC公式によると、これを設定してもクラッキング自体は可能であるとのこと。
私としては、この方法で十二分に対策ができると考えていますが。

# 油断大敵
対策ができたとしても、油断はしない方がいいでしょう。
万が一鉱石投下を使われた時の対策も考えた方がさらに安全で良いサーバーと言えます。
SpigotやPaperにはいくつかの便利なプラグインがあるため紹介します。
## OreAnnouncer
鉱石をプレイヤーが見つけた場合に、全プレイヤーに通知します。
Adminのみに通知も可能であり、不審なプレイヤーを手動で排除できます。
また、鉱石の発見位置を通知するかの設定や、DiscordSRVとの連携設定もできます。
非常に便利でおすすめなプラグインとなっています。
Download: https://www.spigotmc.org/resources/oreannouncer-collects-data-about-mined-blocks.33464/
## CraftShaft Xray Detector
これは、これまでの統計からXrayを使用しているか判断するプラグインです。
このようなプラグインは、基本的に回避が超絶難しいのでお勧めです。
ただ、数が少なかったり少し不安定なのは欠点でしょう。
Download: https://www.spigotmc.org/resources/craftshaft-xray-detector.65817/

# まとめ
いかがでしたでしょうか。
しっかりとCracking対策をしないと、どっかのたけのこみたいになります。
- paper.ymlの設定変更は推奨
- Seed値が特定された後のことも考える
- どれだけ小規模でもあり得る

これらのことを肝に銘じて、サーバー運営をしてください!
100日後くらいに個人開発するぞ！day060

## 今日はsuperを学んでみた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/bb2592d8-55aa-4c17-319d-e4530e938514.png)


## 今日の学び





### super
* `super`を使うことでオーバーライドした親クラスにある同名のメソッドを呼び出せる
* 親クラスのメソッドの定義に合わせてsuperに対して引数を渡す必要がある
    * 例
        * ` def initialize(name:,price:,calorie:)`
            * `super(name:,price:,calorie:)`
            * `self.name=name`
            * `self.price=price`
            * `self.calorie=calorie`
        * `end`
LibreOfficeのsofficeコマンドでOffice文書をPDF変換してみた

## はじめに

コマンドラインで、Office文書をPDF変換してみました。
LibreOfficeのsofficeコマンドを使用しました。

## LibreOfficeとsofficeコマンド

- LibreOffice
    - オープンソースソフトの統合オフィスソフトウェア
    - Microsoft Officeと互換性あり(完全ではない?)
- sofficeコマンド
    - LibreOfficeに内蔵されたドキュメント変換ツール
    - コマンドラインで、OfficeドキュメントからPDFへの変換など行える

## 検証環境

- Ubuntu 20.04 LTS

## LibreOfficeをインストール

```
$ sudo apt -y install libreoffice libreoffice-l10n-ja libreoffice-dmaths libreoffice-ogltrans libreoffice-writer2xhtml libreoffice-pdfimport libreoffice-help-ja
```

## ExcelファイルをPDFに変換してみる

```
$ soffice --headless --convert-to pdf test.xlsx
convert test.xlsx -> test.pdf using filter : calc_pdf_Export
```

PDF変換できました。
変換に8秒ぐらいかかりました。
ファイルサイズが3MBで大きかった?


## おわりに

LibreOfficeのsofficeコマンドでOffice文書をPDF変換してみました。
PDF変換のバッチ処理などに使えるかもしれません。
一括で古い活動の完了日を更新する（ただし今日の日付でない）



元の質問 [Set a Task due date to reflect the actual completion date](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000IRkWuSAL)

タスクならヘルプ記事があった
[Set a Task due date to reflect the actual completion date](https://help.salesforce.com/s/articleView?id=000337598&type=1)
PytorchやNumpyで"e+"という指数表記を小数表記にする

# 指数表記はわかりづらい

torch.tensorをprintすると、"+e"という指数表記になって、意味が分かりづらいことがあるじゃないですか。

```
[tensor([[1.14178e+01, 1.38472e+02, 1.03706e+02, 2.53196e+02, 9.22984e-01, 2.20000e+01],
        [3.59220e+02, 9.41330e+01, 5.77640e+02, 2.87894e+02, 9.12798e-01, 1.90000e+01]], device='cuda:0')]
```

それを、普通の小数表記に変えたい。

# torch.set_printoptions

```python:print_option.py
torch.set_printoptions(sci_mode=False)
print(some_tensor)
```

これで、小数表記になります。

```
[tensor([[   11.41777,   138.47192,   103.70560,   253.19629,     0.92298,    22.00000],
        [  359.22034,    94.13303,   577.64044,   287.89383,     0.91280,    19.00000]],device='cuda:0')]
```

ちなみに、npの指数標記を小数表記にするには、

```python
np.set_printoptions(suppress=True)
```

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
GitHub Actions入門～サンプル作成・実行まで～

# GitHub Actionsとは
テストやビルド作業などの処理を**自動化**する**GitHub**の機能である

## GitHub Actionsの無料枠（2022/7現在）
### パブリックリポジトリは無料！

### プライベートリポジトリの無料枠
| プラン     | 1か月あたりの利用時間 | 
| ---------- | --------------------- | 
| Free       | 2,000分               | 
| Pro        | 3,000分               | 
| Team       | 3,000分               | 
| Enterprise | 50,000分              | 

https://github.co.jp/features/actions

## GitHub Actionsを試してみる
実際にリポジトリを作成してサンプルを実行してみよう

### リポジトリの作成
リポジトリを作成する
今回はお試しなので、`Public`で作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/ae2357a1-3399-17cd-6307-25d51052ecf7.png)

### 設定ファイルの作成
GitHub Actionsを実行するためにはトリガーイベントや処理内容を記載したyamlファイルを作成する必要がある
1. ルートディレクトリに`.github/workflows/`フォルダを作成する
1. yamlファイル（`sample.yaml`）を作成する
1. yamlファイルを下記の内容に編集する
1. GitHubにpushする
<details>
<summary>sample.yaml</summary>

```yaml
name: Sample

on:
  push:
    branches: 
      - main
  workflow_dispatch:

jobs:
  print-hello-world:
    runs-on: ubuntu-latest
    steps:
      - name: execute echo command
        run: echo "Hello World!"
```
</details>

```sh
git add .github/workflows/sample.yml
git commit -m "add sample"
git push
```

## 実行結果の確認
GitHubのActionsタブを開くとワークフローが成功していることが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/c1774405-5073-8393-16c6-b0632fee1036.png)

中身を見るとHello World!が出力されているのが分かる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/4f6bce2b-002f-a521-5dac-153014755387.png)

### 今回作成したリポジトリ
https://github.com/rararapi/github-actions-sample

## YAMLのテンプレート
MarketplaceにYAMLのテンプレートが用意されている

[GitHub Marketplace · Actions to improve your workflow](https://github.com/marketplace?type=actions)


## 参考
[GitHub Actionsに入門する](https://helve-blog.com/posts/git/introduction-to-github-actions/)
[Cannot read properties of null (reading 'recordTypeId')] error shows when accessing a report.

このエラーは何度か見ました。まだ修正されてないんですね。長引きそうなので記録しておきます。2022/07/21

既知の課題
[[Cannot read properties of null (reading 'recordTypeId')] error shows when accessing a report.](https://trailblazer.salesforce.com/issues_view?id=a1p4V000002LUMAQA4)

# 質問

この場合は結合レポートで回避策は機能しなかったみたい
+ [cannot read properties of null (reading 'recordtypeid') error shows when accessing a report](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HEP1RSAX)
【IIS】インストールとアンインストール



### 1.背景

IISのインストールとアンインストールをする機会があったので、備忘録としてまとめます。


### 2.環境

- windows10 バージョン21H2
- Microsoft-IIS 10.0
- ASP 5.8（16384）


### 3.インストール

①[スタートボタン]→[設定]→[アプリ]を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689555/f7e52872-7064-da66-6971-0f6c10939319.png" width=20%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689555/8a77f319-69e5-35e6-ca59-c4ba29ff9853.png" width=60%>


②[アプリと機能]の画面が表示されたらスクロールして[プログラムと機能]を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689555/4624b204-3abf-5c0f-c3cc-c4ccc98a6235.png" width=70%>


③ウィンドウの左側の[Windows の機能の有効化または無効化]を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689555/c1b95b04-3a11-ea7c-27ad-d6f753d776c9.png" width=70%>

④[Windowsの機能]が表示されます。

[インターネット インフォメーションサービス]のノードの左側のチェックボックスをクリックして、チェックをつけます。 

チェックをつけると、デフォルトでインストールされるインターネットインフォメーションサービスの各機能にチェックが自動的につきます。

※IISでASP.NETとASPを使いたい場合は[World Wide Webサービス]→[アプリケーション開発機能]の該当の機能にチェックをつけます！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689555/26a8fb34-38a8-304b-e156-1149d048ab41.png" width=70%>

⑤ダイアログの[OK]ボタンをクリックしてインストールを開始します。

⑥インストールが完了します。

[スタートボタン]→[Windows 管理ツール]の項目に[インターネット インフォーメーション サービス(IIS) マネージャー]のショートカットが作成されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689555/05e6ab92-bd05-1e0c-4a24-d0869cc119be.png" width=40%>


### 4.インストールの確認とセットアップ

①IISを起動し、[認証]を右クリックして[機能を開く]を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689555/0f85715d-fb78-23c7-5746-a9a30eb781c2.png" width=60%>


②匿名認証を有効に変更します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689555/23a7b178-7f69-32a4-1e26-29ebe4d0492f.png" width=60%>


※匿名認証は認証をせず使用できるものなので、都度必要に応じて変更してください。

③localhost（http://localhost/）
にアクセスすると、下記の画面が表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689555/0e50c3ce-d5ca-a627-f648-1e8e5cf121a4.png" width=60%>


### 5.ASPを使用する場合

①IISのルートディレクトリ上にファイルを作成して、保存します。
デフォルトでは「%SystemDrive%\inetpub\wwwroot」になっており、一般的には「C:\inetpub\wwwroot」になります。
※指定先を変更することもできます。

②ブラウザにURLを入力して確認します。
（例）wwwroot直下にsampleフォルダを作成して、直下にsample.aspを保存した場合：「http://localhost/sample/sample.asp」


### 6.アンインストール

アンインストールをする際は、保存したいファイルのバックアップなど準備した後に自己判断で行うようにしてください。

①インストールの①～④を行います。
>①[スタートボタン]→[設定]→[アプリ]
>②[アプリと機能]の画面が表示されたらスクロールして[プログラムと機能]
>③ウィンドウの左側の[Windows の機能の有効化または無効化]
>④[Windowsの機能]を表示

②インターネットインフォメーションサービス(IIS)のチェックをはずしてください。

③パソコンの再起動を行います。


### 7.参考

1.[Windows 10 に IIS(Internet Information Services)をインストールする](https://www.ipentec.com/document/windows-10-install-internet-information-services)
2.[Windows10にIISサーバを設定する](https://qiita.com/yuta-sasaki/items/8bcdb1e1ea3d68a0f59e)
3.[サーバーのアンインストール](http://www.easyassetmanager.com/uninstall.html)


### 8.最後に

記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。
読んでいただき、ありがとうございました。