OmniAICreator/Qiita-1.07M huggingface dataset:
フレッツ光の経路情報を取得する

NTT東西NGN網内部(NTT東西のフレッツ光に接続してDNSもフレッツ光内のものを利用している家庭や企業のネットワーク)においては，以下のコマンドを実行することでIPv6の経路情報を取得することができます。

## 何に使えるのか

ここに出てきた IPv6 グローバルアドレスはすべて，NGN の IPoE によってアクセス可能なものなので，企業のイントラネットや，フレッツ PPPoE を併用しているときに，これらのアドレス宛のパケットだけを IPoE に流せばよいということが分かります。これを実装することでフレッツ光に対応したルータを実装可能です。

:::note warn
注意
NGN は閉域網ですが，NGN 内からアクセスできる IPv6 アドレスには，一般のインターネットからもアクセス可能であるものが含まれます。
:::

### NTT東

```bash
curl -H 'Connection: close' -A '' -v http://route-info.flets-east.jp:49881/v6/route-info
```

出力例：

```
HTTP/1.1 200 OK
Date: Mon, 08 Aug 2022 11:15:35 GMT
Content-Type: text/plain;charset=EUC-JP
Content-Length: 663
Connection: close

0000,2020/09/17 09:23:31
1111,2404:01a8:7e00:0000:0000:0000:0000:0000/40
1211,2404:01a8:0000:0000:0000:0000:0000:0000/32
1212,2001:0c90:0000:0000:0000:0000:0000:0000/33
1311,2408:0210:0000:0000:0000:0000:0000:0000/30
1411,2400:2410:0000:0000:0000:0000:0000:0000/30
1412,2409:0010:0000:0000:0000:0000:0000:0000/30
1413,240b:0010:0000:0000:0000:0000:0000:0000/30
1414,2404:7a80:0000:0000:0000:0000:0000:0000/30
1415,2405:6580:0000:0000:0000:0000:0000:0000/30
1416,2400:4050:0000:0000:0000:0000:0000:0000/30
1417,2401:4d40:0000:0000:0000:0000:0000:0000/30
1418,2001:0f70:0000:0000:0000:0000:0000:0000/30
1419,240b:c0c4:0000:0000:0000:0000:0000:0000/30
```

0の省略表記は使われません。

### NTT西

```bash
curl -H 'Connection: close' -A '' -v http://route-info.flets-west.jp:49881/v6/route-info
```

## 読み方

1xxx は東日本，2xxx は西日本です。

x11x は PPPoE 接続基盤，x21x は IPoE 基盤，x31x は網内折り返し基盤，x41x，x42x は接続事業者 (VNE) です。

ちなみに上の例(東日本)においては，VNE 事業者の内訳は以下のようになります。

| アドレス | 接続事業者 |
|---------|----------|
| `2400:2410:0000:0000:0000:0000:0000:0000/30` | Softbank BB |
| `2409:0010:0000:0000:0000:0000:0000:0000/30` | INTERNET MULTIFEED |
| `240b:0010:0000:0000:0000:0000:0000:0000/30` | Japan Network Enabler |
| `2404:7a80:0000:0000:0000:0000:0000:0000/30` | BIGLOBE |
| `2405:6580:0000:0000:0000:0000:0000:0000/30` | ASAHI Net |
| `2400:4050:0000:0000:0000:0000:0000:0000/30` | NTT COMMUNICATIONS |
| `2401:4d40:0000:0000:0000:0000:0000:0000/30` | FAMILYNET JAPAN |
| `2001:0f70:0000:0000:0000:0000:0000:0000/30` | ARTERIA Networks |
| `240b:c0c4:0000:0000:0000:0000:0000:0000/30` | Rakuten Mobile Network |

:::note warn
警告
これは関東地方にて2022年8月に取得した情報です。ネットワークアドレスの割り当ては変わることがあります。

また，これは参考例であって，実際のネットワークの情報を提供することを目的としたものではありません。

実際，2024年12月現在では違う結果が返ってきます。
:::

## 技術情報

詳しくは，NTT東西のサイトにて『IP通信網サービスのインタフェース』をご覧ください。

### NTT東日本

* https://www.ntt-east.co.jp/gisanshi/ 技術参考情報 - NTT東日本

### NTT西日本

* https://www.ntt-west.co.jp/ngn/business/index.html インタフェース情報等 - NTT西日本
Railsの思想

## Railsの思想
- Railsには設計思想として以下4つの思想を強く打ち出している。

### ①CoC(Convention over Configuretion)
- 直訳すると「設定より規約」
- 社員情報を表現するモデルをEmployeeモデルとした場合、Railsでは以下のような規約に則う。
  - データベースのテーブル名はモデル名の複数形のEmployeesにする。
  - /employeesというURLは社員の一覧を表す。
  - /employees/1というURLは社員ID:1の社員情報を表す。
 
### ②DRY(Don't Repeat Yourself)
- 「同じことを繰り返さない」という思想

### ③REST(Representational State Transfer)
- Webアプリケーション設計概念の1つ
  - CRUDによる機能追加がしやすい自然な設計になる。

### ④自動テスト
- 自動テストを重要視している。
  - Railsのプロジェクトを作成すると、雛形の一部としてテストを実行する環境やテストコードの雛形の生成が行われ、Railsプロジェクトを作成した直後からテストが実行できるようになる。
  - デフォルト設定はMinitest
Coreserver v2で_ctypesが発生した時の対処方法

# Coreserver v2で_ctypesが発生した時の対処方法
coreserver v2のレンタルサーバで、pythonとflaskの組み合わせでWEBシステムを公開していたが、pythonライブラリをインストールをするときなどに、_ctypesのエラーが発生した時、対処に相当苦労しましたが、何とかエラーを回避することが出来たので、皆さんの参考になればと思い対処方法を紹介いたします。

## 発生したエラー

pythonライブラリをpipでインストールする時やimportでライブラリを読み込んだ時に以下のメッセージで実行が出来ないことがあります。

    ModuleNotFoundError: No module named '_ctypes'

対処の方法は「libffi」が存在していない状態でpythonをインストールしたことが原因であることが多く、レンタルサーバでなければ、「libffi」をインストールした後にpython環境をもう一度インストールすれば解決するようです。

Coreserverでは管理者権限が利用できないため、手作業でインストールを行わなければなりません
詳細な対処方法は、以下のサイトを参照してください

[Coreserver v2で_ctypesが発生した時の対処方法](https://touch-kun.net/2022/08/07/post-485/)
【Swift】URLの部分抽出

# URLの構造
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b8d089e2-954c-44cc-a266-1e34e4364a2a.png)

[こちら](https://innova-jp.com/what-is-url/)のサイトで詳しく説明されています。

# プロトコルの抽出
```swift
import Foundation

var url = URL(string: "https://taishin-miyamoto.com/ShadowBan?screen_name=SNQ2001")

print(url?.scheme ?? "")

// https
```

# ドメインの抽出
```swift
import Foundation

var url = URL(string: "https://taishin-miyamoto.com/ShadowBan?screen_name=SNQ2001")

print(url?.host ?? "")

// taishin-miyamoto.com
```

# ディレクトリの抽出
```swift
import Foundation

var url = URL(string: "https://taishin-miyamoto.com/ShadowBan?screen_name=SNQ2001")

print(url?.path ?? "")

// /ShadowBan
```

# クエリパラメータの抽出
```swift
import Foundation

var url = URL(string: "https://taishin-miyamoto.com/ShadowBan?screen_name=SNQ2001")

print(url?.query ?? "")

// screen_name=SNQ2001
```

# おわり
以前URLのスキームで振り分けようと思ったことがありまして、
その際に調べてもあまり情報がなかったので備忘録として記事にしました。
誰かの役に立てば嬉しいです。
Adobe illustratorのファビコンを無料でパス（SVG）形式に変換するメモ

# 手順まとめ
1. [Inkscape](https://inkscape.org/ja/)をインストールする
1. [aiファイル](https://help.qiita.com/ja/articles/others-brand-guideline)を読み込む
1. 必要なファビコンだけ選択してコピー
1. ファイル - 新規
1. ペースト
1. 編集 - ページサイズを選択オブジェクトに合わせる
1. **オブジェクト - グループ化解除**
1. ファイル - 名前を付けて保存 - 最適化SVG

# 背景
[ホームページ](https://worth-hole.com/)から、Twitterなどと同じように、Qiitaもファビコンでスタイリッシュにリンクしたいと思いました。[Gatsby](https://qiita.com/tags/gatsby)のgatsby-starter-lumenでサイト構築しているので、ファビコンは（SVGファイル中身の）[パスを指定](https://github.com/alxshelepenok/gatsby-starter-lumen/blob/master/src/constants/icons.ts)する必要があります。

Qiitaに問い合わせたところ、「Adobe illustratorファイルを元に作るなら良いよ」と返答を頂いたので、公開されているaiファイルを編集してパスを抽出する事にしました。

# ハマりポイント
- Inkscapeは圧縮ファイルからではなく、インストーラーを選ばないと、複雑な処理で内部エラー
- 「オブジェクト - グループ化解除」しないと、[シンプルなパスにならない](https://stackoverflow.com/questions/13329125/removing-transforms-in-svg-files)
  - 単なるSVGファイルへの変換なら不要なステップですが、これを省くとSVG内部にtransformが複数残って多数の点の座標変換しないと、絶対座標のパスにならない
curlでAmazon CognitoのAPIにアクセスする

# What's？

AWS SDKやAWS CLIに頼らずに、HTTPでAmazon CognitoのAPIにアクセスできないかな？と思って調べていたら、どうやらできそうなのでメモ。

# アクセスするAPIのリファレンス

こちらの一覧が対象です。

https://docs.aws.amazon.com/ja_jp/cognito-user-identity-pools/latest/APIReference/API_Operations.html

# アクセス方法

以下の情報に沿って行います。

- HTTPエンドポイント … `https://cognito-idp.[リージョン].amazonaws.com`
- HTTPメソッド … `POST`
- 付与する必要があるHTTPヘッダー
  - `Content-Type: application/x-amz-json-1.1`
  - `X-Amz-Target: AWSCognitoIdentityProviderService.[アクション名]`
- HTTPボディ … APIに応じたJSON

# サンプル（トークン更新）

サンプルとして、トークン更新を行ってみます。

使用するAPIは、こちら。

https://docs.aws.amazon.com/ja_jp/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html

リフレッシュトークンを使って、アクセストークン、IDトークンを再取得する処理ですね。

この説明に沿って実施する感じになります。

> ユーザープール API により新しい ID とアクセストークンを取得する際に、更新トークンを使用するには、API オペレーションの AdminInitiateAuth または InitiateAuth を使用します。AuthFlow パラメータの REFRESH_TOKEN_AUTH を渡します。認証パラメータの AuthParameters は、キーが "REFRESH_TOKEN" であり、値が実際の更新トークンであるキーバリューマップです。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-refresh-token.html

`X-Amz-Target`ヘッダーの値は、`AWSCognitoIdentityProviderService.InitiateAuth`になります。

```shell
$ curl https://cognito-idp.ap-northeast-1.amazonaws.com \
  -XPOST \
  -H 'X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth' \
  -H 'Content-Type: application/x-amz-json-1.1' \
  -d '{"ClientId":"[クライアントID]","AuthFlow":"REFRESH_TOKEN_AUTH","AuthParameters":{"REFRESH_TOKEN":"[リフレッシュトークン]"}}'
```

HTTPボディで送信するリクエストの内容は、`InitiateAuth`のリクエストパラメーターの説明を見るとよいでしょう。

https://docs.aws.amazon.com/ja_jp/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html

結果。

```json
{"AuthenticationResult":{"AccessToken":"[アクセストークン]","ExpiresIn":[有効期限（秒）],"IdToken":"[IDトークン]","TokenType":"Bearer"},"ChallengeParameters":{}}
```

# おわりに

これで、Amazon CognitoのエンドポイントへAWS SDKやAWS CLIなしでもアクセスできそうですね。
環境変数でパスを通す

## 調べようと思ったきっかけ

home brewをインストールしたあと、[brew -v](https://atmarkit.itmedia.co.jp/flinux/rensai/linuxtips/203showcomver.html)でうまく確認できなかったのがきっかけで調べようと思いました。

**home brew についての参考文献**
[【完全版】Homebrewとはなんぞや](https://zenn.dev/sawao/articles/e7e90d43f2c7f9)
## 実際に起きたエラー

```bash
Warning: /opt/homebrew/bin is not in your PATH.
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
```

google翻訳先生にお願いしたところ　/opt/homebrew/bin 　がパスに含まれていないとのこと

~~それぐらい読めるようになっときたかった。。。~~



## 環境変数パスとは

osが動作している時に使用する変数の一種です。

ターミナルに記述する時についてくるこの**＄**の中に色々と省略したいパスを格納してます。

〜例えば〜

何層にもなっているディレクトリを開きたい場合、GUIだと一つずつ階層を降りていかないと開けないのに対して、CLIだとcdコマンドでルートを入力すればすぐ開けますよね。

でもすぐ開ける分記述が多くて面倒。。。

ここで環境変数パスに格納してあげてれば、記述が省略化され、すぐに目的のディレクトリに辿り着くことができるというわけです。


## 実際に追加

先程エラーで表記されてたコードを[exportコマンド](https://atmarkit.itmedia.co.jp/ait/articles/1801/12/news015.html#:~:text=export%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8%E3%81%AF%EF%BC%9F,%E5%A4%89%E6%95%B0%E3%80%8D%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%20%E2%80%BB1%E3%80%82)で環境変数に格納してあげます。

```bash
export PATH="$PATH:/opt/homebrew/bin/"
```

この状態でもう一度 brew -v でバージョンの確認してみます。

バージョンの確認がとれない＝インストールされていないの意。

```bash
Homebrew 3.4.4
```

ちゃんとバージョンが返ってきたのでインストールされていることが確認できました！



## さいごに

今後も学習を進めていく中で私なりの解釈にはなりますが色々発信していければと思っております！

ここまで読んでいただき、ありがとうございました🙇‍♂️



### 参考文献

[homebrewで学ぶ「PATHの通し方」 - Qiita](https://qiita.com/HORIZONium/items/b608f46c900ce527dbc9)
Boto3 > DynamoDBクライアント >  Waitersメソッド ドキュメント概要部分翻訳(3/5)


Boto3 > DynamoDB 各クラスのドキュメントについて、メソッドの概要部だけDeeplに突っ込んで翻訳しました。


[Clientクラス](https://qiita.com/Mohrey/items/6dca843de5e2b75a7f7b)
[Pagenatorクラス](https://qiita.com/Mohrey/items/d0bebf9e1b2289151df0)
Waitersクラス（この記事）
[Service Resourceクラス](https://qiita.com/Mohrey/items/caa0b614227aed803d55)
[Tableクラス](https://qiita.com/Mohrey/items/cd32e836ff1c7e7aaba4)

各メソッドの説明文のみ翻訳しています。引数とレスポンスもリファレンスにはまとまっていますが、その部分は翻訳してません。あくまでざっと全体を見て何ができるか、必要なメソッドはどれかを拾うために使ってください。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#waiters

___

## Waiters

利用できるWaiter:

* DynamoDB.Waiter.TableExists
* DynamoDB.Waiter.TableNotExists

`class DynamoDB.Waiter.TableExists`
>`waiter = client.get_waiter('table_exists')`

#### `wait(**kwargs)`
DynamoDB.Client.describe_table()を20秒ごとに成功状態になるまでポーリングします。25回チェックに失敗するとエラーが返される。
See also: [AWS API Documentation](https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/DescribeTable)

`class DynamoDB.Waiter.TableNotExists`
>`waiter = client.get_waiter('table_not_exists')`

#### `wait(**kwargs)`
DynamoDB.Client.describe_table()を20秒ごとに成功状態になるまでポーリングします。25回チェックに失敗するとエラーが返される。
See also: [AWS API Documentation](https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/DescribeTable)
法改正対応ってどうして必要なの？

# はじめに

https://qiita.com/na0y/items/9942ffbdb8c59e7f976d

新入社員との1on1で法改正対応がどういうものかを質問されて、そういえばこんな記事を以前書いたなと思い出しました。
ただ、初学者にはそもそも業務システムに法律がどう絡んでくるのか？といったもっと根本的な話がイメージできないと思ったので、本記事でその辺りの話をまとめます。

# 法改正対応が必要な業務とは？

説明のための雑な分類ではありますが、業務はざっくり以下の2つのように分類できます。

- **要件が法律によって厳格に定義されておらず**、裁量が大きい業務
    - 例：給与の額や通勤手当のルールなど (厳密には最低賃金の規定や非課税上限額など関連する規定は存在します)
- **法律によって要件が (上記と比較して厳格に) 決められている**業務
    - 例：社会保険料の定時決定・随時改定、年末調整など

本記事では後者のことを「法定業務」と呼び、法定業務のシステム化と法改正対応が必要な理由について概要を述べます。

# なぜ法改正対応が発生するのか

## 法律が要求・要件の前提条件となる

一般的にシステムを構築するときは、実装に入る前段階として以下のようなことを定義すると思います。
(要求定義とか要件定義とかいうやつ)

- システムを用いてどのような業務を達成したいか
- そのためにどのような機能が必要で、どのような業務運用を実施するか

法定業務をシステム化するということは、これらの**前提条件が法律によってある程度固められてしまう**ということです。
結果として、機能の実装方針としては以下のようになります。 (これまた雑な分類ですが…)

1. 法律要件に合わせて作りこまれた機能を実装する
1. 法定業務以外でも利用できる汎用的な機能で、法定要件を満たす運用も可能なように実装する

## 法改正によって、その前提条件が変化する

このように、システムの要件が既存の法律を前提として定められているため、法改正によってシステムの**機能や業務運用に対する要件の前提条件が変化する**というのが法改正対応が生じる理由です。
**法律の変更による影響箇所を除いては既存運用を担保しつつ、改正後の法律を満たすよう**仕様を改めなければなりません。

乱暴な例えですが、商品の価格から消費税込みの金額を計算する機能があったとして、元々の仕様が「価格の1.08倍を返す」という仕様だった場合、消費税が10%に改定されたタイミングで「価格の1.1倍を返す」という仕様に改定しなければいけないわけです。

※ 前節の2.の場合は、システム的な対応なしに法改正後の運用を担保できることもあります。
(先の消費税の例えだと、古いシステムでもなければ税率をパラメータとすることで対応しているのではないでしょうか。たぶん。)

# まとめ

- システム化対象となる業務には、要件が法律によってある程度厳格に定まっているものとそうでないものがある
- 法定業務をシステム化する場合、その法律がシステムの要求・要件の前提条件となる
- 法律が変わることでその前提条件が変化することとなるため、法改正対応が必要
ActiveRecord::StatementInvalid in 〇〇Controller#indexのエラーについて

## 経緯
勉強を始めて１ヶ月ぐらいで、同じエラーを出す人も滅多にいないだろうし、おそらく検索しても同じような記事がない様にも感じ、エラーが発生してしまったので、メモとして記録したいと思います。

## 内容
![スクリーンショット 2022-08-08 18.59.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745288/788c294a-6487-d7a2-9973-b0619ee11ece.png)

このような
Mysql2::Error: Table 'storagame_development.application_records' doesn't exist

が発生したときの改善策について記述したいと思います。

まず、自分がやってしまったミスについてですが、
```ruby:app/controller/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
  end
end
```
本来controller/application_controllerに書くべき、コードをmodels/application_record.rbに記述してしまい、誤って初期の記述を消してしまったというミスになります。
ちなみに問題であると普段なら考えられる中身のコードは全く関係ありません。

```ruby:app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end
```
こうして元に戻してあげるだけで解決します。
普通やらないミスであるとは思いますが、だからこそほとんどの人がどうすればいいいかわからないものであると思っています。もしやってしまってこの記事を見つけた方のエラー改善ができることを祈っております。
IPアドレスポリシー とは

## 勉強前イメージ

IPアドレスのレンジ以外にポリシーあるの？

## 調査

### IPアドレスポリシー とは

インターネットレジストリ がIPアドレスを管理・分配を行う上での方針や基準になります。
また、エンドユーザがIPアドレスの分配を受けたアドレスをどう管理していくかも記載しています。
管理方法や分配方法はインターネットレジストリの階層構造に基づいて定義が行われています。

### 策定方法

IPアドレスポリシーの定義は誰でも決められるものとして文書化して策定プロセスが決められています。
世界共通のグローバルポリシーと各地域単位のローカルポリシーがあって、以下のようになっています。

- グローバルポリシー → 全RIPのフォーラムで議論
- ローカルポリシー → 各RIPで議論

IPアドレス管理の5原則に `一意性` `登録` `経路の集約` `アドレスの節約` `公平性` があり
どのRIPでも共通しますが、地域内の事情を反映した管理ポリシーを策定することが認められているため
各RIPにおいて要件が異なっています。

## 勉強後イメージ

インターネットレジストリがどうやって割り振るかってことで
CIDRとかの話ではなかったのねw

## 参考

- [IPアドレスのポリシー策定とアドレスポリシーフォーラム](https://www.nic.ad.jp/ja/newsletter/No48/0800.html)
.Net 6: BlazorServer の使い方

プロジェクトの作成と実行

```bash
dotnet new blazorserver -o b01
cd b01
dotnet run
```

実行した時のメッセージ

```text
$ dotnet run
ビルドしています...
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://localhost:7096
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5018
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
```

Chrome でアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1c184c9a-b3de-8dd7-7887-3ad3bf318f58.png)

Firefox でアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/548ed4b8-4f19-69c9-7577-cb0ad0ddd56b.png)

危険を承知で実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5ed6caf0-421c-5572-2b0a-32e97f1b6030.png)

## データの変更

```text:Pages/Index.razor
﻿@page "/"

<PageTitle>Index</PageTitle>

<h1>こんにちは</h1>

Welcome to your new app.

<SurveyPrompt Title="How is Blazor working for you?" />
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/813544b5-9ab0-0c09-3cd5-b5a563f11d71.png)

もう少し改造

```text:Pages/Index.razor
﻿@page "/"

<PageTitle>Index</PageTitle>

<h1>こんにちは</h1>

<p>Welcome to your new app.</p>
@hogehoge

@code {
	String hogehoge = DateTime.Now.ToString();
}

<SurveyPrompt Title="How is Blazor working for you?" />
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a38e08cb-0d50-7f5e-33ef-27f14ee0184d.png)

## ポート番号の変更
次で受けるようにする
http://localhost:5000
https://localhost:5001

```json:Properties/launchSettings.json
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:26896",
      "sslPort": 44322
    }
  },
  "profiles": {
    "b01": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
```
Android Roadshow Day 1 メモ

# 概要

ちょっと今さら感あるけど 2022年6月15日に行われた [Android Roadshow Day 1](https://developersonair.withgoogle.com/events/roadshow_day1_online) の内容で気になったところをメモしておく。
`Android 13`、`Android Studio`、`Jetpack Compose` あたりかなあ。

# What's new in Jetpack

- アーキテクチャ
    - Room
        - SQLite
        - Kotlin Symbol Processing(KSP) 安定版
        - @Database
            - @AutoMigration
    - Paging
        - Rx、Guava サポート
        - ロード改善
        - Paging Codelab
    - Navigation
        - Navigation Component と Jetpack Compose 統合
        - 複数バックスタックサポート
            - 状態を NavigationUI が自動的に保存/復元
        - 2ペインレイアウト
        - Kotlin 化
    - DataStore
        - SharedPreferences 代替
        - 新しい動画と記事公開
- パフォーマンス
    - JankStats
        - いろいろレポート
    - Baseline Profiles
        - Android にコンパイルの優先順位付けができるとか
    - Macrobenchmark
        - ベースライン生成
        - UI の評価
    - Tracing
- ユーザインターフェイス
    - WindowManager
        - 折りたたみ式デバイス対応
    - DragAndDrop
        - アプリ内外からのドラッグアンドドロップ受け入れる
    - AppCompat
        - Emoji2 統合
        - 新しい絵文字サポート
        - ロケール設定永続化
- Compose
    - Nasted Scrolling Interop
        - Coordinator Layout でスムーズに埋め込み
        - Collapsing Toolbar にも設定できる
    - Downloadable Fonts
        - フォントを動的に変更できる
    - Lazy Layouts
        - RecyclerView の代替
        - グリッドなど高度なレイアウトに拡張
    - 動画参考にしてね
        - Jetpack Compose 移行ガイド
- Other
    - Annotation
        - Kotlin 移行中
        - @RequiresApi
        - @DeprecatedSinceApi
    - Media3
        - ExoPlayer 統合
    - Fragment

# Designing apps for large screens

- 折りたたみ式デバイス、タブレット対応重要
    - 最適化するとユーザーエンゲージメント高められる
- タブレットは両手で持つことを想定してね
    - 画面の中心で重要な操作させないで
- ユーザが期待すること
    - 快適さ、機能、効率、没入感
- 既存レイアウトをいかしてコンテンツの拡張、組み合わせ、再編成
- 正規レイアウト
    - リスト/詳細
    - 補助パネル
    - フィード

# What’s new in Android

- パーミッション関連
    - パーミッションなしで写真とかのメディアへアクセスできる
- 広告関連
    - アクセス可能なデータを制限する
- 「戻る」ボタンをどうするか設定できる
    - 「戻る」でアプリ終了させたり
- バックグラウンド
    - バッテリー消費が多いと通知される
    - ジョブスケジューラ改善
- カメラ
    - 解像度
- メディア
    - Media3

概要だけさらっとしゃべって「続きはWebへ」スタイル

# Creating beautiful, power-efficient apps for Wear OS

- 昨年比3倍
- Wear OS はあんまり関係ないからスキップ

# Jetpack Compose について

- Google と クックパッドの対談
- Groupie(RecyclerView) で実装されていた
- 画面のプレビューが実装時に確認できない
    - 実際に実行しないとわからない
- 縦スクロールの中に横スクロールでスクロールの実装が複雑
- アーキテクチャも複雑だった
- ui 関連のことは ui モジュールでまとめることでプレビューの実現とビルド効率よくした
- Groupie を Compose 風に使えるように独自実装
- 新規画面は Compose
- プレビューでの確認できるようになった
- アーキテクチャがシンプルになった
- 互換性がまだ不十分なところがある
Boto3 > DynamoDBクライアント > Paginatorsメソッド ドキュメント概要部分翻訳(2/5)


Boto3 > DynamoDB 各クラスのドキュメントについて、メソッドの概要部だけDeeplに突っ込んで翻訳しました。


[Clientクラス](https://qiita.com/Mohrey/items/6dca843de5e2b75a7f7b)
Pagenatorsクラス（この記事）
[Waitersクラス](https://qiita.com/Mohrey/items/f1377d7bc59a65074b09)
[Service Resourceクラス](https://qiita.com/Mohrey/items/caa0b614227aed803d55)
[Tableクラス](https://qiita.com/Mohrey/items/cd32e836ff1c7e7aaba4)

各メソッドの説明文のみ翻訳しています。引数とレスポンスもリファレンスにはまとまっていますが、その部分は翻訳してません。あくまでざっと全体を見て何ができるか、必要なメソッドはどれかを拾うために使ってください。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#paginators

___ 

## Pagenators

利用可能なページネーターは以下の通り:

* DynamoDB.Paginator.ListBackups
* DynamoDB.Paginator.ListTables
* DynamoDB.Paginator.ListTagsOfResource
* DynamoDB.Paginator.Query
* DynamoDB.Paginator.Scan


`class DynamoDB.Paginator.ListBackups`
>`paginator = client.get_paginator('list_backups')`


#### `paginate(**kwargs)`
DynamoDB.Client.list_backups()からの応答をページ分割するイテレータを作成します。
See also: [AWS API Documentation](https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/ListBackups)

#### `class DynamoDB.Paginator.ListTables`
>`paginator = client.get_paginator('list_tables')`

`paginate(**kwargs)`
DynamoDB.Client.list_tables()からの応答をページ分割するイテレータを作成します。
See also: [AWS API Documentation](https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/ListTables)


#### `class DynamoDB.Paginator.ListTagsOfResource`
>`paginator = client.get_paginator('list_tags_of_resource')`

`paginate(**kwargs)`
DynamoDB.Client.list_tags_of_resource()からのレスポンスをページ分割するイテレータを作成します。
See also: [AWS API Documentation](https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/ListTagsOfResource)


#### `class DynamoDB.Paginator.Query`
>`paginator = client.get_paginator('query')`

`paginate(**kwargs)`
DynamoDB.Client.query()からの応答をページ分割するイテレータを作成します。
See also: [AWS API Documentation](https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/Query)

#### `class DynamoDB.Paginator.Scan`
>`paginator = client.get_paginator('scan')`

`paginate(**kwargs)`
DynamoDB.Client.scan()からの応答をページ分割するイテレータを作成します。
See also: [AWS API Documentation](https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/Scan)
【備忘録】「構成パーサーエラー」でVisual Studioが起動しなくなった際の処置


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/a7202925-37f7-d86a-9f6a-d30cd7525de3.png)
きっかけは、SSD換装でマイグレーション（OS含めてSSDをコピー）した直後から、Visual Studioが「ウィンドウを作成できません。」エラーで起動しなくなったこと。これについてネットで調べるとGACの不具合（間違ったアセンブリキャッシュを掴んでしまう）等があったが該当せず。

また、上のようなパーサーエラーが出るようになった。（こっちが本題）

.NET Frameworkを使用する他のプログラムでもこのパーサーエラーが出るので.NET Frameworkの不具合と考え、修復ツールを試す。ちなみに上のキャプチャ画面は「インテル・グラフィックス・コマンド・センター」の起動時のエラー。

修復ツールの結果かどうかは不明だが、「ウィンドウを作成できません。」エラーは出なくなったが、パーサーエラーは改善せず、Visual Studioは依然として起動せず。

Visual Studio Installerで修復を試みるも、 Visual Studio Installer自体が同じパーサーエラーで起動せず。

調べるとmachine.configを修復する旨の情報があったので、エラーダイアログにあるフォルダのmachine.configを削除し、同フォルダにあるmachine.config.defaultをコピー・リネームしてmachine.configにして戻すとVisual Studio Installerが起動できたので修復して解決。（実際は修復後もVisual Studioで細かいエラーが発生したので一旦アンインストールして再インストール）

machine.configの修復の際は、フォルダが「～Framework」と「～Framework64」があるので注意。

原因として、 SSD換装でマイグレーションしたため、machine.configが保持しているハードウェア情報が実際のハードウェアと整合しなくなったためと思料
【備忘録】terminalの%より前をカスタマイズする(Mac編)

カスタマイズ前
![スクリーンショット 2022-08-08 18.09.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/422b859a-b2b7-a299-941d-d884d03a8657.png)

カスタマイズ後
![スクリーンショット 2022-08-08 18.22.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/2227791f-18b8-7dcd-7f14-eb32763242f1.png)

■やり方
```sh:.zshrcに追加
PROMPT="%~$ "
```
cron で systemctl --user を使う方法 (Failed to connect to bus... の解決法)

# 前提
まず大前提として、systemctl にはシステムワイドとユーザレベルの 2 種類があります。

```shell
# システムワイド
systemctl status ssh.service

# ユーザレベル
systemctl --user status your-daemon.service
```

システムワイドの場合、必要に応じて root 権限で実行すれば cron 内でも特に問題なく使用することができます。

```shell
*/10 * * * * sudo systemctl restart ssh.service
```



# 問題点
ユーザレベルの場合、同じように書いても正しく動作しません。

```shell
# 動作しない
*/10 * * * * systemctl --user restart your-daemon.service
```

上記の cron を実行すると以下のようなログが出力されます。

```
Failed to connect to bus: No such file or directory
```



# 解決法
cron 内で、ユーザレベルで systemctl コマンドを使うには `XDG_RUNTIME_DIR` という環境変数をセットする必要があります。

多くの場合、以下のように記述することで動作します。

```shell
*/10 * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) systemctl --user restart your-daemon.service
```

cron の設定を行ったユーザとコマンドを実行したいユーザが異なる場合はユーザ名を明示します。

```shell
*/10 * * * * XDG_RUNTIME_DIR=/run/user/$(id -u <OTHER_USER>) systemctl --user restart your-daemon.service
```



# 注意点
cron 内での変数の定義の仕方がシェルスクリプトに似ているので勘違いしやすいのですが、cron の文法はシェルスクリプトとは異なります。

そのため、以下のように最初に `XDG_RUNTIME_DIR` をセットしておいても正しく動作しません。

```shell
# 動作しない
export XDG_RUNTIME_DIR=/run/user/$(id -u)
*/10 * * * * systemctl --user restart your-daemon.service
```

`systemctl --user` を何回も使いたい場合は環境変数の定義とコマンドの実行をセットにしたシェルスクリプトをどこかに用意しておいて、それを呼び出すと良いでしょう。

```shell:restart-your-daemon.sh
# シェルスクリプト
export XDG_RUNTIME_DIR=/run/user/$(id -u)
systemctl --user restart your-daemon.service
```

```shell
# cron
*/10 * * * * /path/to/restart-your-daemon.sh
```



# 参考
* [systemctl --use Failed to connect to bus: No such file or directory Debian 9](https://superuser.com/questions/1561076/systemctl-use-failed-to-connect-to-bus-no-such-file-or-directory-debian-9)
AWS LightsailのDBにDBeaverでアクセスする

LightsailのDBに外部DBクライアントで接続したい人向け
他のソフトでも流用できるでしょう

# DB情報の確認
まず事前にDBの情報を確認しておきましょう
### DB名を調べる
* LightsailのブラウザかターミナルからSSH接続しサーバーに接続
* 接続した直後のディレクトリに**bitnami_application_password**というファイルがあるので，
    catコマンドで確認しコピー
```
$ cat bitnami_application_password
```
* コピーしたパスワードでmysqlコマンドでDBに接続しデータベースを確認
```
$ sudo mysql -u root -p
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 735562
Server version: 10.3.32-MariaDB Source distribution

> show databases;
```

使われているデータベースのデータベース名とパスワードを控えておいてください



# 設定開始
![スクリーンショット 2022-08-08 17.50.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869250/ea5d4fd6-d6dd-c0a7-eaff-483cbeca129f.png)
MariaDBを選択
一般タブで下記のように設定
![スクリーンショット 2022-08-08 18.10.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869250/2481043e-ac3c-1ef4-5e6f-b0d24d9dbf9d.png)

SSHタブに移動し，**SSH Tunnelを使用する**にチェックを入れた後，画像のように設定
![スクリーンショット 2022-08-08 18.11.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869250/56fd5809-8a8d-a760-f824-0b4a5596bcbe.png)

テスト接続して問題なければOK
FAQ形式リッチリザルト用の構造化データジェネレータを作りました

FAQ形式リッチリザルト用の構造化データジェネレータを作りました。
　→<a href="https://cocomiru.com/tech/faq-rich-results-generator/" target="_blank">FAQリッチリザルトジェネレータ</a>
<h1>FAQリッチリザルトジェネレータの概要</h1>
各テキストボックスに入力すると、FAQ形式の構造化データがプレビュー、出力されます。

![FAQリッチリザルトジェネレータ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780005/5837ff25-7b80-a3a3-950b-bfe2d60cfe9e.jpeg)

<h2>FAQリッチリザルトジェネレータの使い方</h2>
各テキストボックスに入力してください。
出力されたマークアップ（JSON-LD）をHTMLへコピペしてお使いください。
詳細については、以下で確認してみてください。

　→<a href="https://cocomiru.com/faq-structured-data-seo/" target="_blank">FAQ構造化データでリッチリザルトを表示！SEOの影響は？</a>
<h2>FAQリッチリザルトジェネレータができること</h2>
FAQ形式リッチリザルト表示を狙うために、
<ul>
<li>FAQの数は3つ</li>
<li>各回答に詳細URLを付ける</li>
</ul>
上記を前提にした仕様となっており、効率良くマークアップ（JSON-LD）出力することができます。
<h2>FAQリッチリザルトジェネレータの背景</h2>
海外製で既に有名なツールか存在します。

　→<a href="https://technicalseo.com/tools/schema-markup-generator/" target="_blank">Schema Markup Generator</a>

豊富な構造化データ種があり、非常に高性能なのですが、以下のような不満がありました。
<ul>
<li>構造化データ項目を都度追加するのが面倒</li>
<li>各回答に詳細URLを付ける場合、マークアップが面倒</li>
</ul>
構造化データはFAQ形式の限定、「FAQの数は3つ」「各回答に詳細URLを付ける」この条件に特化することで、マークアップ（JSON-LD）出力することを目指しました。
<h2>開発環境</h2>
<ul>
<li>JavaScript</li>
<li>HTML</li>
<li>CSS</li>
</ul>
<h3>参考にした情報</h3>
<ul>
<li><a href="https://qiita.com/ron-Qiita/items/e8a381369f4be6f2c8af" target="_blank">JavaScriptでプレビュー機能 onKeyup onchange - Qiita</a></li>
<li><a href="https://fuuno.net/web02/copy/copy.html" target="_blank">JavaScript : テキストのコピーボタンを実装。</a></li>
</ul>
<h2>作成者について</h2>
ココミルはホームページ作成のお役立ち情報を紹介しております。

　→<a href="https://cocomiru.com/" target="_blank">https://cocomiru.com/</a>
Salesforceでフローを作成しよう～リードで特定条件のTodoが作成されたら特定のキャンペーンのキャンペンメンバーに設定される方法～

こんにちは。本橋孝昭です
今回はフローを作成します

作成内容は

リードで特定条件のTodoが作成されたら特定のキャンペーンのキャンペンメンバーに設定される方法です


まず全体図は以下のようになります

ポイントは
１起動条件：
特定の条件のToDoが作成される

２レコードを作成：
キャンペーンメンバーレコードが作成される

です

![フロー１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/82d4dbfd-d6b1-23ab-2ad2-40891b8b6ef6.png)


さあ、１つずつ確認しましょう


#### １起動条件

特定のTodoの条件を設定します。
今回の場合はToDo作成時にStatusが「Not Started」の場合が起動条件です
![開始１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/8529e534-c6b6-5277-f19b-68370e6f0bff.png)


#### 2レコードの作成
キャンペーンメンバーレコード作成画面です。

![レコードの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/1a003edc-2acf-8809-7566-058b6cc0f9be.png)

CampaignIDは固定のキャンペーンのID
LeadIDは
{!$Record.WhoId}　と設定し新規作成のToDoから引っ張ります
フリーランスに転向して1年経た感想

## はじめに

皆様、はじめまして。

Twitterにすら投稿したことのない私が、人生で始めてインターネット上に記事を投稿させていただきます。ﾄﾞｷﾄﾞｷ

エンジニアとしてフリーランスに転向し、1年経過したので感想を書いてみます。

## 前提

一口にフリーランスと言っても色々な働き方があると思います。
私は契約したエージェントに案件を探していただくスタイルです。

案件の内容は正社員時代と変わらず、業務アプリケーションの開発、保守が主です。

## 感想

一言で言うと、転向して良かったです。
良い意味で「もっと早く転向すればよかった」と思うほどです。

しかし、改めて整理すると、正社員辞めなくても実現できるメリットも多かったです。
いきなりのちゃぶ台返しですが（笑）。
とはいえ、フリーランス転向を機に、色々なことが変わったことは確かです。

## 良かったこと

- 案件の選択肢が増え、視野が広がった
- 仕事に対する自信や意欲が上がった
- 報酬が上がった
- 働き方の選択肢が増えた

### 案件の選択肢が増え、視野が広がった

正社員時代はほとんど選択の余地がなかったです。

今では、エージェントの担当者に希望をお伝えしておくと、条件に合致した案件を探してきてくださいます。
スキル、月単価、稼働時間、出社/リモート、場所、業界（金融系が良い等）、色々聞いていただけています。

また、選択肢が増えたら、視野が広がりました。

例えば、

- 業務アプリケーションばかり作ってきたが、コンピューターセキュリティなど他分野の勉強も始めた。
- レガシー寄りだったが、モダン系の案件も探し始めた。

等です。

### 仕事に対する自信や意欲が上がった

エージェントや現場の方々にも恵まれ、フリーランスとしてやっていけることが分かり、自信になりました。

また、報酬やキャリアの可能性が広がったことで、情報を集めたり勉強したり、積極的な行動が増えました。
正直、元々あまり勉強してませんでした（笑）。

こうしてアウトプットを始めたのも、意欲が向上した現れかと思います。

### 報酬が上がった

以前は結構カツカツな経済状態だったのが、遥かに改善されました。

自営業なので、報酬から税金やら交通費等やらを自分で支払っています。
それらを差し引いても正社員時代の手取りと比べ1.5倍以上になりました。

家賃など生活水準を急に上げないように気を付けています（ランチの値段は上がりましたが笑）。

現金なもので、気持ちにゆとりができました。

### 働き方の選択肢が増えた

正社員時代には考えもしなかった働き方も選べるようになりました。
温泉に入りながらのワーケーションなど、一度は行ってみたいです。

正社員時代は副業禁止だったのですが、今では知り合いのビジネスを手伝ったりして副収入もあります。

## 微妙だったこと

- 確定申告を自分でやらないといけなくなった
- 仕事が途切れないように常に気にするようになった

### 確定申告を自分でやらないといけなくなった

定番の問題ですね。
確かにめんどくさいです。

ただ、家計簿アプリを使ったら意外と簡単でした。
申告自体は、私はほぼスマホのみで済みました。

レシートや領収書の管理の手間が増えるのは仕方ないですね。

節税できるようになったのは良かったですが、不勉強なのでメリットを活かせていません。

### 仕事が途切れないように常に気にするようになった

正社員時代、同僚が３か月ほど案件が割り当てられなかったことがあります。
**なんと、その間も彼の給料は満額支払われていました。**

フリーランスとなるとそうはいきません。
いつも頭の片隅で、次の案件をどうしようかと気にしている感じです。

とはいえ、こだわらなければ案件はあるので、それほど心配はしていません。

逆に、あえて仕事を受けない期間を作り、自分の中で長期休暇にすることもできますね。

## おわりに

>Done is better than perfect.
>-Mark Elliot Zuckerberg

ということで、完璧には程遠い記事ですが、思い切って投稿してみました。

この記事が誰かのお役に立てば幸いです。
最後までお読みいただき、ありがとうございました。
Apple M1 に miniforgeをインストールする


Apple M1搭載Macでminiforgeをインストールしたので、インストール方法についてご紹介します。
現状Apple M1で機械学習を試みようとすると、miniforgeが最適解みたいなので、自分も一体なんなんだろうか程度にやってみました。
完全初心者なので複雑な説明は避け、何も考えずにとりあえず打ちましょう程度で。

## PC環境
- MacBook Pro (M1 Max, 2021)
- mac OS Monterey (ver 12.5)
- SSD 2TB
- RAM 32GB


## インストール方法
[ここから](https://github.com/conda-forge/miniforge)、Miniforge3-MacOSX-arm64 をクリックしてダウンロードします。
![スクリーンショット_2022-08-08_15_38_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779582/e46e7a62-89e6-42de-757f-4fadef8dae11.png)

ダウンロードが完了したら、ドッグからターミナルを起動します
![スクリーンショット_2022-08-08_15_33_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779582/2ac10456-d92f-cd22-6d55-2b144d7593bc.png)

Miniforge3-MacOSX-arm64があるディレクトリまで移動します。通常であればDownloadsのフォルダにダウンロードされているかと思います。
```
cd Downloads
```
![スクリーンショット_2022-08-08_15_46_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779582/8c9940ef-d835-cfb0-7fec-3ae6aab797f8.png)


次に以下のコマンドを打ちます
```
bash Miniforge3-MacOSX-arm64.sh
```
![スクリーンショット_2022-08-08_15_46_49-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779582/3dd37e1a-73bc-d0ac-61f6-6d2d68085320.png)
いくつか質問がされるので、全てyesと回答して大丈夫です。

以下のコマンドを入力して、base環境が自動的に立ち上がらない設定にします。
```
conda config --set auto_activate_base false
``` 
次に以下のコマンドを打ちます。pythonは3.9を使用しています。
[名前]は好きな英数字を入れていただいて大丈夫です。
(例)conda create -n miniforge-test python=3.9
```
conda create -n [名前] python=3.9
``` 
途中で、Proceed ([y]/n)? と聞かれるので、yを入力します。

上手くいくとターミナル内がこのような感じになります。
![スクリーンショット_2022-08-08_16_13_22-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779582/80221a96-3dc2-fbb0-2eee-402d2e5a22e6.png)

conda activate [名前]を入力して、miniforgeを起動します。
(例)conda activate miniforge-test
```
conda activate [名前]
``` 
するとターミナル内がこのような感じになるかと思います。
```
(miniforge-test) ############## downloads %
``` 

miniforge環境に入れたら、以下のコマンドを打ち、ある程度必要なライブラリをインストールします。
```
conda install pandas
conda install scikit-learn
conda install matplotlib
conda install keras
conda install jupyter
```
途中で、Proceed ([y]/n)? と聞かれるので、yを入力します。

必要なライブラリをインストール後、jupyter notebookを起動します。
```
jupyter notebook
``` 

jupyter notebookが起動します
![スクリーンショット_2022-08-08_16_34_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779582/0c5e6f8c-dd8f-6841-dceb-d9b878b1345b.png)

新規タブからPython 3を起動します
![スクリーンショット_2022-08-08_16_35_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779582/56536950-6c4c-08f5-8699-71cf3c57cdaa.png)

下記のコマンドを入力し、tensorflowのバージョンが表示されると成功です。
```
import tensorflow as tf
print(tf.__version__)
``` 
![スクリーンショット_2022-08-08_11_24_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779582/1aae7b12-abc8-79c6-19a7-4051735c9846.png)

numpyのバージョン相違の警告が表示されていますが、無視して大丈夫です。

## 参考文献
[M1 MacでPythonの機械学習環境を作る](https://qiita.com/kazuktym/items/1d7cdacdd4f87ef8c4d3)
[Resolve warning A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy?](https://stackoverflow.com/questions/73072257/resolve-warning-a-numpy-version-1-16-5-and-1-23-0-is-required-for-this-versi)
【Flutter】ローカルの画像ファイル読み込み・表示させる

## 【はじめに】
この記事は「極めて個人的な」Flutterの勉強メモです。

__[環境]__
Android Studio Chipmunk | 2021.2.1
macOS 12.5


__[内容]__
Flutterプロジェクトに画像ファイルを格納し、アプリで読み込み・表示させる。

### 手順

1. 画像ファイルを格納するディレクトリを作成・ファイルを格納する
1. ファイルの格納場所をymlファイルに定義する
1. AssetImageを使って表示する



### １. 画像ファイルを格納するディレクトリを作成・ファイルを格納する

![スクリーンショット 2022-08-08 15.59.21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287413/230fb53d-155f-e718-8c4d-cee15fd2dbc6.jpeg)

Flutterプロジェクトを右クリックし、　New>Deirectory を選択する。

![スクリーンショット 2022-08-08 16.00.29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287413/aa01be2e-ad6d-45b0-b1b3-c0597b008694.jpeg)

Directory名を入力する（ここでは「images」とする）

次に作成したディレクトリに保存したいファイルをDrag&Dropする。
（プロジェクトのimagesディレクトリに直接Dropする）

すると以下のダイアログが表示されるので「Refactor」をクリックする。

![スクリーンショット 2022-08-08 16.03.05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287413/7e2d4dc7-ccd2-e17e-20e9-fbf6110a8a94.jpeg)


### 2. ファイルの格納場所をymlファイルに定義する

プロジェクト直下の「pubspec.yml」をダブルクリックして表示する。

![スクリーンショット 2022-08-08 16.18.08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287413/67bd1a2e-6964-b6e8-a1dc-2ef8fea2bb47.jpeg)

スクロールして「assets」を探し、コメントアウトを解除し、先ほどimagesに格納したファイル名に書き換える。
(Macならコメントアウトしたい範囲を選択し 「command + /」でコメントが解除できる。)


```dart:pubspec.yml
  # To add assets to your application, add an assets section, like this:
  # assets:
  #   - images/a_dot_burr.jpeg
  #   - images/a_dot_ham.jpeg

  # An image asset can refer to one or more resolution-specific "variants", see
  # https://flutter.dev/assets-and-images/#resolution-aware.

```

こんな感じ

```dart:pubspec.yml
 # To add assets to your application, add an assets section, like this:
  assets:
     - images/kuma.png

  # An image asset can refer to one or more resolution-specific "variants", see
  # https://flutter.dev/assets-and-images/#resolution-aware.
```

※ymlファイルのインデントは「スペース２個」であることに注意。

ymlファイルに修正が完了したら、pub getを実施する。
![スクリーンショット 2022-08-08 16.33.00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287413/68002b66-a6a5-74b9-ff0c-7c9309b09025.jpeg)

※もちろんコマンドラインからでも可


### 3. AssetImageを使って表示する

```dart:main.dart
import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('aaa'),
          backgroundColor: Colors.blue[900],
        ),
        backgroundColor: Colors.blueGrey,
        body: Center(
          child: Image(
            image: AssetImage('images/kuma.png'),
          ),
        ),
      ),
    ),
  );
}

```

こんな感じ

![スクリーンショット 2022-08-08 16.39.54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287413/a188adb6-d9e9-0815-83e8-b4c8058ed4e6.jpeg)
本当にRubyが死んだ、Railsが時代遅れなのか？そうと思わないです。

Rubyは死んだ、Railsは時代遅れという人が最近増えてきたようですが、
本当にそうなりますか。

僕が大学から日本でRubyを勉強して、Railsでいろんなサービスを開発しました。
本当にRailsが大好きです。
10年前（２０１２頃）、Railsがすごく発展しました。Railsエンジニアになりたい若いものが多いし、
Railsエンジニア給料も他の言語より高かったです。

その後、ReactJSとかGo Langなどが現れて、Railsの人気がどんどん減ったことを感じました。
でもRails強みは失われるのではなく、うまく活かせていないと思います。
以下の強みは他の技術より優れていると思います。

1. プロダクトを開発するスピードが速いです。
ベンチャー企業によって、スピードが一番重要です。MVP版を早めにリリースして、ユーザーに早く評価してもらって、サービスを改善していきます。Railsでは要件定義からリリースまで３ヶ月以内に実現可能です。それにPM、Railsエンジニア、テスターの4人開発チームで十分なので、コストも低いです。

2. Agile開発に向いています。
Agile開発は設計がいらないという認識をしている人がいると思いますが、大誤解しました。
Agile開発でも設計が必要ですが、1週間、2週間程度のフェーズを分けて、各フェーズに設計、開発、テストをちゃんとやります。Railsエンジニアが基本設計（DB設計など）だけど、開発できるので、スピードが速いし、対応が柔軟です。

3. エンジニア育成が速いです。
ベトナムでRailsエンジニアを育成しています。若いものはチュートリアルを勉強して、２ヶ月でRailsで簡単なサンプルを開発できます。チュートリアルが終わったら、ECサイトなどの実際に近いシステムを作って４ヶ月間で体験したら、ジュニアレベルになれます。その後、実際プロジェクトに仕事できます。実際プロジェクトに入ってから、1年間くらいにミッドルレベルになれる優秀エンジニアが少なくないです。

弊社は株式会社ブンブ（文武両道という意味）です。
日本向けのオフショア開発事業を提供しています。
Railsが大好きなので、Railsを中心にReactJS、NodeJS、JAVAなどのいろんな技術を応用して、
保育園、ECサイト、データ分析などのいろんなシステム開発を強力しています。
ご興味があれば遠慮なくご連絡ください。
メール：nghialv@bunbusoft.com
Next.js Tutorialをやってみた所感など

# Next.js Tutorialをやってみた所感など![1200px-Nextjs-logo.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158747/4a4f374c-44bd-0209-7a78-2fa3a19e2f72.png)




Next.jsを勉強してみることにしました。

・HTML/CSS
・JavaScriptはjQueryは分かる、Vue.jsをかじった程度
・React、Next.jsはほぼ分からない

## Next.jsチュートリアル（英語）
https://nextjs.org/learn/foundations/about-nextjs


## 所要時間

コードはコピペではなく、全て手で写経、
エラーも極力ぐぐって解決、という感じでやって

8〜10時間くらいかな？

About Next.js　〜　How Next.js Works
は基本読み物だが、読みやすいです。



## 学べたこと

プリレンダリング
①サーバーサイドレンダリング（SSR）
②静的サイトジェネレーション（SSG）

と通常レンダリング
③クライアントサイドレンダリング（CSR　CSRのみのサイトをSPAと言ったり）

の考え方など。

①②③柔軟に使い分けられるのがNext.jsの強み

かなり動的な部分が、プリレンダリングできて
爆速表示できるようになったら、そりゃ面白い。

あとTypeScriptを少し。Javaっぽくなるね。



## 残課題

- 記事投稿の機能がついてない。これはチュートリアル卒業者への宿題なのかな。
  - fsでMDファイルは書けるわけだし。APIからPostする機能作ってみたい。
  - ヘッドレスCMS＋Next.js on Vercelで自分技術ブログ作るのがゴールかな。
- Next.js書いただけじゃ理解浅い
- テストって書けるの？
- Reactわからん
- TypeScriptわからん
  - ここらへんは[本](https://amzn.to/3bJefrP)で補強します。
- Tailwind CSS導入時のケースを練習したい


## GitHub

[GitHub - kugyu10/next.js.tutorial](https://github.com/kugyu10/next.js.tutorial)

## デプロイ先(Vercel)

https://next-js-tutorial-kugyu10.vercel.app/
ubuntu22.04LTSにDocker /docker-compose/ nvidia-docker2をインストールする

# 環境

OS ：ubuntu22.04LTS


# Dockerのインストール

```bash
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
```

```bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

```bash
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y
```

sudoなしでdockerコマンドを実行する設定

```bash
sudo groupadd docker
sudo gpasswd -a $USER docker
reboot
```



# DockerComposeのインストール


```bash
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```

```bash
sudo chmod +x /usr/local/bin/docker-compose
```

バージョンの確認

```bash
docker-compose --version
```

# nvidia-docker2

```bash
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install nvidia-docker2
sudo systemctl restart docker.service
```

# Reference

https://qiita.com/DQNEO/items/da5df074c48b012152ee
はじめましてのごあいさつ

みなさまはじめまして。
Twitter上において@chizutodesignと名乗り
地図やデザインについてのグラフィックを投稿しています。
縁あって6月より株式会社MIERUNEに入社する運びとなりました。


---


目標としていることは様々あるのですが、
その中のうちの一つが
3Dの地図表現におけるデザイン表現の検討です。
![2022-02-10_11.51.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705702/df876c80-807f-71f5-6864-21f30977bdde.png)*画像：Minecraftで再現された札幌のテレビ塔*

---


地図が紙というメディアからデジタルへとシフトしたように
2D表現が3Dへとパラダイムが大きく変化する時代において、
どのようなデザイン表現をすることでわかりやすく
情報を伝えることができるか、探求していきたいと考えています。
よろしくお願いいたします。
レンタルサーバーを借りてオンラインゲームのWikiサイトを作ってみる #2

前の記事
https://qiita.com/Unirenkon/items/68b48f1eb431c254e3d9

# 今回の作業

フロントを簡単にいじれるように環境を整える
   - 具体的には下記を実現することを目標とします
       - gitを導入して、diff（変更箇所）を保存できるようにしたい
       - ローカル環境でCSSなどをいじってそれを簡単に本番環境に適用させたい
     
手順として下記がありますが、今回は**xserverにSSH接続**の部分のみ記載します
（まとめたいですが長くなりそうなので;-;）

- serverにSSH接続
- xserver上にGitの共有レポジトリを作成する
- ローカルに共有レポジトリを取得する
- ローカルの好きなエディタでCSSとかをいじったりして、git pushで本番環境に適用する

# xserverにSSH接続

### SSH接続とは
SSHとは「Secure Shell」の略で、ネットワークに接続された機器を遠隔操作し、管理するための手段。
安全にxserverとローカルを接続するために必要なプロトコルという理解

### 鍵の生成

xserverのサーバーパネルから、SSH設定を開き、公開認証用鍵ペアの作成で任意のパスフレーズを設定して鍵を生成します。
![スクリーンショット 2022-08-08 16.08.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296171/104302ff-4ea1-e282-ee8b-51c9338ca6ec.png)


### 鍵の保存場所と名前変更

コマンドプロンプト（macのターミナル）を開きます。
ダウンロードした鍵を~/.sshに移動します。この際、名前もわかりやすいものに変えておくと便利！

```
$ mv [ダウンロードした場所]/[ダウンロードした鍵のファイル名] ~/.ssh/[変更後の鍵のファイル名]
```
### 鍵ファイルのパーミッションを変更
```
$ chmod 600 ~/.ssh/[変更後の鍵のファイル名].key
```
### xserverにSSH接続
この際、サーバーIDというものが必要となります。

サーバーIDは、サーバーパネルを開いた時に画面上部に表示されます。
間違えやすい（自分も間違えた）部分として、 
**サーバーIDはサーバー番号（svから始まるもの）ではなく、xsから始まるものです！ちゅうい！**
![スクリーンショット 2022-08-08 16.09.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296171/5f4dd5a1-b4c5-752f-0ce1-65921cbbe34d.png)


サーバーIDを確認したら下記を実行
```
$ ssh [サーバーID]@[サーバーID].xsrv.jp -p 10022 -i ~/.ssh/[変更後の鍵のファイル名]
```

この際、先ほど設定したパスフレーズを聞かれるので入力
成功するとxserverにSSH接続できます。

# その他
躓くところはエラーメッセージで検索するとqiitaなどに色々な方が解決策を提示してくれているので大体解決できる気がします。
また、~/.ssh/configファイルを編集することで、毎回のコマンド入力やパスフレーズの入力を簡略化できますが、記事の大枠とずれていきそうなのでこれもまたqiitaで調べるといいです

# 主に参考にさせていただたいたサイト様
https://dirtbaghack.com/
https://www.kagoya.jp/
他多数

大変参考になりました。ありがとうございます。
Pytorch有用情報まとめ


## Web記事
[Pytorchチュートリアル](https://yutaroogawa.github.io/pytorch_tutorials_jp/)
公式ドキュメントのチュートリアルの日本語訳版

[Pytorch入門](https://atmarkit.itmedia.co.jp/ait/subtop/features/di/pytorch_index.html)
Pytorchでのモデル作成までを一通り行った連載

[Pytorch nkmk](https://note.nkmk.me/pytorch/)
Pytorchに関するTipsがまとまったブログ
## Qiita

[PytorchでCNNを徹底解説](https://qiita.com/mathlive/items/8e1f9a8467fff8dfd03c)

[Pytorchテンプレート](https://qiita.com/takubb/items/7d45ae701390912c7629)
Pytorchのベストプラクティスを反映したテンプレート。これをベースにモデルを作れそう

## MOOC
[Deep Neural Network with Pytorch](https://www.coursera.org/learn/deep-neural-networks-with-pytorch)
IBMによるCourseraのコースの一部。7日間無料。

## 書籍
[つくりながら学ぶ! PyTorchによる発展ディープラーニング](https://www.amazon.co.jp/dp/4839970254)
Githubにコードがある。

[Pytorch実践入門](https://www.amazon.co.jp/dp/4839974691/)
Githubにコードがある。

[PyTorchでの学習・推論を高速化するコツ集](https://qiita.com/sugulu_Ogawa_ISID/items/62f5f7adee083d96a587)
高速化tips
Uniswap Exchange | Uniswap Protocol

Uniswap Exchange is a Decentralized Crypto Exchange that offers centralized services worldwide Uniswap uses blockchain technology on the Ethereum blockchain

website: https://uniswap.supply 
![WhatsApp Image 2022-08-07 at 12.23.42 PM.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779980/e8236370-7f70-186d-1e72-08e20313c698.jpeg)
python環境の中身

![Screen Shot 2022-08-08 at 15.55.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655515/8856ecb1-9b0e-4edd-ef2e-488ccf880c6b.png)

python環境の中身

誤ってたら教えてください。
知っていて当たり前-15　タプル

# 知っていて当たり前-15　タプル

## 1.　タプル


```julia
t = (1, 2, 3, 4)
typeof(t)
```




    NTuple{4, Int64}



添字（インデックス）で参照する。


```julia
t[1]
```




    1



以下のようなものはタプルを表す。


```julia
a, b, c = 1, "foo", 3.14
```




    (1, "foo", 3.14)



タプルをタプルに代入するという意味では以下のように書くのが正当法か?


```julia
(a, b, c) = (1, "foo", 3.14)
```




    (1, "foo", 3.14)




```julia
(a, b, c)
```




    (1, "foo", 3.14)




```julia
b
```




    "foo"



変数に代入することもできる。


```julia
nt = (a, b, c);
```


```julia
nt
```




    (1, "foo", 3.14)




```julia
a
```




    1




```julia
nt[2]
```




    "foo"




```julia
見た目は次に示す「名前付きタプル」のように見えるが，これは単なるタプルである。
```


```julia
typeof(nt)
```




    Tuple{Int64, String, Float64}



## 2.　名前付きタプル


```julia
nt = (a = 1, b = "foo", c = 3.14)
typeof(nt)
```




    NamedTuple{(:a, :b, :c), Tuple{Int64, String, Float64}}



### 2.1.　参照法


```julia
nt.a
```




    1




```julia
nt[:b]
```




    "foo"




```julia
nt[3]
```




    3.14



### 2.2.　キーの一覧 `keys()`


```julia
keys(nt)
```




    (:a, :b, :c)



### 2.3.　値の一覧 `values()`


```julia
values(nt)
```




    (1, "foo", 3.14)



## 3.　空か？ `isempty()`


```julia
isempty(nt)
```




    false



## 4.　長さ（要素数） `length()`


```julia
length(nt)
```




    3



## 5.　空のタプル

集合型や辞書型については，空にするための `empty!()` があるが，タプルは変更不可なので `empty!()` はない。

強いてやるなら，空のタプルを代入してやればよいが，タプルは変更不可なのでそんなことをする意味はないように思う。


```julia
nt = ()
```




    ()



## 6.　空か？ `isempty()`


```julia
isempty(nt)
```




    true
net-smtpがインストールされていないといわれた。

railsで実行すると以下のエラーが発生する状況
実行

❯ rails g controller users

You don't have net-smtp installed in your application.
Please add it to your Gemfile and run bundle install


エラー内容:
net-smtpがインストールされていない。
gemfileに加えたうえでbundle installを行ってください。

考えたこと:
①net-smtpの自体はローカルにあるが
newappにうまく伝えられていない。

②
コマンドでrails newを実行作成後に、エラーを理由に
newappを再度作り直すことを避けたい。

そこで以下の作戦を立てました。6系のrailsを使っています。

1
コマンド
rails _6.1.6_ new SampleApp --skip-bundle
を最初に実行

2
newappを作成後に、
SampleApp/gemfileで以下の記述を追加
gem 'net-smtp'
gem 'net-imap'
gem 'net-pop'

3

データベースの作成
cd SampleApp
rails db:create

マイグレーションファイルの内容を
データベースに反映させる。
rails db:migrate

4.
gemのファイルで 
'puma', '~> 5.0'
ではなく
'puma', '= 5.0'のように　=で
固定して、railsのバージョンがアップされていくことを避ける。

結果：
追記します。

5( +今後の改善）
エラー内容:
『net-smtpがインストールされていない、
gemfileに加えたうえでbundle installを行え。』
をデフォルトの状態で解決する方法を考える。

・元々あるnet-smtpをbundle installでnewappに引っ張ってくるのか
・net-smtp自体をその都度、ダウンロードして、引っ張ってくるを取るのか
SDS法とPREP法について

## はじめに
どのようにすれば分かりやすい文章を書くことができるでしょうか。闇雲に文章を書いても、分かりやすい文章になるものではありません。そんなときに、分かりやすい文章を書くための、文章構成の「型」があるので、それを活用すると、分かりやすい文章を書くことができます。そんな文章構成の有名な「型」２つを紹介します。

### SDS法
SDS法とは、Summary（要約）、Detail（詳細）、Summary（まとめ）の３部構成で文章を書く型です。比較的短い文章を構成するときに使います。ニュース番組でニュースを報道するとき、このSDS法が使われています。プロの現場でも普通に使われている型です。事実を短く伝えるときによく使われます。

- #### Summary（要約）
３部構成の最初の要約では、話のポイントや説明する内容について、全体像をざっくり説明します。新聞の見出しやリード文と同じような役割を持ちます。新聞を読むとき、最初に見出しとリード文を読むことで、何について書かれた記事なのかが、大体分かるようになっています。新聞を読むとき、全てのページを隅から隅まで隈なく読む人は、あまりいないかと思います。見出しとリード文だけを読んで、興味ないなと思ったらスルーして、もっと詳しく読みたいと思ったら、その記事だけ詳しく読み出のではないかと思います。因みに、自分は、いつもこのような読み方をします。１日分の新聞を読むのに、15分以上かけることはありません。最初に話の要約を伝えることで、これから説明する内容の予習をしてもらい、本文の理解度を上げてもらうといった効果もあります。

- #### Detail（詳細）
ここが話の本題となります。説明したい内容を具体的に書きます。

- #### Summary（まとめ）
落語でいうところのオチにあたります。勿論、本当にオチを言うわけではありません。最後に、話の内容をまとめることで、説明文全体に締まりをつけることができます。また、説明した内容の復習の意味合いもあります。復習することによって、よりはっきり、相手に印象づけることができ、相手の理解度を上げることができます。同じことを繰り返すと、くどくなるのではと、思われるかも分かりませんが、基本的に端的にサラっと行われるため、くどくなることはありません。くどくなっていれば、本来、詳細で書く内容を、まとめに書いてしまっている可能性があります。

### PREP法
PREP法とは、Point（結論）、Reason（理由）、Example（事例）、Point（結論）の４部構成で文章を書く型です。SDS法が事実を伝えるときに使われる型であるのに対し、PREP法は物事を説明するときに使われます。PREP法はSDS法よりも、長い文章を書くときに使われます。主に、プレゼンや、セミナーなどでよく利用されます。分かりやすい文章が書けているなと思うとき、PREP法を使おうと特に意識していなくても、文章を分析してみると、PREP法が隠れていることが多いはずです。

- #### Point（結論）
結論は最初に言ってしまいます。分かりやすい説明をするときに、結論を、勿体ぶって最後まで隠しておくことはしません。推理小説を読むとき、犯人が最初に分かってしまったら面白くないでしょう。分かりやすい説明をするときは、読み手に推理させるようなことはしてはいけません。

- #### Reason（理由）
結論に対する理由を述べます。結論だけを言っても説得力はありません。さきに結論だけを言った後、聞き手は「なぜ、そのような結論が出るのだ？」「そういう結論に至った理由はなぜ？」という疑問を抱いています。聞き手を納得させるために、結論に対する理由を述べて、相手を納得させる必要があります。

- #### Example（事例）
実例・事例・具体例を述べます。結論に対する理由を述べた後は、聞き手は「なるほどね～」と思っているところだと思います。しかし、理由の１つや２つを聞いただけでは、「でも本当かな？」と完全には腑に落ちていないものです。「この薬は効きます。自分が飲んで効いたからです。」と言われても、「確かに、あなたには効いたかも知れないが、あなたが効いたからといって、万人に効くのか、自分にも効くものなのか、までは分からない。」といったところだと思います。しかし、「あの人にも効いた、この人にも効いた。」といった事例がたくさんあればある程、信用度は高まってくるはずです。つまり、結論、理由を言った後に、事例を説明することで、読み手に対し、話の信ぴょう性を高めることができます。

- #### Point（結論）
最後にもう一度結論を述べて、話を締めくくります。効果としては、SDS法のSummary（まとめ）と同じになります。

### PREP法の例文
文章が分かりやすいということは、論理的であるとも言えるし、理路整然としていると言うこともできます。論理的な文章を書くには、接続詞の使い方が重要になってきます。PREP法の４構成を接続詞で繋げるとこのようになります。**「結論をいうと、〇〇である。なぜなら、〇〇といた理由があるだからだ。たとえば、〇〇といった事例がある。だから/つまり、〇〇なのである。」**

参考までに、PREP法の例文を紹介します。

>論理トレーニングで大事なことは、さまざまな接続表現に注意することである。**なぜなら**、論理とは言葉と言葉の関係に他ならない。それを明示するのが接続表現だからである。**たとえば**、「しかし」という接続詞は多くの場合「転換」を示しており、「しかし」の前後で主張の方向が変化している可能性が高い。**だから**、論議の方向を見失わないためには、「しかし」という接続詞に注意することが必要となる。

上記例文の引用元：論理トレーニング101題 
https://honto.jp/netstore/pd-book_02022200.html
拡張for文ってわかりにくいよね

拡張for文って見た感じ意味が分らない(for文の方がわかりやすい)、謎いからよく分からないまま放置していました。重い腰を上げ、学習したらなんとなく理解できたっぽいです。備忘録として残します。

## 拡張for文とは
配列を取り出すためだけに生まれた、そんな存在。
配列の個体たちを1つずつ取り出したら、自動的に繰り返し処理を終了する。

## 構文
~~~Java
for( データ型 一時変数 : 集合 ){
    繰り返し処理
}
~~~

一時変数＝繰り返している間だけ使用する変数
    集合＝値を取り出したい配列

## コード例
~~~Java:拡張for文
public class kakuchoFor {
    public static void main(String[] args) {
        int[] arry ={10,20,30};        
        for (int i : arry) {
            System.out.println(i);
        }
    }
~~~
~~~:実行結果
10
20
30
~~~
## for文で同じ処理を書いてみる
~~~Java:for文
    public static void main(String[] args) {
        int[] arry ={10,20,30};
        for (int j = 0; j < arry.length; j++) {
            System.out.println(arry[j]);
        }
}
~~~
個人的にはこっちのほうが慣れているので、こっちがいい。
## 所感
一時用変数と、ターゲットの配列を書くだけで取り出せるって便利だなーって思った。
弊社パイセンが「for文は化石」と言っていたので、拡張for文にも慣れていきたい所存。
Oracleで文字列を『左端〇文字目から〇文字分切り出し』と『右端から切り出し』

# LEFT()やRIGHT()は存在しない

まず前提としてOracleには ```LEFT()``` ```RIGT()``` という関数は無いです。
その代わりとして ```SUBSTR()``` があります。

# 左から切り出し例

第二引数で **切り出し開始位置** 。
第三引数で **何文字分切り出すか** 。
第三引数を省略した場合は **最後まで切り出し** になる。

```sql
SELECT 

-- 左端から1文字切り出し。結果は『あ』
SUBSTR('あいうえお',1,1) AS test1, 

-- 左から2文字目から1文字分切り出し。結果は『い』
SUBSTR('あいうえお',2,1) AS test2, 

-- 存在しない位置から切り出し。例外にならずに結果はNULL。
SUBSTR('あ',10,1) AS test3, 

-- NULLから切り出し。例外にならずに結果はNULL。
SUBSTR(NULL,2,1) AS test4

-- 左から二文字目以降を全て切り出し。結果は『いうえお』。
SUBSTR('あいうえお',2) AS test5

FROM テーブル名
```

# 右端からの切り出し例

第二引数で **何文字分切り出すか** 。

```sql
SELECT 

-- 右端から1文字切り出し。結果は『お』
SUBSTR('あいうえお',-1) AS test1, 

-- 文字数を超える切り出し。例外にならずに結果はNULL。
SUBSTR('あ',-10) AS test2, 

-- NULLから切り出し。例外にならずに結果はNULL。
SUBSTR(NULL,-1) AS test3

FROM テーブル名
```

# 参考サイトさん

https://itsakura.com/oracle-substr

# バージョン

Oracle Database 11g Release 11.2.0.1.0 - 64bit Production