VSCodeのLaTeX Workshopが定期的にバグるので自動コンパイル機能を自作してみた

VSCodeって便利ですよね. 便利すぎてもう離れられないと思います.

そんなVSCodeにはTex拡張機能としてLaTeX Workshopがあります. 文章を打つと,自動でコンパイルしてPDF出力してくれるのでとっても便利です.

marketplace.visualstudio.com

しかし.

最近バグ多すぎません???

バグ出る-->治す-->またバグが出る という循環で正直疲れました. 後,だいたいこういうのって重要な書類を作る直前に重大なバグが出現するもんなんですよね.

ただ、VSCode上でファイル編集はしたかったので,仕方なく自動コンパイル機能を自作してみました.

使ったもの

  • OS: Window10
    • WSLがある
    • 自分のメインマシン
    • MACでも動くけど,sumatraPDFが無いので代用する必要あり
  • エディタ: VSCode
    • エディタが使いやすい
    • レポートの結果が足りない場合もすぐに生成できる
    • スニペットに色々登録してある
  • Texのタイプセット環境: WSL(Ubuntu
    • コマンドを実行するだけだからかんたん
    • バグる心配もほとんどない
  • PDF閲覧: sumatraPDF
    • 軽量
    • 表示しているファイルを自動的に更新してくれる
    • タブで別のファイルも開くことができる
  • 更新管理: python

環境

実行する環境はこんな感じ f:id:motya1121:20190629103330g:plain

  1. [人間] Texファイルを更新
  2. [python] が更新を検知
  3. [python] タイプセットするコマンドを発行
    • [python] エラー: 10行ほどログを表示
    • [python] 成功: PDFが出力される
  4. [sumatraPDF] PDfの更新を検知して更新

ちなみに,複数Texファイルについても設定を変更することで対応できます.

VSCode

Texの入力補完としてLaTeX Workshopをインストール. ただし,自動コンパイルが動作すると,いろいろ面倒なのでオフにしておく. latex-workshop.latex.autoBuild.run: never

Ubuntu

Latexのタイプセットに必要なパッケージをインストール.

sudo apt-get install texlive-lang-japanese
sudo apt-get install texlive-lang-cjk
sudo apt-get install texlive-fonts-recommended
sudo apt-get install texlive-fonts-extra

こんな感じでインストールしたけど,いらないやつもありそうだなぁ

sumatraPDF

こちらよりインストール www.sumatrapdfreader.org

面倒であればブラウザで表示してリロードしながら見るのも有りかも...

python

Python3をインストール(自分の環境は3.6.2を使用) また,足りないパッケージをインストールする.

監視用プログラム

ここからソースコードをダウンロード github.com

適当なフォルダに展開すれば使えます

使い方

監視用プログラムの起動

  1. tex_watchの中のwatch.confを設定する
    • TEX_DIR_PATH: Texファイルが入っているディレクト
    • MASTER_TEX_FILE_NAME: 編集するTexファイル名(複数ファイルに分散されている場合,マスターとなるファイル名)
    • FIGURE_DIR: 画像用のディレクト
  2. watch.pyを実行 python /tex/path/tex_watch/watch.py -cf /config/path/watch.conf

これでTexファイルの監視が始まります.

  • 吐き出されたログはTexファイルと同じディレクトリのoutput.txtに保存される.
  • MACでも使えます
  • WSLを使わない場合は使えません

configファイルの書き換えを自動化

configファイルを書き換えるのが面倒なので,自動化するものを作成した. search_updated_texディレクトリ内のsearch_updated_tex.pyを実行することで,

  1. 指定されたディレクトリ内のTexファイルを探索
  2. 更新日が新しい順に並べ替え
  3. configに設定したいTexファイルをせんたく
  4. configファイルを更新 という処理をやってくれる.

コマンドとしてはこんな感じ python search_updated_tex.py -s /mnt/c/GitHub -sの後に調査したいディレクトリを入力するとその配下を調査してくれる.

まとめ

  • 実際に使ってみると,普通に快適に使えた.
  • LaTeX Workshopのエラーに付き合わされるくらいなら,コマンドに頼ってタイプセットしてたほうが安心

自宅LAN内のみで利用できる動画サイトを作ってみた話

みなさんもPCに大量の動画を保存していることかと思います. そんな動画をPCではなくスマホで簡単に見たいなぁと思ったわけですよ

例えば,布団でゴロゴロしながら見たいなぁとか,ちょっとソファでみたいなぁとか...  まあ,ホントの目的はそんなことじゃないんですけどね.男子なら分かってくれれうと思う..

ただ,実際やってみると,

  • わざわざPCからスマホにコピーするのダルいなぁ
  • DropboxとかGoogle Driveとかに置くのもなぁ(個人情報だし)(趣味バレ怖い)
  • youtubeの限定公開なんて論外だしなぁ

と感じていたわけですよ. そしたら,「あっサーバ立てればええやん」という考えになったので作りました.

どのくらいの規模の物作ったの?

サーバ立てればええやんと言っても,動画配信サービスなんて作ったことないわけですよね. そんで,「動画配信サービス 自作」とかって調べてみると,

  • ストリーミングサーバ用意しますよ~
  • RTMP使いますよ~
  • 動画ファイルエンコードしますよ~

とか書かれてるわけですよね.ただ,個人的には

いやいや,そこまでしなくいいんですよ~ ただ見れればいいんですよ~~

って気持ちなんですよ.

そんなこんなでいろいろ考えてみたら,

ん? これってhtml5のvideoで十分じゃね?

と思ったわけですね. なんせ1人しか使わないし,回線についても自宅内のLANだからまあまあ早いし.

というわけで適当に作ってみました.

作ったもの

ソースはこちら

github.com

f:id:motya1121:20190624150308p:plain
作った動画サイト

機能的には,とりあえず左側になけなしの検索と並び順の設定欄,右側にサムネイルをずらっと並べてあります. そんで,画像 or タイトルをクリックすると,

f:id:motya1121:20190624151143p:plain
再生画面

こんな感じで動画が見れるといった仕組みになってます.

(デザインセンスが皆無なのはご了承ください)

環境

WSLのubuntuを使用.

そんで動画本体,ソースコードはCドライブとかに保存しておいて,apachepythonとかはubuntuで動かす. これめっちゃ楽 (シンボリックリンク張りまくりだけどね.)

仕組み

動画の管理

動画が入っているディレクトリを指定して,pythonで永遠とmp4を探しまくってます. (僕のPCに保存されている動画の殆どがmp4なのでこれで問題ない) そんで,サムネイルに関しては,OpenCVを使ってそれっぽいものを作ってます. そして,動画ファイルの名前を変えても何も問題が無いように,取得した動画についてはハッシュ値で同一ファイルかどうかを確認.

これをjson形式でwebサーバに渡してる.

動画の再生

動画の再生についてはhtml5のvideoタグを使用. こいつ意外と優秀で,スマホとかで,画面の両側を2回タップするだけで,10秒スキップできたりする. そのままでも結構使える.

さっきのpythonから吐き出されるjsonファイルをPHPで読み取って,一覧に並べたり,検索したりしてる.

まとめ

適当に作るだけで,結構使えるものができてしまった. これで面倒なことがかなり減りそう.

大人数では使えなさそうだなぁ

raspberry piでAP作成

やりたいこと

ラズパイに立てたサーバ(Webサーバ)にスマホからアクセスしたい。しかも、今あるネットワークとは隔離したいので新たにAPを設置し、別のネットワークを作成する。まあ、なんでかこんな環境にする必要があったんですよね。。。

イメージ的にはこんな感じ

既存のネットワーク(192.168.0.0/24)----->[(eth0: 0.110/24)raspbrry pi(wlan0: 110.110)]<----Wifi(192.168.110.0/24)---->[スマホ]

作成するWebサイト

phpmysqlを組み合わせたどこにでもあるようなサイト。

使う機材とか

今回はWebサーバが動けばいいのでCUIのOSを選択。ドングルは「Raspberry Pi無線LANアクセスポイント化」というブログで紹介されていたものを何も考えずに購入。結果的には何も問題なく動作しました。ただ、結構発熱がすごいので、連続使用するときは注意が必要。 また、Wifiに関する設定もこちらのブログを参考にさせていただいています。

Raspberry Pi無線LANアクセスポイント化

Raspberry Piの無線LANアクセスポイント化 - DesignAssembler

構築

初期設定

まずはラズパイの諸々の設定をする。 最初に、sudo apt-get updatesudo apt-get upgradeのコンビでとりあえずパッケージの更新。 そして、諸々の設定を行った。

  • localeの設定。sudo dpkg-reconfigure localesよりja_JP.UTF-8 UTF-8を選択。
  • タイムゾーンの設定。sudo dpkg-reconfigure tzdataよりAsia/Tokyoを選択。
  • エディタとしてemacsをインストール。sudo apt-get install emacs-noxよりインストール
  • IPアドレスの設定。Wifi用のインタフェースを新たに作成しておく。/etc/network/interfacesに以下の内容を書き込んだ後、ネットワークを再起動。
# loopback
auto lo
iface lo inet loopback

# eth0
auto eth0 
iface eth0 inet static
address 192.168.0.110
netmask 255.255.255.0
dns-nameservers 192.168.0.1


# Wifi
auto wlan0 
iface wlan0 inet static
address 192.168.110.110
netmask 255.255.255.0
dns-nameservers 192.168.110.1
# ネットワーク再起動
sudo systemctl restart networking.service

Webサーバの構築

今回はPHPMysqlを使ったサイトを作りたいので、必要なパッケージをインストール。そして、httpsにもしたいのでいろいろとモジュールを追加した。そして、アップデートしやすいようにシンボリックリンクも作成した。

# package install
sudo apt-get install mysql-server mysql-client apache2 php php-mysqli  libapache2-mod-php
sudo a2enmod rewrite
sudo systemctl restart apache2

# SSL enable
sudo a2enmod ssl
sudo a2ensite default-ssl
sudo service apache2 reload

# web contents
mkdir ~/web
# Symbolic link
sudo ln -s /home/ubuntu/web/ /var/www/html/web

このあと、mysqlの初期設定を

sudo mysql_secure_installation

より行う。そして、DBの構築を行う。

APの設定

いよいよ本題のAPの設定を行う。

パッケージのインストール

APとしての処理を行うためにhostapdというパッケージをインストールする。

sudo apt-get install hostapd

hostapdの設定ファイルの作成

/etc/hostapd/hostapd.confというファイルを新規作成し、以下のように記述する。

interface=wlan0
ssid=<任意のSSID>
hw_mode=g
channel=3
wpa=2
wpa_passphrase=<任意のPW>
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

そして、hostapdに設定ファイルを読み込ませるために/etc/default/hostapd#DAEMON_CONF=""を以下のように変更する

DAEMON_CONF="/etc/hostapd/hostapd.conf"

自動的に起動するようにcrontabを設定する

crontabに以下の項目を追記する。

@reboot sudo hostapd /etc/hostapd/hostapd.conf

確認

一度sudo rebootにより再起動してから、Wifiが正常につながることを確認。 後は、アクセス権限とかを設定すれば完成かな。