OmniAICreator/Qiita-1.07M huggingface dataset:
エラーについて質問するときに心がけていること

## はじめに

開発を行っていると必ずエラーに遭遇する。エラーに遭遇したことのないエンジニアはこの世に存在しないだろう。
にもかかわらず、エラーが遭遇してから解決するまでの手引書のようなものは(少なくとも私は)見かけたことが無い。
そのためか、エラーに出会ったとき初心者はすぐに「エラーが出ました！助けて！」と警告を発するように思う。
しかし、警告を発したところでスーパーエンジニアだろうがなんだろうが、やることは決まっているのだ。
エラーに遭遇しても、冷静に、かつ順序だてて解消する。決して怖いものではない。


## 意図

この記事の意図としては、初心者がエラーに遭遇した時に**どのようにして先輩エンジニアに聞けばいいのか。**の一つの指標になればいいと思う。
また、エラー解消までのフローを確認していただければと思う。
ただし、ここに載っているのはあくまで私自身の思いを書き連ねてるだけであることには注意していただきたい。

## 
## 今どのフェーズにいるのか

エラーの解決までには以下の図のようなフローで進むことが多い。
**特にこの図は覚えておいてほしい。**この図だけ覚えてLGTMを押してブラウザを閉じても構わないくらい大切だ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165191/04ee203f-c2ca-78fc-85ae-fe3191d35a54.png)

ここで大事なのは、エラーに遭遇し、エラー解決までの道のりを進む中で、自信がいまどこにいるのか明確にすることである。
収集先が分からないのか、原因が特定できないのか、修正方法がわからないのか。
これがわからないということは、自分がエラー解決に向ける道のりの中でどこにいるのかわからない。いわば迷子状態である。
それを相談相手に伝える必要はない。が、立ち位置を明確にしておくことが大切だ。


## 全て教えてください

「バグがでました。教えてください。」ではわからない。
私自身、まだ経験が浅いためすべてのバグを知り尽くしているわけではない。
まずはそのバグは何なのか知る必要がある。そのため、知りうるすべてを教えていただきたい。
具体的には、

- 何をしようとしたのか
- なにが起きたのか
- どうなってほしかったのか
- **"どこまで何をしたのか"**

もしもこれを伝えない場合、相談された側が**同じことをもう一度行う**ことになる。
相談する人はスーパーマンに見えるかもしれない。しかし、本質的にはあなたとやることは変わらないのだ。
そして、相談される方も時間と頭を使う。相談した人の負担を軽減させるように伝えてあげるのが理想的だ。
先輩エンジニアはなんでも相談窓口ではない。


### 「どこまでしたのか」の補足

**上記フロー(今どのフェーズにいるのか)の中で**、どこまで、何をしたのか教えていただきたい。
例えば、

>「APIがステータス200を返す想定でしたが、500が返ってきます。
CloudWatchLogにはERRORが1件出ていました。
エラー文にはAccess Deniedと出ていて、権限系のエラーではないかと思うのですがどの権限を足せばよいのかわかりません。
ログのURLは http://hogehoge です。スクショはこちらです。[画像]」

これだけで

- 情報収集先はあっているのか？
- 原因は本当にあっているのか？
- 修正対象はどこなのか？

とアタリをつけることができる。その他、

> 「Eventから起動するLambdaの動作を確認しようとしたらログが出ていませんでした。他に調査するべきところはありますか？」

ならば調査対象が分からないのだとすぐにわかります。


## 何をしてほしいのか明確にする

上記の聞き方で大方見当は付くのだが、要求している情報を明確にしていただけるとなおのこと有難い。
原因が特定できていないのか、修正方法がわからないのか、情報源が分からないのか。。。

それによって相談された人は何を伝えればいいのかわかるので気が楽になる。相談される方も人間なのだ。


## 情報は共有すること

ここから先はチームとしての立ち振る舞いになる。

エラーというのは資産だ。エラーに出会えば出会う程、エンジニアのスキルは向上すると私は思う。
しかし、この**資産**を共有しない人が多いのもまた事実だ。

あなたが出会うことのできたエラーは、世界中のエンジニアが遭遇する可能性のあるエラーである。
それを共有しないのは非常にもったいない。
ましてや、チーム内の出来事であれば尚更だ。
あなたの遭遇したエラーはすでにチーム内で発生し、解決方法を知っている人がいるにも関わらず、丸1日時間を使ってしまった。そんなことがありえるだろう。
slackなどの共有ツールがあるならば、周知しないのは宝の持ち腐れだ。

**エラーは資産**だ。恥ずかしいことではない。

宝を共有せず、独り占めしてる方がよっぽど恥ずかしい。


## 明日は我が身

エラーに関心を持とう。ある程度チーム内で開発が進むと、***エラー専門部隊***のようなものが発足することがよくある。
エラーが発生するや否や、どこからともなく飛び出てきてエラーを解消してくれるスーパーヒーローだ。
しかし、**それは非常に危険な状態**である。

そのスーパーヒーローが居なくなることは決してないのだろうか？
ヒーローがいなくなった時、あなたは代わりになることはできるだろうか？

エラーの改修は専売特許ではない。共通資産である。
彼らはエラーを直さないと次に進めないからエラーを直しているに過ぎない。

そのような状態になったら一度チーム内で相談してみるのをお勧めする。

誰がいつ居なくなるかなんてわからない。でも、仕事は止まらない。

## 最後に

ここまで読んでいただいてありがとう。

具体的なエラーの解消方法はここには記述していないけれど、エラー解消のためにはどのようなフローを踏み、どのように質問すればいいのかわかっていただけたならうれしい。

この記事が少しでもエラーの解消、並びに良いチームへ進むためのヒントになれば幸いです。
シェルスクリプトを対話式にする

#シェルスクリプトを対話式にする

シェルスクリプトも対話式にして複数の機能を呼び分けるように使いやすくしたいなーと、
思って調べたらselect構文が適していたので記録しておく。
結構シンプルに実装できるなーという印象。

```shell
# 機能の選択
select cmd in CREATE DROP START STOP QUIT
do
	case $cmd in
		CREATE)
			echo "作成します"
			echo ""
			
			#ここにCREATE処理を書く
			;;
		DROP)
			echo "削除します"
			echo ""
			
			#ここにDROP処理を書く
			;;
		START)
			echo "起動します"
			echo ""
			
			#ここにSTART処理を書く
			;;
		STOP)
			echo "停止します"
			echo ""
			
			#ここにSTOP処理を書く
			;;
		QUIT)
			echo "スクリプトの処理を終了します"
			break
			;;
		*)
			echo "$REPLY という選択肢はありません"
	esac
done
```

実行すると以下のように入力待ちになるので、対応する数字を入力してENTERを押して選択。

```shell 
1) CREATE
2) DROP
3) START
4) STOP
5) QUIT
#? 
```
Leetcode 30 天挑戰, Week 5 Day 2, Check If a String Is a Valid Sequence from Root to Leaves Path in a Binary Tree, in Swift

對這題第一感覺是，這個標題怎麼可以這麼長 ... 馬上開始有點恐怖。

資料結構與演算法： `Hash Table` `Tree` `Backtracking`

- 挑戰頁面： <https://leetcode.com/explore/challenge/card/30-day-leetcoding-challenge/532/week-5/3315/>
- 題目原頁面：尚無

## 分析題目

一開始有點看不懂他怎麼樣算是 valid sequence ，於是就開始認真的啃範例數組。於是就得出下列幾點：

- 如果從 root 開始走訪，走到末節點，經過的數值可以符合 `arr` 的內容就能算是有合法的序列。
- 走訪到的順序可以不用依照 `arr` 中的先後順序。

### 對應的解法

- Hash Table - 需要次數，不需要順序最適合的資料結構
- Backtracking - 由於要探索到最末端的節點，也就是往深走，就可以從 backtracking 開始想。

### Backtracking 為基礎的單一節點分析

Backtracking 最重要的其中之一就是決定停止遞迴（或可以說停止 subroutine ）的條件

- 停止走訪的條件
  - 節點是空的：可能合法可能不合法
  - 節點不是空的，但是 hash table 已經空了：不合法
  - 如果目前節點的值沒有在 hash table 中：不合法
  - 目前節點的值有符合，往深走之前把目前的值的計數減一。如果這時候 hash table 為空值就中斷：如果沒有左葉也沒有右葉，代表合法；否則不合法
  - 走訪左葉後發現有合法，代表不需要再找了因此可以停止走訪
  - 走訪右葉後發現有合法，代表不需要再找了因此可以停止走訪

走訪過程中做的事情大致上就這些：

- 走訪左右葉之前，要把當前值的計數減一
- 如果左右葉都沒有合法的結果的話，就把計數復原

### 思考過程

建議一定要拿個紙筆起來畫畫看會比較好懂！

## 程式碼

每個關鍵步驟都註解了，如果有不清楚的地方歡迎留言～！

``` swift
class Solution {
    func isValidSequence(_ root: TreeNode?, _ arr: [Int]) -> Bool {
        var hashTable = [Int: Int]()
        var isValid = false
        
        // 紀錄數字出現的次數。
        for number in arr {
            hashTable[number] = (hashTable[number] ?? 0) + 1
        }
        
        // 從 root 節點開始走訪
        subroutine(root, &hashTable, &isValid)
        
        return isValid
    }
    
    private func subroutine(_ node: TreeNode?, _ hashTable: inout [Int: Int], _ isValid: inout Bool) {
        // 若 node 為空值則中斷走訪。
        guard let node = node else { return }
        
        // hash table 空了還有 node 的話代表不合法。
        guard !hashTable.isEmpty else { return }
        
        // 如果在 hash table 沒有目前節點的計數的話，就中斷。
        guard var count = hashTable[node.val], count > 0 else { return }
        
        // 更新計數。歸零的話，設為 nil ，尚未為零就賦予新計數。
        let newCount = count - 1
        hashTable[node.val] = newCount == 0 ? nil : newCount
        
        // 如果 hash table 為空值，都沒有左右節點的話就為 true ，否則 false 。
        // 再來因為 hash table 已經淨空，也不需要再繼續走訪，所以直接中斷。
        if hashTable.isEmpty {
            hasValid = node.left == nil && node.right == nil
            return
        }
        
        // 檢查左節點。
        subroutine(node.left, &hashTable, &hasValid)
        // 如果走訪完左節點後已經有結果的話，就中斷走訪。
        if isValid { return }
        
        // 檢查右節點。
        subroutine(node.right, &hashTable, &hasValid)
        // 如果走訪完右節點後已經有結果的話，就中斷走訪。
        if isValid { return }
        
        // 還沒有找到結果，退出當前節點之前，把計數復原。
        hashTable[node.val] = count
    }
}
```

## 複雜度分析

令 n 為節點數， m 為 arr 長度/元素數量。

- 時間複雜度 - O(n)
  - 最不幸的話，每個節點都會拜訪過一次
- 空間複雜度 - O(1) (見 `疑慮` )
  - 原始想法：從需要一個 hash table ，最壞情形是每一個值都不同出發來想的話，空間複雜度是 O(m) 。
  - 疑慮：有鑒於內涵的值，最多只會到 9 (`0 <= arr[i] <= 9`)，因此嚴格來說 hash table 最多只會用到 10 個位置。於是 O(10) -> O(1) 。

因為自己心裡有疑慮，所以有什麼想法都歡迎討論！

## 執行結果

Swift 的提交數還太少所以沒有 beats 幾趴的數據。

``` text
Runtime: 208 ms
Memory Usage: 21.3 MB
```
Apollo ClientでSSRする時に知っておくといいかもしれないこと

この記事は便宜上next.jsのexampleを例に出しているが、apollo clientでSSRしていればわかる内容になっているはず。

## デフォルトのままでは使えない？

[next.js公式のtypescript例](https://github.com/zeit/next.js/tree/canary/examples/with-typescript-graphql)を参考に実装を進めていると、データの取得とキャッシュ周りで、あまりうれしくない挙動をしていた。

## うれしい挙動とは

apolloのキャッシュ機能をうまく使えば、サクサク動く、サーバー＆データベースにやさしいスーパーサービスが作れるはず。
しかし、しんどさと複数タブのことを考えると、少なくともブラウザ上で動くサービスに関しては、以下のような挙動がうれしいのではないだろうか？

- SSRしたときにデータを取得し、クライアントは送り付けられたデータをそのまま使う。
- ページ移動→戻ってくるときにはもう一度データを取りにいく。

## exampleの挙動とは

with-typescript-graphqlを動かしてみると、データ取得のタイミングは以下の通りになっている。

- SSRしたときにデータを取得し、クライアントは常にそのデータを使う。

これはapollo clientのデフォルトの動きなので、別にexampleが悪いわけではないが、上記のうれしい挙動には程遠いものである。

## どうすべきか

まず、クエリを投げる関数に、キャッシュを使わないよう、fetchPolicyオプションを渡す必要がある。
fetchPolicyのデフォルトの値は`cache-first`であり、これはキャッシュがなければ（つまり初回）データを取りに行き、以後はキャッシュを使う、という設定だ。

これを`cache-and-network`に変えよう。
`cache-and-network`は、毎回新しいデータを取りに行き、更にキャッシュも活用してくれるという賢いやつだ。
「俺はキャッシュされるような、そんな安ぽい人間じゃない」と考えるストロングスタイルの方々は、`network-only`を使おう。

以下はreactの例である。
qiitaの上で直接書いたものだから多少間違えてるかもしれないが、雰囲気で分かるはずだ。

```js
import { useQuery } from '@apollo/react-hooks';
export default () => {
  const {loading, error, data} = useQuery(QUERY, {fetchPolicy: 'cache-and-network'});
}
```

しかしこの方法ではいちいち指定することになってしまうのだが、当然デフォルト値を差し替えることもできるので、安心して下まで読んで欲しい。

## 現状確認

現在の挙動はこうなっているはずだ。

- SSRしたときにデータを取得する
- クライアントで表示した時、またデータを取得する。
- ページ移動→戻ってくるときにはもう一度データを取りにいく。

お気づきだろうか？　このままだとユーザーがページを開いたときに二回データ取得が発生してしまい、データベースが爆発するのだ。
二回目のデータ取得は全く意味がないので、これを何とかしよう。

因みにこの問題については2017年にissueが建てられているのだが、一度修正されてからまた再発したのかは知らないが、まったく解決される気配はないし、クローズされている。
https://github.com/apollographql/apollo-client/issues/2119

## 不要なリクエストを削減

`new ApolloClient`時に渡せる、`ssrForceFetchDelay`オプションを使おう。
このオプションは指定されたミリ秒間、fetchをせずキャッシュを使うというものだ。
これによって、クライアントにページが表示された直後の不要なデータ取得をなくすことができる。
セットする時間は[公式のドキュメント](https://www.apollographql.com/docs/react/performance/server-side-rendering/#store-rehydration)に倣って、`100`にしておこう。

```js
const client = new ApolloClient({
  cache: new InMemoryCache().restore(window.__APOLLO_STATE__),
  link,
  ssrForceFetchDelay: 100,
});
```

## 最終形態

どうすべきかの項で約束していた`fetchPolicy`のデフォルト値の差し替えを追加した最終形態がこれだ。

```js
const client = new ApolloClient({
  cache: new InMemoryCache().restore(window.__APOLLO_STATE__),
  link,
  ssrForceFetchDelay: 100,
  // これでfetchPolicyのデフォルト値を変えられる
  defaultOptions: {
    watchQuery: {
      fetchPolicy: 'cache-and-network'
    },
  },
});
```

これであなたの

```js
import { useQuery } from '@apollo/react-hooks';
export default () => {
  const {loading, error, data} = useQuery(QUERY);
}
```

は

- SSRしたときにデータを取得し、クライアントは送り付けられたデータをそのまま使う。
- ページ移動→戻ってくるときにはもう一度データを取りにいく。

になる。
scp -pr が遅いのを何とかする

# scp -pr が遅いのを何とかする

大量の小さなファイルを scp -pr をすると遅いのを何とかする.

```sh
$ du -hs 201703
2.3G    201703
$ find . -name '*.gz'|wc -l
32736
```

というわけで、2.3GB、3万個のファイルの転送. 素直に scp -pr すると

```sh
$ time scp -pr 201703 user@203.0.113.4:~/tmp/
Password:

...
...

real    6m46.450s
user    0m28.824s
sys     0m58.958s
```

と 5.8MB/s 程度だった.

これを工夫すると

```sh
$ time tar cf - 201703 | ssh user@203.0.113.4 'cd tmp; tar xf -'
Password:

real    1m50.797s
user    0m16.753s
sys     0m25.793s
```

21.4MB/s に改善.
Rails6.0でfont-awesome実装。軽い気持ちで臨むと意外とハマる落とし穴

ビューを書いていると何かと使うfont-awesome。
調べると[こちらのサイト](https://qiita.com/d0ne1s/items/16b0815bb5bc0ed13eb8#viewport%E3%82%92%E8%A8%AD%E5%AE%9A)で意外とさらっと書いてあるので、
簡単に実装できると思っていたが、ハマってしまったので書き留めました。



#今回出たエラー

font-awesome実装のためのコードを書き終わった！と思い、
ファイルを保存しようとしたら、以下のエラーが出ました。


```
Error: File to import not found or unreadable: font-awesome-sprockets.
in: /Users/~/environment/app名/assets/stylesheets/application.scss (16, 2)
```

これはターミナル上で出たものではなく、
エディタ（Atom）上で出たものです。
**このエラーはAtomの問題である可能性が高いです。
ですが、実装できなかったのは事実なので、以下で解決していきます。**

#開発環境

OS: 64bit Mac macOS Catalina 10.15.3
Ruby 2.6.3
Rails6.0
エディタ　Atom
gem 'sass-rails'をbundle install済

#実装までの手順

##ミスその1

以下、いきなり間違ってるので打たないようにしてください！

```php:Gemfile
gem 'font-awesome-sass', '5.4.0'
```

ターミナルで、

```
bundle install
```

はい、この時点でミスってました。
純粋にバージョンが古かったです。

作業時に見ていたサイトに書いてあったバージョンを、
そのままインストールしてしまいました。

しょうもないことなんですが、'5.4.~'と'5.12.~'を見て、
前者の方が新しいじゃん！と錯覚してしまいました笑

僕のような人はいないと思いますが、それでも最新バージョンがいくつなのかはまじで気をつけてください！

結果、

```php:Gemfile
 gem 'font-awesome-sass', '~> 5.12.0'
```

が正しかったです。


##ミスその2

`app名/app/assets/stylesheets/application.css`を`application.css.scss`に変更（~.scss）でも可。

```php:app/assets/stylesheets/application.scss
 @import 'font-awesome-sprockets';
 @import 'font-awesome';
```

これでビュー内でアイコンを使えるはずでした。

しかし、エディタでは冒頭のエラーが出てしまいました。。


原因は[ここ](https://github.com/rails/sass-rails)で明らかになりました。

>##Important Note
>Sprockets provides some directives that are placed inside 
>of comments called `require`, `require_tree`, and `require_self`.
>**DO NOT USE THEM IN YOUR SASS/SCSS FILES.** 
>They are very primitive and do not work well with Sass files. Instead, use Sass's native `@import` directive which `sass-rails` has customized to integrate with the conventions of your Rails projects.


`application.scss`内の`require_tree`等を消さなきゃいけなかったんですね。

```php:app/assets/stylesheets/application.scss
 *= require_tree　　//この2行を消去
 *= require_self
```

この2行はデフォルトで書いてあるはずなので、注意してください。


#無事、実装

最後に、

```php:app/views/tasks/index.html.erb
 <%= icon('fas', 'flag') %>
```

無事、ビューにfont-awesomeのアイコンが描画されました。
解決してくれたメンターの友人に感謝です。

#追記

紹介した2つのミスはfont-awesomeの実装に影響していましたが、
Atomで出た以下のエラーはRailsにおけるfont-awesome実装とは別の問題でした。

```
Error: File to import not found or unreadable: font-awesome-sprockets.
in: /Users/~/environment/app名/assets/stylesheets/application.scss (16, 2)
```

原因はAtomのパッケージで使用していた[sass-autocomplile](https://atom.io/packages/sass-autocompile)のようです。

パッケージをDisableにしたところ、
.cssファイルの自動生成が止まったのでエラーが出なくなりました。
しかも、.scssファイルの上書き保存がそのまま描画されるんですね、便利。
リレーションで取得したデータをviewに表示したところ謎のエラー発生

環境 laravel6.2

## 目標、リレーションしたデータをviewに表示

テーブルを作成

| chat_messages    |      
|:-----------------|
| id             |  
| message           |         

```User.php
public function chatMessage()
 {
  return $this->hasMany('App\ChatMessage');
 }
```

```UserController.php

public function index()
 {
  $users = User::all();
  $users->load('chatMessage');
 }
```

```home.blade.php
@foreach ($users as $user)
  <p>{{ $user->chatMessage->message }}</p>
@endforeach
```

謎のエラー発生

```error
Property [message] does not exist on this collection instance. 
```

# とりあえず配列だけ表示してみる

```home.blade.php
@foreach ($users as $user)
  <p>{{ $user->chatMessage }}</p>
@endforeach
```

```
// 出力結果
{"id":15,"message":"\u3059\u3054\u3044"},{"id":16,"message":"\u30b9\u30cb\u30fc\u30ab\u30fc"}
```

出力できたものの、なぜかメッセージが文字化けしている。

# さらにforeachで回してみる

``` home.blade.php
@foreach ($users as $user)
  @foreach ($user->chatMessage as $chatMessage)
 {{ $chatMessage->message }}
  @endforeach
@endforeach
```
これなら出力できました。
ただ仕組みがわかっていないのでよければアドバイスいただけると幸いです。
RX72N Envision KitのESP32へのATコマンド試行 (2)

ロジアナでの波形確認
---
KitのESP32-WROOM-32DにRX72NからUART経由でATコマンドを送信したところ'AT'という文字列が返ってくるというのを前のエントリでしたのですが、ANALOG DISCOVERY2を買いましたので送受信データの状態を確認しました。

UARTの送受信波形です。思っていたよりも受信データが長かったです。
![ESP32正常1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/3bc186d2-785e-3a7a-52a8-6e3c999af7db.png)
UARTの送信波形です。'AT\r\n'が正しく送信されています。
![ESP32正常2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/a30d59b8-50eb-fa16-aedb-00237f52da98.png)
受信波形です。OKの文字があるではありませんか。
![ESP32正常3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/8802de76-55d0-4720-2fc4-984736cfbe57.png)

'OK'の二文字しか返ってこないと思っていたためプログラムも2文字のみ受け取るような形で書いていたのですが、送信した文字列+CR+LF+'O'+'K'+CR+LFという形式で戻ってきているということでそのように修正する必要があります。

なお、文字列に誤りがある場合は下図のように、"ERR"という文字付きで返ってきました。
![EPS32エラーRXD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/b09fa0c5-9a9b-0ac0-b55e-8bd82847810e.png)

結果
---
KitのESP32には出荷状態でATコマンドを受け付けるファームが書かれていることがこの結果からもわかりました。
Notion APIを利用して，Qiitaの最新記事を指定時間に取得する

# はじめに
Qiitaで気になるタグの最新記事をNotionに追加するためのスクリプトを書きました．
crontabを使って指定時間にスクリプトを実行すれば，最新記事が自動的にNotionに追加されるようになります．

# スクリプト

```python:main.py
# coding: UTF-8
from notion.client import NotionClient
from notion.block import TodoBlock
import requests
import json
import datetime

# Obtain the `token_v2` value by inspecting your browser cookies on a logged-in session on Notion.so
client = NotionClient(token_v2= <<token_v2>> )

# Replace this URL with the URL of the page you want to edit
page = client.get_block(<<block>>)

# Typescriptに関する記事を5つ取得しています
url = "https://qiita.com//api/v2/items?page=1&per_page=5&query=tag%3Atypescript"

response = requests.get(url)
jsonData = response.json()
today = datetime.date.today()

for jsonObj in jsonData:
  newchild = page.children.add_new(
      TodoBlock, title="【{0}】[{1}]({2})".format(today.strftime('%Y%m%d'), jsonObj["title"], jsonObj["url"]))
```

`<<token_v2>>` には，ログインしたページのクッキーの「token_v2」という項目の値を入力します．
`<<block>>`には，記事を追加したいpageのURLを入力します．

これを実行すると，以下のような感じで記事が追加されます．

![notionapi.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376174/f59c1203-d4dc-5a55-4247-98fe105677e3.gif)
Luceeを手動で更新する方法

通常はLuceeの管理画面から更新できるんですが、更新できない場合は手動で更新します。

[公式のドキュメント](https://docs.lucee.org/guides/updating-lucee/update.html)にも方法が載っていますが、ここに少し詳しくメモしておこうと思います。手順は以下の通り。

##手順

###１．[Luceeダウンロードページ](http://stable.lucee.org/download/?type=releases)から最新の「.lco」ファイルをダウンロードします。
![2020-05-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106969/2ebcd503-ab4d-7bda-351e-95fc64b358e0.png)
↑「Core」っていうリンクです。

###２．Lucee Serverを停止します。

```bash
# /opt/lucee/lucee_ctl stop
```

###３．ダウンロードしたファイルを「{server-context}/patches」にコピーします。

サーバーコンテキストは通常​​「{Lucee-Server}/lib/ext/lucee-server/patches」にあります。
...って公式には書いてあるのですが、私の環境（CentOS7）では「/opt/lucee/tomcat/lucee-server/patches」でした。

###４．Luceeを再起動します。

```bash
# /opt/lucee/lucee_ctl start
```

以上です。
PL・PMがやってはいけない事

私のゴールは**「開発メンバーに最高に楽しい開発を経験してもらうこと」**です。そんな環境を作るためにPL・PMを目指しています。
今回はそのゴールを実現するためにもPL・PMがやってはいけない事をまとめました。
（この記事は私のPL・PMとしての理想像を元に書かれているため、現実ではなかなか実現できない箇所もあると思います。）

#Doneの定義をコロコロ変えてはいけない
メンバーの作業が終わってレビューの段階になってから「あれもやって欲しかったんだよなー」と追加注文をしない。作業が終わらなくなってしまいます。
何を持って完了とするかは事前に見える化する。あとから変更がある場合は先に「変更があるかもしれない」と一言説明をしておく。これでメンバーのストレスがだいぶ減ります。

#プロセスではなく、人で管理してはいけない
例えば何かしらの不具合が発生した時「誰がやった！」と犯人探しを始めるのは良くありません。
「どの工程で発生したのか？」「何が原因だったか？」「今回の対応策と今後の対応策は？」といった不具合に至るまでのプロセスを一旦見直し、それから担当者の責任について話をするべきです。
逆に仕事ができる人に「あの人に任せておけば大丈夫」と言うのも同じく危険です。優秀な人の仕事の仕方からチーム内のプロセス改善を行うことで、一部の人に作業が集中する状況を無くし、チーム全体の生産性の向上を目指したい。

#わからないことは誰にも見えないところで聞く雰囲気を作らない
「こんな事もわからないと思われるなんて恥ずかしい！」と思い、個人チャットとかで質問しがちになり、結局一部の人に色んな人から似たような質問が来ること、よくあると思います。
これはみんなが見える場所で質問できる雰囲気があるとコミュニケーションコストがだいぶ減ります。

#指示を口頭で済まそうとしない
口頭で指示を出すと最初と最後で言うことが違ったり、いわゆる「言った言わない問題」に繋がりやすいです。
面倒でも文字にしたり証跡に残したりしたほうが手戻りが少なくなります。

#レビューアとしてレビューの品質向上を怠らない
レビューしても不具合が見つかる理由の一つにレビューアによるレビューの品質があげられると思います。どんなにメンバーが品質改善に取り組んでもレビューアの指摘が的はずれだとどんどんコストが増えてしまいます。PL・PMは知識と技術について怠らない努力を常にする必要があります。

#まとめ
名著ピープルウェアにこう記されています。
>プログラミングコンテストのデータから見つかった生産性向上の要因のなかでも、意外だったものがある。それは**誰とチームを組んでいるか**である。例えば、パートナーの成績が良ければ、もう一人もやはり優秀な成績をあげた。一方、いつまでたってもプログラムの出来上がらなかったプログラマの相手も、どういうわけか同じことになった。さらに途中で投げ出したプログラマも、もう一人はやはり同じ結果となった。

いわゆる**「何をするかではなく誰とするかが大事」**という事を指していて、確かにその通りだと思います。

ただ、私は誰とチームを組むことになっても最後にはメンバーには優秀になって欲しい。チームとして機能して欲しい。楽しく開発をやってほしい。
常にそういった環境を作れるようになるために、今回はべからず集といった形で記事にしてみました。
匿名型objectを特定クラスのインスタンスに変換する


# はじめに

匿名型のオブジェクトをクラスのインスタンスにしたいとき、ありますよね。

## こんなソースコードは嫌だ

例えば、こんなソースがあったとします。

```csharp
using System;

namespace tekitou
{
    class Program
    {
        public class DataClass
        {
            public string strText { get; set; }
            public int numHoge { get; set; }

            public override string ToString()
            {
                return $"{strText}, {numHoge}";
            }
        }

        static object NanrakaFunction()
        {
            return new { strText = "hogehoge", numHoge = 323 };
        }

        static void Main(string[] args)
        {
            var obj = NanrakaFunction();
            var fuga = (dynamic)obj as DataClass;
            if (fuga == null)
            {
                Console.WriteLine("fuga is null");
            }
            else
            {
                Console.WriteLine(fuga);
            }
        }
    }
}
```

- 「`NanrakaFunction`が staticなのヤバい」
- 「`NanrakaFunction`の 型、なんで `DataClass` じゃないの？」

などなど、`static object NanrakaFunction` の設計が激やばなのは認めます。
ただ、上記のソースコードほどではないとはいえ、こういう設計にならざるを得ないこともあるのではないでしょうか。

## 実行結果

このソースコード、実行すると当然

```
fuga is null
```

が返されます。
ではどうするか？それが今日の本題です。


# 解決方法

これ、**バッドプラクティスな可能性がだいぶあります**ので、
使用する際は自己責任で。

## わたし、気づきました。

```csharp
Console.WriteLine(JsonSerializer.Serialize(obj));
```

↓

```
{"strText":"hogehoge","numHoge":323}
```

## 実装

```csharp
static void Main(string[] args)
{
    var obj = NanrakaFunction();
    var strJson = JsonSerializer.Serialize(obj);
    var fuga = JsonSerializer.Deserialize<DataClass>(strJson);

    if (fuga == null)
    {
        Console.WriteLine("fuga is null");
    }
    else
    {
        Console.WriteLine(fuga);
    }
}
```

バッドプラクティス臭がプンプンしますね！
要は一旦JSONでシリアライズできる形ならJSON文字列化してしまって、
あとでデシリアライズすればいいのです。

## 型チェックもちゃんとできる

例えば、 `numHoge` に float型の数値をいれてみたところ・・

```
例外が発生しました: CLR/System.Text.Json.JsonException
型 'System.Text.Json.JsonException' のハンドルされていない例外が System.Text.Json.dll で発生しました
 内部例外が見つかりました。詳細については、変数ウィンドウの $exception を参照してください。
 最も内側の例外 	 System.FormatException : Either the JSON value is not in a supported format, or is out of bounds for an Int32.
   場所 System.Text.Json.Utf8JsonReader.GetInt32()
   場所 System.Text.Json.Serialization.Converters.JsonConverterInt32.Read(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options)
   場所 System.Text.Json.JsonPropertyInfoNotNullable`4.OnRead(ReadStack& state, Utf8JsonReader& reader)
   場所 System.Text.Json.JsonPropertyInfo.Read(JsonTokenType tokenType, ReadStack& state, Utf8JsonReader& reader)
   場所 System.Text.Json.JsonSerializer.ReadCore(JsonSerializerOptions options, Utf8JsonReader& reader, ReadStack& readStack)
```

いいぞ。

ちゃんとデシリアライズ時の例外をチェックすれば、型がちゃんとできてるかどうかもわかります。

# 終わりに

とまぁ、今回は `NanrakaFunction` というかたちで、関数で定義しましたが、
引数でやってくる場合もあるわけです。（objectで受けるな、というのはあるが）

とりあえずの処置として使えるかな、ということで記事にしてみました。
変換を自前で書くほどデンジャラスなこともないと思うので、公式のライブラリに委ねてみましょう、ということでした。
ASEとGPAWでDFT計算を行う

ASEとGPAWを用いてDFT計算を行ってみます．簡単な例として水素分子の原子化エネルギーを求めましょう．

- ASEは原子シミュレーション用のPythonモジュールです．[多くの機能](https://wiki.fysik.dtu.dk/ase/tutorials/tutorials.html)が実装されています．[Calculatorクラス](https://wiki.fysik.dtu.dk/ase/ase/calculators/calculators.html?highlight=calculator#module-ase.calculators)をインターフェースとして各種コードを呼び出すことができます．
- GPAWはPAW法とASEに基づいたDFT計算コードです．C言語とPythonにより記述されています．[広く使用されて](https://wiki.fysik.dtu.dk/gpaw/documentation/literature.html#citations-of-the-gpaw-method-papers)います．

以下の例はJupyterLabを用いて実行しました．

## インストール

Anacondaで構築したPython環境に，pipでASEとGPAWをインストールします．

```
$ pip install ase --user
$ pip install gpaw --user
```

GPAWのPAWのデータセットもダウンロードしてください．

```
$ gpaw install-data $HOME/gpaw-data
```

インストールは以上で終わりです．
この段階で私の環境は次のようになっています．

```
$ python --version
Python 3.7.6
$ pip list installed | grep -e ase -e gpaw
ase                                3.19.1
gpaw                               20.1.0

```

## GPAWの計算条件

次の条件で`GPAW`クラスをインスタンス化します．

- カットオフエネルギー: 300eV
- 汎関数: PBE

```python
from gpaw import GPAW, PW

gpaw = GPAW(mode=PW(300), xc='PBE')
```

## 水素分子のモデルを作成

`ase.build` モジュールには小分子のプリセットが含まれます．
`molecule`関数に分子式を渡すだけで，3次元の分子モデルである`Atoms`オブジェクトを作成できます．
今回は孤立系の計算を行いたいので，作成した`Atoms`オブジェクトの`center` メソッドを呼び出して，モデルに3.0Aの真空層を追加しています．

```python
from ase.build import molecule

atoms_h2 = molecule('H2')
atoms_h2.center(vacuum=3.)
```

`view`関数で可視化することができるので，分子の構造を確認しておきましょう．

```python
from ase.visualize import view

view(atoms_h2)
```

![ase_viewer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629650/62dbb917-fa41-4def-9721-b17a08646fae.png)


## 計算を実行する

`Atoms`オブジェクトにGPAWの`Calculator`を関連付けて，`get_potential_energy`関数を呼び出すと，GPAWによる計算が実行されます．

```python
atoms_h2.set_calculator(gpaw)
e_h2 = atoms_h2.get_potential_energy() # takes several seconds
```

## 水素原子の計算

水素原子についても同様に計算を行ってやります．

```python
atoms_h = molecule('H')
atoms_h.center(vacuum=3.)
atoms_h.set_calculator(GPAW(mode=PW(300), xc='PBE', hund=True))
e_h = atoms_h.get_potential_energy()
```

## 結果の表示

最後に結果をまとめてみましょう．
H<sub>2</sub>の原子化エネルギー$\Delta E$は次式で得られます．

$\Delta E = 2 E_{\rm H} - E_{\rm H_2}$ 

同時に分子構造もNotebook上に表示してみます．
matplotlibのラッパである`ase.visualize.plot`モジュールを使用します．

```python
import matplotlib.pyplot as plt
from ase.visualize.plot import plot_atoms

delta_e = 2 * e_h - e_h2
print(f'Atomization Energy: {delta_e: 5.2f} eV')

fig, ax = plt.subplots(1, 2, figsize=(8,6))

title = f'Calculation Result for {atoms_h2.get_chemical_formula()}\n' + \
        f'Total Energy : {atoms_h2.get_potential_energy(): 5.2f} eV'
ax[0].set_title(title)
ax[0].axis('off')
plot_atoms(atoms_h2, ax=ax[0], rotation='90x')

title = f'Calculation Result for {atoms_h.get_chemical_formula()}\n' + \
        f'Total Energy : {atoms_h.get_potential_energy(): 5.2f} eV'
ax[1].set_title(title)
ax[1].axis('off')
plot_atoms(atoms_h, ax=ax[1], rotation='90x')

plt.show()
```

![atomization_hydrogen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629650/855f24c7-e785-79d0-86b0-344d2201dc84.png)


## 参考
- Atomic Simulation Environment <https://wiki.fysik.dtu.dk/ase/>
- GPAW <https://wiki.fysik.dtu.dk/gpaw/>
scpでno matches foundと出て実行できない時 zsh *

#scpでno matches foundと出て実行できない時 zsh *（ワイルドカード）

よく使うけど、毎回忘れそうなのでMemo。

**$ scp -p Username@Hostname:/PATH/*.fastq ./**
とか、**ファイル名の指定に*（ワイルドカード）を使用する**と、no matches foundと表示され実行されない。

詳しくは知らないが、bashだと問題なかったが、zshだと*で補完がかかってしまう為にこのようになるらしい。

scpを行う前に
**$ setopt nonomatch**
を実行すると、その後のscpが上手くいく。
ただ、exitで終了すると、次にscpで*を使う時に、またsetoptの実行が必要。

.zshrcに加えておけば、毎回実行する必要はない。
setopt nonomatchが何を指しているか理解してないので、なんとなく自分は加えていない。
「自己紹介」 ~私文男子の格闘第0話~

#自己紹介
(2020/5/1投稿)
はじめまして。私文男子と申します。
身分はというとその名の通り、都内私立大学に通う大学4年生男子でございます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/b15778f6-aaa1-d781-50bc-e5ae7b515af3.png)


普段、大学ではデザイン思考を使ったサービスデザイン、認知科学を応用した行動デザインを学んでいます。
趣味はテニスで小学校に入る前からはじめ、現在も続けております。

コロナで大変な世の中ですが、ありがたいことに外資系IT企業から内定を頂いていて、来年の4月からエンジニアとして働き始めることが決まっています。

#Qiitaを始める経緯
先述の通り、私は来年からエンジニアで働くことになったわけですが、今までプログラミングというものにほとんど触れたことがありません。そう、なぜなら文系だから！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/545983fc-2757-6186-85f8-1ebd4276b5ae.png)

しかし、エンジニア職を求めて私が就活したのにはもちろんワケがあります。
それは**「自分の手でサービスを作れるようになりたい」**から。
普段の自分の研究ではサービスをプランニングできるようにはなれても作るところまではやりません。でも私は、**サービスを机上の空論で終わらせたくない**のです。

そこでエンジニアの勉強がてら、記事もアウトプットとして書いていこうと思ったワケですね。

ということで、ここから就職までの1年間を使って
####自分で考えたサービスを自分でモバイルデバイスで表現できるようになる
ことを目標に記事を書いていきたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/c1255cc7-a016-b4f0-0fec-83b3c6084aa6.png)


#このブログの内容
でっかい目標を宣言したところで、このブログで書く予定のトピックを整理します。

- プランニングPart
 - デザイン思考について
 - その他思考方法に関する記事
        
- デザインPart
 - Adobe illustratorについて
 - AdobeXDについて
 - UI/UXまとめ
 - その他デザインに関する記事
 
- エンジニアリングPart
 - Flutterについて
 - iOS/iPadOSアプリ関連情報
 - Pythonによる機械学習/データサイエンス
 - その他技術に関する記事
- その他気になること

ということで頑張ってみたいと思います！是非ともよろしくお願いします！
ゼロから始めるLeetCode Day7 「104. Maximum Depth of Binary Tree」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

基本的にeasyのacceptanceが高い順から解いていこうかと思います。

前回
[ゼロから始めるLeetCode Day6 「1342. Number of Steps to Reduce a Number to Zero」](https://qiita.com/KueharX/items/fb274973c9fc7cd920e3)

サボらず1週間続きました。めでたい。

# 問題

[104. Maximum Depth of Binary Tree](https://leetcode.com/problems/maximum-depth-of-binary-tree/)

かなり初期の問題ですが、二分木の構造を理解する上で良い問題だと感じました。

二分木が与えられるのでその深さの最大値を探し出すようなアルゴリズムを書くことを求められます。

```
example:
Given binary tree [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
return its depth = 3.
```

```Python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        depth = 0
        stack = [(root,1)]
        
        while stack:
            root,length = stack.pop()
            if not root:
                return 0
            
            if length > depth:
                depth = length
            if root.right:
                stack.append((root.right,length + 1))
            if root.left:
                stack.append((root.left,length + 1))
        return depth
# Runtime: 40 ms, faster than 70.51% of Python3 online submissions for Maximum Depth of Binary Tree.
# Memory Usage: 14.9 MB, less than 90.62% of Python3 online submissions for Maximum Depth of Binary Tree.
```

以前の二分探索木に関する問題、[ゼロから始めるLeetCode Day4 「938. Range Sum of BST」](https://qiita.com/KueharX/items/f0182e346828eb5cfd09)でも書いたような深さ優先探索で書いてみました。


Discussなどで調べてみて知ったのですが、こういう書き方もあるんですね。

```Python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

from collections import deque

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if not root:
            return 0
        queue = deque([(root, 1)])
        while queue:
            curr, val = queue.popleft()
            if not curr.left and not curr.right and not queue:
                return val
            if curr.left:
                queue.append((curr.left, val+1))
            if curr.right:
                queue.append((curr.right, val+1))
# Runtime: 36 ms, faster than 89.87% of Python3 online submissions for Maximum Depth of Binary Tree.
# Memory Usage: 15 MB, less than 90.62% of Python3 online submissions for Maximum Depth of Binary Tree.
```

[deque](https://docs.python.org/ja/3/library/collections.html#collections.deque)を使って実装してあります。

>Deque とは、スタックとキューを一般化したものです (この名前は「デック」と発音され、これは「double-ended queue」の省略形です)。Deque はどちらの側からも append と pop が可能で、スレッドセーフでメモリ効率がよく、どちらの方向からもおよそ O(1) のパフォーマンスで実行できます。

とあるように速いです。実際にRuntimeに関しても他の回答に比べて速いですね。
AWS, LPICの資格取得計画

# 取得目的
<p>入社後の研修期間中にクラウド・サーバーエンジニアに必要な知識を高めるため</p>

# 取得予定資格
<ul>
 <li>AWSソリューションアーキテクトアソシエイト</li>
 <li>LPIC1</li>
</ul>

# 学習方法
### AWS
<ul>
 <li>Udemy これだけでOK!AWS認定ソリューションアーキテクト</li>
 <li>徹底攻略　AWS認定ソリューションアーキテクトーアソシエイト教科書: 株式会社インプレス 2019</li>
</ul>
### LPIC1
<ul>
 <li>Udemy Linuxコマンド、シェルスクリプト、データベース、ネットワーク 、セキュリティ、LPIC101・102を極める14時間</li>
 <li>Linux標準教科書: <a>https://linuc.org/textbooks/linux/</a></li>
 <li>UNIXコマンドブック: ソフトバンククリエイティブ株式会社 2009</li>
 <li>Linuxコマンドポケットリファレンス: 技術評論社 2009</li>
</ul>

# 学習計画
### AWS
<p>04/24 はじめに</p>
<p>04/24 Day1対応</p>
<p>04/24 試験の概要</p>
<p>04/27 IAM</p>
<p>04/27 EC2</p>
<p>04/27 VPC</p>
<p>04/28 S3</p>
<p>04/29 WAF</p>
<p>04/30 信頼性の設計</p>
<p>05/01 Route53</p>
<p>05/04 DB</p>
<p>05/04 サーバーレス</p>
<p>05/04 環境の自動化</p>
<p>05/05 キャッシュの活用</p>
<p>05/06 セキュリティと運用</p>
<p>05/07 模擬試験</p>

### LPIC1
<p> 4/24 Linux環境構築、コマンド</p>
<p> 4/27-4/29 シェルスクリプトの実装</p>
<p> 4/30 LPIC101</p>
<p> 5/01 LPIC 102</p>
<p> 5/04 UdemyカリキュラムS1復習</p>
<p> 5/05 UdemyカリキュラムS2復習</p>
<p> 5/06 UdemyカリキュラムS3復習</p>
<p> 5/07 UdemyカリキュラムS4復習</p>

# 結果
### ・ 101 　262点
### ・ 102 　292点（くらい）
### ・ AWS　不合格
ファイル（ディレクトリ）の存在チェック Linux

#ファイル（ディレクトリ）の存在チェック Linux

自分で今、使う予定はないけれど、いつか使うかもしれないのでMemoしておきたい。

```file_check.sh
while [ -e $FILE]
do
    sleep 60
done
```

[ -e $FILE]だと、ファイルが存在するかぎり処理を繰り返す。
[ ! -e $FILE]だと、ファイルが存在しない限り繰り返す。
この場合は、待ち続ける。

-eでファイルの存在チェック、-dだとディレクトリのチェックになる。
MAMP(FREE)のインストールから表示まで（MAC ）

#MAMPとは
MAMP(マンプ)とは、ローカル開発環境に必要なソフトウェア（Apache、MySQL、PHP）をパッケージ化したもので、macOS、Windows上で動作させることが出来る。
「Macintosh」「Apache」「MySQL」「PHP」の頭文字をとってMAMPと名付けられている。

#MAMPのインストール

MAMPの公式サイトよりダウンロード（https://www.mamp.info/en/）
FREE　Downloadをクリック
![MAMP1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/cb21cfd4-6775-619b-fdef-1f9c0e38945d.jpeg)
MAMP & MAMPPRO5.7をクリック
![MAMP2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/c1db7655-21e6-0df0-7184-0aa477db1074.png)
クリックするとダウンロードが始まるので終わるまで待つ。
ダウンロードが終わったらファイルを解凍する。
<img width="615" alt="MAMP3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/f7c00fa5-3826-4a3e-c7c7-3ee6cd1db652.png">
<img width="609" alt="MAMP4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/2404fbbc-4e8a-9226-306c-5815066b4615.png">
<img width="612" alt="MAMP5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/6301e4b9-192f-2b16-43f1-3740c34283c3.png">
続けるをクリックすると、使用許可を求められるので、特に問題なければ同意するをクリック
<img width="616" alt="MAMP6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/95bea0cb-80cb-aae5-8601-7e099b66c9a3.png">
MAMP　PROを一緒にインストールする場合はインストールをクリック。今回は、MAMP PROはインストールしないのでカスタマイズを選択し、MAMP PROのチェックを外しインストール。<img width="618" alt="MAMP7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/d95f62c5-6fe1-71a2-d472-5ca1b33586cb.png">
<img width="613" alt="MAMP8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/aac80a50-5887-a141-c39f-156060897d03.png">
何もなければ無事にインストールが終了したと思います。

#MAMPの起動
インストールされたMAMPを立ち上げるとこのような画面が出るので、起動するにはStart Serversをクリックします。
<img width="531" alt="MAMP9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/342489ea-4dc3-bef0-411e-4e3ef683bfaa.png">
<img width="532" alt="MAMP10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/0fc73459-a81c-9986-8acc-ec33389377d4.png">
Apache　MySQLが緑に点灯すれば起動成功です。ストップさせたい場合はStop Serversをクリックで終了します。

#ブラウザに表示
ブラウザを開いて「localhost」もしくは「127.0.0.1」と入力します。
このような形で表示されると無事にローカルサーバーに表示できている事が確認できるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/70af7d2c-3c97-9db2-62a0-f740e29d15c7.png)
これから初期設定等ありますが、とりあえず今回はここまでにします。
今回初投稿で見にくいところなどあったかと思いますので、徐々に改善していきたいとおもいます。
最後まで読んでいただいてありがとうございました！！
LINEBotをみんなで作ろう〜LINEBot is 何？編〜【2日目】

この記事は下記の [#GWアドベントカレンダー](https://gw-advent.9wick.com/calendars/2020/72) の 2日目の記事になります。

楽しそうなのでやってみる　( @inoue2002  ） | GWアドベントカレンダー

# はじめに
こちらの内容は超初心者向けです。
[公式ドキュメント](https://developers.line.biz/ja/docs/messaging-api/overview/#messaging-api%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF)を読める方はこちらをお読みいただく方が正確です。


[昨日の記事](https://qiita.com/drafts/a87df2b520f8b6e37f42/edit)をご覧になってない方はぜひ。
こちらの記事はGWアドベントカレンダーを通してLINEBotをサーバレスで作れるようになろう！ということを目標に書いている記事です。

LINEBotって何なん？って思われる方にまずお読みいただきたいです。
できるだけ専門用語を使わず、噛み砕いて書いていきます。
#LINEBotとは

「bot」という単語は robotの短縮形であり、みなさんが想像されるロボットの短縮形という認識で大丈夫です。

ロボット＝人間の代わりに仕事をしてくれる

つまり
LINEの中で、人間の代わりにメッセージのやりとりをしてくれるロボット　→　LINEBot　と呼ばれているわけです。

「人間の代わりにメッセージのやりとりをしてくれる」というのは具体的にどんなものでしょうか。
よくみなさんも目にするであろう企業のLINE公式アカウントを思い出してみてください。定期的にメッセージが送られてきたり、トーク内でメッセージを送ったりすると、即答でメッセージが返ってくる経験をした事があるはずです。
最近で有名な公式アカウントを例にあげると、

ローソン：　AIを搭載しており、ユーザーに合った商品をレコメンドしてくれる
![ローソンのLINEBot](https://www.lawson.co.jp/lab/tsuushin/art/__icsFiles/afieldfile/2017/04/21/20170410_line_benrikinou_g.jpg)
https://www.lawson.co.jp/lab/tsuushin/art/1372267_4659.html

クロネコヤマト：　再配送を依頼したり、荷物がいつ頃届くのか確認したりできる
![人狼GM](http://www.kuronekoyamato.co.jp/ytc/campaign/renkei/LINE/img/section1_01.png)
http://www.kuronekoyamato.co.jp/ytc/campaign/renkei/LINE/

日々増え続けているのでぜひ「LINEBot　企業」などで検索をかけてみると面白いBotに出会えるかもしれません。

少しはLINEBotというものがどういうもので、どんな物に活用されているのかを掴んでもらう事ができましたでしょうか。

ここで、企業は色々と客に対して便利なサービスを提供できるけど、個人で開発したところで何の役にもたたんやろ。と思っておられる方もおられるのではないでしょうか。

実際に筆者が、過去２ヶ月で作ったLINEBotをみていただき、個人開発でどんな事ができるのか。可能性を広げていただければなと思います。こちらの動画では５種類の実際にリリースしたbotを紹介しています。↓登壇動画 2020/4/29
[![bot紹介動画](http://img.youtube.com/vi/0x_PEoSu_5U/0.jpg)](http://www.youtube.com/watch?v=0x_PEoSu_5U)

#LINEBotが動く（Messaging API)の仕組み
Messaging APIを使い、リクエストは、[JSON形式](https://www.google.com/search?q=json&oq=json&aqs=chrome..69i57j69i59l3j0j69i61j69i60l2.685j0j7&sourceid=chrome&ie=UTF-8)でHTTPSを使って送信されます。

1.ユーザーが、LINEBotにメッセージを送信します。
2.LINEプラットフォームからボットサーバーのWebhook URLに、Webhookイベントが送信されます。
3.Webhookイベントに応じて、ボットサーバーからユーザーにLINEプラットフォームを介して応答します。
![API](https://developers.line.biz/assets/img/messaging-api-architecture.f40bffbb.png)

#LINEBotでできること
・応答メッセージを送る
・プッシュメッセージを送る
・さまざまなタイプのメッセージを送る
・ユーザーが送ったコンテンツを取得する
・ユーザープロフィールを取得する
・グループチャットに参加する
・リッチメニューを使う
・ビーコンを使う
・アカウント連携を使う
・送信メッセージ数を取得する

###### メインで使う機能としては、
・応答orプッシュメッセージを送る
・ユーザープロフィールを取得する
・リッチメニューを使う
######辺りだと思います。言葉だけでも覚えておくと良いでしょう。

##終わりに
明日からサンプルコードを利用しながら、実際にLINEBotを作っていきます！頑張っていきましょう！

本記事：[LINEBotをみんなで作ろう〜LINEBot is 何？編](https://qiita.com/inoue2002/items/3a5019c07801bcf5ff75)
次の記事：[LINEBotをみんなで作ろう〜おうむ返しbotを作ろう編〜](https://qiita.com/inoue2002/items/dcf40d5ebfe2454796fa)

[LINEBotをみんなで作ろう〜環境構築編〜](https://qiita.com/inoue2002/items/a87df2b520f8b6e37f42)
[LINEBotをみんなで作ろう〜色々なメッセージを送ってみよう編](https://qiita.com/inoue2002/items/35fab5b7901aa94fafd2)
[LINEBotをみんなで作ろう〜Messageを分岐させるぞ編](https://qiita.com/inoue2002/items/650eca3f7dd6a5fccb63)
[LINEBotをみんなで作ろう〜AWSアカウントを作るぞ編](https://qiita.com/inoue2002/items/ad945981150c859911fc)
[LINEBotをみんなで作ろう〜レイヤーとAPIgateway設定編](https://qiita.com/inoue2002/items/ab226d9836a891b01bc9)
[LINEBotをみんなで作ろう〜コードを実装編](https://qiita.com/inoue2002/items/dbbd862d6149c83f6513)
【database.yml】DBをDockerとrails server両方で使えるように設定

Dokerで開発時に、`docker-compose run` や`docker-compose run` よりも早い`rails server`で一時的に動作確認をしたい場合があるかと思う。
そういった場合にも、以下の`config/database.yml`内の記述だけで対応することができる。

#検証環境

```shell
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.3
BuildVersion:	19D76
```
```shell
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin19]
```

```shell
$ rails -v
Rails 5.2.4.2
```
#database.ymlについて
まず、database.ymlとは



```yaml:config/database.yml（例）

default: &default
  adapter: mysql2
  encoding: utf8
  collation: utf8_general_ci
  pool: 5
  host: <%= ENV['MYSQL_HOST'] || 'localhost' %>
  username: <%= ENV['MYSQL_USERNAME'] || 'root' %>
  password: <%= ENV['MYSQL_PASSWORD'] || '' %>
  socket: /tmp/mysql.sock
```

###主な内容
**adapter**:　使用するデータベースの種類(postgresql, mysql2等）

**encoding**: 文字コード

**collation**: MySQLの文字列と照合順序(ソート順)、”文字コード_言語名_比較法”で構成される

**pool**: 確保する接続プールの数

**host**: データベースが動作しているホスト名またはIPアドレス

**username**,**password**: データベースに接続するユーザー名・パスワード

**socket**: DB通信の接続口

#比較演算子：　||
**or**と同じ働きをする。
[Ruby 2.7.0 リファレンスマニュアル  演算子式](https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html)
>文法:

>式 `||' 式
>式 or 式
>左辺を評価し、結果が真であった場合にはその値を返します。左辺の評価結果が偽であった場合には右辺を評価しその評価結果を返します。 

config/database.ymlのhost,username,passwordの部分をこれで書くことで、`ENV['MYSQL_HOST']`等の環境変数がない場合に、localhost等を返してくれる。

###終わりに。
最後まで読んで頂きありがとうございます:bow_tone1:
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。

###参考にさせて頂いた記事
- [MySQLの文字列と照合順序について]
(https://qiita.com/tmasu/items/c1de4d03d9338b7dabcd)
- [【MySQL】照合順序とは？
](https://qiita.com/kazu56/items/6af85ffcf8d3954455ad)
- [【Ruby】使いこなせると便利。||演算子のいろんな使い方
](https://qiita.com/ngron/items/4d3ca9827d1969fccd60)
- [Ruby 2.7.0 リファレンスマニュアル  演算子式](https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html)
（一部翻訳）GitLabでSquash Commitした時のコミットメッセージ

## 記事を書いた動機

GitLabのマージリクエストでSquash Commitした時のコミットメッセージが、何が選ばれるのか複雑で分かりにくい！
公式は英語なので読むついでに大事なところだけ日本語に訳しました。意訳が入っています。
内容は本日（2020/04/30）時点のものです。

## 公式（英語）

https://docs.gitlab.com/ee/user/project/merge_requests/squash_and_merge.html

## 大事なところだけ翻訳

Squashされたコミットのコミットメッセージは以下のように決定されます：

- マージリクエスト内のコミットの、一番最初の複数行のコミットメッセージが選ばれます。
- 複数行のコミットメッセージが無かった場合は、マージリクエストのタイトルが選ばれます。

注記：これは最低でも2コミット以上ある場合に適用されます。1コミットしかなくSquashする必要がなかった場合は、コミットメッセージは元のものがそのまま使われます。

**マージリクエストでマージする前に、このコミットメッセージは任意に決めることもできます。**

（マージボタンの下にあるCollapseを開き、コミットメッセージを入力できるUIが提供していることを示す画像）

注記：この画像の例だと、プロジェクトのリポジトリはマージコミットを使用することになっているため、Squashされたコミットのメッセージの後にマージコミットのメッセージが続きます。
文字列の中に変数を入れる記法

自分はもともとRubyでプログラミングに触れて、eRubyでCGIを書いたりしてたから文字列の中に`{}`でくくった変数を入れるのを多用していたのですが。

~~~HelloWorld.rb
str1 = "Hello"
str2 = "World!"
print "#{str1}, #{str2}\n"
~~~

これをC#で書こうとしたらこうなります。

~~~HelloWorld.cs
var str1 = "Hello";
var str2 = "World!";
Console.Write($"{str1}, {str2}\n") ;
~~~

別解でこういう風にも書けるようです。

~~~HelloWorldAlt.cs
var str1 = "Hello";
var str2 = "World!";
Console.Write("{0}, {1}\n", str1, str2);
~~~

ところで、最近Javaをはじめたのですが、Javaだとこういう風に書くみたいです。

~~~HelloWorld.java
var str1 = "Hello";
var str2 = "World!";
System.out.printf("%s, %s\n", str1, str2);
~~~

後で書いた`HelloWorldAlt.cs`のC#のパターンに近いですね。
ぶっちゃけJavaが一番わかりづらいので、今後C#で書く時もJava表記に近い後者の記法を書いていこうかなと思いました。
(フロントエンド初心者)AngularのPWA少しずつちゃんとやる。デプロイしたら端末側は最新状態に画面をアップデートしたい(Todoistみたいに)

PWA簡単にできますよっていうQiitaの記事はみましたが、本当かな。
PWAが一度有効になるとServiceWorkerから情報取るのでデプロイで新しいソースが来ても端末側で更新できない問題がすぐに見つかる。みんなど
うしてんの？
Todoistとかはこの辺うまくやっててすごいなぁと思う。
公式ドキュメントは日本語よみにくいことこの上ないので読めない。

この辺の情報は日本語でググっても情報なかったので私がググった結果のリンクをおいておきます

## 結論
下記を実装しましょう
https://medium.com/@arjenbrandenburgh/angulars-pwa-swpush-and-swupdate-15a7e5c154ac 記事のGithub

* https://github.com/arjenbrandenburgh/medium-pwa-example/pull/3/files#diff-465e9f13ce23ec4a1e366935273fdbb6R8-R10

と、updateがうまく行かないので下記を

* https://stackoverflow.com/questions/50968902/angular-service-worker-swupdate-available-not-triggered/50969084#50969084

実装しましょう。

### 動作確認
* Chrome
* iPhoneでホーム画面に追加した画面

動作確認できました。Edgeとか知らん。Firefoxはしらん。

## このあと試したいこと
オフライン <=> オンラインを行き来してうまく端末が追従するか →できたっぽい。
## 追記
下記シナリオで端末が最新に更新できることを確認しました。

1. 6秒おきにサーバーに確認するようにプログラム(記事は6時間)
1. iPhoneのホーム画面に設置したAngularをオンラインで表示
1. iPhoneを機内モード(オフライン)
1. Angular(FirebaseのHosting)をちょっとだけ更新してデプロイ
1. iPhoneの機内モード解除(オンライン)
1. しばらくしたらiPhoneにて更新がかかる

良い感じ
AmazonLinux2でFTPとFTPS兼用させる

**！！！ 基本的に全てroot権限の作業になりますのでご注意ください ！！！**
## AmazonLinuxの場合
デフォルトの

```
/etc/vsftpd/vsftpd.conf
```
でなく

```
/etc/vsftpd/vsftpd-ftp.conf
/etc/vsftpd/vsftpd-ftps.conf
```
のようにFTPとFTPS両方に対応した2つの設定ファイル(*.confであること)を用意すれば自動的に兼用出来るようになっています。 
(`/etc/init.d/vsftpd` の処理を見れば分かると思います。)

## AmazonLinux2の場合
AmazonLinuxと同様の方法が使えないため別のやり方をする必要があります。
ちなみにCentOS7も同様かと思いますが試していません。


　まずFTP用の設定ファイルとFTPSの設定ファイルのそれぞれでvsftpdを起動するシェルを作ります。

```/usr/sbin/myvsftpd.sh
#!/bin/bash
/usr/sbin/vsftpd /etc/vsftpd/vsftpd-ftp.conf
/usr/sbin/vsftpd /etc/vsftpd/vsftpd-ftps.conf
```

　次にvsftpdの起動コマンドを修正します。

```/usr/lib/systemd/system/vsftpd.service
ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
```
↓

```/usr/lib/systemd/system/vsftpd.service
ExecStart=/usr/sbin/myvsftpd.sh
```

vsftpdの再起動とリロードを行い完了です。

```
systemctl restart vsftpd.service
systemctl daemon-reload
```

## 確認
ポート21と990の両方でListenしていたらOKです。

```
[root@ip-XX-XX-XX-XX hogehoge]# lsof -i:21
COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
vsftpd  7516 root    4u  IPv4 8366586      0t0  TCP *:ftp (LISTEN)
[root@ip-XX-XX-XX-XX hogehoge]# lsof -i:990
COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
vsftpd  7518 root    4u  IPv4 8366588      0t0  TCP *:ftps (LISTEN)
```
Pycharmとsympyで連立一次方程式を解いてみよう！

(参考)Pythonのsympyで連立一次方程式を解いてみよう！
https://qiita.com/Yumenoshima/items/2872cc9d88acc8dd39d7
(参考)Pythonのテキスト作りました＞私は、左記のテキストをつまみぐいしています？
https://qiita.com/KatsunoriNakamura/items/b465b0cf05b1b7fd4975
(参考pdf)3.3 数式処理ライブラリ： SymPy<Pythonのテキスト作りました
http://www.k-techlabo.org/www_python/python_modules.pdf#page=123

#環境
私のバージョンが古いと思います。PyCharm 2018.2.8+win
最近のおすすめの環境を教えてください。

#ソース
varは、あまり見ませんが、キーインが楽です。
varがないと「NameError: name 'x' is not defined」がでます。下記のソースは、動いてます状態です。

```myRenrituHouteisiki.py
from sympy import *
var('x y')
print(solve([-7*x+2*y+10,3*x+5*y+9]))
pprint(solve([-7*x+2*y+10,3*x+5*y+9]))
# {x: 32/41, y: -93/41}
# ⎧   32     -93 ⎫
# ⎨x: ──, y: ────⎬
# ⎩   41      41 ⎭
```

#おまけ
Micro Python？micro:bit?　＞qiitaにtagがありました。気づかなかった！
(参考pdf)？高校の情報科のプログラミングでPython＜Pythonのテキスト作りました(2019/05/21-06/06)
https://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2019/10/09/1416758_005.pdf#page=7
「Pythonのsympyで連立一次方程式を解いてみよう！」を参考にWolframAlphaでやってみた。

wolframalphaは、ブラウザieだと調子が悪いので、firefoxをおすすめします。(エラーサンプル収集中です。)

オリジナル

https://qiita.com/Yumenoshima/items/2872cc9d88acc8dd39d7

# 例1

https://www.wolframalpha.com/input/?i=-7*x%2B2*y%2B10%2C3*x%2B5*y%2B9&lang=ja

根:
x = 32/41, y = -93/41
# 例2


https://www.wolframalpha.com/input/?i=-7*x%2B2*y%3D-10%2C3*x%2B5*y%3D-9&lang=ja

解:
x = 32/41, y = -93/41
言語処理100本ノック　第4章: 形態素解析　31. 動詞

# 31. 動詞
## 問題
> 動詞の表層形をすべて抽出せよ．
https://nlp100.github.io/ja/ch04.html

下記のInputデータからどうすりゃ良いのかイマイチよくわからんかったけど、既に解いた方の回答を参考にしたら、なるほどと。
リストの中のリストのデータを取るためにforループの中でもう一回forループすれば良いのか。
勉強になった。

``` python
# inputデータ
[[{'surface': '一', 'base': '一', 'pos': '名詞', 'pos1': '数詞'}],
 [{'surface': '吾輩', 'base': '吾輩', 'pos': '名詞', 'pos1': '普通名詞'},
  {'surface': 'は', 'base': 'は', 'pos': '助詞', 'pos1': '副助詞'},
  {'surface': '猫', 'base': '猫', 'pos': '名詞', 'pos1': '普通名詞'},
  {'surface': 'である', 'base': 'だ', 'pos': '判定詞', 'pos1': '*'},
  {'surface': '。', 'base': '。', 'pos': '特殊', 'pos1': '句点'}],
 [{'surface': '名前', 'base': '名前', 'pos': '名詞', 'pos1': '普通名詞'},
  {'surface': 'は', 'base': 'は', 'pos': '助詞', 'pos1': '副助詞'},
  {'surface': 'まだ', 'base': 'まだ', 'pos': '副詞', 'pos1': '*'},
  {'surface': '無い', 'base': '無い', 'pos': '形容詞', 'pos1': '*'},
  {'surface': '。', 'base': '。', 'pos': '特殊', 'pos1': '句点'}],
...
```

## 回答
``` python
surface = []
for sentense in result_list:
    for morphene in sentense:
        if morphene['pos'] == '動詞':
            surface.append(morphene['surface'])
surface

# 結果
['生れた',
 'つか',
 'した',
 '泣いて',
 'して',
 '始めて',
...
```

## 参考にしたサイト
[言語処理100本ノックに挑戦 第4章](https://qiita.com/takugenn/items/44bf9cd78824ce7892d5)
非線形連立方程式ってPythonで簡単に解けるんですね

数値計算をやっていると、非線形連立方程式を解く機会ってまぁまぁありますよね。もう何年も前ですが大学院生で研究をやっていた頃は、Fortranでコトコト実装していました。最近Pythonでプログラムを書く機会が増えてきて、再び非線形連立方程式を解く場面に遭遇しました。非線形連立方程式の解法として有名なものと言えばNewton法ですが、ゼロから実装するの面倒なのでいいライブラリがないか探しました。

# 「Scipy.optimize.root」で解けちゃう
半端じゃなく簡単でした。今回は例題として以下のような非線形連立方程式を解きたいと思います。

$$
\begin{align}
 x^{2}+y^{2}-1=0 \\\
 x=0
\end{align}
$$


ソースコードは以下の通りです。あとで簡単な説明をします。

```python
import numpy as np
from scipy import optimize

# 解きたい関数をリストで戻す
def func(x):
    return [x[0]**2 + x[1]**2 -1.0,
            x[0]]


result = optimize.root( func, [ 1.0, 0.0], method="broyden1")
print(result)
```
実行結果は以下の通りです。

```text
     fun: array([-1.98898568e-07, -5.14009858e-06])
 message: 'A solution was found at the specified tolerance.'
     nit: 9
  status: 1
 success: True
       x: array([-5.14009858e-06,  9.99999901e-01])
```

## ソースコード/実行結果の説明
scipy.optimize.rootの利用方法の詳細は[scipyドキュメント](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.root.html)を参照してください。ここではざっくりの説明をします。optimize.rootの第一引数は、解きたい関数を定義したfunc関数です。第二引数は、問題を解き始めるときに使用する初期値です。第三引数は、解き方を指定する所となります。詳細は、[scipyドキュメント](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.root.html)を参照してもらいたいのですが、ここで1つ注意点。今回はmethodでbroyden1を指定してますが、引数によってはヤコビ行列が別に定義してやる必要があります。僕は面倒だったので、ヤコビ行列が不要なものを選びました。

また、実行結果について大事なところはx：array()の部分でこれが実際の解を表しており、$x=0,y=1$っぽいのであってそう。解の詳細については、[scipy.optimize.OptimizeResult](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.OptimizeResult.html#scipy.optimize.OptimizeResult)を参照。

# 最後に
Pythonって色々簡単に実装できて便利ですね。大学院生の時に出会いたかった。いや、出会っていたんだけど乗り換えが面倒だったので見て見ぬふりをしてました。ごめんなさい。
numpyメモリ使い回しチートシート

# はじめに
大規模行列を扱う人にとっては行列の malloc/realloc は死活問題。メモリを使いまわしたい邪悪な人たちはこの短いチートシートに目を通しておこう。

## 配列の初期化
ループの先頭などで配列を0埋めしたいときがあるだろう。既に確保した配列をある値で埋めるには`numpy.ndarray.fill`を使う。

```python
import numpy as np

a = np.ones(5)

for i in range(5):
    a.fill(0)
    a[i] = 1
    print(a)
```

## 配列のコピー
配列の中身を別の配列にコピーしたいときは`numpy.copyto`を使う。`numpy.copy`は新しい配列を生成してしまうので注意。

```python
import numpy as np

m, n = 2000, 1000
A = np.ones((m, n))
B = np.zeros(A.shape)

# 新しい配列を生成しないコピー
np.copyto(B, A)
```

大きい配列を確保しておいて小さい配列で先頭から埋める場合にはスライスを使えばよい。余った部分を0埋めしたいときは前述の`fill`で処理してしまおう。

```python
import numpy as np

a = np.array([0, 1, 2, 3, 4])
b = np.array([5, 5, 5])

np.copyto(a[0:3], b)  # 先頭から小さい配列の値で埋める
a[3:5].fill(0)        # 余った部分を0埋め
```

## 数学的操作
数学的操作も引数に`out`を取れるものは格納先を指定できる。取れない場合も「実は配列自体はいじってない」みたいなことがある。

### 四則演算/その他
[Mathematical functions](https://numpy.org/doc/stable/reference/routines.math.html)で`out`のパラメータが指定できる演算はメモリを使いまわせる。broadcasting で対応できる範囲内であれば配列の`shape`が異なってもよい。代入先が元の行列に一致するならば`+=`などの代入演算子を使えばよい。

```python
import numpy as np

A = np.array([[1, 2, 3],
              [4, 5, 6]])
B = np.array([[7, 8, 9],
              [8, 7, 6]])

C = np.zeros(A.shape)

# 新しい配列を生成しない四則演算
np.add(A, B, out=C)
np.multiply(A, B, out=C)
np.subtract(A, B, out=C)
np.divide(A, B, out=C)

# 代入演算子を使うパターン
A += B
A -= B
A *= B
A /= B
```

`A = A + B`は新しい行列が生成されて`A`に代入されるので注意。

### 転置
[転置はstridesというパラメータをいじってるだけ](https://stackoverflow.com/questions/19479384/is-numpy-transpose-reordering-data-in-memory)らしく配列自体はいじっていないので高速である。

```python
import numpy as np

A = np.array([[1, 2, 3],
              [4, 5, 6]])

# 転置は新しい配列を生成することはない
B = A.T

B[0,1] = 9

print(A)
```

```:output
array([[1, 2, 3],
       [9, 5, 6]])
```

本記事では紹介しないが同様に`reshape`も配列の並び順自体は変わっておらず高速である。

### スカラー倍
`*=`演算子を用いればよい。

```python
import numpy as np

A = np.array([[1, 2, 3],
              [4, 5, 6]])

A *= 5
```

### 行列積
`numpy.dot`も`out`が指定できる。

```python
import numpy as np

A = np.array([[1, 2, 3],
              [4, 5, 6]])
B = np.array([[7, 8, 9],
              [8, 7, 6]])

C = np.zeros((2, 2))

# 新しい配列を生成しない行列積
np.dot(A, B.T, out=C)
```

完全に余談だが、複数の行列をかけるときは`numpy.linalg.multi_dot`を使うともっとも効率的な順序で行列積を取ってくれる。ただしこちらは`out`が指定できない。