粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

RICOH THETA_SCで多重露光・合成をしてPixel4みたいにクリアな星空を撮りたい

この記事はたまたま集まった技術&もの作りが好きな人たち Advent Calendar 2019の記事です。

はじめに

それはゴミのような論文を泣く泣く提出した日の夜でした。デスマを終えて見上げた空は信じられないくらい澄んでいてそれはもう最高に晴れやかな気分でした。

『こら撮らな!』と思いたって家からTHETAを引っ張り出してきて撮ったのが以下の写真です。

f:id:ossyaritoori:20191207235116p:plain
オリオンをなぞる

何度かパシャパシャ撮ってから帰りましたが,やっぱり後でビューワーで視るとまだ少し物足りない感じがします。

そこで,Google Pixel4でも使われている多重露光を行って合成してより精細な写真を撮るという手法を試してみたくなりました。

以下がPixel4で撮った写真の一例らしいです。カッコよすぎんか。私も撮りたい。 https://image.itmedia.co.jp/news/articles/1910/17/ki_1609376_pixel4camera01.jpg

戦略

暗い夜空をきれいに取るためには露光時間を長くすればよいのですが,長すぎると星々が動いてしまいます。

Google Pixel4の戦略としては短めの露光を複数回撮って,それらを重ね合わせてノイズを除去しているようです。

japanese.engadget.com

ということで私も以下のような流れをとることにしました。

  • 360°カメラで星空を複数回撮影
  • 複数の画像を合成してノイズを落とす
  • 星空の回転に合わせて画像を補正

諸々の処理のプログラムはPythonで書きます。

Step0: 星空を撮る

撮影に使っているのはRICOHの全天球カメラのTHETA_SCです。

RICOH 360度カメラ RICOH THETA SC (ブルー) 全天球カメラ 910743

RICOH 360度カメラ RICOH THETA SC (ブルー) 全天球カメラ 910743

  • 発売日: 2016/10/28
  • メディア: エレクトロニクス

扱いやすく個人的には360度カメラの入門にはもってこいと思います。 撮像素子はデジカメでは標準的な 1/2.3型,レンズのF値2.0とまぁまぁの明るさなので15秒程度露光すれば都心の夜空は十分に綺麗に撮れます。

都市郊外で空を撮る感覚だと 露光20-30秒 ,ISO:100-160程度が向いていそうです。

当日は小型の三脚に固定して撮影しました。

全天球カメラで撮った画像はEquirectalgular (正距円筒図法)という形式で保存されます。

f:id:ossyaritoori:20191208001928p:plain
スマホのパノラマで一周して撮ったときも同じような画像になりますね。


本稿ではこの画像の中心を原点とします。

横方向:水平方向へは一周で2π,縦方向は緯度方向なので一周でπのスケールがあります。 したがってざっくり画像座標→正距円筒座標の変換を書くと以下のようになります。

hei,wid,_ = image.shape
cx,cy = wid/2,hei/2
Equilecpoints = (np.array(polarpoints)-np.array([cx,cy]))/np.array([wid/2/pi,-hei/pi])

Step1:多重露光を合成する

ということで多重露光をした画像を合成する段階に入ります。 本来なら露光やISOを統一するべきなのですが,合成を思いついたのが撮影会後なので設定がバラバラな画像になってしまいました。

何も考えずにピクセル輝度の平均をとると以下のようにぼやけた画像になってしまいます。

f:id:ossyaritoori:20191210093417p:plain
建物と空の境界が曖昧に白っぽくなってしまう

そこでOpenCVにあるHDR合成(ハイダイナミックレンジ合成)のライブラリを使用してみることにしました。

HDR合成とは簡単に言うと露光条件の異なる画像を組み合わせて白飛び黒飛びを軽減した画像を撮像することです。

丁寧にまとめてくれている方がこちら(文献[1]): [CV]High-Dynamic-Range(HDR) Imagingについて - Qiita

今回は最も楽そうなMergeMertensという手法を用いました。 Pythonで書くなら以下のような感じです。

import cv2
merge=cv2.createMergeMertens()
proc1 =merge.process([img1,img2,img3])

f:id:ossyaritoori:20191210112502p:plain
MergeMertensを用いた複数画像の合成結果


先ほどのようなモヤが生じる問題を回避できましたが,よく見ると星の動きが軌跡となっています。これはこれで乙ですがくっきりとした星空が見たいですね。

実際オリオン座の周辺に着目すると,星空が動いているのがよくわかります。

f:id:ossyaritoori:20191208001147g:plain
短い間にも空は動いている

露光を繰り返した3分強の間にも星々はよく動いていることがわかります。

Step 2 星空の回転を補正する

先程のGIF画像の様に星空は一日で天球を一回転します。回転中心は北極星Polaris)近辺の極北にあたります。

OpenCVの既存関数による位置ずれ補正

OpenCVにもAlignMTBというクラスがあり,calculateShiftという関数で位置ずれを補正できるそうですがプログラムの中身を見た感じこれは微小並進量のみの対応です。

また,一般の平面画像であれば射影変換によって回転ズレを補正できます。 ossyaritoori.hatenablog.com

しかし,Equirectangular画像においては回転操作は非線形変換になります。

Equirectangular画像における三次元回転

回転操作がどの様に影響するか,次の座標変換から導出することができます。

f:id:ossyaritoori:20191210112100p:plain
3D直交座標と球面極座標の関係。文献[2]から引用

逆変換は以下の通りです。


\begin{align}
x = cos \phi cos \theta, \\
y = cos \phi sin \theta, \\
z = sin \phi
\end{align}

星空はrが変化しない無限遠にあるので,変換後のEquirectangular画像の \theta’,\phi’は天球上での三次元回転行列を用いて


\begin{pmatrix}
 x' \\ y' \\ z'
\end{pmatrix}
= R\begin{pmatrix}
 x\\ y \\  z
\end{pmatrix},  \  \theta' = tan^{-1}\frac{x’}{y'} ,\ \phi'=sin^{-1}z'

と計算できます。

実際変形する際には (\theta’,\phi’)=(i,j)に対応する元画像の座標を逆変換から求め,ピクセル値をBilinear補間で求めます。

ロドリゲスの回転行列の計算

回転行列はOpenCVでサポートされているロドリゲスの回転行列を用います。


星空は原点と極北≒北極星を通る回転軸の反時計回りに回転します。1秒あたり1/240度なので微小のように思われますが,先程のGIFのように複数回露光をすると動きとして効いてきます。

変化を補正するために手動で極北の座標を決定した後,画像のExif情報から撮像の間隔を取得して回転変換をかけます。

# polarw :Equirectangularでの極北のtheta,phi
nx = np.cos(polarw[1])*np.cos(polarw[0])
ny = np.cos(polarw[1])*np.sin(polarw[0])
nz = np.sin(polarw[1])

# omega = time_diff/3600/24*2*pi
Rrod,_ = cv2.Rodrigues(omega*np.array([nx,ny,nz]))

このRrodは先程の式における回転行列Rの転置になります。

変換&重ね合わせの結果

ということで重ね合わせの結果です。

f:id:ossyaritoori:20191210161026p:plain
星空が合うようにマッチングしたので建物などがぶれて見える。

重ね合わせが成功して満足してしまいましたが,見えないものが見えるわけではないのでもっと暗い所に行って多重露光合成の威力を試したくなりました。 まずは休暇が欲しい…

STEP3 :自動で極北を抽出(途中)

SIFTやAKAZE特徴点でマッチングした画像は案の定,空と建物の境界にハマります。 星々をマッチングできれば回転を検出できますが,やはり空と建物・地面の分離を事前にやる必要がありそうです。

f:id:ossyaritoori:20191210212145p:plain
案の定有効な特徴点は空との境界に寄るため星空間の対応は難しそう。

夜空部分の抽出

先程のマッチングでは信頼度の低いマッチング結果を除去していました。具体的には距離情報で縛りをかけています。

良いマッチングを得るためにユークリッド距離の比を元に選別するコードがよく書かれています。

for m,n in self.matchings: 
   if m.distance < 0.75 * n.distance:
         #good.append()        

この選別部分をなくした場合のマッチング点(AKAZE)はいくつか空の星々を捉えています。

f:id:ossyaritoori:20191213110200p:plain
青:画像1のAKAZE特徴点,オレンジ:画像2のAKAZE特徴点(マッチング実施後の対応点)

したがって,最初の選別有りのマッチングにて建物と空の協会となるY座標を抽出し,(今回はY=619)Y座標がその閾値以下,すなわちカメラから見てより上方にある箇所を空の領域と仮定しました。 その結果絞り込まれたのが以下の17点の対応です。

f:id:ossyaritoori:20191213112316p:plain
Y座標を元に夜空の部分の特徴点のみを抽出した

3次元座標での回転推定

Equirectangular平面内ではお互いの変換は非線形になってしまうので,一度求めた特徴点の対応を三次元球面極座標写像してから対応する回転行列を求めます。

三次元回転の最適化といえば金谷先生の教科書を参照するのが良いでしょう。

3次元回転: パラメータ計算とリー代数による最適化

3次元回転: パラメータ計算とリー代数による最適化

また,一応英語のテキストが無料で転がっていたりします。

https://igl.ethz.ch/projects/ARAP/svd_rot.pdf

 \sum Rx_i-y_iを最小化する回転Rは対応点x_iとy_iを列方向に並べた行列X,Yを用いて表した

 S=XY^\top特異値分解して得た U\Sigma V^\top=Sから,

 \hat{R} = V diag(1,1,..,det(VU^\top)) U^\top

のように計算できます。なお,ここで推定したRはデータによっては厳密な回転行列にならない場合があります。それを補正するために同様の操作を繰り返します。 こちらは金谷先生の教科書に記述があるのでそちらを確認してください。

numpyでは以下のように書きます。np.linalgのsvdがVを転置の状態で出すことには注意です。

def estimate3dR(X,Y):
    S=np.dot(X,Y.T)
    U,W,V=np.linalg.svd(S)
    Rhat_ = np.dot(V.T,U.T)
    Rhat = np.linalg.multi_dot([V.T,np.diag([1,1,np.linalg.det(Rhat_)]),U.T])
    # additional Step For Optimization
    U,W,V=np.linalg.svd(Rhat)
    Rhat_ = np.dot(V.T,U.T)
    Rhat = np.linalg.multi_dot([V.T,np.diag([1,1,np.linalg.det(Rhat_)]),U.T])
    return Rhat

ランダムサンプルによるロバスト推定

ところで上記の手法でそのまま回転を計算すると,外れ値の影響を受けてしまいます。

この外れ値を除去するためにランダムサンプルによる手法が数多く提案されており,有名なRANSACなどはopenCVでの推定アルゴリズムにも採用されています。

二次文献ですが以下のブログがわかりやすいと思います。

www.sanko-shoko.net

RANSACの完全な実装はなかなかに面倒で,以下のブログを参考にしました。 クラスの継承を有効に使うコードを初めて書いた気がします。これはこれで長いので別記事で。

一目で分かるRANSAC - Qiita

その結果,

  • 手動設定の回転行列
array([[ 0.99989064, -0.00811519, -0.01236295],
       [ 0.00808042,  0.99996327, -0.00285925],
       [ 0.0123857 ,  0.00275904,  0.99991949]])
  • RANSACで推定した回転行列
array([[ 0.99994968, -0.00893819, -0.00455381],
       [ 0.00895058,  0.99995627,  0.00270865],
       [ 0.0045294 , -0.00274927,  0.99998596]])

はい。そこそこまともな値が抽出できてきました。 観測にノイズが混じっているのでこれは厳密には回転行列ではないので,補正が必要になります。(TODO:もう1つSubsectionが必要)

とりあえず,これをこのサイトにて分解して回転軸と回転角(rad)を抽出してみると,

[ -0.2625027, -0.4368636, 0.8603735 ], 0.0103961

これは,約143秒の露光という判定です…うーん,一分ほど短い? 北極星の位置も微妙にずれた検出をしているのでマッチングの精度が悪かったかRANSACの調整ミスですね。(TODO)

また,回転中心の位置推定もやはり手動には敵いません。これはなかなか手ごわいです。

f:id:ossyaritoori:20191214002406p:plain
白:本来の北極星,黄色:自動推定した空の回転中心


とまぁこれ以上詳細に書くとめちゃ長くなるので別記事にします。 とりあえず,

  • 星空の領域抽出
  • 星空の運動の推定

がネックとなるため最初持っていたイメージよりかは簡単には自動化できないという感覚を得ました。 手動で北極星さえ指定すればExif情報で基本的に推定できるのでこの頑張りがそもそも必要かというのも少し怪しげですが気力があれば続きも記事にします。

TODO

  • 空の領域とそうでない領域の分離:雑にDone
  • 回転中心の自動抽出(特徴点マッチングを用いる):雑にDone
  • 三次元回転推定まわりを整形:多分やる
  • 公開ようにプログラムを整形:やる?

おまけプログラム's

PILでgif画像を保存する関数

from PIL import Image
def saveasGif(images,filename='out.gif',duration=500,loop=0):
    imlist = []
    for img in images:
        img_array = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        imlist.append(Image.fromarray(img_array))
        
    imlist[0].save(filename, save_all=True, append_images=imlist[1:], duration=duration,loop=loop)

Exifデータから撮影間隔を取得する関数

from PIL.ExifTags import TAGS
from datetime import datetime

# Exif データを取得
def get_exif_of_image(file):
    """Get EXIF of an image if exists.
    指定した画像のEXIFデータを取り出す関数
    @return exif_table Exif データを格納した辞書
    """
    im = Image.open(file)

    try:
        exif = im._getexif()
    except AttributeError:
        return {}

    exif_table = {}
    for tag_id, value in exif.items():
        tag = TAGS.get(tag_id, tag_id)
        exif_table[tag] = value
    return exif_table

def get_diff_time(file1,file2):
    """Calculate capture interval of images from  EXIF
    指定した2つの画像ファイル間の撮影時間の間隔を計算する
    """
    FMT = '%H:%M:%S'
    exif1=get_exif_of_image(file1)['DateTime']
    exif2=get_exif_of_image(file2)['DateTime']
    dtime = datetime.strptime(exif2[-8:], FMT) - datetime.strptime(exif1[-8:], FMT)
    return min(3600*24-dtime.seconds,dtime.seconds)

多くなりすぎたのでStep3に関しては別記事に移行する気がします。

参考文献等

[1] HDRなどに関して:[CV]High-Dynamic-Range(HDR) Imagingについて - Qiita

[2] 球面極座標に関する図表などの引用:360度パノラマ画像から平面画像への変換手法 - LASTMILE WORKS / DYNAMO TECH - R&D Project - Medium

[3] パノラマ画像から矩形画像を切り取るプログラム:GitHub - NitishMutha/equirectangular-toolbox: Handy tool for equirectangular images

他余裕でき次第追記

VSCodeでコマンドをショートカットから実行する設定方法 -docmuteで個別コンパイルができない問題の解決-

TexはずっとTexstudioで書いてきましたが,docmuteで分割コンパイルするときに困ったのでVScodeも併用します。

VScodeでコマンドをショートカットから実行する

ほぼ以下の記事の通りです。

qiita.com

keybindings.jsonを開く

まずは,設定を書き込むkeybindings.jsonを開きます。

コマンドパレット(ctrl+shift+p)を開き'key'と入力し「基本設定:キーボードショートカットを開く(JSON)」を選びます。

設定の書き方

開いたjsonファイルは[]で囲まれた記述が連なっていると思います。 下のような表記を中括弧[]の中に追記します。

    {
        "key": "F5",
        "command": "workbench.action.terminal.sendSequence",
        "args":{
            "text": "echo ${file}\n"
        }
    }

これはworkbench.action.terminal.sendSequenceというコマンドを介してtext: に連なるターミナルのコマンドを実行しています。

ここでいうターミナルはVSCodeの下にあるターミナルのことで,実行結果や経過を確認することができます。

f:id:ossyaritoori:20191117175325p:plain
Windowsの場合はPowershellを起動している。UbuntuとかならBashかな?

引数について

textの引数には以下のURLにあるような変数が使用できます。

例えば上の例の${file}は現在VSCode上で編集しているファイルのフルパスとファイル名です。

Visual Studio Code Variables Reference

自分の設定

後半で解説する問題を解決するために自分が書いたファイルは以下のとおりです。

    {
        "key": "F5",
        "command": "workbench.action.terminal.sendSequence",
        "args":{
            "text": "cd ${fileDirname}\n platex ${fileBasenameNoExtension}.tex \n dvipdfmx ${fileBasenameNoExtension}.dvi \n SumatraPDF ${fileBasenameNoExtension}.pdf \n"
        }
    }

「自分の今開いているファイルのディレクトリに移動」「platexとdvipdfmxでPDF作成」「SumatraPDFで表示」という順になっています。

docmuteパッケージの個別コンパイルができない問題

docmuteとは端的に言うとTexファイルの分割コンパイルのためのパッケージです。

ossyaritoori.hatenablog.com

以下のような構造で,mainがcahpter1,2をincludeないしinputしているときにmainでの全体コンパイルとchapter1単体のコンパイルをサポートしてくれます。

root/
 ├ main.tex
 ├ chapter/
   ├ chapter1.tex
   └ chapter2.tex

確認している問題

TexStudioのオートコンパイルの機能を使っている前提ですが, 他のファイルをコンパイルする前にmainをコンパイルした場合,chapter1のファイルを開いてコンパイルしても間違って全体がコンパイルされてしまう現象が起きてしまいます。


おそらく,main.texコンパイルで生成されたファイルの依存関係を参照してしまうためと思われ,ターミナルで必要なコマンドを直打ちするか,一度中間生成ファイルをすべて取り払うことで想定した動作を実現できます。

VSCodeを使った解決

TexStudioで編集しているファイルをVSCode同時に開いて全体コンパイルと個別コンパイルでエディタを分けて対応する様にしてやろうというのが今回の解決策です。

この解決策は最適ではきっとないでしょうが,VSCodeとは今後長いこと付き合っていきそうなのでできそうなことはVSCodeにやってもらおうかなと思っています。

Barrierを用いてUbuntuとWindows間でマウス・キーボード・クリップボード共有

前回の続きです。これはかなり嬉しい。

ossyaritoori.hatenablog.com

Barrier with Ubuntu16.04

前回の記事ではBarrierでWindowsのPC同士でマウスとキーボードを共有しましたが,今度はWindowsUbuntu間で試しました。 Ubuntu16は公式ではサポートしていないのでコミュニティのログを血眼になって探したところ,一つ前のバージョンで動作をさせることができました。

インストールする手順

インストールされるのはBarrier2.0です。現在の最新は2.1で2.2がbetaなのでギリギリ大丈夫だとは思います。

以下のコマンドを走らせることで,Barrierのソースを落としてきて自前の環境でコンパイルすることができます。

sudo apt-get -y install build-essential cmake qt5-default wget libxtst-dev libxinerama-dev libice-dev libxrandr-dev libavahi-compat-libdnssd-dev libcurl4-openssl-dev libssl-dev dh-make
wget https://github.com/truatpasteurdotfr/barrier/archive/v2.0.0.tar.gz  && tar xzvf  v2.0.0.tar.gz
cd barrier-2.0.0 && dpkg-buildpackage -us -uc | tee debian.log

barrierの実行ファイルはbarrier-2.0.0/build/binに作成されるのでディレクトリ移動して起動するかPathを設定しましょう。個人的にはディレクトリ移動して起動するスクリプトを書くほうが無難な気がします。

動作確認

さて,公式のissueなどではUbuntuマシンではクリップボード共有などはうまく行かないなどの報告が多いですが,偶々?私の環境ではきちんと動作させることができました。

欠点はWindows同士と比べて若干ラグを感じることです。タッチパッドのスクロールなんかは少し怪しいです。(ASUSのドライバがあんまり出来が良くないという説もあります。)


それでも無料のソフトを使ってマウス・キーボード・クリップボードLinux-DOS間で共有できるというのは割とすごいことの様に思われます。 ちなみにLogicoolのFlowでも今の所対応できていません。

製品版のSynergyにも期待が持てますね。

symless.com

とはいえ安心=課金

フリーソフトマニアが言うのもなんですが,安心は金で買うべきです。 Flow対応のキーボードやマウスをLogicoolから買えばもっと楽にファイル共有なども行えるでしょう。


というわけで広告を貼ります。これ別に私にお金はいるわけではないですけどね。

matplotlibを用いたfigure書き出しテンプレート(PDF図)

より良い記法をみつけ次第更新。こだわりポイントがある人はコメントで教えてください。

結論

折れ線プロット

PDFでplotをきれいに吐きたいならとりあえずこれ。

# setup 
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
import numpy as np

x = np.arange(0,10,0.5)
y = np.sin(x)

# plot template
fig = plt.figure(figsize=(5,4),dpi=80)
plt.plot(x,y,'-*',label='this is used for legend')
plt.grid()
plt.rcParams['font.family'] = 'Arial'
plt.title('Title above')
plt.ylabel('ylabel')
plt.xlabel('Time [s]')
plt.legend(loc='best', borderaxespad=0, fontsize=12)
plt.show()

# Save figure as PDF
pp = PdfPages('pdf_test.pdf')
pp.savefig(fig)
pp.close()

f:id:ossyaritoori:20191001093233p:plain
結果。 Legendは変な位置に行くならnortheastとかのほうがよいかも。

写真とplotを重ねる

写真と重ねたplotはベクターにする意義が薄いがまぁ統一するならPDFか。

fig = plt.figure(figsize=(10,10),dpi=200)

# Image Plot
img = plt.imread(’Filename’)
plt.imshow(img)
plt.grid()
# Scatter Plot
plt.scatter(ConvertedX,ConvertedY,c=color_code)
plt.colorbar()
plt.xlabel('longitude')
plt.ylabel('lattitude')

個々の機能について

Font変更

Times New Roman教の方はこちらから。 matplotlib のフォントはデフォルトで Bitstream Vera Sansですが,ArialやNew Romanなどがいい人は以下のように変更すればいいと思います。

自分用メモ: matplotlibを使ったグラフの調整 - Qiita

plt.rcParams['font.family'] = 'Arial'
#plt.rcParams['font.family'] = 'Times New Roman'

figureのサイズなどをいじる

plt.figure()の中身をいじればfigureのレイアウトや解像度を指定可能。

fig = plt.figure(figsize=(5,4),dpi=80)

PDFにエクスポート

多用するなら関数化しても良いかも。なお,ただの画像ならplt.savefig('figure.png')でOK。

from matplotlib.backends.backend_pdf import PdfPages

def savefigPDF(fig,filename):
    pp = PdfPages(filename)
    pp.savefig(fig)
    pp.close()

subplotを用いたplot

subplotの場合,plt.~~ で設定していた箇所が ax.set_~~になる。書き方も面倒になるし複数の図を整列したいなどの需要がない限り封印安定。

img = plt.imread("Map3forsave.png")
fig, ax = plt.subplots(1, 2,figsize=(10,10),dpi=200)
ax[0].imshow(img)
ax[1].scatter(sigpos_img[:,0],sigpos_img[:,1],c=signal_freq)
ax[0].set_xlabel()
ax[0].set_ylabel()
ax[0].set_title()

参考サイト

https://shimolab01.blogspot.com/2018/02/matplotlibpdf.htmlshimolab01.blogspot.com

qiita.com

Barrierを用いて複数のPC間でマウス・キーボード共有を行う(2019年秋Ver)

複数PCでのマウス・キーボード共有

複数のPCで作業する時に,マウスやキーボードをシームレスに共有するという思想が世の中には存在します。

Logicool社のFlowなんかもそうです。

www.youtube.com

FLowの場合,対応したマウスやキーボード機器を整える必要があり,またWindows間のみでの対応になります。


一方で,ソフトウェアのみをインストールすることで同様の機能を実現できるSynergyというソフトが存在します。 元がオープンソースなので古いverやソースコードは無料で手に入ったようですが,2019年現在実行ソフトを入れようとすると$29~39かかります(買い切り)。

SynergyではFlowでは対応していないWindowsLinux間での連携特別なハードウェアなしに実現可能な点が利点と言えます。 一方で,Linuxディストリビューションが多岐にわたり,完全な動作保証がしづらい点やLogicoolという大企業と比較すると購入後のサポート・保証にやや不安があります。 価格も買い切りとはいえ安いとは少し言いづらいので導入には少し気が引けます。


ということでSynergyから分岐したフリー版SynergyともいえるBarrierというソフトをお試しで浸かってみた記録をここに記します。

下記のサイトが大変参考になりました。 gihyo.jp

ざっくりBarrierの動作紹介

BarrierはWindowsLinux共に使用可能と説明があります。手持ちのWindows10,Ubuntu16.04を用いて試験をしました。

Barrierをインストールした後に起動すると,サーバーかクライアントかを選択します。メインでマウスとキーボードを使う側をサーバーとし,サーバー側PCから操作したいPCをクライアントと設定します

  • PCどうし接続するには同じWifi(回線)上に居なければならない(多分pingが通ればOK)
  • 設定した画面端にマウスを動かすと別のPC上でのマウスとキーボード操作に切り替わる
  • Windows間ではクリップボードの共有が可能(Linuxではまだとのこと)
  • ドラッグ&ドロップでファイル移動ができるとあるが動作を確認できず
  • Ubuntu16はそもそも非対応

Barrier試用結果まとめ

忙しい人用。

  • 無料でマウス&キーボード共有が可能
  • Windows間ならクリップボードも共有
  • Ubuntu16では正常に動作できなかった


インストールから設定まで

基本的にWindows版前提で話を進めていきます。Ubuntu18以降はgyhyo様のサイトに詳しく載っているので割愛します。

ソフトの入手・インストール

オープンソースなのでgitレポジトリから入手してコンパイルすることも可能ですが,実行ファイル形式でDLした方が手間が無いです。

f:id:ossyaritoori:20190926205847p:plain
このときはv2.3.1を使いました。
ダウンロード後管理者権限で実行すればすぐにインストール画面に進みます。

まともな日本語がきちんと整備されているので安心して言語選択で日本語を選べます。

インストール後,Bonjourというソフトをインストールするか聞かれます(オートコンフィグの為らしい)がなんとなくNoを押しました。 おそらくClient側からの自動接続機能用でしょうが,IPアドレスを手打ちすればいい話と思ったので

サーバー・クライアント共通の設定

共通の設定の設定から入ります。

f:id:ossyaritoori:20190926150439p:plain
Barrierの起動後に現れる画面

  • 設定を開く

「Barrier」→「Change Settings」或いは「F4」キーを押して設定を開きます。

f:id:ossyaritoori:20190926150544p:plain
この画面が現れます

  1. スクリーン名をわかりやすいものに変更(後の配置時に使います。)
  2. Enable SSLのチェックを外す。

「OK」を押して終了です。

注)接続がうまく行かないときは,ポート番号を変えるとうまくいくなどの報告があるのでポート番号をキチンと確認しておきましょう。

サーバーの設定

続いて,サーバー側の設定です。

  • サーバーの設定を開く

「サーバーを設定」から開きます。以下のような画面が出てきます。「画面とリンク」でPC同士の画面の配置,「サーバーの詳細な設定」のタブでその他設定を調整します。

f:id:ossyaritoori:20190926183200p:plain
PCを三台配置してみた。の図。

  • PCの画面の配置

上の図にもあるように最大25個の画面を配置するスペースがあります。25個も配置できるのかはよく知りませんが。PCはドラッグアンドドロップで配置を変更できる上,右上から追加,左上のアイコンから削除ができます。


  • 詳細な設定

詳細な設定を押すと以下の画面が現れます。Linux版はファイル転送やクリップボードのシェアが未実装なのでチェックを外すようですが,Windows版では特にいじらなくても平気です。

f:id:ossyaritoori:20190926202233p:plain

以上の設定の後に「開始」ないし「更新」を押すと設定が保存されプログラムがスタートします。

クライアント側からの操作

クライアント側からはサーバーのIPアドレスを入力すればOKです。ローカルな通信をしていますが,これってグローバルなIPでやってもできるんでしょうかね?

f:id:ossyaritoori:20190926202643p:plain

外部ディスプレイとの競合チェック

ここまでやって気になるのは外部ディスプレイ接続との競合です。

知見1:外部ディスプレイの先にアクセスできない

例えば右側にBarrierでディスプレイを設定した後に,外部ディスプレイでメインPCのディスプレイを右に拡張した場合,Barrierの移動が無効化されるようです。

f:id:ossyaritoori:20190926183115p:plain
外部ディスプレイとの相性① 外部ディスプレイの先には配置できないっぽい?

逆に左側でも同様でした。

f:id:ossyaritoori:20190926203652p:plain
左側に外部のディスプレイを設置するとその先にはアクセスできない。

知見2:なんか右方向は苦手

拡張ディスプレイの向きをBarrierの配置と干渉しないようにした結果,何故か右方向のディスプレイに移動できないことを発見しました。 なお,この構成だと拡張したディスプレイの左側からもBarrierの左でディスプレイにアクセスできます

f:id:ossyaritoori:20190926203345p:plain
上に拡張した場合,何故か右側にはアクセスできない。

下においた場合も同様です。

知見3:Barrier接続面の位置をあわせること

先程の試験で拡張したディスプレイからもBarrierのディスプレイにアクセスできることを確認しましたが,以下のように横のアライメントが合わないと拡張したディスプレイ側からは移動できなくなります。 マウスポインタの座標かなんかを使ってスイッチしているからでしょうか。

f:id:ossyaritoori:20190926204244p:plain
メインディスプレイの左端から左にはアクセスできる。

拡張ディスプレイの解像度の設定をいじっている人は気をつけるべきと思います。

なにやってんだろ。。。

おまけ

最適構成例?

先程のまとめで左側に配置したほうが安定していたので,左に拡張していったほうがやりやすいっぽいです。 皆さん右を向いて作業しましょう。

f:id:ossyaritoori:20190926204942p:plain
左に拡張していくのが最も安牌っぽい?

コピペの限界について

Windowsならクリップボードの内容を保持できるとのことですが,ファイルそのもののコピペはできません。 これはWindowsではファイルコピペ時にはデータのアドレスを操作しているからです。

ファイルの移動で、コピーより切り取りの方が速い理由 - t-hom’s diary

その代わり,スクリーンショットなどの画像データに関してはきちんとコピペを行うことが出きます。実際この記事のいくつかのスクショはBarrier経由で引っ張ってきています。

ファイル移動機能が使えない?

使えたらさぞかし便利なのでしょうが私の環境では使えませんでした。Issueもいくつか立っているので有名な問題のようです。

github.com

解決したら教えて。

まとめ

Barrierは設定が簡単な割には面白い使い方ができるソフトだと思います。 ファイル送信のバグが取れたら誰か連絡ください。

日本一と言われるウェルビーのサウナに行ってきた

以前,サウナと水風呂のサイクルを繰り返して俗に「整う」というトランス状態になれるという話を聞いてから何度か挑戦していますがまだその境地には達せていません。 私も整いたいですね。↓ こんな感じになるそうな。(出典:サ道~マンガで読むサウナ道~)


https://sakagami3.com/wp-content/uploads/2018/02/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2018-02-13-19.48.01.png

ウェルビー栄:店舗紹介

そんな中,ちょうど出張で名古屋に来ていた際に友人に『日本一』のサウナがあると教えられて立ち寄ったのがこの「ウェルビー栄」です。

ウェルビーのグループは本格的なサウナに力を入れているようで福岡などにも店舗があるそうですね。


場所は栄駅から徒歩10分程度で,同名のカプセルホテルと一緒に営業しているようです。(なお利用者は男性のみ)

www.wellbe.co.jp

料金

筆者はサウナ初心者なので界隈と比べたコスパ議論は控えますが,感覚的にはサウナの料金は結構高めです。

f:id:ossyaritoori:20190912211129p:plain
2019年の夏の料金表。学割の記述はないが受付で聞けば教えてくれる。

1時間コースもありますがサウナを楽しむのに1時間は正直少し短いので数百円を足して1860円食事付きの2時間コースが良いと思います。 なお,記載がないですが学割だと1540円で24時までいれるので学生証がある方は学割プランが良いと思います。

値段が張る代わりに,館内はきれいで無料の貸しタオルや飲料,ボディケアのアメニティが充実しているので私のように唐突に手ぶらで訪れても問題ありません。

設備

入り口以降はカプセルホテルによくある縦長ロッカーに荷物を預けて館内着に着替えます。 風呂場洗面台の他に,

  • マッサージ・垢すり
  • 食堂
  • 給水所
  • 休憩スペース

があります。


休憩スペースは広い上にごろ寝用のシートが快適で,セキュリティ上の問題がなければそのまま寝ていたいくらいです。 できることなら長期滞在で利用したいものです。




風呂場レビュー

風呂場は大まかに

  • 風呂場 2箇所
  • 水風呂
  • 高温サウナ
  • 森のサウナ
  • 北極サウナ
  • 休憩スペース

があります。

日帰り出張だったので時間に追われており,普通のお風呂には一切入らなかったのであしからず。

水風呂

入ってい左のサウナ①の近くに丸い桶状の水風呂があります。

f:id:ossyaritoori:20190912221622p:plain
見た目より深いです


ソムリエいわく温度は15,6度ということでこれは業界でも高水準の冷たさ(?)のようです。

水風呂の底が深めになっており,中腰くらいの体制で全身たっぷり水につかれる点が良かったです。 サウナトランスはわかりませんが酸欠のようなクラクラした感じを味わうなら手っ取り早く後頭部を冷やすと良いと今までの実験で判明しているのでいっそ潜るくらいでも良いでしょう。


「サウナトランス」のセルフ人体実験記録はいずれ公開するとして,楽しみ方についてサウナ名人のアドバイスが待たれるところです。

高温サウナ

入って右手にあるサウナその①。高温とありますが90度くらいでした。

f:id:ossyaritoori:20190912222343p:plain
手前が瞑想?ゾーン。奥がテレビ&寝サウナゾーンです。

温度は90度程度で部屋が広いため暑さはそこまででもありません。 部屋の片側はテレビと時計が近く,寝転がる為の斜めのスペースがあります。…寝転がるスペースがあります。 寝転がるサウナは長居しやすく,とても良いです。

寝サウナ。オススメです。

入り口を挟んで反対側は火元にやや近く,波の音が流れており静かに楽しみたい人用のスペースになっているようです。 私が行った時は瞑想をしている人がいました。

端的に良かった点をまとめると,

  • アロマの香りが強くロウリュの無いときも良い香りが漂っている
  • 寝転がるスペースが快適
  • 熱波師やアロマ含めてロウリュのクォリティが高い

となります。

19時に受けたロウリュですが,熱波師の扇ぎ方が非常に上手でサウナ上空の空気を打ち下ろされるので強い熱量を感じることができます。 最高点からバシっと打ち下ろす感じはタオルでラケット競技の素振りをするのに少し近い気がします。

バド,テニスプレーヤーは熱波師の素養がある説を唱えておきます。

ロウリュ中のアロマは当然良いのですが,ロウリュ後もアロマの香りがずっと続くのでアロマが好きな人にはポイントが高いと思われます。

森のサウナ

サウナその②。奥にあるなにやらムーディな空間に配置されています。

f:id:ossyaritoori:20190912222938p:plain
実際はもっと暗いです。手前には寝サウナスペースがあります。


入り口近くの木の棚にはサウナハットや腰布などが用意されていて,空間演出のこだわりが感じられます。

部屋が小ぶりで天井も近いため体感温度は先程のサウナよりも更に高いです。 また,ヒノキの香りが非常に強く森感をよく醸し出しています。


https://omocoro.jp/assets/uploads/15439855821jr1y.jpg

オモコロより画像引用。分子ガストロノミーもやってみたいですね。

例のごとく寝転がるスペースがある他,本格的な白樺の枝がありました。(ヴィヒタというらしい)

f:id:ossyaritoori:20190912223456p:plain
水に浸かっているヴィヒタ。使い方がよくわからんので適当にバシバシしてきました。

これで体をバシバシ叩くとロウリュにも劣らない熱量と独特の刺激が加わり気分良く体を温められます。 正直サウナ入っているときって暇なので手持ち無沙汰で一人でずっとバシバシしてました。
私も瞑想,覚えようかな。

アイスサウナ~湖のほとり~

本場フィンランドではサウナ後に氷点下の湖にダイブするそうです。アホかな?

f:id:ossyaritoori:20190912223240p:plain
例えるなら冷凍庫。手すりも凍ってます。

ということで森のサウナの直ぐ側にはこのような雰囲気のアイスサウナがあります。 本格派ということで中の手すりなども凍っているくらい冷たい冷凍庫のような空間です。というか冷凍庫です。

入った感想はあっこれはアカンやつやです。 水掛けの後10秒強体を沈めただけで手足がしびれてきてしまい本能的に飛び出してしまいました。確か出川○朗みたいなリアクションをしながら部屋を出たと思います。ヤバイよ~~。


おそらく修行が足りないせいだと思うのでみなさんも死なない程度にチャレンジしてくると良いと思います。冬の海で魚獲ってた濱口さんすげぇっす。

休憩スペース

一番奥には休憩スペースがあり,乾いたタオルで少し体を拭きながら休憩できます。

f:id:ossyaritoori:20190912224730p:plain
これまたムーディな休憩スペース。小鳥のさえずりがどこからか流れてきます。

サウナで気持ちよくなるのに楽な姿勢になるのは必要なシークェンスだと思うのでこれは非常にありがたいです。 なお,お風呂を出てもラウンジの休憩スペースがあるのでそちらでゆったりするのも良いでしょう。

サウナ&水風呂でクラクラした後,横になると気持ちよさからそのまま眠ってしまいそうになりますが今回は帰りの新幹線の時間が気になりすぎて寝れませんでした。 次は宿泊利用します…。

総評

宿泊利用で入り浸るべき。 あと誰かサウナトランスのコツ教えて下さい。

参考文献

名古屋のサウナの最高峰ウェルビー栄を初体験したよ!

Netlify CMS+Hugo+Githubで個人用のメモサイトを管理する

完成度は30%というところでしょうか。

目的

2019年夏現在の要望としては個人用の雑記やメモなどの文章を保管,管理できるようにしたいというのがあります。 より具体的にやりたいことを書いていくと,

  • ローカル環境(オフライン)で記事を編集,閲覧できる
  • 記事の検索などの機能が利用できる
  • Markdownで楽に書く
  • 初期設定が楽だと良い
  • (将来的には独自ドメインで運営?)

と言ったところです。

論文感想や教科書読んだ時のちょっとしたメモ,プログラミングのメモなど小ネタ等を書いてまとめるなくさないオンラインノートがほしいといったところでしょうか。

候補比較

すでにいくつか候補が上がっており,他の方も色々と考察してくれています。

各自いろんな基準を設けているようですが,以下の方の記述に非常に共感しました。

メモアプリを本気で選んでみた - Qiita

はてなブログやQiitaなどのブログサービス

  • 作成も管理も楽。
  • ローカル環境に記事が残らないのがややネック

Google Keep

  • Googleアカウントに紐ついたメモ帳。
  • すぐ使える。タグやアーカイブ,検索機能もある。
  • テキストしか書けず,高級な表現ができない。

スマホなどの小型端末から簡易的にアクセスするなら断然こっち

Dropbox paper

  • Wordに似た書き味だが,Markdownと制御文字が被っていてかなり良い感じ
  • 2019年8月現在 Dropboxとストレージが別になっているのもGood
  • この手のサービスは改悪されたりするので正直怖い面もある
  • ローカルからファイルに直接アクセスできない?

f:id:ossyaritoori:20190806220912p:plain
文章はこの様にきれいに書ける

正直GoogleDocumentもあまりうまく使えていないので二の舞になりそうではある。

Inkdrop

評判が良いが有料サービスなので整理が苦手な自分的には避けたい。StackEditに定期課金した500円がどうなったのか把握してないくらいなので… ハッカー向けノートアプリ「Inkdrop」は最高に使いやすいメモ帳ツールだった | Web Design Trends

メモ環境考察まとめ

  • 記事を公開してFBが欲しいならはてなかQiita
  • モバイル環境と連携した細かなメモならGoogleKeep
  • DropboxPaper,GoogleDocumentは良いところもあるがハマる使い所がわからない

手元にない欠陥を埋めるならば,ローカルに記事を保管しつつオンラインで閲覧,編集ができるサイト運営がしたい。

Netlify CMSで個人メモ環境を作る①

正直良くわかっていないのでざっくりと書くと,

  • ローカルでリポジトリ上のファイルを作成・編集し
  • Githubでバージョンを管理
  • Netlifyというサービスで静的サイトへと変換

という事になっているみたいです。

必要な準備

巷ではHugoという静的サイトをコンパイルする?ソフトを入れるという説明が多いですが,Netlify上で動かす分には自前で用意しなくても大丈夫です。

  • Github等のアカウントを作成(というか基本操作がわかっている前提)
  • Netlifyのアカウントを作成(Github等との連携)

Minimum Setup

以下のブログに従えば最小限の手間でサイトを作成できます。とりあえず試したいひとは適当なリポジトリを作って試すと良いです。 ottan.xyz

基本操作

Githubから編集する以外にも作成されたブログのアドレスの下に/adminを入れると管理画面に飛び,そこから編集を行うことができます。当然Githubに編集は反映されます。

ブラウザ,エディタの双方から編集できるので使用感は結構良い感じです。

カスタマイズ:不要な箇所を削除

デフォルトだとまんまKALDIのサイトになっているので見た目を気にするならば気になる所を削除します。これは後に追記します。

Hugoのテンプレから作成する②

上記の手順だとどうしても他のテーマで記事を作成したくなりました。

本来まともにやるならHugoでローカルでレイアウトを自分なりに編集しつつNetlifyにホスティングしてもらうという手順が良さそうですが今回はより簡単に済ませてしまおうと思います。

↓ちゃんとやっている例 https://blog.mismithportfolio.com/web/hugo-netlify-build

今回はこちらの記事を参考に進めていきます。 gomagaru.hatenablog.com

Hugoのテンプレからテーマを決める

以下のHugoのテーマ集から好きなテーマを選択してCloneないしzipでダウンロードしてきます。 themes.gohugo.io

私は検索機能を重視したかったのでDocDockというテーマにしました。Academicというテーマも良さそうです。

github.com

このリポジトリの内容を自分のリポジトリにforkあるいはコピーします。一応ライセンス条項的には違反してないですがこの辺のマナーはよくわかりませんので詳しい人が居たらご教授願います。

Netlifyでホスティング

このままだとただのGithubリポジトリになるので,Netlifyのページに行って,New Site from Gitを押して先程編集したリポジトリを選択します。 f:id:ossyaritoori:20190806223745p:plain

その後しばらくしたら見れるようになっているはずです。

f:id:ossyaritoori:20190806223919p:plain
右上の顔になっている辺りをClickするかURLを入力すればOK

その後,作成されたブログのURLが表示されるので,

/をつけることを忘れずに。

詳細は以下のページを参考にすると良いでしょう。今回やってみた所ビルドのコマンド等は勝手に決めてくれました。 Hugoで作成したページをNetlifyでホスティングする - Miki's Blog

Netlify CMSを導入

このままだとURLの下に/adminを入れても管理画面に飛びません。次にまた同じ方の記事をなぞってやっていきます。

gomagaru.hatenablog.com

上の記事の

  • Github連携
  • Netlify連携
  • adminフォルダ作成

を済ませます。

static/admin/config.ymlの編集

config.ymlは今後もいじりそうなので個別に項目を設けます。

テーマに沿った編集

ここからはdocdockを前提とした話を書きます。

Mypageフォルダを作成

このテーマでは左にmenubarの様にファイルを表示できます。

これは内部的にはフォルダで管理されています。

構成的には

-フォルダ
   |- _index.md
   |- その他の.mdファイル

となっており,_index.mdは以下の記述を文頭に持つ必要があります。

+++
title = "My Page"
description = ""
date = "2019-08-05T18:43:24+02:00"
creatordisplayname = "Yourname"
creatoremail = "yourmail@gmail.com"
lastmodifierdisplayname = "Yourname"
lastmodifieremail = "yourmail@gmail.com"
tags = ["tag1","tag2"]
weight = 10
pre ="<i class='fa fa-edit' ></i> "
+++
  • title:左のmenubarに出てくる名前
  • weight:字の大きさ?

titleを変更してmenuバーの表記を変えることだけ覚えていればとりあえずは良さそうです。

数式を入力可能にする

そのままではMathJaxが有効になっていないので,数式が打てません。 以下の記述をページに読み込んでmathjaxを使えるようにします。

<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>

ヘッタやフッタのテンプレートに潜り込ませるのが良いらしいのでlayout/partial/menu-footer.htmlに追加しました。

maku77.github.io

この時点でひとまずサイトとしては動きますが気力があれば続きます。