OmniAICreator/Qiita-1.07M huggingface dataset:
自作Groveケーブルを作った際の買い物メモ

# 概要

- 小型LidarでおなじみのLD06とGrove系ガジェットをつなげるために専用ケーブルを作成した。
- GroveコネクタやLidarで使う　ZHコネクタを入手する先をリストアップした。
- 使用した工具も一応リストアップした。

ちなみに小型LidarのLD06はこちらです。
https://www.inno-maker.com/product/lidar-ld06/

# 買ったもの
[2022/3/14修正]
結論から言うと国内市場で部品を揃えることができず、一部についてAliexpressを活用して部品を購入する必要があります。ただGroveコネクタに関しては共立エレショップで互換品をコンタクト込みで入手できます。

## Groveコネクタ(コネクタ端子)
4ピンのものを購入する。
~~残念なことに、2022/3/12(土)現在ではコンタクト含めてコネクタを購入できる先が日本国内にない。(法人だと別途あるかもしれない?)~~
2022/3/14追記：コメント欄にて共立エレショップにて入手できたとの情報を頂きました。ありがとうございます！
2023/4/9追記：共立エレショップにて互換品のセット販売が終了していましたが、バラ売りで別途販売していました。わーい。


Alixpressのショップで購入する際には、オプションとして「4P」を指定した。

- [Aliexpress 10セット/ロットhy2.0 hy 2mmコネクタ,湾曲したニードルシートプラグ端子2p 3p 4p 5p 6p 7p 8p,ピッチ2.0](https://a.aliexpress.com/_mOMgqRK)
- [Aitendo ★2.0★基板コネクタハウジング [HY-Y]](https://www.aitendo.com/product/17441)
- ~~[2022/3/14追記　Grove互換コネクタ HY2.0mm ハウジング・コンタクトピンセットCON302-HY2-4P-5P](https://eleshop.jp/shop/g/gK3U123/)~~
- [2023/4/9追記] Grove互換コネクタ HY2.0mm ハウジング CON302-HY2-4P https://eleshop.jp/shop/g/gMB4313/
- [2023/4/9追記] Grove互換コネクタ HY2.0mm用 コンタクトピン 【リールカット】 ★受注単位有★CON302-HY2-PIN https://eleshop.jp/shop/g/gMB4314/

## Groveコネクタ(ソケット端子)
同じく4ピンのものを購入する。
リンク先は千石電商とaitendoだが、ググれば結構ヒットする。

- [千石電商 Grove用-4ピンコネクタ ストレート(オス)10個入り](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4KKK)
- [Aitendo ★2.0★ロック付ベース付ポスト [HY-X]](https://www.aitendo.com/product/19473)

## ZHコネクタ(コネクタケーブル、4ピン)
2022/3/12(土)にて国内流通なし。Aliexpressにてケーブル付きのものを購入した。
購入時のオプションは「ZH1.5mm」、「100mm」、「10PCS 4P」を指定した。

- [Aliexpress メスプラグコネクタ,1.0 1.25 1.5 2.0 sh/jst/zh/ph/xh,2.54mm,1.0mm,1.25mm,1.5mm,2.0mm,ワイヤー付き,2/3/4/2.54,10個/7/8/pピン](https://a.aliexpress.com/_mLkxgU4)

## ZHコネクタ(ソケット、4ピン)
コネクタケーブル同様に国内流通無し。コネクタケーブル購入時と同じショップを使って送料を節約した。
購入時のオプションは「Vertical Smd」、「ZH1.5MM」、「10PCS 4P」を指定した。

- [オス/ピンヘッダーソケット,1.0/1.25/1.5 2.0 sh/jst/zh/ph/xh,2.54/1.25mm,2.0mm,直角,smd 2/3/4/2.54/6,10個/7/8/9/pピン](https://t.co/Bt7BCOq0TR)



# 使用した工具
購入したのはワイヤストリッパーと圧着工具。ただ、zhコネクタケーブルの先端に導線の露出があったため圧着工具があれば問題ないはず。

- [ワイヤストリッパー: エンジニア マルチワイヤーストリッパー 電線径自動調節機能付 PAW-01](https://www.amazon.co.jp/gp/product/B072BYT2V3/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&th=1)

- [圧着工具: アイウィス(IWISS) JSTコネクタ用圧着ペンチ ラチェット式 オープンバレル 0.03-0.5mm2 極小端子対応 IWS-3220M](https://www.amazon.co.jp/gp/product/B07KTWJQRX/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1)

# 圧着の方法
こちらの記事を参考にしました。写真が多く、勘所が非常にわかりやすく助かっています。
ちなみに圧着時には幅1.6mmのDieを使いました。

https://fumimaker.net/entry/2019/06/16/220408

# できたもの
こちらのケーブルで、小さいほうがZHコネクタ、大きいほうがGroveコネクタになっています。
一応導通確認もできていて、ATOM MotionとLD06を接続する際に重宝しています。

<img width="700px" alt="ZH1.5からGroveコネクタなケーブル" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/f78244af-abf1-4968-63a1-6945e7b8c1ad.jpeg">


# まとめ
[2022/3/14修正]

- 狙いのケーブルは作成できたが、ZH端子については国内市場で部品が入手できなかった。
- 2022/3/14現在について、Groveコネクタはコンタクト込みで共立エレショップで入手可能。
- GroveコネクタおよびZHコネクタともに一応Aliexpressで入手可能。
- Groveソケットは国内の様々なショップから入手可能。

# 余談
ケーブルの長さに不自由するかもだけども、Groveケーブルを買って中央で切断＆ワイヤストリッパで導線を露出させることで自作ケーブルを作ることは可能だったりします。

ただ、今回のようにZHコネクタ単体で存在していなかったり、コネクタ形状が特殊で圧着が困難な場合は手段として使えないため注意。
Excel VBA フィルタしてフィルタ値毎にファイル分割する

##はじめに
　Excelで作成された表に対して、ファイルを分割したいケース
　たとえば売上台帳みたいな表で、店舗ごとにファイルを分割するなどのマクロ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1308027/e7dfc03a-4ab2-238b-ccc9-1dce40ee3631.png)


##コード

```
Sub フィルタしてフィルタ値毎にファイル分割する()
'Ｂ列でフィルタして、それぞれの値ごとにブックを作成して保存する。
'ファイル名はフィルタ値とし、カレントブックと同一フォルダに保存する。

On Error GoTo Error
    
    '描画止める
    Application.ScreenUpdating = False
    '確認メッセージ非表示
    Application.DisplayAlerts = False
    
    Dim stRow As Integer  '基準点　行
    Dim stCo  As Integer  '基準点　列
    Dim MySheetname As String   'カレントシート名
    Dim TempSheetname As String 'フィルタ値の貼り付け用
    Dim FilName As String   'フィルタ実施時の値
    
    stRow = 2
    stCo = 2
    MySheetname = ActiveSheet.Name
    
    Cells(stRow, stCo).Select
    Range(Selection, Selection.End(xlDown)).Select

    'フィルタする。重複値は省く
    Selection.AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    'コピーする
    Selection.Copy
    '新規シート作成
    Sheets.Add After:=Sheets(Sheets.Count)
    '貼り付け
    ActiveSheet.Paste
        
    'tmpシート名取得
    TempSheetname = ActiveSheet.Name
        
    Range("A1").Select
    
    '元のシート選択
    Sheets(MySheetname).Select
    'フィルタ解除
    Cells(stRow, stCo).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.AutoFilter Field:=1
    
    '--ループ処理
    Dim i
    i = 2
    Do While Sheets(TempSheetname).Cells(i, 1) <> ""
    
    
        'フィルタ名取得
        FilName = Sheets(TempSheetname).Cells(i, 1)
        'フィルタ範囲選択
        Range(Cells(2, 2).End(xlToRight), Cells(i, 2).End(xlDown)).Select
        'フィルタする
        Selection.AutoFilter Field:=1, Criteria1:=FilName
        
        'コピーする
        Cells.Select
        Selection.Copy
        '新規ブック作成
        Workbooks.Add
        '貼り付け
        ActiveSheet.Paste
        '先頭を選択
        Range("A1").Select
        Application.CutCopyMode = False
        '名前を付けて保存する
        ActiveWorkbook.SaveAs Filename:=CurDir & "\" & FilName & ".xlsx"
        ActiveWindow.Close
        Range("A1").Select
        
        'フィルタ解除
        Cells(stRow, stCo).Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.AutoFilter
    
        i = i + 1
    Loop
    
    
    'tempシート削除
    Sheets(TempSheetname).Delete
    
    Range("A1").Select
    
    '確認メッセージ表示
    Application.DisplayAlerts = True
    '描画戻す
    Application.ScreenUpdating = True
    
    Exit Sub
Error:
    MsgBox "予期せぬエラーが発生しました"
    
End Sub

```

##履歴
2022/3/12 作成
子要素をクリックした時、親要素の影響を受けないようにする

カード全体がリンクになっていて、その中にさらに別のリンクを追加したいとき

## 作りたいもの

白枠は画像とか入れる想定で下部に別URLのリンクを入れたい。

細かい動作として
・aタグをホバーした時にはカード全体のスタイルを当てたくない。
・カード全体をクリックした時と、aタグをクリックした時は別のリンクに飛ばしたい。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="rNpNeVY" data-user="sora888" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/sora888/pen/rNpNeVY">
  link in link</a> by sora (<a href="https://codepen.io/sora888">@sora888</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>



## 実装方法
見た目通りに普通に書いたら下記な感じになるかと思います。
ただ今回は、ピンクカード全体にonClickのイベントが走るようにしており、
この中にaタグを入れてしまうとカード全体のonClickのイベントがよばれてしまいます。

`カード全体をクリックした時と、aタグをクリックした時は別のリンクに飛ばしたい。`この要件を満たせない。。。。
```html
<div id="outer">
 <div class="text">
   texttexttext
   <br/>texttexttext
  </div>
 <a href="">link</a>
</div>
```

aタグにはカード全体のonClickのイベントは当てたくないので、一度aタグをカード外に移動させます。
```html  
<a href="">link</a>
<div id="outer">
 <div class="text">
   texttexttext
   <br/>texttexttext
  </div>
</div>
```

これでaタグを独立させて、
`#outer`の影響を受けないようにします。

あとはスタイル調整していきます。
```css
#outer{
position:relative;
}
```
カード全体を支点としてaタグを配置したいので `position:relative;`
あとはaタグの位置を調整していきます。

```css
a{
  position:absolute;
  top:200px;
  left:150px;
  z-index:1;
}
```


## 終わりに
今回はカード全体をdivタグにしてonclickイベントで別リンクに飛ばすよう作っていますが、
カード全体をaタグにして中の要素にjs使ってもいけると思います。
個人的には親要素がdivの方が見やすかったです。
基板の固有振動数推算

# 背景/目的
* 基板周辺にノイマン/ディリクレ条件を与える場合は理論解があるものの、基板をねじ締結しているような場合の固有振動数を計算するためには基本的に3D解析を行っていた。
* 基板配置の構想設計段階の部品の強度検討を行いたい。
* 3D構造解析の回数を減らしたい（可能な限りやりたくない）。
* 基板の材質・寸法の変更に伴う影響を定量化したい。

# 変数
$\omega_n$：$n$次の角振動数
$a$：短辺[m]
$\rho$：密度[kg/m$^2$]
$h$：厚さ[m]
$E$：ヤング率[Pa]
$\nu$：ポアソン比[-]


# 固有振動数の算出

### 検討対象

部品実装部の固有振動を考え、以下(a)〜(d)での固有振動数を検討する。
![e1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132732/8dc638d4-7e2e-db4e-5782-e76eb8ebdea2.png)
私の関係している範囲では、ねじ締結箇所が基板周辺のみという場合は殆どありませんが、各々の実装部品の周辺を囲んでいるねじ締結箇所というイメージで、上記のパターンの集合で成り立っていると仮定します。

### 算出方法
角振動数を無次元化している研究成果を利用する[^1]。
ここでは部品の疲労破壊計算に用いることを前提とするので、1次モードのみ着目します（理由の詳細は改めて）。
|  $\Omega_1$  |  Normalized natural<br> frequency [Hz]|
| :---: | :---: |
|  (a)  |  8  |
|  (b)  |  10  |
|  (c)  |  18  |
|  (d)  |  22  |

各無次元化固有振動数を用いて、下式より当該箇所の固有振動数を算出する。
$\omega_1 =\cfrac{\Omega_1}{a^2}\sqrt{\cfrac{D}{\rho h}}$
$D = \cfrac{Eh^3}{12(1-\nu)}$

# 参考
[^1]:[GFRP多層プリント配線板用基材の振動解析](https://www.jstage.jst.go.jp/article/jscm1975/20/2/20_2_79/_pdf/-char/ja)
SLAMのAGV流用

家電のロボット掃除機の自己位置推定プログラム：SLAMですが、工場等での無人搬送車:AGVでの利用も増えてきました。
どちらが先に採用したかは置いておいて、結果的に認知はロボット掃除機の方が高いと思います。
[リンクテキスト](URL "https://ichikiji-ichizen.blogspot.com/")
VScodeでerbファイルをEmmet有効にする際に気づいたこと

<h1> VScodeのEmmet補完の設定

erbファイルでもEmmetを有効にするには、VScodeのsettingにある **Emmet:include Languages** を設定します。ググって調べると以下の画像のように設定で完了したらいいらしい。
[![Image from Gyazo](https://i.gyazo.com/df3d872e452cad2660d33c138628da31.png)](https://gyazo.com/df3d872e452cad2660d33c138628da31)
ただ私の場合はこれだけでは機能しませんでした。少し時間をかけて調べてみると以下の画像のように設定を加えたら解決しました。
[![Image from Gyazo](https://i.gyazo.com/3abf751346c6b0f43940df644fbbff8b.png)](https://gyazo.com/3abf751346c6b0f43940df644fbbff8b)
ちなみに**setting.json**へ直接記述しても設定は変更できます。
```
{
    "security.workspace.trust.untrustedFiles": "open",
    "window.zoomLevel": 1,
    "editor.suggestSelection": "first",
    "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
    "editor.tabSize": 2,
    "editor.insertSpaces": false,
    "workbench.colorTheme": "One Candy",
    "emmet.showSuggestionsAsSnippets": true,
    "emmet.triggerExpansionOnTab": true,
    "emmet.includeLanguages": {
        "erb": "html",
        "ruby": "html"
    },
}
```
ASP.Net Core デフォルトのDIシステムの使い方

# 主旨
ASP.Net Core デフォルトのDIシステムを使用して、依存関係の解決方法を記載する。
特に、コンストラクタの引数も自動で解決してくれる点は、フレームワークにより実装が隠ぺいされているため、理解が必要である。

# 前提
今回は、以下の依存関係を持つアーキテクチャで説明を行う。
より細かなイメージを掴みたい場合、こちらの[記事](https://qiita.com/naninanya/items/c968b6c0a0c3a8808496)を参照。
また、Entity FrameworkのDI設定に関しては、[公式ドキュメント](https://docs.microsoft.com/ja-jp/ef/core/dbcontext-configuration/)を参照。

- Repositoryの実装は、Entity Frameworkに移譲する。
- ApplicationServiceからのデータアクセスは、Repositoryに移譲する。
- ApplicationServiceはRepositoryInterfeceに依存する。
- Controllerの具体的な処理はApplicationServiceに移譲する。

# 依存関係を明示的に解決する場合
```csharp
public class Repository : IRepository
{
    private readonly DbContext _dbContext;
    public Repository(DbContext dbContext) => _dbContext = dbContext;
}

public class ApplicationService
{
    private readonly IRepository _repository;
    public ApplicationService(IRepository repository) => _repository = repository;
    public ViewModel Do() => new ViewModel();
}

public class HomeController : Controller
{
    // DbContextは、DIシステムより取得する。
    private readonly DbContext _dbContext;
    public HomeController(DbContext dbContext) => _dbContext = dbContext;
    
    public IActionResult Index()
    {
        // ドメイン側の依存関係を手動で解決する場合。
        // ApplicationServiceをインスタンス化するためには、2つの依存関係の注入を行う。
        // RepositoryにはDbContextを注入する。
        // ApplicationServiceには、Repositoryを注入する。
        var repository = new Repository(_dbContext);
        var service = new ApplicationService(repository);

        var viewModel = service.Do();
        return View(viewModel);
     }
}
```
# 全ての依存関係をDIシステムで解決する場合
```csharp
// Stratup.cs
public void ConfigureServices(IServiceCollection services)
{
    // DbContextのDI設定
    services.AddDbContext<DbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    // ドメイン側のDI設定
    // DIシステムに追加するだけで、各クラスの依存関係を解決してくれる。
    services.AddTransient<IRepository, Repository>();
    services.AddTransient<ApplicationService>();
}

public class HomeController : Controller
{
    private readonly IServiceProvider _provider;
    public HomeController(IServiceProvider provider) => _provider = provider;
        
    public IActionResult Index()
    {
        // これだけで呼び出せる。
        var service = _provider.GetService<ApplicationService>();
        var viewModel = service.Do();
        return View(viewModel);
    }
}

```
# まとめ
ASP.net Core デフォルトのDIシステムを活用して、依存関係を簡潔に自動解決できるようになった。
フレームワークを知ることで、適切な方法で実装できるようになった。
ただし、フレームワークを使用することは、実装部分がブラックボックスになるというトレードオフになる点を知った。

# 参考図書
[プログラミングASP.NET Core (マイクロソフト関連書)](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0ASP-NET-Core-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E9%96%A2%E9%80%A3%E6%9B%B8-Dino-Esposito/dp/4822253805/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=31P1EJ700JPR3&keywords=asp.net+core&qid=1647089340&sprefix=asp.net+core%2Caps%2C155&sr=8-4)
Rspecでのdevise_token_authの認証テストがうまくいかなかった

こんばんは

QiitaでRspec/devise_token_authで[調べて出てきたの](https://qiita.com/mtoyopet/items/ed1bd4b9c1544d401880)を参考に認証が通った状態でpostができるかのテストをしてみたところ、詰まったのでここに書き残しておきます
# 認証エラーの起きたテストコード
```Ruby:authorization_spec_helper.rb
module AuthorizationSpecHelper
  def sign_in(user)
    post api_v1_user_session_path,
      params: { email: user[:email], password: user[:password] },
      as: :json

    response.headers.slice('client', 'access-token', 'uid')
  end
end

```
まずQiitaの記事を参考に、サインインしたときにレスポンスのclient,access-token,uidを切り取ってくれるヘルパーメソッドを作成します。
```Ruby:posts_spec.rb
require 'rails_helper'

RSpec.describe 'PostsAPI', type: :request do
  describe 'POST posts/create' do
    it '投稿を新規登録する' do
      user = { email: 'test@example.com', password: 'test2525' }
      auth_tokens = sign_in(user)
      params = { post: { title: 'hogehoge', content: 'foofoo' } }
      post api_v1_auth_posts_path, params: params, headers: auth_tokens
      expect(response).to have_http_status :ok
    end
  end
end
```
そして上記のテストを実行すると

```Ruby:Terminal
Failures:

  1) PostsAPI POST posts/create 投稿を新規登録する
     Failure/Error: expect(response).to have_http_status :ok
       expected the response to have status code :ok (200) but it was :unauthorized (401)
     # ./spec/requests/v1/auth/posts_spec.rb:10:in `block (3 levels) in <main>'

Finished in 0.36107 seconds (files took 4.26 seconds to load)
3 examples, 1 failure
```
認証エラーになります。

# 解決策
まずテストが通ったコードを貼っておきます。
```Ruby:
require 'rails_helper'

RSpec.describe 'PostsAPI', type: :request do
  describe 'POST posts/create' do
    it '投稿を新規登録する' do
      # user = { name: 'test', email: 'test@example.com', password: 'test2525' }
      client_user = create(:user)

      # auth_tokens = sign_in(user)
      auth_tokens = client_user.create_new_auth_token

      params = { post: { title: 'hogehoge', content: 'foofoo' } }
      post api_v1_auth_posts_path, params: params, headers: auth_tokens
      expect(response).to have_http_status :ok
    end
  end
end
```
- `client_user = create(:user)`とは `client_user = FactoryBot.create(:user)`の省略型です。つまりFactoryBotを用いてあらかじめ作成してあるuserをここで呼び出しています。そしてcreateメソッドで新規作成＆DBに保存したものをclient_userという変数に代入しています。
- `auth_tokens = client_user.create_new_auth_token`　について。まず`create_new_auth_token`とは**devise_token_auth**の**DeviseTokenAuth::Concerns::User**をincludeしていたら使えるパブリックメソッドです。このメソッドは名前の通り、必要なメタデータを全て含んでいる新しいトークンを作成できます。つまり先ほど作成した`client_user`のトークンを作成して、これを`auth_tokens`に代入しています。

# なぜ認証が通らなかったのか？
ユーザーをDBに保存できていなかったから？
なぜならcreateをbuildにすると認証エラーになってしまうので。

実際にDBに保存されているemaillとpasswordを用いているのに認証に通らなかったのは分からずじまいです。





# 参考文献
- [【Rspec・devise token auth】Rails APIアプリのRspecテストでユーザログイン・認証を実装する方法](https://qiita.com/mtoyopet/items/ed1bd4b9c1544d401880)
- [devise_token_auth使用時のRspecの認証処理のやり方](https://qiita.com/soicchi/items/a8003e1510a0b17a07de)
- [【公式ドキュメント】DeviseTokenAuth::Concerns::User](https://devise-token-auth.gitbook.io/devise-token-auth/usage/model_concerns)
ElixirのHTTP ClientライブラリReqでベーシック認証を楽しんでみる

**わびぬれば今はた同じなにはなるみをつくしてもあはむとぞ思ふ**

:::note warn
ReqはヤングなHTTP Clientライブラリです。
この記事の内容はすでに古くなっているかもしれません。
https://hexdocs.pm/req/Req.html
をご確認ください。
:::


---

Advent Calendar 2022 69日目[^1]の記事です。
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私の[Advent Calendar 2022 一覧](https://docs.google.com/spreadsheets/d/1HQvFjagQLRPjOYAjDVzWp9S4b8dKixxvvaz_TtbZWto/edit#gid=1723448955)。

[^1]: @kaizen_nagoya さんの「[「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 １日目　Most Breakthrough Generator](https://qiita.com/kaizen_nagoya/items/49ebebee3a0377f3b59b)」から着想を得て、模倣いたしました。 

---



# はじめに

[Elixir](https://elixir-lang.org/)を楽しんでいますか:bangbang::bangbang::bangbang:

[Elixir](https://elixir-lang.org/)のHTTP Clientライブラリ[Req](https://hexdocs.pm/req/Req.html)でベーシック認証の楽しみ方がわかりましたので書いておきます。

# 題材

https://developer.atlassian.com/cloud/bitbucket/rest/intro/#authentication

Bitbucketからアクセストークンを取得するAPIを[Req](https://hexdocs.pm/req/Req.html)で使ってみます。

## curl

サンプルとしてcurlを使用した例を示します。

```
$ curl -X POST -u "client_id:secret" \
  https://bitbucket.org/site/oauth2/access_token \
  -d grant_type=client_credentials
```

これを[Elixir](https://elixir-lang.org/)で書いてみるわけです。

## 参考記事

https://qiita.com/torifukukaiou/items/6558d211a80f7174f85a

`client_id:secret`については上記の記事を参考にしてください。


# プログラム

この記事のハイライトです。
[Elixir](https://elixir-lang.org/)のHTTP Clientライブラリ[Req](https://hexdocs.pm/req/Req.html)でベーシック認証を楽しんでみます。

```elixir
Mix.install([
  {:req, "~> 0.2.1"}
])

client_id = "client id"
secret = "secret"

%{body: body, status: 200} =
  Req.post!(
    "https://bitbucket.org/site/oauth2/access_token",
    {:form, [grant_type: "client_credentials"]},
    auth: {client_id, secret}
  )

access_token = Map.get(body, "access_token")
```

[Req.post!/3](https://hexdocs.pm/req/Req.html#post!/3)の第3引数に`auth: {client_id, secret}`というふうに指定をします。

どうでしょうか？
楽しんでいただけましたでしょうか！



# 公式ドキュメントの記述

https://hexdocs.pm/req/Req.html#auth/2

公式ドキュメントは、[こちら](https://hexdocs.pm/req/Req.html#auth/2)にベーシック認証に関して書かれています。

ぼーっとなんとな〜く眺めていてみつけました。





---

# Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

この記事は、[Elixir](https://elixir-lang.org/)のHTTP Clientライブラリ[Req](https://hexdocs.pm/req/Req.html)でベーシック認証の楽しみ方がわかりましたので書いておきました。

:lgtm: やコメントは、励みになりますし、私はちょっぴりハゲています。

Enjoy [Elixir](https://elixir-lang.org/):bangbang::bangbang::bangbang:
<font color="purple">$\huge{Enjoy\ Elixir🚀}$</font>



以上です。
Cremation Brooklyn


Contact
Address: 1914 Utica Ave suite 360A, Brooklyn, NY 11234
Phone: 347-761-3668
Website URL: https://www.caribefuneral.com
About US:
The Caribe Funeral Home in Brooklyn NY with a legacy of two generations of dedicated, experienced funeral service. We believe in personal attention and uncompromising quality. We are proud of our long standing traditions, our serene facilities and steadfast commitment to serving families in their deepest time of need. We are available 24 hours a day, 7 days a week. We have an extensive history of earning each family’s trust by creating a truly caring and compassionate environment every time we are called to serve. Our licensed and well trained staff can assist you with personalized funeral and cremation services, memorials, burials as well as personalized merchandise, all of which reflect, with dignity, your wishes as well as the life of your loved one.
Related Searches:
Affordable Funeral Home Brooklyn | Prepaid funeral plans Brooklyn | Funeral Arrangements Brooklyn | Best Funeral Home | Cheap Cremation Brooklyn | Cheap Coffins and Caskets | Caribbean funeral services | American & West Indian Funerals | international funeral shipping | Repass reception | Mortuary shipping services Domestic international | Cremated remain sipping Domestic international | Funeral Homes | Funeral Service | Cremation Service
Additional Detail: 
Hours: Open 24 hours Monday to Sunday
Payment Methods: cc | cash
GMB Listing:
https://www.google.com/maps?cid=17507672788546290099
日本語GPT2をgoogle colabで実行

## はじめに
LINEにも利用されていたAIチャットbotの「りんな」を開発する会社がGPT2の日本語事前学習済みモデルを公開していたので試しました。

https://huggingface.co/rinna/japanese-gpt-1b

## 実装

まず、必要なライブラリをインストールします。
```python
!pip install transformers==4.4.2
!pip install sentencepiece==0.1.91
```

文をトークンという単位で分割するためのtokenizerと、分割したトークン列から後に続くトークン列を生成するモデルを読み込みます。

```python
from transformers import T5Tokenizer, AutoModelForCausalLM

# トークン分割
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-gpt2-medium", )
# りんなの学習済みモデルを読み込み
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt2-medium")
```

与えられたトークン列に続く文を生成します。今回は[最新のニュース記事](https://news.yahoo.co.jp/articles/2b2eb8184ce23ab64e3f919d844f2cdfaf2ca4b5)から一部を抜粋して残りを計100トークンになるまで生成しています。

```python
# 推論の実行。文の途中からGPTが文を生成する。
text = "appleは、3月9日未明にオンラインで製品発表イベントを開催。普及モデルとして人気の高い「iphone se」の後継機などを"
input = tokenizer.encode(text, return_tensors="pt")
output = model.generate(input, do_sample=True, max_length=100, num_return_sequences=1)
print(tokenizer.batch_decode(output))
```

GPTの生成文と本来のニュース記事は以下となります。固有名詞に多少難はあるものの、文としては自然であり、人間が書いたと言っても違和感はないと思いました。

**GPTの生成文**
appleは、3月9日未明にオンラインで製品発表イベントを開催。普及モデルとして人気の高い「iphone se」の後継機などを
発表しました。 今回の新型iphoneは、iphone seから「iphone 6s」に改名されることになり、その新型モデルに 含まれたtouch idは、iphone seが物理指紋センサーでtouch idに対応するのと異なり、 新しい技術として採用することを発表しています。 今回の新型iphoneには、iphone seと同様に指紋認証センサーも

**ニュース記事**
Appleは、3月9日未明にオンラインで製品発表イベントを開催。普及モデルとして人気の高い「iPhone SE」の後継機などを
発表した。発売は、3月18日を予定。11日から事前予約を受け付けている。また、同日にはドコモ、KDDI、ソフトバンク、楽天モバイルの大手4キャリアが同モデルなどの取り扱いを表明。Appleと同様、11日から予約を受け付けており、18日に発売する。

## おわりに
今回の結果を見ると、自分で作文するよりもGPTに任せた方がいいような気がしました。翻訳士が[DeepL](https://www.deepl.com/ja/translator)を使用しているという話は聞きましたが、今後は文生成や要約などのタスクに関しても機械にお世話になることが増えていきそうです。
生成モデルの弱点として、固有名詞に違和感があったり、同じ言い回しを繰り返したり、首尾一貫したテキストを生成できなかったりという問題があった印象ですが、それらの欠点は昨今の生成技術の進化を見ていると、今後いくつかのブレイクスルーで解消されるだろうと思いました。個人的には常識をもとに推敲を行うAIが鍵になると思うので、今後そのあたりも調べていきたいです。
OpenFOAMをM1 Macでビルドしてインストール

M1 MacでDocker使ってインストールするのではなくて，ビルドしてインストール方法のまとめ。

基本的にはMac用のpatchが公開されているので，それを使ってビルドすれば大丈夫です。

こことか
https://github.com/mrklein/openfoam-os-x
こことか
https://github.com/BrushXue/OpenFOAM-AppleM1

試しにOpenFOAM-8のビルド。
https://github.com/mrklein/openfoam-os-x
のOpenFOAM-8用のpatch使ったらビルドできました。

試しにblockMeshを実行すると

```bash
$ blockMesh 
dyld[8948]: symbol not found in flat namespace '_ompi_mpi_byte'
Abort trap: 6
```

ライブラリが見つからずに怒られました。Homebrewでopen MPIをインストールしたので，以下のライブラリ設定したら，実行できました。

```bash
export DYLD_LIBRARY_PATH=/opt/homebrew/lib
```

# 追記

export DYLD_LIBRARY_PATH=/opt/homebrew/libを設定しないと，ライブラリが見つからない件ですが，https://github.com/mrklein/openfoam-os-x のpatchの内容を一部修正することで，ライブラリのパス設定なしで動くようになりました。

etc/config.sh/mac/functionsの一部を以下のようにします。

```c++
    # Prefix to DYLD_LIBRARY_PATH and FOAM_DYLD_LIBRARY_PATH                    
    _foamAddLib ()                                                              
    {                                                                           
        while [ $# -ge 1 ]                                                      
        do                                                                      
            export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$1                      
            export FOAM_DYLD_LIBRARY_PATH=$FOAM_DYLD_LIBRARY_PATH:$1            
            shift                                                               
        done                                                                    
    }                       
```

オリジナルでは
```c++
    # Prefix to DYLD_LIBRARY_PATH and FOAM_DYLD_LIBRARY_PATH
    _foamAddLib ()
    {
        while [ $# -ge 1 ]
        do
            export DYLD_LIBRARY_PATH=$1:$DYLD_LIBRARY_PATH
            export FOAM_DYLD_LIBRARY_PATH=$1:$FOAM_DYLD_LIBRARY_PATH
            shift
        done
    }
```

でした。

## 追記2
OpenFOAM 8の場合，並列計算しようとすると計算が落ちます。
https://develop.openfoam.com/Development/openfoam/-/issues/1661
この辺りをみるとMacのSIPを無効にすればいいとかありますが，セキュリティ的にあれなのでやってません。
とりあえず，並列なしなら計算できるので，保留してます。

一方で，v2106ならここにあるようにパッチをあてれば並列計算可能な状態になります。
https://ttsyshmz.github.io/howtoFoam/post/build-openfoam-v2106-on-m1mac/
【初心者向け】Ruby on Rails 入門(1) Ruby on Rails  紹介

:::note info
この記事は読者が既にRubyとweb開発基礎内容を習得すると仮定
Ruby on Railsの使え方以外、Why(なぜ使う),What(何ができる),他のweb開発仕組みについてもそれぞれを説明します。
筆者は日本語の初心者ですから、もし記事の文法などが間違えたら、ぜひコメントして教えてください。
= w =
:::
# Ruby on Rails とは何？
名前の通り，Rubyを基づくのWeb frameworkである

Web frameworkというのは、一言に言うと「Web開発には必要な機能を予め用意したの枠組み」である。規定された基準の上で開発を行うと，開発効率やソフトウェア品質を向上することが期待られる。

**Ruby on Rails二つの原則**
1. DRY(Don't repeat yourself)同じコードを繰り返しないで
2. CoC(Convention over Configuration)設定よりも規約を優先する
## Ruby on Railsの Why(なぜ使う)
開発者として、Ruby on Railsの基準に従って、いろんなメリットがあります；
1. MVC:ビジネスロジック(model)と利用者インタフェース(view)を分離するため、バックエンドとフロントエンドの依存性を控える。MVCもRuby on Rails のDRY(Don't repeat yourself)原則に所属
2. ORM(Object/Relational Mapping):
ORMの例↓
```
# SQL文
select * from orders, users where orders.user_id = user.id and orders.status = "Paid" limit 5 order by user.id
# RoRの場合はこうになる
Order.where(:status = "paid").includes(:user).limit(5).order("id")
```
SQLが大嫌い！（じゃ無いよwww）SQL文をRuby on Railsで内臓して、読みやすいの上でコードの統合性と継続性を守る。
3. 開発効率が高い：アジャイル開発に適合する。同じ要件に対して、rubyの開発効率はJava系frameの三倍ぐらい。
4.共通認識が多い：開放的なコミュニティ
Slackのusers.list APIをElixirのHTTP ClientライブラリReqを使用して呼び出すことを楽しむ

**なにはがた短きあしのふしのまもあはでこの世をすごしてよとや**


---

Advent Calendar 2022 68日目[^1]の記事です。
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私の[Advent Calendar 2022 一覧](https://docs.google.com/spreadsheets/d/1HQvFjagQLRPjOYAjDVzWp9S4b8dKixxvvaz_TtbZWto/edit#gid=1723448955)。

[^1]: @kaizen_nagoya さんの「[「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 １日目　Most Breakthrough Generator](https://qiita.com/kaizen_nagoya/items/49ebebee3a0377f3b59b)」から着想を得て、模倣いたしました。 

---



# はじめに

[Elixir](https://elixir-lang.org/)を楽しんでいますか:bangbang::bangbang::bangbang:

Slackの[users.list](https://api.slack.com/methods/users.list) APIを[Elixir](https://elixir-lang.org/)のHTTP Clientライブラリ[Req](https://hexdocs.pm/req/Req.html)を使用して呼び出すことを楽しんでみます。

# プログラム

プログラム例を示します。
`user_oauth_token`は後述します。

```elixir:users_list.exs
Mix.install([:req])

user_oauth_token = "xoxp-xxxx"

headers = [
  "Content-type": "application/json",
  Authorization: "Bearer #{user_oauth_token}"
]

Stream.iterate(1, &(&1 + 1))
|> Enum.reduce_while({[], ""}, fn _, {acc_members, cursor} ->
  IO.puts cursor
  %{
    body: %{
      "members" => members,
      "response_metadata" => %{"next_cursor" => next_cursor},
      "ok" => true
    }
  } =
    "https://slack.com/api/users.list?limit=100&cursor=#{cursor}"
    |> URI.encode()
    |> Req.get!(headers: headers)

  {if(next_cursor == "", do: :halt, else: :cont), {acc_members ++ members, next_cursor}}
end)
|> elem(0)
```

どうでしょうか。

元気ですかー！
お楽しみいただけましたでしょうか！

# Slackアプリの作成

[Bolt for Python の入門ガイド](https://slack.dev/bolt-python/ja-jp/tutorial/getting-started)内にある「[アプリを作成する](https://slack.dev/bolt-python/ja-jp/tutorial/getting-started#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)」が参考になります。

Slackアプリを作成した後は、`OAuth & Permissions`の設定です。
`OAuth & Permissions`設定画面にて、以下のScopesを有効にしておいてください。

- `users:read`
- `users:read.email` （任意）

![スクリーンショット 2022-03-12 21.00.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/0d8a46d9-8ed7-ff5d-390c-6c8cb23b0295.png)



`OAuth & Permissions`設定画面内にある、`xoxp-`ではじまる`User OAuth Token`をプログラムで使用します。




---

# Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

この記事は、Slackの[users.list](https://api.slack.com/methods/users.list) APIを[Elixir](https://elixir-lang.org/)のHTTP Clientライブラリ[Req](https://hexdocs.pm/req/Req.html)を使用して呼び出すことを楽しんでみました。

:lgtm: やコメントは、励みになりますし、私はちょっぴりハゲています。

Enjoy [Elixir](https://elixir-lang.org/):bangbang::bangbang::bangbang:
<font color="purple">$\huge{Enjoy\ Elixir🚀}$</font>



以上です。
PythonでAzure Blob Storageを管理する

PythonでAzure Blob Storageの情報を取得するための備忘録。


### 準備1(接続文字列を取得)

1. [Azure portal](https://portal.azure.com/) にアクセスする
2. ストレージ アカウント メニュー ウィンドウの [セキュリティとネットワーク] で、 [アクセス キー]を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97314/18659be3-cd80-e90a-bb0f-7a21bc67212b.png)
3. [キーの表示]をクリックする
4. [接続文字列]をコピーする 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97314/7e45c5b5-d360-96e9-bc85-d06db487f848.png)

### 準備2(Python:azure-storage-blobのインストール)

```shell
$ pip3 install azure-storage-blob
```


### サンプル(コンテナー内の BLOB を一覧表示する)

```python
# -*- coding: utf-8 -*-
from azure.storage.blob import ContainerClient

AZURE_STORAGE_CONNECTION_STRING=""          # 接続文字列
CONTAINER_NAME =""    # コンテナ名

try:
    container = ContainerClient.from_connection_string(conn_str=AZURE_STORAGE_CONNECTION_STRING, container_name=CONTAINER_NAME)
    blob_list = container.list_blobs()
    for blob in blob_list:
        print(blob.name)

except Exception as ex:
    print('Exception:')
    print(ex)
```


### 参考

[クイック スタート:Python v12 SDK で BLOB を管理する](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-quickstart-blobs-python)
[python3]  [第二回]PythonでGUIアプリを作る

<strong>[第一回]PythonでTkinterモジュールを使ってGUIアプリを作る！。</strong>
前回→https://qiita.com/ad2009/items/3bcd42ccf2b63978079b
```md
環境
・Python3.10 64bit
・Windows11
```
今回は、ウインドウのサイズ変更や、テキストの表示をやっていきます。
# ウインドウのサイズ変更
ウインドウのサイズを変更するには、第一回の[Tkinterの基本]に加えて、
```python
tk.geometry("横x縦")
```
今回は試しに、５００ｘ５００にしてみました。
![スクリーンショット 2022-03-12 195705.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2581102/6bdf8e17-ce5d-84d7-f528-f8c6c54bcd68.png)
こうなると思います。
↓↓現在のプログラム全文↓↓
```python
import sys
import tkinter

tk = tkinter.Tk()
tk.title("title")
tk.geometry("500x500")
tk.mainloop()
```
# Tkinterのメイン要素
# １．label
Tkinterで言うラベルは、画面上のウインドウに表示するテキストのことです。
```python
label = tkinter.Label(text="Hello Tkinter!")
label.pack()
```
実行するとこんな感じです。
![スクリーンショット 2022-03-12 203626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2581102/e5b8a00a-2ec2-573f-3f2e-a564b5013e2e.png)
ダブルクォーテーションの部分を変えるとウインドウに表示されるテキストを変えることができます。
↓↓現在のプログラム全文↓↓
```python
import sys
import tkinter

tk = tkinter.Tk()
tk.title("title")
tk.geometry("500x500")
label = tkinter.Label(text="Hello Tkinter!")
label.pack()
tk.mainloop()
```
<strong>
次回は、文字の大きさの変更や、ボタンの表示をやっていきます。
</strong>

>（できればLGTMお願いします。）
HTMLの超きほん 〜HTMLってなに？〜

# HTMLってなに？
プログラミング初心者がはじめに学習するであろうHTMLのきほんについてまとめていきます。

## HTMLはマークアップ言語

HTMLは「HyperText Markup Language」の意味で、
マークアップ言語のひとつ。

マークアップとは、コンテンツに「タグ」と呼ばれるマーク（しるし）をつけて、
何かしらの意味付けをします。

ブラウザはタグ付けされた内容を理解し、
それぞれのコンテンツを適切に利用できます。

> **ブラウザ**
> ChromeやIE、SafariなどWEBを閲覧するためのソフト

# HTMLの構成要素

### タグ（tag）
意味付けする内容と、その範囲を決めるマークです。

範囲のはじまりを表すタグを「 **開始タグ** 」、
おわりを表すタグを「 **終了タグ** 」と呼びます。

### 要素（Element）
タグで囲まれた範囲を「 **要素** 」と呼びます。
HTMLはさまざまな要素の組み合わせで構成されます。

![0312-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323790/1426040a-b3c2-2cb7-ab89-fa2ab5a78018.png)


また、改行を意味するbr要素など、タグのみで構成される中身のない要素を「 **空要素** 」と呼びます。

> 空要素の場合、以下のようにタグを単体で使用します。
> ```html:html
> <br> <!-- 終了タグは不要 -->
> ```

### 属性（Attribute）
要素に対して、さらに細かな情報を設定するのが「 **属性** 」です。

属性は、開始タグの中に属性名と属性値をセットで記述します。

![0312-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323790/dc4c8ce1-2b53-ca33-6618-5f9a73543555.png)

# HTMLファイル
テキストエディタ（メモ帳でもOK）で記述し、拡張子を「.html」で保存すれば簡単にHTMLファイルを作成できます。

> **拡張子**
> ファイル名の最後に「.hoge」と記述する文字列。拡張子はそのファイルがどんな言語の種類か表す。

> **hoge**
> 意味をもたない例示用の文字列。氏名の記述例でつかわれる「山田 太郎」のようなもの。
> プログラミングの世界では他にも「foo」「bar」や「fuga」「piyo」などがある

## HTMLファイルの基本構造
```html:html
<!DOCTYPE html>  ...DOCTYPE宣言
<html>           ...html要素
  <head> head要素 </head>
  <body> body要素 </body>
</html>
```

### DOCTYPE宣言
最初に「 **DOCTYPE宣言** 」といって、HTMLの種類を明示します。
上記の例では「HTML5」という言語規格を指定しています。

### html要素
DOCTYPE宣言以外のすべてを包括する要素で、HTMLファイルにおける最上位の要素です。
後述するhead要素とbody要素から構成されます。

「 **lang属性** 」で使用する言語を明示します。
> **lang属性の例**
> ```html:html要素
>  <html lang="ja">
> ```
> 上記の例では、日本語（ja）を設定しています
>

### head要素
ブラウザには表示されない、HTMLファイルの設定や説明文を記述する要素です。

文書のタイトルや使用する文字コード、キーワードや説明文、読み込むCSSファイルの指定などを行います。

### body要素
コンテンツを記述する要素です。実際にブラウザに表示する中身を記述します。

body要素の中身は、見出しを表すh1〜h6要素や、段落を表すp要素など、さまざまな要素を入れ子状に組み合わせ構成します。

## 補足
さいごまでお読みいただき、ありがとうございます！

この記事はプログラミング初学者であるわたしが、毎日の学習ログとして書きました。
ご質問やご意見、間違いのご指摘などがあれば、気軽にコメントください。

また、平日にもくもく作業したり質問しあえる仲間も募集しています。
ご興味がある方は[Twitter](https://twitter.com/yutaka_pg)などでご連絡くださいー！

明日は、「各要素の具体的な使い方」についてまとめる予定です。
これからもどうぞよろしくお願いします:rabbit:
PythonでAzure Database for PostgreSQLに接続する

PythonでAzure Database for PostgreSQLに接続する備忘録。

### 準備1(接続情報を取得)

1. [Azure portal](https://portal.azure.com/) にアクセスする
2. サーバーの [概要] ページで、[サーバー名]と[管理者ユーザー名]を確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97314/0aea0e18-0dc5-716f-e741-ac37b8431df6.png)

### 準備2(Python:psycopg2のインストール)

1. pipで[psycopg2](https://pypi.org/project/psycopg2-binary)をインストールする


### サンプル


```python
# -*- coding: utf-8 -*-
import psycopg2

HOST = "<server-name>"      # [サーバー名]
USER = "<admin-username>"   # [管理者ユーザー名]
PASSWORD = "<admin-password>"   # パスワード

PORT = "5432"               # ポート
DB_NAME = "<database-name>" # DB名

if __name__ == '__main__':
    detabase_url = "host={} port={} dbname={} user={} password={}".format(HOST, PORT, DB_NAME, USER, PASSWORD)
    with psycopg2.connect(detabase_url) as connection:
        with connection.cursor() as cursor:
            sql = 'SELECT * XXX' # 実行したいSQL
            cursor.execute(sql)
            rows  = cursor.fetchall()
            print (rows)
```

### 参考

- [クイック スタート:Python を使用して Azure Database for PostgreSQL - Single Server に接続し、データにクエリを実行する](https://docs.microsoft.com/ja-jp/azure/postgresql/connect-python)
- [psycopg2.connect](https://www.psycopg.org/docs/connection.html)
- [cursor.execute](https://www.psycopg.org/docs/cursor.html#execute)
【粛清】Pythonで正規表現を使ってURLのパラメーターを消去する【正規表現を利用した置換】

# 背景（メキシコ風味）

URLにはパラメータというものがしばしばつきまとう。

くわしい説明は省略するが、そういったものはたしかにあるのだ。
（もしもURLのパラメータについて知りたければしらべろ。おれはお前のママではない。）

お前が普段つかう分には問題ないが、
記録や共有したいときなどに少しずつお前の心をむしばむだろう。
だからお前は、ときに「パラメータをブルシットしたい」などと考える。
そんなときに役立つのが正規表現だ。
（お前のパソコンのデリート=キーでも良い。デリート=キーをしらないやつは帰れ。）

また、お前はパイッソンでURLを使うこともあるだろう。
そんなとき、パイッソンで正規表現をつかうにはreというモジュールをインスコしなければならない。
もしかしたらお前はそれを知らず、いつまでもパイッソンの黒い画面（例えばの話だ。白い画面のブシェミも確かに存在するのだろう）のまえで終わらない仕事になげくことになるのだ。

そうならないためにも、俺はキーターをかくことにした。
（俺はいまだにQiitaのよみ方を知らない。マルチャンも[よく似た名前のせいひん](https://www.qtta.jp/)を出しており、お前もくべつがつかず眠れないナイトライフをすごしているだろう。お大事にしてください。）

もしもお前がこのような問題のかいけつ方法をしらべてここに来たのなら、
このシータはお前がメキシコをサバイブする助けになるだろう。

# 背景（簡単に）
例えばこれはAmazonで「protein」と検索した結果です。
https://www.amazon.co.jp/s?k=protein&crid=1ZC9C468MNZU3&sprefix=protein%2Caps%2C175&ref=nb_sb_noss

実は、「&crid」以降を取り除いてもちゃんとみれます。
https://www.amazon.co.jp/s?k=protein

こんな風に、不要なパラメータを取り除いてURLを短くしたいときに役立ちます。

自分は正規表現をたまにしか使わないので、すぐ見返せる備忘録としてここに記載します。

# ああああ.*$　←「ああああ以降の文字列」という正規表現

見出しのとおりです。

`特定の文字列`.*$
↑これで「`特定の文字列`以降の文字列」を指定できます。

# re.sub()　←正規表現を使った文字列の置換

`re.sub('検索対象の文字列','置換後の文字列','検索対象を含む文字列')`
↑　こ　う　や　っ　て　使　う　の　だ

Pythonでは正規表現を利用するのに`re`というモジュールが必要です。
インストールも忘れずに。

```re.sub()の使用例
import re

doman = '羅刹王髑髏烏帽子蘆屋道満'

print(re.sub('刹.*$', '',doman))
#羅
```

# （おまけ）replace()　←正規表現を使わない置換

Pythonで正規表現を使わず置換する場合、replace()メソッドを使う。
`検索対象を含む文字列.replace('検索対象の文字列','置換後の文字列')`

```replace()の例
print('そこで自爆です'.replace('そこで',''))
#自爆です
```


# 参考
考えるタケノコのブロゴ
https://kantake.hatenablog.com/
アクティビティのライフサイクル [Kotlin]

Androidアプリを作っていると、必ず学ばないといけないライフサイクル。
ここではアクティビティのライフサイクルについて簡単にまとめてみました。
*アクティビティとフラグメントのライフサイクルは違います。


# ライフサイクルとは

ライフサイクルの概念はAndroidアプリ開発にて必須になります。
ライフサイクルとは、
**画面の生成から、破棄までの一連の流れ** のことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1518643/7e6d52e5-ec00-ab6f-4952-170da8e09ef7.png)


# ライフサイクルの解説

### **onCreate()**
アクティビティにおいて、必ず実装しなければいけないメソッドです。
アクティビティが最初に起動されるときに呼ばれます。
**レイアウトの生成**や、**最初に1回だけ実行される初期処理**などがここで行われます。

### **onStart()**
アクティビティが生成される直前に呼ばれます。
何回も呼ばれる可能性があります。

### **onResume()**
画面を表示した回数と、onResume()を呼び出す回数は等しくなります。
画面が非表示になったとき、再度読み込む際もこのonResume()からスタートします。
画面に表示させるデータの設定などをします。

### **onPause()**
onResume()と一緒に使われることが多く、
カメラやハードウェアへのアクセスや、
大きなリソースを解放する時に使われる。

アクティビティAからアクティビティBを呼び出す場合、
アクティビティAのonPause()が完了するまでは、
アクティビティBの作成は始まらない。

そのため、onPause()で長時間かかる処理を書かないほうがいい。



### **onStop()**
アクティビティがユーザーから見えなくなった時に呼ばれる。


### **onDestroy()**
アクティビティが完全に破棄されるときに実行されるメソッドです。
onCreate()に対応して一度しか呼ばれることがありません。

# アクティビティの活動要求
onCreate()画面の生成
onResume()画面表示直前
〜画面表示中〜
onPause() 他アプリの割り込み
onStart() 画面非表示
onDestory() 画面の破棄

# 参考にしたサイト
https://qiita.com/kimto341/items/48ef6806d0866cd050d8
http://memento-mori-blog.com/android-activity-lifecycle/
Androidで端末の向きを特定するにはTYPE_ROTATION_VECTORが便利

# はじめに

ポケモンGOのAR+モードみたいに、端末の向きを知りたいなと思って調べたことを書きます。

# TYPE_ORIENTATION が廃止された話

端末の向きを調べたい！ ってことでググると、`TYPE_ORIENTATION` が廃止されたので、`TYPE_ACCELEROMETER` と `TYPE_MAGNETIC_FIELD` と `SensorManager.getRotationMatrix()` と `SensorManager.getOrientation()` を使いましょうって話が出てきます。

廃止の代替策だし、公式ドキュメントでも同様の話があるので、これがベストプラックティスなんだろうなと思って試してみました。

するとなんだがガタガタして安定しません。ローパスフィルタを通してみましたが、どうにも遅延せずに安定させる方法が見つかりません。

どうしたらいいのーーー？？？ と迷子になってしまいました。

# stardroidのソース

[Sky Map](https://play.google.com/store/apps/details?id=com.google.android.stardroid)（旧 Google Sky Map）という、プラネタリウムアプリがあります。端末を空にかざすと、その方向に見える星空を確認することができるアプリです。

試してみるとめっちゃ滑らかです。Sky Mapと同様の滑らかさを実現したい！

幸運なことに、Sky Mapはオープンソースになってて [stardroid](https://github.com/sky-map-team/stardroid) という名前で公開されています。ソースが見れればどのセンサーを使っているか分かる！

# ベストプラックティス

ということで調べてみたら、`TYPE_ROTATION_VECTOR` を使ってました。

4つの値で得られるので、たぶんクォータニオンです。

前述の `TYPE_ACCELEROMETER` と `TYPE_MAGNETIC_FIELD` を使うパターンでは、`SensorManager.getRotationMatrix()` で回転行列に変換していましたが、`TYPE_ROTATION_VECTOR` の場合は `SensorManager.getRotationMatrixFromVector()` で回転行列に変換できます。

# 分からないこと

端末によって搭載しているセンサーが千差万別です。

`TYPE_ACCELEROMETER` と `TYPE_MAGNETIC_FIELD` があれば、必ず`TYPE_ROTATION_VECTOR`があるのか、不明です。
stardroidでは`TYPE_ROTATION_VECTOR`がない場合に`TYPE_ACCELEROMETER` と `TYPE_MAGNETIC_FIELD` を使う処理があります。また、設定から強制的に`TYPE_ACCELEROMETER` と `TYPE_MAGNETIC_FIELD` を使うようにもできます。

`TYPE_ROTATION_VECTOR`に磁気偏角の補正がかかっているのか、利用側で補正しなきゃいけないのかわかりません。stardroidのソースをちゃんと見ればいいのですが、複雑過ぎて追いきれませんでした（涙目）

センサ精度の読み取りもよくわかっていません。巷のアプリでよく、「8の字に動かしてセンサの精度を上げましょう」みたいな表示を見たことがあるかと思います。その情報を拾おうとしたら、かならず精度が問題ない風に報告してくるので、どこで読み取っているんだろう？という疑問が解決してません。これもstardroidのソースをちゃんと見ればいいんですけどね（死んだ魚の目）
Excelのタスク管理リストを、Plannerに一括インポートする方法

# はじめに
Planner→Excel(PlannerのデータをExcelにエクスポート)は、Plannerからボタン操作で可能である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/4f4d6bb3-1669-0092-0f44-419b406e3c59.png)

一方で、Excel→Planner(ExcelのデータをPlannerに一括インポート)は、Plannerに用意されていない機能である。
そこで、一括インポートを可能にする解決策を簡単にまとめてみた。


# 解決策1：アドインを利用する
詳細は以下ページ参照

https://www.cdata.com/jp/kb/tech/msplanner-excel-trans.rst

# 解決策2：Power Automateを利用する
## 事前準備
1. Excelのタスク管理リストをテーブル化する
1. ExcelをSharePoint(ドキュメントライブラリ)又はOneDriveにアップロードする

## フローの作成
全体像は以下のとおり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/71b287d5-dee1-2414-ad6a-c4bb7783122f.png)

## フロー作成におけるポイント
### Excel上の日付データ(シリアル値)を日付形式に変換する
詳細は以下のページ参照

https://qiita.com/echolimitless/items/6f20d39838e2f32f5392

### 「説明」「チェックリスト」「添付ファイル」をPlannerにインポートしたい場合、`Update task details`アクションを利用する
「説明」「チェックリスト」「添付ファイル」は、`Create a task`アクションの中で扱えない。

### 「チェックリスト」を動的にインポートしたい場合、配列変数を利用する
詳細は以下のページ参照

https://tomriha.com/how-to-create-a-checklist-in-a-planner-task-with-power-automate/
[python3]  [第一回]PythonでGUIアプリを作る

<strong>[第一回]PythonでTkinterモジュールを使ってGUIアプリを作る！。</strong>
```md
環境
・Python3.10 64bit
・Windows11
```
# Tkinterの基本
```python
import sys
import tkinter

tk = tkinter.Tk()
#中身のコード
tk.mainloop()
```
実行するとこんな感じです。
![スクリーンショット 2022-03-06 193749.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2581102/e1f1633d-e747-76f0-344d-9ca7db3ee4d3.png)
<strong>
注意
絶対にファイル名を[tkinter.py]にしないでください。エラーで動かなくなります。
</strong>
# ウインドウのタイトルを変更
さっきのコードの[#中身のコード]と書いてある部分に
```python
tk.title("title")
```
と書き足してください。
ダブルクォーテーションの中身を変えればウィンドウのタイトルを自分の好きなように変えることができます。
すると、このようになります。
![スクリーンショット 2022-03-12 192901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2581102/67cbee84-9c33-b9ec-ea83-f3f01793cf14.png)
↓↓現在のプログラム全文↓↓
```python
import sys
import tkinter

tk = tkinter.Tk()
tk.title("title")
tk.mainloop()
```
<strong>
次回は、ウインドウのサイズ変更や、テキストの表示をやっていきます。
</strong>

次回→https://qiita.com/ad2009/items/79c14b3161255e3b28f0

>（できればLGTMお願いします。）
IBM Cloudの新マスタリー試験IBM Cloud Security Engineer v1 Specialtyを受けてみた

# IBM Cloud Security Engineer v1 Specialtyとは

IBMのマスタリー試験（特定製品スペシャリストの適格認定試験）の1つで、2022年2月から受験可能になりました。主にIBM Cloudのセキュリティ分野の専門性を認定する試験です。

<img width="160" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/49793925-f148-cf51-9698-224a51d4b023.png">

認定資格および試験の概要はこちら。

> https://www.ibm.com/training/certification/S0011100

# 学習方法

難易度はかなり高めです。下記サイトでラーニングパスが公開されていますので、一通り目を通すことをお勧めします。それでも難しいです。

> https://www.ibm.com/training/path/ibmcloudsecurityengineerspecialty

# 受験方法

PearsonVUE社のサイトで予約して受験してください。

https://www.pearsonvue.co.jp/Clients/IBM.aspx

以前は最寄りのテストセンターでしか受験できなかったのですが、最近はカメラ付きPCがあれば自宅でも受験可能になりました。こういうご時世ですので、可能であれば自宅での受験をお勧めします。ただし部屋の片づけはきちんとしておいてください。

# 合格点

44問中24問以上の正解で合格です。正答率は54%です。IBMさんの認定試験としては甘めですが、難易度が高かったので余裕は全くありませんでした。

# 出題内容

試験規約により具体的な問題文は書けませんので、雰囲気になりますが、いくつか問われそうな箇所を書きます。

* SCC (Security and Compliance Center)の役割、使い方、構成、レポート出力等
* Security GroupとACLの違い、シナリオに応じた適応方法
* Power VSとVPCの接続
* HyTrust CloudControl
* IAMのプラットフォーム権限、サービス権限、シナリオに応じた適応方法
* HPCS (Hyper Protect Crypto Service)の使い方
* OpenShiftやKubernetesのセキュリティ（PSP、Calico）
* Code Engineのクレデンシャル管理

# 感想

試験の難易度は高めです。正直、自信をもって回答できたのは数問だけでしたが、合格点の低さに救われた形になりました。これから受ける方は、トレーニングコースをきちんとやることと、SCCの設定と運用は実機で確認しておくのがいいと思いました。
Rust 言語仕様09 Unit test

続きまして、 Unit testについてです。

### まずはコードから

前提として、unitテストコードが書いてあるファイルを`main`ファイル取り込んである状態です。
```rust
mod tests {
    use super::*; // 階層が違いますので、*で全て取得します。
    #[test] // Unitテストの時に書くおまじないです。
    fn test_a_is_larger() {
        let a = Rectangle {
            width: 5,
            height: 5,
        };
        let b = Rectangle {
            width: 3,
            height: 3,
        };
        assert!(a.compare_area(&b)); // assert!はtureと評価されているかどうか知りたいときにしようします。
    }

    #[test]
    fn test_a_is_smaller() {
        let a = Rectangle {
            width: 3,
            height: 3,
        };
        let b = Rectangle {
            width: 5,
            height: 5,
        };
        assert!(!(a.compare_area(&b)));
    }

    #[test]
    fn test_double() {
        assert_eq!(6, double_value(3)); // assert_eq!は等しいかどうか確かめる
    }

    #[test]
    fn test_contains_name() {
        let res = greeting("rust");
        assert!(res.contains("rust"));
    }
}

```
AWSで利用できるNFSマネージドサービス

# はじめに
AWSには色々なストレージサービスがありますが、今回はNFSで利用できるマネージドサービスについて私見を述べたいと思います。
# 特徴
2022/3現在にAWSでリリースされているNFSマネージドサービスは以下の4つかと思います。

1. EFS
99.999999999 % (イレブンナイン) の耐久性と最大 99.99 % (フォーナイン) の可用性で設計（スタンダードの場合）されたフルマネージドなNFSサービス。分散システムのバックエンドには向くけど1サーバからの高速アクセスとかには向かない。書き込みが遅い(MAX 7,000iops)。**対応NFS verは4,4.1のみ**。**idmapに対応してない**。容量をほぼ気にする必要がない(大抵の場合OSが認識できるサイズまで書ける)。シングルゾーンなら結構安いので使えるならEFSを最初に検討すべき。

2. FSx for NetApp ONTAP
NetAppをAWS上で動かすマネージドサービス。前からEC2上で動くCVOとかはあったけど、これは完全にマネージドサービス。パフォーマンスティア(SSD)とキャパシティティア(S3?非公開)という考え方があり、SSDは最低1,024GBアサインする必要がある。最大容量176 PiB（ファイルシステムごとに最大 192 TiB）。CIFS、NFSv3、NFSv4.x、SMB v2.v3.1.1でアクセス可能。圧縮、重複排除機能あり。EFSのシングルゾーンよりは高いけどスタンダードよりは安い。マルチAZ配置可能。高速書き込みやIOパフォーマンスを必要とするワークロードに向いてる。

3. FSx for OpenZFS 
出たばかりであまり分からないけど、OpenZFSなので重複排除、圧縮効く。SSD前提なのでちょっと割高？OpenZFSって大量のファイルを消すと結構遅いイメージがあるけどどうなんだろ？

4. Storage Gateway
結構昔からあるS3をNFSやCIFSでアクセスできるEC2で動くマネージドアプライアンス。マルチAZでは組めない。速度は速くはない。

# EFS v.s. FSx for NetApp ONTAP
今回は、EFSとFSx for NetApp ONTAPのベンチマークを実施してみました。

・fioで32MB/128並列の読み書きテスト
・EFSシングルゾーン、パフォーマンスモード汎用、スループットモードバースト
・FSx for Net ONTAP SSD 1,024GiB、スループット128MB/s
・NFSクライアント AmazonLinux2 m5.large

|  | EFS|FSx|
|---|---|---|
| ランダムリード(io/s)|12,564|29,897|
| ランダムリード(KB/s)|50,258|119,591|
| ランダムライト(io/s)|3,887|35,463|
| ランダムライト(KB/s)|15,552|141,853|


※FSx for NetApp ONTAPは全部SSDに載ってしまっていると思うので、データがキャパシティティアにいってる場合はもう少し速度が落ちると思います。
※RHEL6にはBUGがあってNFSv4では速度でません。試しに、RHEL6.2のクライアントで試してみたところ、40%程パフォーマンスが落ちてました。

# まとめ
EFSは結構制約が多いのでそれでも問題ないならEFSを使う。無視して使うとひどい目に合うかも。パフォーマンス重視ならFSx for NetApp ONTAPなり、FSx for OpenZFSを使うことをお勧めします。

# 参考情報
[EFSのアクセス制御仕様](https://docs.aws.amazon.com/efs/latest/ug/accessing-fs-nfs-permissions.html)
[Amazon EFS のトラブルシューティング](https://docs.aws.amazon.com/ja_jp/efs/latest/ug/troubleshooting-efs-general.html)
[新サービス – Amazon FSx for NetApp ONTAP](https://aws.amazon.com/jp/blogs/news/new-amazon-fsx-for-netapp-ontap)
[Amazon FSX for ONTAP(NetAppドキュメント)](https://docs.netapp.com/ja-jp/occm/concept_fsx_aws.html)
PlantUMLからMermaidに変換できるサービスを公開した話

## 概要
最近githubが対応したことで熱を帯びてきているMermaidですが、従来使ってきたPlantUMLを使っているという方もまだまだ多いのではないでしょうか。
そこで、PlantUMLからMermaidへの変換サービスを実装しました。
[PlantUML -> Mermaid変換器](https://fumioc7.link/tools/puml_to_mermaid)

![スクリーンショット 2022-03-12 18.12.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223014/d2b58bda-b284-aa13-41b9-bdf6a5baf08f.png)


現在のところER図とシーケンス図のみに対応していますが、今後別の図にも対応予定です。

## 基本的な構造
変換時にやっていることは、以下のように
```
1. PlantUMLを構文解析して、JSのObjectに変換
2. JSのObjectをMermaidに変換
```
という流れです

![スクリーンショット 2022-03-12 18.18.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223014/3157996f-1a52-cbf2-48be-fa55bfdd72f7.png)

[サービスに落とし込む前](https://fumioc7.link/articles/txfflju6_q)は、PlantUMLからMermaidへの変換を一括でやってしまってたのですが、分割することでそれぞれの関数がそれぞれの役割に集中でき、コードがだいぶシンプルになりました。

PlantUMLの構文解析部分は、以下のように正規表現でそれぞれの行を解釈し、objectに落とし込んでいきます。

``` ts

    // analyze PlantUML text
    for (let line of lines) {
      if(line.match('(participant|actor|boudary|control|entity|database|collections|queue) .+( as .+|)')){ 
        //block
      } else if(line.match('(activate|deactivate) .*')){
        //activate or deactivate
      } else if(line.match('.+ ((<|).*-.*(>|)) .+ :.+')) { 
        // relation
      }
    }
```

プログラムを見て分かる通り、正規表現に当てはまらないものは、Mermaidに変換不可として取り除かれるようになっています。こうしてできた、「**言語の意味に関係ない情報を取り除き、意味に関係ある情報のみを取り出した構文木**」のことを **抽象構文木(AST)** というそうです（定義間違っていたらごめなさい🙇‍♂️ ）

## やっていて困ったこと
### MermaidのReactコンポーネントがNext.jsで使用できなかった
当初は[react-mermaid2](https://www.npmjs.com/package/react-mermaid2)を使って、図をリアルタイムレンダリングする予定でしたが、適用すると以下のようなエラーが...
```
Error: Must use import to load ES Module: /Users/hogehoge/index.js
require() of ES modules is not supported.
require() of /Users/hogehoge/index.js from /Users/hogehoge/node_modules/mermaid/dist/mermaid.core.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename index.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /Users/hogehoge/package.json.
```
調べたところ、ファイルの拡張子を`.mjs`にするか, package.jsonに対して、`type: "module"`を追記する必要があるということ

が、自分の場合にはそれで解決できなかったので、以下のように、変換が終わったタイミングで図を再renderingさせています。 (ここは後々解決したい...)
``` js
const svg = mermaid.mermaidAPI.render('hoge', mermaidText)
document.getElementById("svgCode").insertAdjacentHTML('afterbegin', svg)
```

## 今後
まだまだPlantUMLの構文解析の性能が低いので、さらに変換精度をあげられるようにプログラムを改変していきます 🔥
Rust 言語仕様08 Error Handling

今回はエラーハンドリングについてアウトプットしていこうと思います。

### ますはコードから
標準で用意されている`Option`と`Result`を使います。
Optionは想定していない値に対して例外処理を書くことができ、Resultはエラーが発生する可能性のある値に対するエラー処理を書くことができる

```rust
// Optionを使ったエラーハンドリング
// pub enum Option<T> {
//     None,
//     Some(T),
// }

fn division_option(x: f64, y: f64) -> Option<f64> {
    if y == 0.0 {
        None
    } else {
        Some(x / y)
    }
}

// Resultを使ったエラーハンドリング
// pub enum Result<T, E> {
//     Ok(T),
//     Err(E),
// }

fn division_result(x: f64, y: f64) -> Result<f64, String> {
    if y == 0.0 {
        Err(String::from("Not allowed !!"))
    } else {
        Ok(x / y)
    }
}
```

使ってみる

```rust
let res1 = division_option(5.0, 0.0);
match res1 {
    Some(x) => println!("Result: {:.3}", x),
    None => println!("Not allowed !!"),
}

let res2 = division_result(5.0, 1.0);
match res2 {
    Ok(x) => println!("Result: {:.3}", x),
    Err(e) => println!("{}", e),
}
```
RubyGoldの対策内容まとめ

3ヶ月ほど前にRubyGoldに合格したので行った対策等をまとめました。
# 受験者ステータス
- Railsを使った開発経験 2ヶ月程度
# 結果
94点/100点
# 対策内容
- [『公式教本』](https://www.amazon.co.jp/%E6%94%B9%E8%A8%822%E7%89%88-Ruby%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-Silver-Gold%E5%AF%BE%E5%BF%9C-Ruby%E5%85%AC%E5%BC%8F%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8/dp/4774191949) （おすすめ度★★★） 
 公式の本だけあって、丸々同じ問題が本番でいくつか出た。 
- [CTC模擬問題集 （おすすめ度★★★）]( https://www.school.ctc-g.co.jp/ruby/training_ruby_gold_01_10.html )
- [REx](https://rex.libertyfish.co.jp/ ) （おすすめ度★★★）
 毎回問題が変わるので、理解度チェックに最適（１０周以上やりました） 
- [メタプログラミングRuby 第2版](https://www.amazon.co.jp/%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Ruby-%E7%AC%AC2%E7%89%88-Paolo-Perrotta/dp/4873117437/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1RZBK41O92X0C&keywords=%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0ruby&qid=1647075689&s=books&sprefix=%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0+ruby%2Cstripbooks%2C226&sr=1-1)（おすすめ度★★☆） 
内容はすごく勉強になりました（完全には理解できていない）が、試験の難易度より高いので、ここまでやらなくても合格はできると思います。
- 合格した人、落ちてしまった人のブログを読む（おすすめ度★★★） 
上記ではカバーできていない問題や範囲があるので、それを確認すると良いです。 
例えば、正規表現の最短一致などが実際には出ましたが、上記問題集にはなく、ブログで出るという情報を得ていたので事前に勉強できて当日解くことができました。
※参考にしたサイト
[Ruby Goldに合格したので、勉強方法をまとめてみた(2020年11月版)](https://qiita.com/jonakp/items/c7b7ecfe3eb9ee8c950e)
対策が詳細にまとめられた素晴らしい記事でした。
「先人の残したブログで知識を補う(予想スコア: 85点以上)」の部分について、添付のリンクをしっかり目を通しておくと安心だと思います。 

# 勉強時間
3,4週間前から本腰を入れて毎日資格の勉強をしました。
# 受験時の状態
- 公式の教本の問題（30問＋50問）は全て答えられる。 
- CTCは全て答えられる 
- RExは安定して90点以上が取れる 
- その他暗記ものは直前に覚える（環境変数など）

# 感想
やはりSilverより難しかったです。Silverは知識を問われることが多いですが、Goldは理解を求めている印象でした。
結果94点は取れたものの、確信して回答できたものはそれほど多くなく、結果が出るまで緊張しました。

# 勉強して良かった点
- 継承などについて理解が深まりました。
- 実際に実務でもprivateメソッドの使い所で迷わなくなったり、「なぜこのメソッドがここで使えるのか」といったことが理解できるようになりました。