OmniAICreator/Qiita-1.07M huggingface dataset:
ウィキデータの手軽な始め方

ウィキペディアにはスマホでの閲覧用アプリがあり、そこからウィキデータの説明欄を更新できるようになっています。以下は[iOS版ウィキペディアアプリ](https://apps.apple.com/jp/app/%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2/id324715238)での操作例ですが、Androidでも同様のことができます。

## アプリから「説明」欄を更新
ウィキペディアのアプリで記事をブラウズしていると下記赤枠のように「記事の説明を追加」という文字を目にすることがあります。
<img src="https://i.imgur.com/NGoiSLZ.jpg" width=25%>
ここには、ウィキペディア記事の冒頭に書かれている概要をさらに簡潔に要約した一言コメントのような内容が表示されるのですが、その実体はこの記事に関連付けられたウィキデータ項目の「説明」欄を参照しています。（PC画面ではウィキペディア記事左サイド「ウィキデータ項目」からリンクされたウィキデータ項目をたどれます）

ここで「記事の説明を追加」を選ぶと説明の編集画面に遷移するので、
<img src="https://i.imgur.com/3pBe1lk.jpg" width=25%>
ごく簡単な要約を記述して「説明を公開」をクリックすると、
<img src="https://i.imgur.com/JNv2ADU.jpg" width=25%>
ウィキデータの「説明」欄にその内容が書き込まれます。（ウィキデータは匿名でも更新できますが、ウィキペディアのアカウントを持っていればそれを使うこともできます。）

いかがですか。これがいちばん（※個人の感想です）手軽な、ウィキデータ編集への参加方法です。

## 空白が多い「説明」欄
ウィキペディアの「記事」に相当するコンテンツのひとまとまりはウィキデータでは「項目」と呼ばれ、その見出し部分は「ラベル」「説明」「別名」の３つから成っています。「ラベル」はウィキペディアの記事名をほぼそのまま当てられるので機械的にコピーできますが、「説明」は文章の要約が必要なために機械的な処理が難しく、現在は人力に頼っているため「説明」欄が空欄のまま未設定状態のウィキデータ項目が多数あります。

このアプリでは以下のように文字列や地図上で記事を検索できますが
<img src="https://i.imgur.com/VKnjwtA.png" width=25%><img src="https://i.imgur.com/aKV8r4F.png" width=25%>
その際に説明が空欄のものを見つけたら記事を開いてごく簡単な要約を「説明」として更新してもらえると、ウィキデータ項目の充実に大きく役立つと同時に、ウィキペディア記事が多数並んでいる際に目的の記事を探し出す重要なヒントになります。

## 「説明」を記述する際のガイドライン
ウィキデータには[説明に関するガイドライン](https://www.wikidata.org/wiki/Help:Description/ja)があり、おおまかには以下の通りです。
・ラベルと併せてその項目を他と識別するための最小限の記述をします。
・同名があり得る項目（例えば「白髭神社」）の説明は、例えば「千葉県松戸市にある神社」のように一意に識別できる程度の地名＋それが何なのかを表す内容とあわせて記述します。
・変化しそうな情報は避けます。例えば「小池百合子」の説明には「東京の都知事」ではなく「日本の政治家」を使います。
・主観を交えた表現は避けます。
・体言止めを使用し、最後の句点（。）は付けません。

まぁ、説明欄には正解がひとつだけという訳ではありませんので、他の記述例を参考に気軽に更新してもらえればと思います。
uGUIボタン操作時Rayを飛ばさないようにする

# はじめに
uGUIボタンを操作すると同時にRayも飛んでしまい、望んだ挙動ができなかったので調べました。
ARKitを使った実装ではよく使いそうなので備忘録として残します。

# 現象
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/30d7a596-3446-c203-4947-964a53e69ce8.gif)


サイズ変更するボタン・配置ボタンを押すと同時にRayが飛び、衝突した場所に椅子が移動してしまう。

# 解決方法
Rayを飛ばす行の前に以下のif文を追加するだけ。

```C#
if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) {
    return;
}
```

今回はiPhone画面タップの為、引数に**Input.GetTouch(0).fingerId**を取ります。
PCでクリックの場合は引数は必要ありません。

これで解決です！
![ezgif.com-video-to-gif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/b18ac6ff-8cbb-be71-20b4-2be08dccd5dd.gif)
[備忘録]1つのyamlファイルで複数のリソースを書く場合に注意すること

ファイルに記載されている順序で作成されるので書く順番に気をつける必要がある。
Namespaceより先にNamespaceを参照する別のもの(Deploymentなど)を書いていた
場合はエラーになる。Namespaceを先に書く必要がある。

なお、別々のファイルに分けている場合もNamespaceがある場合でディレクトリを
指定してまとめて「kubectl -f ディレクトリ名」を指定した場合はエラーになる。
先にNamespaceのファイルだけを「kubectl -f ディレクトリ名/Namespaceのyamlファイル名」を
実行してから「kubectl -f ディレクトリ名」を実行するとエラーにならない。
完全未経験からWebアプリ開発の仕事についた話

###エンジニアとして働いて、5日目が経ちました。
業界未経験からエンジニアとして就職してから1週間が経ったので、現在どんなことをしているか、業務的な知識も含めメモとして書き出しておきます。




###開発環境および使用ツール
- PHP 7.2.23
- Laravel 6.0.3
- Docker
- Sourcetree
- Sequel pro
- Slack
- Trello
- Kitematic
- Bitbucket
　etc...

###いまやっていること
Webアプリケーション開発で、サーバーサイドの実装をしています。
Trelloで自分が担当するカードを見て、Postmanを叩いて、削除の機能をつけたり、更新したくない値にバリデーションを書いたりなど。
RailsでMVCの知識は叩き込んでいたので、それをベースに処理を見よう見まねで実装していってます。



###今週躓いたところ
#### まずPostmanの使い方がわからない
いままでフロントありきで開発をしてきていたので、Postmanが何をしているか全くわからなくて、初日は存在しないURLを入力したり、バリデーションかかってるカラムに何も入れなかったりしてエラー...
ひたすらPostmanのURL部分見て、api.phpでルーティング見て、コントローラー見て...って繰り返して、ようやく雰囲気が掴めてきました。Bodyにカラムと値を入力しておけばすぐに機能ごとのテストもできるので、使い始めて１週間経つとめちゃくちゃ便利な機能だなと思い始めてきました!

#### DB設計がどうなっているかわからない
DB設計書はTrelloに共有されているのですが、正直見てもわかりませんでした...。
DBの階層がどうなっているかが設計書を見てもさっぱりわからず、混乱していたらER図のメモ書き画像を送ってもらえたので、親子関係やモデル名を自分で紙に書き出して、それを片手に見ながら作業をしたらPostmanもちゃんと動くようになってきてストレスフリーに！
図形がないと文字だけでは理解できないタイプなので、これからも新しいアプリ作るときはER図書いていきます。

#### そもそもLaravelの機能がわからない
当たり前ですが、今まで勉強してきたRailsにはあるヘルパーメソッドが、Laravelにはないってことでつまずきました。
現在ログインしているユーザーの情報を取ろうとしても、current_userというメソッドがそもそもない...
ちなみに下記がlaravelのcurrent_userを取ってくるコードになります。 
auth()->user()
LaravelとPHPは入社前に勉強のため簡単なアプリを作ったのですが、まだまだ勉強が足りなかったことを思い知らされました。

#### Middleware、Request、Serviceとは
これもまた、Railsにはない機能ですが、Middlewareについては以下の記事も参考にさせていただきました。
https://www.ritolab.com/entry/69
ルートからコントローラーに行く間に処理されるもので、認証系の処理などが書かれています。

Requestはバリデーションに関する内容等が書かれるファイルです。
ルートからコントローラーに行く間に、Requestを経由しています。
バリデーションのかけ方は下記のURL参考にして実装しました。
https://qiita.com/toro_ponz/items/b33c757cb7ba5bb48ed4

Serviceはコントローラーに記載されているアクションの、処理する中身についてが記載されています。
Railsではモデルに特定のデータを取得する関数を記載して、その関数をコントローラーのアクションの中で呼び出していたのですが（コントローラーの関数に処理を直書きしたりもしてました...）、Laravelはモデルには書かずにServiceに記載するようです。

https://qiita.com/ucan-lab/items/4ad7daf12422498ab491
まだここら辺の仕組みについてはふんわりとしか理解していないので、もっと詳しくわかってきたら別で記事を作成しようと思います。

####振り返り
実践で使用されているコードを初めて見たのですが、めちゃくちゃコード美しくて見てて楽しいです。
昨日久々にポートフォリオの自作アプリのコード見たら汚すぎて目が潰れました。
いまはまだとりあえず動くコードの実装で必死ですが、もう少しコードの綺麗さも意識して行きたいなーと思います。
zshとtmuxとは何か?

未来電子テクノロジーでインターンをしているtokky08です。
シェルについて勉強したのでアウトプットとして書いていきます。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#シェルって何？
まず、私たちは直接PCの中身とやり取りする事はありません。代わりにシェルというものがやり取りをします。私たちがシェルに命令する事で、シェルはその内容に従ってPCとやり取りをする事になります。
シェルの種類は・・・
sh / bash / ksh / csh / tcsh / zsh　などがあります。
この中のbashとzshを取り上げてみます。

#bashとzsh
結論から言うと、bashよりzshの方が便利！と言う事です。

**bash・・・**
Unix/Linux系OSで標準的に利用されているシェルです。

**zsh・・・**
bashが提供する機能に加えて、他のシェルの機能も加わってます。
軽量で強力な補完機能がある。
カスタマイズできる。

#tmuxって何？
tmuxとは、端末多重化ソフトウェアのことである。
これまでは作業ごとにそれぞれターミナルを開く必要があったが、tmuxを使えば1つのターミナル上で複数のターミナルを立ち上げて同時並行で別々の作業ができる。

##メリット
- １つのssh接続で複数のシェルを立ち上げて作業することができる。
- ssh接続中にネットワークの接続が切れても、強制終了されない。
- tmuxの状態が保存されるため作業中止をしてもいつでもスムーズに戻れる。
- 別のPCからでも同じセッションが使える。
- 他の人にセッションに同時に入ってもらって、作業を見せることができる。


##使い方

僕の`.tmux.conf`ファイルの中身です。ほぼカスタマイズしてません。

```
set-option -g status-right "#[fg=black][%Y/%m/%d %H:%M:%S]"
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'

# Other examples:
# set -g @plugin 'github_username/plugin_name'
# set -g @plugin 'git@github.com/user/plugin'
# set -g @plugin 'git@bitbucket.com/user/plugin'

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run -b '~/.tmux/plugins/tpm/tpm'
# 256色端末を使用する
set-option -g default-terminal "screen-256color"
```

|コマンド|意味|
|:---:|:--:|
|tmux|新規セッションを開始|
|tmux ls|セッションの一覧表示|
|tmux kill-session|セッションを終了|
|tmux kill-server|tmux全体を終了|
|prefix + c|新規ウィンドウの作成|
|prefix + (数字0-9)|指定番号のウィンドウへ移動|
|prefix + &|ウィンドウの破棄|
|prefix + n|次のウィンドウへ移動|
|prefix + p|前のウィンドウへ移動|
|prefix + %|左右にウィンドウを分割|
|prefix + "|上下にウィンドウを分割|
|prefix + q|ペイン番号を表示|
|prefix + x|ペインの破棄|
|prefix + t|ペインに時間を表示|
|prefix + [|コピーモード開始|
|prefix + スペース|コピー開始位置決定|
|prefix + エンター|コピー終了位置決定|
|prefix + ]|コピーした内容を貼り付ける|

#まとめ
bashよりもzshの方が便利と言うことで僕のMacにもzshを入れてみました。色々カスタマイズできるところがいいですね。tmuxも使ってみましたが、まだよく分からないですね。普段ターミナルを複数使う機会がないので、いずれ良さが分かってくるんですかね。
検索機能実装ができる　Rails　全3回(2/3)

この記事では、Rails 5.2.3を使用した内容となっています。
WEBアプリを作成する上で必須となる機能なので、活用しましょう！
全3回にわけて記載しています。 これは、2/3ページです。

下記のリンク先が検索フォームに関する全3回のページです。
[検索機能実装ができる　1 / 3ページ](https://qiita.com/NishiguchiHiroki/items/9a8c55e3c248f565da1f)
[検索機能実装ができる　3 / 3ページ]
(https://qiita.com/NishiguchiHiroki/items/8163cbc36d95360e0f98)

##概要
・searchアクションをコントローラーに定義しよう
・検索結果画面のビューを作成しよう

###コントローラーに基本の7つのアクションには含まれない<br>searchアクションを定義します。

コントローラーに基本の7つのアクションには含まれない、searchアクションを定義します

```controller/tweet.rb
〜省略〜
def search
    @tweets = Tweet.search(params[:keyword])
  end
〜省略〜
end
```
モデルに書いたsearchメソッドを呼び出しています。
seachメソッドの引数にparams[:keyword]と書いて、検索結果を渡しています。

###検索結果画面のビューを作成しよう
```tweets/search.htmlerb
<%= form_with(url: search_tweets_path, local: true, method: :get, class: "自分が指定するクラス名") do |form| %>
  <%= form.text_field :keyword, placeholder: "検索する", class: "自分が指定するクラス名" %>
  <%= form.submit "検索", class: "自分が指定するクラス名" %>
<% end %>
<div class="contents row">
  <% @tweets.each do |tweet| %>
    <%= render partial: "tweet", locals: { tweet: tweet } %>
  <% end %>
</div>
```
これで検索機能は完成です
次は、7つのアクションを利用して開発するに着目して進めていきましょう。
　　　　　　　　　　　　　　　　　　　　　　　　　　　　[ → 1 / 3ページに続く](https://qiita.com/NishiguchiHiroki/items/9a8c55e3c248f565da1f)
IoT プラットフォーム「リモッテ」をインストールしてみた

### リモッテとは
[リモッテ](https://www.remotte.jp/ "ホームページ")は、IoT のような常時実行型のアプリのための All-In-One プラットフォーム。Windows にインストールして使う「ステーション」と、Android、iOS、Windows、MacOS、Linux などで動作するウェブブラウザを使って利用する。IoT に限らず、インターネットと接続しない状態で利用するアプリにも使えて、計測、監視、自動化、ＡＩなどのアプリを簡単に実現できる。一般的に IoT は、複数のサービスを組合せて実現することが多く、利用する技術の選定に多くの時間がかかったり、学習コストが高くなる傾向にある。リモッテでは、アプリを実現するために必要なサーバーやデータベース、通信、実行管理、保守などの機能がすべてステーションの中に含まれており、その操作・設定や画面作成、プログラムの開発環境などが統一されたユーザーインタフェースで実装されている。これにより、専門的なことがあまり分からなくても、やりたいことを実現できる環境を提供している。
### 特徴
１．無料で使える
２．All-In-One プラットフォームで、Windows パソコンさえあればいろいろ始められる
３．WebRTC 技術を用いたピア・ツー・ピアで直接接続するため、高品質なデータを少ない遅延時間で転送できる
４．センサーやリモコンなどはもちろんのこと、ビデオ映像や音声の機能が充実していて、配信もできる
５．「リモッテ・ストア」という、アプリや機能をダウンロードして使えるマーケットがある
６．１万円程度の小型パソコンからタブレット、高性能デスクトップまで、用途に合わせて選択して使える
７．アプリの画面は、予め用意された表示部品をお絵かきソフト感覚で配置して、オプションを設定するだけで作れる
８．小規模から中規模までのアプリケーションに適していて、プログラムは Python で記述する
### リモッテ・ステーションのインストール
１．[リモッテ・テクノロジーズ社](https://www.remotte.jp)のホームページで、一番下の「今すぐステーションをダウンロード」をクリックして、「Remotte Installer.exe」を取得する。
[<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/e66f47fe-9588-dce7-19b0-359f09b98ccd.png">](https://download.remotte.jp/station/Remotte%20Installer.exe)
２．ダブルクリックしてインストーラーを起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/458d8291-5a77-130a-63d5-a6efd009ec74.png)
３．ようこそ画面が表示されたら「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/88419f7e-6abe-5f17-2256-38df0ef036bb.png)
４．使用許諾契約書が表示される。文章を一番下まで読み、問題が無ければチェックボックス「使用許諾契約の全条項に同意します」にチェックを入れて「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/f06691c2-8618-5843-39c7-e4c3a80a0eaf.png)
５．インストール先もデフォルトのまま「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/82046078-4124-bb1d-9c91-b25d6014c4c5.png)
６．インストールの開始画面で「インストール」をクリックする。この後もし「Visual C++ Redistributable」ウンヌンのダイアログが表示されたら、表示内容に従ってインストールする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/70878c14-51cb-9bf7-c332-9c6e58b3202b.png)
７．無事にインストールされたら「閉じる」をクリックして完了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/8eeea770-2c4f-a8bf-a13e-43768c9d3fde.png)
８．タスクトレイ内に下記で赤枠で囲ったようなオレンジ色のアイコンが登録されていればオッケー。本投稿でのゴールはここまで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/a3429741-15f4-8310-bc16-6a3a463f4514.png)
９．もし上記のアイコンが登録されていない場合は、画面左下の Windows メニューを開き、「Remotte Station」フォルダ内の「サービスの起動と停止」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/e44ccd88-fc42-d726-1599-185ee6480345.png)
次に「Remotte サービスマネージャー」のウィンドウが表示されたら、「開始」ボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/e1a69e9d-6872-f26c-e4c9-65fccf139d17.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/fb1b8d7f-a9d1-ad84-896a-990c9b73939d.png)

サービスが正常に開始されると、今度は「停止」ボタンがアクティブになるので、このウィンドウを閉じて終了し、タスクトレイ内にオレンジ色のアイコンが表示されていることを確認する。
### まとめ
[次回](https://qiita.com/remotte_jp/items/94fb73db9fb98e9e10a2 "IoT プラットフォーム「リモッテ」でステーションを登録してみた")はインストールした「リモッテ・ステーション」を起動してみます。
TypeScriptの組み込み型関数 Recordの使いどころ


# Record<T,K>の使いどころ

Recordについて調べたので書く

最小サンプル

```ts
//Record<K,T>
type SmallRecord = Record< "a"|"b"|"c" , string >
```

SmallRecord は以下の型として展開される

```ts
// SmallRecord
{
a : string,
b : string,
c : string
}

```

つまり Kに列挙された型がプロパティになり、それぞれTを持つオブジェクト型になる。

## サンプルコード

以下のようなオブジェクトがある。

``` ts
 const users = {
    "suzuki" : {
        age : 26,
        name : "suzuki"
    },
    "sato" : {
        name : "sato",
        age : 32
    },
    "takahashi" : {
        name : "takahashi",
        age : 40,
    },
    "tanaka" : {
        name : "tanaka",
        age : 25,
    }
}
```

上のオブジェトを下記の形へ変形させる 関数を考える

```ts
{
    "suzuki" :26,
    "sato" : 32,
    "takahashi" : 40,
    "tanaka" :25
)
```

素直に書くとこんな感じでしょうか？

```ts
const usersAgeFn1 = (users:{[key:string] : {age:number}}) => {
    let ages : {[key:string]:number} = {}
    for( let [key,value] of Object.entries(users) ){
        ages[key] = value.age
    }
    return ages
}

const usersAge1 = usersAgeFn1(users)
```

別に上でも悪くないが、戻り値の型は {[key:string]:number}になり、プロパティが維持できない。（コード補完が効かない）

## RecordとGenericsを併用して書く
※ asが多いが許して

``` ts
const usersAgeFn2 = <T extends {[key:string]:{age:number}}>(users:T) => {
    let ages = {} as Record<keyof T , number>
    for( let [key,value] of Object.entries(users) ){
        ages[key as keyof T] = value.age
    }
    return ages
}
const usersAge2 = usersAgeFn2(users)
```

これで戻り値の型はプロパティを維持した状態になる（コードの補完が効く）

## Mapped Types でも同じ事はできる。
サンプルのコードだとこっちの方がシンプルに見えるかもしれない。

```ts
const usersAgeFn3 = <T extends {[key:string]:{age:number}}>(users:T) => {
    let ages = {} as {[P in keyof T]:number}
    for( let [key,value] of Object.entries(users) ){
        ages[key as keyof T] = value.age
    }
    return ages
}

const usersAge3 = usersAgeFn3(users)
```
docker-compose で 複数の Dockerfile をまたいで build できるのだろうか？ ベースイメージを作成しておきたい #docker

# docker-compose でこんなことがやりたい

- Dockerfile からオリジナルのイメージを build する
- オリジナルのイメージを元に Dockerfile を作成してそれを docker-compose で使う

以下はイメージ

```yml
version: '3'

services:
 base-service:
    build: base-dir
    as: some_base_iimage # 架空の指定
 child-service:
    build: child-dir
```

# base-dir/Dockerfile

```
FROM alpine
...
```

# child-dir/Dockerfile

```
FROM some_base_iimage
...
```


# 解決1

シェルスクリプトを使ってbuildするようにする


`./build.sh`

```bash
cd other-dir && docker build -t  . some_base_image && cd -
docker-compose build
```

こんなんで良いだろうか

そもそも docker-compose の仕組みに乗れるかどうか分からないので

docker-compose は全ての docker image が揃っていることを前提に作られているのでは？

# 解決2

Dockerhub にレポジトリとイメージを作成しておく
いちど固めておけば online から取れるよね



# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
HTTP通信とはそもそも何か？？


そもそもHTTPリクエストとは何か、説明しましょう。
例えば、私たちがブラウザでWebページを閲覧するときに、その目的のページのURLをアドレスバーに入力してEnterしますね。
すると、ブラウザがそのWebページを持っているWebサーバーに「このページのデータをください」とお願いをします。
これがHTTPリクエストです。
リクエストを受け取ったWebサーバーは、Webページのデータをブラウザに返します。
これをHTTPレスポンスといいます。

・ HTTPリクエストを送る
・ HTTPレスポンスを受け取って取り出す

この二つを行なってできる通信の仕組みがHTTP通信ということですね！
Ruby 5 erbファイルのフォームのdate_select オプションの書き方


オプション指定の書き方だけで30分くらいハマったので，記録します．
あと，けっこうググってもなかなかわからなかった．

#環境
Ruby version: RUBY VERSION: 2.6.3
Rails version: Rails 5.0.7.2

#date_select オプションの書き方
カラム(ここでは:release_date)の後ろの{}内にオプションを書く．

```new.html.erb
<%= f.date_select :release_date, {start_year: 1900, end_year: (Time.now.year)},class: 'form-control' %>
```

#参考
https://rails.densan-labs.net/form/datetime_register_form.html
https://api.rubyonrails.org/v5.1.7/classes/ActionView/Helpers/DateHelper.html#method-i-date_select
tailwindcssでメディアクエリを使う

ブレークポイントのmixix作った後に@screenで指定出来ることを知った

tailwindcssのconfigで指定している変数を@screenの後に指定する。

```hoge.scss
@screen md{
  .list {
    &-item {
      width: calc(25% - 20px);
    }
  }
}
```

https://tailwindcss.com/docs/functions-and-directives/#screen

ほんとに便利！
tailnwindcss万歳！
Maya python でメッシュのスムース(Subdivision surface)を行う

## 背景

レンダー時 or 描画時 smooth(subdivision surface) を, 明示的に apply して .obj などにエクスポートしたい.
skinning や Mesh proxy だと, 事前 smooth してから skinning/deform すると壊れるので, skinning してから smooth をかけたい.

## 方法

polySmooth を使う.

https://help.autodesk.com/cloudhelp/2018/JPN/Maya-Tech-Docs/PyMel/generated/functions/pymel.core.modeling/pymel.core.modeling.polySmooth.html
検索機能実装ができる　Rails　全3回(1/3)

この記事では、Rails 5.2.3を使用した内容となっています。
WEBアプリを作成する上で必須となる機能なので、活用しましょう！
全3回にわけて記載しています。 これは、1/3ページです。

下記のリンク先が検索フォームに関する全3回のページです。
[検索機能実装ができる　2 / 3ページ](https://qiita.com/NishiguchiHiroki/items/5233d421428533db8fd2)
[検索機能実装ができる　3 / 3ページ]
(https://qiita.com/NishiguchiHiroki/items/8163cbc36d95360e0f98)
#概要
・検索フォームを作成する。(view)
・ルーティングの設定
・検索メソッドをモデルに定義
・WhereメソッドとLIKE句

###Viewファイルの検索フォーム

```index.html.erb
<%= form_with(url: search_tweets_path, local: true, method: :get, class: "search-form") do |form| %>
  <%= form.text_field :keyword, placeholder: "投稿を検索する", class: "search-input" %>
  <%= form.submit "検索", class: "search-btn" %>
<% end %>
```
###ルーティングの設定　
　投稿機能があり、その投稿に対してコメントを作成できる状態で想定
　URL Patternに:idをつける方法　　/tweets/:id/search(.:format)

```config/routes.rb
resources :tweets do
    resources :comments, only: :create
    collection do
      get 'search'
    end
  end
```
URL Patternに:idをつけない方法　　 /tweets/search(.:format）

```config/routes.rb
resources :tweets do
    resources :comments, only: :create
    member do
      get 'search'
    end
  end
```

##検索メソッドをモデルに定義
モデルにテーブルから検索するためのメソッドsearchを定義しましょう。
MVCの観点で検索するなどのビジネスロジック（プログラムの処理の流れ）は、メソッドとしてモデルにまとめて定義するようにします。
メソッドを別の場所でも使うことができるようになります。
![Railsアプリケーションの流れ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528019/afff2c6c-e9de-36ca-dc69-253c962a8a82.png)
そして、検索したキーワードが含まれている投稿を取得するために、whereメソッドとLIKE句を使っていきます。

##WhereメソッドとLIKE句
**モデル.where(条件)**で引数部分に条件を指定することで
テーブル内の条件に一致したレコードのインスタンスを**配列**の形で取得できます。

LIKE句は、曖昧(あいまい)な文字列の検索をすることができ
whereメソッドと一緒に使います。

#####曖昧文字列
| 文字列 | 意味 |
|:-:|:-:|
|  % | 任意の文字列(空白文字列含む)  |
| _  |  任意の1文字 |

#####実行サンプル
| 実行例| 詳細 |
|:-:|:-:|
|  where('title LIKE(?)', "a%") | aから始まるタイトル  |
|  where('title LIKE(?)', "%b") |  bで終わるタイトル |
| where('title LIKE(?)', "%c%")  |  cが含まれるタイトル |
|  where('title LIKE(?)', "d_") |  dで始まる2文字のタイトル |
|  where('title LIKE(?)', "_e") |  eで終わる2文字のタイトル |

#####モデルにメソッドを定義する
```models/tweet.rb
class Tweet < ApplicationRecord
 def self.search(search)
    if search
      Tweet.where('text LIKE(?)', "%#{search}%")
    else
      Tweet.all
    end
  end
```
テーブルとのやりとりに関するメソッドはモデルに置くという感覚が必要になるので、徐々に慣れていきましょう。

　　　　　　　　　　　　　　　　　　　　　　　　　　　[→　2 / 3ページに続く](https://qiita.com/NishiguchiHiroki/items/5233d421428533db8fd2)
Python3エンジニア認定試験うけてみた

# いきなり？
結果から言うと、合格です！結果はギリギリでしたが、自分的にはめちゃくちゃうれしいです！
![iOS の画像 (5).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534092/6a1f391e-9d16-4788-4d83-1e27fe56575c.jpeg)


#なんで
実はpythonというかプログラミングを勉強しはじめて一ヶ月になります。
最初になぜこの試験を受けたのかの経緯は、プログラミングの勉強のモチベーションのひとつとしてです！

#どんな試験
DIVE INTO CODE さんが出している一応、正式な試験のはずです。履歴書にもかけます。合格率は70％ととても高く、多言語でもバリバリコード書いてる人なら勉強せずとも受かるのでは？と思います。

# どう勉強した？
そもそもpythonのprintすら知らない状態だったので基礎を勉強していました。
paiza-pythonコース（３日）→pyq-初心者コース一周（一週間）→　pyq 二週目（一週間）→　DIVE　INTO EXAMと言う模擬試験を８周ほど回しました。（一週間）

基礎から含めて合計で３週間くらい勉強しました笑

その間、ちょっとした開発をしたり、OpenCVをさわってみたりといろいろしましたが勉強の流れはこんな感じです。

# 最後に
実はQiitaに投稿するのはじめてで、自分のアウトプットとして書いています。

これから何かあれば投稿したいと思います。

さよなら！！
【Unity】【Editor拡張】アセットパスにマルチバイト文字が含まれているかを調べる

# はじめに
何もUnityに限った話ではないと思いますが、プロジェクトのフォルダパスやファイル名に**マルチバイト文字（日本語など）**が入っていると問題が起きることがあります。
[WebGLビルドできない](https://tech.pjin.jp/blog/2017/12/07/unity_webgl_build_error/)とか[TextMesh Proのフォントアセットが作れない](http://baba-s.hatenablog.com/entry/2018/09/17/180000)とか。
そのため、日本語パス絶対に使わないマンは結構多いのではないかと思います。

ただ、複数人での作業だったり、打ち間違いしたりと完全回避が難しいこともあるんじゃないかと思います。

そこで、今回は簡単ですがパスにマルチバイト文字（正確にはASCII以外の文字）が入っているアセットがないか調べるエディタ拡張を作成しました。

# ソースコード
こちらのGitHubに置いてあります。
[unity-check-deprecated-path](https://github.com/neuneu9/unity-check-deprecated-path)
※動作確認はWindowsのみです。macの場合に正しく動作するかは検証できておりませんのでご了承ください。

# 使い方
「CheckDeprecatedPath.cs」をプロジェクトの**Editorフォルダ配下**に配置してください。
するとエディタのメニューに下のような項目が追加されます。
![operation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/a3f96333-e576-5fd7-1b84-3fe011925d3a.png)

クリックすると**プロジェクトフォルダパス**と**Assetsフォルダ配下の全アセット**に対して検索を実行し、結果をコンソールログに出力します。
![check_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/8993b0e2-594d-4e22-44a5-4971e1d7c6ac.png)

# おわりに
簡単に作ったのでチェック結果を通知するのみに留まっています。
もう少し使いやすくしたいと思いつつ、頻繁に使うものでもないような気がするので、
このくらいシンプルでもいいかなとも思っています。
ご意見等あればいただけますと嬉しいです。

# 参考
- https://qiita.com/T_2/items/bbd03ad320fbc03595af
iPad キーボード ショートカット

# iPad キーボード ショートカット

最近、通勤中の作業にiPadが最適なのではないかと気づき、使いこなそうと格闘中。
Bluetoothキーボード（英語配列）を購入して、それなりの作業（オンライン講義メモ作成、記事編集、ブラウザベースでのプログラミングなど）ができるように目論む。
ただ、Windowsユーザーの自分にとっては、ショートカットが異なるため、まだ操作がぎこちない。そんな自分のための備忘録。

（2019.11.24 追記：おまけ「クォーテーションの入力方法について」）

## 基本操作

| 操作 | ショートカットキー |
|:---|:---|
| ホーム画面に戻る | command + h |
| アプリ切り替え | command + tab |
| Spotlight 検索 <br/>（アプリ起動） | command + space <br/> (再度同じコマンドで戻る) |
| DOCKを表示 | command + option + d |
| スクリーンショット | command + shift + 3 |
| ショートカット一覧表示 | command 長押し |

## 文章編集

|操作|ショートカットキー|
|:---|:---|
| 言語切り替え | control + space または Caps Lock |
| 日本語変換候補選択 <br/> （+ 逆順） | space <br/> (+ shift) |
| コピー | command + c |
| ペースト | command + v |
| 切り取り | command + x |
| 元に戻す | command + z |
| やり直し | command + z + shift |
| 文字選択 | shift + → (or ←) |
| 単語選択 | shift + option + → (or ←) |
| 全選択 | command + a |
| カーソルを単語の先頭に移動 | option + ← |
| カーソルを単語の末尾に移動 | option + → |
| カーソルを行頭に移動 | command + ← |
| カーソルを行末に移動 | command + → |
| カーソルを文書の先頭に移動 | command + ↑ |
| カーソルを文書の末尾に移動 | command + ↓ |
| カーソル以降を行末まで削除 | control + delete |
| カーソル以前を行頭まで削除 | command + delete |
| カーソル以前の単語を削除 | option + delete |


## Safari

|操作|ショートカットキー|
|:---|:---|
| 新規タブ立ち上げ | command + t |
| タブの切り替え <br/> （+ 逆順） | control + tab <br/> (+ shift) |
| タブを閉じる | command + w |
| リロード | command + r |
| URL入力 | command + l |
| スクロール <br/> （+ 逆順） | space <br/> (+ shift) |
| 進む | command + ] |
| 戻る | command + [ |
| 検索 | command + f |

## 番外編（ホームボタン「□」がある場合）
※ 本体のホームボタンと同じ

| 操作 | ショートカットキー |
|:---|:---|
| ホーム画面に戻る | □ |
| コントロールセンター表示 | □*2 |

## おまけ

iPad の Bluetooth キーボードでは「**'（半角：シングルクォーテーション）**」、「**"（半角：ダブルクォーテーション）**」が勝手に全角になってしまい、入力できないものと思い込んでいた。そのため、簡単なプログラミングすらできないと諦めていた。しかし、よく調べると、設定で簡単に切り替えられた。
**「設定」＞＞「一般」＞＞「キーボード」＞＞「スマート句読点」を「オフ」**

<img width="347" alt="iPad-設定-一般-キーボード.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533310/f76594b6-23c3-a52f-fa2b-2cc13c85fba3.png">

これで、iPad でのプログラミングが可能に！

---
JsonファイルをCSV形式 or EXCEL形式に変換する方法

JSON形式のファイルは見にくい。CSVやEXCELに変換したい。の悩みを解決する方法をシェアします。

本稿ではPythonを用いたPythonをもちいたJsonファイルの変換方法と、WEBベースでできる変換ツールをご紹介いたします。

#方法1：Pythonを用いて変換する

使い方は非常に簡単です。
###1.変換したいJsonファイルと、Pythonファイルを同じファイル階層に置く。
###2.下記プログラムの中で、３箇所を変更してください。
- プログラム中の『変換したいJsonファイル名』のところを1で置いたJsonファイル名に変更してください。
- Jsonファイルの最初に書いてある単語を『Jsonファイルを開いたときに一番最初に書いてある単語』に入れてください。
    `{"results":[{"acl":{"*":{"read":true,・・・`のようにJsonファイルが始まっていたら、今回の場合は『results』を入れてください。
- プログラムの中の『出力したいファイル名』のところを出力したいファイル名に変更してください。



```python:ConvertJsonToCsv.py
#-*-coding:utf-8-*-
################################################
#目的　　　　　：JsonファイルをCSVに変換する。
################################################

import json
import csv

# JSONファイルのロード
json_dict = json.load(open('変換したいJsonファイル名.json', 'r', encoding="utf_8_sig"))
# list of dictの抽出
target_dicts = json_dict['Jsonファイルを開いたときに一番最初に書いてある単語']

with open('出力したいファイル名.csv', 'w', encoding="utf_8_sig") as f:
    # dialectの登録
    csv.register_dialect('dialect01', doublequote=True, quoting=csv.QUOTE_ALL)
    # DictWriter作成
    writer = csv.DictWriter(f, fieldnames=target_dicts[0].keys(), dialect='dialect01')
    # CSVへの書き込み
    writer.writeheader()
    for target_dict in target_dicts:
        writer.writerow(target_dict)
```


#方法2：WEBサービスを用いて変換する。
ファイルをサーバーに送信することが問題ないファイルだったらこちらの方法を用いたほうが、簡単だと思います。

####リンク
[JsonファイルをオンラインでCSVに変換できるWEBサービス](https://json-csv.com/)
Ionic + capacitor Admobの広告を出してみた（iOS）

#はじめに
ionic + capacitorアプリでAdmobのバナー広告を出す方法です。

Admobのアカウント作成をアプリの登録方法については[こちら](https://shigu493.com/ionic4でadmobの広告を出してみた（ios）/)を参考に。

**※追記！！
capacitorを使っているならcapacitor-admobを使った方が良いかと思う。
[ionic capacitorのAdMobプラグインを使う（capacitor-admob）](https://qiita.com/kokogento/items/99cf7ba321b68aaad298)**



#プラグインを入れる
プラグインはcordovaですが使えます。

```terminal
npm install @ionic-native/admob-free
ionic cordova plugin add cordova-admob-sdk
ionic cordova plugin add cordova-plugin-admob-free
```

[こちら](https://capacitor.ionicframework.com/docs/cordova/using-cordova-plugins/)に書いてあるように

```terminal
npx cap sync
```

を忘れずにしておきましょう。でないと広告はうまく出ません。。

#info.plistを編集
xcodeを開いてinfo.plistに以下の要素を追加

`GADApplicationIdentifier = App Id
GADIsAdManagerApp = Yes`

<img width="621" alt="スクリーンショット 2019-11-16 16.56.57.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/2649e18a-ab0f-1d42-b8c0-5a3d1d73e612.jpeg">

**AがApp Idとなる**
**Bは後記する`admob.service.ts`で使う**


<img width="512" alt="4eb18b183093d97ef014fbf246286dd4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/c58a211b-00e3-3f6c-6a40-56165ac1cb7f.png">

#AdMobFreeを読み込む
`app.module.ts`にAdMobFreeのimportとprovidersへの追加

```typescript:app.module.ts
import { AdMobFree } from '@ionic-native/admob-free/ngx';

@NgModule({
  declarations: [AppComponent],
  entryComponents: [],
  imports: [
    BrowserModule,
    IonicModule.forRoot(),
    AppRoutingModule,
  ],
  providers: [
    StatusBar,
    SplashScreen,
    AdMobFree,
    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}
```

#広告を表示させてみる
Admobの処理をまとめた`admob.service.ts`を作成

```terminal
ionic g service service/admob
```

```typescript:admob.service.ts
import { Injectable } from '@angular/core';
import { AdMobFreeBannerConfig, AdMobFree } from '@ionic-native/admob-free/ngx';
import { Platform } from '@ionic/angular';

@Injectable({
  providedIn: 'root'
})
export class AdmobService {
  iosBannerConfig: AdMobFreeBannerConfig = {
    id: 'ca-app-pub-***',// 上記のBである広告ユニットID
    isTesting: true,
    autoShow: true
  };

  androidBannerConfig: AdMobFreeBannerConfig = {
    id: 'ca-app-pub-***',
    isTesting: true,
    autoShow: true
  };

  constructor(
    private admob: AdMobFree,
    private platform: Platform
  ) { }

  showBanner() {
    if (this.platform.is('ios')) {
      this.admob.banner.config(this.iosBannerConfig);
    } else if (this.platform.is('android')) {
      this.admob.banner.config(this.androidBannerConfig);
    }
    this.admob.banner
      .prepare()
      .then(() => {
        console.log('広告の表示成功した');
      })
      .catch(error => {
        console.log(error);
      });
  }
}
```

使うときはこれを呼び出す。

```typescript
import { AdmobService } from '../service/admob.service';

constructor (
private admobService: AdmobService
 )

ionViewWillEnter() {
    this.admobService.showBanner();
  }
```



#最後に
Android版のやり方が分かりまセーン。

**Support Libraryを代替するAndroid拡張機能であるAndroidXにしてしまったからか、バグりまくってどうしよもない状況。。。**
OracleとDBとDBAとロール


#DBAとは
「DBA」で検索をすると　Database Administratorの略　と出てくる。
つまりは「人間にあたえられた立場」という意味だろうと解釈したが、私が気にしているのはたぶん違う。

##今回気にしているDBAとは
CREATE USER ---　をするときに
GRANT DBA TO --- としてオプション指定されている
ここの　**DBA**　のこと

**DBA ロール** で検索してみる。

###システム権限です
>>Oracleのシステム権限は２つあります。DBAロール・SYSDBA権限です
[Oracleでシステム権限をもつユーザーを取得する（DBAロール・SYSDBA権限）:Oracle初心者でもスッキリわかる](https://sql-oracle.com/?p=2026)

上の記事に書いてある限りで考えると
1.システム権限を持っている
2.同様にシステム権限を持っているSYSDBAに比べると弱い
ほか、デフォルトでDBAロールを持っているユーザ等についても言及されているものの、
「結局DBAってどういう役割なの」という疑問の解消には至らず。

###そもそもシステム権限とは
>>システム権限: システム権限は、ユーザーが特定のアクションまたは特定の種類のスキーマ・オブジェクトでアクションを実行できるようにする権限です。たとえば、CREATE TABLEシステム権限はユーザーと関連付けられたスキーマで表の作成を、CREATE USERシステム権限はユーザーにデータベース・ユーザーの作成を可能にします。
[7.2 ユーザー権限およびロールについて:Oracle Database 2日でデータベース管理者 12c リリース1 (12.1)](https://docs.oracle.com/cd/E57425_01/121/ADMQS/GUID-289A4BF6-F703-4ED5-8357-89F651A6D1DE.htm)

1.システム権限には二種類ある。
この二種類は権限の行使対象で分かれてくる。具体的にはテーブルとユーザ。
GRANT DBA TO user_name
の場合はどっちにつけているのだろうという疑問。
なお、
>>ユーザーの作成および権限の付与、ロールの作成および付与、あらゆるスキーマでのスキーマ・オブジェクトの作成、変更および削除などを含むほとんどの管理機能をユーザーが実行することを可能にします。これはすべてのシステム権限を付与しますが、データベース・インスタンスの起動または停止の権限は含まれません。この権限はデフォルトでSYSおよびSYSTEMユーザーに付与されます。

との部分を鑑みるに、データベースのガワを触ることはできないが、データベース内部では割と自由に動けるだけの権限であるように思える。

>>管理者用のロール。ADMIN OPTION付きのすべてのシステム権限
[Oracleちょこっとリファレンス](https://oracle-chokotto.com/ora_role.html)

>>DBA TO　ユーザにDBA権限を与える場合に指定します。
[ノンストップデータベース　HiRDB Version 9 SQLリファレンス](http://itdoc.hitachi.co.jp/manuals/3020/3020645740/W4570169.HTM)

##結論
明解に「こう！」と言えるものではないものの
-**GRANT DBA TO user_name**　は
  -user_nameで指定したユーザに
  -Oracle的には二番目につよい権限を付与する

-**DBAロール**　について
  -Oracle的には二番目につよい権限で
  -一番目につよい権限はSYSDBA
  -SYSDBAとDBAの違いは「DBのガワ操作」ができるかどうか等
  -DBの枠（ガワ）は操作ができないが、内部（テーブルとか）の操作に不自由することはない

最小権限的なお話で考えると
DBの中身は自由に操作できないと困るけれど、
DBを落としたりする必要はない、
DB内での　**操作のテスト用**　アカウント
なんかにちょうどいいのかもしれない。

2019/11/14　エンジニア　4ヵ月目
ディープラーニングの用語整理

少し前からディープラーニングの勉強を始めました。
学習にあたり関連する用語を自分なりに整理してみる。
指摘等歓迎です。
## 機械学習
機械自体が学習を行う手法のこと
## ニューラルネットワーク
人間の脳を参考にニューロンと呼ばれるノードの集まりで構成されたネットワーク構造のこと
ニューラルネットワークは入力層と出力層とその間の中間層(隠れ層)が積み重なり構成される
## ディープニューラルネットワーク
ニューラルネットワークの隠れ層の数が多くなったニューラルネットワークのこと
## ディープラーニング
ディープニューラルネットワークを用いた機械学習の手法のこと
## TensorFlow
Google製のオープンソース機械学習ライブラリのこと
※最近まで勘違いしていたのが、TensorFlow自体は計算グラフを作るライブラリでTensorFlow = ディープラーニングライブラリではないようです
## Keras
TensorFlowをラップしたディープラーニングのライブラリのこと
## 教師あり学習
入力データと出力データで行う学習
入力データからどういった出力が得られるかということを予測する
## 教師なし学習
学習に入力データのみを用いる学習
教師なし学習では予測ではなく、データの分類を行う
## 強化学習
自身（よくエージェントと呼称される）がある状況でどういう行動を取るべきかを学習
## 特徴量
入力データが出力データに影響を及ぼす部分の事
## 前処理
学習効率を高めるために学習前にデータの加工を行う
## モデル
機械学習を行うもの
## データセット
学習を行うための複数のデータの集合
## 過学習
学習データのノイズや外れ値までもモデルが学習してしまい、未知のデータへの予測力が低くなってしまうこと
## 汎化性能
未知のデータに対する予測力
TermuxでGPG errorが出たときの解消方法

久々にTermuxで`pkg upgrade`したら、以下のエラーが出てきた。

```
GPG error: https://its-pointless.github.io/files/24 termux InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 906F5AFA9A32C72D
```

[issue](https://github.com/termux/termux-app/issues/915#issuecomment-437663506)を見つけたので、

```
apt install dirmngr
apt-key adv --recv 906F5AFA9A32C72D
```

を試したら上手くいった。


```
pkg upgrade
```
するとちゃんとupgradeできることを確認できました。感謝。。
CatalinaにしたらPodfileが作れなくなった

#問題点
ライブラリを入れるため、Podfileを作ろうと思い、ターミナルでpod initというコードを書いたら、なぜかエラーが出て作れなくなってしまった。pod update、pod setupも同様にエラーが出た。
#やってみたこと
どうやら、OSのCatalinaが原因だったみたいで、この下のコマンドを入力したら、解決しました。

```
$ xcode-select --install
```
これを実行するとコマンドラインデベロッパーツールが必要ですと出てくるので、素直にインストールしました。
初めての投稿なので、間違ったところとか直した方がいいところとかが、あればご指摘願います。

参考文献
[macOSをCatalinaにアップデートしたらXcodeのBuildができなくなった](https://qiita.com/LilyMameoka/items/916c43d4ea308b6256ab)
Python初心者（中学生）がハマったnonlocal（説明できなくてごめん編）

# 背景

中学生のK君（二回目の登場）が思ったように動かず、泣きついてきました。
直してあげたんだけど、nonlocalの事でもやもやが残りました。
もやもや解消したので残しておきます。

# 動かないプログラム

なにが原因か探してみてください。

```python:動かないプログラム
import tkinter as tk

count = 0

def dispLabel():
    count = count + 1
    lbl.configure(text = str(count) + "回押しました")


root = tk.Tk()
root.geometry("300x80")

lbl = tk.Label(text="数えるボタン")
btn = tk.Button(text="押してね", command = dispLabel)

lbl.pack()
btn.pack()
tk.mainloop()
```
ボタンが表示されてボタンを押すと、エラーが出ます。

```console:実行結果
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\masa\Anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "c:\Users\masa\OneDrive\ドキュメント\python\lessen_tk.py", line 6, in dispLabel     
    count = count + 1
UnboundLocalError: local variable 'count' referenced before assignment
```

スコープ、ローカル変数を理解してないと間違える基本的な間違いですね。

dispLabel()の中でグローバルにあるcountをインクリメントしたいのですが、dispLabel()の中でcountに値を代入部分があると、countはローカル変数と認識され、global変数の参照ができなくなります（countへの代入がなければ、globalの参照できます）このため、値を参照すると、値が代入される前なのでエラーになる（詳しくは、おまけを見てください）。

# 直してみる
説明するのもダルイので、Pythonチュートリアルの例を見て、法則を理解してもらった。

[Pythonチュートリアルの例](https://docs.python.org/ja/3.6/tutorial/classes.html#python-scopes-and-namespaces)


```python:チュートリアルのサンプル
def scope_test():
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)
```

関数の中の変数は外側とは、別物扱いされると理解したK君、
チュートリアルを真似して次のように直しました。

```python:修正案
def dispLabel():
    nonlocal count
    count = count + 1
    lbl.configure(text = str(count) + "回押しました")
```
実行結果

```console:実行結果
  File "c:\Users\masa\OneDrive\ドキュメント\python\lessen_tk.py", line 6
    nonlocal count
    ^
SyntaxError: no binding for nonlocal 'count' found
```

T君：「nonlocalか、globalつければいいんですよね。でもできないなぁ」
私：なんだこれ？？「global countにすれば動くよ。わかんないね。」
とお茶を濁す。（説明できなくてごめん）
当然、globalにしたら動きました。

# nonlocalだとなぜダメ？

nonlocalは一つ外側の名前空間の変数を参照できるようにするものなのにどうしてダメなんだろう。nonlocal知ってはいたけど、実際に使う場面もなかった。

## pythonのドキュメント

nonlocal 文は、列挙された識別子がグローバルを除く一つ外側のスコープで先に束縛された変数を参照するようにします。これは、束縛のデフォルトの動作がまずローカル名前空間を探索するので重要です。この文は、中にあるコードが、グローバル (モジュール) スコープ以外のローカルスコープの外側の変数を再束縛できるようにします。

nonlocal 文で列挙された名前は、 global 文で列挙された名前と違い、外側のスコープですでに存在する束縛を参照しなければなりません (新しい束縛が作られるべきスコープの選択が曖昧さを排除できません)。

## 原因まとめ
- この例では、dispLabel()スコープの１つ外側のcountはグローバル。このため、nonlocalの対象にはならない。
- globalは、実行すれば変数が作成されるけど、nonlocalは、作成する前に、存在していないといけない

# おまけ

関数の中で、globalの宣言をしていなくてもglobalの変数countを読みだすだけならglobalの宣言はいりません。
しかし、countへの代入が存在すると、countはローカル変数と認識されます。
注意点、count=が実行されたかどうかではなく、count=の行が存在するかで判断されるようです。
次の場合でもcountは、ローカル変数と認識されて、a=の行でreferenced before assignmentの例外が発生します（理解できてなかったのでやってみたらこんな結果でした）。

```python
def dispLabel():
    a = count + 1
    if False:
        count=a
    lbl.configure(text = str(count) + "回押しました")
```
【golang】ネストしたstructに値を入れる方法

#概要
ネストしたstructに値を入れる方法と実践での注意点。
#記述方法
基本的には以下のルールで記述が可能。

```golang:main.go
package main
import "fmt"

type A struct {
	AKey1 string
	AKey2 string
	B
}

type B struct {
	BKey1 string
	BKey2 string
}

func main() {
    // key:valueで記述が可能
	var st1 = A{
		AKey1: "val1",
		AKey2: "val2",
		B: B{
			BKey1: "val3",
			BKey2: "val4",
		},
	}

	// keyの省略も可能
	var st2 = A{
		"val1",
		"val2",
		B{
			"val3",
			"val4",
		},
	}

    //宣言してから 変数.key = val でも可能
	var st3 = A{}
	st3.AKey1 = "val1"
	st3.AKey2 = "val2"
	st3.BKey1 = "val3"
	st3.BKey2 = "val4"

	fmt.Printf("%#v\n", st1)
	fmt.Printf("%#v\n", st2)
	fmt.Printf("%#v\n", st3)
    //=> main.A{AKey1:"val1", AKey2:"val2", B:main.B{BKey1:"val3", BKey2:"val4"}}
}
```
#実践における注意点
「B:B{}」の部分も「key:value{}」なので注意。

```golang
B: B{BKey1: "val3",BKey2: "val4",},
//=> key: value{BKey1: "val3",BKey2: "val4",}
```

したがってstructを以下の様に別のpackageにしてまとめている場合は、packageをimportして以下の様にしなければならない。

```golang:model.go
package model

type A struct {
	AKey1 string
	AKey2 string
	B
}

type B struct {
	BKey1 string
	BKey2 string
}
```

```golang:main.go
var st1 = model.A{
  AKey1: "val1",
  AKey2: "val2",
  B: model.B{
    BKey1: "val3",
    BKey2: "val4",
  },
}

var st3 = model.A{}
st3.AKey1 = "val1"
st3.AKey2 = "val2"
st3.BKey1 = "val3"
st3.BKey2 = "val4"

//　packageが別れている場合、keyを省略した書き方は
//  go-vetに「composite literal uses unkeyed fields」と怒られるので注意。
```

#感想
作業中に例の「B:model.B{}」でちょっと詰まったので書き起こした。
~~とはいえ大体はst3の記述方法が採択されそう。~~
Git基本・早見表

#Gitの基本・早見表
Progateを参考にして自分用にGitの基本早見表を作りました。
#Gitを使う準備
```
git init
//gitを使う準備が完了しました
```
#I.自分からリモートにファイルを送るために...
#①ファイル共有の準備
##・まずは共有するファイルを選択
```
git add ファイル名
```
##・選択したファイルを記録する（コミットといいます）
```
git commit -m "内容を示したメッセージ"
```
#②リモートの準備
##・リモートを登録する
```
git remote add リモート名 URL
```
リモート名はoriginとするのが一般的である
##・リモートにファイルをアップロードする（プッシュといいます）
```
git push リモート名 master
```
これでリモートにファイルが作成されているはずです！
#II.他人のリモートファイルをダウンロードする
#・リモートファイルをダウンロードする（プルといいます）
```
git pull origin master
```
#III.Gitを使いこなす
##・変更したファイルを確認
```
git status
```
変更したファイルが赤色で表示されます
##・変更内容を確認する
```
git status
```
変更前のコードが赤色で表示され、変更後のコードは緑色で表示されます。
また、addされたファイルは緑色で表示され、まだaddされてないファイルは赤色で表示されます。
##・他の人が書いたコミットメッセージを見る
```
git log
```
##・他の人が行った変更内容も確認する
```
git log -p
```
Qを押すことで確認を終了することができる。

#Githubに自分のリモートを作ってみよう！
##①リモートを作るための基盤
```
mkdir mysite
//フォルダを作る
cd mysite
//作ったフォルダに移動
```
##②Gitを使う
```
git init
//Gitを初期化する（準備完了）

git remote add origin [GithubのURL]
//Githubにリモートを登録する
```
##③Gitにプッシュする
```
touch index.html
//自分のパソコンの中にファイルを作る

git add index.html
//共有したいファイルを選択

git commit -m "index.htmlを作りました"
//選択したファイルを記録する

git push origin master
//リモートにファイルをアップロードする
//完了
```
## Gitのキャッシュを削除する

```
$ git rm -r --cached . //ファイル全体キャッシュ削除
```
Vue-cli （ Vuetify）でstroybookを使う アドイン

Vuetify環境で、storybook使ってみようと四苦八苦した。
QIitaを初めブログをいろいろ調べて試したけどうまくいかない。
やっっと見つけたのがこれ
####VeutifyStroybook
>Github
>https://github.com/vuetifyjs/vue-cli-plugin-vuetify-storybook

`vue add vuetify-storybook でいける

ただし、.storiesフォルダが、
src/stories ではなく
.storybook/stories になっている

config のパスを変えてもうまくいかなかったので、そのまま使うことにした。
AWS Lightsailにwordpressを入れてELBでSSL化

# はじめに

ecサイト作ろうと思ってwordpressを立てた。
何となくaws使いたかった。
https://qiita.com/takeshifurusato/items/53b0a21aed1120b7e414

こんな感じでドメイン取って、SSLになった。
awsの設定とwordpressの設定が必要。

<img width="909" alt="スクリーンショット 2019-11-16 12.44.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64334/e3060761-fc5e-3681-3e2b-aed833bd8408.png">

いい記事はあるが、１個ではわからないので何個か横断。

# 参考記事一覧

Lightsailの初期設定をする。証明書の部分がよくわからない。
https://stangler.hatenablog.com/entry/2018/11/07/094528

この辺り見ながら証明書を発行
https://yukiosugiyama.com/wordpress/post-1745/
https://dev.classmethod.jp/cloud/aws/lightsail-acm/


wordpressの初期設定をする



ユーザ
user

パスワード
cat bitnami_application_password


Really Simple SSL以外をやる
https://yukiosugiyama.com/wordpress/post-2906/



SSL Insecure Content Fixerをアドイン
https://stangler.hatenablog.com/entry/2018/11/07/094528

<img width="1196" alt="スクリーンショット 2019-11-16 12.41.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64334/05801202-999b-9b6e-cb27-876f9d900190.png">
Homebrewのインストール

## Homebrewとは
Macのパッケージ管理ツール(＝ソフトウェアを管理するシステム)。

## Homebrewインストール手順

###1. コマンドライン・デベロッパー・ツールをインストール

```
$ xcode-select --install
```

以下↓が表示された場合は、すでにインストールされているので何もしなくてOK。

```
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
```

###2. Homebrewがインストール済みか確認する
以下↓が表示されていればインストールされているのでOK。
(バージョンは人によって異なる。)

```
$ brew -v
Homebrew 2.1.16
```

↑が表示されない場合は、Homebrewをインストールします

###3. Homebrewをインストールする

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"


Press RETURN to continue or any other key to abort
# => Enterキーを押す

Password:
# => Macにログインする時のパスワードを入力する

$ brew update
# インストール完了後、brewをアップデートする
```
【Rider】Listのインポート補完にBoo.Lang.List<T>を含めないようにする【Unity】

# はじめに
Riderで対応する`using`がないときに`List`と書くと

![](https://user-images.githubusercontent.com/21963717/40632334-22c744f6-6329-11e8-86c3-be6cd4881f73.png)

↑のように補完のサジェストの一番上に`Boo.Lang.List<T>`が出てきてウザかったので、どうにかできないか調べたメモ。

# 設定でBooがサジェストに含まれないようにする
* [Sort System.Collections.Generic above Boo.Lang #574](https://github.com/JetBrains/resharper-unity/issues/574)

こちらのissueにやり方が書いてありました。

`Preferences...` → `Editor` → `General` → `Auto Import` に `Boo.Lang*` を追加するだけです。

![](https://user-images.githubusercontent.com/21963717/66371897-5ccef280-e9f0-11e9-86eb-aa237e226487.png)

ついでに`UnityScript.*`も追加しておくと良さそうです。

>Yes, see #1252 - you might also want to add UnityScript.*. Unfortunately, Rider 2019.2 doesn't allow merging settings for auto import, so the plugin can't automatically set this. Hopefully this will be addressed in Rider 2019.3

# なぜ未だに補完に含まれるのか？
[BooもUnityScriptもだいぶ昔にUnityから消え去ってる](http://tsubakit1.hateblo.jp/entry/2017/07/10/233000) はずなのになぜ？
↓
https://github.com/JetBrains/resharper-unity/issues/574#issuecomment-393479753
>I guess we can't simply strip them, consider if some project has a dll compiled with Boo.Lang reference.
It might be a solution to check dependencies of all referenced assemblies and if none of them requires Boo.Lang, UnityScript, UnityScript.Lang it is safe to strip them. At least references from Assets and Packages should be checked. Does it sound good?

「プロジェクトによってはBooに依存している場合があるので簡単に削除はできない」（意訳）

# ちなみに
Riderのポップアップメニューは矢印キーで上下移動しなくても操作内容で絞り込みができます。やり方はポップアップメニューが出てるときに絞り込みたい操作に含まれる文字を打っていくだけです。

![Nov-16-2019 12-17-34.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27863/4ca2cf02-8fa3-a8d9-6544-c8a6303609c3.gif)
<I>ポップアップ時に`sys`と打つことで`System.Collections.Generic.List<T>`に絞り込んでいる様子</i>

最初からこの操作を知っていれば`Boo`の余計な補完もあまり邪魔に感じなかったかもしれません。

# Visual Studioの場合
* [【Unity】Visual Studio で Boo.Lang の補間を無効化するエディタ拡張](http://baba-s.hatenablog.com/entry/2018/12/25/084000)

# 最後に
Riderはいいぞ！
matplotlibで作図入門: データファイルから図を作る

**この記事を読むとできるようになること**
`matplotlibで，連番データファイルから図がつくれる`

[matplotlibで作図入門: 簡単な関数を書く](https://qiita.com/kumamupooh/items/3d2f0a2bbc1f5374fba8)の続きです．
今度は，自分で行った計算結果のデータファイルから図を作ってみましょう．
以下では，オブジェクト指向インターフェースを用います．

- 環境
    - macOS mojave 10.14.6
    - Python 3.7.5

`data000.dat ~ data099.dat`のデータファイルから値を読み込みます．
データファイルの中身は次のようになっているとします．

```text:data000.dat
# x_value     y_value
1.000e+00    1.090e+03
1.010e+00    1.784e+03
1.020e+00    2.112e+03
...
```

for文を回して，データファイルを順番に読み込んで描画していけばOKです．

```Python:sample1.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

fig = plt.figure()

ax1 = fig.add_subplot(111)
ax1.set_xlim(1.0, 20.0)
ax1.set_ylim(1000, 5000)
ax1.set_xlabel('x [cm]')
ax1.set_ylabel('y [g]')

#plot
filenum = 100
for i in range(filenum):
    x, y = np.loadtxt("./data%02d.dat" % (i), comments='#', unpack=True)
    ax1.plot(x, y, "-", color=cm.Reds(float(i+1)/filenum))

#保存
plt.savefig("sample1.eps")
```

`x, y = np.loadtxt("./data%02d.dat" % (i), comments='#', unpack=True)`
でi番目のデータファイルを読み込み，
1列目の値を`x`に，2列目の値を`y`に格納します．

データファイルの最初の行（コメント行）を省くため，
`comments='#'`によって`#`で始まる行はコメント行であることを教えてあげます．

`color=cm.Reds(float(i+1)/filenum)`は，データごとに線色を変えるための指示です．
Powershell で、Linux と同じことが気軽にできるように環境構築

普段 Linux を使っているのですが、だんだん windows を使うことが多くなりました。そこで、Linux (Ubuntu) でおこなっていることが、powershell でも　気軽にできるように自分なりに設定してみました。

### 環境
- Windows 10 64bit
- powershell 5.x 

## 原則　方針 Documents に全部おく
- デスクトップを簡素化するため（ app と share のみ）
- ls のエイリアスは、linux にする(やっている人がいたらラッキー)
- ドキュメント以下は、bin,note(jupyter notebook),project(いろいろいれる）
- path を、bin に通す

```
$oldSystemPath = [System.Environment]::GetEnvironmentVariable("Path", "User")
$oldSystemPath += ";C:%USERPROFILE%\Documents\bin"
```
- Desktop は、app( アプリケーションのショートカット) share (　ネットワークで共有 )
- C: 直下は、\work ( スケジュールタスクなどいれておく） \tmp (Linux の tmp のつもり）

## インストール ( powershell、vs code, jupyterを普段使いする前提)
- VS code インストール
- [git for windows](https://qiita.com/manabu-watanabe/items/ecf1b434baf305adaa00)
 - 環境変数 LESSCHARSET に utf-8 を設定 git log の文字化け回避
3人子育て中の助産師がプログラミングを勉強して１ヶ月経過。

##Qiita初投稿##
[個人ブログ](https://www.55mfmfmf55.com)とは別で、Qiitaも定期的に投稿する事にしました。
個人ブログにも[プログラミング](https://www.55mfmfmf55.com/category/プログラミング/)の事は少し投稿していますが、ここでは自分が作った物や困ったコードなど、よりプログラミングに対して具体的な部分を記載したいと思います。

とりあえず学校へ通い始めて1ヶ月で作った作品が**「病棟看護師のための連絡ノートアプリ」**。
連絡ノートアプリの意義については[ここ](https://www.55mfmfmf55.com/regret-2/)に少し記載しました、参考までに。ちなみにこのブログの作品をアップデートしたのが今回の作品です。

基本的にはタブレットとスマホを想定して作りました（病院の電子カルテ導入率は50%、残り半分は紙ベースで仕事しているのが現状のため）
モットーは**「簡単で便利」**！！

##表紙##
<img width="746" alt="スクリーンショット 2019-11-16 10.14.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533569/095a52ec-bdd6-7eba-6bb6-cc56869e1461.png">

##ログイン後の画面がこちら##

ログインした方の名前が自動入力。
日付も自動入力。
よく使う定型文はクリックするとtextareaに自動入力。
リセットで内容全て削除。
username、今日の日時、textareaの内容がfirebaseに保存出来るようにしました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">病棟にあれば便利かなと思ったのと、自分の<br>勉強のために作ったもの。 <a href="https://t.co/wUsuXm9jBg">pic.twitter.com/wUsuXm9jBg</a></p>&mdash; 助産師はよん (@mfmfmf5555) <a href="https://twitter.com/mfmfmf5555/status/1195535638264573952?ref_src=twsrc%5Etfw">November 16, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##次に一覧表示##
firebaseから過去の連絡事項が表示されるようにしました。
空欄の所に本来は名前も入ります。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">続き <a href="https://t.co/GEmPSiYJVD">pic.twitter.com/GEmPSiYJVD</a></p>&mdash; 助産師はよん (@mfmfmf5555) <a href="https://twitter.com/mfmfmf5555/status/1195535871883132928?ref_src=twsrc%5Etfw">November 16, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


##最後にスケジュール管理##
こちらはFullCalendarを使用しました。
本当はgoogle calendar APIを使用したかったのですが、PHPの知識がなかったため諦めました。
JSだけで出来ているカレンダーなので使えると思いましたが、このカレンダーの理解に相当時間がかかり、ほぼ使いこなせませんでした。
毎月定期的にある予定をdragするとカレンダーに入ります。
本当はカレンダーに直接予定を書き込めるようにしたかったのですが、カレンダーにtextarea表示までできたものの何故か文字入力が出来ず・・・
妥協策で定期的ある予定リストにその他を作り、メモ欄を作成し、これをfirebaseと連携しました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">続き。さっきの画質悪いですね・・・ <a href="https://t.co/RVO3kR2vRl">pic.twitter.com/RVO3kR2vRl</a></p>&mdash; 助産師はよん (@mfmfmf5555) <a href="https://twitter.com/mfmfmf5555/status/1195537223623405571?ref_src=twsrc%5Etfw">November 16, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##なるべくこだわったこと##
今までの課題はJS書いて実装するだけ精一杯だったのでUI無視でしたが、今回は「実際に病棟で働いている看護職に使ってもらう」を意識してみました。
Qiita見てる方々はビックリかもしれませんが、本当にパソコン使えない方もたくさんいる業界なんです。
そんな方々にもすぐに使ってもらえるように「簡単」「便利」を時間の許す範囲で実装してみました。ここはずっと追求していきたいと思っています。

##一番大変だったこと##
やはりFullCalendarです。
これの理解でほぼ数日終わりました。そしてまだ理解しきれていません笑
しかしこのFullCalendar,大変でしたが一番勉強になりました。
そして使いこなせれば相当色々出来そうです！！
年末年始辺りにもう少しこのFullCalendarを解体してみたいと思っています。
あとはPHPを学んだ後でgoogleカレンダーにもチャレンジしたいです！！

##今後の展望##
・お問い合わせフォーム作成
・既読機能の追加
・カレンダー機能の充実
・カスタム機能追加（定型文や予定を自分達で追加削除できる）

少しずつ機能をアップして、本当に病棟で使ってもらえるようにしたいです！！
typescript での関数の引数指定について



Typescriptで引数の型を指定する場合、必要以上にプロパティを規定しないほうが良い。
php のtype hintingのようにimplementsやextendsをチェックしないため、それを期待したコードはそもそも書けないため。

以下のようなコードがあるとして

```ts
class User{
    name : string
    age : number
    constructor(name:string,age:number){
        this.name = name
        this.age = age
    } 
}

const sumAge = (users:User[]) => 
    users.reduce((pre,cur) => pre + cur.age,0)


const users : User[] = [
    new User("suzuki",35),
    new User("sato",32),
    new User("tanaka",38),
]

//これはもちろんOK
console.log(sumAge(users))

const likeUsers = [
    {name:"suzuki",age:35},
    {name:"sato",age:32},
    {name:"tanaka",age:38},
]

//これもtypescript的にはOK（PHPで似たようなコードを書くと ここでエラーになる
console.log(sumAge(likeUsers))


``` 

上のコードは別に悪くないが、likeUsersでもコンパイルエラーにならないなら、
sumAgeの引数はUser[]と定義する必然性は無い。

むしろ関数sameAgeから考えた場合 sameAgeはuser.ageしか使っておおらず、nameを持つUser定義は邪魔である。
常にそうとはいえないが、こういった場合*特定の型を扱う関数*を考えるのでは無く、*関数が期待する型*を引数に定義した方が良い。
そちらの方が汎用的に使える、つまりsumAgeは以下で良いはず。


```ts

const sumAge = (objects:{age:number}[]) => 
    objects.reduce((pre,cur) => pre + cur.age,0)

```


ただ、なんとなく退化した気がする。
Windows10上のspacemacsでスペルチェックする

- spacemacsには `Flyspell-mode`がある（スペルチェックできる）
- `dotspacemacs-configuration-layers`で `spell-checking`を設定している場合に `Error enabling Flyspell mode: (Searching for program No such file or directory ispell)`と出てスペルチェックされなかったアレ（辞書の設定とかすれば使える）
- Windows10で素直にやろうとするとハマる





# まず `Hunspell`推奨
- スペルチェッカー `Ispell`、どうやるのかわからない😇（win32版はあるらしい => http://hp.vector.co.jp/authors/VA028080/ispell.html）
- `Ispell`の後継として[ `Aspell`もある](https://nanasi.jp/articles/others/aspell.html#windows)が、Windows10では `release 0.60 or greater is required`エラーが出てツムツム => https://emacs.stackexchange.com/questions/41892/aspell-with-emacs-26-1-on-ms-windows  
  （まあEmacsバージョンによりそうだけども）
- `Hunspell`が主流らしいので、そっちを入れた





# spacemacsで `Hunspell`を利用する
## `Hunspell`インストール
参考 => https://texwiki.texjp.org/?Hunspell#y7b755eb

- Windows10に `MSYS2`をインストール => 
- MSYS2コンソール上で `Hunspell`インストール => https://uep.media.hosei.ac.jp/windows-emacs-hunspell/  
  （ `pacman`コマンドを使う）

## 環境変数の設定
- Windows10環境変数名に `DICTIONARY`追加（名前： `DICTIONARY` 値： `en_US`）
- `.spacemacs.env`にも `DICTIONARY=en_US`を追加（自動でも手動でも良い）

## `.spacemacs`の設定
- spacemacsの設定ファイル `.spacemacs`（ `Space f e d`で開ける）の `dotspacemacs-configuration-layers`に `spell-checking`を追記（もうされてるかも？）

```
   dotspacemacs-configuration-layers
   '(
     ;; ----------------------------------------------------------------
     ;; Example of useful layers you may want to use right away.
     ;; Uncomment some layer names and press <SPC f e R> (Vim style) or
     ;; <M-m f e R> (Emacs style) to install them.
     ;; ----------------------------------------------------------------
     sql
     python
     markdown
     ...

     ;; これ
     (spell-checking :variables enable-flyspell-auto-completion nil)

     ...
     )
```

- 同じく `.spacemacs`の `user-init ()`はこんな感じに追記する

```
(defun dotspacemacs/user-init ()
  "Initialization function for user code.
It is called immediately after `dotspacemacs/init', before layer configuration
executes.
 This function is mostly useful for variables that need to be set
before packages are loaded. If you are unsure, you should try in setting them in
`dotspacemacs/user-config' first."

  ;; MSYS2経由でインストールしたパッケージを使う
  (add-to-list 'exec-path "C:\\msys64\\mingw64\\bin")

  ;; FlyspellにHunspellを使う
  (setq ispell-program-name "hunspell")
  )
```

`exec-path`は `MSYS2`のインストール場所から辿った `mingw`のbinまでのパスを書く。




🎉🎉🎉🎉🎉
Shell, bashとzsh, TMUX

#はじめに
この記事は、
Shell, bashとzsh, TMUXとは何かを
簡潔に書き留めたものです。

##Shellとは?
shellとは、
入力情報をコンピュータに伝えるプログラムのことです。

##bashとzsh
これらは、Linuxで使われるシェルです。

「.sh」の拡張子で、
viエディタなどのテキストに処理を記述して実行します。
これをシェルスクリプトと呼びます。

プログラミング同様に変数や関数、演算処理などの機能があり、
ちょっとしたプログラムならbashやzshのみでも記述することができます。

####bash
・Linux標準シェルのため、どこでも使える。
・カスタマイズせずに使う人が多い。

####zsh
・軽量で、補完機能が充実（カスタマイズする）


##TMUXとは?
TMUXとは、
1つのターミナルで複数のサーバーを操作できるツールで、
同時並行で作業が可能です。

不用意にターミナルを閉じてしまうこともありません。

##参照
・[Samurai Blog](https://www.sejuku.net/blog/54333)
値渡しと参照渡し

値渡しと参照渡しについての学習メモ

##値渡し
・変数のコピーを渡す
・変数の中身を書き換えても呼び出し元には影響しない

PHPでは通常、値渡しを使う
引数で指定した変数の値はコピーされて別の変数として仮引数で値を受け取れる。

##参照渡し
・変数の置いてある場所を示し参照してもらう
・変数の中身を書き換えると呼び出し元の変数の中身も書き換わる。

メリット：
高速に動作する（らしい）

デメリット：
多用するとプログラムの流れを追いかけるのが難しくなる

注意点：
定数には使えない

書き方：
&をつける

```php
function 関数(&$引数)
```