OmniAICreator/Qiita-1.07M huggingface dataset:
The Hitchhiker's Guide to GoLand 2019.2

# はじめに

「The Hitchhiker's Guide to GoLand」の 2019.2 版新機能チュートリアルです。

----
## 環境

* macOS Catalina 10.15.2
* GoLand 2019.3.1

----
# TL;DR

1. ショートカットを通して GoLand 2019.2 新機能を知るチュートリアル
2. チュートリアルメニュー
3. 個人的に有益だったチュートリアルの紹介

----
# The Hitchhiker's Guide to GoLand 2019.2 お品書き

チュートリアルは全部で 5 項目あります。

1. Extract Method refactoring with returns
2. Fill struct fields
3. Redundant type conversions
4. Debug function calls
5. Postfix templates

----
# 1. Extract Method refactoring with returns

メソッド切り出し機能。
( [前記事](https://qiita.com/sokeusu/items/d9b861e0cdcfb4d076f0)とほぼ同じなのでドキュメントリンクで割愛 )
https://www.jetbrains.com/help/go/extract-method.html#extract-a-method

----
# 2. Fill struct fields

構造体のフィールドを自動で埋めてくれる機能。
`control + space` で補完効かせながら書いているといつの間にか発動していますが、以下のように `option + return` のコンテキストメニューからも発動できます。
構造体の入れ子も対応してるのが地味に便利かも知れません。
![ss-the-hitchhikers-to-guide-2019.2-fill-struct-fileds.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549453/5ece1aa2-d7ef-aae0-65f5-788db5a356a9.gif)

----
# 3. Redundant type conversions

冗長な型変換の警告と、冗長部分を削除する機能。
`options + return` のコンテキストメニューから発動します。
下記は `[]byte` を返却する関数呼び出しを更に `[]byte` キャストしている例で、警告部分は文字色が灰色化されています。
こうなる状況がちょっと思いつかないですが、もし灰色になっていたら冗長コードということなので覚えておきます。
<img width="570" alt="ss-the-hitchhikers-to-guide-2019.2-redundant-type-conversions.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549453/4f66985c-0122-9a1d-b084-2b193174b197.png">
https://www.jetbrains.com/help/go/code-inspection.html#redundant-type-conversions

----
# 4. Debug function calls

関数呼び出しをデバッグする機能。
`control + shift + d` でデバッグを起動して、
`option + F9` で「カーソル位置まで実行」。
`F7` でステップイン。
`option + F8` で「関数評価」といったチュートリアル。
単体テストを書くと不要かも知れませんが、「関数評価」機能はデバッグ実行中に関数をライブ的にテストできます。
例では階乗処理の `Factorial` 関数のデバッグ中に「関数評価」を起動して、結果を試しています。
![ss-the-hitchhikers-to-guide-2019.2-debug-function-calls.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549453/76fb8db9-ba7a-7105-4343-a0d123377589.gif)

https://www.jetbrains.com/help/go/debugging-code.html#evaluate_expression_procedure

----
# 5. postfix templates

`.` ( ドット ) に続くキーワードにコードスニペットを登録しておくことで発動するテンプレート機能。
この手の機能は自分がどのキーワードを登録しているか忘れたりするのであまり使いませんが、 `== nil` や `!= nil` に展開するキーワードぐらいは覚えておくと効率上がるかもしれません。
設定は `command + ,` → `Editor` → `General` → `Postfix Completion` で確認・編集できます。

https://www.jetbrains.com/help/go/auto-completing-code.html#custom_postfix_templates

以上です。
InOrder Traversal

```ruby

require 'test/unit'
require 'pry'
class InOrderTraversal < Test::Unit::TestCase

  def test_run

    input = [1, nil, 2, 3]

    tree = TreeNode.new(1)
    tree.left = TreeNode.new(nil)
    tree.right = TreeNode.new(2)
    tree.right.left = TreeNode.new(3)
    assert_equal([1, 3, 2],
                 inorder_traversal(tree))

    assert_equal([],
                 inorder_traversal(nil))
  end

  def inorder_traversal(root, result = [])
    if root == nil || root.val.nil?
      return []
    end

    inorder_traversal(root.left, result) if root.left
    result << root.val
    inorder_traversal(root.right, result) if root.right
    result
  end

end


# Definition for a binary tree node.
class TreeNode
  attr_accessor :val, :left, :right

  def initialize(val)
    @val = val
    @left, @right = nil, nil
  end
end
【備忘録】Gamepad API の実装方法

久しぶりにGamepad APIを実装して、すっかり忘れており、ものの見事に前にもハマったところでハマったので、忘れないように備忘録

実装方法はこうじゃなく

```js
const gamepads = navigator.getGamepads();
function update() {
  gamepads.forEach(gamepad => {
    // 各種値取得 gamepad.buttons, gampad.axes,
  }
}
```

こう

```js
function update() {
  const gamepads = navigator.getGamepads();
  gamepads.forEach(gamepad => {
    // 各種値取得 gamepad.buttons, gampad.axes,
  }
}
```

毎回、`navigator.getGamepads()`を実行しないとダメ。
(なんでこんな実装になってんだろ)
PostOrder Traversal

```ruby

require 'test/unit'
require 'pry'
class PostOrderTraversal < Test::Unit::TestCase

  def test_run

    input = [1, nil, 2, 3]

    tree = TreeNode.new(1)
    tree.left = TreeNode.new(nil)
    tree.right = TreeNode.new(2)
    tree.right.left = TreeNode.new(3)
    assert_equal([3, 2, 1],
                 postorder_traversal(tree))

    assert_equal([],
                 postorder_traversal(nil))
  end

  def postorder_traversal(root, result = [])
    if root == nil || root.val.nil?
      return []
    end

    postorder_traversal(root.left, result) if root.left
    postorder_traversal(root.right, result) if root.right
    result << root.val
  end

end


# Definition for a binary tree node.
class TreeNode
  attr_accessor :val, :left, :right

  def initialize(val)
    @val = val
    @left, @right = nil, nil
  end
end
Preorder Traversal

```ruby

require 'test/unit'
require 'pry'
class PreOrderTraversal < Test::Unit::TestCase

  def test_run

    input = [1,nil,2,3]

    tree = TreeNode.new(1)
    tree.left = TreeNode.new(nil)
    tree.right = TreeNode.new(2)
    tree.right.left = TreeNode.new(3)
    assert_equal([1,2,3],
                 preorder_traversal(tree))

    assert_equal([],
                 preorder_traversal(nil))
  end

  def preorder_traversal(root, result = [])
    return result if root.nil?
    result << root.val unless root.val.nil?
    preorder_traversal(root.left, result) unless root.left.nil?
    preorder_traversal(root.right, result) unless root.right.nil?
    result
  end

end


# Definition for a binary tree node.
class TreeNode
  attr_accessor :val, :left, :right

  def initialize(val)
    @val = val
    @left, @right = nil, nil
  end
end
仮想化について


今回は仮想化について投稿します。

# 仮想化とは
仮想化とは、コンピュータのリソースを抽象化することです。
主にユーザーに提供するコンピュータそのものをハードウェアの詳細から
切り離した状態でソフトウェア化する事を指します。

# 仮装サーバー
物理的な1台のサーバー上で、複数の仮想的なサーバー（仮想サーバー）を
運用することを「サーバーの仮想化」といいます。

例えば32GBのサーバーで4GBのサーバー8台分として扱うことができるなど。

## 仮装サーバーのメリット
物理的な制約がなくなり、サーバー上に新たにサーバを作れるので
以下のようなメリットが生まれます。

1.　設置スペースを削減できる

2.　リソースを有効活用できる

3.　新しいサーバーを速やかに用意できる

4.　BCP対策の実現

5.　最新のハードウェアを活用できる

## 仮装サーバーのデメリット
仮想化ソフトウェアが介在することによって、物理サーバーと比較すると
オーバーヘッド(間接コスト)が生まれ性能が低くなります。

つまり、相応以上に大規模でないと無駄ができてしまうということです。

## サーバー仮想化の手法

### ホストOS型

ホストとなるOS上で仮想化ソフトウェアを使い、別のゲストOSを運用する方法です。
たとえば既に利用中のWindows をホストOSとして、ゲストOSにMacを運用するといった例があげられます。

アプリケーションを採用するような手軽さでサーバー仮想化を実現できるメリットがある一方で
ゲストOSを動かすためにはホストOS自体の処理も必要なるため、
ハイパーバイザー型と比べて処理速度が出にくいのがデメリットです。

ホスト型を実現する主な仮想化アプリケーションには

* VMware Player
* VMware Workstation
* Oracle VirtualBox

などがあります。

### ハイパーバイザー型
行って仕舞えば仮想化専用とも言えます。

処理速度が上がらないホスト型のデメリットを補い、近年主流となっている仮想化の手法がハイパーバイザー型です。
この方式ではハードウェア上にハイパーバイザーと呼ばれる仮想化ソフトウェアを動作させ
ハイパーバイザーの上で複数のゲストOSを運用します。

既存のホストOSをそのまま利用できなかったり、専用の物理サーバーを用意する必要があったりするため
ホスト型と比較すると手軽には利用できないものの、ホストOSの処理を必要とせずハードウェアを直接制御できるため処理速度が向上します。

なおハイパーバイザー型は、直接ハードウェア上で動作することから
「ベアメタル（=bare metal）型」と呼ばれることがありますが、ハイパーバイザー型と意味は同じです。

ハイパーバイザー型に必要な仮想化アプリケーションとして

* VMware vSphere
* Xen、KVM、Hyper-V

などがあげられます。

# 仮想化ネットワーク

物理的に一つのネットワーク機器を複数に見せたり
逆に複数のネットワーク機器を一つのネットワークリソースプールとして扱えることを
ネットワークの仮想化と呼びます。

また、リソースプール化したネットワークを、物理構成に関わらず
論理的に分割する機能をネットワークの仮想化と呼ぶケースもあります。

## 仮想ネットワークのメリット

仮想ネットワークは物理的なネットワーク環境の柔軟な活用を目的としたソフトウェア的なネットワークで
ソフトウェアだけで構成できるため、新たに特別な機器を用意したり、ケーブルを接続したりすることなく
自由にネットワーク構成を変更できるメリットがあります。

仮想ネットワークは仮想化ソフトウェアを搭載したサーバー内に構築されるのが一般的ですが
最近ではスイッチ上に仮想ネットワークを構築するためのネットワーク仮想化ソフトなども登場しています。

## 仮想ネットワークの方式
様々な方式がありますが、私が知ったのはこの二つです。

### Hop-by-Hop方式
Hop-by-Hop方式として有名なのがOpenFlowで
同プロトコルに対応したスイッチやルーターなどのフロー制御をソフトウェアで設定し
中央のコントローラからポリシーの一括配布や実行管理を行うことができます。



### オーバーレイ方式
仮想スイッチ間を橋渡しする「トンネル」を定義し
よりハードウェアに依存しない形でネットワーク仮想化を実現するものです。
Railsチュートリアルの第7章のユーザー登録ページをbootstrap4とform_withで実装する。

2020/02/01追記


タイトルどおりやっていきます。

##使用している環境とgem
ruby 2.6.3
rails 5.1.6
bootstrap4

##変更点
まずRailsチュートリアルのコードを見ましょう。

```new.html.erb
| <h1>Users#new</h1> |
|:--|
|  |
| <div class="row"> |
|   <div class="col-md-6 col-md-offset-3"> |
|     <%= form_for(@user) do |f| %> |
|       <%= render 'shared/error_messages' %> |
|  |
|       <%= f.label :name %> |
|       <%= f.text_field :name, class: 'form-control' %> |
|  |
|       <%= f.label :email %> |
|       <%= f.email_field :email, class: 'form-control' %> |
|  |
|       <%= f.label :password %> |
|       <%= f.password_field :password, class: 'form-control' %> |
|  |
|       <%= f.label :password_confirmation, "Confirmation" %> |
|       <%= f.password_field :password_confirmation, class: 'form-control' %> |
|  |
|       <%= f.submit "Create my account", class: "btn btn-primary" %> |
|     <% end %> |
|   </div> |
| </div> |
```

[こちらより引用](https://github.com/yasslab/sample_apps/blob/master/5_1_2/ch07/app/views/users/new.html.erb)

次に直したコードです。

```new.html.erb
<h1>Sign up</h1>

<div class="row">
  <div class="col-md-6 offset-md-3"> //①

    <%= form_with model: @user, local: true do |f| %>　//②
    <%= render 'shared/error_messages' %>

    <div class="form-group"> //③
      <%= f.label :name %>
      <%= f.text_field :name, class: "form-control" %>
    </div>
    <div class="form-group">
      <%= f.label :email %>
      <%= f.email_field :email, class: "form-control" %>
    </div>
    <div class="form-group">
      <%= f.label :password %>
      <%= f.password_field :password, class: "form-control" %>
    </div>
    <div class="form-group">
      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation, class: "form-control" %>
    </div>
    <div class="form-group text-center"> //④
      <%= f.submit "Create my account", class: "btn btn-primary" %>
    </div>
    <% end %>
  </div>
</div>
```

変更点は4つあり、コードに記してあります。

1.col-md-offset-3をoffset-md-3に変更
2.form_forをform_withに変更
3.form-groupでラベルと入力欄を囲む
4.text-centerをボタンに指定

では詳しく解説していきます。

###1.col-md-offset-3をoffset-md-3に変更
bootstrap4ではcol-md-offset-をoffset-md-と書くようです。

###2.form_forをform_withに変更
Rails5.1以降はform_forやform_tagはform-withと書くのが良いらしい。
form_with内で指定しているlocal: trueは非同期通信じゃなくてhtml使ったフォームの送信にしてねっこと。これがないと、アカウント作成しても「何も起きねえ.......」ってことになるので注意！

###3.form-groupでラベルと入力欄を囲む
対応するタグと入力欄は正しく分けるためにclassでform-groupを指定してあげる。僕の場合は、これを指定しないとボタンがぐちゃぐちゃになりました。

##4.text-centerをボタンに指定
ボタンを中央に寄せる


##直した結果はこんな感じ

![Screen Shot 2020-01-29 at 21.39.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517805/85ba724e-3c77-6920-d861-4bd01e1fffc5.png)
JetBrains_学習ノート_003

#utf-8 の始まり（BOM）について
ASCIIを前提としたプログラムに対して、BOMによって正常に処理できなくなる場合があるためBOMは何および除去する方法などを調べました。

#BOMはなに
- あるcsvファイルをpythonで処理すると頭に「\ufeff」が出ていた。
![utf8_bom](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/591ebaf3-b939-e59f-e31d-bb10bafdd32c.png)

    - みたところの「\ufeff」はUTF-8にはテキストの始まりをプログラムに伝える為のデータ内のマークです。これはBOM(byte order mark)と呼ばれますが、ユニコード表示すると「\ufeff」になります。

#BOMを除去する３つの方法
- BOMをつけると解除する方法
    - 方法１：pycharmの設定に指定する
![BOM_01](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/34b1816c-122f-79a7-25f9-1b8f5080ffc4.png)

    - 方法２：ファイルの右クリックメニューに「Remove BOM」を実行する
![BOM_02](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/3081a0f5-23cf-3aec-46a3-a3d5775ebbac.png)

    - 方法３：coding時に[encoding = "utf-8-sig"]を指定すれば、BOMを表示しない
![BOM_03](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/ceb5a423-6922-e1a5-3945-c32e2c836ace.png)
Level Order Traversal

```ruby

require 'test/unit'
require 'pry'
class LevelOrderTraversal < Test::Unit::TestCase

  def test_run

    tree = TreeNode.new(3)
    tree.left = TreeNode.new(9)
    tree.right = TreeNode.new(20)
    tree.right.left = TreeNode.new(15)
    tree.right.right = TreeNode.new(7)
    assert_equal([
                     [3],
                     [9, 20],
                     [15, 7]
                 ],
                 levelorder_traversal(tree))

    assert_equal([],
                 levelorder_traversal(nil))
  end

  def levelorder_traversal(root)
    result = []
    if root == nil
      return result
    end
    queue = []
    queue << root

    until queue.empty?
      level_size = queue.length
      level = []
      level_size.times do
        node = queue.shift
        level << node.val
        queue << node.left unless node.left.nil?
        queue << node.right unless node.right.nil?
      end
      result << level
    end
    result
  end

end


# Definition for a binary tree node.
class TreeNode
  attr_accessor :val, :left, :right

  def initialize(val)
    @val = val
    @left, @right = nil, nil
  end
end
Spring Boot で graphql-spring-boot 使用時にエラーをどこかへ通知したいとき

`@RestControllerAdvice` とかで取れなかったのと、 `@ExceptionHandler` よりももう少し詳細な情報が欲しかったので。

# 環境

```kotlin

val spring_version=2.2.2.RELEASE

implementation("com.graphql-java-kickstart:graphql-spring-boot-starter:6.0.0")
implementation("org.springframework.boot:spring-boot-starter:$spring_version")
implementation("org.springframework.boot:spring-boot-starter-web:$spring_version")
```

# コード例
`Map<String, ExecutionStrategy>` を Bean に登録すれば良さそう。

```kotlin
@Configuration
class GraphQLConfig {
    @Bean
    fun executionStrategies(): Map<String, ExecutionStrategy> {
        val customDataFetcherExceptionHandler = CustomDataFetcherExceptionHandler
        return mapOf(
                "queryExecutionStrategy" to AsyncExecutionStrategy(customDataFetcherExceptionHandler),
                "mutationExecutionStrategy" to AsyncSerialExecutionStrategy(customDataFetcherExceptionHandler)
        )
    }

    class CustomDataFetcherExceptionHandler: SimpleDataFetcherExceptionHandler() {
        override fun onException(handlerParameters: DataFetcherExceptionHandlerParameters): DataFetcherExceptionHandlerResult {
            // いい感じに通知する
            // もっと低レベルな情報がほしければ
            // handlerParameters.dataFetchingEnvironment.getContext<GraphQLServletContext>().httpServletRequest とかでとれそう。
            return super.onException(handlerParameters)
        }
    }
}
```

`AsyncExecutionStrategy` と `AsyncSerialExecutionStrategy` でいいのかはまだよくわかってないけど、ひとまずこれでエラーを slack とかに飛ばすことができる。

もっといい方法があればコメントください。
m(&->(x,y){x}) が 0 で m(&->(x,y){x*y}) が 1 だと


Ruby の問題です。下記の記事の続編ですが，少し難しくなっています。
[m{|x| x } が 0 で m{|x, y| x * y } が 1 だと？ - Qiita](https://qiita.com/scivola/items/a6a6aa2c3dda458ba209)

以下のテストをパスするメソッド `m` を定義せよ。

```rb
require "test/unit"

class T < Test::Unit::TestCase
  test "" do
    assert_equal 0, m(&->(x, y){ x })
    assert_equal 1, m(&->(x, y){ x * y })
  end
end
```

<details><summary>答えはここをめくってね</summary><div>

Ruby 2.7 以降：

```rb
def m
  yield 0, "".tap{ def _1.coerce(*); [1, 1]; end }
end
```

Ruby 2.6 まで：

```rb
def m
  yield 0, "".tap{ |o| def o.coerce(*); [1, 1]; end }
end
```

などとする。
</detail>
Lightning Web ComponentのComponentの中でLoadingを回す方法

# 概要

lightning web component(lwc)のlightning-spinnerをcomponentサイズでのloading(lightning-spinner)がしたいのに、full pageサイズでloading(lightning-spinner)してしまう問題に直面したのでメモ
lightning web component(lwc)のlightning-spinnerを普通に使うと画面全体がspinnerで待機状態担ってしてしまう。

![images.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246162/04a7d70c-ce55-8524-a62f-4456284f1d17.jpeg)


理想としては以下の様にしたい

![NQIra.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246162/92fdb40d-0586-763e-4993-158f0b6f5682.png)


## 結論

結論としては、lightning web component標準のタグの中でlightning-spinnerを動作させることはできないことがわかった。
代用策として、lightning design systemのタグの中にlightning-spinnerを入れることでcomponentサイズでのloading(lightning-spinner)を実装することができた。

## ソース

- buttonの中でloading(lightning-spinner)を動作させる例

```html
<div class="slds-button slds-button_brand">
    <lightning-spinner alternative-text="loading..."></lightning-spinner> //alternative-textを入れないと警告が出るので入れる
</div>
```

- buttonの中でloading(lightning-spinner)を動作しない例

```html
<lightning-button label="sample">
    sample
    <lightning-spinner alternative-text="loading..."></lightning-spinner>
</lightning-button>
```

- select-boxで動作させる例

```html
<div class="slds-form-element slds-grid slds-wrap">
    <c-lightning_spinner alternative-text="loading..."></c-lightning_spinner>
    <div class="slds-select_container slds-size_2-of-2">
        <select class="slds-select" name="optionSelect">
            <option value="sample">sample</option>
        </select>
</div>
```

## 参考

<https://salesforce.stackexchange.com/questions/279270/how-to-include-spinner-in-button-in-lwc>
Swift 累乗計算する場合

今日複利計算のアプリを作った時に使ったのでまとめておきます。

#コード

累乗を使うときはこちらを利用します

 
            pow(Double,Double)
          
         
という形になります。

#使い方

powはDouble型なのでこの中に数字かdouble型の変数を入れます。
例えばこんな感じです

<img width="671" alt="スクリーンショット 2020-01-29 20.45.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558816/98e378b3-8f44-c87a-a8c3-ecd5b348411f.png">

結果も累乗の計算の結果になっていますね。

変数で入れるとこんな感じです。
<img width="670" alt="スクリーンショット 2020-01-29 21.01.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558816/28ac82d2-aee2-0280-4637-472fabb3a65a.png">

今回は全部Double型のもので計算できましたが
Int型のものを使ったりする場合はこんな感じです。
<img width="708" alt="スクリーンショット 2020-01-29 21.05.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558816/e0888900-9afa-f796-ac06-df991ffbd435.png">

計算結果も同じになっていますね。

今回は以上になります。ありがとうございました。
同一ページに二つのformを設置する

##別モデルのformを同一ページに別々に設置。

今回も、少し苦労したのでメモとして残します。

##説明

categoryモデルと
memo_roomモデルを用意。

**■やりたい事**

・ページ内でカテゴリの新規追加と
・メモルーム（トークルームみたいな感じ）の作成をするフォームを別々で保存し実装したい。



```
<p>カテゴリを新規作成する場合はこちらに入力してください。</p>
<%= form_with(model: @category, url: categories_create_path, local: true) do |f| %>
    <%= render 'layouts/error_messages', model: f.object %>
      <div class="form-group">
        <%= f.text_field :title, class: 'form-control', rows: 1, placeholder: "カテゴリ名２０文字以内で作成してください" %>
      </div>
        <%= f.submit 'カテゴリの追加', class: 'btn btn-primary btn-block' %>
<% end %>
<p>既に作成済みの方はカテゴリを選択してください（必須)</p>
<%= form_with(model: @memo_room, local: true) do |f| %>
    <%= render 'layouts/error_messages', model: f.object %>
        <div class="form-group">
    　　  <%= f.collection_select :category_id, Category.all, :id, :title, :include_blank => true %>
    　　</div>  
        <div class="form-group">
           <label for="title">メモルームのタイトルを入力してください。</label><%= f.text_field :title, class: 'form-control', rows: 5, placeholder: "タイトルを20文字以内で入力してください" %>
        </div>
          <%= f.submit 'ルームを新規作成', class: 'btn btn-primary btn-block' %>
<% end %>
```
こちらが今回使うform二つのformです。
上がcategoryモデルのformです。
下がmemo_roomのモデルです。


##結論

結果的に何をやったかと言うと。

```
<%= form_with(model: @category, url: categories_create_path, local: true) do |f| %>

POST   /categories(.:format)     categories#create
```

rails routesでまず、categoriesのcreateアクションのpathを調べ。
routes.rbにて　**post 'categories/create'**　とデータの送信先を指定しました。

これで、categoryのformはpost 'categories/create'に送信されます。

下のformのmemo_roomはmemo_rooms/createに送信され同じページ内ですが、別々に送信を実装する事が出来ました。


以上！！urlオプション大事ですね！！
HTTPSをフォワード可能なフォワードプロキシをapacheで簡単につくる

# HTTPSをフォワード可能なフォワードプロキシをapacheで簡単につくる

社内からインターネットに繋げるときにプロキシを通らないといけない場合がありますよね？
あのプロキシをフォワードプロキシと呼ぶのですが
開発中にそのフォワードプロキシを自前で立てて検証しなければならないことがあったので、その時のメモです。

なお、Apache以外にもSquidやNginxもフォワードプロキシとして動作させることができますが
squidは情報があまり出てこず、NginxはHTTPS通信するのにソースからビルドが必要だったので
最も簡単だと判断したapacheの手順になってます。

## 検証した環境

* CentOS 7.6
* apache 2.4.6
* SELinuxやFirewalldはOFFの状態

## 1. apacheのインストール

apacheと必要なパッケージをyumでインストールします。

```
$ sudo yum install httpd httpd-devel mod_ssl
```

## 2. 設定ファイルを作成する

/etc/httpd/conf.d/proxy.confを新規作成して、内容を以下にします。

```
Listen 3128
<IfModule proxy_module>
  ProxyRequests On
  ProxyVia      On
  ProxyTimeout  300
  AllowCONNECT 443
  CustomLog logs/proxy_log combined

  <Proxy *>
    Order allow,deny
    Allow from all
  </Proxy>
</IfModule>
```
Listen部分は空いている好きなポート番号を指定し、Allowは必要に応じて、アクセス元の制限をしてください


## 3. apacheの起動と自動起動設定

```
$ sudo systemctl start httpd.service
$ sudo systemctl enable httpd
```

ここまで設定すればHTTPSもフォワード可能なプロキシサーバの出来上がりです。

## 別のサーバからプロキシサーバとして利用してみる

```
$ export http_proxy=http://172.16.4.4:3128
$ export https_proxy=http://172.16.4.4:3128
$ curl https://www.google.com
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang・・・中略
```

無事つながりました！
172.16.4.4は今回立てたプロキシサーバのプライベートIPアドレス
3128は手順2で設定したポート番号ですので、試す場合は読み替えてください。
wear用コーデ画像の顔隠し作業を自動化してみた

皆さん、WEAR（ウェア）ってご存知ですか？
WEARはファッションコーディネートサイトで、弊社サービスの一つです。
要するに各自のファッションコーディネートをシェアし合うSNSです。

そんなWEARの中で、理由はよくわからないですが、顔をアイコンなどで隠して投稿するのが流行っているみたいです。
顔が無い方がコーディネートを客観的に見れるからですかね？

ただ、顔隠す作業って意外にめんどくさく、これ自動化できたらいいな...と思い、アイコン自動配置のプログラムを実装してみました。

# ソースコード

```Python
import os.path
import datetime
import cv2
import time

# 定数
# dataフォルダ
DATA_PATH = "data"
# resultフォルダ
RESULT_PATH = "result"
# カスケードパス
CASCADE_PATH = "haarcascade_frontalface_default.xml"


def main():
    # カレントディレクトリを取得
    current_path = os.getcwd()
    icon_image_path = os.path.join(current_path, "icon.png")
    icon_image = cv2.imread(cv2.samples.findFile(icon_image_path))

    # dataディレクトリを取得
    data_path = os.path.join(current_path, DATA_PATH)
    # dataディレクトリを取得
    result_path = os.path.join(current_path, RESULT_PATH)
    # ディレクトリ直下のファイル一覧を取得
    data_list = os.listdir(data_path)

    for file in data_list:

        # 処理時間計測タイマースタート
        start = time.time()

        # ファイルの拡張子を取得
        file_name, ext = os.path.splitext(file)

        # 拡張子がpng、jpegの場合
        if ext == u'.png' or ext == u'.jpg' or ext == u'.jpeg':
            # 画像を読み込む
            input_path = os.path.join(data_path, file)
            # 入力画像格納
            image = cv2.imread(cv2.samples.findFile(input_path))

            # グレースケール変換
            image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

            # カスケード分類器の特徴量を取得する
            cascade = cv2.CascadeClassifier(CASCADE_PATH)

            face_rect = cascade.detectMultiScale(image_gray, 1.1, 3, 5)

            if 0 < len(face_rect):

                print("Face discovery")

                for x, y, w, h in face_rect:
                    # 顔を隠す
                    image = put_icon(image, (x, y, x + w, y + h), icon_image)

            else:

                print("Face not found")

            output_path = os.path.join(result_path, create_time_path(file_name, ".png"))
            # 画像を保存
            cv2.imwrite(output_path, image)

            # 処理時間計測タイマーストップ
            t = time.time() - start

            print(output_path, ":", t)


# 時刻込みのユニークのファイルパスを出力する
def create_time_path(file_name, ext):
    # 現在時刻を取得
    time = datetime.datetime.now()
    # パスを作成
    path = file_name + time.strftime("%Y%m%d%H%M%S") + ext

    return path


def put_icon(img, rect, icon_image):
    # アイコンを被せる領域を取得
    x1, y1, x2, y2 = rect
    w = x2 - x1
    h = y2 - y1
    # アイコンを画像に重ねる
    img2 = img.copy()
    icon_image = cv2.resize(icon_image, (w, h), cv2.INTER_AREA)
    img2[y1:y2, x1:x2] = icon_image
    return img2

if __name__ == '__main__':
    main()
```

# 実行結果
![data.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/0ae15971-0f87-b91d-34bb-95ad10aa0e36.jpeg)
元画像のコーデはこんな感じ。
(盛れてる写真を使う...)

![data20200129202956.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/49037eb1-74bd-dea0-0629-c65717e9190b.png)
実行後は見事にアイコンがフィット！！！
面倒だった作業があっという間に！！
アイコン画像が適当なのは気にしないでください...


# 最後に
顔認証の精度がそんなに良いわけではないので、写真によってはいくつもアイコンがセットされてしまうので、軽く使ってみるくらいが良いかもしれません。
秋月電子 > microSDカードスロットDIP化キット AE-MICRO-SD-DIP　> スルーホール用テストワイヤーが通らない

```txt:動作環境　
Ubuntu 18.04 LTS
Board: STM32L476 Nucleo_64 (hereafter STM32L476)
Zephyr 2.1.99
マイクロＳＤカードスロットＤＩＰ化キット [AE-MICRO-SD-DIP] (秋月電子)
```

### microSDカードスロットDIP化キット

http://akizukidenshi.com/catalog/g/gK-05488/

### スルーホール用テストワイヤーが通らない

- [スルーホール用テストワイヤー](https://qiita.com/hotchpotch/items/074c97c12291bcc59028)
    - by @hotchpotch さん

情報感謝です。

Zephyr(+STM32L476)とmicroSDカードスロットCK-40にて使用していた環境を、秋月電子のカードスロットに変更しようとしていた。
カードスロットのピンの穴が小さいため、スルーホール用テストワイヤーがそもそも通らない。

ピンヘッダをハンダ付して使用する前提なのだろう。

### 関連

- [Zephyr + STM32L476 > microSD(SPIモード接続) + FAT](https://qiita.com/7of9/items/19a0a90ae30265879bf3)
LeetCode - 191. Number of 1 Bits

# [191. Number of 1 Bits](https://leetcode.com/problems/number-of-1-bits/)
今日は超軽いやつ。

# 解答

```ruby

# @param {Integer} n, a positive integer
# @return {Integer}
def hamming_weight(n)
  n.to_s(2).scan(/1/).size
end
```

# メモ

テストしようと思って以下のようにやってしまい、しばらく首を傾げてしまった。この入力値だと8進数だととられる

```ruby

hamming_weight(00000000000000000000000000001011)
```

やるなら `0b` をつけて、こうしないと。これで二進数と思ってくれる。

```ruby

hamming_weight(0b00000000000000000000000000001011)
```

[`sprintf` あたりが参考になる](https://docs.ruby-lang.org/ja/latest/doc/print_format.html)

# スコア

```yaml

Runtime: 28 ms, faster than 90.28% of Ruby online submissions for Number of 1 Bits.
Memory Usage: 9.3 MB, less than 100.00% of Ruby online submissions for Number of 1 Bits.
```

おっ、なかなかいいのでは。

# シリーズ
1/29 授業ノート

#講義
**基本のセット※ペーパーテストに出るかも！**
★```<meta charset="utf-8">```→**アジア圏(漢字・ひらがな表記)のみの規格**
★```<title></title>```→**検索エンジンにヒットする**

・```<h1>```→h1はページに1つのみ。h2以降は複数回使用OK
・```a href=”#”>aaa</a```>→ハイパーリンク。#→URL、aaa→任意の説明文(リンク先名称等)
　ex:)```<a href=”http://google.com/”>Googleへ</a>```
・著作権フリー画像サイト→https://pixabay.com/ja/
・画像付きリンク(バナー)→```<a href=”#”><img src=”#” alt=”aaa”></a>```で記述
　ex:)```<a href="http://google.com"><img src="img/image.jpg"alt="にゃーん"></a>```
・リンク先を別ブラウザで表示→```target="_blank"```をリンクの後ろに追記
　ex:)```<a href="http://google.com" target="_blank">Googleへ</a>```

#演習
・4件のhtmlコーディングを練習
・コーディングが終わったらW3C(https://validator.w3.org/#validate_by_input )で確認
・さらにアウトライン(階層構造)を正しくマークアップ出来たかをチェック
　→HTML5 Outliner(https://gsnedders.html5.org/outliner/ )を用いてチェックを行う
　★**どのような階層構造になっているかによって検索エンジンの上位に引っかかるかどうかが変わる**

#ミス
・footer部分をbodyの外に記述してしまい、バリデーションエラーが発生した
　→footerをbodyの内側に記述することで解決

#画像編集
・Photoshopの設定ファイルを削除→Photoshopの起動中にShift+Ctrl+Altを同時押しする。
・カラー設定(Shift+Ctrl+K)を[Web・インターネット用 – 日本] に変更。色はsRGB
・塗りつぶし→Alt+Backspaceで塗りつぶし、Ctrl+Backspaceで背景色で塗りつぶし
・Ctrl+レイヤーをクリック→レイヤー内の画像を選択
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574903/6cd4fec3-c36a-c368-5750-072feed22790.jpeg)

スペキャならぬスぺピー。無関係画像です。

#感想
Photoshop、Webと紙で全然設定が違うので、その辺の感覚を掴み直さないといけない。
家でCSSの復習そろそろしておかないと授業で余裕をぶっこけなくなるぞ。
2月は先んじてJSの学習始めておきたいし(1回軽くさらったけど忘れた)、
勉強計画を立てなければ。またpaizaやるか。
…やることが多い。
GitHubのCLI「hub」を使う

毎回ブラウザに移動してプルリクを作るのが面倒だったので、コマンドラインからゴニョゴニョできるように設定しました。

##インストール
```terminal
$ brew install hub
```

##設定
`git ◯◯`と打った時に`hub ◯◯`というコマンドが動くように設定

```:.zshrc
eval "$(hub alias -s)" 
```

##普段使いできそうなコマンド
###`git pull-request`
コマンドラインからプルリクエストを作成することができます。

###`git browse`
ブラウザが開き、現在のいるディレクトリと紐づいたリモートリポジトリに移動します。

###`git create <リポジトリ名>`
GitHub でリポジトリをつくり、それをローカルの`origin`に設定します。
`-p`オプションで、プライベートリポジトリに設定できます。

##エイリアスの設定
browseとか普通に打ちにくいので、`.zshrc`にエイリアスを登録しておきます。

```.zshrc
alias gsee='git browse'
alias gpr='git pull-request'
```

##参考
[GitHub を CLI で使う時の便利コマンド Hub コマンド の使い方をまとめてみた！](https://qiita.com/schktjm/items/946452e9d0760b1bfc5f)
[github/hub](https://github.com/github/hub)
Python の組み込み関数 enumerate() にジェネレータを渡すとどうなるのか疑問に思ったので実験してみた。

主に自分用メモ:

Python の組み込み関数 `enumerate` はジェネレータにも対応しているのか疑問に思ったので実験してみた。

#### 疑問
enumerate() にジェネレータを渡すと、その場でリスト化して展開されてしまうのか？
（そもそも渡せるか？という確認も込み）

#### 実験

以下のようなジェネレータを用意する

```python
>>> def test(value):
...   for i in range(value):
...     print(i)
...     yield i
...
```

ジェネレータとして動作することを確認

```python
>>> for v in test(10):
...   print(v)
...
0  # test() 内の print からの出力
0  # for 文の print からの出力
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
```

用意したジェネレータを `enumerate` に渡してみる

```python
>>> for i, v in enumerate(test(10)):
...   print(i, v)
...
0      # test() 内の print からの出力
0 0    # for 文の print からの出力
1
1 1
2
2 2
3
3 3
4
4 4
5
5 5
6
6 6
7
7 7
8
8 8
9
9 9
>>>
```

#### 結果
- `enumerate` にジェネレータを渡せる。
- `enumerate` にジェネレータを渡すとジェネレータが返却する要素ごとにインデックスを付加して返却してくれる。
N+1問題への対処

#N+1問題とは
あるテーブルへのアクセス1回に対して、関連するテーブルが呼び出した分（N回）発行されてしまう状況のことを指し、これが何万回、何十万回と呼び出された時に動作が重くなってしまう問題のこと。

# 対処法
**includes**メソッドを使用することで、あるテーブルにアクセスする際に、同時に関連するテーブルのレコードを取得し、発行するSQLを少なくすることができる。
**includes**メソッドは、1つ目のテーブルのカラムを優先して、2つ目のテーブルを結合する。その際に2つのテーブルのどちらにしか存在しないテーブルも含める。（<em>左外部結合</em>）

ちなみに反対にテーブル同士を結合する時に両方のテーブルで結合条件がマッチするレコードのみを取得する方法が内部結合になる。

<img width="761" alt="スクリーンショット 2020-01-29 20.33.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544296/6845a2b0-339f-e07f-f5fa-2e1d5cd5d48d.png">

自分用メモでした。
【Java】入門　構造　クラス定義　クラスとインスタンスの関係　メソッド定義のフォーマット

アウトプット



クラスとは？
クラス＝フィールド＋メソッドである
処理を定義したものがメソッドである。

package javabase;//←パッケージ宣言
class Staff {//←テンプレート
	String name;
	int staffid;
	String email;
}



１クラスの定義
public class StaffInfo {//←クラス定義

	public static void main(String[] args) { //メソッドの定義

		Staff yamada = new Staff();//←インスタンスの生成
		yamada.name ="Taro Yamada";
		
		System.out.println(yamada.name);

	}

}

Javaのプログラムを作る＝クラスを作る




2クラスとインスタンスの関係
//クラス＝テンプレート　たい焼きの型
//インスタンス＝テンプレートから生成された部品　たい焼きがインスタンスです。
//class Staff { //←Staffクラス　（テンプレートである）　
//	String name;
//	int staffid;
//	String email;
//}
//Staff yamada = new Staff();//山田さんのインスタンス（実体である）

３ メソッド定義のフォーマット

//クラスとは

//クラスX

//データを格納　フィールドA.B
//記述の処理　メソッドXYZ


//public class StaffInfo {//←クラス定義 これからクラスを定義しますよと言う宣言

//public static void main(String[] args) { //メソッドの定義　このクラスで使用するメッドの定義

//メソッドの定義
//public←アクセス修飾子

//public　他のクラスからアクセス可
//protected 同一パッケージ内・継承クラス
//なし　同一パッケージのみ
//private


//メソッドの定義
//static　←その他の修飾子

//absract 抽象クラス・メソッド
//static　クラスから直接呼び出せる（インスタンスから呼ばない
//final　変更ができない


//void
//void 返り値のタイプ

//処理結果を繰り返す＞返り値の型を定義

//値を繰り返さない > [void]

//main(String[] args)←メソッド名（引数）
//メソッドを呼び出すときにパラメーターを渡す。
//パラメータ＝引数
//カンマで複数渡せる




2//クラスとインスタンスの関係
//クラス＝テンプレート　たい焼きの型
//インスタンス＝テンプレートから生成された部品　たい焼きがインスタンスです。
//class Staff { //←Staffクラス　（テンプレートである）　
//	String name;
//	int staffid;
//	String email;
//}
//Staff yamada = new Staff();//山田さんのインスタンス（実体である）

//３ メソッド定義のフォーマット

//クラスとは

//クラスX

//データを格納　フィールドA.B
//記述の処理　メソッドXYZ


//public class StaffInfo {//←クラス定義 これからクラスを定義しますよと言う宣言

//public static void main(String[] args) { //メソッドの定義　このクラスで使用するメッドの定義

//メソッドの定義
//public←アクセス修飾子

//public　他のクラスからアクセス可
//protected 同一パッケージ内・継承クラス
//なし　同一パッケージのみ
//private


//メソッドの定義
//static　←その他の修飾子

//absract 抽象クラス・メソッド
//static　クラスから直接呼び出せる（インスタンスから呼ばない
//final　変更ができない


//void
//void 返り値のタイプ

//処理結果を繰り返す＞返り値の型を定義

//値を繰り返さない > [void]

main(String[] args)←メソッド名（引数）
メソッドを呼び出すときにパラメーターを渡す。
パラメータ＝引数
カンマで複数渡せる

メソッドの定義

public static void main(String[] args)

mainメソッドは

他のクラスから呼び出せる。
クラスから直接呼び出せる
返り値を持たない
argasと言う配列型の引数（パラメーター）を持つ
オワコンからの脱出-Wordpressでオウンドメディア作成

#はじめに
趣味で宇宙開発を行う団体「[リーマンサット・プロジェクト](https://www.rymansat.com)」がお送りする[新春アドベントカレンダー](https://qiita.com/rsp-dgkz/items/497225739b88c817a90c)です。リーマンサット・プロジェクトは趣味で宇宙開発をする団体です。興味を持たれた方は [Join](https://www.rymansat.com/join)からお気軽にどうぞ

私は主にデザイン課というか部門で、動画を制作したり人工衛星の外観のデザインを手伝おうとしています
※今回のトピックはRSPも宇宙も出てこない個人の趣味のお話です
##海外旅行自転車旅行
私は昔から旅が好きだったので、定期的に（年2回程度）計5人の地元の友人と自転車で、日本各地をはじめ、ニュージーランド、台湾、韓国、マレーシア、ギリシャ、アラスカなど各回1週間程度、400km~700kmを走破する旅をしています。活動は2014年から始まり、旅をまとめた動画を作ったり、2018年からブログを開設していました。このコミュニティをEat Pray Carpと名づけています
##オワコン化していた以前のブログ
大方予想通りではありますが、PVは目標には到達していません。要因は様々でしょうが、そもそもサイトがまったくもってイケてなかったという問題があります。サイトをみた友人知人からのフィードバックででは、「デザインがひどい」「重すぎる」「昔の痛い先輩のブログを思い出した」など、散々な評価をうけて重い腰を上げてサイトのリニューアルに挑みました
今回作成したサイト: [Eat Pray Carp|自転車で世界を旅するサイト](https://eat-pray-carp.com)
###オワコンポイント1: サイトが重い
これは最大の問題です。古代よりレスポンスタイムとUX（ユーザー体験）には決定的な相関があるといわれています。
例えば、https://www.entrepreneur.com/article/281986 によると:
- 40％は3秒以上かかるページから離脱する
- 79%はパフォーマンスに不満を持ったサイトで再び利用しない
- 44％が友人にオンライン上での悪い体験を共有する
といった分析がされています。データでもそうですが、そもそも我々は日常のWEB体験から我遅すぎる官公庁や大学のシステムにより人生を無駄にさせられていることについて、日々イライラさせられています。しかしかつてのEPCのサイトは物によっては表示に10秒以上の時間がかかっていました。こんなサイト誰が見るのでしょうか
###オワコンポイント2:常時SSL通信化(https対応)していなかった
常時SSL通信化はセキュリティ上必須とされています。WEB業界では2018年の7月が移行のデッドラインと言われていましたが、1年以上放置されていました。これにより、通信速度、検索順位で不利であっただけでなく、ユーザーを不安にさせ、管理者が無能で無責任であるという印象を与えかねませんでした
###オワコンポイント3: デザインがくそ
誰もボロボロのレストランに行きたくないように、稚拙なデザインはユーザーの信頼とテンションを下げます。また、記事の関連やどこに何があるのかが分からず、迷宮化していました。これはユーザー滞在時間を下げてしまうことは明確でした
##やったこと
- インフラを小規模レンタルサーバーからクラウドに移行
Google Cloud Platform で1Clickデプロイで簡単にWordpressをインストールすることができました
参考: [GCP(Google Cloud Platform)でWordPressスタート](https://qiita.com/sakkaonline/items/95daa42f97b9d55c345f)

- 常時SSL通信化
参考：[GCPで１clickデプロイしたwordpressをSSL化する方法](https://qiita.com/freecss22second/items/74274777e0c19f7510b5)

- サイト構造を再設計
設計者不在で、5人のメンバーが思い思いに継ぎ足したサイトはカオスでした。「私たちについて」と「Eat Pray Carpについて」が混在していたり、カテゴリーの切りが滅茶苦茶だったのを整理しました
- デザインを見直す
Wordpressのテーマは、マテリアルデザインを採用してレスポンシブも対応のHestiaを採用
##次から次へと発生する問題の数々
Wordpress初心者がやらかすおよそほとんどのことはやらかしました。ログインできなくなったり、全ての記事がリンク切れになったり...しかし、最終的に何とかなりました。個別の問題については、今後記事にしていこうと思います。
#そう遠くない次なるオワコン化
私は5年ほど前に、Webをかじっていましたがしばらく離れている間に、ここ数年でデザイン面ではレスポンシブ、インフラ面ではクラウドが主流になり、スケーラブルやサーバレス化と同時に新たなセキュリティ脅威等、Web周りの変化は劇的で、キャッチアップが大変でした。今回構築したアーキテクチャも決して最新の物とはいえません。また、noteやHatena Blogなどブログのインフラを自分で持つことも必要なくなりつつあります。海外旅行というWEB業界のレッドオーシャンカテゴリーで、あえてオウンドメディアを運用するべきなのかも分かりませんが、少なくとも良い勉強材料になったと思います
##紹介
リーマンサットは、宇宙旅行をいつか実現する予定です(詳細未定)。興味を持たれた方は [こちら](https://www.rymansat.com/join) からお気軽にどうぞ！
ターミナルでAnaconda3インストールしたときのPATH追加シェル変更と(base)非表示

#Anaconda3のインストールのときの小技メモ
###やったこと
Anaconda3をリモートのLinux(ログインシェル:zsh)マシンにmacからインストールした。

###時間食ったとこ
1.　PATHを ~/.bashrc に書き込んでしまった。ログインシェルの~/.zshrcに変更したい。
2.　インストール後、ターミナルに(base)の文字が追加された。消したい。

##Anaconda3インストール手順
ここで.bashrcに書き込んでしまった。

``` zsh:zsh
wget https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh
zsh Anaconda3-2019.10-Linux-x86_64.sh
#ライセンス等出てくるので確認してyes
#install locationの確認。今回はhome直下なのでそのままenter

#ここでInitialize Anaconda3の話に気づかずそのままenter　　　　←　今回の失敗原因
#　本来は
#Do you wish the installer to initialize Anaconda3
#in your /home/hogeuser/.bashrc ? [yes|no]
#[no] >>> /home/hogeuser/.zshrc     　　　　　　←ココ。こうすべきだった
```

##やったものは仕方ない
condaを絶対パスで参照しながらconda init で修復。
zsh部分を変えればもちろんfishでもなんでもok

```shell:zsh
/home/hogeuser/anaconda3/bin/conda init zsh
source ~/.zshrc
```

これでzshのPATHに追加された。

##(base)がターミナルに毎回表示されるようになった
なぜこの機能をデフォルトでつけたのかわからない。
消そう。

```zsh:zsh
conda config --set changeps1 False
```

ENTERで直らなければターミナル再起動で完了。

#余談
ちなみにターミナルでコマンド打つときの左側に出る文字列は
$PS1という環境変数に入っている。
これを好き勝手いじって色変えたりちょっとかっこよく()できる。例えば。

```shell:.zshrc
PS1='
%F{white}>>>%f %B%F{cyan}%m%f%b:%B%F{blue}%~%f%b:%B%F{red}%W:%T%f%b
%B%F{blue}%n%f%b [%?] %B%F{cyan}>%f%b '
```

とすると


\>>> <font color="Cyan">foomachine</font><font color="Green">:</font><font color="Blue">/home/hogeuser/anaconda3</font><font color="Green">:</font><font color="Red">01/29/20:10:54</font>
<font color="Blue">hogeuser</font> <font color="Green">[0] > </font>

こんな感じになります。
調べてみたらいっぱいあるので、数時間は遊べます。
以上。
m{|x| x } が 0 で m{|x, y| x * y } が 1 だと？


Ruby の問題です。

以下のテストをパスするメソッド `m` を定義せよ。

```rb
require "test/unit"

class T < Test::Unit::TestCase
  test "" do
    assert_equal 0, m{ |x| x }
    assert_equal 1, m{ |x, y| x * y }
  end
end
```

<details><summary>答えはここをめくってね</summary><div>

```rb
def m(&b)
  yield b.arity == 1 ? 0 : [1, 1]
end
```
</div>

（追記）少し難しくした続編を書きました。
[m(&->(x,y){x}) が 0 で m(&->(x,y){x*y}) が 1 だと？ - Qiita](https://qiita.com/scivola/items/44a7d41d502622cbbd4d)
デプロイ時にNewrelicにDeployment Recordを作る。

deployを記録すると、APMのoverviewのグラフに縦の線が入るので
リリース前後で不調が起きたのかを確認しやすくなる。

<img width="430" alt="スクリーンショット 2020-01-29 19.51.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53551/3c435c7d-9742-f9a6-81a7-feec6dae138a.png">

記録用シェルスクリプト例
https://gist.github.com/astronoka/d7a787be625a69bc2a73bc7929e790da



監視しているコンポーネントのリリース後に下記のように実行する。

`NEWRELIC_ADMIN_USERS_KEY` は
https://rpm.newrelic.com/accounts/${your_account_id}/integrations?page=api_keys
あたりで事前に発行しておく。

`APP_NAME` はコンポーネントからnewrelicにデータを上げるときに指定しているやつ。
`REVISION` は gitのコミットハッシュなどを使う。


```bash
NEWRELIC_ADMIN_USERS_KEY="FFFFFFFFFFFFFFFFFFFFF"
APP_NAME="XXXXX"
REVISION=$(git rev-parse --short HEAD)
sh create-newrelic-deployment-marker.sh ${NEWRELIC_ADMIN_USERS_KEY} ${APP_NAME} ${REVISION}
```


完


# see also

`Record and monitor deployments`
https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-monitor-deployments
ナップサック問題備忘録

## ナップサック問題とは？
有名なNP完全問題。ナップサックに品物の価値がマックスになるように入れる問題。


## 何が難しいの？
シンプルに考えると品物を入れる入れないの選択になるため$O(2^N)$となる。これを多項式時間で解くことを考える。

これらを多項式時間で解く方法を三ステップで解説する。

##1.解く時のイメージ 
動的計画法のイメージとして、少ない状態から増やしていくことを考える。つまり、1つの時から考える。
1つの時、ナップサックの容量によって入れる入れないを判断する。当然入れたほうが価値が高いので入れる。2つ目の時、ナップサックに入れるかどうかを判断する。ここで気をつけることは1つめが入っている状態の分岐である。ナップサックに入れるかどうか判断が分かれる。そして三つ目の時、二個目が終わった時点のナップサックと比較する。つまり、今までの状態に新しい品物を追加すべきかを考えるのがこの問題の味噌である。

##2.実際のメモリ状態
製作中
アセットのパスからInspectorに表示させる方法備忘録

若干自分向けチートシート的なもの
エディタ拡張などを行っているとたまにパスからオブジェクトを指定してInspectorに表示したくなることがある

# スクリプト

```csharp

        /// <summary>
        /// 編集できるファイルを選択.
        /// </summary>
        void SelectEditableFile()
        {
            // Assetsフォルダからのフルパス.
            string path = "Assets/";
            GameObject[] objs = new[]
            {
                // GameObjectだったりScriptableObjectだったり.
                AssetDatabase.LoadAssetAtPath<GameObject>(path),
            };

            if (objs.Contains(null))
            {
                 Debug.LogError("指定したオブジェクトが存在しません.");
            }
            else
            {
                Selection.objects = objs;
            }
        }

```

これで指定したパスのオブジェクトをInspectorに表示することができる
一応オブジェクトが存在しない場合にnullが入った配列をSelectionに渡してしまうと現在表示しているInspectorがクリアされてしまうのでnullチェックも追加してみた
AWSのSAMテンプレートでLambdaをVPC内に入れるときに付ける権限。

CodeStar実行時に、CloudFormationで、Lambdaの権限が足りなくて、以下のようなエラーが出力される場合：

```
The provided execution role does not have permissions to call CreateNetworkInterface on EC2 (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID:xxxxxxxxxxxxxxxxxx)
```

EC2のエラーとか表示されるので紛らわしい。実際はEC2ではなくVPCの権限。
templete.yamlに以下の行を追記すれば、動く。

```
  LambdaExecutionRole:
    Description: Creating service role in IAM for AWS Lambda
    Type: AWS::IAM::Role
    Properties:
      ...略
      ManagedPolicyArns:
        - !Sub 'arn:aws:iam::aws:policy/AmazonVPCFullAccess'　⬅︎ これを追記すればとりあえず動く
```
機械学習初心者がCourseraのDeep learningコースを受講してみる

#注意
まずこの記事をクリックしてくださった方へ
前提としてアウトプットが大事だということで本当にただアウトプットを置いておきたいだけです。
それでも今までQiitaに投稿してこなかったのは特筆して書いておく必要性、目新しさがなかったから。
ただ１ヶ月前からCourseraのMachine learningを受けてハマり、調子に乗ってDeep learningコースを受講してみたはいいものの、こちらは全16週分あり現在６周目。６周目の１つ目のトピック（ミニバッチ勾配降下法）まではMachine learningコースでとった杵柄でやり過ごせたがついに未知の領域に足を踏み出し、更にこのタイミングで日本語字幕が完全に消え去ったことでかなり不安を抱えている今現在。
　きっとこのタイミングで日本語字幕が消えるのは、ここまでは「なんや、Machine learningでやったことと同じやんけ。お、ついに日本語字幕なくなったな。途端によく分からんぞ。」となって露と消えた屍の多さを物語っているのではと思います。ここで同じようにDeepLearningコースを学ぶ意志のある人間のメルクマールになればと思い筆をとった次第です。
##お前誰やねん＆何を書くか
まず私について、現在大学３年生。農業経済学科に所属。といってもいままで部活動に明け暮れており取りたい授業より取れる授業、楽な授業を選んできたために本当に何一つスキルなどはない。しかし学部の必修授業である計量経済学にはまり、kaggleというものを触ってみる。しかしネットで調べた上辺だけの知識でタイタニックチュートリアル上位３０％に入ったところで何もこの先の未来が見えず、courseraのmachine learningをやってみる（２０１９年１２月末〜１月末）。その後機械学習の面白さにハマり継続してcourseraでディープラーニングを受講中。
機械学習の学習については@Falcon__0904さんの以下の記事を参考にしました。
https://qiita.com/Falcon__0904/items/1c20595c5e6dac4530dc
　次に何を書くかについてはとりあえず今週学んだことをなぐり書きしておこうと思います。今後また明確に書きたいことなどが定まれば書いていこうと思います。
###Improving Deep Neural Networks:Week2
今週は大規模なニューラルネットワークを構築した際に重要となる、高速化のTipsについて主に学びました。Goodnotesでメモを取っているのでそれを投げておこう…
![20FC374D-402E-4D94-9B3B-60FEF8922C8A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466948/01f36890-d8c4-59e7-0804-fef074856138.png)
![00AD751A-7520-48FC-A31E-3926C1FEE796.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466948/9dd54834-b541-165f-461b-6bdcdd6565fc.png)
![6B95FE28-C7C1-4EF9-919B-CAC474533ED7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466948/0f5f485b-![13DD8BEF-0F4D-46EE-AFCC-F50ACA6F337C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466948/f42e36ba-5b9f-f0cc-60d5-620c75a6ceb8.png)
94b8-1b41-9e04-3e63607775ca.png)
![67D2550C-F824-4734-8238-CA0AAA04AF67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466948/9f129648-368e-1efc-8e9b-cc6aff4705c9.png)
![2D0DEE89-2D7E-40BF-A573-B40516EF2980.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466948/269cd1f5-a6a8-150f-3676-1b362789ff75.png)
![FEF4ECE5-8AFC-4639-AF89-81009E8252BB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466948/cc827970-7348-2c36-8a55-c089764f366a.png)
これはあげてええんやろか。あかんやつやったら言ってください。
初心者によるプログラミング学習ログ 223日目

#100日チャレンジの223日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

223日目は
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>223日目<br>・javascriptのtodolistのコードの意味調べ<br>・bootstrapでLP作成<br>・Vue.jsでアプリ作成講座<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1222249032388448256?ref_src=twsrc%5Etfw">January 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
JavaScript  ES6 　基礎①（自分用）

>;や（）　２単語時大文字で半角スペース不要　　など..書き方の違いはあるが、
スコープ、引数の考え方はruby言語と同じ
>ここをまず理解すると、他言語でも苦なく理解可


##コールバック関数##
☆引数に渡される関数　＝コールバック関数と言う

```js
const ②printName = () => {
  console.log("名前。");
};

const ③call = (①callback) => {
  console.log("コールバック関数。");
  callback();　　　　　　←//関数の’呼び出し’（中身は②が入っている）①が呼び出された。
};

③call( ①printName);    ←//(const )callの①引数として(printName②の中身)を渡しますよ、の意味。＝定義

-------------------------
＜コンソール実行結果　　＊順の理解が重要＞

コールバック関数。
名前。


```




##メソッド##
注意点:

... find　(　(　 ... ←スペース入れるとエラー、JSは、スペースでエラーとなる事が多い、言語diff注意



---
##push = 配列要素の最後に追加できる##

```js
const name = ["名前", "なまえ", "ナマエ"];
console.log(name);

name.push("ネーム");
console.log(name);

------------
＜コンソール実行結果＞

["名前", "なまえ", "ナマエ"]
["名前", "なまえ", "ナマエ","ネーム"]

```
---

##forEach = 配列要素を各取り出し、そこから条件を各処理する，を各繰り返す。##

```js
const name = ["名前", "なまえ", "ナマエ"];
name.forEach ((nnn) => {
  console.log(nnn);
});


------------
＜コンソール実行結果＞

名前
なまえ 
ナマエ

```



*ここから引数を理解しやすい様に明らか変数とは異なるnnn表記とする*
##find = 条件に一致した最初の（キー、バリュー）を１つだけreturn##
【　１番初めにくる　3の倍数の場合　】

```js
const num = [1, 3, 5, 7, 9];

const foundNum = num.find((nnn) => {
  return nnn % 3 === 0;
});

console.log(foundNum);

------------
＜コンソール実行結果＞

３

```
###オブジェクトの場合###

```js
const anim = [
  {id: 1, name: "なまえ", age: 3},
  {id: 2, name: "名前", age: 6},
  {id: 3, name: "ナマエ", age: 10},
  {id: 4, name: "ネーム", age: 11}
];

const foundAnim = anim.find((nnn) => {
  return nnn.id === 2;
});

console.log(foundAnim);

-------
＜コンソール実行結果＞

{id: 2, name: "名前", age: 6}

```


##filter = 条件に一致した(キー、)バリューを全てreturn###

【　2の倍数全て　】

```js
const num = [1, 2, 3, 4, 5, 6];

const numbers = num.filter((nnn) => {
  return nnn % 2 === 0;
});

console.log(numbers);

-------
＜コンソール実行結果＞

[ 2, 4, 6 ]

```

###オブジェクトの場合###

【　20歳未満を抽出　】

```js
const staff = [
  {id: 1, name:"Aさん", age: 14},
  {id: 2, name:"Bさん", age: 50},
  {id: 3, name:"Cさん", age: 20}
];

const underTwenty = staff.filter((nnn) => {
  return nnn.age < 20;
});

console.log(underTwenty);

----------
＜コンソール実行結果＞

  [ {id: 1, name:"Aさん", age: 14} ]
 
```


##map = （キー、）バリューの条件をコールバック関数処理し、新しい配列を作る。##

```js
const num = [1, 2, 3, 4];


const toripuruNum = num.map((nnn) => {
  return nnn * 3;
});

console.log(toripuruNum);

----------
＜コンソール実行結果＞


[ 3, 6, 9, 12 ]

```


#＜補足＞#

returnは　返り値、＆＆関数の処理を終わらせる意味も持つ。
関数内のreturnの後に書いた関数は実行処理されない。注意


```js
const num = [1, 2, 3, 4];


const toripuruNum = num.map((nnn) => {
  return nnn * 3;

  console.log("ここは実行されない);　　　　←//実行処理されない

});

```

console.log(toripuruNum);
Macでよく使うffmpegのメモ

# Macでよく使うffmpegのメモ
物忘れの激しい私がffmpegのパラメータまで覚えてるわけないのでメモる。
## 動画
### MOVからMP4
デフォルトの設定だとQuickTime等で再生できないので`-pix_fmt yuv420p`をつける

```
$ ffmpeg -i in.mov -pix_fmt yuv420p  out.mp4
```
### 解像度変更
MacのRetinaディスプレイだと解像度大きすぎて送れない場合があるので容量を圧縮する

```
$ ffmpeg -i in.mp4 -vf scale=1920:-1  out.mp4
```
`scale=xx:-1`とすると動画のアスペクト比に合わせて変換される
### GIFを作りたい
Qiitaとかに上げるときに使う技

```
$ ffmpeg -i in.mp4 -vf "palettegen" -y palette.png
$ ffmpeg -i in.mp4 -i palette.png -lavfi "fps=12,scale=900:-1:flags=lanczos [x]; [x][1:v] paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle" -y out.gif
```
カラーパレット生成を挟むことできれいなGIFになる

>参考元:[ffmpegで動画を綺麗なgifに変換するコツ](https://life.craftz.dog/entry/generating-a-beautiful-gif-from-a-video-with-ffmpeg)

## 音声だけ抜く
本当はコーデック調べたりするべきだけど大体これ

```
$ ffmpeg -i in.mp4 -acodec copy out.m4a
```
## 画像
動画も、画像も、できるんだよ
### リサイズ
```
$ ffmpeg -i in.png -vf scale=720:-1 -q 2  out.png
```
動画と同様にできる

`-q`オプションで圧縮レベルを指定できる。(1は`-qmin 1 -q 1`)
## 動画のスクリーンショット
```
$ ffmpeg -i in.mp4 -ss xxx -t yyy -r zzz out%d.png
```
`-ss` 開始時間(フレーム単位)

`-t` 終了時間(フレーム単位)

`-r` フレームレート
# 最後に
ffmpegは万能。
Makefileのディレクトリから親のディレクトリの絶対パスを取得する

# 概要

`Makefile`内のスクリプトで親のディレクトリの絶対パスを取得する方法のメモ

# コード

```Makefile
# Makefileの存在するディレクトリ
MAKEFILE_DIR:=$(dir $(abspath $(lastword $(MAKEFILE_LIST))))
# 一つ上のディレクトリ
PARENT_DIR := $(shell dirname ${MAKEFILE_DIR})
```

# メモ

- `$(shell dirname ディレクトリ)`でディレクトリの親のパスが取得できます
    -  親の親のディレクトリとかも可能です

- `pwd` や `${CURDIR}`を使用すると`Makefile`のディレクトリではなく、`make`コマンドを実行したディレクトリが基準となるので注意
【Nuxt】何らかのパッケージを使わず普通にGoogleMapAPIを導入する

nuxtやvueへの導入用のパッケージはいくつかあるのですが、
「俺はただ単にgoogleMapのjsが読み込めていれば、いつものロジックが使えればそれでいいんや！」っていう人向きです。

# 概要
- scriptタグで読み込ませるだけのいつもの簡単なスタイルで実現。
- 使うときにほんの少しだけ工夫する。

# 方法
## nuxt.config.jsの設定
nuxt.config.jsの head > script 内に普通にURLを書く。
これでスクリプト自体の導入は完了です。

```js:nuxt.config.js
head: {
  script: [
    { src: 'https://maps.google.com/maps/api/js?key=API_KEY&libraries=places&language=ja' }
  ]
}
```

## 使う時
.vueファイルから直接googleオブジェクトを使うことができます。
外部のJSで使いたい場合は引数としてオブジェクトごと渡して使います。

### computedを設定
`this.google` でgoogleオブジェクトにアクセスできるようになります。

```js:page.vue
computed: {
   google() {
      return window.google
    }
}
```

### 実行
#### ページ内で使う場合

```js:page.vue
methods: {
  sample() {
    const google = this.google
    const test = new google.maps....
  }
}
```

#### 外部のJSにロジックを書いている場合
ページファイルからgoogleオブジェクトを渡して使います。

```js:page.vue
import { getRoute } from '@/plugins/path/to/googleMapSample'

methods: {
  sample() {
    const data = 1
    getRoute(this.google, data)
  }
}
```

```js:googleMapSample.js
const getRoute = (google, data) => {
  const test = new google.maps....
}

export {
  getRoute
}
```

# メリット
- 設定がシンプルで消耗しない。
- Vue.useを使ったり、設定用としてplugin配下にJSファイルを作る必要がない。
- 外部JSに引数として渡してしまえば、普段と同じ感覚で使える。
- 困った時に参照するのが一番手厚いGoogleMapの公式ドキュメントでよい

# まとめ
- ピュアなロジックを使いたいだけだったらこれが一番簡単だと思う。
- 開発と本番でAPIキーを分ける必要があるがそれはまた別の問題。
jupyter上でスムーズにモジュールを再読み込みする

# はじめに

自作モジュールを開発時に、挙動をインタラクティブに確認するためにjupyterで自作モジュールを読み込んで動作確認していると、自作モジュールの中身を更新する度に、kernelを再起動する必要がある。
この手順がかなり煩わしいので対応策がないか調べたら、`importlib`で解決できた。

# やり方

前述の通り`importlib`モジュールを利用する

## `import hoge`の場合

`importlib.reload`をすると、モジュールが更新される。

```python:import hoge
import importlib

importlib.reload(hoge)
```

## `from hoge import fuga`の場合

この場合は結構厄介で、`from`したモジュールをreloadした後、再度importを実施する必要がある。

```python:from hoge import fuga
import importlib

importlib.reload(hoge)
from hoge import fuga
```

# 関連

- [Python で from import を reload する。](http://graphics.hatenablog.com/entry/2017/12/03/004714)
GAS GMailの挙動がおかしい? 

# GmailApp の挙動について
あくまで2020/1/29 18:28時点です

# GmailApp.search() 受信ボックスしか取れない??

## in:inboxを指定
画面の検索で , in:inbox を指定すると受信トレイだけから検索

```
in:inbox *検索したいワード*
```
![スクリーンショット 2020-01-29 18.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180419/e0c431d6-b5fd-5ebb-0d61-11cd56ad0247.png)

同様にGmailAppだと

``` 
GmailApp.search("in:inbox 重要")
```

上記は当然検索結果が同じ結果になるはずです.


## inboxを指定しないと,全てメールが検索対象となるはずですが....
![スクリーンショット 2020-01-29 18.34.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180419/c30e79be-59ca-cd37-0071-ca3b5f1bfcb1.png)

```
GmailApp.search("重要")
````

なんと、これだと検索結果が異なります!!!!
(私のところでは,受信トレイに入ってないものは, .search()の対象になってないのです!!)
これは正しい仕様なのでしょうか??

GmailApp.search()と画面の検索ボックスのAPIが違う可能性があると思い, 違う方法で試みました.

# ラベルで取得しても挙動が怪しい
searchを使わずに, labelで取得を試みます.

![スクリーンショット 2020-01-29 18.39.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180419/c7970b7f-8ee0-3e33-9af7-02cb36b6f1db.png)

```
GmailApp.getUserLabelByName("重要").getThreads(0,500)
```

getThreadsは**最新**のThreadから順番に取得しているようです. 上限は500件まで.

この際, 上記の検索結果はイコールになるかと思ったのですが, なりません!!!!

一部のデータが検索できておりません.
検索できなかったThreadと検索できたThreadになんの違いがあるかがわかりません.
私には全く同じに見えます.

検索Boxでの結果とgetUserLabelByName()が使った結果が異なるは
Googleの正しい挙動なのでしょうか?? ご存知の方教えていただきたいです.

それともいまだけの挙動が不安定なのでしょうか？(よくGASは挙動が不安定な時があるので)

他の方で同様な事象に遭遇した方はいませんか???