夢に向かって、好奇心を持ち、疑問を持ち続ける。それが努力。

趣味でロボット職人を目指す自称AI研究者のメモです。

Pythonの上位モジュールがimportできない!→コマンドをモジュール実行!

皆様お元気でしょうか.
ご無沙汰してしまいましたが,最近コード書いていて詰まった話をメモしておきます.(初歩的なところですがw)

今回は,ずばり”モジュール化”!


pythonでコードを書いていて,

code/moduleA/testA.py
code/moduleB/testB.py

で,testA.pyからtestBのモジュールをImportしたいときありますよね.

特にtestA.pyの単体テストを想定してます.


testA.pyに以下のように書くとします.

from module B import testB

もちろん,moduleB/__init__.pyはありますが,
'no module named moduleB'
でエラーになります..


うーん??相対パスだからこれかなぁ?

from ..module B import testB

と試しても,'ImportError: attempted relative import with no known parent package'というエラーで怒られます..

ちなみに,
testA.pyを code/test.py のようにcode直下に配置すれば,

from module B import testB

で正常に動きます.でも単体テストで移動したら意味ない!


そんなときは!ずばり!モジュール実行!!です!!
pythonコマンドの-mオプション.

python -m moduleA.testA

のようにコマンドラインに書いてtestA.pyを実行(.pyは不要)すると,testA.py内で以下のようなモジュール呼び出しがあっても正常に動きます.

from module B import testB


ぱちぱちぱち!
同じ様に詰まる人がいたら参考になればと思います〜!

ではまた!

MACのTexStudioで日本語を入力&出力できるようにする

お久しぶりです.

Texの環境って一回整えたら基本的には,問題なく使い続けられるけど,
PCを買い替えた時,けっこうハマったりしますよね..

私も先日新しいmacに買い替えて,どハマり?(ぷちハマり?)したのでメモ程度に書いておきます.


基本的には,いつもお世話になっているtexwikiさんに記載の通りにやれば問題ないです.



私がハマったのは・・・


上記の通りやったのに,そもそも日本語英語関係なくコンパイルできない!!(タイトルとちがうやん!!ってのは最初だけなのでご安心ください)



なぜ?!



結局しばらくしたらできたのですが,
たぶんPCの再起動もしくはアプリの再起動が必要ということ.



その通りやったはずだけどなんでできないの?


そんなときは,無闇に原因を探るよりも,まず「再起動!」をトライしてみることをおすすめします.



その後は,再起動のおかげか,コンパイルはできるようになりました.


でも・・・次は・・・


トラブル1.日本語が入力できない..

(そもそもコンパイルで,Encoding scheme `JY1' unknown.”  と出る..)



私がもともと書いていた設定は,以下.

\documentclass[11pt,a4paper]{jarticle}
\usepackage[utf8]{inputenc}


最初は,ファイルがutf-8になっているかを疑ったのですが,正しくutf-8で保存されていました.


正しくは, 以下のように,\documentclass の jarticle を ujarticle にする.

\documentclass[11pt,a4paper]{ujarticle}
\usepackage[utf8]{inputenc}


これでコンパイルに失敗しなくなりました.


(補足)
ちなみに古いバージョンでは,以下のようにuplatexオプションをつけて対応するようでしたが(?)
私の環境では,上の ujarticle クラスを使うことで日本語コンパイルができるようになりました.

\documentclass[a4paper,uplatex]{jsarticle}

できてよかったですね.


でも次に待っていたのが・・・


トラブル2.PDFに日本語が出力されない!!


あるあるですね.

日本語が入力できないのと出力されないのは,まぁセットでハマるものだと思います(笑)


同じ症状の方は,念のために,外部のPDFビュワーでは日本語が見えているかどうかを確認いただきたいです.

私の場合には,

 外部のPDFビュワーでは日本語が表示されているけど,TexStudioの標準ビュワーでは日本語部分が消えている!!!

というものでした.


もし,外部のPDFビュワーでも日本語が見えていなければ,以下の設定だけでは足りず,何か別の問題があるかもしれません..
(そういう状況があるのか不明ですが.)



今回は、外部ビュワーでは日本語が表示される場合について書いていきますね.


その場合には,TeXstudioのビュワーに日本語の出力ができる設定がされていないとのことなので,
以下で実施していきます.

基本的には,TeXstudio - TeX Wikiの「組み込みの PDF ビューアに日本語を表示させる 」を参考にして同じようにやっていきます.

poppler-data (Popplerのサイトで提供)が必要とのことなので,以下の手順で適切な場所に配置します.
私の場合には,下記と全く同じでできましたが,
適切な場所が人によって異なるかもしれないので,確認が必要なようです(後述).

$ cd ~
$ curl -kO https://poppler.freedesktop.org/poppler-data-0.4.9.tar.gz
$ tar xvf poppler-data-0.4.9.tar.gz
$ sudo mkdir -p /usr/local/Cellar/poppler/0.79.0-texworks/share/poppler
$ sudo cp -pR ~/poppler-data-0.4.9/* /usr/local/Cellar/poppler/0.79.0-texworks/share/poppler


もしpopplerの場所が違う場合orわからない場合には,

$ strings -a /Applications/texstudio.app/Contents/Frameworks/libpoppler.[ここはバージョンによって異なるのでtabで補完].dylib | grep poppler

で確認できるようです.


ここで「組み込みの PDF ビューアで日本語が表示できることを確認します.」


とあるので,よし!日本語が出力されるようになってるはず!!


そして,TexStudioのコンパイル

・・・

あれ・・・?  

まだTexStudioで日本語が消えている・・・




最初の学びを忘れてないですかね?


そう.


ここでは,TexStudioアプリケーションの再起動!! (場合によってはPCの再起動が必要ですが,ここでは参照しに行くだけなのでアプリケーションだけで良いはず!!)


再起動してTexStudioをみると,

無事に日本語が表示されていました!!ぱちぱちぱちぱち!!!



これで安心していっぱい論文が書けそうです(笑)


同じ困っている人がいたら参考になればと思います.

冗長な言葉が入っていましたが,自分へのメモも兼ねて書いてるのでご了承ください(^^;


ではまた〜!

Json形式のファイルを標準出力で見やすく表示する(Linux)

json形式のファイルをvim等で開くと...

うーん.. 見にくい...

ってことありますよね.

そんな時は,jqコマンドが便利です.

まずはインストール.
・sudo権限ありディレクトリへインストールの場合

sudo curl -o /usr/local/bin/jq -L https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 && sudo chmod +x /usr/local/bin/jq

・sudo権限ありディレクトリへインストールの場合

curl -o /home/local/bin/jq -L https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 && chmod +x /home/local/bin/jq

上記のように,/usr/local/bin/jq をsudo権限の不要なお好きなディレクトリに変更すれば,共有サーバ等に個人用にインストールするのも可能です.

コマンドラインで,jq と打って,使えることを確認.(使えなかったらおそらくインストール先にpathが通ってないので,pathを通す.)

使えたら,実際に表示してみよう.
test.jsonを表示したいファイルだとすると,以下を実行.

cat test.json | jq .


おぉ!!!見やすい!!!


ちなみに,dumpするときにちゃんとindentありで出力してれば綺麗に見れるので,そちらのやり方も載せておきますね.

__dict = {'top': {'a': 1, 'b': 2}}
f = open("output.json", "w")
json.dump(__dict, f, ensure_ascii=False, indent=4, sort_keys=True, separators=(',', ': '))

そのまま開いても.

vi output.json

うん,きれい!!!


参考にさせていただいたサイトさん:
 https://qiita.com/wnoguchi/items/70a808a68e60651224a4
 上記サイトでは,sudoつけてますが,例のように/usr/local/bin/jq をsudo権限の不要なお好きなディレクトリに変更すれば,
 sudo権限のない場合でもインストール可能なので,もしそこで詰まった方がいればご参考まで.


以上,json形式のファイルを表示する方法でした〜.
久しぶりの更新でしたね.閲覧,ありがとうございました.

うさぎかかめか(Rabit vs. Turtle)

うさぎとかめのお話は有名ですよね.

かけっこの競争をして,うさぎはかめに負けることはないと余裕ぶってかけっこの途中で昼寝をしてしまい,かめに負けてしまうというお話.


それではかめになるべきかうさぎになるべきか?
研究者の観点で,両者の特徴を見て分析してみようと思った.

  • うさぎ

かけっこという専門分野において他者に勝るスピード(特技)を持っている
しかし,昼寝など欲求という誘惑に弱い性格をもち合わせる

  • かめ

かけっこという専門分野には弱い
しかし,苦手なことについても自分ができるだけのことをやろうと努力をする
最後まで諦めない性格をもち合わせる


私の勝手な分析ではこんな感じになった.


こう見ると,研究者のなりたい像としては,専門分野において勝る特技を持つことが大事だと思う.

しかし,どんな時にも眠気や空腹などの欲求というものがあって,それにいつも勝てる訳ではないのが人間というものだと思う.(少なくとも自分は.)


だけど,時に,眠気に負けずに努力する事もできて,その積み重ねで,良い結果を手に入れられる事もある.


えーと,うさぎとかめ,どちらも身の経験にあるな..


ここから得られた結論は以下.



うさぎとかめは一人の人間に共存している

ということ.



一人の人間は,時にうさぎになり,時にかめになる.

どんなときにも,うさぎとかめになれる要素を持ち合わせているのだ.

それをいかにして自分がコントロールできるかで,勝敗につながるのだ.


もしうさぎがそのまま走っていたら?もしかめが最初から勝てないと思って途中でやめていたら?

どっちも勝敗に左右しますよね.



その時々の局面で,人がどの行動を選択するかによって,最終的な結果が変わるということ.


人生は日々選択ということを以前の記事にも書きましたが,

やっぱり日々の選択は大事ですね.


ただ,選択するにあたって考えている時間も大事な時もあればもったいない時間になる事もあるので,
ある程度自分の中で選択基準(できれば良い方の)を持っていると,すごく楽で,良い結果にもつながりそうだなと思いました.


ちょっとしたうさぎとかめのお話から得た,研究者としての心構えでした.


うーん,筆者も眠気に負けることが多々あり,起きた時に絶望感にひたることがありますが,
どこまでできたら寝る等決めてやるともう少し効率よくできそうだなと思いました.


がんばろう.皆様の選択にも何か貢献できますように.

今日も読んでいただき,有難うございました!

見直しはなぜ重要か?

ありとあらゆるところに文書があり,それらは誰かの手によって生み出されている.

毎日のようにでてくるニュース,新聞記事,定期刊行の雑誌,本,教科書,論文,・・・などなど,
我々はたくさんの文書に囲まれて生きている.



当たり前のように,綺麗にかかれた文書を読む.誤字があれば,あー間違ってるなと感じる.


しかし,時に文書の生産者になった時,一番つらく,そして一番大事なことは

  ”見直し”

である.


この”見直し”の行為について,なぜこんなにたいくつなのか,なぜこんなに重要なのかについて考えてみたのでここに書いてみる.


・なぜこんなに退屈か?

それは,以下の2つの理由によるものだと思う.

理由1:新しい知見が得られるものがない(内容を知っているから)
 本や教科書など他の人の文を読む時には,新しい知見があるからわくわくする.
 しかし自分の文書はもちろん自分で書いた内容なので,新しい知見が全くない.
 これは面白くないはずである・・

理由2:自分の文書が読みにくいから
 一から綺麗に書ける人もいるが,なかなか最初から綺麗な文書を書くのは難しい.
 ”なんでこんなへんな書き方してるんだ..”
 こう思うと直すところがいっぱいで,読む気がなくなる.

 しかし,書き直しをしないでいると,”なんでこんな書き方しちゃうんだ”を何度も繰り返し,
 いつまでも綺麗な文書がかけないままという悪循環を生む.




うーん,けどへんな文書読むのつらい・・・・

こう思うこともあるだろう.



しかし!そうは思うものの,その”へんな文章!”を読んでくれる人がいるのだ.


これは次の,なぜ重要かにつながる.


・なぜこんなに重要か?

それは,言うまでもなく

『読んでくれる人に気持ちよく理解してもらうため』

ダメな文を改善するという点では,

『読んでくれる人に不快感を与えないため』

である.


これは,相手のために・・・に見えるかもしれないが,実は自分のステータスを守るためにも必要なのである.

『あの人こんなへんな文章書いてるんだ』

と思われる恥ずかしさである.


本ブログ筆者もこんな経験をした.

 とある文書を締め切り間際で提出.ぎりぎりのスケジュールだった.
 終了後,一応問題なかったか目を通す.
 
 !!!

 文章の途中で意味不明な文字が・・・


 完全にその文の意味が通じない状態になっていた.


 これは・・・・

  とてつもない辛い気持ちになった.


 ”読むね!”と声をかけてくれる人もいたが,
 正直読んで欲しくなかった..

 すでにあらゆるところに出てしまった以上,文章を修正してもらう手段はない.

 一生封印したい,けれども不可能.という辛い状況..

 ここで,”見直し”の大事さを痛く学んだ.  


なぜ,こんなにも辛い気持ちになるのか.


それは,”もう誰にも読んでもらえないかもしれない”という危険があるからだ.


特に,文書を生み出す仕事をしている人にとっては,職を失うことにつながってしまう.



こうならないためにも,文書を生み出す人は,責任を持って”見直し”をすることが大事なのだ.


最初から綺麗に文が書ける人にとってはこれは必要ないかもしれない.


しかし,本ブログ筆者含むおそらく多くの人は,最初の文書に”見直し”を必要としているだろうと思う.


皆に気持ちよく読んでもらうために,そして,自分の恥をかかないために,

綺麗な文書を届ける人になりたい.


そして,自信のない文書を少しでもみんなに快適に読んでもらえるよう,

しっかり”見直し”をしていこうと思う.



本日は”見直し”の大切さについて,考えたことを書かせていただきました.

読んでいただき有難うございました.

Matlabの図の作り方と複数のFigureウィンドウを作成する方法

Matlabは簡単に図がかけて便利ですよね.

X1=[1,2,3,4,5,4,3,2,1];
X2=[1,2,3,4,1,2,3,4,2];
X=[X1;X2]'
plot(X);

とするだけで,図がかけてしまう.なんて便利.

今日は凡例等ののつけ方と複数のウィンドウの作り方を紹介します.

まずは,タイトルと凡例は以下のようにつけます.

title('graph01')
xlabel('x')
ylabel('y')
legend('X1','X2')

次に複数ウィンドウに別のグラフを表示したい時は、次のようにします.

figure(1);
plot(X1)
figure(2);
plot(X1)


その他にも,image(X)もしくはimagesc(X)コマンドで,行列の1マスずつの値を色の濃淡で2次元的に可視化することもできます.

以上.

簡単ですね!

以上Matlabの簡単グラフ作成講座でした〜.

LaTeXの数式モードのよくある間違い

LaTeXには複数の数式コマンドがあります.

  • equation
  • eqnarray
  • align


それぞれ使い道を簡単に紹介します.

1行のとき,equationを使います.

\begin{equation}
f(x) = a * b
\end{equation}

2行にまたがり,かつイコールの位置を揃えたい時などは,eqnarrayを使います.
&で囲むとその部分の位置が揃います.

\begin{eqnarray}
f(x) &=& a + b \nonumber \\
&=& c(a' * b')
\end{eqnarray}

また,alignを用いると,中央に揃えることができます.

\begin{align}
f(x) &=& a + b \nonumber \\
&=& c(a' * b')
\end{align}

いずれにおいても,改行記号の前に,\nonumberを付与することで,番号を出さないようにできます.
また,以下のようにsplitと組み合わせることで,改行記号のみで,一つのみの番号を付与することができます.
複数行の中央に,一つの番号がつくので,わかりやすいかもしれません.

\begin{align}
\begin{split}
f(x) &=& a + b \\
&=& c(a' * b')
\end{split}
\end{align}

ちなみに,splitと\nonumberは両立できないのでお気をつけください.
(エラーになります)


以上.どっちだっけとよく忘れてしまうのでメモにしました.

参考になればと思います.