OmniAICreator/Qiita-1.07M huggingface dataset:
[Ruby on rails]過去一週間でいいねの多い順に投稿を表示

<h2>初めに</h2>
学習を始めたばかりです。理解不足、誤りがありましたら、コメント頂けますと幸いです。

<h2>アソシエーション記述</h2>

has_many :favorited_users, through: :favorites, source: :user 追記します。

```perl:book.rb
class Book < ApplicationRecord
  belongs_to :user
  has_many :favorites, dependent: :destroy
  has_many :favorited_users, through: :favorites, source: :user #ここです！
  has_many :book_comments, dependent: :destroy
  validates :title, presence: true
  validates :body, presence: true, length: { maximum: 200 }

  def favorited_by?(user)
    favorites.where(user_id: user.id).exists?
  end
end
```
favorited_usersは、favoritesテーブルを通って、userモデルのデータ持ってくるぞ〜ってことでしょうか。


<details><summary>参考・・特に変更してないfavorite.rbのファイル</summary><div>
```perl:favorite.rb
class Favorite < ApplicationRecord
  belongs_to :user
  belongs_to :book
end
```
</div></details>

<h2>コントローラー</h2>

```perl:books_controller.rb
def index
    to  = Time.current.at_end_of_day
    from  = (to - 6.day).at_beginning_of_day
    @books = Book.includes(:favorited_users).
      sort {|a,b| 
        b.favorited_users.includes(:favorites).where(created_at: from...to).size <=> 
        a.favorited_users.includes(:favorites).where(created_at: from...to).size
      }
    @book = Book.new
  end
```

以下、ページネーションを使うverです。

```
  def index
    to  = Time.current.at_end_of_day
    from  = (to - 6.day).at_beginning_of_day
    books = Book.includes(:favorited_users).
      sort {|a,b| 
        b.favorited_users.includes(:favorites).where(created_at: from...to).size <=> 
        a.favorited_users.includes(:favorites).where(created_at: from...to).size
      }
     @books=Kaminari.paginate_array(books).page(params[:page]).per(25)
     @book = Book.new
  end
```

むずううう。


<h3>（参考資料）1週間分のレコードを取り出す</h3>
to / form /created_atの記述については以下を参照し理解できました。
今回は１週間分のレコードを取り出してます！

https://qiita.com/yoshiokaCB/items/ed254817b69a7e296b7c

<h2>（参考資料）includesとは？？</h2>

@books = Book.includes(:favorited_users).```では、booksモデルからデータを取得するときに、favorited_usersモデルのデータもまとめて取得しています。
以下の記事でincludesとN＋１問題について記載しました。

https://qiita.com/ki_87/items/4c82716f57041eabafae



<h2>（参考資料）ソートで並び変える</h2>
以下の記事を参照し理解しました。

https://docs.ruby-lang.org/ja/latest/method/Array/i/sort.html

sort{|a, b| a.to_i <=> b.to_i }だと、昇順になりますが、今回bを先に記述してるので降順（多い順）に並び変えができるのだと理解しました。

https://qiita.com/Kazuhiro_Mimaki/items/fbac42fa51bba304b8a7
VSCodeにおけるRemote-Containersのインテリセンスの設定

# 前置き
VSCodeの拡張機能のRemote-Containersを使い、コンテナ内で作業する際にインテリセンス(自動補間)が出なくて苦戦したため備忘録として投稿します。
同じ様に苦戦している方の参考になれば幸いです。
※この記事ではPythonを例に書いています。

# 解決方法１(コンテナ内でパッケージをインストールする)
そもそもパッケージをインストールしていないと当然インテリセンスは有効にならないので、requirements.txtに必要なものを記載し以下のコマンドで実行しましょう。

```
pip install -r requirements.txt
```

requirements.txtの例

```requirements.txt
django==2.2.19
djangorestframework==3.12.2
```

# 解決方法2(プラグインのインストール)
プラグイン(拡張機能)を見るとlocalとdev containerの二つの環境があるため必要なものはdev containerにもインストールしましょう。

# 解決方法3(devcontainer.jsonの設定)
settings.jsonにパッケージのパスを記載すれば良いと思っていたのですが、コンテナでは.devcontainerディレクトリにあるdevcontainer.jsonに記載するそうです。
settingsに以下を記載しましょう。

```
// Set *default* container specific settings.json values on container create.
	"settings": {
		"python.autoComplete.extraPaths": [
		"[インストールしたパッケージのパス]"
		],
	},
```

パッケージのパスが分からない場合は邪道ですが再度以下のコマンドで確認出来ます。

```
pip install -r requirements.txt
```
既にインストールされている為、インストールされている場所をエラーで返してくれます。
Linuxのコマンドのfindで検索をかけても見つかるかと思います。

# 解決方法4(己を鍛える)
エンジニアの方のツイートで自動補間に関して
「己を鍛えれば良くないですか？」
というツイートを見たことがあります。
上記の解決方法で駄目なら筋肉でコーディングしましょう!!(冗談です)
EC2でデプロイしたアプリのテーブルをSequelproでいじる

https://qiita.com/naginx/items/9b6fcad470474f8e09e9

ほぼこの記事を参考にしました。

ただし、注意点はSSH鍵のところ。

ちゃんとファイル選択しないと、pemファイルを参照してくれないので注意。

これでテーブルいじるのも楽になりました。

ほんとSequelProは優秀だと思います。

https://teratail.com/questions/85214
vite使ってaliasを設定する

コンポーネント内でファイルをインポートをする際に、`@/components`と書きたかったため、色々試行錯誤しました。

# tsconfig.jsonの設定

```javascript:tsconfig.json
{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "@/*": ["src/*"]
    }
  }
}
```

`baseUrl`と`paths`を修正しました。

```javascript:vite.config.js

export default definedConfig({
  plugins: [vue()],
  alias: [
    {
       find: '@/',
       replacement: `${__dirname}/src/`
    }
  ]
})
```

これでいけました！
【Rails】deviseをインストールする方法

####My Profile
プログラミング学習歴②ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。　



#対象者

・ユーザー認証（ログイン・ログアウト機能を実装したい方）

#手順目次
1.Gemfileに追加する

2.初期設定を行う

3.Viewファイルを作成


#実際の手順と実例
###1.Gemfileに追加する

``````
gem 'devise'
``````
　
bundle installを実行


###2.下記で初期設定を行う

```
rails g devise:install
```

　deviseを使うとユーザーテーブルを自動作成してくれます

　deviseの機能を実装した場合のストロングパラメーターは下記の通り
application_controller.rbに記載しましょう

```
　before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
`````

###3.Viewファイルを作成

以下のコマンドでdevise関連のViewファイルを作成

`````
rails g devise:views
````

deviseではform_for構文が使われているためform_withに変更する（html）

```````
<%= form_with model: @user, url: user_registration_path, id: 'new_user', *class*: 'new_user, *local*: *true* *do* |f| %>
```````
【GAS】空白がある列のみ塗りつぶす

空白がある列のみ塗りつぶす処理を作りました。
こういうことができます。
![GasPaintExceptBlank.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634043/62b8f91f-1c97-9fdf-491e-8e085544bcec.gif)



# 使い方

1. 適応したいスプレットシートの`ツール > スクリプトエディタ`を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634043/25e7861f-9e60-4a95-f196-2f2b869b2fb5.png)

2. `ファイルを追加 `を押して適当なファイルを作ったら下記コードをペースト。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634043/17fe9892-3ed7-a8cf-dfb0-ab3fdfce60d1.png)


3. 必要に応じてコード内変数を変更してください。
    ##### 色
`var color = "#008000"`のあとに[16進数](https://programmercollege.jp/column/1414/#section300)で指定してください。（たぶんRGBでも動くと思いますが確認していません。）色指定はダブルクォーテーション("")で囲んで下さい。
　　##### 何列目まで塗るか
`untilRow = 7` の数字を変えて下さい。塗りつぶしはアクティブセル位置から上に向かって行われるので塗り終わりたい列番目を記入します。
    ##### 何行目まで塗りつぶすか
`lastCol = 100`の数字を変えて下さい。無論数字が大きいと処理が遅くなるのでいい具合にすると良いでしょう。  

4. 判定したい行の最下部にセルを置くか、範囲選択する。その後2の添付画像にある実行を押すと着色されます。

```applescript
function PaintIfBlank() {
  // シートを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var activeRange =  sheet.getActiveRange();

  //色指定
  var color="#ffff00";
  //塗りたい列番
  var untilRow = 7;
  var limit = activeRange.getLastRow() - untilRow + 1;
  for(var i = 0; i < limit ; i++)
  {
    var checkCellRow = activeRange.getLastRow()-i;
    var activeCol = activeRange.getColumn();
    var checkblank = sheet.getRange(checkCellRow, activeCol).isBlank();

    if(checkblank){
      //塗りたい行数
      var lastCol = 100;
      sheet.getRange(checkCellRow, 1 ,1,lastCol).setBackground(color);
   }
  }
}

```


# 頻繁に使う場合は

下記リンクのようにボタンとして設置することができます。
よしなに。

https://xn--t8j3bz04sl3w.xyz/spreadsheet/calendar-renkei/3703/3/
git submoduleでsub側の親build.gradle.ktsが邪魔なときに無視する方法

別リポジトリを取り込むことでコードの共通化ができるなど、

便利と言われるgit submoduleですが、

取り込まれる側(マルチプロジェクト構成)の親build.gradle.ktsって邪魔じゃないですか？
(Kotlinのバージョン指定が重複してます、とか言われる。。)

そういうググっても出てこなかったので、書きます。

# 環境
- Gradle 6.8.1
- Kotlin 1.5.20
- Git 2.28.0
- 取り込む側も、取り込まれる側もマルチプロジェクト構成

```取り込まれる側.
sub-project/
|-sub-project-child
| |
| -gradle.gradle.kts
|
-build.gradle.kts
```

```取り込む側.
root-project/
|-root-project-child
| |
| -gradle.gradle.kts
|
|-sub-project/
| |-sub-project-child
| | |
| | -gradle.gradle.kts
| |
| -build.gradle.kts // …(B)
|
-build.gradle.kts // …(C)
-settings.gradle.kts // …(A)
```

# いきなり解答

```(A)settings.gradle.kts
rootProject.name = "root-project"

include(
    ..
    ":custom-name"
)

project(":custom-name").projectDir = file("sub-project/sub-project-child")
```

これで、sub-projectのbuild.gradle.ktsに悩まされずに、欲しかったsub側の小プロジェクトだけをroot側で取り込むことができました。

## （おまけ）エラーが出る例

```(エラーが出る例)(A)settings.gradle.kts
rootProject.name = "root-project"

include(
    ..
    ":sub-project:sub-project-child"
)
```
こうやって子プロジェクトを読み込むケースもありますが、
こうすると、build.gradle.kts(B)も読み込んでしまい、build.gradle.kts(C)と重複してKotlin versionなどが定義されていることでエラーが発生しました。
Rails link_toメソッドについて

#link_toメソッドとは

引数を指定してあげることでリンクを作成してくれるメソッドです。
railsにおいてビューファイルで使用することができる。
タイトル.html.erbファイルにて宣言してあげることで宣言して使う。
htmlでいうaタグのような役割を持っている

以下のように記述する。

```ruby.html.erb
<%= link_to "リンク名”, リンク先のパス, class: "クラス名", method: :HTTPリクエスト %>

```

メソッドを指定することでリンク先のルーティングを設定できる。
deviseの場合はログアウトするリンクを作りたい時に ``` destroy_user_session_path method: :delete ``` という風に記述する。

以下link_toを使用した記述例

```ruby.html.erb
<%= link_to "トップページへ戻る", root_path, class: "class" %>

```

htmlのaタグを使用しての記述の場合

```tital.html
<a class="class名" href="/hogehoge">タイトル</a>

```

以上です
mermaid.js シーケンス図の特定部分をカラーハイライトでくくる

# 目的

- mermaid.jsのシーケンス図において、特定部分をカラーハイライトでくくる方法をメモ的にまとめる

# 方法

- 下記のように記載する。

    ```mermaid
    sequenceDiagram
        participant A as hogehoge
        participant B as fugafuga
        participant C as piyopiyo

        rect rgb(赤の強さ, 緑の強さ, 青の強さ, 透過率)
            %% カラーハイライトを聞かせたいシーケンス
        end
    ```

- たとえば下記の様なシーケンス図があったとする。

    ```mermaid
    sequenceDiagram
        participant A as hogehoge
        participant B as fugafuga
        participant C as piyopiyo

        A->>B: おはようございます
        B->>B: 挨拶を返すか考える
        B->>A: おはようございます
        A->>C: こんにちは
        C->>C: 挨拶を返すか考える
        C->>A: こんにちは
    ```

- 下記のように表示される。

    ![Online_FlowChart___Diagrams_Editor_-_Mermaid_Live_Editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9952595a-1b90-7431-33f3-f6c671d6e480.png)

- 下記の部分のみカラーハイライトをつけたいとする。

    ```
        A->>B: おはようございます
        B->>B: 挨拶を返すか考える
        B->>A: おはようございます
    ```

その場合下記のように記載する。

- たとえば下記の様なシーケンス図があったとする。

    ```mermaid
    sequenceDiagram
        participant A as hogehoge
        participant B as fugafuga
        participant C as piyopiyo

        rect rgb(110, 110, 100, 0.2)
            A->>B: おはようございます
            B->>B: 挨拶を返すか考える
            B->>A: おはようございます
        end
        A->>C: こんにちは
        C->>C: 挨拶を返すか考える
        C->>A: こんにちは
    ```

- 下記のように表示される。

    ![Online_FlowChart___Diagrams_Editor_-_Mermaid_Live_Editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/26613e49-acb6-82c6-d5cf-8c7a40d895a2.png)
パーセプトロン(単純パーセプトロン) 基礎

##はじめに
以前、機械学習の勉強をしていたが、サボりにサボってしまい、内容を忘れてしまった。
なので、機械学習の勉強を１からやっていきたいと思う。

本日は、ディープラーニングの基礎の基礎であるパーセプトロンの概念や式の理解を中心にアウトプットしていきたいと思う。

※この記事に関して何かアドバイスや誤りがありましたらコメントよろしくお願い致します。

##参考URL
- ５分でわかる！パーセプトロンの仕組みと実装方法（Python）（https://blog.apar.jp/deep-learning/11979/）

##1. パーセプトロンとは
パーセプトロンとは、コンピュータ上で人間の神経細胞を模倣しものの事を指す。

パーセプトロンの仕組みは、複数の入力(画像では、3つ)を重みと乗算しその総和が一定の決められた値(閾値)を超えたら、0か1を出力する。
また、1を出力することを、『ニューロンの発火』という。

言葉の定義:

- 入力 (x<sub>1</sub>,x<sub>2</sub>,x<sub>3</sub>):パーセプトロンに入力される値のことを指す。

- 重み (w<sub>1</sub>,w<sub>2</sub>,w<sub>3</sub>):入力として受け取った値の重要度を示す。


　　例えば、彼女にしたい女の人の条件を考えた時に、人によって顔を重視する人や性格を重視する人がいる。
　　もし、あなたが顔を重視して選びたければ、顔の重みを5、性格を1というように調整する。(文系みたいな例えですみません。)

- 閾値 (θ):限界値のこと。この値を超えるとニューロンが発火する。
- 出力 (y):0か1を出力する。

![スクリーンショット 0003-07-06 20.23.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248073/f3a974da-5a39-0862-459f-4631bd658a96.png)

- バイアス(b):1を出力する度合を調整するための値。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248073/cb0413b9-8e6a-ec88-81bc-18a47a5a429f.png)

※[５分でわかる！パーセプトロンの仕組みと実装方法（Python）](https://blog.apar.jp/deep-learning/11979/)より引用

##2. パーセプトロンのモデル 入力編
パーセプトロンは複数の値(画像では、x<sub>1</sub>,x<sub>2</sub>,x<sub>3</sub>)を入力として受け取り、1つの値を出力する

この受け取った複数の値の重要度を示すために、重み(w<sub>1</sub>,w<sub>2</sub>,w<sub>3</sub>)を乗算します。

ここまでを式で表すと以下のようになる。
式: x<sub>1</sub>w<sub>1</sub>+x<sub>2</sub>w<sub>2</sub>+x<sub>3</sub>w<sub>3</sub>
このように、入力と重みを掛け合わせて、総和する。
![スクリーンショット 0003-07-06 21.10.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248073/11045e2b-1132-826b-e451-97e5ce238797.png)

##3. パーセプトロンのモデル ニューロン編
ニューロン(大きな丸)では、先ほど説明した総和が計算され(黄色い丸)、その値が活性化関数に渡される。

活性化関数とは、入力と重みの総和を出力に変換する変換機のことを指す。
活性化関数はたくさん種類があるが、ここでは代表的なステップ関数という活性化関数を紹介する。
![スクリーンショット 0003-07-06 21.15.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248073/936a8e70-4d61-a859-0149-09a78d610f41.png)

##4. パーセプトロンのモデル　活性化関数(ステップ関数)編
ステップ関数は、閾値を境にして出力が切り替わる関数のことを指す。

入力した値が0より大きければ1を出力し、0より小さければ0を出力する。

一般的に『パーセプトロン(単純パーセプトロン)』の活性化関数で用いられる。

式で表すと、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248073/b3afc37d-c45a-30bf-fc70-ec264928345a.png)
[［活性化関数］ステップ関数（Step function）とは？](https://www.atmarkit.co.jp/ait/articles/2002/26/news010.html)より引用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248073/dc1ce0e4-8ba9-2f8b-2699-d2ed774d641b.png)

##5. 最後に
最後まで読んでいただきありがとうございました。
これからもたくさんアプトプットしていきたいと思いますので、お互いがんばりましょう。

最後に、記事に関してアドバイスや間違いの指摘は大歓迎ですので、よろしくお願い致します。
Flutter環境構築(windows10)

<h1>前提</h1>
・Java8以降パスが通っておりJAVA_HOMEも設定している。
・Android studioインストール済み

<h1>手順</h1>
①下記公式からSDKをインストール
https://flutter.dev/docs/get-started/install/windows
<hr>
②zipを展開しflutterフォルダを任意の場所に配置。
ただしC:\Program Files\のような権限規制が強いところはNGとのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/1d1a99fe-bb22-761e-906c-dc03c5056bf7.png)
<hr>
③さきほど②で配置したflutterの下のbinまでをフルパスで環境変数Pathに設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/637bdc1b-8600-4f5d-d032-5d2fccb2ffe6.png)
<hr>

④Android StudioのFileタブ→Settings→Appearance & Behavior→System settings→Android SDK→SDK ToolsタブにあるAndroid SDK Command line Toolsにチェックを入れapplyしOKします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/0f972a8f-06e8-ccae-7396-871c24c5629e.png)

⑤Android StudioのFile > Settings > Plugins>Market PlaceからFlutterのプラグインをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/7e993c41-84da-0e02-e58b-3f079bd77fe4.png)

⑥コマンドプロンプトでflutter doctor --android-licenses実行し、全てYesと答えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/551ac9ca-4266-d2dc-b5cc-b53a1e3b8825.png)


⑦flutter doctorを実行しflutter環境整っているかチェックします。何故かAndroid studioでひっかかっていますがこれは私の環境の問題だと思うのでひとまず無視します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/15972803-dbed-824b-4535-d60eefab8380.png)
Rails ホームページと記事一覧ページ

# 開発環境
Rubyバージョン: *2.6.5*
Railsバージョン: *6.1.3*
deviseは導入してません。
#ホームページとhomeコントローラー
```confing/routes.rb
get "home/top"=>"home#top" 
```
```controllers/home_controller.rb
def top
end
```
###解説
get "URL"=>"コントローラー名#アクション名" で”localhost:3000/home/top”
というURLが送信された時にhomeコントローラーのtopアクションで記述されたコードが実行されます。
#記事一覧ページ
```controllers/posts_controller.rb
def index
    @posts = Post.all.order(created_at: :desc)・・・１
  end
```
```posts/index.html.erb
<% @posts.each do |post| %>　　・・・２
    <div class="posts-index-item">
      <%=post.content %>・・・２
      </div>
    </div>
    <% end %>・・・３
```
###解説
・・・１：postsコントローラーのindexアクションにおいて、postsテーブルに保存されている全てのデータを
 変数@postsに代入しています。また、Post.all.order(created_at: :desc)と書くことで、投稿順が新しいものが上になるようになります。
・・・２：@postsに代入されている配列データをeach文で１つずつ変数postに代入して、投稿内容を繰り返し表示させています。
・・・３<%=post.content %>のように<%　%>で囲むことによって、HTMLファイルの中にRubyコードを記述できます。これをerb(=Embedded Ruby(埋め込みRuby))といい、埋め込んでいるRubyコードをブラウザに表示させることができます。また、<%= %>と表記すると中に埋め込まれている変数の値が読み込まれるため３の場合だと、<%=end%>と表記する必要はありません。
#参考になった記事
[postの表示の順番](https://qiita.com/Kaisyou/items/c4d2e3d9d0c7d17d637b)
Gitコミットの際にエディタをVisual Studio Codeに設定する方法

## 方法
- Visual Studio Codeで「command + shift + p」でコマンドパレットを開き下記を実行する。

```
Shell Command: Install 'Code' command in path
```

- コマンドラインから下記のコマンドを実行する。

```
git config --global core.editor "code --wait"
```

- git commmit実行時にVisual Studio Codeを開けば設定は完了
- 先頭行に記載後、ファイルを閉じるまで忘れないように！
入門『地頭を鍛える』を読んでみた感想２

こんにちは、A-seatです。
下記のURLよりchapter2まで読みましたので感想を書きます。

前回:https://qiita.com/0W5E8fPq1EOm4yE/items/01af82d86d78b882e2cc

#1.読んでみた感想
chapter2まで読んでみて、なんとなくイメージは分かりましたが、具体的にどう活かすかは理解できていないところです。
演繹と帰納とあり、基本情報技術者試験で聞いたことあるなと言う感じでしたが意味を下記の通り理解しました。(間違ったらすみません)
演繹:そういう風に決まっているから(例：人はいつか死ぬ)
帰納:多くがそうだから(例：学校のクラス40人のうち39人がアニメ好きの場合、うちのクラスはアニメ好きであるみたいな)

#2.アクションプラン
本書にも書いてありましたが、かなり難しい内容ですのでこのchapter2に関しては読み進めていく中で振り返って理解を深めるといったスタンスが自分に合うと思いました。

#3.さいごに
chapter2は理解が深くないのでどう活かすかが難しいところですが自分なりにこうことかと理解を深められるように他の章を読み終わった後でも読み返していきたいです。
GAE laravel7 でエラーレポートに出力する方法

## GAE上で動かすLaravel7でエラーレポートにエラー出力する設定方法とコードの記述について説明します。

## ライブラリのインストール
1. 次のコマンドを使用して、クラウド ライブラリをインストールします

```
$ composer require google/cloud-error-reporting
```

2. 次の行を php.ini に追加します。ここで、`PROJECT_DIR` はプロジェクトのルート ディレクトリの`絶対パス`です。

```
auto_prepend_file='PROJECT_DIR/vendor/google/cloud-error-reporting/src/prepend.php'
```
絶対パスはもしかすると環境ごとに違うのかもしれませんが、わからない場合は以下の記述をそのままコピーして試してみてください。

```
auto_prepend_file=srv/vendor/google/cloud-error-reporting/src/prepend.php
```

3. app.yamlでGOOGLE_CLOUD_PROJECT環境変数に Google Cloud プロジェクト名を設定します。

```qiita:app.yaml
runtime: php72

env_variables:
  GOOGLE_CLOUD_PROJECT: "qiita_project"
```

4. Laravelのコード修正
次のように、ファイル app/Exceptions/Handler.php 内の report 関数を編集します。

```qiita:app/Exceptions/Handler.php
use Throwable;
public function report(Throwable $exception)
{
    if (isset($_SERVER['GAE_SERVICE'])) {
        // Ensure Stackdriver is initialized and handle the exception
        Bootstrap::init();
        Bootstrap::exceptionHandler($exception);
    } else {
        parent::report($exception);
    }
}
```

## 使い方

```qiita:phpファイル
<php?
use App\Exceptions\Handler;

class Qiita extends {
    public funtion Qiita(){
        try{
            throw new \Exception("Intentional exception."); // この例では強制的にエラーを発生させる
        } catch (Exception $e){
            Handler::report($e); // Handlerクラスのreport()メソッドを呼び出す
        }
    }
}
```


あとはGAEにデプロイ後、GCPのエラーレポートのダッシュボードで出力されている様子を確認してください。
AtCoderログ：0008 - ABC 208 B

# 問題

https://atcoder.jp/contests/abc208/tasks/abc208_b

## 問題文
> 高橋王国では $1!$ 円硬貨, $2!$ 円硬貨, $\dots$, $10!$ 円硬貨が流通しています。ここで、$N!=1 \times 2 \times \cdots \times N$ です。
> 高橋君は全ての種類の硬貨を $100$ 枚ずつ持っており、$P$ 円の商品をお釣りが出ないようにちょうどの金額を支払って買おうとしています。
> 問題の制約下で条件を満たす支払い方は必ず存在することが証明できます。
> 最小で何枚の硬貨を使えば支払うことができますか？

## 制約
> ・$1 \le P \le 10^7$
> ・$P$ は整数である。

# 回答
## 回答1 (AC)
支払いに使用する硬貨の枚数を最小にするには、大きな硬貨から使用枚数を計算していけば良いでしょう。わかりやすいように $10! \sim 1!$ を全て計算し、配列に保持しました。コードは以下のようになります。私が ABC 208 に参加したときも同じ方針で提出コード](https://atcoder.jp/contests/abc208/submissions/23966193)を作成しました。

```C++:abc208b-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int p;
  cin >> p;
 
  vector<int> coin = { 3628800, 362880, 40320, 5040, 720,
                           120,     24,     6,    2,   1 };
  int cnumber = 0;
  for ( int i=0; i<10; i++ ) { 
    cnumber += p/coin.at(i); 
    p       -= (p/coin.at(i))*coin.at(i);
  }
  
  cout << cnumber << endl;
}
```

## 回答2 (AC)
回答1では $1!,2!,\dots,10!$ を計算した値を使用していましたが、コードからは何のパラメータかわからないので、コードの内部で計算するように変更しました。コードは以下のようになります。

```C++:abc208b-2.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int p;
  cin >> p;
 
  int coin = 1;
  for ( int i=1; i<=10; i++ ) {
    coin *= i;
  }

  int cnumber = 0;
  for ( int i=10; i>0; i-- ) { 
    cnumber += p/coin; 
    p       -= (p/coin)*coin;
    coin    /= i;
  }
  
  cout << cnumber << endl;
}
```

## おまけ
高橋君は全ての硬貨を $100$ 枚ずつ持っているので、同じ硬貨を何枚か使うことで一つ大きな硬貨の金額を支払うことができます。このため、高橋君が支払うことができない金額はないことがわかります。

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc208/tasks/abc208_b/editorial) → [公式解説](https://atcoder.jp/contests/abc208/editorial/2187)
解答1は小さい方から硬貨の枚数を計算していく方法で、階乗の性質をうまく使っていると思いました。解答2は回答と同じ方針でした。

## [AtCoder の解説](https://atcoder.jp/contests/abc208/tasks/abc208_b/editorial) → [ユーザ解説](https://blog.hamayanhamayan.com/entry/2021/07/05/013017)
回答と同じ方針でした。補足説明の部分はちょっとピンときませんでした...

# リンク
## ABC 208 関連情報
- [AtCoderログ：0006 - ABC 208 に参加しました](https://qiita.com/RoadLynton/items/029fb11fa9b5bbfd95ce)
- [AtCoderログ：0007 - ABC 208 A](https://qiita.com/RoadLynton/items/ea6a30e973f6af51831c)
- [AtCoderログ：0009 - ABC 208 C](https://qiita.com/RoadLynton/items/7e7a580ae843e60f8b2f)

## 前後の記事
- 前の記事 → [AtCoderログ：0007 - ABC 208 A](https://qiita.com/RoadLynton/items/ea6a30e973f6af51831c)
- 次の記事 → [AtCoderログ：0009 - ABC 208 C](https://qiita.com/RoadLynton/items/7e7a580ae843e60f8b2f)
How to install wine on Linux Ubuntu

#How to intall wine
Wine able to run Windows Software on Linux OS

```
sudo dpkg --add-architecture i386 
```

```
wget -nc https://dl.winehq.org/wine-builds/winehq.key
sudo apt-key add winehq.key
```

```
sudo add-apt-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ focal main'

```
```
sudo apt update
```

```
sudo apt install --install-recommends winehq-stable
```
```
sudo apt install winetricks
```

#Reference

https://wiki.winehq.org/Ubuntu
https://tombomemo.com/wine-install-setting/


#How to install Origin with Wine
```
$winetricks corefonts
$sudo apt install liblinux-inotify2-perl
$touch perl
$vim ./perl
$featherpad ./perl
```

```:perl
#!/usr/bin/perl

use strict;
use warnings;
use Linux::Inotify2;

my $inotify = new Linux::Inotify2 or die "unable to create new inotify object: $!";

my $file = q(/home/「あなたのユーザー名」/.wine/drive_c/Program Files (x86)/Origin);
$inotify->watch ($file, IN_ACCESS, sub {
    chmod 0755, $file;
});
1 while $inotify->poll;
```
```
$chmod +x ./perl
$./perl
```
この状態でwine origin.exeを実行する。以上




引用
https://forums.ubuntulinux.jp/viewtopic.php?pid=121728
https://answers.ea.com/t5/Origin-Client-Web-Technical/Error-3-0/td-p/5556626/page/3
Obsidianで作業記録を取ると、ウェブリンクもローカルへのリンクもまとめて扱えてとても便利だとおもっているのですが、どうでしょう

## はじめに（この記事の背景）

[思考支援ツール`Obsidian`][01]は、とてもとても素晴らしい。どれくらい素晴らしいか、わたしの乏しい説明力ではぜんぜん伝わる気がしないですけれども。

具体的には、たとえば作業ログを取っておくときにとても便利なんだよなあ。ということを、すこし書いておこうと思った。

## たとえばの例（e-Tax）

なかなかQiitaに載せられるタスクがないのだけど、最近で言えば、e-Taxを使おうしたら、これが笑っちゃうぐらいややこしかった（ほんとうにゲタゲタ笑いながらやってましたよ）。

いやなことはすぐ忘れるけど、マニュアルばかりでログインページが見つからないサイトを歩き回り、利用者識別番号を取って→電子証明書を取って→どのソフトを使えばさっぱりわからない説明を熟読しながら、えいやっとカンと気合でソフトを選んで……。いろいろ迷いながら選ぶと、何を選んだか忘れますよね。

e-Taxに限らず、不慣れなタスクを進める際には、

- どのウェブページで情報を得たのか
- どの手順でタスクを進めたのか
- どういう問い合わせを行って、どういう回答が来たのか
- どういうアウトプットが出たのか（入力完了画面のスクリーンショットとか、作成したファイルとか）

などを記録しながら進めておくと、

- その作業をしているあいだも安心
- 後日（数週間後）見たときにとても助かる

などと、精神の安定に非常に良いことがわかっている。

## 怖い魔女の手から逃れるべく、

暗い深い森を抜けるときこそ、ヘンゼルとグレーテル方式で、パンくずを落としながら歩くに限る。

やってきた道を、いつでもたどって戻れるという安心感が、脳の畏縮を防いで、パフォーマンスをちょっとはマシにしてくれるのだ。

ヘンゼルとグレーテルのパンくずよりは、もう少しまともで強力なツールが、[Obsidian][01]である。

その際に、[Obsidian][01]を使っていてとても助かるのは

- ウェブリンクを書いておける
- ローカルファイルへのリンクを書いておける
- ローカルフォルダへのリンクも書いておける
- タスク記録同士もリンクできる

こと。

自慢じゃないけれども、だいたいが、先月やったタスクを、今月は覚えていない。エッヘン。

先月やったタスクの、具体的なインプット・プロセス・アウトプットが記録されていることで、どれほど助かったことか。

## たとえばこんなかんじ

で、[Obsidian][01]のメモに、何でもかんでも適当に書いて、要所要所にリンクを張っておく。

<a href="https://gyazo.com/5ed4ac817bda24122d84035c61041b02"><img src="https://i.gyazo.com/5ed4ac817bda24122d84035c61041b02.gif" alt="Image from Gyazo" width="480"/></a>

ナレッジデータベースをつくろうとか、そういう肩にチカラを入れることをしなくても、「やったことを残しておく」だけで、かなり強力な知見が溜まっていくのが、[Obsidian][01]の素晴らしいところだと思います。

## ちなみにリンクの作成は

ウェブリンクは

- コピペで自動的にリンクを作ってくれる
- Alfredのスニペット

ローカルリンクは

- Automator（　[作業ログ｜Obsidianで便利なローカルファイルへのリンクを、Automatorに作成してもらうと楽ちんだなあ](https://qiita.com/hann-solo/items/5537e54704db48696f80)をご参照）

でやっている。

## 環境

ここで書いていることは、下記のバージョンで実施しました。

- Obsidian v0.12.5
- macOS BigSur 11.4

## リソース

[01. Obsidian - A second brain, for you, forever.][01]
[02. 作業ログ｜Obsidianで便利なローカルファイルへのリンクを、Automatorに作成してもらうと楽ちんだなあ][02]
[03. Obsidian｜使いかたの記録（目次）][03]

[01]: https://obsidian.md
[02]: https://qiita.com/hann-solo/items/5537e54704db48696f80
[03]: https://qiita.com/hann-solo/items/ac8fa75394813e8adcf4
駆け出しがRailsアプリをHerokuにデプロイするときに躓いたこと

バックエンドエンジニアを目指し、Ruby on RailsでGoogleの口コミから信憑性の高い投稿のみを抽出して評価を判定するサービスをポートフォリオとして作成しました。
ローカル環境で正常に動くものができ、いざHerokuにデプロイしてURLにアクセスしてみると`Application error`となってしまいその原因が分からず数日間悩みました。
今回はデプロイ後に`Application error`となってしまった原因２つを紹介します。
## 前提
- Rails 6.1.3.2
- ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin20]
- selenium-webdriver
- ChromeDriver
- Herokuへのデプロイを考慮して、データベースはRailsでデフォルトのSQLiteからpostgresqlへ変更済み

## 必要なbuildpack が追加されていなかった
- `heroku/ruby` `heroku/nodejs`、Google Chromeを操作するために必要なドライバ `heroku/chromedriver`の３つが揃っていなかった
- 原因
  - デフォルトで`heroku/ruby` `heroku/nodejs`が存在していたにも関わらず、`heroku buildpacks:set heroku/chromedriver`を実行してしまった
  - `heroku buildpacks:set`は既存のbuildpacksをすべて吹き飛ばして引数で指定したbuildpackが追加されるため、`heroku/ruby` `heroku/nodejs`が消えて`heroku/chromedriver`のみが存在する形になった
  - `heroku/chromedriver`を設定したい場合は`heroku buildpacks:add heroku/chromedriver`とすることで既存のbuildpackを上書きすることなく追加できた

## Heroku上のアプリにおけるadd-onsにPostgresが設定されていなかった
### やったこと
- Configure Add-onsから`Heroku Postgres`を追加
- ターミナルからではなくブラウザからHerokuのアプリを作成したためpostgresqlを使用していることがHerokuにうまく伝わっていなかったことが原因と考えられる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1712732/11527ca0-cedf-d8ce-352f-883b9852e579.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1712732/f5baa53a-d045-0ae9-2ac4-788e7ad4449d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1712732/f9f0ff24-768c-2129-da22-285d8d642cdb.png)
【ざっくり解説】Capistranoでsudoを使いたい

## 問題点
Capistranoを使ってRailsアプリケーションをデプロイしていたところ、
カスタムで作成したApache再起動タスクでエラーが起きた。

```shell
** Execute deploy:restart
  01 sudo systemctl restart apache2
  01 sudo
  01 :
  01 a terminal is required to read the password; either use the -S option to read from standard input or configur...
  01 
cap aborted!
```
おぉん…。

調べた結果、ptyをtrueにする必要があるとのことで、それを試してみる。

```ruby:deploy.rb
# Default value for :pty is false
set :pty, true
```

再度、自動デプロイを実行。

```shell
** Execute deploy:restart
00:00 deploy:restart
   01 sudo systemctl restart apache2
   01 [sudo]password for username:
passw.. # パスワードが丸見え…
```
おぉん…パスワード丸見えやね。
しかも正しいパスワードを入れてEnterを押下してもその後反応なし。

## 解決法
[sshkit-sudo](https://github.com/kentaroi/sshkit-sudo)というGemのお力を借りしました。

とりあえずGemfileを記述して、`bundle install`も忘れずに。

```ruby:Gemfile
gem 'sshkit-sudo'
```
Capfileに`sshkit/sudo`を追加。

```ruby:Capfile
require 'sshkit/sudo'
```

そして従来は`execute :sudo`としていたところを、以下のように`execute! :sudo`とします。

```diff:deploy.rb
- execute :sudo, 'systemctl restart　apache2'
+ execute! :sudo, 'systemctl restart apache2'
```
ついでにptyはいらないっぽいので、再度コメントアウトしておきます。

```ruby:deploy.rb
# Default value for :pty is false
# set :pty, true
```
ここまで設定したら、Capistranoで自動デプロイを実行します。

```shell
** Execute deploy:restart
00:00 deploy:restart
   01 sudo systemctl restart apache2
   01 [sudo]password for username:
# パスワードを入力...
 ✔︎　　01 username@host 0.030s
** Invoke...
```

対話的にパスワードを入力し、無事にapache再起動タスクが完了しました。

## 余談

[前回の記事](https://qiita.com/WAKO_program/items/47ae9f9c24a5145f978e)でご紹介しましたが、Capistranoは**非対話型・非ログインシェル**を割り当てています。

[公式のREADME](https://github.com/capistrano/capistrano#sudo-etc)にも、「sudoを使わない方がスムーズに自動デプロイできるよ」という趣旨の記述があり、やんわりとsudoの使用が非推奨になっています。

今回はGemの力をお借りして実装しましたが、できればsudoを使わない方が公式に則った安全策と言えそうです。sudoを使わない、あるいは使ったとしても対話しないような方法についても、今後調査してみたいと思います。

## 参考にしたドキュメント・記事
- [Capistrano - Github](https://github.com/capistrano/capistrano)
- [sshkit-sudo - Github](https://github.com/kentaroi/sshkit-sudo)
[Flutter]e.codeでエラーになる問題

# firebaseログイン・新規登録でtry-catchした時、catchの方でe.codeとした時、エラーが出てしまう。

## エラーのスクリーンショット
![スクリーンショット 2021-07-06 20.42.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/2ed94649-acb4-8ef0-d0d4-2e63bbd6cbdf.png)


##解決策
import 'package:flutter/services.dart'をインポート。
<b>on PlatformException catch(e)</b>
で書いたら直った。

![スクリーンショット 2021-07-06 20.45.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/6b8a2cdc-f8bf-f1a7-aed4-44bea1cca009.png)
Python Coding Test - easy

##電話番号リスト (Level2）
####問題要約
* phone_book:電話帳を配列します。
* ひとつの番号が電話帳の違う番号の接頭語である場合はfalse、なければtrueをreturnします。

####テストケース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465875/6de57720-c74b-5736-f173-6f157cd9e846.png)

####解決
* 電話帳リストの長さを基準に昇順に整列
* 当該配列をfor文を戻し、後ろの番号と比較
* 接頭語が存在したら、answerをFalse後、checkという変数にTrueと宣言して関数を終了
* 接頭語が存在しない場合、for文が完了した後にTrueに返却

```python
def solution(list):
     answer = True 
     check = False 
     list = sorted(list, key=len) 
     for i in range(0, len(list)): 
        if check: 
             break
        current = list[i]
        for j in range(i+1, len(list)): 
            comp = list[j] 
            if len(current)<len(comp) and current == comp[0:len(current)]: 
                answer = False 
                check = True 
                break 
    return answer
```
特定のURLだけBasic認証を掛けたり別のBasic認証を掛ける

Ifディレクティブを使って \x2F で挟んであげる

```apache
<If "%{REQUEST_URI} =~ /\x2Fspecial-page\x2F.*/">
	AuthType Basic
	AuthName "Input your ID and Password."
	AuthUserFile /path/to/.htpasswd
    AuthGroupFile /dev/null
	Require valid-user
</If>
```

**おわり。**
作業ログ｜Obsidianで便利なローカルファイルへのリンクを、Automatorに作成してもらうと楽ちんだなあ

## はじめに（この記事の背景）

[思考支援ツールのObsidian][01]で、ローカルへのリンクを挿入できて、これがかなり便利。

<a href="https://gyazo.com/5372ddebc223152440bcacc1adad3faf"><img src="https://i.gyazo.com/5372ddebc223152440bcacc1adad3faf.gif" alt="Image from Gyazo" width="480"/></a>

ローカルへのリンクを

```
[ファイル・フォルダ名](<file:///フルパス>)
```
という形式で書いておくと、ワンクリックでファイルも開けるし、フォルダも開ける。Markdownってステキ。

あまりにも便利でよく使うので、手作業でリンクを作るのが面倒くさくなってきた。Alfredスニペットも作ったけど、それでもめんどくさくて、１クリックでリンクを作ってほしくなった。

で、Automator + シェルスクリプトにがんばってもらうことにした。

意外とハマりどころがあったので、将来の自分のために記録しておく。

## 環境

ここで書いていることは、下記のバージョンで実施しました。

- Obsidian v0.12.5
- Automator バージョン2.10 (509)
- macOS BigSur 11.4

## Automatorの全体

`新規書類 > クイックアクション`でファイルを作成。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/3d33d5a8-9419-e67f-5d4f-7d5c8cdb4859.png" width=80%>

## コード

だいたい見たとおり。

```bash
# LANG環境変数を設定
export LANG=ja_JP.UTF-8

# 連結用文字列を設定
str1="["
str2="]"
str3="(<file://"
str4=">)"

# Obsidianで使えるMarkdown形式のローカルリンクを作成
for f in "$@"

do

#	echo "$f"

#   basenameを取得（/から前を削除）
	fn=$(basename "$f")
#	echo "$fn"

	echo "$str1$fn$str2$str3$f$str4" | pbcopy

done
```

## ハマりどころ

### クイックアクションのファイルはどこにあるのか

いつもこれがわからなくなるのだが……`/Users/ユーザ名/Library/Services`。
`Finder`で`option + 移動`で`ライブラリ`が出てくるので、ここからアクセスするのが速い。

[02. Automator クイックアクション削除時にservicesフォルダが表示されない][02]


### 文字化け

```bash
$ echo $boo$foo | pbcopy
```

とすると、`[蜊ｰ蛻ｷ](<file:///Users/mmmm/Desktop/蜊ｰ蛻ｷ>)`

みたいに、文字化けしてしまう。

[pbcopy(1) osx man page][03]によると、LANG環境変数を設定しておかないといけないようなので、

```bash
export LANG=ja_JP.UTF-8
```

の行を入れてやると、無事解決した。

あるいは、`シェルスクリプトの実行`の後ろに、`クリップボードにコピー`を追加する手もある（自動的に文字コードを変換して良いようにしてくれる）。

### フルパスに半角スペースが含まれている場合

```bash
fn=$(basename $f)
```

と書いてしまうと、たとえば`/Library/User Pictures/Animals/Eagle.tif`といった場合、期待する`Eagle.tif`ではなく、`Pictures`を取って来てしまう。

そこで

```bash
fn=$(basename "$f")
```

としておいた。

### デバッグのコツ

クイックアクションを動かそうと思って`実行`ボタンを押しても、入力を指定できない。

そこで、デバッグ用に、一時的に`Finder項目の選択を求める`を追加しておくと便利。`実行`ボタンを押すたびにファイルを指定しなければならないが、`結果`に`$ echo`の出力を表示できる。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/8d914b3d-2ddd-ad90-f1b7-6575940ed4b8.png" width=80%>

## 過去記事

Automator＋シェルスクリプトのツール。

[【記録】ファイルを複製し、日付部分を変更する【macOS Automator シェルスクリプト】][04]
[【記録】ファイルを複製し、日付を変更する（その２）][05]
[【記録】ファイルを複製し、日付を変更する（その３）][06]



## リソース

[01. Obsidian - A second brain, for you, forever.][01]
[02. Automator クイックアクション削除時にservicesフォルダが表示されない][02]
[03. pbcopy(1) osx man page][03]
[04. 【記録】ファイルを複製し、日付部分を変更する【macOS Automator シェルスクリプト】][04]
[05. 【記録】ファイルを複製し、日付を変更する（その２）][05]
[06. 【記録】ファイルを複製し、日付を変更する（その３）][06]

[01]: https://obsidian.md
[02]: https://discussionsjapan.apple.com/thread/252874334
[03]: https://www.unix.com/man-page/osx/1/pbcopy/
[04]: https://masatler.hatenablog.com/entry/2020/02/24/215033
[05]: https://masatler.hatenablog.com/entry/2020/03/07/132301
[06]: https://masatler.hatenablog.com/entry/2020/05/04/100139
社内SEの必要な知識〜技術編〜

#社内SEの必要な知識〜技術編〜
先日こんな記事を投稿したところ、想像よりもアクセス数が伸びたため今回は技術的な知識に焦点を絞って話を進めていく。


##企業のスペック(再掲)

初めて記事を読む人もいるので再掲しておく
あくまで一企業の話であるので他の企業も全てがそうであると言い切れないということで。

企業名：言えない
場所：東京某所
主な業種：言えない
開発あるなし：あり
社員の人数：いっぱい
エンジニアの人数：いっぱい

色々言えないこと多いけど、要はデカめな企業のシステム部門ということです。
企業のスペックについては以上。
（質問してくれたら答える。かもしれない。）

それではマイル。


##プログラミング言語について

#SQL言語

プログラミング言語なのか？と問われるとちょっと曖昧ですが、少なくともIT技術ではあります。
さて、SQLの使用頻度ですが
__少なくともプログラミング言語の中で一番多く使います。__


大学生だった頃はJavaというプログラミング言語が一番使うと思っていました。
（実際に今も実践経験のない大学生はそう思っているのではないでしょうか？）
ところがどっこいJavaなんて比較にならないぐらい使います。

いったいなぜそんなに使うのか？
__社内SEでは他の部署からデータの提供を求められます。__

よく聞かれるデータのリクエストは以下の通り。
・X曜日の顧客の購入人数を見て欲しい。
・X時の時間帯の購入金額とY時の購入金額の差を教えて欲しい。
・XXXXという商品がいくつ売れるのか教えて欲しい。
・売れていない商品のワースト１０位を教えて欲しい

などなど様々です。
このリクエストが来るたびに社内SEはクエリを組み上げてSQLサーバーへ投げ、
長いレスポンス時間を得てようやく情報を手に入れることができるわけです。


また、__新しい企画、プロジェクトの立ち上げ__の際には、必ずその企画が費用に見合う成果を出せる保証を示してあげなければなりません。

その保証となるのがデータ以外にはないです。

例えば以下のような使い道があります。
・XXXというサイトからYYYというサイトへの流入数が多い。
・XXXというサイトの離脱率は他と比べて多いので対策しなければならない。
・このYYYというソフトではXXXというページのロード時間が長い。

などなどです。
他のIT企業でも同じなのではないか？と思われがちですが。
自社の製品に自分で責任を持たなければならない社内SEという職業はよりSQLに長けている必要があると感じております。
実際私の先輩で技術よりもマネジメントよりの方がいらっしゃいますが、
その方でもクエリの作成はめちゃくちゃ早かったです。

このように、自他含め様々な場面でデータが登場するためSQLを描く技術は必要になるわけですね。


##Java言語

JavaはSQLに比べればそこまで使いませんが、
代わりにコードを見る力、いわゆる__コードレビュー力__は求められてきます。

社内SEでは必ずしも自社で開発を行なっているわけではなく、外部の会社に開発を委託する場面も当然あります。
脱SIerの動きが活発になってはきましたが、まだまだ自力で全てを賄うほどではありません。

そんな時に大事なのが、コードを見る力です。

協力会社の方が書いたコードは適切か、規約に反したコードを書いていないか(書いていたら容赦なく鉄柱を下します。)、そもそも費用に見合うコードを書く能力があるのかどうかまで見なければなりません。
一番大切な観点は__セキュリティ的に問題がないか__が特に重要です。」(SQLインジェクションが発生する余地はないかどうか)

これらをソースから読み取って判断し、最終的にお金を払えるものかどうかを決断しなければなりません。
以上の理由から、社内SEはJavaをかける必要はないが、__Javaを読める必要はあるというわけです。__


##日本言語

冗談じゃなく必要です。
社内SEという仕事をすごい洗い粒度で見た場合、__上司と部下or協力会社の橋渡し__ということになります。
それを円滑に行うための説明能力が必要になってくるわけです。

逆に英語は必要ないです。


###以下は言語以外で必要な技術について

##git or svn

何かと使います。
例えばソースコードの以前の内容を把握したりだとか、
ソースの改修案件で改修前後のソースを比較してエラーやセキュリティ事故が起きないかどうかとか
ありとあらゆる場面で必要になってきます。

最終手段としてソースという現物の前後比較を上司に見てもらい、説明を納得してもらう-なんて場面も出てきたりします。


#一旦休憩
続きは明日の朝に書きます。
みなさんおやすみ。
Nodeでメッセージ中の文字列を置き換え方法メモ

# メッセージ中の文字列を置き換え

メッセージ中に置き換え対象の文字が有る場合、どのようにメッセージをフォーマットする方法があるか考えたのでメモ。

とりあえず、標準機能でどうかと、モジュール追加でどうかという意味で、思いついた順番に書いています。
案1,2は標準機能で、案3,4はモジュール追加で実施するパターンです。

# 案1：テンプレートリテラル　・・・　×：eval利用は微妙

* やろうと思えばできるが、evalによる再評価が必要になるので個人的には却下

``` an1.js
// メッセージをファイルから取ってきたと想定して・・・
const message = 'Hello ${name} !'

// メッセージの置き換え用
const name = 'taro'

// メッセージをテンプレートリテラルとして再評価
console.log(eval("`" + message + "`")) // → 「Hello taro !」がコンソールに出力
```

# 案2：util.format　・・・　○：普通に使える

``` an2.js
const {format} = require('util')

// メッセージをファイルから取ってきたと想定して・・・
const message = 'Hello %s %s !'

// メッセージの置き換え用
const name1 = 'taro'
const name2 = 'hanako'

// メッセージをテンプレートリテラルとして再評価
console.log(format(message, name1, name2)) // → 「Hello taro hanako !」がコンソールに出力
```

参考：https://nodejs.org/api/util.html#util_util_format_format_args

# 案3：string-template　・・・　◎：使い勝手良い

* 更新が行われていないので使うか悩む、けど良さそう

``` an3-1.js
const format = require('string-template')

// メッセージをファイルから取ってきたと想定して・・・
const message = 'Hello {name1} {name2} !'

// メッセージの置き換え用
const placeholder = {
  name1: 'taro',
  name2: 'hanako'
}

// メッセージをテンプレートリテラルとして再評価
console.log(format(message, placeholder )) // → 「Hello taro hanako !」がコンソールに出力
```

``` an3-2.js
const format = require('string-template')

// メッセージをファイルから取ってきたと想定して・・・
const message = 'Hello {0} {1} !'

// メッセージの置き換え用
const placeholder = ['taro', 'hanako']

// メッセージをテンプレートリテラルとして再評価
console.log(format(message, placeholder )) // → 「Hello taro hanako !」がコンソールに出力
```

参考：https://www.npmjs.com/package/string-template

# 案4：sprintf-js　・・・　△：使えるけどイマイチ

``` an4-1.js
const sprintf= require('sprintf-js').sprintf

// メッセージをファイルから取ってきたと想定して・・・
const message = 'Hello %(name1)s %(name2)s !'

// メッセージの置き換え用
const placeholder = {
  name1: 'taro',
  name2: 'hanako'
}
// メッセージをテンプレートリテラルとして再評価
console.log(sprintf(message, placeholder )) // → 「Hello taro hanako !」がコンソールに出力
```

参考：https://www.npmjs.com/package/sprintf-js
_error_messagesによって表示されたメッセージを分かりやすく色で囲む

#はじめに

![スクリーンショット 2021-07-06 19.32.01（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/a81ee28d-06af-d7de-3fcc-3eb9b6642a4c.png)



このように投稿に失敗した時にエラーメッセージが出るようにしました。

しかしデフォルトで黒文字で表示されるので強調するように色で囲んだら良いのではないかと思ったので囲んで見ることにしました。

#前提

エラーメッセージが表示される事

```erb 
<% if model.errors.any? %>
  <div class="error-alert">
    <ul>
      <% model.errors.full_messages.each do |message| %>
        <li class='error-message'><%= message %></li>
      <% end %>
    </ul>
  </div>
<% end %>
```

```erb
<div class="form_box">
    <%= form_with model: @review, local: true do |f| %>
        <%= render 'shared/error_messages', model: f.object %> 
    <% end %> 
</div>
```

#試した事

bootstrapでアラート系の記述を入れ込みました。

```html
<div class="alert alert-danger" role="alert">
  <strong>Oh snap!</strong> Change a few things up and try submitting again.
</div>
```

![スクリーンショット 2021-07-06 20.09.17（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/839abe38-982e-78d8-462a-0133e6c2d51b.png)

###失敗例

はじめは失敗しました。

```erb
<div class="alert alert-danger" role="alert">
  <%= render 'shared/error_messages', model: f.object %> 
</div>
```

**new.html.erb**のビュー内の記述に入れ込むと・・・

![スクリーンショット 2021-07-06 20.11.06（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/94875d77-5189-3fe8-dafb-bb9400f20c87.png)

投稿に失敗する前からちょい見え・・・笑笑

###成功！

記述する箇所を変えて,**error_message**記述しました。

```erb
<% if model.errors.any? %>
  <div class="alert-danger"> クラス名変更
    <ul>
      <% model.errors.full_messages.each do |message| %>
        <li class='error-message'><%= message %></li>
      <% end %>
    </ul>
  </div>
<% end %>
```

![スクリーンショット 2021-07-06 19.26.20（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/4f248065-78d0-fa5d-711d-ea88c4358a0e.png)

このように赤で囲む事ができました。
.NET とは

## 勉強前イメージ

見たことはあるけど・・・言語？

## 調査

### .NET とは

Microsoftが掲げた、Microsoft .NETという構想で
現在ではOSS版の.NET Coreなどの技術仕様の総称か
アプリケーションの開発や実行環境の Microsoft .NET Frameworkのことを指します。

### .NETの特徴

- 複数の言語で開発ができる

C#やVisualBasicなど複数の言語が使用できます。

- 言語への依存が少ない

複数の言語で開発できるということで特定の言語への依存が少ないので
対応できる言語を1つでも習得していればアプリケーション開発が可能になる

## 勉強後イメージ

`Java, .NET, PHP, Python` の並びで見て気になったから調べたけど
言語かな？と思ったらフレームワークだった。

## 参考

- [.NETとは？ 初心者にもわかりやすく解説](https://game-creators.jp/g-job-tenshoku/news_articles/23)
- [.NET(ドットネット) | IT用語](https://wepicks.net/itglossary-dotnet/)
スイフト勉強_ 演算子 （演算子の種類）

今日は久しぶりにスイフトの勉強をしようと思う。 
この前データのタイプについて勉強したが、今日は演算子について勉強しようと思う。

##1.演算子

プログラミング言語は数学と類似した演算子の集合をサポートしている。
すなわち、数学においてある関数に作用し、その関数を他の関数に変形させる関数を演算子というが、このようなものがプログラミング言語にも似通っていると考えればよい。 
種類と使い方を紹介するが，それらを見るともっと分かりやすいだろう. 

##2.演算子の種類

演算子は種類が非常に多い。 従っていくつかの主要な演算子を見ていくことにする。 

>###1.算術演算子
算術演算子は非常に身近な演算子であるが、数学で使われる演算子と同じ役割を果たすと考えると容易である。

```
+ - / * % 
```
>###2.割り当て演算子
割り当て演算子は、値を割り当てるときに使用する演算子である。
上の表では"="が見えるが、すぐに"="が割り当て演算子である。
後の結果や、値を前の変数に割り当てられるようにしてくれる。
この際、2つのタイプが異なるため割り当てようとするとエラーが発生することがある。

```
=
```
>###3.比較演算子
二つの値を比較するときに使われる演算子としてよく使われる演算子の一つである。

```
==    !=    <=    >=    <    >    ===    !==   ~= 
```

>###4.範囲演算子
値の範囲を示そうとするときに使用する演算子である。

```
A...B   A..<B  A...  ...A  ..<A  
```
>###5. Bool演算子
ブーラン値の論理演算をするときに使用する。

```
!   &&   || 
```

これは多用される演算子なので必ず覚えておいた方が良い。

>###6. 三項条件演算子
三項条件演算子とは、被演算者が三つの条件演算子である。

```
(条件文or Boolean)? A:B
```
?前の値がtrueの場合はA値を、falseの場合はB値を返す演算子である。
>###7. ビット演算子
ビット論理演算のための演算子をいう。
* ビットシフト:シフト演算子は指定する数だけ被演算子を左右に移動させる。

```
~A   A & B  A | B   A ^ B  A << B  A >> B
```
>###8. オーバーフロー演算子
スイフトは、基本演算子を介してオーバーフローに備えられるように準備を整えているが、オーバーフロー演算子を介して自動的に処理する。
追加的に「&*」乗算演算子もある。

```swift
var a : UInt8 = 0 // 0 ~ 255
var b : UInt8 = a - 1 // no minus so => runtime error
var c : UInt8 = a &- 1 // 255

var d = UInt8.max // 255
a = d + 1 // it is max => runtime error
a = d &+ 1 // 0
```
>###9. 複合割り当て演算子
複合割り当て演算子は他の演算子が行うことを一度にできるように演算子を結合することができる。
表を見れば分かりやすいだろう.

```
+=   -=   %=   /=   *=   >>=   <<=   &=   |=   ^=
```

>###10. その他。
前述の基本的な演算子以外にスイフトライブラリに定義された演算子である。

```
??   ?   !   -A
```
おそらくギターにあるオプショナルは今後も主に使われる予定なので注意してみるのがいいだろう。



今日は、各演算子の種類と簡単な使い方を勉強した。

次は、個々の演算子の優先順位とユーザが定義した演算子について調べようとする。

アディオス
xoで生成するstructに任意のfieldをつける

小ネタです。

# 背景

golangでDBのスキーマからコード生成する際に、xoというものがあります。

https://github.com/xo/xo

例えばmysqlに接続してコード生成する場合は

```
xo schema  mysql://docker:docker@127.0.0.1:3306/{dbname} --out domain/model/dbschema/
```

とかやると、テーブルごとにいい感じにコードが生成されます。
しかしデフォルトではstruct fieldsには json しか定義されていません。
`sqlx` 使って `row.StructScan(&hoge)` とかやりたいなと思った時に不便です。
そこで、db field も出力出来るようにします。

# やり方

`--go-field-tag` オプションを指定します。
※このオプションは[つい最近](https://github.com/xo/xo/commit/4846d4f38dbcd5c38ea7ad245dd1f24d90d6bd14)(2021/6/11) 実装されたものなので、適宜xoをアップデートしてください。

```
xo schema  mysql://docker:docker@127.0.0.1:3306/{dbname} --out domain/model/dbschema/  --go-field-tag='`json:"{{ .SQLName }}" db:"{{ .SQLName }}"`'
```

# 備考

## テンプレについて

おまじないのように書いた `json:"{{ .SQLName }}" db:"{{ .SQLName }}"` は、
[ここ](https://github.com/xo/xo/blob/26ef3d11bb4716442f6492eeccccc371d8085fe1/templates/gotpl/gotpl.go#L140)で指定されています。
きっと他にも展開できる変数が有るのだと思いますが、未調査です。

## mysql:8について
その他xoのハマりどころとして、現時点では `mysql:8` に接続してコード生成した場合、
auto_incrementなカラムの `Insert()` が そのカラムも指定必須になってしまいます。
ですのでコード生成時には `mysql:5` に一旦落としてあげると良いです。
Markdownで画像を横並びにする

##背景

githubのプロフィールに表示されるREADMEを格好良くするため、https://shields.io で技術系アイコンを作成して並べようとしていました

　ー　アイコン作成は[こちらの記事](https://qiita.com/s-yoshiki/items/436bbe1f7160b610b05c)を参考にさせて頂きました
***

##画像が縦並びになる
shields.ioで作成したアイコンのURLをそのまま貼り付けると、以下のように1つずつ改行されてしまう
![スクリーンショット 2021-07-06 19.29.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1728773/4525dce5-99f3-b57e-ade2-e83a2305fd94.png)

コードは以下


```
<img src="https://img.shields.io/badge/-Git-F05032?style=flat-square&logo=git&logoColor=white">
<img src="https://img.shields.io/badge/-Github-181717.svg?logo=github&style=flat-square">
<img src="https://img.shields.io/badge/-Mysql-4479A1.svg?logo=mysql&style=flat-square&logoColor=white">
<img src="https://img.shields.io/badge/-Firebase-FFCA28.svg?logo=firebase&style=flat-square&logoColor=white">
<img src="https://img.shields.io/badge/-Prettier-F7B93E?style=flat-square&logo=prettier&logoColor=white">
<img src="https://img.shields.io/badge/-Eslint-4B32C3.svg?logo=eslint&style=flat-square">
<img src="https://img.shields.io/badge/-R-276DC3.svg?logo=r&style=flat-square">
<img alt="Heroku" src="https://img.shields.io/badge/-Heroku-430098?style=flat-square&logo=heroku&logoColor=white">
```


***

#解決法
###### ```<p>``` で囲む

```
<p>
  <img src="https://img.shields.io/badge/-Git-F05032?style=flat-square&logo=git&logoColor=white" />
  <img src="https://img.shields.io/badge/-Github-181717.svg?logo=github&style=flat-square">
  <img src="https://img.shields.io/badge/-Mysql-4479A1.svg?logo=mysql&style=flat-square&logoColor=white">
  <img src="https://img.shields.io/badge/-Firebase-FFCA28.svg?logo=firebase&style=flat-square&logoColor=white">
  <img src="https://img.shields.io/badge/-Prettier-F7B93E?style=flat-square&logo=prettier&logoColor=white">
  <img src="https://img.shields.io/badge/-Eslint-4B32C3.svg?logo=eslint&style=flat-square">
  <img src="https://img.shields.io/badge/-R-276DC3.svg?logo=r&style=flat-square">
  <img alt="Heroku" src="https://img.shields.io/badge/-Heroku-430098?style=flat-square&logo=heroku&logoColor=white">
</p>
```
##結果
<b>横並びにできた</b>

![スクリーンショット 2021-07-06 19.44.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1728773/f4b382a0-7dc0-00f5-c19f-9f0ee477d64a.png)



ちなみに、一つ一つのアイコンの間に隙間がありますが、ピタッとくっつけたい場合は各アイコンの```<img>```タグ同士を改行せず同じ行に続けて書くと出来ました

![スクリーンショット 2021-07-06 19.49.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1728773/218bae2f-cd37-f56a-64d4-2ea124343191.png)
こんな感じ
Nuxt.jsでopen-api-generatorを使って型セーフなAPI呼び出しを実現する２（認証対応）

以前書いたopenapi-generatorで生成したAPIクライアントをプラグインで使う方法を紹介しましたが、あれだと認証が必要な場合に対応できないので、認証に対応させてみました。

https://qiita.com/teracy55/items/4c6d475b98deaa23790b

早速ですが、以下コードになります。

```plugins/api-client.ts
import Vue from 'vue';
import { Context, Plugin } from '@nuxt/types';
import { AxiosError } from 'axios';
import { StorageKey } from '~/constants/storage.constant';
import { DefaultApi } from '~/openapi';
import { BASE_PATH } from '~/openapi/base';

declare module 'vue/types/vue' {
  interface Vue {
    $api: DefaultApi;
  }
}

const plugin: Plugin = (context: Context) => {
  // 動的にトークンを設定する
  context.$axios.onRequest(config => {
    const accessToken = localStorage.getItem(StorageKey.accessToken);
    if (accessToken) {
      config.headers.common['Authorization'] = `Bearer ${accessToken}`;
    }
  });
  // 認証エラーの場合はログイン画面に強制遷移
  context.$axios.onResponseError((error: AxiosError) => {
    if (error.response.status === 401) {
      localStorage.removeItem(StorageKey.accessToken);
      location.href = '/login';
    }
  });

  Vue.prototype.$api = new DefaultApi(null, BASE_PATH, context.$axios);
};

export default plugin;

```

ポイントとしては、以下の通りです

- `onRequest`で動的にトークンをセットします。
  - `Bearer `を明示的に記載しないといけないのがめんどくさいですね。。。
- `onResponseError`で401の場合に強制ログアウトさせます
- `new DefaultApi`の第三引数にAxiosインスタンスを渡します

これでAPIコール時に勝手にトークンを付与してくれます
【GCP 入門】Tag Manager APIの初期設定

Google Tag Manager（通称：GTM) のAPIであるTag Manager APIを使いたい時に、見やすい文献が全くなかったので、まとめます。

まずは、GCPのAPIライブラリを開きます。
![スクリーンショット 2021-07-06 18.33.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046008/695337f3-78b5-e13c-317c-c6e4a25b5ea5.png)

「Tag Manager API」を検索し、有効化。
![スクリーンショット 2021-07-06 18.38.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046008/eb251b7a-0779-eeaf-05a2-d435d27ee00b.png)

「認証情報を作成」をクリック。
![スクリーンショット 2021-07-06 18.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046008/316a57c1-59c3-77e5-c515-557765477f2f.png)

「デスクトップアプリ」を選択
![スクリーンショット 2021-07-06 18.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046008/f9a83b75-6fdd-5ca0-c3f7-9a187bbe8ad8.png)

名前は適当に決めてもらって大丈夫です。
できたら作成をクリック。
![スクリーンショット 2021-07-06 18.44.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046008/a7f85b58-1f6b-b10d-0dfd-5e4bbaacd68d.png)

作成が完了したら、赤枠をクリックしローカルに保存してください。(無くさないよう保管は厳重にお願いします)
![スクリーンショット 2021-07-06 18.46.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046008/30e627f8-5962-7ec9-d500-b8559463d434.png)

これでAPI利用に必要なファイルが完成しました。
HTMLでログインボタン作ってみた。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
     <title>ログイン画面</title>
</head>
<body>

<h1>ログイン画面</h1>
<form action="" method="POST">
    ユーザ名<input type="text" name="username" value=""><br>
    パスワード<input type="password" name="password" value=""><br>
    <input type="submit" name="login" value="ログイン">
 </form>
 <a href="signin.php">新規登録</a>

</body>

</html>



引数として、リンク先のコードも載せていきます。
PHPで２つの日時の差を分単位で計算する

# タイムゾーンを設定する
date関数を使って現在日時との差分を求めたい場合は、最初に差分を求めたい日時のタイムゾーンを設定します。date_default_timezone_set関数を使用します。この第一引数にタイムゾーンを示す文字列を指定します。東京を含む日本の場合は"Asia/Tokyo"です。
完全なタイムゾーンのリストは次のページに記載されています。
https://www.php.net/manual/ja/timezones.php

```php
date_default_timezone_set('Asia/Tokyo');
```

# 差分を求めたい日時のタイムスタンプを取得する
strtotime関数などを使用して差分を求めたい日時のタイムスタンプを取得します。

```php 
 $time1 = strtotime(date("Y/m/d H:I:S"));
 $time2 = strtotime("2021/07/07 20:05:00");
```

# 差分を計算して、分単位に直す
タイムスタンプは整数として扱えるので、そのまま引き算で差分を求めます

```php
$diff = $time1 - $time2;
```

UNIXタイムスタンプの場合、秒単位で差分時間が求められるので60で割れば分単位の差分時間が計算できます。

```php
$diff_m = $diff / 60;
```

# まとめ
最後にコードの全体像を記載します。

```php

// タイムゾーンを設定
date_default_timezone_set('Asia/Tokyo');

// 差分を求めたい２つの日時のタイムスタンプを取得
$time1 = strtotime(date("Y/m/d H:I:S"));
$time2 = strtotime("2021/07/07 20:05:00");

// 日時の差分を計算
$diff = $time1 - $time2;

// 日時の差分は（UNIXの場合）秒単位なので60で割って分に直す
$diff_m = $diff / 60;
```

以上です。
外部から配列型のプロパティに添字を指定してアクセスした場合、その添字に対応したメンバ変数の配列にアクセスしてくれるのか

## 確認したいこと
プロパティを定義した配列型のメンバ変数を設定する。
このとき外部から、プロパティに対して添字を指定してget/setすると、その添字に対応したメンバ変数の値にアクセスできるのか確認してみた。

つまりメンバ変数`_value`とプロパティ`Value[]`を定義したときに、
`Value[n] = 1` と代入すると`_value[n]`にも 1 が代入されるのか。

## 確認用コード
Unityで確認したため、Unityの機能色々使ってます。

#### `ListTest.cs`内の`flag`について 
・`flag` をtrueにすると、`Data.SetValue`や`Data.GetValue`を用いて`Data._value`に直接get/setする。
・`flag` をfalseにすると、プロパティに添字を指定して`Data._value`を行う。

前者では添字を指定した`Data._value`にアクセスしていることに対し、後者では`Data.Value`に添字を指定して`Data._value`にアクセスする。

前者はアクセス可能なことは想像できるが、後者だとプロパティ側で指定した添字に対応する`Data._value`にアクセスしてくれるか分からないので検証。

``` Data.cs
public class Data
{
    private int _num = 2;
    private int[] _value;
    public int[] Value
    {
        set { _value = value; }
        get { return _value; }
    }
    
    public Data()
    {
        _value = new int[_num];
    }

    public void SetValue(int index, int recievedValue)
    {
        _value[index] = recievedValue;
    }
    public int GetValue(int index)
    {
        return _value[index];
    }
}
```

``` ListTest.cs 
public class ListTest: MonoBehaviour
{
    [SerializeField]
    private bool flag = false;

    private Data _data;
    private int[] _tmpValue;

    void Start()
    {
        _data = new Data();
        _tmpValue = new []{1,2};
    }

    void Update()
    {
        for (int i = 0; i < _data.Value.Length; i++)
        {
            SetForce(i, _tmpValue[i]);
            if(!flag) Debug.Log(_data.Value[i]);
            else Debug.Log(_data.GetValue(i));
        }
    }

    void SetForce(int index, int value)
    {
        if(!flag) _data.Value[index] = value;
        else _data.SetValue(index, value);
    }
}
```

## 結果
プロパティ側で添字を指定した場合でも`Data._value`にアクセスできることを確認。

```
// 結果 （flagはfalse）
1
UnityEngine.Debug:Log (object)
ListTest:Update () (at Assets/Scripts/ListTest.cs:49)

2
UnityEngine.Debug:Log (object)
ListTest:Update () (at Assets/Scripts/ListTest.cs:49)
```