OmniAICreator/Qiita-1.07M huggingface dataset:
【Windows】Pythonのpip

# はじめに
前回はPython2と3をインストールして、実行方法を確認した。今回はpipについてまとめる。なお、Python3をベースにする。

# 概要
pipとはPythonのパッケージ管理ツールである。Rubyなどと同様にPython人様が作成したPythonスクリプトを自分のスクリプトで利用できる。なお、pip自体もまたパッケージである。

パッケージをインストールするpipパッケージを導入するにはどうするか。答えはsetuptoolsパッケージをインストールし、easy_installコマンドを実行する。

Windowsのインストーラーだとデフォルトでsetuptoolsもpipも入った状態でPythonをインストールされる。（あるバージョンからデフォルトで入るようになったらしい。）

# パッケージの確認
`pip list`でインストールされたパッケージが確認できる。

```cmd
C:\Program Files (x86)\Python37-32\Scripts>pip list
Package    Version
---------- -------
pip        18.1
setuptools 40.6.2
```

# パッケージの導入
今回はpython-dateutilを入れてみる。
>Python標準のdatetimeモジュールを拡張します。月末を算出したり、「次の◯曜日」を算出したり、「当月の最終◯曜日」を算出したりすることができます。

```
C:\Program Files (x86)\Python37-32\Scripts>pip install python-dateutil
Collecting python-dateutil
  Using cached https://files.pythonhosted.org/packages/74/68/d87d9b36af36f44254a8d512cbfc48369103a3b9e474be9bdfe536abfc45/python_dateutil-2.7.5-py2.py3-none-any.whl
Collecting six>=1.5 (from python-dateutil)
  Using cached https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Installing collected packages: six, python-dateutil
Successfully installed python-dateutil-2.7.5 six-1.12.0
C:\Program Files (x86)\Python37-32\Scripts>pip list
Package         Version
--------------- -------
pip             18.1
python-dateutil 2.7.5
setuptools      40.6.2
six             1.12.0
```
※管理者権限で実行

# インストール単位
当然ながら、Python2には影響なし。

```
C:\Python27\Scripts>pip list --format=legacy
pip (9.0.3)
setuptools (39.0.1)
You are using pip version 9.0.3, however version 18.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
```

# まとめ
特に難しい話はなし。Pythonはシンプルで好感がもてるぞ。
TensorFlowでサンプルの画像識別を動かすまで

# TensorFlowでサンプルの画像識別

Tensorflowのサンプル画像識別モデルであるInception-v3で画像認識するまでのメモ。
使用したOSはMac。
他の事もやっていたので、再現出来ないかもしれないですがメモってことで。


## Pythonのインストール
```
$ brew install pyenv
$ pyenv install -l
$ pyenv intall 3.6.6
$ pyenv version
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```

pyenvでpythonのバージョンを切り替えられるようにしています。
また、python3系の最新バージョンは3.7系ですが、pipでtensorflowがインストール出来なかったので、3.6系をインストールしています。

## TensorFlowのインストール

```
$ pip install tensorflow
```

## TensorFlowライブラリのダウンロードとサンプルの実行
```
$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow
$ cd tensorflow
$ brew install swig
$ ./configure
$ cd tensorflow/models/image/imagenet
$ python classify_image.py
```
GPUの使用はしないので、./configureの後はNを入力

サンプルを動かすとパンダの画像解析が走るらしい。

自分の画像を解析するときは以下のコマンド

```
$ python classify_image.py --image_file /path/to/file
```



## 参考サイト
[Tensorflowがインストール出来ない症状を解決する方法（Python 3.7.0）](https://qiita.com/locktki/items/abb04846f2251f357650)
[TensorFlowのInception-v3で画像を分類してみた(Python API編) ](https://soralab.space-ichikawa.com/2016/03/tensorflow-inception-v3/)
[macでTensorFlowを動かしてみる](https://m-yamashii.hatenablog.com/entry/mac%E3%81%A7TensorFlow%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)
始めます

# 始めよう
あまりにも進歩がない現状に嫌気が刺して、
AWSの講座で＠kakakakakkuさんに出会い、
生き方は微塵も真似できないけど、忙しさにかまけて勉強してない自分を恥じ、
少しずつでも新しいことを取り入れていこうと巻きなおした次第。

いつまで続くかは謎。
とりあえずCygwin入れてGitHubアカウントを作ってQiitaも取った。
仕事の合間にブログを書くのは癒されるかどうかは謎だが、
少なくともスマホゲーよりは生産性があると思う。
＃生産性無いこと大好きなんだよなあ・・・

Infrastracture as a Codeをやりたい。やります。やる。
現状の実務には役に立たないが、先行学習するだけの価値はあると思っている。
まずは「Ansible徹底入門」を買ったので頑張って実践する。
自分で記事を書くというよりは、個人的に学習に使ったリンクのリツイートが多くなります。
やらぬ善よりやる偽善。
書かぬ記事より書く駄文。
顧客や会社との関係が悪化したら転職しよかなという希望を胸に秘めるためにも。勉強する。
まずは2018年の第一歩。
始めるのに遅すぎることはない。はず。歩みは遅くとも。歩く。

参考にしました：
[初めての「技術ブログ」書き方のご紹介] (https://blog.soracom.jp/blog/2018/04/18/howto-techblog/)
Vue.js SFC TypeScript で render function のサンプル

```vuejs:Head.vue
<script lang="ts">
export default {
  functional: true,
  render: function(createElement: any, context: any) {
    return createElement("h" + context.props.level, context.children);
  },
  props: {
    level: {
      type: Number,
      required: true,
    }
  }
};
</script>
```

```vuejs:Home.vue
<template>
  <Head :level="2">hoge</Head>
</template>

<script>
import Head from "../components/Head.vue";
</script>
```
ModalBottomSheet で RecyclerView を表示する - kotlin

# できるもの
![Android_Emulator_-_Pixel_2_XL_API_28_5554.png](https://qiita-image-store.s3.amazonaws.com/0/328023/cb8a5fcd-b174-6465-0e2c-f49c8e073c47.png)

# やること
1. [ボトムシートを実装する](https://qiita.com/aki_design_1988/items/06d24514b5e147b10a8d)
2. RecyclerView のレイアウトを追加する
3. Adapter を設定する
4. Fragment で呼び出す

## 1. ボトムシートを実装する
以下の記事を参照して実装
https://qiita.com/aki_design_1988/items/06d24514b5e147b10a8d

## 2. RecyclerView のレイアウトを追加する
ボトムシートのレイアウトに RecyclerView の UI を追加

```fragment_bottom_sheet.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:padding="16dp"
            android:textStyle="bold"
            android:background="@color/colorPrimary"
            android:textColor="#FFFFFF"
            android:text="ボトムシート"/>

    <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/list_fragment">
    </androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
```

## 3. Adapter を設定する
データと UI をひもづける。


```Listdapter.kt
class ListAdapter(private val myDataset:ArrayList<String>): RecyclerView.Adapter<ListAdapter.ViewHolder>(){

    class ViewHolder(var view: View): RecyclerView.ViewHolder(view){
        var listName = view.list_name
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListAdapter.ViewHolder {
        val view:View = LayoutInflater.from(parent.context).inflate(R.layout.fragment_list_item,parent,false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.listName.text = myDataset[position]
    }

    override fun getItemCount() = myDataset.size

}
```

## 4. Fragment で呼び出す
**ポイント**

- Activity ではなく、Fragment 側で呼び出す
- layoutManager は `list_fragment.layoutManager = LinearLayoutManager(activity)` のように `(activity)` を指定する
- ボトムシートで表示する場合は、ボトムシート作成後のライフサイクルでRecyclerView 系の処理をする（onViewCreated）。

```BottomSheetFragment.kt
class MyBottomSheet():BottomSheetDialogFragment() {

    // ボトムシートの表示
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        var view = inflater.inflate(R.layout.fragment_bottom_sheet,container,false)
        return view
    }

    // RecyclerView の表示（ボトムシート表示の後にやる）
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        var itemList = arrayListOf<String>("first_item","item","item","item","item","item","item","item","item","item","item","item","item","item","last_item")
        list_fragment.layoutManager = LinearLayoutManager(activity)
        list_fragment.adapter = ListAdapter(itemList)
    }
}
```
【2018年 1番の成果】アウトプット駆動学習の習慣化


# はじめに
個人的に2018年を振り返って一番やって良かったこと、
それは**『アウトプット駆動学習の習慣化』**です。

やっと習慣化したと思えるようになったので、実際にアウトプットで得たことや、
記事を書きはじめて苦労した事、
習慣化に至るまでの道のりなどを書いていきます。
※ここでのアウトプットは技術記事投稿とします

# 対象読者
- 後述する『成果』を得たい人
- 記事を書くか迷ってる人
- 書く気持ちはあるがなかなか習慣化していない人

# アウトプット駆動学習の成果
アウトプット駆動学習を約9ヶ月続けた成果をまとめていきます。
人によって得られる成果は違うと思いますが・・・

### 成長スピードが格段に上がった
全ての成果の中でも**これが一番の成果**だと思います。
アウトプットを始めてから実感できるくらい成長スピードが上がりました。

もともと書籍を読むというインプットは大量にしてきました。
でも実際にコーディングなど手を動かすところまでは出来ていなかったので
分かった気になっているだけの部分が多くありました。
アウトプットでは、身についていない事をアウトプットするための学習をするので、全てが身につくようになりました。

### モチベーションを維持して勉強を続けられた
一人で勉強していてもモチベーションを維持し続けるのは難しいです。
アウトプットするようになってからは、リアクション（いいね、コメント）が貰えるようになったので、
もっといいねを貰えるようなわかりやすい記事を書こう！とモチベーションを保てました。

また、アウトプットする事で知らない事がどんどん明確になるので、何を勉強したらいいのかなど
迷う暇は無くなりました。

### 自分の知っている技術を人に説明できる力がついた
記事ではしっかり体系的にまとめたものを多く書いてきたので、自分の知っている事なら、
**わかりやすく相手に伝えることが出来るようになりました。**
技術的な面接の時にも使えるな-と思いました。

### 広い意味での影響力が高くなった
記事を読んでくださった他社の方から、継続してアウトプットしている点を評価してもらい声をかけてもらえることがありました。
他にも、エンジニア関係の友達から記事を読んだよ！と連絡を貰うこともありました。

一番嬉しかったのは、後輩が私のアウトプットをみて、自分もやってみようと
アウトプットを始めたことです。もっと増やせるように普及活動をしていきたいです。


# 習慣化するまでの道のり
ここからは記事を書き始める前から習慣化するまでの道のりを書いていきます。

### 記事を書く前に感じていた事
記事を書く気持ちはあるけど躊躇している人は共通していると思います。
自分自身も以下の理由でもともとはアウトプットする気はなかったです。

- 自分が書こうとしている内容の記事がすでにネットにある
- 若手の自分が書いた技術記事なんて誰に需要あるのかわからない
- 書くの面倒だし、そんな時間もったいない
- 何を書いて良いかわからない
- etc...

**こんな理由で2ヶ月くらい書こうと思っても自分に言い訳して何もしてきませんでした。**

記事を書くようになってから感じたこととしては、
**アウトプットの一番の目的は自分の学びのため**です。
なので、人がすでに書いた内容だったり、世間から見たら簡単な内容でも
自分に身につく内容ならなんでもおkだと書いている途中で気づきました。

### 食わず嫌いは良くないので、1記事書いてみた
アウトプットの目的だったり、意義をあまり見いだせていませんでした。
食わず嫌いはよくないと思ったので、最初は読んだ書籍のわからないとこをメモしていき、
最終的に調べたりしたまとめたものを記事としてアウトプットしてみました。

その時はJavaのStreamについてのアウトプットでした。
**アウトプットの成果もあって案件先でStreamを使った実装をすることができました。**
多分、書籍を読んだだけだと、あんなにスラスラ書く事は出来なかったです。

### アウトプットでしか得られない事があると知った
ネットの記事を読んだり、書籍を読んだりしたらその内容は身についた気になってる事が多かったです。
**でも実際、その内容を使う場面に来ると手が止まって、もう一度調べなおしてからやっと手が動き始めるような状態でした。**

アウトプットをはじめてからは、知ったかぶりではなく、しっかり自分に身につくので、
自分が学んだ内容を忘れたり、使える場面で手が止まったりするようなことはかなり減りました。

また、**アウトプットする事で『この場合はどう実装するんだろう』など経験する事でしか得られない事も学べました。**

このくらいの時期にはアウトプットの大切さを実感するようになりましたが、
習慣化にはまだ至ってませんでした。
面倒だったり、アウトプットしなくても誰にも何も言われないし、いっかという気持ちがありました。

### 習慣化させるために個人情報の開示と周りに記事の公表
途中から自分の顔や名前を出すようにしました。
少なくとも何万人かの人には見られているので、全く更新していない人と
思われたくない気持ちも芽生えました。

また、**周囲の人にも自分がQiitaに投稿している事を公言しました。**
公言する事で、見てくれる人や自分の書いた内容に対して、間違ってる箇所の指摘を貰えるようになりました。
また、アウトプットを怠っていると、最近記事書いていないね。みたいな言葉も貰うようになったので、
アウトプットする事に対して背中を押してもらえるようになりました。（狙い通りだぜ）

### 現在記事を書くためにしていること
記事を書くためには大量にインプットをしないと無理なので、書籍を読んだり、
ネットの徘徊などインプットは欠かさず行っています。
自分が学びたい内容（アウトプット）はメモを取っています。

他にも、自分の知りたい技術や、わからないことなどは常にメモを取っておくようにして、
わかってきたらアウトプットするようにしています。

また、**最終的に得たいこと（アウトプット）を意識して学ぶことで、
無駄な回り道をせずに、目的に向かって必要な事を学んでいけます。**


# 最後に、2019年どうして行くか
**週に１回はアウトプットとしての記事をあげられるように継続していきたいです。**
（旅行とか風邪ひいたりしたら無理はせずに）
また、今年は記事投稿がメインだったので、**来年からはLTとか勉強会での発表とかも少しずつできるようになりたいです。**
Symfony初期インストール手順(4系)

Symfony4.2をインストールし、開発用にWebサーバーを起動して初期画面をブラウザで表示するまでの手順

## 環境

- MacOS
- PHP 7.1.3以上
- Composer
- Symfony 4.2

## Composerを使ってSymfonyをインストール

[公式サイト](https://symfony.com/doc/4.2/setup.html)を参考

```bash

# コンソールで実行
composer create-project symfony/skeleton my-project
```

## 確認

```bash
# コンソールで実行
cd sample-project
composer require server --dev
php bin/console server:run 0.0.0.0:8000
```
ブラウザで http://localhost:8000/ にアクセスしてWelcome画面が表示されれば成功

## Symfonyが必要とするライブラリなどの状況確認
不足している拡張機能などがないか確認するには次のコマンドを実行

```bash
# コンソールで実行
composer require symfony/requirements-checker
```
ブラウザで http://localhost:8000/check.php にアクセスして`PROBLEMS`が表示されなければ概ね問題なし
`RECOMMENDATIONS`がある場合は追加でインストールしたほうが無難

以下のコマンドを実行してチェックツールを削除する

```bash
composer remove symfony/requirements-checker
```
Error: We're sorry, a server error occurred. Please wait a bit and try again. [FirebaseとGASの連携時]


SpreadsheetのデータをFirebaseに自動的に送信していく処理を構築している際に、

 <font color="Red">Error: We're sorry, a server error occurred. Please wait a bit and try again.</font>
というエラーが出た。

自分は、
[この記事](https://qiita.com/maatumoDev/items/512fd04fc5ab35cf4531)を参考にコードを書いていたが、

色々とこねくり回しているうちに、一度書いたマニフェストファイルにスコープのappscript.jsonが上書きされて、

```js
"oauthScopes":["https://www.googleapis.com/auth/userinfo.email","https://www.googleapis.com/auth/firebase.database","https://www.googleapis.com/auth/script.external_request"]
```

がなくなっていた模様。
再度oauthScopesの中に組み込んだら、無事うまく作動した。
Wordpressの「タクソノミー」とは結局何なのかまとめてみた

Wordpress使う機会が増えたのですが、独自の概念が多くて使いこなすのが意外と大変...
特に記事の分類方法の概念として「タクソノミー」「ターム」といった用語は頻出なのですがいまいち理解し難いところがあって、最近ようやく理解できたので忘れないようにメモ。
Wordpress初心者でカテゴリーとかタグとかカスタムタクソノミーって何が違うの？という人向けです。

# 記事の分類方法3種
Wordpresの参考書を読むと記事の分類方法には「カテゴリー」「タグ」「カスタムタクソノミー」の３種類があると書かれているので、まずはそれぞれを軽くおさらいしてみます。

# カテゴリーとは
記事をジャンルなどで「分類」をするための概念。親子関係が作れる
パンくずのイメージです。
例）グルメ＞イタリアン

# タグとは
記事の概要を「キーワード」ベースで表現するための概念。親子関係は作れない
SNSの「\#（ハッシュタグ）」みたいなイメージです。
例）女子会におすすめ,ワインがお美味しいお店,駅近

# カスタムタクソノミーとは
そもそもタクソノミーとは、記事を何かしらのルールで分類する時の「ルールの名前」になります。
代表的な例として「言語」「エリア」などがあります。

例）

| タクソノミー | ターム |
|:-------:|:-------:|
| 言語 | 日本語, 英語, 中国語 |
| エリア | 北海道, 東北, 関東, 中部, 近畿, 中国, 四国, 九州, 沖縄 |
| 価格帯 | 0円~1000円, 1000円~2000円, 2000円~3000円 |

このように自分で独自に追加したタクソノミーをWordpressでは「カスタムタクソノミー」とよんでいます。

# 結局タクソノミーとは何か
ここまで「カテゴリー」「タグ」「カスタムタクソノミー」と３種類おさらいしましたが、考え方としては全て**タクソノミーの一種**です。
▼イメージ
タクソノミー
　　∟ カテゴリー（デフォルトで設定されている）
　　∟ タグ（デフォルトで設定されている）
　　∟ カスタムタクソノミー
カスタムタクソノミーでは親子関係の有無や複数選択を許容するか否かなどが細かく設定できますが、ざっくり言うとカテゴリーは親子関係を使用する設定で、タグは親子関係を使用しない設定で**もともと登録されているカスタムタクソノミー**と考えるのが理解しやすいです。

# まとめ
- 「タクソノミー」はWordpressで記事を分類するための概念。
- タクソノミーの一種として「カテゴリー」「タグ」「カスタムタクソノミー」がある。
【windows】Pythonのインストールと実行

# はじめに
Windows10にPythonをインストールする。といったときに、Pythonは１端末上に複数バージョンが混在できることをしった。複数バージョンがインストールされたPython環境で、それぞれをどのようにインストールし、どのように使えばいいのかをまとめる。なお、今回はPython3.7と2.7をインストールする。

# 概要
## Pythonのインストール単位と環境変数
Pythonをインストールするときには、デフォルトではユーザ個別のインストールであり、C:\Users\blackcat\AppData\Local\Programs\Python\以下にインストールされる。インストール時に「Install for all users」を指定すると、C:Program filesなどの皆が利用できる場所にインストールされる。

また、環境変数を通すかどうかも選べるが、デフォルトでは通さないことになっている。環境変数を通すとコマンドプロンプトから直接`python`コマンドが使えるが、これだと複数バージョンを使い分けられない。

ユーザ個別か全ユーザかは好みだが、個人的には全ユーザがいいと思う。なお、環境変数は通さない。代わりにPythonインストール時にpylauncherを併せてインストールするようにする。これによりコマンドプロンプトからPythonプログラム実行時にバージョンを指定することができる。

## プログラムと実行の全体像
１枚の絵にまとめてみた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269452/bf268d37-4664-0e16-d606-fe45e6f8b47b.png)

pylaunchaerはC:\windows\配下にインストールされるため、コマンドプロンプトでpylauncherのコマンド`py`が使える。Pythonは3.7と2.7をそれぞれ全ユーザでインストールした。微妙にインストールの場所が異なる。この状態で自分のスクリプトC:\test.pyを実行する場合を考える。

1. コマンドプロンプトから3.7を指定して実行
    pylauncherにはデフォルトの目先がある。今は3.7に向いているので、`py C:test.py`コマンドを打つとPython3.7で実行される。

2. コマンドプロンプトから2.7を指定して実行
    この場合は、実行時に明示的に`py -2 C:test.py`とコマンドを打つ必要がある。

3.C:\test.pyをダブルクリック
    この場合はwindows上で.pyプログラムがどちらのpython.exeに紐づけられているかによる。紐づけはftypeコマンドで変えられる。

4. （補足）スクリプト側で制御する
    裏技的だがpylauncherでの実行では、C:\test.pyの行頭に`#!/usr/bin/env python2`と書くことで、実行するバージョンを制御できる。（`py C:test.py`でもバージョン2.7が実行される）

# インストール
インストール時の画面を貼っておく。
## 3.7
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269452/bd3293a8-90c4-d8d3-4a40-3d4b69ff4f0d.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269452/16816efc-8780-19f6-edc1-50b3c95e28fc.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269452/0edf90b3-9f48-1939-cbc9-092cbdc636b3.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269452/176a0ecc-8676-567e-9d1e-4f53fc64ff0a.png)
## 2.7
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269452/75e3e10d-fd04-fc05-6508-59f00eda379b.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269452/977f995e-cf10-0813-a721-560dac04cdf2.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269452/197c6e58-19ba-f660-08a2-c23ec80bfb0e.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269452/85908ad5-4148-3336-649e-6034228738d4.png)

# まとめ
とっつきにくいが、内容を理解すればそんなに難しくはない。
Pythonでコマンドラインオプションを処理する

[TUT Advent Calendar 2018](https://adventar.org/calendars/2906)の24日目の記事です。遅刻してごめんなさい。 

```Python
print('🙏'*100)
```

# TL;DR

Pythonでコマンドライン引数をdict(辞書)に置き換える。

# 実装方法

## 1. argparseを使う

[16.4. argparse — コマンドラインオプション、引数、サブコマンドのパーサー — Python 3.6.5 ドキュメント](https://docs.python.jp/3/library/argparse.html)

```Python:argparseを使ったサンプル
import argparse

parser = argparse.ArgumentParser(description='Parse command line options.')
parser.add_argument('integers', metavar='c', type=int, nargs='+',
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

args = parser.parse_args(['--sum', '7', '-1', '42'])
print(args.accumulate(args.integers))
```

## 2. optparseを使う

[36.1. optparse — コマンドラインオプション解析器 — Python 3.6.5 ドキュメント](https://docs.python.jp/3/library/optparse.html)

```Python:optparseを使ったサンプル
from optparse import OptionParser

parser = OptionParser()
parser.add_option("-f", "--file", dest="filename",
                  help="write report to FILE", metavar="FILE")
parser.add_option("-q", "--quiet",
                  action="store_false", dest="verbose", default=True,
                  help="don't print status messages to stdout")

(options, args) = parser.parse_args()
```

## 3. argparse vs. optparse

結論: `argparse` がv3.2から追加された為、理由がなければargparseを使うのがよい。

> もともと、argparse モジュールは optparse モジュールとの互換性を保って開発しようと試みられました。しかし、特に新しい nargs= 指定子とより良い使用法メッセージのために必要な変更のために、optparse を透過的に拡張することは難しかったのです。optparse のほとんどすべてがコピーアンドペーストされたりモンキーパッチを当てられたりしたとき、もはや後方互換性を保とうとすることは現実的ではありませんでした。**argparse モジュールは標準ライブラリ optparse モジュールを、以下を含むたくさんの方法で改善しています:**

出典: [16.4.6. optparse からのアップグレード — Python 3.6.5 ドキュメント](https://docs.python.jp/3/library/argparse.html#upgrading-optparse-code)

## 4. 自分で書く

コマンドライン引数を「 `-` から始まる文字列であるか」で判定している。`' -'`で引数を分割してdictに代入している。

ソース: [arg.py - gist](https://gist.github.com/tomoyk/fd2956e3a97bc77843f1c9ff61e2e98a)

```Python:arg.py
import sys
import re

def main(args):
    params = {}
    args = (' ' + ' '.join(args)).split(' -')
    args = [a for a in args if a] # remove blank elements

    for arg in args:
        split_arg = arg.split(' ')
        key = re.sub('^-*', '', split_arg[0])
        val = ' '.join(split_arg[1:])
        params[key] = val

    print(params)

if __name__ == '__main__':
    # main(sys.argv[1:])
    main("-e 222 -c foo -t bar --hoge --piyo moge".split(' '))
```

```Shell:実行結果
$ python3 arg.py -c 100 -f sample.txt -w word
{'c': '100', 'f': 'sample.txt', 'w': 'word'}
```

# まとめ

Pythonでコマンドライン引数を扱う方法は大きく分けると3つある。

1. argparseを使う
2. optparseを使う
3. 自分で実装する

簡単に実現するなら `argparse` を使うのがよい。単純なデータ整形であれば、自分で実装しても大変ではない。

---
Copyright (c) 2018 Tomoyuki KOYAMA
Released under the MIT license
http://opensource.org/licenses/mit-license.php
時系列データでのGrid Search

## はじめに

意外と情報が見つからなかったのでまとめてみました。
`sklearn.model_selection.TimeSeriesSplit`を用いた実行例を以下に示します。

## 実行例

```Python:
import numpy as np
import xgboost as xgb
from sklearn.model_selection import TimeSeriesSplit, GridSearchCV

X = np.array([[40, 15, 36, 11, 100, 22, 21, 76, 3, 32], 
              [3.1, 3.5, 1.3, 2.1, 8.3, 1.1, 3.4, 2.0, 2.4, 5.6]]).T
y = np.array([3, 21, 13, 7, 4, 1, 19, 2, 1, 1])

tscv = TimeSeriesSplit(n_splits=3)
for train, test in tscv.split(X):
    print(train, test)
```

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

### XGBoostでの実行例

```Python:
import numpy as np
import xgboost as xgb
from sklearn.model_selection import TimeSeriesSplit, GridSearchCV

X = np.array([[40, 15, 36, 11, 100, 22, 21, 76, 3, 32], 
              [3.1, 3.5, 1.3, 2.1, 8.3, 1.1, 3.4, 2.0, 2.4, 5.6]]).T
y = np.array([3, 21, 13, 7, 4, 1, 19, 2, 1, 1])

model = xgb.XGBRegressor()
params = {
    "learning_rate"   : [0.1,0.3,0.5],
    "max_depth"       : [2,3,5],
}

tscv = TimeSeriesSplit(n_splits=3).split(X)
gscv = GridSearchCV(estimator=model,
                    cv=tscv,
                    param_grid=params)
```

```
GridSearchCV(cv=<generator object TimeSeriesSplit.split at 0x7f2a5ee6c830>,
       error_score='raise',
       estimator=XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
       colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,
       max_depth=3, min_child_weight=1, missing=None, n_estimators=100,
       n_jobs=1, nthread=None, objective='reg:linear', random_state=0,
       reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,
       silent=True, subsample=1),
       fit_params={}, iid=True, n_jobs=1,
       param_grid={'learning_rate': [0.1, 0.3, 0.5], 'max_depth': [2, 3, 5]},
       pre_dispatch='2*n_jobs', refit=True, return_train_score=True,
       scoring=None, verbose=0)
```

## 参考

https://stackoverflow.com/questions/46732748/how-do-i-use-a-timeseriessplit-with-a-gridsearchcv-object-to-tune-a-model-in-sci
Ada言語 14日目 ファイル分割

#はじめに
クラスをやろうと思ったのですが、その前にファイル分割をできるようにしておくと良いかもしれないと思ったので、今回はファイル分割をやりました。(パッケージ化というのかな?)
開発環境は、IDEから離れてUbuntuの方でやりましたので、その際に作成したMakefileも一緒に載せておきます。

#ソースと結果
```main.adb
with Ada.Integer_Text_IO;
use Ada.Integer_Text_IO;

with pakkeizi;
use pakkeizi;

procedure main is

	hennsuu1 : Integer := 0;
	hennsuu2 : Integer := 0;

begin

	hennsuu1 := pakkeizi.pakkeizi_kannsuu1(20);

	Ada.Integer_Text_IO.Put(hennsuu1, 1);

	hennsuu2 := pakkeizi.pakkeizi_kannsuu2(20);

	Ada.Integer_Text_IO.Put(hennsuu2, 1);

end main;
```

```pakkeizi.ads
package pakkeizi is

	function pakkeizi_kannsuu1(hikisuu : Integer) return Integer;
	function pakkeizi_kannsuu2(hikisuu : Integer) return Integer;

end pakkeizi;
```

```pakkeizi.adb
with Ada.Text_IO;
use Ada.Text_IO;

package body pakkeizi is

	function pakkeizi_kannsuu1(hikisuu : Integer) return Integer is

	begin

		Ada.Text_IO.Put_Line("package function 1");

		return (hikisuu + 20);

	end pakkeizi_kannsuu1;

	function pakkeizi_kannsuu2(hikisuu : Integer) return integer is

		hennsuu : Integer := 0;

	begin

		Ada.Text_IO.Put_Line("package function 2");

		return (hikisuu + 100);

	end pakkeizi_kannsuu2;

end pakkeizi;
```

```Makefile
build:
	gcc -c main.adb
	gcc -c pakkeizi.adb
	gnatbind main
	gnatlink main

run:
	./main
```

`実行結果 1行目: package function 1`
`実行結果 2行目: 40package function 2`
`実行結果 3行目: 120`

#さいごに
次回こそはクラスをやりたいと思います。
IDEの方でもファイル分割をできるようにしたいとも思います。

良いお年を。

#日記一覧へ
[Ada言語を習得する日記一覧](https://qiita.com/C_Assembly/items/50a0f9d8542679d92ea8)
ワイワイプログラミング入賞の考察と感想

[NHKのワイワイプログラミング](http://www.nhk.or.jp/school/programming/index.html)に作品を投稿してみた結果、なんと入賞してしまいました！
今回はそのことに関して、記していこうと思います。


# ワイワイプログラミング

[ワイワイプログラミング](http://www.nhk.or.jp/school/programming/index.html)では毎月、お題が出され、そのお題に沿った素材が用意してあります。その素材は使っても使わなくてもよく、作るものもなんでもいい。アイデアと工夫が大事のこと。。。
私は**2018年の11月のお題である「計算記号を使って自由に作ろう！」**に参加しました。


# プログラミング言語と対象者について
## プログラミング言語

使う言語は「**Scratch**」という言語です。これは、ブロックを組み立てて、プログラムを作っていくものになります。

## 対象者

対象者は全年齢対象にしており、区分としては

小学生未満
小学1年
小学2年
小学3年
小学4年
小学5年
小学6年
中学1年
中学2年
中学3年生
高校生以上

となっていました。小学生から中学生がメインになると思います。おそらく小学生から中学生の方が、入賞以上を狙いやすいと思われます。
もちろん私は高校生以上で応募しました。(笑)


私は「 **T__michi** 」というアカウントでScratchを利用しています。
入賞した私の作品は[こちら](https://scratch.mit.edu/projects/259241213/)


# 投稿した私の作品について

## お題

お題は「計算記号を使って自由に作ろう！」で、いくつかの計算記号の素材が用意されていました。

## 作った作品について

私が作った作品は「[目と耳で判断しろ！計算記号当てゲーム](https://scratch.mit.edu/projects/259241213/)」です。
これは、「＋」「－」「×」「÷」の計算記号がランダムに画面に出てきて、一番多く出てきた計算記号を当てるゲームです。とても単純なゲームになります。(笑)

## 入賞した根拠

正直なところ、内容や、クオリティ、アイデアに関しても、そんなに入賞するまでのレベルではないと思います。
ただ、どの点が入賞したレベルになったかと考えてみると、このゲームのプログラムにあると思います。
<img width="343" alt="入賞画像.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/309633/ca81976a-46a8-ed8e-6b94-5e786add64af.png">

**T__michi**というものが私のアカウントなのですが、紹介のコメントの内容が

>4つの計算記号が宇宙をとびまわっている！もっともたくさんあらわれた記号を当てよう！動きはランダムだからなんども遊ぶことができる！あきさせない作りがとってもいいぞ！

と書いてあります。これは私が書いたのではなく、NHKの編集部さんが書いたものです。

>動きはランダムだからなんども遊ぶことができる！あきさせない作りがとってもいいぞ！

この部分が特に大事な文だと思います。この「あきさせない作り」というところが、私がプログラムを組んでいる時に最も力を注いだところなので、しっかりと伝わっていたのが嬉しかったです。

### 「あきさせない作り」プログラムの一部
<img width="316" alt="数の決定の画像.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/309633/c57afb8a-7b8e-3a95-e611-7787003fa1a5.png">

このプログラムが一番、このゲームの肝になる部分です。
ゲームが始まると、同時に、「＋」「－」「×」「÷」の計算記号が出現する数の計算が始まります。さらにこのプログラムは乱数で決定するので、同じ数になってしまうのを防ぐために、4つの変数が全て異なる数になるまで、乱数の計算を繰り返すような仕組みになっています。




# 感想

[目と耳で判断しろ！計算記号当てゲーム](https://scratch.mit.edu/projects/259241213/)の制作時間はおよそ10時間ほどです。
入賞を狙うために、良いアイデアで勝負したり、クオリティで勝負したり、ストーリーを重視したりと、手段は様々だと思います。
私の場合は、プログラムの仕組みということでした。
NHKの編集部さんは完成した作品だけでなく、プログラムの方もしっかりと見ているということには驚きでした。
ワイワイプログラミングには、ふとした瞬間の参加でしたが、とてもいい経験になりました。
MacでWebStormがバグってどうしようもなくなった時のクリーンインストールの方法

突然、ツールバーのメニューが全て機能しなくなりました。
IDEを再起動しても、Macを再起動しても、解消しないので、再インストールを試みましたが解消せず。

仕方がないのでクリーンインストールを試しました。
まず、通常通り、アプリケーションからWebStormを削除します。

その後、下記のファイルを削除し、再度インストールすることで症状が改善しました。

`~/Library/Preferences/<PRODUCT><VERSION>`
`~/Library/Caches/<PRODUCT><VERSION>`
`~/Library/Application Support/<PRODUCT><VERSION>`
`~/Library/Logs/<PRODUCT><VERSION>`

ログは消さなくても平気かも。

## 注意点
試用期間中にこれをやると、試用期間が残っていても問答無用でライセンス違反になって、ライセンスの購入を促されるので注意が必要。
<img width="618" alt="スクリーンショット 2018-12-31 17.39.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/153437/17dace36-c585-f182-eadb-c6166bafbf6e.png">


## 参考
https://intellij-support.jetbrains.com/hc/en-us/articles/206544519
業務システム開発モダナイゼーションガイドで得た学び_1章編

#この記事の対象

今年読んだ本の中でなかなか良かった「業務システム開発モダナイゼーションガイド」という本の学びまとめた物なので、以下の方であれば時間の無駄にならないと思います。

・SIerに勤務経験がある
・ウォーターフォールからアジャイルに変更を強制されているけれど、今いち違いも良さも分からない。


## 開発スタイルの基礎となるV字型モデル

良くネット上で議論されているウォーターフォールとアジャイルですが、概ねアジャイルの方が好意的な意見が寄せられている様に思います。
しかし、ウォーターフォールもアジャイルも「ひとつの機能開発」に着目した場合、**考え方及び進め方に大きな違いはありません。**
どちらもV字型モデルに沿ってプロジェクトが進み、両開発スタイルの大きな違いは**複数の機能を同時並行して開発する際の進め方です。**

## ウォーターフォール(計画型プロセス)とアジャイル(適応型プロセス)

### ウォーターフォールとは？
複数の機能を同時に開発する際、各工程はそれぞれ同期をとりながら進めます。
一度は以下の様な図を見た事があると思います。

![ウォーターフォールモデル.jpg](https://qiita-image-store.s3.amazonaws.com/0/36448/fc510ae1-b737-7234-7264-ba6d18bba5a9.jpeg)

### アジャイル
ウォーターフォールに対しアジャイルでは、各機能ごとに同期をとりません。
機能に優先順位をつけて、ガシガシ生産していきます。
![アジャイル.gif](https://qiita-image-store.s3.amazonaws.com/0/36448/a7592899-8019-1244-aeb4-f87741255c1e.gif)

### 管理工数 VS 変更工数

ウォーターフォールの場合、何百・何千の機能があろうとRD・BD・DD・開発・UT・IT・STが区切られるタイミングで一度進捗が同期されるため、足並みが揃えやすくプロジェクト進捗管理がしやすいです。しかし、各機能担当に求められる力は与えられた仕事をこなすプロフェッショナル性よりも全体最適に近い、視野の広さが求められるので、**出来る若者**が消耗しやすいのかなと感じます。

一方アジャイルの場合、各機能ごとに優先順位をつけ、短いスパンでRD・BD・DD・開発・UT・IT・STを何回も回します。こうする事により、IT現場でありがちな立ち上げ時から実際に開発が始まるまでの間に発生したライブラリアップデートに柔軟に対応しやすくなります。しかし、小さな組織がたくさん増える事による管理工数の煩雑化に加え、プロジェクトの目的・ゴールが見えなくなってしまうため誰のための開発なのかが見えにくくなってしまいます。こういったアジャイルの問題を解決するにはDevOpsチームが行う定期的な効果測定やデジタルマーケティングチームからの論理的なフィードバックが不可欠となるため、旧来の組織からはコストハウスに見えがちな役割をしっかり拡充する必要があります。


## SoR型システム開発とSoE型システム開発

アジャイル向きのプロジェクト、ウォーターフォール向きのプロジェクトという悩みを見かけますが、大きく以下を理解すれば混乱は少なくなると思います。

SoR(System of Record)：事実を記録していくためのシステム
→エンタープライズ・基幹系であり、金融勘定系システムの様な物であり、ウォータフォールが向いている。

SoE(System of Engagement)：お客様との関係をよくするシステム
→フロントエンド寄りのシステムであり、Webサイトやゲームアプリの様な物であり、アジャイルが向いている。

簡単な両者比較図

|    |SoR型システム|SoE型システム|
|:-----------------:|:----------------------:|:---------------------:|
| 定義             |   事実を正確に記録することがミッション |        お客様との関係を強化する事がミッション|
| システム種別           |            B2B,B2E|       B2C|
| 重視ポイント             |              安定性重視|        先進性重視|
| 実装特性               |                低難易度×多機能|         高難易度×小機能|
| 変更頻度             |             あまり変更しない|       頻繁な変更が発生する可能性がある|
| ビジネスモデル          |           ROI重視|      ハイリスク・ハイリターン|
| 案件開始前の心がまえ          |           入念な予測を行った上で実施される|      どうなるか分からないがあたりを探索しながら進む業務|

## V字型モデルの問題点

そもそもの話で、V字型モデルにも問題があります。
それは、後工程の予測・推定が十分にできていないと、正しい段階的詳細化が行えないという事です。
これに関する詳しい説明は後続の章でしっかり説明されているので、次回以降かけて記載します。
[Rails5]  includesの書き方・使い方について（ひとつ、複数）

#●書きたいこと
N+1問題の解消でよく`モデル.includes(〜〜〜）`という形を使うけど、
（〜〜〜）部分の書き方がわからず調べたのでメモしておく。

#●前提
<b>[Spree::OptionType]</b>
　　 　 　 　 ↓ ↑
　 has_many ↓ ↑ belongs_to
　　　　　　↓ ↑
<b>[Spree::ProductOptionType]</b>　←中間テーブル
　　 　 　 　 ↑ ↓
　 has_many ↑ ↓ belongs_to
　　　　　　↑ ↓
<b>[Spree::Product]</b>


という関係のときに、
includesを使ってOptionTypeとProductをつなぐ場合を考える。
※つなぐといってもテーブル結合のことではない




#●表記の仕方
●その1●
`Spree::OptionType.includes(:product)`
→OptionTypeとProductがつながる
<br>
<br>
●その2●
これ、

`モデル.includes(A: :B)`
`モデル.includes(A: [:B, :C])`

の形でも表せる。
その場合、<b>AがBをメソッドや関連などで持っていないといけない</b>、つまり、
<b>AのオブジェクトにおいてBの名前を使って何かしらを呼び出せるような形になっていないといけない</b>
</br>
例えば上のコードは
<br>
<br>
`Spree::OptionType.includes(product_option_types: :product)`
<br>
<br>
とかける。


●前提に書いたけど、この場合、Aに相当する`product_option_types`はBに対応する`product`を
belongs_toの形で関連づけしており、`Spree::ProductOptionType.first.product`の形で表せるため
このコードでかける。
<br>

★別例
`Spree::Product.includes(master: [:default_price, :images])`

これはSpree::Productが、master(Spree::Variantオブジェクトの１つ）が持っている
`default_price`、`images`というメソッド（この場合delegateだが）を持っているので、
このような書き方ができる。


※簡単に説明すると、Spree::ProductはSpree::Variantをvariantsという名前でhas_manyしている。
またSpree::Variantの中ではmasterというscopeがあり、これは
「Spree::Variantのレコードの中でこの条件を満たすものをmasterとします」という旨のscopeである。
default_price, imagesはSpree::Variantの中でdelegateされているので、
`Spree::Product.first.variants.first.display_price`という形で使える。
（これだとN+1が発生しますが）
<br>
<br>
以上、備忘録〜（２記事目）
<br>
他のフォルダのdocker-compose.ymlを実行する方法

例えば、ルートディレクトリから/docker ディレクトリーのdocker-compose.ymlを利用したい場合があったとする

root/
　└ docker/
　  　├ Dockerfile
　  　└ docker-compose.yml

そのとき、このようなコマンドで実行できる


    docker-compose -f ./docker/docker-compose.yml run --rm build-hogehoge


Dockerを走らせるコマンドって長くなりがちなので、docker-compose.ymlに記載して叩くことも最近よくある

その時にもわざわざディレクトリの移動しなくても良くなるので、結構便利

例えばこんな感じのroot/docker/docker-compose.ymlを書いて


    version: "3.3"
    services:
      build-hogehoge:
        image: alpine
        command: echo build-hogehoge
        volumes:
          - .:/work
        workdir:
          /work
    
      run-something:
        image: alpine
        command: echo run-something "run"

```
docker-compose -f ./docker/docker-compose.yml run --rm build-hogehoge
docker-compose -f ./docker/docker-compose.yml up -d run-something
```
Ubuntu MATEをRaspberry Pi3B+でむりやり動かす

Raspberry Pi用のOS　Ubuntu MATEは本来RaspberryPi3Bまでしか対応しておりません。3B+で起動させようとすると虹色のBoot失敗画面になってしまいます。

しかしどうなってもいいからとりあえず3B+でUbuntu MATEを動かしたい！と考えたそんな記事です。

#ファイルの書き換え
Raspberry3B上で行います。

bootを書き換えるためのアプリケーションをインストールします。

```
sudo apt-get install geany
```
インストール後起動

```
sudo geany
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/333756/f9187b82-4727-6bb5-7586-7cd32ed5f868.png)
起動するとこのような画面がひらくと思います。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/333756/522cffc3-cece-3a88-37de-88c732e9e840.png)
ファイルを開くからbootを選択
![3.png](https://qiita-image-store.s3.amazonaws.com/0/333756/e77ecdfc-2257-6ffb-f8b9-66579ca4f69b.png)
boot内のcmdline.txtを開きます。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/333756/37433563-834e-c397-4991-6fd08435b0ab.png)
末尾に

```
usbhid.mousepoll=0
```
を書き加えます。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/333756/9f55949c-0ee0-10a5-f6b6-c53f6cbf3026.png)
書き込めたら保存し再起動します。

再起動後端末を開き

```
sudo rpi-update
```
を実行します。![8.png](https://qiita-image-store.s3.amazonaws.com/0/333756/20af2223-2087-13e9-7952-668e78195289.png)
このように処理がすすみ、処理が完了すればシャットダウンします。
#3B+へSDカードを差し替える
3B+へ差し替えるとUbuntu MATEが立ち上がります。
ただしWiFiがつかえないみたいです。

#参考文献
https://www.youtube.com/watch?v=tdJrd75_068
Wanna google indexing Github PR / Issue page so Use Medium is bad manner?


# Copy HTML directly

![image](https://user-images.githubusercontent.com/13635059/50556446-93b70000-0d1c-11e9-8062-297dd2ee12cd.png)


# paste to medium and titeling

![image](https://user-images.githubusercontent.com/13635059/50556456-bb0dcd00-0d1c-11e9-9672-c5bfe88d0770.png)

# Why do i do this?

Medium is strong SEO power i know

# What is better way?

i m thinking 🤔

---

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

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
UIViewを丸型に切り取る

## 切り取る
``` swift
class ViewController: UIViewController {

    @IBOutlet weak var baseView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // 切り取りたい CGRectを指定
        let rect = CGRect(x: 120, y: 10, width: 100, height: 100)
        baseView.cutOutCircle(rect: rect)
    }
}

extension UIView {
    public final func cutOutCircle(rect: CGRect) {
        let maskLayer = CAShapeLayer()
        maskLayer.frame = self.bounds
        let path = UIBezierPath(rect: self.bounds)
        path.append(UIBezierPath(ovalIn: rect))
        maskLayer.fillRule = .evenOdd
        maskLayer.path = path.cgPath
        self.layer.mask = maskLayer
    }
}


```
## 結果
<img width="250" alt="Simulator Screen Shot - iPhone SE - 2018-12-31 at 16.52.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/173696/9c21d22d-1213-e535-cbe3-5f234d9a4b6f.png">
ModalBottomSheet の使い方 - kotlin

# できるもの
Material Design の [Modal Bottom Sheets](https://material.io/develop/android/components/bottom-sheet-dialog-fragment/) 
![ボトムシート20181231.png](https://qiita-image-store.s3.amazonaws.com/0/328023/94173eb4-af20-e7d9-b8ba-b41e2ca193ad.png)


# やること
1. ライブラリの読み込み
2. ボトムシートのレイアウト追加
3. ボトムシートを呼び出すボタン追加
4. ボトムシートの呼び出し

## 1. ライブラリの読み込み

```build.gradle
implementation 'com.google.android.material:material:1.0.0'
```

## 2. ボトムシートのレイアウト追加

```fragment_bottom_sheet.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="wrap_content"
            android:layout_height="200dp"
            android:layout_gravity="center"
            android:text="ボトムシート"/>
</LinearLayout>
```

## 3.ボトムシートを呼び出すボタン追加
```activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:gravity="center"
        tools:context=".MainActivity">

    <androidx.appcompat.widget.AppCompatButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TEST" android:id="@+id/btn"/>

</androidx.appcompat.widget.LinearLayoutCompat>
```

## 4. ボトムシートの呼び出し

- `BottomSheetDialogFragment` を継承したクラスを作る
- `onCreateView` でレイアウトと紐づける
- タップで呼び出す

```BottomSheetFragment.kt
class MyBottomSheet():BottomSheetDialogFragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        var view = inflater.inflate(R.layout.fragment_bottom_sheet,container,false)
        return view
    }
}
```
```MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        btn.setOnClickListener {
            val myBottomSheet = MyBottomSheet()
            myBottomSheet.show(supportFragmentManager,"navigation_bottom_sheet")
        }
    }
}
```

おわり
サイクロマティック複雑度をあげずに分岐の多いswitch～caseを処理する方策

## ことのはじまり
コマンドを読み込んで処理を実行するプログラムを作っていたのですが、コマンドを読んで処理を分岐する部分をswitch～caseで実装したところ、分岐が多すぎてVisualStudioでコードメトリクスを算出したときに[サイクロマティック複雑度](https://ja.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E7%9A%84%E8%A4%87%E9%9B%91%E5%BA%A6)が50を超えてしまいました。
コマンド分岐部分なので無視してもよかったのですが、あまり美しくないのでもう少し良い方策がないか悩んだ結果、コードチェック上はサイクロマティック複雑度を上げずに書けたので、その方法を記載します。
（※あくまでコードチェックツール上のサイクロマティック複雑度を減らせるというだけで、実際的な意味では分岐は減っていないです。）

## 対応方法

まず、もとのコードは下記のような状態とします。

```c#:before

switch(commandString){
  case "commandA":
    stringResult = commandAExec(arg1,arg2);
    break;
  case "commandB":
    doubleResult = commandBExec(arg1);
    break;

//以下同様の分岐が続く...
}
```

```c#:beforeメソッド

string commandAExec (string arg1,double arg2){
  //CommandAの処理
  //・・・
  return stringResult;
}

double commandBExec(string arg1){
  //CommandBの処理
  //・・・
  return doubleResult;
}

//以下同様のメソッド多数...
//・・・

```


これに対して、コマンドごとに呼び出されるメソッドのデリゲートを作成してディクショナリに格納し、switchのかわりにディクショナリのキーを使って呼び出します。

#### 1.分岐先のメソッドの戻り値と引数を一本化する
[DTO](https://ja.wikipedia.org/wiki/Data_Transfer_Object)を作成して、すべての分岐先のメソッドの引数と戻り値を一本化します。

```c#:DTO

class CommandArgDto{
  public string FieldArg1 {get;set;}
  public double FieldArg2 {get;set;}
  //必要なフィールドを定義する
}

class CommandResultDto{
  public string FieldResult1 {get;set;}
  public double FieldResult2 {get;set;}
  //必要なフィールドを定義する
}

```

```c#:メソッド

CommandResultDto commandAExec(CommandArgDto args){
  CommadnResultDto result;
  //コマンドAの処理
  //・・・
  //・・・
  return result;
}

CommandResultDto commandBExec(CommandArgDto args){
  CommadnResultDto result;
  //コマンドBの処理
  //・・・
  //・・・
  return result;
}

```

#### 2.一本化したメソッドを取り扱うデリゲートを定義する

```c#:デリゲート

delegate CommandResultDto CommandDelegate(CommandArgDto args);

```

#### 3.デリゲートを格納するディクショナリを作成し、中身を詰める。

```c#:ディクショナリ

var commandDic = New Dictionary<string,CommandDelegate>();

//コマンドとメソッドの組み合わせをディクショナリに格納する
commandDic.Add("commandA",commandAExec);
commandDic.Add("commandB",commandBExec);
//必要な組み合わせを追加

```

#### 4.switchの代わりにディクショナリにキーを渡して呼び出す

```c#:呼び出し

commandArgDto args; 
CommandResultDto result;

//argsに引数を設定する
//・・・

//キーが存在するかどうかは先にチェックする
if (commandDic.ContainsKey(commandString)){
   CommandDelegate command = commandDic[commandString];
   result = command(args);
}

```

そうするとあら不思議、switch分岐がないのでサイクロマティック複雑度があがらなくなりました。
実際にデバッグするときにどちらのほうがわかり易いかと言われると素直にswitchで分岐してあったほうがいいような気もするので微妙なところです。
macに Tomcat + eclipse をインストール

# macbook proにTomcatとeclipse をインストールした時のメモ

## Tomcatインストール
Tomcat 9 をダウンロードしてインストール
https://tomcat.apache.org/download-90.cgi
展開して/Applications/tomcat 内に配置

/Applications/tomcat/apache-tomcat-9.0.14


## eclipseインストール
eclipse公式サイト
https://www.eclipse.org/downloads/packages/release/2018-12/r
から　Eclipse IDE for Java Developers の　Mac Cocoa 64-bit をダウンロード
![スクリーンショット 2018-12-31 18.15.53.png](https://qiita-image-store.s3.amazonaws.com/0/266239/c1d98c36-4d1f-2fa0-9453-0bf37bc3c3c6.png)
展開後、Applicationフォルダに移動

## Tomcatプラグインインストール
［Help］ー［Eclisep Marketplace］より　「tomcat」 で検索
Eclipse Tomcat Plugin 9.1.3 をインストール
<img alt="スクリーンショット 2018-12-31 16.20.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/266239/a032ff3d-ac3d-ae9b-2ec8-dd8656aaea9d.png" width="300">

## eclipse Tomcat 環境設定
［環境設定］ー［tomcat］よりTomcatのバージョンとインストールディレクトリを設定
<img width="500" alt="スクリーンショット 2018-12-31 16.23.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/266239/e5bbed12-ac5b-6636-c546-7658f0a21cb4.png">

## 動作確認
まずプラグインが動いているかを確認
eclipseのメニューからtomcatの起動と停止を行ってみる
<img width="178" alt="スクリーンショット 2018-12-31 16.25.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/266239/1248e019-0d3e-00a8-c571-1324109b1dc6.png">

起動した後に、http://localhost:8080 でTomcatのサンプルページが見れることを確認
![スクリーンショット 2018-12-31 16.27.43.png](https://qiita-image-store.s3.amazonaws.com/0/266239/7ed250f7-20a4-b464-2513-ec1496371f3e.png)

## プロジェクト作成
Tomcatプロジェクトを作成してみる

［File］ー［New］ー［Project］ー［Tomcatプロジェクト］から適当な名前で作成
<img width="400" alt="スクリーンショット 2018-12-31 16.30.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/266239/a6558300-3952-799d-1544-2b8cc3c4d85b.png">

＊ここでは「tomcat-sample」の名前で作成

作成後にconfフォルダ内にlocalhost用の設定ファイルができていることを確認しておく
<img width="1000" alt="スクリーンショット 2018-12-31 16.32.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/266239/5f369b96-715b-ee27-0cb8-8c7ccf8e5296.png">

プロジェクト直下にindex.jspを作成
<img width="1000" alt="スクリーンショット 2018-12-31 16.37.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/266239/798def6a-b538-f221-f43d-feeccd95b7ca.png">

```java
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="java.util.Calendar"%>
<%@ page import="java.text.SimpleDateFormat"%>

<%
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
String today = "本日は " + sdf.format(calendar.getTime()) + " です";
%>
<%=today%>
```

ブラウザからアクセスして確認

![スクリーンショット 2018-12-31 16.38.56.png](https://qiita-image-store.s3.amazonaws.com/0/266239/35ce1c8e-4fb1-b531-2175-d0994357f599.png)


クラスやサーブレットを作成して Tomcat hot deploy ができることも確認する
node-sassでディレクトリにあるsassの変更をwatchして勝手にコンパイルしてくれる（yarn環境）


終わってみたら簡単だった…onchangeとか色々調べちゃったよ…
大晦日をyarnとnode-sassとの格闘で潰した

##①node-sassのインストール
`yarn add node-sass node-sass-import -d`

##②変換させるSCSSにimportを書く

今回はmain-content.scssを変換させるので、main-content.scssにこんなふうにimportを書いていく。rubyでのsassの書き方ではないのがミソ。node-sass君はちゃんとディレクトリからファイル名指定してimportしてやらないと「うるせー！どこだよ！」ってエラー吐いてくる。潔癖症なのかな…

![scss-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/278395/8ac2e9bd-27d3-dd86-b1bf-6bfa4e482a84.png)

##③コマンドをpackage.jsonに書く

```  
"scripts": {

    "watch:sass": "node-sass -r -w docs/css/main-content.scss docs/css/main-content.css",

  }
```
github.ioを使いたいのでdocsフォルダに入れてる。
[github.ioのやり方](https://qiita.com/urchin2x/items/da158689d135129210d5)
すぐHPになって確認できるのが嬉しい。

##④yarn...

`yarn watch:sass`
と叩けばwatchしてくれる。他のscssファイル、例えばfooter-nav.scssなんかを編集してもwatchしてくれてた。
出来上がったmain-content.cssをhtmlにペタッと貼ってやればスタイルがちゃんと全部あたります。

エラー文と公式ページからこの解にたどり着いたんですけど、本当エラー文と公式って大事ですね…。
【小ネタ】LINQの「遅延評価」「即時評価」って何が違うの？

# 最初に

本記事は「Effective C#」で得た知見である、「即時評価」「遅延評価」について確認したものとなります。
何番煎じとか知らない。備忘録として書いておきます。

LINQを知っている前提で解説します。

# 遅延評価

さて、クエリを定義した段階ではまだ、**「このクエリを走査した場合に実行される一連の手順」**を明記しただけとなります。なので、クエリの結果としてもたらされるシーケンスは**走査時点でのデータに依存**しています。つまり**走査の度に新しい結果が得られる**と言うことです。

必要になった要素から、必要になった分だけ、必要になった時に計算する方法を**「遅延評価(lazy evaluation)」**と呼びます。

## 遅延評価の性質を利用

遅延評価の性質を利用して**既存のクエリ式に別のクエリ式を付け足す**ようなこともできます。

例えば
`var seq1 = Crete(5, () => DataTime. Now);`
に対して
`var seq2 = from val in seq1 (以降なんか処理);`

seq2はsep1の返却値を弄るのではなく、あくまでも、seq1に対しての付け足し式となります。このことから、`seq1`はクエリによって作成された変数を保持しているわけではなく、**式ツリーを保持している**ことがわかります。

## 遅延評価のメリット

- **省メモリ**
- **無限ループにも対応可能**
- 返ってきた値を逐次反映させる事ができる

基本的にはクエリに対しては遅延評価を行うのが最善であると考えられています。

# 即時評価

ただし、場合によってはある時点における一連の値を一度に今すぐ受け取りたい場合があります。

その場合には**「即時評価(eager evaluation)」**を用います。

**`ToList()`や`ToArray()`**を用いることで強制的にクエリを実行し、**結果を即座に作成してキャッシュする**ことができます。もちろん、作成後は後から参照することも可能です。

ほとんどの場合で、**即時評価よりも遅延評価を行った方が作業量もメモリも少なく済みます**。

1回以上走査するクエリがある場合、どちらの挙動が必要かよく考えましょう。

# 参考

- スラスラわかるC#(書籍)
- Effective C#(書籍)
- [C#erなら当然知ってるよね！？LINQ遅延評価のメリット・デメリット](http://oxamarin.com/linq-lazy-evaluation/)
QRコードを人力で読み取る

# QRコードを人力で読み取る
QRコードといえば1994年にデンソーが開発した四角いバーコードですが、これ、**何も見ずに読めたらかっこよくね？** という安易な考えで人力読み取りしてみようと思います
目grepがあるなら目OpenCVもあっていいと思う...うん

## QRコードの生成
まず人力読み取りするために必要なQRコードを生成していきましょう

今回はGoogle Charts APIのQRコード生成を利用していきます。 [Reference](https://developers.google.com/chart/infographics/docs/qr_codes)  
しかしこのAPIはDeprecatedなのでいつ消えてもおかしくありません... 使用は非推奨です

このAPIの使い方は基本的にこんな感じです、文字コードを指定しないとデフォルトでUTF-8になります。
`https://chart.googleapis.com/chart?cht=qr&chs=<width>x<height>&chl=<data>`
今回は"Sweak"という文字列を300×300の大きさでQRコードにしていきたいと思うのでこんな感じになります
`https://chart.googleapis.com/chart?cht=qr&chs=300x300&chl=Sweak`
ブラウザで先程のURLを開くとこんな感じのQRコードが生成されると思います  
![qrcode1.png](https://qiita-image-store.s3.amazonaws.com/0/121754/a49c5571-f6a2-7ad3-a31f-867a8147a4eb.png)



## QRコードの読み取り
### QRコードの基本構造
QRコードは3辺に大きな四角があるのが基本です。
これはコードが上下左右どこを向いているのか読み取り機に示すものになります。
この画像で紫や赤で囲われた所がフォーマット情報が記載されている場所です。
(赤と紫が2箇所ずつありますが、同じデータです。)

| bit | 機能 |
|:-:|:-:|
| 14\:13 | 誤り訂正レベル |
| 12\:10 | マスク情報 |
| 9\:5 | 誤り訂正機能情報 |
| 4\:0 | エラー訂正bit |

この上の値に対してマスクが掛けられているので、解読する場合は`101010000010010`とXORします。

オレンジがモード指定 (数字, 英数字, バイナリ(8bit)、漢字(13bit))
黄色がデータ内の文字数指定
緑色が実データになります。
![qrcode2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121754/416ed222-aae2-2b21-0203-d013e4d4efa5.png)

※MSB: 最上位bit, LSB: 最下位bit
### マスク判定
QRコードには真っ黒や真っ白にならないようにマスクというものが施されています。
QRコードには8種類のマスクがあり、内容を解読するためにはマスクを解く必要があるので、どのマスクが掛けられているのか判定します。
マスクを判定するにはフォーマット情報の中からマスク情報が記述された部分(12:10のbit)を101とXORした数になります。

**8種類のマスク概要**

| Mask Number | Pattern |
|:-----:|:-----------------:|
| 000 | (i + j) % 2 = 0 |
| 001 | i % 2 = 0 |
| 010 | j % 3 = 0 |
| 011 | (i + j) % 3 = 0 |
| 100 | (i / 2 + j / 3) % 2 = 0 |
| 101 | (i * j) % 2 + (i * j) % 3 = 0 |
| 110 | ((i * j) % 3 + i * j) % 2 = 0 |
| 111 | ((i * j) % 3 + i + j) % 2 = 0 |

(WikipediaにCC0ライセンスでとても分かりやすい画像が添付してあったので引用させて頂きました)
![QR_Code_Mask_Patterns.png](https://qiita-image-store.s3.amazonaws.com/0/121754/32226112-b877-3c87-4120-d0bedde626a6.png) 

今回のQRコードでのマスクは010なので101とXORすると111になります
ということは8つ目のマスクでパターンと重複した色を反転します

反転した後のQRコードがこちらになります (データ部のみ反転済み)
![after.png](https://qiita-image-store.s3.amazonaws.com/0/121754/89c63464-473a-5428-df13-f243b0e10e30.png)

### いざ解読
QRコードは右下から

|  |  |  |  |
|:-:|:-:|:-:|:-:|
| 12 | 11 | 10 | 9 |
| 14 | 13 |  8 | 7 |
| 16 | 15 |  6 | 5 |
| 18 | 17 |  4 | 3 |
| 20 | 19 |  2 | 1 |

の順番で読んでいくので

モード指定部を見ていくと0100 (バイナリモード(8bit))
文字数指定部 (00000101)₂ = 5文字
となっていることが分かります。

緑色のデータ部を読み、UTF-8-character tableと照らし合わせると

(01010011)₂ : S
(01110111)₂ : w
(01100101)₂ : e
(01100001)₂ : a
(01101011)₂ : k

となり、解読することが出来ました

## 感想
(Qiita初投稿がこんな物で本当に良いのだろうか...？)

## 参考
What Is A QR Code And How Does It Work?  http://www.ucreative.com/articles/what-is-a-qr-code-and-how-does-it-work/
QR code - Wikipedia  https://en.wikipedia.org/wiki/QR_code
 https://en.wikipedia.org/wiki/QR_code#/media/File:QR_Character_Placement.svg
QRコードの概要 - 株式会社デンソーエスアイ https://www.denso-si.jp/dictionary/dic_qr/GeneralDescriptionoftheQRCode.pdf
TravisCIでmulti platformで複数のSwiftバージョンでビルドやテストをする

Swift用のライブラリなどをTravisCIでLinuxとMacOSX環境で複数のSwiftのバージョンでテストする方法です。

## 方法
[swiftenv](http://swiftenv.fuller.li/en/latest/)を使ってSwiftをinstallしてやることで複数バージョンのSwiftを使います。

`.travis.yml` をこんな感じに書くとlinux, OSXでSwiftの4.0,4.1,4.2でビルド、テストすることができます。

```yml
os:
  - linux
  - osx
language: generic
sudo: required
osx_image: xcode10.1
dist: trusty
env:
  - SWIFT_VERSION=4.0
  - SWIFT_VERSION=4.1
  - SWIFT_VERSION=4.2
install:
  - eval "$(curl -sL https://swiftenv.fuller.li/install.sh)"
script:
  - swift build
  - swift test
```

詳しくは[swiftenvのTravisCI向けのドキュメント](http://swiftenv.fuller.li/en/latest/integrations/travis-ci.html)を見ると書いてあります。

TravisCI以外でもCircleCIとかについてのやり方は[こちら](http://swiftenv.fuller.li/en/latest/#integrations)に書いてあるのでご参照ください。
ksnctfとは ？ 問題出題サイト？機械語？暗号複合？アセンブラ？何？

[ksnctf #4のリバースエンジニアリング的なことから、format string attack（書式文字列攻撃)を学ぶ - Qiita](https://qiita.com/developer-kikikaikai/items/8b4ae10785badb935dd9) で気になったキーワード


# ref

[ksnctfとやらをやってみた1 - ナカザンドットネット](https://blog.nkzn.info/entry/2012/05/31/020855)

どうやらksnctfはやれるものらしい

# 問題出題サイトらしい？

![image](https://user-images.githubusercontent.com/13635059/50555898-d1fcf100-0d15-11e9-845b-f0deb74d8441.png)

https://ksnctf.sweetduet.info/

# Flagな答えを探すらしい

> 各問題からFLAG_123456xyzという形式の答え（Flag）を探してください。 

# Text Problem

![image](https://user-images.githubusercontent.com/13635059/50555910-01136280-0d16-11e9-862c-cb2e71f348e9.png)
https://ksnctf.sweetduet.info/problem/1

たぶんわかる分かる人には分かる何か

# 送信してみる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/dae87285-e35c-faad-5e19-8db7137e3c09.png)


なにやら通った

# 簡単な問題

https://ksnctf.sweetduet.info/problem/2

複合の問題っぽい？

![image](https://user-images.githubusercontent.com/13635059/50555932-3e77f000-0d16-11e9-9f81-5d23765de3a6.png)

# 挫折‥

分かる人には分かる超通好みの何かっぽい。

# 以上

今回は降参‥🙇‍♂️

---

https://github.com/YumaInaura/YumaInaura

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
AVIF(AV1 Image File Format)についてのメモ

AVIFについて調べたことを書いておきます。

# 動画コーデックを使用した静止画のフォーマット

動画のコーデックを静止画に応用したフォーマットがいくつか登場しています。
WebPはVP8を使用したものです。
HEIFはH.265またはH.264を使用したものです。
そして今日の本題のAVIFはAV1を使用しています。

基本的にはこれらは元になった動画フォーマットとコーデックは共通で、コンテナに少し手を加えたものになっているので、ブラウザなどで既にその動画フォーマットがサポートされていれば、少しの変更で静止画にも対応できるはずです。

# AV1 Image File Format (AVIF)

AVIFについてはこのスライドが詳しいです。AV1のことについてもたくさん書かれています。
https://people.xiph.org/~negge/AVIF2018.pdf

AVIFの仕様はまだドラフト段階です。こちらで見ることができます。
https://aomediacodec.github.io/av1-avif/

これを見るとAVIFはHEIFの仕様を拡張したものだということがわかります。

# HEIF
AVIFを知るにはまずHEIFを知るべきで、こちらのスライドが私にはちょうど良かったです。
https://speakerdeck.com/yoya/heif-kaisetsu

# AVIFの実装とテストファイル

こちらのページに色々と書かれています。
https://github.com/AOMediaCodec/av1-avif/wiki

その中で紹介されているのですが、このページではlibaomのWebAssemblyの実装を利用してAVIFをブラウザで表示できるようにしています。興味深い。手元のFirefoxでは表示できました。
https://cconcolato.github.io/wasm-av1/

## AV1 test file
[Netflix AVIF files](http://download.opencontent.netflix.com/?prefix=AV1/Chimera/AVIF/)
[Microsoft AVIF files](https://github.com/AOMediaCodec/av1-avif/tree/master/testFiles/Microsoft)