OmniAICreator/Qiita-1.07M huggingface dataset:
git初心者デザイナー向けSourceTreeの使い方2019（図説付き）for MAC

# はじめに
超初心者向けです。とりあえず使えるようになる情報しか記載しません。
用語も噛み砕いてます。カッコ内は小慣れた人が使う用語なので覚えると便利です。
インストール済み、ssh設定済みの想定の説明です。

# 1. SourceTreeを起動する
すると以下の画面が開きます。画像内の説明の通り、
(1-1)の新規をクリックし、(1-2)を選択しすると後述する(3)の画面が開きます。
![st_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109064/a8b288c5-1a06-ec20-0178-5744c399353c.png)

# 2. ブラウザで自分のパソコン（ローカル）にコピー（クローン）したいgitのプロジェクトページを開く
※参考画像はgitlabです。
右端の(2-1)の「Clone」をクリックすると(2-2)が表示されるので上段のSSHの方をコピーする。
![st_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109064/ea320e8d-6985-3716-a9cb-633a60daedf3.png)

# 3. SourceTreeの画面に戻って自分のパソコン（ローカル）にコピー（クローン）する
(3-1)の「ソースURL」に(2-2)でコピーしたものをペーストする。

(3-2)の「保存先のパス（自分のパソコンのどのフォルダに置くか）」を指定する。
悩んだらコレ→ 例） /Users/user-name/gitlab/project-name

(3-3)の「名前」は(3-2)で選択したフォルダ（ディレクトリ）の名前が表示されるので、そのままプロジェクトの名前にしておくのがおすすめ。
最後に右下の「クローン」のボタンを押す。
![st_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109064/7db52508-bf96-0de1-d639-460647955398.png)

# 4. コピー（クローン）完了→ git操作画面が開く
![st_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109064/ff839011-0d1d-4879-36b5-9093e309872b.png)


### よく使う機能の説明
**(4-1)**コミット→変更や修正などの作業が終わった時にクリックするボタン。

**(4-2)**プル→ブラウザのプロジェクト（リモート）にアップされた変更を自分のパソコン（ローカル）に引っ張ってくるボタン。
**※ブランチをきる前に必ず毎回押すボタン！！**

**(4-3)**プッシュ→コミットの後にクリックするボタン。

**(4-4)**ブランチ→作業する前に押すボタン。
**※masterで作業しちゃいけません！！プロジェクトによってルールが異なるので必ず作業ブランチは確認しましょう！！**
**(4-4)'**自分のパソコン（ローカル）にあるブランチが表示される場所。
完了したものはどんどん削除しましょう。

**(4-5)**スタッシュ→作業途中で別ブランチに移動（チェックアウト）する時に押すボタン。
**※押さずに作業途中でチェックアウトすると大事故に繋がります！！**
**(4-5)'**スタッシュ（作業途中を保管）中のブランチ名が表示される場所。元に戻す時にこの場所を利用します。

**(4-6)**リモート→ブラウザのプロジェクト（リモート）に存在するブランチが表示されます。
左の矢印アイコンをポチポチして表示/非表示が切り替わります。
完了したものはどんどん削除しましょう。

### 基本的な作業順
**(4-2)**プル → **(4-4)**ブランチ → 修正作業 → **(4-1)**コミット → **(4-3)**プッシュ → マージリクエスト（※1） → マージ（権限のある人が行う）
※1：githubのプルリクエスト = gitlabのマージリクエスト = コードレビュー依頼です。コーディング初心者の方は得意な方に見てもらったり、見せてもらったりすると良いと思います。

作業手順の詳細は↓
[git初心者デザイナー向けSourceTreeの使い方2019（図説付き）for MAC part2](https://qiita.com/tsukapin/items/576eb9475bc7ae41e89a)
macOS MojaveでSequel Proがクラッシュ(crash)しまくる件の解決

Sequel Proを使ってますが、
macOS Mojave 10.14.6

に変えてから
`command + w`
でタブを閉じるとクラッシュしまくって困ってました。

issuesも上がっており未だ直っていないようです。
https://github.com/sequelpro/sequelpro/issues/3177

ということで改善方法としては、

テスト版をインストールしましょう！とのこと。
https://sequelpro.com/test-builds

で、やってみたら改善しました。

ちなみにテスト版の Nightly buildでは
現行のSequel Pro 1.1.2 ビルド4541(602e11a)にはまだない
ダークモードが実装されてました。

不幸中の幸いです。
【CSS】改行コードを含む文字列をCSSだけで改行させる。（ばいばいBR）

メモとして残します。


#■やり方

`white-space`属性で、値が`pre-wrap`。

```css
ELEMENT_selector{
    white-space: pre-wrap;
}
```

今まで、バックエンドで渡すとき、もしくはフロントでデータ受け取り後に改行コードを`<br />`に置換してたので、面倒でしたが、これで、無駄なコードを書かなくて済みます。
あのコマンドを発動させてみた（rm -rf /）

##概要

エンジニアになれば一度は聞いたことあるであろう全てを消去するコマンド "rm -rf /"。
実際にやったことがなかったので試してみることにした。（←暇なの？）
もちろん仮想環境で試します（Dockerコンテナ）


##実行環境

CentOS Linux release 7.5.1804 (Core)


##実行！

仮想環境を起動し、おもむろにこのコマンドを入力する。

```
bash-4.2# rm -rf /
```

さあ、本当に消えるのだろうか。
実行！

```
bash-4.2# rm -rf /
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe
```

・・・消えない
しかし、このオプション "--no-preserve-root" をつければいけそう。
改めて実行！

```
bash-4.2# rm -rf / --no-preserve-root
```

これで消えました。が、全てを消すことはできず、read-onlyになっているファイルは消せないと警告がでました。
本当に消えたのか ls コマンドを実行してみようとするが、コマンドがないため見れず。
というか、ありとあらゆるコマンドが使えなくなった。そりゃ全部消したんだからそうですよね。

生き残ったコマンドたち

```
!          bg         command    dirs       enable     fc         help       local      read       shopt      trap       unset
./         bind       compgen    disown     esac       fg         history    logout     readarray  source     true       until
:          break      complete   do         eval       fi         if         mapfile    readonly   suspend    type       wait
[          builtin    compopt    done       exec       for        in         popd       return     test       typeset    while
[[         caller     continue   echo       exit       function   jobs       printf     select     then       ulimit     {
]]         case       coproc     elif       export     getopts    kill       pushd      set        time       umask      }
alias      cd         declare    else       false      hash       let        pwd        shift      times      unalias
```

生き残ったファイルたち(配下の全てが無事というわけではなく一部だけ残っている）

```
dev/  etc/  proc/ sys/
```

以上！
"rm -rf / --no-preserve-root"はほぼ全てを消せるコマンドのようですね。
私の知識ではここからどうやって復活させるのかわかりません。
こうなったらもう最初からインストールした方が早いので、やる必要もありませんが。
Navigationで最初のFragmentにActivityから引数を渡す

## 「Navigationで最初のFragmentにActivityから引数を渡す」とは?

[Navigation](https://developer.android.com/guide/navigation)を使ってAndroidアプリを開発している時に、
「別のActivityから渡された引数をNavigationで設定した最初のFragmentに渡したい!」
なんて事がある場合の実装方法になります。

###  :computer:環境構築
****

```gradle
    // Navigation
    def navi_version = "2.2.0-alpha01"
    implementation "androidx.navigation:navigation-fragment-ktx:$navi_version"
    implementation "androidx.navigation:navigation-ui-ktx:$navi_version"
```
[Navigation 1.0.0-alpha07](https://developer.android.com/jetpack/docs/release-notes#october_29_2018)以上のバージョンで動作可能

### :pencil: 実装
****

#### ActivityとFragmentの構成

MainActivityにNavHostFragmentを指定しており、FirstFragmentがNavGraphに指定してある。

- res/navigation/nav_graph.xml

```xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/nav_graph"
            app:startDestination="@id/firstFragment"
            tools:ignore="UnusedNavigation">

    <fragment android:id="@+id/firstFragment" 
                             android:name="com.xxxx.xxxxx.FirstFragment"
                             android:label="fragment_first"
                             tools:layout="@layout/fragment_first"/>
</navigation>
```

- MainActivity

レイアウトファイル

```xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.xxxx.xxxx.MainActivity">

    <fragment
            android:id="@+id/nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:defaultNavHost="true"/>

</androidx.constraintlayout.widget.ConstraintLayout>
```

navGraphの指定をする `app:navGraph="@navigation/nav_graph"` は設定しない

```kotlin
class MainActivity : AppCompatActivity() {

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

        findNavController(R.id.nav_host_fragment)
            .setGraph(R.navigation.nav_graph, intent.extras)
    }

    companion object {
        private val TAG = MainActivity::class.java.simpleName
    }
}
```
コード上でNavGraphを設定し、その時に引数を渡してあげる。
↑の場合、MainActivityに渡された引数をそのままFirstFragmentに渡している。

以上

### :link: 参考になったURL
****
- [android - Navigation Component: pass safeArgs from activity to a fragment - Stack Overflow](https://stackoverflow.com/questions/53731571/navigation-component-pass-safeargs-from-activity-to-a-fragment)
【Django】django.db.utils.IntegrityError: (1048, "Column 'user_id' cannot be null")

## はじめに
以下のような形でモデルのフィールドに外部キー（例えばCustomUserオブジェクト）を使っている場合にview.pyから直接save()しようとするとエラーに本タイトルにあるようなエラーが出る。原因は登録すべき外部キーがnullの状態でDBに追加しようとしているためである。

```python:models.py
class Blog(models.Model):
    """ブログモデル"""
    class Meta:
        # テーブル名を定義
        db_table = 'blog'

    # テーブルのカラムに対応するフィールドを定義
    user = models.ForeignKey('accounts.CustomUser', on_delete=models.CASCADE)
```

```python:views.py
class BlogView(LoginRequiredMixin, View):
    def post(self, request):
        """POSTリクエスト用のメソッド"""
        form = BlogForm(request.POST)
        form.save()
```


## やり方
外部キーを利用する場合は一度save(commit=False)でコミット登録せずに、追加したい外部キーを追加した後にsave()する。

```python:views.py
class BlogView(LoginRequiredMixin, View):
    def post(self, request):
        """POSTリクエスト用のメソッド"""
        form = BlogForm(request.POST)

        new_blog = form.save(commit=False)
        new_blog.user = CustomUser.objects.get(id=request.user.id)
        new_blog.save()
```
ffmpegでヲタ芸の練習用動画をつくる

youtubeにアップされているヲタ芸動画をもとに、練習用動画を作る方法です。
「練習用動画」とは、「左右が反転されていて再生速度を遅くした動画」とします。

#動画のダウンロード
ダウンロードには「youtube-dl」を使います。
取り回しが良いように、640x480のmp4をDLします（-f 18の部分で指定）。

> $ youtube-dl -f 18 -o src.mp4 「youtube ID」

#必要部分の切り出し
全編では長い場合は、必要部分のみを切り出します。
以下は、src.mp4の0秒から1分30秒（90秒）までを切り出す場合です。

> $ ffmpeg -ss 0 -i src.mp4 -t 90 cut.mp4

# 左右反転
練習しやすいように、左右を反転させます。

> $ ffmpeg -i cut.mp4 -vf hflip mirror.mp4

# スロー
初めから通常スピードではできないので、スローの動画も作ります。
下記は、0.5倍速と0.8倍速の動画を作っています。

> $ ffmpeg -i mirror.mp4 -vf setpts=PTS/0.5 -af atempo=0.5 x05.mp4
> $ ffmpeg -i mirror.mp4 -vf setpts=PTS/0.8 -af atempo=0.8 x08.mp4

# おまけ：動画から静止画の切り出し
動きの確認のために、動画から静止画を抜き出します。
下記は秒間10フレームで静止画を切り出す指定です。1秒の動画から10ファイルの静止画ができます。

$ ffmpeg -i mirror.mp4 -vcodec png -r 10 image_%03d.png

参考：
https://qiita.com/livlea/items/a94df4667c0eb37d859f
https://qiita.com/kitar/items/d293e3962ade087fd850
http://fftest33.blog.fc2.com/blog-entry-36.html
https://qiita.com/YusukeSuzuki@github/items/aff145f78ec236319afb
https://takuya-1st.hatenablog.jp/entry/2013/08/30/211917
http://fftest33.blog.fc2.com/blog-entry-36.html
https://qiita.com/livlea/items/a94df4667c0eb37d859f#-%E5%8B%95%E7%94%BB%E3%81%8B%E3%82%89%E9%80%A3%E7%95%AA%E7%94%BB%E5%83%8F%E3%82%92%E4%BD%9C%E6%88%90
VBAで文字列結合を爆速にする方法

# はじめに

VBAで文字列を結合する時、このように`&`を使うことが多いと思います。

```vb:test.xlsx
Sub test()

    Dim str As String
    Dim i   As Long
    Dim tmp As String

    For i = 1 To 100000
        tmp = Rnd
        str = str & tmp
    Next

End Sub
```
この処理、私が試したところ、38秒かかりました。変数が大きくなるにつれてどんどん処理が遅くなってしまうようです。38秒って…結構辛いですよね。そこで他の書き方で試してみます。

# まずは実行してみる

```vb:test.xlsx
Sub test2()

    Dim str As String
    Dim i As Long
    Dim tmp As String
    Dim counta As Long
    Dim tmp_len As Long
    
    counta = 1
    str = String$(1000000, 0)
    
    For i = 1 To 100000
        tmp = Rnd
        tmp_len = Len(tmp)
        Mid(str, counta, tmp_len + 1) = tmp
        counta = counta + tmp_len
    Next
    
    str = Mid(str, 1, counta)

End Sub
```
なんと…一瞬で終わります！

少しややこくなりましたが、やってることはとても簡単です。testプロシージャに追加したコードにコメントを入れて解説します。

```vb:test.xlsx
Sub test2()

    Dim str As String
    Dim i As Long
    Dim tmp As String

    '新しく追加した変数
    Dim counta As Long
    Dim tmp_len As Long
    
    'strを100万の空白文字(0)で埋め尽くす
    str = String$(1000000, 0)
    
    'strの何文字目まで実際のデータを入力したかを覚えておく
    counta = 1

    For i = 1 To 100000
        tmp = Rnd
        
        'tmpの文字数を取得する
        tmp_len = Len(tmp)
        
        '100万空白の中のcounta文字目からtmp_len文字分をtmpに入れ替える
        Mid(str, counta, tmp_len + 1) = tmp
        
        'データが入っている位置を更新する
        counta = counta + tmp_len
    Next
    
    '最後に後ろに残ってしまった大量の空白を削除する
    str = Mid(str, 1, counta)

End Sub
```
変数strに予め何文字入力する予定かを指定しないといけなくなりますが、この速度差は凄い！
VirtualBoxのネットワークアダプタの設定の際に出てくる用語を調べた。


最近Linuxの勉強中です。
MacにVirtualBoxからcentOS7を入れて操作しながら学んでいるのですが、VirtualBoxの設定中に知らない単語が多かったので調べてまとめました。
まずたどり着いたのは[@taopi様の記事](https://qiita.com/taopi/items/0f9475e4c0e230911eb7)でしたが、その中で出てきた用語もわからなかったのも合わせて調べました。


##ネットワークアダプタ
ネットワークカードと同義。
物理的にはLANケーブルをパソコンにさすための「穴」の事。
インターネットを使うときに必要な（パソコンにくっつける）部品。

##ホストマシン、仮想マシン

・ホストマシン
仮想マシンを入れるためのマシン

・仮想マシン
仮想的に作り出されたハードウェア。
一台の物理サーバに対し複数の仮想サーバを作り出し稼働させるのが仮想マシン。

1台のマシンに１つのアプリケーションとして使うと、アプリケーションによってはパソコンのパワーが有り余る事がある。
余っているパワーをうまく使うために、ホストマシン、仮想マシンという関係を築く。
ホストマシンに仮想マシンをたくさん作り、それぞれにアプリケーションを作っていけば、ホストマシンのパワーを存分に使うことができる。

参考サイト:[5分でわかる「仮想マシン」とは？今さら聞けない基礎・基本を解説](https://boxil.jp/mag/a1300/#1300-2)

##VM (VMware)
1台のコンピューター上で、複数OSの実行を可能とする仮想マシンのソフトウェアのうちの一つ。
>1台のパソコンで、WindowsとLinuxなどの複数のOSを使うには、「デュアルブート」や「マルチブート」という方法もある。しかし、これらの方法は、OSの同時実行は不可能で、パソコン起動時にいずれかのOSを選択しなければならない。従って、別のOSを使いたい場合は、パソコンを再起動する必要があった。だが、VMwareを使えば、ホストOSと呼ばれるメインのOS下で、あたかもホストOSにインストールされているアプリケーションの中の一つのように、他のOSを利用することができる。
参考サイト:[コトバンク:VMware（読み）ぶいえむうぇあ](https://kotobank.jp/word/VMware-189483)

##DHCP
IPアドレスを自動で割り当ててくれる仕組み

##NAT
globalIPアドレスをプライベートipアドレスに(その逆も)変換できる仕組み。
プライベートipアドレスだけだとインターネットに接続できない！(プライベートipアドレスは、身内でしかわからない住所のため)
NATを使って、身内外にもわかってもらうipアドレスに変換する必要がある。
家の中で、パパの部屋、トイレ、物置というのは家族しか知らない場所。
郵便物の差出人をパパの部屋のhoge太郎とかにしてポストに投函したら、受け取った人は「え？」となって返信お手紙かけないので困る。
ちゃんと家の住所を差出人欄に書こう！
参考サイト:[NATとは](https://wa3.i-3-i.info/word11978.html)

##NAPT
NATをパワーアップさせ、１つのglobalIPで複数台のコンピュータがインターネットできるようにするネットワークアドレス変換技術

##NATネットワーク
NATはＶＭ毎に作られる、ＶＭ同士の通信はできない。
1つのNATで複数のVM同士で使うことができるようにしたものをNATネットワークという。
VM間でのやりとりが可能となる。

##内部ネットワーク
身内メンバーのやりとりが基本です。ここで言う身内はVM同士です。
外部ネットワークはインターネット側

##ホストオンリーアダプタ
VM同士の通信に加え、ホストマシンとも通信を行うことができる。
ホストオンリーアダプタの設定だけでは、仮想マシンからはインターネットに接続できない。
NAT＋ホストオンリーアダプタの設定を行うと可能。

##ブリッジ接続

・ネットワークの話でのブリッジ
複数のネットワークを1つのネットワークにまとめること。
VM側でホストのネットワークを使用する事ができる。

・ルータの話でのブリッジ
ルータのモーをブリッジモードにすると、ルータがスイッチングハブとして使えるようになる。
複数のパソコンを同じネットワーク内にまとめる事ができる。

##ssh接続
>ssh接続とは、暗号化され安全なsshプロトコルを使用して、外部にあるコンピュータへリモート接続して、OS上のコマンド（シェル）操作を行うことをいいます。
仮想環境にホストから安全にアクセスする。
参考サイト:[イー・アルゴリズム](https://e-algorithm.xyz/ssh-connection-of-se-is-not/)

私の環境だと、MACにvirtualBoxでCentOS7を入れたので、sshでMacのターミナルから仮想完了にログインしてシェル操作すること。
iOSでtype="number"を使って数字キーボードを出しつつ、小数点以下も入力させる

## 問題

```html
<input type="number">

```
これで、iOSだと下のようなキーボードが表示される。
<img width="375" alt="IMG_2498E92F3DE0-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/ed9973b7-1400-717e-a27f-15894e3530bf.jpeg">

### が、

小数点を入れると（`100.00`はOKだが、`100.01`はだめ）formのsubmit時にエラーになってしまう。


## 解決


```html
<input type="number" step="0.01">

```

これで小数点第2位まで入力エラーにならない。
Slack Appへの公開に役立つリンク集(by 翻訳アプリ Kiara)

#はじめに

この度、<a href="https://www.kiara-app.com">Kiara Translation</a>というSlack上で動く自動翻訳アプリをリリース＆Slack Appに公開しました。

日本語ドキュメントが少ないこともあって、開発＆公開方法を調査するのに苦労したので
役立ったリンクを纏めて今後開発される方の役に立てばと思います。

# 作成したもの
<a href="https://www.kiara-app.com">Kiara Translation</a>
<img width="980" alt="スクリーンショット 2019-08-16 12.10.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482888/a8b7c93b-aa34-10af-30e9-935a63e9d372.png">

|![markdown_matome.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482888/9ffd7f68-b29b-3e36-1eaf-01f6942bcd08.png)
|:-:|

このように、slackのチャネルに投稿したメッセージを予め設定しておいた言語に自動翻訳してくれるものになります。
# リンク集
- Slack公式ドキュメント
 - <a href="https://api.slack.com">英語ドキュメント</a> 
 - <a href="https://api.slack.com/lang/ja-jp">日本語ドキュメント</a> 
      - 現時点では英語ドキュメントの方が情報量が多い
      - 英語に苦手意識がある方は日本語ドキュメントを読んで足りないところを英語のドキュメントで補う感じ
- Slack App作成ページ
  - https://api.slack.com/apps
     - Dashboardが用意されており、アプリのOAuthやEvent Subscriptionの設定などもここから行う
- Bolt入門ガイド
  - https://slack.dev/bolt/ja-jp/tutorial/getting-started
     - Bolt(Nodejsのフレームワーク)を使用して、Slack ワークスペースからのメッセージをリスニングして応答するアプリを開発する  
- Qiita
 - <a href="https://qiita.com/munky69rock/items/3342c7b7c642fd2c68f3">初めてSlack appをつくって審査通すところまでやった知見を晒す</a>
     - Slack Appの公開方法や審査について書かれた数少ない日本語記事
 - <a href="https://qiita.com/girlie_mac/items/21fedcc6ce07aa44a670">Slack メッセージ・アクション API を使ってディスカバラブルなアプリを作ろう</a>
     - リクエストの認証方法などのサンプルも記載されている 
- ローカルでの確認方法(ngrok)
    - https://api.slack.com/tutorials/tunneling-with-ngrok
      - サーバーを借りなくても簡単に動作確認が可能
- Scope周り
  - https://api.slack.com/scopes 
- ライブラリ集
    - https://slack.dev
- Slackの問い合わせページ
  - https://api.slack.com/support?ref=api_nav
     - 英語で質問した方がレスポンスが早いような気がしました
Elm開発でもドキュメントが書きたい！

副タイトル：applicationモードだとdocs.jsonは生成できないんですよってもう言わなくていいんだ


[Elmのパッケージサイト](https://package.elm-lang.org/)では各パッケージのドキュメントが読めます
このドキュメントはREADMEと各moduleに書かれたmodule documentから生成されています

おそらくパッケージを出したことがないとあまり馴染みがないと思われるのでmodule documentの書き方とelm-doc-previewを利用したオフラインパッケージサイトの作り方を書いておこうと思います

オフラインパッケージサイトを作ることで新しくプロジェクトに入ったひとや未来の自分のために分かりやすいドキュメンテーションができます（わかりやすいかどうかは努力による）

## module documentの書き方

[公式のフォーマットの説明](https://package.elm-lang.org/help/documentation-format)を読みましょう
英語が読めない？しょうがないなあ

- `{-| -}`こういうのを関数の上とかmodule宣言（ファイルの一番上に書く`module Hoge exposing(..)`）とimport文の間に書く
- 基本的にmarkdownが書ける
    - 見出し（`#*`）は3つまでしかあんまり意味がない。見た目が変わらないため
    - Elmのコードブロックはindentして書く
        - バッククォートでも大丈夫。elm-formatが直してくるんで
    - `@docs hogeFunc, fugaFunc`みたいに書いてそれぞれのドキュメントをその位置に展開する

### 何を書けばいいのか

自分（もしくは自分たち）のために書くので必要なことを書けばよいでしょう
ちょっと目的が違うかもですがパッケージ向けのガイドラインが参考になると思います

- [ElmパッケージのDesign Guidelineを読む](https://qiita.com/mikesorae/items/38683a2f69240bcd1796)
- [Elm Packages Design Guidelines](https://package.elm-lang.org/help/design-guidelines)

## オフラインパッケージサイトを構築する

[elm-doc-preview](https://github.com/dmy/elm-doc-preview)というツールを使ってオフラインパッケージサイトを作ります

[Elm-doc-preview 3: Applications support & offline packages documentation server](https://discourse.elm-lang.org/t/elm-doc-preview-3-applications-support-offline-packages-documentation-server/4167)の記事で紹介されている通り、8/15にバージョンが上がってアプリケーションモードのサポートとキャッシュされたパッケージのドキュメントを読める機能が追加されました
神です

elmにはpackageモードとapplicationモードがあってpackageモードでないとドキュメント用のjsonが出力できないという問題がありました
elm-doc-preview 3ではapplicationモードでもドキュメントをだしてくれるようになったので大変便利です

### 使ってみる

```sh
npm install -g elm-doc-preview
```

~~nextから新しいバージョンがとれます~~（正式リリースされました。[感謝](https://qiita.com/miyamo_madoka/items/5cbb3791cd2899f87feb#comment-2084c8d39c0d8c80733a)）
これで`elm-doc-preview`コマンドと`edp`コマンド（ただのaliasです）が使えるようになります

あとはコマンド叩くだけでサーバーが立ち上がりますがapplicationサポートをするには1つjsonが必要です

```elm-application.json
{
    "name": "dmy/elm-doc-preview",
    "summary": "Documentation previewer",
    "version": "3.0.0",
    "exposed-modules": [
        "Href",
        "Session",
        "Page.Docs.Block",
        "Page.Search",
        "Page.Diff",
        "Page.Problem",
        "Page.Docs",
        "Page.Search.Entry",
        "Release",
        "Utils.Spinner",
        "Utils.OneOrMore",
        "Utils.Logo",
        "Utils.Error",
        "Utils.Markdown",
        "Main",
        "Skeleton"
    ]
}
```

これをelm.jsonと同じ場所に置いておきましょう。内容は見てわかると思います
`exposed-modules`にはドキュメントをみたいモジュールを追加しましょう

これを書いたらその場でコマンドをたたけばサーバーが立ち上がってオフラインパッケージサイトをみることができます

> アプリケーションのドキュメントにはおそらく初めてのひとはエラーメッセージが何個か出ていると思います
あれ書けそれ書けと言われるので言われた通りにしましょう
エラーメッセージが親切といわれるElmですが実はpackageをpublishするときにもドキュメントに関して親切にいろいろ言ってくれます

## 終わりに

コードに書いたコメントがそのままサイトになるやつでした
それなりの規模になった場合何かしら書くことあるので、それを直接ソースコードに書き込んでサイトにすれば共有が簡単になるかと思います

ローカルキャッシュのドキュメントを一覧する機能ですが一度作ってたことがあります。普通に動くようにはなっていますがもう開発することはないと思うのでここに供養します
[miyamoen/elm-local-packages](https://github.com/miyamoen/elm-local-packages)

参考: [Elmアプリ開発するときに便利な共通モジュールの管理方法](https://qiita.com/arowM/items/98f47202aa92394d483c)
Windowsの環境を移行「しやすい」chocolateyで何ができて何ができないのか調べてみた

# chocolateyとは？

chocolateyがどういうものかは[他の方の記事](https://qiita.com/kangetsu121/items/b6352b547cd32e71bc65)を参照していただいた方がいいです。
雑に言うと、

* windowsでもchocoでyumやらaptっぽいコマンドの振る舞いをさせて
* 作った環境を他のwindows端末にも持っていける

ものです。
これで、新しい端末を使うたびにいちいちダウンロードサイトまで行ってほげほげする必要がなくなります。

# chocolateyで入れられるもの 【2019/08/16時点】
どれができて、どれがだめなん？って情報は重要ですよね。

``` cmd
choco list (なんとか)
```

で、それっぽいものは引けるんですが、何となく眺めたくなったので。
「これも入れられるんだ！」っていう気付きにどうぞ。
（探しやすいようにasciiコード順にソートしています）

（内容が古いのと、GitHubにバックアップして気づいたんですが容量が凄まじかったので移転しています）
【差し替え先のページを準備中…】

# オススメ
とりあえずChocolateyGUI入れて画面から管理できるようにすると捗ります。
そちらだと1ページずつ更新するたびに時間がかかってどうしようもないので、choco listで見た方が楽かもしれません。
なお、choco installとGUI間できちんと連携されていました。

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
cDNAのmulti FASTAファイルから最長ORFを抽出したamino acid multi FASTAを生成する

cDNAの情報しか持っていなくて、これをアミノ酸に変換して系統樹を描きたい場合がある。数が少なければちまちまと1遺伝子ごとにApEなどでアミノ酸配列に変換してアミノ酸のmulti FASTAを作ればいいが、数が多いとやってられない。そこで、自動でDNA配列から最長のORFを探し出してアミノ酸配列に置換するスクリプトを作成した。基本Biopythonモジュールとテキスト処理でOK。問題点はATGとSTOPコドンを認識して取り出しているので、5’や3’が中途半端に切れているcDNAではORFが認識できないこと。まあ、そんな不完全な情報はいかんともしがたいのでよしとするか。


```Python3:dna2aafa.py
import sys, re
from Bio import SeqIO
from Bio.Alphabet import IUPAC
from Bio.Seq import Seq

fasta_file = sys.argv[1]

for record in SeqIO.parse(fasta_file, 'fasta'):
    match = max(re.findall('(ATG(?:\S{3})*?T(?:AG|AA|GA))', str(record.seq)), key = len)
    if match:
        seq = Seq(match, IUPAC.ambiguous_dna)
        print(">" + record.id)
        print(seq.translate())
```

cDNAのfastaファイルを引数に実行するとよい。

```
$ python3 dna2aafa.py cdna.fasta > aa.fasta
```
Arduinoエミュレータ SimulIDEでGAMEBUINOを動かしてみる

#はじめに
##SimulIDE
Arduinoと電子回路をPC上でシミュレーションできるツールです。
https://sourceforge.net/projects/simulide/

##GAMEBUINO
Arduinoで作られた携帯用ゲーム機です。
http://legacy.gamebuino.com/wiki/index.php?title=Getting_started

SimulIDEを使ったデモとして、SimulIDE上でGAMEBUINOを動かしてみます。:smiling_imp:

#準備するもの
###ハードウエア
シミュレータ上での実行のため、部品購入や電子工作は不要です。:grin:
##ソフトウエア
- SimulIDE
WindowsとLinuxに対応しています。以下よりダウンロードできます。（2019.8時点のバージョン：SimulIDE_0.3.10)
https://sourceforge.net/projects/simulide/

- Arduino IDE
https://www.arduino.cc/en/Main/software

- GAMUBUINO
以下のサイトにあるゲームの中から、BLOCKSBUINOというゲームを試してみます。:grin:
http://legacy.gamebuino.com/wiki/index.php?title=Games
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/0700637d-19ec-d964-2322-19542e7ce6df.png)

実機では、SDファイルにhexファイルを入れてソフトを入れ替えできるようです。
SimulIDEでSDカードをエミュレートできないため、以下のソースコードをダウンロードし、ビルドを行います。
https://github.com/frthery/BlocksBuino

#SimulIDEの編集
SimulIDEでArduino Unoとボタン、液晶(PCD8544)を配置し、結線します。

|Button|Arduino pin| 
|:-----|----------:|
|Right Button|D7|
|Left Button|D8|
|Down Button|D6|
|Up Button|D9|
|A Button|D4|
|B Button|D2|
|C Button|A3|

|PCD8544|Arduino pin| 
|:-----|----------:|
|RST|A0|
|SC|A1|
|DC|A2|
|DIN|D11|
|CLK|D13|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/adcb1d1b-730c-7d45-5b6d-9c32a3396635.png)

#ソースコードのビルド
1) 事前にArduino IDEより、BlocksBuinoをビルドするのに必要なライブラリ(Gamebuino Classic)をインクルードしておきます。
参考　http://legacy.gamebuino.com/wiki/index.php?title=Getting_started#Software_setup

2) SimulIDEより、BlocksBuino.inoを開きます。

3) SimulIDEのCompiler PathをArduino IDEのインストール先に設定しておきます。

4) SimulIDEのコンパイルボタンを押し、ビルドします。

5) コンパイルが正常に終了したら、Uploadボタンを押し、仮想Arduinoにアップロードします。
![SimuliIDE_Compile.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/05d62883-7073-348f-74b1-290fe15c40a9.gif)


#仮想Arduinoの実行
1) SimulIDEのPower Circuitボタンを押しシミュレーションを開始します。

![SimuliIDE_Run.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/fdc1624d-ee23-3cac-9326-4030aa09a1a3.gif)

2) Aボタンでゲームがスタートします。:sunglasses:

※液晶画面の表示にチラツキが発生してしまうようです。:anguished:
シミュレータのCircuit設定 NoLinStepを調整したところ、少し改善しました。:smiling_imp:

#さいごに
- GAMEBUINOは、液晶表示をSPI通信で行っており、動きの早いゲームなど、リアルタイム性を完全再現するのは難しいですが、Arduinoエミュレータでも一応動作しました。:relaxed:
- SimulIDEは、シリアル通信もシミュレーションすることができます。（デバッグに便利）
- SimulIDEは、Aruduinoエミュレータの一つで、まだベータ版ですが、開発、教育などいろいろな場面で使えそうです。
npmのpm2 v3.xは、再起動すると停止したプロセスも動き出す

仕様です。

pm2でプロセスを登録する→stopする→pm2 saveする→pm2 killする→pm2 resurrectする→stopしたプロセスが起動状態になる。


pm2 resurrectはプロセスとモジュールのステータスを復元しない。もしくは、pm2 saveはプロセスとモジュールのステータスを保存しない。

次のpm2バージョン4では直るらしい。リリースまだかな

2019/05/29に、4.xで直します と作者がコメントして、実際修正コードがコミットされている。

https://github.com/Unitech/pm2/issues/3625#issuecomment-496701095

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5825/4f858b7a-2764-a921-85c2-83e1c2ccb7ff.png)
UiPathでデータスクレイピング・Excel出力・マクロの実行まとめてしてみた

<h2>概要</h2>
今回はUiPathを使用して以下の手順を自動化していきます。
1.データスクレイピング機能を使用してWebページから表を取得して
2.Excelファイルに書き込みを行い
3.Excelファイル上でマクロを実行

<h2>やってみよう</h2>
上記の3ステップで自動化していきます！
今回は家計簿サイトの実績データを取得してExcelに出力してみます。

<h3>1.データスクレイピング機能をつかって表を取得する</h3>
UiPathにはデータスクレイピング機能という表形式のデータを自動的に認識して取り込む機能が存在します。この機能を使って家計簿サイトの実績データを取り込んでみます。

[家計簿サイトの実績データ]
こちらの実績データを取得していきます！
![2019-08-14 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/64a0e5db-2079-fe77-c086-8b29ff7f9c08.png)

下記の画像の赤枠の「データスクレイピング」ボタンを押下して
![2019-08-14 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/8f35d3be-2106-21d7-b17f-00052249cb9a.png)

取得したい表の要素を一つ選択すると
![2019-08-14 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/6b07a3b9-645a-dac2-220f-670a1dc6294e.png)

自動で表を識別してくれます。
「はい」を押すと表全体からデータを抽出します。
表の一部のデータのみを抽出したいなら「いいえ」です。
今回は表全体のデータを抽出してみます。
![2019-08-14 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/852e894d-70d7-8bfb-113e-9c0386d8d7d6.png)

はい！あっという間に表のデータをすべて抽出できました！
![2019-08-14 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/686c5069-1cdb-b6f4-85f0-05a5e4fe91f1.png)

そのまま完了すると取得した表のデータが自動的にDataTable型の変数に出力されます。
![2019-08-14 (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/fbed21bb-d6fd-9f39-24fe-9a9e770ac207.png)

これでWebページ上の表データを取得することが完了しました。簡単ですね。

<h3>2.出力したデータをExcelファイルに書き込む</h3>
Excelファイルに書き込むアクティビティとしては
「Excelアプリケーションスコープ」「範囲に書き込む」の2種類を使用します。

「Excelアプリケーションスコープ」はUiPathでExcelを使う上で必須のアクティビティです。このスコープ内で使用するExcelファイル名を指定します。ファイル名が対象のパス上になければ新規ファイルとして作成されます。
今回は新規Excelファイルを作成したいので、ファイル名「money.xlsm」としました。

次に「範囲に書き込む」のアクティビティを配置し、
書き込む「シート名」「開始セル番号」「書き込むデータ(変数)」を指定します。
またオプションで一行目をヘッダーとしたいので「ヘッダーの追加」にチェックを入れています。

![2019-08-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/84beaded-81c2-6c03-6f4a-06e7923ef651.png)

実行するとExcelファイルが作成され取得したデータを書き出すことができます。簡単ですね。
![2019-08-16 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/02d8d690-6502-0e58-eba0-b66819abdb4f.png)

<h3>3.Excelファイル上でマクロを実行</h3>
書き出したExcelファイルは書き出しただけの状態なので、折角なのでマクロを使って表を成形してみましょう。
(予めマクロを作成しておいてください。)

まず、先ほど同様「Excelアプリケーションスコープ」を設定し、先ほど表データを書き出したファイルを指定します。
そして、「マクロを実行」のアクティビティを設定します。
マクロ実行の設定は簡単でマクロ名を指定するだけです。
(他ファイルのマクロの場合"Aファイル.マクロ名"のように指定する必要があります)

![2019-08-16 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/335518fd-7ff7-256c-3b26-b1ec1fe49639.png)


![2019-08-16 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/e90712ba-130f-f275-42d0-d2152443aca8.png)

これでマクロの設定は完了です。
実行してみましょう！

無事にマクロが起動しましたね！
![2019-08-16 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/640c332a-14bb-69b4-7984-5de99f234ff6.png)
![2019-08-16 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/b8570bd6-1dcf-8d99-84b0-5bcb32feddeb.png)



<h2>まとめ</h2>
UiPathには色んな情報を簡単に取得することができますし、
Excel操作も思いのままに実行することができます！
今後も他の色んな機能を触っていこうと思います！それでは！
チームで仕事をする時に気をつけてること

最近、物忘れが激しくなってきて、具体的なことを思い出すのに時間がかかる（笑）

なので、具体的なことをメモっておく。

チームで、メンバーとして仕事するうえで気を付けるポイント。
本内容は、私の経験に基づく、個人的な主観になります。

# チームで、仕事をするときのポイント
## 自己開示
簡単にいうと、不安なことは何でも話すこと。

### なぜ？
不安なことが、後で発覚した際に致命傷になりかねないので。

### 具体的には？
- できる、できない。
- 終わる、終わらない。
- 助けてほしい。

### とはいえ、むずかしい。
心理的安全性の高いチームは、何でも話しやすいですよね。
自分がリーダーの時は、話しやすい空気を作るように心がけています。

### どうやったら自己開示しやすい？
みんな良いひとって思うこと。

## なるだけ平等
簡単言うと、できる人にタスクが集まりやすいです。

なので、できる限りタスクの平準化を心がけます。

### 具体的には？
- 自分がペーペーの場合
→簡単なタスクは、直ぐにキャッチアップする。
→難しそうなタスクは、わかる人の様子を見つつ、教えてもらう。
但し、同じような人に聞かれた場合を加味して、手順化しておく。

- 自分がベテランの場合
→出来る限り、やったことが無い人と二人で作業をする。
→手順化していく。

### その他
みんながやりたくない仕事が余りにも偏る（いつも同じ人がやる）場合は、当番制を導入とかもあり。

## 困りごとの声掛け
簡単に言うと、困っていること無い？って聞くこと。

自己開示で、困りごとを話せる人もいれば、話せない人もいます。
そういう人に、声をかけて、困っていることをチームで、キャッチアップしていきます。

# 最後に
チームは、チーム外から見たら、個人では無くチームとして見ます。
個人のタスクが終わっていても、チームとしてタスクが終わっていないかったら、それは出来ていない。とみなします。

なので、個人のタスクも大切ですが、チームとして動く場合は、メンバーは、チームの目で俯瞰してタスクを進めるように心掛けています。
micro:bitの温度計補正

#micro:bitの温度計を補正してみる

- micro:bitを使ってながらく研究室の温度計測をmicrobit+BLT+RaspiZEROで行ってきった。
- [詳細はこちら](https://qiita.com/tmdoi/items/cc7a278aedc994f40549)で公開している。
- その結果、micro:bitのCPU温度と外付けのBME280の温度計では、おおよそCPU温度のほうが３度ほど高いということがわかってきた。
- そこでBME280なしで、BME280に近い温度計測が可能か試してみる。ここには、その経緯をまとめていく。

#公開コードと計測データ

- [microbitのコード](https://makecode.microbit.org/_9m898C838dhk)
- [計測したデータを閲覧するページ](https://ambidata.io/ch/channel.html?id=10983&private=true)
配列とGetFilesについて

UiPathで要素数xの配列を作成してSystem.IO.Directory.GetFilesを実施した場合
帰り値が宣言した要素数より多かった場合、自動で要素数が増える(動的)

###### 実施手順
1.文字列配列「ArrayFile」を作成

変数名；ArrayFile
型；String
初期値：new string(1){“A”,“A”}

2.ArrayFile.Lengthの結果は2

3.AssignでArrayFileにsystem.IO.Directory.GetFiles(“C:\temp”)を代入する
※C:\tempには10個のExcelファイルしかない

4.ArrayFile.Lengthの結果は10
[PowerShell] ハッシュの使い方


## したいこと
ハッシュから値を取得したい


```powershell.ps
#key
$KeyArray = @('さくらんぼ','もも','りんご')
#value
$ValArray = @('cherry','peach','apple')

#初期値をセット
$Hash = @{$KeyArray[0] = $ValArray[0]; 
          $KeyArray[1] = $ValArray[1];
          $KeyArray[2] = $ValArray[2]}

#キーを配列に格納
$KeyCollectionKeys = $Hash.Keys

#値を取得
foreach ( $KeyCollectionKey in $KeyCollectionKeys ){
    Write-Host $Hash[$KeyCollectionKey]
}
```

## 注意すること
Keyは一度配列に格納する必要がある

Write-Host $Hash[0]
とやるのはダメ
PyenvとVNCの共存

どうやらpyenvとvncサーバの組み合わせには難があるらしく、pyenvの環境変数を.bashrcに加えるとvncサーバを起動しても画面が真っ黒になって正常に表示できないらしい。

.bashrcには

```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
export PATH="$PYENV_ROOT/versions/anaconda3-4.3.1/bin/:$PATH"
```
と記載する必要があるが、これがあるとvncserverが正常に起動しなくなる。
そこで、systemctlでvncserverを起動してからログイン後にこれら環境変数をexportする、というのが解決策らしいのだがちょっと面倒。

代替策として
.bash_profileに

```
User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
vncserver :1 -geometry 1280x1024 -depth 24

# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
```
というふうにvncserverの起動を入れる。
その際、.bashrcを読み込む前にpathのexportとvncserverの起動を持ってくるようにする。
ただ、こうするとvncでアクセスする前にログインをしていなくてはならないので、vncクライアントで接続する前にsshで接続しておく必要がある。常時vncサーバを立てておくむきにはこれは問題となるが、今回pyenvを使うサーバはdeep learningの実験機であるため、使いたいときだけvncサーバを立てるので問題はない。
RL78で微少電流計を作る

RL78G10とマイクロチップの24bitADC（2CH内蔵）MCP3901で微少電流計を作りました。
マークダウン記法に慣れてないので[__こちらにアップ__](https://yokaton.com/mcu-202209-microa/)しています。

ネットを徘徊してたらMCP3901（SPIインターフェース）の記事を見付け、随分と詳しく書いてあるのでG10に移植。
元記事は[**こちら**](http://www.picfun.com/dsPIC33/dspic33f06.html)ですが、私なんかとちがって詳細・親切・分かりやすく素晴らしい記事です。

んで、上記の記事ではCPUがPICで、表示にはパラレルLCDを使っています。
これをちょいいじくって、CPUをG10（秋月の[__R5F10Y47__](http://akizukidenshi.com/catalog/g/gK-09035/) 210円）に変更し、LCD表示部分をパソコンに行わせようって魂胆。
G10とパソコン間は[**秋月の例のUSBCDCケーブル（5V版）**](http://akizukidenshi.com/catalog/g/gM-05841/)で繋ぐ。

ただG10はSPIとUARTを同時には使えない（多分）。
そこでUARTはそのまま使い、SPIは手動でポートをパタパタして使うことにしました。
手動でポートをパタパタとなればこれは__アセンブラの出番でしょ！__

うむ～RL78のアセンブラってどうなのよ？
RL78って元々はZ80（8080）みたいなもんだろうけど、アドレスバスが20bitで8086になってしまった恐ろしいCPUじゃないの？
普段ARMで直線的でスッキリした32bitの体になってる私メに、この中途半端な__20bit__が扱えるのだろうか？
まさか今の時代にES:とかDS:とかnearとかfarとか出てこないだろうな･･･出てきました(^^;

諦めてPC9801時代の「ソフトバンク発行 神崎康宏著 8086アセンブラ入門」を思い出しながら組んでみました。
って、七面倒くさいんでレジスタだけを使ったんで、Z80と大差無く組めたみたいです。

＜不明＞
8086なら「REP MOVSB」とかの高速転送命令が使えたけど、RL78にも有るのかしら？詳しい方はお教えください。
[Microsoft] Azure DevOps Pipelinesで、複数のyamlファイルを使い分ける方法

# これはなに？

Azure DevOps Pipelinesを作成すると、既定では`azure-pipelines.yml`というファイルが自動的に出来上がります。
このファイルを、例えばビルド先ターゲット（開発用と本番用など）に応じて用意して使い分けるお話です。

# 手順

## ステップ 1

パイプラインの画面から、[New build pipeline]をクリックします。

<img width="226" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/8906d331-361c-b196-9c80-58c4af2463ed.png">

## ステップ 2

自分が使っているレポジトリを選びます。

<img width="665" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/c7a4923e-7de3-3e72-1242-d6c614facdc1.png">

<img width="673" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/144891da-226c-9f75-4d5d-f52a829576fd.png">


## ステップ 3

ここが要です。
というか、やることはここだけです。

__Existing Azure Pipelines YAML file__ を選びます。

<img width="822" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/16a04440-37f3-f906-ef39-5026b4e8a465.png">


## ステップ 4

YAMLファイルを選びます。
ここでは`azure-pipelines-staging.yml`というファイルを選んでいます。

<img width="475" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/33795cd8-38d1-2a12-a1d4-4a610a3d956f.png">


## ステップ 5

以上です。
お疲れ様でした。


# ところで

Azure DevOpsには、Build PipelineとRelase Pipelineというものがあります。
Release Pipelineはディスコンなんでしょうか。
↓↓↓ドキュメントには **(Classic)** なんて書かれていますし。
https://docs.microsoft.com/en-us/azure/devops/pipelines/release/?view=azure-devops
CyberduckでIBM Cloud Storage(S3)への接続・ファイル転送-The specified bucket does not existエラーの解決方法




上図のように接続してみたが、↓のエラーが出ました！！



**Cannot read bucket versioning status.
The specified bucket does not exist. Please contact your web hosting service provider for assistance.**


![スクリーンショット 2019-08-16 10.31.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181748/01d834aa-4f8c-7054-a4dc-404d0f797bd7.png)

###原因はCyberduckのUIの変更に伴う、Bucket名が上記の図だと指定できないためです！ ###

解決方法：

まず、**(重要!!!)バケットでエンドポイントの地域が意図したバケットと一致していることを確認します。**




ちなみに、下記値の取得方法は　[IBM Cloud Object Storage(ICOS)のファイル転送にWinSCPを使ってみた](https://qiita.com/tokamo10/items/f2ecd93cc62ea8a41409)　を参考してください。

・バケット名(パス)
・エンドポイント名(サーバ)
・サービス資格情報のアクセスキ(アクセスキーID)
・サービス資格情報のシークレットアクセスキー（シークレットアクセスキー)

上記の値を取得した後、下図のように記入します。
![スクリーンショット 2019-08-16 10.42.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181748/a04d85dd-c6f0-367d-b600-a5f9dd6bc7da.png)

![スクリーンショット 2019-08-16 11.34.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181748/c0610fee-ab13-5828-fe4d-5a09af67418e.png)

記入した後、そのまま、閉じて、ダブルクリックをすると接続できるようになりました！
試してみてね〜

参考リンク：
1、[IBM Cloud - Cyberduck を使用したファイルの転送の使用方法](https://cloud.ibm.com/docs/services/cloud-object-storage?topic=cloud-object-storage-cyberduck&locale=ja)
2、[CyberduckのUIの変更に伴うS3接続手順](https://techblog.haroid.io/connect_s3_for_ui_update_of_cyberduck/)
3、[IBM Cloud Object Storage(ICOS)のファイル転送にWinSCPを使ってみた](https://qiita.com/tokamo10/items/f2ecd93cc62ea8a41409)
pythonでffmpegを.cmd経由で動的に使用する

#h.265エンコードができる時代
ついにh.265エンコード速度が等速を超える時代になった。(Ryzen3900X)
ただffmpegにおいてh.265系はCPUを100%使用しないようで、効率よくエンコードする為には複数ファイルを同時にエンコードするのが良いようだ。
今回の目的は、フォルダ内の動画をCPU使用率90%近辺を維持するように複数エンコードするツールを作る。(Windows専用)

#pythonでcmdを操作したい
恐らく一番正攻法はPowershellを使うこと。でもやっぱりpythonで書きたい。pythonは色々楽だから。
・成果物はこちら(https://github.com/orenodinner/ffmpeg_dir_conv) 

pythonでcmdを実行するには subprocess.Popen()を使用する方法がある。
ただこれだと複数のcmdプロセスを扱う際、Winエラーが出てうまくいかなかった。
少々面倒だけど、pythonで動的に.cmdファイルを作成しそのまま subprocess.Popen()で開きエラーを回避した。
cmdウィンドウも複数独立して表示されるため状況確認もしやすくなり一石二鳥。
CPU監視はpsutil.cpu_percent()を使用。CPU使用率が80%以下になったらエンコードを一つ開始するようにした。

#改善したいところ
エンコード終了時に元ファイル削除が上手くいかないときがある。原因調査中。


GitHub(https://github.com/orenodinner/ffmpeg_dir_conv)
OpenCVで回転させた画像の下敷きに元の画像を使う

　ディープラーニングの学習用データセットを用意するときに、画像検索から引っ張ってきた画像だけではどうしても枚数が足りない。なので回転してデータセットを水増ししたい。
#さくっと回転させてみる
　OpenCVは画像の回転も可能です。やり方は以下のエントリーを参考にしました。
>[OpenCVで画像を回転させてみた](https://qiita.com/kenfukaya/items/77b49856e17a6882d422)

　とりあえずレナさんを45°回転させてみる。

![Lenna.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448703/fe9317f8-ea2d-b478-5583-ed8a08e6f3a7.png)

##コード
```python
import cv2

# 画像の読み込み。0：グレースケール、1：カラー
img = cv2.imread("Lenna.png", 1)

# 画像のサイズを取得、表示
h, w, _ = img.shape[:3]

# 画像の中心を計算
cw = w // 2
ch = h // 2
center = (cw,ch)

# 画像を回転
#getRotationMatrix2D関数を使用
trans = cv2.getRotationMatrix2D(center, 45.0, 1.0)
#アフィン変換
img2 = cv2.warpAffine(img, trans, (w,h))

cv2.imshow('window', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
###実行結果
![lenne_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448703/6dbe2b35-91d4-496f-5a50-4b51f20dfea2.png)

　回転はちゃんとできてるけど、黒い部分が出る。これはまあ当たり前で、画像そのもののサイズは変わらないわけだから回転させれば足りない部分は出てきます。その部分が黒として補間されている様子。
　でも、学習させる上でこの黒い部分はノイズでしかない。解消する方法として思いつくのは、トリミングするか、下敷きを作るか。。。

　トリミングすると画像のサイズが変わってしまうので、できれば避けたい。なので、元の画像を下敷きにするという方法を取ることにしました。
#考え方
　黒が出た部分というのは値が[0, 0, 0]になっているはず。なので、forループで左上から総当たり的に[0, 0, 0]の部分を探し、合致したら元の画像の同じ場所の値をコピペしてやればいい。
　コード自体はとても単純。
##コード
```python
for i in range(0, w):
    for j in range(0, h):
        if (img2[i,j] == [0, 0, 0]).all() : 
            img2[i,j] = img[i, j]
```

　配列を条件式に使うとき、最初は素直に`if img2[i,j] == [0, 0, 0]:`と書いていたら、`The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()`というエラーが出て怒られました。
　要約すると「配列のときは部分一致なのか完全一致なのか決めてね」ということらしい。ので、今回は完全一致にしました。

　ともあれこれで、穴埋めは上手くいっているはずなので、表示させて確認してみます。

```python
cv2.imshow('window', image2)
cv2.waitKey(0)
cv2.destroyAllWindows()
```

###実行結果
![lenne_comp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448703/f54556e2-504f-e9de-bf10-37de11d02ebf.png)

　穴埋めは想定通りに行きましたが、回転した画像の端っこに、黒縁が出てしまいました。解決方法としては[0, 0, 0]の値を変えて、それより下なら～という風に指定してやるか…ですがこれも今度は他の部分が破たんしそう。まあ、これくらいなら許容範囲かな、ということで今回は妥協することにしました。
Fragmentのオプションメニューがタップされて画面遷移することをテストする

# やりたいこと
BottomNavigationViewを使っていて`Toolbar`自体はActivityのレイアウトにあります。
しかしオプションメニューはタブのFragment毎に異なるので、Fragmentの単体テストに含めたい。
ですが`launchFragmentInContainer`で起動したFragmentで`withId(R.id.hoge_menu)`でアクセスすると、ビューが見つからないと言われる。
まぁそうか。

# 解決方法
少し発想を変えて、メニューのタップでなく、`onOptionsItemSelected` の呼び出しをテストすることにした。
テストコードはこんな感じ。

```kotlin
val navController = mock(NavController::class.java)
val scenario = launchFragmentInContainer<TopFragment>(Bundle(), R.style.AppTheme)
scenario.onFragment {
    Navigation.setViewNavController(it.view!!, navController)
    it.onOptionsItemSelected(RoboMenuItem(R.id.hoge_menu))
    verify(navController).navigate(TopFragmentDirections.actionTopFragmentToSubFragment())
}
```

`RoboMenuItem(R.id.hoge_menu)` といのがRobolectricが用意しているMenuItem用のクラスを使用する。
これで無事に TopFragmentからオプションメニューをタップするとSubFragmentに移動することをテストすることができました。
WordPressのrewrite ruleいじるときのhook

initだったりadmin_initだったりするけど、私はroot_rewrite_rules派です。

```php5

add_filter( 'root_rewrite_rules', function($rules){
	// ここでrurle設定する
　　　　 add_rewrite_rule("/hogehoge" , 'index.php?post_type=hogehoge' , 'top');
	return $rules;
}, 9999);
```

initは毎回走るのも重いし、admin_initは管理画面いじる人が複数いるとなぜか安定しなかった
いろんなタイミングでruleいじってたかもしれぬが
最近はこれ派です
webarenaでubuntu その14

#概要

webarenaでubuntu18.04やってみた。
cronやってみた。

#設定ファイルを生成。

```
sudo nano /etc/cron.d/webalizer
```
```
50 06  * * *   root webalizer
```

#パーミッション設定。

```
sudo chmod 644 webalizer
```

以上。
「1時間で出来る！最強のWordPress環境構築」でWeb超初心者がはまってしまったこと

会社でWordPressサイトの導入をすることになったので、個人的な勉強&メモ書きの為にWordPressでサイトを作成しました。

[作成したページ](https://additskill.tk/)


　
なお、Qiitaの月間トレンド1位に来ていた下記の記事を参考に作成しましたが、Webサイト作成初心者から見ると引っかかるところがあったので補足しておきます。

[1時間で出来る！最強のWordPress環境構築(永久無料)](https://qiita.com/ryuta69/items/dbb0db5cf7099b7a7cc4)


※著者は**WordPress及びWebサイト構築超初心者**&HTMLは何となく読めるかなくらいのレベルです。
　一般的なWebエンジニアの方にとっては当然のことを書いていると思いますのでご容赦ください。
　また、間違いがあればぜひご指摘ください！



##1.Cloud Flareで「Add a website」ができない!

[[1/5] クラウドサーバーはGoogle Cloud Platformを選択する](https://qiita.com/ryuta69/items/dbb0db5cf7099b7a7cc4#15-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AFgoogle-cloud-platform%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%99%E3%82%8B) と [[2/5]CDN連携 & DNS設定](https://qiita.com/ryuta69/items/dbb0db5cf7099b7a7cc4#25cdn%E9%80%A3%E6%90%BA--dns%E8%A8%AD%E5%AE%9A)の間に「ドメイン取得・DNS設定」が省略されています。**<font color="Red">下記を実施しないとCloud Flareで「Add a website」ができないため注意です。</font>**

※既存の名前解決(DNS)の経路をCDNサービス経由に変更することによって、Webサイトを高速化するのが上記2/5章の目的かと思われます。なので、そもそも既に名前解決できる状態でなければ設定のしようがありません。
ちなみに、**IPを含むアドレスをAdd a websiteの時に指定しても通りませんし意味が無いです**。
　

####1.1 ドメインの取得  
無料で良いのでレジストラ(ドメイン名取得業者)からドメインを取得

[参考：無料で独自ドメインを取得できる！無料ドメインの取得サービス6選](https://ferret-plus.com/8797)


####1.2 GCPでのゾーン、DNS設定
[参考：Google Cloud Platform (GCP) で独自ドメインを設定する](https://qiita.com/tomy0610/items/adc839be9d100c0daf96)
　
##2.WP Mail SMTPでSendGridのAPI Keyを入れているはずなのにうまくいかない!
[[5/5]必須プラグインのインストール](https://qiita.com/ryuta69/items/dbb0db5cf7099b7a7cc4#55%E5%BF%85%E9%A0%88%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)にてWP Mail SMTPを使うためにSedGridでAPI Keyを作成する際、
WP Mail SMTPの設定画面でAPI Keyを入力しますが、これはSedGridで**APIKeyを作成した後に表示されるAPI Key IDのことではありません。**
ここに入れるのは<font color="REd">**SendGridでAPI Keyを作成した直後に一度だけ表示される「SG.・・・」という文字列のことです。**</font>
※この文字列がAPI Key本体です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211328/19cd3bdf-dd56-94c0-20f5-b3650fcd1d9a.png)

もし、上記画面で文字列をコピーし忘れていたら、SedGridのSettings→API Keysで新規にAPI Keyを作成してください。

[参考：SendGrid API Key not working. “The provided authorization grant is invalid, expired or revoked”
](https://stackoverflow.com/questions/34789622/sendgrid-api-key-not-working-the-provided-authorization-grant-is-invalid-expi)

　  
以上です。

一般的なWebサイト運営者&開発者の方にとっては常識かもしれませんが、上記のサイトだけを見て作ろうとする初心者(自分も含め)が引っかかりやすいポイントだと思ったので補足でした。
aws Lambdaのカスタムランタイムを利用してaws-cliを実行する

awsのリソースを自動展開するシステムを開発しています。リソース内部の設定が複雑でありPython SDKで実装するとコマンドの検証に不便が出てきそうな雰囲気だったためaws-cliをLambdaで実行しようと考えました。

[AWSのチュートリアル](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-walkthrough.html)を見ればファイルの構3成は把握できると思います。bootstrapがイベントを`while true`で待ち受け、検知するとそれをパースしてイベントハンドラ(ここでは`function.sh`の関数)に投げます。その出力を以ってレスポンスとして返します。

# コード
チュートリアルのコードに一部インストール用の設定を加えています。インストールを含むためテスト実行時にTimeoutエラーが出るかもしれませんが焦らずにタイムアウト時間を伸ばしましよう。

```shell:bootstrap
#!/bin/sh
set -euo pipefail

# tmpフォルダ内にawscliを配置するためHOMEとPATHを設定
export HOME="/tmp"
export PATH="$HOME/.local/bin:$PATH"
 
# pipをインストール
cd /tmp
curl -sSL https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py --user
# pipを用いてawscliをインストール
pip install awscli --user

# Handler format: <script_name>.<function_name>
#
# The script file <script_name>.sh  must be located at the root of your
# function's deployment package, alongside this bootstrap executable.
source $(dirname "$0")/"$(echo $_HANDLER | cut -d. -f1).sh"

while true
do
    # Request the next event from the Lambda runtime
    HEADERS="$(mktemp)"
    EVENT_DATA=$(curl -v -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
    INVOCATION_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)

    # Execute the handler function from the script
    RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA")

    # Send the response to Lambda runtime
    curl -v -sS -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$INVOCATION_ID/response" -d "$RESPONSE"
done

```

handlerでaws-cliの動作を確認する。標準エラー出力へaws-cliのバージョンが出力されるか確認します。

```shell:function.sh
function handler () {
  EVENT_DATA=$1
# このhandlerの標準出力(1)がそのままbootstrapでRESPONSEになる
# よってデバッグ用echoは標準エラー出力へ逃がす必要がある
  echo "$EVENT_DATA" 1>&2;
  echo $(aws --version 1>&2);
  RESPONSE="Echoing request: '$EVENT_DATA'"

  echo $RESPONSE
}
```

無事に出力されれば動作しています。今回のコードではtestにデフォルトのものをそのまま利用しているため`$EVENT_DATA`はデフォルトのものです。

```:output
{"key1":"value1","key2":"value2","key3":"value3"}
aws-cli/1.16.219 Python/2.7.16 Linux/4.14.123-95.109.amzn2.x86_64 botocore/1.12.209
```

# to do
- aws-cliを利用した自動展開の検証
- リソース立ち上げ時間とタイムアウトの格闘
Database Cleanerの使い方

##Database Cleanerとは
Database CleanerとはRubyのデータを削除するためのgemで提供されているパッケージ
今回はRspecテスト実行時に作成したテストデータをテスト終了後にデータベースから削除するために利用

##setup方法
Gemfileに追記する　
（テスト環境でのみ利用できればよかったため以下のような記載に）

```Gemfile
group :test do
  gem 'database_cleaner'
end
```
そしてターミナルで以下を実行

```
$ bundle install
```


## RSpecの場合のサンプルコード

```ruby:spec_helper.rbに設定をまとめる場合

RSpec.configure do |config|

## 元々のコードは中略 ##

  # テスト全体の前に実行する処理をブロックで記述
  config.before(:suite) do
    # データベースをCleanする方法を'transaction'に指定
    DatabaseCleaner.strategy = :transaction
    # このタイミングで'transaction'でデータベースをCleanしておく
    DatabaseCleaner.clean_with(:truncation)
  end

  # 各exampleの前および後に実行する処理をブロックで記述
  config.around(:each) do |example|
    DatabaseCleaner.cleaning do
      # ここに処理を記述する
      # ここがexampleの実行タイミング
      example.run
      # ここに処理を記述する ##
    end
  end

end
```

```ruby:任意のファイルで設定する場合(transaction)
require 'database_cleaner/active_record'
# strategyを指定
DatabaseCleaner.strategy = :transaction
# databaseを戻したい地点で以下を記述
DatabaseCleaner.start

## ここでdatabaseが汚れる処理を実行

# databaseをcleanしたい地点で以下を記述
DatabaseCleaner.clean
```

```ruby:任意のファイルで設定する場合(truncationやDeletion)
require 'database_cleaner/active_record'
# strategyを指定
DatabaseCleaner.strategy = :truncation #または :Deletion

# databaseをcleanしたい地点で以下を記述
DatabaseCleaner.clean
```
##実行順序
```
↑早い
before(:suite)
before(:all)
before(:each)
after(:each)
after(:all)
after(:suite)
↓遅い
```
##実行タイミング
```
:suite
　=>rspecコマンド実行時にテスト全体の前または後に呼び出される
:all
　=> 各contextの前または後に呼び出される
:each
　=>各exampleの前または後に呼び出される
```

##Strategies
データベースをCleanする方法のことをStrategieと呼び、以下の３種類が準備されている

### Transaction
一連の処理をTransactionという単位で囲み、その始点の状態にデータを戻すことで、データベースをCleanする。
### Truncation
指定したテーブルに格納されているデータをすべて削除する"TRANCATE TABLE 文"を使用して、データベースをCleanする。テーブルをいったん削除して改めてテーブルを作成する
### Deletion
テーブルはそのままにレコードデータを削除する"DELETE 文"を使用して、データベースをCleanする。

##データ削除対象テーブルの指定
:truncationのstrategyを使用するときは、
以下のように実行対象（または実行除外対象）のテーブルを指定できる

```
DatabaseCleaner.strategy = :truncation, {:only => %w[widgets dogs some_other_table]}
```

```
DatabaseCleaner.strategy = :truncation, {:except => %w[widgets]}
```

##補足情報
rails_helper.rbファイルに以下のコードが書かれている場合、rspecのテスト時は
before(:each)でtransactionを張ってafter(:each)でrollbackする処理を実行してくれている。

```rails_helper.rb
RSpec.configure do |config|
  config.use_transactional_fixtures = true
end
```

##参考文献
https://github.com/DatabaseCleaner/database_cleaner
https://qiita.com/shoichiimamura/items/25942acc1d1bd78ef9c3
【Python】 ディクショナリ(辞書型)について学んだことを備忘録として

# この記事について
python初心者である私が学習したものをまとめたものです．
ディクショナリ(辞書型)について超基本的なことを書きました．

# ディクショナリの特徴

* キーと値をペアにして複数の要素を管理するためのデータ型

* リストは順番という概念があるが，ディクショナリにはない．

* キーや文，メソッドを使用して，ディクショナリ内の要素を操作できる

* 要素ごとに情報の性質や種類が異なっているデータは，**順番**で管理するより**見出し**で管理するほうが便利である場合がある．

# ディクショナリの定義と追加

```Python
#ディクショナリの定義
mazda2 = {"価格":1620000,
         "車両重量":"1030Kg",
         "エンジン区分":"ガソリン"} 
#キーと要素を追加
mazda2["排気量"] = "1496CC" 
mazda2

````

# キーを指定した削除
```Python
del mazda2["排気量"]
```

# キーの存在確認
in演算子を使った自作関数によりキーの検索が可能
【キーの検索】
ディクショナリにキーを与えて値を参照する．
ここで，自作関数の処理としては，キーが存在しない場合，エラーになり，処理が中止しまう為，もし存在した場合にのみ値を取り出す処理が必要

```python
def convert_number(num):
    #アラビア数字と漢数字の対応表をディクショナリに定義
    kanji_nums = {1:"一",2:"二",3:"三",4:"四",5:"五",
                  6:"六",7:"七",8:"八",9:"九",10:"十"}
    #ディクショナリのキーとして引数の整数が存在していたら，キーに対応する値を戻り値として返す
    if num in kanji_nums:
        return kanji_nums[num]
    else :
        return "変換できません"
```

# ディクショナリのメソッドを活用する
* d.keys(): キーの一覧を返す
* d.get(キー［,値］): 値を取得する（キーが存在しない場合、この値を返す）
* d.setdefault(キー［,値］):値を取得or追加する（キーが存在しない場合、第一引数をキーとして、第二引数の値を要素dに挿入する）
* items()：キーと値を取得する（キーと値をペアにしたタプルをリストにして返す）
* values():値の一覧を返す
* update(［ディクショナリなど］)：要素を追加する（引数には、ディクショナリ、「キーと値のシーケンスを並べたシーケンス」、「key=valueのようなキーワード」のいずれかを指定できる）

```python

numbers = {"one":1,"two":2,"three":3}
numbers.keys()                          # dict_keys(['one', 'two', 'three'])
print(numbers.get("one"))               # 1
print(numbers.get("four"))              # None
print(numbers.get("five",0))            # 0
print(numbers)                          # {'one': 1, 'two': 2, 'three': 3}
print(numbers.setdefault("one",0))      # 1
print(numbers.setdefault("four",4))     # 4
print(numbers)                          # {'one': 1, 'two': 2, 'three': 3, 'four': 4}                  
print(numbers.items())                  # dict_items([('one', 1), ('two', 2), ('three', 3), ('four', 4)])
numbers.values()                        # dict_values([1, 2, 3, 4])            
print(numbers.update({"five":5}))       # {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5}

```
【Python】 set型について学んだことを備忘録として

# この記事について
python初心者である私が学習したものをまとめたものです．
set型について超基本的なことを書きました．

# Setとは
setとは，シーケンスと似たデータ型．シーケンスとはざっくり言うと，複数の要素を持つデータの種類のことを指す．

setを使うことにより，リストのように複数の要素を保存できる，
リストは要素の重複が可能であったに対し，setは要素の重複はできない．

**⇒setにある存在する値を登録しようとしても，新しい要素が追加されない．**

# 特徴
* 集合型と呼ばれている．

* 順番の概念がなく，インデックスで要素をアクセスすることができない．

* メソッドを使って，中の要素を操作できる．

* 要素の変更，追加，削除ができる．(setとほぼ同じ機能を持ち，変更ができないfrozenset型というデータ型がある)

* オブジェクト自体の書き換えを行えることがある(変更可能な［mutable］オブジェクト

# 定義方法
setの定義には，波括弧｛｝を使う．要素はカンマで区切る．

```python
dice = {1,2,3,4,5,6}
coin = {"表","裏"}
card = {1,2,3,4,5,6,7,8,9,10,11,12,13}
```

#setの和集合を取得する

setの和集合は，**｜演算子**を使う．
**OR演算子(論理和)**に近い操作になる

```python
dice_nums = {1,2,3,4,5,6}
card_nums = {1,2,3,4,5,6,7,8,9,10,11,12,13}

union_dice_card = dice | card
union_dice_card
```

#setの差集合
setの差集合を得るには，**－演算子**を使う

```python
dice_nums = {1,2,3,4,5,6}
card_nums = {1,2,3,4,5,6,7,8,9,10,11,12,13}

diff_dice_card = dice_nums - card_nums
diff_dice_card
```

# setの共通集合
setの共通集合は**＆演算子**を使う．論理積(AND)と同じ演算子を使う．

```python
dice_nums = {1,2,3,4,5,6}
card_nums = {1,2,3,4,5,6,7,8,9,10,11,12,13}

diceNums_and_cardNums = dice_nums & card_nums
diceNums_and_cardNums
```

# setの対象差を取得する
対象差とは，排他的論理和のような操作であり，**＾演算子**を使う．
両方のsetに共通して含まれている要素だけを取り除いた，要素の集合を得る．

```python
dice_nums = {1,2,3,4,5,6}
card_nums = {1,2,3,4,5,6,7,8,9,10,11,12,13}

diceNums_xor_cardNums = dice_nums ^ card_nums
diceNums_xor_cardNums
```

# set型メソッドの活用
* s1.union(s2):和集合を返す
* s1.intersection(s2):交わりを返す
* s1.difference(s2):差集合を返す
* s1.symmetric_difference(s2):対象差を返す
* s1.add(追加する要素):要素を追加する
* s1.remove(削除する要素):要素を削除する



```python

s = {1,2,3,4,5,6,7,8,9,10}
even = {2,4,6,8,10,12,14,16,18,20}
s.union(even)                #{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20}
s.intersection(even)         #{2, 4, 6, 8, 10}
s.difference(even)           #{1, 3, 5, 7, 9}
s.symmetric_difference(even) # {1, 3, 5, 7, 9, 12, 14, 16, 18, 20}
s.add(11)                    #{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
s.remove(1)                  #{2, 3, 4, 5, 6, 7, 8, 9, 10}

```