Diary

Diary

日々学んだことをアウトプットする場として初めてみました

ラズパイのubuntuにVNC接続するまで

ラズパイのubuntuVNC接続するまで

  • VNC接続する際に次のような問題が発生したので、その解決策につてメモしておく
  • 環境
  • まずやったこと
    • ホストにVNC-CONNECTをインストール
    • ラズパイのGUI環境での設定
      • settings -> Sharing -> Screen Sharing をアクティブにする
    • terminalから、vncserverを起動
      • vncserverを入力
    • ホストのVNC-CONNECTからubuntuにアクセス
      • 多分最後に1が付く
      • XXX.XXX.XXX.XXX:1

[問題1] timed out する

しばらく待ってもタイムアウトする問題が発生

[原因]

firewallの設定で、ubuntuのportが開いていなかった

[解決策]

vncのデフォルトが5901なので、5901ポートを開放する

sudo ufw status
# 5901が空いてなければ
sudo ufw allow 5901

[問題2] 画面が灰色になる

[解決策]

lxdeをインストールして一部ファイルを書き換える

sudo apt-get install lxde
vim ~/.vnc/xstartup

xstartupの中身を以下のようにする

#!/bin/sh

xrdb $HOME/.Xresources
xsetroot -solid grey
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
# Fix to make GNOME work
export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession
/usr/bin/startlxde

ようやくUbuntuの画面が表示されました!(デフォルトのデスクトップと見た目が異なるけど...)

f:id:kokoichi206:20210717154216p:plain

参考にしたサイト

GitHub Pagesを用いた CI/CD 入門

GitHub Actions使ってみた

前からC I/CDに興味があったので、GitHub Actionsを使ってみました。

  • GitHub Actionsを使って、VueのbuildとGitHub Pagesへのdeployを行う
    1. GitHub Actionsへの登録
    2. Vueプロジェクトをpush
    3. GitHubでどのブランチから配信するかを決める
  • 使用した技術
    • Vue
    • GitHub Actions
    • actions-gh-pages
      • GitHub PagesにActionsからdeployするのに使う
      • 配信ファイルのみのブランチ(gh-pages)を作っている
  • 苦労したところ
    • リポジトリのrootディレクト以外の場所にVueの設定ファイルを置いていたため、ciのファイルの記述に戸惑った

GitHub Actionsとは

  • GitHubサービスコンテナ
    • いわゆるCI/CDの一つ
  • 特定のイベント(push, pullなど)に応じて、構文チェックやテスト、ビルドやデプロイなどを行ってくれる
  • 命令はymlファイルで記述する

ymlファイルの記述

  • 作り方(次のどちらか)
    • repository -> Actions -> New workflow からDeploy Node.jsを選ぶ
    • エディタで.github/workflows/node.js.ymlを記述(多分これでよい)
  • 今回用いたymlファイル
# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions

name: Node.js CI

on:
  push:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest

    env:
      vue-dir: ./deploy

    strategy:
      matrix:
        node-version: [16.x]
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/

    concurrency:
      group: ${{ github.workflow }}-${{ github.ref }}

    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v2
      with:
        node-version: ${{ matrix.node-version }}
    - name: Cache npm dir
      uses: actions/cache@v2
      with:
        path: ~/.npm
        key: ${{ runner.os }}-node_modules-${{ hashFiles('**/package-lock.json') }}
    - run: |
        cd ${{ env.vue-dir }}
        npm ci
        npm run build --if-present
    - name: Deploy
      uses: peaceiris/actions-gh-pages@v3
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        publish_dir: ./deploy/dist
  • やってること(上から)
    • on: どのイベントによって発火するか
      • 今回はmainブランチがpushされた時
    • env: 上で作成したコンテナに環境変数を設定
      • vueのプロジェクトフォルダを指定している
    • steps: - run:
      • vueのディレクトリに移動した上でビルドを行なっている
      • npm ciに注意する(後述)
    • steps:Deploy
      • フォルダの場所とdeployの設定により、publish_dir: ./deploy/distの部分を変える
      • 詳しい説明は公式のGitHubを参照
  • あとはpushすると自動で上のコードが走る

root ディレクトリ以外のVueファイルをdeployしたい

  • Actionsの設定でrootディレクトリ以外を使うには、次の2つが考えられる
    • linuxのコマンド、cdを使う
    • working-directoryの設定を行う
  • [注意] 1回cdで移動してもrunを変えると元の場所に戻ってしまう!
    • 以下は次のようなymlを記述した際の結果
steps:
~~ ~~
- run: pwd
- run: cd ${{ env.working-dir }}
- run: cd ${{ env.working-dir }} && pwd
- run: pwd  
~~ ~~

f:id:kokoichi206:20210717090121p:plain
cd_check_result

Vueを作成してpushしてみる

node.jsがインストールされていることが必要。vue/cli も追加でインストールしておく。

Vueプロジェクトを作成

$ vue create deploy

deployするためにのVueの設定

packege-lock.jsonが存在しない場合

以下のコマンドで生成する

$  cd deploy
$ npm install --package-lock

このファイルが存在しないとnpm ciがこける(ここがnpm installとの違い!)

deploy/vue.config.jsが存在しない場合

以下の内容を、deploy/vue.config.js に記述

module.exports = {
    outputDir: './dist/',
    publicPath: './'
}

このファイルがを記述しないと、配信した際に真っ白になる

GitHub でPages配信の設定を行う

  1. リポジトリの settings -> Pages へ移動
  2. Sourceを以下のように設定
  3. Branch: gh-pages
  4. /(root)
  5. Save ボタンを押す

f:id:kokoichi206:20210717093328p:plain
source

gh-pagesが表示されない場合は、Vueのpushを行った際に正しくActionが実行されてない可能性があるのでActionsから確認する

おわりに

CI/CDの機能としてテストも気になっているので次回以降やってみたいと思います

tanhとシグモイド関数の関係

tanhシグモイド関数の関係

とりあえず描画してみる

tanh


\tanh(x) = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}
import numpy as np
import matplotlib.pyplot as plt


x = np.linspace(-5, 5)

plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
plt.ylim([0,1])
plt.plot(x, np.tanh(x))

f:id:kokoichi206:20210714222034p:plain

sigmoid


\sigma(x) = \frac{1}{1+e^{-x}}
def sigmoid(x):
  return 1 / (1 + np.exp(-x))

y = sigmoid(x)

plt.plot(x, y)

f:id:kokoichi206:20210714221350p:plain

どう違うの?

  • ぱっと見どっちも形似てて一緒じゃん?と思ったので比べてみました
  • 両方を図示してみる
    • tanhの方が早く収束してそう?
    • 絶対値が違う

f:id:kokoichi206:20210714222410p:plain

  • 数式の上では?

\begin{eqnarray*}
\tanh(x) &=& \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} \\
&=& \frac{-(e^{-x}+e^{x})+2e^{x}}{e^{x}+e^{-x}} \\
&=& -1 + 2\frac{e^{x}}{e^{x}+e^{-x}} \\
&=& -1 + 2\frac{1}{1+e^{-2x}} \\
&=& -1 + 2\sigma(2x)
\end{eqnarray*}
def sigmoid(x):
  return 1 / (1 + np.exp(-x))

def tanh_from_sigmoid(x):
  return -1 + 2 * sigmoid(2*x)

最後に

  • previewモードでは数式の見た目が崩れていたので書き方があってるか何回も調べたが、結局投稿すると大丈夫だった

python: ベクトル内積計算の比較

pythonにおけるベクトルの内積計算

  • numpyのdotを使った内積計算が速いと聞いたので比較してみた
    • 単位は秒
num looping dotting
100万 0.106 0.0016
1000万 1.09 0.012
1億 42.45 0.15

なお、以下のコードを使用した

import time
import numpy as np
import random


def dotting(a, b):
    return a.dot(b)

def looping(a, b):
    D = len(a)
    result = 0
    for i in range(D):
        result += a[i]*b[i]
    return result

if __name__ == '__main__':
    dim = 100_000_000

    a = [random.random() for _ in range(dim)]
    b = [random.random() for _ in range(dim)]
    start_time = time.time()
    looping(a, b)
    print("looping takes: " + str(time.time()-start_time))
    
    a = np.array(a)
    b = np.array(b)
    start_time = time.time()
    dotting(a, b)
    print("dotting takes: " + str(time.time()-start_time))

SSH接続でGitに大容量ファイルをpushできない

SSH接続でGitに大容量ファイルをpushできない

GitHubssh接続していたのだが、大容量のファイル(といっても2Mくらい)をpushしようとしたときに、次のようなエラーが出た

Enumerating objects: 19, done.
Counting objects: 100% (19/19), done.
Delta compression using up to 4 threads
Compressing objects: 100% (15/15), done.
Connection to github.com closed by remote host.
send-pack: unexpected disconnect while reading sideband packet
fatal: the remote end hung up unexpectedly

fatal: the remote end hung up unexpectedlyやその上のメッセージなどでググったら「configでBufferのサイズを変えてみたら?」とか出たのでやってみたがうまくいかなかった

そこで、根本的解決ではないかもしれないが、.git/config[remote "origin"]のURLを、HTTPSのものに変えたらうまくいった

[remote "origin"]
-    url = git@git@github.com:~~~  
+    url = https://github.com/~~~  

xargs内でのコマンドの挙動について

xargs内でのコマンドについて

xargsを使った際に想像と違う挙動を示したのでメモしておく

環境

Ubuntu-20.04

BASH_VERSION-5.0.17

現象

echoでユニコード文字列を変換させて表示させようと思った際、echoをかますとうまくいかない

$ echo -e '\uFF10'
0
$ echo -e 'FF10' | xargs -I@ echo -e '\u@'
\uFF10

解決策

1回シェルを明示的に呼んであげる

$ echo 'FF10' | xargs -I@ bash -c 'echo -e "\u@"'
0

なお、これはbash3環境のmacではうまくいきませんでした。

原因

  • xargsが実行するコマンドを探す際、外部コマンドのみを検索対象としているから
  • そしてechoに関しては、ビルドインコマンドと外部コマンドでの挙動が異なる
# xargsの挙動
## 外部コマンドの存在するwhichの場合
$ type -a which
which is /usr/bin/which
which is /bin/which
$ echo 'ls' | xargs -I@ which ls
/usr/bin/which   # whichは発動している

## 外部コマンドが存在しないtypeの場合
$ type -a type
type is a shell builtin  # ビルドインコマンドしか存在しない
$ echo 'ls' | xargs -I@ type ls
xargs: type: No such file or directory

# echoの挙動
$ type echo
echo is a shell builtin
$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo
## ビルドインコマンド(通常)
$ echo -e '\uFF10'
0
## 外部コマンド
$ /usr/bin/echo -e '\uFF10'
\uFF10

補足

whichとtype

  • whichとtypeは挙動が似ているが、この違いもビルドインコマンドか外部コマンドかで説明できる
  • typeの方がビルドインコマンドである分、より正確に実行されるコマンドを把握している
$ type echo
echo is a shell builtin
$ which echo
/usr/bin/echo

解決策2

  • そもそも、xargs中では外部コマンドであるprintfを使う
$ echo '\uFF10' | xargs -I@ printf '\u@'
0

ワンライナーで簡単なグラフ写真を生成する

ワンライナーで簡単なグラフ写真を生成する

  • 以下の2つの流れで実行した
    • bcコマンドを用いた計算
    • gnuplotにつなげて、画像ファイルとして保存
  • 結論のコマンドと、その時のグラフ
    • 以下はxlogxの計算を行なっている("{} * l({})" の部分)
      • xlogxが0に収束するのが謎だなーと思い、図示してみた
seq 1 200 | sed "s@^@0.01*@g" | xargs -I{} sh -c 'echo {} | bc | tr "\n" "\t" && echo "{} * l({})" | bc -l' > ./xlogx \
 && gnuplot -e 'set terminal png; set size ratio 1; set output "./xlogx.png"; plot "xlogx"'

f:id:kokoichi206:20210707151402p:plain
xlogx

bcコマンドを用いた計算

  • bcの数値ライブラリ(option -l)を用いる
    • s(x) : sin(x)
    • c(x) : cos(x)
    • l(x) : log(x)
    • e(x) : exponential(x)
    • などが用意されている
    • 気になった方はman bc | grep '\-l' -A20で見てみるといいかも

bcコマンドを用いて xlogx を計算する

  • bcコマンドの使い方の確認
$ echo "2 * l(2)" | bc -l 
> 1.38629436111989061882

xを生成する

  • コンピュータには連続変数xなんてものは存在しない
    • seq を使って0.1刻みの、離散的な数値を生成する
  • どうせ後からbcを通すので、とりあえず下のように生成
$ seq 1 20 | sed "s@^@0.1*@"
0.1*1
0.1*2
0.1*3
0.1*4
...

yを生成する

  • 上で作られたxに対して、xlogxの計算を行なってやる
    • xargsを用いて、echoの引数に指定
$ seq 1 20 | sed "s@^@0.1*@" | xargs -I@ echo '@ * l(@)'
0.1*1 * l(0.1*1)
0.1*2 * l(0.1*2)
0.1*3 * l(0.1*3)
...

$ seq 1 20 | sed "s@^@0.1*@" | xargs -I@ echo '@ * l(@)' | bc -l
-.23025850929940456840
-.32188758248682007492
-.36119184129778079778
...

x,y をタブ区切りで表示

  • プロットさせるときの関係で、xとyをタブ区切りで並べて表示させる
$ seq 1 20 | sed "s@^@0.1*@" | xargs -I@ sh -c 'echo @ | bc | tr "\n" "\t" && echo "@ * l(@)" | bc -l'
.1  -.23025850929940456840
.2  -.32188758248682007492
.3  -.36119184129778079778
.4  -.36651629274966202607

gnuplotにつなげてあげて、pngファイルを生成する

  • xlogx というファイルが存在する場合の、ワンライナーでのpngファイルの生成の仕方は以下
    • 設定を読んでもらえれば、なんとなくやってることはわかると思う
gnuplot -e 'set terminal png; set size ratio 1; set output "./xlogx.png"; plot "xlogx"'
  • これを用いると、最終的に以下のような流れでグラフを生成することができる
    • 今までのコマンドを用いてxlogxというファイル(xlogx)を生成
    • その後に上のコマンドを用いてpngファイル(xlogx.png)を生成

最後に

「え、こんなのgnuplotとかpythonとかでxlogx書いた方が早いじゃん」という声が聞こえてきそうですが無視することとします

いつか役立つ時がくるでしょう

tag

linux, ワンライナー