メールを効率的に処理したく

今週目に留まったMedium↓記事、生産性向上のメール術を読んで。

blog.usejournal.com

現状のメール処理方法

下記はやっているけど、他に何か有益なのがないか知りたいというモチベーション。

自分ルール

  • チェック回数を減らす
    • 朝(できれば省略)、昼(眠い時間に)、夕方(帰宅前)
  • 受信音を鳴らない設定にする
  • 何回も同じメールを読み返さない
  • 5分以内で返信可能なものは、速攻で返信する
    それ以外は、下記分類に分けて、まとめて処理する
    • 自分でやるもの
    • 他人に任せるもの

とは言ってもケース・バイ・ケースで、
相手によっては速攻で返信を要求するような輩もいるので、めんどくさいこともある。。。

この記事から得た情報
  • 2分以内で返信可能なメールは、速攻で返す。
  • 2分よりかかるメールに関しては、後で纏めて処理する。
    • 開いた時に、ポイントだけ返信を書いて開きっぱなしにしておき、纏めて処理する時に続きを書く。
    • 纏めて処理する時間をスケジュール登録しておく。

ポイント:

  • 開きっぱにしておくことで、返信を忘れない。
  • ポイントだけ書いて放置することで、後で纏めて処理する時に再度作業内容を思い出すめんどくさい作業は不要になる。

メールを開きっぱで、ポイントだけ書いておくか。。。
自分に合うかどうか、さっそく明日からやってみよう。

ロコモコって優しくゆっくり言って欲しかった

今日とある会話にて、

A:「ハンバーグとアボガトとかのってる食べ物なんだっけ??」

B:「ロコモコじゃない?」

A:「そうだ、ロコモコだ!」

B:「そうじゃなくて、もっと優しくゆっくりロコモコって言ってみて」

A:「...」

結局言ってくれんかったとです。
変な意味はないとです。
ヒロシです

raw stringについて

参照情報

raw stringとは?

下記のように、'r' もしくは 'R'プレフィックスをつけている文字列のこと。

  • r"~~~"
  • R"~~~"

raw stringにすることにより、エスケープシーケンスが不要になる。

例でみるとわかりやすい。


>>> s = "xavi \n iniesta"
>>> sr = r"xavi \n iniesta"   # <---raw string!!!
>>>
>>> s
'xavi \n iniesta'
>>>
>>> sr
'xavi \\n iniesta'  # <---raw stringの場合、自動で\をつけてくれている。へぇ。
>>>
>>> print(f'{s}')
xavi
 iniesta
>>>
>>> print(f'{sr}')
xavi \n iniesta  # <---エスケープシーケンスにより、"\n"がただの文字列と化している。 


シャビとイニエスタのコンビが、指導者としてバルサで実現することがあるのでしょうか。

その時は、再びバルサ黄金期を作ってほしいものです。

UbuntuでWPS Office 2019 を使ってみた

背景

ある人とPowerPoint資料をやり取りする機会があった。
ただし、こっちはUbuntu(18.04)、あっちはWindows

Ubuntu標準のLibreOfficeという標準ソフトで編集することは可能だが、 図やレイアウトがほぼおかしくなる。
このままわかりあうことはできないのか。

私の師であるGoogle先生に何かよい代替ソフトないか聞いたところ、
WPS Office 2019といういい感じのものがあると伺った。

果たして、その結果はいかに。。。


WPS Office 2019インストール方法

WPS Office for Linuxのページで概要を読んでみることにしよう。

”Fully compatible with Microsoft Office”と記載あり。頼もしい。
ただ、PowerPointのとこに"Fully compatible with Microsoft PowerPoint (.PPT)"と記載があり、
PPTXは互換性ないんだね、と思ったり。でもFull compatibleでないだけで、Almost compatibleかもしれない。

そのあたりは実際に触ってみてというところか。


さて、下記インストール方法である。

  1. WPS OfficeサイトにGo!
  2. Downloadボタンをクリック!
    クリック後、"wps-office_11.1.0.10161.XA_amd64.deb"がダウンロードされていることを確認する。
  3. dpkgコマンドでインストール。これで終わり。
    • $ sudo dpkg -i wps-office_11.1.0.10161.XA_amd64.deb


次に、起動方法だ。 下記でどちらでも起動することが可能である。

  • ターミナルで、$ wpsと入力する
  • 検索ウィンドウで"wps"と入力すると、候補アプリがでてくるので、それをクリックする。

あとがき

この方法だと言語仕様が英語になります。

"Ubuntuソフトウェア"アプリで”WPS”と検索すると、
"”WPS Office 2019 - Multi-Language”と表記されたソフトが検索結果に表示されるので、
こちらでインストールすると、もしかしたら日本語にできるかもしれない。

ただ英語でやっているオレかっこいい! スタバでマック広げてます!
そんな感じで英語設定で共に歩みましょう。

PyTorchについて概要を把握したいと思ってましたが。。。

今後必要になりそうなので、やっと調べ始めました。
公式ドキュメントを読んでも、まぁ頭に入らないので、pytorchを使用しているプログラムから学んで行くことにしよう。

と思っていましたが、結論いうと、
中途半端な知識ではほとんどわからない、ということがわかりました。。


これ以降はだたの駄文、汚物じゃ!!
今年かけてpytorchならびにDeeplearningについて学習し、
年末にこの汚物を修正し、神へと昇華させる所存でございます。


お勉強用プログラム

Deep learning で一番ホットな企業であるNVIDIAのサンプルをお勉強用としてます。

そのNVIDIAのデバイスを使用した、JetBotというものがあり、それ用に提供されているCollision Avoidanceのデモプログラムを見ています。

コードは、↓Githubから取ってきてます。


さっそくレッツ&ゴー!!

[1] import torch
[2] import torchvision

[1][2] importしている"torch" と "torchvision"は何者ぞ?

公式ドキュメントによると、

  • torch: Tensorデータやその算術とかのパッケージ
  • torchvision: Computer Visionのためのパッケージ。具体的には下記のようなもの
  • popular datasets
  • model architectures
  • common image transformations

torchvisionの"vision"は、computer visionvisionか、なるほど。

"torch"単品のほうは、computer visionに限らず、汎用的なものが詰まっているのか、なるほど。


[3] model = torchvision.models.alexnet(pretrained=False)
[4] model.classifier[6] = torch.nn.Linear(model.classifier[6].in_features, 2)

[3] torchvisionパッケージで、かの有名なalexnetを召喚している。(torchvisionドキュメント箇所)

[4] よくわからん。。一つずつみていこうか。

  • model.classifier[6] :
    • マジックナンバー6ってなんだ?
    • ?今のところよくわかっていないけど、最終レイヤーを弄っているっぽい。
  • torch.nn.Linear:
    • torch.nn:
      • グラフのためのベーシックなブロックとのこと。
      • ところで、torch.nnの”nn”って何の略なんだ?よくわからん。
    • torch.nn.Linear
      • 入力データを線形変換(Linear transformation)するもの。全然わかんね。。

[5] model.load_state_dict(torch.load('best_model.pth'))

[5] モデルの重みデータを読み込んでいる


[6] device = torch.device('cuda')
[7] model = model.to(device)

[6] torch.device: cuda使います。と宣言。

[7] 調べてないけど、modelをdevice(cuda,,というかGPU?)へロードします宣言。


[8]
import torch.nn.functional as F
import time

def update(change):
    global robot
    x = change['new'] # <--- camera input 
    x = preprocess(x) # <--- cmera input preprocessed
    y = model(x) # <--- Alextnetにかけた結果がy
    y = F.softmax(y, dim=1) # <--- yをsoftmax関数にかけて、0〜100%の値に変換する。
    prob_blocked = float(y.flatten()[0]) #<---flatten後の最初の要素が、blocked状態かどうかを示すものらしい。
    if prob_blocked < 0.5: <--- 50%より小さいと直進
        robot.forward(speed_slider.value)
    else: <--- 50%以上だと、Blockedとみなし、左へ曲がる。
    robot.left(speed_slider.value)
    time.sleep(0.001)

update({'new': camera.value})  # we call the function once to initialize"

[8] プログラム中にコメントとして記載。

C++ std::accumulateについてざっくり調べてみた

これまでstd::accumulate()を使用する場面に遭遇すると、
その都度なんとなく調べて使ってました。
そして今日もstd::accumulate()を使う場面があり、コロナで暇なので、少しアウトプットしてみた。
アウトプットすることで思考の整理ができ、記憶に定着するのだ!!と、誰かが言ってました。


自分的に信頼できるcpprefjp - C++日本語リファレンスに記載があったひとことが端的に表してらっしゃる。

- accumulate()は、範囲を集計する関数である。

なるほど。


フル定義は下記↓↓

#include <numeric>

template <class InputIterator, class T, class BinaryOperation>
std::accumulate(
    InputIterator first,
    InputIterator last,
    T init,    // 省略可能。デフォルト:1
    BinaryOperation binary_op); // 省略可能。デフォルト:Add
  • "init" で初期値を変更することができる。
  • "binary_op"で、算術を指定することができる。

自分がわかりにくかった点は、binary_opの引数が、毎回何が代入されているのかとしっくりこなかった✕

例えば、(※これも冒頭のcpprefjp - C++日本語リファレンスに記載の例)

std::vector<int> v = {1, 2, 3, 4, 5};
product = std::accumulate(v.begin(), v.end(), 1, [](int acc, int i) {
    return acc * i;
  });

lambda関数の引数"acc""i"ってどこからくるんじゃい!!
何が代入されるんじゃい!!と。

結論は、↓↓であります。

- init(accumulateの第3引数) = binary_op(init, *iter)

初期値をどんどん再帰的にアップデートしていく感じになります。
なるほど。 上記の例で具体的にいうと、

初期値"init=1"が
- (((init*iter)*iter)*iter)*iter)
とこんな感じで雪だるま式に増えていきます。
んー、なんか借金の利子みたいな。。


やっぱり、アウトプットすると自分が理解できていなかったことが浮き彫りになりますな。

cmakeにて使用するコンパイラを指定したい場合はどうする?

CMAKE公式ドキュメントに記載あり。

ひと事で言うと、下記のように書けばよろし。

set(CMAKE_C_COMPILER "hogehoge")
set(CMAKE_CXX_COMPILER "hogehoge")


苦労してこそ意味がある... そんな価値観で、makefileを直書きを選択していないでしょうか?
(自戒の念)

時代に逆境せずに、便利なものがでてきたのであれば、なるべくそれを使うべし。
ただ、実際の現場では色んなしがらみあることは存じておりますが。。

変化に対応するものだけが生き残る?
なんかそんなことをダーウィンが言ったとか言わないとか。

うまい、はやい、やすい、そんな吉野家的なのがCMAKEだと思ってます。