OmniAICreator/Qiita-1.07M huggingface dataset:
[Tabular Editor 2 Docs] Excelからテーブルをインポートする

# Tabular Editor 2 Docs

こちらはTabular Editor 2 Docs Advent Calendar 2022への投稿記事です。

https://qiita.com/advent-calendar/2022/tabulareditor2docs2022

2022年11月下旬ごろのDocsを日本語訳しています。
最新情報は公式ページ・公式リポジトリをご確認ください。

https://tabulareditor.com/

https://github.com/TabularEditor/TabularEditorDocs

# Excelからテーブルをインポートする

Excelワークシートをテーブルとして表形式モデルに追加する必要がある場合、Tabular Editor 2.xとExcel ODBCドライバーを使用すれば可能です。

## 前提条件

Tabular Editor 2.xは32ビットのアプリケーションで、多くの人は通常64ビット版のOffice（64ビット版Excel ODBCドライバーを含む）をインストールしています。残念ながら、Tabular Editor 2.xは64ビットドライバーを使用することができず、32ビットドライバーをダウンロードしてインストールしようとすると、すでに64ビット版のOfficeがインストールされている場合はエラーになります。しかし、この回避策を用いることで、64ビット版Officeの隣に32ビット版Excel ODBCドライバーをインストールすることは可能です。

1. 32ビット版のドライバーはこちらからダウンロードしてください。https://www.microsoft.com/en-us/download/details.aspx?id=54920
2. AccessDatabaseEngine.exeを解凍する
3. 中にaceredist.msiファイルがあります。このファイルはコマンドラインで /passiveスイッチを使って実行する必要があります。

  ```shell
  aceredist.msi /passive
  ```

4. ODBCデータソース（32ビット）の設定（Windowsのスタートボタンから「ODBC」を検索し、下のスクリーンショットのようにプラットフォームに「32/64ビット」と表示されているはず）を見て、インストールを確認します。

  ![Excel Odbc 32 64](../../images/excel-odbc-32-64.png)

## ODBCデータソースのセットアップ

上記のように32ビットODBC Excelドライバーがインストールされていることを確認した後、Tabular Editor 2.xでExcelファイルからテーブルを追加するには、以下の手順が必要です。

1. Tabular Editorで、モデルを右クリックし、"Import tables... "を選択、"Next "をクリックする
2. 接続のプロパティ "ダイアログで、"変更... "をクリックします。Microsoft ODBCデータソース "を選択し、"OK "をクリックする。
3. 接続文字列を使用する」を選択し、「ビルド...」をクリックします。Excel Files "を選び、"OK "を押します。
  ![Odbc Connection Properties Excel](../../images/odbc-connection-properties-excel.png)

4. テーブルをロードしたいExcelファイルを探し、"OK "をクリックします。すると、次のような接続文字列が生成されるはずです。

  ```connectionstring
  Dsn=Excel Files;dbq=C:\Users\DanielOtykier\Documents\A Beer Dataset Calculation.xlsx;defaultdir=C:\Users\DanielOtykier\Documents;driverid=1046;maxbuffersize=2048;pagetimeout=5
  ```

5. "OK"を押すと、Tabular EditorにExcelファイルのワークシートとデータ領域のリストが表示されるはずです。残念ながら、テーブルのインポートウィザードは無効なSQL文を生成するため、現在データをプレビューすることはできません。

  ![Import Tables Excel](../../images/import-tables-excel.png)

6. しかし、インポートしたいテーブルにチェックマークを付けることはできます。エラーメッセージを無視して、「インポート」をクリックしてください。
7. 新しく追加されたテーブルで、パーティションを見つけ、SQLを修正して、空のブラケットとワークシート名の前にあるドットを削除します。変更を適用する(F5を押す)。

  ![Fix Partition Expressions Excel](../../images/fix-partition-expressions-excel.png)

8. 次に、パーティション上で右クリックし、"Refresh Table Metadata... "を選択します。これでTabular EditorはODBCドライバを通じてExcelファイルから列のメタデータを読み込むようになりました。

  ![Refresh Metadata Excel](../../images/refresh-metadata-excel.png)

9. (オプション）テーブルへのデータ更新にODBCを使用しない場合は、パーティションを入れ替えて、同じワークシートデータをロードするMベースの式を使用する必要があります。これを行うには、テーブルに新しいPowerQueryパーティションを追加します（「パーティション」を右クリックし、「新しいパーティション（Power Query）」を選択します）。レガシー・パーティションを削除します。そして、新しいパーティションM式を次のように設定します。

  ```M
  let
      Source = Excel.Workbook(File.Contents("<excel file path>"), null, true),
      Customer_Sheet = Source{[Item="<sheet name>",Kind="Sheet"]}[Data],
      #"Promoted Headers" = Table.PromoteHeaders(Customer_Sheet, [PromoteAllScalars=true])
  in
      #"Promoted Headers"
  ```

  Replace the `<excel file path>` and `<sheet name>` placeholders with their actual values.

## 結論

ExcelファイルからのテーブルのインポートはTabular Editor 2.xでも可能ですが、上記のようにODBC Excelドライバーを使用する必要があり、若干複雑になっています。
個人開発しました

http://4card.me/
<img src="http://4card.me:8080/?mode=html&src=rJTRbpswFIbveYojS5k6qQHbUZSWAJq2m93sYuoTuKkBa8ZO7ZOQbMq7T4bQZCldetELhLG//z8/x5Yzv61g12jjc1IjrtMkads2bmexdVXCKaWJ31YEtkq2X+0uJxQoLDgFTimBVj1hnZMFpwRqqaoacxIWiszjXsviyy+5L51opAe0a2XgTwRQOtt0AwB0wvjSuibth1qgvKGTW5jO6eTzsmPsWqwU7lOg4fsAaK+JX0tZJ40O0Vmgxw2ibY6Z6OSa6duBPiaOC917Z4f4uO0HN6i2W+mUqf4Tya+Eljf3d73feOmeYZQfoegQRXHl7GbdsS/k1DpVKZOGTocnwMKoRqCyJj2lYfHcw6PFGmbxwoMypTIK5T/49Ek5ueqFQqN0RgQiVEa5w/6PrMFpKRql9yl8et5YXH6zjVrBgzAefjz0U7fghfFTL50ql4PKq98yBUbpetfNKa1TqJyUpq9RdwXOwveHn8X8mJzG3Ac0lpfky6k8h+c9rNk1X3YE+Tts2WBrr7kesz4rheKSHY7taVd4vAh8lvRXQFbBSgvvc9LtOSmybgd2OWGUwD4nd3MyEN1KTYrvWRKGJ/R+HJWkkJcom4+zmpFCv4LfMNZ8BOazcdiSwl6yMzrOdj0kxc/wGjRJVWThki3+BgAA//8=" />

こんな感じでsvgを作ることができて、いろいろなところに貼り付けられます
githubのapiからユーザー情報を使うこともできます

https://github.com/chihiro-yabuta/cardme

starやPRどしどし待ってます！
Outliner上の順番を整理したい

アウトライナー上での並び順がぐちゃぐちゃだと
やる気が削がれてしまうので綺麗にしたい。

設計
--

https://help.autodesk.com/cloudhelp/2022/JPN/Maya-Tech-Docs/CommandsPython/reorder.html

こちらを使ってみようかと思います。

一番前に移動させるか、一番最後に移動させるか、相対的に移動させるか
だけなので

ソートしたlistを作成し、頭から順に末尾に移動させていこうかと思います。

とりあえず実装
--


``` python
def sortOrder(targets):
    sortTargets = sorted(targets)
    for target in sortTargets:
        cmds.reorder(target, b =True)

targets = cmds.ls(sl = True)
sortOrder(targets)
```

**before**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/8ec678cb-1a59-4f15-a6ac-d474e8fe489a.png)

**after**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/6e197b2c-375d-07f5-60c1-d908ae06650a.png)

とりあえず、ソートできた。


ここで疑問
-
 
- shapeノードとかってどうなるんだろうか？

**before**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/b17824b9-6116-4af1-7500-1a94cd442602.png)

**after**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/e622cf24-2d7c-1012-ff35-11a756ebaf77.png)

なるほど、shapeノードもreorderできるのか。
これはこれで何かちょっと避けたい。
選択しなきゃ良いのだけれども、うっかり選択はあり得る。

- 別階層の物を選択するとどうなるんだろうか？

**before**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/0beb2cf7-12f3-c5eb-48c5-abc812a7884b.png)

**after**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/79376ad7-b1dd-cd5c-716e-b215b930ddfa.png)

各階層毎の末尾に送られるから、一見問題は無さそう。
状況によっては望まない結果になりそうな気はする。

課題
-

- 部分的にソートとかしたい
- ルートの階層つかんで、一気に各階層でソートとかしたい

だって面倒なんだもの

続編に続きます。
[Tabular Editor 2 Docs] FormatDaxの非推奨

# Tabular Editor 2 Docs

こちらはTabular Editor 2 Docs Advent Calendar 2022への投稿記事です。

https://qiita.com/advent-calendar/2022/tabulareditor2docs2022

2022年11月下旬ごろのDocsを日本語訳しています。
最新情報は公式ページ・公式リポジトリをご確認ください。

https://tabulareditor.com/

https://github.com/TabularEditor/TabularEditorDocs

# FormatDaxの非推奨

Tabular Editorで利用可能な[ヘルパーメソッド](/Advanced-Scripting.md#helper-methods)の1つである `FormatDax` メソッドはTabular Editor 2.13.0のリリースで非推奨とされました。

非推奨になった理由は、https://www.daxformatter.com/ のウェブサービスで、複数のリクエストを連続して行うと負荷が高くなり、その結果、ウェブサービス側で問題が発生するようになったからです。これは、`FormatDax`メソッドがスクリプト内で呼び出されるたびにウェブリクエストを実行するためで、多くの人が以下のようなスクリプトを使用してきました。

**やめてくれ！**

```csharp
foreach(var m in Model.AllMeasures)
{
    // DON'T DO THIS
    m.Expression = FormatDax(m.Expression);
}
```

これは数十のメジャーを持つ小さなモデルでは問題ありませんが、www.daxformatter.comのトラフィックを見ると、上記のようなスクリプトが数千のメジャーを持つ複数のモデルにわたって、一日に数回でも実行されていることがわかります。

この問題に対処するため、Tabular Editor 2.13.0では、上記の構文で `FormatDax` が連続して3回以上呼び出されると警告を表示するようにしました。さらに、それ以降の呼び出しは、各呼び出しの間に5秒の遅延を設けて、スロットルされます。

## 代替構文

Tabular Editor 2.13.0では、FormatDaxを呼び出す方法が2種類導入されています。上記のスクリプトは、以下のどちらかに書き換えることができます。

```csharp
foreach(var m in Model.AllMeasures)
{
    m.FormatDax();
}
```

...いや、単に...:

```csharp
Model.AllMeasures.FormatDax();
```

これらのアプローチは、すべての www.daxformatter.com の呼び出しを一回のリクエストにまとめます。お好みでグローバルメソッドの構文も使用できます。

```csharp
foreach(var m in Model.AllMeasures)
{
    FormatDax(m);
}
```

...いや、単に...:

```csharp
FormatDax(Model.AllMeasures);
```

## 詳細はこちら

技術的には、`FormatDax` は2つのオーバーロードされた拡張メソッドとして実装されています。

1) `void FormatDax(this IDaxDependantObject obj)`
2) `void FormatDax(this IEnumerable<IDaxDependantObject> objects, bool shortFormat = false, bool? skipSpaceAfterFunctionName = null)` となります。

上記のオーバーロード#1はスクリプトの実行が完了したとき、あるいは新しい `void CallDaxFormatter()` メソッドの呼び出しが行われたときに、与えられたオブジェクトをフォーマットするためキューに入ります。オーバーロード #2は、単一のWebリクエストで www.daxformatter.com を直ちに呼び出し、列挙可能なすべてのオブジェクトに対してすべてのDAX式をフォーマットします。これらのメソッドのいずれかを、適切と思われる方法で使用できます。

新しいメソッドは、文字列の引数を取らないことに注意してください。このメソッドは、提供されたオブジェクトのすべてのDAXプロパティを考慮してフォーマットします (メジャーの場合はExpressionおよびDetailRowsExpressionプロパティ、KPIの場合はStatusExpression、TargetExpression、およびTrendExpressionなどです）。
NestJSでGuardsのテストを書く

日本語記事はあまりヒットしなかったので、メモ。
調べたところ、いくつかアプローチはありそうでした。

## テスト用のモジュールに組み込んでアプリを起動しe2e的にテストする

https://github.com/nestjs/nest/blob/master/integration/hello-world/e2e/guards.spec.ts

```typescript
function createTestModule(guard) {
  return Test.createTestingModule({
    imports: [AppModule],
    providers: [
      {
        provide: APP_GUARD,
        useValue: guard,
      },
    ],
  }).compile();
}

describe('Guards', () => {
  let app: INestApplication;

  it(`should prevent access (unauthorized)`, async () => {
    app = (await createTestModule(new AuthGuard())).createNestApplication();

    await app.init();
    return request(app.getHttpServer()).get('/hello').expect(401);
  });
});
```

nestjsのサンプルコードのテストになります。
特にモック等を使うこともなく、一番シンプルな方法だと思います。

複数のGuardsを利用する場合等を考えると、実際にリクエストするという点ではユースケースと合わないテストを書くことになります。モジュールの単体テストにする方がより良いと思います。

## リクエストを自力でmockして単体テストする

https://stackoverflow.com/questions/59767377/how-can-i-unit-test-that-a-guard-is-applied-on-a-controller-in-nestjs

```typescript
const mockExecutionContext: Partial<
  Record<
    jest.FunctionPropertyNames<ExecutionContext>,
    jest.MockedFunction<any>
  >
> = {
  switchToHttp: jest.fn().mockReturnValue({
    getRequest: jest.fn(),
    getResponse: jest.fn(),
  }),
};
```

テスト対象となる `canActive()` メソッドはbooleanになるためmockに対して何が呼ばれたか期待するテストを書くことになります。

必要なものを必要なだけ毎回自力で作る方法になります。場合によっては冗長になる？

## NestJSのテスト用のライブラリを使ってリクエストをmockして単体テストする

https://stackoverflow.com/a/67496582

```typescript
import { createMock } from '@golevelup/ts-jest';
import { ExecutionContext, UnauthorizedException } from '@nestjs/common';

import { AuthenticatedGuard } from '@/common/guards';

describe('AuthenticatedGuard', () => {
  describe('canActivate', () => {
    it('should return true when user is authenticated', () => {
      const mockContext = createMock<ExecutionContext>();
      mockContext.switchToHttp().getRequest.mockReturnValue({
        // method attached to `req` instance by Passport lib
        isAuthenticated: () => true,
      });

      const canActivate = authenticatedGuard.canActivate(mockContext);

      expect(canActivate).toBe(true);
    });
  });
});
```

利用するのは `@golevelup/ts-jest` で、Guardに渡すcontextをmockします。
自力で書くよりはシンプルに書ける印象です。

NestJS公式のライブラリではありませんが、

>  A collection of Badass modules and utilities to help you level up your NestJS application.

というだけあり、 https://github.com/golevelup/nestjs の配下に `ts-jest` の他にも便利そうなライブラリが多くあり興味を持ちました。

## 実際に利用したもの

3つ目に書いた `@golevelup/ts-jest` を利用しました。
JWTを検証・デコードした結果をリクエストに入れて後段に渡したりする場合、1つ目の方法だとセットしたことをテストできません。
また自力でリクエストのmockを書くのもの辛かったため、3つ目の方法を採用しました。

どれにするかは実装やケースによると思いますが、参考になれば。
[Tabular Editor 2 Docs] よくある質問

# Tabular Editor 2 Docs

こちらはTabular Editor 2 Docs Advent Calendar 2022への投稿記事です。

https://qiita.com/advent-calendar/2022/tabulareditor2docs2022

2022年11月下旬ごろのDocsを日本語訳しています。
最新情報は公式ページ・公式リポジトリをご確認ください。

https://tabulareditor.com/

https://github.com/TabularEditor/TabularEditorDocs

# よくある質問

## Tabular Editorとは何ですか？

基本的に、Tabular EditorはAnalysis Services Tabular Modelを構成するメタデータを編集するためのUIを提供します。モデルの編集にTabular Editorを使う場合とVisual Studioを使う場合の主な違いは、Tabular Editorは_data_をロードしないことです - _metadata_のみです。つまり、メジャーや表示フォルダーなどを作成および変更する際に、検証や計算が行われないということです。検証や計算は、ユーザーが変更をデータベースに保存することを選択したときにのみ実行されます。これは、Visual Studioでの作業が遅くなりがちな中型から大型のモデルに対して、より良い開発者体験を提供します。

さらに、Tabular Editorには多くの[Features](ja-Features-at-a-glance.md)があり、一般的に生産性を高め、特定の作業を容易にできます。

## なぜSSAS Tabularにさらに別のツールが必要なのか？

Analysis Services Tabularで作業する場合、SQL Server Data Tools (Visual Studio), [DAX Editor](https://www.sqlbi.com/tools/dax-editor/), [DAX Studio](https://www.sqlbi.com/tools/dax-studio/), [BISM Normalizer](http://bism-normalizer.com/) や [BIDSHelper](https://bidshelper.codeplex.com/) にすでに慣れているかも知れません。これらはすべて優れたツールで、それぞれ独自の目的を持っています。Tabular Editorはこれらのツールに取って代わるものではなく、むしろこれらのツールを補足するものと考えるべきでしょう。なぜTabular Editorが正当化されるのか、[Features at a glance](ja-Features-at-a-glance.md) articleをご覧ください。

## なぜTabular EditorはVisual Studioのプラグインとして利用できないのですか？

Visual Studio内でTabular Modelsを扱うためのより良いユーザー体験は間違いなく評価されますが、スタンドアロンツールはプラグインよりもいくつかの利点を提供します。まず第一に、Tabular Editorを使うのにVisual Studio/SSDTのインストールは**必要ありません**。Tabular EditorはAMOライブラリのみを必要とし、VSと比較して非常に小さなインストールで済みます。次に、TabularEditor.exeはデプロイ、スクリプトなどのコマンドラインオプションで実行可能で、これは.vsix（プラグイン）プロジェクトでは不可能なことです。

また、特筆すべきは、Tabular Editorは[standalone .zip file](https://github.com/otykier/TabularEditor/releases/latest/download/TabularEditor.Portable.zip)としてダウンロードできます。つまり、何もインストールする必要がないのです。言い換えれば、Windowsマシンの管理者権限がなくてもタブラーエディターを実行することができるのです。zipファイルをダウンロードし、解凍してTabularEditor.exeを実行するだけです。

## 今後のリリースではどのような機能が予定されていますか？

現在のロードマップは[こちら](ja-Roadmap.md)でご覧になれます。
MacにてRubyのアップデート方法

MacにてRubyをアップデートする際に参考にした記事を共有します。
Cocoapodsが上手くインストールが出来ない方など参考にして頂けたらなと思います。

新品のMac製品にはRubyはインストールしてありましたが、バージョンが古いままでした。
教材を学習中にCocoapodsのインストールが必要になりその際にRubyのアップデートが必要になり、試みました。
この記事が参考になりましたので、共有させて頂きます。
https://nomad.office-aship.info/macos-rbenv/

現時点2022,11/27日現在では
rbenv install --listを行った際に下記のように表示されたのでrbenv install 3.1.2 →  rbenv install 3.1.3 に変更しました　　　　　　
2.7.7
3.0.5
3.1.3

  
あとは手順通りで問題なかったです。無事最後にはバージョンアップできました。
わかりやすい記事ありがとうございました。
  
  $ ruby -v   
ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e) [x86_64-darwin21]

　 $ bundle -v
Bundler version 2.3.26


＃＃終わりに
今までターミナルに触れる機会がなくまだ把握しきれていないことが多いです。
今後も使用頻度は増えるとい思いますので、要学習かなと思います。


今回出てきたrbenvについて(google引用)
rbenv とは？ rbenv とはバージョンの異なるrubyをまとめて管理するツールのことです。 さらに任意のバージョンにいつでも切り替えられるようになるため任意のバージョンで Ruby を使うことができます。
Pafishのインストール方法

# はじめに
Pahishインストールの備忘録。

## Pafishとは
マルウェア解析環境をテストするツール。
特にアンチVM機能のマルウェアが多いので仮想環境では基本動作しない。
従ってそれ対策用(アンチアンチVM)の環境を作る必要があるのだが、Pafishはその際に利用するテストツールという位置づけ。

## 想定環境
OS : windows10
Arc: 64bit

# インストール方法

## 1.Cygwinのインストール
PafishのGithubリポジトリを見たところ、Windows環境上でのコンパイルにはCygwinが推奨されていた。
推奨コンパイルツール：
![reccomend_compile_tool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092823/220cfc9d-cfe8-2e77-e87c-aee25cb3152f.png)


なので、Cygwinをまずインストールする。
※ Cygwinインストール&必要なパッケージが入っている場合、1.はスキップ

インストール方法は以下のサイトを参考に。
[Cygwinインストール方法](https://www.sw.it.aoyama.ac.jp/2011/CP1/cygwin/) <br></br>
またCygwinインストール時に以下のパッケージにチェックを入れる。
+ make
+ mingw64-i686-gcc-core
+ mingw64-x86_64-gcc-core

具体的にはこんな感じ。
##### make：
![make.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092823/41001de4-281e-4ae2-56bc-6b3972b45dbd.png)

##### mingw64-i686-gcc-core：
![mingw64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092823/4ac95153-2a25-97b3-070b-477cc394cbb2.png)

##### mingw64-x86_64-gcc-core：
![mingw64-i686-gcc-core.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092823/08b8331b-edea-7f40-2d35-ca665e71cf1e.png)


## 2.Githubからソースのダウンロード
Cygwinのインストールが終わったら次にPafishのソースをダウンロードする。
[Githubリポジトリ](https://github.com/a0rtega/pafish)


## 3.コンパイル
Cygwinを起動し、"Makefile.linux"があるディレクトリまで移動。
CygiwinではCドライブへ移動する際、path指定に注意が必要。
```shell
# pathは環境に応じて置き換え必要
cd /cygdrive/c/Users/user/Desktop/pafish
```

以下のコマンドでコンパイルする。
```shell
make -f Makefile.linux
```

以下のpathにexeが出力されればおｋ。
![output-exe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092823/395d4e26-b003-f7ea-fa28-7a51d5e74345.png)



# Pafishの使い方
使い方はとても簡単。
.exeをクリックして実行するだけ。
##### 実行後：
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092823/156fa5eb-e5e8-f658-c819-7fe6f0623b55.png)


"traced!"はVMとして検知されている要素となる。
従って、マルウェア解析環境を作っていく上ではこの要素を潰していくことになる。
英語教材アプリabceedを使った感想

# 概要
英語教材アプリのabceedでセールをやっていたのでサブスクリプション登録してみました。
今回はしばらく使ってみた感想を共有していきたいと思います。


# abceedとは

株式会社Globeeがリリースしている英語学習アプリです。
なとあの金フレ（TOEIC L&R TEST 出る単特急金のフレーズ）が教材に含まれています。
個々の教材を個別に購入することも出来ますし、サブスクリプション形式で月額料金を払えばabceed上のすべての教材とtoeic模擬試験など便利なサービスを無制限に受けることが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/3349cee5-c630-d81e-7226-9a88c5c89491.png)

# 私の評価
すごくいいと思います。
Toeicや英検向けの教材が揃っていますし、教科書、音声、テスト、単語帳などあらゆる点を網羅しています。
ただipadとapple pencilがあってこそ真価を発揮するかと思います。


# いい点
・問題に対して忘却曲線を考慮した出題を選択することができるのがすごい
これによりより効率的な学習が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/46e181a2-60a9-b545-5d99-7126011a412b.png)

・教材がすごい
金フレはもちろんのこと、過去問などがものすごい数あります。普通にやって終わる量ではないですし、レベルに合わせた問題も取り揃えています。
さらに文法問題を含め多くの問題に音声が用意されておりリスニングありきの楽手が可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/144dda4b-e55b-113a-9a30-5f4c1c1caf44.png)

・模擬テストがすごい
時間がない時でも、出題数を調整して模擬テストを行うことが出来ます。
その結果Toeicなどでどれくらいの点数が取れるかを事前に知ることが出来ます。
もちろん間違った問題は記録されるので、復習もばっちりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846650/415153b8-2c9b-5497-b6d8-617979da9832.png)



# 悪い点
・音声の再生に難点あり
普通に問題を解くだけならいいのですが、特定の部分に移動したりリピートとしたりする機能が使いづらいです。
ただmp3は別途ダウンロードできるので、自分はmp3をaudipo（androidアプリ）で再生しています。

・試験対策向けの教材がほとんど
Toeicや英検向けの教材がほとんどのため、映画用の音声や日常会話を目的とした勉強は難しいと思います。
あくまでも試験対策に特化したアプリだと感じました。

# おすすめの使い方
ipadのGoodNotes（iosの有料アプリ）と組み合わせることによって、紙の問題集のように使用できます。
取り込み方法はググれば出てきますが、assistive touch でスクリーンショットを取れるように設定しておけば非常に簡単にできます。

# 終わりに
しばらくはabceedを中心に学習していこうと思います。
もちろんyoutubeやその他教材も併用しつつ飽きが来ないよう楽しんでやっていきます。

ご参考になれば幸いです。
【SEO】h1は必ず1つでなくても良いが、気を付けたいポイント

今回はSEOのお話です。

SEOは、「検索エンジン最適化」の略です。
簡単に言うと、Google検索した時にホームページだったり記事だったり、自社のサイトのページを検索の上位に表示するための方法です。
方法と言っても、「こうすると良い」と言われているいくつかの書き方（ルール？）・サイトの作り方があります。

ホワイトハットSEO、ブラックハットSEOという言葉もありますが、そこをじっくり話すと長くなるので今回は割愛しています。

今回は、「h1タグはページ中に1つしか設定できないのか？」をテーマに書いています。
SEO初心者だったりすると、このあたりは曖昧で分かりにくい部分かと思います。
なので、私なりに「h1タグはこういう風に扱うと良いですよー」と思っていることをまとめます。

## h1タグはページ中に1つ以上あっても良い
**結論から言うと、h1タグはページ中に1つ以上あっても問題はありません。**

実際、ページを作成していると、ヘッダーにサイトのロゴが入りますし、ページのタイトルもh1タグで作成することが多いです。（この段階で、h1タグはページ上に2つ存在しますね）

なので、ページなり、記事なりの中でh1タグが複数存在することは特に気にすることではないです。
実際、h1タグが複数あるページでもGoogle検索で上位に表示されています。

ただ、気を付けたいポイントがあります！！

それは・・・

## h1、h2、h3などHTMLの記述的に正しくコーディングする必要はある

です。
h1が複数あっても良いですが、**HTMLの記述ルールは守りましょう** ということです。

具体的に書くと

:::note
* h1の次にh2タグが来ること
* h1の次にh3やh4が来ないこと
* h1とh2は文章の構成でも親子関係であること
* ページのタイトルにh2を設定しないこと（設定した場合は、それ以降はh2以降のみ使用すること）
:::

どんなに良いコンテンツをまとめたページを作成しても、Google検索の順位を決定するのはGoogleが使っているロボットです。（クローラーと言います）

ロボットがページを確認するわけですから、文章や人が理解しやすい流れになっているかは配慮されません。（多少は見られていると思いますが）
**HTMLの記述ルールとして、「読みやすいページかどうか？」を見られています。**

なので、「ロボットが見て、分かりやすいページとして作成していること」は、SEOの観点からすると押さえておきたいポイントですね。
実際、ホームページ、ECサイトの開発の場では、このことを意識していない現場もあったりします。
（今の時代はある程度CMSやフレームワークで補えたりしますが・・・笑）

### さいごに
システム開発だから、SEOは関係ない。

ではなく、システム開発もできるし、SEOもできるスキルを身に付けたいですね。
これはSEO以外でも当てはまりますけどね。
PC 操作を効率化して、カップラーメンをたべる時間を捻出しよう

会社のチーム内で各々が図っている効率化の Tips を共有しよう！となったので考えてみた。
さらにその効率化で、浮いた時間でカップラーメンを食べようというのが目標だ。

## よく使うコマンドは環境変数に登録しておく

業務でよく使うコマンドは最速で実行できるようにしておくと、カップラーメンにお湯を注ぐ時間が捻出できる。

例えば、自分は下記のようなコマンドをよく使う。

```shell
yarn install ※12文字(スペース含む)
yarn run dev ※12文字(スペース含む)
git clone <URL>
git branh ※9文字(スペース含む)

※自分しらべ
```
このコマンドを打つには、いったいどれくらい時間がかかるだろうか。
時間を無駄にしないためには、これらのコマンドをタイプミスなく毎日何度も完璧に打ち込まないといけない。

しかもタイプミスした場合は、[Del]キーを押下しないといけない。
さらにタイプミス → [Del]キー → タイプミスと考えると・・・タイプ時間が指数関数的に増えてしまう。
これでは麺も指数関数的に伸びてしまう。

ネットで自分のタイピングスピードの統計を取得してみた。

```
一文字あたり 0.2422... 秒
誤入力確率 4%
```

らしい。

例えばコマンドが `yarn run dev` (12 文字)なら、

```
12文字 : 約 2.91 秒
タイプミスなく入力できる確率 : 12 ^ (1-0.04) = 61.3%
(※キーの配置や入力慣れしている文字列等を考慮すれば実際はこんな確率にならないが...)
```

自分はこのコマンドを `yd` で実行できるようにパソコンの環境変数に登録している。
実際に `yd` と打つだけで、 `yarn run dev` と実行される。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455026/7013bf57-eba0-fcd1-a258-110886784b32.gif)

2文字になった結果、どれくらい効率アップしただろうか
```
2文字 : 約 0.48 秒
タイプミスなく入力できる確率 : 2 ^ (1-0.04) = 92.2%
```

一回あたり 2.43 秒あたり早くなった。しかも入力精度も 30.9 % 向上している。

他にもいろんなコマンドを登録してけば、時間が短縮できるだろう...


https://qiita.com/JeffSeid/items/d9806140a887a86d99b7

## デスクトップを整理する

長年開いていないファイルがデスクトップに散らばってないだろうか。
ここ一年間、開いていないファイルがデスクトップに堂々と鎮座してないだろうか。
ファイルを探す時間がもったいないので、整理しましょう。

## URL を覚える

いつもおなじみのサイトを開くとき、どのような動作をしていますか？
マウスを操作し、ブックマークを開いてないですか。

マウスを使わず、URL を打ち込み、直接サイトへ行っちゃいましょう。

```
ブラウザ上でURL入力モードにする : [Ctrl] + [L]
```

ブラウザは優秀で、いままで開いたサイトをよく覚えています。
URL バーに開きたいサイトのドメインを入力すれば、だいたい候補が出てきます。
URL の文字列をすべて覚える必要はなく、一部を覚えておけば結構便利だ。

## アプリは検索ボックスで立ち上げる
アプリを開くとき、どのような動作をしていますか？

マウスを操作し、

- 大量にお気に入りされたタスクバーから選んでますか。
- それとも立ち上げていたツールを一旦最小化しデスクトップから立ち上げていますか。

マウスを使わず、検索ボックスから検索して立ち上げればキーボードからマウスへ手を移動する時間が削減できます。
こちらもアプリ名の 1、2 文字打てば検索で出てきます。

```
検索ボックス立ち上げ : [Win] + [S]
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455026/1974ce9f-7d32-4590-991f-a994b8f26abc.jpeg" width="70%">

---
実践するもよし、実践しないもよし、実践してやっぱりやめるもよし。
少々偉そうになってしまいすみません。


ふぅ今からカップラーメンを食べてくる。。。

### ツールの紹介

- markdown でメモをとる

コマンドなどのメモは、メモ帳ではなく markdown 対応のツールで管理しておくと、見やすくとても便利だ

[Simplenote](https://simplenote.com/)
[Boost Note](https://boostnote.io/) ※有料
魔法の数字３

Mentalistというテレビ番組がある。　

占いで「３」という数字が関係あるという宣告に対して、登場人物が
「３」という数字はどこにでもある数だから占いにならないと反論していた。

どの数字が魔法の数字にふさわしいか、プログラミングの観点で検討したい。

## 魔法の数字 0

0は数字の王様だろう。0で割ると無限大になる。　

四則演算で０だけが鬼門だ。　

ある数字に０を足してもそのまんま、０を引いてもそのまんま、加算と減算の基本的な数値だ。

## 魔法の数字 1
離散計算機では0と1から成る場合がある。　
ある数字に１をかけてもそのまんま。乗算の基本的な数値だ。 

## 魔法の数字２　

どんな整数にも２をかければ偶数になる。　

## 魔法の数字３　
１桁の数字で３の倍数は３、６、９。　
２桁の数字で３の倍数は、１桁目の数字と二桁めの数字を足して３の倍数になれば、３の倍数。足した数字が２桁になれば、またその数の１桁目と２桁目を足して、３の倍数にはれば３の倍数。　
ここに来て、なんか魔法の数字らしくないだろうか。

# 3次元空間、３軸　

どんな現象も一次元で考えるよりも、３次元で考えた方が、使い回しがしやすいかもしれない。　

## 過去、現在、未来　
時間も、過去と現在と未来の３つを分けて考えると面白いことがある。　

## 三方よし　
自分、相手、社会のように、３つの集合で考えると、何をすると、どこに影響があるかを立体的に考えられるようになるかもしれない。　

## 底上げ、流行、最先端

最先端の技術は、お金になりにくいことがある。　
一発当てれば、すごく大きい。　
当たる確率は低い。　

１００人以上の人間がいると、底上げがすごく組織の利益率に聞いてくるらしい。　
10,000人の組織は、さらに大きく、いかに大勢を一歩前に進んでもらうかで、　
大きな収益を得ることがあるとお聞きする。　

流行に乗っていけば、安定するかもしれない。　
流行を追いかけるには、最先端から手をつけるのか、底上げから手をつけるのか、　
何をするとよいかはわかっていない。　

## 時間領域、周波数領域　

周期的に起きることは、周波数領域であつかうとよい。　
ラプラス変換とか、周波数領域と時間領域を行ったり来たりして、　
差し支えない制御方法を探し出す。　

初期条件、終了条件、定常条件の３つでもよい。　

## わかったこと、わからなかったこと　

わかったことと、わからなかったことは、二次元ではないかもしれない。　

わかったことは、何がわからないかがわかることかもしれない。　
わからなかったことは、わかるようになったからわからないことがわかったのかもしれない。　

身についたこと、習慣になったことなど、わかったこと、わからなかったこととは、別の次元の軸を一つ出すとよいかもしれない。　

## よかったこと、改めること　

よかったことと、悪かったことは、一次元ではないかもしれない。　　
悪かったことは、悪かったと思う前に、改めることができたかもしれない。　

改めずに放置していたから悪くなったのかもしれない。　

よかったこと、悪かったことの他に、いずも改めることを置くといいかもしれない。
【Docker】failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0・・・

# 状況
Docker Desktopのアップデートを行った後、いつものように```docker-compose build```コマンドによるビルドを行おうとした。すると以下のようなエラーが発生した。

```
failed to solve: rpc error: code = Unknown desc = failed to solve with
 frontend dockerfile.v0: failed to create LLB definition: failed to 
authorize: rpc error: code = Unknown desc = failed to fetch oauth 
token: Post "https://auth.docker.io/token": dial tcp: lookup 
auth.docker.io on ・・・
```
# 対処法
* Docker Desktopを開く。
* 右上の歯車のマークを押し設定画面を開く。
* 左のナビゲーションの中からGeneralを選択する。
* 下にスクロールして「Use Docker Compose V2」のチェックボックスのチェックを外す。

私の場合はこれで問題なく動くようになった。
また別の対処法として、以下に記載されているように「docker-compose build」を「docker compose build」とすることで動いたという事例もあるようだ。

https://github.com/docker/buildx/issues/769
ChromebookにZenn CLIをインストールする方法

**Chromebook** に **Zenn CLI**をインストールする方法を紹介します。

**Zenn CLI**を導入すると、ターミナル上で記事を作成・編集・保存・プレビューできるようになります。

## フォルダ(ディレクトリ)を作成

最初にZennを管理するためのフォルダ(ディレクトリ)を作成します。このフォルダ(ディレクトリ)の中に必要なものをインストールしていきます。ここでは「zenn」フォルダ(ディレクトリ)を作成します。

```
mkdir zenn
```

作成したフォルダ(ディレクトリ)に移動します。

```
cd zenn
```

## npmをインストール

Zennをインストールする際にnpmが必要になるのでインストールします。最新版が必要です。※古いバージョンをいったんインストールして後で削除します。

```

sudo apt install nodejs npm

sudo npm install -g n　※最新版をインストールするために「n」をインストール

sudo n stable　※最新版をインストール

sudo apt purge nodejs npm　※古いバージョンを削除

exec $SHELL -l　※ターミナルに再ログイン

node -v ※バージョン確認
```

## Zenn CLIをインストール

Zenn CLIをインストールしていきます。ここからは公式のマニュアル通りで大丈夫です。なお、コマンドは作成したフォルダ（ディレクトリ）内で実行します。ここでは「zenn」フォルダ（ディレクトリ）内で実行しています。

```
$ npm init --yes # プロジェクトをデフォルト設定で初期化
$ npm install zenn-cli # zenn-cliを導入

$ npx zenn init #Zenn用のセットアップ

```

コマンド入力後、以下の内容が表示されます。

```

🎉  Done!
  早速コンテンツを作成しましょう

  👇  新しい記事を作成する
  $ zenn new:article

  👇  新しい本を作成する
  $ zenn new:book

  👇  投稿をプレビューする
  $ zenn preview
```


以下のコマンドを実行することでブラウザでプレビューが開きます。

※公式ではこのように書かれていますが、記事を作成していなければ当然プレビューできるはずがありません。Zenn CLIで記事を作成してからプレビューしてみましょう。記事を作成する方法は、以下の参考サイトを参照してください。

```

$ npx zenn preview
# 👀 Preview on http://localhost:8000

```

## 参考サイト

Zenn CLIの導入手順
https://zenn.dev/zenn/articles/install-zenn-cli?utm_source=pocket_saves

Zenn CLIで記事・本を管理する方法
https://zenn.dev/zenn/articles/zenn-cli-guide
[nodejs + mysql] routesでapiを管理する

# 初めに
nodejs + mysql でベックエンドのコード書いているが、徐々にコートが長くなってカテゴリごとに分ける必要性を感じた。
ここで、routerという機能を使ってより管理しやすく環境を整えることを書いておく。

# 環境
window 10
mysql 8.0.31
ejs: 3.1.8
express: 4.18.2
## Dir
```:dir
├─public
  index.html
  users.html
├─routes
  users.js
└─views
server.js
```
# Code
## routesで分ける前
```javascript:server.js
const express = require('express');
const mysql = require('mysql');
const app = express();
app.set('view engine', 'ejs')

const con = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '12345678',
    database: 'nodejs',
    dateStrings: "date",
    multipleStatements: true
});

con.connect((err) => {
    if (err) {
        console.log('error connecting: ' + err.stack);
        return;
    }
    console.log('success');
        ;
    });
});


app.get('/', function (req, res) {
    res.render('index.ejs')
})


// このusersに関連したapiをカテゴリ別で分けたい
app.get('/users', (req, res) => {
    const sql = "select * from users"
    con.query(sql, function (err, result, fields) {
        if (err) throw err;
        res.render('users.ejs', { users: result })
    })
})
``` 
## 分けた後
```javascript:server.js
...


//DBをusers.jsで使用するためにexportする
module.exports = con

// 元々のusersに関するすべてのコードの代わりにこれを書いておく
app.use('/', require('./routes/users.js'));
```


```javascript:/routes/users.js
var router = require('express').Router();
const con = require('./../server.js')

//appの代わりにrouterを使用する
router.get('/users', (req, res) => {
    const sql = "select * from users"
    con.query(sql, function (err, result, fields) {
        if (err) throw err;
        res.render('users.ejs', { users: result })
    })
})

//server.jsで使用するためにexportする
module.exports = router;
```

# おわりに
自分が不便を感じるところはだいたい、誰かが便利な機能を作っておくんだと実感した部分ですね。
計画的にapiを書くことによって将来的に管理しやすいプロジェクトが出来上がりそうです。
【RSpec】サポートモジュールによるsign_inメソッドの共通化

# サポートモジュールによるsign_inメソッド
Rspecにおけるシステムスペックでログイン処理をsign_inなどのメソッドとして使用する方法として、サポートモジュールによって共通化する方法がある。以下にそのの一例を示す。

# .rspecの編集
spec/rails_helper.rbの記述を有効化するために、.rspecに以下を追記。
```:.rspec
--require rails_helper
```
# rails_helper.rbの編集
spec/rails_helper.rb内に以下の記述を行い、spec/supportディレクトリの内容を有効化する。
```ruby:spec/rails_helper.rb
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }
```
またこれから作成するsign_in_supportモジュールを有効化するために以下を追記。
```ruby:spec/rails_helper.rb
RSpec.configure do |config|
  config.include SignInSupport
end
```

# sign_in_supportモジュールの作成
サポートモジュールを作成する。ここで作成されたメソッドはシステムスペックの中で共通して使用することができる。尚、これはあくまで一例であるため、fill_inメソッドでどのような値を埋めないといけないかについては、各々のログインページでどのようなfieldを設けているかを確認されたい。
```ruby:spec/support/sign_in_support.rb
module SignInSupport
  def sign_in(user)
    visit new_user_session_path
    fill_in 'user_email', with: user.email
    fill_in 'user_password', with: 'password'
    click_button 'Log in'
  end
```
# fsctory botでテストデータの作成
今回はfactorbotでテストデータを作成する。spec配下にfactoriesディレクトリを作成し、その配下にuser.rbを以下のように作成する。
```ruby:spec/factories/user.rb
FactoryBot.define do
  factory :user do
    
    email { "exampele@example.com" }
    password { "password" }
    password_confirmation { "password" }
  end
end
```




# system specへ記述
今回はシステムスペック内にログイン済みのユーザーがユーザー設定ページにアクセスできることを確認するテストを記述する。
またこれについても一例であるため、have_contentやhave_fieldマッチャによって探索される値やパスのルーティングについては各々のユーザー設定ページの仕様を確認されたい。
```ruby:system/user_spec.rb
require 'rails_helper'
RSpec.describe "User#system", type: :system do
  let(:user) { create(:user) }
  describe 'ページ遷移確認' do
    context 'ユーザーの設定ページに遷移' do
      it 'ユーザー設定ページへのアクセスに成功すること' do
        #モジュールを使用
        sign_in(user)
        visit edit_user_registration_path(user)
        expect(page).to have_content 'ユーザー設定'
        expect(page).to have_field 'user_email', with: user.email
        expect(page).to have_field 'user_password'
        expect(page).to have_field 'user_password_confirmation'
        expect(page).to have_field 'user_current_password'
        expect(current_path).to eq edit_user_registration_path(user)
      end
    end    
  end
end
```
【Next.js】useEffectが2回実行されてしまう

## 環境
OS: MacOS Ventura 13.0.1
Node.js: v17.0.0
next: 13.0.3
react: 18.2.0

## 起きていた問題
nextの基礎学習をしていて、ステートの値をテーブルに出力したところ、同じデータが2回繰り返されていました。
(ソース割愛)


## 解決した方法
next.config.jsにこれを追加、変更する。
  
```javascript
//next.config.js
const nextConfig = {
  reactStrictMode: false,//これを追加
};
```
開発環境でしか起きないようですが、気持ち悪いので変えときます。

## 参考にしたページ

https://b.0218.jp/202207202243.html

https://dagashi.pw/react18-useeffect-twice/
構築隔日記(10) Advent Calendar 2022 進捗報告(14)

Advent Calendarの投稿の最速がほぼ１週間前から届き始めた。　

毎日、午後６時に、登録した記事を書きましょうと言ってくる。　

今日までの４日間は、ほぼ全部書いたはず。１日、約18記事づつ登録している。　

詳細は後日記録する。　

すでに７０記事ほど、「限定共有記事」として登録している。　

当日の朝、何時かになると公開に移行する。　

2021年のときに、ちょっと困ったのが、公開した日ではなく、実際に書いた日に投稿したことになっており、毎日のランキング、毎週のランキングから漏れてしまうことかもしれない。　

Qiita側がやっていることは仕方ないとしても、利用者が自分たちでいろいろ集計している場合には、何か工夫できないか考えてみたい。　

年末までにはTypeScriptとJavaScriptの記事を書くことになっているし。　

隔日日記も相当つらい。　

毎日の作業量が平均的な場合は問題はないだろう。　

倍半分で４倍くらい作業量が違うとつらいかもしれない。　

何か書きたかったことがあるはずだ。
Ender 5 S1事始め①

# Ender 5 S1事始め①
Ender 5 S1を購入したため、環境構築を行っていく。
## 組み立て
組み立ては何だかんだ2時間ぐらいかかった。
箱型の難点か組むフレームがそこそこある。
基本的に手順書は分かりやすかった、**動作確認を行うまでは…**。

## 動作確認
ようやく組み上がり、手順書通りにオートレベリングを実施。

**E203**

は！？？
えーと、モータ・スイッチは全軸動作。
Z軸が上がる途中で止まっている…。
Z軸が引っかかってる様子は無し。抵抗も無し。
**やばい詰んだ**

その後、2日程あれやこれやしながら情報を探し続け、[海外のレビュー](https://www.tomshardware.com/reviews/creality-ender-5-s1 "tom's HARDWARE")で気になる文章を発見。

The quick start guide has the wrong directions for leveling this machine. I followed these directions and the knobs nearly fell off.
**The correct directions are in the PDF manual.**

訳：このクイックスタートガイドにはレベリングの間違った指示があります。 私はこれらの指示に従いましたが、ノブはほとんど落ちました。
**正しい手順は PDF マニュアルに記載されています。**

あ”！？
ふざけんなよおおおお！！！
実際PDFマニュアルに従ったら（オートレベリング前に手動レベリングを実行）正しく動作したとさ。
中華製品の恐るべきいい加減さを目にしたぜ…。

## 本当の動作確認
さて、Ender 5 S1にはSDカード（今どきSDカード…）とSDカードリーダーが添付されている。
そしてSDカードの中を見るととりあえず例の船とウサギのモデルが入っている。
とりあえず、例の船を印刷した。
うーん。普通に印刷完了。
gcodeの中身を見るとこうなっている。

```E5 S1-boat.gcode
M204 S2000
M205 X10 Y10
;MESH:4???????????????.stl
G0 F9000 X111.69 Y113.705 Z0.2
;TYPE:WALL-INNER
G1 F3000 E0
G1 F2903.2 X111.267 Y113.688 E0.01746
G1 F3600 X111.028 Y113.684 E0.02541
G1 X110.763 Y113.591 E0.03475
…
G1 F7200 X94.785 Y117.135 E211.65673
G0 F15000 X89.157 Y113.448
…
```
注釈を入れていくと下記になる。

```E5 S1-boat.gcode
M204 S2000 ; 加速度指定2000mm/s^2(max)
M205 X10 Y10 ; X軸,Y軸のジャークを10に設定
;MESH:4???????????????.stl
G0 F9000 X111.69 Y113.705 Z0.2 ; 速度を9000mm/min=150mm/sに設定。以下その速度で動く
;TYPE:WALL-INNER
G1 F3000 E0
G1 F2903.2 X111.267 Y113.688 E0.01746
G1 F3600 X111.028 Y113.684 E0.02541 ; 速度を3600mm/min=60mm/sに設定。以下その速度で動く
G1 X110.763 Y113.591 E0.03475
…
G1 F7200 X94.785 Y117.135 E211.65673 ; 速度を7200mm/min=120mm/sに設定。以下その速度で動く
G0 F15000 X89.157 Y113.448 ; 速度を15000mm/min=250mm/sに設定。以下その速度で動く
…
```
うーんgcodeに詳しくないので本当に速度が出ているのか良く分からないが、一応250mm/sで動く箇所はあるようだ。

マニュアルの不備でここまで来るまで3日程掛かっている。
その他のセッティングについても追々やっていきたい。
AUTO COMMITがOFFの状態で、SSMSを利用したい

AUTO COMMITがOFFの状態で、SSMSを利用したい場合は、以下の手順で設定します。

① ツール(T) > オプション(O) を選択する。

![スクリーンショット 2022-10-19 183625.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/da02d1a0-401c-74ef-4120-7165075c5af1.png)

② クエリ実行 > SQL Server > ANSI を選択したあと、SET IMPLICIT_TRANSACTIONS(M)のチェックを外し、OKを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/cff7a601-7ecc-7a48-9b5e-f18ee1a3d035.png)

__環境情報__

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/2a95c074-b15d-c465-eeee-c03ce6e76913.png)
Flowを使っても並列実行されない。なぜ？

# Flowを使っても並列実行されない

[この記事](https://qiita.com/GeekMasahiro/items/009fc414ca113ce391d6)では、Flowを使う事でCPUコアを並列して使う事ができ処理速度が向上しました。
しかし、別のプログラムでは全く並列実行されませんでした。
簡単なテストプログラムで、速くなる場合とならない場合を再現してみました。

```Elixir
defmodule Test2 do

  def sum_i(0) , do: 0
  def sum_i(i) , do: i + sum_i(i-1)

  def hello_flow(loop, load) do
    ret = 1..loop
    |> Flow.from_enumerable()
    |> Flow.map(fn _ -> sum_i(load) end)
    |> Enum.count(fn _ -> true end)
  end

  def hello_enum(loop, load) do
    ret = 1..loop
    |> Enum.map(fn _ -> sum_i(load) end)
    |> Enum.count(fn _ -> true end)
  end

end

# 結果
```

|No|方法|実行時間(sec)|loop回数|1loopの演算回数|演算量|演算回数/sec|CPU使用率|
|-|---|-------|---------     |-------------|------|----------|---------|
|1|flow| 7.7   |1K     |1M            |1G|130M/sec|約10%|
|2|enum| 7.9   |1K     |1M            |1G|127M/sec|約10%|
|3|flow| 0.4   |1M     |1K            |1G|2500M/sec|100%|
|4|enum| 3.0   |1M     |1K            |1G|333M/sec|約10%|
 
# 解決策

loop回数が少ないと並列実行されない
from_enumerableに、max_demand:　を指定することで解決しました。

max_demand:の働きは、[ZACKY さんの記事](https://qiita.com/zacky1972/items/e843607881bbeca34b70)がわかりやすかったです。
無条件に並列実行するように、max_demand: 1としてみます。

```Elixir
  def hello_flow2(loop, load) do
    ret = 1..loop
    |> Flow.from_enumerable(max_demand: 1)
    |> Flow.map(fn _ -> sum_i(load) end)
    |> Enum.count(fn _ -> true end)
  end

```

|No|方法|実行時間(sec)|loop回数|1loopの演算回数|演算量|演算回数/sec|CPU使用率|
|-|---|-------|---------     |-------------|------|----------|---------|
|1|flow| 7.7   |1K     |1M            |1G|130M/sec|約10%|
|2|enum| 7.9   |1K     |1M            |1G|127M/sec|約10%|
|5|flow2| 2.2  |1K     |1M           |1G|454M/sec|100%|

No3の場合と比べると、遅いですが、CPUの使用率は100%になっているので、最大処理にはなっていると思います。


結果メモ

```Elixir
iex(1)> :timer.tc(Test2, :hello_flow, [1000, 1_000_000])
{7759007, 1000}
iex(2)> :timer.tc(Test2, :hello_enum, [1000, 1_000_000])
{7940184, 1000}
iex(3)> :timer.tc(Test2, :hello_flow, [1000_000, 1_000])    
{425530, 1000000}
iex(4)> :timer.tc(Test2, :hello_enum, [1000_000, 1_000])
{3023313, 1000000}
iex(5)> :timer.tc(Test2, :hello_flow, [10_000_000, 1_000])
{4003593, 10000000}
iex(6)> :timer.tc(Test2, :hello_enum, [10_000_000, 1_000])
{30227115, 10000000}
iex(10)> :timer.tc(Test2, :hello_flow2, [1000, 1_000_000])
{2247715, 1000}
```

参考
https://qiita.com/zacky1972/items/e843607881bbeca34b70
https://hexdocs.pm/flow/Flow.html
Rails delegate

## delegateとは
Railsにおける```delegate```は```移譲する```の意味で使われていると思われます。

delegateメソッドを使うことによって、異なるクラスに定義されているメソッドをそのオブジェクトのメソッドとして呼び出せます。
これによって、リレーションを持つクラスのインスタンスメソッドを委譲することができます。

```user has_many posts && post belongs to use```の場合を考えます
- **User(id: integer, name: string, age: integer)**
- **Post(id: integer, title: string, content: string)**

#### delegateを使わずにuserのnameを参照する場合
```.rb
    post = Post.first
    post.user.name
```

#### delegateを使って参照する場合
```post.rb
    class Post < ApplicationRecord
        belongs_to :user
    
        delegate :name, to: :user
    end
```
```.rb
    post = Post.first
    post.name
```
このように、リレーション関係にあるクラスのメソッドをそのオブジェクトのメソッドであるかのように使うことができます。

delegateメソッドを呼び出すことによって何が起こっているのかというと、呼び出したクラスにインスタンスメソッドが定義されます。
- delegateメソッドを使っていない場合
```ruby
    pry(main)> Post.instance_method(:name)
    # => NameError: undefined method `name' for class `Post (call 'Post.connection' to establish a connection)'
```
- delegateメソッドを使った場合
```ruby
    pry(main)> Post.instance_method(:name)
    # => #<UnboundMethod: Post (call 'Post.connection' to establish a connection)#name(...) /app/app/models/post.rb:14>
```

delegateメソッドを使う際には、1対1の関係であることと、指定するメソッドがpublicメソッドである必要があります。

上記の例で言えば、```user has_many posts```であるため、PostクラスのインスタンスメソッドをUserクラスにおけるdelegateメソッドの引数に指定することはできません。

#### オプション
delegateメソッドのオプションには```:to```, ```:prefix```, ```:allow_nil```, ```:private```があります
- **to**
```:to```では、ターゲットになるオブジェクトを指定します。基本的には```belongs_to```, ```has_one```の対象になるオブジェクトと同じと考えていいかと思います。
- **prefix**
prefixをつけることができます。下記のようにprefixを指定すると、```post.hello_name```のように参照することができるようになります。
```ruby
    delegate :name, to: :user, prefix: :hello
```

- **allow_nil**
```allow_nil: true```を指定すると、```Module::DelegationError```が生じなくなります。
- **private**
```private: true```を指定するとprivateメソッドとして、自クラスに定義されます。

## 参考にしたサイト

https://github.com/rails/rails/blob/main/activesupport/lib/active_support/core_ext/module/delegation.rb#L171

https://medium.com/@pk60905/using-delegate-in-rails-527332da7f96
やさしい母関数（Generating Function）（その４）

[前回](https://qiita.com/masa0599/items/1131398ac95ee66f01fe)に引き続いてSagemathを用いて母関数から数列を求める方法の応用編です。両替問題と分割問題を扱います。

### 母関数を用いて両替問題を解く

両替問題は古典的な問題で母関数を作るのは簡単ですが、解くのは手計算では大変です。そこでSagemathの出番となります。以下のProject Eulerの問題を例題として取り上げます。

> [【Project Euler】Problem 31: コインの合計](https://qiita.com/masa0599/items/f09b58332251c5dfd6ec)
> **問題の要約：1p,2p,5p,10p,20p,50p,£1(100p),£2(200p)のコインを使って£2(200p)にするのは何通りあるか求めよ**

まず問題を簡略化して「1p,2p,5pコインを使って5pにするのは何通りあるか求めよ」とします。その回答は以下の式の$x^{5}$の係数となります。

```math
(1 +  x +  x^{2} +  x^{3} +  x^{4} +  x^{5}) \times 
(1 +  x^{2} +  x^{4} ) \times
(1 +  x^{5})
```
これをそのままSagemathで求めてみます。

```python 
n = 5
x = PowerSeriesRing(QQ, 'x', default_prec=n+1).gen()
f = (1 + x^1 + x^2 + x^3 + x^4 + x^5)*(1 + x^2 + x^4 )*(1 + x^5)
f.list()[5]
# 4
```
ここで1p,2p,5pのコインの母関数は既に求めたように下の表で表され、一般にnpのコインの母関数は$\Large \frac{1}{1-x^n}$なのでsagemathでは **(1-x^n)^(-1))** となります。

| | 母関数 |　　　べき級数　　　|
|---:|:---:|:---:|
|1p |$\Large \frac{1}{1-x^1}$|$1 + x^1 + x^2 + x^3 + x^4 + x^5$|
|2p |$\Large \frac{1}{1-x^2}$|$1 + x^2 + x^4 $|
|5p |$\Large \frac{1}{1-x^5}$|$1 + x^5$|

べき級数を母関数に変えてsagemathのプログラムにすると、以下のような簡潔なコードで表わすことが出来ました。

```python
N = 200
coins =  [1,2,5,10,20,50,100,200] 
x = PowerSeriesRing(QQ, 'x', default_prec=n+1).gen()
prod([((1-x^n)^(-1)) for n in coins]).list()[N]
# 73682
```
### 母関数を用いて両替問題を解く（個数制限あり）

同じ問題の個数制限ある場合を考えます。

> **問題の要約：** 1p,2p,5p,10p,20p,50p,£1(100p),£2(200p)のコインを使って£2(200p)にするのは何通りあるか求めよ。**ただし1p,2p,5pは10個までしか使えない。**

変更点以下の2点です。
* coinsをtupleのリストにして個数の上限をペアにして持たせる。上限がない場合は0。
* 母関数の生成に**truncate** methodを用いて多項式の次数を制限する

Sagemathのコードは以下のようになります。2pの多項式を表示すると$x^{20}$までになっているのが分かります（なぜかオーダーが逆順に表示されますが）。

```python
N = 200
coins =  [(1,10),(2,10),(5,10),(10,0),(20,0),(50,0),(100,0),(200,0)]
x = PowerSeriesRing(QQ, 'x', default_prec=n+1).gen()
fs = [((1-x^n)^(-1)).truncate((k*n if k>0 else N)+1)  for (n,k) in coins]
fs[1]
prod(fs).list()[N]
# x^20 + x^18 + x^16 + x^14 + x^12 + x^10 + x^8 + x^6 + x^4 + x^2 + 1
# 3481
```


### 母関数を用いて分割問題を解く

次にやはりProject Eulerから分割問題です。

> [【Project Euler】Problem 76: 整数の分割](https://qiita.com/masa0599/items/4382a49e4a28799f7f6f)
> **問題の要約：100を自然数の和で何通りの組み合わせで表せるかを求めよ**

[分割数(Wikipedia)](https://ja.wikipedia.org/wiki/%E5%88%86%E5%89%B2%E6%95%B0)によると分割数は以下の母関数で表されます。

```math 
\large \prod_{k=1}^{\infty}(\frac{1}{1-x^k})
```
従ってそのままSagemathで実装します。

```python 
n = 100
x = PowerSeriesRing(QQ, 'x', default_prec=n+1).gen()
prod([(1-x^k)^(-1) for k in range(1,n+1)]).list()[n]  
# 190569292
``` 

以上の例からわかるように、母関数が分かっている場合はSagemathに渡せばその多項式及び数列を計算してくれることが分かって頂ければ嬉しいです。

（開発環境：Cocalc）
AtCoder Beginner Contest 279 の解答例(Javascript)

# この記事の目的
競技プログラミングでは少数派のJSerのために正解した問題の解答例を記載しておきます。
より良い解法があればご指摘いただきたいです！

今回のコンテストの内容はこちらから！
https://atcoder.jp/contests/abc279/

---
# A - wwwvvvvvv
## 問題文
v と w のみからなる文字列 S が与えられます。
S の中に、下に尖っている部分が何箇所あるかを出力してください。
## 入力
入力は以下の形式で標準入力から与えられる。
```
S
```
## 解答例
```
var lines = [];
var reader = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});
reader.on('line', function (line) {
    lines.push(line);
});
reader.on('close', function () {
    const S = lines[0];
    const strings = S.split('');
    let num = 0;
    strings.forEach(str => {
        if(str == "v"){
            num = num +1;
        }
        if(str == "w"){
            num = num +2;
        }
    })
    console.log(num);
});
```
## 解説
単純なif文の条件分岐でできます

# B - LOOKUP
## 問題文
英小文字からなる文字列 S,T が与えられるので、 T が S の(連続する)部分文字列かどうか判定してください。

なお、文字列 X に以下の操作を 0 回以上施して文字列 Y が得られる時、またその時に限り Y は X の(連続する)部分文字列であると言います。

以下の 2 つの操作から 1 つを選択して、その操作を行う。
X の先頭の 1 文字を削除する。
X の末尾の 1 文字を削除する。
例えば tag は voltage の(連続する)部分文字列ですが、 ace は atcoder の(連続する)部分文字列ではありません。

## 入力
入力は以下の形式で標準入力から与えられる。
```
S
T
```

# 解答例
```
var lines = [];
var reader = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});
reader.on('line', function (line) {
    lines.push(line);
});
reader.on('close', function () {
    const S = lines[0];
    const T = lines[1];
    // console.log(S,typeof(S));
    const reg = new RegExp(T);
    const result = S.search(reg);
    console.log(result === -1 ? 'No' : 'Yes');
});
```

## 解説
正規表現を使い、目的の文字列が含まれているかを判定した。

# C - RANDOM
## 問題文
# と . からなる H 行 W 列の図形 S,T が与えられます。
図形 S は H 個の文字列として与えられ、 Si の j 文字目は S の i 行 j 列にある要素を表します。 T についても同様です。

S の列を並べ替えて T と等しくできるか判定してください。

但し、図形 X の列を並べ替えるとは、以下の操作を言います。

(1,2,…,W) の順列 P=(P1 ,P2 ,…,PW) をひとつ選択する。
その後、全ての 1≤i≤H を満たす整数 i について、以下の操作を同時に行う。
1≤j≤W を満たす全ての整数 j について同時に、 X の i 行 j 列にある要素を i 行 Pj列にある要素に置き換える。

## 入力
入力は以下の形式で標準入力から与えられる。
```
H W
S1
S2
⋮
SH
T1
T2
⋮
TH
```
#解答例
```
var lines = [];
var reader = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});
reader.on('line', function (line) {
    lines.push(line);
});
reader.on('close', function () {
    const [height, width] = lines.shift().split(' ').map(el=>parseInt(el, 10));
    // console.log(height, width);
    const S = lines.slice(0, height);
    const H = lines.slice(height);
    // console.log(S, 'S');
    // console.log(H, 'H');

    let ans = 'Yes';
    for(let i = 0; i < height; i++){
        let s_count = 0;
        let h_count = 0;
        S[i].split('').forEach(el => {
            if(el === '#'){s_count++}
            return;
        })
        H[i].split('').forEach(el => {
            if(el === '#'){h_count++}
            return;
        })
        // console.log(i, s_count, h_count);
        if(s_count !== h_count){
            ans = 'No';
            break;
        }
    }

    console.log(ans);
});
```
## 解説
`S`グループと`T`グループの各列の`#`の数を数え、
全て同じであれば、`Yes`を返し、それ以外は`No`を返す

# 終わりに
JavaScriptの解答例が少ないので、競技プログラミングにJSerの人がもっと増えることを願っています！
【VRChat】ものをつかめるようにする

# 目的
VRChatのworld製作でつかめるものを置けるようになる

# 設定1 空中にとまるやつ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495102/c9ee2a82-6f6d-ce43-15ca-a6c276caa68b.png)

# 設定2 ふわっとするやつ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495102/405d733a-0130-c8c7-61ba-e0cc4605d965.png)
Dragは適当に調整

# 必要なComponent
- VRC Pickup
- Rigidbody
- 任意の種類のCollider
- (Option)VRC Object Sync

VRC Pickupを付けるとRigidbodyは自動的につくけどColliderは自分でつけないといけないので注意  

# ベーシックな設定
VRC Pickupを付ける
RigidbodyのUse Gravityをオフ、Is Kinematicをオン
同期させたいならVRC Object Syncを付ける

# 各コンポーネントの設定
よく見ると知らない設定が結構あったので普段使ってないところは飛ばします  
### VRC Pickup
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495102/d7f098f8-01c0-a172-cce6-88569353aaaa.png)
- Disallow Theft
他人が横取りできないようにする
- Exact Gun/Grip
Orientationを設定したときに手がどこに来るかを設定する。銃とか剣とか持ち手が決まっていて変なとこをつかんでほしくないものに使う。
- Orientation
Anyが好きに持てる。GunとGripが持つところを指定。2つの違いは知らない。
- AutoHold
デスクトップモードでつかんだ時、マウスボタンを離した時につかんだままにするかどうか。UseできるオブジェクトはYesにしないとトリガーが引けなくなる。
- Interaction/Use Text
Useって書いてるところを変えれる

### Rigidbody
[公式リファレンス](https://docs.unity3d.com/ja/2021.2/Manual/class-Rigidbody.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495102/cc23b6af-8f52-7c51-789c-b515430dcbce.png)
- Mass
重さ
- Drag
空気抵抗。でかくするとリスキーダイスのメニューみたいにふわっと止まるようになる。
- Angular Drag
回転の空気抵抗
- Use Gravity
重力のオンオフ
- Is Kinematic
物理シミュレーションのオンオフ。これにチェックを入れると落下したり投げたりできなくなって空中に固定される。
Use Gravityオフ、Is Kinematickオンが定番のピックアップ設定

# Collider
- Is Trigger
衝突判定オンオフ
RigidbodyのIs Kinematicをオフにしていると影響がある
- Material
反発・摩擦などが設定できる。スーパーボールとか作るなら使うけど基本的になくてもいい

# VRC Object Sync
- Allow Collision Ownership Transfer
どっちでもいい
やさしい母関数（Generating Function）（その３）

[前回](https://qiita.com/masa0599/items/9f84052bb1a8792cb509)までの記事で母関数の作り方をいくつか紹介しました。ただ母関数を展開すると多項式になりその計算は手計算では限度があります。そこでプログラミングの出番なのですが特にSagemathはこの分野では強力なツールとなります。

### Sagemathで母関数からべき級数を求める

PowerSeriesRingを使って、基本形の$f=\large \frac{1}{1-x}$を$x^{10}$まで定義して表示します。default_precで何項まで展開するかを指定しています。

```python 
x = PowerSeriesRing(QQ, 'x', default_prec=10+1).gen()
f = ((1-x)^(-1))
show(f)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/2c7cb5fb-6019-beb5-a693-093127a42519.png)

同様に母関数$f=\large \frac{1}{(1-x)^2}$を多項式及びlist methodを使って数列を表示します。

```python 
f = ((1-x)^(-2))
show(f)
f.list()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/2ab23213-291d-df3f-fcc5-b556b65bcce8.png)

### Sagemathで例題の母関数からリストを表示

要は母関数を定義すれば数列（及び多項式）は計算してくれるということです。それでは[（その１）](https://qiita.com/masa0599/items/088b0c4c2e30820677b6)での例題1~12の数列を一気に表示してみましょう。

```python 
print("例題  1:",(4*(1-x)^(-1)).list())
print("例題  2:",(2*(1-x)^(-2)).list())
print("例題  3:",(2*x^3*(1-x)^(-2)).list())
print("例題  4:",(1*(1-5*x)^(-1)).list())
print("例題  5:",(1*(1+3*x)^(-1)).list())
print("例題  6:",(1*(1-5*x^2)^(-1)).list())
print("例題  7:",(x*(1-x^3)^(-2)).list())
print("例題  8:",(4*x*(1-x)^(-1)).list())
print("例題  9:",(1*(1-4*x)^(-1)).list())
print("例題 10:",(x*(1+x)^(-1)).list())
print("例題 11:",(3*x*(1+x)^(-2)).list())
print("例題 12:",((1+x+x^2)*(1-x)^(-2)).list())
# 例題  1: [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
# 例題  2: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22]
# 例題  3: [0, 0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22]
# 例題  4: [1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625]
# 例題  5: [1, -3, 9, -27, 81, -243, 729, -2187, 6561, -19683, 59049]
# 例題  6: [1, 0, 5, 0, 25, 0, 125, 0, 625, 0, 3125]
# 例題  7: [0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4]
# 例題  8: [0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
# 例題  9: [1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, 262144, 1048576]
# 例題 10: [0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1]
# 例題 11: [0, 3, -6, 9, -12, 15, -18, 21, -24, 27, -30, 33]
# 例題 12: [1, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
```

### フィボナッチ数列や三角数

フィボナッチ数列や三角数も[（その２）](https://qiita.com/masa0599/items/9f84052bb1a8792cb509)で母関数が求まっているので全く同様に数列が求まります。

```python 
print("フィボナッチ数列:",(x*(1-x-x^2)^(-1)).list())
print("三角数:",(1*(1-x)^(-3)).list())
#フィボナッチ数列: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
# 三角数: [1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66]
```

今回は$x^{10}$までの係数を表示しましたが、**default_prec**の値を増やせばより長い数列を扱うことが出来ます。さらに関数は多項式の形で保持されているので、その後の色々な演算を行うことが可能です。

[次回](https://qiita.com/masa0599/items/3bec41f21da18abb6e71)の記事では例題を示しながらそのような応用例を紹介したいと思います。

（開発環境：CoCalc）
【kotlin】CoroutineContextとは（自分用メモ）

# はじめに
今回は　前回に引き続きCoroutine内のCoroutineContextについて勉強したものを自分用のメモがわりに記事にしていきます

# CoroutineContextとは
CoroutineContext とは、コルーチンの状態を表す値の集まりの事。
"Job"や "CoroutineDispatcher"　などの要素を使い動作を行うことができます。

要素を以下にまとめました

# CoroutineContext要素表
|要素|内容|
|:---|:---|
|job|コルーチンのライフサイクルを制御する|
|CoroutineDispatcher|適切なスレッドに処理を送信する|
|CoroutineName|コルーチンの名前、デバッグに役立つ|
|CoroutineExceptionHandler|キャッチされない例外を処理する|

# 参考
[図で理解する Kotlin Coroutine](https://qiita.com/kawmra/items/d024f9ab32ffe0604d39)
[Developers](https://developer.android.com/kotlin/coroutines/coroutines-adv?hl=ja#job)
やさしい母関数（Generating Function）（その２）

[前回](https://qiita.com/masa0599/items/088b0c4c2e30820677b6)では基本操作を組合せることによって多くの母関数が作れることを紹介しました。今回は漸化式から母関数を同様の基本操作で作れることを示します。

### 漸化式から母関数を作る

**【例題 1】** 以下の漸化式からなる数列の母関数を求めよ

```math
\begin{align}
&a_0 = 1, a_1 = 3\\
&a_n = 3a_{n-1}-2a_{n-2}
\end{align}
```
```math
\begin{align}
&ポイントは　\\
&a_n -3a_{n-1}+2a_{n-2} = 0 \\
&が成り立つので　\\
&元の数列に各項を3倍して１つ右にシフトしたものを引き、\\
&2倍して２つ右にシフトしたものを足すと、\\
&3項目以降はすべてゼロになるはずです。
\end{align}
```

数列を$a_4$まで求め[1,3,7,15,31]、実際に試してみましょう。

| | |$x^0$|$x^1$| $x^2$| $x^3$| $x^4$| ... |$x^n$| ... |  
|---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|$A$ |$=$|$1$|$3$|$7$|$15$|$31$|...|$a_{n}$|...|
|$-3xA$ |$=$|$0$|$-3$|$-9$|$-21$|$-45$|...|$-3a_{n-1}$|...|
|$+2x^2A$ |$=$|$0$|$0$|$2$|$6$|$14$|...|$2a_{n-2}$|...|
|$(1-3x+2x^2)A$ |$=$|$1$|$0$|$0$|$0$|$0$|...|0|...|

```math
\begin{align}
&(1-3x+2x^2)A = 1 \\
&となり　\\
&母関数\ A = \frac{1}{1-3x+2x^2} \\
&が求まります。
\end{align}
```

大体やり方は分かったと思うのでいくつか漸化式から母関数を求めてみます。

### フィボナッチ数列の母関数を求める

```math
\begin{align}
&フィボナッチ数列の漸化式は　\\
&a_0 = 0, a_1 = 1\\
&a_n = a_{n-1}+a_{n-2} \\
&なので　\\
&a_n - a_{n-1}-a_{n-2}=0 が成り立つ
\end{align}
```

| | |$x^0$|$x^1$| $x^2$| $x^3$| $x^4$| ... |$x^n$| ... |  
|---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|$F$ |$=$|$0$|$1$|$1$|$2$|$3$|...|$a_{n}$|...|
|$-xF$ |$=$|$0$|$0$|$-1$|$-1$|$-2$|...|$-a_{n-1}$|...|
|$-x^2F$ |$=$|$0$|$0$|$0$|$-1$|$-1$|...|$-a_{n-2}$|...|
|$(1-x-x^2)A$ |$=$|$0$|$1$|$0$|$0$|$0$|...|0|...|

```math
\begin{align}
(1-x-x^2)F &= x から　\\
母関数\ F &= \frac{x}{1-x-x^2} が求まります。
\end{align}
```

### 三角数の漸化式から母関数を求める

```math
\begin{align}
三角数&の漸化式は　\\
a_0 &= 1\\
a_n &= a_{n-1}+n \\
な&ので\\
a_n - a_{n-1}&=n が成り立つ
\end{align}
```

ここで前回の記事で$n=[1,2,3,4,5,...]$の母関数は$\large \frac{1}{(1-x)^2}$であることが分かっているのでこれを使います。

| | |$x^0$|$x^1$| $x^2$| $x^3$| $x^4$| ... |$x^n$| ... |  
|---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|$T$ |$=$|$1$|$3$|$6$|$10$|$15$|...|$a_{n}$|...|
|$-xT$ |$=$|$0$|$-1$|$-3$|$-6$|$-10$|...|$-a_{n-1}$|...|
|$\large \frac{1}{(1-x)^2}$ |$=$|$1$|$2$|$3$|$4$|$5$|...|$n$|...|

```math
\begin{align}
(1-x)T &= \frac{1}{(1-x)^2} から　\\
母関数 T &=\frac{1}{(1-x)^3} が求まります。
\end{align}
```

ちなみに三角数は$\large \frac{1}{(1-x)^2}$をもう一度微分する方法でも求める事が出来ます。

```math 
\begin{align}
\frac{1}{(1-x)^2} &= 1+2x+3x^2+4x^3+5x^4 \cdots \\
&両辺を微分すると \\

\frac{2}{(1-x)^3} &= 2+6x+12x^2+20x^3+30x^4 \cdots \\
&両辺を2で割る \\
\frac{1}{(1-x)^3} &= 1+3x+6x^2+10x^3+15x^4 \cdots \\
\end{align}

```

これで色々な数列に関して母関数を求めることが出来るようになったような気がしませんか？

ところで母関数を求めると、どんな良いことがあるのでしょうか。[次回の（その３）](https://qiita.com/masa0599/items/1131398ac95ee66f01fe)ではSageamthを使って母関数から色々な問題を解く方法を紹介したいと思います。