helloworlds

not a noun, it's a verb

【docker】2つのdocker-composeを同一ネットワークにする

今回は、dockerでコンテナ同士を連携させる方法について書いていく。

※ docker-composeのインストールなどは過去の記事を参考にしてください!

【localstack】AWSサービスをローカル環境へ - helloworlds

連携させる手段として、docker-composeというツールを用います。 既にご存知の方は多々いるかと思います。

公式の概要などはこちらにあるので一読してみてもいいかもしれません!

docker-compose.ymlというファイルへ複数DockerImageI(サービス)を定義することによって、 1つのCommandでコンテナが立ち上げるようになっています。

公式のDockerImageを利用すれば、あっという間に環境を整えることが可能です。 また、portsやvolumesなどといった設定値も合わせて定義することが可能です。

便利なので、docker-compose.yml自体を複数使用して開発することがあるかと思います。 docker-compose.ymlを複数立ち上げて、そのサービス間での通信を必要とするケースがあるかもしれません。

この記事は、ローカルで開発する際、2つのdocker-compose.ymlを立ち上げて 同一ネットワークに設定し、相互間を持たせてみたいと思います。

準備

まず、なんでも良いので2つのdocker-compose.ymlを作成します。 いちいち作成するのが面倒で、もし既存のdocker-compose.ymlを使用しているプロジェクトがあるなら そちらを使用してもいいかもしれません。

  • docker-compose.yml (1)
version: '3'

services:
  localstack:
・
・ なにか適当に設定を記述
・
  • docker-compose.yml (2)
version: '3'

services:
  nginx:
      image: nginx
・
・ なにか適当に設定を記述
・

新しいネットワークを作成する

今回、2つのdocker-composeを繋ぐためのネットワークを作成します。

その前に現在のネットワークを確認してみましょう。

$ docker network ls

NETWORK ID, NAME, DRIVER, SCOPEの列が出てきたかと思います。 心当たりのないネットワークは、コンテナを立ち上げた際に自動で生成させたネットワークです。

さて、ネットワークを作成します。 任意のネットワークをつけましょう。 オプションのdriverを指定しないと、bridgeになります。 もう1つ、overlayを指定できます(Docker エンジンが動作する複数のホスト上に渡す)。 overlayは、いくつか条件を満たさなければならないため、今回はbridgeで問題ないです。 詳細は公式を確認!

$ docker network create --driver bridge <network_name>

作成したら、もう一度docker network lsをしてみて作成されていたら大丈夫です。

ネットワークの確認

作成したネットワークの詳細を確認しいきます。 上記で作成した名前を、network_nameに指定します。

$ docker network inspect <network_name>

すると、以下みたいなのが出力されるかと思います。

[
    {
        "Name": "network_name",
        "Id": "e4c82b4f54286624dac00444d9b183353fdc15ced6df873dd86sdd99a4cd62ee",
        "Created": "2018-05-28T03:07:27.101555731Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.26.0.0/16",
                    "Gateway": "172.26.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

Containersの項目にはまだ何も指定がないことが確認できます。

docker-composeファイルにnetworksの指定を追記する

ネットワークの作成ができたので、次はそれぞれ2つのdocker-compose.ymlファイルに networks定義を追記していきます。

  • docker-compose.yml (1)
version: '3'

services:
  localstack:
・
・ なにか適当に設定を記述
・
      networks:
         - network_name
networks:
  network_name:
    external: true
  • docker-compose.yml (2)
version: '3'

services:
  nginx:
      image: nginx
・
・ なにか適当に設定を記述
・
    networks:
      - network_name
networks:
  network_name:
    external: true

やっと立ち上げてみる

それぞれ、docker-compose.ymlがあるディレクトリで以下を実行。

$ docker-compose up

そして、localhost:<任意のport> ブラウザでアクセス!

問題なく表示されていれば完了です!

※ もしportがわからなくなっちゃったみたいな人は、docker psして PORTSの項目を確認してみましょう。

もしかすると、指定したportと違うportが開いている!ということがあるかもしれません。 そういうときは、docker-compose.yml内の各サービスにnetworks名の定義を設定をすると任意のportで大丈夫みたいです。

Tips

コード内でコンテナ名が使用できる

私は、node.jsをnginxを使用して動かしていたのですが、 nodeのコード側で同一docker-compose.ymlにないコンテナに対して、 コンテナ名でアクセスできることがわかりました!

例えば、APIなんかの開発で別docker-compose.ymlを叩きたいときなど、

http://<任意コンテナ名>:4572 とかでアクセスできます。

Kitematic

DockerのGUIであるKitematicを使用することで、 なんのコンテナでどこのportが使用されているか簡単の確認することができます。 まだ使用していない人は、1度くらい見てみてもいいかもしれませんね!

以上

【VR】VRをおさらい

ちょーーっと最近VRに関心が湧いてきました。 なのでちょっと歴史なんかを勉強しようかと思います。

参考にしたのはこちらの技術書。

UnityによるVRアプリケーション開発 ―作りながら学ぶバーチャルリアリティ入門

VRとは

VR (virtual reality)とは、 一般的にコンピュータによって生成された3D環境のシミュレーションのことです。

VR自体は新しい技術ではないようです。 学術研究や軍事機関では数十年も前から研究や開発が行われているようです。 (まあ、なんとなく想像はつきますね)

ちょっと歴史

1966年 アイバン・サザランドは最初のヘッドマウントディスプレイを発明されたそうです。

f:id:o21o21:20180527153019j:plain

2012年 Oculus VR LLCの創業者である Palmer Luckeyは簡易ヘッドマウントディスプレイのデモを披露。 彼はDoomなどの有名なゲーム開発者のJohn Carmackと意気投合、後にOculus Rift Developer Kit 1をリリース。

これがFacebookザッカーバーグの目にとまりFacebook傘下というかたちになったそうです。

なるほどなるほど、 だからOculus GoはFacebookから提供されていることになっているのか。

ヘッドマウントディスプレイ

デスクトップVR

WindowsPCやMacLinuxといったコンピュータにケーブルで接続され、ヘッドセットより重いグラフィックスを処理します。 なので、ヘッドマウントディスプレイ(HMD)は、モーションセンサーの入力を持つディスプレイ機器というかんじです。

モバイルVR

2つのレンズとモバイル端末を収める簡易なデバイスから成ります。

ARとの違いとは??

簡単に説明すると、 ARでは、あなたは手のひらサイズの飛行機を自分の手のひらの中に見ることができるでしょう。 VRでは、飛行機の中に直接入り込むことができ、機内から外を眺めたり、機内を歩き回ったりできることでしょう。

AR(仮想現実)は、コンピュータが生成したCGIを現実世界の視界の上に重ね合わせるものです。 ポケモンGOのARでポケモンをゲットするときなんかがそうですね。

CGIが常に現実世界の物体や人に合致し配置され、尚且、レイテンシーをなくすことが大きな課題となっているようです。

VR体験での種類とは

ジオラマ

3Dシーンを構築し、三人称視点で観察します。

一人称

自分がアバターとなってシーンに没入し、自由に動き回ったりできます。

インタラクティブなバーチャル環境

オブジェクトとやり取りすることができる。物理法則もあって、オブジェクトはユーザーに対して応答も返します。

レールの上

席に座って環境の中を移動します。

メディア

360度全方位、見渡すことができます。

ソーシャルVR

複数のプレイヤーが同じVR空間に入ってコミュニケーションをはかります。

まだまだVRに関してはスマホのように日本中で普及している機器ではないよね! というのが私の感想です。 よって、今のうちに手をかけ、情報収集し、開発してみることが将来的に大きな財産になるかもしれないと思い、

先日、Oculus Goを購入しました!笑

届いたら色々試してみたいことや開発したいので、合わせてブログでも更新しようかと思います!

以上.

【CTF】Pythonで暗号を解く?!

過去に中古で購入したとある本で見かけたCTFという、 コンピュータ分野におけるセキュリティ分野における競技があること知った。

その中からおもしろい問題を見つけたので、 今回はそちらを取り上げてみる。

使用する言語は、Python

なかなか問題のファイルを見つけ出すのに苦労した... 5年前くらいの問題みたいなので...

ただ、知っておくとおもしろいと思うところがありました。

今回使用するファイルですが、ブログ内では紹介しません。 もし知りたい方がいましたらコメントなどで教えてください! (※ ただし元が信用できるダウンロード先ではないかもしれないということを覚えておいてください。)

いざ、やってみる

まず、問題で使用するファイルをダウンロード。

そのファイルをfileコマンドで形式を調査する。

$ file sample01
sample01: PNG image data, 19025 x 1, 8-bit/color RGBA, non-interlaced

するとファイルは画像ファイル?っぽいかんじ。PNGだな〜。

一旦macのFinderでファイルをダブルクリックしプレビューで表示してみた。

f:id:o21o21:20180527140511p:plain

「ん? なんもうつってないのか?」

もうお気づきの方はいると思いますが、この画像ファイルは先ほどコマンドかけたときに出力されている通り、 サイズが19025 x 1の画像ファイルだ。

だから真っ暗。 試しに拡大してみる。

f:id:o21o21:20180527140754p:plain

「おお!なんか1ドットで幅が長いなんかでてきた!」

よく見てみるとある規則に基づいて黒い線と青い線が入っている。

「これはまさに暗号じゃねえか」と少しテンションがアガるwww

ここからはもう知っているか知らないかの問題になってくる。

こうした画像データを扱うのにはPythonがいいのでは?

 #!/usr/bin/python
  
from PIL import Image
 
y = 25
orig_img = Image.open('sample01')
img  = Image.new('RGB', ((19025/y, y+1)))
img.putdata(orig_img.getdata())
img.save("new_sample01.jpg")

7行目、オブジェクト,imgを新たに作成。 RGB形式で縦y, 横19025/yドットとする。 この25を変えれば縦幅の違う画像ファイルを生成できる。

さて実行。 

$ python sample01.py 

「おぉぉぉ!」

f:id:o21o21:20180527144139p:plain

「アイ ラブ ミー??」

なんか変だな。数字意味不明だ。

数値を変更する。

f:id:o21o21:20180527144439p:plain

右側に青い線が斜めにはしっているのがわかる。 この青い線を真っ直ぐにしてあげる必要がある。

#!/usr/bin/python

from PIL import Image

x = 450
y = 10025

orig_img = Image.open('sample01')
img  = Image.new('RGB',((x, (19025/x)+1)) )

for i in range(y):
    print orig_img.getpixel((i,0))
    i += 1

img.putdata(orig_img.getdata())
img.save("new_new_sample01.jpg")

さあ...

f:id:o21o21:20180527150001p:plain

「おお〜 バッチリ」

出力された以下の部分が青い線のところっぽい。

(16, 156, 239, 19) (16, 156, 239, 255)

コードの作成や参考記事を見たりしましたが、けっこう理解に時間がかかりました。 ただ、こういうこともできるとか1度でも実際に自分でやってみると、 今後に役立ちそうなかんじです。

【vim】NERDTreeでディレクトリをツリー表示する

最近Twitterなどでvimの需要が低くなってきているなんてことを見聞きします。 私も若い方なので、Atomとか近年リリースされている新しいエディタを使用することが多々あります。

操作を熟知したり、プラグイン追加したりすれば、ほんと便利に使用できますね!

私が在籍していた2、3社の先輩方たちはvimemacsを使用していることが多かったです。 大体皆さん年齢的に、33〜55歳くらいの方でした。

皆さんに、「なんでemacs使っているのですか?」とか質問していました。

答えは、「私の先輩が使用していたから。」とか「サーバサイドずっとやっているからね〜。昔はよく物理サーバに繋いでたよ〜。」

たしかに先輩達が若手の頃は、今ほど性能の良いIDEとかなかったのか〜とか考えました。

それはそうと、 それよりわたしが感激したのは、操作のスピードでした。

もうほんとに早かったです。笑

そんな姿を見て私はvimを使っていこうと考えました。

他のエディタも使用することはあります。 ただ、操作性の良さから、少しの修正とか個人的に何か開発する時とかそういう時にvimを選択するようにしています。

そこで今回は、ディレクトリのツリー表示させるvimプラグインを導入してみようかと思います。

この記事では、NERDTreeを導入します。 ※ そしてこの記事では、細かい操作は説明せず、私が使用してきて特にこれだけ覚えてればいいんじゃないかというものだけ記述します。

準備

前提として、NeoBundleが導入されていることが必須になります。

この導入手順は、過去のvim-goの記事があるので、 そちらを参考にしてみて下さい。

見出しの以下を実行していけば問題ないでしょう。

  1. NeoBundle
  2. NeoBundleインストール
  3. .vimrcに記述

o21o21.hatenablog.jp

NERDTreeをインストール

上記で開いた、.vimrcファイルに以下を記述します。 記述する位置は、NeoBundleFetchの下くらいです。

NeoBundle 'scrooloose/nerdtree'

記述し保存したら、適当なファイルをvimで開きます。

そして、以下をvimコマンドを実行します。

:NeoBundleInstall

これでNERDTreeがインストールされるかと思います。

実際、これで完了なのです。 が、ツリーを開く際に:NERDTreeToggleこのコマンドを逐一実行させなければなりません。 長いし、スペルを覚えるのも面倒なのでショートカットキーを.vimrcに記述しましょう!

おまけで隠しファイルをデフォルで表示させるオプションも合わせて追記します。

" コントロール+e でツリー表示
nnoremap <silent><C-e> :NERDTreeToggle<CR>

" デフォルトで隠しファイルを表示
let NERDTreeShowHidden = 1

これで、Ctrl+e とするとツリーが表示されるかと思います。

あとは、色々な操作がありますが、私が使用しているシンプルな操作のみ書きます。

コマンド 動作
Ctrl+e ツリーを開く
Ctrl+w+w ウィンドウの移動(ツリーと開いているファイル間)
i ファイルを水平分割して開く
s ファイルを垂直分割して開く
:q 閉じる(ツリーもファイルも同様)

ツリー上の移動は、いつものh j k lで大丈夫。

これだけしかないですが、実際vimだと他にも色々覚えるコマンドが多いので私は最低限。。 他にも知りたい場合はググればけっこう出てくるので、そちらを参照して下さい!

以上

【localstack】AWSサービスをローカル環境へ

少し更新が途絶えてしまいました...

まあ、気を取り直してまた更新を続けます。

今回は、localstackというクラウドアプリを開発する際のテスト/モックツールです。

f:id:o21o21:20180522142528p:plain 画像元(https://localstack.cloud/)

簡単に言ってしまうと、AWSサービスアカウントを作成することなく無償でテストできる みたいなかんじです。

さっそく準備からやっていきます。

環境: macOS

Docker

dockerとdocker-composeというものが必要になります。 以下から、docker for mac をインストールします。 docker for macには、docker-composeも入っているかと思いますので便利です。

勿論、個別にインストールすることも可能ですので、 「dockerだけ入っている!」という方は、こちらを参考にしましょう!

docs.docker.com

AWS Cli

俗に言うAWSコマンドというものがあります。 AWSのマネジメントコンソールでは、基本的にほぼAPIで操作しています。 なので、cliコマンドを実行し、使用しているサービスを制御やコントロールすることが可能です。

AWS サービスを管理するための統合ツールです。ダウンロードおよび設定用の単一のツールのみを使用して、コマンドラインから複数の AWS サービスを制御し、スクリプトを使用してこれらを自動化することができます。

引用: AWS公式

まず、cliをインストールするにあたって、Pythonpipがインストール使用できることを確認しましょう。

$ pip --version

Pythonのヴァージョンが3.6以上(公式の例が3.6であるため)であることを確認できたら、以下を実行。

$ pip3 install awscli --upgrade --user

cliがインストールできたか確認しましょう。

$ aws --version

バージョンがきちんと表示されたら完了です。

aws configure

cliコマンドを使用するにあたって、cliコマンドを使用するprofileやregionなどを設定します。

私の場合は、ホームディレクトリ配下に.aws/というディレクトリを作成して、 その配下にcredentialsとconfigファイルを置いています。

今回は、あくまでローカルで動作させるだけですので、それぞれのファイルに設定しなければならない 設定値はほぼダミーで構いません。

aws configureコマンドで、オプションにporofile名(今回はわかりやすくlocalstack)を指定し実行させ、 アクセスキーなどを入力していきます。

$ aws configure --profile localstack
AWS Access Key ID [None]: dummy
AWS Secret Access Key [None]: dummy
Default region name [None]: us-east-1
Default output format [None]: json

リージョンなのですが、日本ならap-northeast-1を指定しがちですが、 localstackのデフォルトがus-east-1 ですのでアメリカを指定します。

ここまでできたら、あとはlocalstack のインストールです。

localstackをインストール

任意のプロジェクトルートにいって、以下を実行。

$ git clone https://github.com/localstack/localstack.git

そすると、docker-compose.yamlというファイルが確認できるかと思います。

このファイルがあるところで、docker-compose upが実行かのうです。

$ docker-compose up

複数のportでlocalstackのAWSサービスが開始され、Ready... がでたら、localshotのport8080をブラウザで開いてみましょう。

http://localhost:8080

ダッシュボードが確認できたら完了です!!!

これで模擬的にAWSサービスを使用できます。

cliを使用するにあたって、既にクレデンシャルなど指定している人は、 本番環境や会社のアカウントに影響がでないように気をつけましょう!

cliでエンドポイントを指定したりて色々試せるかと思います。 機会があれば、サンプルがてらその記事も書けたらと思います。

以上.

【Python】PandasでExcelファイルを読み込んでtsvファイルにおこす

今回はタイトル通り、 Excelファイルから新たにtsvファイルを生成させるコマンドラインツールなるものを作成しました。

よく会社でG suiteでデータをスプレッドシートなんか管理されているかと思います。 だんだんデータが溜まっていくと、開くのに時間がかかったり、大事な情報だときちんとヴァージョン管理したいと思ったりしたことがあるかと思います。

また、スプレッドシートだと誰かが変更したりすると履歴が追いにくい... (※ 最近?また履歴確認機能がアップデートされましたが、「なんかな〜 ん〜 見にくいというかそもそも履歴とか見ない」とかとか..) ミスってコピペする場所間違えたのに気づかない... とかあるかと思います。

そこで、Githubで管理してみるか!となったのはいいものの、 GithubだとExcelファイルそのまま管理させても表示されないですよね。

なので、Githubでは、csv/tsvファイルに対してRenderingされる機能があるのです。 まあ既に知ってる方もいるかと思います。

さて、Excelファイルからcsv化しよう!となるわけです。

保存するときに拡張子を変更すれば問題ないです。 ただ、「どうせ管理するなら、このファイル○○毎に分けて管理しない?」ってなります笑

ならないならいいんです笑 ただ、スプレッドシートExcelファイルを読み込んで、新たにある規則に基いてcsv化しようってなって、 さらにデータ(セル)が多いと中々手作業だと時間が取られる作業になってしまいます。

なので、Pythonを使ってあるワードに対して、ワードにマッチした行をヘッダー付で抽出し、新たに(私の場合は)tsvファイルを生成しようというわけです。

Pythonコマンドラインツールみたくなるようにしました。

イメージとしては以下。

$ python3 create_tsv.py --file target.xlsx --word target_word

こんなかんじでローカルで実行すると、同階層にtsvファイルを生成され、 そのままGithubにあげるとこんなかんじで参照できるようにします。

f:id:o21o21:20180426161834p:plain

ちなみにこのRendering機能では、フィルタできる機能もデフォルトであるのでシンプルに使えて便利です。

さて、実行環境を確認していきます。

開発環境

言語: Python (version 3.5.0) Pythonのversionを簡単に切替できるツールは、過去記事にあるので、よかったら観覧してみて下さい。 OS: macOS 主なlibrary: pandas (version .22.0), xlrd

準備

Excelファイル

今回は元となるExcelファイルが必要です。

想定するExcelファイルはこんなかんじとします。

xx xx
No 列一 列二 列三 列四 列五 列六
1 aaaa bbbb cccc dddd eeee ffff
2 aaaa bbbb cccc dddd eeee ffff
3 zzzz bbbb cccc dddd eeee ffff
4 aaaa bbbb cccc dddd eeee ffff
5 zzzz bbbb cccc dddd eeee ffff
6 aaaa bbbb cccc dddd eeee ffff
7 aaaa bbbb cccc dddd eeee ffff

ちょっと分かりづらいですが、上2段がheader(ヘッダー)です。 xxも何かしらのheaderだと思って下さい。

このheaderが2つある(しかもheaderの上段と下段でheader数が相違している)ことで私はハマりました... それは後ほど説明します。

こうしたExcelファイルを置いておきます。

Pythonファイル

とりあえずsample.pyとしてPythonファイルを作成します。

ライブラリインストール

$ pip3 install pandas
$ pip3 install xlrd

pandas

今回pandasという、主にデータ解析を得意とするライブラリを使っていきたいと思います。 知ってたのですが、ちゃんと触る機会がなかったので、面白かったです!

xlrd

xlrdは、Excel(xls)のデータをPythonで読むためのライブラリです。 xlrd自体のExcelデータの抽出順序は、book → sheet → cell です。

準備はこれくらい。

本来、requirements.txtを作成しておけばいいですが、今回はそんなボリューム感あるコードでないので割愛します。

コード書いていく

さきほど作成したsample.pyを開いて、さっそくコード書いていきます。

1. ライブラリの定義とコマンドラインオプション

まずは、ライブラリのimportから。

# coding:utf-8

import pandas as pd
import sys
import argparse

pipでインストールしたライブラリを定義しておきます。

続いて、イメージ通り作成するとなると、コマンドラインからオプションを指定することで 後々使い勝手がよくなりますので、オプションを受け付けるようにします。

ここではargparseを使います。 コードがどんな引数を期待するのか定義するためです。 もし、想定外の引数がわたってきたらエラーを発生させます。

def get_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("--file", type=str)
    parser.add_argument("--word", type=str)
    arg = parser.parse_args()
    return(arg)

--file--wordをオプションで受け付けるようにしました。

argをreturnしているので、

option = get_args()

として、option.fileみたいにコード内で使えます。

2. Excelファイルを読み込んでシートを確認する

まずは、Excelファイルを読み込みます。

# get Excel file from Command line
excel_file = './' + option.file

# Open excel_file (xls,xlsx)
input_file = pd.ExcelFile(excel_file)

ここでpandas登場です。 pd.ExcelFile()で、ExcelfileオブジェクトとしてPythonから参照できます。

そして、シートを取得します。 もちろんExcelファイルによっては、シートが沢山あるものも存在しますよね。

# get Sheets
sheets_name = input_file.sheet_names

これでsheets_name[0]とかやってシート名を参照します。

3. DataFrameとして対象のシートの読込

ここでparseという関数を使用します。 こうすることで、対象のシートをDataFrameとして取得します。 パラメータはこれ以外にもあるので、公式を参照しましょう。

df_sample = input_file.parse(sheets_name[0],
                              skiprows=1,
                              header=[0,1],
                              index_col=0,
                              names=headers,
                              usecols="B:E,G:H" 
                              )

第一引数には、対象シートを指定します。

  • skiprows 対象シートの一番上の行から、いくつ読み飛ばすか指定します。 今回は1行飛ばすかんじです。

  • header skiprowsでスキップしたところから、headerが何行あるか(もしくはheaderの有無)を指定します。 今回は、headerが2行ある想定なので[0,1]を指定。

  • index_col indexとするcolumn名を指定します。 今回は、No.の列をindex扱いにしようかと思います。

  • names カラムの名前を指定します。 今回だとheadersという変数を指定しています。後ほど詳細を説明します。

  • usecols 特定の列を読み込む場合に指定します。 今回だとB:E,G:Hなので、ExcelファイルのB〜E列とG〜H列を抽出させます。

これでDataFrameとして色々なメソッドを使用してアクセスできるようになりました。

4. 指定したwordにあったデータを抽出する

コマンドラインからオプションで指定するword(例: --word zzzz)のみを抽出する必要があるので、 DataFrameにアクセスして対象を検索します。

今回は、列1のzzzzという文字列を検索すると想定します。

df_ordered = df_sample[df_sample.ix[:, 0] == option.word]

データにアクセスする方法として、今回はixを使用します。 開発中、locilocも使用したのですが、headerが2行あることでなのか?うまくいかずでした...

こちらが参考になりました。

行ラベルを指定せず、列ラベルを指定します。(intで)

5. 不要な列を除外

列4を除外する想定です。 dropメソッドを使用します。 columnsを指定することで簡単に除外できます。

df_dropped = df_ordered.drop(columns=[('', '列四')])

いざtsvファイルとして吐き出す

to_csvメソッドですが、tsvはタブ区切りなので問題ないです。 パラメータsepで指定します。

output_file = 'output_' + option.table + '.tsv'
df_dropped.to_csv(output_file,
                sep="\t",
                header=True,
                encoding="utf-8"
                )

ここまでできればもう出力されます。

が、1点記事上部で述べていたheaderが2行あること(header数がheader同士で相違)でおこる問題がありました。 私がまだpandas初心者なのでうまい方法があったかもしれませんが、詰まったのでメモです。

3. DataFrameとして対象のシートの読namesの指定を変数にしました。 結果から言うと、これが解決策でした。

どういうことかと言うと、 基のExcelファイルでheaderが2行あって、尚且つheader数が一致しないと headerがMultiIndexとして扱われていました。

そのせいでコマンドラインから指定するwordとの判定にも苦労しましたし、 不要な列の削除するdropメソッドのところも苦労しました。

drop(columns=[('', '列四')])となっていますが、この正体は以下になります。 (これがheaders変数)

headers = pd.MultiIndex.from_tuples([('', '列一'), ('', '列二), ('xx',列三'), ('xx',列四'), ('',列五')])

pandasのfrom_tuplesを使いました。 これで明示的にMultiIndexの階層化するわけです。 今回はparseメソッドのパラメータに直接ぶち込みました笑 本来であれば、DataFrameにする際のcolumnsパラメータでうまいこと指定するようです。

というわけで、headers変数は、ファイルの上部に定義しておきましょう!

さて、これで以上です。 あとは、コマンドラインからpythonコマンドを実行して、 生成されたtsvファイルをそのままgithubにあげましょう!

pandasを初めてちゃんと触りましたが、非常に面白かったです。 これからも少しずつ触ってもう少し慣れたらと思います。

【Go】helloworldで最も基本的な構文を抑える

Golangの"HelloWorld"で最も基本的な構文を覚えていきたいと思います。

今回参考にするのはこの技術書です!

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

versionですが、私は1.9.2使用します。

golangでは、プロジェクト毎にversion管理したい場合、gvmというものがあるので、 そちらで切り替えて挙動を検証することが可能です!

過去記事でgvmのインストールも紹介しているので宜しければ観覧してみて下さい!

o21o21.hatenablog.jp

さっそく基本構文に...と、いきたいところですが、 きまりのそもそも系を先にまとめます。

Go

Go言語は、Googleによって開発されたプログラミング言語である。 2009年に発表されたので、まだまだ新しい言語ですね~。

そして、コンパイル型の言語です。

仮想マシンを備えていなく、実行環境が不要です。 オーバーヘッドが少ないことも1つの特徴でしょう。

いろんなOSにおける最も標準的な共有ライブラリさえ依存しない実行ファイルを生成します。

よく並行処理なんて言葉を見聞きするかと思いますが、 Goの場合は、ゴルーチン(goroutine)という並行処理の枠組みになります。 OSが提供するスレッドよりも小さな単位で動作するGO独自の実行単位です。 チャンネルというデータ構造を組み合わせされるようにデザインされています。

色々特徴がありますが、ネイティブコードにコンパイルされた上で実行されるので 一般的なスクリプト言語より何十倍もパフォーマンスが高いって覚えておきましょう。笑

これくらいにしてHello Worldをします。

いきなりコード

実行環境やGOPATHに関数ことは、過去記事に記載してあるのでそちらを参照して下さい。

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello World!!!")
}

上記プログラムをhello.goというファイル名で保存。

当ファイルがあるディレクトリで、

$ go run hello.go

として、Hello World!!!と返ってきたら成功です。

go runコマンドは、ビルドプロセスをコンソール上に出力させずに直接プログラムを実行できます。

次にプログラムの中身について見ていきます。

package

package main

変数や関数などプログラムのすべての要素は、パッケージに属すということを覚えておきましょう。 また、1ファイルに複数のパッケージの宣言はエラーがかえってきます。 なので、上記のコードだと「このファイルはmainパッケージですよ」ということを宣言しています。

import

import (
    "fmt"
)

Goのライブラリは、すべて固有の名前を持つパッケージとして提供されています。 今回は「fmtパッケージをインポートします」といっていますね。

また、Goのポリシーで不要なパッケージ(プログラムで宣言されてはいるが、使用されていないパッケージ)があると、コンパイルエラーがかえってきます。

このコンパイルエラーの回避は以下の書き方で回避できます。(パッケージ名前にアンダーバー)

import (
    _ "fmt"
)

エントリーポイント

こちらはコードを書いたことがことがある人ならば問題なさそうなので飛ばします。

ビルド

$ go build -o helloworld hello.go

上記コマンドで実行ファイルが作成されます。 -oオプションは、実行ファイル名の指定ですので、私は付けることをおすすめします。

無事、実行ファイルができたらあとはそのファイルを実行するだけです!

$ ./helloworld
Hello World!!!

完了です!

この実行ファイルですが、ただHello World!!と返すだけなのに、 容量が多いことに気付きます。

これは、記事上部で説明にある通り、OSのライブラリに依存しないためです。 ランタイム本体と指定したパッケージの機能すべてが実行ファイルの中に格納されているというわけです。

以上