読者です 読者をやめる 読者になる 読者になる

Pythonでリストの中身が勝手に変わってしまう時は

Python2.7

Pythonのあるリスト(Aとする)に別のリスト(Bとする)をアペンドすると、アペンドしたリスト(B)の変更がアペンド先のリスト(A)の中身に影響を与えることがある←よくわかってないです

>>> listA = ['A']
>>> listB = ['B']

>>> listA.append(listB)
>>> listA
['A',['B']]

>>> listB.append('C')
>>> listB 
['B','C']
>>> listA
['A',['B','C']] ← これ

これを回避するためには、copyモジュールのdeepcopy関数を使うと良いらしい。

>>> import copy

>>> listA = ['A']
>>> listB = ['B']

>>> listA.append(copy.deepcopy(listB)) ← ここで使います
>>> listA
['A',['B']]

>>> listB.append('C')
>>> listB 
['B','C']
>>> listA
['A',['B']] ← listBの変更の影響を受けなくなった

git,GitHubの便利なコマンド覚え書き

  • ワークツリー上での削除をGitHubに反映させる
    $ git commit -aの後$ git push

  • 直前のcommitのコメントを編集する
    $ git commit --amend

  • 今までの一連の変更内容を確認する
    $ git log -p

pythonのunittestの使い方

pythonのunittestモジュールを用いることで、関数のテストを行う

対象となるコード(target.py)

def myadd(a,b):
    return a+b

def mypow(a,b):
    return a**b

これをテストするコード(test.py)

#coding:utf-8
import unittest
from target import myadd
from target import mypow

class TestTarget(unittest.TestCase):

    def test_myadd(self):
        # 関数myaddのテスト
        input_1 = 2
        input_2 = 3
        expected = 5 # 期待される結果
        result = myadd(input_1,input_2)
        self.assertEqual(result,expected) # 結果が等しいかどうか確かめる

    def test_mypow(self):
        # 関数mypowのテスト
        input_1 = 2
        input_2 = 3
        expected = 8 # 期待される結果
        result = mypow(input_1,input_2)
        self.assertEqual(result,expected) # 結果が等しいかどうか確かめる

if __name__=="__main__":
    unittest.main()

assertEqual():結果が等しいかどうか確かめる
assertTrue():結果が真かどうか確かめる
assertFalse():結果が偽かどうか確かめる

ROSでワークスペースとパッケージを作る

ワークスペースの作り方

ROSのワークスペース(catkin_ws)を作成する

$ mkdir -p ~/catkin_ws/src  
$ cd ~catkin_ws/src
$ catkin_init_workspace  
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash (この行は~/.bashrcの最後に追記しておくとよい)

これでワークスペースが作成できる

パッケージの作り方  

ワークスペース中に新しいパッケージを作成する

$ cd ~/catkin_ws/src
$ catkin_create_pkg <パッケージ名> rospy roscpp std_msgs
$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash

これで自作パッケージを使うことができるようになる

ROSのコマンド覚え書き

調べる系

  • rostopic type /..,rosservice type
    topic,serviceの型を調べる

  • rostopic list,rosservice list,rosparam list
    現在登録されているすべてのTopic,Service,パラメータが表示される

  • rosservice type /.. | rossrv show
    サービスが受け取る引数と戻り値を調べる  

  • rosmsg show /..
    メッセージの名前や型を調べる

起動系

  • rosservice call /..
    Serviceを呼び出す

ツール系

  • rqt_graph
    ノード同士の関係を表示する

  • rqt_console
    コンソールで、流通しているTopicやServiceを確認する

gitの初期設定

gitに名前とメールアドレスを登録

$ git config --global user.name "<ユーザ名>"
$ git config --global user.email "<メールアドレス>"

gitで使用するエディタを定義

$ git config --global core.editor 'vim -c "set fenc=utf-8"'

ファイルのアーカイブと圧縮とパスワード保護

tarコマンド

用途
ファイルをアーカイブ(まとめる)する

  • アーカイブファイルの作成
    $ tar cf <アーカイブファイル> <アーカイブ元のファイルパス>
  • アーカイブファイルの内容を確認する
    $ tar tf <アーカイブファイル>
  • アーカイブファイルの展開
    $ tar xf <アーカイブファイル>
  • アーカイブ + 圧縮
    $ tar czf <アーカイブファイル> <アーカイブ元のファイルパス>

gzipコマンド

用途
ファイルを圧縮する

  • 圧縮
    $ gzip <圧縮したいファイル>
  • 圧縮ファイルを展開
    $ gzip -d <圧縮されたファイル> or $ gunzip <圧縮されたファイル>

zipコマンド

用途
ファイルのアーカイブと圧縮

  • zipファイル作成
    $ zip -r <圧縮ファイル名> <圧縮対象パス>
  • zipファイルを展開
    $ unzip <圧縮ファイル名>
  • パスワード付きzipファイルの作成
    $ zip -re <圧縮ファイル名> <圧縮対象パス>