MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

無料のROS本『詳説 ROSロボットプログラミング』を読んで新しく学んだこと

f:id:meison_amsl:20151228110122p:plain

目次

はじめに

先日、twitter上で

無料公開された日本語のROS本が話題になっていました。

 

九州大学の倉爪研修室の方々が執筆し、公開しているようです。

 

ROSのユーザの一人として読んでみた所、

今まで知らなかったことが沢山あったので、

メモとして残しておきたいと思います。

 

indigoインストール時の注意点

公式HPには無い、いくつかの注意点がありました。

ibg11-mesa-driのエラーが出た時

下記をインストールする

$ sudo apt-get install libgl1-mesa-dev-lts-utpic

NTPの設定をする

複数台のPCでトピックをやり取りをする場合、

初めにNTPの設定をちゃんとした方が良いみたいです。

$ sudo apt-get install chrony

$ sudo ntpdate -q ntp.ubuntu.com

NTPサーバは日本の場合、下記でも良いと思います。

$ sudo ntpdate -q ntp.nict.jp

 

rqtのすべてのプラグインをインストールする

通常のdesktop-fullでは、

インストールされないrqtのプラグインを

下記のコマンドですべてインストールします。

$ sudo apt-get install ros-indog-rqt*

catkinについて

catkinの読み方

これまでなんとなくカトキンと読んでいましたが、

実はキャッキンと読むらしいです。。。(笑)

catkin_wsの中身

catkin_wsの下には下記のディレクトリがあります。

  • /build ビルド関係ファイル

  • /debel msg or srvのヘッダファイルやユーザパッケージのライブラリまたは実行ファイル

  • /src ユーザパッケージ

ROSのパッケージの命名規則

小文字でアンダースコアで繋ぐ

package.xmlの各タグの意味

<package>

パッケージの名前

変更可能だが、CMakeListsのprojectの部分と同じ名前である必要あり

<author>

開発者の名前

複数開発者がいる場合は複数のauthorタグを使えば良い

<build_depend>

パッケージをビルドする時に依存するパッケージ名を書く

<run_depend>

実行時に依存するパッケージ名を書く

<test_depend>

テスト時に依存するパッケージ名を書く

CMakeList.txtのコードの説明

メッセージファイルを生成する

下記のようにそれぞれファイル名を

指定するようになったようです。

add_message_files (FILES 
Message1.msg 
Message2.msg
)

サービスファイルも同様

add_service_files (FILES 
Service1.srv 
Service2.srv
)

ROSのシェル・コマンド

rosls パッケージ名

ROSのファイルリストを表示します

rosed パッケージ名 ファイル名

ROSのファイルを編集します。

.bashrcに下記のような設定をすることで

編集するエディタを指定できます。

export EDITOR="vim"

rostopic list

トピックのリストを表示させることができますが、

-v でトピックの型を表示

-p で配信topicのみ表示

-s で購読topicのみを表示することができます

rosbag compresss

rosbagを約1/3のサイズに圧縮できる

解凍はrosbag decompress

rosbag filter

指定したトピックのみを残して、

新しいbagファイルを作成するツール

rosbag fix

ROSのバージョンが異なり、

bagファイルが再生出来ない時に

bagファイルを修正するコマンド

catkin_create_pkg <パッケージ名> [依存パッケージ1] ..

catkinで新しいパッケージを作成する

 

catkin_make --pkg <パッケージ名>

catkin_makeではすべてのパッケージをmakeしますが、

--pkgオプションを追加すると、

特定のパッケージのみをmakeできます。

 

rospack profile

新しく作成したパッケージが

roscdなどで反映されなかった場合、

rospack profile

とすると、パッケージのインデックスを再構築できます。

 

msgファイルのみで構成されるパッケージを作った方が良い

ソフトウェアの独立性を保つために、

msgファイルのみで構成されるパッケージを作った方が良いようです。

 

ServiceをCallしたい時にはrqt Service Callerを使うと良い

rqt Service Callerを使うと、

簡単にServiceをcallできます。

 

catkinのROSパッケージはapt-getでインストールできる

ビルドシステムがcatkinなったことから、

apt-getでパッケージをインストールできるようになりました。

sudo apt-get install <パッケージ名>

 

Move itを使うことでアームのパスプランニングができる

あまりマニピュレータには詳しく無いですが、

Moveitというライブラリを使うことで、

マニピュレータのパスプランニング(モーションプランニング)が簡単にできます。

Moveit

 

最後に

結構知らないことが多かったです。

素晴らしい書籍が公開されていて嬉しいですね。

 

先日発売された下記のROS本も良かったですが、

今回の無料のROS本『詳説 ROSロボットプログラミング』は

ROSの様々な機能に関する説明がかなり詳しく説明されていると感じました。

無料ですし、ROSを使っているすべての人におすすめです。

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

飛行機などの長時間移動を楽にするためにBoseの最強のノイズキャンセルイヤホンQuietComfort 20を買った

目次

 

はじめに

出張や旅行で飛行機に乗ることが多いのですが、

この長時間のフライトを

なんとかもっと快適に出来ないかと考えていました。

 

そこで色々調べた所、

飛行機に頻繁に乗っている人の多くは、

ノイズキャンセリングイヤホンを使っており、

その中でもBoseのQuietComfort20という

インイヤータイプのイヤホンを使っている人が多いことがわかりました。

 

そこでこのBose QuietComfort20を購入してみたので、

レビューを実施したいと思います。

 

Bose QuietComfort20

BoseのQuietComfort20は、

インイヤータイプのノイズキャンセリングイヤホンです。

このQuietComfortシリーズは、

ヘッドフォン型のノイズキャンセリングヘッドフォンの

機種が多いですが、

QuietComfort20は外見はカナル型イヤホンと同じ形をした

ノイズキャンセリングイヤホンになります。

 

元々、Boseのノイズキャンセリング製品は、

飛行機のパイロットの疲労軽減のための開発されたそうです。

また現在でも、

とある航空会社のファーストクラスやビジネスクラスでは、

Boseのノイズキャンセリングヘッドフォンが

乗客に貸し出されているそうです。

 

ですので、飛行機のノイズを減らすための

ノイズキャンセリング機能としては

世界随一の技術を誇っていると思われます。

 

開封レビュー

商品の概要を伝えるために、

簡単な開封レビューを行いたいと思います。

 

購入した商品は下記のような箱に入っていました。

今年に新しいモデルになってからは、

Apple製品対応のQuietComfort20にも

iは付かなくなったようです。

f:id:meison_amsl:20151228181313j:plain

箱を開けて見ると下記のようにイヤホンが収まっています。

f:id:meison_amsl:20151228181316j:plain

ノイズキャンセリングのコントロール部分が大きいので、

下記のような専用のケースが入っていました。

ブラックを買った場合、ケースはブラックをメインにし、

ファスナーが水色のおしゃれなケースでした。

f:id:meison_amsl:20151228181322j:plain

充電用のUSB - Mini USBケーブルが付いていました。

f:id:meison_amsl:20151228181328j:plain

また、カナルイヤホンのチップは、

S,M,L (Mは元から付いています)が付属していました。

説明書を見ると、

自分の耳にあったサイズのチップを選ぶのが非常に重要らしいので、

一度、すべてのサイズを試してみた方が良いらしいです。

f:id:meison_amsl:20151228181324j:plain

本体はこんな感じです。

イヤホンの中央部にあるリモコンは、

マイクでもあり、

音楽を止めたり、早送りしたりできます。

f:id:meison_amsl:20151228181332j:plain

下記がイヤホンジャックのケーブルです。

新しいモデルでこの部分が強化されたとのこと

f:id:meison_amsl:20151228181333j:plain

電源を入れてノイズキャンセリングをONした場合、

下記のように緑のランプがつきます。

f:id:meison_amsl:20151228181337j:plain

 

飛行機でのノイズキャンセリング

先日、国内旅行で飛行機に乗ったのですが、

QuietComfort20のノイズキャンセリングの凄さを体感しました。

 

飛行機のランディング前からずっと付けていたのですが、

飛行機のエンジン音や、振動音が全く聞こえなくなり、

非常にびっくりしました。

逆に、

ドリンクサービスの時に、

一度イヤホンを外したのですが、

その時に周りがうるさすぎて、

よくこれまでこの環境で寝たり出来ていたなと思いました。

 

また、そのフライトの時に

残念ながら後ろの席に赤ちゃんが乗っていました。

時々泣いていたのですが、

泣き声が聞こえないまでは行きませんでしたが、

かなり音量が抑えられており、

そこまで気になりませんでした。

そんな状況でも読書を続けることができ、

おそらくこのイヤホン無しでは難しかったと思います。

 

数時間のフライトですが、

非常に快適に過ごすことが出来ました。

 

ソニーノイズキャンセリングイヤホンとの比較

実はBoseのQuietComfotのライバル商品として、

SONYも非常に似た形状をした、

ノイズキャンセリングイヤホンMDR-EX750

を発売しています。

ソニー SONY イヤホン h.ear in ハイレゾ対応 カナル型 MDR-EX750

ソニー SONY イヤホン h.ear in ハイレゾ対応 カナル型 MDR-EX750

 

形もかなり似ていますし、

インイヤーでノイズキャンセリングを売りにしているので、

SONYとしては対抗製品をして発売しているのだと思います。

このMDR-EX750のウリはその安さです。

BoseのQueitComfot20は35000円しますが、

SONYのMDR-EX750は20000円で売っています。

 

そこで、近所のビックカメラで

両方が視聴できたのノイズキャンセリング機能を比較してみた所、

確かに両方ともノイズキャンセリングの効果は確認できましたが、

SONYの方は周りの雑音の量が少なくなる感じである一方、

Boseの方が周りの雑音が急に無くなるような感じがしたため、

個人的にはノイズキャンセリングの効果はBOSEの方が

1ランク上であるように感じました。

 

また音楽を聞いてみたところ、

これまでの通常のイヤホンでは聞こえなかった低音が

BOSEではかなり明確に聞こえていたので、

ノイズキャンセリング機能と、音の良さから

BOSEの方を購入することにしました。

  

値段はかなり違いますが、

究極のノイズキャンセリング機能が欲しい場合は、

BOSEの方が良い気がします。

一方、ある程度のノイズキャンセリングで良いので

値段が安い方が嬉しい人にはSONYも良いと思いました。

 

モバイルバッテリーでの充電

QuietComfort20は

約2時間の満充電で16時間使用できますが、

間違えてスイッチを入れっぱなしにしていた時など、

バッテリーが不安になる時があります。

特に、長いフライトの時などは

途中でバッテリーが切れたら大変です。

 

そこでいつもスマホ用のバッテリーとして

持ち歩いているAnkerのバッテリーで

QuietComfort20を充電できるかどうか試してみた所、

無事充電できました。

f:id:meison_amsl:20151231114319j:plain

 

また、

スマホ用の1Aとタブレットの2.1Aの両方で充電できましたので、

1A以上出力できるモバイルバッテリーなら、

Ankerでなくても充電できると思います。

 

ライトニングケーブルで充電する方法

QC20の充電は上記の説明のように、

Micro USB端子が入力ですが、

いちいちMicro USBケーブルを持ち歩くのは面倒だったので、

下記のライトニングケーブルを

Micro USBに変換するアダプタを買いました。

 

下記のように、チェーン付きですが、

かなりシンプルです。

f:id:meison_amsl:20160325203646j:plain

 

試しに、先ほどのAnkerのバッテリー+ライトニングケーブル+アダプタを

使って充電してみたところ、問題なく充電できました。

f:id:meison_amsl:20160325203840j:plain

 

ちなみに、ライトニングケーブルとこのアダプタを使って、

Ankerのバッテリーそのものも充電できました。

これでMicro USBのケーブルを持たずにすみますね(^^)

   

100円で邪魔なコントローラをiPhoneに簡単にまとめる方法

QuietComfortは素晴らしい製品ですが、

一つ嫌だと思うのが、

下記の写真のようにコントローラが大きく、

iPhoneと一緒に持つと非常に邪魔だということです。

f:id:meison_amsl:20160123125945j:plain

 

気にせずにコントローラをブラブラさせてもいいですが、

ケーブルにダメージがありそうなので、

結局、iPhoneとコントローラを両方つかむ形になります。

 

下記のようなBluethothのレシーバーを使えば、

iPhoneとコントローラを切り離すことができますが、

こちらのレシーバーの充電もしないといけないので

かなり面倒ですね。

 

そこで、iPhoneとコントローラを束ねる

何か良い方法ないかなと思った所、

下記のダイソーで売っていた7cmの輪ゴムで

止めるのがいいことに気が付きました。

f:id:meison_amsl:20160123130026j:plain

 

具体的な方法は簡単で、

輪ゴムを対角に引っ掛けて、

後ろに回すだけです。

f:id:meison_amsl:20160123130042j:plain

 

そして、

その後ろの部分にBoseのコントローラを引っ掛けると、

iPhoneとコントローラが一体化して非常に持ちやすくなります。

f:id:meison_amsl:20160123130121j:plain

 

また、下記の写真のように

全面の画面は開いているので

普通に操作できます。

f:id:meison_amsl:20160123130056j:plain

 

7cmよりサイズの小さい輪ゴムだと、

iPhone6sだと対角の距離が長過ぎて

輪ゴムがきつくなってしまいました。

 

iPhone6sよりも小さいサイズのスマホの場合は、

適宜サイズを選ぶと良いと思います。

 

この方法の良い所としては、

輪ゴムはスペースをくわないので、

Boseのケースの中に入れておけば

すぐにこの方法を試せます。

 

一つ注意点として

取り外しをしている時に、

輪ゴムが飛んでいってしまうこともあるので、

注意しましょう。

 

Skype英会話でも非常に便利

QC20はマイクも付いているので、

MacやPCにQC20を繋げば、

それだけでSkypeなどでビデオ通話ができます。

 

自分は最近、Skype英会話で英語を学んでいるのですが、

myenigma.hatenablog.com

QC20を使って英会話をすると、

周りの雑音が無くなり、相手の英語が非常に聴きやすくなる気がします。

Skypeでのビデオ会議などが多い人にもQC20はおすすめです。

 

最後に

このBose QuietComfort20は

35000円とイヤホンとしては非常に高額ですが、

ノイズキャンセリング機能は驚くほど高機能です。

ですので、頻繁に飛行機に乗る人や、

出張で長時間新幹線などに乗る人、

カフェなどで勉強する機会の多い人などには

かなりおすすめです。

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

Markdown用おすすめvim設定&プラグイン

目次

はじめに

最近、ちょっとしたメモや

ブログ記事(はてなブログではMarkdownで記事を書けます)

Github上のプロジェクトのREADMEなど、

Markdownを書くことが多くなってきたので、

VimでのMarkdownの環境を整えました。

それらの紹介をしたいと思います。

 

Markdown用Vim設定ファイル:markdown.vim

自分はftpluginの機能を使って

markdownファイルを開いた時のみ設定が有効になるように、

markdown用設定をmarkdown.vimというファイルにまとめています。

(pluginは.vimrcでインストールするようになっています。)

 

下記のGithub上にアップされていますので参考にどうぞ

github.com

 

VimからMarkdownプレビューをするプラグイン: previm

github.com

previmというプラグインを使うと、

ブラウザを使ってMarkdownのプレビューを表示することができます。

 

NeoBundle 'kannokanno/previm'

 

このプラグインをインストールしたあと、

:PrevimOpen

と関数を呼ぶと、下記のようにブラウザが立ち上がり、

Markdownのプレビューが表示されます。

f:id:meison_amsl:20151229090830p:plain

   

その他のプラグインに依存しないので、

このプラグインのみを入れれば、

Markdownのプレビューをすることができます。

 

また一秒間隔でプレビューのアップデートがされるため

Markdownファイルをvimで更新すると、

自動でブラウザプレビューも更新される所が良い点です。

 

追加の設定として、

プレビュー表示のブラウザをFirefoxに指定し、

F5を押した時にプレビューが表示されるようにしています。

"ブラウザの設定"
let g:previm_open_cmd = 'open -a Firefox'

" <F5>で編集中のファイルをブラウザで表示
nmap <F5> :PrevimOpen<CR>

 

mermaidを使ってmarkdownで図を書く

先ほど紹介したprevimはmermaidという

markdownによって

フローチャートやガントチャートを書くツールに対応しています。

基本的には下記のようにmermaidタグで囲めばOKです。

```mermaid

code

```

フローチャート1

上から下向きのグラフを書く時は、

下記のようにgraph TD (Top to down)

とヘッダを書いてグラフを書きます

graph TD;
    A-->B;
    A-->C;
    B-->D;
    C-->E;

f:id:meison_amsl:20151229135329p:plain

 

フローチャート2

左から右へのフローチャートを書く場合は、

graph LR(Left to Right)と書きます。

graph LR
    A[Square Rect] -- Link text --> B((Circle))
    A --> C(Round Rect)
    B --> D{Rhombus}
    C --> D

すると下記のような図が得られます。

f:id:meison_amsl:20151229141535p:plain

ノードの形状の表し方

ノードの形状 mermaid
四角 node[hoge]
角丸四角 node(hoge)
node( (hoge) )
片方リポン node>hoge]
菱型 node{hoge}

 

リンクの形状の表し方

リンクの形状 mermaid
A --- B
矢印線 A --> B
テキスト付き線 A-- This is the text --- B
テキスト付き矢印線 A-- text -->B
点線 A-.->B
テキスト付き点線 A-. text .->B
太線 A==>B
テキスト付き太線 A== text ==>B

Markdownのチートシートを表示する

結構、Markdownの記法を忘れてしまうことが多いので、

自分用のMarkdown cheatsheetをtxtで作成し、

そのファイルをhelpで呼び出せるようにしています。

github.com

 

自作のhelpファイルを作成する方法は下記を参照下さい。

一つ注意点として、

txtファイルの一行目に

アスタリスク(*)で囲まれたヘルプファイルの名前が書いてないと、

:helpで認識されないので注意して下さい。

 

また、markdownファイルを開いている時にF6で

このヘルプファイルを見れるようにしています。

" <F6>でMarkdownチートシートを表示
nmap <F6> :h my-markdown-cheat-sheet.md<CR>

先ほどのmermaidのチートも書いておくと便利です。

Markdownが使えるツール

実はMarkdownは最近かなり一般的なフォーマットになっており、

Vim以外でもいろんなところで使うことができます。

ただ、一つ注意点として、

各アプリによって利用できるマークダウンの記法が違ったり、

同じ目的のための記法が微妙に違ったりするので、注意が必要です。

 

GitHub

基本的にGitHubのコメント欄などではMarkdownが使えます。

docs.github.com

Teams

MicrosoftのTeamsもチャット欄などでMarkdownが使えます。

support.microsoft.com

ただし表の表示や、画像の埋め込みなどはできないようなので(画像のコピペはできますが)、少し注意が必要です。

 

はてなブログ

はてなブログはブログを書くのにマークダウンを使うことができます。

hero-rin.hatenablog.com

この記事もマークダウンで書いています。

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

Python用おすすめvim設定&プラグイン

目次

はじめに

pythonコードを開発する時に、

どうしてもIDEに慣れることができなかったので、

結局vimに帰ってきました。

そこで、python用のvim設定をまとめておきたいと思います。

 

python用vim設定ファイル:python.vim

自分はftpluginの機能を使って

pythonファイルを開いた時のみ設定が有効になるように、

python用設定をpython.vimというファイルにまとめています。

github.com

 

F5を押した時に編集中のpythonファイルを実行する

自分はMATLABを使っている期間が長かったので、

F5を押した時に、

編集をしているファイルを実行するように設定しています。

" <F5>で編集中のファイルを実行
" MATLABと同じショートカット
nmap <F5> :!python %

 

Python用すごい補完プラグイン: jedi-vim

python用の補完プラグインとして、

有名なのがjedi-vimです。

github.com

インストールの方法は下記のリンクに書いてあるとおりです。

NeoBundle 'davidhalter/jedi-vim'

 

下記のようにクラスのインスタンスやメソッドを表示したり、

f:id:meison_amsl:20151227212333p:plain

メソッドの引数の型を表示してくれます。

f:id:meison_amsl:20151227224137p:plain

Kでカーソル下のオブジェクトのpydocも表示してくれます。

f:id:meison_amsl:20151227224045p:plain

また、

¥gで関数の呼び出し元に飛んだり、

¥dで定義まで飛ぶこともできます。

それ以外にも

¥rで変数名の一括変換のような簡単なリファクタリングもできます。

¥nで関係する変数を羅列することもできるようです。

 

 

自動フォーマッタautopep8をvimから使う

以前、pythonのソフトウェアテストの記事で紹介した

pythonの自動フォーマッタautopep8をvimから

簡単に実行できるように設定しています。

myenigma.hatenablog.com

 

下記の記事を元に設定しました。

" autopep 
" original http://stackoverflow.com/questions/12374200/using-uncrustify-with-vim/15513829#15513829
function! Preserve(command)
    " Save the last search.
    let search = @/
    " Save the current cursor position.
    let cursor_position = getpos('.')
    " Save the current window position.
    normal! H
    let window_position = getpos('.')
    call setpos('.', cursor_position)
    " Execute the command.
    execute a:command
    " Restore the last search.
    let @/ = search
    " Restore the previous window position.
    call setpos('.', window_position)
    normal! zt
    " Restore the previous cursor position.
    call setpos('.', cursor_position)
endfunction

function! Autopep8()
    "--ignote=E501: 一行の長さの補正を無視"
    call Preserve(':silent %!autopep8 --ignore=E501 -')
endfunction

" Shift + F でautopep自動修正
nnoremap <S-f> :call Autopep8()<CR>

" 自動保存
autocmd BufWrite *.{py} :call Autopep8()

<Shift-f>でautopepが起動し、

自動でコードをフォーマットしてくれます。

非常に便利です。

 

また、最終行で、

.pyファイルを保存した時に、

自動でAutopep8を起動するようにしました。

 

pepの文法ミスを指摘してくれるツールも沢山ありましたが、

自分で直すのが面倒だったので、

すべてautopepに任せるようにしました。

 

autopep8で直してくれないルール

基本的に上記のautopep8で自動的にフォーマットしてくれますが、

autopep8で直してくれないルールもあります。

 

これらのルールは、自分で気をつけないといけないので、

下記にまとめておきます。

  • パッケージは小文字(アンダースコアを使ってはいけない): ham

  • モジュール(ファイル名)はスネークケース: hamegg.py

  • クラス名はCamel case: class TestClass():

  • 関数名はSnake case: def cook_ham()

  • 定数は大文字 SNAKE=1.0

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

PythonのデフォルトGUIモジュールTkinterを使用したシンプルなGUIライブラリを作った

目次

はじめに

自分はCUI好きなので、

あまり個人的なツールにGUIは不要だと思っていましたが、

やはりファイルを選択させたり、

様々なオプションを選択させたり、

各パラメータに値を入力させたりしたい時には、

シンプルなGUIインターフェイスがあるといいなと思っていました。

 

そこで今回、Pythonのデフォルトモジュールである

TkinterというGUIコンポーネントを使うことにより、

上記のような簡単なGUI処理ができるライブラリを作成したので

紹介したいと思います。

 

シンプルなGUIライブラリ: SimpleTkGUIKit

作成したGUIライブラリSimpleTkGUIKitは

下記のGithubリポジトリで管理されています。

github.com

 

インストール方法

インストール方法はpipをインストールしていれば、

下記のコマンドでインストールできます。

sudo pip install SimpleTkGUIKit

使い方

インストールした後は、

下記のコマンドでモジュールのクラスをインストールして下さい。

from SimpleTkGUIKit import SimpleTkGUIKit 

GetFilePathsWithDialog

この関数は、

OSのGUIウインドウを使って、

選択したファイルのパスを取得することができます。

fileList=SimpleTkGUIKit.GetFilePathsWithDialog()
print fileList

下記のようにfileTypesを指定することで、

指定した拡張子のファイルのみを選択させることができます。

fileList=SimpleTkGUIKit.GetFilePathsWithDialog(fileTypes=[('CSV Files', '.csv')])
print fileList

GetRadioButtonSelect

これは選択オプションをリストで渡すことにより、

ラジオボタンによるオプション選択を可能にする関数です。

(selected,index)=SimpleTkGUIKit.GetRadioButtonSelect(["sample a","sample b","sample c"])
print selected

上記のようなコードを実行すると、

下記のようなラジオボタンのGUIによって、

一つのオプションを選択させることができます。

f:id:meison_amsl:20151226212207p:plain

オプションを選択したあと、OKボタンを押すと

選択されたオプション名とリストのインデックスが返り値となります。

 

また、下記のようにGUIウインドウの名前や、

ラジオボタンのラベルを指定することもできます。

(selected,index)=SimpleTkGUIKit.GetRadioButtonSelect(["Red","Green","Blue"],title="Color Select",msg="Please select color")
print selected

f:id:meison_amsl:20151226212223p:plain

GetListSelect

この関数はリストGUIによってオプションを選択できる関数です。

GUIがリストになるだけで、

基本的には上記のラジオボタン関数と使い方は同じです。

print "GetListSelect"
(selected,index)=SimpleTkGUIKit.GetListSelect(["sample a","sample b","sample c"])
print (selected,index)

f:id:meison_amsl:20151226212234p:plain

先ほどと同様に、ウインドウの名などのオプション指定もできます。

(selected,index)=SimpleTkGUIKit.GetListSelect(["sample a","sample b","sample c"], title="Select sample", msg="Please select sample")
print (selected,index)

f:id:meison_amsl:20151226212243p:plain

GetCheckButtonSelect

こちらはチェックボタンによって

オプションを設定することができる関数です。

これまでのラジオボタンやリストのGUIと異なり、

複数のオプションを指選択することができます。

print "GetCheckButtonSelect"
optList=SimpleTkGUIKit.GetCheckButtonSelect(["sample a","sample b","sample c"], title="Select sample", msg="Please select sample")

f:id:meison_amsl:20151226212254p:plain

この関数は、引数として与えたリストに対して、

選ばれたかどうかを表す真偽値を組み合わせた辞書型を返します。

 

GetEntries

この関数は、任意のstring型を入力させることができるGUIツールです。

下記のコードのように指定された文字列に対して、

一行の文字列を入力させることができます。

print "GetEntries"
dataList=SimpleTkGUIKit.GetEntries(["x","y","z"], title="set entris", msg="Please set entries")
print dataList

f:id:meison_amsl:20151226212306p:plain

文字列なので、様々なパラメータを入力させることができます。

当然、数値も入力できますが、

返り値としてはstringで返ってくるので

数値への変換はクライアント側でする必要があります。

  

PyPIのライブラリページ

本ライブラリのPyPiのサイトは下記のURLです。

SimpleTkGUIKit

 

Licence

本ライブラリのライセンスはMITライセンスとしています。

MIT

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

ROSにおける様々なエラーを管理するデフォルトツールdiagnostics入門

目次

 

はじめに

この記事は2015年ロボットアドベントカレンダーの22日目の記事です。

qiita.com

 

ROSの様々なエラーを管理するデフォルトツールdiagnostics

ロボットにとって、

ハードウェアやソフトウェアのエラーを

瞬時にハンドリングすることは必須だと思います。

 

そこで便利なのが、

ROSのデフォルトツールであるdiagnosticsです。

 

今回は、このdiagnositcsの

基本的な使い方について説明したいと思います。

 

diagnosticsの概要

diagnositicsは、

ハードウェアなどからの情報から、

ユーザがエラーデータを

ロギングしたり、解析したりしやすくするための

ツールチェーンです。

 

エラーデータのデータフォーマット(diagnostic_msgs)や

エラーデータの送受信ツール(diagnostic_updater)、

リアルタイムにエラーデータをカテゴリー分けや解析するツール

(diagnostic_aggregator)

エラーデータを可視化するツール

(rqt_robot_monitor, rqt_runtime_monitor, OverlayDiagnostic)、

そして、そのデータを後処理で解析するツール(diagnostic_analysis)

などで構成されています。

 

続いてこれらのツールについて概要を説明します。

 

エラーデータのデータフォーマット: diagnostic_msgs

diagnosticのエラー情報は、

diagnostic_msgsのトピックとして送信します。

 

基本は下記のリンク先の

diagnostic_msgs/DiagnosticStatusにエラーデータを入れ、

DiagnosticArrayに複数のエラー情報を格納して送信する形になります。

 

基本的な設計思想としては、

DiagnosticStatusにはハードウェアidを与えることができるため、

一つのハードウェアに対して、

一つのDiagnosticStatusを割り当て、

そのハードウェアのエラーメッセージやエラーID、

もしくはエラー判定条件とその値を

KeyValueとして格納して送信する形が一般的なようです。

 

diagnosticのメッセージのステータス

diagnosticのメッセージのステータスは

下記の4つで表現されます。

  1. OK : エラー無し

  2. WARN: 警告状態

  3. ERROR: エラー状態

  4. STALE: メッセージが届かない状態

 

エラーデータの送受信ツール: diagnostic_updater

diagnosicのメッセージトピックを送信する場合は、

diagnositic_updaterというツールを使います。

c++とpythonのAPIが提供されており、

それぞれほぼ同じAPIで利用することができます。

 

オフィシャルなC++とPythonのサンプルコードの場所

dianostic_updaterを使う場合の

C++とpythonのサンプルコードは下記のリンクにあります。

 

Pythonのサンプルコード

下記は最も簡単な

diagnostic_updaterの使い方のサンプルコードです。

#!/usr/bin/env python

import roslib
roslib.load_manifest('diagnostic_updater')
import rospy
import diagnostic_updater
import diagnostic_msgs

temperature = 0

def check_temprature(stat):

    #エラー判定
    if temperature < 10:
        stat.summary(diagnostic_msgs.msg.DiagnosticStatus.OK, "Temperature OK")
    else:
        stat.summary(diagnostic_msgs.msg.DiagnosticStatus.WARN, "Too high")

    #エラー情報追加
    stat.add("Top-Side Margin", 10 - temperature)
    return stat


if __name__=='__main__':
    rospy.init_node("diagnostic_updater_example2")

    # Updaterオブジェクト作成
    updater = diagnostic_updater.Updater()

    # ハードウェア名の設定
    updater.setHardwareID("Sensor1")

    #エラー判定関数の追加
    updater.add("upper-temperature",check_temprature)

    while not rospy.is_shutdown():
        
        temperature+=0.1
        if temperature>=20:
            temperature=0

        print temperature

        #Error チェック
        updater.update()

        rospy.sleep(0.1)

 

updaterオブジェクトを作成し、

ハードウェア名を追記した後は、

エラー判定を実施する関数を作成し、

その関数オブジェクトをaddし、

メインループでupdateすれば、

自動で/diagnostic トピックをpublishしてくれます。

 

リアルタイムにエラーデータをカテゴリー分けや解析するツール: diagnostic_aggregator

diagnostic_aggregatorは、

diagnostic_updaterによりpublishされた

DiagnosticArrayのデータをカテゴリ分けし、

/diagnostics_agg というトピックで再パブリッシュをする

ROSノードツールです。

 

前述のdiagnosticメッセージは、

対象とするハードウェアの数が少ない時は

問題がありませんが、

監視するハードウェアの数が増えていくると、

管理しずらくなります。

 

そこで、このdiagnostic_aggregatorを使って、

カテゴリー分類することにより、

沢山のエラーデータを管理しやすくなります。

 

また、diagnostic_agggregatorにより

送信されたデータは

後述するrqt_robot_monitorで分かりやすく

可視化することができます。

 

diagnostic_agggregatorの使い方

基本的には、

diagnosticメッセージのカテゴリ分けを事前に

yamlファイルに記述しておき、

そのyamlファイルを読み込んで、

aggregatorノードを起動することで、

カテゴリー分けされた/diagnostic_aggというトピックが出力されます。

 

yamlファイルは下記のように記述します。

analyzers:
  temperature:
    type: GenericAnalyzer
    path: upper-temperature

まずはじめにエラーカテゴリを設定し(templeture)

あとは、それぞれのdiagnosticメッセージを登録します。

typeは、先ほど紹介したdiagnostic_updaterを使っている場合は、

GenericAnalyzerでOKです。

pathはdiagnosticメッセージの名前を設定します。

 

あとは、

下記のようにdiagnostic_aggregatorノードを起動し、

先ほどのyamlファイルを読み込むようにすればOKです。

<launch>
  <node pkg="diagnostic_aggregator" type="aggregator_node"
    name="diagnostic_aggregator" >
    <!-- Load the file you made above -->
    <rosparam command="load" file="$(find yourpackage)/launch/analyzerSample.yaml" />
  </node>
</launch>

 

diagnostic_aggregatorのより詳しい説明は

下記を参考にすると良いと思います。

 

エラーデータを可視化するツール: rqt_robot_monitor, rqt_runtime_monitor

diagnosticのデータを簡単に確認するツールとしては、

rqt_runtime_monitorとrqt_robot_monitorがあります。

 

rqt_runtime_monitor

f:id:meison_amsl:20151219162640p:plain

rqt_runtime_monitorは、

diagnostic_msgs/DiagnosticArrayのデータを表示する

rqtプラグインです。

 

上記のスクリーンショットのように、

各ステータスのメッセージの個数を表示し、

各ステータスを開くことで、

各メッセージや、その他の詳細情報を表示させることができます。

 

rqt_robot_monitor

f:id:meison_amsl:20151220101741p:plain

 

rqt_robot_monitorは前述した

diagnostic_agggregatorのカテゴリーエラーデータを

可視化するツールです。

 

冒頭の写真のように、各エラーメッセージや、

時刻ごとのエラー、ワーニング発生状況を確認することができます。

 

diagnosticsの情報をかっこ良くrvizに可視化するプラグイン: OverlayDiagnostic

f:id:meison_amsl:20151113143212p:plain

 

下記の記事で紹介されているrvizのプラグイン

OverlayDiagnosticを使うと、

diagnosticsのメッセージをかっこ良くrvizに表示することができます。

myenigma.hatenablog.com

 

下記のようにDiaplayPanelでDiagnositcArrayのトピック名(Topic)と、

Arrayの中で表示させたいステータス情報(namespace)を指定すると、

diagnosticのステータス(Error, Warn, OK)と、

ステータスメッセージを表示することができます。

またメッセージの表示する場所を指定することもできます。

f:id:meison_amsl:20151113143235p:plain

 

ステータス情報が色で表示されたり、

ステータスメッセージが流れるように表示されたりするので

非常にかっこいいです。 

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

Google Earth上にグラフを簡単に描画できるPythonライブラリgoogleearthplotを作った

f:id:meison_amsl:20151213211915p:plain

目次

はじめに

この記事は2015年Python アドベントカレンダー 21日目の記事です。

 

Google Earthによるかっこいいグラフ

あるプレゼン資料でGoogle Earthに

棒グラフを書いている人がいて、

凄くかっこいいなと思い、

色々調べた所、

下記のGE Graphというツールを使っているようでした。

 

このツールを使うことで、

グラフ情報が含まれたCSVファイルから

Google Earth描画用のkmlファイルを出力してくれるみたいです。

 

しかし、このソフトはWindows専用ですし、

自分でカスタマイズできないので、

Pythonライブラリを作ってみました。

 

Google Earth上にグラフを簡単に描画できるPythonライブラリgoogleearthplot

今回作成した、

Google Earth上にグラフを簡単に描画できるPythonライブラリ

googleearthplotは下記のGithubリポジトリで公開されています。

github.com

 

Pythonライブラリなので、

WindowsやMac, Linuxなど

マルチプラットフォームで動きますし、

Webサービスなど、

自分のPythonツールに組み込むことも簡単だと思います。

 

googleearthplotを使うのに必要なツール

今回作成したPythonライブラリ

googleearthplotは

下記の外部ツールを使っているので

インストールする必要があります。

 

simplekml

kmlファイルを作成するための

pythonライブラリです。

インストールしていない場合は、

下記のコマンドでインストールして下さい。

$ pip install simplekml

 

pandas

有名なデータ解析ライブラリです。

CSVファイルを読み込む時に使用されています。

インストールしていない場合は、

下記のコマンドでインストールして下さい。

$ pip install pandas

 

Google Earth (Pro)

このツールはGoogle Earth用の

kmlファイルを作成するので、

Google Earthをインストールする必要があります。

 

先日、Google Earthの有料版(Pro)が無料になったので、

下記のリンクからGoogle EarthのProをインストールしましょう。

 

インストール方法

googleearthplotは下記のGitHubリポジトリにて公開されています。

github.com

 

下記のPyPIに登録されているので、下記のコマンドでpipを使ってインストールできます。

sudo pip install googleearthplot

下記はPyPIのプロジェクトページです。

googleearthplot 0.0.2 : Python Package Index

 

後は自分のコードで下記のコマンドで

googleearthplotクラスをインポートして下さい。

from googleearthplot import googleearthplot

 

使い方

下記のようなサンプルコードを実行することで、

様々なグラフを描画するための

kmlファイルを生成できます。

 

点をプロットする

指定した緯度経度のポイントに

点プロットをする場合は、

下記のようなコードを実行することで、

複数の点をプロットすることができます。

# Plot point chart
gep10 = googleearthplot()
lat = [ -77.6192, -77.6195, -77.6198, -77.6208, -77.6216]
lon = [43.1725, 43.1728, 43.173, 43.1725, 43.1719, 43.1719]
for (ilat,ilon) in zip(lat,lon):
    gep10.PlotPoints(ilat, ilon, "point")
gep10.GenerateKMLFile(filepath="sample10.kml")

 

上記のコードで生成されたkmlファイルをクリックすると、

下記の様にgoogle earth上で見えるはずです。

f:id:meison_amsl:20160227223341p:plain

 

棒グラフ

棒グラフは下記のように生成できます。

#A bar plot 
gep1=googleearthplot()
lat=18.333868#degree
lon=-34.038274#degree
num=100 #bar height size
size=1  #meter
name="barsample"
color="red"
gep1.PlotBarChart(lat,lon,num,size,name,color);
gep1.GenerateKMLFile(filepath="sample1.kml")

上記のサンプルコードにより生成された

kmlファイルをクリックすると、

下記のようなグラフがGoogle Earthで表示されます。

f:id:meison_amsl:20151213212014p:plain

  

また、下記のようにaddLabelフラグを立てることで、

PlotBarChart(lat,lon,num,size,name,color,addLabel=True)

グラフにラベルを追加することができます。

f:id:meison_amsl:20151221203319p:plain

 

CSVファイルから棒グラフを作成する

CSVファイルを読み込んで、

その結果から棒グラフを作成するのは、

下記のサンプルコードで可能です。

#bar plot from csv
gep=googleearthplot()
gep.PlotBarChartsFromCSV("barchartsampledata.csv")
gep.GenerateKMLFile(filepath="sample2.kml")

すると下記のようなグラフが得られます。

f:id:meison_amsl:20151213212049p:plain

読み込ませるCSVファイルは

下記のサンプルデータのような

フォーマットである必要があります。

 

ラインプロット

Google Earth上に線を書くのは、

下記のように実現できます。

#Plot line chart
gep2=googleearthplot()
lat=[-77.6192,-77.6192,-77.6195,-77.6198,-77.6208,-77.6216,-77.6216,-77.6216]
lon=[43.1725,43.1725,43.1728,43.173,43.1725,43.1719,43.1719,43.1719,43.1719]
gep2.PlotLineChart(lat, lon, name="trajectory",color="pink")
gep2.GenerateKMLFile(filepath="sample3.kml")

すると、下記のようなグラフが得られます。

f:id:meison_amsl:20151213212109p:plain

 

高さ情報付きのラインプロット

先ほどのラインプロットに

高さ情報を付けることも可能です。

#Plot line chart with height
gep3=googleearthplot()
lat=[-77.6192,-77.6192,-77.6195,-77.6198,-77.6208,-77.6216]
lon=[43.1725,43.1725,43.1728,43.173,43.1725,43.1719,43.1719]
height=[10,40,60,80,100,120,140]
gep3.PlotLineChart(lat, lon, heightList=height, name="trajectory2",color="aqua")
gep3.GenerateKMLFile(filepath="sample4.kml")

下記のような高さ情報付きのラインプロットが得られます。

f:id:meison_amsl:20151213212132p:plain

CSVファイルデータに基づくラインプロット

CSVファイルデータに基いて、

下記のようなラインプロットをすることも可能です。

#line plot from csv file
gep4=googleearthplot()
gep4.PlotLineChartFromCSV("sampledata/lineplotsampledata.csv", name="trajectory3", color="gold", width=10)
gep4.GenerateKMLFile(filepath="sample5.kml")

すると、下記のようなグラフが得られます。

f:id:meison_amsl:20151213212228p:plain

読み込ませるCSVファイルフォーマットに関しては、

下記のサンプルCSVファイルを参考にしてください。

 

CSVファイルデータに基づく3Dラインプロット

先ほどのCSVファイルに高さ情報を入れることで、

高さ情報を含んだラインプロットを

CSVファイルデータを用いて実現できます。

#line plot from csv file with height
gep5=googleearthplot()
gep5.PlotLineChartFromCSV("sampledata/lineplotsampledata2.csv", name="trajectory4", color="orange", width=10)
gep5.GenerateKMLFile(filepath="sample6.kml")

f:id:meison_amsl:20151213212301p:plain

 

こちらがサンプル・データです。

lineplotsampledata2.csv

 

画像のオーバレイ

ロゴなどの画像データを

google earthの画面上に貼り付けることができます。

 

#Plot overlay image sample
gep8=googleearthplot()
gep8.PlotOverlayImg("img/samplelogo.png",200,300,name="logo")
gep8.GenerateKMLFile(filepath="sample8.kml")

すると下記のような画面が得られます。

f:id:meison_amsl:20151213212324p:plain

 

グラフやフォントの色のオプション

グラフやフォントの色(color変数)は、

下記の中から選べます。

'aliceblue', 'antiquewhite', 'aqua', 'aquamarine', 'azure', 'beige', 'bisque', 'black', 'blanchedalmond', 'blue', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'changealpha', 'changealphaint', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'fuchsia', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'gray', 'green', 'greenyellow', 'grey', 'hex', 'hexa', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'lime', 'limegreen', 'linen', 'magenta', 'maroon', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'navy', 'oldlace', 'olive', 'olivedrab', 'orange', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'purple', 'red', 'rgb', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'silver', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'teal', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'white', 'whitesmoke', 'yellow', 'yellowgreen'

 

最後に

次はこのpythonライブラリを使って、

CSVファイルをアップロードすると、

グラフ出力用のkmlファイルを出力してくれる

Webサービスを作ろうかと思います。

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

『実践Vim』を読んで学んだ、おすすめVimデフォルト機能36個

目次

 

はじめに

今回の記事は、2015年Vimアドベントカレンダーの19日目の記事です。

qiita.com

 

実践Vimを読んだ

Vimを学ぶ上で名著と言われている『実践Vim』が

Kindle版で50%引きになっていたので、購入して読んでみました。

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

 

『実践Vim』は様々な人に

Vimを使いこなすための一冊として紹介されています。

 

この本では、

Vimの特徴である様々なプラグインについての説明ではなく、

Vimのデフォルト機能の説明が中心ですので、

どのような環境でコーディングしていても、参考になる知識ばかりでした。

 

そこで今回は『実践Vim』を読んで知らなかった

便利なVimデフォルト機能などをまとめたいと思います。

 

『実践Vim』を読んで学んだ、おすすめVimデフォルト機能

下記がおすすめVimデフォルト機能です。

各見出しの後ろの丸括弧で囲まれた部分に

Vimにおけるコマンドも記載してあります。

 

1. Vimの書籍でよく見るコマンド表記について

いきなりVimのデフォルト機能ではないですが、

Vimのマニュアルや本を読んでいる時に、

戸惑うのがコマンドの表し方です。

 

間違いやすいコマンドの表記の方法について、

下記の表にまとめておきます。

コマンド 意味
<C-p>g Ctrlとpを同時に押した後、gを押す
cw<CR> cの後、wを押し、その後キャリッジリターン(エンター)を押す
<Leader>a リーダキー(デフォルトでは\)を押して、aを押す

 

2. コードのインデントを深くしたり、浅くしたりする

visualモードでコードを複数行選んで、

">" とするとインデントが一段深くなり、

"<" とするとインデントが一段浅くなります。

矢印の方向だという風に覚えるといいかもです。

 

= を入力するとオートでインデントを整理してくれますが、

あまりうまくいかない場合は、この手法を使うといいでしょう。

 

3. カーソルの行の前と後ろの行に新規入力する (<shift- o> or o)

ある行の前にコメントを入力したい場合には、

ある行で<Shift- o>とすると、

前の行の先頭に移動してインサートモードになります。

逆にoと入力すると、行の次の行の先頭で入力モードになります。

 

4. 数値をある一定数増やす (5<C-a>)

<C-a>でカーソルの数字をインクリメントし、

<C-x>でカーソルの数字をデクリメントするのは有名な便利技ですが、

カーソルの数字を5増やしたい時に、<C-a>を5回押すのは面倒です。

 

そんな時は5<C-a>と最初に数字を指定すると、

その分だけインクリメントしてくれます。

 

5. カーソルがある行を中央にして画面を描画 (zz)

カーソルがある行を中心として、

その前後のコードを見たい時に、

j, kで移動するよりは、

zz と入力することで、

カーソル行を真ん中にして、画面を再描画してくれます。

その行を修正するが、前後のコードを見たい時に便利です。

 

6. 計算結果を入力する (挿入モードで、<C-r>=60*28)

ある数式の計算結果を入力したいときがあります。

例えば、あるAPIで引数が秒数で28分を引数として入れたい場合は、

電卓で60×28を計算する人も多いと思いますが、

Vimの場合、挿入モードで、

<C-r>=60*28

とすることで、60*28の結果を入力することができます。

 

7. Vimで進数変換をする (bcコマンドを使う)

2進数, 10進数, 16進数を渡り歩くことは

プログラミングでは普通ですが、

あるコードに書いてある数値をすぐに進数変換したい場合があります。

echo printf("%x",600)

などで10進数->16進数はできますが、

2進数への変換などが出来ないので不便に思っていました。

 

そんな時はlinuxツールであるbcコマンドを使うと便利です。

例えば、300という数値を2進数に変換したい時は、

:r!bc

として、そのあと

obase=2

と出力の進数を指定し、

300

と入力したあと、

<C-d>

とすると、カーソルの位置に2進数の値が入力されます。

 

逆に,

2進数0110を10進数に変換したい場合は、

:r!bc ibase=2 0110 <C-d>

でOKです。

入力の進数ibaseと出力の真数obaseを上手く指定すればOKです。

 

8. visualモードの範囲指定をやり直す (visualモードでo)

visualモードである範囲を選んだ時に、

始点の部分を間違えたと気づくことがあります。

これまではescを押して、ノーマルモードに移行して、

再度選びなおしていましたが、

実はvisualモードでoを押すと、

始点にフォーカスして、始点を変更するようにできます。

 

9. テキストで表を作る時にブロックvisualモードが便利 (<C-v>)

テキストで表を作りたい時に、

ブロックvisualモードを使うと、縦線などを簡単に入力できます。

<C-v>で縦線を入れたい所を選んで、

r|と入力することで、選ばれた部分が|で縦線が描かれます。

 

ちなみに横線を入れたい場合は、

通常のvisualモードで横線を入れたい場所を選んで、

r- or r=で横線が入ります。

 

コードのコメントに簡易的な表を書きたい時があるので、

結構便利です。

 

10. Exモード(コマンドラインモード)の時に候補を表示する

コマンドラインモード(:を使うやつ)で、

途中まで入力するとタブ補完が利くのは有名ですが、

実は、<C-d>で候補がリストで表示されます。

 

こんな感じでcolorschemeの後で<C-d>を押すと、

使えるカラースキームのリストが表示されます。

f:id:meison_amsl:20151205195649p:plain

 

11. コマンドヒストリーウインドウを使う (q:)

q:と押すと、Exコマンドの履歴をまとめた

コマンドヒストリーウインドウが表示されます。

f:id:meison_amsl:20151205211400p:plain

 

過去に使ったExコマンドを再度利用したい時は、

このコマンドヒストリーウインドウを開いて、

検索し、そのコマンド行の上ですると、

そのコマンドが実行されます。

 

また、コマンドヒストリーウインドウでは、

コマンドを編集することができるので、

過去のコマンドを修正して、

新しいコマンドを実行するのも簡単です。

 

一つ注意点として、

デフォルトのvimの設定では

保存されるコマンドの履歴が20しか無いので、

下記のコマンドで保存履歴数を大きくしておくことをおすすめします。

set history=1000

 

12. 編集中のコードを実行する (:!python %)

ビックリマークで外部シェルコマンドを利用できるのは有名ですが、

exコマンドの場合、

%が編集中のファイルのパスを表すのを使うことで、

現在編集中のコードを即座に実行することができます。

 

例えば、pythonのコードを書いていて、

それを実行したい場合は、

:!python %

とすれば実行されます。

 

13. findコマンドでファイルを検索する (:find hoge.txt)

Exコマンドのfindコマンドを使うと、

簡単にファイル名を検索して、ファイルを開くことができます。

 

まずはじめにfindで検索する場合は

pathというvim変数にパスを設定する必要があります。

検索したいファイルが入っているトップディレクトリに対して、

下記のようにパスを通して下さい

set path+==/hoge/**

 

あとは、findコマンドで検索できます。

: find foge.txt

タブ補完が利くので、

途中まで入力してTabで候補から選べます。

 

14. 単語の後ろに追記 (ea)

単語の後ろに何かを付け加えたい時は、

カーソルが単語の上にある時に、

eaとコマンドすると、

単語の後ろでインサートモードになります。

プログラミングをしていると意外と使いますね。

 

15. テキストオブジェクトを使って文字を修正する (ci")

コードを書いていると、

ダブルクオーテーションに囲まれた文字列などを

修正したくなる時は多々あります。

 

そんな時はテキストオブジェクトを使うと便利です。

ダブルクオーテーションで囲まれた文字列を変更したい時は、

その文字列のどこかにカーソルを合わせて、

ci"とすることで囲まれた文字列を修正することができます。

(change inside " という風に覚えればいいみたいです)

 

同様に、シングルクォーテーションで囲まれている場合は、

ci'とすればOKです。

またコピーしたい場合はyi"とすればOKですし、

ヴィジュアルモードで選択したい場合は、vi"でオッケです。

 

16. 直前に変更した箇所にジャンプする(g;)

g;とコマンドすると、

直前に変更した箇所にジャンプしてくれます。

少し前に修正した場所を再度チェックしたいが、

検索するための単語を思い出せない場合は、

このコマンドを連打するとある程度戻ることができます。

 

ちなみに戻りすぎた場合は、

g,で戻ることができます。

 

17. ソースコードに記述されたインクルードファイルなどに飛ぶ (gf)

ソースコードに記述されている

別のインクルードファイルなどをすぐに開きたい時は、

そのファイル名の上でgf (Go to the File) とコマンドすると

そのファイルを開いてくれます。

<C-o>で元のファイルに戻ることも可能です。

ちなみにこのファイルジャンプは、

Vim変数のpathの中にあるファイルしか検索できないので、

もし見つからない時はpath変数にディレクトリを設定しましょう。

 

18. ヤンクレジスタを使う ("0p)

Vimの嫌われる所として、

削除した文字列が自動で無名レジスタに格納されて、

貼り付けようとしたら、

以前コピーしたデータが上書きされてしまうというのがあります。

 

これが結構便利な時もあるのですが、

たまにこれが起きると確かにイライラします。

 

実はvimではヤンクした文字列は

ヤンクレジスタという特別なレジスタも格納されるので、

"0pとすることで、ヤンクレジスタの文字列を貼り付けることができます。

(通常のpは無名レジスタの文字列が貼り付けられます)

 

通常のpと"0pを使いわけることで、

先ほどのイライラは減ります。

 

ちなみに挿入モードの時に貼り付けをしたい場合は、

<C-r>0 で貼り付けることができます。

  

19.クリップボードのデータを貼り付けるする ("+p)

vimのペーストは無名レジスタから貼り付けられるので、

ネットからコピーしてきたコードを貼り付けたい場合は、

OSのクリップボードから貼り付ける必要があります。

そんな時は、クリップボードレジスタを表す"+を使って

"+pとすると貼り付けることができます。

 

また、この方法で貼り付けると、

vimのオートインデントがかからないので、

ネットでコピペしたコードが、

変な形でフォーマットされることが無くなります。

 

逆に, visualモードで文字列を選んで、

"+yとすると、vimの文章をOSのクリップボードにコピーできるので便利です。

20. 編集しているファイル名を貼り付ける ("%p)

ファイルのヘッダコメントなどで、

編集しているファイル名を記入したい時があるのですが、

その時は"%という特別なレジスタを使うことで、

"%pで現在編集しているファイル名を貼り付けることができます。

 

21.マクロを使いこなす (記憶: qa -> q 実行: @a)

マクロは、vimのキーストロークを記憶して、

再度実行させる機能です。

qaとコマンドすると、recordingという文字が表示され、

(aというレジスタにマクロを保存)

任意のキーストロークをした後に、qを押して保存します。

そして、任意の行で@aとすると、(aレジスタのマクロを実行する)

先ほどのキーストロークが自動実行されます。

複数の行に同じ処理をしたい時に便利です。

 

22. visualモード選択した文字列を*で検索できるようにする

デフォルトのvimでは、

visutalモードで文字列を選択した状態で、

*(アスタリスク)を押しても、

カーソルのある位置の単語しか検索してくれませんが、

下記のvimスクリプトをvimrcに追加すると、

visualモードで選択した文字列を*で検索できるようになります。

"virtualモードの時にスターで選択位置のコードを検索するようにする"
xnoremap * :<C-u>call <SID>VSetSearch()<CR>/<C-R>=@/<CR><CR>
xnoremap # :<C-u>call <SID>VSetSearch()<CR>?<C-R>=@/<CR><CR>
function! s:VSetSearch()
  let temp = @s
  norm! gv"sy
  let @/ = '\V' . substitute(escape(@s, '/\'), '\n', '\\n', 'g')
  let @s = temp
endfunction

 

23. ファイル内置換を一つづつ確認しながら置換する(%s/hoge/fuga/gc)

オプションにcをつけると、

置換の際に確認しながら置換できます。

確認しながら, hogeをfugaに置換したい場合は下記の通りです。

%s/hoge/fuga/gc

yを押すと置換、

nを押すとスキップして次に行くはずです。

 

24. 範囲置換

関数内の変数名を変えたい時など、

ある範囲内で置換を実施したい時は

下記の方法で実施できます。

  1. vを押しヴィジュアルモードで範囲を指定する。

  2. :(コロン)を押して、

  3. s/変換前/変換後を入力してEnter!!

 

25. ある文字列を含む行のみを残して表示 (:v/hoge/d)

ログファイルなどをvimで見ていると時に、

ある特定のエラーメッセージのみが表示されている行のみを

抽出したい時があります。

そんな時は、

:v/hoge/d

とコマンドするとhogeが含まれた行のみを抽出できます。

逆に、ある文字列を含む行を削除したい場合は、

:g/hoge/d

とすればOKです。

 

26. vimでソートする (sort)

vimにはsortというツールがあるので、

うまく使うと便利です。

 

visualモードで選んだ行をsortする場合は、

visualモードで行を選んで、

コロンを押して、

sortとコマンドするとアルファベット順にソートしてくれます。

 

下記の記事のように、数値でソートすることも可能みたいです。

qiita.com

 

27. vimでスペルチェックする (:set spell)

:set spell

とコマンドするとデフォルトで英語のスペルチェックができます。

[s

]s

でスペルチェックに引っかかった場所にジャンプできます。

また、

エラーが出た単語の上で,

z=

とコマンドすると

単語の修正候補がリストで表示されます。

あとは、正しい候補の番号を押してエンターすれば、

その候補に修正してくれます。

 

ちなみに、正しい単語がエラーだと判断された場合は、

その単語の上で、

zg

とコマンドすると

辞書にその単語が追加され、

次からはエラー判定されなくなります。

逆に、エラー判定されない単語を辞書から削除して欲しい場合は、

zw

というコマンドを押します。

 

28. Vimの様々な補完 (ctrl+x)

Vimでは、ctrl+nで単語補完できるのは有名ですが、

ctrl+xで補完モードになり、

その後下記のコマンドを入力すると、

ctrl+nで補完出来ないものが補完できるようになります。

  • ctrl+x ctrl+f ファイル名補完

  • ctrl+x ctrl+l 行ごと補完

  • ctrl+x ctrl+i インクルードファイルも含めて補完

 

29. ファイルエクスプローラ上でファイルに対応したアプリケーションを起動(netrw上でx)

vimを使っている時に急に

Excelのファイルを開きたくなったりします。

そんな時は、vimのファイルエクスプローラnetrwで

目的のファイルを選択し、「x」を押すと、

そのファイルに対応したアプリケーションが自動起動します。

Excelファイルやhtmlを表示する時などには便利です。

 

30. ターミナルに移動したり、vimに戻ったりする

ターミナル上でvimでファイルを修正している時に、

急にターミナルに戻りたい時も

秒速でターミナルとvimを行き来きできます。

 

ターミナルに移動(Vimの一時停止)

ctrl + z

Vimに戻る場合は、

fg

です。

 

31. Undoを取り消す (<C-r>)

vimでは移動モードでuを押すとUndoされるのは有名ですが、

間違えてUndoをし過ぎた場合は、

<C-r>でUndoを取り消すことができます。(Redo)

 

32. 選択部分の文字を小文字⇔大文字に変換 (visualモードで選んで u or U)

選択部分の文字の小文字⇔大文字を変換したい場合は、

大文字に変換: visualモードで選んでu

小文字に変換: visualモードで選んでU

すれば速攻で変換してくれます。

 

33. 指定したURLのHTMLをスクレイピングする (:e )

指定したURLのWebページのHTMLを

vimで読み込ませたい時は、

:e とすると、

簡単にウェブスクレイピングすることができます。

 

一度だけスクレイピングして、

リンクなどを集計したい場合はこの方法が一番早いですね。

 

34. 権限が無いファイルを管理者権限で保存する (:w !sudo tee %)

重要な設定ファイルを色々いじって、

いざ保存しようとした時に、

書き込み権限がなくて保存できないことは

結構あります。

一度vimを閉じて、再度sudoで開いて、

もう一度同じ修正を打ち込んでとやると、

かなり悲しくなりますね。

 

そんな時は、

下記のコマンドを使うことで、

sudoでvimを起動していない場合でも、

管理者権限で保存できます。

:w !sudo tee %

 

35. ネットワーク先のファイルを開く (vim scp://hoge@hoge.jp/)

vimのデフォルトのファイルブラウザNetrwを使うと、

ネットワーク先のファイルやディレクトリをvimで開くことも簡単です。

下記のコマンドでNetrwでネットワーク先のファイルや

ディレクトリを開くことができます。

$ vim scp://hoge@hoge.jp/test

 

36. 今は開いているファイルと別のファイルのdiffをとる

  1. :vsplit <ファイル名> でdiffを取りたいファイルを開く

  2. :windo diffthis でdiffを表示する。

参考:

qiita.com

thinca.hatenablog.com

 

37. 似たファイル群をまとめて編集する

  1. vim *.txt などで、まとめてファイルをバッファに入れ

  2. それぞれのファイルを編集

  3. :bwで一つづつバッファを保存していく

 

38. 分割したウインドウを操作する

  • Ctrl+w T (いまいるウインドウをタブにする)

  • Ctrl+w = (ウインドウのサイズを揃える)

 

最後に

vimを使っていると、

つい便利なプラグインを探してしまいますが、

上記のようなvimのデフォルト機能を使いこなすのが

一番生産性を上げる気がします。

10年弱ぐらいvimを使っていますが、

正直、もっと早くこの本を読めばよかったなって思いました。

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

MATLAB, EigenユーザのためのPython行列演算入門

目次

 

Pythonにおける行列演算

先日紹介したmatplotlibという

グラフ描画ツールを上手く使うと、

PythonをMATLABのように

アルゴリズムのプロトタイプ作成

に使いやすくなります。

myenigma.hatenablog.com

 

また、PythonもMATLABに比べると計算演算も早いので、

そこまで計算コストが大きく無い場合、

C++でアルゴリズムを実装する代わりに

Pythonを使うことができます。

 

様々なアルゴリズムを実装する際に、

重要なのは行列演算機能です。

myenigma.hatenablog.com

 

行列演算の四則演算や、逆行列・固有値の計算を

通常のプログラミング言語で実装するは骨が折れます。

しかし、

MATLABには行列演算機能がデフォルトでbuild-inされていますし、

C++にはEigenという非常に使いやすいライブラリがあります。

myenigma.hatenablog.com

 

実はPythonにおいても、

強力な行列演算ツールがあるため、

それらを使いこなせば、

PythonをMATLABやEigen代わりに使えると思います。

 

今回の記事では、MATLABユーザ向けに

Pythonにおける行列演算ツールと使い方について

概要を説明したいと思います。

 

NumpyとScipy

Pythonで行列演算をする場合、

NumpyとScipyというライブラリを使うと便利です。

 

NumpyはNumeric Pythonの略で数値演算用のPythonライブラリです。

Numpyのメイン機能は、多次元配列(行列)の計算です。

これらのメソッドは、内部でC言語で実装しているため、

大規模な行列演算を実施しても、比較的高速というメリットがあります。

 

ScipyはScientific Pythonの略で科学計算用のライブラリです。

基本的にはNumpyをベースとして開発されており、

Numpyの高速演算メソッドを使って、

統計、最適化、積分、線形代数、フーリエ変換、

信号・イメージ処理、遺伝的アルゴリズム、常微分方程式ソルバなどの

科学計算用の機能が実装されています。

 

Pythonで行列演算を実施したい場合は、

基本的にnumpyを使うと十分かと思います。

 

Pythonで行列演算のサンプルプログラム

下記がNumpyの行列演算のサンプルプログラムです。

 

行列やベクトルの初期化

下記のように、

様々な形の代表的なベクトルや行列は

非常にシンプルな形で初期化して生成することができます。

 

print "====initialize===="
x=np.array([[1],[2],[3]])
print x
#  [[1]
#  [2]
#  [3]]

# ベクトルの繰り返し
print x.repeat(3)
#  [1 1 1 2 2 2 3 3 3]

# ベクトルの繰り返し(繰り返し方向の指定)
print x.repeat(3,axis=1)
#  [[1 1 1]
#  [2 2 2]
#  [3 3 3]]

# ベクトルそのものの繰り返しベクトル
print np.tile([0,1,2,3,4], 2)
#  [0 1 2 3 4 0 1 2 3 4]

#格子行列
a,b = np.meshgrid([1,2,3], [4,5,6,7])
print a
#  [[1 2 3]
#  [1 2 3]
#  [1 2 3]
#  [1 2 3]]
print b
#  [[4 4 4]
#  [5 5 5]
#  [6 6 6]
#  [7 7 7]]

#ゼロベクトル
print np.zeros(5)
#  [ 0.  0.  0.  0.  0.]

#ゼロ行列
print np.zeros([2,2])
#  [[ 0.  0.]
#  [ 0.  0.]]

#全要素が1の行列
print np.ones([2,3])
#  [[ 1.  1.  1.]
#  [ 1.  1.  1.]]

#単位行列 
print np.eye(2,2)
#  [[ 1.  0.]
#  [ 0.  1.]]

#対角行列
print np.tri(3)
#  [[ 1.  0.  0.]
#  [ 1.  1.  0.]
#  [ 1.  1.  1.]]

#1-5までの連続値のベクトル
print np.arange(1,5)
#  [1 2 3 4]

#三つ目の引数はベクトル間の値になる
print np.arange(1, 10, 3)
#  [1 4 7]

#-1で逆方向のベクトルも作れる
print np.arange(10, 1, -1)
#  [10  9  8  7  6  5  4  3  2]

#対角成分の抽出
print np.diag(np.array([[0,1,2], [3,4,5], [6,7,8]]))
#  [0 4 8]

#乱数の生成 (最小値,最大値,個数)
print np.random.randint(0,100,10)
#  [47 43 37  8 96 83 69 10 57 72]

 

配列の情報取得

配列やベクトルの

サイズやデータ量などの情報は

下記のように取得できます。

print "====Data Info===="
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print a
#  [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

print a.ndim ## 次元数
#  2

print a.size ## 要素数
#  9

print a.shape ## 各次元の要素数 (行数, 列数)
#  (3, 3)

print a.itemsize ## 1要素のバイト数
#  8

print a.strides ## 次の行、と次の列までのバイト数
#  (24, 8)

print a.nbytes ## 配列全体のバイト数 (size*itemsize)
#  72

print a.dtype ## 要素のデータ型(後述)
#  int64

統計量の計算

下記のように、行列やベクトルの各要素を使って、

基本的な統計量も簡単に計算できます。

print "====Statics===="
a = np.array([[1],[2],[3]])
print a
#  [[1]
#  [2]
#  [3]]

print a.mean()     # 平均 np.mean(a)
#  2.0

print a.var()      # 分散 np.var(a)
#  0.666666666667

print np.median(a) # 中央値 
#  2.0

print a.std()      # 標準偏差 np.std(a)        
#  0.816496580928

print a.ptp()      # 値の範囲(最大値-最小値) np.ptp(a)        
#  2

print a.sum()      # 総和 np.sum(a)
#  6

print a.min()      # 最小値 np.min(a)
#  1

print a.max()      # 最大値 np.max(a)
#  3

#相関係数
a = np.random.randint(0,500,20)
b = np.random.randint(0,500,20)
print np.corrcoef(a,b)
#  [[ 1.         -0.16742262]
#  [-0.16742262  1.        ]]

#ヒストグラム (頻度とビン)
print np.histogram(a)
#  (array([4, 1, 0, 1, 1, 4, 0, 2, 3, 4]),
#  array([   4. ,   50.2,   96.4,  142.6,  188.8,  235. ,  281.2,  327.4,
#  373.6,  419.8,  466. ]))

#累積和
print np.cumsum(a)
#  [ 432  827  843  891 1079 1266 1319 1419 1840 1895 1978 2024 2164 2563 2817
#  3316 3434 3856 4087 4449]

#累積
print np.cumprod(a)
#  [                 432               170640              2730240
#  131051520          24637685760        4607247237120
#  244184103567360    24418410356736000 -8166593313523695616
#  -6440774474774020096   371296731333328896 -1367094432376422400
#  -6925779795603619840  3625472610588426240 -1467160596017315840
#  5756625535741460480 -3247717509761073152 -5477727664666050560
#  7470250548101382144 -7440680422603751424]


 

基本的な行列演算

下記のサンプルのように、

固有値や逆行列など、

基本的な行列演算をすることができます。

 

print "======Matrix===="

a = np.array([[1.,0.], [0.,2.]])
print a
#  [[ 1.  0.]
#  [ 0.  2.]]

la, v = np.linalg.eig(a)    # 行列Aの固有値・固有ベクトル
print la    #固有値
#  [ 1.  2.]

print v     #固有ベクトル
#  [[ 1.  0.]
#  [ 0.  1.]]


a = np.matrix([[1,2],[3,4]])
print a
#  [[1 2]
#  [3 4]]

print a.T   #転置
#  [[1 3]
#  [2 4]]

print a.I   #逆行列
#  [[-2.   1. ]
#  [ 1.5 -0.5]]

#行列式
print np.linalg.det(a)
#  -2.0

v1 = np.array((1,0,0))
v2 = np.array((0,1,0))

#内積
print np.dot(v1,v2)
#  0

#外積
print np.cross(v1,v2)
#  [0 0 1]

#ベクトルの長さ
print np.linalg.norm(a)
#  5.47722557505

 

行列の連結

MATLABで非常に便利な機能として、

行列に次々とベクトルを連結して、

時系列のデータを格納する機能があると思います。

 

Numpyでは、

下記のサンプルコードのように、

行方向に連結する場合は、c_ (coloumのc)

列方向に連結する場合は、r_ (rowのr)

という関数で連結できます。 

# 行列の連結
b = np.array([[1],[2],[3]])
print b
#[ 0.  0.  0.]

a = np.empty(3)
for i in range(5):
    a = np.c_[a,b] #連結

print a
#[[ 0.  1.  1.  1.  1.  1.]
# [ 0.  2.  2.  2.  2.  2.]
# [ 0.  3.  3.  3.  3.  3.]]

 

また、hstack, vstackという関数を使うと同じように連結ができます。

 

CSVファイル出力

下記のように、

numpyの行列データは

簡単にCSVファイルに書き込んだり、

逆にCSVファイルから読み込んだりすることができます。

 
## CSVファイル出力

a = np.array([[1],[2],[3]])

#csv形式で保存
np.savetxt("array.csv", a ,  delimiter=",")

#csv形式のファイルを読み込み
arr = np.loadtxt("array.csv", delimiter=",")

 

MATLABユーザ向けNumpy/Scipyの使い方と注意点

下記のScipyのページに、

MATLABユーザ向けのNumpy行列演算の注意点がまとまっています。

 

上記の説明を元に、MATLABユーザ向けの

Numpyの行列演算の注意点をまとめておきたいと思います。

注意点1: 行列データの型

MATLABでは、すべての行列データは、

doubleの多次元配列として表されますが、

Numpyでは、様々な行列データの型があります。

 

Numpyの行列では、浮動小数点型以外にも

整数型やbool型なども格納できます。

 

注意点2: numpy arrayにおける行列の掛け算

numpyのarrayを

通常の掛け算オペレータ*(アスタリスク)で計算すると、

いわゆる行列同士の掛け算ではなく、

要素同士の掛け算になります。

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print a
#[[1 2 3]
#[4 5 6]
#[7 8 9]]

b = np.array([[1],[2],[3]])
print b
#[[1]
# [2]
# [3]]

print a*b
#  要素毎の掛け算
#  [[ 1  2  3]
#  [ 8 10 12]
#  [21 24 27]]

oppython.hatenablog.com

 

もし行列の掛け算にしたい場合は、

dotメソッドを使う必要があります。

print a.dot(b)
#  行列の掛け算
#  [[14]
#  [32]
#  [50]]

注意点3: インデックスが0始まり

MATLABはインデックスの始まりが1からですが

Pythonは多くのプログラミング言語の配列インデックスと

同様に0始まりです。

基本的ですが、デバックしずらいバグが

入る可能性があるので注意しましょう。

 

注意点4: 行列をスライスしたものはポインタで表される

MATLABでは、

行列からある一列を抽出した場合、

その一列はデータがコピーされ別の変数になりますが、

Numpyの場合、前述のスライスを使って

新しい変数を作っても、そのデータはポインタで

元のデータを参照していることが多いです。

 

ですので、下記のサンプルでは、

atの値を変更するとaの値も変更されてしまいます。

MATLABのようにデータのコピーをして欲しい場合は、

copyメソッドを使いましょう。

at = a[1:3,:]
print at
#  実はポインタ
#  [[4 5 6]
#  [7 8 9]]

atcopy = a[1:3,:].copy()
print atcopy
#  データのコピー
#  [[4 5 6]
#  [7 8 9]]

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

読書メモなどのEvernoteノートを定期的に振り返るための無料WebアプリRandomEverを作ったので公開しました

f:id:meison_amsl:20151128123158p:plain  

目次

 

読書メモなどを振り返ることの重要性

読書メモを取っている人は多いと思いますが、

下記の本や記事で紹介されていますが、

それらの読書メモを定期的に見直すことは

本の中身を血肉にする上で非常に重要です。

レバレッジ・リーディング

レバレッジ・リーディング

読書は1冊のノートにまとめなさい 100円ノートで確実に頭に落とすインストール・リーディング (Nanaブックス)

読書は1冊のノートにまとめなさい 100円ノートで確実に頭に落とすインストール・リーディング (Nanaブックス)

 

自分は読書メモをEvernoteで取り、

特定のノートブックにまとめていたのですが、

作りっぱなしで全く振り返りなどをしていませんでした。

 

たまにスキマ時間を有効活用するために、

オフィシャルのEvernoteアプリを使って

読書メモを振り返ろうと思う時もあるのですが、

ノートの順番が時刻や名前で並んでいるので

どの読書メモノートを読むか悩んでやめたり、

興味のあるモノばかり読んでしまうという問題がありました。

 

そこで、

Evernoteのある指定のノートブックの中にあるノートを

ランダムに取得するツールが欲しいなと思ったのですが、

有料アプリだったり、

スマホアプリの場合、

PCで見たい時に使えないという問題もあり、

良さそうなものが見つかりませんでした。

 

そこで、

指定したノートブック内の

ノートをランダムに表示するWebアプリを作って公開したので

紹介したいと思います。

 

Evernoteのアカウントを作る

下記のリンクからEvernoteのアカウントを作ることができます。

Create an Evernote Account

上記のリンクからアカウントを作成すると、

1ヶ月分Evernoteのプレミアムプランが無料になります。

 

Webアプリ RandomEver

作ったWebアプリ RandomEverは下記のリンクから利用できます。

randomever.herokuapp.com

 

今回もいつも通り、

Heroku + Bottle + Bootstrapで数時間で作りました。

myenigma.hatenablog.com

 

一番時間がかかったのはアイコンで、

Evernoteなので象をモチーフにしたアイコンにしました。

f:id:meison_amsl:20151128130252p:plain

 

Webアプリなので、

当然、PCでもスマホ(iPhone or Android)でも、

タブレットでも使えます。

もちろんどれだけ使っても無料です。

 

RandomEverの使い方

かなりシンプルなツールなので、

おそらく、わざわざ説明を書く意味も無いと思いますが

簡単に説明したいと思います。

1. RandomEverのページにアクセスする

下記のリンクからお願いします。

randomever.herokuapp.com

 

おそらく何度も使うようになると思うので、

ブックマークするか、

スマホの場合はホーム画面に設定すると良いかと思います。

 

2. Certificationボタンを押してEvernoteアプリとして認証する

下記のような画面が出たら、

Certification(認証)ボタンを押して、

Evernoteアプリとして認証して下さい。

f:id:meison_amsl:20151128131114p:plain

 

ボタンを押すとEvernoteの認証画面に飛ぶと思うので、

アプリとして承認して下さい。

 

3. ランダムにノートを取得したいノートブックを選ぶ

アプリが認証されると、

下記の画面のように自分のEvernoteアカウントの

ノートブック名が左側のリストに表示されるので、

そちらをクリックして、

ランダムにノートを取得したいノートブックを選んで下さい。

f:id:meison_amsl:20151128131638p:plain

 

ちなみに一度選べば、

再度Webアプリにアクセスしても、

すでに前回選択されたノートブックが

選択された状態になっているはずです。

 

4. GetNoteボタンを押してノートを開く

最後にGetNoteボタンを押せば、

自動でEvernoteアプリが立ち上がり、

ランダムで選択されたノートが表示されるはずです。

 

前述の通り、アプリの認証やノートブックの選択は、

Cookieを使って情報が保持されているので、

二回目以降は、

URLにアクセスして、GetNoteボタンを押せば

ノートをランダム閲覧できます。

 

使用上の注意

いくつか注意点を説明したいと思います。

ブラウザのCookieの機能をONして下さい。

Cookieを使っているので、

アクセスした時に毎回認証を聞かれたり、

前回選んだノートブックが選ばれなかったりした場合は、

下記の記事を参考にしてブラウザのCookie機能をONして下さい。 

たまにWebアプリへのアクセスが遅くなる

現状、Herokuの無料枠で動かしているので、

Webアプリがスリープ状態の場合があります。

その時はWebアプリの読み込みが数秒遅くなることがあります。

そんな時は、ちょっと待って下さい。

 

アクセス数が増えてきたら、

有料版に以降する予定です。

 

それ以外の問題が起きた時

このブログの記事にコメントするか、

Twitter上で教えて下さい。

twitter.com

可能であれば対応します。

 

最後に

ちょっとしたスキマ時間に

このWebアプリでノートを読むと、

思いもよらないノートが発掘されて

面白いと思います。

  

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com