OmniAICreator/Qiita-1.07M huggingface dataset:
Elm でマージソート

# tl;dr
[アルゴリズム図鑑](https://www.shoeisha.co.jp/book/detail/9784798149776)という書籍を参考に Elm で merge sort をやったら盛大にコケたので､[Functional Programming in Elm](https://github.com/evancz/functional-programming-in-elm)という連載の[Merge Sort](https://github.com/evancz/functional-programming-in-elm/blob/master/recursion/merge-sort.md) を読みながら､勉強してみたらなんとか解くことができた｡

# コード
```elm
import Html

-- まずは merge を作ります
merge : List comparable -> List comparable -> List comparable
merge left right =
    case (left, right) of
        ([], [])
            -> []
        (_::_, [])
            -> left
        ([], _::_)
            -> right
        (l::ls, r::rs)
            -> if l < r then
                   l :: merge ls right
               else
                   r :: merge left rs

-- つぎに半分にする分離装置を作ります
split : List comparable -> (List comparable, List comparable)
split list =
    let
        splitCore list_ flipFlop halfOne halfTwo =
            case list_ of
                [] -> (halfOne, halfTwo)
                x::xs -> if flipFlop then
                             splitCore xs (not flipFlop) (x::halfOne) halfTwo
                         else
                             splitCore xs (not flipFlop) halfOne (x::halfTwo)
    in
        splitCore list True [] []

-- そしてソートする部品をつくります
sort : List comparable -> List comparable
sort list =
    case list of
        [] -> list
        [_] -> list
        _ -> -- Elm の Case文って型を自由に取れるのか､知らなんだ
            let
                (halfOne, halfTwo) = split list
            in
                merge (sort halfOne) (sort halfTwo) -- 分割統治法のキモは再帰

-- 最後に確認します
main
    =  [3,1,4,5,9,2,6,0,8,7]
    |> sort
    |> Debug.toString
    |> Html.text -- [0,1,2,3,4,5,6,7,8,9]
```

# 参考にした文献
=> [Merge Sort](https://github.com/evancz/functional-programming-in-elm/blob/master/recursion/merge-sort.md)

# 結語
QuickSort の方が実装はラク｡
エクセルの表をデータベースで扱いやすい形に直すマクロ


##初めに
マトリックス上になっているデータをデータベースに入れやすい形に直す際に使うマクロです。

##イメージ
このようなデータだった場合は
<img width="338" alt="{7749EAF6-4E7E-44D2-8113-9BF046483CB6}.png.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/319723/ff430321-6270-9d34-aef2-f77ecf9cbd2d.jpeg">

以下のように直します。
<img width="178" alt="{57F41B16-3642-43BF-9E29-74D4B31403D1}.png.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/319723/868630b9-6d28-2059-468b-3d8e23318121.jpeg">

マクロ

```
Option Explicit


Sub MyTableToList()
    Const myTitle = "マトリックス表から一覧表を作成"
    Dim range1 As Range, range2 As Range
    Dim rowCount As Long, colCount As Long
    Dim i As Long, j As Long, k As Long

    On Error GoTo err_1

    If TypeName(Selection) <> "Range" Then
        MsgBox "セル範囲を選択して実行してください。", _
            vbExclamation, myTitle
        Exit Sub
    End If

    Selection.Areas(1).Select
    If Selection.Cells.Count = 1 Then Selection.CurrentRegion.Select

    Set range1 = InputBoxRange( _
        prompt:="範囲の先頭行と先頭列を見出しとして一覧表を作成します。" _
        & Chr$(10) & "対象のセル範囲を入力してください。", _
        title:=myTitle, default:=Selection.Address(True, True))
    If range1 Is Nothing Then Exit Sub
    Set range1 = range1.Areas(1)
    range1.Select

    rowCount = range1.Rows.Count
    colCount = range1.Columns.Count

    If rowCount <= 1 Or colCount <= 1 Then
        MsgBox "データがありません。", vbExclamation, myTitle
        Exit Sub
    End If

    Select Case MsgBox("結果出力シートをアクティブブックに追加しますか？", _
            vbYesNoCancel Or vbExclamation, myTitle)
        Case vbYes
            Set range2 = Worksheets.Add.Cells(1, 1)
        Case vbNo
            Set range2 = Workbooks.Add(xlWorksheet).Worksheets(1).Cells(1, 1)
        Case Else
            Exit Sub
    End Select

    Application.ScreenUpdating = False

    range2.Value = range1.Cells(1, 1).Value

    k = 2
    For i = 2 To rowCount
        For j = 2 To colCount
            range2.Cells(k, 1).Value = range1.Cells(i, 1).Value
            range2.Cells(k, 2).Value = range1.Cells(1, j).Value
            range2.Cells(k, 3).Value = range1.Cells(i, j).Value
            k = k + 1
        Next
    Next

    Exit Sub
err_1:
    MsgBox Error(Err) & " (" & Err & ")", vbExclamation, myTitle
End Sub

Function InputBoxRange(prompt As String, title As String, _
        default As String) As Range
    On Error Resume Next
    Set InputBoxRange = Application.InputBox( _
        prompt:=prompt, title:=title, default:=default, Type:=8)
End Function


```

このコードをAlt+11でVBAを開きます。
そこから標準モジュールを選択し、このコードをコピペします。

そして直したいデータ上でAlt+8で実行します。
JavaScript Functional Programming memo

# JavaScript Functional Programming memo
## map
```javascript
const numbers = [1,2,3,4,5,6]

numbers.map(function(n) {return n*n;})
> [ 1, 4, 9, 16, 25, 36 ]

numbers.map((n) => { return n*n; })
> [ 1, 4, 9, 16, 25, 36 ]

numbers.map(n => n*n)
> [ 1, 4, 9, 16, 25, 36 ]

```

## filter
```javascript
const numbers = [1,2,3,4,5,6]

numbers.filter((n) => { return n<5; })
> [ 1, 2, 3, 4 ]

numbers.filter(n => n<5)
> [ 1, 2, 3, 4 ]
```

## reduce
```javascript
const numbers = [1,2,3,4,5,6]

// reduce's callback function's returned value is automatically assigned to the accumulator.
numbers.reduce((acc, n) => acc * n, 1)
> 720

numbers.reduce((acc, n) => acc + n, '')
> '123456'

// acc is automatically assigned, so the following version is verbose.
// keep this verbose-version just for reminding myself.
// useless version
numbers.reduce((acc, n) => {acc[n]=n*n; return acc;}, {})
> { '1': 1, '2': 4, '3': 9, '4': 16, '5': 25, '6': 36 }

// compact version
numbers.reduce((acc, n) => ({...acc, [n]:n*n }), {})
> { '1': 1, '2': 4, '3': 9, '4': 16, '5': 25, '6': 36 }

// compact version
numbers.reduce((acc, n) => [...acc, n*n], [])
> [ 1, 4, 9, 16, 25, 36 ]
```
CentOS 7 で、ansible を使って、firewalld を設定する

ufw では簡単にできた、ssh のIPアドレスによるアクセス制限が意外と大変だったので、設定の例あげておきます。この程度でも役に立つかもしれないと思っての投稿です。
もっといい例があったらお教えください。

```
---
- name: firewalld の設定テスト甩
# vagrant CentOS7 甩ノスクリプトです。
  hosts: v-c7
  vars:
    ips:
      - 192.168.33.1     # vagrant　甩のIPアドレス　
      - 10.0.2.2         # 　お使いのVagrant の設定に合わせてください
    mysql_ips:
      - 192.168.33.1     # mysql 甩のポートをあけます。
      - 192.168.0.0/24   # vagrant 甩のIPアドレスです。
  tasks:

  - name: firewalld のインストール 
    become: yes
    yum:
      name: firewalld
      state: latest
  # default は public で最初は、ssh,dhcp が開いています。
  # http,https を開けるように指定します。
  - name: http,https
    become: yes
    firewalld:
      zone: public
      service: "{{ item }}"
      permanent: yes
      state: enabled
    with_items:
      - http
      - https
  # ssh のアクセス元のIP制限かけます。IPは、変数で指定
  - name: ssh のアクセス元の許可
    become: yes
    firewalld:
      rich_rule: 'rule family=ipv4 source address="{{ item }}" service name="ssh" accept'
      permanent: yes
      state: enabled
    with_items: "{{ ips }}"
  # ssh の　port 番号の変更用の指定です。12012 にしました。適当に、合わせて変更してください。
  - name: 12012 を設定
    become: yes
    firewalld:
      rich_rule: 'rule family=ipv4 source address="{{ item }}" port port="12012" protocol="tcp" accept'
      permanent: yes
      state: enabled
    with_items: "{{ ips }}"
  # mysql 用のポートをあけます。
  - name: port mysql
    become: yes
    firewalld:
      rich_rule: 'rule family=ipv4 source address="{{ item }}" port port="3306" protocol="tcp" accept'
      permanent: yes
      state: enabled
    with_items: "{{ mysql_ips }}"
  - name: ssh を落とす
    become: yes
    firewalld:
      service: ssh
      permanent: yes
      state: disabled

  - name: dhcpv6-client を落とす
    become: yes
    firewalld:
      service: dhcpv6-client
      permanent: yes
      state: disabled

  - name: restart firewalld　これで、設定が反映されます。
    become: yes
    systemd:
      state: restarted
      name: firewalld

```
Cent OS7にTeraterm経由でJenkinsをインストールしてみる

> $ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo

wgetコマンドはHTTP/HTTPSで利用できるファイル取得用コマンド。
Webサイト全体を取得できる。
-Oオプションはダウンロードしたファイルの保存先の指定。

> $ sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

rpmコマンドはRPMパッケージを扱うことができるパッケージ管理コマンド。
RPMの作法に従ってインストールしたソフトウェアは、「RPMデータベース」と
呼ばれるデータベースで管理される。
ここを参照することで、インストールされているパッケージやバージョンが分かる。
アンインストールの際も、使われる。
「yum」コマンドもRPMデータベースを参照している。

> $ sudo service jenkins start

ジェンキンスの起動。

http://localhost:8080
にアクセスする
Adafruit Itsy Bitsy 32u4 - 5V 16MHzを使って圧電ブザーから音を鳴らす

Adafruit Itsy Bitsy 32u4 - 5V 16MHzを使って圧電ブザーから音を鳴らしました。手順を記載します。

# 準備
[Adafruit Itsy Bitsy 32u4 - 5V 16MHz](https://www.amazon.co.jp/gp/product/B07BT2GLNW/ref=ppx_yo_dt_b_asin_title_o02__o00_s00?ie=UTF8&psc=1)
[圧電ブザー](https://www.amazon.co.jp/gp/product/B017Z87BYW/ref=ppx_yo_dt_b_asin_title_o04__o00_s00?ie=UTF8&psc=1)
ジャンパワイヤ 

# 回路図
Arduino PIN13と圧電ブザーを繋ぎます。
圧電ブザーのもう一方はGNDへ落とします。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/344880/c7af368b-e80c-2df1-684d-16c497523bbd.png)


# コード
tone関数を使用してドレミを再生します。

```
#define DELAYMSEC 300 //delay
#define PINNO 13      // ブザーを接続したピン番号

void setup() {
}

int index[21] =
  {131, 147, 165, 175, 196, 220, 247,
   262, 294, 330, 349, 392, 440, 494,
   523, 587, 659, 698, 784, 880, 988};

void loop() {

  for (int j=0; j<3; j++) { 
    for (int i=0; i<7; i++) { 
        tone(PINNO, index[j*7 + i], DELAYMSEC);
        delay(DELAYMSEC);
    }
  }
  delay(1000);
}
```

# テスト
ドレミ・・と音が鳴ればOKです。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">play tone signal <a href="https://t.co/rksboPDyML">pic.twitter.com/rksboPDyML</a></p>&mdash; st (@st17890027) <a href="https://twitter.com/st17890027/status/1095639667049787394?ref_src=twsrc%5Etfw">2019年2月13日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

# 参考
・[組み込みエンジニアでなくても週末にArduinoを使って遊ぶ](https://qiita.com/seigot/items/958d3f2817a4bdac8754)
・[圧電ブザーを鳴らせてみよう](https://fabkura.gitbooks.io/arduino-docs/content/chapter7.html)
Next.jsでのサイト内ページ遷移方法


公式ドキュメントの和訳を基本にしています。
https://nextjs.org/docs/#routing

Next.jsは各route(レスポンスを返すべきURL)に他のrouteの一覧を配信しているわけではないので、
クライアントサイドのページは他のページについて何も知りません。
スケーラビリティのため、後続のページは全てlazy-loadされます。

以下、Next.jsにおけるページ遷移の方法です。

# `next/link`を使う
`next/link`はNext.jsについてくるルーティング用のコンポーネントです。`<a />`をこれでラップすると、クライアントサイドでのページ遷移を起こせます。
ほとんどのサイト内リンクはこれを使うことになるでしょう。
## `href`と`as`を渡す
以下の２つのページについて考えます。

```JSX
// pages/index.js
import Link from 'next/link'

function Home() {
  return (
    <div>
      詳しくは
      <Link href="/about">
        <a>こちら</a>
      </Link>
      をクリックしてください
    </div>
  )
}

export default Home
```
```JSX
// pages/about.js
function About() {
  return <p>ほら詳しいでしょう</p>
}

export default About
```
`next/link`は以下のpropsを受け付けます。

- `href` : パス＋クエリ文字列。唯一の必須props。
- `as` : 遷移後ブラウザのURLバーに表示されるパス。
- `passHref` : 子コンポーネントに`href`propsを渡すか。デフォルトはfalse。子が`<a>`の場合は自動でパスするので、設定不要です。子がオリジナルのコンポーネントの場合(styled-componentsでMyStyledLinkを作っているなど)、trueにすることで href属性が出現し、SEOフレンドリーにできます。
- `prefetch` : バックグラウンドでリンク先をプリフェッチするか。デフォルトはtrue。ただしfalseにしてもhover時にはプリフェッチされます。プリフェッチ機能はプロダクションビルドでのみ機能します。
- `replace` : 遷移時、`history`スタックに遷移先URLを追加する代わりに、現在のURLを置換します。デフォルトはfalse。
- `shallow` : データフェッチ(getInitial/getStatic/getServerside props)もページリロードもせずにURLを変えるモード。デフォルトはfalse。該当の/pagesファイルが変わると必ず別ページになるので、クエリを変えるときにしか効果はありません。例えばラーメンの種類を選ぶページで ?ramen_kind=hakata に遷移するなどでしょうか。使ったことがない:angel_tone2:

```JSX
function Page() {
  const router = useRouter()
  useEffect(() => {
    // 新ラーメンの表示
  }, [router.query.ramen_kind])
  return (
    <Link href="/ramen?ramen_kind=hakata">
      <a>博多ラーメンを選ぶ</a>
    </Link>
  )
} 
```
- `locale` : 多言語対応時、選択中のlocaleを自動的に先頭につける。デフォルトはtrue。




この、`next/link`でのクライアントサイドルーティングは、ブラウザの通常のルーティングと同じように動きます。

1. コンポーネントが取得されます
2. コンポーネントに`getInitialProps`があれば、データが取得されます。エラーが発生すれば、`_error.js`がレンダリングされます。
3. 1と2が終わったら、`pushState`が実行され、コンポーネントがレンダリングされます。


### URLオブジェクトを渡す
`next/link`はURLオブジェクトを渡して使うこともでき、その場合オブジェクトは自動的にURL文字列に変換されます。

```JSX
import Link from 'next/link'

function Home() {
  return (
    <div>
      アザラシについては
      <Link href={{ pathname: '/about', query: { animal: 'seal' } }}>
        <a>こちら</a>
      </Link>
      をクリック
    </div>
  )
}

export default Home
```
この場合、URL文字列`/about?animal=seal`が生成されます。[Node.jsのURLモジュール](https://nodejs.org/api/url.html#url_url_strings_and_url_objects)で定義されているプロパティは何でも利用できます。



# `next/router`を使う

クライアントサイドの遷移は`next/router`でも実現できます。
クリック以外のトリガー遷移するときや、遷移のロジックがフクザツなときに使えそうです。
```
router.push(url, as, options)
```

```JSX
import { useRouter } from 'next/router'

function ActiveLink({ children, href }) {
  const router = useRouter()

  const handleClick = (e) => {
    e.preventDefault()
    router.push(href)
  }

  return (
    <a href={href} onClick={handleClick}>
      {children}
    </a>
  )
}

export default ActiveLink
```

optionsはnext/linkのpropsと似ています。
- `href` : パス＋クエリ文字列。
- `as` : 遷移後ブラウザのURLバーに表示されるパス。
- `options` : next/linkと同じ、`shallow` `locale`
クラウドでお手軽Jupyter Notebook - IBM CloudでJupyter Notebookを使えるまでの手順 -

# はじめに
IBMの統合環境ツール、Watson Studioの機能のうち、Jupyter Notebookの簡単な使い方を紹介します。

(2020-04-25 全面改定)

# アカウント登録からプロジェクト作成まで

アカウント登録からプロジェクト作成までの手順は、下記記事に最新版をまとめました。
今後は、こちらをメンテしますので、下記の記事を参照して下さい。

[無料でなんでも試せる! Watson Studioセットアップガイド](https://qiita.com/makaishi2/items/b666f847a98c2e42dfbb)

# 空白のnotebook起動手順
　上の手順で、Watson Studioのプロジェクト作成まで終わっている前提とします。
①**Asset**タブを選択した状態で
②**プロジェクトに追加**をクリックします。

![スクリーンショット 2020-04-25 12.29.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/a0f03ec8-65e2-ab79-d90c-7483f1a66cc1.png)

下のメニューが出たら、**Notebook**を選択します。

![スクリーンショット 2020-04-25 12.35.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/83280d82-607d-aeb7-6168-cba5ddf003dc.png)

① Notebookの名称を「**My First Notebook**」など適当に入力し
② **Create**ボタンをクリックします

![スクリーンショット 2020-04-25 15.34.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/9691869b-7e75-b7ec-199e-77c293905369.png)

しばらく処理に時間がかかりますが、下記の画面が出てきたら、Notebookの準備完了です。

![スクリーンショット 2020-04-25 15.39.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/6762fab2-8200-a6a5-62e3-6b1f3c9a9eac.png)

上の画面で、In []: の右の箱(**セル**と呼びます)にカーソルを移し、

```
1+1
```

と入力した後、Shift + Enterを押して下さい。下記のような結果になれば、テスト完了です。

![スクリーンショット 2020-04-25 15.42.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/a11841f0-7508-dfb6-48f7-44112b59d2f3.png)

次はもう少し複雑なプログラムを動かしてみましょう。Jupyter Notebookでは、一つのセルに複数行のプログラムを入れることができます。下記のコードを次のセルに丸ごとコピーして、Shift + Enter としてみて下さい。

```
# Numpyのサンプルコード
import numpy as np

# 1次元配列
a = np.array(range(1, 10))
print(a)
print()

# 2次元配列
b = a.reshape(3,3)
print(b)
print()

# 行列とスカラーの和
c = b + 1
print(c)
```

下記のような結果になれば、テストは成功です。

![スクリーンショット 2020-04-25 15.48.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/733eee98-fda4-220a-20f0-5bfe7dcfef92.png)

メニューから「File」->「Save」、「File」->「Stop Kernel」を順に選び、次の画面には「Shutdown」で答えます。

![スクリーンショット 2020-04-25 15.51.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/52189726-b73f-772c-fc24-232f0a7e6880.png)

最後に下の画面のプロジェクト名の箇所をクリックすると、Notebookから抜けることができます。

![スクリーンショット 2020-04-25 15.51.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/27cf28e2-686c-7956-56d3-a62216daf750.png)


# Notebookファイルの読み込み

新規Notebook作成までは、上の空白Notebookの場合と同じです。
下の画面で

① From Fileタブ選択
② notebookファイルを該当領域にdrup and drop
③ Createボタンクリック

で既存のNotebookの読み込みができます。

![スクリーンショット 2020-04-25 16.08.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/84762a94-46db-755f-5a70-bc1582bfb442.png)


# github上のnotebook直接読み込み

新規Notebook作成までは、上の空白Notebookの場合と同じです。
下の画面で

① From URKタブ選択
② notebook名を適当に入力
③ notebookファイルのURLを入力
④ Createボタンクリック

で既存のNotebookの読み込みができます。

![スクリーンショット 2020-04-25 16.19.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/559b57a2-a04b-6b4f-1901-40695443bcef.png)

ちなみに、URLとしては、例えば下記のものが利用可能です。
(宣伝ですが、私の本のサンプルコードになります)
https://raw.githubusercontent.com/makaishi2/math_dl_book_info/master/notebooks/ch07-regression.ipynb
Node-REDのフローから自作ノードにバイナリデータを渡す方法

Node-REDのフローから自作ノードにバイナリデータを渡すとき、Uint8Arrayを使用していましたが、これはフロー上のUint8ArrayとNode.js側のUint8Arrayの型が違うために受け渡しできません。

バイナリデータでやり取りをするときは、Bufferクラスをサポートしましょう。そうすれば、フローとNode.jsでバイナリ配列のやり取りすることができます。


## 問題の事象
Node-REDのフローの中でUint8Array型のバイナリデータを生成して、自作ノードに渡そうとしましたが、正しく動作しませんでした。

### ブラウザ上のfunctionノード内のコード
この結果を自作ノードに入力します。

```JavaScript
let data = new Uint8Array([1,2,3,4,5]);
return {payload: data};
```

### 自作ノード内

```JavaScript
node.on('input',(msg) => {
  let payload = new Uint8Array([0,1,2,3,4,5]);
   console.log(msg.payload);
   console.log(payload);
});
```

### 結果
自作ノード内で、2つのpayloadを出力してみると、このようになります。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/136933/3c73b403-dd54-d42d-6e96-9674f286516c.png)

Functionノードで宣言したUint8ArrayはJSON、自作ノード内で宣言したUint8Arrayは配列になっており、明らかに違うようです...

## 正解
Bufferを使用した時の結果

### ブラウザ上のfunctionノード内のコード
```JavaScript
let buffer = new Buffer([0,1,2,3,4,5]);
let uint8array = new Uint8Array([0,1,2,3,4,5]);
return {buffer: buffer, uint8array: uint8array};
```
### 自作ノード内
```JavaScript
node.on('input',(msg) => {
    console.log({
      buffer:  (msg.buffer instanceof Buffer),
      uint8array: (msg.uint8array instanceof Uint8Array)
    });
    console.log({binay: msg.binary});
    console.log({uint8array: msg.uint8array});
});
```

### 正解の結果
このようにBuffer型を使用した方は成功しました。
Node.js内のUint8Arrayは使用できるようなので、instanceofで型をチェックすれば正しく判定できることもわかりました。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/136933/8d13b093-b6ca-426c-8787-8d98f9919377.png)
GoのHTTPサーバのミドルウェアでリクエストボディを読み取る

ミドルウェアでリクエストボディを読み取ったあと、次のハンドラでもリクエストボディを読み取れるようにしておきたい場合があります。

一旦`iouti.ReadAll()`で取得したリクエストボディの中身（以下の例では変数`buf`）を元に`ioutil.NopColoser()`で`io.ReadCloser`を作って、`Request.Body`にセットしなおすことで、次のハンドラでも読み取れるようになります。

```go
func middleware(h http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        ...
        buf, err := ioutil.ReadAll(r.Body)
        if err != nil {
            w.WriteHeader(http.StatusInternalServerError)
            return
        }

        r.Body = ioutil.NopCloser(bytes.NewBuffer(buf))
        ...
        h(w, r)
        return
    }
}
```

`ioutil.NopColoser`は次のように`Close()`を呼び出しても何もしない実装になっています。

```go
type nopCloser struct {
    io.Reader
}

func (nopCloser) Close() error { return nil }

// NopCloser returns a ReadCloser with a no-op Close method wrapping
// the provided Reader r.
func NopCloser(r io.Reader) io.ReadCloser {
    return nopCloser{r}
}
```
https://golang.org/src/io/ioutil/ioutil.go#L110


`labstack/echo`のmiddlewareパッケージにある`BodyDumpWithConfig`でも同じようなことしている箇所がありました。
https://github.com/labstack/echo/blob/6d9e043284aea2d07f5fcaf0d3a424eb7d9f6109/middleware/body_dump.go#L68-L73


## 参考

- [How to read response body twice in Golang middleware?](https://stackoverflow.com/questions/46948050/how-to-read-response-body-twice-in-golang-middleware)
Git for Windowsのbashが便利な件

[Git for Windows](https://gitforwindows.org/)

![1.png](https://qiita-image-store.s3.amazonaws.com/0/308709/4fb73bb9-7768-1df1-15ca-62097497eb8b.png)

windowsでgitを使っている人は多いと思いますが、意外と知られてない活用されてない部分かもしれないのであえて記事にしてみました。

## 環境

- Windows 10 Home 64bit
- git for windows 2.20.1

## Bashとは？

Linuxで使われてる、ちょー標準的なシェルです。今のmacなんかもそうですね。（いや、zshだっけ？まあ似たようなもん)
すごい雑にいうと、windowsのコマンドプロンプトみたいなもんで、Linux上のコマンドをこのシェル上で実行できます。
ちなみにlsやcdのような基本的コマンドはbash自体に含まれているコマンドです。
そしてlinuxにはfindやgrep等の便利なコマンドがありますが、git bashを入れるともれなくついてくるのでwindows上でこれが使えるようになります。
あと当然ですが、gitのコマンドももれなくついてきます。

## インストール

特に難しい事はなく、DownloadからのNext連打で勧めます。
ポイントなのは```Adjusting your PATH environment```のところで、
```Use Git and optional Unix tools from the Command Prompt```を選択しておく事でしょうか。
これでgit bashだけでなくコマンドプロンプトでも```ls```などのコマンドが使えるようになります。
なお、Warningとして書いてありますが、もとからwindowsにあるコマンドはoverrideされるって書いてあります。上書きというもPATHが被ってbashの方のが優先される結果になるってだけですかね。```C:\Program Files\Git\usr\bin```とかが%PATH%に追加されます。個人的にwindowsのfindは使ってないのでぜんぜんOKです。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/308709/a72b34a6-201f-e83f-5732-4e9b49450ff1.png)

あとは```Configuring the terminal emulation to use with Git Bash```のところは```Use MinTTY```を選択しています。ここは好みなんですかね。こちらを選択しておくと、よりLinuxに近いターミナルを使えます。

## まず普通にgit bash

![3.png](https://qiita-image-store.s3.amazonaws.com/0/308709/0a501b25-3202-6553-ef0e-03ee103473b1.png)

こんな感じで、Linux感覚でwindowsが操作できます。
ちなみに```/c```がWindowsでいう```c:\```になる。
マイドキュメントだと```/c/Users/name/My\ Documents```みたいな感じですね。
なおbashは```C:\Program Files\Git\bin\bash.exe```が本体です。

## 次にcommand prompt

おもむろにコマンドプロントを立ち上げます。
いつものように普通に真っ黒なウインドウが立ち上がりますが、すでにbashへのPATHが通っており、ハイブリッドなcmdになっています。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/308709/edfb85b2-c50e-3906-cca7-f3dc706b4800.png)

先程と同じコマンドを実行してみました。
bashのコマンドを介するとUNIXのパスが使えるようになったりしてちょっとややこしいですね。```find c:\Python27 -name '*.txt' -ls```といったwindows風でも使えます。
もちろんgitコマンドもcmd上で使える。

linuxになれてる人はついlinuxのコマンド使いたくなるシーンが多いので、けっこう便利になるかなと思います。
tarで解凍したりだとか、vimつかったりだとか・・あと間違えてlsしたときに普通に返してくれるのがうれしい。

まあ、逆にますますCMDから離れていってしまうのが難点といえば難点ですが。
Swift：アプリのバージョンアップ直後のみ特定の処理を実行させる

# 概要

アプリを頻繁にアップデートする開発者ならば，アップデート直後のみに特定の処理を実行させたくなる時があると思います．そんな時に役立つコードを考えてみました．

# ソース

```swift
let userDefaults = UserDefaults.standard

private func settingJustAfterUpdating() {
    let dicKey = "CFBundleShortVersionString"
    guard let version = Bundle.main.object(forInfoDictionaryKey: dicKey) else { return }
    let newVersionKey = "ver\(version as! String)"
    // 初回起動時のみ処理が呼ばれるようにフラグを立てる
    userDefaults.register(defaults: [newVersionKey : true])
    // もしも最新バージョンでのアプリ起動が初めてならば
    if userDefaults.bool(forKey: newVersionKey) {
        // 次回起動以降は処理が呼ばれなくなるようにフラグを折る
        userDefaults.set(false, forKey: newVersionKey)

        // ここでアップデート直後のみ行なわせたい処理を呼び出す

        // 不要となった過去バージョンにおけるフラグをUserDefaultsから削除する
        // verから始まる名前のキーが他の用途向けに無いよう設計に注意!
        if let dataList = userDefaults.persistentDomain(forName: Bundle.main.bundleIdentifier!) {
            let versionKeys = dataList.compactMap { $0.key.hasPrefix("ver") ? $0.key : nil }
            versionKeys.forEach { (key) in
                userDefaults.removeObject(forKey: key)
            }
        }
    }
}

// ViewDidLoad()内部とかで呼ぶ
settingJustAfterUpdating()
```
Python Codeを優雅に

時々，あなたはVery CoolなPythonコードを見たことがあるでしょうか．
その単純さ，その優雅さに驚いています．
あなたは感心するしか仕方がありません．
このように書くことができるのか！とビックルする
Pythonicのスキルを身につけることができれば，Coolなコードを書くことができます．

## "_"について
これはよく使う機能けど，少数の人がしかしらない．
ターミナルでコードを書いて結果を得たとき，変数をつけ忘れることがあるでしょうか．
このとき，"_"を使って一番近い結果を得ることができます．

```python
>>> 10 * 2
20
>>> _
20
```

## 文字結合

文字を結合するとき，習慣的に"+"を結合で使う人がいますが，
for文でメモリがどんどん減らされ，力つきるます．

``` python
string = ['p','y','t','h','o','n']

# Bad
def fun(string):
    all_string = ''
    for i in string:
        all_string += i
    return all_string

# Good
def fun(string):
    all_string = ''.join(string)
    return all_string

>>> "python"
```

## 強大なzip()
zip関数はいろんな場面で活用することができます．

#### 例1：行列をchange

```python
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# Bad
re_a = [[row[col] for row in a] for col in range(len(a))]

# Good
re_a = list(zip(*a))

>>> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
```

#### 例2：dictのkeyとvalueをchange
```python
a = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

# Bad
def reverse_dict(a):
    new_dict = {}
    for k,v in a.items():
        new_dict[v] = k
    return new_dict

# Good
def reverse_dict(a):
    k = a.keys()
    v = a.values()
    new_dict = dict(zip(v, k))
    return new_dict

>>> {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
```

## 変数の中身をChange
大学1年のC言語の授業が思い出す．

```python
# Bad
tmp = a
a = b
b = tmp

# Good
a, b = b, a
```

## リストの要素とインデックスを取得
```python
a = [8, 23, 45, 12, 78]
for index, value in enumerate(a):
    print(index , value)

0 8
1 23
2 45
3 12
4 78
```

## 1行で例外を得る
```python
try:
    pass
except (ExceptionA,ExceptionB,.....) as e:
    pass
```

## リストを同じ大きさのブロックに分ける
```python
a = [1, 2, 3, 4, 5, 6]
list(zip( *[iter(a)]*2 ))

>>> [(1, 2), (3, 4), (5, 6)]
```

## 文字列を反転
```python
a = 'Love Python'

#Bad
list_a = list(a)
list_a.reverse()
re_a = ''.join(list_a) 

#Good
re_a = a[::-1]

>>> 'nohtyP evoL'
```

## メモリとさらば
```python
crash = dict(zip(range(10 **0xA), range(10 **0xA))) 
```


今回の「Python Codeを優雅にChange」は以上で終わります．
読んでいただいてありがとうございます．
はてなブックマークを #API で追加する #python スクリプトの例

はてなブックマークを #API で追加する #python スクリプトの例

# Script

```py
import requests

from requests_oauthlib import OAuth1
auth = OAuth1(
  "cosumer_key",
  "consumer_secret",
  "AccessToken",
  "AccessTokenSecret"
)

bookmark_api_url = "http://api.b.hatena.ne.jp/1/my/bookmark"
bookmark_url = "https://example.com/"
print(requests.post(bookmark_api_url + "?url=" + bookmark_url, auth=auth).content)
```

# Example

![image](https://user-images.githubusercontent.com/13635059/52896023-5d1e4180-3205-11e9-9ce0-934509a52327.png)

# Ref
[はてなブックマーク ブックマーク API - Hatena Developer Center](http://developer.hatena.ne.jp/ja/documents/bookmark/apis/rest/bookmark#post_my_bookmark_parameter_url)
[はてなのOAuth API用のアクセストークンを簡単に取得する [python] - Iruca Log](https://www.iruca21.com/entry/2017/05/24/090000)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
99 PSiE [Problem 11]

# はじめに
[Ninety-nine Problems, Solved in Elm](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/) を毎日ふれることで､Elm に親しもうという『日記』です｡詳細は [99 PSiE [Problem 1]](https://qiita.com/seahal/items/36f176d68991231ee80a) をご覧ください｡

# 問題
Write a function to run length encode a list, but instead of using a tuple as in problem 10, use a union data type.
(引用元：[Problem 11](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/p11.html))

# 成果物
```elm
import Html

type RleCode a = Run Int a | Single a

rleEncode lists =
    let
        runLengths_ list tupleList num =
            case list of
                [] -> tupleList
                [a] -> tupleList ++ [(a, num )]
                x::y::zs -> if x == y then
                                runLengths_ (y::zs) (tupleList) (num + 1)
                            else
                                runLengths_ (y::zs) (tupleList ++ [(x, num)]) (1)
        branch (fst, snd) =
            if snd == 1 then Single fst else Run snd fst
    in
        runLengths_ lists [] 1 |> List.map branch


main : Html.Html a
main =
    Html.text
        <| case test of
            0 ->
                "Your implementation passed all tests."
            1 ->
                "Your implementation failed one test."
            x ->
                "Your implementation failed " ++ (Debug.toString x) ++ " tests."

test : Int
test =
    List.length
        <| List.filter ((==) False)
            [ rleEncode [ 1, 1, 1, 1, 2, 5, 5, 2, 1 ]
                == [ Run 4 1, Single 2, Run 2 5, Single 2, Single 1 ]
            , rleEncode [ 2, 1, 1, 1 ] == [ Single 2, Run 3 1 ]
            , rleEncode [ 2, 2, 2, 1, 1, 1 ] == [ Run 3 2, Run 3 1 ]
            , rleEncode [ 1 ] == [ Single 1 ]
            , rleEncode [] == []
            , rleEncode [ "aa", "aa", "aa" ] == [ Run 3 "aa" ]
            , rleEncode [ "aab", "b", "b", "aa" ]
                == [ Single "aab", Run 2 "b", Single "aa" ]
            ]
```

# 正答例
=> [Problem 11 Solutions](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/s/s11.html) 

# コメント
Problem 9 の発展版らしいので､本来だったら takeWhile とか dropWhile とかが必要なはずだが､これは Tuple 使えば解けるという確信があったのでやったらテストがパスした｡問題をよく読めば､これはアルゴリズムの学習というよりも､Elm 言語の型に慣れましょう､という趣旨の問題だと感じる｡
編集中_【GoogleAppsScript】GASクラスやメソッドを整理する

# 作成目的
- クラスやメソッドを構造的に示し、理解を深めるために作成（※備忘録）
- 随時、追加／整理する
- テーブルでない方が良さそうなため、フォーマット検討する

|`階層1`|`階層2`|`階層3`|`階層4`|`階層5`|`説明`|
|:------|:------|:------|:------|:------|:------|
|SpreadsheetApp|.getActiveSpreadsheet()|.getActiveSheet()|.getName();||アクティブシート名 取得|
|SpreadsheetApp|.getActiveSpreadsheet()|.getActiveSheet()|.getLastRow();||アクティブシートの最終行番号 取得 *最終行番号: 指定シートの値が入ったセルの行番号|
|SpreadsheetApp|.getActiveSpreadsheet()|.getActiveSheet()|.getLastColumn();||アクティブシートの最終列番号 取得 *最終列番号: 指定シートの値が入ったセルの列番号|
|SpreadsheetApp|.getActiveSpreadsheet()|.getName();|||スプレッドシート名 取得|
|SpreadsheetApp|.getActiveSpreadsheet()|.getSheets();|||全シートオブジェクト 取得|
||.openByUrl('※指定のURL');||||指定URLのスプレッドシートオブジェクト 取得|
|new Array();|||||配列 初期化|
|new Date();|||||今日日付 取得|
|Utilities.formatDate(new Date(), "JST", "yyyy/MM/dd");|||||今日日付を日本時間YYYY/MM/DDで取得|
|||||||
|||||||
|||||||
|||||||
|||||||
|||||||
|||||||
baenstalk single dockerでflaskを動かす

# 動機
たまに動かす画像処理サーバを建てる必要があり
- 瞬間的にそこそこCPU欲しい
- 継続的には動かさない
- autoscaleしたい
- メモリはほとんど使わない
となり

- ECS
EC2とdockerの管理したく無い

- fargate
高い

- Beanstalk
t3.micro or t3.small unlimited を常時２台くらい並べるのが、しゅごいコスパな気がする。い。

# docker 作る
## docker image
docker run -p 80:80 で、80番ポートでflask起動するdocker imageを作っておく。
ちなみにflaskでもrailsでもtomcatでも、docker runで80番ポートで起動するようにしたら、何でもいける。
別に80番じゃなくてもいいけど。

## ECRにpushしておく
push push!!


# beanstalk設定
awsebcli入れて、新規ebアプリを作る
```
pip install awsebcli

eb init hoge
```

## eb 環境作成
cliから作ると初期設定関係で色々とはまったので、consoleから作った。
ブラウザからaws consoleを表示し、新規環境構築。

- 環境名 hoge-env
- VPCとサブネットを選択する
- NAT使わない場合は、インスタンスにpublic ipを振る

## IAMにECR権限あたえる
aws-elasticbeanstalk-ec2-roleへ、AmazonEC2ContainerRegistryReadOnlyを与えておく

## デプロイ

```
eb use hoge-env

# 設定ファイル作る
touch Dockerrun.aws.json
```

```Dockerrun.aws.json
{
    "AWSEBDockerrunVersion": "1",
    "Image": {
      "Name": "99999999999.dkr.ecr.ap-northeast-1.amazonaws.com/your-dockername:latest",
      "Update": "true"
    },
    "Ports": [
      {
        "ContainerPort": "80"
      }
    ]
  }
```

```
# deployコマンドで起動する
eb deploy

INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.     

```
成功!!
JavaScript 　学習記録　（文字列 連結 ES6）

#  文字列の連結 書き方 ES6
 > **${}と`(バッククオート)**を利用して文字列の連結を行う事が出来る

```JavaScript
// +を使った書きかた
let str1 = "Canada";
console.log("I am living " + str1);
// // I am living Canada

//${}と`(バッククオート) を使った書きかた

let str2 = "Japan";
console.log( `I am living ${str2}`);
// I am living Japan
request_store_rails を sidekiq 上で実行する gem を書いた。

# TL; DR

```ruby:Gemfile
gem 'request_store_rails-sidekiq'
```

を記述すると、[request_store_rails](https://github.com/ElMassimo/request_store_rails)を Sidekiq のジョブの上でも問題なく実行できるようになる。 `RequestLocals` は各 Sidekiq のジョブ実行ごとにリフレッシュされる。

# 目的

Rails で「リクエスト単位のグローバル変数」のようなものを実現したいときに、古くから利用されてきたのは [request_store](https://github.com/steveklabnik/request_store) の gem だった。これは、リクエスト単位の変数をスレッドローカルな値として `Thread.current` の中に保存しておき、リクエストの終了処理の中でこれをリセットすることで実現されている。

これはしかし、リクエストの処理の中でさらに別スレッドにまたがるような処理が存在した場合に、実行したスレッドごとに変数置き場が作成されることになり、基本的にあまりうまくいかない。結果、1スレッド/1リクエストが強制されてしまう。

[request_store_rails](https://github.com/ElMassimo/request_store_rails) は、 `Thread.current` の中にリクエストidを保持しておき、リクエストローカル参照を行うときには、その id を用いて並列 Map を経由して値を store/fetch することで、この問題の解決を試みる。リクエストの中でスレッドを跨ぎたくなった場合には、 `Thread.current[:request_id]` を子スレッドで親から引き継がせることで、子スレッドからでも現在実行中のリクエストを判別し、リクエストローカルな変数を参照できるようになる。


さて、ここで Sidekiq を Rails のバッチジョブとして利用していて、その中でリクエストローカル変数を利用するようなロジックを記述、もしくは使い回したくなった場合、 sidekiq のワーカーは Rack の middleware を利用しないので、 RequestLocals をうまく利用できないという問題が発生する。理想を言えば、 Sidekiq のジョブ実行のたびに、新しいリクエストローカル変数のコンテキストが生成されてほしい。

これを実装したのが、 [request_store_rails-sidekiq](https://github.com/Yuki-Inoue/request_store_rails-sidekiq)。

# 使い方

TL; DR の通り。ジョブの終わりにスレッドローカル変数をクリアする処理が Sidekiq ミドルウェアとして実装される。 

```ruby:SomeWorker.rb
class SomeWorker
  include Sidekiq::Job

  def perform(*args)
    RequestLocals[:some_key]  # => 最初は nil
    RequestLocals.fetch(:some_key) { value } # => :some_key に値がなければブロックの中身に設定
    SomeService.logic_which_use_request_locals # => RequestLocals を利用するロジックを正しく呼べる

    # RequestLocals を引き継がせるためには、 request_id を指定する。
    request_id = Thread.current[:request_id]
    t = Thread.new do
      Thread.current[:request_id] = request_id
      some_processing
    end
    t.join
  end
end
```
TypeORMのテストでFactoryを使って楽をする

# はじめに

express.jsのコントローラー層のテストやTypeORMエンティティ(モデル)のテストを書く際、
毎回DBデータの作成に結構時間を取られたりしますが、Factoryメソッドを準備すれば
サクサクデータを作成してテストに集中することが出来ます。

**注意**
**MySQLやPostgresqlのよなリレーショナルデータベース用の記事です。**
**MongoDB等には対応していません。**

# やりかた

自分でファクトリーの仕組みを作ってもいいのですが、[typeorm-factory](https://github.com/antonversal/typeorm-factory)という
便利なライブラリがあるため今回はそっちに全乗っかりします。
Railsの~~FactoryGirl~~FactoryBotのようなものです。

## インストール

```bash

npm install --save-dev typeorm-factory
```

## Factoryの作成
テストディレクトリ以下にhelperなり適当なディレクトリを作り、ファクトリーを作っていきます。
モデルが増えてきたら1モデル1ファイルに分割する等、お好みで管理していけばいいと思いますが
ここでは全モデル分1ファイルで定義します。
例として、Comment, Author, Postというエンティティを持っている場合

```ts:factory.ts

import { Factory } from 'typeorm-factory'
// エンティティ(モデル)のComment, Author, Postもインポートしておく

// .attr → 普通のカラムはこれで作ります
// .secuence → ユニーク成約等があるカラムの場合はindexを受取る無名関数を使って一意化出来ます
export const CommentFactory = new Factory(Comment)
  .sequence("text", (i) => `text ${i}`) 
  .attr("authorName", "John Doe"); 

export const AuthorFactory = new Factory(Author)
  .sequence("firstName", (i) => `John ${i}`)
  .sequence("lastName", (i) => `Doe ${i}`);

// .assocMany → toManyリレーション作成。最後の引数で一気に作る数を指定出来ます
// .assocOne → toOneリレーションを作成
export const PostFactory = new Factory(Post)
  .sequence("title", (i) => `title ${i}`)
  .sequence("text", (i) => `text ${i}`)
  .attr("likesCount", 10)
  .assocMany("comments", CommentFactory, 2)
  .assocOne("author", AuthorFactory);

```

## 使う

`create()`メソッドを使うとDBにもデータ作成、`build()`メソッドを使うとインスタンスのみ作成されます。
また、どちらのメソッドも好きなデータで上書きして作成することも出来ます。
一度に沢山作りたければ`createList()` `buildList()` というものもあります。


コードには書いてませんが、DBコネクションがないとエラーになるため事前にコネクションを張って下さい。
jestならbeforeEachかbeforeAllで張ってafterEachかafterAllで閉じる感じでしょうか。


```ts

import { AuthorFactory, CommentFactory } from '../../helpers/factory'

describe('Post', () => {

  describe('someMethod', () => {
    it('なんたらかんたら', async () => {
      // DB作成
      const author1 = await AuthorFactory.create({firstName: "こうやって上書きできます"})
      // インスタンスのみ作成
      const author2 = await AuthorFactory.build()
      // リレーションも上書きできます。この場合はauthor1を親に持ったpostが作られます
      const post= await PostFactory.create({ author: author1 })
      // 一気に作る場合
      const posts= await PostFactory.createList({ author: author1 }, 10)

      // なんやかんやテストする
      // post.someMethod()
      // expect().toBe()
    })
  })
})
```
UnityのUI Image Spriteを動的に差し替える場合はoverrideSpriteフィールドに代入する

表題の通り。

UIスプライトでスクリプトからの差し替えがなんかできないなと思っていたら、そもそもそういうものだった。

これはだめで、

```test.cs
using UnityEngine;

public class EnemyImage : ImageEffects
{
     public void SetImage(Sprite sprite)
     {
          thisImage.sprite = sprite;
     }
}
```

overrideSpriteに代入する

```test.cs
using UnityEngine;

public class EnemyImage : ImageEffects
{
     public void SetImage(Sprite sprite)
     {
          thisImage.overrideSprite = sprite;
     }
}
```


https://docs.unity3d.com/ja/2018.1/ScriptReference/UI.Image-overrideSprite.html
【自分メモ(遂行中)】Webスクレイピングで経営者の言葉を見る

データを扱う仕事をしていきたいとPythonを学び始めたのですが、仕事ではイマイチやりたいことがなくて^^;
IT系の旦那様に励まされつつ、思いつきで進めています。

とりあえず何かを作る、ということが楽しくて仕方ない。(動かないけど)
自分でものを作る、作り変えるということがしたいのです。

### やってみたいこと1　「社長さんの言葉を見える化してみたい」

きっかけは**[トヨタイムズ](https://toyotatimes.jp/)**でした。

トヨタイムズは[Youtubeで会社の新年挨拶会の状況をアップ](https://www.youtube.com/watch?v=vJ8DsIiSb-U)するとか、今まで聞いたことないですけど！？(私が知らないだけかも)とびっくらこきまして。

あと、日産のゴーン氏のニュースが騒がれるにあたって過去はすごい持ち上げてた記憶があったので、経営者の方はどのような言葉を普段使ってきたのだろうか、と見える化してみたいと思いました。
とりあえず可視化したいのでWord_Cloudしたい(ただあれを作ってみたい)。
そして自動車会社の経営者から「自動車」って言葉抜いたらどうなるか、調べてみたい。(word2vecというやつ使ってみたい)

Let's　Start!　(2/16現在未完了 )

#### 環境
・Windows10 64bit
・Anaconda　(jupyter notebookで書いてます)
・Python　3.7.1
他入れたライブラリはQiitaで先人が書かれた記事を参考にしています。
(なんかいろいろしてた気がするので環境がもう思い出せない。。。)

あとPython自体の勉強は[Paiza](https://paiza.jp/)と[Progate](https://prog-8.com/)で学んでいます。

#### やったこと1
・トレーニングとしてまずHPの社長挨拶から本文を抜き出したい

こちらを参考にさせていただいています
https://teratail.com/questions/75241

```python:WebScrapingTextOnly.py
# coding: UTF-8
import requests
from bs4 import BeautifulSoup, Comment

url="https://～"

response = requests.get(url)
response.encoding = response.apparent_encoding

html=response.text

soup = BeautifulSoup(html, "lxml")

# styleタグの除去
for style in soup.find_all('style', src=False):
    style.decompose()

# コメントタグの除去
for comment in soup(text=lambda x: isinstance(x, Comment)):
    comment.extract()

# scriptタグの除去
for script in soup.find_all('script', src=False):
    script.decompose()

# テキストだけの抽出
for text in soup.find_all(text=True):
    if text.rstrip():
        print(text)
```

urlのところは私は今回https://www.toyota.co.jp/jpn/company/message/ にしました。
※なんか出力結果の頭にhtmlがつくのですが細かいことは気にしないことにします。

年度違いとか、同業種他会社とか、月に行く方とかいろいろ取ってみたい。


#### やってること2「txtファイルに書き出す」
作成中。

#### やること3「関数化して再利用可にする」
#### やること4「書き込み前に/ファイルから読んで、可視化して意味がありそうな単語を抽出する」
#### やること5「Word Cloudで見える化する」
こちらを参考にさせて頂く予定
https://qiita.com/kenmatsu4/items/9b6ac74f831443d29074
#### やること6「各社の製品・サービスを表現する言葉を抜いたらどうなるか調べる」

タイミングよくAmazon Prime Videoの「本日は、お日柄もよく」を見ました。スピーチライターという職業もあるのですね。
【GoogleAppsScript】URLで指定したスプレッドシート情報を二次元配列で取得する

# 作成目的
- 特定のスプレッドシート情報を二次元配列で取得する必要が出たため作成

# 手順／方法
1. 指定のスプレッドシートオブジェクトを取得する
    - URL指定で取得   → `SpreadsheetApp.openByUrl('指定のURL')` を使用する
    - URL未指定で取得 → `SpreadsheetApp.getActiveSpreadsheet()` を使用する
2. 二次元配列を準備する
3. 以下の情報を取得し、配列の ` pushメソッド ` で二次元配列へ順々に入れていく
    - 現在日時
    - スプレッドシート ファイル名
    - ログインユーザーメールアドレス
    - スプレッドシート URL
    - スプレッドシート 全シート名
4. 最終的に、` return ` で取得したスプレッドシート情報を二次元配列でかえす

# 具体例
- 他の関数内で ` getSpreadsheetInfo('https://docs.google.com/spreadsheets/d/?????/xxxxx');` とすれば、使い回すことができます

```javascript:get_spreadsheet_info.gs
/*
* スプレッドシートの情報を取得する
*
* @param  {string} 情報取得するスプレッドシートURL
* @return {array}  二次元配列
*
* TODO: 今後、他の情報取得も随時追加する
*/

function getSpreadsheetInfo(target_spreadsheet_url) {

  // パラメータ未指定の場合、本スクリプトを実装したスプレッドシートを対象とする
  if(!target_spreadsheet_url){
    var target_spreadsheet_object = SpreadsheetApp.getActiveSpreadsheet();
  } else {
    var target_spreadsheet_object = SpreadsheetApp.openByUrl(target_spreadsheet_url);
  }
  
  // 二次元配列を準備する（初期化）
  var spreadsheet_info = [[]];
  
  // 現在日時
  var notification_date = Utilities.formatDate(new Date(), 'JST' , 'yyyy/MM/dd HH:mm:ss');
  spreadsheet_info[0].push(notification_date);
  
  // スプレッドシート ファイル名
  var spreadsheet_name = target_spreadsheet_object.getName();
  spreadsheet_info[0].push(spreadsheet_name);
  
  // ログインユーザーメールアドレス
  var objUser = Session.getActiveUser();
  var active_user_mail_address = objUser.getEmail();
  spreadsheet_info[0].push(active_user_mail_address);
  
  // スプレッドシートURL
  var spreadsheet_url = target_spreadsheet_object.getUrl();
  spreadsheet_info[0].push(spreadsheet_url);

  // スプレッドシート 全シート名
  var sheets_object = target_spreadsheet_object.getSheets();
  var sheets_name   = '';
  if (sheets_object.length >= 1) {
    for(var i = 0; i < sheets_object.length; i++){
      sheets_name += "|" + sheets_object[i].getName();
    }
  }
  spreadsheet_info[0].push(sheets_name);

  
  return spreadsheet_info;

}

```
TDPC-E「数」

- [数](https://atcoder.jp/contests/tdpc/tasks/tdpc_number)

## 解法

- [Digit Sumのコード](https://atcoder.jp/contests/dp/submissions/4275285)をコピペする
- KとDの入力順序を入れ替える
- [この記事](https://qiita.com/nomikura/items/bfed11ad771db76f43ab)と同じことしてる
[Laravel] PHPUnitのdataProviderでfactoryやファサードを使う方法

# 問題点

PHPUnitのdataProviderでfactoryを使おうとすると
`Unable to locate factory with name [user_1] [App\Models\User].`
こんな感じでWarningが出てうまくいきませんでした

# 解決方法？

調べてみるとこんな記事が出てきました
https://stackoverflow.com/questions/45139843/using-factory-in-phpunit-provider-fails
つまりdataProviderで
`$this->createApplication();`
もしくは
`$this->refreshApplication();`
を呼べばいいらしい(refreshApplicationはcreateApplicationを呼んでるだけなのでどちらも同じ)

# 再度問題点

テストクラスの中に、dataProviderのメソッドがある場合はこの解決方法で問題ないですが
テストクラスが巨大になるのが嫌なので、自分はよくdataProviderだけで別クラスにしたりしてます
その場合、そのまま上記メソッドを呼ぶことはできません

# 最終解決方法

createApplicationはCreatesApplicationというトレイトになっているのでインポートすれば呼べるようになります

```DataProvider.php
namespace Tests\Unit\DataProvider;

use Tests\CreatesApplication;

class DataProvider
{
    use CreatesApplication;

    public function __construct()
    {
        $this->createApplication();
    }
}
```
こんな感じでdataProviderのベースクラスを作って継承すれば楽だと思います
ファサードについても同様の問題があるのでこれで解決できます
WSLのディストリビューションが突然消えた


# これは何？
WSLのディストリビューションが突如吹っ飛んだので復旧させたメモです。
最終的に解決しましたが、特に賢い解決法は出てきません。

# 環境とか

* Windows10 pro 64bit
* 入れてたWSLディストリビューション
    * WLinux Enterprise
        * メインで使ってた
    * Ubuntu
        * LongTermSupportじゃないやつ
    * WLinux

# WSLのディストリビューションが無い
いつも通り``bash``コマンドを実行したところ、こんなことに

```
PS C:\> bash
Windows Subsystem for Linux には、ディストリビューションがインストールされていません。
ディストリビューションは Microsoft Store にアクセスしてインストールすることができます:
https://aka.ms/wslstore
続行するには何かキーを押してください...
```

またまた…と思って``wslconfig``でも確認

```
PS C:\> wslconfig /l
Windows Subsystem for Linux には、ディストリビューションがインストールされていません。
ディストリビューションは Microsoft Store にアクセスしてインストールすることができます:
https://aka.ms/wslstore
続行するには何かキーを押してください...
```

# いろいろ試した

### ``bash``コマンドではなく普通に起動
こんな感じでダメだった。

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/145628/095d5a70-26fb-25d1-7520-fd3b1cf5d690.png)

```
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x800703fa
Error: 0x800703fa ????????????????????? ???????????????????????

Press any key to continue...
```

### 一度アンインストールしようとした
こんな感じでエラー。
ただ、結果的にアンインストールできてたっぽい。

![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/145628/5b50c1eb-a704-6e33-340a-2777d378b276.png)

```
PS C:\> lxrun /uninstall
警告: lxrun.exe は、レガシの Windows Subsystem for Linux ディストリビューションを構成するためだけに使用します。
ディストリビューションは Microsoft Store にアクセスしてインストールすることができます:
https://aka.ms/wslstore
```

### MicrosoftStoreからインストールし直そうとした
なんかサインインできなかった。
でもこれは別の問題かも。
![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/145628/0d64a3e3-c520-ebf6-ad40-e0d17b92850a.png)

# 最終的に解決するためにしたこと
この辺のことをやったら、最終的に復活しました。

* WindowsUpdateで最新にする
* ``wsreset``の実行(Storeへのログインはたぶんこれで解決した)
* サービスから``LxssManager``を再起動
* PCも再起動した
* MicrosoftStoreからあらためてディストリビューション取得

# 所感
[githubのこのissue](https://github.com/Microsoft/WSL/issues/2576)を参考にしました。
それなりに長期間に掛けて報告上がってるし、「結局、再起動して直ったわ～」って人も多いし、この先も遭遇する可能性ありそうに思いました。
Fakerのダミーデータを確認する方法

# Fakerがどういうデータを生成しているか確認したい
Fakerの[README](https://github.com/stympy/faker)を読んでもどのメソッドを使えば良いかわからない、
日本語に変換した際にしっかり変換できているか確認したい。

ということで、Fakerのメソッドを実際に実行して試す方法をまとめました。

# 確認方法

`rails console`で確認ができます。

Fakerをテスト環境にしか入れていない場合は、
`rails c -e test` でテスト環境を指定してrails consoleを起動します。

起動したら確認したいメソッドを使用してあげれば
どのようなデータを生成しているか取得することができます。

<img width="289" alt="スクリーンショット 2019-02-16 15.25.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/331247/587a9471-bf21-4509-e105-e68cf6544b80.png">
python入門(6)~集合~

#集合
集合とは重複しない要素をグループに分けて扱う型のことです．
##他の型からの変換
set()を使うことによって他の型から集合を作ることができます．

```python:set1.py
a = set('JAPAN')
list = [3, 6, 23, 8]#リスト
b = set(list)
print(a)
print(b)
```

```text:実行結果
{'A', 'P', 'N', 'J'}
{8, 3, 6, 23}
```
##要素数の取得
len()を使うことによって要素数を取得することができます．

```python:set2.py
a = {'A', 'B', 'C', 'D', 'E'}
length = len(a)
print(length)
```

```text:実行結果
5
```
##値の有無の判別
値の有無の判別にはinを使います．

```python:set3.py
a = {'c', 'java', 'python'}
chk1 = 'python' in a
chk2 = 'swift' in a
print(chk1, chk2)
```

```text:実行結果
True False
```
##集合演算

||演算子|メソッド|
|:-:|:-:|:-:|
|和集合　　　|｜|union()|
|差集合　　　|- |difference()|
|積集合　　　|& |intersrction()|
|排他的論理和|^ |symmetric_difference()|
|部分集合   |<=|issubset()|
|部分集合   |< ||
|上位集合   |>=|issuperset()|
|上位集合   |> ||
|互いに素   |   |isdisjoint()|
|等しい     |==||

```python:ope.py
ob = {'java', 'php', 'python', 'c#', 'c++'}
c = {'c', 'c#', 'c++'}
script = {'javaScript', 'ruby', 'php', 'python'}
#和集合
sum = ob | c #sum = ob.union(c)
print(sum)
#差集合
sub = ob - c #sub = ob.difference(c)
print(sub)
#積集合
pro = ob & script #pro =ob.intersection(script)
print(pro)
#排他的論理和
xor = ob ^ c #xor = ob.symmetric_difference(c)
print(xor)
#部分集合
part = c <= ob #part = c.issubset(ob)
print(part)
#互いに素
a = c.isdisjoint(script)
print(a)
```

```text:実行結果
{'python', 'c', 'php', 'c++', 'java', 'c#'}
{'python', 'java', 'php'}
{'python', 'php'}
{'python', 'java', 'php', 'c'}
False
True
```
実行結果のように論理和や論理積などは集合の値が出力されますが，部分集合などではTrueかFalseが返されます．
##最後に
少しずつ学んでいきましょう．
Google Apps Scriptのメモ

ローカルのデータ→グーグルドライブ→グーグルスプレッドシートみたいな感じでcsvデータを移そうとしたのでその時のGoogle Apps Script関連のメモになります。

#Utilities.parseCsvはデータ数が多すぎるとparseできない？
5000行くらいのデータをパースしようとしたらエラーを吐かれました。だめだめです。

仕方ないので以下のURLの関数を参考にしました。
https://officeforest.org/wp/2018/11/25/google-apps-scriptでcsvファイルを取り扱う/

ここでも
```The number of columns in the data does not match the number of columns in the range. The data has 1 but the range has 6.（行 60、ファイル「コード」）```
ってエラーが出てきて頭抱えました。

エラーが出ると途中で処理が止まるのでループが止まってしまう‥と困っていたのですがじゃあエラー出てもいいからその関数を複数回実行すればいいじゃんってなったので解決しました（解決はしていない）

##時刻について
https://sites.google.com/site/gasgaidobukku/utilities/formatdate
HHだと24時間表示になる。まじかよ。
Elm でクイックソート

# tl;dr
Elm 言語で QuickSort をやるのです｡

# Haskell を勉強したのを思い出しながら...
```elm
import Html

-- Quicksort
toShow = quickSort [3,1,4,5,9,2,6,0,8,7]
quickSort list =
    case list of
        [] -> []
        x::xs ->
            let
                smallerList = List.filter ((>=) x) xs
                largerList = List.filter ((<) x) xs
            in
                quickSort smallerList ++ [x] ++ quickSort largerList

-- チェック
main
    = toShow
    |> Debug.toString
    |> Html.text -- [0,1,2,3,4,5,6,7,8,9]
```

# 答え合わせ
["Learn You an Elm" -> "Hello Recursion!" -> "Quick, sort!"](https://learnyouanelm.github.io/pages/05-recursion.html#quick-sort)

# 結語
アルゴリズムの勉強やると､一番最後に学ぶのが QuickSort なんだが... まぁ､良いとしよう!再帰的に学ぶのもの､悪くないでしょ!たぶん｡
CoffeeScript2でDynamic Importする方法

(この人、2019年になってもまだCoffeeScriptつかっている・・・。)

## `Dynamic Import`って？

モダンブラウザで使える、必要になったときに非同期でモジュールをインポートできるやつです。
以下のように使えます。

```js:javascript
import("jsziptools/zip").then((zip) => {
  zip.unpack(hoge)
})

// or

async function foo() {
  const zip = await import("jsziptools/zip")
  zip.unpack(hoge)
}
```

## CoffeeScript2で

`Dynamic Import`はCoffeeScript2ではまだ実装されていません(v2.3.2時点)。
なので[Embedded JavaScript](https://coffeescript.org/v2/#embedded)機能を使う必要があります。
CoffeeScript2では``` `` ```で囲った部分がJavaScriptとして解釈されます。
なので上記のJavaScriptの例はCoffeeScript2では以下のように書けます。

```coffeescript:CoffeeScript2
`import("jsziptools/zip")`.then (zip) =>
    zip.unpack(hoge)

# or

foo() ->
  zip = await `import("jsziptools/zip")`
  zip.unpack(hoge)
```

以上です。
コマンドラインでstandaloneなsassコンパイル環境を構築

たまーにCSS触るだけなのに、その都度、依存関係と環境変化が早すぎるフロントエンド界隈に翻弄されるのが鬱すぎたので、standaloneなsassコンパイラ+Makefile環境を整えたメモ。

-------

公式曰く、standalone compiler あるよ！dartで書かれてるよ！
https://github.com/sass/dart-sass

ということで、releaseタブから落としてみた。

ふむ、早速ドキュメントガバってるみたいで、なぜかフロントエンドのスクリプトが二種類ある。
dart-sass, sass 中身をみると、前者は deprecated のようで後者を使えらしい。

実体は src/ にあるようで、Flex SDKとか、あの手のフォルダごと配置しろよパターン。

故に、手動でやるなら、 /usr/local/ に cloneした上で、パス通すのが良いのだろう。

なお macOSの場合は、brewで入る & パス通してくれるっぽいので、brew で入れるのが楽ですね。

ということで、下記のようなmakefileを書いて、makeでsassコンパイルを出来るようになりました。

```
###########################################################################

.SUFFIXES : .scss .css

###########################################################################

OUTPUT_STYLE ?= compressed

CSS = ${TARGET_SCSS_FILE}

###########################################################################

default:

all: ${CSS}

clean:
    rm *.css
    rm *.css.map

.scss.css:
    sass -s ${OUTPUT_STYLE} $<:$@

###########################################################################
```

### 余談

brewしたら昔いれたsassが残ってて、overwirteしないとダメだった。
昔のbrewで入れてた sass compiler は ruby 依存だったみたいで、今や ruby環境違いで動かない。
ツール系が、依存の少ない、goとかdartといった言語に移行してくれるのは良いことだ。

自分では、ついPHPで適当なバッチとかツールとかその場凌ぎ優先で書いちゃうけど、先々考えたら、環境依存しずらい、シングルバイナリを吐ける言語で書くようにした方がいいんだろうなぁ、、と。
JavaScriptで画像切り替えを簡単に行う方法

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているryota_miraidenshiです。
今回は課題でJavaScriptを使った機能として画像切り替えに挑戦したのですが、自分で調べているとJavaScript初心者には難しいコードやコピペしたら使えると書いておきながらもうまく機能しないものなど多数ありましたのでこの記事が役立つことを期待します。

#コードを書く前に言葉で理解しよう
今回書くコードをまず言葉で理解しておきましょう。
まず最初に、はじめの一枚をいつものようにimgタグを使って表示しておきます。
ここからJavaScriptを使っていきます。
まず今回表示する画像を配列として保存しておきます。
あとはこの配列の中から表示する画像を切り替えていくイメージです。
つまり**配列の要素を切り替えることができれば画像が変わる**ということです。
では、どのようにしたら配列の要素を切り替えることができるのか。
それは簡単で、インデックスを定義してインクリメントしていくだけです。
例えばインデックス[0]を表示していて、インデックス[1]を表示したいのならばインデックスをインクリメントしてあげればいいですよね。
ただこれだけで切り替えていくことができます。

#コードの理解

```index.html
<img id="mypic" src="image1.jpg" width="400" height="300">
            <script>
              var pics_src = new Array("image1.jpg","image2.jpg","image3.jpg");
              var num = -1;

              slideshow_timer();

              function slideshow_timer(){
                  if (num == 2){
                      num = 0;
                  }
                  else {
                      num ++;
                  }
                  document.getElementById("mypic").src=pics_src[num];
                  setTimeout("slideshow_timer()",3000);
              }
            </script>
```

言葉で理解した後にコードを見れば理解しやすいのではないでしょうか？
インデックスのインクリメントするために関数を定義しています。
その中でdocument.getElementById(id).srcに次に表示したい画像の名前を配列から取り出して代入してあげるだけです。

#終わりに
ネットで調べて上の方に出てくるサイトのほとんどがうまくいかずに意外と苦労しましたのでこれが参考になればと思います。
プログラム初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正しますのでどんどん指摘してください。