OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScriptのtsconfig.json設定まとめ

## コンパイル
.tsファイルを.jsファイルへコンパイルする場合はtscコマンドを使用する。
```ts
tsc index.ts create.ts
```

複数ファイルのコンパイルは上記の方法でも可能だが、下記コマンドでtsconfig.jsonを作成することでよりシンプルなコマンドでコンパイルできる。

```ts
$ tsc --init

Created a new tsconfig.json with:                                                                                       
                                                                                                                     TS 
  target: es2016
  module: commonjs
  strict: true
  esModuleInterop: true
  skipLibCheck: true
  forceConsistentCasingInFileNames: true


You can learn more at https://aka.ms/tsconfig.json
```

これで下記コマンドだけで複数ファイルをコンパイルできる。
＊ -wはウォッチモード
```ts
tsc -w
```

## tsconfig.json
```ts:tsconfig.json
"exclude": [
    "compiler.ts",
    "*.spec.ts",

    // どのフォルダにあるcompiler.tsもコンパイルしない
    "**/compiler.ts",

    // デフォルトでTypescriptはnode_modulesをコンパイルしないが、
    // excludeを一つでも定義するとコンパイルされてしまうためこの設定が必要
    "node_modules"
  ]
```
includeはコンパイルするファイルを指定することができる。
fileはワイルドカードが指定できない。相対パスか絶対パスのみ。

### target
ES6など、どのバージョンでコンパイルするか指定できる

### lib
ES６やDOMなど、TypeScriptが用意している型定義を追加することができる。
```ts
let hello = "hello";
console.log(hello.toUpperCase());
```
toUpperCase()はlibファイルの中で定義されている。
TypeScriptがコンパイルすることによってこのメソッドが使える。
libをコメントアウトした場合、targetに指定したバージョンに必要なlibが自動でコンパイルされる。

```ts
"target": "es6",
"lib": [],  
```
上のようにlibに何も指定しない場合、Typescript上で「toUpperCase()が使えない」「consoleは定義されていない」といったエラーが発生してしまう。

### sourceMap
trueにした場合、mapファイルを生成することができる。
mapファイルがあると検証ツールを使用してブラウザ上でTypeScriptが確認できる。

### outDir
ファイルの出力先を指定

### rootDir
ルートディレクトリを指定

### removeComments
コメントをjsファイルへ出力しない

### noEmit
jsファイルを出力しない。作成したtsファイルに誤りがないか、エラーのみを出力する。
問題なければ何も出力されない。

### noEmitOnError
エラーが発生した場合はtsファイルを出力しない

### strictNullChecks
string型(numberなど他の型も同じ)にnull、undefinedは定義できないように設定できる。
union型だと定義できる。
```ts
// NG
let string: string = null;
// OK
let string3: string | null = null;
```
【BigQuery】BigQuery UtilsでGA4のデータ抽出

みなさんこんにちは
今回は、[Googleアナリティクス4（GA4）](https://support.google.com/analytics/answer/10089681?hl=ja)のSQLが~~長ったらしくてイヤ~~複雑で困っているという人向けに便利なライブラリ「__BigQuery Utils__」を紹介します。
# BigQuery Utils
[bigquery-utils](https://github.com/GoogleCloudPlatform/bigquery-utils)

README（一部抜粋）
> This repository provides useful utilities to assist you in migration and usage of BigQuery.

（BQの複雑なデータ構造に悩む全人類の救世主！個人的にはusefulの前にveryを10個くらい追加したい！）

この中の[bigquery-utils/udfs/community/](https://github.com/GoogleCloudPlatform/bigquery-utils/tree/master/udfs/community)に便利なUDFがたくさん置かれています。

今回は、特に使用頻度が高い関数`get_value()`と`url_parse()`を見ていきます。

# get_value()
構造体の配列を扱うときに便利な関数

閲覧されたページのurlを知りたい場合、GA4のevent_paramsフィールドからkey=page_locationのvalueのstring_valueをみるために、こんなSQLを書いていると思います
```SQL
SELECT 
    (SELECT value.string_value FROM UNNEST(event_params) WHERE key = "page_location") AS page_location
FROM 
    `project-***.analytics_*****.events_YYYYMMDD`
```
これが、BigQuery Utilsを使うと次のように書けます。
```SQL
SELECT
    bqutil.fn.get_value("page_location", event_params).string_value AS page_location
FROM 
    `project-***.analytics_*****.events_YYYYMMDD`
```

# url_parse()
URLから指定した部分を返す関数

例えば取得した`page_location`
```
https://qiita.com/hirakuma/items/06aa9784073609d425de?key=value#anchor
```
このままでは使いにくいので、HOSTやPATHを取得したいときは
```SQL
bqutil.fn.url_parse(url, 'HOST'), -- => qiita.com
bqutil.fn.url_parse(url, 'PATH'), -- => hirakuma/items/06aa9784073609d425de
bqutil.fn.url_parse(url, 'QUERY'), -- => key=value#anchor
bqutil.fn.url_parse(url, 'REF'), -- => anchor
bqutil.fn.url_parse(url, 'PROTOCOL') -- => https
```
こうします。QUERY部分をもっと詳しく見たいときは`url_keys()`や`url_parse()`を使うと良いです
（正規表現などでごにょごにょ書く必要が無く、とても重宝しています！）

# まとめ
・BigQuery Utilsはとても良い
・BigQuery Utilsはとても良い（大事なことなので２回言いました）

[bqutil.fn](https://github.com/GoogleCloudPlatform/bigquery-utils/tree/master/udfs/community)には他にも便利な関数がたくさんあるので、暇なときに覗いてみるといいかもしれません

# 次回予告
データポータル連携について書く、、、かも（UAからGA4への移行で困っている人たくさんいますよね。きっと）
文字列の一致方法

文字列の一致方法をJavaで実装しました

```Java
import java.util.Scanner

public class Mojikensaku1 {
   public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        System.out.println("検索する文字を入力してください");
        String line1 = sc.nextLine();
        System.out.println("判定する文字を入力してください");
        String line2 = sc.nextLine();
        //文字列検索結果フラグの定義
        booloean flag1 = true;
        //文字列検索チェック
        flag1 = line2.contains(line1);
        //文字列が含まれているかチェック　ある場合は「DANGER」ない場合は「OK」
        if (flag1 == true) {
            System.out.println("DANGER");
        } else {
            System.out.println("OK");
        }

        sc.close();
   }
}
```
containsメソッドを使って文字列検索をしています。
Rails6 × Vue3 アプリ立ち上げ手順

# 記事作成意図
ネット上にRails×Vue3の情報が少ない(Vue2ばっかり)のでまとめておきました。

### Railsアプリを新規作成
```
rails new -d mysql アプリ名
```
### Vue用インストール
```
yarn add vue@next
yarn add --dev vue-loader@next @vue/compiler-sfc
```
### DB作成
```
rails db:create
```
### サーバが起動することを確認
```
rails s
```
### environment.jsを編集
```config/webpack/environment.js
const { environment } = require('@rails/webpacker')
const { VueLoaderPlugin } = require('vue-loader')
const { DefinePlugin } = require('webpack')

environment.plugins.prepend(
    'VueLoaderPlugin',
    new VueLoaderPlugin()
)

environment.plugins.prepend(
  'Define',
  new DefinePlugin({
    // __VUE_OPTIONS_API__: false,
    __VUE_OPTIONS_API__: true,
    __VUE_PROD_DEVTOOLS__: false
  })
)

environment.loaders.prepend('vue', {
  test: /\.vue$/,
  use: [{
      loader: 'vue-loader'
  }]
})

module.exports = environment
```
### extensions追加
```config/webpacker.yml
  extensions:
　　　　　　　　# 「 - .vue」を追記
    - .vue
    - .mjs
    - .js
    - .sass
　　　　　　　　# ・・・
```
### コントローラ作成
```
rails g controller コントローラ名 index
```
### ビューの編集(Vueから表示させるブロックを作成しておく)
```app/views/コントローラ名/index.html.erb
<h1>HelloVue#index</h1>
<p>Find me in app/views/コントローラ名/index.html.erb</p>
<%# 以下を追記 %>
<%= javascript_pack_tag 'hello_vue.js' %>
<div id='vue-app'></div>
```
### Vueファイル作成
```app/javascript/app.vue
<template>
  <p>
    {{ message }}
  </p>
</template>

<script>
export default {
  data() {
    return {
      message: "Hello Vue3!"
    }
  }
}
</script>

<style scoped>
p {
  font-size: 2em;
  text-align: left;
}
</style>
```
### jsファイル作成
```app/javascript/packs/hello_vue.js
import { createApp } from "vue";
import App from "../app.vue";

document.addEventListener("DOMContentLoaded", () => {
    const app = createApp(App);
    app.mount("#vue-app");
});
```
rails s　でサーバー立ち上げ後、http://localhost:3000/コントローラ名/index
にアクセスし、「Hello Vue3!」と表示されれば成功。
コストパフォーマンスを3倍まで改善するDatabricksのAWS Graviton2サポートの発表

[Announcing Databricks Support for Aws Graviton2 With up to 3x Better Price\-Performance \- The Databricks Blog](https://databricks.com/blog/2022/04/18/announcing-databricks-support-for-aws-graviton2-with-up-to-3x-better-price-performance.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

本日、AWSのGraviton2ベースのElastic Compute Cloud (Amazon EC2)インスタンスをDatabricksでのサポート(パブリックプレビュー)を発表できることを嬉しく思います。GravitonプロセッサーはAmazon EC2におけるクラウドワークロードのベストなコストパフォーマンスを提供するためにAWSによってカスタムの設計、最適化がなされています。Photonと組み合わせることで、高性能のDatabricksクエリーエンジン、Graviton2ベースのEC2インスタンスは、お使いのデータレイクハウスワークロードにおいて、同等のAmazon EC2インスタンスと比べて**3倍から4倍の優れたコストパフォーマンス**を提供することができます。この記事では、PhotonとGraviton2のコストパフォーマンスを説明し、お使いのAWSインフラコストをさらに削減するための追加のティップスを提供します。

# PhotonとGraviton2によるコストパフォーマンス

Photon + Graviton2のコストパフォーマンスを計測するために、我々はGraviton2ベースのR6gd EC2インスタンスと、同等のI3 EC3インスタンスに対して2つの異なるワークロード([TPC\-DS](http://www.tpc.org/tpcds/)とバルクインサートとマージコマンドを行う標準的なETLワークロード)を実行するシンプルなテストを行いました。我々はPhotonがEC2インスタンスのコストパフォーマンスを劇的に改善することを発見しました。しかし、Graviton2ベースのインスタンス上のPhotonはさらに改善し、I3インスタンスで実行するDatabricksランタイムと比較して、**ETLワークロードでは3.3倍のコストパフォーマンス、TPC-DSワークロードでは3.7倍のコストパフォーマンス**を達成しました。Graviton2ベースのインスタンスを試したお客様は同様の結果を報告し、興奮を共有してくれました！こちらに、ArmベースのGravitonインスタンスの全てを知ることになったDatabricksのお客様のコメントを引用します。

「半導体設計において、クラウドコンピューティングは重大なイノベーションを生み出しており、我々の設計のワークロードをArmベースのAWS Graviton2ベースのインスタンスに移行することで、劇的なコストパフォーマンスのメリットを得ることができ、我々はArm Neoverse N1プラットフォームを有効にすることで直悦子のメリットを知ることができました。」ArmのVP of productivity engineeringであるMark Galbraithはこうも述べました。「これは特にGraviton2上のDatabricksでは顕著であり、さらにユーザーエクスペリエンスを強化し、コストを削減するために、我々のDatabricksにおけるプロダクション利用をGraviton2に移行することを楽しみにしています。」
![](https://databricks.com/wp-content/uploads/2022/03/db-131-blog-img-1.png)
*GravitonとPhotonによるコストパフォーマンスの比較*

# Amazon EC2スポットインスタンスとAmazon EBS gp3ボリュームサポートによる更なるコスト削減

Graviton2とPhotonに加えて、以下のようにAWSでのDatabricksワークロードのコストパフォーマンスを改善する方法が存在します。

- **Amazon EC2スポットインスタンス** - スポットインスタンスを用いることで、スペアのEC2のキャパシティを活用でき、オンデマンドの価格と比べて最大90%のディスカウントを利用することができます。ご自身のワークロードの特性に応じて、DatabrickクラスターのオンデマンドやリザーブドEC2インスタンスをスポットインスタンスで置き換え、コストを削減することができます。
- **Amazon EBS gp3ボリューム** - ストレージは、お使いのクラウドインフラストラクチャコストの大きな部分となりえます。Amazon Elastic Block Store (Amazon EBS)のgp3 SSDボリュームを用いることで、ストレージ容量とは独立したパフォーマンスをプロビジョンすることができ、既存のgp2ボリュームと比較して、GBあたり最大20%コストパフォーマンスを改善することができます。

コストパフォーマンスの最適化の詳細に関しては、[Databricksにおけるキャパシティプランニング及びコストのコントロール](https://qiita.com/taka_yayoi/items/2f42d1d2ba4b77836602)をご覧ください。

# Graviton2と使い始める

AWS Graviton2ベースインスタンスサポートのパブリックプレビューは、現在ロールアウト中であり、向こう数週間で全てのサポートリージョンで利用できるようになります。Graviton2とPhotonを利用開始する際のガイド、移行ガイドについては[Gravitonのドキュメント](https://qiita.com/taka_yayoi/items/217fcdc30e2020d9994b)をご覧ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
100日後くらいに個人開発するぞ！day001

# まずはこれをやってみる！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/280cff78-08ee-40f8-c0c2-f8e062e7eca1.png)

https://prog-8.com/paths/rails


# 今日はHTMLに触れてみた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/e1c53435-3698-911c-7fd2-3f8eff89c0d6.png)



```

* 開始タグと終了タグ
    * <x>開始タグ
    * </x>終了タグ
* 見出しをつける
    * <h>見出し</h>
        * hはheadingの頭文字
        * <h1>,<h2>,<h3>,,,<h6>,,,と数字が大きくなるについれて見出しは小さくなる
* 段落をつける
    * <h2>タイトル</h2>
        * <h2>要素で囲むと改行される
    * <p>テキスト</p>
        * pはparagraphの頭文字
* コメント
    * <!--コメント-->
        * <!--コメント-->で囲むとブラウザに表示されない
* リンクをつける
    * <a ref="URL">アンカーテキスト</a>
* 画像をつける
    * <img src="画像URL">
        * テキストを囲むことがないので終了タグが不要
* リストをつける
    * 親要素：囲む方の要素
        * <ul>子要素</ul>：黒点が先頭につく
        * <ol>子要素</ol>：数字が連番でつく
    * 子要素：囲まれる要素
        * <li>テキスト</li>
    * 入れ子構造がある場合はインデント（字下げ）をすることで親子関係が分かりやすくなる

```
Laravelでstorage配下の画像削除

# [<font color="#333">環境</font>](#-環境)
* Laravel5.8
* PHP7.4
# [<font color="#333">何をするか？</font>](#-何をするか？)

LaravelによるWEBサービスで画像登録などを行うことも多いと思います。
* ユーザーのプロフィール画像
* 投稿コンテンツのサムネイル画像
* 商品画像etc...

そしてそれらはWEBサービス上で削除される可能性もあります。
ユーザーが退会したり、商品画像の変更や削除ですね。
その際にプロジェクト内の実際の画像も削除しないとプロジェクト内がユーザーやコンテンツが増えるたびに肥大化します。

それを防ぐために実際の画像も削除していきましょう。

コントローラー内はシンプルにアイテムを一つ取得してそれの画像を消す処理です。
```
php artisan storage:link
```
既に上記コードででシンボリックを貼ってる前提です。

```Controller.php
  namespace App\Http\Controllers;
  use App\Item;
  use Illuminate\Support\Facades\Storage;

    public function item_delete($id)
    {

        $item = Item::find($id);
        Storage::disk('public')->delete('images/' . $item->image);
                

        return view('project.mypage');

    }
```

# [<font color="#333">Storageクラス</font>](#-Storageクラス)
こちらでStorageクラスを使用します。

```Controllere.php
use Illuminate\Support\Facades\Storage;
```


下記で/storage/app/public/にアクセスできます。
```Controllere.php
 Storage::disk('public');
```

削除する場合はdeleteを付けて引数にさらにパスを指定。
下記は/storage/app/public/images/画像ファイル名　を削除しています。
```Controllere.php
Storage::disk('public')->delete('images/'.$item->image)
```

以上です。
その他にもput、get、putfileなど色々とあります。

# [<font color="#333">参考</font>](#-参考)
https://qiita.com/suzu12/items/9f43f9bddc735dbbfa07
PyTorch で Softmax するとき計算する方向に関する注意点

# 機械学習フレームワーク PyTorch を使ってモデルを作成する際、softmax レイヤーを使う場合は注意が必要

softmax を計算する次元(軸)は

PyTorch で input データを作成するときは、以下のように配列の次元が増えていく

例えば、raw input のデータ１つが１次元データだった場合(時系列データなど)
1. raw inputが１次元のデータの場合 [[data1], [data2], [data3]]
   (0次元, 1次元) -> (データすべてでsoftmaxする方向, データの中身でsoftmaxする方向)
1. ミニバッチ学習させる場合 [[[data1], [data2], [data3]], [[data4], [data5], [data6]], ...]
1. (0次元, 1次元) -> (1つのバッチ内のすべてのデータでsoftmaxする方向, データの中身でsoftmaxする方向)
1. Convolution layer の input channel だけチャンネル数がある場合
   (0次元, 1次元, 2次元) -> (1つのバッチ内のすべてのデータでsoftmaxする方向, 各チャンネルごとにsoftmaxする方向(channel num: 1 バッチ内のすべてのデータでsoftmaxする方向と同じ), データの中身でsoftmaxする方向)

```python: torch_tensor_test.py
test_tensor = torch.tensor([[[1.0,0,0, -1]],
                            [[1,0,0, -1]],
                            [[-1,-1,-1, -1]],
                            [[1,0,0, -1]],
                            [[2,0,0, -1]],
                            ])

#test_tensor shape: 5, 1, 4
m = nn.LogSoftmax(dim=-1)
output1 = m(test_tensor)
print(output1)
print(output1.shape)
'''
output1:
tensor([[[-0.6265, -1.6265, -1.6265, -2.6265]],

        [[-0.6265, -1.6265, -1.6265, -2.6265]],

        [[-1.3863, -1.3863, -1.3863, -1.3863]],

        [[-0.6265, -1.6265, -1.6265, -2.6265]],

        [[-0.2780, -2.2780, -2.2780, -3.2780]]])
torch.Size([5, 1, 4])
'''
m = nn.LogSoftmax(dim=2)
output2 = m(test_tensor)
print(output2)
print(output2.shape)
'''
output1:
tensor([[[-0.6265, -1.6265, -1.6265, -2.6265]],

        [[-0.6265, -1.6265, -1.6265, -2.6265]],

        [[-1.3863, -1.3863, -1.3863, -1.3863]],

        [[-0.6265, -1.6265, -1.6265, -2.6265]],

        [[-0.2780, -2.2780, -2.2780, -3.2780]]])
torch.Size([5, 1, 4])
'''

# if you want to apply softmax calculation on each input data, then dim = -1 or 2 would be good choice!
```
2022/4/19主にITとかセキュリティの記事

「Cisco WLCソフトウェア」に深刻な脆弱性 - 管理者としてログインされるおそれ
https://www.security-next.com/135863

国内上場企業が優先対処したいリスク、上位に「サイバー攻撃」
https://www.security-next.com/135725

スマホゲーム「イケメン戦国」で障害 - 不正アクセス原因か
https://www.security-next.com/135861

クラウドサーバで個人情報流出の可能性 - 京都駅ビル
https://www.security-next.com/135852

教育機関向け通販サイトに不具合 - 入金確認SMSを誤送信
https://www.security-next.com/135859

「ZOZOTOWN」装いクレカ情報だまし取るフィッシング
https://www.security-next.com/135881

＜独自＞露侵攻前にサイバー攻撃頻発 政府機関標的(4/18)
https://gunosy.com/articles/aTz7a

サイバー保険、揺らぐ「戦時は補償外」　証明難しく(4/16)
https://www.nikkei.com/article/DGXZQOUB143350U2A410C2000000/

「高可用性IaaS」が本当に必要かどうかを考える5つのヒント(4/15)
https://techtarget.itmedia.co.jp/tt/spv/2204/15/news02.html

Microsoft Defender、オフライン時に検知率が大幅に低下(4/17)
https://www.zaikei.co.jp/article/20220417/668833.html

金融庁がIBMに報告命令　3月の銀行システム障害で(4/15)
https://news.yahoo.co.jp/articles/1b2cf92d9ffd0ccd9a842eb25d42fbd04daed5fe

Ciscoのワイヤレスコントローラーに脆弱性(4/17)
https://www.zaikei.co.jp/article/20220417/668852.html

Windows 11の普及を阻む要因 - 阿久津良和のWindows Weekly Report(4/17)
https://news.infoseek.co.jp/article/mynavi_2401663/?tpgnr=it

中国の人民日報、絵画NFTをローンチか(4/17)
https://thebridge.jp/2022/04/chinese-communist-party-paper-to-develop-nfts-pickupnews

ビデオ会議アプリ、マイクをミュートしても音声キャプチャ可能な状態維持(4/17)
https://www.zaikei.co.jp/article/20220417/668851.html

「携帯ハッキングされ情報流出、被害弁済を」と架空請求7500万円　宮崎(4/16)
https://www.nikkansports.com/m/general/news/202204160001077_m.html?mode=all

【レポーティング】サイバーセキュリティのモニタリングとKPI設定 〜14の指標紹介〜 2022/04/17体系的に学ぶ
https://sustainablejapan.jp/2022/04/17/cyber-security-kpi/72240

あらゆるデータや資産にプライバシーを付加　NYMトークンとは元CIA職員エドワード・スノーデン氏がローンチイベントに登場(4/16)
https://coinpost.jp/?p=341066

WindowsのACL（Access Control List）を解説する【準備編】(4/17)
https://ascii.jp/elem/000/004/089/4089448/?rss

ロシアによる「戦争犯罪」の証拠を確保せよ：SNSの投稿を記録するウクライナの闘い(4/17)
https://wired.jp/article/open-source-russia-war-crimes-ukraine/
線形モデル(回帰)

# 線形モデルとは
入力特徴量の***線形関数**を用いて予測を行うものである。つまりすべてのデータを直線で表せるという強い仮定をおいていることになる。
*例えば、回帰問題では線形関数は次の予測式で表せる。
^y = w[0]*X[0] + w[1]*X[1] + ... + w[p]*X[p] + b
ここではXはデータの特徴量であり、ｗは各特徴量の重みであり、ｂはパラメータであり、^yはモデルからの予測値である。

## 種類
機械学習のアルゴリズムの内、教師あり学習に分類される。おもに、回帰や分類などに使われる。回帰では一般的な手法は最小二乗法である。それを正則化したものがRidge回帰とLassoである。また分類では、ロジスティック回帰や線形サポートベクターマシン（linear support vector machine）が主に使われる。

### 線形回帰（最小二乗法）
線形回帰（最小二乗法）とは、真の値（正解ラベル）と予測値（モデルによる出力）の平均二乗誤差が最小となるようにパラメータ（線形関数のｗとｂ）を決定するアルゴリズムである。平均二乗誤差とは真の値と予測値の差の二乗の平均である。また、以下のような特徴がある。
* 特徴量が多いほど過剰適合の可能性が高くなる
* データが多いほどRidge回帰やLassoと同等の精度になる

これらの特徴を例を示して説明する。
* 特徴量が多いほど過剰適合の可能性が高くなる
```python
X, y = mglearn.datasets.load_extended_boston()
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)
lr = LinearRegression().fit(X_train,y_train)
```
これは104の特徴量をもつ506個のサンプルデータである。これを最小二乗法で学習させると次のような制度となった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627192/1335e2ac-6b95-d13c-94dc-49d655f96849.png)
訓練データの精度は約95%であり、テストデータの精度は約61%になった。これは過剰学習が起きているといえる。

* データが多いほどRidge回帰やLassoと同等の精度になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627192/1bece2ee-f2f9-1592-8d73-e5c37cdc2a5d.png)
点線は訓練データ、線はテストデータのそれぞれの精度の推移を表している。
また青線はRidge回帰を用いた場合であり、オレンジ線は線形回帰を用いた場合である。データ数が400あたりから精度が近くなっていることが分かる。

### 正則化
Ridge回帰とLassoの説明の前に正則化について説明する。正則化とは目的関数（誤差関数）にペナルティ項を与えた関数を最小化する方法である。これにより過剰適合を防ぐことが出来る。
* S=E+α(Lpノルム)　　αは正則化パラメータ、α>0
    * S:正則化した誤差関数
    * E:もとの誤差関数（最小二乗法の式）
    * Lpノルム　　L1ノルム→Lasso  L2ノルム→Ridge


### Ridge回帰
線形モデルによる回帰の一つである。線形回帰をL2ノルムにより正則化したものである。
* S=E+α(L2ノルム)　　αは正則化パラメータ、α>0
    * S:正則化した誤差関数
    * E:もとの誤差関数（最小二乗法の式）
    * L2ノルム

* αとの関係性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627192/c15282ea-2a10-e172-04a9-fe5de2f1024f.png)

 以上の結果によりαの値が小さくなると精度が良くなった。αによって精度が大きく左右されることが分かる。正則化の式からαが大きいとよりWは0に近づき、小さいとLinear_Regressionに近づく。つまり、αが大きいと重みへの制約が大きくなり、小さいと制約が小さくなる。

* 特徴
    * 少ないデータ数でもそれなりに高い精度が出せる。
    * αパラメータを用いてモデルを調節することが出来る。
    * データ数が多くなると線形回帰と変わらない凡化性能である。
 
### Lasso
線形モデルによる回帰の一つである。線形回帰をL1ノルムにより正則化したものである。

* 特徴
   * 重みｗが０になることがあるので無視できる特徴量がでてくる。モデルを明確化したいときに便利である。
kali linux に docker をインストールしたら tty1 エラーになった

**もう直らないと思い詳細なエラーログをメモしていません．参考にならなかったらごめんなさい．**
色々あって kali linux で docker を使いたくなった．
```bash
sudo apt install docker
```
インストール中に画面がフリーズ．
再起動後に GUI が使えなくなり tty1 のコンソールが表示される．（画像はイメージ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355011/5990624d-e99c-f61a-e5db-2391f81b986d.png)
コンソール自体は問題なく使えるので，ユーザ名とパスワードでログインする．
もし使っている言語が日本語で文字化けしている場合はエミュレータを起動する．
```bash
fbterm
```
修正方法の [記事](https://techdhee.in/kali-linux-tty1-error/) を読むと，`/etc/apt/sources.list` を変更し，`apt update` からの `apt install kali-desktop-gnome` で直るらしい．
しかし自分の場合は直前に入れた docker が邪魔をして `apt update` ができなかった．
まず docker を削除する．
```bash
sudo apt purge docker
```
不要になった依存パッケージも消しておく．
```bash
sudo apt autoremove
```
なぜか残っている docker の list ファイルを削除．
```bash
sudo rm /etc/apt/sources.list.d/docker.list
```
これで `apt update` ができるようになるはず．
```bash
sudo apt update
```
次に私は gnome を使っているのでインストールする．
xfce や kde を使っている人は gnome の箇所を置き換えてください．
```bash
sudo apt install -y kali-desktop-gnome
```
ここで確か `lib-(なんだったか忘れた)` の依存関係でエラーが出る．
仕方ないので `apt dist-upgrade` する．（やりたくはないが，半分諦めのアップグレード．）
```bash
sudo apt dist-upgrade
```
途中で何回か対話画面が出るので＜了解＞を押して進める．
アップグレードが完了したら再起動．
```bash
reboot
```
もう一度 tty1 にログインして gnome をインストール．
```bash
sudo apt install -y kali-desktop-gnome
```
これで直った．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355011/f8c7241f-f30b-dc38-f174-df9382edc59b.png)
どれだけググってもGoogle Driveのデスクトップアプリが起動しない時はこれが欠けているかも

# どんなエラーが起きている人向けか
どれだけググってもこの問題の解決方法は大体これらの中のどれかに当てはまり、このどれもが解決しなかったという人はいらっしゃいますでしょうか。
* 再起動
* アンインストール＆インストール
* 共有とアクセス権設定
* アプリケーションの実行許可

僕もどれだけこれらを繰り返しても、Google Driveのデスクトップアプリが起動しなかったのですが、
ググりまくって解決法を調べたところ、こちらの記事に辿り着きました。
https://discussions.apple.com/thread/253393011

> I figured it out, it indeed is some kind of permission error where your user account doesn't allow Google Drive to create the folder `DriveFS` in your user application support directory `/Users/yourusername/Library/Application Support/Google/DriveFS`. For me manually creating the folder and then rerunning the application worked. Got this info from here: https://support.google.com/drive/thread/129426644/google-drive-for-desktop-won-t-launch-macos-bigsur?hl=en

すなわち __「Application SupportのGoogleさんのフォルダにDriveFSってのを手動で作らなきゃないっぽいよ」__ とのことでした。

# 【解決策】`DriveFS`というフォルダを作るだけ
finderからでもターミナルからでもどちらでもいいので、`/Users/yourusername/Library/Application Support/Google`に行きます。
僕の場合、このフォルダに`DriveFS`というフォルダが無く、`Chrome`、 `Chrome Canary`、`RLZ`の３つのフォルダしかありませんでした。

そこで`DriveFS`という名前で新規フォルダ作成すると...
あら不思議、自動的に`DriveFS`内に必要なファイル・フォルダたちが生成され、Google Driveは起動可能になっていました。
![スクリーンショット 2022-04-19 1.37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615122/abde493f-eb76-6258-ccb1-5be58c8ac97a.jpeg)


# 何故なのか
わかりません!
わかる人はコメントください！
システム再構築パターンのポイント

システム再構築案件にて、再構築方式について調べたので、
各方式におけるポイントを書きます。
私は、実際にリライト案件を担当したことがあり、
その際に現行踏襲と安易な作業見積をされており非常に苦しみました。
そこでの経験も踏まえて、システム再構築の際の役に立てばと思います。

---

# システム再構築パターン
## ハードウェア更新
ハードウェアやミドルウェアのバージョンアップのみで、アプリケーションの変更は無し。
※バージョンアップに伴いブログラムが必要な場合もあり
## リホスト
ハードウェアやミドルウェアの移行のみで、アプリケーションの変更は無し。
※ハードウェアの移行に伴いブログラムが必要な場合もあり
## リライト
現行システムの言語を新しい言語に書き直すこと。
## リビルド
現行の要件定義から作り直しをする。
もしくは、現行業務の最適化を図り、再度要件定義を図る。

---

# システム再構築コスト
ハードウェア更新が最も低コストで、リビルドが最も高コストです。

ハードウェア更新　＜　リホスト　＜　リライト　＜　リビルド

---

# パターン別ポイント
## ハードウェア更新
更新に伴う影響箇所が問題なく機能するか確認する。

## リホスト
### 設計
アーキテクチャの変更を互換するような設計をすること。
例えば、ミドルウェアの変更に伴う、インターフェースの変更など。

### テスト手法
* 非互換テスト
アーキテクチャの変更に伴う、非互換部分が期待通りの結果になるか確認する。
* 現新比較テスト
スポット的に現行システムと新システムに同じインプットデータを与えて、アウトプットデータを比較する。
* 業務運用フローテスト
業務運用に沿ったフローが問題なく動作することを確認する。
※私の経験では、全体を細かくというよりも浅く広く確認するようなイメージでした。

## リライト
### 設計
アーキテクチャの変更や言語変更など互換するような設計をすること。
例えば、言語、FW特有の処理を新言語、新FWではどのような考え方で置き換えるか。

### テスト手法
* 非互換テスト
アーキテクチャの変更や言語変更など非互換部分が期待通りの結果になるか確認する。
例えば、言語特有の処理のマイグレーションなど。
* 現新比較テスト
現行システムと新システムに同じインプットデータを与えて、アウトプットデータを比較する。
リライトにおいては、設計書ベースにマイグレーションしていきますが、
ドキュメントが最新化されていないことがよくあるため、品質確認としては本テストが最も重要だと思います。
また、費用対効果としても非常に高いと思います。
* 業務運用フローテスト
業務運用に沿ったフローが問題なく動作することを確認する。

## リビルド
通常の新規開発同様の考え方で進めていく。

# リリースにおけるリスク対策
* 並行稼働
一定期間の間、現行システムと新システムの両方で同一オペレーションで業務を行い、問題なく運用可能か確認する。
※利用者側の負担増になるため、並行稼働するケースは少ないと思います。
* 段階リリース
複数拠点で稼働する場合は、ある拠点のみで稼働させて問題ないことが確認する。
※連携システムの兼ね合いなどから、段階リリースができない場合もあると思います

# 最後に
システム再構築において、現行踏襲と簡単言葉で表現せずに、アーキテクチャや言語の変更に伴う影響などがないか考えた見積をしていただけると良いと思います。
安易な見積で、作業を初めて想定外のコストがかかることは一番避けたい部分です。
特にリライトは、上層部から同じ仕様で作ればいいだけでしょと、簡単に思われがちですので、
そこを説得するための少しでも参考になればと思います。

# 参考
https://www.ipa.go.jp/sec/reports/20180226.html
https://www.ipa.go.jp/files/000057294.pdf
【C#】クリーンアーキテクチャのためにプロジェクトも単一責務に分割しよう

# はじめに

ここ半年に関わったプロジェクトにおいて、プロジェクトを分けたときに意外なメリットが飛び出したので事例紹介。

プロジェクトの分割はクソコードを遠ざけるために有効、という話。

# 僕が遭遇した状況

次のコードは実際に私が遭遇した(クソ)コードの一部再現である。
実際にはもっと沢山のクラスがProgramクラス内で宣言されていた。

```cs

public class Program{

  public static Program theProgram;

  public Logger Logger = new Logger();
  public Common Common = new Common();

  public static void Main(){
    theProgram = new Program();
    theProgram.Logger.Write("Something");
  }
}

public class Logger{
  public void Write(string line){
    // 実際のコードはさまざまなクラスがProgram.theProgramを経由して
    // 他クラスへアクセスしていた。
    using(var writer = new StreamWriter(Program.theProgram.Common.FileName)){
      writer.WriteLine(line);
    }
  }
}

public class Common{
  public string FileName;

  public Common(){
    // 何らかのファイルから設定を読み出す関数
    FileName = ReadFromFile();
  }
}

```

## 問題点

事実上のグローバル変数と化したtheProgramを媒体に、全クラスが全クラスに密結合をおこしてしまっている。
このコードが(なぜか)コードレビューをすり抜けて運用され、機能追加を重ねることにより大量の循環参照が発生し、手を出せないクラスとなっていた。

# 問題の予防

結局プロジェクトはあまりの負債の大きさのためビッグリライトが発生して、MVVMで開発する事になったが、
その時に過去のプロジェクトのコードの断片を再利用しているときに思いがけないことが起こった。

![project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395414/d25be5b9-9964-0621-643c-13bdc9b68248.png)

プロジェクト間の循環参照はシステムで禁止されていたのだ。

## 循環参照が禁止されることの利点

MVVMのアーキテクチャで各層ごとにプロジェクトを分けた時、次のような依存関係を強要することができる。

```mermaid
graph TD;
    View-->ViewModel;
    View-->Model;
    ViewModel-->Model;
```

つまりシステムによって怪しい設計を防げるため、コーディングの際に考えることが減るのだ。

みんなもプロジェクトを[単一責務に保ち、貧乏を爆殺](https://qiita.com/MinoDriven/items/76307b1b066467cbfd6a)しよう。
【可視化】初心者向け！「解釈する可視化」と「伝える可視化」

# はじめに
大学で2年間、社会人として1年間、「データ」という世界で生きてみて、気づいた事を呟く記事です。今回は1年間やってみて「可視化」の重要さを思い知ったので、可視化について語りたいと思います。前半では、可視化の手法に触れ、後半では、「解釈する可視化」と「伝える可視化」の違いについて触れたいと思います。

# 可視化とは
まず、なぜ可視化をするかから説明したいと思います。人間の脳は一度に多くの情報を処理する事ができません。なので、図やグラフにして視覚的にデータの全貌を把握する方法を思いついたのだと思います。
例えば、ある駄菓子屋さんAの１月の売り上げを表す、数字の羅列をみてもいまいちピンときません。

<img width="200" alt="Screen Shot 2022-04-18 at 22.01.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/1fc110d5-dde8-8f77-a57a-8daca8d4550c.png">


可視化すると、ひと目でデータの概要が掴めます。

<img width="700" alt="Screen Shot 2022-04-18 at 22.03.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/7f4aeba1-bf99-d3bd-1c93-08fdf409142f.png">


**データの可視化は、データを集めたら、まず始めに行うべき事です。**

# 可視化の種類
可視化には様々な手法があり、それぞれ特徴があります。ここではいくつか紹介しましょう！

### ヒストグラム　
連続する数値（数）データの分布を知るために使われます。以下のデータは、過去作に登場したポケモン800種のHP(体力)をヒストグラムにした物です。これを見ると、50~80ポイントが全体の大半を占めています。（250ポイントもあるポケモンがいることもわかります！）

<img width="700" alt="histgram" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/9653adef-6ea7-4a7b-06a1-8ea5c154cd1b.png">

### 箱ひげプロット
ヒストグラムと似たもので、箱ひげプロットというものもあります。影がついている箱の中に全体の50%のデータが、横から伸びている髭の中に上下約25%づつのデータが入っています。漏れてしまっている点は「外れ値」と呼ばれます。IQRというデータの散らばりを示す値により、弾かれる仕組みになっています。
<img width="700" alt="Boxplot" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/3f9ae818-e0af-432c-d0ef-9459d231c808.png">


### 棒グラフ
棒グラフはカテゴリーデータの分析によく使われます。以下の棒グラフはタイプの頻度のグラフです。「水」と「ノーマル」タイプのポケモンが多いのですね！また、全体を100%として、円グラフでみてみるのもいいかもしれません。

<img width="700" alt="Bar plot" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/128a1bdd-f252-d72e-651f-10083f60b3bd.png">



# 「色」について
可視化において、配色はとても重要です、無意味な配色は逆効果になってしまう事があります。
例えば以下の円グラフはポケモンの能力の総数を百の位で区切ったときの割合を表しています。この場合、色付けしてるクラスが連続の数字（強さの総数）であるにも関わらす、カラフルないろが付けられています。

<img width="500" alt="Pie-1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/ec7bf2ac-f731-222f-12cf-21f1c78c13a3.png">


色付けしてるクラスが連続（数字）の場合は、グラデーションを使うことで、より直感的に理解できる色彩になります。

<img width="500" alt="Pie-2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/e6cd20ac-d3f3-d807-b691-8e04a30bd005.png">





# 可視化は分析結果ではない
この記事で一番伝えたい事なのですが、データを可視化しただけの物をアウトプットとしている方を目にします。自分がデータを解釈するために使った可視化をそのままアウトプットにすることは好ましくない事が多いです。データ解釈の為の可視化は自分が分析で使うもので、分析結果を報告する際には使わない事が多いです。データ分析では、以下の流れで、計2回の可視化を行います。

**データを可視化 → 考察・検証 → メッセージ → メッセージを可視化**

### １グラフ１メッセージ
可視化で得た情報をもとに自分なりにデータを解釈し、伝えたいメッセージを分かりやすい様にグラフに可視化します。
例えば、上記の売り上げの例を挙げると、「土日祝日の売り上げが上がっている」事が分かります。しかし、このままアウトプットしても、聞き手には伝わりません。配色を変え、土日祝日のデータを目立たせる事で、伝わるアウトプットをする事ができます。この時、伝えたいメッセージが1つ以上あったとしても、1つのグラフに1つのメッセージを載せる事をオススメします。

##### 分析用データ（データを可視化）
<img width="700" alt="data-1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/270d8fc7-681d-a11f-67c4-cff77e440913.png">

#### 見せたいデータ（メッセージを可視化）
「土日祝日が伸びている！」
<img width="700" alt="data-2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/a6df8bb1-d9d0-f1cc-44de-1b15c6ac19e5.png">

# おわりに
今回は「可視化」についてまとめてみました。「解釈する可視化」と「伝える可視化」では、データの表情が少し違う事が伝われば幸いです。

データセットはこちら。

https://gist.github.com/armgilles/194bcff35001e7eb53a2a8b441e8b2c6
[unity]ほぼすべてのグラフィックがピンクになってしまった時の解決例

## 何があった？
asset store で `Viking Village URP` というassetをダウンロードして、何も考えずassetからの設定変更にyesを押していたら、今まで使っていたグラフィックが下記のようにほぼ全てピンクになってしまいました。

![スクリーンショット 2022-04-18 22.48.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/a9a71ad8-8268-b7ac-b8f8-b955b6b1f35c.png)

原因を調べると Project Settings > Scriptable Render Pipelines Setting の設定が上書きされたせいと気づき、急いで None に戻したのですが元に戻らないという事象が起きました。

ダウンロード直後のProject Settings
![スクリーンショット 2022-04-18 23.00.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/61d773e5-9b23-ebe3-d61b-ba28fd3f3ac1.png)

元に戻したProject Settings
![スクリーンショット 2022-04-18 22.59.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/11cff15d-4547-0b57-7840-475555df9642.png)


## 原因
Scriptable Render Pipelines Setting を登録したことで、下記図のshaderの機能がお亡くなりになっていました。
（自分が使っていたアセットが`Universal Render Pipeline`の内容に対応していないものを指定していることとなりピンクになっていました。）

![スクリーンショット 2022-04-18 23.12.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/41d9f3a5-8eef-1836-a839-473ddee01836.png)



## 解決方法

Project Settings > Scriptable Render Pipelines Setting (URP) を削除しない状態で、全てのオブジェクトに対してshaderの部分を下記図のように`Universal Render Pipeline/Unlit`（スラッシュ以降はなんでも良い。初心者におすすめは設定なしのUnlitらしい）に変更することでもとの描画が戻ってきました。

![スクリーンショット 2022-04-19 0.00.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/a2c235d5-739d-c9f9-47b9-5d01ad637528.png)


直った様子
![スクリーンショット 2022-04-19 0.12.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/31bacd75-a5d3-ccde-ec1c-ccf8b5f7f848.png)



## 余談
床部分で使っているCubeだけそのままshaderを設定できなかったですが、default-materialを使っている場合（もともと柄を設定しなかった場合）はshaderが変更できない状態でピンクにされるので、Assets > Create > Material で模様を作って、オブジェクトにドラックアンドドロップして柄をつけてあげる必要がありました。
ここでもつまづきやすいかもと思ったのでお気をつけください。

また本筋とは離れますが、このエラーで約1年放置してしまうことになってしまったのですが、解決のきっかけが「どうせ直らないから色々ボタン押してみよ」という動機からの行動でした。
なので皆さんもどん詰まりしてしまった時は、（復活を期待するならプロジェクトを丸ごとコピーして壊していい環境を作ってから、）**知らないボタンをとにかく押してみると直すきっかけが見つかるかもしれない**ので、是非やってみてください。
衝撃の事実！！ATtinyではprintfが使えない？！

今日はとても恐ろしい話をしたいと思います。

ATtinyで開発を行っていたところ
```c
mySerial.printf(" Done. Gradient value = %.10fd\n", gradient);
```

という部分でエラーが発生した。。。

なんで(・・?

しかもエラー分が
```
'class SoftwareSerial' has no member named 'printf'; did you mean 'print'?
```
【翻訳】
え？おまえ「printf」ってなに？いや「print」の間違いだろ？！

いやちゃうわ！！
printfだぞ！
### printf!!

しかし何回やってもエラー分が
```
'class SoftwareSerial' has no member named 'printf'; did you mean 'print'?
```
【翻訳】
だからー！！「printf」ってなに？「print」の間違いだろ？！何回やってんの？まじで！！


え？嘘だろ？お前今まで何回もprintfやってたやん(；・∀・)
ちょっと調べてみるか。。。。




おい嘘だろ？！ATtinyでは「printf」使えないの？！
（すんません。もしかしたら自分のやり方が悪いだけかもしれません）


~~ということで海外のサイトからprintfのやり方を頂戴致しました。~~
~~以下の文を追加すると使用できるようです。~~
↑すみません嘘です。。
下のやつもエラーで使えませんでした。
```c
#include <SoftwareSerial.h>
#include <inttypes.h>

#define PD0  0
#define PD1  1

class mySerial : public SoftwareSerial {

  public:
    mySerial(uint8_t receivePin, uint8_t transmitPin,
      bool inverse_logic = false) :
      SoftwareSerial(receivePin, transmitPin,inverse_logic) {}

    virtual size_t write(uint8_t byte) {
      return SoftwareSerial::write(byte);
    }

    int printf(char* fmt, ...) {
      char buff[256];
      va_list args;
      va_start(args, fmt);
      int return_status = vsnprintf(buff, sizeof(buff), fmt, args);
      va_end(args);
      uint8_t *s = (uint8_t *)&buff;
      while (*s) write(*s++);
      return return_status;
    }
};

mySerial m(PD0,PD1);

void setup() {
  m.begin(9600);

  m.print("Hello from Arduino!\n");
  m.printf("%s 0x%x %d %4o\n", "Hello", 0x80, 333, 128);
  m.printf("%16s x\n", "Hello");
  m.printf("%08x %e\n", 0x1234, 1e-10);

  m.printf("Floats:\n");
  m.printf("%.3lf %e\n", 3.14159f, 3.14159f);

}
```

上のやつは私の環境では使えませんでした。
どうも浮動小数点などを使いたい場合は以下のやり方でいいみたいです。

```C
void setup() {
  Double abc = 1.23456789;
  Serial.begin(9600);
  Serial.print(abc,5);//1.23456が表示される
}

```
【メモ】RaspberryPiにDockerをインストールして外部からアクセス可能にする

# 概要
ラズパイにDocker環境を構築して作業マシンからアクセス出来るようになるまでの手順をメモします。
何度かやっているのに毎回忘れて調べなおすので、将来の自分のためのメモです。

セキュリティ的によくないので完全に自己責任になります。

# 環境
RaspberryPiOS（64bit）
2022年4月時点

# Dockerのインストール
[公式ドキュメント](https://docs.docker.com/engine/install/debian/) の通り

# UFWインストール
ポートが解放できれば何でもよいです。
```bash
sudo apt install ufw
```

# systemd 用のファイルを修正
設定内容は[こちら](http://docs.docker.jp/v19.03/engine/reference/commandline/dockerd.html)のドキュメントを参照

```bash
sudo vi /lib/systemd/system/docker.service
```

この修正をすることで12375ポートでdockerdにアクセスできるようになります。
docker-ceパッケージにてそれっぽい設定ファイルとかも準備されるのですが、結局デーモンの起動はここでべた書きなのでこれしか方法がない気がします。
他にいい方法があればぜひ共有いただきたいです。
```diff_system_d:変更点
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
- ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
+ ExecStart=/usr/bin/dockerd -H 0.0.0.0:12375 -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
```

```bash:デーモンの再起動
sudo systemctl daemon-reload 
sudo systemctl restart docker.service 
```

# ポートの開放
```bash
sudo ufw allow 12375
```

# IntelliJからこんな感じでアクセスできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114225/590f8b8d-3477-0dee-da7a-fe2d625b3df3.png)
（ホスト名は環境に合わせて設定してください）

# さいごに
最近DockerDesktopが有料化されたりしているので、この方法をあとちょっとだけ工夫すれば開発環境のコスト削減につながるかも？
マザーボード内蔵のWi-FiをUbuntuで使う方法

# 問題
[MSI MAG H670 TOMAHAWK WIFI DDR4](https://jp.msi.com/Motherboard/mag-h670-tomahawk-wifi-ddr4) のマザーボードでPCを自作して、Ubuntu 20.04.4をインストールしました。
このマザーボードはWi-Fi内蔵なのですが、マザーボード内蔵のWi-Fiを認識してくれませんでした。この問題を解決します。
なお、USBのWi-Fi子機をつなけば、Wi-Fiを使うことができます。

# 原因
`dmesg`を調べると、下記URLで紹介されているように、iwlwifi-so-a0-hr-b0-39.ucode 〜 iwlwifi-so-a0-hr-b0-63.ucode が見つからないというエラーが出ました。
このマザーボードのWi-Fiを使うためには iwlwifi-so-a0-hr-b0-64.ucode が必要なようですが、Ubuntu 20.04.4には入っていないようです。

https://askubuntu.com/questions/1377110/intel-ax201-wi-fi-6-and-ethernet-wont-work-ubuntu-20-04-and-21-10

# 解決方法
直近でUbuntu 22.04に乗り換える予定だったので、Ubuntu 22.04 betaをインストールすることにしました。
Ubuntu 22.04 betaでは、マザーボードのWi-Fiを認識し、使うことができています。
「ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked」の解消法

# 背景
- Ruby on Railsチュートリアルの第11章を学習中
- トピックブランチをマスターブランチへマージ後に「rails test」を実行したところ、以下のエラーが発生しテストが失敗。

```
ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked
```

# 解消法
- 「sample_app/config/database.yml」内の「pool」の値を「5→20」へ変更して解決。

```sample_app/config/database.yml
# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: sqlite3
  pool: 20
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://railsguides.jp/configuring.html#データベース接続をプールする
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  database: sample_app_production
  username: sample_app
  password: <%= ENV['SAMPLE_APP_DATABASE_PASSWORD'] %>

```
ただしなぜこれで直るのか、現時点では理解できていません。
真の理解は2周目以降に任せて、まずはチュートリアルの完走を目指しましょう！
[Zabbix]ログ監視の基礎メモ#1

# ●はじめに
ログ監視についてのナレッジを忘れないようメモします。
たまったら見やすくまとめて1つの記事にする予定です。

# ●参考
- Zabbix統合監視実践入門

# ●ナレッジ

## 1.ログ監視の概要/特徴
- ログ監視は、アイテムのタイプが「Zabbixエージェント（アクティブ）」の場合にのみ利用できる
- ログ監視は「テキストファイルに追記される形式のログファイル」「Windowsイベントログ」で利用可能
- テキストログの監視には、logまたはlogrtキーを使用する
- テキストログファイルに関しては、1行を1ヒストリデータと換算してZabbixサーバーに送る

## 2.テキストログ用のアイテムキー「log/logrt」
- logキー
監視対象のログファイルを固定で指定し、追記されたログを読み込む。ログファイルがローテーションされた場合、そのログファイルを先頭から読み直す。

- logrtキー
監視対象のログファイルを正規表現で指定。指定した正規表現に一致するファイルをリストし、その中の最新ファイルに追記されたログを読み込む。ログファイルがローテションされた場合、直前まで読んでいたログファイルを末尾まで読んでから最新のファイルを先頭から読む。


## 3.ローテーションの形式
- move形式のログローテーション
現在のログファイル名を変更し、最新のログファイルを新規作成する形式のローテーション。

- copyruncate形式のログローテーション
現在のログファイルをコピーし、最新のログファイルを0バイトに切り詰める形式のローテーション。

### 補足
- Zabbix4.0以降のエージェントはmove/copyruncateの両方に対応し、Zabbix3.4以前のエージェントはmove形式のみ対応
- 以下の場合は、ログの追記メッセージやローテーションを正しく検知できず、ファイルを読み直しが起こる可能性があるため注意
    - ログファイルの形式が追記型ではない場合
    - Zabbixエージェントのバージョンと比較して、対応していないローテーション方式のログファイルを監視した場合
【Unity】M1 Max (Apple Silicon) | Unity 2021.3.0f1 (LTS)検証

Unity2021.3.0f1のLTS版がやっとリリースされました！
改めて[前回](https://qiita.com/IShix/items/8c3393130c8228e35597)の記事でも行ったIntelとSiliconの比較テストを掲載します。

# Unity(Intel) vs Unity(Apple Silicon) 検証

**感想**
Silicon対応エディタは爆速！

**検証バージョン**
Unity 2021.3.0f1 (LTS)

**プロジェクト概要**
完成した2Dプロジェクト、画像多め、2Dだけどシェーダーも結構ある

**PCスペック**

| Model | CPU | RAM | GPU |
|:----:|:----:|:---------:|:------------:|
| MacBook Pro (15-inch,2017)  | 2.8 GHz クアッドコアIntel Core i7 | 16 GB | Radeon Pro 555 2 GB |
| MacBook Pro（16-inch,2021）  | Apple M1 Max 10コア | 64 GB | Apple M1 Max 32コア |

**テスト結果**

| Unity | Library構築 | iOS Switch Platform | iOS Build | Script Compile |
|:----:|:----:|:---------:|:------------:|:------------:|
| Intel  | 06:20 | 03:00 | 04:12 | 00:23 |
| Silicon  | 01:25 | 00:25 | 00:58 | 00:06 |

※Cache Serverが有効な状態でのテストです

# MacBook Pro（16-inch,2021）を4ヶ月使った感想
### 良い点
- いろんなアプリがSilicon対応になり、だいぶ快適になってきた
- アプリのインストールが早い。インストールしながら普段通りの作業ができ一切カクつかない。
- ビルド→Xcodeから端末にインストールの作業を、Inten版ならだいぶ熱くなってファンもうるさかったが、一切熱くならずファンも回らない(or 気づかない)。
- Xcodeでビルドしながら、Unityを操作してもサクサク。
- Rider(Silicon対応)が軽い。
- この性能で持ち運べるのはヤバい。

### 悪い点
- 高い
- 稀にUnityエディタが落ちたりフリーズしたりする。(安定するのはもう少し先になりそう)
- Silicon未対応のアプリは遅い。でもSourcetree程度であれば影響は無い。

# [8/26 追記] 現在もまだあるバグ
- エディタが1日1度は落ちる。
- エディタが1日3度はフリーズする。
- silicon対応のUnityエディタ2021系にアップデートしたいがiOS/Androidで安定していないから更新したくない

まだ問題はあるものの個人的には買って良かったと思ってます。
理由は、アプリの更新時「エディタのplatform切り替え」「iOSビルド」「Androidビルド(難読化あり、AppBundle)」「Xcodeのビルド」のいずれかの作業が被る時がありますが、カクつく事無く作業できます。
また、アプリ6個とか立て続けに更新しているとファンが回る時がありますがあまり熱くなりません。
intel機なら熱でパフォーマンスが落ちます。
S3のオブジェクトロックと既存オブジェクトの一斉適用について

# S3 Object Lock利用シーン
①一定期間または無期限でオブジェクトの削除や上書きを防止したい
②WORM( write-once-read-many) ストレージを必要とする規制要件を満たすために
※SEC 17a-4、CFTC、FINRAの規制

リンク：
https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html

※ 本文は長いので、時間がない方は最後のサマリーだけを見て頂ければと思います。

# 設定方法
まずは、Objectの属性を有効化にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/9d22284e-4b31-1f60-1361-60423e2974bb.png)


①保持期間の設定
 - バケットに設定したら、以降にアップロードされたObject全部自動的に適用される
 - オブジェクトごとに設定する。
  >  以下2モードのどちらかを設定する
         Governance mode　＜特殊権限で外せる＞
         Compliance mode　＜期限まで外せない＞

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/cead5acb-4844-6146-df8f-a4c4dc4fef84.png)


②リーガルホールドの有効化（オブジェクト単位のみ、明示的に削除可能）
 保存期間と同じ保護を提供しますが、有効期限はありません。その代わり、お客様が明示的に削除するまで、リーガルホールドは有効です。
 リーガルホールドは、保存期間とは独立しています。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/batch-ops-legal-hold.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/0302e524-9324-d73f-bdec-12bf46570f2f.png)

# 結果
・削除できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/b72b9e0e-93f9-fc2e-0927-6238c9e3dc25.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/11945ec1-3dd7-1364-c7dd-253a8b73dfd9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/6d2330c2-b4a7-469e-53f1-4c70b759b382.png)

・物理削除できない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/17f2e2ef-b808-79d4-47c5-f336c2699b2a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/6d8f9cbf-4ab5-77f0-5b16-eecaeaf8db70.png)


# Tips
①バケットを作成するタイミングで有効にするしか設定できません。
また、有効にしたら外せません。
②既存バケットはAWSサポートへ連絡すると対応してくれそうです。
③既存オブジェクトを有効するには以下2種類
　・バケットに入れ直す
　　　　※リーガルホールドの場合、一つずつ設定する必要があります。
　・バッチオペレーション機能を利用する。

# 既存オブジェクトの一斉適用
　大量のオブジェクトにあるバケットに対して、バッチオペレーションを利用して自動的に設定することが可能です。
ステップは簡単にまとめてみました。
①ソースバケットのロック機能を有効化
②Targetバケットのロック機能を有効化
③ソースバケットにReplicationルールを設定する
④ソースバケットにマニフェストを作成する
⑤バッチオプションジョブを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/d7c2c3f1-49e7-190a-2d5f-65547d4f1972.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/d2605958-5322-90d3-ec2c-7260a45c6d20.png)


最後に現状のねじれ（？）現象を申し上げたら本記事を完了したいと思います。
・ロックの状態でレプリケーションを設定することができません。
・バケット作成するタイミングでロックをかけないと、ロックの有効化できません。
つまり、現状上記の操作はサポートから協力していただかないと、既存バケット（バッチオペレーション）は利用できない状況でございます。
（ということで、最後のバッチオペレーション検証は一旦後回しにしました）


# サマリー
データの改ざん/誤削除/保存期間の要件に対して、S3のObjectロック機能の以下のどちらを利用すれば解決可能
・保持期間(Retetion Period)
　　＞バケット単位設定、設定以降直下に可能するObject自動適用
　　＞オブジェクト単位はバケットの設定を上書きして、保持期間をより長く設定することも可能
　　＞2種類ある
　　　　　Governance mode　　：　特別権限を持つと削除可能です
　　　　　Compliance mode　　：　指定期限までいかなる方法でも削除/変更できない　
　　＞既存バケット/オブジェクトに対しては、バッチオペレーションなど利用して一斉更新は可能です。

・リーガルホールドの有効化(Legal hold)　
　　＞オブジェクト単位設定
　　＞自動有効機能はないので、個別設定要
　　＞AWSCLIなど利用して、バッチにて列挙で更新
　　＞明示的な設定変更が可能
javascriptで動的に生成した子要素でイベントを発火してほしい

## はじめに

たまにどうしても使いたくなるけど簡単に調べられないので備忘録的に。
pure javascript でのイベントの割り当てについて書きます。


## 動的に子要素を生成

配列データを回しながら動的に子要素を生成します。

HTML側がこうなっていて。

    <div id="list-target"></div>

動的な生成が以下のようになります。
DOM生成のコストを下げるために文字列で組み立てたものをinnerHTMLで流し込んでいます。

    let parentEelement = document.getElementById("list-target");
    let childHtmlSource = "";
    info.list.forEach((item, index, arrays) => {
      childHtmlSource += "<dl data-uid=\"" + item.uid + "\">"
                       + "<dd>" + item.uid + "</dd>"
                       + "<dd>" + item.name + "</dd>"
                       + "</dl>";
    });
    parentEelement.innerHTML = childHtmlSource;

この状況で各ddタグにクリックイベントを割り当てたい時のaddEventListnerの付け方です。


## イベントの割り当て

方法自体は単純でoptionをtrueにした上で、Event.Targetを判定します。
キャプチャーフェーズとかイベントバブリングとかの説明は省略します。

    document.getElementById("list-target").addEventListener("click", (e) => {
      let targetElement = e.target;
      if (targetElement.tagName === "DD") {
        console.log("[%s]", targetElement.parentNode.dataset.uid);
      }
    }, true);

なぜこのような方法を採るのかですが、子要素生成後に以下のように書くと幾つかデメリットがあります。
「子要素の数だけaddEventListener()を呼び出すコスト」と「要素の追加・削除した際にイベントの張り直しが必要」というデメリットがあるため上記の方法を採っています。

    document.querySelectorAll("#list-target dl").forEach((item, index, arrays) => {
      item.addEventListener("click", (e) => {
        console.log("[%s]", e.currentTarget.dataset.uid);
      }, false);
    });
【C#】.NET FrameworkではArray.Fillを使えない

ドキュメントちゃんと見ればわかるけど意外と気づかなかったのでメモ程度に

<hr>

まったく同じ値を、指定した個数持った配列を作って、最後String.Joinでパイプ区切りにしたかった

JavaScriptでfillメソッドあるのを思い出したからC#にもあるのでは？と思って調べた

https://docs.microsoft.com/ja-jp/dotnet/api/system.array.fill?view=net-6.0

理想はこんな感じ(書き方あってるかな、、)

```cs
int num = 3;
string str = "text";
string[] arr = new string[num];
Array.Fill(arr, str);
Console.WriteLine(String.Join("|", arr));
// output: text|text|text
```

使ってみたけどエラーが、、
もう一度ドキュメント確認してみたら.NET FrameworkはArray.Fillは対応していなかった

結局for文で回してList.Addをすることにしました

```cs
int num = 3;
string str = "text";
List<string> list = new List<string>();
for (var i = 0; i < num; i++)
{
  list.Add(str);
}
Console.WriteLine(String.Join("|", list));
// output: text|text|text
```
形態素解析器の比較アプリを作ってみた【NEologd】

https://huggingface.co/spaces/tomofi/NEologd

形態素解析器ごとに結果を比較できるアプリ作ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/c342512d-c0c5-0df6-d3c5-dc4ae0bbdc2e.png)

streamlitで作ってます。HuggingFace Spaceなら16GB RAM と 8 CPUが無料で使えておすすめです。

```python:app.py
import os

os.system('git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git && cd mecab-ipadic-neologd && ./bin/install-mecab-ipadic-neologd -n -y -u -p $PWD')
os.system('git clone --depth 1 https://github.com/neologd/mecab-unidic-neologd.git && cd mecab-unidic-neologd && ./bin/install-mecab-unidic-neologd -n -y -u -p $PWD')

import streamlit as st

import MeCab

st.set_page_config(page_title="NEologd demo")
st.title('NEologd demo')


"""
Input the text you'd like to analyze. See the [NEologd][] docs for more details.
[NEologd]: https://github.com/neologd
"""

if st.button('Update NEologd', help='It may take some time'):
    os.system('cd mecab-ipadic-neologd && ./bin/install-mecab-ipadic-neologd -n -y -u -p $PWD')
    os.system('cd mecab-unidic-neologd && ./bin/install-mecab-unidic-neologd -n -y -u -p $PWD')

text = st.text_area("input", "麩菓子は、麩を主材料とした日本の菓子。")

def make_row(word, kana_index=7, lemma_index=6):
    # https://stackoverflow.com/a/49774255/5602117
    ff = dict(enumerate(word.feature.split(",")))
    return dict(surface=word.surface, kana=ff.get(kana_index), lemma=ff.get(lemma_index), 
            pos1=ff.get(0), pos2=ff.get(1), pos3=ff.get(2), pos4=ff.get(3))

"""
#### [mecab-ipadic-NEologd : Neologism dictionary for MeCab](https://github.com/neologd/mecab-ipadic-neologd)
"""

data = []

tagger = MeCab.Tagger('-r /etc/mecabrc -d /home/user/app/mecab-ipadic-neologd')
node = tagger.parseToNode(text)
while node:
    if node.feature.startswith('BOS/EOS'):
        pass
    else:
        data.append(make_row(node))
    node = node.next

st.table(data)

"""
#### [mecab-unidic-NEologd : Neologism dictionary for unidic-mecab](https://github.com/neologd/mecab-unidic-neologd)
"""

data = []

tagger = MeCab.Tagger('-r /etc/mecabrc -d /home/user/app/mecab-unidic-neologd')
node = tagger.parseToNode(text)
while node:
    if node.feature.startswith('BOS/EOS'):
        pass
    else:
        data.append(make_row(node, kana_index=9, lemma_index=7))
    node = node.next

st.table(data)

"""
#### [MeCab](https://taku910.github.io/mecab/)
"""

data = []

tagger = MeCab.Tagger('-r /etc/mecabrc')
node = tagger.parseToNode(text)
while node:
    if node.feature.startswith('BOS/EOS'):
        pass
    else:
        data.append(make_row(node))
    node = node.next

st.table(data)
```

https://huggingface.co/docs/hub/spaces

fugashiを参考にさせていただきました。

https://share.streamlit.io/polm/fugashi-streamlit-demo/main/demo.py
インターフェースを実装するようにエンティティを修正したら動かなくなった話

# はじめに（と原因）

Play FrameworkとEbeanを使用している環境で、エンティティに対して、
setterを宣言しているインターフェースを実装するように修正したら、
意図しない動きになった。

原因は下記記事に記載されている。

https://qiita.com/fukushiw/items/64993db74e1454554b7c

> Play Framework のエンハンス
> (中略)
> エンティティに対して、getterとsetterがついていないものはそれをつけるようにします。
> その後で、エンティティのフィールド直接アクセスを、getter/setter経由になるように書き換えます。
>
> Ebean の エンハンス
> (中略)
> 遅延ローディングや楽観的ロックの制御等の目的で、getterやsetterソースコードが改変されます。

Lombokを疑っていたが、Play FrameworkとEbeanでエンハンスしているとは...

# 修正前のコード

* エンティティ

```java
@Entity
@Table(name = "HOGE")
public class Hoge extends Model {
    public String field1;
    public String field2;
	@Override
	public void save() {
        super.save();
    }    
}
```

* 呼び出し元

```java
public void execute() {
    Hoge hoge = new Hoge();
    hoge.field1 = "aaa";
    hoge.field2 = "bbb";
    hoge.save();
}
```

# インターフェースを実装しようと思った理由

Hogeと同一項目を持つFugaが存在しており、Fugaに対しても更新することになった。
しかし、呼び出し元で似たような処理を書きたくなく、インターフェースにして
処理は1つにしたかったため。

# 修正後のコード(NG)

* インターフェース

```java
public interface ITable {
    public void setField1(String field1);
    public void setField2(String field2);
    public void save();
}
```

* エンティティ

```java
@Entity
@Table(name = "HOGE")
public class Hoge extends Model implements ITable {
    public String field1;
    public String field2;
	@Override
	public void save() {
        super.save();
    }
    // 以下を追加
    @Override    
    public void setField1(String field1) {
        this.field1 = field1;
    }
    @Override    
    public void setField2(String field2) {
        this.field2 = field2;
    }
}
```

※Fugaも同様

* 呼び出し元

```java
public void execute() {
    ITable table = createEntity(); // HogeかFugaを返すファクトリ
    table.setField1("aaa");
    table.setField2("bbb");
    table.save();
}
```

# 修正後のNG挙動

field1とfield2を設定しているが、Ebeanが更新対象として認識せずに
insertまたはupdateが実行されない。

# 教訓

* インターフェースを実装するだけなら無害、という思い込みは危ない