OmniAICreator/Qiita-1.07M huggingface dataset:
Angular 「Guard(ガード)機能で予期しないユーザ遷移を防ぐ」について

<font color="DeepPink">
※ログイン画面とホーム画面を実装しなくても画面を用意しておきましょう。

　今回は、Guard機能が機能するかを簡易に確かめるのが目的です。
</font>

<h1>最初に</h1>
Aユーザは、会員登録が完了しているため、　ホーム画面へ遷移できる。
Bユーザーは、未会員のため、ホーム画面へ遷移しようとするとログイン画面に強制遷移。

上記のようなことを実現するには、Guard（ガード）機能が使えるそうです。

Guard機能を簡易に実装できるまでをメモします。
(実際に、クラウド接続したり、localstorageから判定したり等は記載しません。)

<h3>guard追加</h3>

```
コマンドはこれ→ ng g guard guard/auth

1.(*) CanActivate
2.( ) CanActivateChild
3.( ) CanDeactivate
4.( ) CanLoad

```
今回は、「認証の確認」のため1.を選択します。
(2.3.4.については、用語でググると情報が出てきます。)

<h3>上記コード入力後 routingに追加</h3>
上記コード後に、guard/auth.guard.tsができます。

```app-routing.module.ts

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { CE200homeComponent } from './ce200home/ce200home.component';
import { LoginComponent } from './login/login.component';
③import { AuthGuard } from './guard/auth.guard';

const routes: Routes = [
  ①{ path:'', component: CE200homeComponent,canActivate:[AuthGuard]},
  ②{ path:'login', component: LoginComponent}
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }


```
app-routing.module.tsに、①②③がguard機能に対する記述箇所です。

```

① デフォルト遷移先をホーム画面に設定
② ログイン画面遷移pathを設定
③ AuthGuard読み込み

簡易に、実装が成功しているか確認するために、
ホームをデフォルト遷移先に設定します。

まだ、分からなくてもいいです。
```

<h3>auth.guard.tsを触る</h3>

```auth.guard.ts
恐らく、デフォルトは下記状態になっていると思います。

export class AuthGuard implements CanActivate {
  constructor(private router: Router){}
  canActivate(
    route: ActivatedRouteSnapshot, //遷移先の情報
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree { //遷移元の情報
 return false;
    }
  
}

```
補：falseが遷移キャンセルをするということで、この状態だけだと
　　app-routing.module.tsでguard機能を定義したホーム画面に遷移しようとした時に
　　画面は開かないけど、別画面に遷移するとか処理が実行されないです。
↓

```auth.guard.ts
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate {
  constructor(private router: Router){}
  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
      ①return this.router.navigate(['login']);
    }
  
}

```
①のように、app-routing.module.tsで定義したログインpath:loginを
returnに設定します。

<font color="DeepPink">
これで、再度ホーム画面に遷移しようとしてください。ログイン画面にすぐに遷移されると思います。
</font>


<h3>備考</h3>
ここまで実装できれば、後は、

<b>①localstorageでguard機能実行有無を条件分岐させるとか
②ホーム画面に遷移させようとしたら、ダイアログが出てユーザ操作でログイン画面遷移させる
</b>


①②のようにすればアプリっぽい挙動がするようになると思うので好きなようにカスタマイズすればGuard機能実装はOKだと思っています。

以上。
Splunk: TAILコマンドを使用する際の注意事項


###### 実施環境： Splunk Free 8.2.2

### 事象

以下のようなデータを考えます。

```Splunk:Splunk
| makeresults count=10
| streamstats count AS CNT
| fields - _time
```

![WS000151.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/6ad567cf-d00a-a2ed-3d5a-f423d58346d1.jpeg "元データ")

| CNT |
|:-|
|1|
|2|
|3|
|4|
|5|
|6|
|7|
|8|
|9|
|10|

これに対し、先頭から指定した行数を抽出する head コマンドを2回、1回目は5行、2回目は1行で実行します。
この結果は当然ながら、「1」が抽出されます。

```Splunk:Splunk
| makeresults count=10
| streamstats count AS CNT
| fields - _time
| head 5
| head 1
```

![WS000152.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/1250cdbe-4aaf-9487-546f-fefa550ac9eb.jpeg "head2")

![WS000166.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/c0ad32a0-0bc0-7658-7548-c6b100640a62.jpeg "head図")

では、次のように末尾から指定した行数を抽出する tail コマンドを2回、1回目は5行、2回目は1行で実行した場合はどうなるでしょうか。

```Splunk:Splunk
| makeresults count=10
| streamstats count AS CNT
| fields - _time
| tail 5
| tail 1
```

単純に考えると、以下のように「10」が残りそうです。

![WS000167.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7a00ab0a-8622-4953-2be7-7025f2a77525.jpeg "tail予想図")

しかし、これを実行してみた結果が以下です。

![WS000153.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/69cccf43-6de5-ec29-5f10-643babc9d566.jpeg "tail2")

予想に反して、「6」が残っています。
これは、どういうことでしょうか。

### 原因

原因は、 tail コマンドは末尾からデータを抽出するだけでなく、「データを現在の順番とは逆の順番にソートする」という動きを同時にするためです。

``` Splunk:Splunk
| makeresults count=10
| streamstats count AS CNT
| fields - _time
| tail 5
```

![WS000155.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/41de4a00-e812-f16d-4d1c-ab3aa48470ef.jpeg "tail1")

``` Splunk:Splunk
| makeresults count=10
| streamstats count AS CNT
| sort - CNT
| fields - _time
| tail 5
```

![WS000168.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/62a4ecb8-0325-cb44-9227-0c9ebe440e77.jpeg "tail1+sort")

そのため、先ほどの SPL では末尾から抽出した5行を「ひっくり返してから」末尾1行を抽出したことで、「6」が抽出される結果となりました。

![WS000169.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/92b6f94b-57b9-a0da-1b8e-b0a251b0f0e6.jpeg "tail図")

 tail コマンドはあまり使われないコマンドではありますが、もし使う場合は気をつけるようにしましょう。
【BladeOne】Laravelを使わずにBladeだけを使いたい！（※インストールと基本的な使い方を解説）

# はじめに
Laravelを使うほどでもないけど、Bladeだけは使いたいってありますよね。
そんな時にBladeOneを見つけました。
BladeOneは生のPHPでBladeを使用することができるものです。
こちらを使用して実装する機会がありましたのでまとめることにしました。
QiitaではBladeOneの記事がほぼないため参考になればと思います。

# BladeOneとは
BaldeOneとは、LaravelのBladeを単一のPHPで使用できるようにしたものです。
ただし、LaravelのBladeとBladeOneは違うものなので注意が必要です。
※詳細は「[Differences between Blade and BladeOne](https://github.com/EFTEC/BladeOne/wiki/Differences-between-Blade-and-BladeOne)」を参照して下さい。

# ライセンス
ライセンスは「[License](https://github.com/EFTEC/BladeOne#license)」を参照して下さい。

# インストール
インストール方法は2パターンです。
- composerを使用してインストール（今回はこちらを使用）
  - `composer require eftec/bladeone`
- Gitからダウンロードしてフォルダを配置する。

# 基本的な使い方
※テンプレートの名前には「～.blade.php」をつける。例:name.blade.php
```php:index.php
<?php
require_once __DIR__."/vendor/autoload.php";
use eftec\bladeone\BladeOne;

// 読み込みを行いたいテンプレートパス記述
$views = __DIR__.'/views';
$cache = __DIR__.'/cache';
$blade = new BladeOne($views,$cache,BladeOne::MODE_AUTO);

$name1 = "イチロウ";
$name2 = "ジロウ";
$array = array(
    "name1" => $name1,
    "name2" => $name2,
);
echo $blade->run("name", $array);
```
```html:name.blade.php
<div>
  <p>{{$name1}}</p>
  <p>{{$name2}}</p>
</div>
```

## 補足
### $viewsと$cache
`$views`はビュー (コンパイルされていないテンプレート) が格納されるフォルダです。
`$cache`はコンパイルされたファイルが保存されるフォルダです。

### MODEについて
```php
$blade = new BladeOne($views,$cache,BladeOne::MODE_AUTO);
```
上記でモードも決めているがMODEにはいくつかの種類が存在しているため注意が必要。
- MODE_AUTO
  - コンパイルされたファイルが変更されたかどうかを確認。変更されている場合はファイルが置き換えられる。
- MODE_SLOW
  - コンパイルされたファイルが常に置き換えられる。読み込み速度が遅くなる。
- MODE_FAST
  - コンパイルされたファイルが置き換わることがない。ただし、読み込み速度が速くなる。
- MODE_DEBUG
  - 常にコンパイルされ、エラーが発生したファイル名の特定が可能。

# 注意
PHP 5.x はサポートしていないみたいです。
PHP 5.6以上は旧バージョン？が使用できるみたいです。（私の方では未検証です）
> PHP 5.x support?
This version does not support PHP 5.x anymore. However, you can use the old version that is 100% functional with PHP 5.6 and higher.
> 
参考：[BladeOne#php-5x-support](https://github.com/EFTEC/BladeOne#php-5x-support)

# 参考文献
[EFTEC/BladeOne](https://github.com/EFTEC/BladeOne#php-5x-support)
[PowerShell] スクリプトブロックを使えば環境を汚さないワンライナーが書ける

`{}` ←スクリプトブロック
`&{}` ←スクリプトブロックを作って即実行

```powershell:基本的に外の変数に作用しない
$n = 10

&{$n++; echo $n}
# 11
&{$n++; echo $n}
# 11

$n
# 10
```

```powershell:ただし、globalスコープ等を使うと外に作用してしまう
$n = 10

&{$global:n=5; echo $n}
# 5

$n
# 5
```
東京には空がないしPowerShell 5.xにはUTF8がない

以下、2022-09-05時点でWindows11にデフォルトで入ってるPowerShell5.x系の話です。

以下公式ドキュメントより

https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_character_encoding?view=powershell-7.2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/d0012b6d-af5e-8328-60c1-83e6ff1ccda6.png)

UTF8はあるがBOMが無いとダメ。

UTF8と言えばBOMなしが大半の中、PowerShellはBOMあり縛り。

スクリプト言語つかってUTF8のテキストをシェル上でパイブで繋いでみたいな処理をWindows上でやるのは厳しそう。

--2022-09-05追記
コメントでいただきましたように、PowerShellをアップデートすると、UTF8noBOMがデフォルトになるようです。

以下のコマンドでインストールできます。

```
PS C:\Users\yugoy> winget install  Microsoft.Powershell
見つかりました PowerShell [Microsoft.PowerShell]
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
Downloading https://github.com/PowerShell/PowerShell/releases/download/v7.2.6/PowerShell-7.2.6-win-x64.msi
  ██████████████████████████████   102 MB /  102 MB
インストーラーハッシュが正常に検証されました
パッケージのインストールを開始しています...
インストールが完了しました
```
2022-09-05時点では、` winget install  Microsoft.Powershell` で7.2が落ちてきました。インストールが終わって、Windowsターミナルを起動すると、既存のPowerShellの5系と7系が共存する形になっております。アップグレードというよりも別系統のPowerShellが入ったようです（青いアイコンのWindows Powershellが5系、黒いアイコンのPowerShellが7系）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/1e7f5628-27cf-e050-9cc9-f77692836ce9.png)

別物で名前が微妙に違うのでややこしいですが、PowerShell7系の検証は別記事でご報告します。
主キーと外部キー

表の中から一つを探す時どこにあるのかわからない時がある。
そんな時にデータベース上には一つ一つを識別できる情報が含まれている。
それを```主キー```という。
また表と表を関連付ける関係データベースで他の表を参照するときに他の表の主キーを参照する。
参照される主キーを```外部キー```という。

# 主キーは行を特定する鍵のこと
各行を識別するために使う列を```主キー```という。
主キーの条件は
* 表の中で内容が重複しないこと
* 内容が空ではないこと
### 一意性制約
主キーの値あは、重複がなく、ヌル（空値）は認められない。列中の値が重複しない性質のこと
## 複合キー
一つの列では一意にならないけど```複数の列を組み合わせ```れば一意になる場合がある。
このように複数列を組み合わされる主キーを```複合キー```という。
例　　一つ家を特定するためには県と市町村と番地とアパート名等を書かなければ一意にならない。

# 外部キーは表と表をつなぐ鍵のこと
他の表と主キーを参照する列を```外部キー```という。
他の表の主キーと対応させることによって紐づけることができる。

# 気づき
主キーと外部キーはプログラミングでも使われる。
改めて知れて良かった。

# 問題を解いた時の気づき
## 参照一貫性とは？
* ```最初から最後まで矛盾がない状態```であること。同じ態度を持続すること。
    参照一貫性とは```参照するための関係を持続する事```です。
    出典 https://teratail.com/questions/171032

* 参照整合性 (さんしょうせいごうせい、英: referential integrity) は、コンピュータの関係データベースの```関係モデルにおいて2つの関連しあった関係変数 (表、テーブル) の間の一貫性 (データ完全性)``` をいう。 参照整合性は、多くの場合、```主キーもしくは主キー以外の候補キーと、外部キーの、組み合わせにより、強制適用される```。 参照整合性が強制適用されると、外部キーが宣言された関係変数の外部キーを構成する属性 (列、カラム) の値は、その関係変数の親となる関係変数の```主キーの値もしくは主キー以外の候補キーの値として存在しなければならない```。 
出典 https://ja.wikipedia.org/wiki/%E5%8F%82%E7%85%A7%E6%95%B4%E5%90%88%E6%80%A7

## 候補キー
候補キーとは、リレーショナルデータベース（RDB）のテーブル内で、すべてのレコード（組/行）を```一意に識別することができる項目（列/カラム）の組み合わせ```。この中から一つが「主キー」（primary key）に選ばれる。

すべてのレコードで値が異なることが保証されるような列や、値の組み合わせに重複が無い複数の列が該当する。例えば、通し番号や識別番号（ID）のように、データの性質上、```重複しないことが明らかな列は単体で候補キーとなる```ことができる。

また、例えば、全社の各支店の課を一件ずつ登録した「課名」テーブルで「支店名」と「課名」は単体ではどちらもレコード間で重複しうるが、両者の組み合わせ（○○支店××課）は一意である。このような複数の列の複合をキーとすることもできる。

複合キーの場合、厳密には```「いずれか一つが欠けても一意にならなくなる列の組み合わせ」のみ候補キーとなる```ことができる。```このような性質を「既約」であると言う```。例えば、支店名と課名の他に「課長名」を加えても一意だが、これが無くても一意であることは変わらないため候補キーに加えることはできない。

候補キーのうち一つが、実際にレコードの識別に用いられる主キーとして設定される。```主キーに選ばれなかった候補キーのことを「代替キー」（alternate key）```ということがある（「代替キー」という用語はサロゲートキーを指す場合もある）。候補キーに「値無し」（NULL値）を許容するかは諸説あるが、```主キーにNULLは許容されないため、「主キーの候補である」とする立場では許容されないとなる```。
出典 https://e-words.jp/w/%E5%80%99%E8%A3%9C%E3%82%AD%E3%83%BC.html#:~:text=%E5%80%99%E8%A3%9C%E3%82%AD%E3%83%BC%20%E3%80%90candidate%20key%E3%80%91,primary%20key%EF%BC%89%E3%81%AB%E9%81%B8%E3%81%B0%E3%82%8C%E3%82%8B%E3%80%82

## 気づき
主キー、外部キー、複合キー、候補キーなど色々キーがあることがわかった。
主キーと外部キーしか知らなかった。
こうして調べることで他の複合キーや候補キーについて知ることができた。
良かった。

出典 キタミ式イラストIT塾　基本情報技術者　令和03年
【TypeScript入門 #16】Condition TypesとInfer


# 概要

オンラインサロン IT_KINGDOM で、typescript について学んだことを備忘録としてメモしていきます。

# 学習内容

- [Conditional Types とは](#conditional-types-とは)
- [Infer とは](#infer-とは)

# Conditional Types とは

Typescript2.8 で導入された、条件分岐による型推論を行う機能。普段現場で使われることはあまりない様子。<br>
下記の`T[K] extends string ? K : never`部分が Conditional Types。<br>
下記の例では、三項演算子により、`T[K]`の型が string 型のサブタイプかどうかで`ConditonalType`の型が変わる。

```typescript
type ConditionalType<T> = {
  [K in keyof T]: T[K] extends string ? K : never;
}[keyof T];
```

```typescript
type Props = {
  id: string;
  name: string;
  age: number;
};

// T[K] extends string ? K : never 部分がConditional Types
// [keyof T]をつけることで、Lookup Typesとなる。
type FilterString<T> = {
  [K in keyof T]: T[K] extends string ? K : never;
}[keyof T];

// StringKeysの要素は、string型のidとnameになる(number型のageは除外される)。
type StringKeys = FilterString<Props>;

type Filter<T, U> = {
  [K in keyof T]: T[K] extends U ? K : never;
}[keyof T];

type StringKeys2 = Filter<Props, string>; // string型の要素、id、name
type NumberKeys2 = Filter<Props, number>; // number型の要素、age
```

# Infer とは

部分的な型を取り出す機能。

```typescript
// 関数の型を部分的に取り出す
const foo = () => {
  return true;
};

type Return<T> = T extends () => infer U ? U : never;

type Foo = Return<typeof foo>; // Fooの型はfooの戻り値の型、booleanになる

const foo2 = "";
type Foo2 = Return<typeof foo2>; // fooは関数ではないため、Foo2の型はneverになる

// 引数の型を部分的に取り出す
const foo3 = (id: string) => {
  return 3;
};
type Args<T> = T extends (id: infer U) => any ? U : never;
type Foo3 = Args<typeof foo3>; // Foo3の型はfoo3の引数の型、stringになる

// 可変長引数の型を取り出す
const foo4 = (id: string, name: string) => {
  return 0;
};
type Args2<T> = T extends (...args: infer U) => any ? U : never;
type Foo4 = Args2<typeof foo4>; // Foo4の要素はfoo4の引数、id:stringとname:stringになる

type Args3<T> = T extends (...args: [any, infer U, ...any]) => any ? U : never;
type Foo5 = Args3<typeof foo4>; // Foo5の要素はfoo4の2番目の引数、name:stringになる
```

# 参考サイト

[IT Kingdom](https://it-kingdom.com/)
[【TypeScript】Conditional Type で型の条件分岐を行う](https://zenn.dev/oreo2990/articles/1040312d7af066)
【TypeScript入門 #14】ユーザー定義の型ガード(TypeGuard)について

# 概要

オンラインサロン IT_KINGDOM で、typescript について学んだことを備忘録としてメモしていきます。

# 学習内容

- ユーザー定義の型ガードとは
- ユーザー定義の型ガードの使用例
  - 非同期処理の型ガード
  - filter 関数の型ガード

# ユーザー定義の型ガードとは

の型が不明(any)の場合、通常の型ガードでは型の絞り込みはできない。

```typescript
type UserA = { name: string; lang: "ja" };
type UserB = { name: string; lang: "en" };

export const foo = (value: any) => {
  if (value.lang === "ja") {
    // valueの型が不明(any)の場合、型の絞り込みを行うことができない
    return value; // 型:any
  }
  return value; // 型:any
};
```

ユーザー定義の型ガードを定義することにより、上記の場合も型の絞り込みができる。

```typescript
// `user is UserA`は、本関数のuserがUserAを必ず返すことを示す
const isUserA = (user: UserA | UserB): user is UserA => {
  return user.lang === "ja";
};
// `user is UserB`は、本関数のuserがUserBを必ず返すことを示す
const isUserB = (user: UserA | UserB): user is UserB => {
  return user.lang === "en";
};

export const foo2 = (value: any) => {
  if (isUserA(value)) {
    // valueの型が不明(any)の場合でも、返り値の型をUserAに絞り込める
    return value; // 型: UserA
  }
  if (isUserB(value)) {
    // valueの型が不明(any)の場合でも、返り値の型をUserBに絞り込める
    return value; // 型: UserB
  }
  return value;
};
```

# ユーザー定義の型ガードの使用例

## 非同期処理の型ガード

通常、API 等で取得した値の型は any になる。<br>
ユーザー定義の型ガードにより、型を付与することができる。

```typescript
type UserA = { name: string; lang: "ja" };
type UserB = { name: string; lang: "en" };

const isUserA = (user: UserA | UserB): user is UserA => {
  return user.lang === "ja";
};
const isUserB = (user: UserA | UserB): user is UserB => {
  return user.lang === "en";
};

// APIで取得した変数の型はanyになる
export const foo = async () => {
  const res = await fetch("");
  const json = await res.json();
  if (isUserA(json)) {
    // `isUserA`で絞り込むことにより、`json`の型をuserAに絞り込むことができる
    return json.lang;
  }
};
```

## filter 関数の型ガード

現状、filter 関数の返り値に対して型の絞り込みはされていない（Typescript のバージョンアップにより改善される可能性あり）。<br>
ユーザー定義の型ガードにより、filter 関数の返り値の型を絞り込む。

```typescript
type UserA = { name: string; lang: "ja" };
type UserB = { name: string; lang: "en" };

const isUserA = (user: UserA | UserB): user is UserA => {
  return user.lang === "ja";
};
const isUserB = (user: UserA | UserB): user is UserB => {
  return user.lang === "en";
};

const users: (UserA | UserB)[] = [
  { name: "たなか", lang: "ja" },
  { name: "やまだ", lang: "ja" },
  { name: "ジョニー", lang: "en" },
];

// 下記のfilterでは、japaneseの型をuserAには絞り込めていない
const japanese = users.filter((user) => {
  return user.lang === "ja"; // 型: (UserA | UserB)[]
});
// `isUserA`を用いることでjapaneseの型をuserAに絞り込める
const japanese2 = users.filter(isUserA); // 型: UserA[]
```

# 参考
Salesforceのレポートの登録上限を調べてみた

こんにちは。
本橋孝昭です

Salesforceでは「レポートの登録」機能がございます。

※参考ヘルプ
レポートのスケジュールと登録
https://help.salesforce.com/s/articleView?id=sf.reports_subscribe_overview.htm&type=5

この「レポート登録」機能を使用して登録の条件を調べました。


### Lightning環境とClassicの違い

LigtningでもClassicでもレポートの登録ができますが、組織の登録の上限の違いなどがあるようです。

#### ※Lightning環境のレポート登録上限

Lightning Experience インターフェースでのレポートの登録機能は、組織あたりの制限はなく、ユーザ単位の制限と時間当たりの以下の制限となります。 

・ユーザは最大 7 つのレポートを登録可能 
・各 Salesforce 組織は、特定の曜日の特定の時間 (月曜日の午前 9:00 など) に最大 500 件のレポート登録可能  

「参考」
ユーザが登録可能なレポート数の上限
https://help.salesforce.com/s/articleView?id=000317981&type=1 

 ＞現在、ユーザは最大 7 つのレポートを登録し、設定された条件が満たされるたびに通知を受けることができます。

では、ユーザが実際に７つのレポート以上を登録しようとするとどうなるか

このようなエラーが出ます
![レポート１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ef9c3622-be6b-4d86-577b-004c546552db.png)



#### ※Classic環境のレポート登録上限
組織全体で200個までに制限されております。
また 組織で1時間あたりで設定できるレポート数はEnterprise Editionでは、1個と決められているようです。

「参考」
レポートのスケジュールのヒント
https://help.salesforce.com/s/articleView?id=sf.reports_schedule_notes.htm&type=5

＞組織のスケジュール済みレポートは、200 個までに制限されています。




### レポートの備考

レポートに登録可能なユーザはヘルプの通り、最大500ユーザとなります。

Lightning Experience でのレポートへのユーザ、グループ、ロールの登録
https://help.salesforce.com/s/articleView?id=sf.reports_subscribe_lex.htm&type=5 

＞登録ごとに最大で 500 件の受信者がサポートされます。
スッキリわかるサーブレット＆JSP入門で引っ掛かった点

# 概要
タイトル通り、環境構築などで引っ掛かった点と解消法をまとめます。
環境構築方法等は公式WEBで無料公開されています。非常にありがたい！

https://sukkiri.jp/books/sukkiri_servlet2/sukkiri_servlet2_appendix.html

# パースペクティブにJava EEがでない

pleiades 2022版（最新）ではなく2021版をインストールすれば解決

https://mergedoc.osdn.jp/

最新版は使えないのね（悲しい）

# サーバーに追加または除去できるリソースがありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/5d9310de-28c2-21e5-f6f9-4ddc961e0d1f.png)

サーバーにプロジェクトを追加することができない問題。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/bb7e2bcc-4df4-74cd-e197-d1aba6f7b047.png)

Tomcat9(java11)はjava ver17をサポートしていないためできないようです。
Tomcat9(java17)を選択してください。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/3afbc052-b5fa-02e2-cf5c-7744904f89ea.png)

これで追加できます。

# 404 見つからない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/5a4f9cfc-e320-73b3-4a07-4ca24f9f09e4.png)

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/423bb270-8ea9-fca2-d032-2a381a2f5539.png)

サーバー内でプロジェクトを右クリックして「モジュール・ワーク・ディレクトリーをクリーン」を実行します（クリックするとサーバーが再起動していいか聞かれるのでOKとする）。これで404がなくなる場合があります。

Chromeの再読み込みはだめです。

「戻るー＞次へ」もキャッシュが参照されるのでだめです。

プロジェクトのビルド？
ファイルが保存されているか確認

キツイ、エラーの対処が大変や

# JSPエラー : HTTPステータス 500 
コンパイル不可

```java
<%=name %>
<% =name %>
```
下は不可。スペースは入れてはいけない

# for文で挟む

```java
<% for(int i = 0;i<5;i++){%>
	<p>さようなら　<%= i %> </p>
<%}%>
```
こんな感じでfor文でhtmlコード挟めば、

```
さようなら　0

さようなら　1

さようなら　2

さようなら　3

さようなら　4
```
こんな感じになる.

# ファイルの中身を編集し保存
しても、更新されなかった
サーバーを「再開」すれば、ちゃんと更新された。

chromeで実行する場合、「戻る」などで移動してもキャッシュに保存されていてサーバーに問い合わせない場合があるのも忘れないでください！

プロジェクトの「クリーン」が必要な場合もあった。
jspファイルに関しては「ファイルの保存」のみで更新された。

# エディタの文字サイズの変更
引っ掛かったわけではないですが、デフォルトでは小さくて見ずらい方へ
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/747ffb4a-43a9-9c00-cbd7-2bd5da71cd0d.png)
「Java」->「Javaエディター・テキスト・フォント」を選択
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/41c9538c-b22f-fb5b-4a6e-aa82e4c10853.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/d73b45cc-5b3a-0201-ef84-9c9c49d7012b.png)

私は11が一番よかったです。

# プロジェクト・エクスプローラーの文字サイズの変更
前項と同じ設定から変更

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/d5c05673-9238-55a2-076c-884fbfcb99a8.png)

「ビュー及びエディター・フォルダー」ー＞「ビューのツリー及びテーブル・フォント」

一つ上の「パーツタイトル」はファイルタイトル[~.java]の文字サイズを変更できます。個人的には小さくていい

# リボンの文字サイズの変更
わからず、リボンの文字などはWindows側の設定になるのかもしれない。Blender使った時もリボンが小さくて悩んだ

# 自動getter,setter生成

https://itsakura.com/eclipse_getterandsetter


# Served at のみ表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/6f00e7d6-2408-584e-4b44-6ff9a8fb4ba0.png)

forward先のjspファイルがロードされていなかったと思われる。
プロジェクトをビルドしなおし、再起動を掛けたら狙い通りの動きに治った

# 405エラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/03084828-32ae-b259-d48c-57ca5aedcf37.png)
様々な理由でこのエラーは出るので、デバッグは難しいが、今回の場合は

```java
<input type="submit" value = "つぶやく">
```
を

```java
<input type="submit" name = "つぶやく">
```
と間違えていたことによる。

今回、送信ボタンを押すとエラーに飛んだのでわかりやすかったが、JSP内のどこにエラーがあるか非常に原因がわかりにくいのでここら辺は大変だと思う。

# JSPで何か面白いものを作りたい

* 以前、Javaで製作したブロック崩しをWebアプリ化
*
【VBA】ファイルの読み込み(CreateObject関数/Line Input # ステートメント)

VBAでファイルの読み込みを行う際に、改行コード/文字コードでLine Input # ステートメントのファイルの読み方・文字化け等が発生する事を学習しましたので、検証結果も兼ねて備忘として残しておきます。
※UTF-8の文字コードだと、文字化けするのでCreateObject関数を使用する事も覚えました。

今回検証に使用するファイルは、以下のような文字が記載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/f546abca-0f1e-cca4-b2a7-603a42272649.png)

改行コードがCRLFの場合は、Line Input # ステートメントを使用したファイル読み込みは一行ずつ読み込みを行います。
下記のような感じです。シンプルに転記を行いたい場合は、これでよいと思います。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/67f7b683-3412-c164-08f0-b6cad9fc5db4.gif)


LFの場合は一行ではなく、全文読み込みを行います。
下記のような感じです。転記する場合は用途によりますが、私はsplitで改行コードやカンマ等で区切りました。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/c8566f2a-9825-45c2-47ec-8a04e33c883f.gif)

文字コードがUTF-8の場合は文字化けしますので、後期するCreateObject関数を使用します。
下のような感じで、ひらがなや漢字が文字化けします。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/a4c9e9df-98dc-d357-ff7c-673d7e848bfe.gif)

CreateObject関数については、ReadText メソッドで全文取得を行えるようです。
また、String = Stream.ReadText ( NumChars)　が構文となるようで、ReadText (-2)で一行単位で読み込みを行えました。今回は、ReadTextで全文読み取ってspiltで対応しました。
Charsetで文字コードの指定を行えます、


※下記を参照致しました。
[Stream オブジェクト (ADO)](https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/stream-object-ado)

```
'一行ずつ読み込み
Do

   tmp(i) = .ReadText(-2)

   If tmp(i) = "" Then
    
        Exit Do
        
   End If
    
   i = i + 1
    
Loop

'全文読み込み
Set Stream = CreateObject("ADDOB.Stream")

With Stream

	.Charset = "UTF-8"
	.Open
	.LoadFromFile (File_Pass)

    Do

        tmp(i) = .ReadText(-2)

            If tmp(i) = "" Then
    
                Exit Do
        
            End If
    
        i = i + 1
    
    Loop

End With
```

たまに使う機能なので、下記にサンプルコード載せておきます。

```:サンプルコード

'CreateObject関数
Dim File_Pass As String
Dim Stream As Object
Dim tmp As Variant

File_Pass = Dir(ThisWorkbook.Path & "\*.csv")
File_Pass = ThisWorkbook.Path & "\" & File_Pass

Set Stream = CreateObject("ADODB.Stream")

With Stream

    .Charset = "Shift_Jis"
    .Open
    .LoadFromFile (File_Pass)
    tmp = .ReadText
    tmp = Split(tmp, vbLf)

End With

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'Line Input # ステートメント
Dim File_Pass As String
Dim tmp As Variant

File_Pass = Dir(ThisWorkbook.Path & "\LF_test.csv")
File_Pass = ThisWorkbook.Path & "\" & File_Pass

Open File_Pass For Input As #1
    
    Do Until EOF(1)
        
        Line Input #1, tmp
        tmp = Split(tmp, vbLf)
    
    Loop

Close #1
```

以上です。
何かの参考になれば幸いです。
ポップアップをトーストと呼ぶのはどんなとき？

# なにこれ？
みなさんは**トースト**って知っていますか？
初めは「何それ？おいしいの？」って思うほど何かわからなかったんですが、調べていくうちに、「**ポップアップ**」「**ダイアログ**」「**モーダル**」など、似たような意味を持つものがあることがわかりました。

この記事ではそれらを正確に区別し、**トーストとは何なのか**を紐解いていきます！





# モーダル・ポップアップ・ダイアログの意味の違いを抑える
トーストとは何かを理解するために、まずはモーダル・ポップアップ・ダイアログの意味の違いを抑えましょう。
これら3種類は、[こちらの記事](https://rilaks.jp/blog/ui/modal-pop-up-dialog/ "違い")がとてもわかりやすかったので参考に解説していきます。



## モーダル・ポップアップ・ダイアログでは意味の焦点が変わる
「モーダル」「ポップアップ」「ダイアログ」の大きな違いは、**意味の焦点が変わる**ことです。
どれも結果的には同じ対象物を指して使うこともありますが、その場合も意味の焦点が変わってきます。

以下でそれぞれの違いを見ていきましょう。



## モーダルとは
応答しない限り元の画面の操作に戻れないという「**制御**」にフォーカスした単語です。

「モーダル（modal）」は「モードレス（modeless）」と対になる言葉であり、それぞれ、「**モードがある状態**」と「**モードが無い状態**」を表します。
**モード**は、例えば「入力モード」「編集モード」などの例を思い浮かべていただければわかりやすいかと思いますが、何か特定のことをするための「形式・様式」のことです。

例として、下の画面を見てみましょう。
![スクリーンショット 2022-08-03 21.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668385/2b419e24-962b-e00c-c511-ddc8522a3acb.png)
中央に表示されているウィンドウに対して、「投稿する」ボタンか「キャンセル」ボタンを押さない限り、元々見ていた画面をクリックしたりスクロールしたりできない状態です。

つまり、ユーザーの環境を「**このウィンドウに応答するモード**」に**制御**しています。このような仕様をモーダルと言います。


## ポップアップとは
突然現れるという「**表示の仕方**」にフォーカスした単語です。

「ポップアップ（pop-up）」は、突然ポンッと現れるという表示の仕方に重点を置いた単語です。英単語のpop upに「突然起こる、突然現われる」という意味があります。

なので、ポップアップは言葉の意味通り、**画面に突然現れるウィンドウを全てポップアップと呼ぶことができます**。





## ダイアログとは
ユーザーに情報を伝えて、それに対して応答を得るという「**やりとり**」にフォーカスした単語です。

「ダイアログ（dialog）」は「**対話**」という意味を持つ英単語のdialogから来ています。

つまり、「**ユーザーに何かを伝えて、それに応答してもらう**」という流れを「対話」になぞらえた、「やりとり」にフォーカスした言葉です。

典型的な利用シーンとしては、ユーザーに何かを案内・警告したり、了解を得たり、入力を求めたりすることが挙げられます。

モーダルの解説で例に出した画面も、ユーザーに何かを案内して応答を得るという側面に注目すれば、定義的にはダイアログと言うこともできます。



## まとめ
| 単語 | 意味 |
|:-|:-|
| モーダル  | 応答しない限り元の画面の操作に戻れないという「**制御**」にフォーカスした単語  |
| ポップアップ | 突然現れるという「**表示の仕方**」にフォーカスした単語 |
| ダイアログ  | ユーザーに情報を伝えて、それに対して応答を得るという「**やりとり**」にフォーカスした単語 |




# トーストとは
トーストとは、別名として**トーストポップアップ**とも呼ばれることからもわかるように、**ポップアップの一種または同じもの**とみなされています。

「トースト(toast)」はパンの「トースト」が由来して名付けられました。ウィンドウの下から出てくるポップアップが、まるでトースターから飛び出るトーストのようだという理由からトーストと名付けられました。

デスクトップでは、トーストは画面の端に小さく現れ、**一定時間が過ぎると自動的に引っ込む**ようになっています。
アプリでも同様で、画面の下方に現れ、**一定時間が過ぎると自動的に引っ込む**ようになっています。

![Screenshot_20220801-150806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668385/0fdcc574-ebbc-99be-e0c4-b54a601f85c3.png)

## Android12からトーストの表示が変更される
Androidに限った話ですが、Android12からトーストの表示が変わります。

主な変更点は以下のとおりです。
- テキストが2行までしか表示できない
- テキストの横にアプリアイコンが表示される。

（参考：https://developer.android.google.cn/about/versions/12/behavior-changes-12?hl=ja#toast-redesign）

# 終わりに
この記事では**トースト**についての内容でしたが、何となくでもわかったでしょうか？(トースト以外の内容が半分になってしまいましたがw)
トーストやモーダルなど、似たようなものを区別して呼び分けられるようにしていきましょう！
Xcodeビルド時に証明書がInvalid trust settingsって言われた時の対処法

![スクリーンショット_2022-08-07_9_29_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/bc5ec23e-8ff0-e84c-6d48-66cd177c45ad.png)

## 背景
旧macから新macに証明書を移行した。すると証明書が信用できない！となり、上記のエラーがでた。

移行方法は Xcode > Preferences > Manage Certificatesで証明書を右クリックで書き出して移動。

profileはファイルで移動させた。

## 対応

![スクリーンショット_2022-08-07_9_31_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/ba2895a0-a75e-fc63-e800-c70696e93bea.png)

これでいけた。

## おわりに

Repairへの導線があまりに分かりづらいので他にやりかたがありそうな気がする。
Github PRでマージ後にブランチを自動削除する設定

# 概要

- GithubにてPRでマージ後にブランチを自動削除する設定方法をまとめる。

# 方法

1. 当該のリポジトリページを開き「Settings」を開く。

    ![miriwo0104_account_book.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/cab255f3-a4c8-45f4-3343-50c113a76a99.png)

1. 再度バーで「General」を開き、下までスクロールする。

    ![General.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3f8555b9-d1aa-57a0-d359-18b9ad727a18.png)

1. 「After pull requests are merged, you can have head branches deleted automatically.」の「Automatically delete head branches 」のチェックボックスにチェックを入れる。（おそらく設定は自動保存自動反映）

    ![General.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/0ddae644-daf3-f314-8c39-1eb778c33f91.png)


# 参考文献

- [https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-the-automatic-deletion-of-branches](https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-the-automatic-deletion-of-branches)
M1系Macのターミナルでarm64⇄x84_64を切り替える方法

# はじめに
M1チップ対応のソフトやライブラリは増えてきましたが、まだ完全対応している訳ではなさそうです。

RosettaでiTermを実行するのも良いのですが、基本はarmを使いたいので一時的にx84_64を使いたい時に役立ちそうな内容を共有します。



# 設定方法
下記の二つを `.zshrc` に記載しエイリアスを設定します。

```shell
alias intel="env /usr/bin/arch -x86_64 /bin/zsh --login"
alias arm="env /usr/bin/arch -arm64 /bin/zsh --login"
```

:::note info
x86_64==正確にはintelではないので、気になる方はエイリアスを変更してください。（M1前のMacがIntelのためそのように記載しています。)
:::


# 確認
`source ~/.zshrc`で設定を読み込み、下記コマンドが実行されることを確認します。

```shell
% uname -m
arm64

% intel # 先ほど設定したintelコマンドを実行すると
% uname -m # 実行環境がx86_64に
x86_64

% arm # armコマンドを実行すると
% uname -m # 実行環境がarm64になります。
arm64
```

# さいごに
私の場合はarmをfishに、x86_64をzshにしているので一目でどちらを使っているのかわかります。
実行環境ごとにシェルを変えるのは個人的におすすめです。
![スクリーンショット 2022-08-07 9.26.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326068/03f7ef84-d4e1-b8e5-1554-1d38f134bce1.png)
プログラマの集中法「ポモドーロ・テクニック」は集中・休憩の両面からアプローチする黄金テクニックだ

# ポモドーロ・テクニックには二方向のメリットがある

- 集中が足りない場合は、25分を集中目標とすることで、集中度を引き上げてくれる
- 集中のピークを過ぎても無意識的に時間を過ごしてしまう場合は、25分ごとの強制休憩によって、区切りを作ってくれる

ポモドーロ・テクニックはこの両方からアプローチしてくれる。

他の人とポモドーロ・テクニックについて語った時、なんとなくそんな予感はしていた。人によってこのテクニックが別方面から働くのではないかと感じていたのだが、いざ自分がしっかり実践し始めて、よりそのことを感じている。

# 取り組む物事によって集中可能なレベルは違う

人によって集中度が変わるというよりは、集中対象によって集中度が変わる。

たとえばある人はプログラミングは得意かもしれないが、読書は苦手で集中しづらいかもしれない。
得意分野におけるポモドーロ・テクニックは良い休憩を作ってくれる。逆に苦手分野では集中目標を作ってくれることになる。

集中度が足りない場合も、十分に足りている場合も、どちらにおいてもメリットを発揮するというのが、このテクニックの素晴らしいところだと思う。

# このテクニックのポイントは集中よりも休憩ではないか

集中だけを意識して、休憩を軽視しているとしたら、片手落ちだ。

しっかりと集中することよりも、しっかりと休憩することの方が難しい。
たとえばプログラミング学習であれば、休憩時間にもWebで記事を読んだり、スマホを使っていては意味がないのだ。

ヨガ的に体を伸ばしたり、少し歩いたり、目をつぶって呼吸を数えるなどして、しっかりと休憩を心がけた方が良い。

# 黄金のリズム

なぜならポモドーロ・テクニックの目的は集中と休憩の組み合わせによって、黄金のリズムを生み出すことだ。

ただひたすらに集中時間ばかりを続けるのは、リズムではなく間延びだ。そもそもベストな集中も出来ないだろう。

# 何故集中25分+休憩5分なのか？

この時間設定はポモドーロ・テクニックの提案者の工夫の末に生まれたようだ。

いわば人間の集中力の性質に合わせて作られたわけだが、ある程度はカスタマイズしても良い。

集中時間は20分-40分程度がオススメされていたと思う。


# 真面目に実践するならオリジナル本をオススメする

ネット情報では気付けない部分も気付けるはずだ。

https://www.amazon.co.jp/dp/B07NRKH13Z/


<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
バックエンド開発 Goのインストールと初期設定

## はじめに
バックエンドの環境構築で
Visual Studio CodeでGoを使用するために行ったことについてまとめます。

## 記事を書いてる人の前提条件
・[自己紹介](https://qiita.com/bear05/items/9bc49f01def7305fa075)

## 仕様技術、環境
OS → Windows　
エディター → Visual Studio Code

## Goとは
Googleが開発したサーバーサイド用のプログラミング言語。
C言語やC++に似ている言語。

参考記事↓
・[Goのエキスパートが教えるGoの魅力、プログラミング基礎入門](https://flxy.jp/media/article/10744)

## 環境構築
実施したこと
1. Goのインストール
1. Visual Studio CodeでGoを使用できるようにする

参考記事
・[Go 開発用に Visual Studio Code を構成する](https://docs.microsoft.com/ja-jp/azure/developer/go/configure-visual-studio-code)
URLリスト中からランダムにページを表示していくPGM

<h3>URLリスト中からランダムにページを表示していく</h3>
URLリスト中からランダムにChrome上からページを表示していくPGMをpowershellから作りました

<hr>
コード<br>

```powershell

#SendKeysを使うため、System.Windows.Forms名前空間読込
Add-Type -AssemblyName System.Windows.Forms

#読み出し時間(秒)
$ReadSecond = 30
#何回分繰り返すか
$CountLength = 100
#URLリストのパス
$URLListPath = "C:\hogehoge\VerbList4..txt"
##URLリストを読み込み
$contents = Get-Content $URLListPath

##echo $contents

$rnd = 1

echo "ランダム読み出し開始"
#この間にトップ画面をchromeにする
Start-Sleep -s 60
echo "Start"


for($i=0; $i -lt $CountLength; $i++){

[System.Windows.Forms.SendKeys]::SendWait("^l")
Start-Sleep -s 2
$rnd = Get-Random -Maximum ($contents.Length-1) -Minimum 1
[System.Windows.Forms.SendKeys]::SendWait($contents[$rnd])
Start-Sleep -s 2
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
Start-Sleep -s $ReadSecond

}
```

<hr>
参考にしたサイト<br>

<a href="https://step-learn.com/article/powershell/105-file-read-all.html">PowerShell: テキストファイルを一括で読み込んで変数に格納</a><br>
<a href="https://support.google.com/chrome/answer/157179?hl=ja&co=GENIE.Platform%3DDesktop#zippy=%2C%E3%82%A6%E3%82%A7%E3%83%96%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88">Chrome のキーボード ショートカット - パソコン - Google Chrome ヘルプ</a><br>
Chrome 拡張機能を実装してみたのでハンズオン形式でご紹介

エンジニアの方ならよく利用するChrome。
Chromeを使う方なら拡張機能もよく使用するのではないでしょうか。

一般的にはChrome Web Storeで入手することがほとんどですが、
痒い所に手が届くものはなかなかありません。

ということで今回は自作してみました。
手順を載せてますので、よければご覧ください。

# リポジトリ
GitHubで公開しています。

https://github.com/hiromu-ikeda/ChromeSiteBlocker

# 手順
## 開発環境
今回はとてもシンプルにしてみました。

ローカルに、拡張機能開発用ディレクトリを用意して、エディタで開いてください。

## ファイルの準備

今回のファイル構成です。

```
.
├── stopYouTube.js
└── manifest.json
```

こんな感じ。

## ファイルの編集
### stopYouTube.js
今回は、自分のYouTube依存を解消するため、YouTubeにアクセスしたら自動的にgoogle.comにリダイレクトするようにします。
```
window.location.href="https://google.com"
```
### manifest.json
上記のjsファイルに関しては特に重要ではなく、それぞれで実装したい機能を実装していただければと思います。
今回の肝はこのファイルです。
```

{
    "name": "siteBlocker",
    "version": "1.0.0",
    "manifest_version": 3,
    "description": "This extension can block site.",
    "content_scripts": [
        {
            "matches": [ "https://www.youtube.com/*" ],
            "js": [ "stopYouTube.js" ]
        }
    ]
}
```
プロパティごとに解説します。
* name
拡張機能の名前です。自由に設定していただいて構いません。
* version
拡張機能のバージョンです。
```
*.*.*.*
```
*には、それぞれ、一桁目が0以外の4つの数字を入れることができます。
（例）1.23.456.7899
ただし、0のみなら大丈夫です。
（例）1.0.23.456
* manifest_version
manifest.jsonのバージョンです。
2022年8月7日現在では、3にしておけばいいかと。
* description
拡張機能についての説明です。自由に設定していただいて構いません。
* content_scripts
**matches**
拡張機能を使用したいURLを記述します。
書き方が少し特殊で、最後に/*を入れないと、エラーになります。
詳しくは公式ドキュメントを参照してください。
**js**
今回は、stopYouTube.jsを指定します。

## 反映
あとはChromeに反映させるだけです。
![スクリーンショット 2022-08-07 9.02.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680780/a0d55daf-61c7-74f4-ee7b-9c5df88d12c2.png)
Chromeの右上の拡張機能（パズルのピースみたいなの）をクリックして、一番下の
**拡張機能を管理**
を選択します。
![スクリーンショット 2022-08-07 9.04.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680780/8d2fe3a4-1fcf-30c6-8ac4-a152e1312a5b.png)
以上のような画面になると思いますので、
右上のデベロッパーモードがオンになっているかをチェックして、なっていなかったらオンにします。
左上の
**パッケージ化されていない拡張機能を読み込む**
をクリックして、ソースコードをディレクトリごと選択すると、反映されます！

## エラーの確認方法
エラー文が出ていると、拡張機能一覧で、削除ボタンの右にエラーというボタンが出てくるので、そちらを押すと、エラー内容が確認できます。

# これからの課題
今回は完全に個人開発で、規模も超小規模でしたが、仮に開発するとしたら以下の点を改善する必要がありそうです。
* 自動アップロード
毎回ファイルアップロードしなおさないといけないのは面倒臭い。。。
* TypeScriptでの開発
プロダクトとして開発するなら、TypeScriptで開発する方がベターですね。
* Webストアへのアップロード
公開するにはWebストアに関する知識が必要そうです。
AthenaでMicrosoft365の監査ログを見る

# はじめに
前回、Microsoft365のログをS3に保存するLambdaを記事にしました。

https://qiita.com/a_b_/items/84d6ae3cf8a21b8b332c

今回は、それらファイル群をAthenaで見てみました。

# ファイルの形式
今回用いるファイルの形式は以下のページに倣って、
- JSON文字列
- 1データ1行
- 改行がデータの区切り

としています。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/json-serde.html

:::note info 
当初は前回のログ抽出部分で`Export-Csv`を使ってCSV出力していました。
ところが`auditdata`カラムがJSON文字列であり、その中で使われている特殊文字のエスケープがAthenaと相性が悪く、検索できないテーブルになってしまったので、`ConvertTo-Json`を使ったJSON文字列としています。
:::

ファイルの場所はすべて`s3://<<バケット名>>/sampleathena/nopart/`直下に保存しています。

# CREATE文

```sql
CREATE EXTERNAL TABLE IF NOT EXISTS default.ms365auditlog_nopart(
    pscomputername string ,
    runspaceid string ,
    psshowcomputername boolean ,
    recordtype string ,
    creationdate timestamp ,
    userids string ,
    operations string ,
    auditdata string ,
    resultindex int ,
    resultcount int ,
    identity string ,
    isvalid boolean ,
    objectstate string 
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://<<バケット名>>/sampleathena/nopart/'
```

`auditdata`がJSON文字列になっており、struct型で入れ子状態を定義しようとしたのですが、データごとに定義が異なると受け付けてくれないようです。

そのためここでは文字列として扱い、検索時にパースして使うこととしました。


# SELECT文
`auditdata`から特定の要素を取りたい場合は`json_extract_scalar(json_parse(auditdata),'$.<<特定の要素>>')`と書くようです。

例として、監査ログから「特定のIP以外からのログインについて、ユーザーと日時を抽出する」というSQLは以下になります。

```sql
-- 特定のIP以外からのログインを取得
WITH TEMP AS (
SELECT
 userids
  ,json_extract_scalar(json_parse(auditdata),'$.Operation') AS Operation
  ,json_extract_scalar(json_parse(auditdata),'$.CreationTime') AS CreationTime
  ,json_extract_scalar(json_parse(auditdata),'$.ClientIP') AS ClientIP
 ,"auditdata"
FROM "default"."ms365auditlog_nopart" 
)
SELECT * FROM TEMP
WHERE 
    Operation = 'UserLoggedIn'
    AND ClientIP NOT IN ('11.11.11.11')
;
```

他にもいろいろな読ませ方があるようです。

https://qiita.com/growsic/items/bc0b0f88c1216e65f0f7

# おわりに
前回作ったLambdaで収集した監査ログをはAthenaで見る方法を紹介しました。
本運用の際には、色々なサービスと繋げてアラームとかも作れたら、と思っています。
WordPress投稿ページの検討

## クライアントのためにシンプルな投稿ページを

クライアントにとって使いやすい投稿ページを作成しようと検討しました。
ブロックエディタでのテンプレート機能やAdvanced Custom Fieldsの機能などを使ってみましたが、
結果としてCPT UI x  Smart Custom　Fieldsに落ち着きました。

ガリガリ言語ページではなく、プラグインをうまく使っていい感じにページを作成したい思いで綴ってます。

手抜きすぎだろ！と突っ込みたい気持ちを抑えて読んでいただけるとありがたいです。

クライアントは、wordpress触りたいけど知識は全くないので、
迷わず投稿できるか、、という部分で

今回、事例ページとコラムページを作りたいということで

### CPT UIを利用して専用メニューの作成

https://hirashimatakumi.com/blog/5271.html




事例ページとコラムページの構成としては、

見出し
画像
テキスト

とシンプルなループで処理したい。
というわけで、

https://ja.wordpress.org/plugins/smart-custom-fields/

を利用しました。
ここの便利なところは、繰り返し項目も生成できること。
（店舗情報を次々と追加したい方は便利ですよね！）
出力方法はこちら↓

https://millmi.com/1461/

とまあ覚書になってしまいましたが、、、


画像出力のメモ
```php
<?php
$get_group = SCF::get( 'グループ名' );
foreach ( $get_group as $fields ) {
?>
<dl><dt><a href="<?php echo wp_get_attachment_image_url($fields['画像フィールド名'], 'large');?>" target="_blank" rel="lightbox" data-lightbox="lightbox-img"><?php echo wp_get_attachment_image($fields['画像フィールド名'], 'large');?></a></dt>
<dd><p><?php echo esc_html( $fields['テキストフィールド名'] ); ?></p></dd>
</dl>
<?php } ?>
```
【夏休み企画】#IT用語一問一答【毎朝投稿4日目】Ethernet

# この記事を読むと、、
- 「関連用語」を使って「Ethernet」を説明できるようになる
- 「Ethernet」がもっと好きになる(多分)

# 関連用語
Ethernet frame / FCS / L2 switch

[**復習用**] 記事の内容を見る前に上記の言葉でEthernetを説明してみよう！

# 企画説明
- クラウドって何？って人に聞かれて説明してるけど俺もよく知らないや、、
- ドキュメント読んでみてるけど半分くらい何言ってるか分かんない、、
- 今日の夕飯はナスの炒めものにしよっかな〜、あれ、NASってなんだっけ？

みたいなことが結構あったので、知ったかしていたIT用語を毎日一個ずつちゃんと学んでいこうっていう企画です！

昨日の記事はこちら↓

https://qiita.com/acta/items/33d47fc59ce251845109

# Ethernetとは
Ethernet = 有線LANの主流通信規格

- OSI参照モデルでの物理層とデータリンク層を規定する

Ethernetで受け渡しされるデータの単位 = **Ethernet frame**

- frameは以下の要素で構成される
    - 送信元MAC address
    - 宛先MAC address
    - EtherType = Payloadのプロトコルor長さを意味する
    - Payload
    - **FCS** = Frame Check Sequence
        - 通信中のデータの欠損の有無を確かめる役割がある
- Ethernet frameにはTTLがない
    - frameがネットワーク上を回り続けるのを防ぐプロトコルが存在する
- frameの宛先MAC addressが自分のMAC addressと一致している場合にPayloadを読み込み、それ以外は無視する

MAC addressに基づいてframeを中継するL2デバイス = **L2 switch** = Network Switch

- L2 switchは自身が持つMAC table = MAC addressとポートの対応表から、ユニキャストで特定ホストにframeを送信できる

# 【おまけ】調べている時にでてきたなにこれ用語
- MAC address = Media Access Control address = Network Cardに割り当てられる識別子
- Twisted-pair cable = 電線を2本対で撚り合わせたケーブル

# 参考資料
- https://en.wikipedia.org/wiki/Ethernet
- https://en.wikipedia.org/wiki/Ethernet_frame
- https://shinmeisha.co.jp/newsroom/2020/01/28/l2%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%81%AE%E6%A6%82%E8%A6%81%E3%81%A8%E5%9F%BA%E6%9C%AC%E5%8B%95%E4%BD%9C/
- https://ja.wikipedia.org/wiki/%E3%83%84%E3%82%A4%E3%82%B9%E3%83%88%E3%83%9A%E3%82%A2%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB
Windows ユーザモードとカーネルモードを理解する

## 概要
サーバ監視時にユーザモードとカーネルモードのCPU使用率があり、何が違うのか、そもそも何なのか気になったので調べてみました。タスクマネージャで見る方法もあるのでまとめました。

## ユーザモードとカーネルモード
WindowsのCPUの動作モードはユーザモードとカーネルモードがあります。
* ユーザモード
アプリケーション(Excel、Wordなど)を実行したときのモード

* カーネルモード
メモリ、ディスク、NICなどのリソース、ディスク書き込み、画面表示などシステムを制御、管理を実行しているモード

## タスクマネージャでの確認方法
CPUのグラフの上で右クリック、カーネル時間を表示するをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/aa18cf3e-d13a-af3d-3746-b7d05662cd25.png)
そうすると、これが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/ed53ec49-6242-2f77-1e05-d0e0755f120b.png)
これになります。わかりづらいですが、少し濃い水色で点線の部分がカーネルモードのCPU使用率です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/37397936-3f50-9a6d-9b78-f5e3417e20a7.png)
もう少しわかりやすいところを拡大しました。青の部分がユーザモードのCPU使用率、緑の部分がカーネルモードのCPU使用率です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/e98cb391-b493-9fba-afcd-99e52a5b722e.png)

## 実験
PowerShellでカウントするだけのスクリプトを実行します。(ユーザモードでアプリケーションを実行することになります。)

カウントを表示する場合(画面表示でカーネルモードを使うと予想)と、しない場合で実行して、タスクマネージャで確認してみます。

```表示あり.ps1
while ($i -ne 0) { echo $i; $i++ }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/4a49645b-baaa-6b65-450f-1f5a8370883d.png)

```表示なし.ps1
while ($i -ne 0) { $i++ }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/e7d760f7-a945-aeef-857a-2b77450a5f0c.png)

予想通り、表示ありだとカーネルモードのCPU使用率が高くなりました。表示なしの場合は、ユーザモードの使用率が大半を占めていました。

## ちょっとだけ詳しく
* ほとんどのアプリケーションはユーザモードで実行されます。
* ユーザモードで実行されたアプリケーションはリソースに直接アクセスすることはできません。
* ユーザモードで実行されたアプリケーションがディスク書き込み(Wordで文書を作って保存など)をする場合、カーネルモードに処理を要求します。

## なぜ2つのモードがあるのか
ユーザモードで実行されたアプリケーションが暴走したとき、そのアプリケーションだけで影響をとどめ、システム全体に影響しないようにするためです。
仮想化と分散処理

# 仮想化とは
クラウドを支える上で重要な技術が**仮想化**
コンピューターが何か仕事をするときは、物理的なメモリやハードディスク、OSなどの様々な部品が必要
これらの部品をソフトウェアで置き換えるものが**仮想化技術**。
ex)
仮想サーバーは、ひとつの物理サーバー上に、複数の異なるサーバーを仮想的に作成し、本来サーバーに必要な物理的な部品を仮想的に作成する
ネットワークも同様に、一つの物理的な配線を仮想的に分割し、別のネットワークと統合したりして、その接続を瞬時に瞬時に変えることができる。

## 仮想化による複製
仮想サーバーに割り当てるメモリやストレージは、自由に増減できる。そのためメモリやストレージは自由に性能を調整できる。
性能を限界に引き上げても、それ以上に負荷がかかった場合は、サーバーの台数を増やさなければならない。
こうした作業も仮想化は有効
* 物理的なサーバーの場合
    **台数を増やすためには、サーバー（パソコン）自体が何台も必要**
* 仮想的なサーバーの場合
    **一台の物理マシンに何台も仮想マシンを作成できる**
# 分散処理とロードバランサー
クラウドを支える上でもう一つ重要な技術が**分散処理**
分散処理とは、複数の機器に処理を分散させる手法のことを指す。
一般的なサイトでは大きくアクセスが集中することは少ないが、イベントやキャンペーンをするとアクセス量が膨大になる。
そんな時に、同じ機能や情報を持った複数のサーバーに処理を分散させることで、一台あたりの負担を軽減し、サーバーダウンを防ぐ。
複数のサーバーに処理を振り分けるのが**ロードバランサー**と呼ばれるもの。
AWSではロードバランサーとして、**ELB**(Elastic Load Balancing)がある。

## **冗長化とは**
万が一システムやサーバーに何かあった場合でも稼働し続けられるように対策しておくことをいう。
バックアップをとり、複数台で運用したりするのが一般的
備忘録 LeetCode-2. Add Two Numbers

## はじめに
この記事はアルゴリズム振り返り用メモ，
言語化練習用に作成した記事です．
### URL
問題URL
[Add Two Numbers - LeetCode ](https://leetcode.com/problems/add-two-numbers/submissions/ )
## 対象者
・初心者
## code
```
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* node = new ListNode(-1);
        ListNode* copy = node;
        
        //商を入れる用
        int curry = 0;
      
        while(l1 || l2 || curry){
            //作成 & 更新
            copy->next = new ListNode(-1);
            copy = copy->next;
            
            //前回の商で初期値にする
            int n = curry;
            //値があるnodeと計算
            if(l1 != nullptr)n += (l1->val);
            if(l2 != nullptr)n += (l2->val);

            //余剰を入れる
            copy->val = (n) % 10;
            //商の更新
            curry = (n) / 10;
            
            //今,値がある場合更新する
            if(l1)l1 = l1->next;
            if(l2)l2 = l2->next;
        }
        return node->next;
    }
};
```
## 結果
Runtime: 75 ms, faster than 20.05% of C++ online submissions for Add Two Numbers.
Memory Usage: 71.5 MB, less than 51.04% of C++ online submissions for Add Two Numbers.
## 詳細
![LeetCode-2. Add Two Numbers (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736795/7edf2f0e-1dd3-8354-6ffd-97659d0a9c20.png)

画像の結果では答えは 7 0 8　になる

### 手順
1, l1,l2,前回の商がある場合ループをする
2, l1,l2どちらかの値がある場合nodeを新しく作る
3, 値のある位と前回の商で計算する
4, 計算した物の余剰をnodeに入れる
5, 商を更新する
6, l1,l2　値がある場合はnextに更新する



### 画像と手順を合わせると

#### 1週目
1, l1,l2,前回の商があるのでループをする
2, l1,l2どちらも値があるのでnodeを新しく作る
3, l1,l2の一の位である 2 と 5 を計算して 7 を出す
4, nodeに7の余剰である7を入れる
5, 7の商は0なので0を次回に持ち越す
6, l1,l2どちらも値があるので更新する

#### 2週目
1, l1,l2,前回の商があるのでループをする
2, l1,l2どちらも値があるのでnodeを新しく作る
3, l1,l2の十の位である 4 と 6 を計算して 10 を出す
4, nodeに 10 の余剰である 1 を入れる
5, 10 の商は 1 なので 1 を次回に持ち越す
6, l1,l2どちらも値があるので更新する

#### 3週目
1, l1,l2 前回の商があるのでループをする
2, l1,l2 どちらも値があるのでnodeを新しく作る
3, l1,l2 の百の位である 3 と 4 を計算して 7 を出す
4, nodeに 7 の余剰である 7 と前回の余剰である 1 を計算して 8 を入れる
5, 8 の商は 0 なので 0 を次回に持ち越す
6, l1,l2 どちらも値があるので更新する

#### 4週目
1, l1,l2,前回の商,すべて無いのでループしない

## 参照
分かりやすく説明してくださっている方の動画URL
[youtube](https://youtu.be/VU_B3j-Mvps)
## おわりに
今回は約15分程度で解けたので次回以降もこの調子で解いていきたいです．
クラウドとオンプレミス

# クラウドとは
**いつでもどこでもインターネット回線を介してアクセスできる環境**
ex)Office 365、音楽の配信サービス、ストレージサービス、画像の保存サービス
# インフラを丸ごと借りる「クラウドコンピューティング」
クラウドの中でもサーバーやネットワークなどインフラ一式を貸してくれるサービス
ex)AWS,Microsoft Azure,Google Cloud Platform
このようなクラウド上に用意されたインプラを利用するサービスや利用することは**クラウドコンピューティング**という
# オンプレミスとレンタル
## オンプレミス
自社でサーバーなどを用意することを**オンプレミス**という
データセンターにサーバーを置いても、所有権が自社にあるのでオンプレミスと呼ぶ
サーバーのみを借りているものはレンタルサーバーと呼び、ネットワークや場所などを借りている場合はオンプレミスと呼ぶ傾向にある

**オンプレミスのメリット**
自社で自由に設計し・運用できること
ただ、その分サーバー構成の変更などが必須となり、スキルのある技術者も必要になる

## オンプレミスの対義語
オンプレミスとの対義語は厳密にはクラウドではない
対義語をオフプレミスということもあるが正確には、**レンタルやパブリック**という
自社で所有・運用するのではなく、レンタルしたり、講習の場に用意されたものを使用する形態を指す

**レンタル・パブリックのメリット**
自社で管理する必要がない
提供する側でメンテナンスをするので技術者を用意する必要もない
しかし、提供する側のルールに縛られるというデメリットがある
# パブリッククラウドとプライベートクラウド
クラウドにはパブリッククライドとプライベートクラウドの2種類がある
パブリッククラウドとはAWS,Azureのようなレンタルするクラウド。
プライベートクラウドとは自社で構築するクラウド。

クラウドとは「インターネット経由で使用するIT資産のこと」を指すので、必ずしもレンタルする必要はない
イメージ）
**クラウドであり、レンタル・パブリックなものがAWS**
**クラウドであり、オンプレミスなものが自社クラウド**
**非クラウドで、レンタル・パブリックなものがレンタルサーバー**
**非クラウドで、オンプレミスなものがデータセンター・自社サーバー**
カレンダー入力でのデフォルト値の設定


元の質問 : [カレンダーの終日行動のチェックをデフォルトで外す、開始と終了時間のデフォルト値を設定する](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HEdFX)

通常の行動(Event)の入力とは違ってカレンダーから日にちの部分をクリックして入力した場合は最終行動日のところがtrueになります。
しかし時間のところはデフォルトで直近の１時間になってしまいます。この部分に違うデフォルト値を入力したいということらしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/56766973-4206-50f4-4f05-b2ebf87a97b7.png)


# デフォルト値のセットなのでグローバルアクションはどうだろう？

デフォルト値をセットできますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ab0f3744-dbf8-dabd-b516-92c0cc0a5ecb.png)

いかしカレンダーの日付から入力しても日付は変更できません。正確には押した場所の日付を引用できません。
今はグローバルアクションでは今日をデフォルトとしています。
画面で開始日の日にちを変えると終了日も同じ日にちになります。時間はデフォルト値のままです。
現状では完全ではないですが、グローバルアクション＋日付の変更で少しだけ手間が省けると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9c7b29d7-1ec1-f516-5def-23e18c5606ff.png)
LINE Verda プログラミングコンテスト (AtCoder Beginner Contest 263) 不参戦記

# LINE Verda プログラミングコンテスト (AtCoder Beginner Contest 263) 不参戦記

## [ABC263A - Full House](https://atcoder.jp/contests/abc263/tasks/abc263_a)

書くだけ.

```python
from collections import Counter

A, B, C, D, E = map(int, input().split())

if sorted(Counter([A, B, C, D, E]).values()) == [2, 3]:
    print('Yes')
else:
    print('No')
```

## [ABC263B - Ancestor](https://atcoder.jp/contests/abc263/tasks/abc263_b)

書くだけ.

```python
N, *P = map(int, open(0).read().split())

d = {}
for i in range(N - 1):
    d[i + 2] = P[i]

result = 0
x = N
while x != 1:
    x = d[x]
    result += 1
print(result)
```

## [ABC263C - Monotonically Increasing](https://atcoder.jp/contests/abc263/tasks/abc263_c)

どうすれば良いのかはすぐわかるのに、書こうとするとなかなか上手くいかないのは、戻って続きをやる(ためにステートを戻す)みたいな再帰的な入れ子構造が難しいからか. 関数を使ってストレートに書いても良い気がするが、リストをスタックとして使って書けた.

```python
N, M = map(int, input().split())

a = [0]
while len(a) != 0:
    a[-1] += 1
    if a[-1] > M:
        a.pop()
        continue
    if len(a) == N:
        print(*a)
    else:
        a.append(a[-1])
```
第三回日本最強プログラマー学生選手権-予選- (AtCoder Beginner Contest 262) 不参戦記

# 第三回日本最強プログラマー学生選手権-予選- (AtCoder Beginner Contest 262) 不参戦記

## [ABC262A - World Cup](https://atcoder.jp/contests/abc262/tasks/abc262_a)

書くだけ.

```python
Y = int(input())

if Y % 4 == 0:
    print(Y + 2)
elif Y % 4 == 1:
    print(Y + 1)
elif Y % 4 == 2:
    print(Y)
elif Y % 4 == 3:
    print(Y + 3)
```

## [ABC262B - Triangle (Easier)](https://atcoder.jp/contests/abc262/tasks/abc262_b)

素直に3重ループの総当たりで OK.

```python
from sys import stdin

readline = stdin.readline

N, M = map(int, readline().split())

links = [set() for _ in range(N)]
for _ in range(M):
    U, V = map(int, readline().split())
    links[U - 1].add(V - 1)

result = 0
for a in range(N - 2):
    for b in range(a + 1, N - 1):
        for c in range(b + 1, N):
            if b not in links[a]:
                continue
            if c not in links[b]:
                continue
            if c not in links[a]:
                continue
            result += 1
print(result)
```

## [ABC262C - Min Max Pair](https://atcoder.jp/contests/abc262/tasks/abc262_c)

$a_i = i, a_j = j$ もしくは $a_i = j, a_j = i$ である組み合わせ全部.

```python
from itertools import accumulate

N, *a = map(int, open(0).read().split())

b = [0] * N
for i in range(N):
    if a[i] != i + 1:
        continue
    b[i] = 1
b = list(accumulate(b))

result = 0
for i in range(N):
    if a[i] != i + 1:
        continue
    result += b[-1] - b[i]

d = {}
for i in range(N):
    d[i + 1] = a[i]
t = 0
for i in range(1, N + 1):
    if d[i] == i:
        continue
    if d[d[i]] != i:
        continue
    t += 1
result += t // 2

print(result)
```

## [ABC262D - I Hate Non-integer Number](https://atcoder.jp/contests/abc262/tasks/abc262_d)

どストレートな DP で特に難しいところはなかったのだが、`%= m` を `% m` と typo していることに気づくのに無駄に時間がかかった _(┐「ε:)_

$N \le 100$ なので、x 個選んだとき x で割った余りで DP すれば良い.

```python
m = 998244353

N, *a = map(int, open(0).read().split())

result = 0
for i in range(1, N + 1):
    dp = [[0] * i for _ in range(i + 1)]
    dp[0][0] = 1
    for j in range(N):
        for k in range(i - 1, -1, -1):
            for l in range(i):
                if dp[k][l] == 0:
                    continue
                dp[k + 1][(l + a[j]) % i] += dp[k][l]
                dp[k + 1][(l + a[j]) % i] %= m
    result += dp[i][0]
    result %= m
print(result)
```