OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】アニメーション付きFBXの動かし方

## 概要
こんにちは、トンガルマンの野間です！
今回は題名の通り、Unityでアニメーションのついたモデルを動かす方法をご紹介します！

## 手順
1. 動かしたいモデル(.fbx)をダウンロード 
    ▼今回はこちらを使用させていただきます
https://assetstore.unity.com/packages/3d/characters/animals/poly-art-handpainted-rabbit-98416

2. FBXをインポート
![スクリーンショット 2022-09-22 15.07.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/cbf568e8-8bc4-7671-dff2-c038f1e6cfd9.png)

3. Inspectorウィンドウで「Animation」タブを選択
複数モデルがある場合は、その中の一つをクリックしてからAnimationタブを選択する
![スクリーンショット 2022-09-22 15.09.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/62e62ac8-0a6c-fd68-c2d5-ab8fb589420f.png)


4. 再生するとアニメーションがLoopして欲しい場合は、「Loop Time」チェックボックスをオン
![スクリーンショット 2022-09-22 15.11.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/cbbb75f5-be36-bd43-d5d9-d47492efde6f.png)


5. Applyボタンを押す

6. Projectウィンドウの「Assetes」→「Animation」フォルダ内で右クリックし、ポップアップメニューの「Create」→「Animator Controller」を選択
Animationフォルダがない場合は、任意の場所に作成してください
AnimatorControllerの名前も、わかりやすい名前に変えておきましょう
![スクリーンショット 2022-09-22 15.22.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/e4c1d35a-796c-ee27-1f8b-bdfe9cb11fc8.png)



7. メインメニューから「Window」→「Animation」→「Animator」を選択し、「Animator」ウィンドウを表示
![スクリーンショット 2022-09-22 15.28.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/0af09132-87df-20d8-3893-7e04ccaf68f2.png)

8. 手順6で作成したAnimator Controllerをクリック選択したアニメーション情報がAnimatorウィンドウに表示される
![スクリーンショット 2022-09-22 15.35.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/86936abf-0ca3-9bbf-229d-4f7779934763.png)

8. Projectウィンドウで、インポートしたfbxのアイコンの右の三角をクリックすると、中身が表示されるので、アニメーションクリップをAnimatorウィンドウにドラッグ＆ドロップ
別フォルダにアニメーションクリップが入っている場合もあります
![スクリーンショット 2022-09-22 15.36.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/d41acb30-fcb0-311a-5045-0286a6498ebe.png)

9. Assets内のModelをドラッグして、Sceneに配置
![スクリーンショット 2022-09-22 15.37.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/eade3562-a40c-08b5-4613-953632e5bff3.png)

10. Sceneに配置したModelをクリックし、Inspectorウィンドウの「Animator」→「Controller」に、Projectウィンドウ内のAnimator Controllerをドラッグして入れる
![スクリーンショット 2022-09-22 15.44.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534018/3cc92dd9-6312-2410-774e-256639adabdc.png)


11. 「Play」ボタンを押すと、アニメーションが再生される

## 参考サイト
[Unityにモーション付きの形状を渡す手順](https://knowledge.shade3d.jp/knowledgebase/unity%E3%81%AB%E3%83%A2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E4%BB%98%E3%81%8D%E3%81%AE%E5%BD%A2%E7%8A%B6%E3%82%92%E6%B8%A1%E3%81%99%E6%89%8B%E9%A0%86#:~:text=Unity%E3%81%A7%E3%83%A2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E6%83%85%E5%A0%B1%E4%BB%98%E3%81%8D%E3%81%AE%E5%BD%A2%E7%8A%B6%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF)
Python,Ruby,PHP,Java,JavaScript,Perlのスコープの比較 | プログラミング言語比較


<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlのスコープの比較

# Python

https://qiita.com/msssgur/items/12992fc816e6adf32cff

# Ruby

https://qiita.com/EZ_Denta/items/6489039212e21d4fc49f

# PHP

https://qiita.com/hikaru_/items/4cc7b616aa61868cdcdd

# Java

https://qiita.com/gatchan03/items/e8eecf468b7dab960198

# JavaScript

https://qiita.com/higa02/items/a7a0a1d96d1d67a7c88b

# Perl

https://perlzemi.com/blog/20110128130016.html
大きすぎるファイルをgit add してないか確認する方法

巨大なファイルを誤ってコミットし、レポジトリを肥大化させると大変です。何度も事故を起こしたのでステージに乗ったファイルを大きい順に表示するコマンドを組みました。

# 結論

`git status --porcelain | grep ^[AM] | sed -e "s,^\S ,,g" | xargs -r ls -hsS`
このコマンドを打つとgit add したファイルを容量が大きい順に並べて表示してくれます。便利。

`git status`から`grep`で変更するファイルを抜き出し、`sed`でパスだけ抽出し、`ls`で容量順に表示しているだけです



# 使用例
```
$ git status --porcelain | grep ^[AM] | sed -e "s,^\S ,,g" | xargs -r ls -hsS
 29M wave-propagation-h135-correct-2/OUTPUT/XUDISA.DAT
 29M wave-propagation-h135-correct-2/INPUT/XUDISA.DAT
4.4M wave-propagation-h135-correct-2/OUTPUT/TYPEMOVE.DAT
4.4M wave-propagation-h135-correct-2/INPUT/TYPEMOVE.DAT
2.7M wave-propagation-h135-correct-2/OUTPUT/REALTIME.XUD
...
```
左がファイルサイズ、右がパスです。29MBの大きいファイルを`git add`してしまったことにすぐ気づけますね。
On-DemandキャパシティになっていないDynamoDBテーブルをクロスアカウントで探す

AWS Config Advanced Query(高度なクエリ)が便利です

```
SELECT
  resourceId,
  accountId,
  configuration.provisionedThroughput.readCapacityUnits,
  configuration.provisionedThroughput.writeCapacityUnits
WHERE
  resourceType = 'AWS::DynamoDB::Table'
  AND (
    configuration.provisionedThroughput.readCapacityUnits > 0
    OR configuration.provisionedThroughput.writeCapacityUnits > 0
  )
```
スキーマは以下のリポジトリを参照
https://github.com/awslabs/aws-config-resource-schema/tree/master/config/properties

残念ながらSCP等で封鎖はできません。状況によってはAWS Configを駆使して即通知もありかもしれません。

クエリは完全なSQLではなく、ASやIS NULL等が使えません
プロセッサの高速化技術

# パイプラインとは？
```パイプラインのサイズはステージ数で決まり、○段パイプライン```と呼ばれます。図1の場合は4段パイプラインと呼ばれます。
出典　https://isabou.net/Convenience/Tool/gpu/gpu12.asp
### 気づき
つまり
「読込」「解読」「実行」「書出」の各工程を一つパイプラインとするのか。
これが複数あることで多くの命令を処理することができるのか。

# VLIW（Very Long Insturction Word)
```長くとった命令語に複数の命令をまとめておき、並列動作させる方式。```
命令の数を一定にしておき、パイプラインによって```同時実行することで高速化```を図る。```各命令はお互いに依存関係のないことが前提```となる。

# マルチプロセッサシステム
### 密結合マルチプロセッサシステム
```複数のプロセッサが主記憶装置を共有```し、```同期をとりながら処理```を行う。

### 疎結合マルチプロセッサシステム
```独立した処理系で補助記憶装置を共有```し、```ジョブ単位で負荷分散```を行う。
# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

https://qiita.com/masatom86650860/items/4b8e7de882ad7f3c725c
[Maya]スキンのバインドでエラーが出る対処法

<h2>はじめに</h2>

ウェイト作業していたけれども、やむを得ない理由でバインドを解除してモデル調整やボーンの追加などの作業が発生することは多々あります。
そして再バインドしようとしたら、<b>"エラー: file:(以下略)のスキンは別のポーズにバインドされました。バインド ポーズへ移動して新しいスキンをアタッチしてください。"</b>というエラーが出ることがあります。
今回はそのエラーの対処法について記載していきます。

<h2>対処法</h2>

①先ず、Mayaのアウトライナの<b>ディスプレイ</b>→<b>DAGオプションのみ</b>にチェックを外す。
![キャプチャ04b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682768/ded3f3ef-d0b2-522d-d14a-dabb00354c36.jpeg)
②コマンド検索の欄に<b>pose</b>と入力

③<b>blindPose1</b>を削除
![キャプチャ04a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682768/90ad1b86-9ae6-f687-65e3-0e457a4da0ad.jpeg)
これで古いスキンデータを削除できたので、スキンのバインドを適応することができます。

<h2>まとめ</h2>
エラーとは別の話ですが、スキンのバインドの際には対象モデルとボーンを選択した状態でないと出来ない上に、バインド出来ませんというエラー文が出るのでお忘れなく。
Setup Projectの気になる青波線

# テキストボックス（A）を追加しただけ

## プロジェクト（Setup Project） → View → ユーザーインターフェイス

##### テキストボックス（A）を「インストールフォルダ」の下に追加すると、青の波線が出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526209/da983cdf-9a8e-b1e7-943d-92d2ea8334f3.png)

##### テキストボックス（A）を「インストールフォルダ」の上に追加すると、青の波線が消える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526209/128c3d84-ea46-f599-3b5e-9c50f3a6ab66.png)

この違いはなんでしょ、、、。
気持ち悪いので、インストールフォルダの上に置いておこう、、、。
BigQuery、redashのお掃除を効率的に行う

グロース活動量と比例して、増える分析用クエリ。何年も運用していると不要なものが出てきたり、定義変更 / データ変更に伴い過去のものも修正必要になって影響範囲の把握が毎度大変なので、Tipsをストック

## BigQueryのviewのクエリ内容に変更箇所が入ってないか確認する

https://cloud.google.com/bigquery/docs/information-schema-views?hl=ja
```SQL
SELECT * FROM __dataset_name__.INFORMATION_SCHEMA.VIEWS
WHERE view_definition like '%xxxxx%' 
-- AND REGEXP_CONTAINS(view_definition, r'(xxxxx|xxxxx|xxxxx)')
;
```

## redashのクエリ内容に変更箇所が入ってないか確認する

```SQL
-- redash のメタデータのDBへ
select
  q.id
  ,q.name
  ,q.created_at
  ,q.updated_at
  ,q.schedule
  ,q.tags
from
  queries q
where
  query like '%dau%'
  and (not '確認済み' = ANY(tags)    -- 特定のタグを除く場合
  and is_archived = false -- アーカイブではない
order by id
MacにDeeplabcutがインストールできない。

# 環境
macOS Monterey
pyenv
virtualenv
wxPython 4.0.7
Deeplabcut 2.2.2

# エラー
当然公式ドキュメントに従ってコマンドを実行する。

https://deeplabcut.github.io/DeepLabCut/docs/installation.html

で、
```
This program needs access to the screen. Please run with a
Framework build of python, and only when you are logged in
on the main display of your Mac.
```
これ。
何やってもこれ。

# 原因
wxPythonはframework buildのPythonが必要らしい。
当然CUIのDeeplabcutも試した。でもラベリングするのにGUIの環境が必要。
つまり、どう足掻いてもwxPythonと向き合わないといけない。
# 解決
正直色々やって何が正解かわからないが
```
$ conda install anaconda
```
を実行してpythonwを使えるようにした。
今のところ起動だけ成功してラベリングはしていないので、正常に動作しているかわからない。

# 起動
```
$ pythonw -m deeplabcut
```

### よくわからんが、まぁ動いているからヨシ！

# 参考にさせてもらった記事

https://qiita.com/yuu-eguci/items/980d80144fe686583a2e

https://stackoverflow.com/questions/48531006/wxpython-this-program-needs-access-to-the-screen
ffmpegを利用するdiscord botの運用でRaliwayを試してみた話

# はじめに
今更の話ではあるのですが、HerokuのHobby Plan, つまり無料Planが2022年9月28日に終了します。

> Students and Nonprofit Program
We appreciate Heroku’s legacy as a learning platform. Many students have their first experience with deploying an application into the wild on Heroku. Salesforce is committed to providing students with the resources and experiences they need to realize their potential. We will be announcing more on our student program at Dreamforce. For our nonprofit community, we are working closely with our nonprofit team, too.

https://blog.heroku.com/next-chapter

上記内容から、学生には何かしらの補填が考えられますが、一般的には移行が求められているのではないでしょうか。
今回は、Discord上で動くPythonで書かれたbotをrailwayに移行した方法と感想をまとめました。

# railwayって何？
> Railway is a deployment platform where you can provision infrastructure, develop with that infrastructure locally, and then deploy to the cloud.

https://docs.railway.app/getting-started

一言でいえば、Herokuと同じようなPaaSサービスを提供してくれます。
GUIにより直感的に操作ができるところがポイント高いです。

また、Herokuとの互換性も高いのもよいです。

https://docs.railway.app/deploy/builds

このURLからわかる通り、Procfileを認識します。また、buildpackにHeroku buildpackも付属しています。
しかし、Herokuのように複数のbuildpackを追加するために、project.tomlをいじればできそうな気がしますが、
私ではよくわかりませんでした。先見の知恵をお待ちしています。

# 基本的なGUI操作によるDeploy
https://qiita.com/sevenc-nanashi/items/29b1ff92a5dd03b30172

こちらの記事がとても参考になります。丸投げします。
本記事では詰まった点のみをかいつまんで話します。

# nixpackを利用してbuild&deployをしてみよう。

Railwayではデフォルトでnixpackを利用したbuildが実行されます。
今回、discord botをdeployするにあたり、vcを使った機能を搭載するため、ffmpegを追加する必要があります。

https://docs.railway.app/deploy/dockerfiles

やり方はいくつかありますが、nixpackでは、Dockerfileを読み込み
実行を行ってくれるので今回は素直にそのやり方を利用しましょう。
よって、Dockerfileに以下のように記述を行います。

```dockerfile
FROM python:3.10.7
USER root

WORKDIR /app
COPY . /app

RUN pip install --upgrade -r /app/requirements.txt # pythonのライブラリはrequirements.txtに記述します。

RUN apt-get update # ffmpegをビルド済みバイナリでinstallします。
RUN apt-get install -y ffmpeg

CMD ["python", "bot.py"]
```

nixpack.tomlのほうではOpusがロードされないエラーが解消できませんでした。何が違ったのか。
一応その時使っていたtomlを張り付けておきます。もしかしたら、aptPkgsにffmpegを入力したら動くのかもしれません。

https://nixpacks.com/docs/configuration/file

```toml
[phases.setup]
    nixPkgs = [ '...', 'ffmpeg' ]
```

# 環境変数をHerokuから転用する

![image.png](https://blog.railway.app/_next/image?url=https%3A%2F%2Fs3.us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F366c2004-93bf-4c94-a17b-5c6b04e3e97b%2FCleanShot_2022-08-26_at_19.05.50.gif%3FX-Amz-Algorithm%3DAWS4-HMAC-SHA256%26X-Amz-Content-Sha256%3DUNSIGNED-PAYLOAD%26X-Amz-Credential%3DAKIAT73L2G45EIPT3X45%252F20220922%252Fus-west-2%252Fs3%252Faws4_request%26X-Amz-Date%3D20220922T050933Z%26X-Amz-Expires%3D3600%26X-Amz-Signature%3Dd1f252e07c13dbbca95e4d908e249fe7e712394b3e4c812191f4cd16f2ae6fdd%26X-Amz-SignedHeaders%3Dhost%26x-id%3DGetObject&w=1920&q=75)
このようにすることで転用が可能です。

# 使ってみた感想
Railwayは基本的にクレジットカード登録により、Developer Planに移行することで、500hrのDyno制限が無くなり24/7で動かせます。5$の表記はCPU使用による請求なので、1つのbotを動かす程度であれば5＄未満で基本的には収まります。



それでも、PostgreSQLも使え必要なライブラリやappはDockerfileを書くことで追加できるので、
Herokuからの転用先として悪くはないのではないかというのが所見です。


なんなら、Deployボタンも実装されているので、app配布等の検討でRailwayを利用してみるのも良い手ではないでしょうか。

https://railway.app/button
累乗(Java

# 累乗

```calc.java
public static void main(String[] args){
  int floor = 5;
  int exponent = 3;
  int answer = 1;
  for(int i=1;i <= exponent;i++){
    answer *= floor;
    }
  System.out.println("answer:"+answer);
}
```

```calc.py
print(f'answer:{5**3}')
```

:relaxed:
IBM i ILE-COBOLのデバッグ方法

普段滅多に無いのですが、たま～に「 ILE-COBOL 」を触る機会があり、デバッグ方法が RPG と異なるので備忘を兼ねて…
## TL;DR
1. デバッグの開始
    1. COBOLをコンパイル `CRTBNDCBL PGM(foo/bar) DBGVIEW(*ALL)`
    2. サービスジョブで監視 `STRSRVJOB  JOB(999999/QSECOFR/QPADEV0001)`
    3. 起点ＣＬ等のデバッグ開始 `STRDBG     PGM(hoge/fuga) UPDPROD(*YES)`
    4. 対象ＣＯＢＯＬデバッグ開始 `STRCBLDBG  PGM(foo/bar)`
    5. 監視先ジョブで起点ＣＬ等を起動するとデバッグが開始される

2. デバッグの終了
    1. 対象ＣＯＢＯＬデバッグ終了 `ENDCBLDBG  PGM(foo/bar)`
    2. 起点ＣＬ等のデバッグ終了 `ENDDBG`
    3. サービスジョブの終了 `ENDSRVJOB`

## 余談

サービスジョブの監視は、しなくても良いですが、サービスジョブを使用したほうが、デバッグしやすいの私の場合は普段より使っています。

以上！
Java オーバーライドするメソッド・インスタンスの順序づけ

Java 1日目


equals/toString/hashCodeのオーバーライドが大事


``` Java:toString method
  public String toString(){
        return "勇者（名前"+this.name+")/HP="+this.hp;
    }

```
```Java:equal method
public boolean equals(Object o){
        if(o==this)return true;
        if(o==null)return false;
        if(!(o instanceof Hero)) return false;
        Hero hs=(Hero)o;
        if(!this.name.trim().equals(hs.name.trim())){
            return false;
        }
        return true;
}
```
なお、apacheのライブラリをつかうとequalsはこのようにも書き直せる

```java:
import org.apache.commons.lang3.builder.*;
//省略
public　boolean equals(Object o){
    return EqualsBuilder.reflectionEquals(this,o);
//全てのフィールドが等価であるかどうかを調べる
}
```

```Java:hashCode method
public int hashCode(){
    return object.hash(this.name,this.hp);
}
```

インスタンスの順序づけ
自然順序づけを宣言するために
java.lang.Comparableインタフェースを実装する。

``` Java:Comprable
public class Book implements Comparable<Book>,Cloneable {
    private String title;
    private Date publishDate;
    private String comment;

public int compareTo(Book o) {
        return this.publishDate.compareTo(o.publishDate); 
    }
```
bashでcurlのオプションをたくさん指定する

curlでファイルアップロードするシェルスクリプトを書いたときにつかった書き方。

:::note info
コメントでいい方法教えてもらったので、そっちに書き換えた
echo "${args[@]}" するとダブルクォーテーションとか消えるので、不安に思ったけど実行すると確かにこれでできてるの不思議
:::

```bash
#!/bin/bash

API_KEY="YOUR_API_KEY"
URL="https://example.com/endpoint"
SCRIPT_NAME=$(basename $0)
while getopts c: OPT
do
  case $OPT in
   "c" ) CONFIG_FILE=$OPTARG
      ;;
   *) echo "Usage: $SCRIPT_NAME [-c CONFIG_FILE] [FILES ...]"
      exit 1
      ;;
  esac
done
shift $((OPTIND-1))

if [ -f ${CONFIG_FILE:="$HOME/.myupload/config"} ]; then
  # アップするURLとAPIキーが書いてある
  source $CONFIG_FILE
else
  echo "$CONFIG_FILE is not exist." >&2
  exit 1
fi

# ファイルの存在確認。存在しないファイルが指定されたときは終了
declare -a FILES=()
for file in "$@"
do
  if [ -f $file ]; then
    FILES+=($file)
  else
    echo "$file is not exists." >&2
    exit 1
  fi
done

args=(-H "Authorization: APIKEY $API_KEY")
for file in "${FILES[@]}"
do
  args+=(-F "files[]=@$file")
done
curl "$URL" "${args[@]}"

```
[WordPress] WP Search with Algolia で作られるAlgoliaのレコードの中身

Algolia
https://www.algolia.com/

WP Search with Algolia
https://wordpress.org/plugins/wp-search-with-algolia/

|Algoliaの要素名 | WordPress |データ例 |
|:-----------|:------------|:------------|
|post_id | 投稿ID |916|
|post_type | 投稿タイプのスラッグ| post |
|post_type_label | 投稿タイプの名前|投稿|
|post_title | 投稿のタイトル |サンプルのタイトル|
|post_excerpt | 投稿の抜粋 | <p>手動での抜粋</p>  |
|post_date | 投稿の公開日時（UNIX Time） | 1663149462||
|post_date_formatted |投稿の公開日時 |2022年9月14日|
|post_modified  | 投稿の更新日時（UNIX Time） | 1663850868|
|comment_count | 投稿のコメント|0|
|menu_order | 投稿の順序|0|
|post_author | 投稿の作成者情報|配列|
|post_author.user_id | 作成者のユーザーID|2|
|post_author.display_name | 作成者のブログ上の表示名|五十嵐|
|post_author.user_url | 作成者の連絡先情報のサイト| https://example.com |
|post_author.user_login | 作成者のユーザー名|gatespace|
|images| 投稿のアイキャッチ画像|配列|
|images.thumbnail.url|画像URL| https://example.com/wp-content/uploads/2022/09/a.png|
|images.thumbnail.width|画像の幅| 400|
|images.thumbnail.height|画像の高さ| 300|
|permalink | 記事URL|https://example.com/archives/916|
|post_mime_type | 投稿のMIME タイプ（メディアライブラリの時に利用）||
|taxonomies | 投稿に付与されているタクソノミー|配列|
|taxonomies.category | カテゴリー（配列）|["カテゴリーA","カテゴリーB"]|
|taxonomies.post_tag | タグ（配列）|["タグ1","タグ2"]|
|taxonomies_hierarchical | 投稿に付与されているタクソノミーの階層（配列）|"category": {"lvl0": ["カテゴリーA"],"lvl1": ["カテゴリーBの親 > カテゴリーB"]}}|
|is_sticky |先頭に固定表示 |0|
|content | 投稿の本文、HTMLタグは除去|テストの文章です\n改行|
|record_index | Algolia プラグインの設定内容、変更不可||
|objectID | Algoliaのインデックス番号、変更不可|1-0|
Dockerbuild時に.envなどの.付きの環境変数ファイル的なものはコピーされない

諸事情によって組織を作った時に、cloud run上にてgitのリポジトリにアクセスしたかったため、docker build後にgitが使える状態にしたかったが、割とプライベートな環境だしcredentialsをコンテナ上にコピーしようと思ったら思った以上にハマった

結論から言うと表題の通りで、.から始まるファイルはコピーされない。

```Dockerfile
ADD .git-credentials .git-credentials
```

こういうのは「追加できませんよ」とかエラーとか出してbuildを止めてくれたらいいんだけど、そこまで親切ではなかった。

本当は暗号化された認証情報とかを渡すとかもっとセキュアな方法がある（気がする）けど、一旦の暫定対応は以下のような形でもいけることはいけた

```Dockerfile
ADD git-credentials git-credentials
RUN mv git-credentials .git-credentials
```

ちなみにDockerfileと同じ場所に.dockerignoreのファイルをおけば.gitignore的な感じで使えます。
https://docs.docker.com/engine/reference/builder/#dockerignore-file

上記リンクの下の方に、以下のようなコメントがあり、確かに.つきのファイルをbuild時に含めて色々あったことは想像に難くはないけれど。。
 ```
 歴史的な理由から、このパターン.は無視されます。
 ```

----
### おねがい

デフォルトでbuild時にignoreするパターンを編集する方法を調べたけど見つからなかったのでどなたかご存知でしたら教えてください。
NodeJsで画像ファイルのダウンロードと保存(request編)

# はじめに

NodeJsで外部サーバーからダウンロードした画像ファイルをローカルに保存する時の注意点をまとめる。

# サンプルソース(修正前)

「NodeJsで外部サーバーからダウンロードした画像ファイルをローカルに保存する」と聞いてサクッと作ったサンプルが以下。

```JavaScript:サンプルソース(修正前)
var options = {
    uri: "http://local_nginx_server_ip/globalipcam_resize_snap"
};

request.get(options, function(error, response, body) {
    if (!error) {
        fs.writeFile("/saved_images/snap.jpg", body, function(errorWrite) {
        });
    }
});
```

　※今時そんなコード？？？って驚かないで。色々理由があるのだ。


この時保存したsnap.jpgが画像ビューアでうまく表示されない。

バイナリエディア(BZ)で表示してみると、、、

![正しくないsnap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1236186/05f65b39-9639-e578-788a-37c44abd0c39.png)

"JFIF"などのキーワードは確認できるが、先頭が"FFD8"になっていない。

# サンプルソース(修正後)

```JavaScript:サンプルソース(修正後&抜粋)
var options = {
    uri: "http://local_nginx_server_ip/globalipcam_resize_snap",
    encoding: null
};
```

encodingを省略(上記"encoding: null"の行そのものを省略)したら"UTF-8"が指定されたことになるようなので、バイナリエディタで見た時の先頭が"FFD8"になっていなかったのはUTF-8 BOMの影響と思われる。
"encoding: null"はエンコードしない的な意味合いと思われる。

```
UTF-8 BOMは"EFBBBF"のようだ。でもバイナリエディタで"EFBFBDEF..."になる理由は現時点では不明。
```

修正後のソースを利用して保存したsnap.jpgは、、、

![正しいsnap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1236186/90540e85-6037-7301-832a-160ecc6b6d36.png)

先頭が"FFD8"になっており、画像ビューアでもうまく表示された。
【Laravel】HTTPリクエストに関して

# はじめに
絶賛学習中であるlaravelについて
    Webアプリの基本である入力（リクエスト）の取得に関して学習した内容をまとめています。

## リクエストハンドリング

ユーザーからのリクエストは、
public/index.php内でIlluminate/Http/Requestのインスタンスとして取得している。
リクエストをコントローラー内で参照する方法は下記３つ。

### 1\. Requestファザード
Requestファザードの実装はIlluminate\Support\Facades\Request
使用する時は、use Illuminate Support\Facades\Requestが必要。

```php
use Illuminate\Support\Facades\Request;

//'id'キーでリクエストから値を取得
$id = Request::get('id');

//'id'キーがない場合は、'name'を返す
$id = Request::get('id','name');

//全ての入力値を取得
$input = Request::all();

//指定した項目のみ取得
$input = Request::only(['id','name']);

```


### 2\. Requestオブジェクト

１.Requestファザードの実態は、Illuminate\Http\Requestであり
メソッドの引数に型宣言することで、直接使用することができる。

※Requestファザードで使用できるメソッドはRequestオブジェクトでも使用可

```php
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function show (Request $request)
    {
        $id = $request->get('id'); 
    }
}
```


### 3\. フォームリクエスト

入力値の取得に加え、①認証機能や②バリデーション（入力チェック）を定義できる。
バリデーション部分をコントローラーから分離するメリットがある。


フォームリクエストのクラスファイル作成
```
php artisan make:request ファイル名
```
↓↓↓ 作成されたファイル
```php
class userRegister extends FormRequest
{
//①認証に関する設定
 public function authorize()
 {
   return true; //true実行許可
 }
//②バリデーションルール
 public function rules()
 {
   return [
     'name' => ['required','string'],
   ];
 }
```

コントローラーで使用する
2.Requestオブジェクトのuseとメソッド引数である型宣言を変更する

```php
use App\Http\Requests\UserRegister;

class UserController extends Controller
{
    public function show (UserRegister $request)
    {
        $id = $request->get('name'); 
    }
}
```

以上。
SOSL(Salesforce Object Search Language)でマッチする電話番号入力を確認しました

# 概要

[Salesforce Object Search Language (SOSL)][SOSL] で電話番号フィールドを条件に検索することができます。
電話番号は `0312345678` や `03-1234-5678` などのように、表記揺れが出やすい項目ですが、なんとなくあいまいでもマッチする感触がありました。

いくつか登録して簡易的に検証してみた結果を記録します。

[SOSL]: https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_sosl.htm

# 確認環境

- Developer Edition Winter ’23
- API Version 55

# 確認手順

## テストデータを登録

取引先責任者(Contact)レコードを登録します。

- 数字のみ
- ハイフン区切り
- 全角数字のみ
- 全角ハイフン区切り
- 市外局番をカッコ括り＋ハイフン区切り
- E.164フォーマット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/bf6eb436-acaf-d550-2ba0-b976119724c3.png)

## テスト用コード作成

検索文字列を数字のみとして、取引先責任者オブジェクトの電話番号フィールドを対象にSOSLクエリし、マッチ結果を出力する内容です。

```Apex
String phoneNumber = '0312345678';
List<List<SObject>> searchList = [
    FIND :phoneNumber IN PHONE FIELDS
    RETURNING Contact (Id, Name, Phone ORDER BY Name)];

List<Contact> contacts = searchList[0];

For (Contact contact: contacts) {
    System.debug(contact.Name + '/' + contact.Phone);
}
```

## 実行

開発者コンソールで実行し、出力ログを確認します。
なんと全部マッチしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/0d6a71d1-8519-f6ce-f224-996360144e91.png)

## 他のパターン

検索文字列を ハイフン区切りの `03-1234-5678` としても上記と同じ結果でした。
検索文字列を E.164フォーマットの `+81312345678` とすると、E.164フォーマットの１レコードのみマッチしました。


# 最後に

ハイフン区切りぐらいはマッチすると思っていましたが、E.164フォーマットの登録でもマッチするのは少し驚きました。
どのようなマッチングロジックなのでしょう。
React inputのvalueを表示する

備忘録
inputの内容をテキストで表示する。
変更があった場合もすぐに反映したい。
```react
//useStateをインポートする（ないとエラーになる）
import { useState } from "react";

const Child = ()=>{
//textという変数を用意
//setTextで更新していくよ、初期値は""
    const [text,setText] = useState("");
    return(
        <>
            <input 
                type="text"
                value={text} 
                onChange={(event)=>setText(event.target.value)} />  
            <h1>{text}</h1>
        </>
    )
}
export default Child
```
valueにstateの変数を指定することで、stateのtextとして取得できるようになる。
onChanegeで`setText`（textを更新できる関数）が呼ばれる。
setTextの内容は、変更があったinputのvalueとしてtext変数を更新できる。
Ubuntu20.04+AnacondaでChrome-remote-desktop

# 1.まずchrome-remote-desktopがまともに動かない

> * 環境
>> Ubuntu 20.04LTS
>> Anaconda入り
>> その他の仮想環境などはありません

* 発生した現象
    * クライアント側が画面真っ暗(操作不能)
    * ホスト側でターミナル画面が開かなくなる
    * クライアント側の操作をほったらかしで終了するとホスト側でログインできない
    * クライアント側でターミナル画面が開けない（実はホスト側に出ていた・・・）
    
***

* **参考にした記事一覧**
    * ちなみに私の環境では直接解決につながらなかったのですが、大変参考になりました。
    
***

* おそらく必ず一度は目にされているであろう記事。こちらに沿えば基本的には大丈夫だと思います。

https://xvideos.hatenablog.com/entry/chrome-remote-desktop-ubuntu1804

* Ubuntu 20.04で参考になるであろう記事

https://qiita.com/virtualnkhr_/items/4f8f02ea0a1a5ecbf8e2


* 今回は利用させて頂いてませんが、環境をキレイにするのに役立ちそうな記事

https://www.hiro345.net/blogs/hiro345/archives/20153.html

* 一気通貫でセットアップをするスクリプトの記事

https://kmyers.me/blog/linux/chrome-remote-desktop-on-ubuntu-20-04-setup-guide-setup-script/


# 2.解決策

**結論**
**Anaconda環境では書き換える場所が違う事がわかりました(ディスプレイ関連)**
* ”def launch_session”をみると当方の環境では”(self, x_args)”がどうしてもみつからず、
  似たような名前の”def _launch_server(self, *args, **kwargs):”　の定義を変更しておかしな状態になっていました。


> 設定箇所は”外出先から自宅のUbuntu18.04に接続する（Chromeリモートデスクトップ）”の設定変更より借用します。
>> ほとんどの変更箇所は記事の説明通りです。
>> ザーッと書き換えていくとどうしても見つからない箇所がありました。
>>　
>>  ```Linux:参照元設定ファイル
>>  def launch_session(self, x_args):
>>  self._init_child_env()
>>  self._setup_pulseaudio()
>>  self._setup_gnubby()
>>  # self._launch_x_server(x_args)
>>  # self._launch_x_session()
>>  display = self.get_unused_display_number()
>>  self.child_env["DISPLAY"] = ":%d" % display
>>　
>>
>>
>>  ```
>> *この記載に代わる箇所が私の環境ではここでした。
>>　　
>>  ```Linux:当方の設定ファイル
>>　def launch_session(self, server_args, backoff_time):
>>    """Launches process required for session and records the backoff time
>>    for inhibitors so that process restarts are not attempted again until
>>    that time has passed."""
>>    logging.info("Setting up and launching session")
>>    self._init_child_env()
>>    self.setup_audio()
>>    self._setup_gnubby()
>>    display = self.get_unused_display_number()
>>    self.child_env["DISPLAY"] = ":%d" % display 
>>  ```
    
## 無事ホストとクライアントで同じ画面になりました。
![qitakiji.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/4cc73317-433c-1774-c202-c68d59ed8359.png)

:::note info
所感
**似ているからといって、必ずしもそこが正しい変更箇所ではない。**
:::

***
## 補足
**接続後にホスト側のサウンドデバイスがなくなってしまった**
* 私は以下の手順を利用し、Realtek（ACL892でしたので）ドライバの入れ直しをしました。

https://www.web-dev-qa-db-ja.com/ja/drivers/ubuntu%E7%94%A8%E3%81%AErealtek%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC/960945137/

## トラブル2--リモートデスクトップが正常に開かない！(22年10月17日追記)
**セットアップ時のよくあるトラブルが突然現れます**

* 発生した現象ーーーこれが再発します。
    * クライアント側が画面真っ暗(操作不能)
    * ホスト側でターミナル画面が開かなくなる
    * クライアント側の操作をほったらかしで終了するとホスト側でログインできない
    * クライアント側でターミナル画面が開けない（実はホスト側に出ていた・・・）

**落ち着いて設定ファイルを直します**

```Ubuntu:ターミナル

sudo cp /opt/google/chrome-remote-desktop/chrome-remote-desktop /opt/google/chrome-remote-desktop/chrome-remote-desktop.orig


```

* 中身を見てみるとなんと設定が編集前に戻っていました（私の場合）
* 淡々と書き換わった箇所を自分に合った環境に合わせて保存して解決します。
HEROKUデータベースリセットのエラー

【開発環境】
　Macローカル

【フロント】
　Vue.js

【バックエンド】
　Rails

【データ　ベース】
　PostgreSQL

# 経緯
ターミナルで下記のコマンドでエラーになった。

~~~
heroku run rails db:reset
~~~

エラー内容

~~~
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
~~~

# 解決
下記のコマンドでリセットできました。
AppNAMEには該当のアプリ名を入力
~~~
heroku pg:reset -a AppNAME
~~~
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その031

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: アプリケーションと活動
生産性とコラボレーションの学習

にある練習問題4問目をご紹介します

内容は動画でも解説しています

https://www.youtube.com/watch?v=rHy4GYEQy6k

<iframe width="560" height="315" src="https://www.youtube.com/embed/rHy4GYEQy6k" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-applications-activities-and-mobile/study-up-on-activity-management-and-collaboration?trail_id=administrator-certification-prep

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/3312875b-53e7-b512-0a30-da6df8649d4f.png)



正解はBでした

正解の「イベント」とは行動オブジェクトです

Outlookとはいくつか機能がありますが、今回はカレンダーの機能が関係しています

outlookのカレンダーはSalesfroceの行動との同期は可能です


詳細はこちらをご確認ください

Outlook Integration (Lightning for Outlook) を初めて使う場合はどうすればよいですか?

https://help.salesforce.com/s/articleView?id=000314797&type=1
PHP  ログインハッシュ化

昨日、ハッシュ化について学習したので、共有する

ハッシュ化とは、パスワードをハッシュ化し、第三者にパスワードがわからない
ようにするための方法である

今回は主にPHPのlogin時にパスワードがわからないようにするためにPHPで作成した。

コードの記入方法


vsコード中に(仮)password.php
```php
$s = "test1";

echo password_hash($s, PASSWORD_DEFAULT); 

```
を作成し、
URLに「localhost」→「保存ファイル名」「〜〜．php」で確認すると

「 $2y$10$XDqnwCgKg3IVqbv.cs/tkuU/RI0usl8Sa7NvVm8JU6zYp0kMNA9Py  」
のような話パスワードが確認できる。


パスワードのコピーを行い、（私は）PHP MY Adminのパスワードカラムにハッシュ化したものを貼り付けた。


loginページに移動後、「username」,「test1」を入力すると、loginその他のlogin機能の実装がうまく
行っていれば、成功すると思います。







ーーーーーーーーーーーーーーーーーーーーー
データベースに直接ハッシュ化する方法

SQLに登録する場合は
①データ接続
②ポストデータを取得する。
③データを登録するSQL
④バインドパラムでセットする
⑤SQL実行
だが

②ポストデータを取得するの箇所をハッシュ化することによりうまく行く

```php


//login_pwをハッシュ化するため$login_pw_nomalを作成する
$login_pw_nomal  = $_POST["login_pw"]; 

//ハッシュ化するため関数を作成
function hh($s){
    return password_hash($s, PASSWORD_DEFAULT); 
}

//ハッシュ化した関数と$login_pw_nomalを合わせる
 $login_pw_hash = hh($login_pw_nomal);

// データを登録するSQL
//prepareメソッドでSQL文を準備し、$stmtの変数へ入れる。
 $stmt = $pdo->prepare('INSERT INTO users(name, login_id,login_pw)
                                   VALUES(:name, :login_id, :login_pw)');

 // バインドパラムでセット。name,login_id,login_pwを作成
 //bindParamでパラメータに値（$name,$login_id,login_pw,login_pw_hash）をセット
 $stmt->bindParam( ':name',     $name,     PDO::PARAM_STR);
 $stmt->bindParam( ':login_id', $login_id, PDO::PARAM_STR);
 $stmt->bindParam( ':login_pw', $login_pw_hash, PDO::PARAM_STR);


 // SQL実行
 $res = $stmt->execute();

```

```php
 $stmt->bindParam( ':login_pw', $login_pw_hash, PDO::PARAM_STR);
```

の「 PDO::PARAM_STR 」がなぜSTRなのか？？？



 「　PDO::PARAM_STR」　」
SQL CHAR, VARCHAR, または他の文字列データ型を表します。

 「　PDO::PARAM_INT　」
SQL INTEGER データ型を表します


ハッシュ化は数値だけでなく、文字列も入ってくるため、「　INT ではなく　STR　」を使用する。
[TortoiseGit] 複数のコミットをまとめる裏技

# 正攻法と問題点

Ctrl+クリックで複数コミットを選択→右クリックしコンテキストメニューから、
1つのコミットにまとめる事ができる。

![正攻法.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274593/45c3aa43-1fbf-c3ed-3e7b-c02fd480b737.png)

<!-- ## 余分なコミットがある時には使えない

一連の選択となっていないと、たとえグラフ上で繋がっていても、
*`一つのコミットに集約` が表示されない。 -->

このメニューは、間に余分なコミットがある時には表示されません。
![正攻法_NG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274593/463906ff-b682-65e3-0117-0cbe8bd5ebbe.png)
* 不要なブランチの表示を外すなどで、回避は可能。

# 裏ワザ

## 方法1
2つのコミットの差分を表示→ファイルを全選択し、新しい方の状態に戻す→コミットする。
![差分を出す.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274593/01a56445-c635-ea72-4fb4-48a4dec3498e.png)
![新しい方へ戻す.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274593/efd08201-f5df-ae5c-f157-93d9d8a77238.png)
![コミット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274593/93560ce2-c28e-ef6f-51a1-80d60a151bec.png)


## 方法2
新しい方のコミットにブランチを作成→古い方に、変更を維持したままリセット→コミットする。
![ブランチ作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274593/d16e5af0-f508-637f-3bd8-fd16376b3d09.png)
![リセット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274593/28f8c646-801b-84ab-a957-01c45a1404ba.png)
![リセット2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274593/a214398e-ef0e-da40-0fca-6aeba6a14c22.png)
![コミット2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274593/f64e6d5a-0f66-2092-6806-76b16c7055b0.png)

# Note

## 正攻法 過去の問題点
以前は、コミットを1つずつ処理していたため、以下の問題がありました。
特に、処理時間の問題が辛かったため、裏技を愛用していましたが、
執筆後に試したら直っていました。

### 不要な変更も、一時的に適用される。
下図の場合、最終的には a.txt のみが変更されるが、一時的に b.txt への変更も行われる。
![消える変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274593/a88be422-6f54-2562-ba2e-50f012a47507.png)
  * ファイルがロックされていると、処理に失敗してしまう。

### コミット数が多いと、処理に時間が掛かる

コミット数が十数個程度で、それなりに待たされてしまう。
cscの作法 その279

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



# 練習問題
shellcodeを実装せよ。

# 参考にしたページ

https://7shi.hateblo.jp/entry/2012/06/11/011316

# 方針
win32apiを使う。
VirtualAllocでメモリー確保。
Marshal.Copyでshellcodeを転送。
Marshal.GetDelegateForFunctionPointerで実行。

# サンプルコード

```
using System;
using System.Runtime.InteropServices;

class Program {
	[DllImport("kernel32.dll", SetLastError = true)]
	static extern IntPtr VirtualAlloc(IntPtr lpAddress, int dwSize, int flAllocationType, int flProtect);
	[DllImport("kernel32.dll", SetLastError = true)]
	static extern bool VirtualFree(IntPtr lpAddress, int dwSize, int dwFreeType);
	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
	delegate int Delg(int a, int b);
	const int MEM_COMMIT = 0x1000;
	const int MEM_RELEASE = 0x8000;
	const int PAGE_EXECUTE_READWRITE = 0x40;
	static byte[] codes = {
 		//MOV RAX, RCX ; 
		0x48, 0x89, 0xc8,
    	//ADD RAX, RDX ; 
		0x48, 0x01, 0xd0,
    	//RET          ; 
		0xc3
	};
	static void Main(string[] args) {
		int buflen = codes.Length;
		IntPtr p = VirtualAlloc(IntPtr.Zero, buflen, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
		Marshal.Copy(codes, 0, p, buflen);
		Delg f = Marshal.GetDelegateForFunctionPointer(p, typeof(Delg)) as Delg;
		Console.WriteLine("3 + 4 = {0}", f(3, 4));
		VirtualFree(p, 0, MEM_RELEASE);
	}
}



```

# 実行結果


```
>3 + 4 = 7
```
以上。
iPhoneやAndroidでnode.jsを実機テストする方法

めっちゃ簡単。メモ書きです。
・スマホとPCを同じwifiにつないで、
・PC側でnpm run serveして、
・スマホ側で(http://IPアドレス:ポート番号)
をブラウザ表示するだけ
例）http://192.1.1.12:8080/
DESC法を使って相手を納得させよう

# はじめに
そんなつもりではないけど、相手が悪い方向に考えてしまい、怒らせてしまったことありませんか？
また、飲み会行きたいないけど・・・断りにくい:frowning2:

「言い方」「断り方」って本当に大変:fearful:で気を遣いますよね:sob:
そんな時に**DESC法**を使ってみると上手く行くかもしれません(断言できず:relaxed:)

## DESC法
DESC法(デスク法)とは、相手を不快にさせずに自身が言いたいことを伝えて、納得してもらう技法で、
Describe（描写する）、Explain（説明する）、Specify（提案する）、Choose（選択する）のそれぞれの頭文字をとったフレームワークです。

### 「D」(描写する)
自身の今の状況や相手の行動を描写します。
相手が仕方ないと納得できる説明を考えましょう。

(例)飲み会誘われた
飲み会に参加できない
↓
(なぜ？)
↓
夜に予定があるから
↓
(どういう予定？)
- 仕事が忙しいから
- 子供誕生日だから
- 妻が遅く帰宅するため、子供たちのご飯を作るため(私よく使います^^)
- 家族と外食するから
- 先約があるから

### 「E」(説明する)
わたしは、ここが重要と考えます！
やんわり断るや動いてもらうために、以下の気持ちを入れながら話しましょう。
こちらを怠ると不快な気持ちになってしまいます。

- 誘ってくれたことへの感謝
- 申し訳ない態度

### 「S」(提案する)
D・Eで気持ちを伝えられれば、相手も仕方ないと納得してくれます。
そこで、次に行うことは、提案です。

自身の要求ばかりでは、余計に不満溜まりますよね。
ギブアンドテイクですかね。

- 次回の飲み会は参加します
- 途中で退席させて頂きたい

このような対応により、相手も納得してくれます。

### 「C」(選択する)
最後にDESCをまとめて話を終わらせます。
そうすることで、相手に今回の理由をインプットすることができます。

## おまけ　頼みづらいとき
上司、先輩、後輩に頼みごとをしたいけど、ためらうとき

(例)データ入力を代わりにやってほしい。
- D(描写する)
「勤怠管理表にデータを入力しなければならいのですが、実は今、どうしても本日中に対応する必要がある作業があるのです。」

- E(説明する)
「データ入力については、明日までですが現時点で終わりそうにないので、早めに対応しようと思っています」

- S(提案する)
「お忙しいところ恐縮ですが、1時間くらいご協力頂けないでしょうか。」

- C(選択する)
「データ入力については○○(詳細な内容)です、ご協力頂けないでしょうか。」

この流れだと、「申し訳ないけど手伝いってほしい」という思いが伝わると思います。
ギブアンドテイクがありませんが、関係性がよければ、ランチおごります！など言っても良いかなと思います。

## おわり
相手を納得させることは、なかなか難しいですが、DESC法を使うことで関係性を悪くすることなく、動いてくれます。
遠慮して断れない・頼めないときには、DESC法を使ってみてください。
react-intl-universalをStorybookに反映させる

ちょっと引っかかったのでメモ。Storybookに用意されている `decorators` を使えば解決する話でした。


```js
/* .storybook/preview.js */
import React from 'react';
import intl from 'react-intl-universal';
import jaJP from './assets/locales/ja-JP.json';

const currentLocale = 'ja-JP';
const localeData = jaJP;

const withIntl = (Story) => {
  React.useEffect(() => {
    intl.init({
      currentLocale,
      locales: { [currentLocale]: localeData },
      commonLocaleDataUrls,
    });
  }, []);
  return <Story />;
};

export const decorators = [withIntl];
```

`export` するものの名前は `decorators` にしておく。

decoratorsの詳細は以下。
https://storybook.js.org/docs/react/writing-stories/decorators

なお、言語情報のファイルはWebpack内で`copy-webpack-plugin`を使ってコピーしています。

```js
/* .storybook/main.js */
const CopyWebpackPlugin = require('copy-webpack-plugin');
const appDir = '../src';

module.exports = {
  /* 略 */
  core: {
    builder: 'webpack5',
  },

  webpackFinal: async (initConfig) => {
    const config = initConfig;

    // 静的なファイルをコピー
    config.plugins.push(new CopyWebpackPlugin({
      patterns: [{
        from: `${appDir}/assets`,
        to: `${__dirname}/assets`,
      }],
    }));
    /* 略 */
    return config;
  },
};
```

おわり。
研究やデータサイエンスで利用できる実環境のHTTPアクセスログ

## EClog

ハーバード大学のデータベースで公開されています．ECサイトのアクセスログを匿名化して公開しています．

[EClog: HTTP-level e-commerce data based on server access logs for an online store](https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/Z834IK)

このデータセットの分析結果は以下の論文で確認できます．

[Analysis of Aggregated Bot and Human Traffic on E-Commerce Site - 346.pdf](https://annals-csis.org/proceedings/2014/pliks/346.pdf)

Kibanaで可視化したログは以下です．

![Kibana.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/cdae5b15-d308-4c07-0b25-1d3ca181cd44.png)

## Online Shopping Store

ハーバード大学のデータベースで公開されています．ECサイトのアクセスログをダウンロードできます．タイムスタンプやデータサイズをはじめとする一部の情報しか含まれていないため用途は限られそうです．

[Online Shopping Store - Web Server Logs - Harvard Dataverse](https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/3QBYB5)

## ClarkNet-HTTP

2週間分のClarkNetのWebサーバのアクセスログが公開されている．1995年のログであるため古い．

[ClarkNet-HTTP - Two Weeks of HTTP Logs from the ClarkNet WWW Server](https://ita.ee.lbl.gov/html/contrib/ClarkNet-HTTP.html)

## ワールドカップのWebサイト

1998年のサッカーワールドカップのアクセスログを見つけました．
静的コンテンツ（HTML，CSS，画像）が中心のWebサイトです．

[chengtx/WorldCup98: http server access logs of WorldCup 98](https://github.com/chengtx/WorldCup98)

## LogHub

LogHubではApache HTTP Serverのエラーログがデータセットとして公開されています．

[loghub/Apache at master · logpai/loghub](https://github.com/logpai/loghub/tree/master/Apache)

## その他

Googleがデータセット用の検索エンジンを提供しています．
https://datasetsearch.research.google.com/

# 余談

Usenixで一般的なコンピュータの障害についてまとめたリポジトリがありました．

- [The Computer Failure Data Repository (CFDR) | USENIX](https://www.usenix.org/cfdr)

Amazonの社内システムのアクセスログを匿名したデータセットがありました．

- [UCI Machine Learning Repository](https://archive.ics.uci.edu/dataset/216/amazon+access+samples)

推薦システムの論文で使われていそうなデータセットが以下にまとめてありました．

- [RUCAIBox/RecSysDatasets: This is a repository of public data sources for Recommender Systems (RS).](https://github.com/RUCAIBox/RecSysDatasets/tree/master?tab=readme-ov-file)

公開されたFTPサーバのアクセスパターンを解析した論文がありました．

- [File access patterns in public FTP archives and an index for locality of reference | ACM SIGMETRICS Performance Evaluation Review](https://dl.acm.org/doi/10.1145/155768.155771)

検索エンジンのクエリを25年分集めたデータセットがありました．

- [webis-de/archive-query-log: 📜 The Archive Query Log.](https://github.com/webis-de/archive-query-log)
[wsl] 起動不可の復旧

wslが昨日から不調で、何度再起動を試してもエラーがでてしまいます

```bat
仮想マシンまたはコンテナーからの応答が受信されなかったため、操作がタイムアウトしました。
[プロセスはコード 4294967295 (0xffffffff) で終了しました]
```

前回実績だとOS再起動で直るのですが、すぐに再起動できないタイミングだったのであれこれ試した結果、以下が効果がありました(復旧しました)


コマンドプロンプトを管理者起動して以下を実行します

```bat
wsl --shutdown
```

停止するのに20秒程度かかることがあります。しばらく待ちます。
プロンプトが戻ったら、普通にubuntuを起動したり、Windows Terminalを起動すればwslが起動できるようになってます。

# その他

Windows側の空きメモリが足りないと起動できないので、ユーザーフォルダ配下の.wslconfigでメモリ割り当てを調整したことがあります

```conf
[wsl2]
memory=2GB
```

# 他に試したこと

- wslをwindows terminalごと落とし上げする
- メモリ不足感があったので.wslconfigでメモリを調整する
- タスクマネージャでwsl.exeを落としたりwslhost.exeを落としたり
  - taskkill /f /im wslhost.exe
  - でもこれは不要とあとで分かった。wsl --shutdownだけでOK
xlwings rangeの配列アクセス

# ドキュメントの不足
フリーウェア系ソフトによくあることだが、xlwingsも公式ドキュメントに書かれていることが不足している。
xlwingsに不足している機能を補うモジュールを作ろうとして、現状のxlwingsでどこまで出来るのかを確認することを意識しながら、ソースを読んでいて分かった。
公式ドキュメントのAPIのところに書いてあることは、ほとんどソースファイル中のdocstringとして書かれている。ただし、各クラスのメソッドのうち、`__getitem__`などの**アンダーバー2つで始まる特殊メソッドについては、公式ドキュメントに書かれていない。**

# rangeオブジェクトに配列アクセス
## 1次元配列としてのアクセス
下記の様に、添え字1つでアクセスすると、範囲内のセルを1次元的に並べた個々のセルに対してのrangeオブジェクトへのアクセスとなる。
```python
import xlwings as xw
wb = xw.Book
rng = wb.sheets[0].range("A1:B2")
for i in range(len(rng)):
    print(rng[i].address)
# --> 
$A$1
$B$1
$A$2
$B$2
```

## 2次元配列としてのアクセス
上記の例に違和感を持った人もいると思う。rngは2次元の領域を持つゆえ、通常のpythonの2次元配列(リストのリスト)と同様であれば、`rng[0].address`は`$A$1:$B$1`を返すのであるから。

リストのリストとしてrngにアクセスすると、以下のようにエラーとなる。
```python
print(rng[0][1])
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_19144\1066751280.py in <cell line: 1>()
----> 1 print(rng[0][1])

~\AppData\Roaming\Python\Python39\site-packages\xlwings\main.py in __getitem__(self, key)
   2407             k = key + n if key < 0 else key
   2408             if k < 0 or k >= n:
-> 2409                 raise IndexError("Index %s out of range (%s elements)." % (key, n))
   2410             else:
   2411                 return self(k + 1)

IndexError: Index 1 out of range (1 elements).
```

これは、`rng[0]`が単一のセル`$A$1`のみに対するrangeオブジェクトとなっているために生じているエラーである。

では、2次元的に扱いたい場合は、どうしたら良いか。xlwingsのソース中の`class range`の`__getitem__`メソッドを見ると、2つの要素を持つ`tuple`に対応したコードが先頭にある。
2次元的にアクセスする正しい方法を以下の例のように、**`[ ]`内に行と列を並べて書く**方法である。

```python
nr,nc = rng.shape
for i in range(nr):
    for j in range(nc):
        print(rng[i,j].address)
# --> 
$A$1
$B$1
$A$2
$B$2
```
`__getitem__`メソッドの先頭にあるコードであることから、この方法がrangeオブジェクトに対する配列アクセスの本筋の方法だと思われる。

以下の例の様にrange内の一部の要素の書式を変更したい場合に、この様な配列アクセスを用いると良い。
```python
rng[1,0].api.Font.Bold = True # セルA2を太字にする
```
なお、**numpyと同様のスライスによるアクセスにも対応している**ので、範囲内の特定の列のみなどのrangeオブジェクトを得たい場合に用いると良い。
【App Service】デプロイスロットのトラフィックってなに？【Azure】

# はじめに
どうも、ATLのヴィリアスです。

今回は Azure App Service の デプロイスロットにある
「**トラフィック**」が何なのかがよく分からなかったので調べてみました。

**※免責事項(必ず、ご一読ください)**
　　本記事の情報により生じた、いかなる損害や損失についても、当社は一切の責任を負いかねます。
　　また、誤情報が入り込んだり、情報が古くなったりすることもありますので、
　　必ずしも正確性を保証するものではありません。ご了承ください。

# トラフィックってなに？どれ？

https://www.idcf.jp/words/traffic.html

> 通信の分野におけるトラフィックとは、
> インターネットやLANなどのコンピュータなどの通信回線において、
> **一定時間内にネットワーク上で転送されるデータ量**のことを意味します。

つまり、トラフィックは「**どれだけネットワークにデータが流れるか**」を示します。

そして本記事では、 App Service のここを指しています。
![画像9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124150/4ab70a19-432c-ce83-7a16-aa6a58296cec.png)

# トラフィックの割合を変えるとどうなる？

https://learn.microsoft.com/ja-jp/training/modules/understand-app-service-deployment-slots/5-route-traffic-app-service

> **指定した割合のクライアントが、非運用スロットにランダムにルーティングされます。**

例えば、運用スロットとステージングスロットの 2 つがあるとして、
それぞれトラフィックの割合を 70 % : 30 % にすると、図のようにランダムにクライアントがルーティングされます。

![画像10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124150/19f4318e-e1fb-d010-61a6-6ed27ae7f6df.png)

また、上記の Learn によるとランダムなルーティングだけではなく、
**手動でルーティング**することもできるみたいですね。

# おわりに

今まで何となく「トラフィック 100%」の文字を見ていましたが、
トラフィックを設定することでルーティングを自動制御できるということがわかりました。

「運用スロットをメインにしつつ、
興味のあるユーザーにはベータ版スロットを使ってもらう」的な場面で使えそうですね。
AWSにおいてのThe DB subnet group doesn't meet Availability Zone (AZ) coverage requirement.が出た時の対処法

# この記事の概要
```
The DB subnet group doesn't meet Availability Zone (AZ) coverage requirement.
```

のようなエラーがRDSを作成する時に出てくるので困っていました。
しかし以下の記事を参考にして解決できました。

# 原因
RDSではアベイラビリティゾーンで別のサブネットが２つ必要でしたが、
１つしかなかったみたいでした。
なのでサブネットを作成していきます。

最初は

|public1-ap-northeast-1a|
|--|
|private1-ap-northeast-1a|

だけでしたが、

|public1-ap-northeast-1a|
|--|
|public1-ap-northeast-1c|
|private1-ap-northeast-1a|
|private2-ap-northeast-1c|

で作成しました。

VPCを作成する時に気をつけた方がいいです。
そしてRDSではアベイラビリティゾーンは複数作るので忘れないようにしましょう。



# 資料
https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-launch-in-vpc/

https://qiita.com/hide4649/items/9c0354f6e2a41958529e

https://qiita.com/ymmt7974/items/dd846dbe5c9cb471c745
いやSSLって結局なんやねん...【浅く知ろうSSL】

みんなしてSSL!SSL!って言ってるけど、実際あやふやにしかわかってない...
なので今から知っていきましょう。



簡単に言ってしまうと、
```
SSL = 「http's'」から始まるURL
```
と言うことらしいので、ここから切り崩して理解していきます。

## 「 https 」 と 「 http 」
とりあえず`SSL`は置いておいて、馴染みのある`URL`の違いから理解していきましょう。
簡単に分けるとこうなります。
```
https = 安全
http = 安全じゃない
```
なるほど、httpsは安全なんですね。
では「 Qiita 」は「 https://qiita.com 」なので安全ですね ♪

## なぜ「 https 」だと安全なのか
お待たせしました。ここで出てくるのが`SSL`です！
「SSL化」することによって、そのページとのやりとり(通信)が`暗号化`されるのです！
```
SSL化 = 暗号化
```
とても詳しく学習したい方はこちらへ
https://www.idcf.jp/rentalserver/aossl/basic/about-https/

## 嬉しいSSL化
「ページが暗号化される？」ちょっとよくわからないですよね。
SSL化されるタイミングを確認します。
なんの変哲もない、会員登録するときの行程を見てみましょう。
```
メールアドレス,パスワードを入力する
　↓
 送信
```
この過程にSSL化が挟まります。
```
メールアドレス,パスワードを入力する
　↓
SSL化
　↓
 送信
```
確かにちょっと安心できる気がします☺️
急にビルドエラーになった時に試してみて欲しいこと

# 初めに
今回は`GitHub`からプルして来た時や、デバッグ中に起きる急なビルドエラー時にやってみると効果的なものを紹介していきます。
### 本文
***一つ目***が***キャッシュの削除***です。
これは定番だとは思いますが、`Android Studio`のメニューから
File->Invalidate Cachesを選択し全てにチェックを入れて実行のボタンを押すと`AndroidStrudio`のキャッシュを削除した上で再起動をかけてくれるので一度リセットされた状態になるのでおすすめです。

***二つ目***が***gradleのクリーン***です
該当プロジェクトを`AndroidStudio`で開いた状態で`AndroidStudio`下部にあるターミナルメニューから下記のコマンドを実行します。
```terminal
./gradlew clean assembleビルドフレーバー
```
こうすることで`gradle`をクリーンして該当のビルドフレーバーを実行してくれるので1つ目で紹介したやり方でビルドできない場合でも意外と直ったりします。
### 最後に
よく何もしてないのに壊れたはあり得ないと言いますが、ソフト側だとキャッシュなどの問題であり得るのがややこしいところですよね。
今回はそんなときの対処法を備忘録として残しておきました。
Azure Pipelines （YAML パイプライン）にて GUI でスケジュールトリガーにより実行する方法

## 概要

Azure Pipelines （YAML パイプライン）にて GUI でスケジュールトリガーにより実行する方法を共有します。下記のドキュメントにて、実施方法が記載されておりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9f42e631-8ac8-3a6f-a1f7-07948ad04a86.png)

引用元：[UI 設定が YAML スケジュールされたトリガーをオーバーライドする - Azure Pipelines | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/devops/pipelines/troubleshooting/troubleshooting?view=azure-devops#ui-settings-override-yaml-scheduled-triggers)

## 実施手順

### 1. スケジュールトリガー設定対象のパイプラインにて、`Edit` を選択して YAML エディターを開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5c778dfd-85f0-c7a6-79e2-f576eef15be7.png)

### 2. YAML エディターにて、右のハンバーガーメニュー（︙） -> `Triggers` を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fe88971f-d839-4967-8f85-5288fcd1776d.png)

### 3. `Trigger` タブに、`Scheduled` -> `+Add` を選択して、タイムトリガーの設定を実施。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/84f481e2-5ec4-d5d7-c713-d9342e5a690f.png)

### 4. 手順3の設定時間（10:40）にパイプラインが実行さえることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1711d72c-5296-a2be-9098-bd67b342d3b5.png)
【Let's ハンズオン🤙】node.jsをDocker化してDocker run❗️

# 【Let's ハンズオン🤙】node.jsをDocker化してDocker run❗️

## 目次
0. Dockerをインストール
1. アプリを準備
2. アプリをDocker化
3. Docker run!!

# Dockerをインストール
なにがともあれDockerを使用するので、自身の環境にDockerをインスト-ルしちゃいましょう！

## Macの方はこちら
https://docs.docker.com/desktop/install/mac-install/
## Windowsの方はこちら
https://docs.docker.com/desktop/install/windows-install/

ダウンロードのボタンをクリックでダウンロードが開始されます。

# アプリを準備
Expressのアプリを作成しちゃいましょう！

まずは、Node.jsがインストールされているか確認です。

以下、二つのコマンドを実行して確認してみてください。

```bash
node -v
```

```bash
npm -v
```

ゆうじろうはこんな感じの表示がでました。
- node -v 結果
```bash
v16.14.0
```

- npm -v 結果
```bash
v8.3.1
```

では、アプリを作成していきましょう！

ExpressというNode.jsのフレームワークを使用するので、まずはインストールです。

```bash
npm install -g express-generator
```

これでExpressのアプリが簡単に作成できる様になりました。

では、作成していきましょう。

任意の場所にプロジェクト用のディレクトリを作成して、以下のコマンドを実行です。

```bash
express --view=ejs .
```

こんな感じの表示がでてきたら、yをクリックで続行です。

```bash
destination is not empty, continue? [y/N] 
```

こんな感じの出力がされましたか？

```bash
destination is not empty, continue? [y/N] y

   create : public/
   create : public/javascripts/
   create : public/images/
   create : public/stylesheets/
   create : public/stylesheets/style.css
   create : routes/
   create : routes/index.js
   create : routes/users.js
   create : views/
   create : views/error.ejs
   create : views/index.ejs
   create : app.js
   create : package.json
   create : bin/
   create : bin/www

   install dependencies:
     $ npm install

   run the app:
     $ DEBUG=express-react:* npm start
```

では、dependenciesをinstallしてほしいとのことなので、インストールしてあげましょう。

```bash
npm install
```

npm installができたら、アプリをローカル環境で実行しましょう！

```bash
npm start
```

```bash
> [ディレクトリ名]@0.0.0 start
> node ./bin/www
```

こんな感じの表示がでれば、以下へアクセスです！

+ http://localhost:3000

ExpressのDefaultの画面が表示されればアプリ作成成功です！



# アプリをDocker化
次は作成したアプリをDocker Image化していきます。

プロジェクトのルート階層へ以下のファイル２つを作成してください。

- Dockerfile
- .dockerignore

Dockerfileの中身はこんな感じ

- Dockerfile
```Dockerfile
# 最初に調べたnodeのバージョンを記載
FROM node:16

# アプリケーションディレクトリを作成する
WORKDIR /usr/src/app

# アプリケーションの依存関係をインストールする
# ワイルドカードを使用して、package.json と package-lock.json の両方が確実にコピーされるようにします。
# 可能であれば (npm@5+)
COPY package*.json ./

RUN npm install

# アプリケーションのソースをバンドルする
COPY . .

# 開放するport番号を記載
EXPOSE 3000
CMD [ "npm", "start" ]
```

次は.dockerignoreファイルです。
これにより、ローカルモジュールとデバッグログが Docker イメージにコピーされたり、 イメージ内にインストールされているモジュールが上書きされたりするのを防ぐことができます。

- .dockerignore
```dockerignore
node_modules
npm-debug.log
```

ここまで作成したら、Dockerのイメージを作成します。

```bash
docker build . -t express-app:v1
```

express-appのv1が作成されます。

DockerDesktopを見てみましょう。
imagesの箇所へDockerイメージが作成されていれば完了です！

以下のコマンドでも確認できます。

```bash
docker images
```

# Docker run!!
ここまでくればもう簡単です。
以下のコマンドを実行し、Docker上でExpressで作成されたアプリを実行してください！

```bash
docker run -p 3000:3000 -d express-app:v1
```

-dオプションで実行しているので、バックグラウンドで実行中となります。

では、再度以下へアクセスしましょう！
+ http://localhost:3000

見た目は変わりませんが、今度はDockerコンテナ上でのアプリの実行となります。

動作確認が終了したら、アプリを停止しておきましょう。

stopボタンでアプリを停止できます。

ハンズオンは以上となります！

## お疲れ様でした。
MacOSでネットワーク内の端末を確認する(ipv6)

# ルーティングテーブル

これ

https://qiita.com/ryuichi1208/items/c7df775dcc70f448240c

# 自分のIPとネットワーク

```shell
% ifconfig | grep en0 -A6 | grep -i fe80
        inet6 fe80::1:14ad:eb4e:e03%en0 prefixlen 64 secured scopeid 0x4 
```
en0 の部分はインターフェース名


# リンクローカルマルチキャスト(ipv4のブロードキャスト)
```shell
ping6 -I en0 -c 1 ff02::1
```
en0 の部分はインターフェース名

# ネイバー一覧
```shell
ndp -a
```

# 到達確認
```shell
ping6 -c 1 fe80::1:14ad:eb4e:e03%en0
```