OmniAICreator/Qiita-1.07M huggingface dataset:
[Azure] Azure Monitor アラートルールをCSVで一覧取得する方法

VMのリソース監視等を、Azure Monitorのアラートルールを作成して監視するぜ！ってときありますよね。
各サーバ×監視種別（CPU使用率、メモリ使用率etc.）作成すると、すごい数になるので、設定誤りないかな？と不安になります。

今回は、設定したアラートルールをCSV形式で一覧取得する方法をご紹介します。
これで横串確認が楽になるはず。

# 前提
・対象：ログアラートのみのようです。
　メトリックアラートやアクティビティログは別コマンドになるようですが、試せていません。
　https://docs.microsoft.com/ja-jp/azure/azure-monitor/alerts/alerts-unified-log

・利用ツール：Azure Powershellを使用します。

# コマンド
アラートルール名で検索し、定義情報を取得させています。
検索文字列は正規表現可能で、たとえば「Testで始まる」を条件とするなら `"^Test.*"` のように記載可能です。

```
$ResourceGroup = "<リソースグループ名>"
$searchStr = "<アラートルール名の検索文字列>"
$CsvPath = ".\AlertRulesDefinition.csv"

Get-AzScheduledQueryRule -ResourceGroupName $ResourceGroup | Where-Object {$_.Name -Match $searchStr} | Select-Object -Property `
@{Label="アラート ルール名";Expression={($_.Name)}}, `
@{Label="ターゲット リソース";Expression={($_.Source.dataSourceId)}}, `
@{Label="検索クエリ";Expression={($_.Source.Query)}}, `
@{Label="基準";Expression={($_.Source.queryType)}}, `
@{Label="演算子";Expression={($_.Action.Trigger.ThresholdOperator)}}, `
@{Label="しきい値";Expression={($_.Action.Trigger.Threshold)}}, `
@{Label="期間 (分単位)";Expression={($_.Schedule.TimeWindowInMinutes)}}, `
@{Label="頻度 (分単位)";Expression={($_.Schedule.frequencyInMinutes)}}, `
@{Label="アクション グループ";Expression={($_.Action.AznsAction.ActionGroup)} }, `
@{Label="メールの件名";Expression={($_.Action.AznsAction.EmailSubject)} }, `
@{Label="説明";Expression={($_.Description)} }, `
@{Label="重要度";Expression={($_.Action.Severity)}} `
 | Export-Csv -path $CsvPath -Encoding UTF8 -NoTypeInformation
```

# 実行結果
出力されたCSVファイルの中身は、下記のようになります。

| アラート ルール名 | ターゲット リソース | 検索クエリ | 基準 | 演算子 | しきい値 | 期間<br> (分単位) | 頻度<br> (分単位) | アクション グループ | メールの件名 | 説明 | 重要度 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| TestVM_VMHealth　 | /subscriptions/xxx/resourceGroups/yyy<br>/providers/Microsoft.OperationalInsights<br>/workspaces/zzz  | Heartbeat <br> where Computer =="test.test.co.jp"　　　　　　　　　 <br> where TimeGenerated > ago(5m)  |  ResultCount |  LessThan |  1　　　　 |  5　　　　 |  5　　　　 | /subscriptions/xxx/resourceGroups/yyy<br>/providers/microsoft.insights/actionGroups/zzz  | [ERROR]TestVM_VMHealth  |  メール本文　　　　　 | 1　　　  |
[Azure] Azure Monitor 通知停止方法

Azure Monitorを用いた監視運用設定において、監視の閾値を超えた場合に通知する設定があります。
ただし、定期メンテナンス等でVM停止やCPU/メモリ使用率が一時的に高負荷状態になる場合、
通知を停止させないとえらいことになります。

今回は、その通知の停止方法をご紹介します。
## Azure Monitor通知停止方法
一般的には下記3種類の方法があり、それぞれご紹介します。
①　アラートルールの無効化
②　アクショングループの無効化
③　アクションルールの作成（2021/10/11時点ではプレビュー）

## 方法①：アラートルールの無効化
監視自体を無効化する方法です。
アラートルールを無効化することで、監視自体されなくなり、よって通知も飛びません。

#### ■　無効化手順（Azureポータルからの操作）
Azure Monitorの左メニューから「アラート」を選択し、「アラートルールの管理」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/52113a79-0d87-9635-16c7-c73dc33bea91.png)
無効化したいアラートルールを選択し、「無効化」をクリック、これだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139241/976104eb-ea01-ea79-d454-b0dc0b5fb467.png)
再度有効化する場合は、反対に「有効化」をクリックください。

#### ■　無効化手順（Azure Powershell）
Azure Powershellで下記コマンドを実行することで、アラートルールを無効化できます。

```
Update-AzScheduledQueryRule -ResourceGroupName "<リソースグループ>" -Name "<アラートルール>" -Enabled 0
```
実行の結果がターミナル上に返りますが、`Enabled:False`になっていれば、無効化完了です。
再度有効化する場合は、上記コマンド末尾を`-Enabled 1`に置き換えて実行ください。

## 方法②：アクショングループの無効化
監視は継続するが、通知だけ停止させたい場合です。
監視は継続するため、アラートは発行されます（アラートの履歴が残ります）が、メール/SMS通知は停止します。
Azureポータルでは停止操作ができないため、Azure Powershellで下記コマンドを実行します。

```
#通知先情報の取得
$ActionGroup = Get-AzActionGroup -ResourceGroupName "<リソースグループ>" -Name "<アラートルール>"
$Receiver = $ActionGroup.EmailReceivers　#通知先メールアドレス
$Receiver2 = $ActionGroup.SmsReceivers　 #通知先SMS
$Receiver +=  $Receiver2                 #宛先を連結

#アクショングループ無効化
Set-AzActionGroup -ResourceGroupName "<リソースグループ>" -Name　"<アラートルール>" -ShortName "<表示名>" -Receiver $Receiver -DisableGroup
```
実行の結果がターミナル上に返りますが、`Enabled:False`になっていれば、無効化完了です。
※状態確認のみ、Azureポータルでも可能。アクショングループの「状態」が「Disabled」になっていればOK。

再度有効化する場合は、以下のコマンドを実行します。`Enabled:True`になっていれば、有効化完了です。

```
#アクショングループ有効化
Set-AzActionGroup -ResourceGroupName "<リソースグループ>" -Name　"<アラートルール>" -ShortName "<表示名>" -Receiver $Receiver
```

## 方法③：アクションルールの作成
2021/10/11時点ではプレビュー中の機能です。
監視は継続するが、通知だけ停止させる方法その２です。
特定の条件に合致するアラートについて、指定期間通知を停止したり、追加のアクショングループを指定できるため、
単にアクショングループの無効化よりも柔軟に設定が可能です。

具体的な設定手順は、こちらをご参照ください。
https://docs.microsoft.com/ja-jp/azure/azure-monitor/alerts/alerts-action-rules?tabs=portal
Flutterの中華フォントを直す

# はじめに
Flutterを使い始めて3日くらいですが、初期アプリを少しだけいじって日本語を表示しようとすると、まさかの中華フォント・・・

「直感的に気付く、認証する」という単語はこんな感じで表示されてしまいます。
![スクリーンショット 2021-10-11 13.50.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1820436/42fd6001-377e-c7c3-90bc-b032ea51c2c8.png)

Flutterをそのままの環境で使うと中華フォントになってしまうようなので、日本語フォントへ変更しましょう。



# 設定方法
色々と日本語フォントへ直す方法を探して、２つの方法があるようです。

## 方法1:flutter_localizationsを追加
Flutterプロジェクト下にできる`pubspec.yaml`を以下のように修正します。

```yaml
dependencies:
  flutter:
    sdk: flutter
  # -----中華フォント対応-----
  flutter_localizations: 
    sdk: flutter
  # -----ここまで-----
```

そのあと、コンソールにて`flutter pub get`してプラグインやライブラリを更新します。
次にmain.dartを以下のように修正します。

```dart
import 'package:flutter_localizations/flutter_localizations.dart'; // import追加

// 省略

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      // -----以下を追加-----
      localizationsDelegates: const [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: const [
        Locale("ja", "JP"),
      ],
      // -----ここまで-----
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}
```

ただし、この方法では自分はうまくいかなかったので、次の方法を実施しました。

※こちらの記事をベースに修正しました。
https://qiita.com/najeira/items/dbf5663d1ed845fb1f51


## 方法2:日本語フォントを埋め込む
まず、Flutterプロジェクトの下に`fonts`というディレクトリを作ります。

次に使用する日本語フォントを`fonts`に配置します。
私はGoogle Fontsから`Noto Sans JP`をダウンロードしました。
https://fonts.google.com/specimen/Noto+Sans+JP?query=noto#standard-styles


次にpubspec.yamlを以下のように編集します。

```yaml
# The following section is specific to Flutter.
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # -----中華フォント対策の追加-----
  fonts:
    - family: Noto Sans JP
      fonts:
        - asset: fonts/NotoSansJP-Regular.otf
  # ----- ここまで -----
```

次に`main.dart`のtheme部分にフォント設定を追加すればOKです。

```dart
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        fontFamily: "Noto Sans JP", // ここを追加
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}
```

無事に日本語フォントになりました。
![スクリーンショット 2021-10-11 14.20.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1820436/f3dac043-cf4e-a1ef-c45a-c7101ee2a2fe.png)


# おまけ
色々やってうまくいかない人は、VSCode再起動、`flutter upgrade`をやるとうまくいくかもしれません。
form_withでのエラー

<h1>遭遇したエラー</h1>
form_withを使って情報を送信しようとしたのですがその時にエラーが出て結構足止めくらいました。
スクショ忘れたのでエラー書きます。

```ruby:error
  Nomethod error post_products_path  

  Did you mean? post_product_path
```

<h1>実際のコード</h1>
以下を見てわかる通り、post_pathなんて指定していません

```
 <%= form_with model: @post_product do |f| %>
   <%= f.submit "追加", class: "btn btn-outline-info" %>
   <%= f.hidden_field :title, value: product[:title] %>
   <%= f.hidden_field :image, value: product[:image] %>
   <%= f.hidden_field :product_url, value: product[:product_url] %>
<% end %>
```
__＊hidden_fieldで送っているのは、楽天apiの商品情報です。
商品情報はeachで回しているので、userがするのはsubmitボタンを押すだけでどの商品を追加するかの処理が実行されます。
hidde_fieldで送っているのはそのためです。＊__
もっと良い書き方できたのかもしれませんが現状これがベストでしたorz


<h1>試したこと</h1>
form_withのエラーということで、どこかに間違いがあるかな〜と見返してみたのですが、
form_withの書き方はあっているので余計にわかりませんでした。

```ruby:書き方
  form_with model: ”modelクラスのインスタンス” do 
```

後はパスなんですが、railsから提案されたパスを入れても動きませんでした。

なら次はurlで指定しよう！

```
 form_with url: createアクションへのパス do
```

一応formでエラーにはならなかったのですが、今度は別のところでエラーに、

```
param is missing or the value is empty:
```

ストロングパラメーターをコントローラーで指定していたので多分それが原因になっているのかな？
前にも同じようなエラーが出たのですが、その時は

```
params.require(:model).permit(:カラム, ......)
↓  これを、、、、、

params.permit(:カラム, ......)
こう！

```

とすることで解決したのですが、どこかの記事でみたところrequireを消すのは良くないとのこと
なのでrequireを元に戻します。

formを直さないといけないので調べました。
まずmodelでインスタンスを指定するには、コントローラーでnewメソッドを使ってインスタンスを作らないといけない。
僕の場合作っていたので、他を探します。

ここで思い出したのが、最初のエラーでpathが違うと言われました。
routingをもう一度みてみると、create アクションのpathと、エラーで出てきていたpathが違ったのです。

試しにform_withの記載を

```
  form_with model: @model, url: createのpath
```

とすることで無事送信できました！

form_withが想定するpathとresoucesで作られたpathが違うのが原因みたい

formは単数系を想定して
resoucesは複数で生成されるので、urlでcreateアクションのものを使うよ~と指定してあげるのがいい！

<h1>余談</h1>
途中で下記のエラーが出ましたが、これの原因はコントローラーでモデルクラスのインスタンスを作成していないのが原因
上で書いた通りrequireを省略すれば解決するのですが、requireは省略しない方がいいと言われたので注意しましょう。

```
param is missing or the value is empty:
```
AxoCoverのテストコード

初めてAxoCoverを学びましたので、備忘録として残します。



#AxoCoverとは
Visual Studioの拡張ツールです。　無料で使えるカバレッジツールでです。


使い方はVisual Studioのメニューバーのツールから[AxoCover]を選択します。

![runCover.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2143773/1fc0ce35-c2b4-226e-db87-75edffd70db3.png)


左上のRunを選択してテストします。結果表示はCoverを選択します。度のソースコードがテストされたのか確認できます。


![axoReport.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2143773/d27e8d99-16a0-406b-b59a-7d076c31841a.png)

Reportを表示するとどのコードがどのくらいの合格率かパーセンテージで確認できます。


![resultHtml.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2143773/d11d0810-3490-b631-a507-d6613f10f7ba.png)


テスト結果をHTML表示することもできます。
DenoでPoCを開発する際に参考にさせていただいたリンク集

# Dinoとは

ウィキペディアより引用：

>Denoは、V8 JavaScriptエンジン及びRustプログラミング言語に基づいた、JavaScript及びTypeScriptのランタイム環境である。
>
>Node.jsの作者であるライアン・ダールによって作成され、セキュリティと生産性に焦点を当てている。
>ライアン・ダールが2018年に行った講演「Node.jsに関する10の反省点」で発表された。

私は題材としてチャットアプリのPoCを作って、いろいろと試してみました。
（ちなみにクライアント側はiOSアプリ）

# Denoに関する私見

## 個人的に気に入っている点

- TypeScriptが標準でサポートされていて、特別な環境構築が必要なく使えること。
- ランタイム環境とパッケージ管理システムを兼ねており、npmのような別立てのパッケージ管理システムが必要ないこと。

## 個人的に腰が引ける点

- まだバージョンアップのたびに破壊的な変更があること。
    - 上記に関連して、サードパーティ製ライブラリの挙動に不安感が…
    - Web記事のサンプルコードは、1年前の記事ですら動かないことが多々…

もっとも、バージョンを重ねて安定してくればそんなこともなくなると思います。
総合的にはとても気に入ってます。
今後ともDenoをキャッチアップしていきたいと思います！

ということで、以下、PoC開発時に参考にさせていただいたリンクです。

# 基礎編

公式サイト：

https://deno.land/

日本語版：

https://deno-ja.vercel.app/

「Denoとはなんぞや」的な記事：

https://knowledge.sakura.ad.jp/24150/

https://qiita.com/yoshii0110/items/8f13012e9f732b1cfd4c

# HTTP (REST API) サーバー編

鉄板ライブラリ"oak"の公式リポジトリ：

https://deno.land/x/oak

oakを使ったサンプルコード：

https://github.com/pmagaz/deno-oak-rest-api

# JWT

チャットアプリのPoCでは認証トークンにJWTを使いました。

JWTの鉄板ライブラリ：

https://deno.land/x/djw

JWTのサンプルコードが載っている記事：

https://masalib.hatenablog.com/entry/2020/06/10/000000

https://levelup.gitconnected.com/deno-create-a-rest-api-using-jwt-5141fd5b1066

# Database

ORマッパーライブラリ。
PostgreSQL, MySQL, MariaDB, SQLite, MongoDBをサポートしています。

https://deno.land/x/denodb

# WebSocket

チャットアプリのPoCなのでWebSocketが必要でした。
サードパーティ製のライブラリはいくつかありますが、私はこの"wocket"を使いました。
ドキュメントがしっかりしていて理解しやすかったです。

https://deno.land/x/wocket

なお、Deno v1.13以降であれば標準ライブラリでもWebSocketを使いやすくなっているようです。（未検証）

# TypeScript

最近使い込んでいるのがSwiftなので、静的な型付けが好きなのです…

https://js.studio-kingdom.com/typescript/
部分和問題を総当たりで解く (Python)

N個の整数の部分和を総当たりで求める求める方法
動的計画法の練習(？)をする中で、総当たりして結果を確認したいけど総当たりのいい感じのコードがなかなか見付からなかったのでメモしておく。

大まかな手順

整数の組み合わせは配列Aで与える
2^N 個のビットマスクを行列で作成する
[0,0,0,...]
[0,1,0,...]

各ビットマスクの行列 * Aを計算する

```python:partialsuum_bruteforce.py
A = (1,2,3)
N=len(A)

# ビットマスク作成
bitmask = [list(map(int, list(('0'*N + (bin(i))[2:])[-N:]))) for i in range(2 ** N)]
# ビットマスクごとに部分和を計算
for mask in bitmask:
    print(mask,sum(
    [a*b for a,b in zip(mask,A)]
    ))

```
rspec豆知識: 外側let!と内側letの同名シンボルが混在する時に、内側letは外側のタイミングで評価される

# 前提

```
rspec --version

RSpec 3.10
  - rspec-core 3.10.1
  - rspec-expectations 3.10.1
  - rspec-mocks 3.10.2
  - rspec-rails 5.0.2
  - rspec-support 3.10.2
```

# 問題

このテストファイルを実行した時、標準出力にはどの順番で何が出力されるでしょうか。
以下のポイントに注意してください。

- 一番外側の `:a` は `let!` で正格評価になっている
- context内の `:a` は `let` で遅延評価になっている
- `expect(a).to be true` されている

この記事のタイトルのことはひとまず忘れて、純粋な気持ちで問題を解いてみてください。

```ruby:sample_spec.rb
RSpec.feature type: :system do
  let!(:a) do
    pp 'outer variable (let!)'
    true
  end
  before do
    pp 'outer before'
  end

  context do
    let(:a) do
      pp 'inner variable (let)'
      true
    end
    before do
      pp 'inner before'
    end

    # 実行されるテスト
    it do
      pp 'inner it'
      expect(a).to be true
    end
  end
end
```

# 解答

```
"inner variable (let)"
"outer before"
"inner before"
"inner it"
```

# 補足

外側の変数が `let(:a)` で、両方の変数が遅延評価になっている場合は、純粋に遅延評価され、以下のようになる。

```
"outer before"
"inner before"
"inner it"
"inner variable (let)"
```

`expect(a).to be true` のタイミングで `a` が評価されるためである。
しかし外側に `let!` がある場合は `let!` が本来評価されるタイミングで内側のcontext側の `let` が評価されるため、解答のような順番になる。
mysql再インストールからパスワード設定まで

##mysql再インストール

アンインストール

```
$ brew uninstall mysql

$ sudo rm -rf /usr/local/var/mysql
$ sudo rm -rf /usr/local/Cellar/mysql*
$ sudo rm -rf /usr/local/bin/mysql*
$ sudo rm -rf /usr/local/var/mysql*
$ sudo rm -rf /usr/local/etc/my.cnf
$ sudo rm -rf /usr/local/share/mysql*
$ sudo rm -rf /usr/local/opt/mysql*
$ sudo rm -rf /etc/my.cnf

$ sudo rm -rf mysql.sock mysql.sock.lock

```


再インストール

```
$ brew install mysql
```


途中エラーが出てあせった


Warning: A newer Command Line Tools release is available.
Update them from Software Update in System Preferences or run:
  softwareupdate —all —install —force


```
$ softwareupdate —all —install —force
```


MySQLを起動

```
$ mysql.server start
$ mysql -uroot
```

rootのパスワード変更

```
SET PASSWORD = 'hogihogi';
```


なんかいっつもこんなんやってる気がする。。。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
参考

https://dezanari.com/mysql-terminal-login-denied/

https://qiita.com/oreo3@github/items/bffce1f6dfc8bba309fe

https://www.sejuku.net/blog/83286
【勉強記録】 forループ (paizaランク C 相当)

## 目次

- 問題文
- 私の解答
- 解答例
- 学んだこと
- 振り返り

## 問題文 
[詳細はコチラ](https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_for_boss)

###問題文の要約
数当てゲームを行う。
1行目のinputで、ゲームの参加者数、一人が書き出す数字の個数、ターゲットの値が与えられる。
2行目以降で各参加者が書き出した値が与えられ、それらとターゲットの値が合致した数をカウントしていく。

>入力例2
4 5 2
1 3 4 4 5
2 2 2 2 2
1 2 3 4 5
1 1 1 1 1

>出力例2
0
5
1
0

## 私の解答

``` main.py
[count, num, point] = input().split()

for i in range(int(count)):
    ans = input().split()
    a = 0
    for j in ans:
        if j == point:
            a += 1
    print(a)
```
概ね、今までの学習の成果通りという印象。
課題は変数名です。

## 解答例

``` main.py
N, M, K = map(int, input().split())

for i in range(N):
    a = [int(j) for j in input().split()]
    ans = 0
    for j in range(M):
        if a[j] == K:
            ans += 1
    print(ans)
```
後半部分には大きな違いがありません。
一番気になったのはmap関数です。[コチラ](https://note.nkmk.me/python-map-usage/)では下記のような説明がされています。
>Pythonのmap()を使うと、イテラブル（リストやタプルなど）のすべての要素に組み込み関数やlambda（ラムダ式、無名関数）、defで定義した関数などを適用できる。

splitでリスト化した値、N,M,Kをstr型ではなくint型で取り出したいためにmapを使っているようです。
ちなみに先ほどのサイトを確認してみると、
>map()の処理はリスト内包表記やジェネレータ式で代用可能であり、多くの場合、リスト内包表記・ジェネレータ式を使用するほうが好ましいとされている。

との記載もあるので、書き換えてみます。

``` main.py
N, M, K = [int(s) for s in input().split()] # リスト内包表記
N, M, K = map(int, input().split()) # map関数

# 以下省略
```

この程度ならmap関数の方が見やすいように思います。
もう少し複雑な処理をする際にはリスト内包表記の方が優れるのかもしれません。


## 学んだこと
1. map関数
1. リスト内包表記
VSCodeの拡張を作ってパッケージ化する


今回初めてVSCodeの拡張を作ったので、その手順について備忘録としてまとめます。


## 目的
自作のテキストパーサーに読み込ませるテキストファイルの独自の構文に対してハイライトをつけたい！
というのが今回の目的。
先頭文字が`@`だったらコマンド、先頭文字が`#`だったらコメント、といった非常にシンプルな構文しか持たないので、
初めての拡張開発には打って付けでした。

独自構文のテキストは下記のようなものです。

```
@font size35
# コメントコメント
あのイーハトーヴォのすきとおった風、
夏でも底に冷たさをもつ青いそら
@br
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
# aaa
@select param=foo text=yes
@select param=bar text=no
```

## VSCode拡張の開発

### Yeomanを通してテンプレートを作成
Yeomanを使って拡張開発のためのテンプレートを作成するため、まずはyeomanをインストールします。

```bash
$ npm install yo generator-code --save-dev
```

```bash
$ npx yo code
```
上記コマンドを叩くと色々CUI上で質問されるので、適宜答えていくとテンプレートが完成します。
わからないことがあれば[公式ドキュメント](https://vscode.readthedocs.io/en/latest/extensions/yocode/)を参照すると良いです。
今回は新しい言語（？）にシンタックスハイライトをつけるのが目的なので、初めの質問では* New Language Support *を選択しました。

### TextMateを用いてシンタックスの指定を行う
`syntaxes/gmtext.tmLanguage.json`を編集してハイライトの指定を行います。
[公式にしンタックスハイライトガイド](https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide)があったので主にここを参照して作業を行ないました。

ポイントは２つで、
- 記述方法はTextMateで、文字の固まりを命名し分類していくことでハイライトが成り立つ
- 正規表現は鬼車が使われている
という点です。

簡単にいうと、この＊＊の正規表現にマッチするやつはcommentに分類する！
という記述を行なっていけば良いようです。

上記を踏まえてpatternsを下記のように実装しました。（一部抜粋）

```json
"patterns": [
    {
        "name": "entity.name.tag.gmtext",
        "match": "^@.*"
    },
    {
        "name": "comment.line.number-sign.gmtext",
        "match": "^#.*"
    }
]
```

また、正規表現では**鬼車**というライブラリが使われており、通常のJSの正規表現の記述と一部異なるので注意が必要です。
[TextMateのドキュメント](https://macromates.com/manual/ja/regular_expressions)に正規表現に関するページがあるので、こちらを参考にすればOKです。

### ローカルテスト
VSCodeで開発していればローカルテストは非常に簡単です。
開発するリポジトリをVSCodeで開いてF5を押せば、開発中の拡張が効いた状態でファイルを確認することができます。
（Yeomanルートのリポジトリではなく、テンプレート自体がルートでなければならない点に注意。）
![スクリーンショット 2021-10-11 13.18.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441432/0921dc68-af2b-a345-0a11-3ecc98e23d98.png)
　
赤い□を押せばこのデバッグモードは終了します。

## パッケージ化
今回は個人用なので、パッケージ化だけしてマーケットプレイスにはリリースしない方向でやってみます。
まず、パッケージ化に必要な`vsce(VSCode Extension Manager)`をインストールします。

```
$ npm install vsce --save-dev
```

また、パッケージ化にはManage Publisherとしての登録が必要です。
Microsoftの誘導のままに会員登録を行なっていきます。
https://marketplace.visualstudio.com/manage

無事Publisherとして登録ができたら、package.jsonにpublisher名を追記します。

```json:package.json
{
    "name": "text-gm-parser",
    "displayName": "text-gm-parser",
    "description": "",
    "version": "0.0.1",
    "engines": {
        "vscode": "^1.61.0"
    },
    "publisher": "Publisher名"
...
```
   

そして下記のコマンドを叩いてパッケージ化します。

```
$ npx vsce package
```

無事.vsixの拡張子のファイルが出力されればOKです!

## 自作パッケージの読み込み
最後にパッケージをVSCodeに読み込ませます。

```
$ code --install-extension 任意のファイル名.vsix
```

これで拡張が適応されます。
![スクリーンショット 2021-10-11 13.28.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441432/a1d78fa6-30d2-fc8c-c041-08e9973901c4.png)
Kotlin エルビス演算子(?:)の使い方


Kotlinでエルビス演算子を使うことがあったのでメモがてらここに残しておきます。

## エルビス演算子とは？
Kotlinはnullが嫌いな言語です、しかしときにはnullを扱う必要があります。
以下のコードのようにif分などでnullじゃない場合は〜などの条件分岐もかけますが、エルビス演算子ならもっとスマートにかけます

//if分のnullの場合の条件分岐

```
val hoge = if(test != null) "hoge" else "nullだよ"
```

エルビス演算子の場合

```
val test = "hoge" ?: "nullだよ"
```
DOMとは？

#はじめに
現在プログラミング学習を始めて３ヶ月目の初学者です。
学んだことをqiitaに投稿という形でアウトプットするため、また備忘録として記事を作成しました。
今回はrailsアプリケーションに非同期通信を実装していくということで調べたところ
HTTPレスポンスを受け取ったブラウザが、受け取ったJavaScriptを使って、DOMを操作する。DOMを操作することで画面の表示が変化する。
という仕組みらしいのですが、DOMってなんだ？となりましたのでこのDOMについて学習していきます。

##DOMとは？
参考記事によると下記の通りに書いてあります。
Document Object Model (DOM) は HTML や XML 文書のためのプログラミングインターフェイスです。ページを表現するため、プログラムが文書構造、スタイル、内容を変更することができます。 DOM は文書をノードとオブジェクトで表現します。そうやって、プログラミング言語をページに接続することができます。
ウェブページは文書です。この文書はブラウザーのウィンドウに表示されるか HTML ソースとして表示することが可能です。しかし両方の場合においてもそれは同じ文書です。ドキュメントオブジェクトモデル (DOM) は、その同じ文書を表現、保存、操作する方法です。DOM はウェブページの完全なオブジェクト指向の表現で、 JavaScript のようなスクリプト言語から変更できます。

html等で書かれた文書をブラウザで表示する際に必要なものってことですかね？
ざっくりとした解釈になりましたが一旦これで終わりにします。

##参考記事
https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model

https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model/Introduction

https://www.gixo.jp/blog/5159/


##最後に
qiitaへの投稿に慣れていないので、分かりづらい上に情報が少ないですが、これから欠かさず投稿していこうと思います。
Chaining Assertionでのテストコード


初めてChaining Assertionを学びましたので、備忘録として残します。


#Chaining Assertionとは何か
C#の単体テストのためのライブラリです。


テストコードを書きやすくする[Chaining Assertion]とサーバーに接続しなくてもテストできる[Moq]があります。


#インストール

インストールは[NuGetパッケージの管理]から行います。

メニューのプロジェクトから開きます。


![toolInstall.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2143773/5453248c-8ee1-2479-66a9-e36c0989c54d.png)


それぞれインストールします。


#ViewModelBase.csの追加
クラスを追加して、以下のように記述します。

```

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.CompilerServices;
using System.ComponentModel;

namespace DDD.WinForm.ViewModels
{
    public abstract class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected bool SetProperty<T>(
            ref T field, T value, [CallerMemberName]string propertyName = null)
        {
            if(Equals(field, value))
            {
                return false;
            }

            field = value;
            var h = this.PropertyChanged;
            if (h != null)
            {
                h(this, new PropertyChangedEventArgs(propertyName));
            }

            return true;
        }
    }
}

```

このコードを配置することによりテストするファイル(View)とテストコード(ViewModel)がデータバインドしてテスト出来るようになります。
設定関係のまとめ


# IPアドレス、ドメイン関係

[許可すべき Salesforce の IP アドレスとドメイン](https://help.salesforce.com/s/articleView?id=000321501&type=1)
[許可リストに登録する Pardot IP アドレスと範囲](https://help.salesforce.com/s/articleView?id=000312765&type=1)
[Salesforce for Outlook - SFO が接続するために必要な IP アドレスは？](https://help.salesforce.com/s/articleView?id=000315513&type=1)
[Marketing Cloud の許可リストに含める IP アドレス](https://help.salesforce.com/s/articleView?id=sf.mc_es_ip_addresses_for_inclusion.htm&type=5)
SRAMのバッテリーバックアップ

[PC-8001に増設した8KのSRAM](https://qiita.com/yamori813/items/ffe4647e58f4be4681b8)をバッテリーバックアップしてみました。

バッテリーバックアップは単三やボタン電池などの、使い捨ての電源を使う方法と、充電式電池や電気二重層コンデンサを使う方法などあります。後者は回路が複雑になるので、前者で作ることにします。

32Kの61256などのSRAMのデータシートを見るとCE(CS)がHiになると省電力モード(Standby)になると書いてあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/e7c1e4a5-f4ad-2a10-b78c-eab620ac261f.png)

このため基本的な回路は以下のようになります。

![BATT1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/bb3f0057-5d06-be85-ec96-9acc06e42d04.png)

本体の電源のVCCは5Vでバッテリーは電池などの3Vを使います。本体電源が入っているときは5VがSRAMに流れ、本体の電源が切れるとバッテリーから電源が供給されます。

しかしCEをコントロールしている左側のバッファに電流が流れてしまうと、思った以上にバッテリー消耗します。そのようなケースでは適当な回路で完全遮断するようにして実際は使います。コントロール側の回路にもよるようなので、電源オフ時の電流をテスターで確認してみると良いです。1mAなどと大きな電流が流れている場合は、なんらかの回路が必要でしょう。

8K SRAMのデーターシートを見直してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/37fe4b17-4c4b-f0c1-8dd9-8aea39d74672.png)

CS1は同じようにHiですが、CS2はLoで省電力モード(Power Down)になります。

たまたまCS1はLo固定でCS2で制御していたので、CS2を10KでPULL DOWNしました。

![BATT2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/7b56fdbc-a19b-bbf1-ff80-535f8d995e98.png)

廃物の基板からとった型番の分からない黒いダイオードで作ったので、以下のような手順で確認しながら作りました。

1. VCCにダイオードを入れて元のとおり動くか確認
1. CS2を10KでPULL DOWNして元のとおり動くか確認
1. BATTのダイオードを追加して、本体の電源を入れてもバッテリー側に電圧がかからない事を確認
1. 単三x2のバッテリーをつないで、テスターで異常な電流が流れないか確認また本体電源投入時には電流が0になることを確認

ちゃんとバックアップされるようになりました。

バッテリーは単三が4本入るフォルダーで錆びていた接点を適当なものに代えて、2本で使えるようにしてつなぎました。

電源OFF時にバッテリーの電流を測ったら3uAくらいでした。バッテリーが1000mAhだとすると1000*1000/3で333333時間で38年くらい持つ計算になります。

CR2032だと200mAhくらいみたいなので7年くらいでしょうか。

N-BASIC 1.0はバグってて6000に"AB"があっても自動起動しないので、毎回MONでGして使うことになります。
Better BibTex for Zoteroでバックスラッシュをエスケープせずに出力する方法

## 使い所

例えば```\url{}```を使ってソース元を記述するとき。そのままZoteroのエントリに入力してもbibファイル出力時にバックスラッシュがエスケイプされて```\textbackslash url```になってしまうが、以下の対策でそれを防ぐことができる。

## 対策

LaTeXコマンドを使う部分を```<script>...</script>```で囲む。これだけ。
これでZoteroでLaTeXコマンド使い放題。Let's Enjoy Happy LaTeX！

## ソース

[Advanced :: Better BibTeX for Zotero](https://retorque.re/zotero-better-bibtex/exporting/advanced/)
オブジェクト指向 is 抽象データ型 


https://nowokay.hatenablog.com/entry/2021/09/25/042831

https://zenn.dev/takahashim/articles/d34b1a3b244e46

抽象データ型が導入される前の世界から考えると良い気がします。

## 抽象データ型の無い世界

初期のコンピュータはアドレスに状態を保持できるだけでした。何をするにしても**状態遷移**に落とし込まないと行けないわけです。

構造化プログラミングにより、処理構造に抽象化されました。やりたいことが**if/loop**で考えることが出来るようになりました。

関数型言語では、関数によって抽象化されました。IN/OUTの**関係**性で考えることが出来ました。

## 抽象データ型の無い世界のECサイト

では、これで、ECサイトというシステムを考えてみましょう。

* ECサイトは、商品の一覧を並べて表示します。
* ECサイトは、一覧にある商品を購入できます。

状態遷移/構造可プログラミング/関数型言語で、考えてみましょう。大半の人は、ふえ？っとなります。

## 構造体

少しインチキしました。抽象データ型の前に、データ構造で表現する概念があります。
所謂、構造体ですね。この概念があれば、コンピュータシステムとしての抽象化はかなりできます。

商品一覧画面と商品DBという構造体を用意してみましょう。``DB -> 画面`` って出来ますね。
商品購入はもっと分かりやすいですね。在庫とかDFDなイメージがもっとまんまです。

OOPが業務システム等で流行らない最大の原因がこちらですね。データ構造型があれば、**システムがすべき**ことはだいたい表現出来てしまう。

## 抽象データ型の発見

抽象データ型とは、何か。

図形型っていうけど、四角形と三角形って持ってるデータ明らかにちがくね。と、データ構造では表現できない共通性がありました。四角形と三角形って、何が共通点なんだろと考えた結果、図形なら**面積を計算できる**共通点があると気付きました。

この**できる**を「振舞い」と呼び、**データ構造が異なっても**振舞いによって共通化(抽象化)することが出来る。という発見がされたのです。これは、最初にクラスとオブジェクトという概念で実現されました、これがオブジェクト指向プログラミングの始まりです。(原理のほうはいい加減省略)

## 概念の変化

さらこの概念は進化します。**すること**へのこだわりは消えて**出来ること**。さらに**それ自身でなく備えている**こと。即ち、**性質**を表現できるようになりました。実装的な話で言えば、Interfaceや型システムですね。

抽象データ型の最大のポイントはなんでしょうか。オブジェクト指向プログラミング出来ることでしょうか、違います。
「コンピュータソフトウェアの処理ってのは、結局のところ、なんでも抽象化して表現できちゃうわけだな。」です。

ECサイトに戻ってみましょう。
* ECサイトは、商品の一覧を並べます。
* ECサイトは、一覧にある商品を購入できます。
これで抽象データ型``ECサイト``の定義が完成です。

分かりやすいの次元じゃないですね。まんまなだけですね。でもこのまんまが表現できるのが、抽象データ型です。この人との親和性の高さが、最大の特徴です。抽象データ型によって、**システムに何をさせたい**ではなく、**何をしたい**から考えることが容易になりました。

## 実はこれが「オブジェクト指向」だった...

抽象データ型がちゃんと命を受けて生まれた時に、**オブジェクト指向**って名前で生まれた都合、この概念をオブジェクト指向と呼びます。が、2021年だと、たぶんみんなそう思ってない。当たり前すぎて普遍的になってるだけかと思います。is 空気。

この記事なしで「システムに何をさせるではなく、何をしたいかから考えるのが、オブジェクト指向だったんだぜ。」と言ったら、何言ってんだコイツと思われかねません。~~この記事みても、そうかな？と感じるぐらいかと。~~

## 工学とかOODAとかOOP

性質(※)を定義する手段は、他にも色々あったりします。でも、振舞いから対象物をあぶりだすオブジェクト指向は、人との親和性が非常に良かったようです。人との親和性というのは、要件や設計の初期の課題まんまで、そちらの方で形式ばってよく活躍しています。モデル駆動とか呼ぶと、なぜかオブジェクト指向が前提になってたりします。

この辺り、要件からコードまで生成的なあれのイメージばかり語られますが、アレの源流はオブジェクト指向ではないです。オブジェクト指向は、とりつかれただけです。アイドルに夢が託されただけです。

みんなDBMS大好きだからデータ中心だと思いがちだけど、ユーザー要求の深掘りとかふんわり段階は、無意識にオブジェクト指向使ってると思うよ。だって、コンピュータシステムに目的の抽象化概念を取り入れたのがオブジェクト指向だもん。~~オブジェクト指向なのそれ？って言われたらどうだろうね。って答えるけど。~~

※ オブジェクト指向プログラミングそのものは、命令型なのに、概念的にやってるのは、性質の定義というのは異常にややこしいです。宣言型言語と混同してるのかと思われそう。宣言型言語はあるスコープ内に限ることで安全に性質を定義できる言語です。オブジェクト指向はその辺り関与せずだったのが。。

## 2021年のオブジェクト指向プログラミング

結果、オブジェクト指向プログラミングそのものは、初期の抽象データ型表現の形式ばった役割という呪縛が着せられてしまいました。関数型言語等のリテラシによって、はまればハマるほど存在意義に悩むもの。というのは皆様の直観通りじゃないでしょうか。おめーまだけいしょうになやんでるのか！？

でも、このスタンダート化は良い意味もあるんですよ。プログラミング世界に、抽象(データ型)概念をぶち込む第一歩として、前線で大活躍されているのです。if/loopでプログラミングを分かった気になった輩に、``🐶 exnteds 動物``の洗礼です。(初見殺し過ぎるけどな！)
データ分析ではまりがちなポイント

データ分析はプログラミングの知識だけでなく、統計や機械学習の知識、マネタイズにつなげるためのビジネス知識など幅広いスキルが求められます。こちらの記事では業務を通してハマったポイントを一覧にしてまとめています。


プロジェクトにアサインされた時や、既存のソースコードを読むときなど、プログラムを解読することは多々発生します。プログラムを解読するためのプロセスについて述べた数少ない良記事です。

https://qiita.com/zizynonno/items/3a14fe6cbf52451a366c
【5】辞書型で自販機データを作ろう


# 演習問題
keyに商品名(str型)，valueに値段(int型)を代入し
自販機の中身（キーバリューの組み合わせ）が表示され，
「[自分の好きな商品の値段]円を入れてください！」とアナウンスされるアプリを作りましょう．

- 辞書型変数名は任意で構いません．※自販機＝vendingmachine

- 要素は最低5個以上作りましょう．

HINT：print(str(vm['おでん'])+"円を入れてください！")
print関数内で，数字の型を文字の型として表示させる作業が必須．
 

.pyファイルで提出してください！



【出力例】

```
{'ラーメン': 600, 'おしるこ': 80, 'ゼリー': 100, 'プロテイン': 170, 'おでん': 200}
200円を入れてください！
```

解き終わり次第，[まなBOX](https://daltontokyo.mana-box.jp/epf-web/Servlet/)にて提出しましょう．演習の提出状況で成績判断をします．

→[次の演習]()へ
#### 演習問題一覧は[こちら]()


#引用
[Amazon: たった1日で基本が身に付く! Python超入門](https://www.amazon.co.jp/%E3%81%9F%E3%81%A3%E3%81%9F1%E6%97%A5%E3%81%A7%E5%9F%BA%E6%9C%AC%E3%81%8C%E8%BA%AB%E3%81%AB%E4%BB%98%E3%81%8F%EF%BC%81-Python%E8%B6%85%E5%85%A5%E9%96%80-%E4%BC%8A%E8%97%A4-%E8%A3%95%E4%B8%80-ebook/dp/B074WVKQVP/ref=as_li_ss_tl?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Python+%E4%BC%8A%E8%97%A4&qid=1586415008&sr=8-1&linkCode=sl1&tag=grit-22&linkId=b689fc38acfbc841b9b1d2dc3af4cc32)
【4】リストの要素同士の計算


# 演習問題
リスト型の変数名を「numbers」とし，

1.numbersへ 250, 120, 800, 670, 210を順に代入し，print()を用いて出力しましょう．
2.要素0と要素3の和をnumbers_sum，差をnumbers_diff ，剰余をnumbers_remへ代入し，print()を用いて出力しましょう．
3.要素1の値を190へ書き換え，print()を用いて出力しましょう．
4.numbersの最後の要素へ480を追加し，print()を用いて出力しましょう．

これからの演習は，特に指示がない限り .py ファイルで提出してください！

【コマンドでの出力例】 

```
[250, 120, 800, 670, 210]
670
800
250
[250, 190, 800, 670, 210, 480]
```

解き終わり次第，[まなBOX](https://daltontokyo.mana-box.jp/epf-web/Servlet/)にて提出しましょう．演習の提出状況で成績判断をします．

→[次の演習]()へ
#### 演習問題一覧は[こちら](https://qiita.com/hakukikun/items/8f8a1a58d0fe0ecab47a)


#引用
[Amazon: たった1日で基本が身に付く! Python超入門](https://www.amazon.co.jp/%E3%81%9F%E3%81%A3%E3%81%9F1%E6%97%A5%E3%81%A7%E5%9F%BA%E6%9C%AC%E3%81%8C%E8%BA%AB%E3%81%AB%E4%BB%98%E3%81%8F%EF%BC%81-Python%E8%B6%85%E5%85%A5%E9%96%80-%E4%BC%8A%E8%97%A4-%E8%A3%95%E4%B8%80-ebook/dp/B074WVKQVP/ref=as_li_ss_tl?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Python+%E4%BC%8A%E8%97%A4&qid=1586415008&sr=8-1&linkCode=sl1&tag=grit-22&linkId=b689fc38acfbc841b9b1d2dc3af4cc32)
WindowsのAnaconda環境にMeCabをインストール_2023

# Anaconda環境にインストールしたMeCabでchasenが動かない(Windows)

## しばらくUbuntu使っていましたが、最近Windowsの手軽さにはまって使い始めて

:::note info
2023年追加分
- Quadloは積んでいるもののCUDAに無視されているので、ただのnvidia-smi表示器
- それはさておきちょっとグラフを使おうとしてAnaconda(Windows版）起動というお話
:::

[インストール済み環境での使いかたへ飛ぶ（文末）](#インストール済み環境)


- Jupyter labで実行するとエラーが下記の様なエラー出てしまいます。<br>
何とか動くようになったので、備忘録として残します。

``` ----------------------------------------------------------	
Failed initializing MeCab. Please see the README for possible solutions:	
    https://github.com/SamuraiT/mecab-python3#common-issues<br>	
If you are still having trouble, please file an issue here, and include the	
ERROR DETAILS below:	
    https://github.com/SamuraiT/mecab-python3/issues	
issueを英語で書く必要はありません。	
------------------- ERROR DETAILS ------------------------	
arguments: -Ochasen	
[!tmp.empty()] unknown format type [chasen]	
----------------------------------------------------------
```

##やってみたこと
- 検索し、インストールの記事をみた。
　⇒手順はあっていそう
- エラーについて検索してみた。⇒パスを通してみたが、何か違うパスが出た。
- 一旦、アンインストール⇒冷静になって考えよう。

##参考にさせていただいた記事

[PythonとMeCabで形態素解析(on Windows)]<br>(https://qiita.com/menon/items/f041b7c46543f38f78f7)<br>
@menonさんありがとうございます。<br>
基本的手順はオリジナルを参照ください<br>

##必要なもの
1. Anaconda3 64bit<br>
2. MeCab 0.996 64bit<br>
3.  ipykernel　と　mecab-python-windows<br>
<br>
1のAnaconda3については問題ないと思います。<br>
2のMecabについては0.996ですが、<br>
ikegami-yukinoさんGitHubからダウンロードしました。<br>
[MeCabインストーラー0.996.2.exe]<br>
(https://github.com/ikegami-yukino/mecab/releases)<br>
(旧)のものもありますが、こちらの新しい方がこの後便利です<br>
<br>
3のmecab-python-windowsは2021年現在メンテされてないようなので、<br>

https://pypi.org/project/mecab-python3/


からダウンロードpipコマンドでインストールしました。

##動作確認
さてさて、Jupyter labで動作するでしょうか？

```python:test.py
import sys
import MeCab
m = MeCab.Tagger ("-Ochasen")
print(m.parse ("これはものづくりなのか分からない人"))
```
<br>
- これでWindows上でも無事に形態素解析できるようになりました。<br>

# インストール済み環境

![name.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/ada3b706-fffe-7f21-18f4-6dec9e62f2e7.png)

**我が家のOSのデフォルトが中文なので、フォーカスされているところだけご注目ください。**
- パスが通っている事が第一条件
- 通っていない場合は上記の元記事に戻ってセットアップします。

## Anaconda 新環境での操作

:::note info
Anaconda操作
- Environment メニューへ移る
- 作成した環境（MeCabが入っていない新環境）を選び三角ボタン（再生？）をクリックする
- Open TerminalでUbuntuで見慣れた”(osac) C:\Users\”表示になってターミナル画面が出ます。



:::

```Anaconda:ターミナル画面

pip install mecab-python3

```


```Anaconda:ターミナル画面

# インストール中 画面こみ
pip install mecab-python3
Collecting mecab-python3
  Downloading mecab_python3-1.0.6-cp37-cp37m-win_amd64.whl (501 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 501.5/501.5 kB 30.7 MB/s eta 0:00:00
Installing collected packages: mecab-python3
Successfully installed mecab-python3-1.0.6

```

# 以上で、Pathさえ通していればAnaconda上では比較的に簡単に使用できます。

:::note warn
要点
GUIのメニューからmecab-python3が入らないというところに気が付けば安心！
:::
Db2のバックアップをIBM Cloud Object Storageに取得する

# 目的

最近のDb2はバックアップをS3互換のオブジェクトストレージに取得できるようになっています。当然IBM Cloud Object Storage（ICOS）も使えますが、少しわかりにくいところがあったため、整理します。


# 手順

## ローカルキーストアの作成

ICOSにアクセスするためのシークレットを保管するために必要です。

```
$ gsk8capicmd_64 -keydb -create -db /home/teruq/var/db2/keystore/local-keystore.p12 -pw ******** -type pkcs12 -stash

$ ls -l
-rw------- 1 teruq teruq 1392 10月 11 11:08 local-keystore.p12
-rw------- 1 teruq teruq  193 10月 11 11:08 local-keystore.sth
```

DBM構成パラメータに設定します。インスタンスの再起動が必要です。

```
$ db2 update dbm cfg using keystore_location /home/teruq/var/db2/keystore/local-keystore.p12 keystore_type pkcs12
DB20000I  UPDATE DATABASE MANAGER CONFIGURATION
コマンドが正常に完了しました。
SQL1362W  即時変更のためにサブミットされた 1
つ以上のパラメーターが動的に変更されませんでした。
クライアントの変更は、次回のアプリケーション始動時、
または TERMINATE
コマンドが発行されるまで有効になりません。 次の DB2START
コマンドまで、サーバーの変更は有効になりません。

$ db2 get dbm cfg | grep -i keystore_
 鍵ストア・タイプ                           (KEYSTORE_TYPE) = PKCS12
 鍵ストアのロケーション                   (KEYSTORE_LOCATION) = /home/teruq/var/db2/keystore/local-keystore.p12

$ db2stop force; db2start
2021-10-11 11:13:20     0   0   SQL1064N  DB2STOP の処理が正常に終了しました。
SQL1064N  DB2STOP の処理が正常に終了しました。
10/11/2021 11:13:23     0   0   SQL1063N  DB2START の処理が正常に終了しました。
SQL1063N  DB2START の処理が正常に終了しました。
```

## ストレージアクセスのカタログ

ICOSの接続情報をストレージアクセスとしてカタログします。ポイントは、``vendor``に``s3``を指定することと、``server``にICOSのエンドポイントのアドレスを指定することです。また、バケット名を指定することもしないこともできます。

```
# バケット名指定なし
$ db2 catalog storage access alias icos-with-bucket vendor s3 server s3.jp-tok.cloud-object-storage.appdomain.cloud user ${アクセスキーID} password ${シークレットアクセスキー}

# バケット名指定あり
$ db2 catalog storage access alias icos-with-bucket vendor s3 server s3.jp-tok.cloud-object-storage.appdomain.cloud user ${アクセスキーID} password ${シークレットアクセスキー} container ${バケット名}
```

## バックアップの取得

ストレージアクセスによって書き方が異なります。ストレージアクセスでバケット名を指定している場合は、``db2remote://${ストレージアクセス名}//${プレフィックス}``のように``//``になるところがポイントです。

```
# ストレージアクセスでバケット名指定なし
$ db2 backup db sample to db2remote://icos-without-bucket/${バケット名}/db2/20211011

# ストレージアクセスでバケット名指定あり
$ db2 backup db sample to db2remote://icos-with-bucket//db2/20211011
```

ICOS上は次のようにバックアップが保管されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/55eafecf-80be-caad-9b5d-2834e0b974b2.png)

## リストア

もちろんICOSからのリストアも可能です。

```
# ストレージアクセスでバケット名指定なし
$ db2 restore db sample from db2remote://icos-without-bucket/${バケット名}/db2/20211011/ taken at 20211011114137

# ストレージアクセスでバケット名指定あり
$ db2 restore db sample from db2remote://icos-with-bucket//db2/20211011/ taken at 20211011114137
```
SSHの始め方

# Summary
[最初に入れるやつら2021](https://qiita.com/y_marui/items/0ce03b01de0e7ea02de1)に付け足す`ssh`のパートが長いので分離。 

ローカルのユーザー名は`hoge`。
リモートのユーザー名は`huga`、アドレスは`xxx.xxx.xxx.xxx`、サーバー名は`bar`。

# 基本操作
## ログイン
```zsh
ssh huga@xxx.xxx.xxx.xxx
```

## リモートからローカルにコピー
```zsh
scp huga@xxx.xxx.xxx.xxx:/remote/file.txt /local/directory/
```

## ローカルからリモートにコピー
```zsh
scp /local/file.txt huga@xxx.xxx.xxx.xxx:/remote/directory/
```

## リモートからローカルに同期
```zsh
rsync -auv huga@xxx.xxx.xxx.xxx:/remote/directory/ /local/directory/
```
`-u`が有るとローカルより新しいもののみ上書きするので、必要の応じて抜く。
`/remote/directory/`を`/remote/directory`にすると、`/local/directory/`の下にフォルダを作って同期する。

# GUIが使いたい場合
`-Y`をつけてログインすると、sshがX11を使ったGUIをサポートする。
`eog`を使って画像を見たりできる。
```zsh
ssh -Y huga@xxx.xxx.xxx.xxx
eog /remoe/image.png
```

## `xauth`でエラーが出る場合
```zsh
ssh -Y bar
> Warning: No xauth data; using fake authentication data for X11 forwarding.
```
設定を書き足す。
```~/.ssh/config
Host *
   XAuthLocation /path/to/xauth
```
`/path/to/xauth`は`/opt/X11/bin/xauth`とか。
わからない場合は、`which`で確かめる。
```zsh
which xauth
> /path/to/xauth
```

## パスワードの変更
初期パスワードは、変更すること。
```zsh
passwd
> Changing password for user huga.
> Changing password for huga.
> (current) UNIX password:
> New password:
> Retype new password:
> passwd: all authentication tokens updated successfully.
```

# Public key authentication
## Key pairをローカルで作成
```zsh
ssh-keygen
> Enter file in which to save the key (/path/to/.ssh/id_rsa): /path/to/.ssh/bar
> Enter passphrase (empty for no passphrase):
```
`/path/to/.ssh`　は、`/Users/hoge/.ssh`とか。
key pairの名前は`bar`でもいいけど、どのサーバーに対応するかわかりやすい方が便利。
`passphrase`は、くれぐれも忘れないように。

## 疎通確認
```zsh
ssh -i /path/to/.ssh/bar user@xxx.xxx.xxx.xxx
> Enter passphrase for /path/to/.ssh/bar:
```
`passphrase`がログイン時に必要。

## alias
```~/.ssh/config
# OS名
Host bar
    HostName xxx.xxx.xxx.xxx
    User huga
    Port 22
    IdentityFile /path/to/.ssh/bar
    UseKeychain yes
    AddKeysToAgent yes
```
この設定をすると、`huga@xxx.xxx.xxx.xxx`の代わりに、`bar`でリモートを指定できる。
Keychainを使うと、`passphrase`も省略できる。

# References
-   [scp コマンドでサーバー上のファイル or ディレクトリをローカルに落としてくる - Qiita](https://qiita.com/katsukii/items/225cd3de6d3d06a9abcb)
-   [SSH の認証方式を、公開鍵認証方式にする。 - Qiita](https://qiita.com/hnkyi/items/9572b9a1cf8972f1c45e)
-   [SSH 公開鍵認証で接続するまで - Qiita](https://qiita.com/kazokmr/items/754169cfa996b24fcbf5)
-   [\[備忘録\]~/.ssh の作り方と config の設定 - Qiita](https://qiita.com/wannoko/items/3fdc536e42b6e32afe8c)
-   [Warning: No xauth data; using fake authentication data for X11 forwarding. - はかせになりたい](https://sonotaropp.hatenablog.com/entry/2019/07/22/154545)
-   [ssh 経由で写真を表示するにはどうすればよいですか](https://qastack.jp/superuser/557622/how-can-i-view-pictures-via-ssh)
作業先のS3バケットがLambdaのトリガーとなっていないかを確認する方法

#背景
S3へのオブジェクト作成をトリガーを利用してLambdaを活用することは多いと思います。
そうすると、S3にファイルを作成する処理を書くときに

「あれ、このバケットのこの場所、トリガーになってないよね、、、？」

と思うことが出てきました。
さっと確認できると安心感も増すものです。

#解決方法

API レベル (s3api) コマンドにこれを満たす get-bucket-notification-configuration というものがあります。

参考：[API レベル (s3 api) コマンド](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-s3-apicommands.html)


#具体的な方法
せっかくなので
・S3の条件（Prefixとか）
・S3のパス
・Lambda関数のARN

が1行で一覧で出力できるようなjqを書いてみました（あと一歩スマートな書き方があるかもです）

```
aws s3api  get-bucket-notification-configuration --bucket ★バケット名★　|jq  '.LambdaFunctionConfigurations[] |[.Filter[].FilterRules[].Name,.Filter[].FilterRules[].Value,.LambdaFunctionArn]|@tsv' -r | sort -k 2,2
```

#結果
関数ごとにエイリアスが設定して、エイリアスごとにS3トリガーが異なる場合でも上手く一覧化できました。

```
Prefix  testdesu/testtmp/testlogtmp/           arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:testFunctionA:aliasAAA
Prefix  testdesu/testtmp/testlogtmp_aliasDDD/  arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:testFunctionA:aliasAAA
Prefix  testdesu/testtmp/testlog/aliasBBB/     arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:testFunctionA:aliasBBB
Prefix  testdesu/testtmp/testlog/aliasCC/      arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:testFunctionA:aliasCCC
Prefix  testdesu/testtmp/testztmp/             arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:testFunctionB:aliasDDD
Prefix  testdesu/testtmp/testztmp_aliasDDD/    arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:testFunctionB:aliasDDD
Prefix  testdesu/testtmp/testztmp_aliasAAA/    arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:testFunctionB:aliasAAA
Prefix  testdesu/testtmp/testzz/aliasBBB/      arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:testFunctionB:aliasBBB
Prefix  testdesu/testtmp/testzz/aliasCC/       arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:testFunctionB:aliasCCC
```

# その他
マネジメントコンソールから確認する場合、バケットの「プロパティ」から「イベント通知」という項目で、同様の内容を確認することができます。

URLで言うと2021.10.11では以下でアクセス可能です。

```
https://s3.console.aws.amazon.com/s3/bucket/（バケット名）/property/notification
```

~~jq職人をやり終えた後で念のため調べたら画面からみられるじゃん！となった訳ですがCLIでも解決できることが分かったから良いのです~~
Jenkinsのセッションタイムアウト時間を設定する

# 設定値を探る
* JENKINS_ARGSに--sessionTimeout（分）を設定すればいいらしい。デフォルトは60分。

``` bash
$ java -jar /usr/lib/jenkins/jenkins.war --help | grep sessionTimeout
   --sessionTimeout         = set the http session timeout value in minutes. Default to what webapp specifies, and then to 60 minutes
```

# 設定する

* バックアップ作成して設定

```
cp /etc/sysconfig/jenkins /tmp/jenkins
vi /etc/sysconfig/jenkins
```

* 変更内容確認。今回は120分に設定してみた。

``` diff
diff -u /tmp/jenkins /etc/sysconfig/jenkins
--- /tmp/jenkins	2021-10-11 11:20:13.331500463 +0900
+++ /etc/sysconfig/jenkins	2021-10-11 11:22:16.779657555 +0900
@@ -174,4 +174,4 @@
 # Pass arbitrary arguments to Jenkins.
 # Full option list: java -jar jenkins.war --help
 #
-JENKINS_ARGS=""
+JENKINS_ARGS="--sessionTimeout=120"
```

# サービス再起動

```bash
service jenkins restart
```


# 後始末
* 問題なければバックアップ削除

```
rm /tmp/jenkins
```
PHPカンファレンス2021（#phpcon2021）に当日司会スタッフとして参加しました！

##PHPカンファレンス2021にスタッフとして初参加してきました！

10月2,3日の2日に渡って開催されたPHPカンファレンスの参加者数は
なんと、、、、**2575人**とPHPカンファレンス史上最多でした:exclamation::exclamation:
<a href="https://phpcon.connpass.com/event/221951/"><img src="https://connpass-tokyo.s3.amazonaws.com/thumbs/5f/0d/5f0d2b740c3b9bb28a4ff808db51acb5.png"></a>

##PHPカンファレンスとは？

2000年から始まり、第22回目、21周年を迎える歴史あるカンファレンスで、
日本PHPユーザ会主催となり毎年夏に1回開催しています。
私のリサーチでは、国内最大のPHPカンファレンスです。

##どんなセッションがあるの？

>Long session (60分): 60分の長いセッション
Regular session (25分): 25分の通常セッション
LT (4分): 短いトークです。時間になったら強制終了
スポンサーツアー:スポンサー各企業がトークするものです。

当日は、track1~3:日本語登壇者/企業のスポンサーツアー/LT大会、track4:英語登壇者セッションに分かれて発表が行われます。

##当日はどんな役割をしたの？

今回、私は英語セッション担当だったので、英語で司会を従事しました！
主な仕事内容としては、基本はスピーカーが話す前後でアナウンスしたり、セッション前にZoomに参加してもらい最終チェック（スライド、音声等）の確認を行います。
また、オンライン上の画面では見えないですが、現場では、YouTube上で配信が見えるようにするために専用機材を操作する役割も担います。
ただ全てを1人で担うのではなく、2人1組のペアとなり、困ったことがあればペアの人や、同じ会場にいる人がサポートしてくれます！！
![スクリーンショット 2021-10-10 22.36.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128354/427067a4-fe44-3c91-5f48-d67daab6afdd.png)
 ↑配信部屋の様子です。

##国際色豊かなTrack4はどんな感じだった？

私の担当したtrack4は、いろんな国から登壇者と繋ぐのですが、待機中の登壇者の過ごし方も様々で、ちょっと違う角度で楽しめたりしました！
登壇者の裏側を楽しめるのは司会担当になった特権ですね笑
中でも、ウガンダからご登壇された**Lochemem Bruno Michaelさん**は、直前4分前ぐらいまで音楽を聴いたり、調べものをして終始楽しそうでした！
最後に手を振ってくれたりとてもフレンドリーな人でした！
![スクリーンショット 2021-10-08 13.30.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128354/8750b866-d938-b817-3720-b5557bf8045e.png)


##個人的に印象に残っているセッションは？

個人的に記憶に残っているのが、「PHPにおけるコーディング規約と自動整形」のセッションのコーディングライブが記憶に残っています。
（※すべてのセッションはみれていないので、あくまでオンタイムでみた少数のセッションから厳選しています。）
初心者向けだったので、私でも理解できるような内容でした。
後半のコーディングライブは、リアルタイムでDiscordのコメント拾いながらコーディングしており、感動しました。（初めてコーディングライブをみたのでww）
司会を一緒に担当していたエンジニアとコーディングライブの話で盛り上がりました笑
スタッフでも、自分の気になるセッションをみたり、一緒に担当した人と情報交換したりできるので、スタッフ全員で和気あいあいと楽しんでました！

##来年の開催はいつ？

2022年9月24、25日に開催予定です！！
オンライン、オフラインどちらになるかは未確定みたいです！
是非公式アカウントをフォローの上、情報解禁まで楽しみにしていてください！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">来年のPHPカンファレンス2022は9/24,25に開催予定です！<br>(ただし、今後の時勢により不透明なところがあるので開催形態については後ほど告知します。)<br>来年もよろしくお願いします！<a href="https://t.co/BzDgBPitgz">https://t.co/BzDgBPitgz</a><a href="https://twitter.com/hashtag/phpcon?src=hash&amp;ref_src=twsrc%5Etfw">#phpcon</a> <a href="https://twitter.com/hashtag/phpcon2021?src=hash&amp;ref_src=twsrc%5Etfw">#phpcon2021</a> <a href="https://twitter.com/hashtag/phpcon2022?src=hash&amp;ref_src=twsrc%5Etfw">#phpcon2022</a></p>&mdash; PHPカンファレンス2021 (@phpcon) <a href="https://twitter.com/phpcon/status/1444588039259365381?ref_src=twsrc%5Etfw">October 3, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##初スタッフ参加を検討する方へ

今回、IT技術者向けのカンファレンスに初参加、初オンライン配信という状態でスタッフとして参加しましたが、事前に全体MTG2回ほど、個別でのMTGも可能なので、私のように初めての人でも安心してスタッフとして参加出来たので、是非皆さんも来年参加してみてください！

##PHPカンファレンススタッフは毎年募集される？

毎年開催の数ヶ月前にPHPカンファレンススタッフ募集があります。
（今年の会長大原さんも若い人の参加が少ないからもっと参加してほしいな〜とボソっと言ってましたので、次回是非一緒に参加しましょう！）
来年は、今回の反省を活かして、司会者として（英語で）盛り上げれるようになって参加したいと考えています！
それまでに、英語とPHPへの理解を深めれるように勉強します！
また来年お会いできるのを楽しみしております:wave:

##最後に

今回、このような初心者の私も暖かく招きいれてくた大原さんはじめ、スタッフの皆さんに大感謝です。
ありがとうございました！！
VSCodeで日本語を使っている時の位置移動問題の解決策

# 問題点
Macでプログラムを書いているときに、単語単位での位置移動をしたいときは、"option+矢印キー"で移動できる。
しかし、デフォルトの環境では、Wordのように日本語の単語単位での移動はできない。
自分はVSCodeでLaTexを書いているため、日本語を使う機会が多く、どうにかしてこの問題を解決できないかと調べてみた。

# 解決策
「Japanese Word Handler」という拡張機能を使用する。
これを使えば、単語単位での移動や削除ができるようになって楽。

MacじゃなくてWindowsでも使えるので、日本語をよく扱う人には必須の拡張機能だと思う。

# 参考
https://qiita.com/EbXpJ6bp/items/e6a0ed52bdcb60bfd145
composerコマンドのオプションをデフォルトにしたい

# オプションを毎回付けるのが面倒
面倒な上に忘れがち。

```bash
$ composer install -o
$ composer dump-autoload -o
```

# デフォルトでオプションを付ける
``composer.json``の``config``から設定できます。

```composer.json
{
  "config": {
    "optimize-autoloader": true
  }
}
```

設定後は自動でオプションが適用されます。

```bash
# オプションなしでOK
$ composer install
$ composer dump-autoload
```

設定方法の詳細は[公式ドキュメント](https://getcomposer.org/doc/06-config.md#optimize-autoloader)に掲載されています。
書籍「ユースケースで学ぶDataiku－自転車シェアリングサービスの利用パターン分析－」告知

2022/2/09 追記
 こちらの書籍は、以下の総集編に統合しました。以下をご利用ください。
 プログラミングレスデータ分析のすすめ ユースケース編
　[https://play.google.com/store/books/details?id=841aEAAAQBAJ](https://play.google.com/store/books/details?id=841aEAAAQBAJ)

----



[Dataiku DSS](https://www.dataiku.com/)を扱った書籍３冊目を発行しましたのでお知らせします。
累計三冊目、ユースケースシリーズとしては二冊目となります。

<b>「ユースケースで学ぶDataiku－自転車シェアリングサービスの利用パターン分析－」</b>、2021/10/1発行です。

基礎から一歩踏み込み、ユースケースをもとにしたDataikuの応用的な使い方について学ぶことができる１冊です。

|<img width="400" alt="cover.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/cb159ea7-0815-6c0c-6a73-3f47b044fc84.png">|
|:--:|


#本の紹介
本書は、Dataiku 社（https://www.dataiku.com/）が提供する分析ツールDataiku Data Science Studio（Dataiku）を使って、実際の現場でデータ分析を進める第⼀歩を踏み出すための⼊⾨書です。
本書では⾃転⾞シェアリングサービスの利⽤パターンの分析というユースケースを通じて、Dataiku の実践的な使い⽅を学んでいきます。具体的には、データ加⼯や結合、クラスタリングを⾏い利⽤パターンを把握するといった分析作業を体験することができます。この内容はDataiku Academy で提供されている「Use Case: Bike Sharing Usage Patterns」の内容を⽇本語化したものとなります。初⼼者の⽅でもデータ分析のことを知っていただけるように、Python やR などの分析⾔語の知識がなくても、Dataiku のGUI を使ってデータ分析を体験できるようになっています。そのため、現場でのデータ分析をどのように進めていけばよいか知りたい⽅には、きっと役⽴てていただける内容となっていると思っております。本書を通じて、実際のビジネス現場でのデータ分析で活⽤いただれば幸いです。

また、本書は「プログラミングレスデータ分析のすすめ」の知識を前提としていますので、先にそちらを読んでおくとより理解が深まります。



#執筆者
[@ningendamono](https://qiita.com/ningendamono)さんが執筆されています。執筆、おつかれさまでした！

#ダウンロード
以下からダウンロードできます。
https://play.google.com/store/books/details?id=gu9EEAAAQBAJ

既刊である書籍「プログラミングレスデータ分析」は以下からダウンロード可能です。
技術書典
https://techbookfest.org/product/5117838303952896

また、このユースケースシリーズ1作目である「ユースケースで学ぶDataiku－レンタカーの故障予測－」は、以下からダウンロードできます。
https://play.google.com/store/books/details?id=Wf4vEAAAQBAJ


以上
composerのロングオプションはコマンドによって違うこともある

# ロングオプションに注意！
autoloadのoptimizeオプションは``install``と``dump-autoload``でロングオプションの表記が違います。

詰みました。

```bash
$ composer install --optimize-autoloader
$ composer dump-autoload --optimize
```

ショートオプション``-o``は共通です。

```bash
$ composer install -o
$ composer dump-autoload -o
```

他にもこういうオプションがあるのだろうか...
詰んだら[公式ドキュメント](https://getcomposer.org/doc/03-cli.md)へ。

普段はショートオプション使いですがw
ロングオプションの方がコマンドの意図が分かり易いので、覚えておいて損はないと思います！
Juniper　MX ポリシーカウント 例

set firewall family inet filter フィルター名 term 402 from source-address IPアドレス/32
set firewall family inet filter フィルター名 term 402 from source-address IPアドレス/32
set firewall family inet filter フィルター名 term 402 from protocol udp
set firewall family inet filter フィルター名 term 402 from port ntp
set firewall family inet filter フィルター名 term 402 then count count402
set firewall family inet filter フィルター名 term 402 then accept
【Ruby on Rails】ストロングパラメーターはなぜ必要か？paramsの脆弱性


##はじめに
どうも、未経験からエンジニア転職を目指しているもきおです。

Railsでコントローラを記載する際に最後にストロングパラメータ書いてねって記載されてたりしますが、そもそも<font color='red'> **ストロングパラメータって何ぞや？**</font>って思いながらも当時はとりあえず動けばいっかみたいな感じであまり理解しないまま進めてしまってました。

ストロングパラメータの記載はこんな感じ

```ruby:user_controller.rb
private
def user_params
  params.require(:user).permit(:name,:email,:password)
end
```

今回はなんでこれが必要なのって話とparamsは使いようによってセキュリティの脆弱性があるよってお話をしていきたいと思います。

##ストロングパラメータを使わないとどうなる？
ストロングパラメータを使用しないとどのようなセキュリティ上の問題が起こるのでしょうか？
例えば以下の記載でuser_controllerのcreateを作成したとします。

```ruby:user_controller.rb
private
def create
  @user = User.new(params[:user]) 
end
```

一見前回のparamsの記事のようにparamsによってuserの値を全て取ってきてuserテーブルにユーザーの情報が情報が格納されるので問題ないように思えます。

※paramsに関しては前回書いた記事をご覧いただけますと幸いです。

https://qiita.com/mokio/items/05cd9f12aae9e2395676

しかし、ユーザー情報を全て格納されるというのは<font color='red'> **極めて危険な状態**</font>です。
###セキュリティ上危険な例
実際の例を見てみましょう。User情報にadmin(管理者)属性を持たせたとしましょう。
admin=’1’という値をparams[:user]の一部に紛れ込ませて渡してしまえば、簡単に管理者属性を持たせる事ができてしまいます。これはcurlなどのコマンドを使えば簡単に実現できてしまいます。

※Railsチュートリアル7章ユーザー登録参照
https://railstutorial.jp/chapters/sign_up?version=6.0#code-first_create_action

悪意のあるユーザが自身に管理者権限を付与するなどシステムを自由に操作できてしまう危険性があるのです。

これを防ぐためにストロングパラメータによって特定の情報しか受け取らない設定を行い、意図しない登録、更新を防ぐ事ができるのです。

##実際にストロングパラメータを使用しよう
ストロングパラメータをの基本形は以下になります。

```ruby:user_controller.rb
private
def create
  @user = User.new(params[:user_params]) 
end
```

先程の[:user]→[:user_params]に変更しています。
これはストロングパラメータを使いやすくするために、user_paramsという外部メソッドを使うのが慣習になっています。このメソッドは適切に初期化したハッシュを返し、params[:user]の代わりとして使われます。

###ストロングパラメータ記述の仕方
```ruby:user_controller.rb
private
def user_params
  params.require(:キー(モデル名)).permit(:カラム名１,：カラム名２,・・・)
end
```
requireの後にモデル名、permitの後に受け取るカラム名を指定します。

これを元に最初に記述した

```ruby:user_controller.rb
private
def user_params
  params.require(:user).permit(:name,:email,:password)
end
```
これで受け取る情報を制限し、悪意のあるユーザーに余計な値(管理者権限等)を受け渡さないように<font color='red'> **セキュリティを強化できました。**</font>

##あとがき
今回はストロングパラメータについて理解を深めていきました。
この記事が少しでも良いと感じていただけましたらLGTMポチッといただけますと幸いです。
Java Silver アウトプット2

前回の続きです

https://qiita.com/0W5E8fPq1EOm4yE/items/b890ef41eaa145634225

今回はchapter2の変数と配列についてのアウトプットです

・「＿」は値の前後、記号の前後に記述することは不可

・識別子の1文字目は英字、ドル記号($)、アンダースコア(_)、2文字目以降は数字も可

・識別子は予約語は不可

・識別子はnull、true、falseを使用することはできない

・varは識別子としては使用可能

・配列ではmain()メソッドの型と代入する値の型が一致しているか確認する

・varはメンバには使用不可(var ary1={1,2,3};)

・varの配列の宣言は「var ary=new int[]{1,2,3}; 」、「var ary=new int[3];」がある

・要素数は指定しないとコンパイルエラーになる

・{1,2,3}は要素数と値を自動で生成する