OmniAICreator/Qiita-1.07M huggingface dataset:
DXライブラリのおさらい

#自己紹介

5年ほどプログラムを嗜んできた素人です。
DXライブラリでフライトシューティングや戦車ゲーム、FPSなどを作っています。
忘れないうちにC++×DXライブラリの知識を書き留めておきたいと思い今回から投稿していきます。

##おさらい

###DXライブラリとは

DXライブラリとは、

-ＤＸライブラリ Windows版は、DirectXを使ったWindowsデスクトップアプリの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたＣ＋＋言語用のゲームライブラリです。(使用する際はＣ言語の知識だけで大丈夫です)
--DXライブラリ置き場より

と、DirectX(3D、inputその他)やWin32、Xaudioなどをラッピングし使いやすくしたゲームライブラリとなっています。広義のゲームエンジンと言えますね。
固定機能風によるDirectX9相当の描画やキー入力、ステレオ3Dサウンドを実現します。

###長所
-DirectXをかなり楽に利用できる
--少なくとも何も書いていない画面を描画する為だけに100行近く書く必要が無いのは長所と言えるでしょう、手軽にDirectXを扱うことができます。
--内部的にはDirectX11で動かすことが出来るため、DirectX11の描画ハンドルを他APIに渡して…と言ったことが簡単にできます。
-C言語の知識だけで良い
--ライブラリで帰ってくる戻り値や引数がC言語準拠な構造体やポインタだけである為、C++の知識がなくても扱うことができます。

###短所
-DirectXの長所が活かされない
--DirectX(3D)では、HLSLを用いたシェーダーの柔軟なカスタマイズが可能です。しかしながらDXライブラリでは内部でこそDirectX9、9.0c、11が動いているとは言え標準では固定機能しか扱うことができません。
---逆に言えば固定機能パイプラインが廃止されたDirectX11以降でも相応のものが使えるという長所でもありますが…
--一応頂点、ピクセル、ジオメトリシェーダーは5.0まで対応されてはいるのですが、公式サンプルでは大抵DirectX9時代の2.0〜3.0で記載されており、デフォルトでDirectX11モードが選択されることもあって過去のシェーダーが動かない場合が多いです。
---9、9.0cモードを使えば良いだけの話ですが、後述のEffekseerが（おそらく）DirectX11でしか正常に動作しないようなので表現の幅が狭められる事になりかねません。
-上記に伴い、シェーダーを用いない標準機能のみではPS2レベルのグラフィックまでしか作り込めません。
--PS2もプログラマブルシェーダーとはほぼ無縁なハードでした。
---**ワンダと巨像**、**エースコンバット4**などで用いられたテクニックを用いて作り込んでいくことになります。しかし前者の開発の方曰く「悪く言えばどっちつかずの中途半端」な作り込みになると言えます。
-C言語相当である為変換処理が生じる
--C言語相当の文法で書けるのは長所ですが、逆にC++として利用する場合めんどくさい事態になります。
--例えば引数が配列の場合、わざわざvectorを配列として渡す必要があります。
--そのためDXライブラリを更にラッピングする自分のラッパーが必要になります。

短所の方が長くなりましたが、こんなところでしょうか。

##必要なものは？

DXライブラリでのゲーム開発にあたって必要なものは、
-最新版のDXライブラリ
--常にバグフィクスや機能追加が行われております、うまく動かない…と思っていたら実はライブラリの古いバグということは稀によくある為、できる限り最新版を利用しましょう。
-Effekseer for DXLib
--DXライブラリでパーティクルシステムを作って…などするよりはDXライブラリにも対応しているエフェクトライブラリを使ってしまいましょう。とても美麗なエフェクトが使用できます。

##あったら良い知識

-C++の知識
--vectorなどのSTLを積極的に使っていきましょう。書き方がシンプルになりデバッグもしやすくなります。
--ライブラリ側の引数がC言語基準であることは留意しましょう。
-高速化の知識
--後々まとめたいですが、DXライブラリの処理で重い軽いが分かっていれば無駄な処理を省けます。

##まとめ

とりあえずあらいざらい書いてみました。次回からは実際に使用しているテクニックなどを投稿していきたいと思います。
rails チュートリアル 4章の軌跡

備忘録の用途
１脳のインデックス
２自分ってすごいなと思うため。self esteemが高い人ほど失敗を前向きに捉えるため人生うまくいくらしい。
(引用文献: "DOES HIGH SELF-ESTEEM CAUSE BETTERPERFORMANCE, INTERPERSONAL SUCCESS, HAPPINESS, OR HEALTHIER LIFESTYLES?"
https://www.researchgate.net/publication/296629428_Does_high_self-esteem_cause_better_performance_interpersonal_success_happiness_or_healthier_lifestyles)

まとめ

・nanoを起動した時に驚く⇨ターミナルってそんな動きするんだ！という純粋な驚き
・puts とprintの違い。
・「!!」は「バンバン（bang bang）と読む
・(0..9).to_a  を打つと0~9の数字が出てくる
・mapは右側のオブジェクトを左の配列に適用させる潤滑油
・プログラムは自分のうったコードの通りに動く。

おまけ
演習問題の解答達。合っているかは分からない。
・hashの理解

```
>> spain = {}
=> {}
>> spain[:uno]= "one"
=> "one"
>> spain[:two]= "dos"                                              
=> "dos"
>> spain[:three]= "tres"                                           
=> "tres"
>> spain
=> {:uno=>"one", :two=>"dos", :three=>"tres"}
>> spain.each do |key,value|
?> puts "'#{key}'の英語は'#{value}'です"
>> end
'uno'の英語は'one'です
'two'の英語は'dos'です
'three'の英語は'tres'です
=> {:uno=>"one", :two=>"dos", :three=>"tres"}
```

```
>> params =["person1","person2","person3"]
=> ["person1", "person2", "person3"]
>> params[0]={first:"すばる",last:"だーよ"}
=> {:first=>"すばる", :last=>"だーよ"}
>> params[1]={first:"滑る",last:"ヨーダ"}
=> {:first=>"滑る", :last=>"ヨーダ"}
>> params[2]={first:"スボル",last:"の"}
=> {:first=>"スボル", :last=>"の"}
>> inde[:father]=params[1]
>> aa[:child] = params[2]                                         
=> {:first=>"スボル", :last=>"の"}
>> aa[:child][:first]
=> "スボル"
>> aa[:child][:first] = params[2][:first]
=> "スボル"
>> aa[:child][:first] == params[2][:first]
=> true
```
・ランダム数字のパスワード作成

```
>>  user ={name:"おくとむ",email:"okutom@aaa",password:"okutomm"}
=> {:name=>"おくとむ", :email=>"okutom@aaa", :password=>"okutomm"}
>> user[:password] = ('a'..'z').to_a.shuffle[0..16].join
=> "webrovxlfymqatigh"
>> user
=> {:name=>"おくとむ", :email=>"okutom@aaa", :password=>"webrovxlfymqatigh"}
>> 
```
・joinの失敗

```
 params ={}
>> params = "person1"
=> "person1"
"person1person2"
>> params << "person3"
=> "person1person2person3"
>> params.join(',') ⇨これは出来ない
Traceback (most recent call last):
        1: from (irb):7
```
Range.newはよく分かっていない。

```
>> Range.new(0,8)
=> 0..8
>> a = (0..8).to_a
=> [0, 1, 2, 3, 4, 5, 6, 7, 8]
>> a ==  Range.new(0,8)
=> false
```
最後はもちろんtestとherokuデプロイを忘れずに。

```
$rails test
Finished in 1.32019s
4 tests, 12 assertions, 0 failures, 0 errors, 0 skips
$git push
$git heroku push
remote: Verifying deploy... done.
```
参考文献:
 "DOES HIGH SELF-ESTEEM CAUSE BETTERPERFORMANCE, INTERPERSONAL SUCCESS, HAPPINESS, OR HEALTHIER LIFESTYLES?"
https://www.researchgate.net/publication/296629428_Does_high_self-esteem_cause_better_performance_interpersonal_success_happiness_or_healthier_lifestyles

rails チュートリアル：https://railstutorial.jp/
またしてもAWS無料枠を意図せず超えてしまった話(backup storage exceeding free allocation)

前回下記の記事に書いたように、スナップショット削除によって請求額自体は減りました。
https://qiita.com/NoOne/items/5482a61137b5cb8115be


しかし、またしても料金が発生してしまいました。


AWSサポートセンターに問い合わせたところ、DBインスタンスの設定のバックアップ保持期間が7日になっているのが原因なので0日に変更するとよいとの回答を得ました。

特にバックアップ保持期間を変えた記憶がないので、デフォルトのままだと課金が発生してしまう仕組みでしょうか？


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/c1c657d1-89c2-9f20-ee1e-241df78966a7.png)
Python3で配列の並べ替えの方法

Python3での配列の大きい順に並べる方法です

```Python
N = int(input())
ab = [None] * N
for i in range(N):
    line=input().split(" ")
    a = int(line[0])
    b = int(line[1])
    ab[i] = [a,b]
ab.sort(reverse=True)

for i in range(N):
    [a,b] = ab[i]
    print(a, b)
```

小さい順に並べ替える場合は

```Python
ab.sort(reverse=True)
```

を

```Python
ab.sort
```

に変えます。この方法は配列を破壊して新しく並べ替えるソートなので

```Python
ab.sorted
```

の方が良いと考えられます。
【Javascript】Mapオブジェクトについて

# 初めに
Mapオブジェクトについて学習した内容のoutput用記事です。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。
※こちらの記事はあくまでも個人で学習した内容のoutputとしての記事になります。

# Mapオブジェクトとは
オブジェクトでkeysとvaluesを持っているが、キーの値がobjectやarray、mapなど幅が広い。また、keysとは別にそれぞれのkey,valueのpairには連番が振られる。

# 使ってみる
itemというmapを生成します。

```javascript
const item = new Map();
```
setメソッドを使えば、mapの中身をupdateできます。objectとは違い、数字もkeyとして使えます。

```javascript
item.set('name', 'Tom');
item.set(1, 'Tokyo, Japan');
```
setメソッとによって追加されたデータはmapという形になっており、今まで更新されたデータが入っています。

```javascript
console.log(item.set(2, 'Tennis, Hobby'));
//Map(3) {"name" => "Tom", 1 => "Tokyo, Japan", 2 => "Tennis, Hobby"}
```
Mapは次のように「.」で繋げ、連続して更新していくこともできます。

```javascript
item
  .set("list", ["Books", "Pencil", "Eraser", "Pen"])
  .set("open", 9)
  .set("close", 22)
  .set(true, "We have")
  .set(false, "We dont't have.");

console.log(item);
//Map(8) {"name" => "Tom", 1 => "Tokyo, Japan", 2 => "Tennis, Hobby", "list" => Array(4), "open" => 9, …}
```
getメソッドを使うと、mapのデータをキーを指定することによって値を取得することができます。

```javascript
console.log(item.get("name"));
//Tom
console.log(item.get(true));
//We have
```
mapを使うと次のようにtrueもしくはfalseのキーに該当する値を条件によって取得する値を分けることもできます。

```javascript
const time = 23;
console.log(
  item.get(time > item.get("open") && time < item.get("close"))
);
//We dont't have.

const time = 19;
console.log(
  item.get(time > item.get("open") && time < item.get("close"))
);
//We have.
```
hasメソッドでmapにキーに該当する値が存在するかどうかを調べることができます。

```javascript
console.log(item.has("list"));

//true
```
deleteメソッドを使えば、mapの連番に該当する値を削除することができます。

```javascript
//2 => "Tennis, Hobby"を削除
item.delete(2);
console.log(item);

//Map(7) {"name" => "Tom", 1 => "Tokyo, Japan", "list" => Array(4), "open" => 9, "close" => 22, …}
```
mapの数を数えるにはsizeメソッドを使います。

```javascript
console.log(item.size);
//7
```
また、clearメソッドでmapの値を全部削除できます。

```javascript
item.clear();
console.log(item);
//Map(0) {}
```
mapは配列もkeyとして使えます。

```javascript
item.set([1, 2], "hello");
console.log(item);
//7: {Array(2) => "hello"}
```

getメソッドで[1,2]をキーとして指定すると、undefinedになってしまいます。

```javascript
console.log(item.get([1,2]));
//undefined
```

理由としては配列やオブジェクトはオブジェクト値であり、上記のsetメソッドの[1,2]とgetメソッとでの[1,2]は違う参照先として捉えられるからです。なので、配列を変数に格納してあげる必要があります。

```javascript
//getメソッドのキーとして使う配列をarr変数に代入する
const arr = [1, 2];
item.set(arr, "hello");

console.log(item.get(arr));
//hello
```
さらにmapはDOMの要素もキーとして使えます。

```html
//pタグが取得する要素
<body>
  <p>Welcome Welcome Welcome</p>
</body>
```
querySelectorでpタグを取得し、mapのキーとしてセットします。

```javascript
item.set(document.querySelector("p"), "paragraph");
console.log(item);

//8: {p => "paragraph"}
```
![スクリーンショット 2021-06-02 7.08.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/5bbdbd69-3e27-96b4-d17d-5ad50ffa9f6d.png)

#参考サイト
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map
「rails g model」と「rails g migration」の違い

初学者の方にとってはDB周りの知識はややこしくて少々わかりづらいものです。
そこで今回は私も理解するのに少し苦労した「rails g model」と「rails g migration」の違いを簡単に記事にしてみました。

#マイグレーションファイルとは？
　マイグレーションファイルとは簡単に言うと”データベースの設計図”です。
このファイルを実行することにより記述した内容がデータベースに反映されます。

#概念的なrails g model と rails g migration の違い
### rails g model　＝　モデルとマイグレーションファイルを作る
### rails g migration　＝　モデルとマイグレーションファイルを作る
[ShimaBlock]よく使うVBAコード

###概要
[ShimaBlock for VBA](https://shima-block.shima-soft.com/vba.html)の操作サンプルです。
ExcelVBAでよく使うVBAコードをShimaBlockでやってみました。

使用サイト：[ShimaBlock for VBA](https://shima-block.shima-soft.com/vba.html)

###データの入っている最終行(ブロック)
1列目のデータが入っている最終行を取得する場合は、以下のようにブロックを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/ec168d21-32c8-d102-e857-dd51b922c430.png)

###データの入っている最終行(生成コード)
```vb
Sub Main()
    Dim lastRow
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
End Sub
```

###データの入っている最終列(ブロック)
1行目のデータが入っている最終列を取得する場合は、以下のようにブロックを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/f9608b67-3f59-f292-a6b6-bed764410b66.png)

###データの入っている最終列(生成コード)
```vb
Sub Main()
    Dim lastCol
    lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
End Sub
```

###すべてのブックに同じ処理を行う(ブロック)
すべてのブックに同じ処理を行う場合は、以下のようにブロックを配置します。
すべてのブックに対し、閉じる処理を入れています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/487931ef-4274-42f7-d65f-6b8ca73d9696.png)

###すべてのブックに同じ処理を行う(生成コード)
```vb
Sub Main()
    Dim wb As Workbook
    For Each wb In Workbooks
        wb.Close
    Next wb
End Sub
```

###すべてのシートに同じ処理を行う(ブロック)
すべてのシートに同じ処理を行う場合は、以下のようにブロックを配置します。
マクロ実行ブックのすべてのシート名を確認し、シート名が「Sheet1」の場合は、「シート1」に変更する処理を入れています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/2f679227-18ae-a39b-19c7-3f929be5c6c1.png)


###すべてのシートに同じ処理を行う(生成コード)
```vb
Sub Main()
    Dim ws As Worksheet
    For Each ws In ThisWorkBook.Worksheets
        If ws.Name = "Sheet1" Then
            ws.Name = "シート1"
        End If
    Next ws
End Sub
```

###サンプルコード参照サイト
以下のサイトのコードを参考に、[ShimaBlock for VBA](https://shima-block.shima-soft.com/vba.html)でコーディングしてみました。
[VBA（エクセルマクロ）でよく使うコードまとめ](https://qiita.com/hajimejimejime/items/0109f84051951bfdee0a)
ポーランド記法による計算処理


未経験エンジニア転職活動中にあった技術テストです。
備忘録と復習をかねて、記事にしました。

# 課題
ポーランド記法された数式を計算する処理を実装し、以下の数式と答えがあっているか確認する

問題1:
* + 1 2 + 3 -5
回答1: -6

問題2:
/ + 2 2 + 3 5
回答2: 0.5

問題3:
- + 2 2 + 3 5
回答3: -4

問題4:
- + 3 11 + 4 2
回答4: 8

問題5:
- * / 15 - 7 + 1 1 3 + 2 + 1 1
回答5: 5

## ポーランド記法とは？
演算子の後ろに数値を2個並べて演算子とその数値2つを計算する方法
**例1**
通常の計算式
1 + 2
ポーランド記法
+ 1 2
**例2**
通常の計算式
(1+5)*(2+3)
ポーランド記法
* + 1 5 + 2 3
+ 1 5を計算した後+ 2 3を計算する
* 6 5　となり、答えは30になる

この処理を実装し、与えられた数値に対して正しく答えが出るか確認をする

ポーランド記法

https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89%E8%A8%98%E6%B3%95

## 実装

```ruby
def calc(num1, num2, ope)
  i = num1.to_f
  j = num2.to_f
  return i + j if ope == "+"
  return i - j if ope == "-"
  return i * j if ope == "*"
  return i / j if ope == "/"
end

def input(str)
  num_box = []

  str.reverse_each do |num|
    if num =~ /\d/
      num_box << num.to_i
    else
      a = num_box.pop
      b = num_box.pop
      num_box << calc(a, b, num)
    end
  end
  p num_box
end

str = gets.split.map
input(str)
```

### calcメソッド
後述するinputメソッドで入力された値を計算するためのメソッドです。
答えの中に小数点以下の値がでてくるものもあるので、to_fメソッドで小数点以下も表示できる状態で計算処理を行います。
受け取った4種の演算子に応じて、それぞれの処理を行わせるような記述になっています。

### inputメソッド
入力された値は文字列として変数strで定義します。
このstrの後ろから順に操作を行います。
入力された文字列が数字の場合（正規表現を使用）num_boxに格納します
その他、つまり演算子の場合はnum_boxの右から順に値を取り出し、calcメソッドで計算してまた配列に入れます。
これを繰り返し、最終的にstr全てに対してこの処理を行った時に配列に残る値が計算結果になります。
**例**
* + 1 2 + 3 -5
str = [*, + , "1", "2", +, "3", -5]
str.reverse = ["-5", "3", +, "2", "1", +, *]
num_box = ["-5", "3"]
num_box = ["-2"]
[+, "2", "1", +, *]が残ります
num_box = ["-2", "2", "1"]
num_box = ["-2", "3"]
[*]が残ります
num_box = [-6]

このような感じで演算子を見つけると、num_boxに入った新しい値から2つを使って計算し、num_boxに格納する
を繰り返すことで計算結果が得られました。

## まとめ
左から順に計算していくというのが演算子が連続した場合に難しかったため、式を右から見ることで演算子を見つけたら2つの値を計算するということを繰り返し行い、式の値がなくなるまで行えば計算結果が得られるという方法で実装してみました。
実装・解釈の間違い、ご意見などありましたら是非お願いします。
WordPressの固定ページにループを書く方法（ページネーションでハマらない）

表題の件。

```
<?php
   $paged = get_query_var('paged') ? get_query_var('paged') : 1 ;
      $args = array(
         'post_type' => 'post',
         'posts_per_page' => 10,
         'paged' => $paged
      );
   $loop_topics = new WP_Query($args);
?>

<?php
    if( $loop_topics -> have_posts() ) :
        while($loop_topics -> have_posts()) : $loop_topics -> the_post();
?>

   ～ループする内容～

<?php endwhile; endif; ?>
               
<!--pagination-->
<?php if (function_exists("pagenation")) {
   pagenation($loop_topics -> max_num_pages);
} ?>


```

投稿ページと固定ページは勝手が違います。

投稿ページ：$loop_topics -> max_num_pages・・・ダッシュボードで設定した値

固定ページ：$loop_topics -> max_num_pages・・・0

なので、固定ページの場合は、ページネーションに適正なmax_num_pagesを渡す必要があります。
それが1～6行目の記述です。

これを付け加えると、固定ページでもページ送りが効くようになるのではないでしょうか。
お試しください。
STM32L010でSPIを使いEEPROM AT93C46を読み出す。


x mbedのリビジョンは、125

目的
SPIのテスト

前提
事前にアドレス0に1,2が書き込まれている

参考

https://os.mbed.com/users/okini3939/notebook/SPI_jp/

https://www.petitmonte.com/robot/howto_eeprom_spi.html

```c++


#include "mbed.h"

#define swclk1  PA_5    //A4
#define test01  PA_6
#define swdio1  PA_7    //A6
#define en1     PA_4    //A3

//DigitalOut test1(test01);

//DigitalOut swdclk(swclk1);
//DigitalOut swdio(swdio1);
DigitalOut cs(en1);

SPI spi( swdio1 , test01, swclk1); // mosi, miso, sclk


//SPI spi( D11 , D12 , D13); // mosi, miso, sclk
//DigitalOut cs( D10 );
 
//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX); //767
RawSerial pc(PA_2, PA_3); //010
 
int main() {
    pc.printf("\r\n010\r\n");
    
    // Setup the spi for 8 bit data, high steady state clock,
    // second edge capture, with a 1MHz clock rate
    spi.format(8,0);
    spi.frequency(1000000);
 
    // Select the device by seting chip select low
    cs = 1;
 
    spi.write(0b00000001);  
    spi.write(0b10000000 | 0);         
    wait_ms(5);    

    uint8_t b1 =  spi.write(0x00);
    uint8_t b2 =  spi.write(0x00);
    uint8_t b3 =  spi.write(0x00); 

    pc.printf("番地(H) = ");
    pc.printf("%d\r\n",
        (b1 << 1) | (b2 >> 7)
    );
    
    
    pc.printf("番地(L) = ");      
    pc.printf("%d\r\n",
    ( (b2 & 0b01111111) << 1)  | (b3 >> 7)
    );
  
    // Deselect the device
    cs = 0;

}//main

//容量削減
void error(const char* format, ...){}



```

![spi_eeprom_010_r_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/911db818-65e0-f5c3-5059-6a5e7abb9188.jpeg)


![spi_eeprom_010_r_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/40797dd2-e735-3097-9959-ddb7932bea7e.jpeg)
Sentryを使ってみる

# 目的
appliationのmonitoringやerror監視のためにsentryを使う

# Ref
https://sentry.io/welcome/

# 使い方
pythonの場合

```python:test.py

import sentry_sdk
sentry_sdk.init(
    "xxxx",  ## ここに各自のURLを入れる

    # Set traces_sample_rate to 1.0 to capture 100%
    # of transactions for performance monitoring.
    # We recommend adjusting this value in production.
    traces_sample_rate=1.0
)

# hoge
division_by_zero = 1 / 0
```

# 結果
sentryの画面にexpectionが出た
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76498/98634987-ec30-337b-a7f5-f7b8ffc1f6bc.png)

# 所感
とても簡単。
Rでvolcano plotを描いてみる

##参考

https://biocorecrg.github.io/CRG_RIntroduction/volcano-plots.html

##ggplot2で描いてみる

###サンプルデータをダウンロードする

```R
suppressPackageStartupMessages(library(ggplot2))
suppressPackageStartupMessages(library(ggrepel))

# Download the data we will use for plotting
download.file("https://raw.githubusercontent.com/biocorecrg/CRG_RIntroduction/master/de_df_for_volcano.rds", "de_df_for_volcano.rds", method = "curl")

# The RDS format is used to save a single R object to a file, and to restore it.
# Extract that object in the current session:
tmp <- readRDS("de_df_for_volcano.rds")

# Remove rows that contain NA values
de <- tmp[complete.cases(tmp), ]
```

###データをみてみる

```R
head(de)
```

|gene_symbol|log2FoldChange|pvalue|
|:-|:-|:-|
|Ndufa9|-0.8764536|3.385150e-34|
|Rpp21|-0.9764875|1.560439e-26|
|Amotl1|-0.7582692|2.164811e-24|
|Gm44064|-0.8485025|5.125048e-20|
|Hcfc1r1|-0.6021286|3.799504e-17|
|Rgs18|-0.8171239|1.055586e-16|

###発現変動遺伝子をラベルする

```R
# set thresholds
padj <- 0.05
logFC <- 0.5
de$significant <- ifelse(de$pvalue < padj & abs(de$log2FoldChange) > logFC,
                            paste0("FDR<", padj) , "Not Sig")
```

###volcano plot関数を定義してプロットする

```R
# Define the "volcano_plot" function
volcano_plot <- function(x){
  ggplot(x, aes(x = log2FoldChange, y = -log10(pvalue))) +
    geom_point(size = 3, aes(color = significant)) +
    scale_color_manual(values = c("#F8766D", "grey")) +
    theme(legend.position = "none") +
    geom_text_repel(
      data = subset(x, pvalue < padj & abs(x$log2FoldChange) > logFC),
      aes(label = gene_symbol), size = 4, box.padding = unit(0.15, "lines"),
      point.padding = unit(0.15, "lines")) +
    labs(x = "Log2FoldChange", y = "-log10(padj)")
}
volcano_plot(de)
```

##出力結果をみてみる
- それぞれの遺伝子をプロットし、発現変動遺伝子のみをラベルすることができた

![volcano.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1575076/590e9443-03d0-0433-53f5-a88d12b17779.png)
AtCoder用にディレクトリとA~ F問題のPythonファイルを作成した

## 前置き

[競プロ](https://atcoder.jp/?lang=ja)にハマってしまいatcoderの過去の問題を全部解いてみたくなったので、まずは環境作りということでPythonさんに一括でファイルを作ってもらうことにしました

## 本題

#### コード

```MakeFile.py
import os

def mkdir(*arg):
    diff = ["A","B","C","D","E","F"]
    if len(arg) == 1:
        try:
            os.mkdir(f"ABC{arg[0]}")
            for current_diff in diff:
                with open(f"ABC{arg[0]}/{current_diff}.py","w") as f:
                    f.write(f"# ABC{arg[0]}-{current_diff}\n")
        except:
            print(f"「ABC{arg[0]}」はもうあるよ")
    elif len(arg) == 2 :
        for i in range(arg[0], arg[1] +1):
            try:
                os.mkdir(f"ABC{i}")
                for current_diff in diff:
                    with open(f"ABC{i}/{current_diff}.py","w") as f:
                        f.write(f"# ABC{i}-{current_diff}\n")
            except:
                print(f"「ABC{i}」はもうあるから飛ばすね")
    else:
        print("引数多かったりしない？")

    print("終わったよ")
```

これでABC1 ~ ABC203までのディレクトリとA ~ F問題までのpythonファイルを作成してくれます
（D ~ F問題は僕は解くことがなさそうなので今のところ不要ですが（苦笑い） ）

引数を下記のように指定することでで作成するファイルを一個から複数まで選べます（可変長引数を初めて使ってみた）

```python
# ABC203だけ作成
mkdir(203)
# ABC1 ~ ABC20２まで作成
mkdir(1,202)
```

例外処理で既に存在するディレクトリはスルーするようにしてあります

## 最後に
atcoderとても楽しいです、数学の勉強も頑張るぞー。
Uncaught TypeError: Cannot read property ‘top’ of undefined の原因

`備忘録`
##ハンバーガーメニューを展開したら smooth-scroll でエラー吐かれた

```
Uncaught TypeError: Cannot read property ‘top’ of undefined
```

####発生状況
・レスポンシブで、SP時はハンバーガーメニュー（下層階層の開閉あり）を使用
・スムーズスクロールを使用

####▼修正前　smooth-scroll用のjsはこんな↓設定
PC/SP共に固定ヘッダーなので、それぞれ高さ指定していしていますが、特に変わったことはしていません。

```
jQuery(function(){
    var windowWidth = $(window).width();
    var windowSm = 768;
		if (windowWidth <= windowSm) {
        var headerHight = 65;
	} else {
        var headerHight = 180;
	}
    jQuery('a[href^=#]').click(function() {
		var speed = 1000;
		var href= jQuery(this).attr("href");
		var target = jQuery(href == "#" || href == "" ? 'html' : href);
		var position = target.offset().top - headerHight;
		jQuery('body,html').animate({scrollTop:position}, speed, 'swing');
		return false;
	});
});
```

が、ハンバーガーメニューを展開させると `Uncaught TypeError: Cannot read property ‘top’ of undefined` のエラーが発生しました。（PC版ではメガメニューを使用していますが、オンマウスで展開する形式なのでひっかからなかったらしい？）

エラーが出ているのは、`var position = target.offset().top - headerHight;` です。
ハンバーガーメニュー内にスムーズスクロールは関係ないはずなのに、ハンバーガーメニューを展開するとエラーが出る。
これは、#や空白リンクを多用している所為ですね。。。jsあるあるです。

###なので、エラーの原因をスムーズスクロールから除外すれば良いだけでした

####▼修正後

```
jQuery(function(){
    var windowWidth = $(window).width();
    var windowSm = 768;
		if (windowWidth <= windowSm) {
        var headerHight = 65;
	} else {
        var headerHight = 180;
	}
    jQuery('a[href^=#]').not('.hoge a[href^=#]').click(function() {
		var speed = 1000;
		var href= jQuery(this).attr("href");
		var target = jQuery(href == "#" || href == "" ? 'html' : href);
		var position = target.offset().top - headerHight;
		jQuery('body,html').animate({scrollTop:position}, speed, 'swing');
		return false;
	});
});
```

今回の場合は、ハンバーガーメニューをマルッと除外する設定`.not('.hoge a[href^=#]')`を追加することで解決しました。（`.hoge`はハンバーガーメニューの大枠のclass名です。）
ハンバーガーメニューで下層を開閉させるためのトグルスイッチ（#リンク）が原因なので、`.hoge`内の # リンクを除外することでエラーの原因を削除できました。


ちなみに...、よく分かっていない人がやるであろう対応もやってます（よく分かってないので　笑）

1） とりあえず全カットするとエラーは出なくなる（当たり前）
2） レスポンシブ用の ` - headerHight`をカットしても変わらず（ですよね〜関係ないし）
3） エラーの行をマルッとカットすると、そもそも動作なくなる（そらそーだ）
4） jQueryのバージョンを変えてみた（バージョンによって動作する/しないが確認できただけ）
5） 記述を確認・・・jQueryのバージョンによって影響を受けるらしい `<a name="hoge">` ではなく、`<a id="hoge">` になっている

ーーーーー

▼参考

https://twotone.me/web/1767/
数字の読み上げデータセットを学習

0から9の数字を複数人が読み上げた音声データである spoken digit に対して LSTM で学習を行った。

https://github.com/Jakobovski/free-spoken-digit-dataset

以下のコードを google colab にコピペすると動くようになっている。colabのランタイムをGPUにすると1分ですべて終わる。

```python
import glob
import requests
import IPython
import librosa
import librosa.display
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import tqdm.notebook as tqdm
import tensorflow as tf
import itertools
from sklearn.preprocessing import OneHotEncoder
from sklearn.model_selection import train_test_split
import pandas as pd
import tarfile
  

def sound_download():
  # urlからデータをダウンロードする
  download_url = "https://github.com/Jakobovski/free-spoken-digit-dataset/archive/v1.0.9.tar.gz"
  filename = "free-spoken-digit-dataset-1.0.9.tar.gz"
  content_ = requests.get(download_url).content
  with open(filename, 'wb') as f: # wb でバイト型を書き込める
    f.write(content_)

  # 解凍すると free-spoken-digit-dataset-1.0.9 ディレクトリが現れる
  with tarfile.open(filename, 'r:gz') as t:
      t.extractall(path="./")
    

def sound_preprocess(path):
  # 音声の読み込み
  y, sr = librosa.load(path, sr=None)
  # メルスペクトログラム（人間の聴覚に適したスペクトログラム）
  S = librosa.feature.melspectrogram(y=y, sr=sr)
  S_dB = librosa.power_to_db(S, ref=np.max)
  return S_dB


# 音声データのダウンロード
sound_download()


# recordingsに入っている数字の音声データ2500個をサウンドスペクトログラムとして取り出す
db_list = []
path_list = sorted(glob.glob("free-spoken-digit-dataset-1.0.9/recordings/*"))
for path in path_list:
  db_list.append(sound_preprocess(path))


# pad_sequencesを用いて1でパディング（デシベルはー80〜0の範囲であるため、重複しない1を用いる）
padded_inputs = []
for db in db_list:
  _padded_inputs = tf.keras.preprocessing.sequence.pad_sequences(db, padding="post", maxlen=36, value=1.0)
  padded_inputs.append(_padded_inputs)


# 後でLSTMを用いるために軸の入れ替えを行う (time, hidden)
X = np.array(padded_inputs)
X = np.transpose(X, (0, 2, 1))

# ディレクトリ内はラベル0からラベル9まで250個ずつ並んでいる
_y = [[i] * 250 for i in range(10)]
y = list(itertools.chain.from_iterable(_y))
y = np.array(y)  # [0, 0, ..., 1, 1, ... ... 9, 9]


# ラベルのone hot encodeを行う
enc = OneHotEncoder(sparse=False)
y = enc.fit_transform(y[:, np.newaxis])

# データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y)
```
次に加工したデータを元にモデルの学習を行う。

```python
import tensorflow as tf
from keras.layers import Masking, LSTM, Input, Dense, Activation, Dropout
from keras.models import Model


inputs = Input(shape=X.shape[1:])
# Maskingで対応する時間ステップを処理中に無視する
x = Masking(mask_value=1.0)(inputs)
x = LSTM(128)(x)
x = Dense(10)(x)
x = Activation('softmax')(x)

model = Model(inputs, x)
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
# validation_dataはシャッフルしていないとaccuracyが0と出てしまう
history = model.fit(X_train, y_train, batch_size=32, epochs=100, validation_data=(X_test, y_test))
pd.DataFrame(history.history).loc[:, ['accuracy', 'val_accuracy']].plot(ylim=(0, 1))
```
精度はだいたい98%くらいだった。引き続き
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/f7a3bb38-672e-f965-38a1-1341ed3079fb.png)
【SSD（物体検出）】をTensorFlow 2.0 でやってみた.

#SSD（物体検出）をTensorFlow2.0　でやってみた
##SSDをいつも使っている環境(TensorFlow 2.0)で動かしてみたかったが以外に苦労した。
###環境
- Windows 10
- Python 3.8
- tensorflow 2.3.0
- keras 2.4.3
- Core i5
- Spyde 5

##SSDについて
沢山良い記事が書かれているので参考にしてください。

https://qiita.com/GushiSnow/items/8c946208de0d6a4e31e7

https://qiita.com/DeepTama/items/08e9b0f9d289aaf279fe

## 元コード
動かしてみたコードの元は

https://github.com/rykov8/ssd_keras

## TensorFlow 2.0への書き換え

https://techblog.cccmk.co.jp/entry/2020/05/11/094834

参考記事のままに書き換え。

keras 2.0への対応は[rykov8/ssd_keras https://github.com/rykov8/ssd_keras](https://github.com/rykov8/ssd_keras)のPull requests **API updated to Keras2** も参考になります。
## 動かしてみた
NoteBook　を使わないので SSD.ipynb の内容をエディタで.pyに編集して実行。
デモを動かすだけなのですぐに動くものだと思っていたがエラー。

```text
TypeError: 'NoneType' object is not subscriptable
```

どうもssd.pyからPriorBox()を呼び出したときに問題がありそうだったので、

```python
class PriorBox(Layer):
       ...
 @tf.function
    def call(self, x, mask=None):
        input_shape = x._shape_val
```
@tf.functionをつけグラフモードにした。

無事にデモが動きました。
[未完成] [随時更新] RailsプロダクトのLighthouseの点数を上げるために（個人メモ）

# はじめに

**※ こちらの記事はまだ未完成のため、しばらくは煩雑な内容が含まれている可能性があります**

対応したことの知見を随時メモしていく予定です。

# 背景

現在、業務でRailsのプロダクトを扱っておりLighthouseの点数を上げる施策を行っているため、その対応内容をメモしていきます。

# 対応内容

業務プロダクトのため、実際のコード等は割愛しております。

Rubyバージョン: 2.5.5
Railsバージョン: 5.2.5

## assetsをminify化する

本番ビルド時に以下コマンドで圧縮

```
./bin/rails assets:precomoile RAILS_ENV=production
```

# web fontをpreloadする

ローカルに独自のフォントを用意している場合はpreloadの設定を行う

```html
<link as="font" crossorigin="" href="Rails内フォントパス" rel="preload" type="font/woff2">
```

# Rsource Hints追加もしくは削除

必要なRsource Hintsは追加、不要なRsource Hintsは削除する

```html
<link href="" rel="preconnect dns-prefetch">
```

# CDNで読み込んでいるjsライブラリをwebpackから取得する

`head` タグ内でjsのライブラリを読み込んでおりかつ、asyncなどで読み込むと後続のjs処理に影響が出る場合はwebpackでまとめれば不要なレンダリングブロックを除外できる。

# firstview外の画像をlazyloadにする

こちらは言わずもがなと思います。
chromeの場合は imgタグに `loading="lazy"` でも可能になっている。

# firstview外のiframeをlazyloadにする

画像同様、chromeの場合は iframeタグに `loading="lazy"` が可能になっている
google mapなどはiframeで読み込むこともあると思われるので使用している場合は設定を行う。
pixi.jsでtickerのFPSが端末の状態に依存しないように見せる

[スマホの低電力モードだとpixi.jsのFPSが半分になる問題を無理やり解決する](URL:https://qiita.com/nanohanabuttobasu/items/38ff2618befddee53b95)
この記事の続き

頂いたコメントによると、FPSが単純に半分になったりとかだけではないらしい。
FPSが中途半端な数字(単純な60の倍数以外)でもなんとか上手く動いているように見せたい。

```js:script.js
let app = new PIXI.Application();

/*この辺をどうにかしたらしっかり解決しそうなんだけどなあ
app.ticker.speed = 1;
app.ticker.maxFPS = 30;
app.ticker.minFPS = 30;
*/

document.getElementById("game").appendChild(app.renderer.view);//domに貼り付け

app.ticker.add(loop);//ループ処理追加

let time = 0;
let txt = new PIXI.Text(time, {fill:0xFFFFFF});//経過時間(1/60s)を表示するテキスト
app.stage.addChild(fps);

function loop(delta){
    time += 1*delta;//FPSが端末に依らないように「見せる」処理
    txt.text = time;
}
```

`delta`はtickerの中で使える変数で、前のフレームからの経過時間(1/60s)が実数で代入されている。
例えばスクリプト中のように、`time`は本来ならフレームごとに1増えて然るべきだが、1*`delta`を増やすことで60FPSを達成しているように見せかけることができる。
ただしあくまでも「見せかけ」なので、実際に1秒間に60回計算が行われるとは限らない。

どんな環境でも一律でFPSを30にしたりする方法があればいいんだけどなあ。
`ticker.speed`, `ticker.maxFPS`, `ticker.minFPS`あたりを上手いことやればいい感じになりそうな気がしているが、このやり方だとどうしても環境によって差異が生じる。
QUIC とは

## 勉強前イメージ

トランスポート層のプロトコルで、googleが開発した

## 調査

### QUIC とは

QUICk UDP Internet Connections の略で、
現在IETFによって標準化が進められているトランスポート層のプロコトルです。
トランスポート層のプロコトルは主にTCP,UDPが使われていました。
このQUICはTCPから置き換えられていく可能性があるプロトコルです。

### QUIC の特徴

- 暗号化

TCPやUDP自体に暗号化はなく、必要であれば他に任せていましたが
QUICは自身で暗号化通信ができるようにします。

- コネクション管理とTLS

TCPでHTTPを使用する際はコネクション管理とTLSの3wayハンドシェイクが必要ですが、
QUICはこれを同時に行います。

- 再送処理

TCPが行っているパケットロスの際の再送処理などを実装している

### HTTP/3との関係性は？

よくQUICと調べてたらHTTP/3も関連して出てきます。
その関係性としては、HTTP/3でQUICが使用されているからになります。

HTTP/2の構成で、TCPが行っていたものが、
HTTP/3の構成では、UDPとQUICに変わります。
また、QUICを使用することで全てが暗号化された通信になります。

## 勉強後イメージ

トランスポート層ってTCPとUDP以外そういえば知らない・・・
TCPとUDPはまだまだ強いけど、新しいプロトコルも出来てきてるってことね。
ほかにもDCCPとかSCTPとかがあるみたい。
また調べよう

## 参考

- [もうすぐ標準化されるらしいのでHTTP/3について調べてみた](https://tech.toreta.in/entry/2020/12/07/181530)
- [QUIC プロトコルとは](https://www.alibabacloud.com/help/ja/doc-detail/126676.htm)
GentooLinux Install Memo

GentooLinux_Install Memo
===



# 準備

```sh:１）メディアブートする
wget https://bouncer.gentoo.org/fetch/root/all/releases/amd64/autobuilds/20210530T214502Z/install-amd64-minimal-20210530T214502Z.iso
```
```sh:２）sshd起動
/etc/init.d/sshd start;
```
```sh:rootパスワード設定
passwd root;
＜パスワード設定＞
```
```sh:４）ネットワーク確認（DHCPで自動設定される）
ifconfig -a;
```

# パーティション作成
```
parted /dev/sda
mklabel gpt
unit mib
mkpart grub 1 3
set 1 bios_grub on
mkpart boot 3 1000
set 2 boot on
mkpart swap 1000 2000
mkpart rootfs 2000 -1
```

# ファイルシステム作成
```
mkfs.ext4 /dev/sda2
mkswap /dev/sda3
swapon /dev/sda3
mkfs.ext4 /dev/sda4
```

# マウント
```
mount /dev/sda4 /mnt/gentoo/
mkdir /mnt/gentoo/boot
mount /dev/sda2 /mnt/gentoo/boot/
ls /mnt/gentoo
```

# 時刻設定
```
date
hwclock
```

# stage tarball ダウンロード
```
cd /mnt/gentoo
links https://www.gentoo.org/downloads/mirrors/
JP -> HTTP releases -> amd64 -> autobuilds -> current-stage3-amd64 -> releases -> amd64 -> autobuilds -> current-stage3-amd64 -> stage3-amd64-201XXXXXT214502Z.tar.xz
tar xvJpf stage3-amd64-20210530T214502Z.tar.xz --xattrs
```

# マウント
```
cp -L /etc/resolv.conf /mnt/gentoo/etc/
mount -t proc /proc /mnt/gentoo/proc/
mount --rbind /sys /mnt/gentoo/sys/
mount --make-rslave /mnt/gentoo/sys/
mount --rbind /dev /mnt/gentoo/dev/
mount --make-rslave /mnt/gentoo/dev/
```

# chroot
```
chroot /mnt/gentoo /bin/bash
source /etc/profile
```

# portage
```
emerge-webrsync
emerge --sync
eselect profile list
```

# vi インストール
```
USE="-X" emerge -av vim
```

# fstab
```
e2label /dev/sda2 boot
e2label /dev/sda4 root
e2label /dev/sda2

swapoff /dev/sda3
mkswap -L swap /dev/sda3
swapon LABEL=swap

vi /etc/fstab
LABEL=boot    /boot       ext4    noauto,noatime  1 2
LABEL=root    /           ext4    noatime         0 1
LABEL=swap    none        swap    sw              0 0
```

# パスワード
```
passwd
＜パスワード設定＞
```

# locale
```
vi /etc/locale.gen
#C.UTF8 UTF-8
ja_JP.UTF-8 UTF-8
locale-gen
eselect locale list
eselect locale set 4
```

# kernel
```
emerge -av pciutils
emerge -av gentoo-sources
cd /usr/src/linux
make menuconfig
make && make modules_install
make install
```

# initframfs
```
emerge -av genkernel
genkernel --install initramfs
```

# ブートローダ
```
emerge -av grub
grub-install /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg
```

# その他のシステムツール
```
emerge -av metalog
rc-update add metalog default
emerge -av fcron
rc-update add fcron default
crontab /etc/crontab
emerge -av mlocate
emerge -av dhcpcd
```
【fish】bashのAnaconda環境をfishに移行する(PATHの通し方)

## はじめに
　シェルをbashからfishに乗り換えたら元々使ってたAnacondaのPATH設定をやり直す必要が出てきたけど，当てはまる記事があまりなくて躓いたのでメモ。

## 状況
+ fishインストールしてデフォルトシェルに設定済み
+ Anaconda(およびその仮想環境)もインストール済み
+ ↑但しfishでPATH設定してないので`conda`コマンドが使えない

## PATHを通す
　fishではユニバーサル変数というfishセッション全てで共通して使える(=ターミナルを再起動しても不変)変数があり，PATH用には`$fish_user_paths`というリストの変数が用意されてるのでそこに追加する事になる。
　以下のコマンドを実行するとPATHを追加できる。

```shell:fish
$ set -U fish_user_paths $HOME/opt/anaconda3/bin $fish_user_paths
```
これでPATHの追加は完了。(ちなみにPATHそのものである`$HOME/opt/anaconda3/bin`の部分だけ書き換えれば他のPATHも同じように追加できる。)
ターミナルを再起動して`echo $PATH`を実行して下のように先ほど設定したPATHが表示されればOK。

```shell:fish
$ echo $PATH
/Users/{$USER}/opt/anaconda3/bin
```
でもこれではまだ`conda　activate`とかは使えないはず。どうやら現在のシェルに合わせてAnacondaの初期化が必要っぽいのでそれを実行。

```shell:fish
$ conda init fish
```
そしてまたターミナル再起動。これで`conda activate`とかもできるはず。


## 補足(備忘録)
+ `$fish_user_paths`を含むfishのユニバーサル変数は全て`~/.config/fish/fish_variables`に記述されてる。  
`$fish_user_paths`は最後の方にあるはず。

```shell:~/.config/fish/fish_variables
#例
SETUVAR fish_user_paths:/Users/kimurafuga/opt/anaconda3/bin
```

+ 他の記事で`~/.config/fish/config.fish`にPATHを書き込めって書いてあるのもあったけど**絶対ダメ！**  
最初それを鵜呑みにしてその`config.fish`(無かったので自分で作った)にさっきの

```shell:fish
$ set -U fish_user_paths $HOME/opt/anaconda3/bin $fish_user_paths
```
を書き込んだら一見PATHを通せた様に見えたけど，ターミナルを再起動するたびに新しく`set`されちゃうみたいで気づいたら`$fish_user_path`に10個近く同じPATHが上書きで追加されちゃってた。必ず上記のようにコマンドラインから設定すること。
Qiita 記事読み上げブックマークレット



[3000文字Tips - 知ると便利なTipsをみんなへ届けよう](https://qiita.com/official-events/d523df99d6479293ffa7) 向けのイベント記事です。


## Web Speech API

[Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API#web_speech_concepts_and_usage) は ブラウザ上でSpeechSynthesis(音声合成)とSpeechRecognition(音声認識)の機能を提供する API です。

使い方は下記記事がわかりやすいです。

https://qiita.com/gorilla0513/items/7fb501608d7d85c4241e

詳細の仕様は公式のドキュメントをご参照ください。

https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API

## ブックマークレット

私はメインブラウザを Vivaldi にしています。
[クイックコマンド](https://help.vivaldi.com/ja/desktop-ja/shortcuts-ja/quick-commands/) を使うとブックマークレットが呼び出しやすいため、ちょっとした JavaScript のコードを登録して実行できるようにしています。

読み上げたいテキストを元に `SpeechSynthesisUtterance` のオブジェクトを作成、`speechSynthesis.speak()`を呼び出せば再生されます。

`speak()` は `SpeechSynthesisUtterance` を再生のキューにつむようになっていて、停止するときは`cancel()` を呼び出してキューの削除をすると停止されます。


読み上げの開始

```js
javascript:speechSynthesis.speak(new SpeechSynthesisUtterance(document.getElementById('personal-public-article-body').innerText))
```

停止（読み上げキューの削除）

```js
javascript:speechSynthesis.cancel()
```

読み上げブックマークレットはいろんなところで使えると思うので、ぜひご活用ください。
python を実行させたい

pythonで作ったツールを配りたい

A,exeで固める
-
   ノートン先生が激しく反応するので、一旦諦める。
   証明書が必要？

B,batを作って配る
-

　ひとまずこっちの方法で進める。

Bの場合必要なのはpython実行環境


B-1,個々のPCにpythonをインストールしてもらう
-
インストーラーでインストールしてもらう。
オプションに個性は出さないようにしてもらう。

パッケージのインストールとかあるので
bat ファイルにはそれも含めて記載しておくと良いかも。

    python -m pip install Pyside2
    python Z:\pythonTool\pyTool.py

ここで曲者なのが
python と py　の関係
pythonLauncherをインストールしてるかしてないかで変わってしまうので統一が必要。
複数verのpytonをインストールさせるのであれば　pythonLauncher有りのほうが良い気がする。


B-2,ネットワーク上にpythonを置いてそこから実行させる
-
ネットワークドライブ上に pythonのフォルダを作成。
この際　Python.exe と同階層にverにマッチした　python.dll　を置いとくといい。(python27.dll とか

python.dllがローカルに存在する場合はそちらを参照してくれるが、
ない場合はエラーになって実行できない。

bat ファイルの中身はこんな感じ

    Z:\python\python.exe  Z:\pythonTool\pyTool.py

bat ファイルの場所と　pyファイルの場所が一緒ならこんな感じ

    Z:\python\python.exe  %~DP0pyTool.py

ネットワーク次第だろうけれど、重い。
python libの更新とか管理はしやすい
batファイルは本体は渡さずに、ショートカットを作成して配布すると管理が楽


B-3,インストール自体もbatに仕込む
-
インストールの個性も殺したいのでインストールもbatで自動化できないものか？
管理者権限次第ではあるけどもできる様子。

参考：
https://silentinstallhq.com/python-3-9-silent-install-how-to-guide/
https://silentinstallhq.com/python-2-7-silent-install-how-to-guide/

とりあえず実行させて、エラーが起きたらインストール実行してもう一回トライ
という流れにしてみる。

    python Z:\pythonTool\pyTool.py

    if %errorlevel% neq 0 (
    echo "install python"
    python-3.9.x.exe /quiet InstallAllUsers=1 PrependPath=1

    echo "update pip"
    python -m pip install update pip
    echo "install pyside"
    python -m pip install Pyside2
    python Z:\pythonTool\pyTool.py
    )

社外に配る場合にはこれはやめたほうが良い。
勝手にインストールするとか酷すぎる。人によっては承諾してくれない。
newは書いても書かなくてもいいPHP

## TL;DR

```php
// 従来通りこう書いても
(new Foo)->bar();
// newを省略してもいいようにする
Foo()->bar();
```

※「結局、関数内で new 使ってるやんけ！」っていうのは大目に見てください

## こんなことがあった

ワイ「 Python とか Swift とかインスタンス化するときに new 演算子いらない言語素敵」
ワイ「メソッドチェーンするときにこうやって括弧しなくていい！」

```php
(new Foo)->bar();
```

？？？「 new 演算子の結合の問題」
？？？「なので `new Foo().bar()` と書いてPHPの `(new Foo)->bar()` と同じ評価になる言語もある」

ワイ「そういう言語もあるんですね」

？？？「 JavaScript っていう言語がそう」

ワイ「たしかに！！」
ワイ「 Java も同じこと出来ました」
ワイ「 PHP の方が特殊だったんですね」

？？？「 new とか余分なキーワードがない方が演算子結合順とか考えずに済んで曖昧さが減るのは完全にその通り」

ワイ「動的にメモリを確保するぞ！使い終わったから解放するぞ！って明示的に書く言語以外は new いらないのではと思ってる(過激派)」

## PHPでも括弧なしでインスタンス化してメソッドチェーンする

よくあるインスタンス化するための静的メソッドをつくるやつ

```php
class Foo
{
    public static function make(): static
    {
        return new static();
    }

    public function bar() {}
}

Foo::make()->bar();
```

たしかにこう書けば new 使わない
でも静的メソッド呼んでいる感がつよい

## クラス名と関数名が被っていてもいい

こうも書ける

```php
class Foo
{    
    public function bar() {}
}

function Foo(): Foo
{
    return new Foo();
}

Foo()->bar();
```

やったぜ

## 実用性

**ないです**

### use でインポートするとき

インポートするシンボルが、クラスか関数かで書き方が違う

```php
// クラスのインポート
use MyNameSpace\Foo;
```

```php
// 関数のインポート
use function MyNameSpace\Foo;
```

そのため「newは書いても書かなくてもいい」にするには、インポートせずに 完全修飾名 で書く必要がある

```php
(new \MyNameSpace\Foo())->bar();
\MyNameSpace\Foo()->bar();
```

つらいですね
Railsでポートフォリオ作成時に何回も使用したコマンド５選

どうも、三町哲平です！！

今回は、私がRailsでポートフォリオを作成した際に何度も利用したコマンドの備忘録です。ノートにメモしていたので毎回毎回パソコンで打ち直していたのですが、コピペした方が作業効率も上がるので、まとめました。

皆さんの問題解決へのヒントになれば幸いです。

ちなみに私のポートフォリオは、
下記の様になっています。

# 使用した技術
* フロントエンド
  * HTML/CSS
  * JavaScript
  * jQuery
  * Bootstrap

* バックエンド
  * Ruby 3.0.1
  * Ruby on Rails 6.1.3.1

* インフラ・開発環境
  * MacBook Air macOS Big Sur 11.3.1
  * Docker/Docker-compose
  * AWS（ECR,ECS(EC2),VPC,S3,Route53,ALB,RDS(PostgreSQL 12.5),ACM）
  * Nginx/Puma

* テスト
  * Rspec (単体・統合）
  * CircleCIにてDocker-composeよりコンテナを構築し、自動テスト

* その他使用技術
  * YouTube Data API
  * Ajax(非同期通信)（投稿へのコメント・いいね、ユーザーのフォロー）
  * LINE/Twitterの記事シェアボタン
  * 無限スクロール(jScroll)
  * GitHub

## インフラ構成図
![aws](https://user-images.githubusercontent.com/60719889/119190394-420f9b80-bab8-11eb-83bb-229f30a1c327.png)

※ ↓ここから備忘録です。
# コマンド５選
## 1. Dockerで立ち上げたRailsのlogを出力する。
```docker:ターミナル
$ docker-compose up -d

$ tail -f log/development.log
```

## 2. 開発環境で、assets:precompileする。
```docker:ターミナル
$ docker-compose build --no-cache

$ docker images

$ docker run -it 98582946a6a3 /bin/bash
# docker run -it RailsアプリのIMAGE_ID /bin/bash

$ bundle exec rails assets:precompile
# ↑このコマンドのみ(root@297b50c0ee64:/illustrations#)起動中Railsコンテナ内で実行

$ docker ps

$ docker commit f9391be94fab illustrations_app:latest
# docker commit 起動中RailsアプリのCONTAINER_ID 新しいアプリ名:latest

$ docker stop f9391be94fab
# docker stop 起動中RailsアプリのCONTAINER_ID
```

## 3. 定期的にdocker関連の不要なファイルを削除する
```docker:ターミナル
$ docker system prune
```



## 4. ECR,ECS(EC2)使用時、ECRのimageを更新した後にcontainerを手動更新する。
```docker:ターミナル
$ ssh -i ~/Desktop/aws-and-infra-ssh-key.pem ec2-user@00.000.000.00
# <<例>>
# pemファイル名 aws-and-infra-ssh-key.pem がローカル環境のデスクトップ上にある 
# ユーザー名 ec2-user 
# EC2パブリック IPv4 アドレス 00.000.000.00

   __|  __|  __|
   _|  (   \__ \   Amazon Linux 2 (ECS Optimized)
 ____|\___|____/

$ sudo systemctl restart docker

$ docker images

$ docker rmi -f 98582946a6a3 a13a9af53122
# docker rmi -f RailsアプリのIMAGE_ID WebサーバーのIMAGE_ID
```

## 5. ECS(EC2)からRDS(PostgreSQL)のdb:resetする。
```docker:ターミナル
$ ssh -i ~/Desktop/aws-and-infra-ssh-key.pem ec2-user@00.000.000.00
# <<例>>
# pemファイル名 aws-and-infra-ssh-key.pem がローカル環境のデスクトップ上にある 
# ユーザー名 ec2-user 
# EC2パブリック IPv4 アドレス 00.000.000.00

   __|  __|  __|
   _|  (   \__ \   Amazon Linux 2 (ECS Optimized)
 ____|\___|____/

$ docker ps

$ docker exec -it d3e294bc6927 /bin/bash
# docker exec -it RailsアプリのCONTAINER_ID /bin/bash

$ echo $DB_DATABASE

$ DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rails db:reset
# RDSをAWSマネジメントコンソールから アクション→再起動 を押して、再起動中に実行する
```
以上です。
丸め誤差のはなし

# まえがき

本記事では，数値計算を行う際に必ずと言っていいほど起こり得る丸め誤差について
簡単なプログラム（Python3）例を添えて紹介していこうと思います．

この記事を読んで少しでも誤差について興味を持っていただき，
シリーズ化予定の「高精度計算」や「精度保証付き数値計算」分野に興味を持っていただければいいなぁと思います。
誤差について記載されている記事は他にもあるので，本記事では以降掲載予定の記事の導入として簡単な紹介にとどめます。

### 追記
次の記事：[エラーフリー変換あれこれ](https://qiita.com/hanyohanyo/items/3e54d85be1827dbc4365)

## 丸め誤差とは
丸め誤差誤差とは実数を浮動小数点数で近似する際に生じる誤差です．
例えば 0.1 を小数点以下 20 桁で表示してみると以下のようになります．

```python3:rounding_error1.py
print(format(0.1, '.20f'))
```
```:実行結果
0.10000000000000000555
```
0.1 と記述しているのに 0.1 より少し大きな値が表示されてしまいました．
これは10進表現の 0.1 が 2 進表現では無限小数になってしまいコンピュータ上では正確に表せず，
有限桁に収まるように値を「丸める」ことで誤差が生じているために起こる現象です．
これを**丸め誤差**といいます．

また，面白いことにコンピュータ上では誤差により少し大きな値となる 0.1 を 100 回足すと...

```python3:rounding_error2.py
a = 0.0 
for _ in range(100):
    a += 0.1 
print(a)
```
```:実行結果
9.99999999999998
```
今度は真の解である 10 より少し小さくなりました．
また，1 に非常に小さな数 $2^{-53}$ を 1 回以上足すと当然 1 より大きくなるはずですが...

```python3:rounding_error3.py
a   = 1.0 
eps = pow(2, -53)
for _ in range(100):
    a += eps 

if a == 1.0:
    print('a == 1.0')
elif a > 1.0:
    print('a > 1.0')
else:
    print('a < 1.0')
```

```:実行結果
a == 1.0
```

結果は 1 となります．
サンプルプログラムでは 100 回足していますが，足す回数が 1000 回でも 10000 回でも結果は変わりません．
このような簡単な計算でも直観に反する結果が返ってくることがあります．
ここまでの例のように浮動小数点数を扱う数値計算では必ずと言っていいほど誤差が生じてしまうのですが誤差を減らすことはできます．
例えば，

* 浮動小数点数の精度を上げる
* 計算順序を変える
* エラーフリー変換を用いた高精度計算を行う

などです。

次回は**エラーフリー変換を用いた高精度計算**により誤差を減らす方法について記事を書こうと思います。

## 参考

https://qiita.com/2754github/items/26a18fe01c8ad221f0ba

https://qiita.com/NNNiNiNNN/items/42107479407d9bb14419
【ＰＨＰ】PHP課題・一言掲示板

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/37605c96-cc3f-0ed9-b0b0-62d45239c8a7.png)


１・利用者が名前とコメントを入力し、発言できる。
２・利用者の過去の発言内容をテキストファイルで管理する。
３・全ての利用者の過去の発言内容を一覧で表示する。
４・最新の書き込みが一番上に表示されるようにする。
５・一覧には「名前」「コメント」「発言日時」の3つを1行ずつ表示する。
６・名前は最大20文字まで。20文字を超えたら、エラーを表示し、発言させない。
７・コメントは最大100文字以内まで。100文字超えたら、エラーを表示し、発言させない。
８・名前とコメントは必須。名前orコメントが未入力なら、エラーを表示し、発言させない。

```PHP
<?php

$error = [];
$date  = date('Y-m-d H:i:s');
$username = '';
$comment   = '';

define('FILE_PATH', './bbs.txt');

if($_SERVER['REQUEST_METHOD'] === 'POST'){

  if(isset($_POST['username']) === true) $username = trim($_POST['username']);

  if(isset($_POST['comment']) === true) $comment = trim($_POST['comment']);




  if ($username === '') $error[] = '名前を入力してください';

  if ($username === '　') $error[] = '名前を入力してください';

  if (mb_strlen($username) > 20 )  $error[] = '名前は20文字以内で発言してください';




  if ($comment === '') $error[] = 'ひとことを入力してください';

  if ($comment === '　') $error[] = 'ひとことを入力してください';

  if (mb_strlen($comment) > 100) $error[] = 'ひとことは100文字までで発言してください';


  if (count($error) === 0) {
    $log = $username ."：".$comment."：".$date;

    $fp = fopen(FILE_PATH, 'a');

    if ($fp !== FALSE) {

      fwrite($fp, $log. "\n");  

      fclose($fp);
    }
}

if (count($error) === 0) {

     
   header("Location:http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
   exit;
  }

}

// 読み込み

$fp = fopen(FILE_PATH, 'r');

if ($fp !== FALSE) {

  $text = fgets($fp);

  while ($text !== FALSE) {

//エスケープ(ハッキング防止)
    $lines[] = htmlspecialchars($text,ENT_QUOTES,'UTF-8');

    $text = fgets($fp);
  }
  fclose($fp);
}


$lines = array_reverse($lines);

?>
<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>ひとこと掲示板</title>
        <style>
              p { color: red; }
        </style>
    </head>

    <body>
        <h1>ひとこと掲示板</h1>

          
            <?php foreach($error as $value) { ?>
                <p><?php echo $value; ?></p>
            <?php } ?>

        <form method="post">
            <label>名前: <input type="text" name="username"></label>
            <label>ひとこと: <input type="text" name="comment"></label>
            <input type="submit" value="送信">
        </form>

        <ul>
        <?php 
          if(isset($lines)){
              foreach ($lines as $line) { ?>

                      <li><?php print $line; ?></li>
                      <?php } ?>

                      <?php } ?>
        </ul>

    </body>
</html>

```
【React】TypeError: Assignment to constant variableの対処法

<h2>症状</h2>
下記ソースを実行したときに、TypeError: Assignment to constant variableが発生してしまいました。
翻訳すると、「TypeError: 定数変数への代入」という内容でした。

```terminal:エラー
TypeError: Assignment to constant variable
```

```react:Hoge.jsx
import React, {Fragment, useEffect}  from 'react' ;

export const Hoge = () => {
    const hoge = ""
    useEffect(() => {
      value= "fuga"
    },[]);
    return (
        <Fragment>
            {/* #{hogeList } */}
        </Fragment>
    )
}
```


<h2>解決方法</h2>
定数に対して再度値を代入しようとしていたため、起きていたようです。
useEffect内で代入せず、useStateやuseReduverで値を管理するとよさそうです。

```react:Hoge.jsx
import React, {Fragment, useEffect,useState}  from 'react' ;

export const Test = () => {
    const [value, setValue] = useState("initialState")

    useEffect(() => {
    　　setValue("fuga");
    },[]);
    return (
        <Fragment>
            {/* #{value} */}
        </Fragment>
    )
}
```

<h2>参考</h2>
https://www.javadrive.jp/javascript/var/index8.html
鎖交磁束と誘起電圧波形の関係


# １．この記事でまとめたいこと
鎖交磁束と誘起電圧波形の関係



# ２．まとめ
電圧方程式とシミュレーション結果（正転/逆転）を示す。一致。
![まとめ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614756/e8333973-0dc0-490b-8a0e-f4c4cd5a4a3f.png)



# ３．シミュレーション環境（Simscape Electrical）
「５．参考サイト」を元に作成した。
![シミュレーション環境.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614756/d7b63973-4d85-6b5d-ae14-eb06dc5e8988.png)
 
  

# ４．参考サイト
IPMSMトルク制御のサンプルモデル。
本モデルをベースにシミュレーション環境を作成した。パラメータも基本不変。
[https://jp.mathworks.com/help/physmod/sps/examples/ipmsm-torque-control.html](https://jp.mathworks.com/help/physmod/sps/examples/ipmsm-torque-control.html)


MATLAB JapanのYouTube動画(Simscape Electricalモーター制御設計 - Part 1: ブラシレスDCモーターの逆起電力のシミュレーション)
3相線オープンのやり方は，これを参考にした。
[https://www.youtube.com/watch?v=ClfQgGZGAVc\&list=PLPQVx3HzGQWIBEalFeEcJkhMY0J166qgJ\&index=19\&t=0s](https://www.youtube.com/watch?v=ClfQgGZGAVc&list=PLPQVx3HzGQWIBEalFeEcJkhMY0J166qgJ&index=19&t=0s)


MathWorksのPMSMについてのドキュメンテーション
パラメータの定義についてはこれを参考にした。
[Permanent magnet synchronous motor with sinusoidal flux distribution - Simulink - MathWorks 日本](https://jp.mathworks.com/help/physmod/sps/ref/pmsm.html)
MacOSターミナルから.gitignoreファイルを後から修正して反映する。（Vimまでの準備）

# はじめに
ChatApp作成途中の
### パッケージ管理ツールで取得できるディレクトリは、GitHubにpushしないようにする準備
・CocoaPods
・GoogleService-Info.plist　（Firebaseにアクセスするためのセキュリティ情報）
上記２つをターミナルで.gitignoreファイル追記する

# 新規作成からの流れ
1. Xcode新規プロジェクト作成
1. GitHubでNew repository作成
1. ターミナルで同期させる（ここでミスりやすい）
1. .gitignoreファイル追記する
1. コミット＆プッシュ

### ターミナルで同期させる
```swift:ディレクトリ移動
// GitHubにプッシュするディレクトリに移動  
% cd /Users/OSアカウント/Desktop/ディレクトリ名１/ディレクトリ名２

//上の代わりにFinderからカンタンディレクトリ指定
% cd Finderの任意ディレクトリをドラッグ
```
```swift:.gitの作成
// ディレクトリをgit管理下に登録  
% git init
```
```swift:ローカル、リモートリポジトリ同期作業
// ローカルリポジトリとリモートリポジトリを同期する設定  
% git remote add origin https://github.com/ユーザ名/リモートリポジトリ名.git
```   
※この時、同期先を間違えてしてしまうこと数えきれず…。
https:// の部分はURLコピペしたほうがいい。

### 間違えて同期してしまった際は
一度originを削除し、再度originを登録すればよい。

```swift
% git remote rm origin
% git remote add origin git@github.com:ユーザ名/リポジトリ名.git
```
同期コマンドを打つと下記エラー文がでる

```swift
% git remote add origin https://github.com/ユーザ名/リポジトリ名.git
fatal: remote origin already exists.
```

### .gitignoreファイル追記する


1. Vimで.gitignoreファイルをオープン
1. iを入力して編集モードに切り替える（INSERT）
1. 追記する podsはコメント外すだけで良さそう
1. escキーを押して編集モード終了する 
1. :wqで上書き保存する
    
```swift:Vim編集フロー
% Vim .gitignore　// 実行後以下の画面がでる
-----------------------------------↓
# General
.DS_Store
GoogleService-Info.plist
-------------------
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
Pods/
#
``` 
  
### 保存せずに終了するコマンド  
```swift:保存せずに終了するコマンド
:q // 保存せず終了
:q! // 保存せず強制終了
```

### コミット＆プッシュ

```
// リモートリポジトリの情報をダウンロード<br>
% git pull origin main

// ディレクトリ配下のファイルをすべてステージングエリアに追加
% git add .

// ローカルリポジトリの状態を確認
% git status

// ローカルリポジトリにコミット
% git commit -m "first commit" // ""の中にコミットコメントを入れる

// コミット情報を確認
% git log

// ブランチ名を変更
% git branch -M main

// ローカルリポジトリをリモートリポジトリにアップロード
% git push origin main
```

# おわりに
GutHubで編集、GitDesktopなど使用していた。
実務ではターミナル操作が多いようなので早く慣れたい。
コピペでヒューマンエラーを防止
同期部分は注意深く

# 参考
[SwiftUIとFirebaseを使って簡単なチャットアプリを作る](https://qiita.com/From_F/items/85ae490283c11c6f795f"")
[gitのエラー　fatal: remote origin already existsの解決方法](https://qiita.com/hatorijobs/items/1cae1946656ece954c63)
新人エンジニアの備忘録

新卒でエンジニアとして入社して二ヶ月が経った。

自習のモチベーションを保つと同時に来年入るかもしれない未来の後輩に向けて、この記事を残していこうと思う。

（　誰かに見られることを想定していないので文章の読みにくさは悪しからず…
　でも『新卒エンジニアが何考えているのか気になる、どう教育したらいいか…』
　そんな風に考えている先輩エンジニアの役には少し立てるかもしれません。　）

今日は初回なので自分に今後必要だと感じていることをまとめておく。
多分6個以上は覚えてられない気がするので５個にした。

1.言語の習得
　　まず同じ言葉が喋れなければエンジニアン達との会話は成り立たない。
　　・毎日の業務の中で得た知識は身に付くようにQiitaにまとめて見直す
　　・始業前の時間・就寝前の時間での学習を習慣化する
2.ルーティンの確立
　　今日はだるいな〜そんな事も思わないほどの習慣化を目指す。
　　・8:00-9:00の言語学習
　　・SNSで情報収集（エンジニア界隈へのアンテナを高くはる）
　　・就寝前30分の読書
3.確認/質問の仕方の工夫
　　新人はどうしても先輩の手を煩わせる。であれば少しでも気持ちよく手を煩わせよう。
　　・答えやすい質問の仕方を意識する（何が聞きたいのか伝わるように）
　　・質問してもわからなかった場合はわかったフリをしない
4.制限時間/目的への意識（業務効率化）
　　日々の業務が忙しくて中々意識が向かないのがここ
　　・業務に取り掛かる前に制限時間を自分の中でセット
　　・その業務の中で自分が得ることができるものは何かを考える
5.マネジメント分野の学習
　　せっかくたくさんのお手本がいるのだから今のうちに盗もう
　　・月一冊マネジメントに関する本を読む
　　・周りのマネージャーの動きをよく見ておく

まずはここから