OmniAICreator/Qiita-1.07M huggingface dataset:
DOM操作するライブラリの非公開関数もrewireとJestでユニットテストしたいよ〜

# 問題
JS/TSで公開されてない関数(non-exported function)のテストは[rewire](https://github.com/jhnns/rewire)を使えばできるんですが、その関数内でDOM操作をしてるとき、`document`が`undefined`で`createElement()`なんてないぞ！と怒られるんですよね。

# 解決
はい！　[jest-environment-jsdom-global](https://github.com/simon360/jest-environment-jsdom-global)〜〜！！

端的に言うと、これを使えばJestが提供するJSDOMインスタンスにアクセスできるので、それをライブラリへ伝えることができるんですよね。

もうちょっと詳しく言うと、`jest-environment-jsdom-global`はJestが標準で使っている`jest-environment-jsdom`を継承してJSDOMインスタンスを露出させただけのものです。

次の例は`nodeToDOM()`というDOM操作する非公開関数をテストしたものです。

```typescript:myModule.spec.tsx
import rewire from 'rewire'
import { JSDOM } from 'jsdom'
declare var jsdom: JSDOM

describe('myModule', (): void => {
  const myModule = rewire('../dist')
  myModule.__set__('document', jsdom.window.document.defaultView.document)
  const nodeToDOM = myModule.__get__('nodeToDOM')

  it('nodeToDOM()', (): void => {
    const node = <meta name="description">Meta</meta>

    const el = document.createElement('meta')
    el.setAttribute('name', 'description')
    el.textContent = 'Meta'

    expect(nodeToDOM(node)).toStrictEqual(el)
  })
})
```
ポイントは`myModule.__set__()`ですね。ここでライブラリ内グローバル変数`document`にJSDOMの提供するものを当てています。

`window`が必要ならば`jsdom.window.document.defaultView`を、というように必要なものを適宜割り当ててください。

`import { JSDOM } from 'jsdom'`と`declare var jsdom: JSDOM`はJavaScriptのときは要りません。TypeScriptに「`jsdom`なんていうグローバル変数なんて無いぞ！」と怒られないように付けています。


# おまけ
サンプルコードはTypeScriptですが、`rewire`と`@types/rewire`をインストールして、TS→JS変換後のモジュール(`dist/index.js`)を`rewire()`するだけで動きました！
Nimでlambda式

Nimでlambda式(無名関数)を書く方法です。

おそらく無名関数はmapで使うことが多いと思われます。
そこで例として、リスト`[1, 2, 3, 4, 5]`をそれぞれ+1して`[2, 3, 4, 5, 6]`とするシンプルなコードを書いてみましょう。

分かりやすいように、先にPythonのソースコードも載せて置きます。

# Python
```python3:python3
add_one = lambda x: x + 1
add_one(1)  # 2


l = range(1, 6)  #  [1, 2, 3, 4, 5]
new = map(lambda x: x + 1, l)  #  [2, 3, 4, 5, 6]
```
こんな感じで、`lambda [引数]: [戻り値]`とすることで無名関数を作れます。

# Nim
ここからが本題です。

## proc

Nimで関数を定義する際はprocを書きますが、関数名をそのまま省略することで無名関数を作れます。

```nim:proc
from sequtils import map
let add_one = proc(x: int): int = return x + 1  # これ。意外と簡単でしょ?
1.add_one # 2
let add_one_simple = proc(x: int): int = x + 1  # returnを省略
1.add_one_simple  # 2


let l = @[1, 2, 3, 4, 5]
l.map(proc (x: int): int = return x + 1)  # @[2, 3, 4, 5, 6]  : seq[int]
l.map(proc (x: int): int = x + 1)  # returnを省略。3行目と同じ
```
2, 4, 8, 9行目のように、関数名を省略してワンライナーで定義してあげればOKです。returnは省略できます。Pythonのlambdaと同じですね。
`proc ([引数名]: [引数の型]): [戻り値の型] = 戻り値`
と書いてあげるだけです。

## sugar

sugarを使うともっと簡潔に書くことができます。

```nim:sugar
let add_one = (x: int) => x + 1
1.add_one  # 2

let l = @[1, 2, 3, 4, 5]
# 型推論可能なら引数の型は省略できる
l.map(x => x + 1)  # @[2, 3, 4, 5, 6]  : seq[int]
```

`([引数]: [引数の型]) => 戻り値`
と書くだけで済むので、シンプルで見やすいですね。
【Python】 プロジェクトオイラー　Problem 2

#### <i>フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.

#####1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
####数列の項の値が400万以下の, 偶数値の項の総和を求めよ.</i>

Problem1は**[こちら](https://qiita.com/projecteuler/items/4fb4cafe8ecf63897ab5)**から

2問目にして知らない単語が...フィボナッチ数列とは...

[https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0:title]


ここに書いてること曰く

上の「1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...」で考えるとすると、

1+2で3、2+3で5、3+5で8、5+8で13、8+13で21...

みたいに1つ目の項と2つ目の項を足して、出てきた値を2つ目の項と足して、出てきた値をさっき出てきた値と足して...

文字にすると途端にややこしくなったけど何とかなりそう。

とりえずフィボナッチの条件は

######1.aとbという変数を用意してそれぞれに1と2を代入して

######2.足した値をcという変数に代入して

######3.a = b と b = c としてそれを繰り返す

これでフィボナッチ数列ができているはず。

今のところは終わる条件を指定しないでwhile関数を使ってみる

```python
a = 1
b = 2
while :
        c = a + b
        a = b
        b = c
```

とかでいいのかと思ったら、

条件なしで無限ループさせるときはwhile True: という物を使うらしいので

```python
a = 1
b = 2
while True:
        c = a + b
        a = b
        b = c
```

でいいと思う。

確認してみる

```python
a = 1
b = 2
c = 0
while c < 30:
        c = a + b
        print(c)
        a = b
        b = c

3,5,8,13,21,34
```

これでcが30よりも小さいときのみループする文になったのだが...

34が出てきている理由はprint(c)の位置がおかしいからかな

ともかく、フィボナッチ数列をプログラム化できた。

ここにきてやっとProblem2の問題の答えを出す手順を考える

######1.whileの条件式を c が400万以下のときのみループするようにして
######2. c が偶数のときのみ答えとする変数に合算する

これでできるはず。

偶数の時のみ合算するのはProblem1のときみたいにif関数で条件を作ればいいかな

というわけで部分ずつ作っていく

```python
a = 1
b = 2
c = 0
while c < 4000000:
        c = a + b
        a = b
        b = c
```

これで400万以下に指定して

```python
        if c % 2 == 0:
                kotae += c
```

これで c が偶数の時のみkotaeという変数に足していきます。

実行してみる

```python
a = 1
b = 2
c = 0
kotae = 0
while c < 4000000:
        c = a + b
        a = b
        b = c
        if c % 2 == 0:
                kotae += c
print(kotae)

4613730
```

当たっているのだろうか

[http://kingyojima.net/pje/002.html:title]

正解は4613732だから間違えているっぽいけど...

2足りないだけだからほぼあっているはず

いろいろ調べてみた結果

######フィボナッチ数列は1+1から始まる

らしい...

ビックリするくらい根本的な問題だったので、b＝1にして再計算する

```python
a = 1
b = 1
c = 0
kotae = 0
while c < 4000000:
        c = a + b
        a = b
        b = c
        if c % 2 == 0:
                kotae += c
print(kotae)

4613732
```

あってたーー

Problem4は**[こちら](https://qiita.com/projecteuler/items/3f1bdb3e7d9fd1ff2def)**から

**Problem3はまだ解けていません！！　ごめんなさい！**
C# での名前付き Mutex の待ち方

試した結果、このコードが望み通りの動作になりました。

```csharp
	using (var mutex = new Mutex(false, "名前"))
	{
		mutex.WaitOne();
		try
		{
			// 処理
		}
		finally
		{
			mutex.ReleaseMutex();
		}
	}
```
GitLabからGitHubへリポジトリをMirroringする方法

もともとGitLabにあげていたものをGitHubにも反映させたいと思いやってみたので備忘録として残しておきます。
#GitHub上でミラー先の新規のリポジトリを作成する
適当な名前を付けてPublicでCreate repositoryします。
<img width="1440" alt="スクリーンショット 2019-07-02 12.11.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405786/115e69dd-5b8e-4bbd-3bb7-e2359f4c39a4.png">
#GitLab上でMirroringの設定をする
主なやり方は公式を参考にしました。
<img width="1440" alt="スクリーンショット 2019-07-02 13.17.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405786/ebfc0121-2e66-a374-e9ae-90b926d3ab9d.png">
まずはGitLab上でのMirrorしたいリポジトリの「Settings」→「Repository」を選択します。
そしてその中の「Mirror a repository」を開きます。
<img width="1440" alt="スクリーンショット 2019-07-02 12.23.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405786/891c10f5-06d7-84ab-4e27-959e24314784.png">
とここで先程作ったリポジトリのURLを指定するのですが少し注意が必要で、GitHubからURLをコピーしたものを指定するとエラーになってしまいます。（自分もここでエラーになりました、、、）
URLは指定されている通り
`https://username@gitlab.company.com/group/project.git.`
この形で指定する必要があります。（基本的にはコピーしたURLにhttps://の後にユーザ名@を追加するだけで良さそう）
次に「Mirror direction」の欄で「Push」を選択します。
そして「Password」の設定をするのですが、ここで指定するパスワードはGitHubのログインに使用するパスワードではなく「personal access token」を使用します。
personal access tokenの取得の仕方は公式のページを参考に取得します。
[アクセストークンの取得方法の参考ページ](https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line)
取得したアクセストークンをパスワードに指定し、チェックボックスには特にチェックを付けずに緑の「Mirror repository」を押して設定完了です。
【XSLT】XSL入門

#XSLとは

[参考記事](http://e-words.jp/w/XSL.html)によると

>XSLとは，XML文書の構造を別の形式に変換するためのルールを記述することができる言語
異なる構造のXML文書に変換したり、HTMLやCSVなど別のデータ形式に変換したり、データの一部の置換や移動などを行なうことができる

超ざっくりとしたイメージ↓

**XML --> SXLで変換 --> XML(XHTML)**



#とにかく実行してみよう
![スクリーンショット 2019-07-02 17.15.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/1424834a-41eb-43df-3fdb-5294824cf978.png)


左が**XSL**，右が**XML**
<img width="491" alt="スクリーンショット 2019-07-03 9.09.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/1c1197d4-8463-7a27-3562-f999a1d21078.png">
XMLファイルをFireFoxで開く
<img width="772" alt="スクリーンショット 2019-07-02 17.16.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/809e910f-bc90-18d1-5b0f-6a970a7a4d3f.png">

XMLがXSLによって変換されました．

#コード
同ディレクトリ内に置いて実行してみてください

```xml:cdcatalog.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
      <th>Country</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
      <td><xsl:value-of select="country"/></td>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>
```

```xml:cdcatalog.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
  <cd>
    <title>One Time</title>
    <artist>Justin Bieber</artist>
    <country>Canada</country>
  </cd>
  <cd>
    <title>My heart will go on</title>
    <artist>Céline Dion</artist>
    <country>Canada</country>
  </cd>
  <cd>
    <title>We Are Never Ever Getting Back Together</title>
    <artist>Taylor Swift</artist>
    <country>USA</country>
  </cd>
</catalog>
```

ちなみに，Google Chrome だとうまく表示されないです．

XSL動かす方法は他にもありますが

[FireFox](https://www.mozilla.org/ja/firefox/new/)とっちゃうのが一番手取り早いです．




#XPath
[XPathの説明はこのページが超わかりやすいです](https://qiita.com/rllllho/items/cb1187cec0fb17fc650a)

#GitHub

#参考・引用
https://www.w3schools.com/xml/xsl_transformation.asp
http://e-words.jp/w/XSL.html
https://takuya-1st.hatenablog.jp/entry/2015/08/31/120000
https://webbibouroku.com/Blog/Article/xpath
【Unity(C#)】Edtitor拡張でコンポーネントを一括削除

##コンポーネント 一括削除
私がよくやるのは
**こいつらRigidbodyやらBoxColliderいらないのに！誰だよつけたの！**
ってやつです。

もちろん自分でつけました。

そうでなくとも、Assetに入っているQuadやCubeを大量に組み合わせて作られたオブジェクトなどを利用したい場合、
このコンポーネントいらないな～ってことがあるかと思います。

そんなこんなでコンポーネント一括削除を実装しました。

今回はタイトル通りEdtitor拡張で
**ボタンを押したら実行される**というものを作りました。


##コード
今回は親オブジェクトにアタッチしたスクリプトが自身の子オブジェクトを確認しに行くという実装で行いました。
なのでScene上に存在する全てのオブジェクトのコンポーネントを一括で削除するというものではありません。

```C#:一括削除したいコンポーネントを持つオブジェクトの親にアタッチ
using UnityEngine;
using UnityEditor;

public class RemoveComponentInChild : MonoBehaviour {

    [Header("削除したいコンポーネントを文字列で指定"),SerializeField]
    string componentName;

    //コンポーネントを取得して該当コンポーネントを削除
    void GetComAndDes()
    {
        Component[] components = GetComponentsInChildren<Component>();
        foreach(Component component in components)
        {
            if (component.GetType().Name == componentName)
            {
                DestroyImmediate(component);
            }
        }
    }

#if UNITY_EDITOR
    [CustomEditor(typeof(RemoveComponentInChild))]
    public class ExampleInspector : Editor
    {
        RemoveComponentInChild rootClass;

        private void OnEnable()
        {
            rootClass = target as RemoveComponentInChild;
        }

        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            if (GUILayout.Button("一括削除"))
            {
                // 押下時に実行したい処理
                rootClass.GetComAndDes();
            }

            serializedObject.Update();
            serializedObject.ApplyModifiedProperties();
        }
    }
#endif
}
```

下記の箇所で行っていることは
**①子オブジェクトの全てのComponentを取得**
**②指定した名前と取得した名前が一致しているか判定**
**③一致していたら削除**
になります。

```C#
    //コンポーネントを取得して該当コンポーネントを削除
    void GetComAndDes()
    {
        Component[] components = GetComponentsInChildren<Component>();
        foreach(Component component in components)
        {
            if (component.GetType().Name == componentName)
            {
                DestroyImmediate(component);
            }
        }
    }
```

ちなみに、`Destroy`はEdtiorModeでは使えないので`DestroyImmediate`を使っています。

Inspectorはこうです。
![AllDelete.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/ee684ddd-1554-33ad-9d2c-0c7e908bcf04.png)


##Shiftで選択して消せばいいじゃん
おっしゃる通りです。

しかし、Shiftの場合、一つでも消去したいコンポーネントを持たないオブジェクトを選択してしまったら消すことができません。

なのでうまく使い分けるといい感じにプログラマーっぽくなってすごくいいと思います(語彙力)。

---
####参考リンク
[GameObjectについている全てのコンポーネントを取得する](http://mrstar-memo.hatenablog.com/entry/2014/01/02/140821)
TECH DAY -11  事前学習

勉強した項目：事前学習　HTML/CSS概要　最低限の文法
時間： ４：００
内容：

###【事前学習】
　　　•カリキュラムの進め方および概要、勉強方法など。
　　　•事前のPCの設定とソフトのインストール
　　　•学習のポイント
　　　•効率の良い復讐方法（自分なりにルールを決めたい）

###【HTML/CSS】
　　　・webページは`HTML/CSS`という言語にて作成されている
　　　・`HTML`は、箱やテキストの存在を定義する言語
　　　・`CSS`は、箱やテキストを装飾するための言語

###【HTML】
　　　HTMLの構造について
　　　　→開始タグ、終了タグ、要素のタイプから成り立つ
　　　　ファイルの新規作成　→　`commandキー + n` 
　　　　ファイルの保存（上書き含む）　→　`commandキー + s`

　　　属性について
　　　　→HTMLは大きく分けるとhead要素とbody要素という部分で構成される
　　　　　head要素は、メタ情報と呼ばれるサイト自体に関する情報を定義（見た目反映なし）
　　　　　body要素は、箱の構成やテキストなど、実際に見た目に大きく反映


      <!DOCTYPE HTML>はHTMLを構成する上での定義、一番上に置く

　　　　`<meta charset="UTF-8">`は
　　　　　meta要素は、文章に関する情報を指定する
　　　　　`主流はUTF-8`

　　　　　コメントアウトとは、htmlに記述しても反映されない文字
　　　　　範囲を指定して
　　　　　　　　　　`command + /`　　でコメントアウトになる

　　　ブラウザにHTMLを表示させるまで
　　　　→`.html`拡張子をブラウザにドラッグ&ドロップにて表示

　　　HTMLの箱について
　　　　→`ブロック要素`は、ウィンドウの左右いっぱいに表示され、
　　　　　上下に改行が入る。　長方形の長い箱のイメージ
　　　　→`インライン要素`は、テキストを装飾　
　　　　　インライン要素は連続して横に並ぶ

　　　段落の作り方
　　　　→段落は`<p>`要素
　　　
###【CSS】
　　　CSSのポイント
　　　　→あくまでHTMLの`装飾`

　　　CSSをHTMLに読み込ませるまで
　　　　→htmlのheadタグ内に

```
<link rel="stylesheet" href="style.css">
```

　　　　　を入れ込む
　　　　
　　　`セレクタ`について
　　　　→基本の形は　
　　　　　　　　`セレクタ` `{ プロパティ: 値; }`
　　　　　意味はセレクタ`（場所）`に値`（色、数値）`をプロパティ`（適用）`させる

　　　`idセレクタ`、`classセレクタ`について
　　　　→全体の中で1つしかない要素であることを明示する場合は`id`を使う

　　　　→複数の要素に一括でCSSを当てたいときは`classセレクタ`を使う

　　　文字色を変えてみる
　　　　→CSSにてセレクタの基本の形にて色を変える
　　　　　例としてp要素を赤にする
　　　　　　`p{color:red;}`
     　　これでp要素の部分が赤文字に変化する
　　　　
まとめ：初めての事前学習と聞きなれない言葉があるが、まずは慣れる必要がある。
　　　復習の時間は終了後の次のカリキュラムの前に必ず振り返ること。
　　　一つづつ１００％での理解を求めると、思うように進まないで時間だけが過ぎてしまう。
　　　よって、１回目は６割で流すくらいで、いいだろう。何回も繰り返し回すことが重要だ。
Chromeの拡張機能、Autofillを使う

#いきさつ
プロジェクトのテスト中に似たようなデータを画面上で沢山作る必要があった。
Autofillは各項目を自動入力したい時に使える。


#Autofillを使うまでの流れ

**1. AutofillをChromeに追加する**
https://chrome.google.com/webstore/detail/autofill/nlmmgnhgdeffjkdckmikfpnddkbbfkkk

上記のURLからAutofillを追加


**2. 入力情報を保持したい画面で右クリック**
![iOS の画像 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358229/62e2d2aa-99d2-0adb-e0bf-3773945f31ee.jpeg)

保持しておきたい情報を全て入力し、
Add rules for this page...  をクリック


**3. 画面上部にて・・・**
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358229/fa9376a2-b901-941c-6853-1cb8e485df9c.png)

画像のようなバーが表示されるので、Choose a Profile のプルダウンメニューから「NEW」を選択
↓
ファイル名を入力
↓
Generate Autofill Rulesをクリック



**4. 設定を確認**
画面右上の稲妻マークを右クリック
↓
拡張機能を管理
↓
拡張機能のオプションで設定を確認



**5. Autofillを使いたくない時**
Autofillの設定をもう一つ追加
↓
拡張機能のオプションで追加した設定のデフォルト情報を全て削除
↓
使いたくなくなった画面で右クリック
↓
Excute profileで追加した設定を選択
↓
入力情報が空になる


##あとがき
便利。
Python環境再構築

## Python環境を整える

＊課題
- 様々なモジュール管理ツールが混在している。
- 最初にどう環境設定したのか覚えていない。
- DISCが圧迫されている（これは別の所にも問題あり）

＊環境
MacOS 10.14.5
Xcode(Command Line Tools)
Homebrew 

バージョン
Python 3.7.1
pyenv 3.7.0


＊Python管理ツールをすべてアンインストールして再構築しよう
### 1. Disc使用量の確認

```
du [オプション] ディレクトリ・ファイル
```
### 2. pyenv, anacond, pip uninstall

```
conda install anaconda-clean
anaconda-clean --yes
rm -rf ~/anaconda
```
anaconda上手く消えなかったからFinderから消しました

```
brew uninstall pyenv
```

### 3. それではinstallし直す！！
> 今回はrbenvとかは再インストールしてないので、ひとまずanyenvは使わない

```
brew install pyenv
```
[MacOS Mojaveでpyenv python installするとZipImportErrorが出る話](https://qiita.com/ganta/items/01ab7c311705674eca88)
を参考に
```
CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install 3.7.2
```
としてCFLAGSにmacOS SDK headersのパスを渡す

環境変数やinit などのPATH通して保存

```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

### 仮想環境構築  pipenv版
メモリは自分のPCを使用するけど、計算やライブラリの管理はプロジェクトごとに仮想環境をつくってできる

```
brew install pipenv
```

https://qiita.com/anvinon/items/5d9c128ef8b65b866dfe

-> project root ディレクトリの.venv 以下のディレクトリに仮装環境が作成されるように有効化

''~/.local/share/virtualenvs'' に
格納されるそうだけど、PyCharm開発だと.venv以下をデフォルトで読み込んでくれるので便利らしい。（PyCharm使わないけどいれてみた）

```
echo 'export PIPENV_VENV_IN_PROJECT=1' >> ~/.bash_profile
source ~/.bash_profile
```

###pipenvについて
https://qiita.com/y-tsutsu/items/54c10e0b2c6b565c887a
・プロジェクトごとに仮装環境を構築できる
・pipenv環境下ではpipenvコマンドを使ってパッケージをインストール
つくった環境ごとにPipfileにパッケージが列挙される。また、Pipfile.lockにはバージョンやパッケージの依存関係にある別のパッケージの詳細が記載される

## Python file実行
### 1. まず環境つくりたいディレクトリにいく
```
$ mkdir test
$ cd test
$ pipenv install --Python 3.7.1
```

この時点で
Pipfile  Pipfile.lock
が階層にできている

### 2. パッケージの追加
```
$ pipenv install --(いろいろインストールしたいパッケージ)
で色々追加できる
```

開発時にしか使用したくないパッケージはオプション`-d`をつけて

```
pipenv install -d (インストールしたいパッケージ)
```
#### * つまったこと
・$ pipenv install matplotlib は上手くいかない
versionまで指定すると、インストールできた
・pycocotoolsはCythonが入ってないとinstallできないなど、順番に気をつける必要ある

### 3. 実行する
pipenvは仮装環境なので、pipenvでインストールしたパッケージを利用したPythonスクリプトを実行するためには仮想環境に入る必要がある
`pipenv shell`で環境に入ると、左側にプロジェクト名がカッコ書きで出てくるのが確認できる。
環境を抜けるときは`exit`コマンドを打てると抜けられる


```
$ pipenv shell
(test)$ python foo.py
(test)$ exit
```
### tkinker インストールできなくて困る
https://murabitoleg.com/mac-tkinter/
の通りに公式サイトから引っ張ってくると、対話型ではimport tkinterできたが。

```
python -m tkinter 
```
打つと
```
tk.h version (8.6) doesn't match libtk.a version (8.5)
```
のエラー。。

https://qiita.com/undead/items/e92ff0038c1fa14689b5
を参考にしてpyenv uninstallするも解決しない。。



#### 参考

https://qiita.com/anvinon/items/5d9c128ef8b65b866dfe
https://kandai.hatenadiary.jp/entry/2018/07/16/105940
[pipencとGit　Dockerをつかった話](https://qiita.com/Aruneko/items/796d7eeb61e1f36ae4a0#%E5%85%A8%E4%BD%93%E3%81%AE%E6%B5%81%E3%82%8C)
[.NET] ExceptionのToStringメソッドを活用し、そのオーバーライドを避ける

# `Exception`クラスの`ToString()`を活用する

`Exception`クラスの`ToString()`は以下を出力する。

- 例外クラスの名前
- メッセージの内容
- 内部例外の内容
- スタックトレースの内容

このため、発生した例外をログに出力する場合、自分で各プロパティの内容を出力するより、`ToString()`の内容をそのまま出力したほうが楽だ。

# `ToString()`のオーバーライドを避ける

便利な機能があるということは、その機能を活用する人がいるということだ。
`Exception`クラスの持つ上記の機能を、その派生クラスから取り除いてはならない。

この機能を取り除くという誤りは、「独自プロパティを持たせたカスタム例外」を作成したときによくおきる。
`ToString()`メソッドに独自プロパティの値を出力する機能を追加したばかりに、内部例外やスタックトレースの内容を出力する機能が取り払われたりする。
クラス名とメッセージだけのログを受け取っても、おそらく、問題の特定はできないだろう。

```csharp
// EVIL code
public override string ToString()
{
    return $"{GetType()}: {Message}" + Environment.NewLine + $"MyProperty: {MyProperty}";
}
```

また、この機能を取り払わないよう、自分の`ToString()`から基底クラスの同メソッドをコールし、これに追加する形で独自プロパティの内容を出力しようとしても、理想的な結果にはならない。

```csharp
// Not good
public override string ToString()
{
    return base.ToString() + Environment.NewLine + $"MyProperty: {MyProperty}";
}
```

内部例外やスタックトレースの内容のあとに、独自プロパティの内容が出力されることになる。これでは最良の書式とは言えない。

```csharp
try
{
    // MyPropertyに1, Messageに"this is an example."を指定
    throw new MyException(1, "this is an example.");
}
catch (MyException ex)
{
    Console.WriteLine(ex.ToString());
}
```

実行結果

```
Submission#13+MyException: this is an example.
   場所 Submission#15.<<Initialize>>d__0.MoveNext()
MyProperty: 1
```

この例ではスタックトレースは1行しかないが、10行20行と膨れあがる場合があることを想像してほしい。

# オーバーライドすべきは`Message`プロパティ

独自プロパティを持つ例外クラスを定義したなら、`Message`プロパティの内容をオーバーライドし、そこでプロパティの値を出力しよう。

```csharp
// Good
public override string Message
{
    get
    {
        return base.Message + Environment.NewLine + $"MyProperty: {MyProperty}";
    }
}
```

この`Message`プロパティが`ToString()`メソッドから参照されるため、独自プロパティの内容が例外クラスの名前と元のメッセージの後、内部例外とスタックトレースの前に出力されるようになる。
書式として前の例よりも良いものになった。もう、`ToString()`をオーバーライドする必要はない。

```csharp
try
{
    // MyPropertyに1, Messageに"this is an example."を指定
    throw new MyException(1, "this is an example.");
}
catch (MyException ex)
{
    Console.WriteLine(ex.ToString());
}
```

実行結果

```
Submission#9+MyException: this is an example.
MyProperty: 1
   場所 Submission#12.<<Initialize>>d__0.MoveNext()
```

ここで示したのはあくまで簡略化したコードである。
ほとんどの例外クラスは引数のないコンストラクタを持つので、独自プロパティは値を持たない場合がある。実際のコードでは、この点も考慮に入れて欲しい。

# まとめ

- 例外をログに出力するときは、`Exception`クラスの`ToString()`を活用する。
- カスタム例外クラスを作成するとき、`ToString()`のオーバーライドは必要がないかぎり避ける。
- 独自プロパティの値を`ToString()`の出力に含めるには、`Message`プロパティをオーバーライドする。

# 参考資料
`Exception`クラスやシステム例外系クラスのソースコード
https://referencesource.microsoft.com/

「運用者が困る例外処理の書き方」の@banban525さんのコメント
https://qiita.com/tokishirazu/items/b510ebfdb7ff089fe44c#comment-6415deea1aeefa6b3b13
【Python】 プロジェクトオイラー　Problem 1

####<i>10未満の自然数のうち、3もしくは5の倍数になっているものは3,5,6,9の4つがあり、これらの合計は23になる。

####同じようにして、1000未満の3か5の倍数みなっている数字の合計を求めよ。
 </i>

とりあえず答えを出すまでの流れは

######1.1000未満の3と5の倍数を抜き出す
######2.抜き出したものを合計する

で、終わり

1問目だから難易度は控えめなはず

とりあえず1000未満の数を抜き出したいからrange関数を使えばうまくいくと思う

3と5の倍数はifを使って条件付ければ抜き出せそう

ということでプログラミングに起こしてみる

```python
sanbai = 0
for sen in range(1000):
    if sen % 3 == 0:
        sanbai += sen
print(sanbai)

166833
```
これで1000未満の3の倍数の合計が求められたはず
同じことを5の倍数でもやってみる

```python
gobai = 0
for sen_a in range(1000):
    if sen_a % 5 == 0:
        gobai += sen_a
print(gobai)

99500
```

これで5の倍数も抜き出した

ので、組み合わせてみる

```python
sanbai = 0
gobai = 0
for sen_a in range(1000):
    if sen_a % 3 == 0:
        sanbai += sen_a
for sen_b in range(1000):
    if sen_b % 5 == 0:
        gobai += sen_b
print(gobai + sanbai)

266333
```
これで当っているのだろうか...

どうも違うらしい

[http://kingyojima.net/pje/001.html]

ここの回答によると答えは233168らしい

どこが違うのだろうか...

なるほど、

######３倍と５倍を抜き出すときにそれぞれ3で割れる数と5で割れる数を抜き出していたので、15とか30とかのそれぞれの倍数がかぶっている値が重複していたので答えが大きい数字になっていたみたい

なので5倍を抜き出す式に

```python
for sen_b in range(1000):
    if sen_b % 5 == 0 and sen_b % 3 != 0:
```

これでうまくいくはず

```python
sanbai = 0
gobai = 0
for sen_a in range(1000):
    if sen_a % 3 == 0:
        sanbai += sen_a
for sen_b in range(1000):
    if sen_b % 5 == 0 and sen_b % 3 != 0:
        gobai += sen_b
print(gobai + sanbai)

233168
```

これで正解のはず

Problem2は**[こちら](https://qiita.com/projecteuler/items/fea990abdd397842a1e9)**から
令和ショック

# 対象
- 何とかなると思ってるICカードぶら下げてる思考停止フリーフルスタックおっさん
- ~~タイトルに釣られてやってきた人~~



# 自己紹介
- 何とかなると思ってたICカードぶら下げてる思考停止フリーフルスタックおっさん



# 経緯
- これまでコッチに来そうな奴らにはCや++を勧めて出鼻を挫いたり、ウマい情報を出さない「フリーおっさん紳士協定」で秩序が保たれていたが、令和になり秩序の崩壊や参入障壁が下がったことで大量の志望者がコチラに押し寄せてきており、ふりーおっさんにはこの認知と早急な対応が求められている。



# 目的
- ふりーフルスタックおっさんにバブル終了認知の呼びかけ、注意喚起。こっからが俺らの本当の氷河期ｗ



# 用語
`pyson` `doker` `フルスタック` `ruby` `年金` `aws` `ポートフォィオ` `スクール` `iot`
`サロン`



# 現状
- progateやidemyを2週したフルスタックエンジニアwが175状態
- progateやidemyを2週してないフルスタックおっさんが買い叩かれている状態



# 学習機会の充実
- テック系(academy,camp,sns,school,salon)の増加



# 技術情報の充実
- テック系ブログ増加
- コンテンツの信頼性アップ



# 便利ツールの充実
- awsで簡単クリック操作で環境構築運用



# 社会の充実
- フリーのハードルが低いことがバレた
- フリーは金もらえることバレた(今までもバレてはいたが、もうまじでばれた)
- おもろそうな職が他にない



# 結果
- フリーの参入障壁が壁つか紙になった
- フルスタックエンジニア「化」は著しく増加
- フリーおっさんは確変終了で今後「案件天秤単金つり上げ打法」、「現場仲良し延命の術」、「blackbox 
 keyman」がつかえなくなる可能性が高い



# 考察
- 令和元年7月現在、半年程書くのが遅かったが、マクロでは初動状態、とりあ2,3年はこのトレンドになると推測
- フリーおっさんがフルスタックエンジニアとしての契約条件は今後段階的に悪くなり、これは今後反転することはない
- フリーおっさんが高単価狙うには上流か、スペシャリスト(習得に時間を要するもの)しかない？
- イイネ押していってね(^_-)-☆
BitbucketのSSH設定方法

# はじめに
BitbucketでSSH通信した時に『Permission denied (publickey).』が表示されたときの対応方法
結論から言うと公開鍵が正しく設定されていなかった。

# SSHの鍵の生成
~/.sshに公開・秘密鍵を置くことで、sshのコマンドが参照するっぽい

~~~
cd ~/.ssh
ssh-keygen -t rsa -C "bitbucketに登録したメールアドレス"
~~~



生成したSSH公開鍵をクリップボードにコピーする

~~~ 
cat id_rsa.pub | xclip -sel clip
~~~

#Bitbucketへの登録
Bitbucket setting →　SSH鍵 →　鍵を追加
KeyのところにSSH公開鍵を貼り付けて　→　鍵を追加
ウマー
terraformでコレクションとコレクションをマージする

terraformでコレクションとコレクションをマージするには、 `concat` ビルトインファンクションを使います。

terraform consoleを起動して下記のように実行します。

```bash
> concat(["a"], ["b"])
```

すると、結果が下記になり結合されていることがわかります。

```bash
[
  "a",
  "b",
]
```

## 空の要素はどうなるのか?

空のコレクションは無視されます。

```bash
> concat(["a"], [], ["b"], [])
[
  "a",
  "b",
]
```

## 参考

* [concat - Functions - Configuration Language - Terraform by HashiCorp](https://www.terraform.io/docs/configuration/functions/concat.html)
PythonでWordPressに投稿、一覧取得

## python-wordpress-xmlrpc
xmlrpcでの認証等を簡単にしてくれるパッケージ
https://python-wordpress-xmlrpc.readthedocs.io/en/latest/overview.html

```bash
pip install python-wordpress-xmlrpc
# pip3 install python-wordpress-xmlrpc
```

## 記事の作成
記事を作成するサンプルコード

```python:create_post.py
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
from wordpress_xmlrpc.methods.users import GetUserInfo

wp = Client('http://sample.com/xmlrpc.php', 'username', '$password')
# WordPressのURL + /xmlrpc.php, ユーザー名, パスワードを指定


post = WordPressPost()
post.title = 'title'
post.content = 'content'

post.terms_names = {
'post_tag': '',
'category': ''
}

post.post_status = 'publish'
# post.date = datetime.now() - timedelta(hours=9) + timedelta(minutes=5+(5*delay))

wp.call(NewPost(post))
```

```
python create_post.py
```


## 記事の一覧
記事の一覧を出力するサンプルコード

```python:list_posts.py
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
from wordpress_xmlrpc.methods.users import GetUserInfo

wp = Client('http://sample.com/xmlrpc.php', 'username', '$password')

posts = wp.call(GetPosts({
                    'number': 50, 
                    'offset': 0, 
                    'orderby': 
                    'modified', 
                    'order': 'DESC', 
                    'post_type': 'post', 
                    'post_status': 'publish'
                }))
print(posts)

```

```bash
python list_posts.py
# [<WordPressPost: b'title'>, <WordPressPost: b'Hello world!'>, ...]
```

WordPressPostのオブジェクトについては以下を参照
https://python-wordpress-xmlrpc.readthedocs.io/en/latest/ref/wordpress.html#wordpresspost
初心者がbatファイルで特定箇所をリネームして複製してみた

# はじめに
いつもお世話になっております。
今回私がbat作成をした際に学んだことなどを書き留めていきたいと思います。
初心者ということもありますが、書かせていただきたいと思います。
宜しくお願い致します。


# 作成の発端は？
ファイルの名前の一部だけ変更したいときに
F2を押して打ち込むという作業に~~めんどくさく~~効率よくしようとしました！
少ない数ならまだいいのですが何十個もあったので勉強がてらやってみました。

# ソースコード
今回作成したbatのソースはこちら！

```
@echo off

:LOOP
echo "ファイルのコピーとリネームを開始します。"
echo "リネームしたいファイルをD&Dしてください。"

SETLOCAL ENABLEDELAYEDEXPANSION

set BODY_LIST=[変換したい文字列が記載されている].csv
set ORIGINAL_FILE_PATH=
set /P ORIGINAL_FILE_PATH="D&D sorce file!"
call :SET_CHANGE_WORD_FIND %ORIGINAL_FILE_PATH%

:SET_CHANGE_WORD_FIND
set FILE_NAME=%~n1

for /f "tokens=1 delims=," %%i in (%BODY_LIST%) do (
	echo 検索文字列 %%i
	set TEMP_STR=%%i
	echo "%FILE_NAME%" | find "!TEMP_STR!" >NUL
	if not ERRORLEVEL 1 (set CHANGE_WORD=%%i) else (echo "")
)

call :GET_FILE_NAME %ORIGINAL_FILE_PATH%

:GET_FILE_NAME
set ORIGIN_FILE_NAME=%~nx1
echo リネーム対象のFileName=%ORIGIN_FILE_NAME%
echo 変換対象文字列=%CHANGE_WORD%
set /P ANSWER="コピーを実行します。コピーしたいファイル名は正しいですか？(y/n)"
if /i {%ANSWER%}=={y} (goto :yes)

EXIT
```

# 苦労したこと
高級な言語しか触ってこなかったツケか
かこうとしてもチンプンカンプンでした
…Try＆Errorでなんとか完成までこじつけました。
今回メモ帳で作成していたので、実行できなかったときに何がいけないか探すのに少し苦労しました。
あとは変数の使い方とfor文の使い方(つまり全部)

# 作成して気づいたこと
ファイルパスを読み込むときに
＆があると正常にパスを読み込んでくれないんだなというのがわかりました…(失敗した)

# 最後に
あまりこういった記事を書いたことありませんでしたが、アウトプットの練習がてら書いてみました。
これからもこれは勉強になったなと思ったことなどはどんどん記事にしていきたいと思います！
稚拙な文章ですが、最後までご覧いただきありがとうございました。
jestでvue-test-utilsが上手く動かないときに確認する設定項目

vue-test-utilsはブラウザー互換環境を要求する
なので、jestで

```
testEnvironment: "jsdom"
```

を設定する必要がある。
ちなみに

```
testEnvironment: "node"
```

で、grobalにjsdomを設定してもエラー内容は変わったが上手く動かなかったし、jestなら素直に`testEnvironment: "jsdom"`を設定しよう。

https://github.com/vuejs/vue-test-utils/issues/1192

## 補足
vue-test-utilsとjestはそんなに詳しくないので何が問題かわからず、vueやvue-test-utilsのバージョン問題かと思ったがそんな事は全くなかった。
Rails6 のちょい足しな新機能を試す44（enum 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第44段。 今回は、 `enum` 編です。
Rails 6 では、 `enum` で指定する値が、Hash, シンボルの配列、文字列の配列以外の場合は、 ArgumentError が発生するようになりました。
わかりにくいバグを防ぐのが目的です。

Ruby 2.6.3, Rails 6.0.0.rc1, Rails 5.2.3 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# プロジェクトを作る

```shell
bin/rails new rails6_0_0rc1
```

# モデルを作る

```shell
bin/rails g model Child name generation:integer
```

# Child モデルに enum を追加する

ここで、わざとバグになる紛らわしい enum を設定します。

```ruby:app/models/child.rb
class Child < ApplicationRecord
  enum generation: [baby: 0, toddler: 1, preschool: 2, gradeschool: 3, teen: 4, young_adult: 5]
end
```

# rake db:migrate を実行する

```shell
$ bin/rake db:create db:migrate
```

# Rails 6 では

`rails console` で `Child` のインスタンスを作ろうとすると `ArgumentError` が発生します。

```
$ bin/rails c
...
irb(main):001:0> c = Child.new
Traceback (most recent call last):
        3: from (irb):1
        2: from app/models/child.rb:1:in `<main>'
        1: from app/models/child.rb:2:in `<class:Child>'
ArgumentError (Enum values [{:baby=>0, :toddler=>1, :preschool=>2, :gradeschool=>3, :teen=>4, :young_adult=>5}] must be either a hash, an array of symbols, or an array of strings.)
```

# Rails 5 では

ArgumentError が発生しませんが、 generation に :baby を設定しようとするとエラーになります。

```irb
$ bin/rails c
irb(main):001:0> child = Child.new
=> #<Child id: nil, name: nil, generation: nil, created_at: nil, updated_at: nil>
irb(main):002:0> child.generation = :baby
Traceback (most recent call last):
        1: from (irb):2
ArgumentError ('baby' is not a valid generation)
```

Child.generations で調べてみると設定できるのは、`{ baby: 0, toddler: 1, preschool: 2, gradeschool: 3, teen: 4, young_adult: 5 }` だけとわかります。
enum で指定したのは、1つの Hash オブジェクトを要素とする配列になってしまっているためです。

```irb
irb(main):003:0> Child.generations
=> {{:baby=>0, :toddler=>1, :preschool=>2, :gradeschool=>3, :teen=>4, :young_adult=>5}=>0}
```

# 意図した動作にするには

以下のように `[]` で囲まないで、 `{}` で囲めば、意図した通りの動作になります。

```ruby:app/models/child.rb
class Child < ApplicationRecord
  enum generation: { baby: 0, toddler: 1, preschool: 2, gradeschool: 3, teen: 4, young_adult: 5 }
end
```

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try044_enum_validation


# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Enum raises on invalid definition values](https://github.com/rails/rails/pull/34110)
* [Enums declared with the wrong syntax should throw an error](https://github.com/rails/rails/issues/33961)
ansible接続確認の方法

#ansible接続確認

ansibleは**sshでホスト=>ターゲット**にコマンドを送るのだが、それを確認する方法

inventory.iniはこのようになっている

```inventory.ini
[app1s]
app1 ansible_host=192.168.33.10

[app2s]
app2first ansible_host=192.168.33.11
app2second ansible_host=192.168.33.12
```



##単純にホストがあるかどうか確認
これはssh接続できていなくてもメッセージは表示される

```shell-session
$ ansible <inventory.iniにある調べたい対象> -i inventory.ini -m debug -a 'msg=hello'
```

##ホストにsshで接続できるか確認
pingで疎通確認をするのだが、これはssh接続できていないと繋がらない
-uでユーザー名を指定し、--private-keyで公開鍵を指定してあげる

```shell-session
$ ansible <inventory.iniにある調べたい対象> -i inventory.ini -m ping -u username --private-key /Users/yourname/key.pem
```


*上記に記載する

「inventory.iniにある調べたい対象」は
・inventory.ini内の全て=>all
・inventory.ini内のapp2sの全て=>app2s
・inventory.ini内の特定のhost=>app1やapp2firstやapp2second
を指定する
ansibleでよく使うモジュールとその使いかた


#shell
・chdirでshellコマンドを実行するdirに移動
・sudo: noでsudoをつけないで実行

```install.yml
- shell: somescript.sh >> somelog.txt
  args:
    chdir: somedir/
    creates: somelog.txt
    sudo: no
```

・lock_timeoutで時間を指定し、「yum lockfile is held by another process」を解消する

```install.yml
- name: configure / Import mysql Repository
  yum:
    lock_timeout: 60
    name: http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
    update_cache: yes
```

・urlを指定してインストール

```install.yml
- name: configure / Import EPEL Repository
  yum:
    name: https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    state: latest
    update_cache: yes

```

#git
・gitからレポジトリを取得
・destでインストール先を取得

```install.yml
- name: install / Download phalcon-devtools
  git:
    repo: https://github.com/phalcon/phalcon-devtools.git
    dest: /var/www/phalcon-devtools

```

#systemctl
起動、再起動など

```install.yml
- name: configure / reStart nginx service
  systemd:
    name: nginx
    state: reloaded
    enabled: yes

```

#テンプレートをコピー

```install.yml
- name: configure / Setup configure file
  template:
    src: server.cnf.j2
    dest: /etc/my.cnf.d/server.cnf
    owner: root
    group: root
    mode: 0644
    backup: yes
```

#yum

アンインストール

```install.yml
- name: check_install / Remove current packages
  yum:
    name: mariadb-libs
    state: absent
```


#firewallの開閉

```install.yml
- name: check_install / Allow ports for firewalld
  firewalld:
    port: "{{ item }}"
    permanent: yes
    immediate: yes
    state: enabled
  with_items: "{{ nginx_firewalld_port }}"
```

#ディレクトリの作成

```install.yml

- name: mkdir /var/www
  file: path=/var/www
        state=directory
        owner=root
        group=root
        mode=0755
```

#ホストのファイルをターゲットへコピー

```install.yml
- name: configure / make index.php
  copy:
    src: ../templates/index.php
    dest: /var/www
    mode: 0755

```


#debug
ディレクトリやファイルの中身確認

```install.yml

- name: debug dir exists
  debug:
    msg: "{{ dir }}"

```


#stat

ディレクトリやファイルの有無で処理を実行するか分岐

```install.yml
#registerで名前をつけ、「名前.stat.exists」で分岐
- name: check dir rbenv
  stat:
    path: "path/to/.rbenv"
  register: rbenv

#register: rbenvで登録したものがない場合だけ実行
#ある時だけ実行は  when: rbenv.stat.exists == True
- name: install rbenv
  git:
    repo: https://github.com/rbenv/rbenv.git
    dest: "{{ home_dir }}/.rbenv"
  become: no
  when: rbenv.stat.exists == False

```
Djangoでアプリを作成する手順

・・・・・編集中・・・・
#Djangoの構造
![django_構造.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452364/c9dbd44d-9d23-33ed-ecaa-28ca5941057e.png)


#プロジェクトを作成する

```
django-admin startproject testproject
```

#アプリを作成する
プロジェクトフォルダ内に移動して、パイソンコマンドを入力する。

```
cd testproject #プロジェクトフォルダ内に移動する
python manage.py startapp testapp #アプリを作成する
```

#アプリをプロジェクトに登録する
プロジェクトフォルダ、この例の場合は「testproject」というフォルダ内の「settings.py」を開き、中段ほどに記載されている「INSTALLED_APP」のリストに、先ほど作成したアプリ「testapp」を追加する。これでアプリがプロジェクトに認識されたことになる。

setting.py>INSTALLED_APP

```python:settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles', #＜＝カンマを忘れずに
    'testapp'　#作成したアプリを記入する
]
```
#アプリのモデルを作成する
「testapp」内の「models.py」にモデルを登録する。モデルとはデータを格納するフレームのことである。「データベースの見出しのようなも」と理解していいと思う。
testapp>models.py

```python:models.py
from django.db import models

#ここにモデルを記述します。

class Profile(models.Model): #Profileという名前のモデルを作成
    name        = models.CharField(max_length=64)　#見出し「name」
    hometown    = models.CharField(max_length=256) #見出し「hometown」

    def __str__(self):  #モデルを人が読んで読みやすくするための記述
        return self.name
```

#アプリのViewを作成する
ViewはモデルとURLとテンプレートをつなぐコントローラーの役割を果たすファイル。
testapp>views.py

```python:views.py

```


#テンプレートを作成する



#アプリのURLを登録する
プロジェクトフォルダの「urls.py」にアプリのURLを登録する（この方法だけが正解ではないが、多くの開発者が実施している方法）。
##アプリフォルダ「testapp」内に「urls.py」を作成する。

```python:urls.py

from django.urls import path
from django.conf.urls import url
from . import views

urlpatterns = [
    path("test", views.test, name="test")
]

```
Laravelのマイグレーション時にAccess denied for user 'root'@'localhost'になる

## 環境

- Ubuntu 18.04(WSL)
- Larave5.8
- PHP7.2
- MySQL5.7


```text:.env
DB_DATABASE=laravel58
DB_USERNAME=root
DB_PASSWORD=
```

```bash:bash
php artisan migrate --seed
```

これをやると次のエラーが出ました。

```
Illuminate\Database\QueryException  : SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost' (SQL: select * from information_schema.tables where table_schema = larave58 and table_name = migrations and table_type = 'BASE TABLE')
```

調べてる見ると

>Turns out you can't use the root user in 5.7 anymore without becoming a sudoer. That means you can't just run mysql -u root anymore and have to do sudo mysql -u root instead.

引用元：[SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost'](https://stackoverflow.com/questions/36864206/sqlstatehy000-1698-access-denied-for-user-rootlocalhost)

mysql5.7はsudoじゃないとrootでログインできないようです。

なのでUbuntuにphpmyadminをインストールした時に作ったphpmyadminというアカウントに権限を与えることにしました。

```mysql:mysql
GRANT ALL PRIVILEGES ON *.* TO 'phpmyadmin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
```

.envを修正

```text:.env
DB_DATABASE=laravel58
DB_USERNAME=phpmyadmin
DB_PASSWORD=password
```

これでできました。

### 参考
- [SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost'](https://stackoverflow.com/questions/36864206/sqlstatehy000-1698-access-denied-for-user-rootlocalhost)
- [Cannot enter phpmyadmin as root (MySQL 5.7)](https://askubuntu.com/questions/763336/cannot-enter-phpmyadmin-as-root-mysql-5-7/763359#763359)
【Rails】content_tagを使って定番の表示画面をhelper化する

# content_tag
**`content_tag`**という便利なメソッドを知ってしまった。
これにより、htmlタグを生成することができる。

**`content_tag`**に関して、詳しくは以下を参照↓
http://railsdoc.com/references/content_tag
https://kana-linux.info/rails/rails%E3%81%AEview-helper%E3%81%A7html%E3%82%BF%E3%82%B0%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B

#content_tagを使ってhtmlをhelperで作成
**bootstrap**と併用して、割と定番的に使うもの↓
## flash[:notice], flash[:alert]

```users_controller.rb
def create
  @user = User.new(user_params)
  if @user.save
    redirect_to toppage_path, notice: "success"
  else
    render 'new'
  end
end
```

```toppage.html.erb
<% if flash[:notice] %>
  <div class="container">
    <div class="alert alert-success">
      <%= flash[:notice] %>
    </div>
  </div>
<% end %>
<% if flash[:alert] %>
  <div class="container">
    <div class="alert alert-danger">
      <%= flash[:alert] %>
    </div>
  </div>
<% end %>
```
viewでこのように書くことが多いと思われる`flash[:notice]`と`flash[:alert]`だが、
helperで記述すると、↓

```application_helper.rb
  def notice_msg
    if flash[:notice]
      content_tag(:div, class: "container") do
        content_tag(:div, class: "alert alert-success") do
          flash[:notice]
        end
      end
    end
  end
  def alert_msg
    if flash[:alert]
      content_tag(:div, class: "container") do
        content_tag(:div, class: "alert alert-danger") do
          flash[:alert]
        end
      end
    end
  end
```
```toppage.html.erb
<%= notice_msg %>
<%= alert_msg %>
```
こんな感じでviewテンプレートの行数が圧縮できた。

## errors.full_messages
バリデーションのエラーメッセージを表示する、典型的なやつです。

```users_controller.rb
def create
  @user = User.new(user_params)
  if @user.save
    redirect_to toppage_path, notice: "success"
  else
    render 'new'
  end
end
```

```new.html.erb

<%= @user.errors.full_messages.each do |msg| %>
  <div class="alert alert-danger">
    <%= msg %>
  </div>
<% end %>
<%= form_with model: @user, local: true do |f| %>
・
・
```

このように書くことが多いと思われる**`errors.full_messages`**ですが、helperで記述します↓

```application_helper.rb
  def errors_full_messages(var)
    var.errors.full_messages.each do |msg|
      concat (content_tag(:div, class: "alert alert-danger") do
        msg
      end)
    end
  end
```
↑()の使い方が汚いですが・・・

```new.html.erb

<% errors_full_messages(@user) %>
<%= form_with model: @user, local: true do |f| %>
・
・
```
引数に該当するインスタンス変数を指定すれば使えます。
こんな感じでviewの行数が圧縮できました。
あとは**`i18n`**で設定を加えれば、以下のように表示されます。
<img width="777" alt="スクリーンショット 2019-07-02 12.08.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251648/05541dd3-4768-8046-abab-8a2f1151cc6f.png">

# 感想
他にもよく使うviewで定番的に使うものは、helperでテンプレート化したい。
std::vectorで特定のコンストラクタを呼びたい時のlist initialization

単純な話ですが、ハマってしまったのでメモ。

# 結論

list initializationでvector等を初期化する時、明示的にサイズ指定のコンストラクタを呼ぶためには、listに `std::allocator<>()` を追加するべし。

# std::vectorで多次元配列を作りたい
```C++
template<typename T>
using mat3d_t = std::vector<std::vector<std::vector<T>>>;

int main(int argc, char **argv) {
    mat3d_t<int> mat3d{/*３次元サイズ指定をして、全部特定数字で埋める*/};
    return 0;
}
```

numpyのzerosとかonesみたいな感じで、コンパイル時に行列サイズが決まっていたらこんな感じで書けると便利かなと思ったのですが・・・
例えば以下のように書くと、

```C++
    mat3d_t<int> mat3d{10, {5, {10, -1}}}; // 10x5x10の行列を作って-1で埋めたい
```

[おかしな結果（wandbox）](https://wandbox.org/permlink/7fw8Zr4Fd3xILkSm)になってしまいます。
一番内側のinitializer listはintのlistとして解釈されてます。そのため行列サイズは `10x5x10` ではなく、 `10x5x2` になってしまってます。
いかにもセグメンテーションフォルトで落ちそうな、ヤバいコードです。

これを回避するためには以下のようにしてあげれば、

```C++
    mat3d_t<int> mat3d{10, {5, {10, -1, std::allocator<std::vector<int>>()}}};
```

[正しい結果(wandbox)](https://wandbox.org/permlink/QY4uUbAKQ4CPAvrS)
ちゃんとサイズ指定のコンストラクタだとコンパイラが認識してくれるのでOKです。

当たり前のことなんですが、ハマってしまったので備忘のために。
ちょっと冗長にも思えるので、自作クラスを作った方が良いかもなー。
【Fortran】親子クラスをまとめる総称手続きではclassではなくtypeを使う

なんとなく使っていた`class`と`type`の仕様に直面したのでメモ．
- `class`: そのクラスと，それを継承したクラスを指す．
- `type` : そのクラスのみ．
[NAG 10.2 オブジェクト指向プログラミング][1] (特に10.2.1.2 多相変数 [5.0])

つまり，親クラス専用の手続き（サブルーチン・関数）に`class`を使い，子クラス専用の手続きと総称名でまとめようとすると，どちらのクラスか区別できないため`Ambiguous generic interface ***: previously declared specific procedure *** is not distinguishable from this declaration`と言われる．

### まとめ

- そのクラスのメソッドにしない場合：`type`に統一した方が良い
    - 親クラス用：`type`，子クラス用：`class`でも動くが，当然拡張性が失われる
- そのクラスのメソッドにする場合：`class`にしなければならない
    - メソッドで`type`を使うと，`The passed-object dummy argument must be a polymorphic dummy data object if the type being defined is extensible`とコンパイルエラー

GitHub上のソースコードでも時々これらが混同されているので注意．

### 以下検証用コード
``` Fortran
module mymod
implicit none

type :: Type1
    integer :: x
end type Type1

type, extends(Type1) :: Type2
    integer :: y
end type Type2

type :: Type3
    integer :: z
end type Type3

interface operator(+)
    module procedure :: add1
    module procedure :: add2
    module procedure :: add3
end interface operator(+)

contains

function add1(self, i) result(obj)
!    class(Type1), intent(in) :: self ! NG
    type(Type1), intent(in) :: self
    integer,      intent(in) :: i
    type(Type1)              :: obj
    obj%x = self%x + i
end function add1

function add2(self, i) result(obj)
!    class(Type2), intent(in) :: self ! NG
    type(Type2), intent(in) :: self
    integer,      intent(in) :: i
    type(Type2)              :: obj
    obj%x = self%x + i
    obj%y = self%y + i
end function add2

function add3(self, i) result(obj)
    class(Type3), intent(in) :: self ! これでも動くが…
    integer,      intent(in) :: i
    type(Type3)              :: obj
    obj%z = self%z + i
end function add3

end module mymod


program main
    use mymod
    implicit none
    type(Type1) :: t1
    type(Type2) :: t2
    type(Type3) :: t3
    t1%x = 10
    t2%x = 20
    t2%y = 25
    t3%z = 30
    t1 = t1 + 1
    t2 = t2 + 2
    t3 = t3 + 3
    write(*, *) t1%x       ! 11
    write(*, *) t2%x, t2%y ! 22 27
    write(*, *) t3%z       ! 33
end program main
```



[1]: https://www.nag-j.co.jp/nagfor/np52_manual/np52_manual_10_2.html
【Selenium】（Python）ハマった時のメモ

#【1】画面外の文字がクリックできない。
###FormをSubmitしたいのだが、画面外にありクリックできない。

```
element = driver.find_element_by_xpath("//*[@id='update']")
element.click()
```

以下のようなエラーが出る。
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable at point (392, 687)

###試したこと
####1.画面外へスクロール
[Selenium利用時のトラブルシューティング方法[クリック編]](https://javaworld.helpfulness.jp/post-254/)
[seleniumにてButtonがクリックできない時の対処法]
(https://qiita.com/DNA1980/items/528ff6269986b262acdc)
>画面上には表示されているが、スクロールしないと見えない状態の時ですので、スクロールしてクリックすればOKです。

と書かれているが、そもそもスクロールすらできなかった。

####2.submit　メソッドを利用する
[python selenium　で　form　を送るための　２パターン]
(http://blog.livedoor.jp/kmiwa_project/archives/1065433670.html)

```
element = driver.find_element_by_xpath("//*[@id='update']")
element.submit()
```
clickでなく、submitを使用するも同じエラー...

###解決策
[Selenium-Debugging: Element is not clickable at point (X,Y)](https://stackoverflow.com/questions/37879010/selenium-debugging-element-is-not-clickable-at-point-x-y)
execute_script()メソッドを使用することで解決した。

```
element = driver.find_element_by_xpath("//*[@id='update']")
driver.execute_script("arguments[0].click();", element)
```
fish を入れた際のanacondaへのパスの通し方

anaconda3が入っているmacにfishを導入した際に詰まったのでパスの通し方のメモをおく

```
set -U fish_user_paths $HOME/anaconda3/bin $fish_user_paths
```

$HOME部分のパスは個人の設定に合わせる．


`bashを使っていたので.bash_profileなどのファイルに書かれていた．`
Mac Mojave PlantUML がどうしても入らないよ

環境: Mac Mojave 10.14

こちらを参考にやりました。
https://qiita.com/kohashi/items/1d2c6e859eeac72ed926


ありゃ

```
$ brew install plantuml                                                 
Error: An exception occurred within a child process:
  RuntimeError: /usr/local/opt/libffi not present or broken
Please reinstall libffi. Sorry :(
```

こうしてもだめ。exportもしたけどだめ。

```
$ brew link libffi --force
Warning: Refusing to link macOS-provided software: libffi
For compilers to find libffi you may need to set:
  export LDFLAGS="-L/usr/local/opt/libffi/lib"

For pkg-config to find libffi you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/libffi/lib/pkgconfig"
```

なので手作業でlinkしました

```
$ cd /usr/local/opt/
$ ln -s ../Cellar/libffi/3.2.1 libffi
$ ln -s ../Cellar/libtool/2.4.6_1 libtool
$ brew install plantuml
/usr/local/Cellar/plantuml/1.2019.6: 4 files, 7.4MB, built in 12 seconds
```

ok!! なのかな？ 無事画像も生成できました
Rigidbody2Dの移動・回転の制限をC#から行う

#Rigidbody2Dの移動・回転の制限
移動・回転の制限をするオブジェクトにRigidbody2dがついているか確認してください。
[Rigidbodyconstraints2D(Unity公式のやつ)](https://docs.unity3d.com/ja/current/ScriptReference/RigidbodyConstraints2D.html)
X軸の移動を制限したい場合は

```gameobjcet.GetComponent<Rigidbody2D>().constraints = RigidbodyConstraints2D.FreezePositionX```
でできます。(gameobjcetには移動回転の制限をさせたいオブジェクトがはいります)

#移動と回転の制限
X軸の移動を制限しつつ回転も制限したいと思うこともあると思います。
[Rigidbody2D.constraints](https://docs.unity3d.com/ja/current/ScriptReference/Rigidbody2D-constraints.html)

>ビットや演算子を用いて複数の制限を組み合わせることができます。

ここを踏まえてX軸の移動と回転の制限を行うコードは
```gameobject.GetComponent<Rigidbody2D>().constraints = RigidbodyConstraints2D.FreezePositionX | RigidbodyConstraints2D.FreezeRotation
```
となります。
Cordova で config.xml を動的に書き換えるテクニック

Cordovaを使って、アプリ名 + .dev等の環境切り替えを行いたいと考えてしらべた内容を書いて置きます。今回は、firebaseを利用していたため、google-services.jsonから取得しましたが、適当なjsonファイルに定義しておいて使うことも可能です。

```config.xml
...
<hook src="cordova-config.js" type="before_prepare" />
...
```

事前に cordova を npm install しておく必要あります。　

```sh
$ npm install cordova --save-dev
```

config.xmlと同じ階層で 実行したいJSを作成します。
google-services.jsonをパースして、IDを取得して置き換えをしています。

```cordova-config.js
#!/usr/bin/env node
// NOTE: config.xmlを環境切り分け
// google-services.json から共通のIDを取得する
const google = require("./google-services.json" );
const lib = require('cordova').cordova_lib;
const config = new lib.configparser(__dirname + '/config.xml');

// NOTE: packageName、bundle IDを書き換える
config.doc._root.attrib.id = google.client[0].client_info.android_client_info.package_name;

// NOTE: CFBundleDisplayNameを書き換える
// 末尾を取得する
const env = google.client[0].client_info.android_client_info.package_name.split('.')[3];
for (let index in config.doc.find('platform')._children) {
  if (config.doc.find('platform')._children[index].attrib.parent === 'CFBundleDisplayName') {
    config.doc.find('platform')._children[index]._children[0].text = 'sample' + (env ? ('.' + env) : '');
  }
}
config.write();

```

あとは、prepareを実行されるタイミングで置き換えがされます。

```shell
$ cordova prepare
```

[フックガイド](https://cordova.apache.org/docs/ja/latest/guide/appdev/hooks/)
Leetcode #404 Sum of Left Leaves

```swift
func sumOfLeftLeaves(_ root: TreeNode?) -> Int {
    var sum = 0
    helper(root, &sum)
    return sum
}

private func helper(_ node: TreeNode?, _ sum: inout Int) {
    if node == nil {
        return
    }
    if node?.left != nil && node?.left?.left == nil && node?.left?.right == nil {
        sum += (node?.left?.val)!
    }
    helper(node?.left, &sum)
    helper(node?.right, &sum)
}
```
JupyterLabでのtqdmがめんどくさい

# はじめに
tqdmとjupyterlab, pandasを合わせて使うといつもつまづくので、まとめておきます。

# 環境
Python: 3.7

# インストール

```bash 
pip3 install tqdm jupyterlab
```

# 諸々のインストール

```bash
pip3 install ipywidgets
jupyter nbextension enable --py --sys-prefix widgetsnbextension
jupyter labextension install @jupyter-widgets/jupyterlab-manager
```

# サンプル

```python 
import pandas as pd 
from tqdm import tqdm, tqdm_notebook

tqdm_notebook.pandas() # コメントが必要ならdesc='hoge'とする
df = pd.DataFrame([[1, 2, 3], [1, 2, 3], [1, 2, 3]])
df.progress_apply(sum)
```

# 参考
- https://github.com/mauhai/awesome-jupyterlab
- https://qiita.com/dialectic4th/items/368877009f15b6b551ff#ipywidgets%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
ソースの一部をrustfmtしたくないとき

## 初めに
clapで愚直に設定を書くときに活用しているOSSがあったのでメモ
階層構造にしない方が、見やすい場合に便利です
## やり方
`#[rustfmt::skip]`アノテーションを使う
### サンプル
お好みで手で整形して、アノテーションを使ってrustfmtの整形対象外とする
範囲はこの場合`fn parse_options`関数全体にかかります

```rust
#[rustfmt::skip]
fn parse_options<'a>(options: &'a ArgMatches) -> CoolToolOptions<'a> {
    CoolToolOptionsBuilder::default()
        .expect(options.values_of("expect").map(|x| x.collect::<Vec<_>>().join(",")),)
        .cmd_prompt(options.values_of("cmd-prompt").and_then(|vals| vals.last()))
        .multi(if options.is_present("no-multi") {
            false
        } else {
            options.is_present("multi")
        })
        .bind(options.values_of("bind").map(|x| x.collect::<Vec<_>>()).unwrap_or_default(),)
        .build()
        .unwrap()
}
```

## 参考
[github.com/lotabout/skim](https://github.com/lotabout/skim)
FCMでアプリ再インストールした際にPUSH通知が届かなくなる件

##今回の仕様
アプリ側でトークンを取得してからDBに登録してその登録されたトークン宛にPUSH通知を送信しています。
下記コードのタイミングです。

```Swift:code
InstanceID.instanceID().instanceID { (result, error) in
    if let error = error {
        print("Error fetching remote instance ID: \(error)")
    } else if let result = result {
        print("Remote instance ID token: \(result.token)")
        // FCMトークンを更新する
        registFCMToken(fcmToken: result.token)
    }
}
```

#**ど゛う゛し゛て゛と゛ど゛か゛な゛い゛ん゛だ゛よ゛お゛お゛お゛お゛お゛**
FCMでiOS端末にPUSH通知を送信しようとした時にサーバー側でこんなエラーが・・・
`The provided registration token is not registered. A previously valid registration token can be unregistered for a variety of reasons. See the error documentation for more details. Remove this registration token and stop using it to send messages.`
**様々な**って何！？
前まで送信出来ていたのにおかしい！
少しググってみたら再インストールとかが要因らしい。

##解決策
AppDelegateにこいつを追加してあげる。
重要なのはここ
>Messaging.messaging().apnsToken = deviceToken

```swift:AppDelegate.swift
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    print("device token regiter OK")
    // XXX: 再インストール時になぜかこれがないとPUSH通知がこないのでとりあえず書いておく。
    Messaging.messaging().apnsToken = deviceToken
}
```
~~コメントにある通りなんでこれで直るのかもよくわかってないです。~~
これでアプリを再インストールするとちゃんと届くようになりました。

うーん、PUSH通知は苦手！