OmniAICreator/Qiita-1.07M huggingface dataset:
[VBS][7zip]コマンドラインからドライブごと圧縮したしたZipファイルを解凍するとき特定のフォルダ、拡張子を除外する

# 前回の逆
[[VBS][7zip]コマンドラインからドライブを圧縮するとき特定のフォルダを圧縮から除外する](https://qiita.com/Q11Q/items/aadd2c26606072ab37c1)
の逆パターンとして圧縮してあるファイルから特定のフォルダを除外するということをやります。
ドライブごと圧縮したzipファイルを同じドライブに解凍すると、ごみ箱が壊れていますというエラーが出るケースがあります。
どうもドライブごとZipファイルにする場合、System Volume Information と $Recycle.Bin 以下の隠しフォルダが競合することが原因のようです。
そこで前回はそれを取り除いて解凍する方法が分かったのでご紹介しました。
しかし、以前に大量にzipでバックアップしていた場合、取り除くのも大変です。
そこで、フィルタを設定して解凍することを考えました。前回の逆のパターンですが、こちらもやろうとするとあまり書いてないので記録します。よかったら参考にしてください。

#設定
ドキュメントフォルダにあるE.zip
をeドライブに解凍する(Eドライブには上記の２つの隠しフォルダ以外は存在しないものとします。)
ただしエラーを起こさせる上記のフォルダ
System volume information
Recycle.bin
を除外する。
さらに
Jpg,jpegファイルを除外する
7zip.exeはc:\program files\7-zip\7z.exeにある
とりあえずパスワードはなしとする

```vb:extactexclude.vbs
Const pPass = ""
Dim fs, ofol, ofile, oSubFol, WSH, objDocFol, oShell, strScr, tgFolder
Set WSH = CreateObject("WScript.Shell")
Set oShell = CreateObject("Shell.Application")
Set objDocFol = fs.GetFolder("C:\users\name\Documents") 'Change Your Conputer Username
Set tgFolder = fs.GetFolder("E:\")
Set ofile = fs.GetFile(objDocFol.Path & "\E.zip")

strScr = """" & WSH.ExpandEnvironmentStrings("%PROGRAMW6432%") & "\7-zip\7z.exe""" & " x -bt -y """ & ofile.Path & """" & " -o""" & "E:\""" & " -p" & pPass & " -xr!""*\$RECYCLE.BIN\"" -xr!""*\System Volume Information\"" -xr!""*\*.jp*g"""
WSH.Exec strScr

Set WSH = Nothing
Set oShell = Nothing
Set fs = Nothing
Wscript.Quit
```

#ポイント

1. 圧縮するときと同じく -xr! を使用する
2. -xr!は複数使ってもよく、フォルダとファイルを同時に除外してもよい。
3. jpeg,jpgがあるのでjp*gとする
4. ***!を使用する場合二重引用符で囲む方がエラーが出ないらしい。***
5. これを正規表現と記載しているサイトがあるが、7zipの解説はワイルドカードとなっている。
6. 4.は具体的には以下のように記述する。解凍するzipファイル内のフォルダのすべてのjpgまたはjpegファイルを解凍から除外するには、

```vb
-xr!"*\*.jp*g"
```
 のようにする。

なお、jpgファイルは解凍する場合には strScrを次のように書く。

```vb
strScr = """" & WSH.ExpandEnvironmentStrings("%PROGRAMW6432%") & "\7-zip\7z.exe""" & " x -bt -y """ & ofile.Path & """" & " -o""" & "E:\""" & " -p" & pPass & " -xr!""*\$RECYCLE.BIN\"" -xr!""*\System Volume Information\"""
```
つまり-xr!のあとはダブルクオーテーションが2つきて、除外ファイル、フォルダ名を書いたらダブルクォーテーション３つにするとよい。これは未実験だがマニュアルではハイフンを2つ並べるとStop Persingとなっているので

```vb
strScr = """" & WSH.ExpandEnvironmentStrings("%PROGRAMW6432%") & "\7-zip\7z.exe""" & " x -bt -y """ & ofile.Path & """" & " -o""" & "E:\""" & " -p" & pPass & " -xr!""*\$RECYCLE.BIN\"" -xr!""*\System Volume Information\"" --xr!""*\*.jp*g"""
```
--xr!のようにハイフンを２つ続けるとそれ以降のオプションの記述は無効化されるはずだが、解凍のVBScriptは危険なので実験ができないので、別の機会に確かめたい。
Ruby　hello,bye が表示されない

class TestListController < ApplicationController

def hell 
	render :plain =>'Hello!'

end

def bye
	render :ploin =>'bye'
	
end


_________________________________________________________________Test_App.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

get 'hello' => 'test_list#hello'

get 'bye' => 'test_list#bye'
Let’s NoteをUbuntu 16.04 ServerでWi-Fiアクセスポイントにしてサービス化

# 概要

* Ubuntu 16.04 ServerをインストールしたLet's Note CF-NX2
* create_apを使ってWi-Fi AP化
* サービスとして設定

サービスとして設定する部分以外は[コマンド一発でLinuxマシンを即席無線LANルーターにできる「create_ap」がすごい便利だった](https://qiita.com/KuwabataK/items/5903c7584657151d576a)と同じです。

# 設定

## hostapdインストール

~~~
sudo apt-get install hostapd
~~~

## create_apインストール

~~~
git clone https://github.com/oblique/create_ap
cd create_ap
sudo make install
~~~

## サービスとして設定

まずは`ip a`で有線LANと無線LANのデバイスを確認。Let's Note CF-NX2では下記のデバイス名だった。

* LAN: enp0s25
* WLAN: wlp2s0

create_apのドキュメント(README.md)に記述がないけれど、サービス化した時の設定ファイルは`/etc/create_ap.conf`なので、これを編集する(systemdでサービス化できるよ、って書いてあるのになぜか設定ファイルの在り処だけ綺麗に抜けているんだけど、当然わかるでしょ、ってことなのかな)。

~~~
sudo nano /etc/create_ap.conf
~~~

下記の部分を自分の環境に合わせて変更して保存。
DHCPの範囲もこの設定ファイルの該当箇所を変更すればOK。

~~~
WIFI_IFACE=wlp2s0
INTERNET_IFACE=enp0s25
SSID=TESTAP001
PASSPHRASE=PASSWORD123
~~~

`systemctl`で起動。

~~~
sudo systemctl enable create_ap
sudo systemctl start create_ap
~~~

上手く言っていれば、`ap0`が作成される。
下記のログでは接続してきたiPhoneにDHCPで10.0.0.134が正常に配られたことも確認できる。

~~~
sudo systemctl status create_ap

● create_ap.service - Create AP Service
   Loaded: loaded (/usr/lib/systemd/system/create_ap.service; enabled; vendor preset: enabled)
   Active: active (running) since 金 2017-11-10 16:09:04 JST; 8min ago
 Main PID: 3501 (create_ap)
   CGroup: /system.slice/create_ap.service
           ├─3501 /bin/bash /usr/bin/create_ap --config /etc/create_ap.conf
           ├─3670 dnsmasq -C /tmp/create_ap.wlp2s0.conf.EZ2M7zua/dnsmasq.conf -x /tmp/create_a
           ├─3672 /bin/bash /usr/bin/create_ap --config /etc/create_ap.conf
           ├─3673 /usr/sbin/hostapd /tmp/create_ap.wlp2s0.conf.EZ2M7zua/hostapd.conf
           └─7556 sleep 2

11月 10 16:10:46 hoge create_ap[3501]: ap0: STA 3c:ab:8e:c3:78:73 RADIUS: starting accoun
11月 10 16:10:46 hoge hostapd[3673]: ap0: STA 3c:ab:8e:c3:78:73 RADIUS: starting accounti
11月 10 16:10:46 hoge create_ap[3501]: ap0: STA 3c:ab:8e:c3:78:73 WPA: pairwise key hands
11月 10 16:10:46 hoge hostapd[3673]: ap0: STA 3c:ab:8e:c3:78:73 WPA: pairwise key handsha
11月 10 16:10:49 hoge dnsmasq-dhcp[3670]: DHCPDISCOVER(ap0) 3c:ab:8e:c3:78:73
11月 10 16:10:49 hoge dnsmasq-dhcp[3670]: DHCPOFFER(ap0) 10.0.0.134 3c:ab:8e:c3:78:73
11月 10 16:10:49 hoge dnsmasq-dhcp[3670]: DHCPDISCOVER(ap0) 3c:ab:8e:c3:78:73
11月 10 16:10:49 hoge dnsmasq-dhcp[3670]: DHCPOFFER(ap0) 10.0.0.134 3c:ab:8e:c3:78:73
11月 10 16:10:51 hoge dnsmasq-dhcp[3670]: DHCPREQUEST(ap0) 10.0.0.134  3c:ab:8e:c3:78:73
11月 10 16:10:51 hoge dnsmasq-dhcp[3670]: DHCPACK(ap0) 10.0.0.134 3c:ab:8e:c3:78:73 Integ
~~~
XAMPP WindowsのPerlのPPMが動かないのを解決する

# 2023年10月追記
XAMPのPerlには今でもppm.batが同梱されていますが、以下のようにもうPPMのモジュールはビルドされていないためPMMからモジュールをインストールすることはできません。

> https://www.activestate.com/products/perl/ppm-perl-modules/
> UPDATE 2021: PPM has been removed from ActivePerl 5.28, and will no longer build many packages for previous versions of ActivePerl.

# はじめに

WindowsのPerlにはPPMというパッケージマネージャがあります。cpanだとバイナリモジュールはローカルでビルドされてインストールされるのでビルド環境が必要になりますが、PPMではバイナリパッケージとしてインストールできるのでビルド環境を用意する必要がないため便利です。

# 問題

そのPPMですが、XAMPP WindowsのPPMを実行するとエラーになって動きません。

XAMPPのPPMは C:\xampp\perl\bin\ppm.bat にあるのでこれを実行します。
すると以下のダイアログが表示されます。

![コンピューターに libexpat-1_.dll がないため、プログラムを開始できません。この問題を解決するには、プログラムを再インストールしてみてください。](https://qiita-image-store.s3.amazonaws.com/0/42710/75c0c04b-765e-f595-ad36-7197f32ca1f8.png)

そしてOKボタンをクリックするとコンソールに以下のメッセージが表示され終了してしまいます。

```shell-session
Can't load 'C:/xampp/perl/vendor/lib/auto/XML/Parser/Expat/Expat.dll' for module XML::Parser::Expat: load_file:指定されたモジュールが見つかりません。
 at C:/xampp/perl/lib/DynaLoader.pm line 190.
 at C:/xampp/perl/vendor/lib/XML/Parser.pm line 18.
Compilation failed in require at C:/xampp/perl/vendor/lib/XML/Parser.pm line 18.

BEGIN failed--compilation aborted at C:/xampp/perl/vendor/lib/XML/Parser.pm line 22.
Compilation failed in require at C:/xampp/perl/vendor/lib/PPM.pm line 28.
BEGIN failed--compilation aborted at C:/xampp/perl/vendor/lib/PPM.pm line 28.
Compilation failed in require at ppm.bat line 35.
BEGIN failed--compilation aborted at ppm.bat line 35.
```

これはXML::Parser::ExpatモジュールのDLLがExpat本体のDLLを読み込もうとして失敗しているためです。
なぜ失敗するかというと、単純にXAMPPに libexpat-1_.dll が入っていないからなのです。

XAMPPでインストールされるPerlは「[Strawberry Perl](http://strawberryperl.com/)」というもので、これのZIP editionのフォルダ構造は以下のようになっています。

![](https://qiita-image-store.s3.amazonaws.com/0/42710/d104f310-e33f-f244-b133-4cab3e53a726.png)![](https://qiita-image-store.s3.amazonaws.com/0/42710/4d37574a-3241-ed42-643c-2deed74fdbe0.png)

先ほど読み込めなかったDLLはcフォルダの中のbinフォルダにあります。が、ZAMPPにはperlフォルダしか含まれていません。つまり、外部のライブラリのDLLを必要とするPerlモジュールは不完全にインストールされている状態になっているわけです。これはひどい。

# 解決方法

この問題をググると「libexpat-1_.dll」で検索して出てきたDLLダウンロードサイトからDLLを入手してExpat.dllと同じフォルダに置くという方法が見つかります。謎のDLLダウンロードサイトの信頼性はともかくとして、他のモジュールも同じように不完全な状態になっているため、状況によっては次から次へDLLの読み込みエラーが発生してもう対応を諦めたくなったりするので、この方法はお勧めできません。

ということで、完全に解決する方法が以下になります。

## cフォルダを入手する

まずはお目当てのDLLが入っているcフォルダを入手します。
以下のページからXAMPPでインストールされたPerlと同じバージョンのZIP editionを入手します。

http://strawberryperl.com/releases.html

入手したZIPアーカイブを展開し、cフォルダを C:\xampp\perl\ にコピーします。

## cフォルダにパスを通す

DLLが読み込まれるようにパスを通します。
環境変数 PATH に C:\xampp\perl\c\bin を追加します。
環境変数を変更した後は念のため再起動した方が良いかもしれません。
以上で動作するようになります。

ちなみにDLLの検索パスは以下のようになっているので C:\xampp\perl\bin に必要なDLLだけコピーして置けば動くようになるような気がするのですが、なぜかApacheからの実行の際にはDLLが読み込めなくてエラーになります。他にもカレントディレクトリが C:\xampp\perl\bin 以外の場所のときに PPM.bat を実行すると駄目というのがあります。Perl本体を実行した時はどこでも動作するのですが……

> [Windows が使用する DLL 検索パス](https://msdn.microsoft.com/ja-jp/library/7d83bc18.aspx)
> 
> 1. 実行中のプロセスの実行形式モジュールがあるフォルダー。
> 2. 現在のフォルダー。
> 3. Windows システム フォルダー。 このフォルダーへのパスは、GetSystemDirectory 関数が取得します。
> 4. Windows ディレクトリ。 このフォルダーへのパスは、GetWindowsDirectory 関数が取得します。
> 5. 環境変数 PATH 内に記述されたフォルダー。
PHP on Azure App Serviceで、PATCH、PUT、DELETEができないときにやること（2017版）


## 何が問題か
`PHP on Azure App Service`な環境で、PATCH、PUT、DELETEなリクエストがエラーになります。

```
The page you are looking for cannot be displayed because an invalid method (HTTP verb) is being used
```

対処法が下記のブログに書いてはあるのですが、そのままでは動かなかったので、2017年版として更新しておきます。

- [PHP on Azure WebsitesでPUT、DELETEができないときにやること | Qaramell Blog](http://blog.qaramell.com/iwate/16191)

## どうするか
`web.config`の`system.webServer`に<handlers>を下記のように追加します。
`v7.1`の部分は使用しているPHPのバージョンによって読み替えてください。

```xml
<!-- web.config -->
<configuration>
  <system.webServer>
    <!-- 中略 -->
    <handlers>
        <remove name="PHP71_via_FastCGI" />
        <add name="PHP71_via_FastCGI" modules="FastCgiModule" verb="GET, PATCH, PUT, POST, DELETE, HEAD, OPTIONS" path="*.php" scriptProcessor="D:\Program Files\PHP\v7.1\php-cgi.exe" resourceType="Either" requireAccess="Script" />
    </handlers>
  </system.webServer>
</configuration>    
```

前述のブログにて紹介されている対処法と違うところを列挙します。

- `scriptprocessor`、`resourcetype`、`requireaccess`だとエラーになる
  - `Unrecognized attribute 'scriptprocessor'`となる
  - `scriptProcessor`、`resourceType`、`requireAccess`が正解
- 64ビット版の場合は、`D:\Program Files\`
  - 32ビット版は、`D:\Program Files (x86)\`
- `verb`に何故か`PATCH`がない
  - `PATCH`を追加
  - `TRACE, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK`は不要なので削除

## どうなるか
これで、`PATCH, PUT, DELETE`なリクエストに対して、`200 OK`が返ってくるはずです。

```bash
$ curl -i -X PATCH \
  http://{appName}.azurewebsites.net/{path to API} \
  -H 'content-type: application/json' \
  -H 'x-requested-with: XMLHttpRequest' \
  -d '{
    "foo": "bar"
}'
```

```
HTTP/1.1 200 OK
Cache-Control: no-cache, private
Content-Length: 13
Content-Type: application/json
Server: Microsoft-IIS/8.0
X-Powered-By: PHP/7.1.8
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
X-Powered-By: ASP.NET
...

{"bar":"baz"}
```

つうか、デフォルトで`PATCH, PUT, DELETE`は許可してほしいですね。`IIS`。。
ではでは。
PHPでQiita APIv2のラッパを作ってみた

# 概要
Qiita APIv2のPHPラッパ。本当に元のAPIをラッピングしているだけ。
https://github.com/kuredev/qiita-php-wrapper

# リファレンス
src/api.json に使える関数の一覧とQiita APIv2とのマッピングの情報がある
https://github.com/kuredev/qiita-php-wrapper/blob/master/src/api.json

# 動機
- PHPの勉強
- packagistに登録してみたかった

# 実装

以下のライブラリを使わせてもらった。
APIのラッピングの部分を、コードの外のファイルで管理できる。
あまり他に使われた実績が見当たらないけど、便利な気がする。
通信の部分はGuzzleが内部的に使われてる。

palanik/wrapi-php: Wrapper for calling Restful API https://github.com/palanik/wrapi-php

# 使い方
## インストール

```
$ composer require kuredev/qiita-php-wrapper
```

## 使い方サンプル
```
<?php
require 'vendor/autoload.php';
$accessToken = "xxxxxxxxxxxxxx";

try{
    $qiita = new \Kuredev\Qiita($accessToken);

    //sample code
    var_dump($qiita->get->users());
    $arr = array();
    var_dump($qiita->put->userFollowing("kure", json_encode($arr)));
    var_dump($qiita->get->tagsItem("api"));
    $comment = array("body" => "testtest2");
    var_dump($qiita->post->comment("xxxxx", json_encode($comment)));
}catch(Exception $e){
    var_dump($e->getMessage());
}
```
シェルで大きさを指定してランダムな文字列を生成する


```shell-session
$ dd if=/dev/urandom of=/dev/stdout bs=1k count=600 2>/dev/null | base64 | tr -d '\n'
```

- 単にランダムなデータのストリームは`/dev/random`からddすれば取得できる
- ASCII文字に変換するためにbase64エンコードすることにした
- base64エンコードで133%の大きさになるので、目標サイズの100/133の大きさのデータが出てくるようにddの`bs`と`count`を設定する
- 以下の例だと目標サイズは800kbyte(819200byte)なので、ddで書き出すサイズは600kbyte
- `tr -d '\n'`でbase64の改行を削除する
- `base64`はPOSIXコマンドではないが、オプションなしだとGNUとBSDの違いは気にならないので使うことにした

## `wc`で生成された文字列のサイズを確認してみる

```shell-session
$ dd if=/dev/urandom of=/dev/stdout bs=1k count=600 2>/dev/null | base64 | tr -d '\n' | wc -c
819200
```
OneLoginとNode.jsでSAML 2.0で認証されたWebサイトをつくる

## TL;DR;

Node.js製のsaml2-proxyというリバースプロキシを使います。
saml2-proxyは、SAML 2.0に対応したIdPに認証を委譲して、認証済みのクライアントにだけバックエンドサーバが提供するコンテンツをプロキシするという機能を持っています。
一方のOneLoginはSAML 2.0に対応しているので、

- OneLoginを適切に設定して、
- saml2-proxyにOneLoginのエンドポイントURLとコンテンツを持つバックエンドサーバのホスト名、パスを設定を与える

ことで、目的が達成できます。

## 手順

[GitHubに書いたので、そちらをご覧ください。](https://github.com/mumoshu/saml2-proxy#minimal-configuration-for-onelogin-saml-test-connector-sp)

## 合わせて読みたい

[SSO を実現するための SAML2.0 の実装。まずはサンプルを動かす - Qiita](https://qiita.com/katsuhiko/items/1960f96661cdf6daf63b)
Hello SMT-Solver by z3

#導入

[z3](https://github.com/Z3Prover/z3)とは、Microsoft Researchが開発を進めているSMTソルバです。
SMTソルバは、条件式(ex. if(a > 1 && b > 2) ) を受け取り、条件式がTRUEになる入力が存在するか否か、もし存在するならばその入力の一例(ex. a=2, b=3)を提示します。

z3はCUI, C, C++, Java, Ocaml, .NET, Pythonから呼び出して使用できます(z3自体はC++で記述されています)。

今回、macのIntelliJ IDEAにてJavaを用いてz3を使ってみたので、その際の流れを個人的なメモの意味も込めて書き残します。基本的には、READ.mdを参照して行いました。



#環境
- macOS Sierra 10.12.6
- IntelliJ IDEA 2017.2



#流れ
<img width="187" alt="スクリーンショット 2017-11-10 19.43.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/59382/dfe7188b-026d-0d9a-f2d5-8782988b51b8.png">

1. [z3](https://github.com/Z3Prover/z3) をダウンロード。ダウンロードしたフォルダ中のbin中に入っている上記の3つを使用します。

2. IntelliJのライブラリに`com.microsoft.z3.jar`ファイルを登録する。右上のProject Structure->Librariesから登録できるかと思います。

3. `libz3.dylib`と`libz3java.dylib`を`/usr/local/lib`に配置します。ちなみに、私はここでつまづきました。Javaにライブラリが見つからないと怒られたので、調べながらRun->Edit configuresのVM Optionsに、

`-Djava.library.path=libz3.dylibとlibz3java.dylibを置いたパス`

の追加を行いましたがダメでした。結局、その他の*.dylibが入っていた上記のフォルダに二つを放り込んだところ動きました(何も起きないといいな…)。
4. 以下のコードを実行しました。[参照](https://qiita.com/quentin-maisonneuve/items/4f32cf52293dc44ffc3d)



```java

import com.microsoft.z3.*;

import java.util.HashMap;

public class HelloZ3 {
    public static void main(String[] args) {

        //application example of z3
        //reference https://qiita.com/quentin-maisonneuve/items/4f32cf52293dc44ffc3d

        Context context = new Context(new HashMap<>());
        BoolExpr a = context.mkBoolConst("a");
        BoolExpr b = context.mkBoolConst("b");
        BoolExpr c = context.mkBoolConst("c");

        BoolExpr formula = context.mkAnd(context.mkOr(a, b), c); // (a || b) && c


        Solver solver = context.mkSolver();
        solver.add(formula);

        if(solver.check() == Status.SATISFIABLE) {
            Model model = solver.getModel();
            Expr resultVa = model.eval(a, false);
            Expr resultVb = model.eval(b, false);
            Expr resultVc = model.eval(c, false);

            System.out.println(resultVa);   // Result is true
            System.out.println(resultVb);   // Result is false
            System.out.println(resultVc);   // Result is true

        }

    }

}
```


#ソースからのビルド(ソース版をダウンロードすること)(うろ覚え)
1. ダウンロードしたフォルダのルート(configureファイルがある場所)で、

`./configure`

を実行。私はjavaから使用したかったので、--javaオプションをつけました。

`./configure --java`
2. buildディレクトリに移動、

`make`
と打ち込む。そこそこ待った後に、先ほど示した3つのファイルがビルドされます。


#終わりに
私用で不等式などの条件式(ex. a > 4)を解く必要があるので、出来次第追記します。
mysql の load data local infile でcsvファイルを読み込ませる時の注意

## MySQLにcsv(RFC4180)フォーマットのファイルを読み込ませる
mysqlにはファイルからデータを取り込むために `load (local) data` というクエリが用意されています。
このクエリでCSVファイルを読み込むには以下の様なクエリを使います。

```sql
load data local infile 'text.csv' INTO table load_test FIELDS terminated by ',' enclosed by '"' escaped by '"';
```
上記はファイル内の
- データのの区切り文字は `,`
- データの囲い文字は `"`
- 囲い文字をエスケープする文字は `"` 

という意味で、これらを指定することにより[RFC4180](https://codezine.jp/article/detail/2364) フォーマットのファイルをテーブルに読み込ませる事が出来ます。

## 割りと酷い内容のファイルでも読み込ませる事が出来る
例えば

```mysql
mysql > desc load_test;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| text1 | varchar(256) | YES  |     | NULL    |       |
| text2 | varchar(256) | YES  |     | NULL    |       |
| text3 | varchar(256) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
```
こんなテーブルがあって、
このテーブルに普通のCSVパーサーではエラーになる様なファイル

```csv
hunk_1.csv
aaaaaa,bbb""bbbb,cccccccc
xxxxxx,yyy"yyyy",dddddddd
```
を読み込ませても意外と取り込んでくれます。

```mysql
mysql> load data local infile 'hunk_1.csv' INTO table load_test FIELDS terminated by ',' enclosed by '"' escaped by '"';
Query OK, 2 rows affected (0.05 sec)
mysql> select * from load_test;
+-----------+--------------+--------+
| text1     | text2        | text3  |
+-----------+--------------+--------+
| aaaaaaaaa | bbb"bbbb     | cccccc |
| xxxxxx    | yyyyy"yyyyy" | zzzzzz |
+-----------+--------------+--------+
```
## "で始まるデータが有ると読み込みをしくじる
どうも （行頭または） `区切り文字``囲い文字` と文字が続くと、それ以降に現れる `囲い文字``区切り文字` （またはEOF）までを一つのデータとみなす仕組みの様で、行頭またはデータの最初に `囲い文字` があって、データの最後に `囲い文字` がない場合はデータの読み込みに失敗します。

```csv
hunk_2.csv
aaaaaa,"bbbbbbb,cccccccc
xxxxxx,yyyy"yyy,dddddddd
```

```mysql
mysql> load data local infile 'hunk_2.csv' INTO table load_test FIELDS terminated by ',' enclosed by '"' escaped by '"';
Query OK, 1 row affected, 1 warning (0.05 sec)

mysql> select * from load_test;
+----------------------------+---------------------------------------------+--------+
| text1                      | text2                                       | text3  |
+----------------------------+---------------------------------------------+--------+
| aaaaaa                     | "bbbbbbb,cccccccc
xxxxxx,yyy"yyyy,dddddddd
 | NULL   |
+----------------------------+---------------------------------------------+--------+
```
【50日で資産4倍】強化学習で暗号通貨を取引する論文の日本語訳

Qiitaと同時投稿しようと思ったのですが数式がうまく表示されないので[こちら](https://tono-n-chi.com/blog/2017/11/trade-cryptcurrency-with-reinforcement-learning/)のブログ記事を参照してください。

[著者による実装](https://github.com/ZhengyaoJiang/PGPortfolio)が上がってきたのでコードも読んでみたいですね。
とにかく手早くpython開発環境をWindows PC上に構築する（初心者向け）

最近、機械学習とか人工知能とか、盛り上がってますよね。

学習済みのAIをサービスとして提供しているような場合、API経由でそれを使うとか、
未学習でも、ライブラリとして提供されているものとデータを組み合わせて学習を行うとか、

今上げた２つのような開発であれば、実はそこまで難しくないのが実情です。
プログラミングを初めて25年になる私にとっては、今の環境はエンジニアにとって本当に最高の環境だとつくづく思わされます。

ですのでこのページを見た初心者の方、是非あきらめずに、興味を切らさずに学習を続けて下さい。

ということで、一番最初に、もしかしたら8割以上の入門者がつまずくだろう環境構築について、
なるべくシンプルにできるよう方法をまとめました。

早速行きましょう。

*****

**Anacondaのインストール**

windowsの場合、（これはpythonに限らず）pathの設定など、動くようになるまでに細かな設定が必要で、これがつまずく原因にもなります。Anaconda（https://www.anaconda.com/download/ ）を使うと、面倒な設定を全てやってくれます。

しのごの言わずにＤＬしましょう。（32bit機を使ってる人は居ないと思うけど、もしそうなら、、、うん、ごめん、Mac買おう。）
最新のMariaDBではMySQL Workbenchは使えない。Heidi SQLを使おう

![MySQLWorkbench.png](https://qiita-image-store.s3.amazonaws.com/0/102207/e2f0d407-84c3-74d1-8e64-f4d8a3e518b0.png)
長年愛用してきた**MySQL Workbench**でしたが、最近新しく立てた**MariaDB**で使おうとしたら・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102207/002e0c79-05c5-ba02-7993-e501cf84036a.png)
**テーブル一覧が読み込めない！！**

慌てて最新のものをインストールしたものの、やはり駄目。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/102207/8f007b5f-04c6-754d-02e7-b437062c541d.png)
今まではこんなダイアログが出てきてもちゃんと読み込めてたのに・・・

しょうがないのであちこち探し回り、なかなか使い勝手の良いSQLクライアントを見つけました。
#HeidiSQL
![HeidiSQL_logo_image.png](https://qiita-image-store.s3.amazonaws.com/0/102207/d8bcbf2f-464f-be02-af6e-28946d00bd83.png)
![公式サイト](https://www.heidisql.com/)

##HeidiSQLの特徴
- オープンソースで無料
- ODBCを使わずに接続可能
- クセのないUIとクエリエディタのコード補完
- 日本語が使用できる
- MySQL Workbench同様にCREATEやALTERのSQLを手軽に生成できる
- 別データベース間のデータのインポート、エクスポート
- etc..

![image.png](https://qiita-image-store.s3.amazonaws.com/0/102207/a599beb8-5992-8062-6064-50bd3c721901.png)

はじめは、若干のUIの違いに戸惑いましたが、慣れればどうということはないレベルです。
SQLクライアントをお探しの方はぜひお試しください。
awscli ECS 関連コマンドメモ


主にコピペ用。

# コマンドメモ

```bash
### 0. 環境変数
# CLUSTER_NAME_OR_ARN はそれぞれの環境に合わせて書き換えること
export CLUSTER_NAME_OR_ARN=<ECSクラスター名またはARN>

### 1. ヘルプ表示
aws ecs help
aws ecs <COMMAND> help

### 2. ECSクラスター一覧表示
aws ecs list-clusters
aws ecs list-clusters --output text 
aws ecs list-clusters --output text | sed -e 's/\s/ /g' | cut -d ' ' -f2

### 3. ECSクラスター詳細表示
aws ecs describe-clusters --cluster $CLUSTER_NAME_OR_ARN
aws ecs describe-clusters --cluster $CLUSTER_NAME_OR_ARN --output text

# ECSクラスターは --cluster または --clusters オプションにてスペース区切りで列挙することで複数指定可能
# 例: 
# aws ecs describe-clusters --clusters <CLUSTER_NAME_OR_ARN> <CLUSTER_NAME_OR_ARN2> <CLUSTER_NAME_OR_ARN3> ...

### 4. ECSサービス一覧表示
aws ecs list-services --cluster $CLUSTER_NAME_OR_ARN
aws ecs list-services --cluster $CLUSTER_NAME_OR_ARN --output text
aws ecs list-services --cluster $CLUSTER_NAME_OR_ARN --output text | sed -e 's/\s/ /g' | cut -d ' ' -f2

#### 4.1. ECSサービスARN環境変数セット
export ECS_SERVICE_ARN=arn:aws:ecs:<REGION>:<ACCOUNT_ID>:service/<SERVICE_NAME>
# or
export ECS_SERVICE_NAME=<ECSサービス名>
export ECS_SERVICE_ARN="$(aws ecs list-services --cluster $CLUSTER_NAME_OR_ARN --output text | sed -e 's/\s/ /g' | cut -d ' ' -f2 |grep $ECS_SERVICE_NAME)"

### 5. ECSサービス詳細表示
aws ecs describe-services --cluster $CLUSTER_NAME_OR_ARN --services $ECS_SERVICE_ARN

### 6. ECSタスク一覧表示
aws ecs list-tasks --cluster $CLUSTER_NAME_OR_ARN --service-name $ECS_SERVICE_ARN
aws ecs list-tasks --cluster $CLUSTER_NAME_OR_ARN --service-name $ECS_SERVICE_ARN --output text
aws ecs list-tasks --cluster $CLUSTER_NAME_OR_ARN --service-name $ECS_SERVICE_ARN --output text | sed -e 's/\s/ /g' | cut -d ' ' -f2

#### 6.1 ECSタスク環境変数セット
export ECS_TASK_ARNS="$(aws ecs list-tasks --cluster $CLUSTER_NAME_OR_ARN --service-name $ECS_SERVICE_ARN --output text | sed -e 's/\s/ /g' | cut -d ' ' -f2 | tr '\n' ' ')"

### 7. ECSタスク詳細表示
aws ecs describe-tasks --cluster $CLUSTER_NAME_OR_ARN --tasks $(echo $ECS_TASK_ARNS)
aws ecs describe-tasks --cluster $CLUSTER_NAME_OR_ARN --tasks $(echo $ECS_TASK_ARNS) --output text

```

随時追加予定。


# 参考

* [AWS Command Line Interface のインストール - AWS Command Line Interface](http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/installing.html)
Post のリクエストを PHP でプロキシーする方法

Cors で直接アクセスできないサイトに、PHP を介してアクセスする方法です。
この例では、
サイト、http://example.com/api
に ｛"table_name": "table_aaa"} という Post リクエストでアクセスする場合を想定しています。

jQuery のコードです。

```js
const params = {
		"url": "http://example.com/api",
		"table_name": "table_aaa"}

const php_proxy = "./php_proxy_post.php"

jQuery.post(php_proxy,params,function(res)
	{
	})
```

```php:php_proxy_post.php
<?php
// ------------------------------------------------------------------
//	php_proxy_post.php
//
//					Nov/10/2017
//
// ------------------------------------------------------------------
include "curl_post.php";
// ------------------------------------------------------------------
$url_in = "aaa";
$table_name = "bbb";

if (isset ($_POST['url']))
	{
	$url_in = $_POST['url'];
	}
else
	{
	echo "url is not set.";
	}

if (isset ($_POST['table_name']))
	{
	$table_name = $_POST['table_name'];
	}
else
	{
	echo "table_name is not set.";
	}

curl_post_proc ($url_in,$table_name);
// ------------------------------------------------------------------
```

```php:curl_post.php
<?php
// --------------------------------------------------------------
//	curl_post.php
//
//					Nov/10/2017
//
// --------------------------------------------------------------
function curl_post_proc ($url,$table_name)
{
	$post_data = array(
		"table_name" => $table_name
		);

	$json_str =  json_encode ($post_data);

	$ch = curl_init($url);
	curl_setopt ($ch, CURLOPT_POST, true);
	curl_setopt ($ch, CURLOPT_POSTFIELDS, $json_str);

	curl_exec($ch);

	curl_close($ch);
}

// --------------------------------------------------------------
```
Javaエンジニアの私が開発中によく使うdb2コマンドの覚書

# 使用頻度の高いdb2コマンド一覧

普段java開発をしていますが
開発の度に忘れがちなので使用頻度の高いdb2コマンドを羅列していきます。
この辺りのコマンドは早く覚えてしまいたい。

```
本校執筆時の環境は以下のとおりです
- Mac terminalからDocker内db2へアクセス
- DB2 v11.1.0.0
```

# 開始、ログイン、ログアウト、停止

- DBのインスタンス自体を起動する際
db2start

- ログイン
db2 connect to `DATABASE_NAME` user `USER_NAME` using `PASSWORD`

```
ローカル環境ならまだ良いけどお客様環境とかでusingしない
パスワードがコンソールに丸見えなのでusing PASSWORDなしで
その後の会話形式で別途パスワードを入力しログインする
```

- DBとの接続解除
db2 connect reset

- db2へ接続しているアプリケーションを全て強制切断
db2 force application all

```
ローカル環境ならまだ良いけどお客様環境とかで(ry
```

- DBのインスタンス自体を停止する際  
db2stop

# クエリ発行

- fileファイルを指定して実行  
（以下はカレントディレクトリにfile.ddlファイルがある前提）  
db2 -tvf file.ddl

- とにかく値（1行、1列）を取得
db2 "select 1 from sysibm.dual"
db2 "select 1 from sysibm.sysdummy1" --sysdummy1の方が一般的？
db2 "values 1"

- とにかく値（1行、n列）を取得。,区切りでn列を指定。
db2 "select 1,2 from sysibm.dual"
db2 "values 1,2"

- とにかく値（n行、n列）を取得。()でn行を指定。
db2 "values (1,2),(3,4)"
`#これはできない,dualは１行テーブルのため`
db2 "select (1,2),(3,4) from sysibm.dual"

oracleスキーとしてはdualを使いたくなりましたが
valuesの汎用性はんぱない。

```
※今回のような任意の値を取得する方法を標準SQLではvaluesを採用しているようです
 INSERT句の values の句ですね。
 当たり前かもしれませんが１クエリで複数行INSERTとかいけるのですね。。。

INSERT INTO user_table
  VALUES  (1, 'user1', 18, hoge@gmail.com,1)
         ,(2, 'user2', 20, fuga@gmail.com,2);
```

# 設定、各種確認

- クエリタイムアウトの設定(SELECT INSERT UPDATE DELETE等含む)  
db2 update db cfg for `DATABASE_NAME` using locktimeout タイムアウト時間(秒)

```
初期値は-1です。
この場合「ロックが GRANT される」か「デッドロックが発生する」までロックを待ちます
そのため適宜秒数指定をした方がよいと思います
執筆時点でのIBM Knowledge Centerを見ると
「トランザクション処理 (OLTP) 環境では、30 秒が初期値として適当」とのことです
ロックテストを行いたい場合に数秒単位に縮めるなど適宜設定すると良いと思います
尚、DB再起動が必要です
※「オンライン構成パラメーター」でないため
```

- db2設定値確認
db2 get db cfg for DB_NAME show detail

- db2にアクセスしているアプリケーションの一覧確認
db2 list applications

- 現在接続しているdbの確認
db2 "values current server"

- dbの一覧
db2 list db directory

- tableの一覧
db2 list tables

- tableのレイアウト確認
db2 describe table TABLE_NAME

- 特定tableのPK（ユニークキー,外部キーも混在）の調べ方
db2 "select * from syscat.keycoluse where tabname = 'TABLE_NAME' order by colseq"

- 特定tableのPK,ユニークキー,外部キーの調べ方(t1.typeで判別)
db2 "select t1.type, t2.* from syscat.tabconst t1, syscat.keycoluse t2 where t1.tabname = 'TABLE_NAME' and t1.constname = t2.constname order by t1.constname, t2.colseq"
conoHaについて語る

#最初に
[ConoHa Advent Calendar 2017](https://qiita.com/advent-calendar/2017/conoha) 用に書いたお話を適当に書いています。
かなり雑なもので、誤字や脱字が大量に存在しているかと思います。予めご理解ください。
また、他の違いConoHaについて語るだけです。
尚、内容については私一個人の解釈というか感想というかが含まれています。

#conoHaとはなんぞや?
conoHaとは簡単に言うと、個人で使えるサーバーを貸してくれるサービスです。
このサーバのことを VPS(バーチャル・プライベート・サーバ) といいます。
VPSって何ぞやって方は [wikipedia](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%BB%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%83%BB%E3%82%B5%E3%83%BC%E3%83%90) をご覧ください。

ちなみに、conohaではなく conoHaです。Hは大文字です。
こんなこと描きましたけど、正確には「ConoHa」です。
コメントとTwitterのリプライで気づきました。
ドヤ顔で書きました。超恥ずかしい。

そのサーバーの使い方は様々です。
Webサーバとして使ったり、データベースサーバーとして使ったり、ゲームのサーバ(Minecraftのマルチのサーバ 等)に使ったり、Twitterbotを動かすとか 様々な使い方が出来ます。
ちなみに、私の場合はownCloudとApacheを入れてphpでTwitterbotを動かしています。<br>
ConoHaのVPSは様々な使い方が出来る上に、root権限が渡されるので、自由自在にサーバを弄れます。
(他のVPSを貸してくれるサービスについては分からないですけど。)

## ConoHaVPSを使う利点とか
- 前述どおり、root権限が渡されますので、自由自在に弄れます。
- 価格が一律であること。
- すぐに上位プランに切り替えれる
- サポートがしっかりしてる。

「価格が一律」について:
一番安いプランでも月630円です。
しかも時間単位の支払いも可能です。

「すぐに上位プランに切り替えれる」について:
ものの数十秒(環境によっては時間がかかる可能性が有り)で、上位プランに切り替えることが出来ます。

「サポートがしっかり」について:
旧ConoHa(cp.conoha.jp)から使い続けているのですが、旧ConoHaに間違えてチャージをしてしまい、新しい方にチャージを移行してもらえないか、問い合わせたところ、なんと移行手続きをして貰えて、移行することが出来ました。

※他のVPSを貸してくれるサービスと比較しているしているわけでないです。
※※あくまでも個人的な感想です。

##ConoHaを使う際の欠点
- DDOSに合いやすい

個人的に見てると DDOSにあってることが多い気がします。

※他のVPSを貸してくれるサービスと比較しているしているわけでないです。
※※あくまでも個人的な感想です。

#ConoHaが便利すぎて泣ける
なんといってもコンビニ決済に対応しているのは大きいと思います。
しかも、ConoHa mobileというスマホアプリも有ります。

APIも使えるので、自前のwebからさーばを管理することも可能だったりします。
確かgithubにphpでConoHaAPIを叩けるものが見つかると思います。

#最後に
ConoHaについて語っていてもきりがないので、ここで終わらせて頂きます。

ご覧頂有難うございました。

#リンク
- [ConoHa公式サイト](https://www.conoha.jp/conoha)
- [CHAP - ConoHa API for PHP](https://github.com/ezaki/chap)(github)
- Twitter: [美雲このは](https://twitter.com/MikumoConoHa) / [ConoHaPR](https://twitter.com/ConoHaPR)
- [ConoHa Advent Calendar 2017](https://qiita.com/advent-calendar/2017/conoha)
CODE BLUE 2017レポート(DAY2後篇)

こんにちは、ひろかずです。
[前回](https://qiita.com/fnifni/items/5f9f2e925777ff14fd91)に引き続き、CODE BLUE 2017のDAY2をレポートします。

# お品書き
"商用ホワイトボックス暗号方式" に対する "鍵回復攻撃"
LG vs. Samsung スマートTV: あなたを追跡できるのはどちら？
インサイドShell：.NETハッキング技術を応用したPowerShell可視性の向上
国産IT資産管理ソフトウェアの（イン）セキュリティ
=== 今回はここから ===
OSSによる自動車の自動運転化
=== ここまで ===

# OSSによる自動車の自動運転化
ジョージ・ホッツ - George Hotz - 

jailblake
車に何を求める？(搭載されていない機能機能で)
なんでやるの？

- ゲーム愛

車のネットワーク

- 大量のケーブルがある
- PCMやCAN-BASとか,Ethernetがあるものもある
- インターネットに大量のリポジトリ（一日$10とか）
- techinfo.<blandname>.com
- CANはバスなので全てのノードが受信する。Ethernetと同じ
- CANは11bitの識別子でノードを識別できる
- データは8bit

panda(interface)

- ほとんどの車についているドングルELM327(安価)
- Amazonでも買える
- CAN-BUSのデータを全て読むことができない
- もっといいものを作った(それがpanda)

giraffe(honda)

- もっと深いところにあるCAN-BUSにある情報を取れる
- タッピングツール
- BUSに流れる物は全て取れる

opendbc

- 標準的なAPI（アクティブ、パッシブ両方ある）
- リバースエンジニアリングしたものはより読みやすくなっている

## 自動車が持っていない機能は`自動運転`
求めているAPIは、何処に言ってといえば言ってくれる自動運転

- APIでアクセスペダルでスピードコントロールできる
- APIでブレーキをコントロールできる（ブレーキランプを使わないこともできる(!)）
- APIでステアリングトルクをコントロールできる

リバースエンジニアリングには、静的、動的の分析手法があり、両方を使った

- cabanaというツールを使った
- pandaが全てのAPIを取得している
- 収集した情報を機械学習して分析
- ステアリングに沿った形で角度APIが変わる
- Githubにつながっているので、自分のopendbcにアップロードできる。
- pythonライブラリが用意されている
- Java Scriptバージョンも予定されている
- ブラウザベースで自動運転ができるかも

データについて(トヨタの場合)

- ブレーキと加速は同じコマンドで動いている

openpilot

- Githubに公開されている
- どうやって動作させるか？
- 32bitプロセス
- 携帯電話ケースを使う(携帯電話のプロセッサはパワフル。自動車内全部を合せても)
- Androidはグラフィックドライバがイケてないので、フォークしてNEOSを作った
- ssh, tmux, bash！

openpilotは何をする？

- ECUをエミュレートする

Acura ILX EPS ファームウェア

- 結構強く暗号化している
- maxトルクを上げるのにリコンパイルしなくていい。テーブルを変えるだけ。
- チェックサムは良くない

データシートにmemory readが！

- pandaを繋いでファームウェアをダンプしてみた
- 16bitの暗号鍵が必要だった
- 0000000000000000
- 本当？
- ISO14229準拠だった

TOYOTAの場合($72000のプリウス)

- Toyota crypt 300 challenge
- 4つある
- sboxがある
- 典型的な暗号analysisを使用した

## ゲームのおわり

- 脱獄は、初めはapp storeにしかなかった
- XBMC（xbox media center）は10年前のスマートテレビだった
- まだ続いている
- もっと車のサポートが必要
- プルリクエストがまだ来ている
- slackもあるよ！
- 長いチームが勝利する
- スマホは2年で入れ替わるが、車は9年乗る
- 車の脱獄ができれば、これは長期的な勝利！

## 質疑応答
合法ですか？

- 国による
- 安全性は、定義している（ドライバーがすぐにコントロールを取り返すことができる。指二本、べダル操作ですぐ戻る。急展開しない。）
- 過去に訴えられたこともある
- 過去の判例では合法

アメリカの街並みに対応しているかもしれないけど、街並みが全然違うヨーロッパ対応にどれくらいかかりそう？

- レベル4の自動運転車を出荷されているが、私たちはまだ時間はかかりそう
- 運転の経験はそんなに変わらない。規則の問題ではない。
- データではなく、コードがすべて。

人間より優れていない点は？

- すべて
- 囲碁は時間をかけて人間を超えた。自動運転もそう。
- メッシュネットワークやアクティブレーダーコントロールは意味がない
- すべての車にV2Bを積めばやり取りは出来るが、ほとんどのことはローカルで高速で行われる

夜間のテストはやってる？

- もちろん。むしろ夜のほうが調子がいい
- 少なくとも高速道路では、白線がハイライトされるから調子がいい
- 雪道や雨などのテストもフィードバックされている

歩行者は？

- アクティブテストも重ねるのがいい

自動運転の未来は？

- 標識や信号が視認できなくても、自動運転のほうがより良く認識することができるようになると思う。

# 所感
未来を感じる内容でした。
ここまでオープンにできているとは驚きです。

今日はここまでです。
お疲れさまでした。
GalaxyでSQLのSELECT文を利用してデータを取り出してみよう

#Pitagora Galaxyのツールを利用してSQLを利用してデータを取り出してみよう
**注意: 初心者向けの機能では無いので、SQLを使った事が無い場合にこの機能を利用してはいけない**

この操作にはPitagora Galaxyの標準ツールを利用
Pitagora Galaxyを手元のPC/Macにインストールする方法はこちら[Pitagora Galaxy 仮想マシン](http://wiki.pitagora-galaxy.org/wiki/index.php/Versions])



ここではHGNCから遺伝子のタブ区切りテキストを取得して利用
[hgnc_complete_set.txt](ftp://ftp.ebi.ac.uk/pub/databases/genenames/new/tsv/hgnc_complete_set.txt)をGalaxyにアップロード
画面左側の"Tools"領域のアップロードアイコンをクリック
![Screen Shot 2017-12-21 at 06.20.36.png](https://qiita-image-store.s3.amazonaws.com/0/213053/b6614e5e-8420-8d30-2e32-6f8d57ec8d0c.png)
("Get Data" => "Upload File from your computer"へのショートカット)

HGNCのサイトからダウンロードしたhgnc_complete_set.txtを"Donload from web or upload from disk"にドラッグ・アンド・ドロップ。"Type"のフィールドを"tabular"として"Start"をクリック
![Screen Shot 2017-12-21 at 06.21.21.png](https://qiita-image-store.s3.amazonaws.com/0/213053/189e8aac-8a09-5922-42ec-5f346f839cdf.png)

画面左側の"Tools"領域の"SQL Tools"をクリック
![Screen Shot 2017-12-21 at 06.21.42.png](https://qiita-image-store.s3.amazonaws.com/0/213053/f82c249b-c793-7847-242e-5f880d018555.png)

"SQL Runner (SQLite)"をクリック
![Screen Shot 2017-12-21 at 06.21.48.png](https://qiita-image-store.s3.amazonaws.com/0/213053/07a4e17f-99d1-2cb1-92f8-e6867998b01b.png)

"Table"フィールドの"+Insert Table"ボタンをクリック
![Screen Shot 2017-12-21 at 06.21.54.png](https://qiita-image-store.s3.amazonaws.com/0/213053/b839fe18-a719-f897-22fc-0806b2a5f768.png)

"File(tabular)"のドロップダウンリストでSQLコマンドで処理する対象のファイルを指定
![Screen Shot 2017-12-21 at 06.22.01.png](https://qiita-image-store.s3.amazonaws.com/0/213053/588726b7-2473-6d5f-a5b7-62761df9c724.png)

"SQL"フィールドにSQLを記述
![Screen Shot 2017-12-21 at 06.23.44.png](https://qiita-image-store.s3.amazonaws.com/0/213053/a26b3ae4-83b4-c7f2-6a61-6a8b0a9560af.png)

基本的にはSQLiteで利用可能なSQL構文を記述可能[SQL As Understood By SQLite(英語)](https://www.sqlite.org/lang_select.html)

|項目|表記方法|説明|
|:-----------------|------------------|------------------|
| テーブル名|tn (nは整数)|"Table"で追加した順にt1, t2, t3 ...|
| コラム|cn (nは整数)|各ファイルのタブ区切りされたコラムの順にc1, c2, c3 ...|
(ファイルのコラムの順を確認するには、右側の"History"領域で対象のファイルをクリックした時に表示されるテーブルを参照すると良い）

"Execute"をクリックして実行
![Screen Shot 2017-12-21 at 06.23.44.png](https://qiita-image-store.s3.amazonaws.com/0/213053/07fa10a3-f72b-b576-271e-f371126cfdad.png)

画面右側の"History"領域の目玉のアイコンをクリック
![Screen Shot 2017-12-21 at 06.23.56.png](https://qiita-image-store.s3.amazonaws.com/0/213053/576df41e-6af1-7677-6c36-a00ffda2d52d.png)

SQLを利用して指定した4個の遺伝子が抽出できた
![Screen Shot 2017-12-21 at 06.24.01.png](https://qiita-image-store.s3.amazonaws.com/0/213053/0780d401-fea2-7a8d-a66a-5262aa10e28f.png)

複数のファイルのデータをJOINする等なんでもできるので便利だけれど、現状では

- "Table"フィールドの"Use the first row as columns names"は"No"のままとする
- ASCIIの文字列以外のファイルを取り扱わない


今日はここまで:smiley:
Julia+SymPyで行列式が正しく求められなかった件

# Julia+SymPyで行列式が正しく求められない場合？？？

JuliaのSymPyパッケージで文字の入った行列から行列式を求めようとしていました。うまく行く場合とうまく行かない場合があり、原因ははっきりとさせることできませんでしたが、調べた結果を記します。

## 実行環境
Windows 7 Professional Service Pack 1
Julia 0.6.1
SymPy 0.5.4
Conda 0.7.0


## 例1【Julia版】（エラー出たコード！）

```Julia:Julia
using PyCall
using SymPy

@syms L a

M=[1        0        0 1
   1        0        0 0
   cos(L*a) sin(L*a) L 1
   cos(L*a) sin(L*a) 0 0]

det(M)       #←なぜかエラー出る
SymPy.det(M) #←これもエラー出る
Base.det(M)  #←これもエラー出る
```

## 例1'【Python版】（例1と同じ内容のつもりです）
本家Pythonで行うとやはりエラーなど出ませんでした。

```Python:Python
#以下3行はPythonでmatplotlibを使うためのおまじないみたい。よく意味は理解していない・・・
%matplotlib inline
from sympy import *
init_printing()

L,a = symbols("L a")

M=Matrix([[1,       0,       0,1],
          [1,       0,       0,0],
          [cos(L*a),sin(L*a),L,1],
          [cos(L*a),sin(L*a),0,0]])

det(M)
```

※検証のため使ったことのないPythonをなんとか操作しました・・・

## 例2【Julia版】（前の例に続けて）
下記のような行列Nでは正しく計算できました。何でだろう？？？

```Julia:Julia
N=[1           0          0  1
   0           a          1  0
   cos(L*a)    sin(L*a)   L  1
   -a*sin(L*a) a*cos(L*a) 1  0]
det(N) |> simplify #←エラー出ない
```

## 例3【Julia版】（前の例に続けて）
仕方が無いので、Julia上では行列式を求める関数を自作して、それを使うようにしてみました。エラーは出ません。

```Julia:Julia
#■小行列を求める関数
function submat(M,R::Int,C::Int)
  (Rend,Cend)=size(M)
  R>Rend  && error("行番号の指定が行列の最大行数を超えています")
  C>Cend  && error("列番号の指定が行列の最大列数を超えています")
  R==1    ? M=M[2:end,  :] :
  R==Rend ? M=M[1:end-1,:] :
            M=[M[1:R-1, :];M[R+1:end, :]]
  C==1    ? M=M[:,2:end  ] :
  C==Cend ? M=M[:,1:end-1] :
            M=[M[:,1:C-1] M[:,C+1:end]]
  (1,1)==size(M) ? M[1] :M
end
#↑の自作関数はSymPyのminorMatrix(M,R-1,C-1)と同じような働きになっているはず

#■行列式を求める関数
function determ(M)
  ndims(M)>=3 ? error("行列になっていないので計算できません") : begin
    s=size(M)
    s==()      && return M    #Mが非Arrayだった場合
    s==(1,)    && return M[1] #Mが1-element Arrayだった場合
    s==(1,1)   && return M[1] #Mが1×1 Arrayだった場合
    s==(2,2)   && return M[1,1]*M[2,2]-        #Mが2×2 Arrayだった場合
                         M[1,2]*M[2,1]
    s==(3,3)   && return M[1,1]*M[2,2]*M[3,3]+ #Mが2×2 Arrayだった場合
                         M[1,2]*M[2,3]*M[3,1]+
                         M[1,3]*M[2,1]*M[3,2]-
                         M[1,1]*M[2,3]*M[3,2]-
                         M[1,2]*M[2,1]*M[3,3]-
                         M[1,3]*M[2,2]*M[3,1]
    #↑s==(2,2)とs==(3,3)の場合はたすき掛けの法で求めるようにしている
    #　この場合を設けなくても関数は成立するが、計算時間が早そうなので入れている
    s[1]!=s[2] && error("正方行列ではないので計算できません")
    return sum((-1)^(1+i)*M[1,i]*determ(submat(M,1,i)) for i in 1:s[2])
  end
end

determ(M)             #エラー出なくなった
determ(N) |> simplify #これもエラー出ない。例2と同じ結果

```

## 最後に
長いことはまっていました！
自分用のメモのつもりで書きましたが、
原因分かる方いましたら教えて欲しいです・・・
Galaxyでタブ区切りをカンマ区切りに変換してみよう

Galaxyを利用してカンマをタブに変更する手順

データをGalaxyから取り出して利用する時に、カンマ区切りのcsvファイルの方が都合が良いという場合が有る
そんな場合に備えて、タブで区切られているデータをカンマ区切りに変更してみよう

左側の"Tool"領域の"SQL tools"をクリック
![Screen Shot 2017-12-15 at 18.41.40.png](https://qiita-image-store.s3.amazonaws.com/0/213053/3e88394d-6be0-503a-a375-f0faef5ced18.png)

表示される"Tabular to CSV"をクリック
![Screen Shot 2017-12-15 at 18.41.53.png](https://qiita-image-store.s3.amazonaws.com/0/213053/f3bb6ffe-4d6c-7b80-dee1-aa3e2db2a657.png)

"File(tabular)"フィールドのドロップダウンリストでファイルやデータを指定
![Screen Shot 2017-12-15 at 18.42.45.png](https://qiita-image-store.s3.amazonaws.com/0/213053/d920b66c-0cef-6647-2970-0c9e7e716694.png)

"Execute"をクリックして実行
![Screen Shot 2017-12-15 at 18.42.45.png](https://qiita-image-store.s3.amazonaws.com/0/213053/72fa7b6e-6f4e-26a7-90d0-51c924612731.png)

右側の"History"領域で、作成されたデータの目玉アイコンをクリック
![Screen Shot 2017-12-15 at 18.42.50.png](https://qiita-image-store.s3.amazonaws.com/0/213053/af762956-44dd-3b3a-558e-bfdeee5d4835.png)

テキストのタブがカンマに変換されている
![Screen Shot 2017-12-15 at 18.42.59.png](https://qiita-image-store.s3.amazonaws.com/0/213053/0baa78e1-72c9-66e7-a243-10fb15068fa8.png)

今日はここまで:smiley:
Galaxyで共通のIDを持つデータファイル２つを利用して、データファイルを集約してみよう

#２つのデータファイルを利用して片方のデータファイルをアノテーションしてみよう

最初のコラムが共通のIDが振られている下のようデータを取り扱ってみる

```text:annotation.tsv
A	A is for an apple.
B	B is for a ball.
C	C is for a cat.
D	D is for a dog.
```

```text:frequency.tsv
A	2
C	5
D	1
```

## データをGalaxyにアップロード
サンプルデータが小さいのでGalaxyにコピペする
左側の領域の"Get Data" => "Upload File from your computer"をクリックしてダイアログを表示し、ダイアログ下部の"Paste/Fetch Data"をクリック
![Screen Shot 2017-12-13 at 23.02.24.png](https://qiita-image-store.s3.amazonaws.com/0/213053/007534d0-3440-a4a3-fb21-a10727eefad3.png)

表示された枠の中に直接データテキストをペースト
![Screen Shot 2017-12-13 at 23.02.52.png](https://qiita-image-store.s3.amazonaws.com/0/213053/c4b366eb-9070-e8d4-641c-de030f0df086.png)

さらに、ダイアログ下部の"Paste/Fetch Data"をクリックして同じようにもう一つのデータテキストをペースト
![Screen Shot 2017-12-13 at 23.03.04.png](https://qiita-image-store.s3.amazonaws.com/0/213053/d7f33e94-515f-9f1a-eb5c-e6577fce8dd7.png)

ダイアログ下部の"Start"をクリックして２つのデータのStatusが100%になったら、ダイアログ下部の"Close"をクリック
![Screen Shot 2017-12-13 at 23.03.09.png](https://qiita-image-store.s3.amazonaws.com/0/213053/b5d4a944-bba4-b887-3d5e-4344b2443477.png)

画面右側の"History"領域に"Pasted Entry"が２件追加される
このままでは、２つが区別しにくいので、それぞれの"Pasted Entry"の名前を変更しよう

先ずは最初の"Pasted Entry"のペンシルのアイコンをクリック
![Screen Shot 2017-12-13 at 23.03.23.png](https://qiita-image-store.s3.amazonaws.com/0/213053/7f212608-45bd-00e3-aca5-9b989bd51d52.png)

"Name"のフィールドをわかりやすい文字列に変更
![Screen Shot 2017-12-13 at 23.03.41.png](https://qiita-image-store.s3.amazonaws.com/0/213053/605b2ec2-23c2-729a-6ab9-9f1e95096990.png)

変更後は保存のために"Save"をクリック
![Screen Shot 2017-12-13 at 23.04.02.png](https://qiita-image-store.s3.amazonaws.com/0/213053/3fefd126-b3f7-64f5-5368-dae46026c6bf.png)

同様にしてもう一つの"Pasted Entry"も名称を変更しよう

右側のツールから、"Join,Subtract and Group"をクリックし、"Join two Datasets side by side on a specified field"をクリック
![Screen Shot 2017-12-13 at 23.01.00.png](https://qiita-image-store.s3.amazonaws.com/0/213053/1edcda49-5389-317c-656b-758e4337f578.png)

"Join"で"Data table"("A is for an apple."が記載されている方)をドロップダウンリストで選択し、"and column"でカラムを選択

![Screen Shot 2017-12-13 at 23.04.49.png](https://qiita-image-store.s3.amazonaws.com/0/213053/5bcb13fd-9b98-bd96-0dd1-2cd6c318a258.png)

"with"以下のフィールドで、もう一つのファイルの名称をドロップダウンリストで選択し、"and column"でカラムを選択
![Screen Shot 2017-12-13 at 23.05.17.png](https://qiita-image-store.s3.amazonaws.com/0/213053/80c684d1-45f7-3a8a-ab26-f0f7e7e73d94.png)

"Execute"をクリック
![Screen Shot 2017-12-13 at 23.05.17.png](https://qiita-image-store.s3.amazonaws.com/0/213053/f3122929-d9d3-6bcc-8242-0db717dd6dd2.png)

新しくできたデータを参照
![Screen Shot 2017-12-13 at 23.05.39.png](https://qiita-image-store.s3.amazonaws.com/0/213053/1b3dc2e8-8c07-602d-0a98-5fb29439e59d.png)

同じIDを元に2つのデータの該当行が集約されている

今日はこれまで:smile:
Galaxyでタブ区切りのデータファイル２つを利用してデータを抽出してみよう

2つのテーブルの特定のコラムを元に、どちらのテーブルにも含まれているものを抽出してみよう

比較対処は次のようなデータ
<img width="1373" alt="Screen Shot 2017-12-12 at 22.25.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/213053/d7672f26-b2c7-8b3c-a525-9282a8cb75c8.png">
1番目のデータ(右)と2番目のデータ(左)の、左端から6番目のカラムを比較して値が一致する1番目のデータの行を抜き出す

左の領域から"Join Subtract and Group"をクリック
![JoinSubtractAndGroup.png](https://qiita-image-store.s3.amazonaws.com/0/213053/bc1c5c40-813d-ed03-9084-02a0c10a64d0.png)

"Compare two datasets"をクリック
![JoinSubtractAndGroup_CompareTwoDataSet.png](https://qiita-image-store.s3.amazonaws.com/0/213053/ee609378-464f-a0ae-a6ac-cbc6a215d8aa.png)

"Compare"ドロップダウンリストで1番目のデータを選択
![JoinSubtractAndGroup_CompareTwoDataSetCompare.png](https://qiita-image-store.s3.amazonaws.com/0/213053/42723a0e-d39f-ab24-060a-c219521d9b17.png)

- "Using column"ドロップダウンリストで1番目のデータのコラムを指定
- "against"ドロップダウンリストで比較対象とする2番目のデータを指定
- "and column"ドロップダウンリストで1番目のデータと対応する2番目のデータのコラムを指定
- "To find"フィールドで比較方法を指定。ここでは"Matching rows of 1st dataset"を選択することで、1番目のデータの指定したコラムと2番めのデータの指定したコラムが同じ物を抽出してみる
- フィールドを確認して、"Execute"をクリック

![JoinSubtractAndGroup_CompareTwoDataSetCompare_Execute.png](https://qiita-image-store.s3.amazonaws.com/0/213053/5435b64e-187b-6daf-83a6-0bb820bd876e.png)

結果を確認
![JoinSubtractAndGroup_CompareTwoDataSetCompare_Execute_Result.png](https://qiita-image-store.s3.amazonaws.com/0/213053/fb23e9b5-496d-5146-c62e-a2f6ac668a1d.png)

今日はここまで :smiley:
Galaxyで特定の列だけ取り出してみよう

複数のコラムがあるテーブルから必要なコラムだけを取り出すのも簡単

今回はNCBIのRefseq Geneのテーブルを利用してみる
![LRG_Refseq.png](https://qiita-image-store.s3.amazonaws.com/0/213053/61f3c52a-4f78-e04b-21bc-54a0b8a6b8b6.png)
このテーブルのGeneID, Symbol, RNAのコラムを抽出したい

左のメニュー領域の"Text Manipulation"をクリックして
![TextManipulation_LRG.png](https://qiita-image-store.s3.amazonaws.com/0/213053/dacaac5b-685d-e681-0efb-2fe716a6f4fa.png)

"Cut Columns"をクリック
![TextManipulation_cut_LRG.png](https://qiita-image-store.s3.amazonaws.com/0/213053/8fb11939-e1e6-af48-6895-ab0076a063fd.png)

"Cut columns"のフィールドに取り出したいコラムをカンマで区切って記入
ここでは"c2,c3,c6"
![TextManipulation_cut_cutcollumn_LRG.png](https://qiita-image-store.s3.amazonaws.com/0/213053/013aa1af-65c2-f660-febf-ee064c5b68fb.png)
コラムは"c"の後に左から何番目のコラムかを数字で指定
左から2番めなら"c2"、左から3番目なら"c3"
*コラムは指定した順番に並ぶので、"c3,c2"とすれば3番目のコラムが一番左で、2番めのコラムが次といった順番*
GeneID, Symbol, RNAは、"c2,c3,c6"
カラムの位置がわからない時は、"History"で抽出元のファイルをクリックするとデータの概要が"History"に表示されて、各コラムが左から何番目か確認できる

"From"のドロップダウンリストで処理対象のデータを指定
![TextManipulation_cut_from_LRG.png](https://qiita-image-store.s3.amazonaws.com/0/213053/37061262-7d37-c485-b016-e1c3151870e7.png)

"Execute"をクリックして実行
![TextManipulation_cut_execute_LRG.png](https://qiita-image-store.s3.amazonaws.com/0/213053/138a8318-8b0d-50e1-a294-155dc1044f6c.png)

作成されたデータを確認するため、右側の"History"で目玉アイコンをクリック
![TextManipulation_cut_execute_finished_LRG.png](https://qiita-image-store.s3.amazonaws.com/0/213053/362292bb-8831-0f25-f370-9fe8d4f10b2b.png)

ちゃんと目的の行だけ切り出せている
![Screen Shot 2017-12-11 at 04.38.31.png](https://qiita-image-store.s3.amazonaws.com/0/213053/ac3e00fa-b814-a76e-7190-40fda6357e15.png)

今日はこれまで:smile:
CoreOSの自動アップデートでDocker環境が全滅した日

# はじめに
先日、CoreOSの自動アップデートによりDockerで動かしていた検証用の環境が全滅 :confounded:、という状況に遭遇したので原因と対応策を記しておきます。

# 環境
CoreOS 1576.2.0 (Beta channel)[^1]

[^1]: 検証環境なので、人柱的に敢えてBeta channel使ってます。

# 現象
2017/11/09 にDockerで動かしていたアプリケーションがまったく使えなくなる。ホストOSであるCoreOSは稼働しているが、`docker ps`すると `Cannot connect to the Docker daemon...` のエラーメッセージが返ってくる。稼働プロセスを確認すると確かにDockerデーモンのプロセスがなく、手動で `systemctl start docker` しても起動しないという状況。

# 原因
`journalctl -xe`でログを確認すると一目瞭然。Dockerの起動でコケていた。

```bash
Nov 09 14:27:01 my-dockerhost docker[957]: `docker daemon` is not supported on Linux. Please run `dockerd` directly
```

https://docs.docker.com/engine/deprecated/#docker-daemon-subcommand にあるとおり、Docker v1.13.0で非推奨となり v17.12 で削除[^2] となるため、代わりに `dockerd`という別コマンドを使うように、とのこと。

[^2]: 1点解せないのが、今回v17.09.0なのに`docker daemon`がもう使えなくなっているというところ。この点については、[ISSUE](https://github.com/docker/for-linux/issues/11)も立っていたが今回は深く追っていない。

確かに、アップデートされたCoreOSの[1576.2.0 リリースノート](https://coreos.com/releases/#1576.2.0) も見てみると、Dockerのバージョンが **`1.12.6`** :arrow_right: **`17.09.0`** とついにv17系になっていた。念のためCoreOS上のDockerのバージョンを確認してみると...

```bash
$ docker --version
Docker version 17.09.0-ce, build afdb6d4
```

と確かにv17系になっている。

結論としては、Dockerのバージョンアップにより`docker daemon`が使えなくなったのが原因と思われる。 

# 対応策
正しく`dockerd`を使うようにDockerデーモンの起動方法を変えれば良い。CoreOSではsystemdを使って起動しているので `docker.service` を修正する。

```diff:/etc/systemd/system/docker.service
@@ -1 +1 @@
-ExecStart=/usr/bin/docker daemon --storage-driver=btrfs --host=fd:// $DOCKER_OPTS
+ExecStart=/usr/bin/dockerd --storage-driver=btrfs --host=fd:// $DOCKER_OPTS
```

後はsystemdのservice設定ファイルの変更を反映し、Dockerを起動して復旧完了。

```bash
sudo systemctl daemon-reload
sudo systemctl start docker
```

# Dockerをダウングレードする手もある
この記事を書いている時に見つけたものですが、CoreOSのBlogに [Toward Docker 17.xx in Container Linux](https://coreos.com/blog/toward-docker-17-in-container-linux) というものが書かれていた[^3]。`/etc/coreos/docker-1.12`に`yes`を書き込んでおくとダウングレードして使えるらしい。
ただし、このオプションは以下のスケジュールで無視されるようになり、結局はバージョンアップがいずれ必要になるので要注意。

>June 6, 2018: `/etc/coreos/docker-1.12` is ignored in the alpha channel.
>June 20, 2018: `/etc/coreos/docker-1.12` is ignored in the beta channel.
>July 18, 2018: `/etc/coreos/docker-1.12` is ignored in the stable channel.

[^3]: これ事前に読んで変更点を押さえておけよ、という感じですかね :confused:

# 今後考えたいこと
CoreOSの自動アップデートをオフにしておけば今回のような障害は防げるものの、セキュリティとのトレードオフとなる。人柱環境という面もあるのでやはり積極的にアップデートしていきたい。
となると、OSアップデート後にDockerが起動しない状況になったらアップデートを一旦自動ロールバックするとかできればうれしいかなぁ...と思ったりもするのですが、CoreOSの自動アップデートってどこまで制御できるんでしょうかね？
久々にWindowsを触って困るときのためのメモ

# 概要

表題のとおり、普段Macを触っている人が久々にWindowsを触って困るときのためのメモです。

# JISキーボードがsurfaceで正しく認識されない

http://blogs.itmedia.co.jp/kizawa/2013/04/surface-49ed.html

要点は、

- デバイスマネージャー
- 「コンピュータ上のデバイスドライバーの一覧から選択します」
- 「互換性のあるハードウェアを表示」のチェックを外す
- Microsoft 106/109

# 複数デスクトップ

Ctrl + Windows + 左右カーソル

~~他の人のやつを操作しようとすると全くどこにあるかわからなくて、Macでも困る。この世から消えればいいのに~~

# Excelで前ゼロのあるデータを読み込む

データ→外部データの読み込み→テキストファイル

# キャプチャー 

スニッピングツール

# ファイルのリネーム

F2（MacはEnter）
Galaxyでカンマ区切りをタブ区切りに変換してみよう

データ処理を始める前に、タブで区切られていないデータファイルをタブ区切りに変換しよう。

変換元のデータは次の通り
![Screen Shot 2017-12-07 at 11.02.54.png](https://qiita-image-store.s3.amazonaws.com/0/213053/885a8528-6484-9194-9314-bcebea0c3567.png)


画面の右の"History"にあるデータの区切りをタブに変換するには、"Tools"の"Text Manipulation"をクリック
![TextManipulation.png](https://qiita-image-store.s3.amazonaws.com/0/213053/301ac72f-e3b5-9463-6336-4ec04d528b65.png)

展開された中から"Convert Delimiters to TAB"をクリック
![TextManipulation_ConvertDelimitersToTab.png](https://qiita-image-store.s3.amazonaws.com/0/213053/bad9c1f1-f76b-54e9-6d66-f1fd9bd54d3c.png)


"Convert All"のフィールドで元の区切り文字を選ぶ
![TextManipulation_ConvertDelimitersToTab_ConvertAll.png](https://qiita-image-store.s3.amazonaws.com/0/213053/f0a7b32d-d54c-f7c8-c594-df4a49280fc6.png)


ここではカンマを選択
![TextManipulation_ConvertDelimitersToTab_ConvertAll_SelectComma.png](https://qiita-image-store.s3.amazonaws.com/0/213053/3d38517b-8c4d-f1d3-f720-ec07f5456406.png)

カンマ以外に次のような文字を区切りとして選べる

| 区切り文字        |       指定する方法 |
|:-----------------:|:------------------|
| （空白）          |       Whitespaces |
|（タブ）|Tabs|
|.|Dots|
|,|Commas|
|-|Dashes|
|｜|Pipes|
|:|Colons|
|;|Semicolons|

変換したいファイルを"In Dataset"で指定する
![TextManipulation_ConvertDelimitersToTab_SelectFile.png](https://qiita-image-store.s3.amazonaws.com/0/213053/c994a936-e35c-2006-8ecb-064148946c85.png)

"Condense consecutive delimiters in one TAB"(連続する区切り文字をひとまとめのTABにする)をNo に変更する
![TextManipulation_ConvertDelimitersToTab_No_Consecutive.png](https://qiita-image-store.s3.amazonaws.com/0/213053/2e2f084e-f9fe-2c11-beab-5ee53b712dad.png)
*"Condense consecutive delimiters in one TAB"をYesだと、データが何も無い場合にカラムの位置がずれてしまう*

"Execute"で実行
![TextManipulation_ConvertDelimitersToTab_Execute.png](https://qiita-image-store.s3.amazonaws.com/0/213053/76d6769c-6f61-715a-3680-e529e18cfc7b.png)

結果を確認するために、画面右側の"History"の目玉のアイコンをクリック
![TextManipulation_ConvertDelimitersToTab_ViewData.png](https://qiita-image-store.s3.amazonaws.com/0/213053/4e8d149e-a4d1-e31d-0b0b-8f9a257bf78c.png)

TAB区切りとなって、データがテーブルとして認識されると少し見やすく表示される
![TextManipulation_ConvertDelimitersToTab_Result.png](https://qiita-image-store.s3.amazonaws.com/0/213053/7708360b-a691-f54d-51b0-1650fd7162d6.png)
特定のカラムを取り出したり、集計したりという処理を行うにはTAB区切りでデーターを格納している事がとても重要

今日はここまで:smiley:
要素数の異なる list を zip する

要素数の異なる 2 つの list があります。

```py
rooms = [101, 102, 103]
girls = ['ヒロ', '沙英']
```

[zip()](https://docs.python.jp/3/library/functions.html?highlight=zip#zip) にこれらの list を渡すと、イテレータの長さは短い方に合わされてしまいます。

```pycon
>>> for room, girl in zip(rooms, girls):
...   print(f'{room} 号室には {girl} が住んでいます。')

101 号室には ヒロ が住んでいます。
102 号室には 沙英 が住んでいます。
```

それを防ぐには [itertools.zip_longest()](https://docs.python.jp/3/library/itertools.html#itertools.zip_longest) を使います。この関数を使うと、足りない値が `None` で埋められます。

```pycon
>>> for room, girl in itertools.zip_longest(rooms, girls):
...   print(f'{room} 号室には {girl} が住んでいます。')

101 号室には ヒロ が住んでいます。
102 号室には 沙英 が住んでいます。
103 号室には None が住んでいます。
```

また任意の値で埋めることも可能です。

```pycon
>>> for room, girl in itertools.zip_longest(rooms, girls, fillvalue='----'):
...   print(f'{room} 号室には {girl} が住んでいます。')

101 号室には ヒロ が住んでいます。
102 号室には 沙英 が住んでいます。
103 号室には ---- が住んでいます。
```