OmniAICreator/Qiita-1.07M huggingface dataset:
Gensim Dictionaryで高頻度語の方を取得する

## 環境
- Python 3.7.15
- Gensim 3.6.0

## Gensim Dictionaryで高い頻度の語を上位n語をしゅとくする
`gensim.corpora.Dictionary`には、出現頻度の最も高い指定個数の語を省く`filter_n_most_frequent`メソッドがあります。

```python
from gensim.corpora import Dictionary

corpus = [
    ["ビール", "寿司", "焼肉"],
    ["ハンバーグ", "寿司"],
    ["焼肉","ビール", "寿司"]
]
dct = Dictionary(corpus)

for id, c in dct.dfs.items():
    print(dct[id], c)
```

```:出力
ビール 2
寿司 3
焼肉 2
ハンバーグ 1
```

`filter_n_most_frequent(2)`すると、上位2語が除外されます。

```python
dct.filter_n_most_frequent(2)

for id, c in dct.dfs.items():
    print(dct[id], c)
```

```:出力
焼肉 2
ハンバーグ 1
```

逆に取り除かれる高頻度語の方を取得したい場合、Gensimにはそういうメソッドがありそうでありません。が、[Gensimの`filter_n_most_frequent()`の実装の内部](https://github.com/RaRe-Technologies/gensim/blob/48d6e55f84c39eccdd88ee55646ce7a77f2c1a70/gensim/corpora/dictionary.py#L404-L407)で使われている処理をそのまま持ってきて少し手を加えれば使えます。

```python
def ids_to_words(dictionary: Dictionary, ids):
    return [dictionary[idx] for idx in ids]

def most_frequent_words_top_n(dictionary: Dictionary, top_n: int):
    most_frequent_ids = (v for v in dictionary.token2id.values())
    most_frequent_ids = sorted(most_frequent_ids, key=dictionary.dfs.get, reverse=True)
    most_frequent_ids = most_frequent_ids[:top_n]
    return ids_to_words(dictionary, most_frequent_ids)
```

```python
corpus = [
    ["ビール", "寿司", "焼肉"],
    ["ハンバーグ", "寿司"],
    ["焼肉","ビール", "寿司"]
]
dct = Dictionary(corpus)

most_frequent_words_top_n(dct, 2)
```

```:出力
['寿司', 'ビール']
```

## x%以上の文書に登場する語を取得する
上記と同じように`filter_extremes()`の`no_above`を使うと、x%以上の文書に登場する語を除外できます。

```python
corpus = [
    ["ビール", "寿司", "焼肉"],
    ["ハンバーグ", "寿司"],
    ["焼肉","ビール", "寿司"]
]
dct = Dictionary(corpus)

dct.filter_extremes(no_above=0.5, no_below=1)

for id, c in dct.dfs.items():
    print(dct[id], c)
```

```:出力
ハンバーグ 1
```

これも、取り除くのではなく逆に取得したい場合、そのようなメソッドはありませんが[filter_extremes()の実装](https://github.com/RaRe-Technologies/gensim/blob/48d6e55f84c39eccdd88ee55646ce7a77f2c1a70/gensim/corpora/dictionary.py#L357-L360)を参考にすれば取得できます。

```python
corpus = [
    ["ビール", "寿司", "焼肉"],
    ["ハンバーグ", "寿司"],
    ["焼肉","ビール", "寿司"]
]
dct = Dictionary(corpus)

def most_frequent_words_rate(dictionary: Dictionary, threshold: float):
    threshold_abs = int(threshold * dictionary.num_docs)
    ids = [ v for v in dictionary.token2id.values() if threshold <= dictionary.dfs.get(v, 0) > threshold_abs]
    return ids_to_words(dictionary, ids)

most_frequent_words_rate(dct, 0.5)
```

```:出力
['ビール', '寿司', '焼肉']
```

## 参考
- [gensimのDictionaryの中身を簡単にまとめてみた \- Qiita](https://qiita.com/tatsuya-miyamoto/items/f505dfa8d5307f8c6e98)
- [corpora\.dictionary – Construct word<\->id mappings — gensim](https://radimrehurek.com/gensim/corpora/dictionary.html)
Google Apps Script(GAS)ではじめてのLINE Bot作成 - GASのメリット・デメリット

# はじめに

某ハッカソンで、LINE Bot(作ったLINE Botは[こちら](https://qiita.com/bamboo_music_ac/private/7ff789276e326ca26c24#%E4%BD%9C%E3%81%A3%E3%81%9Fline-bot))を作りたい！となりました。

意外と、LINE Botを作れる言語はたくさんあるようですが、私たちはGoogle Apps Script(GAS)を選択しました。

**GASを選択したメリット・デメリット**を書いていきます。

LINE Bot作成の技術選定の参考にしてもらえると嬉しいです😊

実際の使い方は、たくさん記事が転がってるので、それを見てください。

# メリット

1. 環境構築がいらない
    GASは、Googleアカウントさえあればすぐに使えます。
    なので、環境構築が苦手！という人にもオススメです。
2. デプロイが簡単
    1.と似ていますが、サーバが不要です。
    Herokuが有料になった今、無料でデプロイのハードル高くないですか！？
    というか、そもそもサーバ周りがフロントエンドしかしたことないと難しい…😢
    でも、GASはそれが不要です！！！
    LINE BotのアカウントとGASさえあれば大丈夫でした！！！
3. JavaScriptとほとんど文法が一緒
    JavaScirptと文法がほぼほぼ一緒なので、JS経験者であれば問題なく書けると思います！
    ~~私のメイン言語はPython書きなので、ググりつつ書きましたが。。~~

# デメリット
1. 共同開発ができない
    GASは、共同開発ができないらしいです。ハッカソンで致命的😅
    どんどん上書きで保存されていってしまうので、同じタイミングで編集していると、片方の編集が消えたりします。。
    (~~共同編集者と生活リズムが真逆だと耐えます。~~)
2. Git使いにくい
    決して、Gitが使えないわけではありません。
    [GoogleChromeの拡張機能](https://chrome.google.com/webstore/detail/google-apps-script-github/lfjcgcmkmjjlieihflfhjopckgpelofo?hl=ja)を使えばGitHubと連携できます。
    しかし、
    * pullはマージができない
    * `git add -p`などのような高度な(?)ものは使えない
    
    というできないことが色々と…。
    ファイルごとにコミットメッセージをつけてpushはできます！
3. ログ出力がちょっとめんどう
    LINE Botとして実行している時は、`console.log()`が動きません(?表示されないだけ??)。。
    なので、スプレッドシートなどにログを書き込ませました。
    ちょっと面倒だけど、一度関数を作っちゃえばなんとかなりました([参考](https://qiita.com/Ko001/items/f72f7dc59116d961581e))。
4. デプロイのバージョンがとても増える
    毎度新しいバージョンでデプロイしないと、LINE Bot上で確かめることができないので、バージョンの数がめっちゃ増えます。。
    ↓こんな感じ… 
![スクリーンショット 2022-10-16 17.37.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521877/c31c1d59-5f34-1d68-7434-ea7e3e5b349c.png)
5. 別の言語を呼び出したい時は、だいたいAPIが必要
    GASはそこまでライブラリが多くない(多分)ので、Pythonでいい感じのライブラリを使ったコード使いたい〜となりました。
    この時は、PythonでAPIを立てないといけなさそうでした。
    
# 作ったLINE Bot
作ったLINE Botはこれです。

もしよければ、友達追加してください🦉

https://twitter.com/_shiraberun/status/1594300020970311680?s=20&t=PBbPT7oGVWh-iWDfI1zCkQ
Railsでenum使用時にsyntax error, unexpected local variable or method, expecting =>

# 環境
* Ruby3.1.2
* Rails6.1.7
# 問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729380/0ed233ae-e117-d8b3-e49f-02ea8e1408a5.png)
Railsでアプリ作成中にenumを使っていてmodelにenumの記述を加えて動作確認しようとしたらエラーが出た。解決策がわからず、検索しても記事が出てこなかった。
# 解決方法
## 解決方法①
```diff_ruby
- enum period: { 1限: 0, 2限: 1, 3限: 2, 4限: 3, 5限: 4, オンライン: 5 }
# 数字を半角から全角に変更
+ enum period: { １限: 0, ２限: 1, ３限: 2, ４限: 3, ５限: 4, オンライン: 5 }
```
とすると![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729380/4d40ceb8-2615-fee3-2b0e-f55eeddc23ae.png)
エラーは出たものの、先ほどのエラーは解消されていそう。
## 解決方法②
```diff_ruby
enum day_of_week: { 月曜日: 0, 火曜日: 1, 水曜日: 2, 木曜日: 3, 金曜日: 4, 土曜日: 5, オンライン: 6 }
- enum period: { １限: 0, ２限: 1, ３限: 2, ４限: 3, ５限: 4, オンライン: 5 }
+ enum period: { １限: 0, ２限: 1, ３限: 2, ４限: 3, ５限: 4, 指定なし: 5 }
```
エラー文からわかる通り、「オンライン」という文字が既に同モデルのenumで使われていることが原因。
重複を避けるようにして解決。
# まとめ
* enumの記述の中で半角と全角が混在してはいけない
* 別のカラムでも同モデルであれば値が重複してはいけない
## 最後に
今回のエラーは自分が調べたときは同じ例がなかったため、初めて記事を書いてみました。
同じエラーではまった人のお役に立てたら幸いです！
※参考記事などはないので書いた内容が間違っている可能性もあるので鵜呑みはしないようお気を付けください。。。
【Salesforce】【資格】Salesforce 認定 Pardot スペシャリスト 合格までのあれこれ

当記事は受験体験記です。
※2022年11月時点(Winter ’23)の情報です。
※あくまでもぴえさん個人の考えです。

# Salesforce 認定 Pardot スペシャリスト とは　（ざっくり）
・Pardot管理者向けの資格、Pardotの基本的な設定や操作について出題
・受験資格：なし
・受験料：税込22,000円
・90分60問（合格基準は72％以上）
・選択式（記述で回答する問題はない）
・試験終了後、即座に合否がわかる

# ぴえさんの受験記録
【受験日程とバージョン】
日時：2022/11/13　16:30
受験方法：オンサイト受験（最寄りの会場）
バージョン：Winter ’23

【受験データ】
ウェブアセッサーのスクショ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/d1ba0eeb-c984-bd46-b2b4-b58748d6b871.png)

分かりにくいので表にしました↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/887e68b8-4fcf-9917-db6a-05f90915c6cc.png)

【感想】
・オンサイト試験主義者なので最寄りのテスト会場で受けました。
・Salesforceは3年目ですが、Pardot未経験なのでまずは用語と雰囲気に馴れるため
　試験対策前にTrailheadとPardotデモ環境構築をしました。
・受験日程が日曜日の16時半からだったので、土日に詰め込みで試験対策をしました。
・比較的シンプルで易しい出題が多いと気づいたので、とにかく過去問を漁ることにしました。
・他の試験では結構時間ぎりぎりなのですが、今回は半分以下の時間で終わりました。
・手ごたえは正答率に反映されたかと思います。

# Trailheadとデモ環境

用語覚えるためだったのであまり時間はかけたくなかったですが、
幸いハンズオンはなく選択問題のテストだけだったのでサクサク進みました。

https://trailhead.salesforce.com/ja/users/welcome4/trailmixes/certified-pardot-specialist-ja

とはいえ実際に画面を見て手を動かしたほうが理解しやすいので
こちらの手順通りデモ環境を構築しました。

https://w.better-future.co.jp/salesforce-pardot-demo%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E6%89%8B%E9%A0%86/

# 勉強方法
### １．受験ガイドを読む
いつの間にかQuipになっていた[試験ガイド](https://quip.com/r3FPA0GISwAB)を読みます。※以前までpdfの配布でした。
### ２．webに出ている問題を解く
検索するといくつか出てきますが、今回はこちらの60問+112問を使わせてもらいました！

https://salesforce-certification-hack.com/category/pardot-%e8%a9%a6%e9%a8%93/

https://www.jpnshiken.com/shiken/Salesforce.Pardot-Specialist.v2022-04-24.q112.html

:::note warn
上記以外にもそうですが英語の問題を自動翻訳かけて掲載しているところが多い気がします。
Contactを「取引先責任者」と訳せてるところはほぼないです。表記揺れも気になります。。
誤答も散見されるので気になる箇所は確実にヘルプページで確認したほうがいいです！
:::
### ３．分からない問題はヘルプを読む

[公式ヘルプ](https://help.salesforce.com/s/articleView?id=sf.bundle_pardot_parent.htm&type=5)を読むのが一番です。

今回はトラブルシューティングからもよく出てました。
[オートメーションルールのトラブルシューティング](https://help.salesforce.com/s/articleView?id=000382472&type=1)
[フォームのトラブルシューティングと FAQ](https://help.salesforce.com/s/articleView?id=000383485&type=1)
[Pardot メールのトラブルシューティングと FAQ](https://help.salesforce.com/s/articleView?id=000382093&type=1)

### ４．デモ環境を確認する
ヘルプを読んでもイメージがわかない場合はデモ環境を操作しました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/343be6d8-c6a4-2830-5047-012cf7e3290e.png" width=50%>


### ５．勉強メモを書く

https://qiita.com/piepie1231/items/0aa42795bff76349edcd

　
　
２～５を繰り返しました。
さすがに今年5つ目の試験となると試験対策も馴れてきたと感じます( * 'ω' * )


# その他のSalesforce資格について
他資格についてはこちらの記事にまとめています↓

https://qiita.com/piepie1231/items/78a0dd6bdfa2c64568cd
作業効率が上がるWebアプリまとめ

# 🫣TL;DR
自分が使ってきて良いと思った（作業効率が上がった）Webアプリを備忘録的にまとめます。
同じような機能を実装しているサイトはここに掲載しているもの以外にもあると思いますが、__アカウントを作る必要なく、なるべく直感的で使いやすそうなもの__ を集めています。

# 🧐Why Web Applications?
なぜWebアプリを使うのか。理由はいくつかあります。
- 環境に依存しない（どのPCからでも使える）
- たくさんアプリを立ち上げるのが嫌だ

# ⚠️Caution!
注意点もあります。
怪しいサイトだとフォームや画像の入力情報がどこに送られ、保存されるかわかりません。使うときは自己責任で、必要以上に大事なデータは入力しないようにするのが良いでしょう。

# 
## 便利ツール集
いわゆる[DevToys](https://devtoys.app/)のブラウザアプリバージョンのような感じです。

https://app.dev-box.app

https://www.oh-benri-tools.com

https://hogehoge.tk

https://toolbox.googleapps.com/apps/main/

https://www.jstoolset.com/

# 画像編集

https://www.peko-step.com

# 作図
http://draw.io

https://mermaid-js.github.io/mermaid-live-editor/


## 環境音、雑音

https://imisstheoffice.eu

https://hipstersound.com/index.html

## 差分表示
差分を表示する`diff`コマンドのような処理を手軽にできます。

https://difff.jp

## ファイル圧縮
https://squoosh.app

## 階層構造整理
階層構造を表示する`tree`コマンドのようなテキストを手軽に作成できます。

https://dir-tree.netlify.app

## ブラウザ情報取得
https://d-browserchecker.web.app

## Excel列変換（英字 <-> 数字）
https://takamin.github.io/techtips/xlsColNumMap

## 翻訳
https://www.deepl.com/ja/translator

## 文字数カウント
http://www1.odn.ne.jp/megukuma/count.htm

## メモ
https://hackersheet.com/

## その他
開発とは関係ないものもありますが、便利なものも載せておきます。

https://sakura-checker.jp

https://sqliteonline.com

https://inloop.github.io/sqlite-viewer/

https://onlinetsvtools.com

https://chat.openai.com/chat

https://pixe.la/

# まとめ
Webアプリは適度に使っていきましょう！
また、新しく見つけたりサービスの提供が終了するものがあれば随時更新したいと思います。
トップダウンの勉強法とボトムアップの勉強法

最近海外のプログラミング関係の動画でこれらの用語が出てきて、大事な視点だなと思ったので紹介したいと思います。

## トップダウン、ボトムアップとは
日本語だと経営手法の用語で、トップダウン=「上層部が意思決定を行う」、ボトムアップ=「下層部の意見を上層部が汲み取って意思決定を行う」という意味で使われることが多いようですが、もともとの意味は **トップダウン=「抽象から具体」、ボトムアップ=「具体から抽象」** という意味です。

## プログラミングの勉強法に当てはめると
厳密な定義は無いですが、プログラミング界隈においては、トップダウンの勉強法は、ドキュメント、本、動画など**すでに言語化された情報をインプットすること**で、ボトムアップは逆に**手を動かして学んでいく方法**があてはまると思います。

## 利点・欠点
### トップダウンの勉強法の利点・欠点
○ 技術の全体像をすばやく把握できる
○ その技術が「どう動いているか」を理論で知ることができる→実際に動かしてエラーが出た場合も何が原因なのか気づきやすい
○ その技術が生まれた背景、プログラミング界隈におけるその技術の客観的な位置付け等の周辺知識を知ることができる→納得した上でその技術を使える
☓ 机上の空論になりがち
☓ 体験を伴っていないと忘れやすい

### ボトムアップの勉強法の利点・欠点
○ 実際に体験することでそのプログラムの動きを頭に刻みつけることができる
○ 教科書には出てこないエラーなど生の知識を得られる
☓ 時間がかかる
☓ 細かい業務知識の集合になりがち→他の現場や技術で再利用しにくい

## バランスのいい勉強法
エンジニアとしてその現場や技術界隈で使える人材になるためにボトムアップの知識が必要なのはもちろんですが、長期的視点で見るとトップダウンの知識も同じくらい大事です。

実際の開発の現場ではボトムアップの知識が積み重なることが多いので、プライベートの時間や社内勉強会を通じてトップダウンで学ぶ時間を意識的に設ける必要があるのかなと思います。

学びのスピードでいうと 最初にトップダウンで全体像を把握 → 実装してボトムアップの知識を獲得 が効率がいいということでブートキャンプでも使われているようです。新人教育にも使えそう。

https://medium.com/@jacksonbull1987/top-down-learning-4743f16d63d3

私も未経験でエンジニアになって4年間ボトムアップの知識を蓄えることに奔走してたのですが（なんとなくそれが「エンジニアに必要とされる力だ！」と思って）、最近になってただ自分の専門分野だけアホみたいに知っててもエンジニアとして伸びしろが無い気がして軌道修正中です。

ということでトップダウンの勉強法とボトムアップの勉強法の紹介でした。なんとなく勉強法でモヤモヤしてる人の助けになれば幸いです。
[PHP]mysqlで日本語を保存する時に文字化けしてしまう

こんにちは[ありんこ](https://twitter.com/4rinc00)です。
最近パーフェクトPHPをやっているのですが、mysqlでデータを保存した時に文字化けしてしまって困ったので書いておきます。

# TL;DR
PDOをnewする時に、charsetをちゃんと設定しましょう。
```php
$dbConnection = new PDO('mysql:host=db;dbname=online_bbs;charset=utf8', 'docker', 'docker');
```

# どんな感じに困った？
Docker環境で進めているのですが、MySQLの文字コードはちゃんとutf8mb4にしているし、
PHPの文字コードもUTF−8(多分)だし、
HTMLも`<meta charset="UTF-8">`ってしているしで詰んだって感じでした。

# 原因
パーフェクトPHPがPHP5系で書かれていて、自分がパーフェクトPHPをPHP8系のバージョンで進めているので使用できる関数に差があったのが原因。
というかPHP７系からmysql系のモジュールが、[MySQLi](https://www.php.net/manual/ja/book.mysqli.php)か[PDO_MYSQL](https://www.php.net/manual/ja/ref.pdo-mysql.php)に置き換わって、削除されたらしい。

例えば、`mysql_connect()`は`PDO_MySQL`だと、`new PDO();`といった感じ。

で、[ドキュメント](https://www.php.net/manual/ja/pdo.construct.php#118361)をちゃんと見たら例のとこに書いてあった。

# どんな感じになるの？
```php
// DB接続
$dbConnection = new PDO('mysql:host=db;dbname=online_bbs;charset=utf8', 'docker', 'docker');
// ヒアドキュメントでSQL記述
$postIndexSql = <<<SQL
SELECT
    *
FROM
    posts
ORDER BY
    created_at DESC
SQL;
// クエリ実行
$postIndexResult = $dbConnection->query($postIndexSql);

// クエリ成功かつ0以上結果が返ってきた場合
if ($postIndexResult !== false && $postIndexResult->rowCount() > 0){
    // 一行ずつfetch
    while ($post = $postIndexResult->fetch()) {
        // プロパティ出力
        echo $post['name'];
    }
}
```

# まとめ
古いバージョンで書かれているPHPも、しっかりとドキュメント見れば同じように書き換えられる！
困ったらドキュメントを見よう！

# ちなみに
パーフェクトPHPは下記のような環境で進めています！

https://qiita.com/arinco_/items/8fecb52d674e68ef79f9

https://github.com/arinc0/php-study
named.confファイル概要

# named.confとは
BINDの主要設定ファイル。
パス→`/etc/named.conf`


# named.confの書式
```config
[ステートメント] [パラメータ] {
    [サブステートメント]
}
```


# 主要ステートメント
| ステートメント | 内容 |
| -- | -- |
| options | namedの設定 |
| logging | BINDのログ出力設定 |
| zone | ゾーンデータベース、ゾーンファイル設定 |
| include | ファイルを指定し、追加の設定を読み込む |



## optionsステートメント
| サブステートメント | 内容 |
| -- | -- |
| **listen-on** | **listenするポートとIPアドレス** |
| listen-on-v6 | listenするポートとIPv6アドレス |
| directory | マスターのゾーンディレクトリ |
| dump-file | namedがキャッシュしているデータのダンプ先 |
| statics-file | 統計情報の出力先 |
| memstatistics-file | named終了時、メモリ使用統計の出力先 |
| **allow-query** | **DNSサーバーに問い合わせ可能なクライアントの許可** |
| recursing | 再帰的問い合わせが可能かどうか（名前解決要求があるかないか） |
| dnssec-enable | DNSSECが有効かどうか |
| dnssec-validation | 問い合わせ結果をDNSSECを使用して検証するかどうか |
| managed-keys-directory | DNSSECのトラストアンカーの自動更新のためのファイル指定 |
| pid-file | PID情報の出力先 |
| session-keyfile | TSIGセッションキーの保存先 |

**`named.conf`のoprtionsステートメント初期設定値**↓↓
```config
options {
        listen-on port 53 { lcoalhost; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { localhost; };

        recursion yes;

        dnssec-enable yes;
        dnssec-validation yes;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.root.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};
```



## loggingステートメント
サブステートメント
| サブステートメント | 内容 |
| -- | -- |
| category | ログのカテゴリをどのchannelに出力するか指定 |
| channel | ログの書き出し場所を指定 |

**loggingステートメント例**↓↓
```config
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
```



## zoneステートメント
| サブステートメント | 内容 |
| -- | -- |
| type | ゾーンデータベースの種類 |
| file | ゾーンファイルのパス |
| allow-update | 動的な情報更新を許可するか |

**zoneステートメント例**↓↓
```config
zone "." IN {
        type hint;
        file "named.ca";
};

zone "test.com" IN {
        type master;
        file "test.com.zones";
};
```



# includeステートメント
ファイルパスを設定することで、追加の設定を読み込むことが可能。
**includeステートメント例**↓↓
```config
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
```


# 参照
- [【入門】BIND で DNS サーバーを構築](https://hogetech.info/network/dns/bind)
Wordleで最適解での平均手数を概算してみた

# wordleとは

wordleとは5文字の英単語あてゲームである.
ユーザーは5文字の英単語を入力すると, 答えの単語との一致度から文字が色分けされる
* 緑=答えの英単語とその文字が位置も含め一致
* 黄=答えの英単語にそのアルファベットが含まれる
* 灰色=答えの英単語にそのアルファベットが含まれない
この入力→色づきを繰り返すことで最終的に答えの単語(緑緑緑緑緑)を引き出すゲームである.

入力できる単語には制限があり, 答えに選ばれる単語は<a href=https://github.com/alex1770/wordle/blob/main/wordlist_hidden>約2300語</a>, 質問に入力できるのは<a href=https://github.com/alex1770/wordle/blob/main/wordlist_all>約13000個</a>である.
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/e5c8bfb7-90c2-48d4-6159-701e11defd9d.png width=500px>
↑wordleのサンプル画像. wikipediaより

# wordle最適解の定式化

wordleの平均手数について考察する.
答えの単語が2300個から等確率で選ばれたとする.
その際に, 2300個の単語を以下のような木構造で分類し, その平均深さがwordleの平均手数となる.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/7a977cd5-4e21-3948-9b24-e40311fbe844.png)

すなわちwordleの最適解での平均手数とは, 質問(上図ではsushiやshari)に適切な単語を選ぶことで, 木構造の平均深さの最小値を求める問題である.

これは以下の２つの式を使い再帰的に計算することができる

①すべての質問をぶつけて, そのなかで最も小さい手数を探せばいい.
$$ D(W)=\min_Q \tilde{D}(Q,W)$$
②質問が$Q$のときの平均手数は1+｢そのノード(文字色)が選ばれる率｣×｢そのノード(文字色)内の平均最小手数｣で計算できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/0714790d-0d75-0d4d-41a0-9cab5f0fdc1a.png)


$$ \tilde{D}(Q,W)=1+\sum_A p_A D(\mathcal{W} \cap (Qの答えがA)  )$$
* $\mathcal{W}=回答候補単語の集合$
* $D(W)=回答候補が\mathcal{W}のときの平均最小手数$
* $Q=質問単語$
* $\tilde{D}(Q,W)=次の質問がQの際の平均最小手数$
* A=回答 , 緑緑緑緑緑から灰灰灰灰灰までの計238通り

この式を解くことによりwordleの最適解を求めることができるが, 計算量的に不可能である.
そのため, 次章では数値的近似解について求めていく

# wordle最適解の計算高速化テクニック

### 可能性の高い単語に絞る

内部で木構造を作り回答$\mathcal{W}$を分類するため, これは$|\mathcal{A}|$分木の分類木と解釈できる.
分類木において, 一様分布に近い=シャノンエントロピーが大きな分類木が筋の良いそれとされている.
そのため, 各質問$Q$においてシャノンエントロピー$S$を事前に計算させ, そのうち上位$n$件を候補として採用することにした.
$$S(Q)=-\sum_A p_A(Q)\cdot \log_{ |\mathcal{A}|} p_A(Q)$$
$$p_A(Q)=\frac{|\mathcal{W}\cap(Qの回答がA)|}{|\mathcal{W}|}$$

### 計算打ち切り

各ノードの要素数から, そのノードにおける平均深さの下限を計算することができる.
暫定最小値を逐次計算しておき, それを下回る可能性がなくなったノードから計算を打ち切ることで計算を高速化させた.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/5181aa39-f987-0090-73e1-f3e2faebb8c4.png)

# 計算結果

シャノンエントロピー上位30件まで探索したところ, 最小の平均手数は3.240手であった.
グラフの形状から3.1~3.2手でクリアできそう
ちなみに, 最初の単語はtraceがいいみたいです.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/9794cb53-ae9a-316f-801a-3445c909ef99.png)

# 最後に

｢可能性の高い単語に絞る｣はシャノンエントロピー導出の際にアルファベットの共起性などを導入, 
｢計算打ち切り｣はA*アルゴリズムで別階層間のノードとも比較をすれば, 多分もっと高度に求められると思います.
興味のある方は是非

加えて, 定式化に関しましては, このサイトを参考にさせていただきました.
謹んで感謝いたします
http://www.shinshu-u.ac.jp/faculty/engineering/chair/elec001/archive.htm
PHPの概要及び書き方

PHPのコードはHTMLに埋め込んで使うことができる。
HTMLで言うところの「タグ」の書き始めに&lt;?php ~と入力し始めることで
PHPのコード入力をスタートさせることができる。
&lt;?php ~ の~部分に命令を入力してから、最後に?&gt;で閉じることで一文が完成する。


例↓↓↓
HTMLのみの場合:&lt;h1&gt;タイトル&lt;/h1&gt;
PHPを埋め込んだ場合:&lt;?php echo'&lt;h1&gt;タイトル&lt;/h1&gt;` ; ?&gt;
※タグをphpの命令で使用するときは'(シングルクォーテーション)で囲む
　(なんでシングルなの？)

[文法]
・phpの命令は文末に;(セミコロン)をつける
ジョブとかプロセスとかについて整理してみた

## 初めに
タイトル通りジョブとかプロセスとか。。恥ずかしながらその場で調べて何となくの理解でやり過ごしてきたので図にして整理したいと思います。以下、自分がややこしいなと思っている用語を順に解説しています。

### ジョブ
ユーザーがコンピューターに依頼する仕事の単位。複数のプロセスをひとまとめにしたもので、プログラムの実行単位。例えば、1つのコマンドを入力し、コンピューターから何らかの結果が出力されることが1つのジョブになる。

### タスク
「１つのまとまった処理」のことをタスクと呼ぶ。何をどうまとめるとタスクになるとかいう定義はない。アプリの中で計算しながら印刷するような場合、「計算」と「印刷」がタスクと呼ばれる。
ある時にはプロセスのことをタスクと呼んだり、ある時はスレッドの事をタスクと呼んだりする。


### プロセス
プログラムの実行単位。
プログラムの実行中の状態を指す。実行中の状態とは、プログラムがOSによって、メモリ上の領域を割り当てられ、そこでCPUとデータのやり取りを行っている状態。

### スレッド
コンピューター上のプログラムは複数実行されており、これらはすべてCPUで並列に処理される。CPU上では、プロセス内の実行する部分をいくつかに分けており、1つの実行単位をスレッドと呼ぶ。

### サービス(Linuxにおけるデーモン)
Windowsでのソフトの形態の1つ。利用者や実行中のソフトの求めに応じて即座に何らかの機能を提供できるよう、起動された状態でOSに常駐するプログラムのこと。

### デーモン(Windowsにおけるサービス)
主にUNIX系OSにおいて、バックグラウンドで待機するプログラムやプロセスのことである。システムやアプリによって呼び出されると、あらかじめ設定されている作業を自動的に実行する。デーモンとして動作するプログラムは、一般的に名前の最後に「d」がつく。(httpdなど)

## 図にまとめてみた！
単位大きいものから順にジョブ＞プロセス＞スレッドという感じです。

![スクリーンショット 2022-10-30 220410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823786/b8440b22-4142-d321-a1f9-7e7fda5c7e2e.png)


## 参考サイト
https://gimo.jp/glossary/details/process.html
https://garop.com/38/
https://kotobank.jp/word/%E3%82%BF%E3%82%B9%E3%82%AF-5586
https://e-words.jp/w/%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9.html#:~:text=IT%E3%81%AE%E5%88%86%E9%87%8E%E3%81%A7%E3%81%AF%E3%80%81%E4%BA%BA,%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A8%E3%81%84%E3%81%86%E3%81%93%E3%81%A8%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82
https://garop.com/204/

## まとめ
Powershell 今日のトリビア ドル記号を区切り文字にするときのエスケープはバッククォートではない

# ヒントはJava
[Why can't I split a string with the dollar sign?](https://stackoverflow.com/questions/2168831/why-cant-i-split-a-string-with-the-dollar-sign)
Javaは`line.split("\\$");`
これがヒント

# その前にドル記号の文字列は必ずシングルクォーテーションで囲む
ダブルクォーテーションの場合変数と勘違いして展開するためです。
このへんはここを参照します。
[about_Quoting_Rules (ver 7.3)](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_quoting_rules?view=powershell-7.3)

# 答えは
バッククォートではありません。
これも円記号（バックスラッシュ）になります。

```Powerhell
$('$$eee$aaa$zzz') -split '\$'
```

または区切り文字をダブルクォーテーションで囲み

```Powerhell
$('$$eee$aaa$zzz') -split "\$"
```

# 日本語環境だとカオスに
円ドルと記載するのでわけがわかりません。
まあドル記号は変数の印なので、パワーシェルで区切り文字に使うほうがおかしいのですが。
円記号が円でエスケープならドルはどうなるのか？ということで確認してみたところ判明しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/294de2bb-f696-193e-721e-bbce36936ea2.png)


[How to express the dollar sign in string](https://social.technet.microsoft.com/Forums/windowsserver/en-US/93bfa2fe-6c78-4e58-a000-cc2ef929636e/how-to-express-the-dollar-sign-in-string?forum=winserverpowershell)
英語ではExpressionというみたいですね。ドル記号はドルサイン。
意外とバッククォートでエスケープするのは限られています。そして機能があります。

```powershell
`t # タブ記号
```
【プログラミング初学者向け】Sift関数を使用するあれこれ【Perl】

# はじめに  
プログラミング初学者がPerlを学習する上でメモ書きとして投稿している記事になります。
間違った箇所などがあればご指摘よろしくお願いいたします。
# 背景
独学で勉強したshift関数と職場で使用したshift関数の使い方がちょっと違っていた？から
# 目的
Perlを学びたての人にshift関数の使い方について共有できればと思います。
# Shift関数とは
**配列の先頭の要素**を取得する関数。先頭の要素は切り出され、元の配列からはなくなることに注意してください。

### 例
```　hello.pl
#処理内容
#hello.plファイルをあらかじめ作成しておきましょう
my @nums = (1, 2, 3);
my $first = shift @nums;
print "$first\n";

#コマンドラインでhello.plまで進みpl hello.plを実行
1
```
### 違う使い方
今度は、自分がこうゆう使い方もあるんだってなった書き方(俺の調査不足で普通に使われてる説あるけど。。)
```hello.pl
my @name = ('ItoMakoto', 'SaionjiSekai');

my $ref = sub {
  my $hello_name = shift;#2つある配列の先頭を持ってきている
  print "Hello,$hello_name.\n";
};

$ref->($name[0]);
#結果
 Hello,ItoMakoto
```
うーむ。読者を置き去りにしていないだろうか。。
変数refの中身に渡された配列($name[0])の１番目の値('ItoMakoto')がshift関数によって渡されてきた感じです！

２番目で出てきている例は、無記名サブルーチンというものを使用しているので詳しく知りたい方は
[無名サブルーチン](https://qiita.com/drafts/cb4bb49b523bb4d30c4b)を参照してもらえれば助かります（ ;  ; ）

# 参考にしたサイト
[Perlゼミ shift関数](https://perlzemi.com/blog/20100104126425.html)
【QGIS】ポリゴンを作成する

## はじめに
この記事は#30DayMapChallenge2022 14日目の記事です。
テーマはHexagonsです。
QGISを使って六角形のポリゴンを新規作成してみます。

![image](https://raw.githubusercontent.com/tjukanovt/30DayMapChallenge/main/images/flyers/30dmc-2022.png)

https://30daymapchallenge.com/

## QGISとは
フリーでオープンソースの地理情報システム
ほとんどのUnixプラットフォーム、Windows、macOS上で動作する

## 事前準備

既にインストール済みのQGIS（バージョン3.22.3）を使います。
QGISを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/13c801a9-4ba2-7996-cb45-16f32c999cd1.png)

## レイヤ作成
上のメニューバーから、「レイヤ」＞「レイヤを作成」＞「新規シェープファイルレイヤ」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/91c74cce-3c14-3124-510c-da77c7ff1553.png)

新規シェープファイルレイヤ画面が開きます。
保存先のフォルダを指定します。
ジオメトリタイプは、今回はポリゴンを作りたいので「ポリゴン」を選択しました。
新規フィールドにはシェープファイルで定義する地物のフィールドを定義できます。今回は適当に追加しました。
入力できたら、「OK」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/cf5b30ac-0a5f-924f-3add-a5f8022efdbb.png)

余談：
シェープファイルはファイルサイズとフィールド名に制限があるので注意してください。

>シェープファイルを構成するファイルのサイズはそれぞれ2GB の制限があります。また、フィールド名は 2 バイト文字である日本語の場合、5 文字までに制限されます(英数字の場合は 10 文字まで) 。

引用元：[ESRIジャパン公式サイト シェープファイル](https://www.esrij.com/gis-guide/esri-dataformat/shapefile)


## ポリゴン作成
ポリゴンを描画するには、「編集モード」に切り替える必要があります。
編集モードは、レイヤーごとに個別にオンまたはオフに切り替えられます。

レイヤを選択した状態で、編集モード切替ボタン（画像のペンマーク）をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/1f9e0db7-74b9-9e4b-3aba-1f4bb819817d.png)

編集で使えるアイコンがアクティブになりました。
ポリゴンを地物に追加（画像のうにょっとしたマーク）をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/839b5ec2-3a41-4a73-eaa4-8cb35d5061e9.png)

線をつないでポリゴンを描画します。

不格好ですが線をつないで六角形を作りました。
作成できたら画面上で右クリックして、地物の属性を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/079b2f64-f22a-3301-1660-ac9c45716056.png)


別のデータ形式でポリゴンを出力するには、レイヤを右クリックして、「エクスポート」＞「新規ファイルに地物を保存」を押すと
任意のデータ形式で保存することができます。



## 参考文献
https://docs.qgis.org/3.22/en/docs/training_manual/create_vector_data/index.html

https://www.esrij.com/gis-guide/esri-dataformat/shapefile
Fiddler の "AutoResponder" 機能を使ってみる

# What's this?
Fiddler の機能の一つである Auto Responder を利用することで、以下のことを実現する手順を紹介する記事です。
・閉塞環境の Web ページを .saz ファイルに保存したものを展開することで、手元の環境で疑似的に動作させる。
・一般サイトへのアクセス情報を保存した .saz ファイルを利用して、閉塞環境でサイトを疑似的に動作させる。

なお、上記の他にもできることはいろいろありますが、原理は共通ですので今回は後者の手順を示します。

# 前提条件
・取得用環境と閉塞環境の2種が存在すること (Virtual Machine で構いません)
・取得用環境はパブリック ネットワークに接続されていること
・閉塞環境はパブリック ネットワークに接続されて<b>いない</b>こと
・双環境共に、Windows 環境 (サポート範囲ならとくにバージョン問わず)であること
・双環境に Fiddler Classic が install 済みであること、また動作すること

# 手順

## 1. Fiddler の設定を行う。
Fiddler はそのままでは https トラフィックを暗号化したままとなりますので、取得用環境でその復号設定を行います。
Fiddle メインメニューより [Tools] - [Option] を選択します。
[Option] ダイアログより [HTTPS] タグを選択し、下記設定を施します。

a) [Check for certificate revocation] のチェックを入力する
b) [protocols] の青文字部を選択し、利用する暗号形式 (SSl 及び TLS) を追加する
実施後のイメージ画像は下記のとおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/e2dc3f76-cca6-d51a-646c-2e3135952a5f.png)


## 2. .saz ファイルを取得する。
取得用環境で Fiddler を起動、 Capturing (Fiddler 右下参照) した状態でサンプルサイトにアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/668b28ed-7c5e-3125-b1d4-f2ebccdc86ce.png)
なお Caputuring 状態のオン・オフは F12 での切り替えが手軽です。

今回のサンプルでは 「阿部寛のホームページ」 を利用します。
http://abehiroshi.la.coocan.jp/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/cb2f0e11-9199-22a8-a744-a66ca6f93a36.png)

アクセス結果がこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/5c4fab18-316c-7cdc-abad-a506ba3bcf46.png)

必要なものだけ取るのがコツです。
取得したら Capturing を停止し、[File] メニューから [Save] - [All Sessions] を選択、任意の名前を付けて保存しましょう。

## 3. ファイルを閉塞環境にコピーする
手順2 の最後で保存したファイルを閉塞環境にコピーします。

## 4. Auto Responder の準備をする
閉塞環境の Fiddler を起動し、AutoResponder タブを選択します。
Capturing は停止しておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/633e6465-3749-3e34-f79d-2210601a5ded.png)

Import ボタンを押下し、手順3 でコピーしたファイルを選択します。
その後、右下の [SAZ / Rules]　を SAZ for Playback(*.saz) に設定してからファイルを開いてください (今回は正直あまり関係ないですが…*1)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/d774ab05-833e-85d1-5763-109d071a423e.png)

ファイルが開かれると、下記のように展開されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/8d3cb6b9-e029-5314-2295-b9520d030334.png)

その後、[Enable Rules] チェック ボックスをオンにした後、 Capturing を再開してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/a73081f9-d26c-8674-0dfb-9fbf66925090.png)

## 5. 再現環境でのサイトアクセス
適当なブラウザで http://abehiroshi.la.coocan.jp/ にアクセスしてください。
閉塞環境にもかかわらず、"阿部寛のホームページ" に到達できるはずです。
表示を確認したら Capturing を停止し、再度アクセスを試みてください。
今度はページに到達できないはずです。

# 何が起きているのか
Fiddler の アプリケーション プロキシという側面を利用して、特定の URL へのアクセスを .sazファイルの対応した領域にバイパスしています。

# そんなわけで
簡単な設定ではありますが、これによる「現地環境でしか起きない」 Web アプリのデバッグや、
ブラウザごとによる動作差異を簡単に確認できます。
皆様是非お試しください。

*1 ページ間での複雑な流れを追うときにはこの設定が必要になっていきます。
別途書くかもしれないし書かないかもしれない。
Powershell 今日のトリビア splitで￥を使うときのエスケープはバッククォートではないが気にしなくてもよい

# 円記号単体ではエラー
`\\Server\folder\MyDrive`
このような場合、

`$('\\Server\folder\MyDrive') -split "\"`
<b><font color="Red">解析中 "\" - パターンの末尾に無効な \ があります。</font></b>

# バッククォートか？
`$('\\Server\folder\MyDrive') -split "`\"`
<b><font color="Red">解析中 "\" - パターンの末尾に無効な \ があります。</font></b>

# ヒント
[PowerShellのエスケープシーケンス](https://tex2e.github.io/blog/powershell/escape-sequence)
> 文字列の中でダブルクオート「"」やシングルクオート「'」の文字を含めたい場合は、その文字を2回繰り返すことで、そのまま表示されます。

# それならこれはどうか

```powershell
`$('\\Server\folder\MyDrive') -split "\\"`
```

:::note
日本環境では
$('&yen;&yen;Server&yen;folder&yen;MyDrive') -split "&yen;&yen;"
と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/80c5be9d-299f-72d1-c145-9f65c60473d0.png)
:::

```powershell
$('\\Server\folder\MyDrive') -split "\\"
Server
folder
MyDrive
```

成功しました。バックスラッシュ(日本語では円サイン）はエスケープが必要でそれは円マークです。
なので

`$Stiringbalue -split "\\" `
日本語では
`$Stiringbalue -split`"&yen;&yen;"
とすることで、フォルダ名を分解できることになります。
ただしPowedrshellの場合はこれを`Split-Path`で行います。

### Split-Pathについて
[Split-Path(Ver 5.1)](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/split-path?view=powershell-5.1)

:::note
Ver 6.0以降は`-Extension` `-LeafBase`が追加されています。Scripting.FilesystemObjectのGetExtensionname, GetBaseNameと同様の機能です。
:::

#### モジュール:
> Microsoft.PowerShell.Management
指定されたパス部分を返します。

```Powershell
Split-Path
     [-Path] <String[]>
     [-Parent]
     [-Resolve]
     [-Credential <PSCredential>]
     [<CommonParameters>]
```

#### 説明
> このコマンドレットは Split-Path 、親フォルダー、サブフォルダー、ファイル名など、パスの指定された部分のみを返します。 また、分割されたパスで参照されている項目を取得したり、パスが相対パスか絶対パスかを判断したりすることもできます。
このコマンドレットを使用すると、選択したパスの一部だけを取得または送信できます。

※ 通常はこのコマンドを使うため、円記号を区切り文字にするときのエスケープを意識しなくても良い。

#### 例
##### 例 1: パスの修飾子を取得する
`-quolifer` を使用
ドライブを取得
`D:`
`HKCU:`
など。このような形で取得できる。

※ -NoQuoliferはこの逆というか、残りの部分だけが取得できる。

##### 例 2: ファイル名を表示する
`Split-Path -Path "C:\Test\Logs\*.log" -Leaf -Resolve`

※ ファイル名が返る

##### 例 3: 親コンテナーを取得する <-これ
`Split-Path -Path "C:\WINDOWS\system32\WindowsPowerShell\V1.0\about_*.txt"`


```powershell
'C:\Documents and Settings\UserName\My Documents\My Pictures' | Split-Path | Split-Path
```

# Documentsフォルダの取得
前回のトリビアと合わせると、環境によっては、このような形でDocumentsフォルダを取得できる

```powershell
$($env:PSModulePath -split ';').Item(0) | split-Path | Split-Path
```
OpenSearch on CentOS

今までElasticsearchは長い事つかっていたのですが、OpenSearchを知る機会に恵まれましたのでOpenSearchの色々な機能について検証した結果を残していきたいと思います。という事でまずはインストール方法を記事にさせていただきます。

# 1. 環境
OS：CentOS 7.9
Kernel: 3.10.0-1160.80.1.el7.x86_64
opensearch: 2.3.0-1.x86_64
opensearch-dashboards: 2.3.0-1.x86_64

# 2. OS最新化
いつも通りですが、OSを最新化します。
```bash
yum -y update
timedatectl set-timezone Asia/Tokyo
reboot
```

# 3. パッケージインストール
各種パッケージをインストールします。OpenSearchはリポジトリを追加してyumでインストールしています。
```bash
yum install -y wget vim
cd /etc/yum.repos.d
wget https://artifacts.opensearch.org/releases/bundle/opensearch/2.x/opensearch-2.x.repo
wget https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo
yum install -y opensearch
yum install -y opensearch-dashboards
```

# 4. opensearch起動＆自動起動設定
OpenSearch起動＋自動起動設定を実施しておきます。
```bash
systemctl start opensearch
systemctl enable opensearch
```

# 5. firewalld設定変更
ブラウザからアクセスできるようfirewalldの設定を変更しておきます。
```bash
vim /etc/firewalld/firewalld.conf
AllowZoneDrifting=yes
↓
AllowZoneDrifting=no
:wq

firewall-cmd --add-port=5601/tcp --permanent
firewall-cmd --reload
iptables -L -n  #結果を確認
```

# 6. opensearch-dashboardファイル変更
デフォルトではサーバ自身からのアクセスのみ受け付ける設定になっていますので、/etc/opensearch-dashboards/opensearch_dashboards.ymlファイルを下記の通り変更しておきます。
```diff_batchfile
- #server.host: "localhost"
+ server.host: "0.0.0.0"
```

# 7. opensearch-dashboard起動＆自動起動
変更が完了したらOpenSearch-dashboardsを起動&自動起動設定を行います。
```bash
systemctl start opensearch-dashboards
systemctl enable opensearch-dashboards
```

# 8. ブラウザアクセス
http://ipaddress:5601 で管理画面にアクセスします。ID/PWはadminでログインできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/ed9b36e5-152f-018e-7ae6-69598a1c8add.png)

インデックスなど設定すると下記画面のようにデータが表示されます。この辺りはまんまElasticsearchと同じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/5f77194f-49c3-b279-252f-5df763386177.png)
【DevContainers】Featuresをテストする方法

## テスト方法

以下のように`test`ディレクトリを作成する。  
`test`ディレクトリ内のディレクトリ名はテストするFeatureと対応していなければならない。  

```sh
$ tree
.
├── src
│   ├── git
│   │   ├── devcontainer-feature.json
│   │   └── install.sh
...
├── test
│   ├── _global
│   │ ├── scenarios.json
│   │ └── some_test_scenario.sh
│   ├── git
│   │   ├── scenarios.json
│   │   ├── install_dotnet_and_oryx.sh
│   │   └── test.sh 
...
```

`test/git/test.sh`を以下のように作成する。  

```bash
#!/bin/bash

set -e

source dev-container-features-test-lib

check "version" git --version

reportResults
```

- `check <LABEL> <cmd> [arg...]...`  
`<cmd>`を実行し終了コードに応じて成功/失敗を表示する。

- `reportResults`
`check`と`checkMultiple`の結果を出力する。

テストを実行するにはDevContainersCLIを使用する。  

```terminal
devcontainer features test --features Feature名 --base-image ベースイメージ .
```

```terminal
devcontainer features test --features git --base-image mcr.microsoft.com/devcontainers/base:debian .
```

上記の場合には`git`Featureをdebianのベースイメージを使用してテストする。  

以下のようにコマンドを短くできる。  

```terminal
devcontainer features test -f git -b debian
```

## シナリオ

オプションを指定してテストを実行するには`scenarios.json`とそれに対応するファイルを作成する。  

- `scenarios.json`

```json
{
  "git-scenario": {
      "image": "ubuntu:focal",
      "features": {
          "git": {
            "version": "2.20.1"
          }
      }
  }
}
```

- `git-scenario.sh`

```bash
#!/bin/bash

set -e

source dev-container-features-test-lib

check "version" git --version

reportResults
```

`scenarios.json`の`"git-scenario"`には`.sh`のファイル名を記述する。`"git"`にはFeature名を記述する。  

例では`git`Featureを`git-scenario.sh`の内容でテストすることになる。  

なお`scenarios.json`に対応するファイルが存在しない場合にはテスト実行時に以下のようなエラーが出る。  

```terminal
$ devcontainer features test --features git-from-src-fast --base-image mcr.microsoft.com/devcontainers/base:debian .

...

[-] No scenario test script found at path '/workspaces/devcontainers-features/test/git-from-src-fast/git-from-src-fast.sh'.
  Either add a script to the test folder, or remove from scenarios.json.
```
Chemfigを用いたメタンの立体構造の描画

プリアンブルに以下のものを追加する．
なお，```\usepackage{miscchemsym}```は不要であるかもしれません．

```
\usepackage{booktabs}
\usepackage{miscchemsym}
\usepackage{chemfig}
\usepackage{filecontents}
\usepackage{tikz}
\usepackage{catchfile}

% chemfigdo
\newcommand{\chemfigdo}[2]{\chemfig[#2]{#1}}%

% chemfiginput
\newcommand{\chemfiginput}[2][]{%
\CatchFileDef{\chemfiginputtemp}{#2}{\csname CF_sanitizecatcode\endcsname}%
\expandafter\chemfigdo\expandafter{\chemfiginputtemp}{#1}%
}%

% create new command for tikzpicture call
\newcommand\callchemfigsymbol[1]{%
  \chemfiginput[
      atom style={scale=\chemfigscale},
      atom sep=\chemfigatomsep,
      chemfig style={
        baseline=(current bounding box.center),
        color=\chemfigcolor,
        line width=\chemfiglinewidth
      }
    ]{#1}%
}

% define the atom sep
\newlength{\chemfigatomsep}%
\setlength{\chemfigatomsep}{2.75em}%

% define the line width
\newlength{\chemfiglinewidth}%
\setlength{\chemfiglinewidth}{1pt}%

% define the scale
\def\chemfigscale{1.8}
% define the color
\def\chemfigcolor{black!40!black}

% define separation length
\setlength{\defaultaddspace}{25pt}
```

ここではメタンの構造のソースコードを```./source/sample.tex```にtexファイルとして作成する方法を示す．
基本的なコマンドの使用方法は通常のchemfigと同様である．

```
\begin{filecontents}{./source/sample.tex}
           H
     -[:270]C
              (
        -[:200]H
              )
              (
         <[:310]H
              )
    <:[:350]
\end{filecontents}
```

本文中で図を入れたい場所に埋め込む際は次のようなコードを用いればよい．

```
\begin{figure}[h]
	\centering
	\callchemfigsymbol{./source/sample.tex}
	\caption{sample}
	\label{fig:sample}
\end{figure}
```

## 実際に描画されたメタンの構造
![スクリーンショット 2022-11-14 20.57.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921144/6e2b0203-6f05-f6ab-393d-533af12cf2e9.png)

## 正式な立体的表記への適用
また，
```
\begin{filecontents}{./source/sample.tex}
           H
     -[:270]C
           (-[:200]H)
         (-[:310,,,,line width=3.5pt]H)
    -[:350,,,,line width=3.5pt,dash pattern=on 1pt off 2pt]H
\end{filecontents}

```
とすると，
![スクリーンショット 2023-02-19 11.09.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921144/78f57fa8-749b-50be-1312-2bc69d54b33f.png)
のように描ける．

# 参考文献
- https://tex.stackexchange.com/questions/544302/control-of-chemfig-positioning-within-tabular
VSCoqの初期設定

VSCodeでCoqを動かすための拡張機能として、VSCoqが用意されている。[公式の説明](https://marketplace.visualstudio.com/items?itemName=maximedenes.vscoq)を読んだだけだと少し詰まったので、初期設定の方法を軽くまとめます。

# 実行環境
- macOS 12.6.1
- Coq 8.16.0（[opam 4.14.0](https://opam.ocaml.org/doc/Install.html)を利用してインストール済み[^1]）
- VSCode, VSCoq はインストール済み

[^1]:任意のディレクトリで `opam install coq` を実行すれば良い

# VSCoqの初期設定
[VSCoqのドキュメント](https://marketplace.visualstudio.com/items?itemName=maximedenes.vscoq#settings)では4つの設定が紹介されているが、以下を行えば最低限動作するようになった。

1. VSCodeで拡張機能「VSCoq」をインストールし、有効にしておく。
1. プロジェクトがあるディレクトリの設定ファイル `.vscode/settings.json` を編集し、以下の内容を追加する。
    ```
    "coqtop.binPath": "PATH_OF_COQTOP"
    ```
    この設定によって、coqのインタプリタである`coqtop`のファイルが置かれているディレクトリの絶対パスをVSCoqに設定する。`PATH_OF_COQTOP`の部分に入力するパスは、恐らくcoqをインストールした方法により異なるが、今回はopamでインストールしたため、`/Users/my_name/.opam/4.14.0/bin`となった。

# おわりに
VSCoqの記事が少なかったので練習がてら初投稿です。間違い・質問あればお寄せください。

参考記事：
「VSCodeでCoqを動かす」https://qiita.com/Yonono_01/items/d077c49cc874e900d9a8
親レコードの編集可能フォームをメインフォームに追加する方法

こちらで紹介する方法でコンポーネントを追加すると
親レコードのメインフォームに子テーブルのフォームを表示させて、そこで編集させることができるようになります。
# 追加方法
メインフォーム編集画面を開きます。
左のメニューから
[コンポーネント]＞[表示]or[入力]＞[フォーム]を選択します。
「追加フォーム」の設定をします。各項目について詳細は以下です。
**検索列**：表示させたいテーブルと接続している列
**関連フォーム**：子テーブルで作ったフォームが表示されるので追加したいフォームを選択
**Forms**：チェックを入れると（フォームで表示させてる）親レコードに自動で紐づける設定ができる
**テーブル列**：子テーブルで関連付ける列を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/5fd1df15-ce67-9e5d-8a8b-85b44efc1432.png)

左上の[保存]＞[公開]をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/35eb8d45-740e-a7f4-5851-76e07fe4147f.png)


# 実際の画面

モデル駆動型アプリを開いて、[新規]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/13bb397e-9d7f-4e5a-ca97-ff7eb3b3ea22.png)

何も入力しない状態だと、追加したフォームコンポーネントは表示されません。代わりに「Source record not selected」と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/670daf0e-7227-9b87-a6b8-cca562fcfb49.png)

検索列の値を入れると、下のフォームコンポーネントに親レコードが表示されましたね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/ee056658-6ab6-bde2-0f77-1210085d8cbd.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/8fae60ac-08fc-fa4b-e52c-92ab91ef431a.png)

こちらでカーソルを合わせると、レコードの編集ができます。
子レコードのフォームの中で親レコードの編集ができると、いろんな画面に飛ばなくても良くなりますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/42054017-4e2e-96bb-6d8f-62c48e85ef60.png)
Reactを扱う上でのJavascriptの基本(分割代入、スプレッド構文、論理演算子、三項演算子など)


最近業務でReactを使用しているが、Jsの基本がわかっていなかったため、コードリーディングに苦労しました。
この記事では、Reactを解読する上で欠かせないJsの構文をまとめたので、よかったら参考にしていただけると幸いです。

### 分割代入(オブジェクトや配列から値を抽出するためのもの)

オブジェクト(↓name: '桃太郎'のようなプロパティからなる変数を「オブジェクト」という。)
```
const person = {
  name: '桃太郎',
  age: 13,
  birth_place: " Japan"
}

const { name, age, birth_place } = person

console.log(name) => 桃太郎
console.log(age) => 13
console.log(birth_place) => Japan
```

配列（[]で括り、中に数字や文字列を書き、「,」でつなげたもの）
```
const array = [ "田中", 21, "北海道" ]

const [ name, age, birth ] = array

console.log(name) => 田中
console.log(age) => 21
console.log(birth) => 北海道
```


### スプレッド構文（配列の要素を展開するためのもの）
```
const array1 = [ 10, 20, 30, 40, 50 ]

console.log(...array1) => 10 20 30 40 50
```

スプレッド構文は、配列の要素をまとめて使用することもできる。
```
const array1 = [ 10, 20, 30, 40, 50 ]

const [ num1, num2, ...array2 ] = array1

console.log(num1) => 10
console.log(num2) => 20
console.log(...array2) => 30 40 50

console.log(array2) => [ 30, 40, 50 ]
```

### 論理演算子（&&,||）

 **| |は、その左側がfalseなら右側を返す。**
```
const judge1 = true

const judge2 = false

if (judge1 || judge2) {
    console.log("judgeのどっちかはtrueだよ。")
}

=> judgeのどっちかはtrueだよ。


if (judge1 && judge2) {
    console.log("judgeのどちらもtrueだよ。")
}

=> undefined



const money = undefined
const pay = money || "お金はないのかな？？"
console.log(pay)

=> お金はないのかな？？


const money = 1000
const pay = money || "お金はないのかな？？"
console.log(pay)

=> 100
```

**&&は、その左側がtrueなら右側を返す。**
```
const money = 500
const pay = money && "お金じゃん!!"
console.log(pay)

=> お金じゃん!!
```

### 三項演算子( 条件 ? “trueのとき実行” : “falseのとき実行” )
```
const num = 5 > 10 ? "大きいやん。" : "小さいやん。"

console.log(num) => 小さいやん。

```

今回紹介したJsの構文はReactでたくさん使用しているので、よかったら参考に。
機械学習を使った破断面の画像分類

# はじめに

金属部品の破損原因を調べるため、破断した面（破断面）を電子顕微鏡で観察することがあります。破断面は金属の壊れ方によって特有な模様を示すので、破断面の解釈ができれば破損原因の推定に大いに役立ちます。
ただし、破断面の解釈は人が行うため、人によって解釈が異なったり、経験が少ない人では解釈が困難な場合があるという問題があります。このような問題に対応するため、ディープラーニングによる画像分類を用いた破断面の分類に関する研究が行われています。
ここでは、プログラムを作成せずに機械学習のモデルをウェブ上で簡単に作成できるGoogle社のTeachable Machineを使って、破断面の電子顕微鏡画像から破壊の形態（ディンプル、ストライエーションなど）を認識するモデルを作成してみました。

# 学習に用いたデータ
- Dimple（ディンプル、延性破面）
- Fan-shaped（ファンシェープトパターン、羽毛状破面）
- River（リバーパターン、脆性破面）
- Rock（粒界破面、脆性破面）
- Striation（ストライエーション、疲労）
各30枚
![data.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/e6d75c1d-f7c8-2c7a-5c80-eb32dcca04ec.jpeg)
用意した画像

# Teachable Machineによる学習
上記画像ファイルをTeachable Machineに読み込み、学習を行います。学習時間は10秒程度です。
![学習終了.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/18dd6a35-6cd4-1578-32ac-9f99b091dd6c.jpeg)
Teachable Machineによる学習後のようす

学習で作られたモデルをアップロードするとURLが作成され、そこにアクセスすれば誰もが使えるようになります。


# 作成したモデル
作成したモデルのURLは次のとおりです。
https://teachablemachine.withgoogle.com/models/dz2tt3O8v/

★使用結果について当方は責任は負いません。
# 参考
[Teachable Machineのサイト](https://teachablemachine.withgoogle.com/)
山際謙太, 破断面解析におけるディープラーニングの活用事例の紹介, 材料, 69-9 (2020), pp. 644-649
[新潟県工業技術総合研究所のサイト Lobeによる金属破断面の認識](http://www.iri.pref.niigata.jp/topics/R2/2kin22.html)
OpenScapを使用してCIS benchmarkでAlma linuxをハードニングするまで

# 前提
* OpenScap 
* AlmaLinux9構築済み
    https://wiki.almalinux.org/documentation/openscap-guide-for-9.html
* Lynx ※レポートのhtml確認用

# 手順
* openscapをインストールする。
```    
yum install openscap openscap-utils openscap-scanner scap-security-guide
```
* 利用可能なプロファイルを確認する。
今回はCIS benchmarkのワークステーションL2を使います。
```
oscap info /usr/share/xml/scap/ssg/content/ssg-almalinux9-ds.xml
```

* 実行したいプロファイルIDを指定し、スキャンを実行する。
--reportオプションで出力先を指定します。出力先フォルダを事前に作成しておく必要があります。
```
oscap xccdf eval  --profile xccdf_org.ssgproject.content_profile_cis_workstation_l2 --results /tmp/ssg-results.xml   --report ~/oscap/report/ssg-results.html     /usr/share/xml/scap/ssg/content/ssg-almalinux9-ds.xml
```
* レポートを確認する。　※Lynxを使用。
スクロールしていくと項目の詳細を確認できます。
修正の仕方も確認可能です。
```
lynx ./oscap/report/ssg-results.html
```
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962888/57b561c3-b33b-3907-671f-2781c1421021.png)
※CIS benchmarkで要求されているパーティショニングを事前に行っているため、ここではその指摘は出力されていません。
Alma linuxのセットアップ時に、構成を以下のようにしておきます。
各パーティションのサイズは、用途に応じて調整してください。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962888/6f2f77e7-8ca3-aeda-493a-24c1f6f48173.png)



* スキャンと修正を行う。
--remediateをつけるとある程度自動修正してくれます。
```
oscap xccdf eval  --profile xccdf_org.ssgproject.content_profile_cis_workstation_l2  --remediate /usr/share/xml/scap/ssg/content/ssg-almalinux9-ds.xml
```
↓こんな感じでfixedしてくれます。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962888/72bcce4d-8add-3b63-b2e9-4068496a4ab9.png)
※アクセス権やパーミッション設定、パーティションの作成を要するものなどは、自動で修復してくれない場合があります。これらは、手動で修正する必要があります。

* 残った項目を手動で修正する。
私の環境では、以下ファイルのパーミッションがread onlyであったため自動でfixされませんでした。なので、これらは手動で修正を行いました。
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962888/39e6d81e-1691-90b6-1e41-d56d295e5eea.png)

* 以上。　※私は全部PASSするように設定しましたが、全部対応する必要はありません。目的に応じてどこまで対応するか検討するとよいでしょう。
Rustで書いたライブラリをC言語で使う

## これはなに

Rustの勉強をしていて、Rustで書いたライブラリをCで使ってみたいと思い、簡単なサンプルをつくったので記事にする。

## 何をやるのか

Rustで共有ライブラリを作成し、C言語で書いたコードのコンパイル時にリンクをする。
今回つくるのは、与えられた2つの引数の足し算・引き算をする関数。

## 手順

### Rustで共有ライブラリをつくる

Rustのライブラリプロジェクトを作成する。

```
$ cargo new --lib c_with_rust
```

`Cargo.toml`にライブラリターゲットを`cdylib`に指定する。

```diff_toml:Cargo.toml
[package]
name = "c_with_rust"
version = "0.1.0"
edition = "2021"

+[lib]
+name = "c_with_rust"
+crate-type = ["cdylib"]

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
```

https://doc.rust-lang.org/cargo/reference/cargo-targets.html

https://doc.rust-lang.org/reference/linkage.html

`lib.rs`に`#[no_mangle]`と`pub extern "C"`をつけ、`add`/`sub`関数を定義する。

```rust:lib.rs
#[no_mangle]
pub extern "C" fn add(x: i32, y: i32) -> i32 {
    x + y
}

#[no_mangle]
pub extern "C" fn sub(x: i32, y: i32) -> i32 {
    x - y
}
```

https://tomoyuki-nakabayashi.github.io/book/interoperability/rust-with-c.html

これで、`cargo build`をすると、`target/debug`配下に共有ライブラリが作成される。

### C言語でつくった共有ライブラリを使う

Rustで定義した関数のプロトタイプ宣言を含め、`main.c`を用意する。

```c:main.c
#include <stdio.h>

int add(int x, int y);
int sub(int x, int y);

int main() {
  int x = 3;
  int y = 2;

  printf("add: %d\n", add(x, y));
  printf("sub: %d\n", sub(x, y));

  return 0;
}
```

コンパイルをする。

```
$ gcc main.o -L./target/debug -lc_with_rust -o main
```

実行して動作を確認。

```
$ ./main

add: 5
sub: 1
```

## さいごに

C→Rustはなんとなくわかってきたが、Rust→Cがわからない...

## Refs

- [Cと少しのRust - The Embedded Rust Book](https://tomoyuki-nakabayashi.github.io/book/interoperability/rust-with-c.html)
- [Cargo Targets - The Cargo Book](https://doc.rust-lang.org/cargo/reference/cargo-targets.html)
- [Linkage - The Rust Reference](https://doc.rust-lang.org/reference/linkage.html)
- [RustのABIと共有ライブラリ - mox692 のブログ](https://mox692.hatenablog.com/entry/2021/12/05/212023)
- [Rustで動的リンクライブラリを作る / 読み込む - かおるノート](https://cordx56.hatenablog.com/entry/2021/04/29/213216)
- [APIとかABIとかシステムコールとか - 覚書](https://satoru-takeuchi.hatenablog.com/entry/2020/03/26/011858)
Teradata 技術者向け情報サイト

# 技術者向け情報共有サイト
Teradataはエンジニア向けに以下サイトで技術情報を共有しています。
<img width="900" alt="技術者向け情報共有サイト.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740723/5a638803-38d7-669e-94a6-d10668805d54.png">

|サイト名|説明|
|:-|:-|
|[Teradata 入門](https://quickstarts.teradata.com/)|Teradataに関する各種手順が掲載されているサイト|
|[Teradata ユニバーシティ](https://www.teradata.jp/University/Overview)|Teradataが提供しているWebベースのトレーニングコースが提供されているサイト|
|[Teradata ダウンロード](https://docs.teradata.com/)|Teradataに関するマニュアルが掲載されているサイト|
|[Teradata コミュニティ](https://techsupport.teradata.com/community?id=community_forum&sys_id=542c85ef87501d58c197411e0ebb35f5)|Teradataの製品に関するQ&Aサイト|
|[Qiita](https://qiita.com/organizations/teradata)|Teradataに関する各種技術情報が共有されているサイト|
|[Github](https://github.com/Teradata)|Teradataに関する各種ソースコードが共有されているサイト|
|[YouTube(日本)](https://www.youtube.com/user/TeradataJapan/playlists)|Teradataに関するビデオが共有されているサイト|
|[YouTube(グローバル)](https://www.youtube.com/user/teradata)|Teradataに関するビデオが共有されているサイト|

:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
M1 MacでMatplotlibのフォントをHelveticaに変更できない

# 問題
M1 MacでmatplotlibのフォントをHelveticaにして図を作成しようとしたが、エラーにより図が保存されない。
```
raise TTLibError("specify a font number between 0 and %d (inclusive)" % (numFonts - 1))
Fonttools ttlib ttliberror specify a font number between 0 and 5 inclusive
```

# TL;DR

```
import matplotlib
print(matplotlib.matplotlib_fname())

-----result-----
/Users/USERNAME/.pyenv/shims/versions/3.9.1/lib/python3.9/site-packages/matplotlib/mpl-data/matplotlibrc
```
この実行で表示された以下のファイルにアクセスし、部分的な変更を行う。

```
#font.sans-serif : DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Helvetica, Lucid, Arial, Avant Garde, sans-serif
```
この行において、優先度を高めるためHelveticaを最初に表記するように変更する。
```
font.sans-serif : Helvetica, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Avant Garde, sans-serif
```
一部分をリプレスする

```ts
type TypeName<T, U> = {
  [P in keyof T]: P extends keyof U ? U[P] : T[P]
}
```

```ts
type MoldsToBeRepressed = {
    typeaName?: boolean
}

type ReplaceType = TypeName<
  リプレス元,
  { typeaName?: MoldsToBeRepressed }
>
```