OmniAICreator/Qiita-1.07M huggingface dataset:
チャート式ruby-appendix-II(my_help)

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# イントロ

my\_helpってのはcuiで使いやすいメモソフトを目指して，emacs org-mode + .my\_helpで実装されました．

my\_helpの使い方と振る舞いを紹介します．


# 使い方

-   [README](https://github.com/daddygongon/my_help)


# 振る舞い

-   ~/.my\_helpにmy\_helpのmemoが保存されます．
-   そのファイルから必要な情報を取り出し，
-   そのファイルの操作を行う．

という単純なアプリです．なので，基本的な編集操作はemacs org-modeがあればできます．viとかvscodeでもorg-modeは用意されていますので，editorを変更してそのまま使えます．


# emacs org-mode

ここでは，org-modeの使い方を紹介します．qiita\_orgでも同じです．


## 概要

org-modeはemacsに組み込まれているmajor-modeの一つで，TODOなどが書きやすい機能が用意されています．それだけでなく，pdf出力やmd・html変換, 数式・図・表の表示があるので，卒論，修論などのreportや本格的な論文を書くのにも多用します．


## 開始

-   emacs hogehoge.org

あるいは

-   M-x org-mode


## orgの体裁(markup)機能


### 見出し，リスト

```
* 見出し
** 子見出し
*** 孫見出し
** head付き項目
 - 項目1
   - 子項目1
   - 子項目2
 - 項目2
** 数字付き項目
 1. 最初の項目
 2. 二番目の項目
** 名前付き項目リスト
   - 名前1 :: 内容1
   - 名前2 :: 内容2
** チェックリスト [/]
   - [ ] チェック項目1
   - [ ] チェック項目2
```


### 文字修飾

-   前後に半角スペースが必要
-   **太字**
-   *斜体*
-   `_下線_`
-   `=固定幅=`
-   ~~消し線~~


## folding あるいはtoggle表示

これがorgの一番重宝している理由です．

-   titleやblockで :kbd:'tab' :arrow\_right: すると折り返しが効きます
-   shift-'tab'も違った挙動をします
-   folding, toggleと呼ばれます


## リンク

```
[[file:./tmp/tmp.txt][Link to file]]
[[link][name]]
```

-   to edit, c-c c-l
-   to open, c-c c-o
-   org-return-follows-linkが設定されていたらRETでも開く
-   internal\_Link
    
    ```
      * Headline 2
      :PROPERTIES:
      :CUSTOM_ID: my-headline-2
      :END:
    [[#my-headline-2]]
    ```
-   外部ファイルの中のcustom idにlinkする場合, <../README.md>
-   編集用表示，M-x org-toggle-link-display


## startup

'#+startup'でorg-fileを開けたときの振る舞いを調整できる．

-   indent, noindent
-   nolineimages,
-   content, overview, showall, showeverything


## verb\_and\_code

-   block quote
    -   ': 'を頭におく
    -   \#+begin\_example&#x2026;#+end\_example
    -   \#+begin\_quote &#x2013; #+end\_quote
-   inline quote or command
    -   `name` or `name`
    -   前後に半角空白がないと認識しない．
-   source
    -   \#+begin\_src ruby &#x2026; #+end\_src
    -   \#+begin\_src python -i &#x2026; #+end\_src  #-iがないとindentが不適切
    -   \#+begin\_src tex &#x2026; #+end\_src
-   include
    -   \#+name: ./codes/hello\_name.rb
    -   \#+include: "./codes/hello\_name.rb" src ruby -i -n


## 数式

mathjaxを使って，htmlあるいはqiitaでは表示．記法は，platexと同じ

```tex
$$
\int_{x=1}^{x=3}\ln \left(\frac{1}{4x}\right) {\rm d}x
$$
```

$$\int_{x=1}^{x=3}\ln \left(\frac{1}{4x}\right) {\rm d}x$$

文章中では，'$'一個で囲うとできます．safariだと複数の数式が一行にあるとうまく表示されないかもです．



------
 - **source** ~/git_hub/ruby_docs/chart_style_ruby/c02_my_help.org
Angularアプリをfirebase initとfirebase deployコマンドでwebに公開する手順

・前提条件
-ng build またはng build --prodでビルド成果物を作成済み
-firebaseコマンドを実行可能な環境に構築済み
-firebaseコンソールでプロジェクト作成済み

#手順
①下記コマンドを実行

```
firebase init
```

②下記のように回答

```
? Are you ready to proceed? Yes
```

③下記の文と選択肢が出るのでhostingをスペースで選択しエンター

```
? Which Firebase CLI features do you want to set up for this folder? Press Space to select features, then Enter to confirm your choices.
```

④下記のように回答

```
? Please select an option: Use an existing project
```

⑤下記のように回答

```
? Select a default Firebase project for this directory:{{firebaseコンソールで作成したプロジェクト選択}}
```

⑥下記のように回答(angular.json内のoutputPathの値のダブルクウォートは不要)

```
? What do you want to use as your public directory?:{{angular.json内のoutputPathの値}}
```

⑦下記のように回答

```
? Configure as a single-page app (rewrite all urls to /index.html)? Yes
```

⑧下記のように回答

```
? File dist/{{プロジェクト名}}/index.html already exists. Overwrite? No
```

⑨下記コマンドを実行

```
firebase deploy
```

#この手順で上手くいかないとき
-ブラウザのキャッシュをクリーンする
-ng build成果物と.firebasesrcファイルとfirebasejsonを消してもう一度ng buildからやり直す

#2回目以降のソースの修正を反映するための手順

```
ng build --prod
```

```
firebase deploy
```

これで更新が反映されます。
Arch Proの思い出

Seeed Ug Advent Calender ３日目の記事です

#Arch Proの思い出

## Arch Proの説明

    mbed対応
    プロセッサ:NXP LPC1768 MCU
    - ARM Cortex-M3コア
    - 動作周波数:最大100MHz
    - フラッシュメモリ:512KB
    - RAM:64KB
    - Ethernet, USBホスト/デバイス, SPI2, UART4, I2C*3
    CMSIS DAP経由でのデバッグ可能
    USB 仮想シリアルポート
    Groveコネクタ*2 搭載
    イーサネットコネクタ搭載
    3.3Vで動作するシールドを使用可能


って結構リッチな機能をもってましたね。

## Arch Proの価格

私はSeeedさんの半額セールで購入したので2～3000円であったと思います。


##Arch Proのすごかったところ
lan 端子がついているのでntp/メール配信はmbedでサクッとできて
こんなに簡単にできてよいの？と思った程です。
usb hostもできるし、grovoeのコネクターもついている。
しかも、この値段すごい。


##まだ売っているよ。
switchさんや、
https://www.switch-science.com/catalog/1568/
秋月さん
https://akizukidenshi.com/catalog/g/gM-09166/

## ディスコンなの？
秋月さんのページにディスコンマークが付きました。
そうですよね。もう登場して早５年、
最近はwifiにサクッとつながる製品もいっぱいありますよね。

## 感想
最近はいろいろなボードが出てきたのですが、
このボードは私が個人的にとても大好きなseeedのボードの１枚です。

３日目技術的な内容はスペックだけです。
これからも楽しく電子工作をしていきたいなぁと思っています。
pyyamlでハマったこと

#やりたかったこと

数値計算したデータを保存する時、二次元データならcsvでこと足りるが、dict型などのもっと複雑な構造を持ったデータをまとめて保存したいことがある。pickleを使う方法もあるが、pickleで保存してしまうとpythonを経由しないとデータが読めない。一方yamlならpyyamlを使うことでdict型を簡単に保存しつつ、テキストエディタからも読めるのでよい。

#ハマったこと

dict -> yaml -> dict　としたときに、dictの順序がどうなっているか？

pythonは3.7から辞書の順序を保存するようになっているので、当然順序を保存していてほしい……

が、実際は保存しない：

```python
import yaml

din = {"c":3,"b":2, "a":1}

fname = "tmp.yaml"

with open(fname,"w") as f:
    yaml.dump(din,f)
    print(din)
    #  {"c":3,"b":2, "a":1}
    print(yaml.dump(din))
    #  {"a":1,"b":2, "c":3}

with open(fname) as f:
    dout=yaml.safe_load(f)
    print(dout)
    #  {"a":1,"b":2, "c":3}
```

このようにdumpの段階で順序構造が破壊されてしまう。

#解決策

愚直なのは保存時にキーの順序も出力し保存しておく方法。
或いは[OrderedDictを使うようにする](https://qiita.com/podhmo/items/aa954ee1dc1747252436)方法もある。
Power BIによる町田市住民のセルフCivic Tech見える化活動

## はじめに
　今年の7月、Code for Japanさんが企画されました 行政職員向けICT体験型セミナー「情報の伝え方が変わる！Power BIでレポートを作ってみよう」に参加しました。
 - 7/19 [アーカイブ 第3回 行政職員向けICT体験型セミナー 「情報の伝え方が変わる！Power BIでレポートを作ってみよう(前半戦)」](https://sunabar.code4japan.org/2020/07/20/20200715-powerbi-1-archive/)
 - 7/29 [アーカイブ 第4回 行政職員向けICT体験型セミナー 「情報の伝え方が変わる！Power BIでレポートを作ってみよう(後半戦)」](https://sunabar.code4japan.org/2020/07/30/20200729-powerbi-2-archive/)

　そこで @yugoes1021 さんが講師をされていたハンズオンや、さいたま市さん、東京都さんが取り組まれていたPower BIのお取り組みにインスパイアされて、「よし私が住んでいる町田市のコロナ禍の情報も可視化をしよう」と思い立ち、Power BIを公開しています。また、そのデータの更新は、APIやCSV等によるデータが提供されているわけではないので、直接接続はないですが、家庭内で更新作業を半自動化しています。この辺りについて記します。

## 日々更新しているPower BIレポート

こちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/60ea88ef-7f19-b3c7-c97e-44cf664e165b.png)

- Power BIレポート →  https://bit.ly/Machida-COVID-19
- データソース [町田市における新型コロナウイルス感染症の状況 /町田市ホームページ](https://www.city.machida.tokyo.jp/iryo/hokenjo/health_crisis_management/number_of_infected.html)
- 参考 @yugoes1021 さん [[Power BI Tips] Power BI で信号機が作りたい - Qiita](https://qiita.com/yugoes1021/items/bb3b5c2c8b5d083ce211)

信号機は、最初移動平均にしていましたが、今は直近1週間で、20人を超えると赤、10人代は黄色、一桁は青色としています。
そして、グラフ上で、信号機が何色だったかも分かるページを別途作りました（前の積み上げのページへもPower BI内のリンクで残しています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/c86d09eb-f1bf-6a33-1302-459d09d313bd.png)

残念ながら11月は月次で最多となり、直近も赤信号点滅継続ですが、ちょっとでも見てくれた住民の方がいらっしゃってアラートと感じていただければと考えいます。

## 更新方法
　町田市側では17時以降にホームページのデータが更新されます。それを、我が家は3人家族なのですが、家庭内でシェアしているMicrosoft 365 Formsから登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/3f4df179-2339-82c7-038c-34730c4364a9.png)
そうすると、Power Automate経由で、Power BIのデータソースとしている、Excel Onlineに記録されるとともにIFTTT経由で、LINEにも通知されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/337cd92c-bd18-4ed4-a73a-bdc80e48d4b6.png)

8月までは私一人で更新していましたが、1日1回とはいえ面倒だったので、8月からは家族の協力を得て、更新を自動化している形となります。ビフォーアフターはこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/c83a9cea-2e52-4c0a-0ef4-bedeeabd7b47.png)

Power Automateの設定はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/9d078147-008f-9d56-0191-fd7cb47a46ce.png)

IFTTTではWebHookを受けて、LINE通知をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/ca360726-760a-8381-fc95-ed426f8a91e4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/947a0508-d8cb-9dd1-74a6-d2d3b72f6e51.png)

- (参考) [Power Automate から LINE に通知を送ってみよう - MoreBeerMorePower](https://mofumofupower.hatenablog.com/entry/2020/03/31/123000) 

## おわりに
　Civic Techの書き込みは初めてであり「これが、シビックテックといえるのか？」というも若干不安ですが、町田市民がコロナにやられすぎず、安心できるように自分も見える化何かできないかなぁ、と思ってやっている取り組みを発表しました。
　町田市には、現在約2,300人が参加しているfacebookグループがありまして、時々こちらの状況をレポートしています。
Reactを使って自動でスライドされるスライドショーを作る

# 追記
今はSwiper使ってる
https://swiperjs.com/
時代だねぇ

# Reactを使ってスライドショーを作るには？
私は、`react-swipeable-views`を使ってみました。
[react-swipeable-views](https://react-swipeable-views.com/demos/demos/) ←公式？サイトです。

# インストール
`npm install --save react-swipeable-views`
以下の3つのパッケージがインストールされる様です。

- react-swipeable-views
- react-swipeable-views-native
- react-swipeable-views-utils

# スワイプするスライドショーを作る
[公式のデモコード](https://react-swipeable-views.com/demos/demos/#simple)をパクって説明させていただきます。
スタイルは消しました。（テキトーに背景色でも入れてください）

```react
import React from 'react';
import SwipeableViews from 'react-swipeable-views';

function DemoSimple() {
  return (
    // ここでスライドが作られる
    <SwipeableViews enableMouseEvents>
      <div>slide n°1</div>
      <div>slide n°2</div>
      <div>slide n°3</div>
    </SwipeableViews>
  );
}

export default DemoSimple;
```
`react-swipeable-views`を呼び出して、
react-swipeable-viewsのタグ(`SwipeableViewsタグ`)の子要素にスライドさせたい要素を入れるだけです。
これだけで手動のスライドが作れます。

# 自動でスライドさせるには？
以下のコメントの部分を書き換えると自動的にスライドします。

```react
import React from 'react';
import SwipeableViews from 'react-swipeable-views';
// ↓追加
import { autoPlay } from 'react-swipeable-views-utils';

// ↓ここで自動的にスライドするようにする
const EnhancedSwipeableViews = autoPlay(SwipeableViews);

function DemoSimple() {
  return (
    // ↓ここも忘れずに変更する
    <EnhancedSwipeableViews enableMouseEvents>
      <div>slide n°1</div>
      <div>slide n°2</div>
      <div>slide n°3</div>
    </EnhancedSwipeableViews>
  );
}

export default DemoSimple;
```
しかし、これだと時間が設定できません。

# autoPlayのスライドする時間を設定するには？
`<EnhancedSwipeableViews enableMouseEvents>`部分にinterval属性を追加します。
例: 
`<EnhancedSwipeableViews enableMouseEvents interval={2000}>`
こんな感じで設定すると2秒置きにスライドするようになります。

デフォルトでは、`interval={3000}`になっているみたいです。

# やっていて困ったこと
公式のデモを見ていたら自動でスライドは出来ているけど、スワイプでスライドが出来ませんでした。
原因は属性に`enableMouseEvents`が無かったからなんですが、一瞬,`autoPlay`はそういうものなのかと思って使用を諦めるところでした。
なので、スワイプも自動でスライドもしたいって方は`autoPlay`と`enableMouseEvents`を忘れずに！！
Djangoを久しぶりに触る人が基本を思い出すための記事(2/3)～templates（html）～

##この記事の趣旨
Djangoを久しぶりに触らんといけなくなったけど、基本的なことを忘れてしまった。
そんな方に向けての記事です。（その２）
今回はtemplates（html）の記述方法。

[【前回記事】Djangoを久しぶりに触る人が基本を思い出すための記事(1/3)～ターミナル、urls.py、views.py～](https://qiita.com/taole33/items/9f7b0ea79a47648f37dc)

##基本
htmlファイルはtemplatesフォルダ内に置く。
djangoで使うif文やfor文などはhtmlファイル内に{% %}で記述する

```python:example.html
{% if 条件文 %}
処理したい内容
{% endif %}
```


##ベースとなるhtmlの作成
サイトで固定する部分（サイドバーなど）はベースとなるhtmlを作成しておく。
変更となる部分だけを別のhtmlで記述する。


ベースとなるhtmlの変更したい部分を{% block name %}{% endblock %}で記述する。

```html:base.html
<head>
　<!-- 固定となる部分は普通に記述する-->
</head>
<body>
    {% block name %}{% endblock %}<!-- 変更したい部分をblockで指定。
　　　　　　　　　　　　　　　　　　　　　　nameは任意の名前。-->
</body>
```


変更したい部分を記述したhtmlでは{% extends base.html %}でベースhtmlを必ず宣言。
変更部分を{% block name %}{% end block %}で記述する。

```html:example.html
{% extends 'base.html' %}

    {% block name %}　<!--nameはbase.htmlで指定した名前-->
    <p>変更部分を記述します</P>
    <p>タグなどは普通に使えます</P>
    {% endblock %}
```
これでexample.htmlにアクセスした時に、ベースを受け継いだhtmlが表示される。
（htmlはurls.pyとviews.pyでルーティングしないとアクセスできない）
ちなみに、ユーザーはbase.htmlにはアクセスしない。


##views.pyからhtmlへのデータの渡しかた
前回記事でも触れましたが、
●views.py内の関数（またはクラス）からの戻り値"render"などで渡す内容を指定
●renderの第二引数で渡す先のhtmlを指定
●renderの第三引数で辞書型で渡す内容を指定

```python:views.py
def example(request):
    return render(request, 
                  'example.html', #第二引数で渡す先のhtmlを指定
                  {'use_name':return_name} ) #第三引数で辞書型で渡す内容を指定
```



##views.pyで受け取った内容をhtmlで表示
views.pyから受け取った内容をhtmlに{{ }}で指定する。 

```html:example.html
<body>
{{use_name}} <!--第三引数の辞書の名前-->
<body>
```

##これらを組み合わせた例
下の例では、これまでの説明に加えて、
modelsやformsで取得した値も表示するようにしています。
modelsやformsについては次回の記事で触れます。


```html:example.html
{% extends 'base.html' %}

{% block title %}商品詳細{% endblock %}

{% block content %}
  <h3>{{ example.name }}</h3>
  <div class=""><img src ="{{ example.url }}" style="width:250px;height:250px;object-fit:cover"></div>
  
  {{ exmaple.price }}円

  <form method="post" action="{% url 'add' example.id %}">
    {% csrf_token %}
    <input type="submit" value="カートに追加">
  </form>

  <a href="{% url 'edit' example.id %}">編集</a>
  
{% endblock %}
```
Dreamforce 2020 簡易記事まとめ


# 12月3日(木)の午前3時に開催されたDreamforce 2020の主要なニュースの自分用まとめです。


[Salesforceの公式プレスまとめ記事(英語)](https://www.salesforce.com/news/stories/the-biggest-news-of-dreamforce-to-you/)
[Dreamforce Opening Keynote - Youtube](https://www.youtube.com/watch?v=vn2W34f77Ig)


## Salesforce Hyperforce
パブリッククラウドのAWS、Google Cloud、Azure上でSalesforceが実行できるそうです。
![hyper-globe-laptop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331690/4573db2b-f084-c4af-ddec-148846c3caba.png)

[Salesforce Hyperforce プレス記事(英語)](https://www.salesforce.com/news/press-releases/2020/12/02/introducing-salesforce-hyperforce/)



## Salesforce Einstein Automate
下記2つのツールをあわせてSalesforce Einstein Automateと呼んでいるみたいです。
・FlowOrchestrator
既存Flowに加えてAIで複雑なフローを簡易化できるそうです。
![FlowOrchestrator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331690/00678e81-65cf-fd29-59c8-1a7ceaa328cd.png)


・MuleSoftComposer for Salesforce
GUIで事前に構築されたコネクタのテンプレートを利用して外部システムと連携できるそうです。
![DF2U_Einstein_Automate-Composer.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331690/b47a439f-05fc-21fc-f5fe-fe62f4e1fa5e.gif)

[Salesforce Einstein Automate プレス記事(英語)](https://www.salesforce.com/news/press-releases/2020/12/02/introducing-salesforce-einstein-automate/)


## Service Cloud WorkforceEngagement
顧客の需要をAIで予想して適切なスキルをもった従業員を適切なタイミングで配置する管理システムだそうです。
![service-cloud-workforce-engagement.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331690/7b6eb39b-0f1e-c81f-a278-3d0e1f693e68.png)
[Service Cloud WorkforceEngagement プレス記事(英語)](https://www.salesforce.com/news/press-releases/2020/12/02/service-cloud-workforce-engagement/)
テスト実行時に DB の Port Listen を待つ

# 簡潔に

`wait-for-it` で特定の Port の Listen を待って、任意のコマンドを実行することができます

```bash
$ ./wait-for-it.sh -s -t 60 db:3306 -- php artisan test --testdox
```

# 対象読者

- テスト実行時に DB などの Port Listen を待つ必要がある
    - 特に、 CI 環境で DB をコンテナで立ち上げるときなど
- 今は `sleep` でなんとなく待って凌いでいるけど、本質的な解決じゃないのでなんとかしたいと思っている

以上の質問に全部 YES と回答した方

# wait-for-it とは

https://github.com/vishnubob/wait-for-it

- 特定のホストと TCP ポートが利用可能になるまで待つ機能をもった bash スクリプトです
  - 利用可能になるまで待ったあと、任意のコマンドを実行できます
  - 待つ時間の上限を指定できます ( `-t | --timeout` オプション )

## Installation

単純な bash スクリプトなので、 `git clone` するか `wget` 等で raw ファイルを DL するだけで使えます

```bash
$ wget https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh
$ bash ./wait-for-it.sh
Error: you need to provide a host and port to test.
Usage:
    wait-for-it.sh host:port [-s] [-t timeout] [-- command args]
    -h HOST | --host=HOST       Host or IP under test
    -p PORT | --port=PORT       TCP port under test
                                Alternatively, you specify the host and port as host:port
    -s | --strict               Only execute subcommand if the test succeeds
    -q | --quiet                Don't output any status messages
    -t TIMEOUT | --timeout=TIMEOUT
                                Timeout in seconds, zero for no timeout
    -- COMMAND ARGS             Execute command with args after the test finishes
```

- [Debian package があります][debian]

```bash
$ sudo apt install wait-for-it
$ wait-for-it
Error: you need to provide a host and port to test.
Usage:
    wait-for-it host:port [-s] [-t timeout] [-- command args]
    -h HOST | --host=HOST       Host or IP under test
    -p PORT | --port=PORT       TCP port under test
                                Alternatively, you specify the host and port as host:port
    -s | --strict               Only execute subcommand if the test succeeds
    -q | --quiet                Don't output any status messages
    -t TIMEOUT | --timeout=TIMEOUT
                                Timeout in seconds, zero for no timeout
    -- COMMAND ARGS             Execute command with args after the test finishes
```

- なぜか[Composer package もあります][packagist]
    - しかし fork されたもので最近は更新されてないので、公式を vcs で取り込むほうが良いと思います
    - Composer でインストールした場合は、デフォルトで `vendor/bin/wait-for-it.sh` にインストールされます

```json
    "require-dev": {
        "vishnubob/wait-for-it": "dev-master"
    },
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/vishnubob/wait-for-it"
        }
    ],
```

# 使い方

- 簡単なので [README](https://github.com/vishnubob/wait-for-it/blob/master/README.md) を見てもらうのが早いと思います
- もっぱら CI 環境で DB コンテナの起動待ちなどに使っています
    - 以下の用に、複数の Port を待ちたい場合は wait-for-it をチェインすればいいです

```bash
$ ./vendor/bin/wait-for-it.sh -s -t 60 db:3306 -- ./vendor/bin/wait-for-it.sh -s -t 60 selenium:4444 -- php artisan dusk
```

# 参考

- https://github.com/vishnubob/wait-for-it
- [wait-for-it - Debian package][debian]

[debian]: https://tracker.debian.org/pkg/wait-for-it
[packagist]: https://packagist.org/packages/masonitedoors/wait-for-it
経理業務とデータベースの関係性

この記事は[クラスター Advent Calendar 2020 - Qiita](https://qiita.com/advent-calendar/2020/cluster)の3日目の記事です。

# はじめに

こんにちは、kabanyasuです。11月よりクラスターの業務委託で会計周りの支援をやってます。
Advent Calendarに穴が空いたということで急に代打で書くことになりました。本当にありがとうございます。

さて、今回は経理業務において求められるデータベースの理解について書いていきます。


## 経理業務とは

また、経理業務とは以下のように定義されます
>企業のすべての活動を事実をもとに一定のルールに従って記録し、利害関係者に向けて報告すること

俗にいう「簿記」とは、企業の活動を帳簿に記録を行い財務諸表を作成することで、利害関係者（ex,銀行・投資家・税務署）に対して企業の財政状態及び経営成績等を報告する業務になります。

これらの記録のためには、経済事象に関する情報を取得し、それを会計情報に加工するといったプロセスが必要になる。情報の取得には、請求書の入手・クレカ明細の取得・データベースから決済情報を収集するといったものが該当します。

今回は、その中からデータベースから会計に関する情報を入手するために必要なプロセスを解説していきます。


## 会計とデータベースの関係

toCのサービスやソシャゲ等のサービスでは、課金によりゲーム内で利用可能なポイントを入手し、それを用いてプレイヤーがアイテムを購入する場合がある。しかし、課金兵の皆様はわかるかもしれないが、ソシャゲの1ポイント≠1円であることも多い。そのため、アイテムの取得単価を把握する必要がある。
また、コインは購入した時点で売上にはならず、ゲーム内でアイテムを購入するタイミングで売上認識する必要がある。
つまり、会計上正しく収益の金額を算定するためには、コイン数量の増減・コイン単価を正確に把握する必要があります。

そのため、各会社は会計情報を正確に把握するため、データベースからスムーズに会計数値を作成するために必要な情報を定義する必要がある。そのため、会計人材においてもデータに関する業務フローの理解は必要不可欠です。


## 具体的な例

### 業務とお金の流れについて理解

データベースの大量の情報から会計に必要な情報を抜き出すためには、まずビジネスの流れについて理解する必があります。そのため、最初にCFOの岩崎さんの協力を得て、クラスター株式会社のビジネスの内容を理解しました。そのヒアリングの中で、現状の情報入手経路とあるべき情報入手経路を比較するプロセスが発生します。

その後サーバーエンジニアの協力を得て、データベースにどのような流れでデータが反映されるのか、出力可能な情報は何なのかを理解します。

### 吐き出すデータの形式の依頼

出力できる情報が整理できたら、どのような形でアウトプットしてほしいかを定義します。アウトプットに際してはSQLを自力で書く・エンジニアに書いてもらうといった方法がありますが、今回はテーブル情報の要件をお伝えしてエンジニアに依頼して、redashのダッシュボードを作成頂きました。

### 再現性と可監査性の確保

これらのデータは一度作ったら終わりではなく、繰り返し誰でも使えるように設定する必要があります。
今回の場合においては、データの出力及び会計への反映のために以下のマニュアルも作成しました。

- redashから出力されるデータテーブルの要件（CCの枚数）
- コイン単価算定のためのスプレッドシート（CC1枚あたりの単価は1円とは限らないため）
- redashから出力される数字と残高試算表との整合性を確認するためのチェックシート
    - 損益計算書に反映される売上額との整合性確認
    - 貸借対照表に反映されるCC残高との整合性確認

これにより、CFOや監査人がデータベースと帳簿の整合性を確認することが容易になりました。


# さいごに

会計業務とエンジニアリングの相関関係についてはあまり認識されてませんが、このような形でデータベースから情報を取得する・残高を確認するといった業務に利用されることは多いです。
今回の事例を参考に、皆様の業務設計が効果的にできると幸いです。
php5.4.x系からphp7.x系への作業まとめ

最近久々にサーバーのリプレースに伴ってプログラムをphp5からphp7に上げる必要があり、再度調べたりしたので、今まであった修正を今後のためにまとめておきます。
ちなみに以下のような状況です。

* 複数クライアントに展開しているASPの保守を担当
* フレームワークは基本的にはfuelphpを使用、でも他社作成のコードの保守を行うこともある
* 未だphp5環境のサーバーで動かしているクライアントがいるので、php5環境でも動作は保証したい
* でも、一部php7に上げているクライアントがいるのでphp7対応にする必要がある
* php5.4系からのアップグレードが多い

# 新しいオブジェクトを参照渡しで代入できない
自社開発のコードでは出会ったことがないですが、外部ライブラリ使っているとよくあります。
以下のようなコード。

```php
class C {}
$c =& new C;
```

`Parse error: syntax error, unexpected 'new' (T_NEW) in ***** ` と怒られます。

[下位互換性のないその他の変更](https://www.php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.other.new-by-ref)に記載があります。

# countの引数にcountable ではない型を渡せない


これも自社開発のコードでは発生した記憶がないです。

```php
count(null);
```

とかすると`Warning: count(): Parameter must be an array or an object that implements Countable`と怒られます。

[php7.2の変更点](https://www.php.net/manual/ja/migration72.incompatible.php#migration72.incompatible.warn-on-non-countable-types)に記載があります。

# cURLでファイルをポストする時のオプションが違う
正確には、php5.6以上かそれ未満かでオプションが違う、というものです。
5.4系でも動くように作成したら、php7環境で動きませんでした。

以下の記事を参考にして対応しました。
こんな機会はなかなか無いとは思いますが・・・。
（参考）[PHP: VER5.6以降 cURLでファイルをポストする](http://blog.livedoor.jp/kmiwa_project/archives/1060091210.html)


# fuelphp1.8の場合に必要だった作業（おまけ）
1.8.2では対応されています。
（参考）[PHP7.2でFuelPHPがエラーになるのを何とかする](https://qiita.com/ichi_404/items/d5b656d4142b1e19d97e)

# PHP 5.4 系だと発生するエラー（おまけ）
**empty()の引数に関数を渡す**

php5.4以前に以下のような式を書くとエラーで怒られます。
php7からさわり始めた人はこのエラーに遭遇しやすいかも。

```php
empty(trim($name))
```

[emptyのパラメーターの説明](https://www.php.net/manual/ja/function.empty.php)にも記載があります。
[empty() が任意の式に対応](https://www.php.net/manual/ja/migration55.new-features.php#migration55.new-features.empty)にもあるように、php5.5から引数渡せるようになってます。
12月17日ウェビナー【モバイルアプリの品質向上: テスト自動化を導入する前に知っておくべき5つのポイント】

![Facebook Banner.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927922/91187722-cd9b-7123-b742-b028b7e11ecf.jpeg)

ご好評につき、12月17日 （木） (16:00- 17:00、日本時間)【モバイルアプリの品質向上: テスト自動化を導入する前に知っておくべき5つのポイント】のテーマで無料ウェビナーを開催いたします。

最近、デバイスの多様性と継続的なバージョン更新により、モバイルアプリの品質保証はますます複雑になっています。
テスト自動化が一番の解決策です。 しかし、多くの企業がそれを利用するのに苦労しています。
この分野での豊富な経験を持って、私達の視点を共有したいと思います。ご参加登録いただきますようお願い申し上げます。

---
申込URL：https://bit.ly/2VsMZST
---

###得られること
- モバイルアプリテスト自動化～成功方法
- テスト自動化スペシャリストとQ&A
- LQAスペシャリストとの無料相談会

###講演者
- スアン・フン - LQAの創設者／CEO, 元FPTのQAチームのリーダーであり, CloudATS & TestInsight のプロダクトオーナー
- ハイ・グエン - LQAの共同創設者/ CTO, 元FPTでの自動化テストサービスのCTO, CloudATSのプロダクトマネージャー
- 山下達哉 - LQAの日本市場の営業担当者
- ゴク・チャン - LQAの日本市場の営業担当者

###Lotus QAについて
Lotus QAは、ベトナム本社と日本法人を持つITオフショア会社です。
ヘルスケア、テレコム、ナビゲーションアプリなど、さまざまな業界の各大陸にお客様がいます。
LQAはベトナムのソフトウェアテスト企業トップ7にリストされています。
JS webApiを叩く (JSアウトプット)

##あいさつ
初めての人は初めまして！知っている人はこんにちは！
中学生バックエンドPGのAtieです！
今回はJSでwebApiを叩く最低限の方法を学んできたのでアウトプットします！
では！
##webApiとは？
まずはwebApiとは何かを解説していきます
そもそもApiとはApplication Programming Interfaceの略で
プログラムをの機能や管理するデータを外部からアクセスできるようにしたものです
そしてそのApiの通信方式がhttpなどのwebだったらwebApiと呼ばれます

実際にApiを見てみましょう
今回は[jsonplacefolder](http://jsonplaceholder.typicode.com/)というサービスを利用します
[ここ](http://jsonplaceholder.typicode.com/users)にアクセスしてみてください
json形式のオブジェクトがありますよね？よく見てみると今回はプログラミングのデータが入っています
これがApiです
そしてこのApiは通信方式がhttpなのでwebApiと呼ばれます


ちなみに「webApiを叩く」という表現はプログラマー的表現でwebApiを外部からとってくることを意味します
##webApiを叩く！
では実際にwebApiを叩いていきます
今回使うApiは先ほどのユーザが入ったApiを使っていきます

###fetch
まずはwebApiを叩く関数を定義しましょう

```main.js
function callApi() {
    console.log("webApi!!");
};
```

webApiを叩くにはfetchというメソッドを使う必要があります
fetchはメソッドなのでこのように呼び出す必要があります

```main.js
fetch();
```

fetchの引数にはApiのurlを入れます
なので今回は

```main.js
function callApi() {
    const res = fetch("http://jsonplaceholder.typicode.com/users");
    console.log(res);
};
```
このようにします
実行すると画面上にjson形式のデータが表示されると思います

###async await
しかしこのままではプログラム上では使いにくい形式となっているので使いやすい形式に変える必要があります

まずは関数のまえにasyncといれます
そうすることでこの関数は**非同期関数**と呼ばれる関数になります
悲壮機関数はawaitというのが使えるようになります

```main.js
async function callApi() {
    const res = await fetch("http://jsonplaceholder.typicode.com/users");
    console.log(res);
};
```

このプログラムを実行するとresponsというオブジェクトが返ってきます
このオブジェクトにはwebApiが叩けたかどうかなどの情報が入っていますがまだ使いにくいので使いやすくする必要があります

そのためにはresオブジェクトが持つjsonというメソッドを使います　

```main.js
async function callApi() {
    const res = await fetch("http://jsonplaceholder.typicode.com/users");
    const users = await res.json();
    console.log(users);
};
```

こうすると個々のデータが入った配列が表示されると思います
これで使いやすいデータになりました！

ここまででwebApiを取得することができました！

##さいごに
今回は非同期関数などにあまり深く触れていませんが初心者レベルだとこれだけで十分です
非同期関数などについてはまた今度詳しい記事を書こうと思います
Twitterしています→[AtieのTwitter](https://twitter.com/Atie_BackendPG)
では！また今度の記事で！

##参考、学習資料
[【JavaScript入門 #8】WebAPIを叩いてみよう！async await構文を使うと簡単！【ヤフー出身エンジニアの入門プログラミング講座】](https://www.youtube.com/watch?v=QugDLcOo_EE&list=PLwM1-TnN_NN7-zdRV8YsGUB82VVhfYiWW&index=8)
【Objective-C】OneWayのプロパティバインディング的なことを実装してみる

Objective-C未経験者が、急遽(品質の酷い)Objective-Cのアプリのお守りをすることになっったので、必死に勉強中しています。
中でも酷いと思った箇所のリファクタリングとして"OneWayのプロパティバインディング的なもの"を実装してみたので投稿してみます。

## 環境

- XCode : 12.2

## 困ったこと

- 数値を文字列として`UILabel.text`に設定、判定などに使うたびにLabelから取り出している。
- そんなことをしているもんだから、数値として扱いたいときにカンマなどの書式をリプレースで取っている。
- UIへの変更をメインスレッドで行っていない箇所がちらほらある。

## 改善ポイント

- ViewController側に、きちんと数値型のプロパティを持たせる。
- プロパティをコードビハインドで変更する都度、UIに変更を反映したいが、毎回プロパティの変更とUIへの反映を書くのは避けたい。
- プロパティの変更が非同期処理で行われてもUIへの反映はメインスレッドで行う。  

```objc:ExampleUIViewController.h
@interface ExampleUIViewController : UIViewController
    @property (weak, nonatomic) IBOutlet UILabel *exampleLabel;
    @property (nonatomic) NSInteger exampleNumber;
@end
```

```objc:ExampleUIViewController.m
#import "ExampleUIViewController.h"

@implementation ExampleUIViewController
/// exampleNumberを設定する
/// @param newValue なんかの数値
- (void)setExampleNumber:(NSInteger)newValue {
    _exampleNumber = newValue;
    
    // UIに変更を反映する
    __weak typeof(self) weakSelf = self;
    dispatch_async(dispatch_get_main_queue(), ^{
        weakSelf.exampleLabel.text = [NSString stringWithFormat:@"%ld", (long)newValue];
    });
}
@end
```

### Snippet
```objc
/// <#プロパティの説明#>を設定する
/// @param newValue <#プロパティの説明#> 
- (void)set<#PropertyName#>:(<#Type#>)newValue {
    _<#propertyName#> = newValue;
    
    // UIに変更を反映する
    __weak typeof(self) weakSelf = self;
    dispatch_async(dispatch_get_main_queue(), ^{
        weakSelf.<#IBOutlet UI Component#>.<#UI PropertyName#> = newValue;
    });
}
```

なかなかこんな酷い品質のアプリは無いと思いますが、
似たような境遇の方の一助になれば幸いです。
Xcodeで並列テストを利用する

Tipsです。

1. Edit Scheme>Test>Options>Execute parallel(if possible)をonにする。

のみです。あとはcmd+Uでテスト実行すれば、特に指定しなくてもXcodeが何かしらの判断をしてシミュレーターのクローンを作成して並列テストしてくれます。
ABCD2020Autumn参加レポート

##概要
2020年11月21日(土)に開催されたAndroid Bazaar and Conference Diverse 2020 Autumnの参加レポートです！

![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/a6bd8142-8093-1bb8-7eee-90e5ab44ee7f.png)
いつもは大学などの広い会場で開催されるABC/ABCDですが、
今回は東京(オンライン)と香川(サンポート高松 かがわ情報通信交流館(e-とぴあ・かがわ))と初の２拠点開催でした！

テーマは
「今こそ始めようワーケーション
～　コロナ禍で変わるAndroidビジネス、地方における働き方の変化と、技術を利用した新しいビジネスの探索　～」

新型コロナウィルスが猛威をふるい、働き方が変わってる昨今の情勢だからこそ届けたい＆知りたい情報がたくさん詰まったイベントでした！

公式サイト ▶️ https://sites.google.com/view/abcd2020a/

##担当
私は今回、
・[東京・メインチャンネル]の司会
・[香川・サブチャネル]での登壇
・スタッフユニフォームのデザイン
を担当させていただきました！

東京と香川...場所は離れてしまっているスタッフ達ですが、お揃いのパーカーを着たことで一体感が生まれたらいいなぁと思ってデザインしました
![スクリーンショット 2020-12-03 18.59.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/8f0cb574-d54b-5496-b4e7-241560c21abb.png)
うどんとお出汁カラーなパーカー
うどんドロイドくんから電波が出てオンラインなイメージです...ビビビ...

##紹介
一部のセッションをご紹介！

##[東京・メインチャンネル]
###①Jetpack Compose 入門 　Google 荒木佑一さん
![スクリーンショット 2020-12-03 18.14.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/8c3f2918-94eb-bb18-3701-894ca8cd2f05.png)
AndroidのネイティブUIを構築するための最新のツールキット「Jetpack Compose」についてのセッションでした！
いつもXMLで組んでいたUIがComposable関数を使うことによってとっても簡単に作れてしまいます！！
単純な文字の表示だけでなく、色の切り替えやアニメーションまでたった数行で書けてしまうと知って驚きました！
現在はアルファ版らしいので今後広く使われていく技術となるのかなぁと楽しみです！！

###②瀬戸内から世界中の茶の間へ  　Ongakushitsu Inc. 福島 節さん 真希さん
![スクリーンショット 2020-12-03 18.23.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/4fe74b10-7407-bf51-34d1-6792dd6f8a44.png)

東京から香川の直島に移住された音楽プロデューサーさんのご家族のお話でした！誰もが耳にしたことのある有名なCMソングなどを手掛けているすごい方ということもありセッション動画のクオリティがものすごく高かったです！
美しい歌と直島の素敵な映像で感動しました...
リモートワークがスタンダードになってきていることもあり、地方に移住してお仕事するという選択肢もいいなぁと改めて考えさせられました

##[香川・サブチャンネル]
###①上京のススメ若いもんはとりあえず東京来いや！ 　一般社団法人ハッシャダイソーシャル 三浦宗一郎さん
![スクリーンショット 2020-12-03 18.45.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/2cfb61a1-b9a1-5324-d3c5-1c480eafc2e8.png)
メインチャンネルとはうってかわって愛知から東京に上京されたことについてのお話！
実は前後のセッションも地方から上京してきたお話で、私のセッションもその一つだったりします！
三浦さんが上京してよかったことを3つお話されたのですが、その中の「地元の美しさがわかる」という言葉が私にとても刺さりました。東京の良さも地方の良さもそれぞれを知っているからこそ、感じることができるものだと思います！
新しい環境に飛び込むことはとても勇気がいることですが挑戦する人が増えると嬉しいです！

##参加したかった！
そんなあなたもご安心ください！
YouTubeにアーカイブが残っていますのでこちらからご覧ください！！
ご紹介しきれなかった方々のお話もとっても面白かったのでぜひぜひ覗いてみてください！
[[東京・メインチャンネル]](https://www.youtube.com/playlist?list=PLY9qiVhm-zZzoJ33P7KXt6Rs1CnOdx76h)
[[香川・サブチャンネル]](https://www.youtube.com/playlist?list=PLY9qiVhm-zZxHqYr2HYy4b_F5ZCXuKiUB)

##最後に
ディップ Advent Calendar 2020 3日目にして夜遅くの投稿＆宣伝チックになってしまってすみません😭
我が社は社外でのイベントへの参加活動をガンガン推奨してくれる素敵な会社です！！
（またもや宣伝チック...?）
pyenvでPython3環境構築  

## このページ分かる事  
mac(ubuntuでも可)でpython(主にpython3系)環境を構築する事が出来ます。

pyenvとは、OS上のpythonのバージョンを管理することができるツールです。macには購入時からすでにpython2系(バージョン2.??って奴)がインストールされています。しかし、これからpythonを勉強しようとする場合は、python3系(バージョン3.??って奴)が主に使われています(? ROSとかやるなら別かもですね)。そこで、python2系とpython3系の両方の環境を管理するために、Pythonの開発環境を作成する際にはpyenvなどのバージョン管理ツールを用いることが主流です（主流は言い過ぎかもですが、バージョン管理ツールを使っておらずあとで面倒になることがます。なので、僕はバージョン管理ツールを利用する事をおすすめします。）。

pyenvとは、OS上のpythonのバージョンを管理することができるツールです。この記事ではpyenvを用い、pythonバージョンを自由に切り替えられるようにpython環境を構築します。つまり、ターミナル(端末)上で```python```と打った際のpythonのバージョンを好きに切り替えられるようにpython環境を構築します。

## 対象OS
僕は以下のバージョンでやりました。
- mac(10.0.1)
- ubuntu(18.04.5 と 20.04)

## 環境構築開始
## 1. pyenvのインストール
公式github?([pyenv](https://github.com/pyenv/pyenv))によると以下でpyenvをインストールすることができます。
まず、ターミナル(端末)を開き以下のコマンドを入力+Enter

```
 git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

その後以下のコマンドを入力(bashの場合)。
(bash以外のshellを使っている場合、については公式github([pyenv](https://github.com/pyenv/pyenv))のreadmeい書いてあります。)

```
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
```

## 2. pythonのインストール
以下のコマンドをターミナル(端末)に入力+Enter。好きなバージョンを選んでください。
```pyenv install --list```でインストール可能なバージョン一覧を見ることができます。

```
pyenv install バージョン
(例) pyenv install 3.6.0
```

## 3. インストールしたpythonを利用するように設定する
以下のコマンドをターミナル(端末)に入力+Enter。

```
pyenv global バージョン
(例)pyenv global 3.6.0
```

## その他のpyenvコマンド

### - ```pyenv versions```
インストール済のpythonのバージョン一覧を調べる。ここに表示されるバージョンはすでに```pyenv install バージョン``` 済であり、```pyenv global バージョン```する事が出来る。


### - ```pyenv update```
pyenv時代のバージョンアップ方法->公式github([pyenv-update](https://github.com/pyenv/pyenv-update))。するべきかはわからん。
1.インストール

```
git clone https://github.com/pyenv/pyenv-update.git $(pyenv root)/plugins/pyenv-update
```

2.アップデート

```
pyenv update
```
SwiftでコードからファイルをZip,Unzip 【iOS】


**[ZIPFoundation](https://github.com/weichsel/ZIPFoundation)**をつかって、SwiftでファイルをZipに圧縮・解凍ができます。

###1、SwiftパッケージマネージャーでZIPFoundationをプロジェクトに追加。
Dependenciesに加えるのを忘れずに。
![スクリーンショット 2020-12-03 10.44.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/c837d68b-6c8e-6c53-dc13-e4e416475a4f.png)

###2、ZIPFoundationをインポート

```swift
import ZIPFoundation
```

###3、圧縮
sourceURLのファイルが圧縮され、destinationURLにZIPとして保存されます。

```swift
do {
    try FileManager.default.zipItem(at: sourceURL, to: destinationURL) // destinationURLは拡張子が.zip
} catch {
    print("Creation of ZIP archive failed with error:\(error)")
}
```

###4、解凍
sourceURLのZipが解凍され、destinationURL（ディレクトリ）に展開されます。

```swift
do {
    try FileManager.default.createDirectory(at: destinationURL, withIntermediateDirectories: true, attributes: nil)
    try FileManager.default.unzipItem(at: sourceURL, to: destinationURL, skipCRC32: true)
   } catch {
    print("Extraction of ZIP archive failed with error:\(error)")
   }
```

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
RaspberryPi ４ (4G/8G)環境設定用のMakefile / スクリプトを作った

# 目的
起動用の設定や、起動後のOS設定やアプリケーションインストールを自動で行う Makefileやスクリプトを作ったので、その紹介です。Makefileは 8G版メインですが、4G版でも使えます。設定スクリプトは、Pi4以外でも使えると思います。

# Raspberry Pi4 の FreeBSD での対応

RaspberryPi 4 が発売されて一年、8G 版が発売されて半年経ちますが、FreeBSD の対応はどうなってるのでしょう。現在は1/2/4G版までは普通に(RaspberryPi3B用イメージが)起動し、8G版はひと工夫しないと起動しません(2020/12/03 段階のsnapshot でもだめでした)。
相変わらず内蔵 WiFi/Bluetoothは動きません。

実際の設定に関しては [山本さん(@bsd-hacker)の記事](https://qiita.com/bsd-hacker/items/513449dab2a9b144373f "FreeBSD on RaspberryPi 4 Model B 発動篇")に詳しく書いてあります。

# 8G版イメージを作る Makefileを作りました

8G のイメージ作るのが地味に面倒なので、
<pre>
**最新スナップショットイメージをダウンロードする**
↓
**8G版で必要なファイルをダウンロードする**
↓
**イメージのファイルを差し替え**
↓
**環境設定用スクリプトをイメージにインストール**
↓
Pi4 8Gで起動するイメージ完成
</pre>

を勝手にやってくれる Makefile とスクリプトを作りました( https://github.com/s-mitu/FreeBSD-raspberrypi-make )。「環境設定用スクリプト」については後述します。

使い方は FreeBSD 環境で
<pre>
git clone https://github.com/s-mitu/FreeBSD-raspberrypi-make
cd FreeBSD-raspberrypi-make
make
</pre>
を実行します。
しばらく待つと、`freebsd-pi.img` ってのができるので、それを dd コマンドなりで SDカードに書き込めばOKです。
SDカードは 3G以上の容量があればOKです。起動時にSD全体に領域を拡張してくれるので、大容量SDでも使い切ってくれます。
出来たイメージは 1/2/4G版でも動きます。これらのバージョンは小細工は不要なので、Makefileを使わなくてもFreeBSD公式イメージのまんまでOKなのですが、最新イメージダウンロードを勝手にやってくれる点と、インストールされた設定用スクリプトが使える点でまぁまぁ便利かも(弱い推奨)。


(※)RaspberryPi の EEPROMが古い場合があるのでその場合はアップデートする必要があります。「Raspberry Pi 4 EEPROM boot recovery」をSDに焼いて起動してupdateします。

# インストールされた設定スクリプト setup.sh の使い方

SD挿して起動し、ログインプロンプトが出るところまで来たら第一段階成功です。

| | name| pass |
|:--|:--|:--|
|スーパーユーザー|root|root|
|一般ユーザー|freebsd|freebsd|

DHCP環境でLANケーブルを挿せば、ネットワークも使えるはずです。
そのままの環境だと何も入っていない状態です。ここで「環境設定スクリプト」を実行すると、タイムゾーンを日本にしたり、X環境 pkgを入れたりする一通りの設定が実行されます。
スクリプトは `/boot/msdos/setup.sh` に入っていますので、実行して数時間放置すると環境が設定されます。
具体的に setup.sh が実行するのは

* タイムゾーンを日本に設定
* ntpdate を起動時実行に設定 & 実行
* powerd を起動時実行に設定 & 実行
* WindowManager fluxbox インストール(依存するX関係のpkgがインストールされる)
* RaspberryPi でXを実行するためにグラフィックドライバxf86-video-scfb をインストール
* 日本語フォント noto インストール
* dbus を起動時実行に設定 & 実行
* sudo をfreebsdユーザーに許可
* 日本語入力環境として ibus/mozc をインストール
* fstab で / のマウントオプションに noatime を追加(SDへの余計な書き込み削減のため)

地味に「グラフィックドライバxf86-video-scfb」入れるとか「dbusを起動する」とかがハマりどころなので、スクリプトで勝手にやってくれるのは楽だと思います。
最後の行でコメントアウトで xfce4 のインストールする行もあります。8G版ならデスクトップ環境も普通に動きますので、使いたい方はコメントを外すか、後からその行だけ実行してください。

setup.sh実行後、追加で `/boot/msdos/setup-xlogin-slim.sh` を実行すると、Xログインマネージャーの slim と slim用 FreeBSDスキンがインストールされます。起動するとデーモン君のXのログイン画面が出るようになります。

setup.sh スクリプトは単独で実行可能なので、公式イメージにスクリプトだけ持ってきて実行するのも可能です。スクリプト自体はRaspberryPi4限定な要素はないので、Pi3/Pi2/PiZeroでも使えると思います。

# 動画
起動してslimでログインし、xtermを開いて、GPIO操作を行い、Lチカまで実行する動画です。撮影しながらタイプしてたどたどしかったり、コマンド打ち間違えでコマンドライン睨んだりの実録動画です。

[![RaspberryPi4 8G 起動動画](https://img.youtube.com/vi/ImJnjakuDGw/0.jpg)](https://www.youtube.com/watch?v=ImJnjakuDGw)

# カスタマイズ
スクリプトは、「fluxbox使いたくない」「そもそもX使いたくない」とかそういう人は、単なるスクリプトなので適当にいじれば自分好みの環境設定用スクリプトになると思います。ハマりどころは抑えてあるので、pkg の顔ぶれだけ変更すればいいのは楽なんではと思います。
データローダーでのエラー対応


# はじめに
Salesforceと連携したアプリを作ったのがきっかけで
セールスフォースの案件に携わるようになり、３ヶ月が経過しました。

その中でもデータの導入で、データローダーを使う機会が多くあり、
復習がてらエラーと対処をまとめときます。

![スクリーンショット 2020-12-03 17.57.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689332/6ed2280a-5f2b-3a9c-af04-4c785164288b.png)


# 遭遇したエラー集

## １. 値を入力してください: [StageName, CloseDate]

必須項目の値を入れてくださいということですね。
オブジェクトは商談で、指定されてる二つの項目がなかったので返ってきた感じです。

対処はそれぞれの列を追加して、項目を入れて行けばOK

## ２. 受注金額: 数値を入力してください: ￥1,458,000

これは数値型のところに、通貨型を入れようとしてしまった形ですね。

通貨型を入れたいのは変わらないので、セールスフォース側のデータ型を変更して対処。
数値型のままでよければ、CSVファイルのデータの書式を変更する形です。


## 3. 調査時間: 必須種別以外の値: 11時

種別の違う値を入れようとしてしまってエラーが返ってますね。

コロン（:）で区切られていて、問題のあるカラムが最初、
次がエラーの原因で、３つ目が実際の値ですね。

時間の形式なのに漢字が混ざってたのが原因なので
データ型を合わせるようにして対処しました。

## 4. Error converting value to correct data type: Failed to parse data: 9月17日

これも上とほぼ同様なのですが、なぜかエラー文が英語になってます。

データ型で「日付」と「時間」だと何か違いがあるのかもです。
対処は同じようにデータ型に合わせて対処。

## 5. A duplicate column [� � � � ] is found Would you like to continue?

これはエラーというより警告ですね。
重複するカラムがあるけど、続行しますかとのこと。

先頭のカラムが重複してるので、
マッピングするときに区別できないのでエラーということですね。

重複してるカラムの名前を変更して対処しました。
ちなみに続行すると、ID以外全て文字化けしていて、
どれがどれだかわからずマッピングしようがない感じです。


## 6. An empty column is found Would you like to continue?

これも警告ですね。個人的に一番詰まったところです。
これは対処が２パターン存在します。
![スクリーンショット 2020-12-03 18.01.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689332/89b3886c-d61e-c8a3-0f6b-1b5d7ddaa8d8.png)


### ①警告文そのままの対処

列最初のカラムがないパターンですね。
マッピングするときに必要になるので、追加することで対処します。


### ②警告文が直接的な原因でない場合の対処

全ての列の最初のカラムがあるのに、この警告が出るときがあります。
はいで進むと、下記の画面になり、何も起きなくなります。
OKがなぜか押せないし、消すこともできないorz

![スクリーンショット 2020-12-03 18.01.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689332/60fa79f0-bb33-c6b2-c916-769a6e6c5f53.png)

結果として、あるカラムにある半角のかっこを消したら通りました。
なぜか半角かっこによって、読み取れてなかったみたいです。

読み取れない　＝　空のカラム

みたいな変換でエラーが返ってたみたいです。
なんとなく勘でやったら解決しました。


# まとめ

３ヶ月間で出たデータローダーのエラーはこれくらいですね。
特に詰まったのは、最後の警告のとこです。
以上です！また何か詰まれば追加するかもです。

# データローダー関連のエラーで参考になるリンク

https://help.salesforce.com/articleView?id=000322182&type=1&mode=1

https://help.salesforce.com/articleView?id=000321499&type=1&mode=1
pyActigraphyを使うための初期環境設定

# pyActigraphyとは  
[pyActigraphy](https://github.com/ghammad/pyActigraphy)は加速度情報に基づいて、睡眠有無・睡眠深さなどが判定ができるオープンソースのライブラリです。CSVファイルなどで睡眠中の3軸加速度情報を用意して、このライブラリを使うと、睡眠分析を行ってくれます。

# 発生したエラー  
[pyActigraphy](https://github.com/ghammad/pyActigraphy)に記述があるように、下記コマンドを入力してライブラリを入れようとしましたが、大分ハマりました。**今回は「pyActigraphy」を使えるようにするまで**について書いていきます。

```python
pip3 install pyActigraphy
```

# 原因  

原因は2つありました。
**①python3.9には対応していない**
**②condaやllvmなどのライブラリが入っていない**

以上の原因により、ライブラリを正しく読み込むことができませんでした。
1つずつ解決策を記します。

# 解決策①
2020年12月現在、python3.9がリリースされており、私はpython3.9を入れておりました。しかし、pyActigraphyが対応するpythonは**3.7または3.8**のみです。そこで、python3.9 ⇒ 3.8.6へとダウングレードさせました。

pythonでは複数バージョンの共存ができ、適宜切り替えができるようになっています。
https://techacademy.jp/magazine/23332
https://qiita.com/Kohey222/items/19eb9b3cbcec9b176625

3.8にしていれば動作するはずです。

# 解決策②  
解決策①を対策するも、別のエラーが発生しました。長いエラー文をnumba, conda, llvmが入っていないぞ！と。
そこで、インストールしようとしますが、pipとcondaは共存できないとか？
http://onoz000.hatenablog.com/entry/2018/02/11/142347

pyActighraphyのドキュメントを読む限り、pipからしか入れられないパッケージのようですが、anacodaが必要っぽいです。
そこで、「**anaconda navigatorからvs codeを開く**」ことで解決しました。

![anaconda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610425/d1bbb0ea-2074-78f0-a8e6-dd86e1714c23.png)
具体的には、anaconda を開き、ここからvs codeを選択して開いてください。
ここで、

```python
pip3 install pyActigraphy
```

を入力すると見事に通るはずです。
さらに、

```python
pip3 install -U pyActigraphy
```

を入力することで完了です。いかがでしょうか、できましたか。
[pyActigraphy](https://github.com/ghammad/pyActigraphy)はanaconda経由で開く必要があるようです。
ClasslessCSSで手軽に綺麗なページを作ろう

- この記事は[MDCアドベントカレンダー](https://qiita.com/advent-calendar/2020/mdc)4日目の記事です

## 概要

- CSSライブラリは[Bootstrap](https://getbootstrap.com/)などが有名ですが、それらはライブラリが定義してくれたCSSに沿って以下のサンプルのように自分でHTMLタグにClass名をつけて使うというものです

```html
<button class="btn btn-primary">ボタン</button>
```

- ちゃんとしたアプリケーションを作る際はこれで特に問題はないですが、ちょっとしたサンプルアプリだったりレイアウトにこだわらない簡単なWebページを作るときはちょっと面倒くさくなりますよね
- 今回紹介するClasslessCSSはそのようなケースで簡単に綺麗なUIを実現できるライブラリです

## ClasslessCSS

- ClasslessCSSはライブラリが提供するCSSの**セレクタが全てタグ名で定義**されています
    - なので単にHTMLを書くだけでライブラリが適用されるため、セマンティックなHTMLを書いていくだけで綺麗なレイアウトを実現することができます
- 当然タグ名で定義されてるので気に入らないレイアウトを適用したくないといったケースでは面倒なことになりますが、それを気にするようなケースはClasslessCSSではなく通常のCSSライブラリを使うと良いでしょう

## ライブラリの紹介

- ClasslessCSSライブラリは[dbohdan/classless-css: A list of classless CSS themes/frameworks with screenshots](https://github.com/dbohdan/classless-css)というリポジトリでまとめられています
    - ClasslessCSSライブラリが24種類に加えて、少量のClass属性の定義で使えるClass-lightなライブラリ7種類が紹介されています
    - READMEの中で各ライブラリのレイアウトのキャプチャも掲載されているので好みのライブラリを探すのも簡単ですね

![スクリーンショット 2020-12-03 18.42.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/40d61910-b145-5b5a-b384-0c497ae691e9.png)

- その中で私が使ったことのあるライブラリを2つ紹介します

### new.css

- 1つめは[new.css](https://newcss.net/)とういうライブラリです
- 癖がなくてシンプルな感じがいいですね
- そして特徴的なのがデバイスのテーマ設定に応じて自動でライトモードとダークモードが切り替わるところです
- 以下の2行を`head`タグに入れるだけで使えます

```html
<link rel="stylesheet" href="https://fonts.xz.style/serve/inter.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@exampledev/new.css@1.1.2/new.min.css">
```

![スクリーンショット 2020-12-03 18.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/3848ae70-a569-c7cc-bb97-75f0e67a134b.png)![スクリーンショット 2020-12-03 18.45.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/231173e2-7e04-aff0-d516-6e64d6d048c7.png)



### sakura.css

- 2つめは[sakura.css](https://oxal.org/projects/sakura/)です
- カラーバリエーションが4種類用意されていますが、どれも柔らかい感じの色合いで気に入っています
- 以下の1行を`head`タグに入れるだけで使えます
    - 他のテーマを使いたい場合は`sakura.css`の部分を`sakura-earthly.css`、`sakura-vader.css`、`sakura-dark.css`といった感じで変更すればOKです

```html
<link rel="stylesheet" href="https://unpkg.com/sakura.css/css/sakura.css" type="text/css">
```


![スクリーンショット 2020-12-03 18.55.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/521e1622-e8e5-630b-f1a9-809511e8e577.png)![スクリーンショット 2020-12-03 18.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/a2e0f638-6c60-d228-99f3-66dd1530505e.png)![スクリーンショット 2020-12-03 18.56.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/13bb1175-2ef1-7ca1-5958-7d456c109e5e.png)![スクリーンショット 2020-12-03 18.57.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175213/3157d8cf-b9f2-5e9e-c5e2-d40e9f750a94.png)

## まとめ

- ClasslessCSSは読み込むだけで使えるのでとてもお手軽で便利です
- 自分的にはちょっとしたデモアプリの見た目を整えたい時などの必須アイテムになっています
- みなさんも機会があれば是非使ってみてください
wsl 上の git で credential.helper を利用する方法

[WSL Advent Calendar 2020](https://qiita.com/advent-calendar/2020/wsl) の４日目として書いた記事です。

# 概要

wsl で Git を使うと、Windows に比べて圧倒的に早いですよね。コミットの早さでいったら、20秒か一瞬かくらいの差があるわけですごい便利になるのですが、Credential Helper の設定があまり公開されていないようなので記事にしてみました。

# 前提

- Windows 側には Git を入れていない。
- WSL では `Ubuntu 20.04` を使用。

# 設定方法

### 1. credential.helper をインストール＆設定

```sh:WSL上で実行
$ sudo apt-get install libsecret-1-0 libsecret-1-dev libglib2.0-dev
$ sudo make --directory=/usr/share/doc/git/contrib/credential/libsecret
$ git config --global credential.helper \
   /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret
```

### 2. 「キーリングのロック解除」が訊かれないようにする

毎回「キーリングのロック解除」が訊かれると面倒なので、訊かれないようにします（パスワードを空にします）。

- ただし、これをやるとWSL内のキーチェーンに保存された git 等のパスワードを間接的に空パスワードで使えることになってしまうので取り扱いに注意。そもそも PC にログインしなければ WSL にも入れないはずなので、良しとして使う。

1. 下記で seahorse 実行
    
    ```sh:WSL上で実行
$ sudo apt install seahorse
$ seahorse
```
    
2. 「<」クリックしてメニュー出す
3. Default keyring を右クリックして 削除
4. その後、git pull などした際にキーリングのパスワード聞かれるので空に設定。


# あとがき

WSL すごい便利ですね！
僕は Git だけじゃなく IntelliJ や Docker, Node, Python 全部 WSL で動かして開発やってます。
IME (Mozc) が落ちやすい問題何とかする方法探し中だけど、それ以外はかなり快適！
WSL は標準になっていく予感がしますね。
メディア特性を使用したhoverの設定

#はじめに
日常的にhover設定を使っていると思います。リンクにマウスを重ねた時の変化の設定です。

```scss
a:hover {
	...
}
```

デスクトップやノートPCでは問題無いのですが、スマホなどのタッチデバイスでは問題が起こることがあります。それは、**タップ後にhoverの効果が残ってしまうこと**です。aタグ（ハイパーリンク）で他のページへ遷移する場合は良いのですが、ページ遷移をせずhoverの効果を使用したい場合、このままでは困ります。

# どうする？
まずは、スマホなどのタッチデバイスとそれ以外を分けます。
たまに画面幅で判定しているのを見かけるのですが、それでは完全とは言えません。
今回は、media特性のhoverで判定する方法を使用します。

```scss
@media (hover: hover) {
	a:hover {
		...
	}
}
```

[https://developer.mozilla.org/ja/docs/Web/CSS/@media/hover](https://developer.mozilla.org/ja/docs/Web/CSS/@media/hover)

これで判定は問題ない！と思うかもしれませんが、そうはいきません。
というのも、まだIE11が生き残ってるからです。IE11ではこのコードは対応してません…
[https://caniuse.com/mdn-css_at-rules_media_hover](https://caniuse.com/mdn-css_at-rules_media_hover)

（不本意だとしても）IE11対応が必要な場合、ユーザーエージェントで判定してIE11用の対応を書きましょう。判定には、[こちらの記事](https://qiita.com/sakuraya/items/33f93e19438d0694a91d)が参考になりました。
たとえば、bodyにクラス付与し、スタイルを設定すると良いと思います。

```scss
body.-ie11 {
	a:hover {
		...
	}
}
```
#で、スマホは？
スマホではタップ時に変化なし！ということなら、ここまでの設定で問題無いのですが、
タップ中にスタイルを変化をさせたい場合はどうすれば良いでしょうか。

まず、先ほどのメディア特性で「hoverが使えない場合」（none）を指定します。

```scss
@media (hover: none) {
	...
}
```

合わせて使用するのが、`:active`とそれを有効にするための`ontouchstart`です。
`ontouchstart`で囲んだエリアでは、タップ中だけ`:active`が有効になります。

```html
<div ontouchstart="">
	<a href="#">LINK</a>
</div>
```

```scss
@media (hover: none) {
	a:active {
		...
	}
}
```
これで、タップした時にだけ、スタイルを設定できます。

# さいごに
JavaScriptでクリック（タップ）時にだけクラスを付与するというのも１つの方法だと思うのですが、
今回、（IE11非対応なら）JavaScriptを使用しない方法を紹介しました。参考まで。
Dockerを使って開発環境を構築する。

## はじめに
既存のRailsで作成したアプリにDockerを導入したいと思い作成しました。
事前にDocker,Docker composeは導入済みになります。
## 開発環境
RubyonRails 2.6.5
MYSQL 5.6

## 導入手順
①Dockerfileをappと同列で新規作成
②docker-compose.ymlをappと同列で新規作成
③database.ymlを編集

## Dockerfileについて

```Dockerfile
＃参照する言語を指定
FROM ruby:2.6.5
＃Dockerコンテナ内で実行するコマンドを定義
RUN apt-get update && apt-get install -y \
    build-essential \
    nodejs
WORKDIR /アプリ名
＃Gemfileをコピー
COPY Gemfile /アプリ名/Gemfile
COPY Gemfile.lock /pictweet/Gemfile.lock
＃Gemを導入
RUN gem install bundler
RUN bundle install
```
## docker-compose.ymlについて
```docker-compose.yml
version: '3'

volumes:
  mysql-data:

services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
      - "3000:3000"
    volumes:
      - '.:/アプリ名'
    tty: true
    stdin_open: true
#dbとの依存関係を記載
    depends_on:          
      - db
    links:
      - db

  db:
    image: mysql:5.6
    volumes:
      - 'mysql-data:/var/lib/mysql'
    environment:
      - 'MYSQL_ROOT_PASSWORD=自身のパスワード'
```
## database.ymlの編集
```config/database.yml
default: &default
  adapter: mysql2   
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: 自身のパスワード
  host: db  ＃dockerのdbコンテナに対応

development:
  <<: *default
  database: 自身のアプリ名_development
```
## コマンド入力
上記３つのファイルが作成し終わったら実行

①dockerfileを元にimageの作成

```
$ docker-compose build
```
②データベースとアプリのコンテナを作成、起動

```
$ docker-compose run web rails db:create db:migrate
```

③全てのコンテナの連携・起動

```
$ docker-compose up
```
以上を実行後、localhost:3000に接続。

## 終わりに
導入の中で自分がつまずいたのはrunとupの違いが分からすコマンドが抜けてしまった所でした。docker buildでイメージの作成。docker-compose upのみではコンテナが作られないので、必ずdocker-compose runを行う。  
また、間違ってコンテナを作ってしまい、削除する際に便利なコマンドがあったので紹介します。

```
$ docker-compose down --rmi all --volumes --remove-orphans
```
こちらで全てのコンテナとイメージをまとめて削除できます。
こんなに簡単に仮想サーバーを立てたり、削除したりできるシステムはすごいと改めて感じました。
[React-native]useState or useRefどちらを使うべきか?

###目的
useStateとuseRefの使い分けについて整理した。

###概要
1.useStateは再レンダリングを起こす。useRefは起こさない。(違い）
2.useStateもuseRefも再レンダリング後もデータを保持する。（共通)

###1. useState

```
function App() {
  const [value, setValue] = React.useState("");
  const handleInputChange = e => {
    setValue(e.target.value);
  };
  return (
    <div className="App">
      <Input value={value} onChange={handleInputChange} />
      <Button>Button</Button>
    </div>
  );
}
```
この場合InputはApp()で定義されているStateをvalueとして保持しているため、再レンダリングを引き起こす。
再レンダリングの対象はstateが定義されているAppにnestされているコンポーネント全てである。(ここではInputとButton)

####子コンポーネントのInputでstateを定義した場合

```
const Input = () => {
  const [value, setValue] = React.useState("");
  const handleInputChange = e => {
    setValue(e.target.value);
  };
  return <input value={value} onChange={handleInputChange} />;
};
```
この場合はInputコンポーネントのみが再レンダリングされる（stateが定義されているのがInputなので）

レンダリングされる箇所が減って最適化されて速度が上がりそうだが、何でもかんでも最適化しすぎるとDomツリーが複雑になってかえってボトルネックになることもあるそうだ。

###2. useRef

```
function App() {
  const [value, setValue] = React.useState("");
  const valueRef = React.useRef();

  const handleClick = e => {
    setValue(valueRef.current.value);
  };

  return (
    <div className="App">
      <h4>Value: {value}</h4>
      <input ref={valueRef} />
      <Button onClick={handleClick}>Button</Button>
    </div>
  );
}
```
普通は書かないが、こういう場合は再レンダリングが起きない。

###まとめ
再レンダリングしたくないとか、単純にデータを保存したいだけならばuseStateでよさそう。
useRefはsetInterval関数などと使う場合に相性がいいらしい。別途調べなければ。。。
JavaScript　要素の取得　getElementById と querySelectorの違い

#要素の取得の違い
DOM操作をするときに必須となる、要素の取得ですが教材によって`getElementById` を使っていたり、`quertSelector`を使っていたりと、どちらがいいの？と疑問を持ちました。
やっていることは同じように見えるのに、使い分ける意味は？

- `getElementById`
　その名前の通り、idを指定して要素を取得する。
　　返り値は　`null` / `HTMLElement`

- `querySelector`
　要素の取得には、要素名、クラス名、idとCSSのセレクタとなり得るものは大体使える。
　該当する要素が複数ある場合は最初の要素を取得する。
   返り値は　`HTMLElement`

###getElementsBy~
 `getElementByTagName`や`getElementByClassName`は
返り値が配列（のようなもの）で返されます。
取得した各要素に操作をする場合はforループ等で回す必要があります。

##まとめと考察
`getElementBy~`の方が処理が速いそうですが、ブラウザの処理速度が速くなっているので、体感できない程度の差のようです。
結局どちらがいいかはケースバイケースですが、`getElementBy~`は厳格でパフォーマンスが高い。
`querySelector`は柔軟で気軽に使える。
といったイメージでいいのでしょうか？