OmniAICreator/Qiita-1.07M huggingface dataset:
[Linkerd2]Kubernetes上で拡張機能としてデプロイしたlinkerd-jaegerのメトリックスを外部Prometheusから取得する

# 環境/前提

Kubernetes: v1.23

以下をクラスター上にデプロイ済み
PrometheusOperator([HelmChart](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack)): kube-prometheus-stack-36.2.1
Linkerd: v2.11
Jaeger all-in-one([HelmChart](https://github.com/linkerd/linkerd2/tree/main/jaeger/charts/linkerd-jaeger)): linkerd-jaeger-2.11.3stable-2.11.3

# 本題

## 結論

ServerAuthorizationを編集する必要があった

## 概要

Jaeger all-in-oneによるとポート14269で/metricsエンドポイントにてメトリックスがスクレイプされるよう用意されている

確かにJaegerのPodの中身を見ると確かにそんな感じがする

```yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    prometheus.io/path: /metrics
    prometheus.io/port: "14269"
    prometheus.io/scrape: "true"
...
```
Serviceとしては公開されていない

```
NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                           AGE
jaeger            ClusterIP    10.233.44.125   <none>        14268/TCP,14250/TCP,16686/TCP   2d3h
```

が、PodMonitorがあるので問題ないだろう

### PodMonitorを作成
作成したPodMonitorがこちら

```yaml
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  labels:
    team: jaeger
  name: jaeger
  namespace: linkerd-jaeger
spec:
  namespaceSelector:
    matchNames:
    - linkerd-jaeger
  podMetricsEndpoints:
  - interval: 5s
    path: /metrics
    port: admin
  selector:
    matchLabels:
      component: jaeger
      linkerd.io/control-plane-ns: linkerd
      linkerd.io/extension: jaeger
      linkerd.io/proxy-deployment: jaeger
      linkerd.io/workload-ns: linkerd-jaeger
```

これをデプロイしたがメトリックスが取得できない
linkerd-proxyのログを見たらRequest deniedされてた

```bash
...
[  1993.963968s]  INFO ThreadId(01) inbound:server{port=14269}: linkerd_app_inbound::policy::authorize::http: Request denied server=jaeger-admin tls=Some(Established { client_id: Some(ClientId(Name("prometheus-operator-kube-p-prometheus.monitoring.serviceaccount.identity.linkerd.cluster.local"))), negotiated_protocol: None }) client=10.233.92.74:40682
[  1993.964065s]  INFO ThreadId(01) inbound:server{port=14269}:rescue{client.addr=10.233.92.74:40682}: linkerd_app_core::errors::respond: Request failed error=unauthorized connection on server jaeger-admin
...
```

ちゃんとエンドポイントにアクセスしに行っていると安心しつつ、検索したらこの[Issue](https://github.com/linkerd/linkerd2/issues/7339)にたどり着いた

### ServerAuthorizationを編集

jaeger-adminのServerAuthorizationを編集して

```yaml
apiVersion: policy.linkerd.io/v1beta1
kind: ServerAuthorization
metadata:
(省略)
spec:
  client:
    meshTLS:
      serviceAccounts:
      - name: prometheus-operator-kube-p-prometheus #自分の環境にしてね
        namespace: monitoring #自分の環境にしてね
  server:
    name: jaeger-admin
```

ログを見に行くと新しいエラーも吐いてなくてPrometheus見に行ったら

## 結果

![2022-07-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534703/1f09a7f7-bf95-6507-c132-d89898201f10.png)

できてる！！！！！！

# 参考

https://www.jaegertracing.io/docs/1.34/monitoring/
https://github.com/linkerd/linkerd2/issues/7339
PhpStormでマウスを使わずに矩形選択

## 概要
PhpStormでマウスを使わずにキーボードのみで矩形選択する方法を備忘録として残します。

## 環境
OS：Windows
PhpStormのバージョン：2022.1.3

## 手順
1. Ctrlを2回押す。
2. 1.でそのままCtrlを押しっぱなしで矢印キーで矩形選択できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015414/eac3ad61-256a-7b13-ba63-9bbc58990d26.png)
All About ACS: Win-AP 1.1.0.26 (May 2022 の更新) で ODBC の構成ダイヤログが開けない

# Win-AP 1.1.0.26 (May 2022 の更新) で ODBC の構成ダイヤログが開けない

「[Application Package - May 2022 の更新](https://qiita.com/6onoda/items/102ee0ccc61fcc924ac4)」でお伝えしたように、2022年5月に OS に特化した Application Package が提供されました。
しかし、このバージョンの Windows 向け Application Package では ODBC の構成ダイヤログが開けない事象が発生するようです。

## 回避方法

「[SE78010 - OSP-INCORROUT ODBC CONFIGURATION WINDOW DOES NOT OPEN](https://www.ibm.com/support/pages/apar/SE78010)」に情報があります。

下記にドキュメントと一時修正があります。

[https://public.dhe.ibm.com/as400/products/clientaccess/solutions/WindowsAP/APARs/SE78010/](https://public.dhe.ibm.com/as400/products/clientaccess/solutions/WindowsAP/APARs/SE78010/)


一時修正はこちら

https://public.dhe.ibm.com/as400/products/clientaccess/solutions/WindowsAP/APARs/SE78010/SE78010.zip

適用方法はこちら


https://public.dhe.ibm.com/as400/products/clientaccess/solutions/WindowsAP/APARs/SE78010/readme.txt

>    Perform the following steps on your PC:
>   1) Download the zip file and unzip it.
>   2) Close any ODBC applications.
>   3) Rename the original cwbodbc.dll files in C:\Windows\System32 and/or C:\Windows\SysWOW64.
>   3) Copy the cwbodbc.dll files to the proper locations:
>     For Windows 32-bit:
>       x86/cwbodbc.dll -> C:\Windows\System32
>     For Windows 64-bit:
>       x86/cwbodbc.dll -> C:\Windows\SysWOW64
>       x64/cwbodbc.dll -> C:\Windows\System32

## 修正は次回の Application Packag May 2023

修正は次回リリースの 2023年5月 の WIN-AP に含まれる予定です。

***
2022-07-13 作成
***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***
javascript 深い配列から取得

```
data =[{
    id:1,
    value:['a', 'b', 'c']
  },
  {
    id:2,
    value:['d', 'e', 'f']
  },
  {
    id:3,
    value:['g', c', 'h']
  },
]
```
'c'のみを取得したいと思います。
```
let r = data.map(d =>{
  return d.value
})
.flat()
.filter(v=> v === 'c')

console.log(r)
// [ 'c' ,  'c' ]
```
できました。
Vue３ + Vuetify3 + Vite のプロジェクトの作成

# 注意

Vuetify3 stable になって、下記コマンド一発でいけるようになりました。

```
$ yarn create vuetify
```

- [Vuetify3 Installation](https://next.vuetifyjs.com/en/getting-started/installation/)

以下の記事は、参考までに残しておきます。

# 前提

下記ツールがインストール済み、かつ下記表記以上のバージョンであること。

```
$ node -v
v16.16.0
$ npm -v
8.13.2
$ vue -V
@vue/cli 5.0.8
$ yarn -v
1.22.19
```

# プロジェクト作成

## vue

sample_vue という部分は、新しく作りたいプロジェクトの名前にします。

```
$ vue create sample_vue
...
? Please pick a preset: Default ([Vue 3] babel, eslint)
...
```

vue create では `[VUe3] babel eslint` を選びます。

## vuetify

```
$ cd sample_vue/
$ vue add vuetify
...
? Choose a preset:
  Configure (advanced)
  Default (recommended)
❯ Vite Preview (Vuetify 3 + Vite)
  Prototype (rapid development)
  Vuetify 3 Preview (Vuetify 3)
...
```

Vite Preview (Vuetify 3 + Vite) を選びます。

## vue-router

```
$ vue add router
 WARN  There are uncommitted changes in the current repository, it's recommended to commit or stash them first.
? Still proceed? Yes
...
? Use history mode for router? (Requires proper server setup for index fallback in production) Yes
```

質問には、どちらも y と入力します。

## 動作確認

```
$ yarn dev
```

これで、ブラウザで `http://localhost:3000` を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/6fffb077-c203-9515-8038-c1331890222b.png)

上記の画面が出たら、作成は終了です。
Recoilを使うぞ

こんにちは、フレームワークはReactが一番好きなフロントエンジニアです。
最近初めてRecoilに触れたところ、圧倒的使いやすすぎてReduxが使えなくなってしまいました。そんな便利なRecoilについて、今更ですがまとめて置こうと思います。

:::note info
Recoilとは
ReactやNext.jsで使える状態管理ツール。
全ファイル内で同じ変数を共有出来るので、Propsによる変数バケツリレーが不要になります。Reduxより圧倒的に簡単で、普通にuseStateのように使えます。
:::

### ◎使用技術
・React(18.2.0)
・Recoil(0.7.4)
・TypeScript

## ■はじめる
Recoilは始め方も簡単です。インストール→全体をRecoilRootで囲むだけで使えます。

```plaintext:ターミナル or コマンドプロンプト
npm install recoil
または
yarn add recoil
```


とりあえず使いたい範囲を囲んであげればいいので、index.tsxでもOKです。
Next.jsの場合は_app.tsxにて囲んであげて下さい。
```react:App.tsx(Reactの場合)
import { RecoilRoot } from "recoil";
import { Router } from "./Router";

function App() {
  return (
    <>
      <RecoilRoot>
        <Router />
      </RecoilRoot>
    </>
  );
}

export default App;

```

```React:_app.tsx(Next.jsの場合)
import { RecoilRoot } from "recoil";

function MyApp( { Component, pageProps } ) {
return (
< RecoilRoot>
　< Component {...pageProps} />
</ RecoilRoot>
);
}

export default MyApp;
```

これで準備完了です。


## ■Atomファイルの作成
srcフォルダの中に「atoms」フォルダを作成しましょう。
その中に「XXAtom.ts」を作成してあげます。

### ◎全体で共有して使いたい変数を設定していく
例として、球の半径の変数(ballRadius)を設定していきます。
初期値は10とします。

```React:src > atoms > BallAtom.ts
/**
 * 球の半径.
 */
export const ballRadiusState = atom({ //このstate名を使って後で取り出す
  key: "ballRadius", //キー名
  default: 10,       //変数の初期値
});

```

変数は連想配列でも設定可能です。
```React:src > atoms > BallAtom.ts
import { atom } from "recoil";

/**
 * 球の位置.
 */
export const ballState = atom({ //このstate名を使って後で取り出す
  key: "ball", //キー名
  default: {   //変数の初期値
    x: 0,
    y: 0,
  },
});

```
これだけです。

### ※TypeScriptを使って変数の型を設定したい場合
球にアニメーションをつけたかったため、canvas変数も用意しました。
型を設定したい場合は「atom」の後ろに<>を記述してあげます。

```react
//キャンバス型
type canvasType = {
  canvas: HTMLCanvasElement | undefined;
  ctx: CanvasRenderingContext2D | undefined;
};

/**
 * キャンバス描画.
 */
export const canvasState = atom<canvasType>({
  key: "canvas",
  default: {
    canvas: undefined,
    ctx: undefined,
  },
});
```


## ■別ファイルから変数を読み書きする

:::note info
読み書きの方法は3種類あります。
useRecoilValue　 ：値の読み込みだけしたい場合に使用
useSetRecoilState：値の書き込みだけしたい場合に使用
useRecoilState　 ：値を読み書きしたい場合に使用
:::

### ◎読み込みのみ：useRecoilValue

```react
import { useRecoilValue } from "recoil";

//円の半径
const ballRadius = useRecoilValue(ballRadiusState);
console.log(ballRadius); //10

//連想配列の場合：球の位置
const xy = useRecoilValue(ballState);
console.log(xy); //{ x:0, y:0 };

//連想配列から1要素を抜き出すことももちろん可能
const x = useRecoilValue(ballState).x;
console.log(x); //0
```

### ◎書き込みのみ：useSetRecoilState
```react
import { useSetRecoilState } from "recoil";

const setBallRadius = useSetRecoilState(ballRadiusState);
setBallRadius(20); //球の半径は10→20に

//連想配列の場合：球の位置
const setXy = useSetRecoilState(ballState);
setXy({ x:10, y:20 }); //連想配列でセットしてあげる
```

### ◎読み書きする：useRecoilState
ReactのuseStateみたいに使えます。

```react
const [ballRadius , setBallRadius] = useRecoilState(ballRadiusState);
console.log(ballRadius); //10
setBallRadius(20); //球の半径は10→20に
```

## ■まとめ
今回はRecoilの超基本機能についてまとめました。selector等まだまだ別の機能もあるので、もっと色々と取り入れてみたいと思います。
もしこの機能は使うべき！というものがあれば、是非ご教示頂けると幸いです。

ここまでご覧頂きありがとうございました。
Octave で正準相関分析

# Octave で正準相関分析

正準相関分析を行う。

    usage:
    [A B r U V] = canoncorr (X, Y)

    X: データ行列
    Y: データ行列

    A: X に対する係数
    B: Y に対する係数
    r: 正準相関係数
    U: X に対する正準得点
    V: Y に対する正準得点

## 使用例 1

すべてデフォルトで描画する。



```matlab
pkg load statistics % statistics が必要
format long % 表示精度を高くする（任意）
```


```matlab
x = [ 2  1
      1  2
      0  0
     -1 -2
     -2 -1];
y = [ 2  2
     -1 -1
      0  0
     -2  1
      1 -2];
[A B r U V] = canoncorr(X, Y)
```

    A =
    
       1.054092553389460                   0
      -0.843274042711568  -0.632455532033676
    
    B =
    
       2.633125101432526e-17  -6.356417261637284e-01
       6.324555320336759e-01   6.356417261637294e-02
    
    r =
    
       1.000000000000000   0.301511344577764
    
    U =
    
       1.264911064067352  -0.632455532033676
      -0.632455532033676  -1.264911064067352
                       0                   0
       0.632455532033676   1.264911064067352
      -1.264911064067352   0.632455532033676
    
    V =
    
       1.264911064067352  -1.144155107094711
      -0.632455532033676   0.572077553547355
                       0                   0
       0.632455532033676   1.334847624943830
      -1.264911064067352  -0.762770071396474
【MPAndroidChart】チャートタップ時にツールチップ表示

# 概要
チャートタップ時に、ツールチップ(下画像で`3.0,7.0`と描画されているビュー)を表示させる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/b6fe92c7-c884-57d2-5c93-8d5446f1413e.png" width="40%">
[グラフの描画については、この記事を参照。](https://qiita.com/nakashimaakio/items/d9ad48b3433c680e6f4c)

# 方法
ツールチップのレイアウト作成。
```marker_view.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
	xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:tools="http://schemas.android.com/tools"
	android:id="@+id/marker_text"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:background="@color/gray"
	android:padding="8dp"
	tools:text="1.0, 2.0"/>
```

処理の部分。`MarkerView`を使用。
```MainActivity.kt
val mv = object : MarkerView(this, R.layout.marker_view) {
	override fun refreshContent(e: Entry?, highlight: Highlight?) {
		val textView: TextView = findViewById(R.id.marker_text)
		textView.text = "${e?.x}, ${e?.y}"
		super.refreshContent(e, highlight)
	}

	override fun getOffset(): MPPointF {
		return MPPointF(-width / 2f, -height - 20f)
	}
}
mv.chartView = binding.chart
binding.chart.marker = mv
```

[参照記事](https://qiita.com/c60evaporator/items/14e63d22d860b73e6f22)
【rails6】超簡単なソート切り替え備忘録

管理画面等で役立つ、超簡単なデータの並び替えについて備忘録として残しておきます。

主に使うものは
- link_to(view)
- 条件分岐(controller)
- scope(model)

です。

前提として、articleモデルにある適当なデータを一覧にして、それを並び替えます。
**データ一覧ページへのパス:** articles_path
**ビュー:** index.html.erb
**コントローラー:** articles_controller.rb
**モデル:** article.rb


## ソート切り替え用のリンクを設置
まず、並び替えをしたい画面でそのトリガーとなるリンクを設置します。
viewファイルに以下のように記述します

```erb
<div>
  # ソート切り替え用リンク
  <%= link_to '新しい順', articles_path(latest_created_at: true) %>
  <%= link_to '古い順', articles_path(old_created_at: true) %>
</div>

<div>
  # 全てのarticleのcontentカラムを表示
  <% @articles.each do |article| %>
    <%= article.content %>
  <% end %>
</div>
```
**latest_created_at:** とか**old_created_at:** はcontrollerでデータ取得のやり方について条件分岐を行うために受け渡すパラメーターです。
後で出てくるのでとりあえず置いときます。

## ソートのためのデータ取得をscope化する
modelファイルで、レコードを新しい順と古い順に取得するための処理をscope化しておきます。
```ruby
scope :latest_created_at, -> {order(unsubscribed_at: :desc)} #新しい順
scope :old_created_at, -> {order(unsubscribed_at: :desc)} #古い順
```
scopeとして処理をまとめておくことで、controllerでデータを取得する際に簡単な記述で処理を行うことができます。
また、ここで出てくる**latest_created_at:** 、**old_created_at:** はscope名であり、パラメーター名のものとは別物ですが今回は統一します。

## controllerでデータ取得の条件分岐を行う
viewファイルに設置したリンクを踏むことで、データの取得法を切り替えるための条件分岐をcontrollerの中で行います。
```ruby
if params[:latest_unsubscribed_at]
  @articles = Article.latest_created_at
elsif params[:old_unsubscribed_at]
  @articles = Article.latest_created_at
end
```
paramsによって受け取っているパラメーターは、viewファイル内にあるリンクを踏むことによって受け渡されます。
つまり、新しい順に並び替える用のリンクを踏むと、params[:latest_unsubscribed_at]には"true"が代入され、@articlesには、レコードを新しい順に取得するscopeを用いて代入されます。

## まとめ
以上で、最低限のソート切り替えを実装することができました。
ユーザー用に実装する場合は、画面更新なしで見た目が切り替わったりするといいんでしょうけど、今回はそこまでは至りませんでした。
何かおかしなところや問題点がございましたら、ぜひご教授ください！
AtCoder B,C問題をKotlinで解こう - ABC259

当記事ではAtCoder、ABCのB問題ならびにC問題（時々D問題も）のKotlinでの解法を超初心者向けに詳細に解説します。

https://atcoder.jp/contests/abc259/tasks

## [B - Counterclockwise Rotation](https://atcoder.jp/contests/abc259/tasks/abc259_b)
#### やりたいこと
$(a,b)$ を原点を中心として反時計回りに $d$ 度回転させた場合、回転後の座標を $(x,y)$ とすると以下の式で求められる。

$x = cos(d)*a - sin(d)*b$
$y = sin(d)*a + cos(d)*b$

$cos$ ならびに $sin$ はKotlinで既に関数が用意されているので、それを当てはめれば良い。ただし関数にわたす角度はラジアンで扱う必要があるため、入力値で渡された角度は ```toRadians``` 関数でラジアンに変換しよう。
#### 入力値の取得
```kotlin
    // 入力値の取得
    val (a, b, d) = readLine()!!.split(" ").map { it.toInt() }
```
#### 角度の変換
```kotlin
    // 入力された角度をラジアンに変換
    val fixD = Math.toRadians(d.toDouble())
```
#### サンプルコード
```kotlin:main.kt
fun main(args: Array<String>) {
    // 入力値の取得
    val (a, b, d) = readLine()!!.split(" ").map { it.toInt() }

    // 入力された角度をラジアンに変換
    val fixD = Math.toRadians(d.toDouble())

    // 座標回転の式に当てはめる
    val newX = Math.cos(fixD) * a - Math.sin(fixD) * b
    val newY = Math.sin(fixD) * a + Math.cos(fixD) * b

    // 答えの出力
    println("$newX $newY")
}
```
## [C - XX to XXX](https://atcoder.jp/contests/abc259/tasks/abc259_c)
#### やりたいこと
文字列Tと文字列Sを先頭から順に文字ごとに比較していく。文字列Tのi番目の文字を　`t[i]`、文字列Sのi番目の文字を`s[i]`として

- `t[i] == s[i]` の場合
  - 何もしない
- `t[i] != s[i]` の場合 
  - `t[i-2] == t[i-1] && t[i-1] == t[i]` の場合
    - 文字列Sのi文字目に文字`t[i]`を挿入
  - 上記に該当しない場合
    - SをTに一致させることは不可能、処理終了

とする
#### 入力値の取得
```kotlin
    // 入力値の取得
    val s = readLine()!!
    val t = readLine()!!
```
#### 場合分け
文字ごとの比較は文字に対する操作の性質上、3文字目（index値の場合0から始まるので2以降）から行う。よって、文字列Tの長さが3未満の場合は操作が行えない。ただし、最初から文字列Sと文字列Tが一致している場合は操作は必要ない。そういった場合分けを実装しよう。
```kotlin
    // すでに一致している場合
    if (s == t) {
        return true
    }

    // Tの長さがSの長さ以下である場合（操作を行えない）
    if (t.length <= s.length) {
        return false
    }

    // 先頭の2文字は処理の対象外
    if (t.length < 2 || s.length < 2) {
        return false
    }
    if (s.take(2) != t.take(2)) {
        return false
    }
    if (t.length < 3) {
        return false
    }
```
#### サンプルコード
```kotlin:main.kt
fun main(args: Array<String>) {
    println(if (getAns()) "Yes" else "No")
}

private fun getAns(): Boolean {
    // 入力値の取得
    val s = readLine()!!
    val t = readLine()!!

    // すでに一致している場合
    if (s == t) {
        return true
    }

    // Tの長さがSの長さ以下である場合（操作を行えない）
    if (t.length <= s.length) {
        return false
    }

    // 先頭の2文字は処理の対象外
    if (t.length < 2 || s.length < 2) {
        return false
    }
    if (s.take(2) != t.take(2)) {
        return false
    }
    if (t.length < 3) {
        return false
    }

    // 文字挿入を行うため、文字列Sを文字のMutableListに変換する
    val tmp = s.toMutableList()
    for (i in (2..t.lastIndex)) {
        if (tmp.lastIndex >= i && tmp[i] == t[i]) {
            // t[i]とs[i]が一致している
            continue
        }
        if (t[i - 2] == t[i - 1] && t[i - 1] == t[i]) {
            // t[i]とs[i]が不一致だが操作を行える
            tmp.add(i, t[i])
        } else {
            // 操作を行えない
            return false
        }
    }
    return true
}
```
shell timestamp 付きファイル作成

```time.sh
#!/bin/bash

time=$(date +%Y%m%d%H%M)
echo aaa > file_name_$time
```

ok

![Screenshot from 2022-07-13 16-11-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/0e1de8d3-207c-40f0-5f89-75acf40e8393.png)

(参考) https://atmarkit.itmedia.co.jp/flinux/rensai/linuxtips/240datefilename.html
【Ruby on Rails】【Pokemon API】カントー地方151匹をすべて表示させてみよう

Railsで[ポケモンいえるかな](http://hoget.web.fc2.com/pokesay.html)を開発したくて、
まず初段階としてポケモンをすべて表示させてみようと思いました。その為の備忘録です。


# 1.Railsプロジェクトの作成
まずはRailsプロジェクトを作成します。
```terminal:terminal
$ rails new kanto_pokemon
```

kanto_pokemonプロジェクトが作成されたら
ターミナル上でkanto_pokemonプロジェクトに移動します。
(cdコマンドを使用します。)



次に`faraday`というHTTP通信させたいときに使うgemをGemfileに追記して`bundle install`します。

* Faradayのざっくり説明
    * HTTPクライアントライブラリ。
    * Rubyの標準ライブラリのnet/httpでもHTTPリクエストはできますが、Faradayはより簡単にHTTPリクエストを行うことができる。
```Gemfile:Gemfile
gem 'faraday'
```

```terminal:terminal
$ bundle install
```

次にPokemonsコントローラーとPokemonモデルを作成します
モデルはstring型のnameを格納します

```terminal:terminal(コントローラの作成)
$ rails g controller pokemons index
```

```terminal:terminal(モデルの作成)
$ rails g model pokemon name:string
```

コントローラは命名時は**複数形**、モデルは**単数形**なので
間違えないようにしてください


今回は[PokeAPI](https://pokeapi.co/)を使用します。

:::note
APIとは他サービスの機能を連携できる仕組みのことである
:::


例えばメタモンの情報を取り出したいとき、
Try it now!の下のフォームに
`pokemons/ditto`と入力すると
下にdittoのJSONがダダーーっと出ます。



::: note warn
  ここではポケモン名は英語名で検索する必要があります。
[ポケモン図鑑ソードシールド > ポケモン 英語名リスト](https://yakkun.com/swsh/pokemon_en.htm)
などで英語名を調べてから検索しましょう。
:::

![スクリーンショット 2022-07-20 15.30.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33092/e823c02c-81fc-bcb4-9e1f-a1e9cff9040d.png)

ここでは`pokemons/[ポケモンの英語名]`でポケモンの情報を習得しましたが、
他にもわざや、タイプ、道具などで検索・習得することができます。
詳しくは公式リファレンスを読んでください。
(すべて英語ですが、翻訳で読みましょう。)



pokeAPIと先程Gemfileに追加したFaradayを利用して
図鑑no.001～no.151までのポケモンを取得して
ページに表示させてみましょう。
`app/controllers/pokemons_controller.rb`を編集します。

```rb:app/controllers/pokemons_controller.rb
class PokemonsController < ApplicationController
  def index
    pokemons = []# ポケモンの名前を格納する空の配列を作成

    response = Faraday.get "https://pokeapi.co/api/v2/pokemon-species?limit=151&offset=0"
    #↑ pokeAPIからno.001からno.151までを取得（GET）する
    response = JSON.parse(response.body)
    # JSON.parseとはJSON形式の文字列をRubyのHash（ハッシュ）形式に変換するためのメソッド
    response.each do |k, value|
      if k == "results"
        value.each do |key, val|
          response = Faraday.get(key["url"])
          response = JSON.parse(response.body)
          pokemons.push(response)
        end
      end
    end
    
    pokemons.map do |poke|
      unless pokemons.find(1) #2重保存防止
        Pokemon.create(
          id: poke['id'],
          name: poke['names'][0]['name']
        )
      end
    end
    @pokemons = Pokemon.all
  end
end

```


あとはViewです！index.html.erbを編集してください
```erb:app/views/pokemons/index.html.erb
<%= @pokemons.each do |p| %>
  <p><%= p.name %></p>
<% end %>
```

これでポケモンno.001からno.151までのポケモンが表示されます。
お疲れ様でした！
【heroku】git push heroku masterでのデプロイエラーと500エラー（Laravel、Docker環境にて）

## 問題のエラーについて
Docker環境において、Laravel個人アプリをHerokuにデプロイするにあたり、git push heroku mainとすると、以下のエラーが出ました。

```
ssh: connect to host heroku.com port 22: Operation timed out
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

## デプロイのエラー解決について

### ① heroku上のリモートリポジトリを「ssh」から「https」に変更
```
git remote -v
```
を実行して、heroku上のリモートリポジトリがどうなっているのか確認したところ、
```
heroku  ssh://git@heroku.com/[アプリ名].git (fetch)
heroku  ssh://git@heroku.com/[アプリ名].git (push)
```
と「https」ではなく「ssh」がついた状態でした！！
この致命的なミスに気づかないまま、何時間も無駄にしていました。。。

そうか「ssh」から「https」に変えればいいのかと思い、意気揚々と
```
git remote set-url heroku https://git.heroku.com/[アプリ名].git
```
として、再度「git remote -v」をしましたが、未だ「ssh」のまま。。。
必死にググっていくと、下記の記事に助けられた！

https://teratail.com/questions/222554

の通りに、
```
git config --global --remove-section url.ssh://git@heroku.com/
```
すると、「ssh」から「https」に変更することができ、デプロイ自体は成功！



### ② デプロイ後の500エラーがでた！
デプロイ先のURLにアクセスすると500エラーが出ました。 ググってみると、下記の記事に辿り着き、

https://qiita.com/mumucochimu/items/f233d6f6347747dde7f2

composer.jsonに.envを読み込む？旨の記述をすると解決するらしく、やってみました。
```php:composer.json
//以下を最下部に追記
  "compile": [
    "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
  ]
```

ただ、記事にもあるように.envはgitで追跡されてないので、代わりに「.env.sample」を「.env」の内容にコピペして書き換えてから、記事にあるように「composer.json」に追記をしました。（念の為、「.env.sample」のバックアップを取りました。）

その後、ターミナル上でコミットしたのち、再度heroku pushしたところ、500エラーが解消され、サイトが見れるようになりました!

Laravel初心者ですので、分かりにくい部分があれば申し訳ありません！参考になれば幸いです！
JavaでWindowsのファイル名の禁止文字をアンダースコアに置き換える関数

https://docs.microsoft.com/ja-jp/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#naming-conventions

「整数表現が 0 ~ 31 の範囲にある文字」に当てはまる正規表現を脳直で`\u0000-\u0031`としてしまって、半角スペースも置き換えるようになってしまった。
javaユニコードエスケープは16進数表現であることに気づき修正。

```scala

import java.util.regex.Pattern

final val ForbiddenWindowsFilenameCharsRegexPattern = Pattern.compile("""[<>:"/|?*\\\u0000-\u001F]""")

def replaceForbiddenCharWithUnderscore(str: String): String = 
  ForbiddenWindowsFilenameCharsRegexPattern.matcher(str).replaceAll("_")

```
Octave でボックスプロット（箱ひげ図）

# Octave でボックスプロット（箱ひげ図）

ボックスプロット（箱ひげ図）を描く。

    usage: 他にも何通りかあるが以下が最も書きやすい
    s = boxplot (data, group, options, …)
    
    data は測定値ベクトル，goup は測定値がどのグループのものかを示すベクトル
    options の種類と指定方法は使用例 2 を参照
    
    戻り値が代入された変数は行列で，各列は group に対応し，
    1 行目：最小値
    2 行目：第 1 四分位数
    3 行目：中央値
    4 行目：第 3 四分位数
    5 行目：最大値
    6 行目：中央値の下側信頼限界
    7 行目：中央値の上側信頼限界

## 使用例 1

すべてデフォルトで描画する。



```matlab
pkg load statistics % statistics が必要
format long % 表示精度を高くする（任意）
```


```matlab
data = [62.76; 51.52; 42.27; 53.28; 46.12; 45.28; 66.35; 51; 44.74;
        44.97; 47.88; 47.1; 53.65; 49.51; 44.5; 41.63; 46.07; 48.27;
        44.41; 40.98; 44.75; 67.46; 41.14; 36.35; 56.11; 52.02; 44.62;
        41.6; 53.21; 51.65];

group = [2; 2; 3; 1; 3; 1; 3; 2; 1; 1; 2; 1; 2; 2; 2; 2; 2; 3; 2; 3;
         3; 2; 1; 3; 3; 3; 3; 1; 1; 2];

boxplot(data, group)
```


    
![output_3_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/0be30948-61b5-c7b2-3ab4-bc1dae7b6003.png)


    


boxplot(data, group) を実行すると，以下のような警告が出る（2022/07/13 現在）<pre>
    warning: colon arguments should be scalars
    warning: called from
        boxplot at line 506 column 11</pre>
これは**プログラムのバグ**で，506 行目が<pre>
    for i = 1:nug</pre>
になっているのが原因で，正しくは<pre>
    for i = 1:length(nug)</pre>
でなければならない。

更に，507 行目にもエラーがある。元のままではボックスプロットに描かれるグループ名が不正である。<pre>
    column_label = num2str (groups(i));</pre>
になっているが原因で，正しくは<pre>
    column_label = num2str (nug(i))</pre>
でなければならない。

macOS では，boxplot.m は
`/Users/foo/Library/Application Support/Octave.app/6.2.0/pkg/statistics-1.4.3` 
ディレクトリにあるので，プログラムを修正すればよい。

## 使用例 2

オプションを指定して描画する。



```matlab
s = boxplot(data, group,
    'Notch', 'on',        %% デフォルト 'off'
    'Symbol', ['x', '*'], %% デフォルト '.'
    'Orientation', 'horizontal', %% デフォルト 'vertical'
    'Whisker', 1.8,       %% デフォルト 1.5
    'Widths', 0.3,        %% デフォルト 0.4
    'CapWidths', 2,       %% デフォルト 1
    'OutlierTags', 'on',  %% デフォルト off
    'BoxWidth', 'fixed',  %% デフォルト 'proportional'
    'BoxStyle', 'filled', %% デフォルト 'outline'
    'Positions', [3,2,1], %% デフォルト 1:number of group
    'Labels', {'group 1', 'group 2', 'group 3'}, %% デフォルト group から
    'Colors', ['b', 'g', 'y']) %% デフォルト 'y'
```

    s =
    
       41.14000000000000   41.63000000000000   36.35000000000000
       43.95500000000000   45.67750000000000   42.85750000000000
       45.12500000000000   50.25500000000000   45.43500000000000
       48.62750000000000   52.15000000000000   51.08250000000000
       53.28000000000000   67.45999999999999   66.34999999999999
       43.95500000000000   47.32153380039606   42.85750000000000
       47.71860580154890   52.15000000000000   49.51852819951694
    



    

![output_6_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/f0697e6f-1370-e1fa-aa38-fb3a22befa29.png)
数字タイピングのコツ

見ないで打てるようになったが高速では打てない

最近はパソコンの小型化のため、テンキーがないパソコンが増えてきた。

ガッツリ数字タイピングする仕事ではないが速度アップはしたい

でもランクAにはなりたいな

|1  |2  |3  |4  |5  |6  |7  |8  |9  |0  |
|---|---|---|---|---|---|---|---|---|---|
|**左小**|**左薬**|**左中**|**左人**|**左人**|**右人**|**右人**|**右中**|**右薬**|**右小**|


練習するサイト
https://typing.twi1.me/game/636

# コツ
3文字づつで覚える？

電話番号と同じように3文字4文字で覚える？

どなたか効率の良い数字タイピングを教えてください
PowerAutomateフロー「名前をつけて保存」でエラー「フローの保存がコード 'MultipleErrorsOccurred' および…」

PowerAutomateでワークフローの複製を作るとき「名前をつけて保存」（実質的にはコピーの保存）を行います。
今回はその「名前をつけて保存」をしたときに発生する問題のトラブルシューティングです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/015a5b91-9da3-b14a-12ca-81d481cd568d.png)

今回ご紹介する事象は、 Excel Online (Business) のアクション「スクリプトの実行」でOffice Scriptsを利用しているワークフローで起こります：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/46600aca-0088-8673-a171-55fb60ce09ec.png)

# Problem

「スクリプトの実行」を含むワークフローを「名前をつけて保存」しようとすると、次のようなエラーが発生して保存できないことがあります：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/c369272d-84b0-5d55-9200-dad48c7b9775.png)

メッセージ全文は：

> フローの保存がコード 'MultipleErrorsOccurred' およびメッセージ 'API 'excelonlinebusiness' 操作 'GetSingleScript' への動的操作要求は、状態コード 'NotFound' で失敗しました。これは、入力パラメーターが無効であることを示している可能性があります。エラー応答: { "status": 404, "message": "Script not found. It may have been unshared or deleted.\r\nclientRequestId: 37477d64-80be-4092-b066-f8a1c50bf5c8", "error": { "message": "Script not found. It may have been unshared or deleted." }, "source": "excelonline-jw.azconn-jw.p.azurewebsites.net" };API 'excelonlinebusiness' 操作 'GetSingleScript' への動的操作要求は、状態コード 'NotFound' で失敗しました。これは、入力パラメーターが無効であることを示している可能性があります。エラー応答: { "status": 404, "message": "Script not found. It may have been unshared or deleted.\r\nclientRequestId: 37477d64-80be-4092-b066-f8a1c50bf5c8", "error": { "message": "Script not found. It may have been unshared or deleted." }, "source": "excelonline-jw.azconn-jw.p.azurewebsites.net" }' で失敗しました。

# Solution

このエラーは「名前をつけて保存」オペをしているユーザーが、ワークフローで利用しているOffice Scriptsのスクリプトにアクセスできないときに発生するようです。
スクリプトを「共有」して、Excelブックにアクセスできるユーザーなら誰でも当該スクリプトにアクセスできるようにしていても、なぜかアクセスできないことがしばしばあります。。。

「ワークフローを所有しているユーザーで『名前をつけて保存』オペしているのにエラーになる」という場合は、ワークフローの「埋め込み接続」の内容を確認して、オペしているユーザーと異なる名義の「Excel Online (Business)」接続がないかを確認してみましょう。
あれば当該接続を削除します：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/7b97a0b7-32c6-98f9-1426-28f8e15e0dab.png)

そしてこれに伴いワークフロー内でもエラーになるアクションが発生するはずなので、それらもFIXします。
ワークフロー編集画面の「Excel Online (Business)」系アクションの箇所に⚠マークが表示されるのですぐに分かるはずです：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/1a118503-5e13-3845-e1e3-766213233f30.png)
クラウドネットワークを学ぶ① パブリックサブネットとプライベートサブネット

クラウドのネットワークまわりの知識について、わかるところからまとめていきたいと思います。

# サブネットとは？
まずサブネットとは？
ここでは、ある程度まとまったIPアドレスのグループと定義して、話を先に進めます。

# パブリックサブネットとプライベートサブネット
## パブリックサブネット
インターネットゲートウェイに接続できる
## プライベートサブネット
インターネットゲートウェイに接続できない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727269/555ac4d4-749f-a016-fa69-ef9e6490952d.png)
Windows Updateできないときの対処方法(解決？)

# Windows Updateでエラー出力
エラー内容
>デバイスに重要なセキュリティ修正プログラムと品質修正プログラムがありません

参考記事

https://www.tksoft.work/archives/3650

# 試したこと
1. トラブルシューティングを実行する
1. システム修復
1. セキュリティ問題修正プログラムダウンロード
1. 通知が来た

# 1. トラブルシューティングを実行する
Windows設定より、トラブルシューティングをWindows Updateにかける。
しかし、エラーは検出されなかった。

# 2. システム修復
ｺﾏﾝﾄﾞﾌﾟﾛﾝﾌﾟﾄ(管理者)にて以下を実行する。
```powershell
DISM.exe /Online /Cleanup-image /Restorehealth
```

エラー出力！（37.9％）
>605: 指定したバッファーに誤った形式のデータが含まれています。

以下を実行して、システムを修復する。
```powershell
sfc /scannow
```
メッセージが出力され、修復できたらしい。
>Windows リソース保護により、破損したファイルが見つかりましたが、それらは正常に修復されました

再起動する

Windows更新プログラムの再インストール
ⅰ以下の画面に移動する
コントロールパネル -> プログラムと機能 -> インストールされた更新プログラム表示

ⅱリストから最新のMicrosoft Windows（KBxxxxxxx）更新を選択して、「アンインストール」をクリックします。

ⅲ再起動後、WindowsUpdateを開始する

しかし、以下の様なメッセージが出る
>デバイスに重要なセキュリティ修正プログラムと品質修正プログラムがありません。

インストールは順調に進んでいる。
しかし、同様の警告が出てインストールが中止される。

# 3. セキュリティ問題修正プログラムダウンロード
以下のサイトより、ダウンロードする。
winverでバージョンを確認し、設定よりビット数を確認する。

https://msrc.microsoft.com/update-guide/

しかし、しばらくして以下の様な表示が出た。
>一部の更新プログラムはインストールされませんでした。
>　次の更新プログラムはインストールされませんでした:
>　Windows用セキュリティ更新プログラム(KB5015807)

# 4. 通知が来た
突然、WindowsUpdateのために再起動を促す通知が来ました。
そこで、再起動をすると、4時間ほどかかりますが無事インストールできました。
エラーもなく、使用できています。
原因は不明のまま...
Airflow資料抄訳(9)：DAG Runステータス（DAG Run Status）

恥ずかしながら最近になって知ったワークフローエンジン [Apache Airflow](https://airflow.apache.org/)。日本語の紹介記事もちらほら出てきていますが、[公式ドキュメント](https://airflow.apache.org/docs/)をちょっとずつ抄訳しながら読んでいこうと思います。

9回目の今回は[DAG Runステータス](https://airflow.apache.org/docs/apache-airflow/stable/dag-run.html#dag-run-status)（DAG Run Status）。
バージョン2.3.3時点のものです。

---

# DAG Runステータス

DAG RunのステータスはDAGの実行が完了した時点で決まります。DAGの実行はそれが含むタスク群とそれらの依存関係に基づきます。すべてのタスクが`success`、`failed`あるいは`skipped`といった終了状態になったとき（言い換えればもはや他の状態を取り得ない状況になったとき）、DAG Runにステータスが設定されます。DAG Runのステータスはいわゆるリーフ・ノードの状態に基づき設定されます。リーフ・ノードとはグラフを構成するノードのうち子要素を持たないノードのことです。

DAG Runには2つの終了状態があります：

* `success` ：すべてのリーフ・ノードの状態が`success` もしくは`skipped` のとき
* `failed` ：いずれかのリーフ・ノードの状態が`failed` もしくは `upstream_failed` のとき

:::note warn
注意
タスクが[トリガールール]( https://airflow.apache.org/docs/apache-airflow/stable/dags.html#trigger-rules)が指定されている場合は注意してください。それにより予想外の振る舞いが惹起されることがあります。例えばトリガールール ` all_done `を指定されたリーフ・ノードのタスクが存在するとき、当該タスクは他のタスクの状態を考慮せずに実行され、もし当該タスクが`success`状態となると、DAG Run全体のステータスもまた`success`と見なされるます。中間ノードのタスクに`failded`状態のタスクが存在したとしてもです。
:::

---

DAG Runのステータスの判定条件が「すべてのノードの状態」ではなく「すべてのリーフ・ノードの状態」とされており、中間ノード（これらの中にも当然何がしかの意味のある処理を行っているものが含まれうる）のステータスは考慮されない点が要注意ですね。。
職場ではJP1をよく使っていたのでとても大きな違いに感じます。
rsyncでEC2のディレクトリの権限を書き換えてしまいsshできなくなって死ぬほど焦った話

# 環境

- AWS
- EC2 Ubuntu 20.04.3 LTS

# 経緯

- ファイルを今すぐサクッとアップロードしたい（一部、除外したいファイルがある）
- `scp` だと、除外するのが面倒だ
- よし、`rsync` を使ってしまおう


```
rsync -av my-special-app my-pretty-ec2:
```

とコマンドを実行するつもりが、勢い余って

```
rsync -av my-special-app/ my-pretty-ec2:
```
とコマンドを実行してしまう

- 「ローカルのフォルダ自体」を「EC2のディレクトリ」に同期してしまう
  - (-aオプションを深く考えず付けてしまったので、可能な限りローカル側のファイルがリモートで再現される)

# トラブル

- その後、`Permission denied (publickey)` になり、`ssh` できなくなる

# 原因

- rsyncによって、ディレクトリの権限が書き換わってしまったから
  - (焦りすぎて思考能力、状況把握能力が、ほぼゼロになり、.sshフォルダばかり疑ってしまう、解決まで少し時間がかかる)
- AWSナレッジページ（ページ最下部）に確認すべき項目が述べられていて、本当に助かった

# 対処方法

- AWSのManagement consoleから、[Actions] - [Connect] を選択する
- （Webブラウザでコマンドを実行できる、`ssh`できなくてもリモート操作できる)
- 環境に応じて、アクセス権を修正（以下、コマンド例）
  - AWSのページでは、`700` となっている

```
sudo chmod 755 /home/ubuntu
```

# 再発防止

- rsync時は--dry-run必須など

# 学び

- 急いでいると深く考えなくなる、慣れてくると自信過剰になる
- トラブルが発生して、焦っているときの思考は危険
- 物事を、もっと深く学び、急いでいても高品質な出力を実現する（そのために、アウトプットすることは有効な手段と考える）


# 参考にしたページ

> Linux ホームディレクトリ (/home) であれば、(0755/drwxr-xr-x) にする必要があります。
> ユーザーのホームディレクトリ (/home/ec2-user/) であれば、(0700/drwx------) にする必要があります。
> .ssh ディレクトリのアクセス許可 (/home/ec2-user/.ssh) であれば、(0700/drwx------) にする必要があります。
> authorized_keys ファイルのアクセス許可 (/home/ec2-user/.ssh/authorized_keys) であれば、(0600/-rw-------) にする必要があります。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-linux-fix-permission-denied-errors/
ICML2022の枝刈り論文 (2)

# 概要

この記事では、[ICML2022](https://icml.cc/)の枝刈り論文を紹介します。[^1]

[その1](https://qiita.com/kyad/items/b32f38ae16ea47e5d517)

[^1]: 画像や数式は論文から引用しています。


# Topology-Aware Network Pruning using Multi-stage Graph Embedding and Reinforcement Learning

https://arxiv.org/abs/2102.03214

概要：GNN-RL. 枝刈りを最適に行う手法。
新規性：DNNのアーキテクチャをGNNでモデル化して、強化学習で最適化する方法。
キモ：マルチレベルのGNNでモデル化することで効率化する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/49dac4d6-0a22-cb30-599f-c6638582c260.png)
評価：MobileNet v1, v2やResNetで実験した。


# Winning the Lottery Ahead of Time: Efficient Early Network Pruning

https://arxiv.org/abs/2206.10451

概要：EarlyCroP. 枝刈り学習。学習の初期にstructuredで刈るもの。
新規性：GPUのメモリ量や計算コストが低い方法。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/37a7bfbd-7519-cd56-2281-8d9c397540e7.png)
キモ：Gradient Flow (GF) を保存するように刈る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/3c09d081-5889-0fa3-5f33-7e0a7f128862.png)
$I(\Theta_t)$が小さい$\rho$%を刈る。(GrasPではGFを最大化するのと対照的)
これは、DNNの推論性能と相関のあるNTKを保存することと、GFを保存することに相関があるから。
評価：ResNet, CIFAR, TinyImageNet等で実験した。


# Neural Network Pruning Denoises the Features and Makes Local Connectivity Emerge in Visual Tasks

https://proceedings.mlr.press/v162/pellegrini22a.html

概要：枝刈りで得られる重みの考察。
新規性：IMPの枝刈りで得られる重みから、local connectivityというCNNの[inductive bias](https://en.wikipedia.org/wiki/Inductive_bias)を見出すことができることを示した。
キモ：様々な枝刈りを試して、IMPがベストであることを示した。
評価：ImageNetを学習させて実証した。
ZigでHello World

# はじめに
今エンジニア界隈で話題の新しい言語[Zig](https://ziglang.org/)、モダンなシステムプログラミング言語だそうです
この分野の競合には有名な[Rust](https://www.rust-lang.org/ja/)がありますね
モダンプログラマー目指すなら乗り遅れるなとばかりにさっそくハローワールドを…

# Zigのインストール in Windows
```powershell
choco install zig
```
Windowsでもパッケージ管理をしたい!!

# ZigでHello World in Windows
Zigはパッケージ管理がデフォルトでついているようです。さすがモダン言語
```powershell:terminal
zig init-exe
```
```powershell:terminal
>tree
│  build.zig
│
└─src
       main.zig
```
これでカレントディレクトにプロジェクトファイルができます
エディタを開くのです…
```zig:src/main.zig
const std = @import("std");

pub fn main() !void {
    std.debug.print("Hello, {s}!\n", .{"World"});
}
```
で、ビルドして完成
```powershell:terminal
zig build
```
zig-out\bin\以下にバイナリができているようなので実行します
```powershell:terminal
>"zig-out\bin\Zig Tutorial.exe"
Hello, World!
```
できました、やったね!!
Dockerの起動時にUnixHTTPConnectionPoolエラーが発生する

Macでdocker-composeを使っています。
コンテナ起動時に下記エラーが発生し、コンテナが起動できなくなりました。
次回また発生した時のため備忘録として書いておきます。

# 操作
```
$ docker-compose up
```

# エラーの内容
```
ERROR: for redis  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)

ERROR: for phpmyadmin  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)

ERROR: for db  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)

ERROR: for web  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)
```

# 解決方法
- MacのDocker Desktopを再起動する
1. Docker DesktopのGUIを表示させて、右上の虫マークをクリック
1. Restart Docker Desktopの右にある「Restart」ボタンをクリック
[![Image from Gyazo](https://i.gyazo.com/2a01937263b716f49ed117efd20556d4.png)](https://gyazo.com/2a01937263b716f49ed117efd20556d4)
1. 再起動後にdocker-compose up をするとエラーは解消している（はず）
codebuildでのerror対処

こんにちは。anoneです。
今回はcodebuildでプロジェクトを作成し、走らせた時に引いたエラーの話をします。

## 前提
* buildspec.yml内でdiffコマンドを用いて実行している
* codebuildのプロジェクトを実行し、コンソール上で発生したエラー内容を以下に記している

## エラー内容
結論から言うと、原因はbuildspec.ymlの中のdiffコマンドで差分を確認した際のエラーでした。
エラー内容は以下です

```
Reason: exit status 3
```

記載していたbuildspec.ymlを修正したところ、エラー内容が変わりました
```
Reason: exit status 1
```
調べた感じだと、buildspec.ymlの中でdiffコマンドを実行時に、diffコマンドが確認した差分からエラーが発生していました
戻り値としては以下のようなものが想定されるとのことです
（詳細は参考資料を見てください）
|戻り値|説明|
|---|---|
|0|ファイルは同一です|
|1|ファイルは異なっています|
|2以上|エラー終了|

## 確認項目
* `terraform fmt`によってフォーマットが統一されているか
    * 全角スペースなどが入ってエラーになる可能性があるので、必ずフォーマットを綺麗にした方が良い
* 環境変数が正しく読み込まれているか
    * 宣言した変数の文字列が間違っている可能性もあるので、要確認すると良い
* 公式ドキュメントに違反していないか
    * 公式に設定しろと書いてある内容がきちんと書かれていない場合があったので、確認すると良い


## さいごに
* 私の場合は、上記の確認項目をよく意識してファイルを見直すと上手くいきました
* こんなところで、、と筆者自身思いがちですが、一つずつ解消するしかないので、よく見ましょう（自戒）
* 同じようなところで悩んでいた人の助けになれば幸いです

## 参考資料
[雲のメモ帳](https://www.cloudnotes.tech/entry/codebuild-diff-command)
BIの使い方がわからなくてもDynamics 365/Power Appsで手軽にデータを視覚化する

## Dynamics 365/Power Apps の "ビューの視覚化" 機能とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/5e1c591a-11da-3c90-8456-20bec2499daf.png)


"ビューの視覚化" 機能を使うと、BIを使ったことがない現場担当者が気軽に自分のデータを視覚化することができます。

これまでもPower Appsに標準搭載されたダッシュボードで視覚化することができましたが、この機能を使うことでダッシュボードをより多彩かつ手軽に作成することが可能になりました。

https://docs.microsoft.com/ja-jp/power-bi/create-reports/dynamics-quick-create-report



現場担当者が普段表示しているビューをそのままBIとして出力し、すぐに分析を始めることができます。下記画像の"ビューの視覚化" ボタンをワンクリックするだけでビジュアルが自動作成されるので、データの取り込みやモデル化の経験が無くてもBIでの分析を始めることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/cd8e176c-abc1-0b3e-ee37-85a0c84cf12e.png)

出力されたダッシュボードは後からビジュアル・軸・凡例・集計方法を変更できます。全てクリック操作で進められるので、現場担当者でも直観的に想定通りのダッシュボードを実現することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/7bc7faff-3a5d-0d58-d40f-d7f180afacee.png)


このように現場担当者が見たいダッシュボードを自分で作れるようになることで、これまでデータアナリストに依頼して入手していた分析結果をすぐに得られるようになります。例えば、営業担当者が日常的に行う顧客ターゲティングのための分析や上司へのレポーティング資料作成において活用できるのではないでしょうか。


## 機能を有効化するには
オプションは、アプリケーション編集画面(新UI)の[設定] ダイアログ ボックスの [機能] の下にあります。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/ea30b638-a248-2c1d-74c5-ea83b5f1d9a0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/bbc1d4ee-a5ed-9cd3-091c-c85c5cd0bacf.png)



## 必要なライセンス
"ビューの視覚化" 機能を利用するのに必要なのはDynamics 365/Power Appsのライセンスのみで、有償のPower BIライセンスは必要ありません。ただし本機能はプレビュー段階のため、最新の必要ライセンスについてはマイクロソフト公式Docsをご確認ください。

https://docs.microsoft.com/ja-jp/power-apps/user/visualize-in-power-bi#licensing-considerations
Laravel-admin EC2 インストール手順 2022年版

# Laravel-AdminをEC2にインストールする手順 2022年版

### パッケージのインストール

```
sudo amazon-linux-extras install -y php7.4
sudo yum install -y php-xml
sudo yum install -y php-mbstring
sudo amazon-linux-extras install -y mariadb10.5
sudo yum install httpd httpd-devel
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
```

### 自動起動設定

```
# mysql
sudo systemctl start mariadb
sudo systemctl enable mariadb
sudo systemctl is-enabled mariadb
sudo mysql_secure_installation

# httpd
sudo systemctl start httpd
sudo systemctl enable httpd
sudo systemctl is-enabled httpd
```

### Laravelインストール

```
sudo su -
cd /var/www/
composer create-project "laravel/laravel=5.6.*" hoge-project

cd hoge-project
composer require encore/laravel-admin
```

### Databaseの準備

```
mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.5.10-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database hoge-project;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> ^DBye
```

### Configの準備

```/etc/httpd/conf/httpd.conf
# 以下を編集
DocumentRoot "/var/www/hoge-project/public"

<Directory "/var/www/hoge-project/public">
    AllowOverride All
</Directory>
```

```/var/www/hoge-project/config/database.php
        // ログイン情報を記述
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'hoge-project'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', 'xxxxxxxxx'),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
```

```/var/www/hoge-profect/config/filesystems.php
        // 以下を追記
        'admin' => [
            'driver' =>'local',
            'root' => public_path('uploads'),
            'visibility' =>'public',
            'url' => env('APP_URL').'/uploads',
        ],
```

### 権限周り

/var/www/hoge-project は apache.apache に変更


### 設定の更新

```
php artisan admin:install
php artisan config:cache
php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
```

### 動作確認

http://xxx.xx.xx.xxx/admin

ID: admin
Password: admin
フェッチとプルの違い

# 概要図


![Github仕組みのコピー2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/79db5cf6-1383-a7f9-6e71-f947ad1ea5a5.jpeg)


# フェッチ

 リモートリポジトリからローカルリポジトリに情報を落とすこと(この場合、ワークツリーには反映されない)。
その後、マージをすることでワークツリーに反映をすることができる。

しかし、ローカルリポジトリのmasterブランチではなく、origin/masterブランチに情報が取り込まれるため、マージをしたい場合は、"git merge origin/master"となる。

### コマンド

```
$ git fetch <リモート名> <ブランチ名>   (リモートからローカルへ)
(例: git fetch origin master)

$ git merge orgin/master  (ワークツリーに反映)
```



# プル
リモートリポジトリから情報を取得して、マージまで一度に実行する(ワークツリーまで反映される)。

ただし、"git pull"すると今いるブランチにリモートリポジトリの内容が統合されるため、注意が必要。

### コマンド

```
$ git pull <リモート名> <ブランチ名>
(例: git pull origin master)
```

# 参考

Git： もう怖くないGit！チーム開発で必要なGitを完全マスター (Udemy)
エクセル起動時に独自テンプレートを開く

# やり方

空白のブック（新規ファイル）を作成。
セルの書式設定やセルの値などを設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f198dcaf-a524-5f48-0827-73260d456e61.png)

ファイル名は **Book** で拡張子は **xltx** で保存。
**ファイル名はBook固定です** 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2c71db0b-6657-1b17-bbf5-3f159a1777ee.png)

作ったBook.xltxを下記に置きます。

```
C:\Users\%username%\AppData\Roaming\Microsoft\Excel\XLSTART
```

エクセル起動時にスタート画面が表示されないように設定します。
設定方法は下記。

https://qiita.com/waokitsune/items/a86893e82bff68c7aa97

すると、エクセルを起動したらすぐに独自テンプレートが開くようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bdd81ca8-f694-ada6-14fe-d27aa96d61fa.png)

# 蛇足

凝ったテンプレートより、『全セルが文字列設定になっているシート』『A列の合計計算セルだけのシート』といった、『シンプルかつ単機能なシート』を2～3個用意した方が使い勝手がよいです。

# 参考

https://www.excelspeedup.com/kihonsettei/#h3_1

https://support.microsoft.com/ja-jp/office/excel-%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%96%E3%83%83%E3%82%AF%E3%81%BE%E3%81%9F%E3%81%AF%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E9%96%8B%E3%81%8F-be9cddc1-a148-4cbf-8f3b-779df08957a3

https://forest.watch.impress.co.jp/docs/serial/exceltips/1076660.html

# バージョン

Microsoft Windows [Version 10.0.19045.3636]
Microsoft Excel for Microsoft 365 MSO (バージョン 2310 ビルド 16.0.16924.20054) 32 ビット
Laravelのmigrateでcould not find driverが出た時の対処法

環境
・Ubuntu 18.04
・MySQL 5.7
・PHP 7.4
・Laravel 6.7.0

マイグレーションを使うために php artisan migrate:install コマンドを実行したところ、
Illuminate\Database\QueryException  : could not find driver の文字が表示された。
どうやら、PHPからMySQLに接続するためのドライバが見つからないらしい。

mysqlのドライバをインストールすために、下記のコマンドを実行した。（Ununtuの場合）
sudo apt install php7.4-mysql

そしてもう一度migrate:installを試したところ、成功した。
日常生活での平方根

学生時代の脳死状態で意味不明な平方根を学習してたが、こんな解説が欲しかったなって思う
# 1部屋を倍の広さにしたい時

広さを2倍にしようとして縦と横の1辺の長さを2倍にすると、面積は4倍になってしまう。

なので、
縦✕$\sqrt{2}$
横✕$\sqrt{2}$
にすればok
c#でlibyara その7

# 概要
c#でlibyaraやってみた。
練習問題やってみた。

# 練習問題
guiで、emotet、チェッカーを作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/51856cff-e0a7-110d-781a-c2bc8ebd169d.png)


# サンプルコード

```
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.Drawing;
using YaraSharp;

class form1: Form {
	form1() {
		Text = "emotet";
		ClientSize = new Size(300, 200);
		Button btn1 = new Button();
		btn1.Location = new Point(50, 50);
		btn1.Text = "check";
		btn1.Click += btn1_Click;
		Controls.AddRange(new Control[] {
			btn1
		});
	}
	void btn1_Click(object sender, System.EventArgs e) {
		string BaseDirectory = Environment.CurrentDirectory;
		string yaraRuleFile = Path.Combine(BaseDirectory, "emotet.rule.txt");
		string fileContent = string.Empty;
		string filePath = string.Empty;
		using (OpenFileDialog openFileDialog = new OpenFileDialog())
		{
			openFileDialog.InitialDirectory = "c:\\";
			openFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
			openFileDialog.FilterIndex = 2;
			openFileDialog.RestoreDirectory = true;
			if (openFileDialog.ShowDialog() == DialogResult.OK)
			{
				filePath = openFileDialog.FileName;
				Console.WriteLine(filePath);
				string yaraInputFile = filePath;
				YSInstance yaraInstance = new YSInstance();
				using (YSContext context = new YSContext())
				{
					using (YSCompiler compiler = new YSCompiler(null))
					{
						compiler.AddFile(yaraRuleFile);
						YSReport compilerErrors = compiler.GetErrors();
						YSReport compilerWarnings = compiler.GetWarnings();
						YSScanner scanner = new YSScanner(compiler.GetRules(), null);
						List<YSMatches> Matches = scanner.ScanFile(yaraInputFile);
						foreach (var Match in Matches)
						{
							Console.WriteLine(Match.Rule.Identifier);
						}
						if (scanner.ScanFile(yaraInputFile).Any(r => r.Rule.Identifier != null))
						{
							MessageBox.Show("hit");
						}
						else
						{
							MessageBox.Show("pass");
						}
					}
				}
			}
		}
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}




```

以上。
いかん、git rebase -iでコミットを削除しすぎてしまった。特定のコミットを復活させたいとき


# rebase -iで、一気にdropにして、必要なコミットも削除してしまった

```
git rebase -i <commit>
```

# そんなときは、
## 編集の覚えがあるファイルを思い出して、reflogから引っ掛ける
reflogを見て、必要なコミットがわかればOK

```
git reflog --name-status --date=local
```


## コミットをローカルブランチに適用する

```
git rebase -i <commit>
```
Power Appsでのソリューションアップデート時にエラーが出たらまずやること 

## ソリューションアップデートが失敗する原因は様々
Power Appsのソリューションアップデートが失敗する原因は様々で例えば、
+ 依存関係のあるコンポーネントがソリューションに含まれていない
+ ユーザによってアプリ編集のセッションがロックされている
+ ユーザによってソリューション編集のセッションがロックされている
...etc

と上げれば切りがありません。


今回はインポート失敗の原因を素早く特定し、トラブルシューティングを行っていくための方法をご紹介します。ちなみにインポート時にエラーは出ないものの、アップデート内容が反映されない場合の対応方法はこちらで紹介しています。

https://qiita.com/hikaru37111/items/4c8b6efce0ff6e83798e


## まず確認すべきこと
エラー発生時の原因特定方法は大きく分けて2通りです。
①エラーログをダウンロードして確認する
②ソリューションの履歴からエラーコードを確認する

②が一番簡単かつ手軽に確認できるので、下記に手順を紹介します。


まず、ソリューションのメニューボタンから「履歴を見る」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/92967d35-654f-88f3-fc62-1e86d09922e2.png)

すると過去のインポート履歴が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/cbac74ad-cb32-2742-88de-9b2b49223e65.png)

エラーが発生した場合は下記のようにエラーの表示が出ます。
さらに該当の行をクリックすることでエラーコードとそのメッセージを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/68002aa1-b9c7-7dad-2172-c707de8bac4a.png)

今回の場合だと「既に以前のインポートが実行中のため、新たなインポートを実行できなかった」というメッセージが確認できます。このようにまずは履歴からエラー原因を確認することで、数多想定できる原因の中から該当の1つを特定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/7d46e59b-6374-f55a-8a68-47ddf8133511.png)
LINE WORKS の Bot 宛てメッセージの署名確認 (Power Automate) LINE WORKS API 2.0

## LINE WORKS の Bot 宛てメッセージの署名確認

LINE WORKS の Bot 宛ての POST リクエストには、X-WORKS-Signature ヘッダーが含まれています。

このヘッダーを利用して、LINE WORKS Developes の以下の記事の手順で、正しく LINE WORKS から送信さた POST リクエストであるかを確認できます。

https://developers.worksmobile.com/jp/reference/bot-callback?lang=ja

--- 記載引用 ---
メッセージサーバーから送信されたメッセージの改ざん有無を確認するには、ヘッダーに含まれる X-WORKS-Signature を用います。 確認プロセスは以下を参照してください。

「Developers Console > Bot」Botの詳細情報画面でBot Secretを取得します。

Bot Secretを秘密鍵として利用し、メッセージサーバーから送られた body の内容を HMAC-SHA256 アルゴリズムでエンコードします。

上記の HMAC-SHA256 アルゴリズムでエンコードした結果を BASE64 エンコードします。

X-WORKS-Signature のヘッダー値と比較し、同一であればメッセージは改ざんされていないと判断できます。
--- ここまで ---

## Power Automate の Encodian コネクター

https://twitter.com/iwaohig/status/1546749630154543105?s=20&t=a0lf2yXeNEddQlvI6HrXBg

使ってみます。

HTTP 要求の受信時をトリガーにします。

![l_150728740_5_4c479aecbb1a6bbb593a2affb96ba725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/fd452c89-a7ac-6310-591f-7868caf4a192.png)

Encodian の HMAC を作成する のアクションを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/e849872f-5d0a-1dc9-d853-2ccc11ac8587.png)

パラメーターを設定します。
キーは LINE WORKS Developer Console の Bot Secret です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/8fff3a63-6511-5d1a-a88e-be381e6b3f24.png)

コントロールの条件のアクションを使って、HMAC と X-WORKS-Signature のヘッダー値を比較します。

ヘッダー値は triggerOutputs()['headders']['X-WORKS-Signature'] の式で取りだします。

一致すれば処理を続行し、一致しない場合エラーを返して処理を終了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/2d4bc080-de0a-6b4d-762d-ef286a5d7482.png)

## 動作確認
Callback URL に LINE WORKS 以外から Request を Post してみます。
署名の不一致により、HTTP 要求の応答アクションでエラーを返しています。

![l_1517737_2060_85d1e0b0c25ccbacacb5d7e5a3f5df4c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/bdfe80e7-97d6-91a5-f277-3ff5c4d03c2d.png)