OmniAICreator/Qiita-1.07M huggingface dataset:
[Rails]例外処理を書く方法とは？

# 例外処理とは、、？
例外処理とは、エラーがでたときの処理を行うことです。
エラー原因の特定やシステム側で不具合を起こさないためにも例外処理を書けば便利です。

## 例外処理の書き方
####begin,rescueの基本形
エラーの対象となりそうな箇所をbeginで囲い、エラーが発生した場合の処理をrescueの中に書く。

```ruby

begin
  100 / 0
rescue
  p "0で割れません"
end

puts "おはようございます"
```
####ワンライナーで書く

ワンライナーで書くことも可能です。

```ruby

sample_1 = 10 / 0 rescue 0

sample_2 = 10 / nil rescue 0

puts sample_1 #=>0
puts sample_2 #=>0
```

####エラー内容を取得する(e)

また、rescueの後に引数を指定してあげて、変数の中にエラー内容を格納できます。

```ruby

begin
  10 / 0
rescue => e
  puts e #=> divided by 0
end
```

####エラーごとに条件分岐する

他にも、rescueの後にエラーメッセージを指定することで、
どのエラーが出た時にどの処理をするか,というのを条件分岐ができます。

```ruby

begin
  10 / 0
rescue NoMethodError
  puts "メソッドはありません"
rescue ZeroDivisionError
  puts "0で割れません"
end
```

####raiseの使い方
パラメータが想定されたものではない時や、不正なアクセスがきたといった場合に、明示的にエラーを発生させ、処理を中断させたいときに使います。

```ruby

begin
  raise NoMethodError # 発生させたい例外のクラス
rescue => e
  puts e
end
```

エラーメッセージを出力することも可能です。

```ruby

begin
  raise RuntimeError, "実行時エラーです"
rescue => e
  puts e
end
```

####retryの使い方
エラーが起きても、再度beginに戻って実行することができます。

```ruby

num = 0
begin
  puts 10 / num
rescue ZeroDivisionError => e
  puts e
  num = 1
  retry #beginブロックを再度実行
end

puts "終了しました"
```

####ensureの使い方
例外が発生してもしなくても実行される処理を書くことができる。

```ruby

begin
  puts "例外なし"
rescue => e
  puts e
ensure
  puts "ここは絶対実行する!"
end
```
MacにpostgreSQLをインストールしてpsqlコマンドを使用する方法

こんにちは。未経験からのエンジニア転職を目指して勉強中の初学者です！
SQLについて勉強としようと思い、こちらの書籍を電子書籍で購入！

# [SQL ゼロからはじめるデータベース操作](https://www.amazon.co.jp/SQL-%E7%AC%AC2%E7%89%88-%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%93%8D%E4%BD%9C-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AD%A6%E7%BF%92%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%83%9F%E3%83%83%E3%82%AF/dp/4798144452)
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630873/4d342ff4-8ae3-e325-4861-4701d4252fa8.png)

いざ！！とページ開いてみたら、、、学習環境はWindowsでした！！
本書で扱うPostgreSQLもWindowsでのインストール方法のみを紹介！！！
自分、Macです！！！エンジニアってMacだとばっかり思ってました！すいません！

ということで、まず学習に入る前にPostgreSQLのインストールをしましたので、振り返りのために記事にしておきました！

# 環境

- MacOS Catalina10.15.6
- Homebrew 2.5.6

# PostgreSQLのインストール

### インストール可能なバージョンを確認

✔がついているバージョンがインストール済のバーションです。

```
% brew search postgresql
==> Formulae
postgresql        postgresql@10     postgresql@11     postgresql@12     postgresql@9.4    postgresql@9.5 ✔  postgresql@9.6
==> Casks
navicat-for-postgresql
```

### インストールする

```
% brew install postgresql
```
### バージョンを指定してインストールする場合

```
% brew install postgresql@9.5
```
無事にインストールができたようなので、まずはバージョンの確認をば。
### バージョンを確認
```
% psql --version
```
、、、と思ったら下記のエラーが💦

```
% psql --version
zsh: command not found: psql
```
ネットで調べてるみると、どうやらpsqlコマンドを使用するPATHが通っていないとのこでした。
PATHを通す方法を色々調べて下記コマンドで使用できるようになりました！！

### PostgreSQLの実行場所を確認

```
% locate psql | grep /bin
```
、、、と、ココでも妙なメッセージが💦💦

```
WARNING: The locate database (/var/db/locate.database) does not exist.
To create the database, run the following command:

  sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

Please be aware that the database can take some time to generate; once
the database has been created, this message will no longer appear.
```
指示通りに下記コマンドを実行

```
% sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
```

パスワードを求められるので素直に入力。
再びlocateコマンドはマッチした条件のファイルを確認。

```
% locate psql | grep /bin
/usr/local/Cellar/postgresql@9.5/9.5.23/bin/psql
```
、、、おぉっ！！psqlのパスが表示されました！

# .zshrcを編集してPATHを通す

### vimで編集

先程確認できたパスを使用して編集します。

```
% vim ~/.zshrc
```

- [ i ]でインサートモードにして編集ができる
- 編集が終了したら「esc」キーで、コマンドモードに変更
- コマンドモードで、「 : 」「 w 」「 q 」の順にキーを押して、編集内容を保存

```
export PATH=$PATH:/usr/local/Cellar/postgresql@9.5/9.5.23/bin
```


### 編集して保存したらsourceコマンドで読み込み

```
% source ~/.zshrc
```

### 無事にPATHが通っているか確認

```
% psql --version
psql (PostgreSQL) 9.5.23
```

できました！！
sourceコマンドで読み込んだ後はターミナルを立ち上げ直した方がいいかもしれません。

# 参考にさせて頂いた記事
- [Mac psqlコマンドのPATHを通す](https://awesomecatsis.com/mac-psql-path/)
- [【Mac】Homebrew を使って PostgreSQL を動かす](https://qiita.com/yuppymam/items/fad4eec0c5b7d6c86517)
Laravel:DB(Sequel Pro)をつなげてmigrateする方法

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.どのように記載するか</b>

<b>3.開発環境</b>

<b>補足</b>



1.結論
----------------------------------------
<b>create databaseしたファイル名と.envとconfig/database.phpでのファイル名等を一致させ、php artisan make:migrationしてから必要な記述をしphp artisan migrate</b>する！

<br>

2.どのように記載するか
----------------------------------------
MysqlやSequel Proの導入は省きます。

❶まずデータベースを作成します

```console
$ mysql -u root -p #パスワードを何も設定してなければEnterで進めます。
mysql> create database ファイル名;
```

❷.env.exampleとconfig/database.phpでDB(Sequel Pro)をつなげます。

```php:.env
DB_CONNECTION=mysql #mysqlを使用しているのでこのように記載します。
DB_HOST=127.0.0.1 #データーベースサーバーのホストの指定です。
DB_PORT=3306 #初期値がこの値なのでいじらないでOKです。そうでない場合はこの値にしてください。
DB_DATABASE= #create database ファイル名;のファイル名を記載してください。
DB_USERNAME=root #Sequel Proのユーザー名を記載してください。
DB_PASSWORD= #パスワードを設定していなければ空欄でOKです。
```

```php:config/database.php
'mysql' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', ''),
    'username' => env('DB_USERNAME', 'root'),
#　.env.example　と一致させます。
```


❸php artisan make:migrationして、php artisan migrateします。

```console
$ php artisan make:migration ファイル名
```
php artisan make:migration　ファイル名を記載するとファイルが生成されるので必要なカラム名や型を設定します。

```php

#省略

    public function up()
    {
        Schema::create('people', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('mail');
            $table->integer('age');
            $table->timestamps();
        });
    }

#省略
```
ここでphp artisan migrateするとcreate databaseしたDBのファイル名に反映されます。

<br>

参考にさせていただいたURL:

<a href="https://www.takafumitaba.com/laravel-mysql">❶DBに反映：LaravelでSequel Proを使ったMySQLのデータベース接続（Mac/初心者向き）</a>


3.開発環境
----------------------------------------
PHP 7.4.10
Laravel 8.9
Apache 2.4.41
Mysql  5.6.47
Sequl Pro 1.1.2
<br>

補足
----------------------------------------
しかし、2.❸でphp artisan migrateしたところ、エラーが生じ、SQLSTATE[HY000] [1049] Unknown database 'laravel'とでました。![スクリーンショット 2020-10-25 21.24.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/52fbc1e5-3b51-b2e3-fda0-b748f604c416.png)

結論から言うと、"DB_DATABASE=Laravel"のデフォルトの記述のままでした。その場所はどこかというと、下記で入力した部分でした。

```console
$ vi .env
```
ここに記載してあるDB_DATABASE= が"Laravel"のままで自分が.env.exampleで設定した名前と違っていたので直したところDBに反映できました。自分が記載した.envファイルは.env.exampleファイルに記載しており"vi .env"に記載していなかったためです。


参考にさせていただいたURL:
<a href="https://qiita.com/miriwo/items/7c87f1053da413e739f7">❷エラーについて：Laravel MySQL SQLSTATE[HY000] [1049] Unknown database が出た時に確認すること</a>
<br>
調べ方・ググり方

①　エラーでぐぐる
　　・vscodeの左下に問題のある箇所があるかどうか指摘してくれるメッセージがあるのでそれをクリック
　　・そのエラーメッセージを右クリックでコピーメッセージをしてgoogleに貼り付け
　　　　　　　　　　　　　　　　　　➡️そのエラーメッセージの先頭に言語を付け足す（Rubyなど）

    
②　頭の中にあるワードでググる

③リファレンスでググる（読む）
　　・例　foreach mdn
　　・Docs（公式リファレンス）

④英語でググる
　　・プログラミングの情報は英語の方が圧倒的に多いため、日本語で検索しても見つからなかった場合に、
　　　英語だと見つかることが多々ある
　　・英語でググる場合の方法
　　　　・how to ~を使うと調べやすい（例. how to get domain in javascript）
　　　　　　・stack over flow など海外のプログラミングQ＆Aサイトがある

⑤Git hubでググる
　　・グローバルで検索する（左上の検索タグで検索）→ワードを入力→in this repository
　　　　・in this repositoryをクリックし、まずCodeをみる
　　　　・issue（問題）を見る、next.jsを使う上で問題やバグを見つけた時に、このissueを使ったりする
　　　　・disscussions（議論）→Q＆A的な使い方も想定されている
【Javascript】onclickイベントが呼び出されない

## 概要
railsでアプリケーションを作成中。
Javascriptを使用してボタンのクリックで要素の表示/非表示を切り替えたいが、クリックをしても動かない。
コードは以下のとおり。

```ruby:html.erb
  <button type=button id="info-btn">ログイン情報</button>  
  <div class="login-info" id="js-login-info">
   <p>アドレス：hoge パスワード：hogehoge</p>
  </div>
```

```:css
.login-info { 
  display: none;
}
```

```js:click.js
document.getElementById("info-btn").onclick = function(){
  const loginInfo = document.getElementById("js-login-info");
  if(loginInfo.style.display=="block"){
    loginInfo.style.display = "none";
  }else{
    loginInfo.style.display = "block";
  };
};
```

```application.js
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require("../click")←ここで該当のjsファイルを読み込む
```

```display: none```で要素を見えないようにしておき、クリックしたタイミングで値を```block```に切り替えるようにしていたがいくらクリックしても動かず...。
コンソールを確認したところ``Uncaught TypeError: Cannot set property 'onclick' of null``というエラーが表示されていた。

##解決方法
個別でjsファイルをコンパイルして参照することで解決。下記の記事を参考にさせていただきました！
[Ruby on RailsにおけるJavascriptファイルの取り扱い(Rails6)](https://nobunobu1717.site/?p=1292)
具体的には以下の点を変更しました。
・ jsファイルの場所を``app/javascript/click.js``から``app/javascript/packs/click.js``に変更
・ 該当ビューファイル(``new.html.erb``)の一番下に``<%= javascript_pack_tag 'click' %>``を追加

検証ツールで確認すると<%= javascript_pack_tag 'click' %>を追加した箇所にscriptタグと共にコンパイルされたjsファイルが読み込まれていました。

![script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700117/0f187797-63ec-9b3f-e2a8-6dee76f89d42.png)

## 最後に
headタグ内にある```<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>```でjavascriptファイルを読み込んでいるため、bodyタグの中身が読み込まれる前にjsファイルが読み込まれたことが原因でエラーが起きていたということだろうか。
問題は解決できたが自分の中に落とし込めていないため間違っている点がありましたらご指摘お願いします！
[linux]プロセスを終了するkillコマンド

# killコマンドとは？
指定したプロセスIDのプロセスを終了させるコマンド。

```ruby

$ kill プロセス番号（PID）
```

##使い方
1.以下のコマンドを実行してプロセスIDを調べる。

```ruby

$ ps # 現在起動しているプロセスを確認する

$ ps ax | grep gedit # プロセスに”gedit”の名称がついたプロセスのみを表示
16619 ?        Sl     0:01 gedit
```

2.killコマンドでプロセスIDを指定してプログラムを終了する。

```ruby

$ kill 16619
```

3.強制終了したい場合は以下のコマンドを実行する。

```ruby

$ kill -9 16619
```

##主なオプション

| コマンド | 概要 |
|:-:|:-:|
| -s シグナル  | 指定したシグナル名またはシグナル番号を送信する  |
| -シグナル  | 指定したシグナル名またはシグナル番号を送信する  |
| -l []  | シグナル名とシグナル番号の対応を表示する  |
GCP: AI Platform

GCPのデータエンジニアの資格試験でも、AI系のサービスが出題されます。
ですのでAIプロダクトについておおまかにまとめようかと思ったのですが、世の中にはいい感じにまとめ記事を書いてくださる方がいますね。
大変ありがたい。

クラスメソッドさんの記事は、これの執筆時点 (2020年10月25日) ではもっともよくまとまっていると思います。
https://dev.classmethod.jp/articles/mrmo-gcp-ai-ml-summary-2020/

9月にもDocument AIなどの追加機能についてアナウンスがあったようです。
https://japan.zdnet.com/article/35159135/

この記事はAI Platformというタイトルですが、Google CloudのサービスとしてはAI Platformだけではなく、それ以外のサービスもお互いに連携・補完しあっているようです。
おおまかには下記のとおりですが、細かくは画像や自然言語、音声、テーブルデータに対する機械学習サービスが提供されています。

- [AI Platform](https://cloud.google.com/ai-platform): 機械学習モデルを作成、学習、実装するプラットフォーム。
- [AI Building-Blocks](https://cloud.google.com/products/ai/building-blocks): 画像や自然言語について開発済みのモデルを使って機械学習システムを構築するサービス。
- [Cloud AutoML](https://cloud.google.com/automl): カスタム機械学習モデルを作成できるサービス。
- [TensorFlow Enterprise](https://cloud.google.com/tensorflow-enterprise): TensorFlowの開発環境や構築したモデルをデプロイするサービス。

また、Google Cloudは機械学習に関しても認定資格をベータ版で準備しているようです。
機械学習の仕組みやGoogle Cloudの機械学習サービスについては、こちらの試験でより深く問われると思います。
https://cloud.google.com/certification/machine-learning-engineer?hl=ja

以上です。ありがとうございました。
画像が表示出来ない時の意外な落とし穴




##作業内容
投稿された画像を表示したい


画像以外は、表示されるという状況でエラーに悩んでました



##構文エラー

ActionView::SyntaxErrorInTemplate in PrototypesController#index

エラー箇所

```ruby:エラー部のみ記載
<%= image_tag prototype.image, if prototype.image.attached? %>

```

最初はもう少し記述がありましたが、わすれました。

参考にした記述が

```ruby
<%= image_tag message.image, class: 'message-image' if message.image.attached? %>
```

違いはクラスが入っているという所です。

クラス抜いたバージョンで記述したのですが、エラーがでました。


なぜ、エラーがでたかわかりますか？

スペルが違うわけでも、ありません。


##解決方法

どこが違うかわかりますか？

```
<%= image_tag prototype.image if prototype.image.attached? %>

```


エラー文の原因は単純な事が多いので、解決した時はなーんだという感じですが

悩んでいる時は、正直つらいですよね。


でも、乗り越えたら成長できるので！

頑張っていきましょう。



「,」がいらなかったんですね。
If文の時は使わない、クラスを使う時に必要だったんですね。

「、」は盲点でした。

必要だと思っていたので、必要だと思ったやつでも外してみたりすることも大切だと学ばせていただきました。

ありがとうございます！
【Java】楽曲ファイルからタグ情報を取得する

## はじめに
楽曲ファイルのタグ情報(楽曲名、アルバム名、アーティスト名など)は各種メディアプレイヤーから簡単に編集が可能です。
特にiTunesでは `Gracenote` を使ってCDからのインポートと同時にタグ情報の自動取得まで行ってくれてとても便利です。
しかし、中には取得してきたタグ情報が __自分好みじゃない__ 場合もあるかと思います。
例をあげると

* 楽曲名がCD表記と異なる
* アーティスト名が表記揺れしている
* ジャンルが異なる(ここは個人の主観もあると思いますが...)

などなど...
これらを1曲ずつポチポチ編集するのは面倒なので、システムからタグ情報を操作できればいいなーと常々思ってました。(そのためには上記の要件を満たす[CDDB](https://ja.wikipedia.org/wiki/CDDB)も必要になりますが...)
今回は `システムからタグ情報を操作する` のうち `タグ情報を取得する` 処理に関して、 `Java言語` と `SpringBoot` の組み合わせで `JAudioTagger` というライブラリを検証した結果を備忘録として残します。

## pom.xmlの編集
`pom.xml` の `dependencies` に以下の依存関係を追加します

```
<dependency>
  <groupId>org</groupId>
  <artifactId>jaudiotagger</artifactId>
  <version>2.0.3</version>
</dependency>
```

## タグ情報の読み込み
まずはiTunesにインポートされている適当な曲のタグ情報を確認します
![tag_ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415399/21ba1820-682d-a258-0373-8ac944c6efb4.png)

それでは実際にJavaコードからタグ情報を読み込んでみます(コードは以下を参照)

```java
AudioFile audioFile = AudioFileIO.read(楽曲ファイルを読み込んだファイルオブジェクト);
Tag tag = audioFile.getTag();

System.out.println(tag.getFirst(FieldKey.TITLE));
System.out.println(tag.getFirst(FieldKey.ARTIST));
System.out.println(tag.getFirst(FieldKey.ALBUM_ARTIST));
System.out.println(tag.getFirst(FieldKey.ALBUM));
System.out.println(tag.getFirst(FieldKey.YEAR));
System.out.println(tag.getFirst(FieldKey.COMPOSER));
System.out.println(tag.getFirst(FieldKey.GENRE));
```

出力結果は以下となりました。

```
誰がその鐘を鳴らすのか？
欅坂46
欅坂46
誰がその鐘を鳴らすのか？
2020
辻村有記
J-POP
```

ちなみに `FieldKey` は以下のようなものが取得できるようです

| FieldKey | 取得できるタグ情報 |
|:-----------: | :------------:|
| TITLE | 楽曲名 |
| TITLE_SORT | 楽曲名(よみ) |
| ARTIST | アーティスト名 |
| ARTIST_SORT | アーティスト名(よみ) |
| ALBUM_ARTIST | アルバムアーティスト |
| ALBUM_ARTIST_SORT | アルバムアーティスト(よみ) |
| ALBUM | アルバム名 |
| ALBUM_SORT | アルバム名(よみ)|
| YEAR | アルバム発売年 |
| COMPOSER | 作曲者 |
| COMPOSER_SORT | 作曲者(よみ) |
| GENRE | ジャンル |

この他にも色々なフィールドが取得できるようです(参考：[マッピング表](http://www.jthink.net/jaudiotagger/tagmapping.html))

## おわりに
今回は `タグ情報の取得` を検証しましたが、次は `タグ情報の書き込み` も検証してみたいと思います。
また、`Java` 以外の言語でのタグ情報の操作も、時間がある際に検証してみたいと思います。
最後になりますが、サブスクが主流となりつつある昨今、ローカルの楽曲ファイルを操作すること自体がナンセンスかもしれません(笑)
mergeメソッドについて改めて理解を深めた

#はじめに
　formオブジェクトを用いて、フォームから複数のテーブルに情報を保存する機能を実装する過程で、いちばん悩んだエラーについて、忘れないために記録しておく。

##想定している場面
　ユーザーが商品を購入する。formに入力したものをデータベースに保存すると同時に、どの商品をどのユーザーが購入したかも保存する。つまり、フォームで「購入」を押した時に、２つのテーブルに保存される。

##mergeメソッドについて
　ストロングパラメーターを設定するときに、使うメソッド。

使用例

```ruby:controllers.rb
private
  def user_order_params
    params.require(:user_order).permit(:postal_code, :prefecture_id).merge(user_id: current_user.id, item_id: params[:item_id])
  end
```


`user_id: current_user.id`のcurrent_userメソッドが使えるのは、deviseのGemを導入しているため。
`item_id: params[:item_id]`で値を入れることができるのは、ルーティングをネストし、URLに`item_id`を含めているため。
ストロングパラメーターはprivateメソッド以下に記述する。

`require`の引数は、モデル名。
`permit`の引数は、DBのカラム名。


ターミナルで確認できるパラメーター

```bash
 "user_order"=>{"hoge"=>"", "postal_code"=>"", "prefecture_id"=>"1"}, "commit"=>"購入", "controller"=>"orders", "action"=>"create", "item_id"=>"7"}
```


###mergeメソッドを使う場面

　form_withでユーザーが記入した内容はハッシュの中に、キーと一緒に入っているが、ユーザーが記入しない内容も保存したい時。
例えば、ユーザーのidやその商品のidについては、ユーザーが直接入力することはないが、パラメーターに含めて、DBの保存したい。そのような時に、mergeメソッドを使って、パラメーターに含めたいキーと値を記述する。
上記の例では、user_idをcrrent_user.idから、item_idをURLに含めたparamsから取ってきて、パラメーターに含めている。

##最後に
　エラーが解決できた時、マージかぁと一人呟いたとさ…。
【javascript】数値文字列の先頭の0を削除（ゼロサプレス）


#前書き

ゼロパディングの逆がしたくなりました。
以下のように変換。

```
'000001230' => '1230'
```
#（追記）
投稿後に検索したら以下でもできると知りました。

```javascript:
Number('000001230');	//1230
```

状況が合えばこのパターンも良いですね。


#コード（3パターン）

##正規表現
```javascript:
const suppressZero1 = str => {
	//略
	return str.replace(/^0+/, '');
};
console.log( suppressZero1('000001230') );	//'1230'
```

##配列化
```javascript:
const suppressZero2 = str => {
	//略
	const idx = str.split('').findIndex(x => x!=='0');
	return str.slice(idx);
};
console.log( suppressZero2('000001230') );	//'1230'
```

##while
```javascript:
const suppressZero3 = str => {
	//略
	let idx = 0;
	while (str.charAt(idx)==='0') idx++;
	return str.slice(idx);
};
console.log( suppressZero3('000001230') );	//'1230'
```

#速度
私の環境での処理時間は
`（速＜遅）while =< 配列化 << 正規表現`
の順番でした。

#（コード追記）マイナスと小数点以下も処理
コメントでマイナス考慮しないの？って言われたので`while`ベースで書きました。
やっつけなので問題あれば教えてください。

```javascript:
const suppressZero3 = str => {
    //事前検査
    if (typeof str !== 'string') return;
    if (!/^-?\d+(\.\d+)?$/.test(str)) return;
    
    //先頭の切り出し位置の特定
    let start = 0;
    const minus = str.startsWith('-') ? (start++, '-') : '';
    while (str.charAt(start)==='0') start++;
    
    if (!str.includes('.')) return minus + str.slice(start);
    
    //後方の切り出し位置の特定
    let end = str.length - 1;
    while (str.charAt(end)==='0') end--;
    
    return minus + str.slice(start, end + 1);
};
console.log( suppressZero3('-000001230.0045678900000') );	//'-1230.00456789'
```
ここまでやると正規表現を使った置換で良さそうな気がします。
画像プレビュー機能の実装

##railsでの画像プレビュー機能の実装

**環境**
Rails 5.2.4.4

**前提**
userテーブルにimage_idカラム


**手順**
①image_tagにidを与える
JavaScriptで処理するためにidを与える。
ここでは`id: "img_prev" `とする。


```
<%= attachment_image_tag @user, :image, size: "300x300", fallback: "no_profile.jpg", size: "300x300" , id: "img_prev"%>

```


②同ページの下部にJavaScriptの記述をする
画像ファイルフィールドの値が変化したときに、
image_tagで画像ファイルのURLを読み込み、画像を表示をする。


```

<script>
$(function(){                                         
    $('#user_image').on('change', function (e) {        #idからの情報取得
    var reader = new FileReader();　　　　　　　　　　　　#既存の画像urlの取得
    reader.onload = function (e) {
        $(".image").attr('src', e.target.result);
    }　　　　　　　　　　　　　　　　　　　　　　　　　　　　#ここまでが画像取得のため
    reader.readAsDataURL(e.target.files[0]);　　　　　   #取得したurlにアップロード画像のurlを挿入
});
});

</script>

```

以上で画像プレビュー機能の実装ができた。
【Dart】Dartで自作アノテーションの作成は可能なのか？

#
単刀直入、Dart言語でJava言語のような「自作アノテーション」を作成する事は可能なのか？
→ 結論：<font color="#FF0000">可能</font>

今回は「ポケモン」のネタをベースにDart言語で自作アノテーションを作成してみた。
作成するアノテーションは以下の通り、図鑑番号などが定義されているアノテーション。

#####■ ポケモンアノテーション（PokemonAnnotation）
- 図鑑番号：int型
- ポケモン名：String型
- 種族値：List(int)型

#サンプルコード
ポケモン「チョンチー」「ランターン」の図鑑番号、名前、種族値をコンソール上に出力するサンプル。
自身のクラスをリフレクションする事で、継承クラスの対応も可能。

```dart:Main.dart
import 'dart:mirrors';
import 'PokemonAnnotation.dart';

void main() {
  Chinchou().printPokemonData();
  Lanturn().printPokemonData();
}

@PokemonAnnotation(170, "チョンチー", [75, 38, 38, 56, 56, 67])
class Chinchou {
  void printPokemonData() {
    ClassMirror classMirror = reflectClass(this.runtimeType); // 自身のクラスをリフレクション
    int dexNumber = classMirror.metadata.first.reflectee.pokemonDexNumber;
    String name = classMirror.metadata.first.reflectee.pokemonName;
    List<int> baseStats = classMirror.metadata.first.reflectee.pokemonBaseStats;

    print(dexNumber);
    print(name);
    print(baseStats);
  }
}

@PokemonAnnotation(171, "ランターン", [125, 58, 58, 76, 76, 67])
class Lanturn extends Chinchou {
  // Chinchouクラス継承
}
```

```dart:PokemonAnnotation.dart
library PokemonAnnotation;

class PokemonAnnotation {
  final int pokemonDexNumber;
  final String pokemonName;
  final List<int> pokemonBaseStats;
  const PokemonAnnotation(
      this.pokemonDexNumber, this.pokemonName, this.pokemonBaseStats);
}
```

# 実行結果
ポケモン「チョンチー」「ランターン」の図鑑番号、名前、種族値がコンソール上に出力された。

```
170
チョンチー
[75, 38, 38, 56, 56, 67]
171
ランターン
[125, 58, 58, 76, 76, 67]
Exited
```
![SS_CL.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605111/bfbf4dcc-a962-5c08-77fb-7e2924421101.jpeg)

# 感想
Java言語で自作アノテーションを作成する事があったため、Dart言語でも同様に作成できるのはありがたい。
「Dart言語で自作アノテーション作成できないか？」という疑問から調べてはみたが、参考になる資料が思ってたより見つからなかったため、メモ用として本記事を残しておく。（調べ方が悪いだけかもしれないが...）
CloudFormationでS3とDynamDBを作成する

S3のテンプレートは以下になります。

```yaml:create_s3.yaml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
```

DynamoDBのテンプレートは以下になります。

```yaml:create_ddb.yaml
Resources:
  DDBTable:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: "ArtistId"
          AttributeType: "S"
      KeySchema:
        - AttributeName: "ArtistId"
          KeyType: "HASH"
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 5
```

スタックの作成と削除は以下のコマンドでおこないます。

```console:create-s3
aws cloudformation deploy --template-file create_s3.yml --stack-name my-s3
```

```console:create-ddb
aws cloudformation deploy --template-file create_ddb.yml --stack-name my-ddb
```

```console:delete-s3
aws cloudformation delete-stack --stack-name my-s3 
```

```console:delete-ddb
aws cloudformation delete-stack --stack-name my-ddb
```

最後まで読んでいただきありがとうございました。
AI学習のためのPython学習計画　進展管理


# 背景と目的
ChainerによるPythonの学習がひと段落しそうなので
計画の見直しをします

# 結論
下記で紹介する専門書を学習し、機械学習を使ったアプリケーションをアウトプットする。<br>
頑張ります！！！

# 内容
##**とりあえずさらっと学習済み**

* 機械学習に必要な数学
* Python
* 機械学習に関する知識
* 微分（偏微分まで)
* 線形代数
* 基礎統計（平均、分散、標準偏差など）
* 単回帰分析の数学
* 重回帰分析の数学
* Python(Chainer)
* ニューラルネットワークの計算（順伝播）, 線形変換, 非線形変換 ,ニューラルネットワークの計算（逆伝播）
誤差逆伝播法, 勾配降下法, ミニバッチ学習

##次に勉強予定（基本的に専門書で触る程度のことはできそう）
この本で勉強します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764781/fd68b30e-38ee-e714-304b-cae83f7359d2.png)

* **ニューラルネットワークの実装（TensorFlow もしくは PyTorch）**


* 教師あり学習の代表的なアルゴリズム(書店をあさった結果、「機械学習」の専門書の勉強が必要そう）　

重回帰分析, リッジ回帰, ラッソ回帰, ロジスティク回帰, k 近傍法, サポートベクトルマシン, 決定木, ランダムフォレスト, 教師なし学習の代表的なアルゴリズム, k 平均法, 主成分分析, ハイパーパラメータの代表的な調整方法, グリッドサーチ, ランダムサーチ, ベイズ最適化, 分類の代表的な評価指標, 正解率, 適合率, 再現率, F 値</b>




##さらに次のステップ
下記は、作りたいプログラムに応じて適宜勉強したら良さそうなので、学ぶ順番としては今ではなくて後半になりそう

<b>画像データ, 畳み込みニューラルネットワーク (CNN), 物体検出のアルゴリズム (R-CNN 、YOLO 、SSD など), セマンティックセグメンテーションのアルゴリズム, 文章データ, 文章データの特徴抽出方法（Bag of words 、Word2Vec など）, 機械翻訳のアルゴリズム (Seq2Seq 、Attention など)<br>
時系列データ（1/1 の来店者数は 100 人のデータに前後関係が存在するデータ）
再帰型ニューラルネットワーク (RNN 、LSTM 、GRU など)
畳み込みニューラルネットワーク (CNN)<br>
表データ（Excel のシートに記載されるようなデータ）
特徴量エンジニアリング
発展的な機械学習アルゴリズム (XGBoost 、LightGBM など)</b>
</ul>
AWS SAMでLambdaとAPI Gatewayをデプロイする

SAMアプリケーションの作成
```sam init```
SAMアプリケーションのビルド
```sam build```
SAMアプリケーションのパッケージ化
```sam package --s3-bucket test --output-template-file out.yaml```
SAMアプリケーションのビルド
```sam deploy --template-file out.yaml --stack-name test --capabilities CAPABILITY_IAM```

最後まで読んでいただきありがとうございました。
ラズベリーパイをモニターに接続しても映らない原因を解消する

# 前提条件

ラズパイのOSインストールは終了している

## 対象モデル

Raspberry Pi4 Model B RAM4GB

## 起動時に最初は映るが途中で消える

消える原因となる動作

- マウスを動かす
- ピカピカ系のゲーミングマウスを接続している
- Chromiumを起動もしくはタブを増やす

## 解像度の高いモニターに接続することが原因かも

初めはEizo Flexscan 27.0 UHDモニターに接続していたのですが、
ネットでラズパイのモニター購入でググると3.0~5.0インチのモニターが大量に出てきました。もしかしたら高解像度のモニターはメモリ不足になってるのかもと思い、DELL 21.0 FHDのモニターに接続し直したところ問題なく映りました。

その後は、Chromiumで複数タブを開いたり、ターミナルでコマンドを入力してみたり、Qiitaから記事を書いてみたりしても途中で消えることはなくなりました。

## その他の消える原因となること

- HDMIの差し込み口が錆びている or モゲかかっている
- HDMIケーブルそのものが不良品
- OSがだめ
- 基盤自体が損傷している可能性もあり

## 長く利用するためのおすすめ

- なるべくケースに入れる
- 高熱になることがあるので冷却ファンは付ける
WorkSpacesログイン時にログインした人に通知する(SlackのDMを使う)

以下を参考にさせていただきました
**WorkSpacesのログイン**
CloudWatch イベント を使用して WorkSpaces をモニタリングする
https://docs.aws.amazon.com/ja_jp/workspaces/latest/adminguide/cloudwatch-events.html

**Slackの通知**
LambdaからSlackへ通知
https://ajike.github.io/lambda-to-slack/

## やりたいこと
WorkSpacesにログインした際にログインした人にDMを送る
送信元IP制御／MFA／クライアント証明書認証など、不正ログインを防ぐ手段がありますが都度通知が出る様にしておけば不正ログインを検知し何らかの対策を打つことができるかと思います。

### EventBridgeのルールを作る
イベントパターン

```
{
  "source": [
    "aws.workspaces"
  ],
  "detail-type": [
    "WorkSpaces Access"
  ]
}
```

### Lambdaでイベント検知時にSlackに通知する
WorkSpacesのログイン時は以下のような形でログインしたユーザの情報を得ます

```json:WorkSpacesAccessEvent
{
  version: '0',
  id: '02049a21-2925-30d3-613c-24ac6af36081',
  'detail-type': 'WorkSpaces Access',
  source: 'aws.workspaces',
  account: '<Account>',
  time: '2020-10-24T09:07:59Z',
  region: 'ap-northeast-1',
  resources: [],
  detail: {
    clientIpAddress: '<ClientIP>',
    actionType: 'successfulLogin',
    workspacesClientProductName: 'WorkSpaces Desktop client',
    loginTime: '2020-10-24T09:07:53.640Z',
    clientPlatform: 'OSX',
    directoryId: 'domain/d-<directoryId>',
    workspaceId: 'ws-aaaaaaaaa'
  }
}
```

workspaceIdを受け取り、idとSlackのmemberidを関連付けてchat.postMessageにリクエストを送付します。


```javascript:index.js
'use strict';

const HTTPS       = require('https');
const QUERYSTRING = require('querystring');
const wsidtoslackid = {
    'ws-aaaaaaaaa' : { 'name' : 'kai.kusakari', 'slackuserid':'NAMENAMEN'},
    'ws-bbbbbbbbb' : { 'name' : 'bbb.kusakari', 'slackuserid':'xxxxxxxxx'},
    'ws-ccccccccc' : { 'name' : 'ccc.kusakari', 'slackuserid':'xxxxxxxxx'},
}
const SLACK_HOST = 'slack.com';
const SLACK_PATH = '/api/chat.postMessage';
const SLACK_TOKEN = 'xoxb-<token>';
let SLACK_CHANNEL = ''

exports.handler = (event, context, callback) => {
    const SLACK_CHANNEL = wsidtoslackid[event.detail.workspaceId].slackuserid;
    let message = "WorkSpacesへのログインを検知しました。身に覚えがない場合は報告してください";
    sendSlack(message, context, "this");
    console.log(message);
};

function sendSlack(message, context){
    let formData = {
        token     : SLACK_TOKEN,
        channel   : SLACK_CHANNEL,
        text      : message
    };

    let options = {
        hostname: SLACK_HOST,
        path    : SLACK_PATH,
        method  : 'POST',
        headers : {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
    };

    let req = HTTPS.request(options, function(res) {
        res.on('data', function(d) {
            console.log(d + "\n");
        });
    });

    req.write(QUERYSTRING.stringify(formData));
    req.on('error', function(e) {
        console.log("Slackにメッセージを送信できませんでした\n" + e.message);
    });
    req.end();
}
```

これでWorkSpacesログイン時にSlackにインストールしたAppから個人宛てにDMを受け取ることができます。
Chainerによる機械学習のためのPython学習メモ　13章 ニューラルネットワークの訓練 〜Chainer完了

#What
Chainerを利用して機械学習を学ぶにあたり、私自身が、気がついた点、リサーチした内容をまとめる記事になります。今回は、ニューラルネットワークの訓練について勉強します。

私の理解に基づいて記述しているため、間違っている場合があります。間違いは都度修正するつもりです、ご容赦ください。

#Content
##ニューラルネットワークの訓練
端的に言えばモデルの精度をあげること、ユーザーからしたら賢くすること

###目的関数
ニューラルネットワークも一段掘り下げれば、つまり目的関数を最適化することになる。下記、代表的な２種類の目的関数が紹介されている。
<ul>
<li>**回帰問題でよく用いられる平均二乗誤差 (mean squared error)**</li>
<li>**分類問題でよく用いられる交差エントロピー (cross entropy)**</li>
</ul>

平均二乗誤差はモデルのパラメータの最適解を求める時に、バチっと一つの解がもとまる手法であるのに対して、
確率的にこっちの方がありえるかなぁ〜を予測する方法が交差エントロピーという理解をしてます。

###目的関数の最適化
勾配降下法・・・名前の通り勾配からパラメータを更新していく方法
ミニバッチ学習法・・・データセットを複数の組みにしてそれぞれの目的関数を導出。そして、目的関数の平均値をとることでパラメータを更新していく方法（正直よくわからない）

###活性化関数
活性化関数の勾配の値が小さいと各層のパラメータも小さくなってしまう。これを勾配消失という。
活性化関数って何か制約があるのでしょうか？（発散しないとか、収束するとか・・・）
確率として出力するから１以下になるようにしないといけない？？？
そこでReLU関数が紹介されているけど、誰がどうやって見つけたんでしょうか・・・？
また詳細がわかったら更新します。

勾配消失の問題が解決されたことによってディープラーニングが可能になったのかな

#Comment
とりあえず、機械学習の概要は掴めてきました。
次は、具体的にプログラムを何か作ってみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764781/da16228a-c085-9909-57cb-07a58eea99de.png)

というわけで、この本を購入しました。正直、知識が浅すぎて何買えばいいのかわからなかったのですが、目次を索引を見ると、
**Chainerで学習したライブラリを使っているので実戦向き**
**Webアプリケーション作成について紹介があり、プログラムを一般公開するのに役立ちそう**
だったので購入を決めました。

なので、この本勉強して
**STEP.1 機械学習の実戦
STEP.2 Pyhtonをアプリ公開レベルまで使いこなす**

を次の目標に頑張ります。
Django Customコマンドの中に潜ってみる [1]

# はじめに
初記事投稿になります。
勉強した事を何か形に残る形で残したいと思い始める事にしました。

djangoを深く使いこなす事をモットーに最近は勉強しております。
本記事は、djangoのカスタムコマンドについての勉強の足跡です。

# 目次
1. djangoカスタムコマンドとは
2. カスタムコマンド利用の前準備
3. カスタムコマンドの作り方
4. カスタムコマンドの流れ
5. カスタムコマンドのカスタマイズ
6. まとめ

# 1. djangoカスタムコマンドとは
CUIで、pythonスクリプトを実行できる仕組みであり、

・djangoの各種機能(db ORM等)が使える
・コマンドの管理がラク

といった利点があります。後者は、

-利用できるコマンドを一覧表示-

```
python manage.py --help
```


```
[shop]
    customcommand
    cusyomcommand2
    ...
```

-カスタムコマンドの説明を表示-

```
python manage.py customcommand --help
```

```
usage: manage.py customcommand2 [-h] [--version] [-v {0,1,2,3}]
                                [--settings SETTINGS]
                                [--pythonpath PYTHONPATH] [--traceback]
                                [--no-color] [--force-color] [--skip-checks]

データを格納する関数
```

このような事が可能です。

# 2. カスタムコマンド利用の前準備
(1) アプリケーションを作成(今回はscriptという名前で作成)

```
python manage.py startapp script
```

(2) management/commandsの階層構造を作成

```
script/
  ├── management/
         ├── commands/
  ├── admin.py
  ├── apps.py
  ├── models.py
  ├── tests.py
  └── views.py
```

(3) スクリプトファイルをcommands以下に入れる
　 ここでは、customcommand.pyという名前で作成します

# 3. カスタムコマンドの作り方
基となるBaseCommandクラスのコメントを読むと、"コマンド実行のフローを変えない場合は、BaseCommandクラスを継承したCommandという名の子クラスを利用すれば良い"という旨が書かれているので、基本的には以下の構成で大丈夫だと思います。

```python:customcommand.py

class Command(BaseCommand):

    # オーバーライドしたhandle関数にスクリプトで処理したい内容を記述
    def handle(self, *args, **options):
        pass

```

# 4. カスタムコマンドの流れ
本題のカスタムコマンドがどのように呼ばれ、どのような関数を経由して処理を行うかのお話です。

処理の流れは以下になります。

1. ```python manage.py customcommand```の実行

2. Commandクラスの呼び出し

3. run_from_argvメソッド

4. create_parserメソッド

5. add_argumentsメソッド

6. parse_argsメソッド

7. executeメソッド

8. handleメソッド


run_from_argvという関数が全体の処理の流れを表して、その他の関数内で細かい処理をしているようなイメージを受けました。よって、4以降の細かい処理の概念を以下に記します。

### 4. create_parserメソッド
引数は[コマンドライン引数[0], コマンドライン引数[1]]の形式
->今回の例なら、['manage.py', 'customcommand']

まずmanage.pyのファイル名の切り出しを行います。
->manage.pyをフルパスで記載した場合はここでmanage.pyのみ取り出される。

次にParserオブジェクトを作成します。
Parserオブジェクトは以下のような属性を持ちます。
-prog: "manage.py customcommand" (命令をスペースで区切ったもの)
-description: help文 (self.helpで取得)
-formatter_class: (--versionといったあらかじめ決められたDjangoのhelpオプション)
など

※parserオブジェクト自体は予期される引数を持つイメージです。

### 5. add_argumentsメソッド
parserオブジェクトに処理で用いたい引数を追加します。例えば、
```parser.add_argument('parameters', nargs='+', type=int)```
とすれば、int型の1つ以上の引数を強制する事ができます。
->```python manage.py customcommand 3 5``` など

### 6. parse_argsメソッド
ここで実際に入力した命令群のフォーマットの確認を行います。
・--version等、Djangoのhelpオプションが来た場合はここで処理を終える
・入力フォーマットが違う場合は、予期される引数(parserの中身)を標準出力する


### 7,8. executeメソッド, handleメソッド
6の処理でフォーマットチェックを通過した場合のみexcuteメソッドに渡され、handleメソッドに渡されます。
※5の処理で、引数を追加した場合はhandleメソッドのoptions引数から参照する事ができます。

# 5. カスタムコマンドのカスタマイズ
### コマンドのヘルプ文の追加
```python

help = '～する関数'
```
help引数を定義しておけばOK

### 引数の追加
[ArgumentParserの使い方を簡単にまとめた](https://qiita.com/kzkadc/items/e4fc7bc9c003de1eb6d0)
こちらの記事で詳しく解説されていました。


# 6. まとめ
色々と調べましたが、よっぽどhandle関数とadd_arguments関数、後はhelpの追加くらいを押さえて置いたら大丈夫そうな印象を受けました。
parseオブジェクトの概念に関しては、可変な引数の扱いなどで広く使われていそうなので、勉強になりました。
Windows10でTypeScriptによるCreateReactAppを実行するための環境構築

# はじめに
Windows10 64bitでTypeScriptでReact Appを生成するまでの環境構築方法をまとめておきます。

# Chocolateyをインストール
Windows用のパッケージマネージャーChocolateyをインストールします。
ソフトウェアのインストールと更新、削除が簡単にできるようになります。

[Chocolatey Software | Installing Chocolatey](https://chocolatey.org/install#installing-chocolatey) にあるコマンドを管理者権限のPowerShellで実行します。
インストール終了後は、バージョン確認出来たらOKです。

```
> choco -v
```

# nodistのインストール
nodistを使ってNode.jsをバージョン管理します。

Chocolateyを使ってnodistをインストールします。
管理者権限のコマンドプロンプトで実行します。
インストールしてバージョン確認します。

```
> choco install -y nodist
> nodist -v
```

開発時はLST推奨版のバージョンで開発を行うことが多いと思います。
[Node.js](https://nodejs.org/ja/)からLST推奨版のバージョンをインストールします。
(2020/10/25時点では、v12.19.0が最新でした)

```
> nodist + 12.19.0
```
globalで使用するバージョンを指定しないとデフォルト指定されずインストールしたのに何故か古いバージョンで動いているといったことになるため注意が必要です。
Node.jsのバージョンを確認します。

```
> nodist global 12.19.0
> node --version
```

[Windowsで、Chocolateyとnodistで、バージョン切り替え可能なNode.jsの環境を構築する - Qiita](https://qiita.com/masatomix/items/bcb0e7c64013e61af4d4) より  

# yarnのインストール
JavaScriptのパッケージマネージャyarnをインストールします。
npmよりインストール速度が速く厳密にバージョンを固定出来るのが特徴です。
バージョンはyarn.lockファイルに記録されてインストール時に同じバージョンがインストールされます。

検索するとnpmがいまだに多いので、 [npmとyarnのコマンド早見表 - Qiita](https://qiita.com/rubytomato@github/items/1696530bb9fd59aa28d8) 見ながらコマンド実行しています。


Chocolateyを使ってyarnをインストールします。
管理者権限のコマンドプロンプトで実行します。
インストールしたらパスを指定しておきます。

```
> choco install yarn
> set Path = %Path%;"C:\Program Files (x86)\Yarn\bin"
```
コマンドプロンプトを再起動してバージョン確認します。

```
> yarn -v
```

このあとCreate React Appを使うのにnpxを使いたい場合、
nodeistからだと自動でnpxがインストールされない(さらにnpmが古い)ため個別でインストールします。
今回は、v6.14.8をインストールしました。

```
> nodist npm global 6.14.8
> npm install -g npx
```

[Chocolateyからyarnをインストールする手順 - Qiita](https://qiita.com/takupang/items/3cc259cdad3be9c6eb3a) より  

# React Appの生成

Create React Appを使ってReact Appを生成します。

npxは、npmパッケージを実行するコマンドです。
ローカルにインストールされていないコマンドの場合は、最新版をダウンロードして実行した後、そのコマンドのパッケージを削除してくれます。
詳しくは、[npm 5.2.0の新機能！ 「npx」でローカルパッケージを手軽に実行しよう - Qiita](https://qiita.com/tonkotsuboy_com/items/8227f5993769c3df533d) 参照。  

```
npx create-react-app hello-world --template typescript
```

因みにnpmのバージョンを挙げていないとCreate React Appを使う時に以下のエラーが出ます。

```
npm ERR! cb.apply is not a function
npm ERR! A complete log of this run can be found in:
```

公式ドキュメントによるReact + TypeScriptのスタートガイドは以下です。
[microsoft/TypeScript-React-Starter: A starter template for TypeScript and React with a detailed README describing how to use the two together.](https://github.com/Microsoft/TypeScript-React-Starter#typescript-react-starter)
VirtualBoxを使ってMacにCentOS8の仮想環境を構築

# 概要
* MacにCentOS8の仮想環境を構築する
* 環境構築にはVirtualBoxを使う

# 目的
* サーバー向けOS（Linux）の学習

# 前提
* インストールするCentOSのバージョンは8

# 手順
1. VirtualBoxのインストール
2. CentOS8のダウンロード
3. 仮想環境の構築
4. ハマりポイント

## 1. VirtualBoxのインストール
1. [VirtualBox](https://www.virtualbox.org/)のサイトへアクセス
2. 「Download VirtualBox x.y」のボタンをクリックし、[ダウンロードページ](https://www.virtualbox.org/wiki/Downloads)へ遷移
3. 「VirtualBox binaries」の「VirtualBox x.y.z platform packages」の「OS X hosts」のリンクをクリックし、.dmgファイルをダウンロード
4. ファイルをダウンロードしたら、ファイルを開き、1の「VirtualBox.pkg」をダブルクリック
5. 手順通り進め、インストールを完了させる

## 2. CentOS8のダウンロード
1. [CentOS](https://www.centos.org/)のサイトへアクセス
2. ヘッダーの「Download」をクリックし、[ダウンロードページ](https://www.centos.org/download/)へ遷移
3. 「CentOS Linux」の「8 (2004)」のISOが「x86_64」のリンクをクリックし、「The following mirrors ...」のメッセージ配下のいずれかのリンクをクリック（※どれを選んでもOK）
4. リスト内の「dvd」の文字列を含む.isoファイルをクリックし、ダウンロードする

## 3. 仮想環境の構築
### 3.1 仮想環境の作成
1. VirtualBoxを起動
2. 「新規(N)」をクリック
3. 「名前とオペレーティングシステム」の画面で下記※の表の通り入力し、「続き」をクリック
4. 「メモリーサイズ」は、デフォルトのまま（1024MB）でOK。「続き」をクリック
5. 「ハードディスク」は、デフォルトのまま（仮想ハードディスクを作成する）でOK。「作成」をクリック
6. 「ハードディスクのファイルタイプ」は、デフォルトのまま（VDI(VirtualBox Disk Image)）でOK。「続き」をクリック
7. 「物理ハードディスクにあるストレージ」は、デフォルトのまま（可変サイズ）でOK。「続き」をクリック
8. 「ファイルの場所とサイズ」は、場所はデフォルトのままでOK。サイズはデフォルトのまま（8.00GB）か任意のサイズへ変更。「作成」をクリック

※3の入力項目↓

|項目|入力|
|:--|:--|
|名前|※任意（「CentOS 8」などで）|
|マシンフォルダー|※デフォルトのままでOK|
|タイプ|Linux|
|バージョン|Red Hat（64-bit）|

### 3.2 仮想環境のセットアップ
1. 作成した仮想環境を選択し、「起動(T)」をクリック
2. 起動ディスクの選択画面になるので、ダウンロードしたCentOS8の.isoファイルを選択。「start」をクリック
3. 黒い画面になるので、「Install CentOS Linux 8.y.z」を選択しreturn
4. 言語設定画面になるので、「日本語」を選択し「続行(C)」をクリック
5. 「インストール概要」の画面になるので、以下6~8の内容を確認／設定していく
6. 「時刻と日付(T)」：「アジア」>「東京」に変更
7. 「ソフトウェアの選択(S)」：※デフォルトのままでOK（サーバー(GUI使用)）
8. 「インストール先」：※デフォルトのままでOK
9. 6~8を完了したら、「インストールの開始」をクリック
10. インストールが開始するので、完了までの間に「rootパスワード(R)」と「ユーザーの作成(U)」の設定を行う（※「ユーザーの作成(U)」の際は、「このユーザーを管理者にする(M)」にチェック）
11. インストール完了後、「再起動」をクリック
12. ログイン画面が出れば完了

## 4. ハマりポイント
### 4.1 画面サイズが小さい
デフォルトのままだと画面サイズが小さくて操作しづらいので、以下の手順で画面サイズを大きくする。

1. 「設定(S)」をクリック
2. 「ディスプレイ」をクリック
3. 「スクリーン」の「表示倍率」の倍率を上げる（200%くらいに）

### 4.2 インストールのループ
デフォルトのままだとCentOSのインストールのループ（3.2の作業のループ）に陥るので、以下の手順で設定を変え、ループを回避する。

1. 「設定(S)」をクリック
2. 「システム」をクリック
3. 「起動順序」を「ハードディスク」→「光学」へ変更
【超初心者】PythonでMastodonのAPIを叩く

最近メインのSNSとしてMastodonを使っているので試しに何かbotでも作ってみるかと思い、備忘録代わりに

##アクセストークンの取得
APIを叩くためのアクセストークンを取得します。
Mastodonのホームから
**ユーザー設定→開発→新規アプリ**
でこのページにたどり着くはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625910/71cfc859-0f31-8430-763d-fc520fd661e7.png)
このページでアプリの名前を適当に入力して、下のほうにある**送信**を押すと
先ほど入力した名前が表示されているのでそこを押すと

**クライアントキー
クライアントシークレット
アクセストークン**

というのが表示されると思います。
この後必要となるのはアクセストークンのみです。
このページはいつでも見れるので覚えておく必要はありません。

##Tootしてみる
以下のコードでtootできます。

```python:toot.py
import requests
headers = {'Authorization': 'Bearer xxxxxxxxxxxxxxxxx'}    #xxxxxxxxxxxxxxxxxに自分で取得したアクセストークンを入れる。
host = "https://example.com/api/v1/statuses"    #example.comを自分のインスタンスのドメインに変更する。
toot = ""   #toot本文
content = toot.encode()    #エンコードしないと動かない
data = {'status': cotent}
post = requests.post(host, headers=headers, data=data)
print(post.status_code)
```

必要なライブラリはrequestsだけなので非常に簡単にtootすることができます。
コードに直接Access tokenを記述するのはセキュリティ上好ましくないのでその辺は適宣かえて使用してください。
tootするにあたってtootする文章をエンコードしないとうまく動かないらしく、そので手こずってしまいました。
これで200が出力されていれば無事tootができます。

tootしたい文をテキトーに作って持ってきてcronで回せばbotの完成です。
C# .NetCoreで、ボートレース結果解析　してみよう

# 本ページは意気込みを語っています。

## 概要
ボートレース（競艇）は公式サイトにてレース結果や選手情報を
データ無料で取得できるようになっています。
そのデータをまとめて、いろんな角度からデータを解析を行えるように
することを目的としています。

## 環境
- Windows10
- Visual Studio Community 2019
- C# .Net Core
理由は特にないです。慣れてるからだけ。
pythonも考えたけど、まずは勝手掴んでいるC#でやってみる。

## リンク
C# .NetCoreで、ボートレース結果の解析　前調査
https://qiita.com/TamanegiTarao/items/02a634c36131ca85837e
C# .NetCoreで、ボートレース結果の解析　構造検討
https://qiita.com/TamanegiTarao/items/04f43d96e50cb3eeaa03
C# .NetCoreで、ボートレース結果の解析　読み込みその1
https://qiita.com/TamanegiTarao/items/33284c3111a547b0ee8d
C# .NetCoreで、ボートレース結果の解析　読み込みその2
https://qiita.com/TamanegiTarao/items/ca2d15ed550d87da6ed2
C# .NetCoreで、ボートレース結果の解析　スタ展スクレイピング
https://qiita.com/TamanegiTarao/items/0d7d4a1e0452c866c2fd

Github
https://github.com/TamanegiTarao/BoatRaceResultReader/tree/master


## 終わりに
ご意見、感想ございましたらお気軽に。
モチベーションにつながると思います。
【PHP】配列のnullチェック

foreachで使う変数がnullの場合エラーが起こるため事前に配列の中身をチェックします。

#変数のnullチェック
通常、変数に値があるかどうかを確認したいのであればempty()やisset()関数を用いることが多いと思います。

```index.php
    if(!empty($array)){
        foreach($array as $value){
            処理
        }
    }
```

```index.php
    if(isset($array)){
        foreach($array as $value){
            処理
        }
    }
```

上記の場合、変数の中身が配列で確定しているのであれば問題ないですが、単なる変数のnullチェックになるので中身が配列型で入って来ているかの確認はできません。

#変数が配列型かどうかをチェック
```index.php
    if(is_array($array)){
        foreach($array as $value){
            処理
        }
    }
```
is_array関数を使えば変数の中身が配列型かどうかの確認ができます。

もっと簡潔に書く場合、変数を配列にキャストさせるといった書き方もできるみたいです。

```index.php
    foreach ((array)$array as $value) {
        処理
    }
```

参考文献：
https://quartet-communications.com/info/topics/7094
勉強ノード　Kotlin（1）

##Kotlinの変数宣言は？
2種類キーワードがある。

+ val
+ var

valキーワードで宣言した変数は一度値を割り当てした後に再度割り当てするのはできない。つまり、JAVAだったらFINALキーワードをつけて宣言した変数と同じ。
逆に、varで宣言した変数は何度も値の割り当てができる。

##Kotlinで変数を宣言してみよう！

```Kotlin:Kotlin
var name: String = "Mori"
name = "Tanaka"
// セミコロンはつけてもいいし、つけなくてもエラーにならない
```
```Kotlin:Kotlin
val age: int = 17
age = 30
// valで宣言した変数に２回も割り当てることはできないため、エラーになる
// int以外にもByte, Short, Long, Float, Doubleなども使える
```

##型の推論とは？
Kotlinでは変数の宣言し、型を明確に指定せずに宣言するのもできる。例えば、

```Kotlin:Kotlin
var subject = "math"
upperCaseName = subject.toUpperCase()
```

上記のように型を指定しなかったsubject変数を宣言してもエラーにならない。subjectはコンパイラがコンパイルする際、変数の型をStringだと推論するため、toUpperCase()メソッドは正常に動作する。

実に便利そうだが、注意することもある。

```Kotlin:Kotlin
var subject = "math"
subject.inc()
// コンパイルエラー発生
```

上記のコードで、String型に推論している変数subjectのメソッドincをコールしているが、incはString型には存在しないメソッドであり、コンパイル時エラーになってしまう。

##Nullable変数
初期値でNull値が持たないデータ型について、Null値を持つことを許可する変数

```Kotlin:Kotlin
var grade: Strubg = Null
// コンパイルエラー発生
```

通常、上記で宣言するとエラーが発生するが、以下のようにNullable変数を宣言するとエラーが発生しない。

```Kotlin:Kotlin
var grade: Strubg? = Null
// コンパイルエラーにならない
```

こうするとString型変数gradeにはNullかStringか２種類のデータを割り当てられる。

##条件分岐と変数宣言の結合
Kotlinでは変数の宣言とその値の割り当て（条件による）を一度の記述で全部解決できる。下はその例


```JAVA:JAVA　①
int score = 93;
String grade;

if (score >= 95) {
    grade = "A+";
} else if (score >= 90) {
    grade = "A";
} else {
    grade = "B+";
}

System.out.printLn(grade);
```

```Kotlin:Kotlin　②
var score = 93
var grade: Strubg = if (score >= 95) {
    "A+"
} else if (score >= 90) {
    "A"
} else {
    "B+"
}

println(grade)
```

これよりも簡単にもできる。

```Kotlin:Kotlin　③
var score = 93
var grade = when { // 型推論により、Stringは記載しなくても大丈夫
    score >= 95 -> "A+"
    score >= 90 -> "A"
    else        -> "B+"
}

println(grade)
```

①と②と③は機能的には完全に同じ処理をするが、③のように圧倒的に可読性良いコードにも実装できる。


##参考
[参考１](https://developer.android.com/kotlin/learn?hl=ja)
ANACONDA仮想環境をPycharmで使用時のPATH(Mac 2020/10/03時点)

#結論
Mac環境で、__Anaconda(Django/Python) + PyCharm__での開発環境を作成した時、PycharmでAnaconda仮想環境を紐づけるためののPathが変わっていました（2020/10/03時点）。

```
/opt/anaconda3/envs/(ANACONDAで作成した環境名)/bin/python
```
[[Python Django 3 RestFramework + Angular 9]でWebフルスタック完全攻略](https://www.udemy.com/course/angular-9-python-django-3-restframeworkweb/)
こちらを学習時つまづいたPATHは、2020/10/03時点で変更されたようです。
#詳細
+ Mac環境（MacBook Pro　13inch 2020 / MacOS Catalina）
+ __ANACONDA__でDjango/Pythonの仮想環境を作成(ANACONDA NAVIGATOR 4.8.3)  
 + ANACONDA NAVIGATOR → Environments → Create  → 
 + popupmenuでるので仮想環境名とpythonのバージョンはそのままにしてcreate押下で抜けると設定した仮想環境ができる
 + 上で指定した仮想環境名の横の▶︎を押下し、Open terminalでターミナルが使える
 + ターミナルから以下をpip innstall
 + django 3.0.4　djangorstframework 3.11.0

+ __PyCharm__でANACONDAの仮想環境をコーディングできるようセットアップ(PyCharm  2020.2.3 (Community Edition))
 + 任意の場所(私はユーザーホーム直下)にPyCharmプロジェクト用のフォルダを任意名で作成
 + PyCharmから上で作ったフォルダを作成
 + Pycharm →　Preferences →　Project:PyCharmプロジェクト名/Project Interpreter →　⚙  →　Add...

これで以下の状態になり、Existing environment を選択し、Interpreter:のパスを選ぶと、PyCharmのプロジェクトにANACONDAの仮想環境が紐づく。
![スクリーンショット 2020-10-03 17.47.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647868/853b767d-3fd3-1066-57d7-ef1482d1631b.png)

+ Pathは以下のキャプチャにあるように

```
/opt/anaconda3/envs/(ANACONDAで作成した環境名)/bin/python
```
![スクリーンショット 2020-10-03 17.55.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647868/7539d9bd-18b3-98d1-7ba4-2afce95e31ff.png)

つまづいたのは、PyCharmからANACONDA仮想環境にひもづけるためのPATHが変更されていたことです。
このPATHを見つけるのに一苦労しました…。(2020/10/03時点)
【WordPress】画像のアップロード時にファイル名を記事IDに変更する


##説明
WordPressの投稿画面から画像をアップロードする際、画像のファイル名を記事IDに合わせて自動で変更します。

##ご注意
・記事の投稿画面（ブロックエディタ、クラシックエディタ）から画像をアップロードして挿入する場合のみ動作確認済みです。
・メディアライブラリへ直接アップロードする場合、画像ファイル名は変更されますが、メディアタイトルとして元のファイル名が残ります。
・変更は自己責任でお願いいたします。

##コード
以下をfunctions.phpに貼り付けてください。

```funtions.php
function rename_file($filename) {

    global $filename_new;

    // 記事ID取得 (クラシックエディタ)
    $post_id = isset( $_POST['post_id'] ) ? (int)$_POST['post_id'] : ''; 
    // 記事ID取得 (ブロックエディタ)
    if( !$post_id ){
        $post_id = isset( $_POST['post'] ) ? (int)$_POST['post'] : ''; 
    }

    // ファイル拡張子を取得
    $ext = pathinfo( $filename, PATHINFO_EXTENSION );   

    // 記事IDをファイル名とする
    if( $post_id ){
        $filename_new = $post_id;

    // メディアライブラリへ直接アップロードした場合のファイル名（日付時刻）
    }else{
        $filename_new = date_i18n('ymdHi');
    }
    //ファイル名＋拡張子を出力
    return $filename_new.'.'.$ext;
}

add_filter('sanitize_file_name', 'rename_file', 10);
```

参考：[ねんでぶろぐ](https://nendeb.com/)様
>日本語名の画像ファイルアップロード時、ファイル名を英数字に変更する(ブロックエディタ対応) 
https://nendeb.com/815


クラシックエディタを使った場合、ファイル名の変更はされますが、メディアタイトルとして元のファイル名が残ってしまうようです。
対策として、以下のコードを追加してタイトルの設定をします。


```funtions.php
function rename_media_title($response, $attachment, $meta){
    global $filename_new;
    //変更後のファイル名をメディアタイトルに使用
    $response['title'] = $filename_new;
    return $response;
}
add_filter('wp_prepare_attachment_for_js', 'rename_media_title', 10, 3);
```

参考：[わんどのweb](https://wandonoweb.com/)様
>WordPressで画像のtitle属性の初期値を変更する | わんどのweb 
https://wandonoweb.com/wordpress%E3%81%A7%E7%94%BB%E5%83%8F%E3%81%AEtitle%E5%B1%9E%E6%80%A7%E3%81%AE%E5%88%9D%E6%9C%9F%E5%80%A4%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B/)様

これでブロックエディタ・クラシックエディタともに、画像ファイル名・メディアタイトルが自動で変更されます。
XGBoostの説明変数の重要度可視化

#内容
クラスラベルのエンコーディング
説明変数の重要度の可視化

#コード

```python:qiita.py
import pandas as pd
from sklearn import datasets
from xgboost import XGBClassifier
from xgboost import plot_importance
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt

iris=datasets.load_iris()
df=pd.DataFrame(iris.data, columns=iris.feature_names)
df['target']=iris.target_names[iris.target]

#クラスラベルのエンコーディング
class_mapping={label:idx for idx, label in enumerate(np.unique(df['target']))}
df['target']=df['target'].map(class_mapping)

#データの分割
y=df['target']
features=['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']
X=df[features]

train_X,val_X,train_y,val_y=train_test_split(X,y,test_size=0.3)


#学習
param = {'max_depth': 2, 'eta': 1, 'objective': 'multi:softmax', 'num_class': 3}
xgb_model = XGBClassifier(param)
xgb_model.fit(train_X, 
              train_y)

#可視化
plt.rcParams["figure.figsize"] = (15, 6)
plot_importance(xgb_model)
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/ee0af7c0-ee16-13f3-1914-229e87caa5a3.png)
[CodeIgniter]バリデーションのエラーメッセージの前後に付与する文字列を変更する方法

#はじめに
バリデーションのエラーメッセージにデフォルトで`<p>`タグが付与されます。

```
if ( $this->form_validation->run() )
{
    $data['error_message'] = $this>form_validation->error_string();
    $this->load->view('purchase_form', $data);
}

echo $data['error_message'];
/*
<p>名前 は必須項目です。</p>
<p>数量 は数値を入力してください。</p>
*/
```
今回、`<p>`タグを付与せず指定の文字列に変更する方法をまとめました。

#エラーメッセージの変更
**`set_error_delimiters()`**メソッドを使用します。
第一引数、第二引数でエラーメッセージの前後に付与する文字列を指定します。

```
$this->form_validation->set_error_delimiters('<div class="err">', '</div>');
$error_message = $this>form_validation->error_string();
echo $error_message;
/*
<div class="err">名前 は必須項目です。</div>
<div class="err">数量 は数値を入力してください。</div>
*/
```

#参考
[CodeIgniter Guide](http://www.ci-guide.info/practical/library/form_validation/)
ウォッチドッグタイマとは

#はじめに
組込みシステムの誤動作検知法として最もよく知られていて最も用いられているウォッチドッグタイマについてまとめる。
#ウォッチドッグタイマの仕組み
まず、パルス（幅の狭いHi信号）を入力すると一定時間Hi信号を出力するワンショット回路を用意する。
次に、アプリケーションプログラムに、プログラムのどの処理経路においても一定時間以内にパルスを出力し続けるパルス出力命令を記述する。
これにより、プログラムが正常に動作していれば一定時間以内にワンショット回路にパルス信号が入力され続けるため、ワンショット回路はHi出力をし続ける。
つまり、もしワンショット回路の出力がLoになったときはプログラムに何らかの異常があったということになる。
プログラムに異常があった場合にはプロセッサ（CPU）に割り込み要求をして、回復処理を実行させたり、非常停止させる。
#参考文献
坂巻佳壽美, トコトンやさしい組込みシステムの本, 今日からモノ知りシリーズ, 日刊工業新聞社, 2019年.
Pythonでcsvの中身を集計

##目的：今後スクレイピングで取得したデータをcsvにし、データの整形、分析を行いた為
####今回行うこと:csvに記入されている会議室と記入数を表示する

初学者です、Markdownの書き方すら調べながら行っているレベルです。
pyqで学習をしています。アウトプットは必須だと思ったので自分用に残そうと思っています。

###環境
pc:Macbook pro
python3 ver3.8.6


##ファイルの作成

ターミナルを使用してファイルを作成します。

```
~$cd Documents

~Documents$mkdir study

~Documents$cd study

~Documents/study$touch room.csv

~Documents/study$touch study.py

~Documents/study$ls
room.csv        test.py

--実行--
~Documents/study$python3 study.py
```
```room.csv
会議室A,一条
会議室B,七草
会議室C,十文字
会議室A,八代
会議室A,四葉
会議室A,三矢
会議室B,一条
会議室B,二木
会議室C,六塚
会議室A,十文字
会議室B,二階堂
会議室C,七瀬
会議室A,一色
```


```stury.py
#リスト初期化
book = {}
#csv読み込み　　
with open ('room.csv', encoding='utf-8') as f:

    #会議室A,山田
    for row in f:

        #空白を削除しリスト化
        columns = row.rstrip().split(',')


        room = columns [0]

        #２回め以降・・・
        if room in book:
           book[room] += 1
        
        #1回目{'会議室A': 1, '会議室B': 1, '会議室C': 1}
        else:
            book[room] = 1

#keys values items itemsは両方を持つから引数を２つ
#print(book) → {'会議室A': 6, '会議室B': 4, '会議室C': 3}

for room_name, count in book.items():
    print(room_name + ':' + str(count))




-----------result-----------

会議室A:6
会議室B:4
会議室C:3
```
【ラビットチャレンジ（E資格）】応用数学


#はじめに
本記事は、E資格の受験資格の取得を目的としたラビットチャレンジを
受講した際の勉強記録およびレポート記事である。

#第1章：線形代数_レポート

###参考図書
これなら分かる応用数学教室_最小二乗方からウェーブレットまで 
(金谷健一著 共立出版)
###単位行列
正方行列において主対角線上の要素がすべて1でその他がすべて0の行列を
単位行列Iという。
単位行列Iは、任意の行列 $A$ に対し$ AI = IA = A$ の関係が成り立つ。
(実際に計算すると確認できる。)
$$ I = \begin{pmatrix}
1 &   & \\\
  & 1 & \\\
  &   & \ddots \\
\end{pmatrix} $$

###逆行列
任意の行列Aにおいて下記の関係が成り立つ$A^{-1}$を逆行列という ( $I$：単位行列 )。
 $$ AA^{-1} = A^{-1}A = I $$

また行列式 (※後述) $|A|$ が0になる場合、行列Aの逆行列 $A^{-1}$ は存在しない。
$$|A| = 0$$
逆行列の求め方には、掃き出し方という方法がある。
###行列式
n個の未知数$x_1$,$x_2$,...,$x_n$に関する次の連立1次方程式を考える。

```math
\left\{
\begin{array}{l}
a_{11}x_1+a_{12}x_2+...+a_{1n}x_n=b_1 \\
a_{21}x_1+a_{22}x_2+...+a_{2n}x_n=b_2\\
                    ・\\
                    ・\\
a_{n1}x_1+a_{n2}x_2+...+a_{nn}x_n=b_n
\end{array}
\right.
```
行列$A$とベクトル $\vec{x}$, $\vec{b}$を
$$ A=\begin{pmatrix}
a_{11}&a_{12}&...&a_{1n} \\\
a_{21}&a_{22}&...&a_{2n}\\\
\vdots &\vdots&\ddots&\vdots\\\
a_{n1}&a_{n2}&...&a_{nn}\\\
\end{pmatrix}$$

$$ \vec{x}=\begin{pmatrix}
x_{1} \\\
x_{2}\\\
\vdots\\\
x_{n}\\\
\end{pmatrix}$$

$$ \vec{b}=\begin{pmatrix}
b_{1} \\\
b_{2}\\\
\vdots\\\
b_{n}\\\
\end{pmatrix}$$
と定義すると、上記連立1次方程式は次のように書ける。
$$A\vec{x} = \vec{b}$$
これが唯一の解を持つ必要十分条件は、行列$A$の行列式$|A|$が0でないことで
あることが知られている。
行列$A$の行列式$|A|$ (det$A$とも書く) は要素 $a_{11}$,...,$a_{nn}$ のn次式であり、次のように書く。
$$ |A|=\left|\begin{matrix}
a_{11}&a_{12}&...&a_{1n} \\\
a_{21}&a_{22}&...&a_{2n}\\\
\vdots &\vdots&\ddots&\vdots\\\
a_{n1}&a_{n2}&...&a_{nn}\\\
\end{matrix}\right|$$

$n = 2$　のときは次のようになる。
$$ \left|\begin{matrix}
a_{11}&a_{12}\\\
a_{21}&a_{12}\\\
\end{matrix}\right|=a_{11}a_{22}-a_{21}a_{12}$$

###固有値と固有ベクトル
行列$A$に対して$$A\vec{x} = λ\vec{x}$$となる定数$λ$と $\vec{0}$ でない$\vec{x}$が存在するとき、λを$A$の固有値, $\vec{x}$をそれに対する
固有ベクトルと呼ぶ。
###固有値分解
$n×n$対称行列$A$の固有値を　$\lambda_1$,　...　, $\lambda_n$ ,対応する固有ベクトルを$\vec{v_1}$,...,$\vec{v_n}$とし$\vec{v_1}$,...,$\vec{v_n}$を列とする行列を$V = (\vec{v_1},...,\vec{v_n})$とすると,次式が成り立つ。
$$AV=A(\vec{v_1},...,\vec{v_n})=(\lambda_1\vec{v_1}\lambda_2\vec{v_2}...\lambda_n\vec{v_n})=V\begin{pmatrix}
\lambda_1 &   & \\\
  & \lambda_2 & \\\
  &   & \ddots \\
\end{pmatrix} $$
上式の両辺の右から$V^{-1}$を掛けると次式が成り立つ。
$$A=V\begin{pmatrix}
\lambda_1 &   & \\\
  & \lambda_2 & \\\
  &   & \ddots \\
\end{pmatrix}V^{-1} $$
これを対称行列$A$の固有値分解と呼ぶ。

###特異値分解
正方行列以外でも固有値分解に似たことはできる。
$$ M \vec{v} = \sigma\vec{u} $$
$$ M^\top \vec{u} = \sigma\vec{v} $$
このような特殊な単位ベクトルがあるならば特異値分解できる。
$$M = USV^{-1}$$