OmniAICreator/Qiita-1.07M huggingface dataset:
Google Domainsで独自ドメインのメアドを作る場合に気を付けたいこと

# 概要

サービスを提供していると、ユーザーとコンタクトをとるための手段が必要になります。
Twitterで賄うこともできますが、今回はメールアドレスを利用するシーンを想定します。
例えばサービスのアドレスが```https://example.com```なら、メアドは```support@example.com```のような独自ドメインを冠したものがよいでしょう。
これがgmailだったりすると、本当に```example.com```からのメールかユーザーが判断できません。

私が公式ドキュメントの手順を実行し、これは注意が必要だと思ったポイントを解説します。


# 読者対象

- Google Domainsでカスタムドメインを設定している＆メールアドレスが必要


# 実践

## 手順はドキュメントに全て書いてある
まずは公式ドキュメントを読みましょう。
[メール転送を有効にする方法]の[メール エイリアスからメールを送信する]が送信でも独自ドメインを使用する場合の設定です。
https://support.google.com/domains/answer/3251241

手順が多いですが、設定自体にハマりやすいところは特にないと思います。
これで送信することができるようになりました。お疲れさまでした・・・といいたいのですが、先に次項を確認してから作業してください。
私がやらかしそうになったことを注意喚起しています:relaxed:

## 気を付けたいこと
  
### 実は独自ドメインで送信した風に見せているだけ
手順通りにやれば独自ドメインのメールアドレスで受信もできますし、送信もできるようになります。
しかし、受信側でメッセージのソースを表示すると、独自ドメインの転送先メアドが見えます:scream:
プライベートなメアドに転送していると、なかなかのダメージを被ることになりかねません。
そこで私としては、その独自ドメイン用に見られても問題ないメアドを一つ作ることをお勧めします。
面倒ではありますが、適切に分離するのが妥当でしょう。

### 選択肢があるということは必ず将来ミスしてしまう・・・だって人間だもの
これで安心と思っていたら、もう一つ落とし穴があります。
例えば```hoge@gmail.com```を作成して、転送設定で```support@example.com```を追加したとします。
Gmailって本文書き出すとFromが非表示になりますし、返信の場合、Fromは最初から表示されません。
送信の際、本文を書いて送信すると、デフォルトのメアドが```hoge@gmail.com```になっているため、supportに来たメールを```hoge@gmail.com```で返してしまいます:scream:
公式ドキュメントの[デフォルトの差出人アドレスを変更する]を参考にして、デフォルトの設定を```support@example.com```に変更してしまいましょう。
https://support.google.com/mail/answer/22370
[JavaScript] 特定のテキストを含む要素を取得する (without jQuery)

# 例題

```html
<ul>
  <li>田中 あすか</li>
  <li>中川 夏紀</li>
  <li>黄前 久美子</li>
  <li>久石 奏</li>
</ul>
```

この中から「久」を含む li 要素を取得する。jQuery を使えば

```js
$('li:contains(久)');
```

と書ける。では jQuery を使わずに同様のことを実現するのはどうしたらいいだろうか :thinking: 

# 解答

[Document.evaluate()](https://developer.mozilla.org/ja/docs/Web/API/Document/evaluate) と XPath の [contain](https://developer.mozilla.org/ja/docs/Web/XPath/Functions/contains) 関数を使う。

```js
let xpath = "//li[contains(text(), '久')]";
let resultType = XPathResult.ORDERED_NODE_ITERATOR_TYPE;

document.evaluate(xpath, document, null, resultType, null);
```

この式は独自のイテレータを返す。値は例えば次のように取り出す。

```js
let xpath = "//li[contains(text(), '久')]";
let resultType = XPathResult.ORDERED_NODE_ITERATOR_TYPE;
let results = document.evaluate(xpath, document, null, resultType, null);

while (true) {
  let li = results.iterateNext();
  if (!li) break;
  console.log(li)
}
```
```html:console
<li>黄前 久美子</li>
<li>久石 奏</li>
```

ちなみに、残念ながらこのイテレータは [iterable プロトコル](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Iteration_protocols#The_iterable_protocol) を満たしていないため、[Array.from()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/from) や [for...of](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...of) は使えなかった。

要素を最初の 1 つだけ取得する場合は `resultType` を変えて次のように書く。

```js
let xpath = "//li[contains(text(), '久')]";
let resultType = XPathResult.FIRST_ORDERED_NODE_TYPE;
let li = document.evaluate(xpath, document, null, resultType, null).singleNodeValue;

console.log(li);
```
```html:console
<li>黄前 久美子</li>
```

テキストを完全一致させる場合は XPath を次のように変える。

```js
let xpath = "//li[text()='久石 奏']";
```

# 参考

* MDN web docs
    * [Document.evaluate()](https://developer.mozilla.org/ja/docs/Web/API/Document/evaluate)
    * XSLT/XPath リファレンス
        * [contain](https://developer.mozilla.org/ja/docs/Web/XPath/Functions/contains) 
* Stack Overflow
    * [How to get element by innerText](https://stackoverflow.com/questions/3813294/how-to-get-element-by-innertext)
JavaScriptの可変長引数の個数

# 可変長引数の個数には気をつけろ

JavaScriptの可変長引数の個数には限界があり、うっかりハマる可能性があるということです。

# 例

例として、ある配列に別の配列を足したい時、`push`を使うとしましょう。
新しい配列を生成すればよいのではないかとお思いでしょうが、例ですので、まあ聞いてください。

```js
const array = ["foo", "bar"];
array.push(...createSomeArray());
console.log(array.length);
```

スプレッド構文を使えば、ループも書かなくてよく、便利です。
が、`createSomeArray`が50万の長さを持つ配列を返した場合、どうなるでしょうか。

```sh
# Node.jsで実行した結果
array.push(...createSomeArray());
      ^
RangeError: Maximum call stack size exceeded
```

エラーになります。

Cなどは関数を呼び出すとき、引数をスタックに積んでから関数呼び出しを行います。
JavaScriptでも内部で同様のことをしているのだと推察できます。

詳しい方、実際のところを教えてください。

# ちなみに
なお、Node.js v10.15.2で試したところ、`createSomeArray()`は125328個の配列まで返すことができました。
また、`--stack-size`オプションでスタックサイズを増やすことができますので、よければ試してみるとよいでしょう。

以上です。よろしくお願いします。
(2019/6/22)ExcelのSUMIFS関数で作られるテーブルとPower BIで作ったテーブルの数字が合わないときのTips

# 本記事で書く内容
ExcelのSUMIFS関数で集計された結果と同じ値のテーブルを作りたいとき、
リレーションシップによって集計値が合わない部分を無理やり合わせる方法です。

# 例：プロジェクトの予算と実績比較テーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60387/1eae0662-38b3-f180-15b4-ce2d7ab193df.png)

## 前提1: 予算と実績が別々に管理されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60387/82bb4797-9ce0-e7c8-df86-1f37fab9c8dd.png)

## 前提2: 2つの表はプロジェクトIDで紐づいています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60387/06444efc-d416-273d-dbd6-4a42e5f25b87.png)

## 前提3: プロジェクト実施部署≠予算拠出部署
プロジェクトIDに紐づく予算管理表の部署名と、プロジェクト管理表上の部署名は必ずしも一致しません。また１つのプロジェクトに対し複数の予算が使われる場合もあります。リレーションシップの変更も禁じられています。

## 前提4: 結果はSUMIFS関数の部署名ごとの集計と一致させます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60387/8e92ea54-7fdd-efc5-ba27-b20bf95f5193.png)

## 前提5: 前提4のExcelが間違った集計結果だと言ってはいけない
Power BIの正しい使い方だとは思いませんが、強いられている。

# 何が問題でどうやって解決するのか？
管理表の部署名を元に集計した場合は、Power BI上でプロジェクトIDによるリレーションが張られているため計算が合いません。

## 問題は部署名ごとに集計ができないこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60387/ecc8c283-07ba-e06a-ee0d-c2340429af8b.png)

## DAXを利用してProject IDによるリレーションを無効化した上で、部署名のマッチングのみで集計します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60387/d6deeecb-224c-52ca-712f-ac99439d35ab.png)
テーブル間のリレーションは変更しないまま、目的の値を取ってくることができました。

***Power BI内のテーブル名はそれぞれ下記とします。***
- プロジェクト管理表：Projects
- 予算管理表：Costs
- Project IDでFull Outerオプションでマージしたテーブル：Mapper



***DAXによる集計方法***
1. プロジェクト管理表と予算管理表で部署名が一致するものだけ集計する
2. 部署名が合わないものは、ALLEXCEPT関数でプロジェクト管理表側の部署名のみに合わせて集計する
3. Totalは別途計算する

```Project_Cost.DAX
対プロジェクト部門実績 = 
    IF(
        MIN(Projects[部署]) = MAX(Projects[部署]),
        CALCULATE(
            SUM('Mapper'[Costs.実績]), 
            FILTER('Mapper', [部署]=[Costs.部署])
        )
        + CALCULATE(
            SUM('Mapper'[Costs.実績]), 
            FILTER(
                ALLEXCEPT('Mapper', Costs[部署]),
                AND([部署]<>[Costs.部署], MIN(Projects[部署]) = [Costs.部署])
            )
        ),
        SUM('Mapper'[Costs.実績])
    )
```

※より良い方法が見つかり次第、更新したいと思います。アイデア等ありましたらご指摘いただけると幸いです。
Pythonで画像認識して適切なファイル名を自動で付ける-Microsoft Computer Visionを利用

今回のプログラムはPythonで指定のフォルダに入った複数の画像ファイルを認識してファイル名を自動でつけるプログラムです。

画像認識にはMicrosoft Computer Visionを利用しています。


##事前準備

Pythonで画像解析をするために、Microsoft Computer Vision APIのサブスクリプションキーの取得しておきます。

####取得手順.
Microsoft Azureにアカウント登録⇒無料サブスクリプションで登録⇒Computer Vision APIを利用⇒キーを生成⇒取得

下記ページで登録、取得して下さい。
https://azure.microsoft.com/ja-jp/

下記ページのキー 1、2のどちらでも大丈夫です。
![2019-06-22 14-17-29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442910/d5183c73-380b-a9ff-9a22-fe3e28eeb459.jpeg)



##プログラムのソースコード

```

# API reference :
# https://westus.dev.cognitive.microsoft.com/docs/services/5adf991815e1060e6355ad44/operations/56f91f2e778daf14a499e1fa
# 参考 : https://ledge.ai/microsoft-computer-vision-api/
# 機能概要 : img フォルダ中の画像をAI解析し、ファイルのリネームを行います。
# 使い方 : python3 cv_demo.py
# 注意 : サブスクリプションキーは変更してください

import requests
import glob
import os
import time

subscription_key = ""
assert subscription_key

vision_base_url = "https://westcentralus.api.cognitive.microsoft.com/vision/v2.0/"
analyze_url = vision_base_url + "analyze"


# ファイル名を変更
def file_rename(list_1, list_2):
    for i in range(len(list_1)):
        os.rename(list_1[i], './img/' + list_2[i] + '.jpg')


def ms_computer_vision_api(filepath):
    headers = {'Ocp-Apim-Subscription-Key': subscription_key,'Content-Type': 'application/octet-stream'}
    params = {'visualFeatures': 'Categories,Description,Color'}

    img = open(filepath, 'rb')
    img_byte = img.read()

    response = requests.post(analyze_url, data=img_byte, headers=headers, params=params)
    response.raise_for_status()

    return response.json()


if __name__ == "__main__":
    # 画像ファイルを配列に格納
    image_file = glob.glob('./img/*')

    vision_file_name = []

    start = time.time()

    # Computer Vision APIにリクエストして結果を取得
    for i in range(len(image_file)):
        json_data = ms_computer_vision_api(image_file[i])

        # 生成された文章を取得
        file_name = json_data['description']['captions'][0]['text']
        vision_file_name.append(file_name)

    # 文章の空白をファイル名用にアンダーバーに修正
    for i in range(len(vision_file_name)):
        vision_file_name[i] = vision_file_name[i].replace(' ', '_')

    file_rename(image_file,vision_file_name)

    # 経過時間を出力
    # print("elapsed_time:{0}".format(time.time() - start) + "[sec]")

```

上記　subscription_key = ""
のところに先ほどのキーの1または2のどちらかを入力しておきます。

カレントディレクトリに置いたimgファイルの中に解析したい画像を複数入れておきます。

##結果

![2019-06-22 14-27-40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442910/d885c3a8-29fa-97a4-5927-e90dd5ad98d8.jpeg)

上記のように画像解析してもともとあったタイトルを自動で適切な名前にリネームしてくれます。

詳細な解説はこちらのURLに書きました。
https://hashikake.com/image-rename
#CentOS 6.6(x86_64)にCUDA10.1とCUDNN7.6.0を入れる方法

# 事前にダウンロード
cuda-repo-rhel6-10-1-local-10.1.168-418.67-1.0-1.x86_64.rpm
libcudnn7-7.6.0.64-1.cuda10.1.x86_64.rpm

#script
```sh
yum install epel-release
sed -i "s/mirrorlist=https/mirrorlist=http/" /etc/yum.repos.d/epel.repo
rpm -i cuda-repo-rhel6-10-1-local-10.1.168-418.67-1.0-1.x86_64.rpm
yum clean all
yum install cuda
rpm -ivh libcudnn7-7.6.0.64-1.cuda10.1.x86_64.rpm
```
[Java] Comparableを実装していないクラスに対してコンパイルエラーが発生しない理由

Comparableを実装していないクラスを、TreeSetなどで扱う際、コンパイルエラーではなく、実行時エラー(ClassCastException)がスローされる仕様になっている。
これは、ジェネリクス使用時に、親クラスはComparableインターフェースを実装せずに、子クラスがComparableを実装するシーンを想定していると考えられる。

# 例

Musician親クラスはComaparableを実装していないが、子クラスが実装している。

```java

class Musician {

    public enum Category {
        ROCK, JAZZ, CLASSIC
    }

    public String getName() {
        return name;
    }

    public Category getCategory() {
        return category;
    }

    private String name;
    private Category category;

    Musician(String name, Category category) {
        this.name = name;
        this.category = category;
    }
}

class ChildMusician extends Musician implements Comparable {

    ChildMusician() {
        super("", null);
    }

    @Override
    public int compareTo(Object o) {
        return 0;
    }
}
```

実行

```java

Set<Musician> musicianSet = new TreeSet<>();
musicianSet.add(new ChildMusician());
```

子クラスの存在がなければ、一行目でコンパイルエラーを出した方が効率的だと考えられるが、子クラスが存在することもあるため、実行時にキャストのチェックをするようになっている。
Pythonでスクレイピング(BeautifulSoup)

python でスクレイピングをやったので、メモとして残しておきます。
([Pythonによるスクレイピング&機械学習](https://www.amazon.co.jp/Python%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0-%E9%96%8B%E7%99%BA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-BeautifulSoup-scikit-learn-TensorFlow%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86/dp/4802610793)を参考にやりました)

#BeautifulSoup

BeautifulSoup : Pythonでスクレイピングをするのに欠かせない優秀なライブラリ。
HTMLやXMLを解析するライブラリです。

##BeautifulSoup のインストール

```
$ pip3 install beautifulsoup4
```

pip3は、pipのpython3版です



#Yahoo!ファイナンスの為替情報取得方法
```sample.py
from bs4 import BeautifulSoup
import urllib.request as req

url = "https://stocks.finance.yahoo.co.jp/stocks/detail/?code=usdjpy"
res = req.urlopen(url)

soup = BeautifulSoup(res,"html.parser")

price = soup.select_one(".stoksPrice").string
print("usd/jpy",price)
```

#POINT

HTMLを解析したいと思った時は、BeautifulSoupが便利みたいです！
構造が複雑でも、必要なデータ・欲しいデータを簡単に抽出できます。
また、CSSセレクタを利用した抽出にも対応しているので、Webブラウザーで構造を確認すれば、任意の要素を手軽に取り出せます。

# 参考文献
[Pythonによるスクレイピング&機械学習](https://www.amazon.co.jp/Python%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0-%E9%96%8B%E7%99%BA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-BeautifulSoup-scikit-learn-TensorFlow%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86/dp/4802610793)
Vuefireが無いエラー【Vue.jsとfirebaseの環境構築】

## firebase×Vue.js×firestoreでアプリ開発
Vue.jsで実装したアプリをfirebase環境下で動かしたい。
firebaseを使うからには、DBはcloud firestoreを使おう

## 前提
* vue.jsをインストール
* firebaseをインストール
* vuefireをインストール
* firebaseの設定を書くファイル`firebase.js`を作成

## 環境
MacOS HighSierra
vue.js 2.9.6
firebase 6.11.0

## 問題点
Vuefireがインポートされない

```
export 'default' (imported as 'VueFire') was not found in 'vuefire'
```

## 問題のファイル内
`firebase.js`

```
import Vue from 'vue'
import VueFire from 'vuefire'

Vue.use(VueFire)

const firebaseApp = firebase.initializeApp({
firebaseの設定
})
```
```import VueFire from 'vuefire'```でインポートするときに、VureFireが無いよって怒られているみたいです。

## 解決方法
```
import Vue from 'vue'
import { firestorePlugin } from 'vuefire'

Vue.use(firestorePlugin)

以下略
```
インポートするときのプラグインの名前が異なっているようなので、```{ firestorePlugin }```と変数にしてあげたらうまく行きました。

## まとめ
アップデートで名前が変わることもありうるので、プラグインをインポートするときには変数名を入れてあげたほうが安全かもしれません。
勉強になりました。
JekyllのAtomの文字数を制限する

フィードに本文全部を含めると長くなりすぎて困る時用。

JekyllのAtom feedは<a href="https://github.com/jekyll/jekyll-feed">jekyll-feed</a>というgemで生成されています。
基本的には<a href="https://shopify.github.io/liquid/">Liquid</a>での文字数制限を行います。

フィードのテンプレートファイルはgem本体の中にあるので探して編集します。

```
$ gem environment
```

で場所を教えてもらえます。
私の環境の場合は「GEM PATHS:」の一番上のディレクトリにありました。

feed.xmlを編集します。
文字数制限には<code>truncate</code>または<code>truncatewords</code>が使えます。
日本語の場合は<code>truncate</code>の方が手っ取り早いでしょう。

```liquid
{% raw %}{{ post.content | strip | xml_escape | truncate: 100, "..." }}{% endraw %}
```

`100` の部分はお好みで。

編集には管理者権限が必要な場合があります。
また、**アップデートの度にやり直し**なので面倒ですが仕方ありません。

※こちらの記事はブログからの移転です。2017年6月6日初出。
【Unity】Zenject使用時にPlayModeテストに失敗する

# 問題

Zenject使用時に、PlayModeテストを行うと次のようにテストに失敗してしまうことがあります。

<img width="314" alt="スクリーンショット 2019-06-22 午後1.45.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/7ebd98f3-1e5f-9db7-943c-a80d7c9601eb.png">

```
Zenject.ZenjectException : Assert hit! Cannot load scene 'TestSceneContextEvents' for test 'TestSceneContextEvents'. The scenes used by SceneTestFixture derived classes must be added to the build settings for the test to work
```

# 対処法

`Assets > Plugins > Zenject > OptionalExtras > IntegrationTests > SceneTests > TestSceneContextEvents`

で、`TestSceneContextEvents`シーンをScenes In Buildに追加します。

これで無事にテストが通ります。

<img width="286" alt="スクリーンショット 2019-06-22 午後1.51.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/e62846f0-c8e8-9992-0833-438e4b584ed6.png">
FLASK 　ループでリストを出力【Windows.ver】

目標：ブラウザで下記を表示する
<img width="608" alt="2019-06-22 (6).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355304/80332acd-c2f9-f279-5a62-f6482ec16e70.png">

1.リストを作成する

sanrios=["キティちゃん", "シナモン", "マイメロ"]

<img width="491" alt="2019-06-22 (4).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355304/509e6e91-353c-f7be-1dcf-440503b17fe6.png">

return　ところに**sanrios=sanrios**を追記
retuen render_template("index.html, name_value=name, **sanrios=sanrios**)

2.ループで出力する
{% for sanrio in sanrios: %}
   <p>{{ sanrio + "はピューロランドにでかけた" }}</P>
<img width="478" alt="2019-06-22 (3).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355304/c8637260-dab8-e509-b89a-3ec65a46050e.png">

{% endfor %}を忘れずに。
データ解析ツールROOT入門

## 概要
データ解析ツールであるROOTを使ってみました。結構便利なので、インストールから簡単なデモまでを備忘録をかねて書いていきます。ROOTはpythoやC++に対応していますが、ここではC++を使います。ちなみにOSはmacです。

- 目次
    - [インストール](#link1)
    - [動作確認](#link2)
    - [ROOTの扱い方](#link3)
    - [マクロの記述](#link4)
    - [終わりに](#link5)


## <a name="link1">インストール</a> 
ROOTは https://root.cern.ch/downloading-root からinstallできます。最新のproduct版を選んで、バイナリで落としてください。落としたファイルを好きなディレクトリに置いて、パスを通せば終了です。僕の場合はホームディレクトリの.bash_profileに

```php:.bash_profile
source /usr/local/root6/bin/thisroot.sh
```
と記述しています。(落としたファイルをroot6という名前に変更しています)

## <a name="link2">動作確認</a> 
terminal上で

```php:terminal
$ root
```
とうてばROOTのロゴが表示された後に次のような画面になるはずです。
こうなれば正常に動作しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438362/93ee86ad-2e32-b173-11fd-be3040f71096.png)
<br>
毎回ロゴが出るのはうっとおしいので消しておきます。
ホームディレクトリ上の.bashrcに

```php:.bashrc
alias root='root -l'
```
と記述しておけば、自動でロゴが消えます。

ちなみに.bashrcがなければ、自分で作ってしまって、.bash_profileで

```php:.bash_profile
source ~/.bashrc
```
としておけば大丈夫です。


## <a name="link3">ROOTの扱い方</a> 
先ほどのようにrootコマンドを打つとROOTが起動します。そのコンソール上でROOTを操作していく形になります。以下にそのコマンドを何個か書いていきます。

#### .q
これはROOTのコンソール場から抜ける命令です。

#### .x hoge.cpp
hoge.cppというマクロファイルを実行しろという命令です。

<br>
なんとこの二つだけでだいたいどうにかなります！！！！！！(多分)



## <a name="link4">マクロの記述</a> 
C++のコード内にROOTコマンドを記述しておき、.xコマンドで実行できます。
例えば以下のようなコードをかき、実行すると図のようなヒストグラムが描画されます

```php:sample.cpp
//////////this code is to draw histgram ////////////

int sample(){
    gROOT -> Reset();

    int tem;
    int i=0;
    int data[30] = {0,1,1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,7,7,8,9,10};

    TH1S *h1 = new TH1S("Myhist","Scattering Angle",10,0,10);

    while(i<30){
        h1 -> Fill(data[i]);
        i++;
    }    

    h1 -> Draw();
    h1 -> SetTitle("Myhist");
    h1 -> GetXaxis()-> SetTitle("value");
    h1 -> GetYaxis()-> SetTitle("frequency");

    return 0;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438362/32a50d87-be21-a1fb-2315-4453f12de05f.png)


コードの解説をしていきます。
#### gROOT -> Reset();
描画のために用意してある変数(axisの名前やグラフのタイトル)をリセットしてくれるコマンドです。これをしないとめちゃめちゃなことになる可能性があるので入れるのがベターです。

#### TH1S *h1 = new TH1S("Myhist","Scattering Angle",10,0,10);
TH1Sクラスのh1インスタンスを生成します。TH1Sクラスは１次元ヒストグラムのクラスです。引数は
第1引数 : 名前
第2引数 : タイトル
第3引数 : 範囲の分割数(binの数)
第4引数 : 範囲の最小値
第5引数 : 範囲の最大値
この例で言えば、0~10を10分割している感じです。

#### h1 -> Fill(data[i]);
h1というインスタンスにdata[i]を入れてくれます。自動で数値の大小関係を評価して、当てはまるbinの度数を1増やしてくれます。


#### h1 -> Draw();
h1インスタンスを描いてくれます。Draw()のなかにアルファベットを入れることでオプションを使うこともできます。2つのグラフを同時に描画したりする際はこのオプションを使うと良いです。

#### h1 -> GetXaxis()-> SetTitle("value");
軸に名前をつけます。


## <a name="link5">終わりに</a> 
以上でざっくりとした説明は終わりです。
これらが理解できていればあとは公式のドキュメントを読めば
一人でかけるようになると思います。
jQueryのサンプルを見かけたら標準APIでも書いてみる。(selector 絞り込み


jQueryのサンプルを見かけたら標準APIでも書いてみます。
仮想DOM等他のライブラリ使わない、thisもなるべく使わない縛りです。

よく見かける、親セレクタを変更時に子セレクタを絞り込む実装です。

https://qiita.com/BRSF/items/1aa9d154bde497b0baa0
https://try-m.co.jp/blog/web-create/936/

### 方針

* 最初の子セレクタの順番をキャッシュしておく(ref
* DocumentFragment を backgound と foreground として使い　リアルDOMへのappendChildはなるべく一回で済ます。
* selected なるべく維持する

### こうしました。

https://qiita.com/BRSF/items/1aa9d154bde497b0baa0

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="nakoshi-k" data-slug-hash="PrpdKe" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="select filter">
  <span>See the Pen <a href="https://codepen.io/nakoshi-k/pen/PrpdKe/">
  select filter</a> by kei nakoshi (<a href="https://codepen.io/nakoshi-k">@nakoshi-k</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


https://try-m.co.jp/blog/web-create/936/

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="nakoshi-k" data-slug-hash="VJpEbE" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="VJpEbE">
  <span>See the Pen <a href="https://codepen.io/nakoshi-k/pen/VJpEbE/">
  VJpEbE</a> by kei nakoshi (<a href="https://codepen.io/nakoshi-k">@nakoshi-k</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
【完全無料】Linux(Unix)コマンドを覚えるたった一つの冴えたやり方

# はじめに
インフラや組み込みに限らず、Web開発でもLinuxコマンドに触れる機会は多いと思います。
最近ではAndroidのアプリ開発が隆盛しているようですが、AndroidもLinuxの一種です。

MacOSもUnixのOSなのでTerminalでコマンドを使って環境構築したり、Gitにコミットしたり…。
VagrantやDockerもガンガン使うと思います。
最近ではWindows上でも使えるようになりましたね。

今回は触れる機会の多いであろうLinuxコマンドを覚える方法を書いていきます。

たった２STEPです。滅茶苦茶簡単です。

# First STEP
まず、Ping-tをやりましょう。
問題集ですが、非常に解説が充実しているため、最初は正答率を気にせず解説だけ見るだけでもOKです。
私はこちらだけでLpic Level 1を取得しました。

https://ping-t.com/

最強WEB問題集LinuC/LPIC Lv1-101は無料です。
ひたすら繰り返して、完璧に仕上げましょう。
よく使うコマンドはこれをやるだけ殆ど網羅できます。

# Second STEP
仮想サーバをローカルに立てましょう。
手順はこちらがよさげです。
Windowsですが、基本的にMacでもいけるはずです。
https://qiita.com/100/items/80a899fbaeb1e82b3f67

インストールしたら設定をいろいろ変えて動かしてみましょう。

間違えて、ぶっ壊れたらインストールし直すだけです。
それもまた勉強です。

# おわりに
これだけです、簡単でしょう？
インフラエンジニアを目指すなら、もっと深い勉強をする必要があります。

しかしながら、触りや他ジャンルだけどLinuxを触るぐらいのエンジニアならこれだけで十分です。
エージェント経由してフリーランスエンジニアになってみたけど、実際は？

# はじめに
こんにちは、 @neet_se と申します。

私は今年からエージェント経由してフリーランスエンジニアとして働いています。
やっている案件はJavaのWeb開発です。
ちょうど半年経過したので後続に続く方の参考になるかと思い、つらつらと書いていきます。

# 仕事内容は、会社員時代とあまり変わらない
これまで、私はSESやSIerの会社で会社員を数年間やっていました。
所属する会社を経由して客先常駐をしていたわけですが、経由していた会社が雇用主の会社からエージェントに切り替わっただけです。
仕事の内容は劇的に変わりません。

変わったことは自分で案件が選べるようになったこと、自分の単価がそのまま懐に入ってくるようになったことぐらいです。
ただし、案件を選べるようになったとは言っても、お客様側も選ぶ権利はあります。
未経験の分野の仕事にチャレンジすることはハードルが高いです。

単価は…エージェントや案件によって結構違いがあります。
提示された最低の単価は54万から最高73万です。
同じ仕事内容でも、エージェントのマージンやお客様の提示する金額には結構差があります。

# でも、仕事に対するハードルは下がった
仕事内容はあまり変わりませんが、仕事のハードルが大幅に下がりました。
会社員の場合、案件の仕事以外に所属する会社の業務があります。
それらが全部なくなったので、定時外にモニョモニョする必要はなくなりました。
また、社内の人間関係もなくなったため、ストレスも減りました。

# どうどうと副業できるようになった
多くの会社は副業禁止規定があります。
隠れて副業することはできますが、フリーランスなら大手を振って行うことができます。
精神衛生的に非常によろしいです、ストレスも減りました。

# 他の人にもオススメできる？
目指すのは別に止めはしないけど、オススメもできないかなといった感想です。
一部のつよつよエンジニアを除いて、めちゃくちゃ儲かる仕事というわけではありません。
ただ、副業をやってみたかったり、色々と自由にやってみたい人には向いているかなと。
ここを足がかりにして、何かやりたい、将来的にこうなりたいとか目的がある人にはいいと思います。

# おわりに
私の考えですが、エージェント経由のフリーランスエンジニアはいずれ卒業するべきものです。
相談されたら、「中継点だと考えて」とお伝えしています。
ぶっちゃけ、業務経験2、３年も積めば誰でもなれます。
Scratchでクラウドリスト作ってみた

#きっかけ
「ずっと作りたかったんだけど無理だよね〜」みたいなことをツイートしたところ、たくさんの人に「できるできる」「意外と簡単」と励ましをいただいたのでその日のうちに我流で作ってみました〜！（実用性はないです）
ただプロジェクトを見てくれた人のユザネを保存するというだけの単純なプログラムです。クラウド変数も一個しか使ってないので、本当に少しのデータしか保存できません。（そういうのは後々改良します★）
#Scratchのクラウド変数のお話！
中身が保存できる変数。
チャットが簡単に作られて無法地帯と化すことを防ぐため、クラウド変数には**数値しか入れることができない**。
以前は10240文字も入れられたらしいが、2018年2月、256文字までに修正されたらしい。ウワーン
サインイン状態のScratcherしか使うことができない。
#クラウドリストって何？何するの？
リストに、例えば今までプロジェクトを見てくれた人のユーザーネームなどのデータを表示するもの。
応用すればゲーム作品の成績優秀者のスコアとユザネを保存して表示できる。
要するに、そういう風にクラウドリストを突っ込めばちょっとやりがいのあるゲームになるんです。。！（多分）
#（私の）作り方
##1.文字列を数値に変換。
さっきもお話しましたが。。w
クラウド変数には**数値しか保存できないので、文字を数字に変換**しなきゃならない。
どうやって変換するのか？
![スクリーンショット 2019-06-22 10.20.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289749/15feaf76-2cf7-f4ff-989b-26b869dcd2fd.png)
私はこういう風に文字を一文字ずつ手作業でリストにぶっ込んで、（）
![スクリーンショット 2019-06-22 11.38.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289749/979bfb8a-ab55-61f7-e086-35197f1da672.png)
このように組みました。
読んでいただければわかるとは思いますが、**1で次の文字、0で次の人の名前**に行くようになってます。
ここで私が無理やりぶりを発揮、「文字変換」リストの中の一の位に0、1が含まれる番目を抹消しました！これで復元の時安心だね♡
例えば**abci**をこの方法で数値に変換すると、**0213141121**となります。
##2.保存した数値を文字列に復元。
![スクリーンショット 2019-06-22 12.00.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289749/c2de5aa6-0177-60eb-4230-e51b72a2555b.png)
こんな風に書きました。**変数i**を少し上手く使えるようになったのは競プロのおかげだと思います。ありがとう競プロ(T . T)ウホウホ
数値を文字列に変換したら一時的に変数**文字列一時保管**に突っ込みます。
ユザネに1がつく人のために、文字列一時保管における改行は**&**としました。（人に言われて気づいた。。）
**1が2連続で続いている場合は、2文字目の1から「番目」判定**となります。~~だめだ語彙が。。~~
2桁の番号も、これで上手く文字に戻すことができました！フォエイ！
##3.ユザネを1つずつリストに表示。
![スクリーンショット 2019-06-22 12.28.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289749/5f077b1b-feea-268a-c250-7a67a69cae03.png)
最後のコードとなります。
文字列一時保管の文字を1文字ずつ文字列二時保管にコピーし、
次のユザネにうつることを示す**&**が登場したら文字列二時保管の中身をクラウドリストにつっ込んで、それから文字列二時保管の中身を消します。
**文字列一時保管の1文字目から&が入る仕様なので、クラウドリストの1つ目は空白になってしまうため最後にリストの1番目を削除します。**
できあがり〜！
#クラウドリスト作った感想
PTE（ペンテキストエンジン）作った時と、文字コードと文字を行ったり来たりする点ですごく似てました。でもそれよりはちょっと楽だったかな？
久しぶりにScratchを触ったのですが、作れて本当に良かったです。
夢がかなったぜい(((o(*ﾟ▽ﾟ*)o)))
まずは仕組みを理解しようってことで作ったので、これから改良していきたいです。
4月あたりの、自分がクラウドリスト作ろうとしてものすごく苦労してる感じの作品が出てきて、今回は人のも見てないしすぐ作れたのでちょっとだけ成長を感じました。
色々助言くださった人ありがとうございました！
知ってるScratcherさんの名前がいろいろ表示された時は飛び上がるほど嬉しかったです！~~飛び上がらなかったけどね★~~
#記事書いた感想
思っていたよりも日本語で説明するのが大変でした。（）
初めての記事です。
読んでくれた方ありがとうございました！
#よきScratchライフを。
【NOTE】List of Conda Command

　OSはWin10です。
　自分用のメモなので、詳しい説明は端折ります。
## インストール ##
　こちらの[インストールする手順](https://weblabo.oscasierra.net/python-anaconda-install-windows/)を参考にしてご覧ください。
　記載されたanacondaは**最新のバージョンではない**かもしれません。
## Anaconda Promptを開く ##
　**(base)**は、anacondaのデフォルトのベース環境を指します。
　今後、仮想環境を作ったら、**(仮想環境英数字名)**で表示されます。

　仮想環境をいくつ使っており、私は(base)環境をあまり使わないです。各環境へ切り替えるときだけ？使います。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443595/613f46f0-9274-e15a-38ee-26667599fdff.png)
## Promptにコマンドを入力する ##
　以下は愛用のコマンドです。

　1. `conda upgrade conda`
　2. `conda create -n [env_name] python=[ver_number]`
　3. `conda create -n [new_env_name] --clone [old_env_name]`
　4. `conda info -e`
　5. `conda activate [env_name]`
　6. `conda deactivate [env_name]`
　7. `conda remove -n [env_name] --all`
　8. `conda remove -n [old_env_name] --all`
　9. `conda clean --all`

(TBC)
はじめてのプロコンメモ(その4)

# はじめに
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)の類題もやっています
第 4 問(200 点)問題を解いています。

# [ABC 087 B - Coins](https://atcoder.jp/contests/abc087/tasks/abc087_b)

## 問題

```
あなたは、500円玉を A枚、100円玉を B枚、50円玉を C枚持っています。
これらの硬貨の中から何枚かを選び、合計金額をちょうど X円にする方法は何通りありますか。

同じ種類の硬貨どうしは区別できません。
2 通りの硬貨の選び方は、ある種類の硬貨についてその硬貨を選ぶ枚数が異なるとき区別されます。
```

## 標準入力
```
2
2
2
100
```

```Python
A = int(input())
B = int(input())
C = int(input())
X = int(input())
count = 0

for i in range(A+1):
  for t in range(B+1):
    for z in range(C+1):
      if X == 500*i + 100*t + 50*z:
        count = count + 1
print(count)
```

# [Cakes and Donuts](https://atcoder.jp/contests/abc105/tasks/abc105_b)

## 問題

```
ABC 洋菓子店では, 1個 4ドルのケーキと 1個 7ドルのドーナツが売られている.
このとき, 合計金額が Nドルとなる買い方はあるか, 判定せよ. ただし, 同じ商品を二個以上買っても良く, 買わない商品があっても良いものとする.
```

## 標準入力

```
11
```

## 作った解答

```Python
N = int(input())

count = 0

for i in range(100):
  for t in range(100):
    if N == 4*i + 7*t:
      count = count + 1

if count > 0:
  print("Yes")
else:
  print("No")
```

# [ARC 004 A - 2点間距離の最大値](https://atcoder.jp/contests/arc004/tasks/arc004_1)

## 問題

```
平面上に N個の点があり、それぞれ0からN−1までの番号が付けられており、それぞれの点について x座標と y座標が与えられています。その N点のうち 2点を選び結んで得られる線分のうち、最も長くなる線分の長さを求めてください。
```

## 標準入力

```
3
1 1
2 4
4 3
```

## 自分で作った解答
２次元配列を作るのにやたら手間取る

```Python
#平方根を求めるのでつかう
import math

#２次元配列は決まっているのでAに２次元配列をいれる
N = int(input())
A = [list(map(int, input().split())) for _ in range(N)]

largest_length = 0.0

for number in range(0,N):
  for number1 in range(0,N):
    x = A[number][0] - A[number1][0]
    y = A[number][1] - A[number1][1]
    length = math.sqrt(x*x + y*y)
    if largest_length < length:
      largest_length = length
print(largest_length)
```

## 参考資料
２次元配列をどうすれば入れられるのかわからなかったので下記リンクで解決した
https://qiita.com/naz_/items/9eed47f5483679fa66b1

http://kmjp.hatenablog.jp/entry/2013/04/06/1030

# [B - Sum of Three Integers](https://atcoder.jp/contests/abc051/tasks/abc051_b)

## 問題

```
2つの整数 K,Sが与えられます。
3つの変数 X,Y,Zがあり、0≦X,Y,Z≦Kを満たす整数の値を取ります。
X+Y+Z=Sを満たす X,Y,Zへの値の割り当ては何通りありますか。
```

## 入力例

```
2 2
```


## 解答

`z = S - x - y`の関係性に気づけなくて自力で解けなかったので解答をみた。
かなしい

```Python
K, S = map(int, input().split())

count = 0
for x in reversed(range(0,K+1)):
  for y in reversed(range(0,K+1)):
    z = S - x - y
    if z >= 0 and z <= K:
      print("x",x,"y",y,"z",z)
      count = count + 1
          
print(count)
```
lispでmigrationライブラリを作ってみた



Common Lispでmigrationが簡単に行えるライブラリを[cl-mgr](https://github.com/Masayukiii/cl-mgr)を作ったの紹介します。

# 初めに

Lispに関してはまだまだ初心者ですので、間違いがあればぜひご指摘ください。すごく喜びます。

最後にできていないこと、できなかったことを
まとめているのでご指導していただければ嬉しいです。

# cl-mgr とは

cl-mgr is a migration system like Ruby on Rails.

Ruby on Ralsのようにmigrationを通じて、
簡単にデータベースに変更を加えることができる
ライブラリです。

データベースとの接続やクエリの実行は、
[fukamachi](https://github.com/fukamachi)さんの[cl-dbi](https://github.com/fukamachi/cl-dbi)を利用しました。

## install
asdfを使って読み込みます。 
```
 (asdf:load-system :mgr)
```

## how to use
```cl

;; データベースとの接続
(mgr:connect-db "mysql" "database-name" "username" "password")
;; migrationファイルの作成。今のディレクトリ直下にできます。
(mgr:create "create_users")
;; migrationを実行します。
(mgr:migrate! "full migration-file path")
;; rollbackも可能です。
(mgr:rollback! "full migration-file path")
```

## migrationファイルの書き方
```cl
(in-package :cl-user)
(defpackage :3770156273_create_users
  (:use :cl
        :mgr))
(in-package :3770156273_create_users)

;; migrate!で実行されます。
(defup
   (create-table "users")
   (add-column "users" "name" "varchar(255)")
)
;; rollbackで実行されます。
(defdown
   (drop-table "users")
)
```

## 現在使えるクエリ一覧
ひとまずメインで使うコマンドだけを
実装しているので、対応しているクエリコマンドは
以下になります。(少ない...)

```cl
(create-table "name")
(add-column "table" "name" "data-type")
(drop-table "name")
(drop-column "table" "name")
```


## できていないこと(TODO)
- ほかのクエリにも対応する。
- データベースとの接続を毎回行うのは手間なので、設定ファイルを作って読み込む。
- schemaファイルを作成する。
- どのmigrationが実行されているのかわかるようにする。(up downの区別)

## つまったこと・よくわからなかったこと
- `There is no applicable method for the generic function`のエラーの解決方法。mgr内で定義していたexecuteが他のpackageと衝突していた気がする。

## できなかったこと

- disconnect-dbがうまく機能していない。コネクションが確立されたまま。

- defupマクロでup関数を定義しているのですが、
  upがmgrパッケージ内で定義されてしまい、migrationのpackage(ex. 3770156273_create_users)内で定義することができなかった。個人的にはup関数を実行するときはmigrationのpackage内のup関数を使いたかった。

- defupで簡単にクエリを記述できるようにしたが、
defupでup関数の定義、executeでup内のクエリを実行する流れはもっときれいにする方法がある気がする。
ターミナル起動時にrbenvのPATHエラーが表示される対処

* ターミナル起動時に以下のエラーが表示される。

```bash:
Last login: Sat Apr 29 18:13:19 on ttys000
-bash: export: `export PATH="/Users/自分のユーザーネーム$ /.rbenv/shims:${PATH}"
export RBENV_SHELL=bash
source '/usr/local/Cellar/rbenv/1.1.0/libexec/../completions/rbenv.bash'
command rbenv rehash 2>/dev/null
rbenv() {
  local command
  command="$1"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  rehash|shell)
    eval "$(rbenv "sh-$command" "$@")";;
  *)
    command rbenv "$command" "$@";;
  esac
}': not a valid identifier
-bash: touch: command not found
MacBook-Pro:~ 自分のユーザーネーム$ $ 
```

* まず最初にパスを確認するため、`.bash_profile`ファイルをテキストエディタで開く。
* `.bash_profile`は隠しファイルなので、Finder上で`command + shift + . `を同時に押すことで確認できる。
* ファイルを開いたら、以下のようになっていた。

```bash:
export PATH=/usr/local/bin:/usr/local/sbin:$PATHeval "$(rbenv init -)"
export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"
export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"
eval "$(rbenv init -)"
```
* ここで注目すべきなのが１行目。 `export ~ $PATH`と`eval "$(rbenv init -)"`は別の行にあるべきものなのにくっついて書かれている。今回は４行目にrbenvのパスがあるので１行目を削除したらエラーは表示されなくなった。

参考サイト： [Macのターミナルで起動画面時に以下のようなエラーがでてきてしまいました。](https://teratail.com/questions/74312)
【Mac】まだ初期のrubyバージョン使用しているの？rbenvを使ってバージョンをコントロールしよう！

#想定読者
- 初期のRubyのバージョンを使用している人
- rbenvを知らない人
- 最新のRubyを触りたい人。

#得られるもの
- 最新のRubyを使うことができる。(今回はRuby2.6.3を使用。)
- バージョンコントロールの方法がなんとなくわかる。


#準備するもの
- Homebrew
- 学ぶ気持ち

#筆者のPCスペック
-macOS Mojave 10.14.5

#rbenvって何？
簡単に言うとRubyのバージョンを簡単に変えることができるツールです。
ただし、バージョンを変えるだけで実際にはRubyをインストールはしません。
Rubyもインストールする際は**ruby-build**もインストールする必要があります。

#初めに
最初にHomebrewがインストールされているか確認しましょう。
Homebrewの確認は下記のコマンドです。

```console
$ brew -v
Homebrew 2.1.3
Homebrew/homebrew-core (git revision 66a23; last commit 2019-05-22)
```

※$マークはコピーしなくていいです。
上記が出なかったら[こちら](https://brew.sh/index_ja)からインストールしましょう。


#手順
##rbenvとruby-buildのインストール
下記のコマンドを打ちましょう。

```console
$ brew install rbenv ruby-build
```

実際に入っているか確認しましょう、

```console
$ brew list
autoconf	openssl		pkg-config	rbenv		ruby-build
$ rbenv -v
rbenv 1.1.2
$ ruby-build --version
ruby-build 20190423
```

先ほどインストールした以外にも```autoconf```や```openssl```、```pkg-config```等入っていますが、今は気にしないでください。

実際にインストールはできているので、次はrbenvの実行後を反映させる為の準備を行なっていきます。

##rbenvを初期設定する。
現在rbenvでrubyをインストールしても実行結果は反映されません。
シェルにrubyはrbenvでインストールされたものを使う事を読み込ませる必要があります。

下記のコマンドを打って初期設定を済ませてください。

```console
$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.bash_profile:

eval "$(rbenv init -)"

$ echo eval "$(rbenv init -)" > ~/.bash_profile
$ source ~/.bash_profile
```
こちらで準備ができました。
次にバージョンの選択を行いましょう。


##バージョンを選択する。
下記のコマンドを打つと、rbenvが持っているRubyのバージョンを全て表示してくれます。

```console
$ rbenv install -l
Available versions:
-----一部抜粋-----
  2.6.2
  2.6.3
  2.7.0-dev
  2.7.0-preview1
-----一部抜粋-----
```

今回は2.6.3を選択します。(2.7.0はありますが、安定版ではないので今回はインストールを行いません。)
選択すると、ruby-buildが自動的に起動し、インストールを行ってくれます。

```console
$ rbenv install 2.6.3
ruby-build: use openssl from homebrew
Downloading ruby-2.6.3.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.3.tar.bz2
Installing ruby-2.6.3...
Installed ruby-2.6.3 to /Users/username/.rbenv/versions/2.6.3
```

##選択したバージョンを使用する
下記のコマンドでどのrubyをインストールしたか確認できます。
*が今使っているバージョンです。systemというのは初期のバージョンを使用していることを指します。

```console
$ rbenv versions
* system (set by /Users/username/.rbenv/version)
  2.6.3
```

今回は新しくインストールした"2.6.3"を使用してみましょう。

```console
$ rbenv global 2.6.3
$ rbenv version
  system
* 2.6.3 (set by /Users/username/.rbenv/version)
```
実際にバージョンを確認してみましょう。

```console
$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin18]
```

これで無事にインストールできました！
違うバージョンを使用する際は再度バージョンを選択→インストール→選択する
を繰り返す事でバージョンを自由に変更することができます。
JavaでWebシステム開発やってたエンジニアがPHPとLaravel始めるときに参考にした記事や書籍

# はじめに
こんにちは、@neet_se と申します。

今までJavaのWeb開発をやっていたのですがPHP(FWはLaravel)の案件をやることとなり、慌ててキャッチアップすることになったので、その際に参考にした記事や書籍をシェアします。

参考までに私のスペックは大体こんな感じです。

・半年ほどインフラ

・半年ほどオフショア

・Javaに転向し2年ぐらい

・PHPはWordPress構築した際にチラ見した程度

# PHP

## PHP公式の日本語版
https://www.php.net/manual/ja/intro-whatis.php

いわずとしれたPHPの公式ページです。
PHPの文法や仕様を勉強するために参照しました。
とはいえ、直訳っぽい硬い日本語のため、あくまで参考程度。

どちらかというと、PHPがどうやって作られてるかの部分がとてもおもしろかったです。
https://www.php.net/manual/ja/internals2.php

## 独習PHP
https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92PHP-%E7%AC%AC3%E7%89%88-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/479813547X?SubscriptionId=AKIAIH26KBUKHNVIIQIQ&tag=tamagazine-22&linkCode=xm2&camp=2025&creative=165953&creativeASIN=479813547X

大体、こちらの本でPHPの基本的な情報は網羅できたかなと思いました。
私的にはスラスラと読めて、説明もわかりやすかったです。

しかしながら、プログラミングを殆どやったことがない人には難しいかもしれません。
そういった人はもっと易しい入門書をやるべきだと思います。

他言語経験者なら余裕だと思うので、そういう人がガッとPHPの知識を入れるのにはオススメです。

## PHPができても他言語の学習には役に立たない理由を考えてみた。
https://qiita.com/raccy/items/335b819626974f0a14cd

タイトルはアレですが、とても面白かったです。
PHP独特の仕様について書かれていて、｢え！？そうなの！｣と驚きに満ちあふれていました。
Javaのノリで書くとバグになりそうなポイントもなんとなく把握できました。

# Laravel
PHPには色々とFWがありますが、直近で触るのはLaravelであったため勉強することになりました。

## Laravel公式
http://laravel.jp/

言わずとしれたLaravelの公式サイトです。
とりあえず、全体をザッと見て、わからないことがあったらこちらで適宜調べるといった形を取りました。

開発環境の構築は公式サイトのこちらのページを参考にしました。
https://readouble.com/laravel/5.1/ja/homestead.html

## PHPフレームワーク Laravel入門
https://www.amazon.co.jp/dp/B07CLLW4MX/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

おそらくLaravelの入門書籍で一番有名な本。
内容も結構ゴツく、Laravelの主要な機能は網羅していたと思います。

説明もわかりやすかったため、概要はこちらで掴みました。
Webフレームワークの基本的な仕組みから書かれているので、初心者の方にもいいかなと思います。

## 絶対に挫折させないアプリ開発　はじめてのLaravel
https://plumsa.booth.pm/items/1048008

LaravelでTodoアプリを作ってみよう！という本です。
特徴は素のPHPで作り次にLaravelでも作ってみて、その違いを確かめるという本でした。

# 番外編
やっててわからなかったらTwitterでよく聞いてます。
TwitterやってるエンジニアはWebの人が多く、親切な人が多いので助かってます。

https://twitter.com/

わからなかったら聞く、大事。

# 最後に
Javaから入って、別の言語をやることになる方は多いので、何かのお役に立てればと思います。
RxSwift入門(座学)

# 目次
本日のアジェンダ

* 自己紹介
* 座学
  * rxとは?
  * rxの歴史
  * 簡単な概念
  * rxのメリットとデメリット
* ハンズオン！

## 自己紹介
![自己紹介 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187684/203ba963-edc2-5c47-0702-d7c62c060833.png)

## rxとは?
Reactive Extensions(Rx)の略称です
Rx、リアクティブプログラミングなど呼ばれることが多いです

今までのプログラムは主にTransformational programmingと呼ばれるものでした
[Transformational programming参考画像](https://www.google.com/search?q=transformational+programming&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjbypSc-_viAhUSNKYKHYpfBiMQ_AUIECgB&biw=1440&bih=697#imgrc=X-O5UdHDfnVIBM:)
みなさんも見たことがあるかと思いますが上から下にプログラムが流れていくこと
その都度内容、状態を条件によってプログラミング書いていくことが主流でした

リアクティブプログラミングは今までの縦方向に処理が進むのとは違い
`変更を伝播させるデータフロー指向のプログラミングパラダイムを指す`

・・・・・・・・・・・・・・・・・・・・・・・・・・😪
なるほど、わからん😊
ということでできる限りわかりやすく簡単に説明しようと思います〜

## rxの歴史
そもそもRxの考えがどこから生まれたのかというと
Microsoftが2009年に.Net Framework向けに提供したライブラリでした
しかし、その便利さから様々な言語に移植、提供され始めています

現在はReactiveXというユーザー名で各言語のライブラリが提供されています
https://github.com/ReactiveX

- Rxjs
- RxJava
- RxAndroid
- RxPY
- RxSwift
- RxGo
- rxdart
- RxCpp
- RxKotlin
- RxPHP

・・・・・・etc
詳しくはリンク先で確認してね🐦

## 簡単な概念
なぜここまでRxプログラミングが普及したのか？
それにはRxプログラミングの変更があったデータを伝播させる考え方が大きい理由の一つである

### データの変更を伝播させるとは？
わかりやすいもので言うとみんな大好きExcelさんにRxの考えが取り入れられています！
今回はGoogleのスプレッドシートを使用してどういうことか簡単に説明します！

## 登場人物
Rxにはよく２人の登場人物が出てきます

- 観察する人
    - 状態が変わったかを見守り続けて変わったときに何かをします
- 観察される人
    - 状態の変化を持ち続けていて変化があったら観察する人に伝えます

## rxのメリットとデメリット
`メリット`

- どの言語でもほぼほぼ同じ処理、ロジックが書けること
- 変更に強い！(そもそも状態の変化に対応するように作られている)
- Rxを仕事で使う機会が多い(むしろスマホアプリ開発使っていないところが減ってきています)

`デメリット`

- 強いて挙げるなら変更しないものに使おうとすれば逆にコストが高くなります・・・・

## 詳しい資料
詳細説明すると明日になってしまうので以下の資料とかを確認してみてください!
https://coffee-nominagara.com/2018-06-04-150921
https://qiita.com/nakailand/items/8b54dc9b4b39b0809c57

## ハンズオン
休憩してハンズオンしますー
https://qiita.com/r_chiba/items/5618a3dd96618222cca8
Pythonでファイル名に現在時刻を付ける【初心者向け】

Pythonでログ出力ファイルを作成するときに、ファイル名に現在時刻を入れたときのメモです。
あわせて、csv出力に関するメモも記載しておきます。

#現在日時の取得
`datetime.datetime.now()`で現在日時を取得できます。

```py
print(datetime.datetime.now())

>>2019-06-22 09:44:54.569669
```

#サンプル
ファイル名に現在時刻を入れて作成するサンプルです。
`datetime.strftime()`で日付フォーマット指定します。

```py
 now = datetime.datetime.now()
 filename = './output/log_' + now.strftime('%Y%m%d_%H%M%S') + '.csv'
 f = open(filename, 'w')
 writer = csv.writer(f, lineterminator='\n') 
```
実行すると、`log_20190622_094828.csv`のようなファイル名で作成されます。

##日付フォーマットの指定
ついでなので、C#のDateTime、DartのDateFormatのフォーマット指定と比較します。

| フォーマット  |  pyhton|  C#   | Dart  |
|:------------|-------:|-------:|-------:|
| 西暦(4桁)    | %Y     | yyyy    | yyyy    |
| 西暦(2桁)    | %y     | yy     | yy     |
| 月(2桁)      | %m     | MM     | MM     |
| 日(2桁)      | %d     | dd      |dd      |
| 時(2桁)      | %H     | HH       | HH       |
| 分(2桁)      | %M     | mm       | mm       |
| 秒(2桁)      | %S     | ss       | ss       |

<font color="DeepPink">月と分の大文字、小文字が逆なので、C#からPythonに移行する人はちょと注意が必要ですね。</font>

#csvファイル出力
`writer.writerow(リスト配列)`を使います。

```py
#リスト配列はそのまま、指定する
a = [1,2,3]
writer.writerow(a)
  
>>1,2,3

#Numpy配列は、tolist()でリスト配列に変換してから
b = np.array([10, 20, 30])
writer.writerow(b.tolist())

>>10,20,30

#文字列などは、[]でリスト配列にしてから
writer.writerow(["日付",now])
writer.writerow(["日付",now.strftime('%Y/%m/%d'),now.strftime('%H:%M:%S')])

>>日付,2019-06-22 11:38:23.506582
>>日付,2019/06/22,11:38:23
```
datetime形式をそのまま出力したときは、エクセルで開いたときにキレイじゃないです。
(エクセルのバージョンにもよるかも知れないですが。)
![csv日付.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438288/f228c714-a597-d7c3-f360-0f1bd77433ed.jpeg)
ShogiGUIをArchlinuxで動かす

## 将棋検討ソフトのShogiGUIをArchlinuxで動かしたのでその手順をまとめます


### 1. wineのインストール
```bash
$ sudo pacman -S wine
wine --version
wine-4.9
```

そのままexeファイルを起動させようとすると
/lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found
というエラーが出て起動できなかったのでlib32-glibcをインストール

```bash
sudo pacman -S lib32-glibc
```
### 2. ShogiGUIのダウンロード&起動
http://shogigui.siganus.com/download.html
公式サイトからインストール版ではなく、zip版のものをダウンロードします。
zipを展開し、コマンドラインから

```
 wine ShogiGUI.exe
```

でShogiGUIが立ち上がれば成功です。


### 3. wineの日本語化
このままでは日本語が豆腐のままなので日本語化対応をします。

```bash
sudo pacman -S winetricks
winetricks allfonts 
```

上のコマンドを実行しても、僕の環境では豆腐のままだったので下のサイトを参考に
http://bigmoro.cocolog-nifty.com/blog/2018/09/linux-mint-19-w.html

```bash
winetricks fakejapanese_ipamona
```
を実行したら、無事日本語化されました。

linuxで良い将棋ライフを
設定群の大幅見直し

「カスタマイズの効くポメラが欲しい」という理由で[droidVimを導入して](https://qiita.com/astrorobot110/items/d76e7358cc35929e90ba)以降、複数デバイスでvimを使うようになり、その際に設定ファイル群のロードをかなり工夫していました。が、そもそも既に用意してあるプラグインのディレクトリを使わずにコントロールするやり方が気に食わず、もっとスマートにやる方法を探していたところ、「それ `packadd` で出来るよ」という感じでヘルプファイルに書いてあったので、「じゃあ試そうじゃないか」となったわけです。ついでに他の気になっていた部分も後学だ、ということで調整しています。

## `packadd` #とは

[引用元](https://vim-jp.org/vimdoc-ja/repeat.html#:packadd)

> ### `:pa[ckadd][!] {name}`
>
> `packpath` 中の任意のプラグインディレクトリを検索し、見つかったプラグインのファイルを読み込む。ディレクトリは以下にマッチしなければならない:
>
>   ```pack/*/opt/{name} ~```
>
> 見つかったディレクトリは、もし含まれていなければ `runtimepath` に追加される。もしディレクトリ pack/\*/opt/{name}/after が存在すれば、`runtimepath` の最後に追加される。
> "pack/\*/start" からのパッケージの読み込みがスキップされた場合、次のディレクトリが最初に検索される。
>
>   ```pack/*/start/{name} ~```

今実現したい「デバイスを確認してプラグインを**読み込まない**ための設定」で必要なことはこのあたりまででした。

というわけで、条件付きで読み込みたい自作のプラグイン[^1]をすべて `pack/myplug/opt/foo/plugin/foo.vim` みたいな感じに移動しました。あとはプラグインディレクトリに条件をチェックして `packadd` でロードするスクリプトを置けば要件達成です…何だ簡単じゃねぇか。

```autoload/packer_example.vim
scriptencoding utf-8

function! packer#main() abort
    if exists('g:fooPath')
        packadd foo
    endif

    if exists('g:barExe')
        packadd bar
    endif
endfunction
```

一例としてこんな感じになりました。ここで読むスクリプトのリマップのタイミングの為、autoloadを使っています。

[^1]: 外部のプログラムに依存するものや、特定のディレクトリにファイルがあるけど、droidVimの場合クラウド同期して…という方法が現実的ではない、など理由は様々。

## `colorscheme` の行方

こだわりたいですよね、カラースキーム。最近はプラグイン管理スクリプトとgithubでさっくりとダウンロードして簡単に試せるいい時代ですが、そこからカスタマイズするとなると…あれ、何処に書くのがスマートそう？

### いままで

パッケージ管理に[vim-plug](https://github.com/junegunn/vim-plug)を使っているので、vim-plugでロードしたあとに読める場所、現環境では別ファイル化してあるのでそこに書いていました。そこからカスタムするとして、なんか長々と設定書くのがちょっと嫌だったんです。カラースキーム変えたときにもスクリプトの書き換え場所増えるし、ならカラースキーム変更したら後は勝手にカスタムした部分探してロードして欲しかったんです…素直にforkしたほうがいいんじゃねえかな？

### お箸の国の人ですから

目的と手段がめちゃめちゃになり始めていますが、 `autocmd` と `autoload` を使ってカスタム部分だけを動的に読めそうだったのでその路線でいきます。手順としては、カラースキームロード後に ``autocmd ColorScheme *`` で `autocmd` にあるカスタム部分をロード、この時に関数名を[波括弧変数](https://vim-jp.org/vimdoc-ja/eval.html#curly-braces-names)と ``g:colors_name`` を使って読んでもらいます。カスタムしてない場合もあるので、 ``try ~ catch`` を使ってなんとかしています。

```customCD.vim
scriptencoding utf-8

" カスタムしたカラースキームは $VIMFILES/autoload/ へ

" トリガー引く用
function! s:customCSLoader(name) abort
	try
		call ccs_{a:name}#main()
		let mes = printf('Loaded ''%s'' custom script.', a:name)
		let isFound = 1
	catch /E117/
		let mes = printf('No custom script for ''%s''.', a:name)
		let isFound = 0
	finally
		if v:vim_did_enter
			redraw
			echomsg 'costomCSLoader: '.mes
		endif
	endtry

	return isFound
endfunction

augroup customColor
	autocmd!
	autocmd ColorScheme * call s:customCSLoader(g:colors_name)
augroup END

if !v:vim_did_enter
	call s:customCSLoader(g:colors_name)
endif
```

``v:vim_did_enter``なんて変数があったんですね。今までvimrcに最初のスクリプト読み込み時だけ処理してほしい部分があったので、これで書き換えました。

## 結果

[いや、自分で言うのも何なんですがちょっと…偏執的だと思うんです。](https://github.com/astrorobot110/vimrc)
dict ってどう作るのが早いの？

# あらすじ
テストとかで dict たくさん作るときあるけど、どっちのほうがきれいに書けるかなーっておもったので、
実際に計測してみた。（ひまじんか）
縦に書くか、横に書くか、さあどうなるか。。

# 実行環境
[paiza.io](https://paiza.io/ja) にて python3 を指定

# 結果

方法１

```.py
import time
time_list = []
for times in range(100):
    start = time.time()
    a={}
    for i in range(10000):
        keys = [('customer{}'.format(i), '田中たろう'), ('phone_number{}'.format(i),'080-1111-2222'), ('order_number{}'.format(i), '0123456789')]
        tmp = dict(keys)
        a.update(tmp)
    elapsed_time = time.time() - start
    time_list.append(elapsed_time)
print(sum(time_list)/100)
# 0.015053222179412842
```

方法２

```.py
import time
time_list2 = []
for times in range(100):
    start = time.time()
    a = {}
    for i in range(10000):
        tmp = {}
        tmp['customer{}'.format(i)] = '田中たろう'
        tmp['phone_number{}'.format(i)] = '080-1111-2222'
        tmp['order_number{}'.format(i)] = '0123456789'
        a.update(tmp)
    elapsed_time = time.time() - start
    time_list2.append(elapsed_time)
print(sum(time_list2)/100)
# 0.011392412185668945
```
何回やってもかかる時間は `方法１ > 方法2` でした。

# まとめ
方法２のほうが行数かかるけど見やすいし早いからいっか！
Rails で名前付きルーティングと通常ルーティングを併用したいとき

## はじめに

Rails の URL で、通常の `/hoge/:id` のようなルーティングと `/hoge/fuga` のような名前付きルーティングを併用したいという課題がありました。

その際どのように対応したのかを備忘として残しておきます。

## 前提環境

* Rails 5.2.2.1

## サンプル例

`name` カラムのある `Post` モデルを例にします。

このモデルの `name` カラムに文字列が入っていれば、`id` ではなく `name` の文字列を URL として使うことを想定します。

* `name` が空 → `/posts/1`
* `name` に `hoge` と入っている → `/posts/hoge`

## 方針

方針としては、[Rails ガイド](https://railsguides.jp/routing.html#%E5%90%8D%E5%89%8D%E4%BB%98%E3%81%8D%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%89%E3%81%99%E3%82%8B) を参考に、以下のように進めました。

* routes で利用するパラメータ識別子修正
* ActiveRecord::Base#to_param をオーバーライド
* 名前付きルーティング・通常ルーティングどちらでもレコードを find できるメソッド作成

## 対応

### routes で利用するパラメータ識別子修正

まず、routes のパラメータ識別子を修正します。`param` オプションを使うことで可能です。

`id` か `name` で find したかったので、`id_or_name` というパラメータ名にしています。

```ruby
Rails.application.routes.draw do
  # 中略
  resources :posts, param: :id_or_name
  # 中略
end
```

### ActiveRecord::Base#to_param をオーバーライド

次に、`ActiveRecord::Base#to_param` をオーバーライドします。

`name` があれば `name` を、存在しなければそのまま `id` を利用する形としました。

```ruby
class Post < ApplicationRecord
  # 中略
  def to_param
    return name if name.presence
    super
  end
end
```

### 名前付きルーティング・通常ルーティングどちらでもレコードを find できるメソッド作成

最後に、`Post` モデルに名前付きルーティング・通常ルーティングどちらでもレコードを find できるメソッドを追加します。

`id` か `name` でレコードを検索し、どちらかがマッチしていればそのレコードを返却します。
存在しない場合は一応 `ActiveRecord::RecordNotFound` で例外処理しています。

```ruby
class Post < ApplicationRecord
  # 中略
  def self.find_by_id_or_name(id_or_name)
    if object = self.where(id: id_or_name).or(self.where(slug: id_or_name)).first
      object
    else
      raise ActiveRecord::RecordNotFound
    end
  end
end
```

利用するときは以下のようなメソッドの呼び出し方となります。

```ruby
Post.find_by_id_or_name(params[:id_or_name])
```

## 終わりに

`name` 重複する場合など、考慮する点はまだあるかも知れませんが、一旦こちらで対応はできました。

もっと良いやり方などありましたらコメントいただけるとありがたいです！

## 参考

* [4.10 名前付きルーティングのパラメータをオーバーライドする | Rails のルーティング - Rails ガイド](https://railsguides.jp/routing.html#%E5%90%8D%E5%89%8D%E4%BB%98%E3%81%8D%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%89%E3%81%99%E3%82%8B)
【Django】must supply a name attribute のエラー対処

## 原因
アプリ名を手作業で編集した時などに起きる。
apps.pyの設定が、setting.pyのINSTALLED_APPに反映されていないため。

## 解決方法
新規追加したアプリのフォルダ下にあるapps.pyにnameを追加する。
また【アプリ名】はsettings.pyのINSTALLED_APPのものと同一にする必要がある。

```python:apps.py
from django.apps import AppConfig

class 【アプリ名】Config(AppConfig):
    name = '【アプリ名】'
```
2019年版 リモートサーバでJupyter Notebookを実行する方法

GPU計算用に買ったWindowsマシンに、いつも使っているMacからリモートでJupyter Notebookを利用できるように設定をしたのでその覚え書きです。

設定方法についてはすでにたくさんの記事が書かれていますが、今はもっと簡単にできるようになっています。

## 前提条件
* ローカルのネットワーク内で利用
* サーバのOSはWindows 10
* ユーザーは１人

複数ユーザーの場合はJupyterHubを使うようにとドキュメントに書かれています。
[Running a notebook server — Jupyter Notebook 5\.7\.8 documentation](https://jupyter-notebook.readthedocs.io/en/stable/public_server.html#running-a-notebook-server)

## サーバ側の作業
### 1. パスワードの設定
`jupyter notebook password`を実行するとパスワードを聞かれるので、設定したいパスワードを入力します。

```
> jupyter notebook password
Enter password:
Verify password:
[NotebookPasswordApp] Wrote hashed password to C:\Users\masahiro\.jupyter\jupyter_notebook_config.json
```

パスワードを入力すると、パスワードから生成されたハッシュ値が自動的にファイルに保存されます。

```json:jupyter_notebook_config.json
{
  "NotebookApp": {
    "password": "sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed"
  }
}
```

[Automatic Password setup — Jupyter Notebook 5\.7\.8 documentation](https://jupyter-notebook.readthedocs.io/en/stable/public_server.html#automatic-password-setup)

### 2. ファイアウォールの設定
Jupyter Notebookが使うポートの通信を許可する設定を行います。
デフォルトでは8888ポートを使うようになっているので、下のページの手順にしたがって8888ポートの通信を許可します。

[Windows10で特定のポートを開放する – Born Digital サポート](https://support.borndigital.co.jp/hc/ja/articles/360002711593-Windows10%E3%81%A7%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E9%96%8B%E6%94%BE%E3%81%99%E3%82%8B)

### 3. Jupyter Notebookの起動
Jupyter Notebookを外部から接続できるように`--ip`オプションで接続元のIPアドレスを指定して起動します。`--ip=*`とするとどこからでも接続できるようになります。
サーバ側ではブラウザを開く必要がないので`--no-browser`オプションをつけて起動します。

```
> jupyter notebook --ip=* --no-browser
```

## クライアント側の作業
ブラウザを起動して、下のURLにアクセスします。
`http://[IPアドレス]:8888`

MacからWindowsに接続する場合はホスト名＋.localで指定することもできます。
`http://[ホスト名].local:8888`

接続するとパスワードを聞かれるので、設定したパスワードを入力します。
【Django】新しいアプリを追加するための手順まとめ

## はじめに
最近Djangoに触れ始めて、新しいアプリを追加する度に手順を忘れて調べなければいけないのは面倒なので、備忘録としてまとめておく。

## 方法
1. 以下のコマンドを実行
 
```
$ python manage.py startapp 【アプリ名】
```
1. urls.pyに追加する  
例:

```python:urls.py
urlpatterns = [
    path('【path/to/app】', include('【アプリ名】.urls')),  
    path('admin/', admin.site.urls),  
]
```
2. apps.pyを編集する  
例:

```python:apps.py
class AppConfig(AppConfig):
    name = '【アプリ名】'
```
1. settings.pyのINSTALLED_APPSにアプリケーションコンフィグを追記する。  
例:
  
```python:settings.py
INSTALLED_APPS = [
    '【アプリ名】.apps.AppConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
```
8080でLチカ

せっかくなので、Lチカやってみました。

EX-80の8255はA2がCS(Chip Select)になっていて8251はA5がCSになっています。

アドレスは以下のようになります。

|I/O|アドレス|
|:--|:--|
|8255|0xf8-0xfb|
|8251|0xde,0xdf|

EX-80の8255はPA全部とPCの上位5ビットが使われているのでPCの3ビット目(PC2)を使います。

```
	ORG	8200H
BLINK
	MVI	D,0FFH
	MVI	A,04H
	OUT	0FAH	# set 1 to PC2
	CALL	WAIT

	MVI	D,99H
	MVI	A,00H
	OUT	0FAH	# set 0 to PC2
	CALL	WAIT

	JMP	BLINK

WAIT	MVI	B,80H
LOOP	DCR	B
	JNZ	LOOP
	DCR	D
	JNZ	WAIT
	RET
```

PC2を当時作った74LS02を使ったロジックチェッカーで確認してみました。これはおそらく雑誌RAMのΛ-1の連載に載っていたのではないかと思います。当時通っていた中学校にマイコンを作ってる先生（お名前は忘れてしまったのですが、たしか理科の先生だった気がします）がいてRAMを貸してもらった記憶があります。

![写真（2019-06-22 10.08）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f522afda-ed47-31a0-5884-d587eaeb4b00.jpeg)

ハンダをパテローネに入れるアイディアはその先生に教えてもらいました。

![写真（2019-06-22 18.14）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/88f22cb9-1c45-f7f0-7de3-f55b8a1a6c46.jpeg)