OmniAICreator/Qiita-1.07M huggingface dataset:
PHPの配列を使いたい時に見たいリンク集

# 基本操作

```php:基本操作
// 初期化
$array = array(key=>value);
// 追加
$array[key] = value;
// 配列の最後に追加
$array[] = value;
array_push($array, value)
// 要素を数える
count($array)
```

- [配列・連想配列の初期化、結合、追加](https://qiita.com/shuntaro_tamura/items/784cfd61f355516dfff0)
- [PHP: array_push - Manual](https://www.php.net/manual/ja/function.array-push.php)

# 全要素を～したい

```php:全要素を～したい
// 文字列化
$strvaled = array_map('strval', $array);
// trim
$trimed = array_map('trim', $array);
```

- [全要素をtrimする - STUDY-UP](http://study-upup.blogspot.com/2014/02/phptrim.html)

# フィルタリングしたい

```php:フィルタリングしたい
/** フィルタリングしたい */
array_filter(array フィルタリングしたい配列, callable　コールバック関数, int 何をコールバック関数の引数にするか): array
///// 何をコールバック関数の引数にするか ////
0 // デフォルト 値だけ
ARRAY_FILTER_USE_BOTH // 値とキーの両方(ARRAY_FILTER_USE_BOTH = 1)
ARRAY_FILTER_USE_KEY // キーだけ(ARRAY_FILTER_USE_KEY = 2)

/** 空文字要素を削除したい */
$deleted = array_filter($array, 'strlen');
```
- [array_filter — コールバック関数を使用して、配列の要素をフィルタリングする](http://php.net/manual/ja/function.array-filter.php)
- [array_filter を通すとインデックスに差が生まれる - Qiita](https://qiita.com/ameyamashiro/items/ba4367e1a3586ae097e3)
- [array_values() は、配列から全ての値を取り出し、数値添字をつけた配列を返します。](http://php.net/manual/ja/function.array-values.php)
- [reset — 配列の内部ポインタを先頭の要素にセットする - 配列の最初の要素の値を返します。](http://php.net/manual/ja/function.reset.php)

# 結合したい

```php:結合したい
// 添え字が変わってOKなとき
$marged = array_merge($array1, $array2);
// 添え字が変わってNGなとき
$marged = $array1 + $array2;
// 配列の中身を結合して1つの文字にしたい
$string = implode({区切り文字}, $array)
```

- [array_merge関数と配列結合演算子「+」による重複キーの扱いの違い - PHPプログラミングの教科書](https://php1st.com/1382/)
- [連想配列で複数カラムを指定してGROUP BYしたい - Qiita](https://qiita.com/ponsuke0531/items/405daf077640b6550d4f)
- [implode — 配列要素を文字列により連結する](http://php.net/manual/ja/function.implode.php)

# 存在確認したい

```php:存在確認
// 添え字(key)
array_key_exists($key , $array) : bool
// 要素
array_search(mixed 検索したいもの , $array): mixed
```

- [array_search — 指定した値を配列で検索し、見つかった場合に対応する最初のキーを返す](http://php.net/manual/ja/function.array-search.php)
- [array_column — 入力配列から単一のカラムの値を返す](http://php.net/manual/ja/function.array-column.php)
- [issetを使うよりarray_key_existsで配列要素の有無を確認すべき。 | 迷走男子！！](http://tazakazushi.net/post-307.html)
- [配列の要素確認と実行速度 - アシアルブログ](https://blog.asial.co.jp/760)
- [array_key_exists は isset より1000倍以上遅いことがある at softelメモ](https://www.softel.co.jp/blogs/tech/archives/5878)

# 更新したい
- [stdClassの配列と連想配列の配列では配列を更新する方法が違う - Qiita](https://qiita.com/ponsuke0531/items/793d92f1b0da6b11cfae)

# 他のリンク集
[PHPがよくわからない時に助けになりたいリンク集](https://qiita.com/ponsuke0531/items/91fd603a2242a47b2c3e)
[PhpStormを初めて使うときに役立てたいリンク集](https://qiita.com/ponsuke0531/items/f1f5287e0be3ef9911ef)
勢いでgemを作ってみた話

## はじめに
railsエンジニアの[@emono](https://twitter.com/emono_dev) といいます。
rubyを仕事で使っているのに、gemの作り方とは？って感じだったので作ってみました〜。
おととい作り始めて、昨日リリースしました。（完全に勢いでリリースしました。。）

とりあえず最初だったので、日常的に使う [lineのgem](https://rubygems.org/gems/line-notify-client)にしました。
せっかくなので自分が作ったgemの宣伝と（よかったら使ってください〜）、gemの作り方のメモをざっくりまとめます。

## 作ったgemについて
lineにメッセージが送信できるだけの、めっちゃシンプルなapi_clinetです。
[gemのサイト](https://rubygems.org/gems/line-notify-client)
[ぎっとはぶ](https://github.com/emono/line-notify-client)
 
## 使い方
- まず通知のためのtokenを発行する
- [ここらへんを参考にしてアカウントのtokenを発行](https://www.smilevision.co.jp/blog/tsukatte01/)

```rb
# インストール
$ gem 'line-notify-client'
# 実際にポストする
$ irb 
>> require 'line-notify-client' 
>> token = "さっき作ったtoken"
>> message = "lineに送りたいメッセージ"
>> Line::Notify::Client.message(token: token, message: message)
```

以上。こんな感じで通知されます〜〜（個人で作っているbotの通知で使える気がする）
![S__28033029.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116518/7d760ac6-10f4-46fa-2867-133fb3993532.jpeg)


## gemの作り方について
以下を参考にしました。
https://qiita.com/9sako6/items/72994b8b1c00af4e61fe
https://guides.rubygems.org/make-your-own-gem/
**細けえことはいいからざっくり理解したいんだよ**って人だけ読み進めてください。

### ざっくり作りたいgemの内容と名前を考える
- gemの名前は**snake_caseがbetter**っぽい
- hoge_hoge →　○　/ hoge-hoge → ✗
- hoge-hogeでも作れるけど、自動生成される内部のディレクトリ構造が深くなっちゃうのでおすすめしない（直そうとしてちょっと詰まった）

### 名前がかぶらないかを確認しとく + アカウント登録しておく
- https://rubygems.org/

### 作る
- 雛形作る

```shell
# これだけ(hoge_hogeはgem名)
$ bundle gem hoge_hoge -t
```
- こんな感じで自動生成される（すげえ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116518/56f692d3-ff45-7956-1146-88b076bceae3.png)

- buildするために`gemspec`の必須項目を埋めます

```hogehoge.gemspec
  spec.email         = ["TODO: Write your email address"] # アドレス
  spec.summary       = %q{TODO: Write a short summary, because RubyGems requires one.} # gemの内容１
  spec.description   = %q{TODO: Write a longer description or delete this line.} # gemの内容2
  spec.homepage      = "TODO: Put your gem's website or public repo URL here." # url（githubのリンクとか）
```

- ここらへんを削除（一般公開する用）

```hogehoge.gemspec
  # ここらへん削除すると一般公開される
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
  # to allow pushing to a single host or delete this section to allow pushing to any host.
  if spec.respond_to?(:metadata)
    spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
  else
    raise "RubyGems 2.0 or newer is required to protect against " \
      "public gem pushes."
  end
```

- 実装がんばる
    - **lib配下にあるので頑張ってください**
- 確認 & 実行
    - `bin/console` で確認出来ます（railsで言うところの`reload!`が出来ないので誰か助けてください）
- テスト書く
    - **spec配下にあるので頑張ってください**
    - `bundle exec rake spec` で走らせられます。
- 公開
    - https://rubygems.org/profile/edit からAPIキー作れます
    - keyの仕方の上記に記載されてます〜
- build
    - `rake build`
- 公開
    - `rake release`
- 多分これで公開されてる
    - https://rubygems.org/ で検索

細かいことは↓
https://guides.rubygems.org/make-your-own-gem/
https://qiita.com/9sako6/items/72994b8b1c00af4e61fe

## おわりに
記事作成時点で173ダウンロードでした。
昨日リリースしたばかりなのに誰かが使ってくれていて嬉しい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116518/852f7350-835f-2361-74b3-63fa36b878a7.png)
クソコードを世に出してしまったので、指摘ください。あとgem作るの楽しい。以上！！！あざした！！！
VBA で OneNote のセクション内のページのフォントを変更する

# はじめに

OneNoteでは、<kbd><kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>1</kbd></kbd>で見出し1など、スタイルを設定するショートカットキーは存在するが、そのスタイルをユーザー側では(おそらく)変更できない。

OneNote 2010 まではそのままでも特に気にならなかったが、OneNote 2016 のスタイルが個人的に見にくかったため、それらを一括変更するために以下のマクロを作成した。
ページ単位だと数が多いと面倒だったため、セクション単位で変更するようにしている。

デスクトップ版 OneNote 自体があと6年もすればサポート完全終了なので、それ以降どうするのか、という話はあるけれど……。

# コード

最前面にあるセクションから、子どものページを取得し、設定されているフォントを置き換えている(フォント指定はハードコード)。

コード中にも記載しているが、`Microsoft OneNote 15.0 Object Library`などの参照設定が無いと動かない点に注意。

[imihito_Sandbox/M_ChangeOneNoteFont.bas at master · imihito/imihito_Sandbox](https://github.com/imihito/imihito_Sandbox/blob/master/OneNote/M_ChangeOneNoteFont.bas "imihito_Sandbox/M_ChangeOneNoteFont.bas at master · imihito/imihito_Sandbox")

```vb
'https://github.com/imihito/imihito_Sandbox/blob/master/OneNote/M_ChangeOneNoteFont.bas

'以下の参照設定は必須。
'OneNote = Microsoft OneNote 15.0 Object Library

Public Sub ChangeOneSectionFont()
    'OneNote 取得。
    Dim appOne As OneNote.Application
    Set appOne = VBA.CreateObject("OneNote.Application")
    
    '最前面のセクションの ID を取得。
        'appOne の型を明示しないと以下のエラーが発生する。
            'オートメーション エラーです。
            'ライブラリは登録されていません｡
    Dim sectId As String
    sectId = appOne.Windows.CurrentWindow.CurrentSectionId
    
    'セクションのページを示した XML 文字列を取得。
    Dim hierarchyXml As String
    appOne.GetHierarchy sectId, OneNote.HierarchyScope.hsPages, hierarchyXml
    
    'XML DOM としてロード。
    Dim hierarchyXmlDoc As Object 'As MSXML2.DOMDocument
    Set hierarchyXmlDoc = newXmlDoc(hierarchyXml)
    
    'ページを取得し、それぞれのフォントを変更。
    Dim node As Object 'As MSXML2.IXMLDOMNode
    For Each node In hierarchyXmlDoc.getElementsByTagName("one:Page")
        ChangeOnePageFont appOne, node.Attributes.getNamedItem("ID").NodeValue
    Next node
    
End Sub


Public Sub ChangeOnePageFont( _
        inAppOne As OneNote.Application, _
        inPageId As String _
    )
    
    'ページの内容を取得。
    Dim contentsBuf As String
    inAppOne.GetPageContent inPageId, contentsBuf
    
    'XML DOM としてロード。
    Dim pageXml As Object 'As MSXML2.DOMDocument
    Set pageXml = newXmlDoc(contentsBuf)
    
    'スタイルのフォントを変更。
    Const BaseFont = "游ゴシック"
    Const NewFont = "Meiryo UI"
    
    'BaseFont が指定されているスタイルについてフォントを変更する。
    Dim node As Object 'As MSXML2.IXMLDOMNode
    For Each node In pageXml.SelectNodes("//one:QuickStyleDef[@font='" & BaseFont & "']")
        node.Attributes.getNamedItem("font").NodeValue = NewFont
    Next node
    
    
    '変更内容を書き戻し。
    inAppOne.UpdatePageContent pageXml.XML
    
End Sub

'MSXML2 = Microsoft XML, v3.0
Private Function newXmlDoc(inXmlString As String) As Object 'As MSXML2.DOMDocument
    Dim xmlDoc As Object 'As MSXML2.DOMDocument
    Set xmlDoc = VBA.CreateObject("MSXML2.DOMDocument")
    xmlDoc.LoadXML inXmlString
    Set newXmlDoc = xmlDoc
End Function
```
No application encryption key has been specified.となったときの対応方法

# 事象 : Laravelプロジェクトで`http://127.0.0.1:8000/`にアクセスしたらエラーになった
![スクリーンショット 2019-05-08 22.37.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/2db5dd27-7953-8b93-104a-71b1de2b3476.png)

# 原因 : `encryption key`が未設定だから
参考 : [[Laravel]エラー&quot;No application encryption key has been specified.&quot;が出るとき - akamist blog](https://akamist.com/blog/archives/2178)
エラーになったときの`.env`は`.env.exsample`をコピーしただけの状態だった

```conf:.env
APP_NAME=Laravel
APP_ENV=local
# ↓encryption keyが未設定の状態
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
# 省略
```

## 対応 : `encryption key`を設定する
```bash
# encryption keyをartisanコマンドで生成する
$ php artisan key:generate
Application key set successfully.

# .envに自動で追記される
$ cat .env | grep ^APP_
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:xxxxxxxxxxxxxxxxxx/xxxxxxxx/xxxxx=
APP_DEBUG=true
APP_URL=http://localhost

# 設定ファイルのキャッシュを再作成する
$ php artisan config:cache
Configuration cache cleared!
Configuration cached successfully!
```

### エラーが解消された
![スクリーンショット 2019-05-08 22.54.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/9119d273-6d32-54f7-e656-16aa0efe0277.png)
Leetcode #64: Minimum Path Sum

```swift
func minPathSum(_ grid: [[Int]]) -> Int {
    var row = grid.count
    if row == 0 {
        return 0
    }
    var column = grid.first!.count
    if column == 0 {
        return 0
    }
    var dp = Array(repeating: Array(repeating: 0, count: column), count: row)
    dp[0][0] = grid[0][0]
    for j in 1..<column {
        dp[0][j] = dp[0][j-1] + grid[0][j]
    }
    for i in 1..<row {
        dp[i][0] = dp[i-1][0] + grid[i][0]
    }
    if row > 1 && column > 1 {
        for i in 1..<row {
            for j in 1..<column {
                dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
            }
        }
    }
    return dp[row-1][column-1]
}
```
【初心者】XAMPPを使ってphpMyadminを起動させる方法

phpmyadminを起動させる方法がわかったのでアウトプットします。

#１.XAMPPの操作

I.XAMPPを立ち上げて、Generalのstartボタンを押す。最初は黄色だが、約1分後には緑のランプが灯る。
<img width="514" alt="スクリーンショット 2019-05-08 22.22.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402245/1281b036-3692-8c81-73dc-31f5529aca4f.png">

Ⅱ.Servicesの全てをStartにする。
<img width="511" alt="スクリーンショット 2019-05-08 22.26.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402245/9a53a56f-ae72-5565-5123-5d1768f0d5d7.png">
最初はMAMPを使ってやろうと思っていたが、MySQLのランプがどう頑張ってもつかなかったので、XAMPPで行うことにした。

Ⅲ.Networkの、localhost:8080->(Over SSH)をEnableにする。
<img width="510" alt="スクリーンショット 2019-05-08 22.24.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402245/d571bac8-4a66-e222-6999-85b429bd86fa.png">

Ⅵ.VolumesのMountを押す。
<img width="514" alt="スクリーンショット 2019-05-08 22.29.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402245/4cb60e39-896f-4378-655a-7d5cb55b9d0a.png">

#phpMyadminにアクセス

http://localhost:8080/phpmyadmin/
からアクセスできる。

#まとめ
phpMyadminの表示はできたが、これとPHPの連携の仕方がまだわかっていないので、勉強していきます。
プログラミング初心者なので、この記事に不備があればどうぞご指摘ください。
Leetcode #63: Unique Paths II

```swift
func uniquePathsWithObstacles(_ obstacleGrid: [[Int]]) -> Int {
    let row = obstacleGrid.count
    if row == 0 {
        return 0
    }
    let column = obstacleGrid.first!.count
    if column == 0 {
        return 0
    }
    if obstacleGrid[0][0] == 1 {
        return 0
    } else {
        var dp = Array(repeating: Array(repeating: 1, count: column), count: row)
        for j in 1..<column {
            if obstacleGrid[0][j] == 1 {
                dp[0][j] = 0
            } else {
                dp[0][j] = dp[0][j-1]
            }
        }
        for i in 1..<row {
            if obstacleGrid[i][0] == 1 {
                dp[i][0] = 0
            } else {
                dp[i][0] = dp[i-1][0]
            }
        }
        if row > 1 && column > 1 {
            for i in 1...row-1 {
                for j in 1...column-1 {
                    if obstacleGrid[i][j] == 1 {
                        dp[i][j] = 0
                    } else {
                        dp[i][j] = dp[i-1][j] + dp[i][j-1]
                    }
                }
            }
        }
        return dp[row-1][column-1]
    }
}
```
Quartus benchmark v19.1 pro

# Quartus benchmark v19.1 pro

## はじめに
QuartusでFPGAデザインをコンパイルする際にCPUのコア数と動作周波数の関係を探る（適当に）
OCは自己責任で
大体のグラフ・数値は3回計測最小値

## 検証環境
![hoge.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/a778de6a-77f5-923a-2544-7a2b22db2486.jpeg)

|Host Spec| |
|:-:|:-:|
|CPU|サッカーボール|
|MEM|DDR4 2400MHz 16GB|
|M/B|Z390-F GAMING|
|HDD|WD Black 1TB|
|OS|CentOS7|

|FPGA Spec|  |
|:-:|:-:|
|FPGA| Arria 10 GX (GX1150)|
|IDE| Quartus Prime Version 19.1 Pro Edition|

##検証デザイン
ストリーム流れるやつ
全体検証で 8bit 版, 
Fitter 検証で 256bit 版を使用する

コンパイル結果は以下

||8bit|256bit|
|:-:|:-:|:-:|
|Fmax| 219.64MHz | 143.86MHz |
|ALMs | 1085 (< 1%) |33,298 (8%) |
|Registers| 730 (< 1%)| 4811 (< 1%) |
|RAMs| 15 (< 1%) | 183 (7%)|

## 検証方法
CPU Core 数をマザーボードから調整
1, 2, 4, 8 Core で計測

CPU 動作周波数をマザーボードから調整
3, 4, 5GHz, Normal(3.6-5.0GHz)で計測

##結果
###8bit版によるトータルコンパイル時間の比較
![overall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/2b7a7966-2c24-fa96-b903-3a646fdb627e.png)
###1Coreでの周波数変更によるコンパイル時間の比較
![single.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/fd8db249-03e7-93ff-afea-d36b8357f847.png)
###5GHzでのCore数変更によるコンパイル時間の比較
![5g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/c2465846-7f1f-24c1-6715-9d6e417f5c86.png)
(HTT ON)
###256bit版 Fitter の並列比較 (各5GHz)
![fitter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/d10a0a59-539a-7ada-21d8-6d850688d73b.png)
8Core時、Route, Finalizeで落ちた
1Coreは計測できなかった（面倒くさくて）

##おまけ
Core i9-9900Kのターボブーストは

|1Core|2Core|4Core|6Core|8Core|
|:-:|:-:|:-:|:-:|:-:|:-:|
|5.0GHz|5.0GHz|4.8GHz|4.7GHz|4.7GHz|
となっている
8Core x 5GHzでは長時間コンパイルに耐えることが難しい
8Core時の周波数を抑えつつシングルコアの周波数を上げてみる

||1Core|2Core|4Core|6Core|8Core|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|Default|5.0GHz|5.0GHz|4.8GHz|4.7GHz|4.7GHz|
|#1|5.2GHz|5.1GHz|5.0GHz|5.0GHz|4.8GHz|
|#2|5.2GHz|5.2GHz|5.1GHz|5.0GHz|4.9GHz|
|#3|5.2GHz|5.2GHz|5.2GHz|5.1GHz|5.0GHz|
|#4|5.3GHz|5.3GHz|5.0GHz|5.0GHz|4.9GHz|

###　結果
![スクリーンショット 2019-05-08 22.14.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/4bd6d6c5-72d1-8529-19bf-5c0443b87888.png)

\#4は完走せず
\#3は警告が表示される

一方、5.2GHzに関しては特に問題なさそう

##　結論
8Core16Thread x 5.0GHz が早い (defの約9割)
少数コア時に高クロックに振ると幸せになれるかも
Leetcode #62: Unique Paths

```swift
func uniquePaths(_ m: Int, _ n: Int) -> Int {
    if m == 0 || n == 0 {
        return 0
    }
    var dp = Array(repeating: Array(repeating: 1, count: m), count: n)
    if n > 1 && m > 1 {
        for i in 1...n-1 {
            for j in 1...m-1 {
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
            }
        }
    }
    return dp[n-1][m-1]
}
```
Unityでオブジェクトを透明にしたいとき

[結論]
MaterialのRendering ModeをOpaque以外にする


[経緯]
プログラムでオブジェクトの色を操作したい場合、
Render renderer=GetComponent<Renderer>();
Color c=renderer.material.color;

という形でcにオブジェクトのColorインスタンスを取り出すことができました。
ここで色のプロパティを操作することができます。
ということで透明度を変更するアルファ値を操作しようと思い

c.a+=0.1f;
c.a-=0.1f;

とコードを打ちましたが透明にならなかったので共有です。


[解説]
Unityのリファレンスを見ると
Unityリファレンス　「Albedo カラーと Transparency（透明度）」
https://docs.unity3d.com/ja/current/Manual/StandardShaderMaterialParameterAlbedoColor.html

![opaque.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/5469ec19-4eb2-b42d-1f6d-cb90bf7ce376.png)
「Opaque でないに設定されている場合は効果があります。」
と書かれていました。
Unity上ではこの部分に当たります。
![material.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/075d3bc1-61e1-dcd4-e0d1-a8c010631754.png)

OpaqueとはUnityのレンダリングモードの一つで、マテリアルを生成した時のデフォルト設定となっており
「透明な部分のない、一般的な固形のオブジェクトに適しています。」
と書かれています。
なので、この部分の設定を変えればよいです。
UnityリファレンスURL「Rendering Mode」
https://docs.unity3d.com/ja/current/Manual/StandardShaderMaterialParameterRenderingMode.html
ゼロから作るDeep-Learningを読んで手書き画像認識アプリを作ってみた！

みなさんこんにちは。
ゼロから作るDeep-Learningを読んで、画像認識アプリを作ってみました。
https://github.com/altyjp/hello_AI
初投稿+試し書きですので、至らない部分もあるかと思いますがよろしくお願いします。

## 動機
"ゼロから作るDeep-Learning"はディープラーニングを学習するにはいい本なのですが、
実際に活用する方法については記載されておりませんでした。
そこで、node.js+htmlでフロント周りを作り、
この本に書いてある7章のニューラルネットワークを手書き画像認識に活用してみました。

## 動作イメージ
1. 上の箱に手書きで0〜9の数値を書いてstartをクリックします。
2. resultに推論の結果と各0〜9の類似度を示したグラフがでます。
![IMG_0240.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360434/798e2aec-6b6f-3e1b-89d9-9fb6b7c9e01e.jpeg)

## システム概要図
全体図はこんな感じです。
<img width="522" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360434/b1ed9da1-a102-00dd-f545-f5f8b7968390.png">

1. Webページ(expressのexpress.staticを利用)から手描きcanvasの情報をbase64変換にして送信
2. Nodejs(`index.js`)内でbase64変換されたcanvas情報をpng化して保存し、それを引数としてpythonで書いた`start_NN_2.py`を呼び出し、ニューラルネットワークに推論させる。
3. 推論結果をJSON形式で返却する。
4. Webページで結果を表示する。
ムームードメイン DNS設定備忘録

#参考URL
https://webkaru.net/vps/dti-serversman-set-domain/

#設定方法
ムームードメインにログイン
「ドメイン管理」→「ドメイン操作」→「ムームーDNS」をクリック
「処理」欄にある「変更」をクリック
「設定1」はすべて「利用しない」にチェック
「設定2」の「種別」に「A」を入力
「設定2」の「内容」にIPアドレスを入力
「セットアップ情報更新」をクリック
staticfileについて


DjangoブログをAWSにデプロイ後staticフォルダのリンクがなかなか表示されずに苦労したのでめも

●課題
staticファイルは各アプリ下に作成するが、それだと別アプリのstaticフォルダにリンクしているものはルーティングが道に迷って正しくリンクが表示されない。

●対策
・setting.pyにSTATIC_URLとSTATIC_ROOTを以下のように設定する。
・Collectstaticをする

STATIC_URLとSTATIC_ROOTをプロジェクト直下に設定し、Collectstaticによって各アプリ下のSTATICフォルダ中のファイルをプロジェクト直下のSTATICフォルダにかき集める。
このフォルダのみにルーティングされるため、正しく機能する。


```
STATIC_URL = '/static/'
STATIC_ROOT=os.path.join(BASE_DIR,"static")
```
Javascript　備忘録

#はじめに
2019年5月8日更新

#背景
職業訓練校に学んだことの復習と自分の備忘録を兼ねてまとめました。

##JavaScriptとは
ウェブブラウザ上で動作するクライアントサイドの言語です。
**Java**Scriptとついているが、Javaとは全く別ものです。
ECMAScriptという仕様で動作が決められており、
文法がわかやすいため、今ではサーバでも使われるようになっています。

##データ型
1.文字列型（String）
   文字の集まりです

2.数値型（Number）
   ※整数、少数などの区別はありません。

3.ブール型（Boolean）
   true or falseのどちらかの値を取ります。

4.null型
   値が存在しない。意図的に値を入れない場合に使います。

5.undefined型
   値が未定義

6.シンボル型（Symbol：ES6の新機能）

##記述例：年月日の取得と表示
```js

//コメント
//日付の取得
const date = new Date();
//※constで記述すると変数が固定される

//西暦4桁の取得
const <変数名:年> = date.getFullYear();
//変数名に複数の単語を使うときは後ろの単語の頭文字は大文字にするほうが良い。

//月の取得
const <変数名:月> = date.getMonth()+1;

//曜日の取得 (日:0 月:1 火:2 水:3 木:4 金:5 土:6)
const <変数名:曜日> = ["日","月","火","水","木","金","土"];
const <変数名:曜日> =<変数名>[date.getDay()];

//時間の取得
const <変数名:時間> = date.getHours();

//時間の取得(分)
const <変数名:分> = date.getMinutes();

//時間の取得(秒)
const <変数名:秒> = date.getUTCSeconds();

const <表示させる変数名> = `${変数名:年}年${変数名:月}月${変数名:日}日(${変数名:曜日})${変数名:時間}:${変数名:分}:${変数名:秒}`;

 <p id ="current">"今日の日付は"2019年5月8日(水)"です。"</p>

console.log(表示させる変数名);//コンソールに年月日が表示されます。
current.innerText = 表示させる変数名;//<p>年月日が表示されます。</p>

```

##記述例：配列
```js

const <変数名> = ["犬","猫","うさぎ"];
      <変数名>.push("インコ");末尾に追加
        console.log(<変数名>[3]);//インコと表示されます。
	console.log(<変数名>.length); 配列の要素数が表示されます。
      <変数名>.pop();末尾を削除
        z++; 1加算 インクリメント
        z--;1減算  デクリメント
```
並列処理数を指定できる Promise.all の実装


# 実装

```ts
const promiseAllWithConcurrencyLimit =
  async <T>(promises: (() => Promise<T>)[], concurrency: number) => {
    const results: T[] = []
    let idx = 0
    await Promise.all(Array.from({ length: concurrency }).map(async () => {
      while (true) {
        const cur = idx++
        const task = promises[cur]
        if (!task) return
        results[cur] = await task()
      }
    }))
    return results
  }
```

# 記事を書くまでの経緯

[こちらの記事](https://qiita.com/ttiger55/items/3f7732f19fe927d1bf0a)の実装の場合

`[6秒かかる処理, 2秒かかる処理, 2秒かかる処理, 2秒かかる処理]` を `concurrency = 2` で実行すると 8 秒かかります。

上記の実装の場合 6 秒ですみます。

# 解説

`Promise` を `concurrency` の指定数生成する。

各 `Promise` は下記を行う。

  1. `promises` に処理が残っていなかったら終了。
  1. `promises` から処理を取り出して実行する。
  1. `1.` に戻る。

これにより、 `Promise` の数だけ並行して処理が走る。
（ `Promise` 内では `await` の指定により同期的に走るため数を超えない ）

### 追記 2020-06-04

[並列処理数を指定できてキャンセルできる Promise.all の実装](https://qiita.com/rithmety/items/cb0a359914aa679df9ed) を書きました
laravelで署名するためのパッケージ導入



```php.ini
ninja@localhost:~$ sudo vi /etc/php/7.2/cli/php.ini

/*コメントアウトを外す*/
extension=gmp
```
```
ninja@localhost:~$ sudo apt-get install php7.2-gmp

ninja@localhost:~$ cd website
ninja@localhost:~/website$ composer require kornrunner/secp256k1
ninja@localhost:~/website$ composer require kornrunner/keccak
```

#参考URL
https://github.com/kornrunner/php-keccak
Closuresって何？使い方は。

参考にしたものは以下。公式のドキュメントです。
[the swift programming language
swift 5](https://docs.swift.org/swift-book/LanguageGuide/Closures.html)

簡単にまとめておきたいと思います。

・基本的には**Nest**した関数。2重の関数。
・関数を完結に記述できる。
・変数を保持できる。

の3点かなと思います。

```swift

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func backward(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2
}

//Nestした関数。

var reversedNames = names.sorted(by: backward)
// reversedNames is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
```
これを、ひとまとまりに。

```swift

reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})
```
そして、単純、簡潔に、


```swift
reversedNames = n
ames.sorted(by: { $0 > $1 } )
```
もっと

```swift
reversedNames = names.sorted(by: >)
```
少し違う書き方もできる。これを**Trailing Closures**という。

```swift
reversedNames = names.sorted() { $0 > $1 }
```
最後にもう一つ。**変数を保持**するタイプです。**Capturing Values**

```swift
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementer() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}
```
IteratorパターンをSwiftで書いてみた

今回参考にさせていただいた書籍です
[増補改訂版Java言語で学ぶデザインパターン入門](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030)

## protocolの実装
``` swift:iterator.swift
protocol Iterator {
    associatedtype Item
    var hasNext: Bool { get }
    func next()->Item
}
```
iteratorはaggregateから生成されて、配列を数え上げるprotocolです。

``` swift:aggregate.swift
protocol Aggregate {
    associatedtype IteratorImpl: Iterator
    var iterator: IteratorImpl { get }
}
```
aggregateは対応したiteratorを返します。

## 実装クラスの実装
``` swift:book.swift
class Book {
    let name: String
    init(name: String) {
        self.name = name
    }
}
```
数え上げられるItemです。

``` swift:bookshelf.swift
class BookShelf: Aggregate {
    typealias IteratorImpl = BookShelfIterator
    var len: Int {
        return books.count
    }
    private(set) var books: [Book] = []
    var iterator: BookShelfIterator {
        return BookShelfIterator(self)
    }
    
    func appendBook(book: Book) {
        self.books.append(book)
    }
}
```
Aggregateの実装クラスです。
書籍の方では取得するために、getBookAt(index:Int)で本を取得してましたが、private(set) varで十分だと思い今回は実装していません。

``` swift:bookiterator.swift
class BookShelfIterator: Iterator {
    typealias Item = Book
    
    private let shelf: BookShelf
    private var index: Int
    
    var hasNext: Bool {
        if index < shelf.len {
            return true
        } else {
            return false
        }
    }
    
    init(_ shelf: BookShelf) {
        self.shelf = shelf
        self.index = 0
    }
    
    func next() -> Book {
        defer {
            self.index += 1
        }
        return self.shelf.books[self.index]
    }
}
```
BookShelfIteratorは書籍の方と同じです。
## 呼び出し

``` swift:main.swift
var shelf = BookShelf()
shelf.appendBook(book: Book(name: "Code Complete"))
shelf.appendBook(book: Book(name: "Design Pattern"))
shelf.appendBook(book: Book(name: "Clean Architecture"))
var iterator = shelf.iterator
while (iterator.hasNext) {
    print(iterator.next().name)
}
```

呼び出しに関してはほぼ書籍通りになってますが、個人的にiteratorから帰ってくる値がAnyもしくはAnyObjectが嫌だったので、`associatedtype`を使って実装クラスで返す値の型とiteratorの型を決定しています。

なので`main.swift`に書かれてるiteratorはiteratorに準拠したクラスになるため、iteratorの`hasNext`、`next()`を呼んでいるというより、iteratorに準拠した`hasNext`、`next()`を呼んでいることになります。

勉強がてらデザインパターンをSwiftで書き起こしをしてみましたが、いろいろ勉強になることがあったので、他のパターンでもやってみようと思います。改善点などがあれば教えていただけると助かります。
gawk 5.0 の名前空間の使用例

 gawk5.0からは名前空間が使えるようになりました。行頭に @namespace "識別子" で名前空間を区別することができます。デフォルトでは"awk"です。

　10進-16進変換を例として書いてみます。16進→10進変換の関数h2d()、10進→16進変換の関数d2h()、これらに必要な変数や配列の初期化init()、およびデバッグ用のdebug()は名前空間 "hex"にあります。他の名前空間からは hex::h2d()のように呼び出します。変数の参照も同様にhex::D2H[1]のように書けばできます。
　ある名前空間内でグローバルに参照する変数はこの例のようにinit()のような関数内で設定することにして、呼び出し元の名前空間(ここではデフォルトの"awk")から一回呼び出してやればよいかと思います。

```
# gawk -M -f hex.awk # -M は多倍長演算サポート
BEGIN {
	hex::init()
	# hex::debug()

	t="deadbeefdeadbeefdeadbeefdeadbeef" ; print t,hex::h2d(t)
	t="142857142857" ; print t,hex::d2h(t)
	for(i in hex::D2H) print i,hex::D2H[i]

}


{
	print hex::h2d($1)
}


@namespace "hex"

func init() {
	a="0123456789ABCDEF"
	b="abcdef"
	for (i=0; i<=15; i++) {
		D2H[i]=substr(a,i+1,1)
		H2D[substr(a,i+1,1)]=i
	}
	for(i=0; i<=5; i++) H2D[substr(b,i+1,1)]=i+10
}

func h2d(h ,sum,m,i,t) {
	sum=0
	m=1
	for (i=length(h); i>=1; i--) {
		t=substr(h,i,1)
		if (H2D[t]=="") return -1
		sum+=H2D[t]*m
		m=m*16
	}
	return sum
}

func d2h(d ,sum,t) {
	sum = ""
	do {
		t=d % 16
		sum = D2H[t] sum
		d = int(d/16)
	} while (d>0)
	return sum
}

func debug() {
	print "*H2D"
	for (i in H2D) print i,H2D[i]
	print "*D2H"
	for (i in D2H) print i,D2H[i]
}
```
Googel Chrome Helperは、キーチェン内の"Chrome Safe Storage"に保存されている機密情報を使用としています

## 問題
- ローカルでfeature specを実行するとGoogel Chrome Helperがアクセスを求めてくる
- developでsystem spec実行時にログインパス求められて、実行できない

```
Googel Chrome Helperは、キーチェン内の"Chrome Safe Storage"に保存されている機密情報を使用としています
```


## 解決策
- chromedriver-helper　をやめて　webdrivers にする
    - [サポートが終了したchromedriver-helperからwebdrivers gemに移行する手順 - Qiita](https://qiita.com/jnchito/items/f9c3be449fd164176efa)
- chromeのバージョンを変更する
    - [ChromeDriver を介した e2e テストで、Chrome が起動せず失敗する - Qiita](https://qiita.com/ktrkmk/items/948da8b4c6e9e2afaddc)
    - [CircleCIのChromeとchromedriver-helperのchromedriverのバージョンを揃える - Qiita](https://qiita.com/IYD37/items/a5a9eee71dde858d19d3)
画像処理100本ノックC言語で挑戦してみる　＃3

#Q.3. 二値化
>画像を二値化せよ。 二値化とは、画像を黒と白の二値で表現する方法である。 ここでは、グレースケールにおいて閾値を128に設定し、下式で二値化する。
>y = { 0 (if y < 128)
     255 (else) 

|入力|出力| 
|:-----------------:|:------------------:|
|![imori.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333871/4f63e9f0-85ea-f418-5850-e2229a19c1d6.jpeg)|![answer_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333871/633dfe39-ab32-3289-435c-57fa957c2bd0.jpeg)|


#回答
二値化する部分のコードです。
今回も、出力部分とまとめました。

```c:ex3.c
double image_gry[height][width];
int k = 0;
for(int i = 0; i < height; i ++){
    for(int j = 0; j < width*3-2; j = j+3){
        image[i][j] = image[i][j] * 0.2126;
        image[i][j+1] = image[i][j+1] * 0.7152;
        image[i][j+2] = image[i][j+2] * 0.0722;
        image_gry[i][k] = image[i][j] + image[i][j+1] + image[i][j+2];
        if((int)image_gry[i][k] < 128){
            fprintf(outfp, "0 ");
        }else{
            fprintf(outfp, "255 ");
        }
        k ++;
    }
    fprintf(outfp, "\n");
}
```


#解説
第二問に少し手を加えただけです。
出力するときに0か255に分類するだけなので、`fprintf`を場合分けの中に入れてあげて、`image_gray`の値が128未満か否かで分岐させます。

#完成したプログラム（全文）
```c:ex3.c
#include <stdio.h>
#define N 256

int main(void) {
    FILE *infp;
    FILE *outfp;
    char magic[64];
    char str[256];
    int width;
    int height;
    int max;
    char readline[N] = {'\0'};

    infp = fopen("../imori.ppm", "r");
    
    //magic
    fgets(magic, N, infp);
    //width, height
    int num[4];
    for(int i = 0; i < 2; i ++){
        fscanf(infp, "%d", &num[i]);
    }
    width = num[0];
    height = num[1];
    //max
    fscanf(infp, "%d", &max);
    //image
    double image[height][width*3];
    for(int i = 0; i < height; i ++){
        for(int j = 0; j < width*3; j ++){
            fscanf(infp, "%lf", &image[i][j]);
        }
    }

    outfp = fopen("imori.pgm", "w");

    fprintf(outfp, "P2\n");
    fprintf(outfp, "%d ", width);
    fprintf(outfp, "%d\n", height);
    fprintf(outfp, "%d\n", max);

    double image_gry[height][width];
    int k = 0;
    for(int i = 0; i < height; i ++){
        for(int j = 0; j < width*3-2; j = j+3){
            image[i][j] = image[i][j] * 0.2126;
            image[i][j+1] = image[i][j+1] * 0.7152;
            image[i][j+2] = image[i][j+2] * 0.0722;
            image_gry[i][k] = image[i][j] + image[i][j+1] + image[i][j+2];
            if((int)image_gry[i][k] < 128){
                fprintf(outfp, "0 ");
            }else{
                fprintf(outfp, "255 ");
            }
            k ++;
        }
        fprintf(outfp, "\n");
    }
    
    return 0;
}
```

#リンク
[画像処理100本ノックを作ったった](https://qiita.com/yoyoyo_/items/2ef53f47f87dcf5d1e14)
[画像処理100本ノックC言語で挑戦してみる　イントロダクション](https://qiita.com/HirosuguTakeshita/items/259b82182dab3dcd273c)
DatadogのSynthetics(外形監視)をもう少し深掘ってみた

# なんで深掘ったの？
- Datadogで外形監視させたかったけど、アクセス元のグローバルIPとか絞りたかった
    - 世界全体からアクセスして確認される必要はなかったので・・・ :sweat: 
- ブラウザテストもリリースされたこともあり、触ってみたかった
    - うまく使うと、リリース後に特定の画面で挙動が変わったとか、パフォーマンスが落ちたとかも検知できそう :grin: 

# 参考サイト
**※皆さまよりご提供いただいた情報のおかげです！ ありがとうございますｍｍ**

- [DatadogのSynthetics(外形監視)つかってみた - Qiita](https://qiita.com/smallpalace/items/cc4c0118b817276cb6ac)
- [Synthetics API Tests（外形監視）機能を使ってみた #datadog ｜ DevelopersIO](https://dev.classmethod.jp/etc/datadog-synthetics-api-test/)
- [Synthetics IP ranges](https://ip-ranges.datadoghq.com/)
- [Synthetics Browser Tests 機能を使ってみた #datadog ｜ DevelopersIO](https://dev.classmethod.jp/etc/datadog-synthetics-browser-tests/)
- [Datadogでブラウザテスト機能がリリースされました！ – サーバーワークスエンジニアブログ](http://blog.serverworks.co.jp/tech/2019/04/17/datadog-browser/)
- [KEIROMICHI | IPアドレスから住所検索](http://keiromichi.com/index.php)

# 今まで
- Datadogでは外形監視をするサービスがなかった（agent使ってうまく監視されている方もいらっしゃいましたが・・・）
- agent使って監視する場合、yamlファイルに設定値が増える運用になるのがいやだった :sweat_drops:(増えたり減ったりしても画面ポチポチで終わらせたかった)
- 上記理由から別サービスで外形監視してた

# これから
- Syntheticsを使って外形監視できる！
- 対象が増えたりしても画面ポチポチで対応できる!
- 監視はDatadogに全て集約できる！ 外形監視に絞った費用も別サービスとだいたい同じくらいってなると、変えるっきゃないっしょ :exclamation: 

# 深掘ったら結果どうだったの？
### [Synthetics IP ranges](https://ip-ranges.datadoghq.com/)が公開されていることで、アクセス元のグローバルIPを絞ることができた！
Datadog上の `Location` の設定でもアクセス元を絞ることはできるけど、`Tokyo` とか `Sydney` とかざっくりな設定だったんですな・・・ :sweat: 
この時に [KEIROMICHI | IPアドレスから住所検索](http://keiromichi.com/index.php) があって助かりました :exclamation: 
IPアドレス入れると、ホスト名を返してくれて、IPアドレスベースでアクセス元のリージョンがわかるっていう・・・ｗ :smile: 

![Test Details _ Datadog.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14268/1a661e59-7df3-dbbe-4b24-f62bac321394.jpeg)

```bash:そのとき使ったコマンド
## コマンド
$ curl -Ss 'http://keiromichi.com/index.php?ip=XXX.XXX.XXX.XXX' | grep 'ホスト名'
curl -Ss 'http://keiromichi.com/index.php?ip=XXX.XXX.XXX.XXX' | grep 'ホスト名'
curl -Ss 'http://keiromichi.com/index.php?ip=XXX.XXX.XXX.XXX' | grep 'ホスト名'
curl -Ss 'http://keiromichi.com/index.php?ip=XXX.XXX.XXX.XXX' | grep 'ホスト名'
curl -Ss 'http://keiromichi.com/index.php?ip=XXX.XXX.XXX.XXX' | grep 'ホスト名'

## 実行結果
                                                <th>ホスト名</th><td>ec2-XX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com</td>
                                                <th>ホスト名</th><td>ec2-XX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com</td>
                                                <th>ホスト名</th><td>ec2-XXX-XXX-XXX-XXX.ap-southeast-2.compute.amazonaws.com</td>
                                                <th>ホスト名</th><td>ec2-XX-XXX-XXX-XXX.eu-west-2.compute.amazonaws.com</td>
                                                <th>ホスト名</th><td>ec2-XX-XXX-XXX-XXX.eu-west-2.compute.amazonaws.com</td>
```

あとは、上記のIPアドレスのうち、東京リージョン(ap-northeast-1.compute.amazonaws.com) のホスト名を持つIPからのアクセスを許可すればいいというわけですな :v:
しかし、IP rangesへアクセスしたときに表示されている `"modified": "2019-04-08-14-30-00",` を見るとこれが突然変わることがあるんじゃないかとビクビクしていますｗ :cold_sweat: :cold_sweat: :cold_sweat:

ブラウザテストはまた追記します。
Educational DP Contest B - Frog 2

#問題概要
[問題へのリンク](https://atcoder.jp/contests/dp/tasks/dp_b)

要素数$N$の配列$h$がある。配列の左端(インデックス$0$)から右端(インデックス$n-1$)へ以下の進み方で進む。
点$i$から $i+1,i+2,…,i+K$のどれかへ進む。この時進んだ先の点を$j$とすると、移動コストは $|h_j - h_i|$ である。

総移動コストの最小値を求めよ。

#制約条件
- 入力はすべて整数である。
- $2≤N≤10^5$
- $1≤K≤100$
- $1≤h_i≤10^4$

#考えたこと
基本的なDPの問題。

dpを以下のように定義する。

```.cpp
dp[i] == 移動コストの最小値
```

遷移は以下。

```.cpp
for(int i = 1; i < n; i ++) {
    dp[i] = min(dp[i],abs(h[i]-h[i-j]) + dp[i-j]); //(1≤j≤100)
}
```


計算量は $O(NK)$。

小さいことですがlong型で提出しないとREなっちゃいます...(原因がわからなくて3回REかましちゃいました...)

#解答

C++

```b.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n,k; cin >> n >> k;
    vector<long> h(n);
    for(int i = 0; i < n; i ++) cin >> h[i];
    vector<long> dp(n);
    dp[0] = 0;
    for(int i = 1; i < n; i ++) {
        for(int j = 1; j <= min(i,k); j ++) {
            if(j==1) dp[i] = abs(h[i]-h[i-j]) + dp[i-j];
            else dp[i] = min(dp[i],abs(h[i]-h[i-j]) + dp[i-j]);
        }
    }
    cout << dp[n-1] << endl;
}
```

C#

```b.cs
using System;
using System.Linq;

class Program
{
    static void Main(string[] args) {
        int[] nk = Console.ReadLine().Split().Select(int.Parse).ToArray();
        long[] h = Console.ReadLine().Split().Select(long.Parse).ToArray();
        Console.WriteLine(dp(nk[0],nk[1],h)[nk[0]-1]);
    }
    static long[] dp(int n, int k, long[] h) {
        long[] dp = new long[n];
        dp[0] = 0;
        for(int i = 1; i < n; i ++) {
            for(int j = 1; j <= Math.Min(k,i); j ++) {
                if(j==1) dp[i] = Math.Abs(h[i]-h[i-j]) + dp[i-j];
                else dp[i] = Math.Min(dp[i],  Math.Abs(h[i]-h[i-j]) + dp[i-j]);
            }
        }
        return dp;
    }
}
```
rubyでビンゴしようよ！！！！

今日は[こちらのブログ](https://blog.jnito.com/entry/2015/02/09/101018)のビンゴ作成問題に挑戦しました！！！！！

コードはこちらです！

```rb
# ビンゴを作成しました。
# 左の列から1~15,16~30,31~45,46~60,61~75からランダムに抽出し、真ん中は空白にします。
RANGE_NUM = [
  ('1'..'15'), ('16'..'30'), ('31'..'45'), ('46'..'60'), ('61'..'75')
]

class Bingo
  def generate_card
    puts %q!  B|  I|  N|  G|  O|!
    # 配列の各要素からランダムに抽出する挙動を5回繰り返します。
    # 3列目、3行目(真ん中)の時は空白にします。
    1.upto(5) { |n|
      RANGE_NUM.each_with_index { |range, index|
        next print choose_num(range) unless n == 3 && index == 2
        print '|'.rjust(4)
      }
      puts
    }
  end

  def choose_num(range)
    (range).to_a.sample.rjust(3) + '|'
  end
end
```

<b>苦労した点</b>
今回もどうやってコードの重複を減らすかに苦労しました。
ビンゴを作ること自体はさほど難しくありませんでした。
しかし、ちょうど中心に空白を作らなければいけない為、同じような繰り返し式が何回も書かなければならなくて、これをどうまとめるか悩みました。
uptoとwith_indexの組み合わせを今回は使ってみました！

<b>追記</b>

コメントで頂いた意見とtransposeメソッドを用いてリファクタリングしてみました。

```rb
# ビンゴを作成しました。
# 左の列から1~15,16~30,31~45,46~60,61~75からランダムに抽出し、真ん中は空白にします。
class Bingo
  attr_reader :numbers

  def initialize
    @numbers =
      (1..75).each_slice(15).map { |array|
        array.sample(5)
      }
    @numbers[2][2] = ''
  end

  def to_s
    puts %q!  B|  I|  N|  G|  O|!
    @numbers.transpose.each { |array|
      array.each { |n|
        print n.to_s.rjust(3) + '|'
      }
      puts
    }
  end
end
```
AIの概況と機械学習入門

<B>【AIの概況について】</B>
<B>■AIとは</B>
http://ainow.ai/artificial-intelligence-3/
第一次AIブーム　推論・探索の時代（1950年代後半～1960年代）
第二次AIブーム　知識をいれると賢くなる（1980年代）
第三次AIブーム　機械学習・深層学習技術の発展（現在）
⇒機械学習とディープラーニング

<B>■日本のAIサービス事業</B>
AIサービスマップ
http://ainow.ai/2017aisummer/

<B>■AI関連技術の４つの層</B>
https://aizine.ai/ai-opensourse1009/

(1)AI （人工知能）アプリ/サービス
スマホあるいは家電製品で使用することができるサービス。
例）検索サービス、チャットボット、スマートスピーカーおよびSiriなど

(2)AI （人工知能）プラットフォーム
自然言語理解/画像認識/動画分析/音声認識/機械翻訳などのAI （人工知能）機能をWebブラウザ経由で提供するサービス（有料）
例）Google Cloud ML、Amazon ML、IBM Watson

(3)フレームワーク
AI （人工知能）アプリ/サービス開発時に使用する部品集
Python等のプログラミング言語によりフレームワークの各部品を呼び出すことにより効率良く開発することができる。
TensorFlow（Google）、Chainer（Preferred Networks）、Keras、Cognitive Toolkit（Microsoft）

(4)ハードウェア
GPU（Graphics Processing Unit）はCPUの約10倍以上の処理性能を持つ

<B>■テンソルフローの環境構築について</B>
https://www.slideshare.net/piacere_ex/ai1aitensorflow
① 各種OS用のpip（Pythonパッケージマネージャ）経由 でインストールする 
② 【Windows、Mac】Anaconda（Python開発環境マネージャ）経由でインストールする 
③ DockerからTensorFlowイメージをインスト―ル(pull) する

<B>【機械学習入門】</B>
<B>■Chainerチュートリアルについて</B>
https://tutorials.chainer.org/ja/index.html
⇒機械学習・ディープラーニングに入門できるサイト
　環境構築いらずでプログラム実行可能！
　・Open in Colab から Google Colaboratory へ移動
　・自分のドライブへノートブックをコピーする
　・コードを実行しながら解説を読んでいく
　という流れ

※Google Colaboratory（Colab）
　クラウド上で Jupyter Notebook 環境を提供する Google のウェブサービス
　・Markdown記法でメモや解説などの記述の追加
　・プログラムを実行と、その結果の確認
　・GPUも無料で使用することができる

<B>■機械学習は3種類手法</B>
　http://blog.brainpad.co.jp/entry/2017/02/24/121500
　
　〇教師あり学習 (supervised learning) 
　　正解のある訓練データ（Labeled Data）
　　
　〇教師なし学習 (unsupervised learning) 
　　正解のないデータ
　　クラスター分析、規則性や相関性、特徴を解析
　　　例）データマイニング
　　
　〇強化学習 (reinforcement learning) 
　　試行錯誤を通じて「価値を最大化するような行動」
　　　例）AlphaGo

<B>■教師あり学習 </B>
　回帰 (regression) 
　　例）値段を予測する
　　
　　https://tutorials.chainer.org/ja/src/07_Regression_Analysis_ja.html
　　単回帰分析
　　　入力:出力=1:1
　　　　例）部屋の広さ x から家賃 tを求める
　　　
　　重回帰分析
　　　入力:出力=N:1
　　　　例）部屋の広さを x1、駅からの距離を x2、…、犯罪発生率を x M から家賃 tを求める
　　　
　分類 (classification)
　　例）画像、文字、音声認識
　
Step 1データの特徴や関係性を計算するモデルを決める
Step 2目的関数（モデルの最適なパラメータを求めるための関数）を決める
Step 3パラメータを最適化する

モデルのいろいろ
https://qiita.com/ishizakiiii/items/f6909696c616fd6294ca

<B>■NumPy を用いた重回帰分析</B>
https://tutorials.chainer.org/ja/src/08_Introduction_to_NumPy_ja.html
NumPyはPython で数値計算を高速に行うためのライブラリである
Google Colaboratory上のノートブックにはデフォルトでインストールされている

<B>■scikit-learn を用いた重回帰分析</B>
https://tutorials.chainer.org/ja/src/09_Introduction_to_Scikit-learn_ja.html
scikit-learn は Python のオープンソース機械学習ライブラリ 
様々な機械学習の手法が統一的なインターフェースで利用できる

Step 1：データセットの準備
Step 2：モデルを決める
Step 3：目的関数を決める
Step 4：最適化手法を選択する
Step 5：モデルを訓練する
　　　⇒新しい入力値に対する予測の計算（推論）

<B>■ニューラルネットワークとは</B>
https://tutorials.chainer.org/ja/src/13_Basics_of_Neural_Networks_ja.html
微分可能な変換を繋げて作られた計算グラフ
ニューラルネットワークの各層では、前の層の出力値に「線形変換」と「非線形変換」を順番に施している
⇒一つの大きな関数と考えられる
※ディープラーニング (deep learning) ：
層の数が非常に多いニューラルネットワークをモデルにした機械学習の手法や、その周辺の研究領域のこと

ニューラルネットワークで表現されるような複雑な関数の場合、
繰り返し数値計算を行って目的関数の最適化する。
　例）勾配降下法、ミニバッチ学習：確率的勾配降下法（stocastic gradient descent; SGD）

<B>■Chainer によるネットワークの訓練</B>
https://tutorials.chainer.org/ja/src/14_Basics_of_Chainer_ja.html
Step 1 : データセットの準備
Step 2 : ネットワークを決める
Step 3 : 目的関数を決める
Step 4 : 最適化手法を選択する
Step 5 : ネットワークを訓練する
画像処理100本ノックC言語で挑戦してみる　＃2

#Q.2. グレースケール化
>画像をグレースケールにせよ。 グレースケールとは、画像の輝度表現方法の一種であり下式で計算される。
>Y = 0.2126 R + 0.7152 G + 0.0722 B

|入力|出力| 
|:-----------------:|:------------------:|
|![imori.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333871/4f63e9f0-85ea-f418-5850-e2229a19c1d6.jpeg)|![answer_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333871/03203924-1ff0-af1a-99e6-51f5f326b2a9.jpeg)|


#回答
グレースケール化する部分のコードです。
今回は出力部分にまとめてしまいました。

```c:ex2.c
double image_gry[height][width];
int k = 0;
for(int i = 0; i < height; i ++){
    for(int j = 0; j < width*3-2; j = j+3){
        image[i][j] = image[i][j] * 0.2126;
        image[i][j+1] = image[i][j+1] * 0.7152;
        image[i][j+2] = image[i][j+2] * 0.0722;
        image_gry[i][k] = image[i][j] + image[i][j+1] + image[i][j+2];
        fprintf(outfp, "%d ", (int)image_gry[i][k]);
        k ++;
    }
    fprintf(outfp, "\n");
}
```


#解説
問題文に記載されていた式をあてはめました。
少し、これはズルかなと思いましたが、ppm形式の画像からpgm形式の画像へと変換するプログラムにしました（RGBのままグレースケール化する方法を思いつかなかった）。

第一問と同様、ピクセルの値は3つで1組で処理を行います。
まず、新たにheight × widthサイズの二次元配列を用意し、R、G、Bそれぞれの値に計算式中の係数を掛け合わせてその和を格納しました。
計算式自体はdouble型の数値計算だったので、出力時にint型にキャストするという流れです。

#完成したプログラム（全文）
```c:ex2.c
#include <stdio.h>
#define N 256

int main(void) {
    FILE *infp;
    FILE *outfp;
    char magic[64];
    char str[256];
    int width;
    int height;
    int max;
    char readline[N] = {'\0'};

    infp = fopen("../imori.ppm", "r");
    
    //magic
    fgets(magic, N, infp);
    //width, height
    int num[4];
    for(int i = 0; i < 2; i ++){
        fscanf(infp, "%d", &num[i]);
    }
    width = num[0];
    height = num[1];
    //max
    fscanf(infp, "%d", &max);
    //image
    double image[height][width*3];
    for(int i = 0; i < height; i ++){
        for(int j = 0; j < width*3; j ++){
            fscanf(infp, "%lf", &image[i][j]);
        }
    }

    outfp = fopen("imori.pgm", "w");

    fprintf(outfp, "P2\n");
    fprintf(outfp, "%d ", width);
    fprintf(outfp, "%d\n", height);
    fprintf(outfp, "%d\n", max);

    double image_gry[height][width];
    int k = 0;
    for(int i = 0; i < height; i ++){
        for(int j = 0; j < width*3-2; j = j+3){
            image[i][j] = image[i][j] * 0.2126;
            image[i][j+1] = image[i][j+1] * 0.7152;
            image[i][j+2] = image[i][j+2] * 0.0722;
            image_gry[i][k] = image[i][j] + image[i][j+1] + image[i][j+2];
            fprintf(outfp, "%d ", (int)image_gry[i][k]);
            k ++;
        }
        fprintf(outfp, "\n");
    }
    
    return 0;
}
```

#リンク
[画像処理100本ノックを作ったった](https://qiita.com/yoyoyo_/items/2ef53f47f87dcf5d1e14)
[画像処理100本ノックC言語で挑戦してみる　イントロダクション](https://qiita.com/HirosuguTakeshita/items/259b82182dab3dcd273c)
THETA&unityで360画像/動画球体を作ってみた

##まずはTHETAのアプリをダウンロード。

https://support.theta360.com/ja/download/
DRLはここ、適宜なバージョンを選択してダウンロードします。
##THETAから画像をPC側にコピー
THETAはReadOnlyなので、コピーしないと作業できない。
##THETAで撮った動画をアプリにドラッグ（画像ならこのステップは不要）
変換完了まで待つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/71d6b1ef-a348-909e-dd1a-070e73ff7ab8.png)
完了あと変換できた画像をUnityにインポート

##シーンの中でスフィアを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/bea420e5-540e-9f7f-cb1d-c395cce84d61.png)
#球体の材質を変える
ディフォルトの材質は物理に基づくレンダリングなので、テクスチャーは光に影響される。これを避けるために、まずは新しいマテリアルを作って、それから【UnlitShader】を作る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/9c01a296-431f-909a-25a3-0a7e1e376e2e.png)
次にUnlitShaderをマテリアルに与える。
最後にマテリアルを球体に与える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/7944f2a0-0744-d232-608d-f206d254a6a7.png)
↑こういう感じです。
##画像をドラッグしてマテリアルに与える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/07ac74e4-bb19-1387-1e9d-fe91debf7544.png)
##動画の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/fee2cc8a-8599-ba6f-8d2f-b4ed32f4ef09.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/35fd1bde-0917-a3e3-de1a-152383eb302c.png)
↑ここにドラッグ

こうすると、もう画像が見えましたが、テクスチャーがスフィアの外についてるので、法線を反転しないといけない。

##最後のステップ
下のスクリプトを球体に追加

```C#：NormalReverser.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NormalReverser : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        int[] triangles = GetComponent<MeshFilter>().mesh.triangles;
        for (int i = 0; i < triangles.Length; i += 3)
        {
            int t = triangles[i];
            triangles[i] = triangles[i + 2];
            triangles[i + 2] = t;
        }
        GetComponent<MeshFilter>().mesh.triangles = triangles;

    }
    // Update is called once per frame
    void Update()
    {

    }

}

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/1c45c007-d953-bfb2-76bb-22ead618e72e.png)
スクリプトファイルの名前とクラスの名前は一緒じゃないとだめ。

何をやったかというと、マッシュの三角形の第二の点と第三の点を入れ替わった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/788323bd-2a43-b68f-1b7e-97a12484926c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/57fc9739-060b-90cb-0d1d-495517f67b34.png)
こうして、法線ベクトルが反転された。

##テスト
カメラの位置を球体の中心に合わせて、Play！
おすすめの位置は![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/534d9453-47ec-f61c-c68b-7607e974d253.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/3e838a80-3e31-8380-2da2-a2e6a77e43b7.png)
ResetPositionをタッチすると自動に(0,0,0)に戻る。

最後はこういう感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/64a21caf-70e0-f5f8-b265-88bb45538da1.png)
GoのLambda関数でClooudWatchLogsのメッセ－ジを取得する

#Lambdaを利用してCloudWatchLogsのログのメッセージを取得します

- Lambda の呼び出しについて
  - Lambda サービスのストリーミングの開始を選択 -> フィルタ開始 -> Lambda起動 -> UUID の メトリクスフィルタ -> Alarm の作成をし、Event として Lambda を起動します。
 

```main.go
package main

import (
  "context"
  "log"
  "github.com/aws/aws-lambda-go/events"
  "github.com/aws/aws-lambda-go/lambda"
)

func HandleRequest(ctx context.Context, event events.CloudwatchLogsEvent) (string, error) {
  log.Print("Event received.")
  data, _ := event.AWSLogs.Parse()

  // Write received message to log.
  for i := range data.LogEvents {
    log.Print(data.LogEvents[i].Message)
  }

  return "ok", nil
}

func main() {
  lambda.Start(HandleRequest)
}

```
分割代入Tips

日常よく書くパターンで分割代入を使うと楽かも？と思った処をメモするTips回です。
イベントハンドラのコールバック引数とかで中身がオブジェクトプロパティになってる場合は結構便利です。

# Case
DOM操作系で`event.target`しか使わねンだわってパターンは結構あると思います。
そんな時はこう書くと便利。

```javascript
// event引数内のtargetプロパティのみ取り出す
elm.addEventListener("click", ({target}) => console.log(target));
```

あとは`Worker`で`message.data`で中身だけ取り出したいとか。

```javascript
// message.dataのみ取り出す
worker.addEventListener("message", ({data}) => console.log(data));
```

`axios`で`res.data`だけ欲しいんじゃ！って時。

```javascript
// res.dataのみ取り出す
axios.get("www.google.com").then(({data}) => console.log(data));
```
三角不等式

今日は。
三角形の形成条件についてメモしておきます。

## 三角形の形成条件
$\triangle{ABC}$の3辺の長さをそれぞれ$a,b,c$とすると, 次の3式が成立する:

```math
\begin{align*}
\ a+b&>c.\\
\ b+c&>a.\\
\ c+a&>b.
\end{align*}
```

これら3式を三角不等式という.
これを1文字(ここでは$a$にする)について整理すれば, それぞれ

```math
\begin{align*}
\ a>c-b\\
\ a<b+c\\
\ a>b-c
\end{align*}
```
となるから, まとめて
$$|b-c|<a<b+c$$
と表せる.
特に, $\max\\{ a,b,c \\} =a $であるとき, $|b-c|<a$であるから,
$$a<b+c$$
(一番長い辺が他の2つの辺の和より小さい)
と同値.
逆に, 長さがそれぞれ$a,b,c$であるような3つの線分に関して, 三角不等式が成立するとき, 3辺を$a,b,c$とする三角形が存在する.
【すっごく雑だよ】Flutter: New Web Projectってのがもう有ったから動かしてみた

やあやあ
Flutter For Web 良いですねぇ

https://github.com/flutter/flutter_web#tools-support-for-flutter-web-development

こっちの方法を試してみた。前提として

* https://github.com/flutter/flutter_web#tools-support-for-flutter-web-development こちらをlocalにclone済み
* DartのPATHは通した
* .pub-cacheのPATHも通してた
* サンプルも動かせてた

1. VSCodeのプラグイン `Dart` `Flutter`を最新にして（気づいたらなってた…どちらも3.0.0） `command` + `p` でコマンドパレットを開いて下記を実行
![スクリーンショット 2019-05-08 19.50.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82799/6ca32105-e4c5-9743-4ad2-dbe28908c855.png)  
この時点で `flutter packages pub global activate webdev` ココまでうまく実行してくれてるっぽい挙動をしてた。  でも、 **DartのPATHは既に通していたのでなんとも言えない…**
2. コードラボのFlutterプロジェクトを写経してたのでそれを雑に `main.dart` にコピペして…  
そのプロジェクトはこちら。   
https://codelabs.developers.google.com/codelabs/flutter/#0  
**最後の仕上げの過程でiOSとAndroidで見た目を変えるコードを書くが、なんかそれはうまく動かなそうだったので省いた**  
3. 最後に `ctrl` + `shift` + `@` でターミナルを出して `webdev serve` を実行
![スクリーンショット 2019-05-08 20.12.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82799/813a5339-d9ca-c9b6-0141-5013037453a9.png)

＿人人人人人人人人＿
＞　なんか動いた　＜
￣Y^Y^Y^Y^Y^Y^YY^￣

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82799/d6a397b3-d6b1-49ff-0c29-eb1214ccae77.gif)

ひたすらに雑ですまん

# すごく参考にしました！
[Flutter Webを動かしたときにつまづいたこと](https://qiita.com/Nkzn/items/402a29fe9bb517ce78aa)
[flutter webでexampleを動かすまで(flutterインストール済みを想定)](https://qiita.com/hiko1129/items/efc20792016a22a7c88a)
#Mac #Alfred の Snippets 機能でエクスポート・インポートする

# Export

Collection を右クリックして export を選ぶ

![image](https://user-images.githubusercontent.com/13635059/57364499-4d881680-71be-11e9-8aa0-db379a5170f0.png)

# Import

エクスポートしたファイルを開くだけ。

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1718








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->