ソフトウェアエンジニアの勉強ログ

興味があるのは、computer vision, three.js, python, 深層学習, emacs

デスクトップPC(デュアルブート)をノートPCから立ち上げてアクセス

背景

  • 最近、デスクトップPCを書斎に移動してデュアルディスプレイにした
  • 快適になった一方、いちいち書斎に移動するのが面倒で、リビングで気軽にコーディングしたい
  • 基本的にはsshで入ればよいが、電源いれにいくの面倒
  • ビューワも使いたいので、リモートデスクトップで入ることまでサポートしたい

やりたいこと

やったこと

  • デスクトップPC
    • WOL機能を有効にする(BIOS, ubuntu)
    • ubuntuWOLを有効にする
    • grubの設定で、立ち上げるOSのデ切り替えるフォルトをubuntuにする
    • gdmをlightdmに切り替える(ログイン画面でx11vncを立ち上げるため)
    • x11vncを立ち上げる
    • 固定ipアドレスにする
  • ノートPC

WOLを有効にする(BIOS)

Windows10 × ASUS UEFI BIOS構成でのWake On LAN(WOL)設定方法、起動フリーウェアも紹介 | IT trip

wakonlanのinstall(@ノートPC)

ubuntuWOLを有効にする(@デスクトップPC)

UbuntuよりWake on Lanでリモートのマシンを起動する!

gdmをlightdmに切り替える(ログイン画面でx11vncを立ち上げるため)

Linuxのログイン画面を変更する - ふなWiki

以下のコマンドを打ち忘れて、かなりはまったので要注意。

$ sudo dpkg-reconfigure lightdm

x11vncを立ち上げる

Ubuntu 18.04に、ログイン前にVNC接続するには | Ninton

固定ipアドレスにする

gatewayをどう設定すれば良いんだっけ?と思ったら以下を参照

Ubuntuで、IPアドレス、デフォルトゲートウェイ、DNSサーバーの設定確認 - Symfoware

grubの設定で、立ち上げるOSのデ切り替えるフォルトをubuntuにする

途中うまくいかくて、grub2の設定もしてしまったが、grubの設定だけでうまくいくはず。

Windows 10とUbuntu 18.04 デュアルブートする方法 | パソコン工房 NEXMAG

【 grub2-set-default/grub-set-default 】コマンド――GRUB 2のデフォルト起動メニューを設定する:Linux基本コマンドTips(277) - @IT


追記

windows10側の設定も変更しないと行けなそうだが、下記の設定をしても、windows10でシャットダウンするとうまくいかない。 Windows10の Wake On Lan - PCを遠隔起動するWOLの設定 | E.i.Z

ubuntuのバックアップ

ubuntu16のマシンを18にあげようと思い、その際に、clonezillaを使ってバックアップをとったのでその作業ログを残す。

Tuxbootのインストール
  • ISOから起動disk(USB)を作成するソフト
$ sudo apt-add-repository ppa:thomas.tsai/ubuntu-tuxboot
$ sudo apt-get update
$ sudo apt-get install tuxboot
CloneZilla Liveのダウンロード
Tuxbootを起動してusbを用意
  • 基本は画面通りの操作でUSBが準備できる
  • show all deviceをチェックしないと選べなかった
    • 他のデバイスを選択してしまうと大変なので要注意
再起動して、USBからbootを選ぶ
  • 後はウィザードの通りに進めればできる。操作時は少し選択肢を気をつけないといけないけど、なんとかなる。
  • ホームディレクトリを聞かれるときに、imgを置きたいディスクのディレクトリを選ぶのがポイント
  • できたものを見るとISOではなく、ディレ奥取りなので意外だった

sudo ppa-purge ppa:thomas.tsai/ubuntu-tuxboot

自分用メモ:ROS2のインストール

$ ros2 run examples_rclcpp_minimal_publisher publisher_member_function 
$ ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function
  • 何をやりたいかを考えないと趣味開発がぶれそう
    • ROS2を試したい
    • MPCで自分の思ったようなパスを計画する環境を作りたい
    • drivableエリアの実装

自分用メモ:C,C++経験者がpythonを一から勉強する2(逐次更新)

pythonプログラム

  • import sysのうえ、sys.argvでコマンドラインの入力にアクセスできる
  • import moduleで読み込めるが、module.関数という呼び方をしないといけない
  • from A import functionとすると、使いたい関数を直接importする
  • import long_module_name as hogeみたいな呼び方もできる
  • パッケージという考え方
    • __init__.pyというファイルがあるディレクトリを、パッケージとみなして、import対象なる

辞書の使い方

  • setdefault()関数やdefaultdict()関数を使って、例外のときの値出力を簡単に記述できる
  • Counterによる要素数の計算(from collections import Counter)
  • OrderedDict(from collections import OrderedDict)
  • deque
    • pop, popleft, append, appendleft
  • itertools
    • tertools.chain, itertools.cycle

オブジェクト

  • 継承したときにメソッドは完全にオーバーライドされる
    • 親クラスの処理をしたかったら、super()を呼ぶ
  • メソッドは追加できる
  • property
  • 非公開属性の名前のマンダリング
    • __prop_nameでマンダリングして、@propertyと@var_name.setterでデコレートするのが良さそう。
    • selfとクラス名を使い分けると、クラスで一つの変数を扱うことができる(C++のstaticメンバ変数)
    • @classmethod, @staticmethodを使う(デコレート)
    • vars関数を使うとプロパティがわかる
  • 特殊メソッド
    • 要するにoperatorのオーバーライド
__eq__, __ne__, __lt__, __gt__, __le__, __ge__, __add__, __sub__, __mul__, __floordiv__, __truediv__, __mod__, __pow__, __str__, __repr__, __len__
  • __str__などは便利だろう
  • コンポジションの方がリーダブルなコードがかける。つまり、子メンバー変数にオブジェクトを持つ
  • モジュールはシングルトンとして振る舞う

文字列

自分用メモ:C,C++経験者がpythonを一から勉強する1

基本事項

  • ブール、整数、float、文字列
  • //は整数の除算
  • **は指数
  • 基数は、0bが2進数、0oが8進、0xが16進
  • 整数型への変換はint()関数で、浮動小数点への変換がfloat()関数、文字列への変換はstr()関数
  • int型はpython3では任意のサイズなので大きさの上限を気にしなくて良い

文字列について

  • 文字列リテラルに関して、”と'の両方を表現したいときに、"""もしくは'''で囲うことができる。さらに、改行文字を入れることができる。
  • +を使った連結
  • *を使って繰り返し
  • []による文字の抽出
  • [start:end:step]による文字の切り出し
  • len関数による文字列の長さ
  • splitとjoin、joinは感覚と使い方が違うので注意が必要
  • strip関数は、デフォルトで空白などを削除する。文字を指定した削除も可能。
  • Cでprintf("%10d", x)などとするが、文字列に対して、str.center(30), str.ljust(30), str.rjust(30)
  • replace関数で文字を書き換える。正規表現は後ほど。数を指定しないと最初の一回のみの置換になってしまう。

リスト、タプル、辞書、集合

リスト

  • ほぼ配列
  • [ ]もしくはlist()で作成
  • array.append(new_elem)で末尾に要素追加
  • extend()関数もしくは+=や+で、リストを連結
  • insertで場所を指定して挿入
  • delで要素を指定した削除。del array[-1]のように使う。
  • removeでmatchする要素を削除
  • popでオフセットして切り出しながら削除
  • index()で要素のオフセットを知る
  • list.index(query, index)で0始まりの順番を指定できる。マイナスも指定できる
  • inで有無のテスト、countで個数を数える
  • copyの方法は、list.copy(), list(list), list[:]
    • copyのリスト関数はpython3からのようだ

タプル

  • 要するに、定数リストで初期化したら変更不可
  • ()
  • タプルのアンパック
    • そもそも、pthyonは、a,b,c = 1,2,3のような記述ができる
  • tupple(list)関数でタプルを作れる

辞書

  • 要するにstd::mapに近い
  • {}
  • dict()汎用関数を使って、タプルやリストを辞書にできる
  • [key]による追加、アクセス
  • get関数でアクセスできる。無い場合はNoneが返ってくる。C++のatと挙動が異なるので要注意。
  • update()辞書関数によって、辞書の結合ができる。
  • del ditct[key], dict.clear(), key in dictが使える
    • joinといいちょっと気になるが仕方がない
  • keys(), values, items()
    • 全て参照用の特殊な型(dict_keysなど)になるので注意

集合

  • 初期化にはset()関数を使う。
    • リストやタプル、辞書(キー)を使える
  • 集合演算を使えるのが良さそう。
演算子 意味
& 積集合
| 和集合
- 差集合
^ 排他的OR
<= 部分集合チェック
>= 上位集合チェック
> 真上位集合チェック

コードの書き方

  • \によって行を継続できる。逆にいうと、1行に意味がある。
  • ネストする場合は、:を使う?
  • if, elif, else
  • while
    • whileの弟にelseを用意すると、breakが呼ばれなかった場合の処理を記述できる
  • for文
    • for letter in wordやfor item dict.items()のように使う
    • for文に対してもelseが使える
    • zip()を使えば、複数のシーケンスを並列的に反復処理を行えるし、それ以外にもlist(zip(list1, list2))みたいなことができる
    • range()関数は便利なので使いこなせたほうが良い
  • リスト内包
    • 結構なれない感じ
    • [expression for item in iterable]
    • [expression for item in iterable if conidtion]
    • [[val1, val2] for val1 in hoge for val2 in fuga]
  • 辞書内包や集合内包もある

  • 関数

    • 関数の定義にはdefを使う
    • 位置引数でも良いし、キーワード引数でも良い
    • デフォルト引数もできるが、実行時ではなく、「定義」されたときであることに注意
    • 以下のように返り値を複数持てる
def func2():
    return 1, 2, 3
a, b, c = func2()
  • *によって位置引数をタプル化して渡せる
  • **によって、キーワード引数を辞書化できる
  • 関数の戦闘にそのまま文字列をいれれば、関数の説明を入れられるらしい。これは良い。docstringというらしい。
  • 関数もオブジェクトなので、引数に渡せる。コールバックみたいなことがすぐにできる。
  • 関数の中に関数を定義できる(関数内関数)
  • 関数内関数はクロージャーとして機能する
  • ラムダ関数
    • lambda args : contentesで書く、直接関数オブジェクトとして渡すときに使うのだろう
  • ジェネレータ関数
    • 書くときは、returnの代わりにyieldを書く
    • 呼ばれる毎に最後にyieldした続きから始まる。
    • 記述の最後までいったら何も返さなくなって終わるということ
    • 馴染みはないがかなり面白い考え方で、巨大なシーケンスを扱えるようになる
    • ジェネレータ関数はvar in generatorになって初めて評価される
  • デコレータ
    • 関数を装飾するイメージ
    • 関数をラッピングする関数を用意する
    • ラッピングしたい対象の関数の上に@を使った記述をする(マクロみたい)
def doc_func(func):
  def new_function(*args, **kwargs):
    result = func(*args, **kwargs)
    print("result:", result)
    return result 

@doc_func
def my_func1(....)..
* さらに関数に対するデコレータは複数持てるらしい
  • 名前空間
    • 基本的にローカルからグローバル変数の変更は許容していない
      • 代入から始まる処理が書かれると同じ変数名であって、別の変数として扱われる
      • ただし、グローバルへのアクセスは普通にできる
        • グローバル変数にアクセスしたあとに代入しようとすると、グローバルへの代入とみなしエラーが起きる
    • global variableと宣言することで、代入雨も行えるようになる
    • 名前空間の状態をデバッグしたかったら、globals()とlocals()という関数があってチェックできる
  • 変数名について
    • 予約後は使ってはだめ、から始まりで終わる単語も予約語
  • try, except
    • C++ではtry,catchだった処理が、try, exceptとしてそれぞれのブロックで処理を行う
      • C++では、throwでエラーを出力するが、pythonではraiseのようだ
      • もちろん、独自のException型を用意することもできる

Ubuntu18.04のインストールと初期設定

久々の更新です。

lenovoのT450を中古で安く買って、ubuntu18.04を入れて、遊ぶことにしました。 今回は、デュアルブートでなくて良いので、ubuntu18.04のイメージをDVDに焼きこんで普通にインストールしました。 はまるとこは何もなく非常に簡単でした。 18.04で日本語でインストールすると、最初からMozc入っているし、半角/全角で日本語と英語変換してくれるし、すごい楽です。

初期設定

まずは、keyboardのレイアウトの設定

linux.just4fun.biz

これで、GUIから簡単にcapslockをctrlに上書きできました。 さらに設定にemcasキーバインドを使うなんていう項目もあって良さげです。 emacs厨の私としては、何も考えずこの項目を有効にしました。

あとは、以下の記事の気になるところを更新しました。

linuxfan.info

ほとんどやることなくて楽でした。

まずは、python3を一から学ぼうと思っているのですが、 以前先にanacondaでpythonを入れたら、ROSのインスールでハマった記憶があります。 ROS2も試していきたいので、とりあえずROS2をインストールするのが良い気がしています。

ros2のインストールは以下のページに習ってやればすぐにできました。

qiita.com

Google Apps Script (GAS) をローカルで開発する環境を整えた

突然ですが、GoogleのSpreadsheet便利ですよね。 私はSpreadsheet上でオリジナルの家計簿を作っているのですが、いかんせんブラウザ上でプログラミングするのが辛い… ローカルで開発でできないかなと調べたら以下の方法があることを知りました。

qiita.com

早速、claspなるものを導入しました。 結構簡単に導入できるのでおすすめです。

ついでにemacsjavascriptのインデントを4から2に変更しました。

stackoverrun.com

.init.elのような場所を直接編集する方法もいいですけど、 変更しても反映されたりされなかったりが面倒そうだったので、 「M-x customize-group」から変更するのが確実な気がして、そっちを採用しました。