Javaな日々

NO JAVA, NO LIFE.

卒研用 TeX テンプレ

そろそろ編入試験(院試)も終わって,卒研の時期になってきました. そんなわけで,卒研用の TeX テンプレを作ってみました.

他にも便利なツールがたくさんある中,卒論を TeX などという石器時代ツールで書くことの利点は,ずばり,「特に意識しなくても読みやすい形で出力されること」です. うちの教授も言っていましたが,TeX で作られた文書は査読審査の際に大変印象がよく,査読者としても読みやすくて大変助かるとか何とか.

個人的に,テンプレさえ作ってしまえばあとは文字を打つだけな点,Git 等でバージョン管理ができる点等は TeX を使う利点であると感じます. (私の場合は,Office for Mac が不安定でとても作業できる状態でないために TeX に乗り換えました.確か,本科 3 年の時の話かな.)

TeX Template

f:id:yksris:20141002223332p:plain

f:id:yksris:20141002223336p:plain

f:id:yksris:20141002223407p:plain

f:id:yksris:20141002223400p:plain

更新履歴

Ver. 1.0.0: 2014/10/12 公開

参考

卒論をTeXフォーマットなしから書くためのtips - シコウサクゴ()

TeX Live と TeXstudio でサクッと Windows 上に LaTeX 環境を構築

研究室の PC が Windows な事もあって,最近はなかなか Mac を触れていません. 今回は Windows 上に手軽に LaTeX 環境を構築する手順をメモしておきたいと思います.

使うもの

手順

TeX のインストール

まず,TeX Live をインストールします. TUG のサイト から DVD ISO をダウンロードしてくるといいと思います. インストールが完了すると,TeX に関する様々なコマンドが利用可能になります.

TeX IDE (TeXstudio のインストール)

次に,私が個人的にオススメの TeXstudio を TeXstudio のプロジェクトページ からインストールします. 私は昔,Texmaker を使っていたのですが,ここから派生した TeXstudio というものがあることを最近知って,インストールしてみて使いやすかったので論文作成にも使っています.

インストールして起動すると「これなら Texmaker の方がマシだ!」という感じの UI が立ち上がります. 全角文字を入力するとカーソルが飛ぶし,スペルチェッカーで文書が真っ赤っ赤だし……. 設定次第で何とかなります. ここからがメイン,TeXstudio の設定についてのメモです.

まず,一般設定(General). アンチエイリアスのかからない日本語の UI は見づらいので,TeXsduio の言語を English にします. スタイルは default の Modern,フォントは MS Reference Sans Serif がいいでしょう. 辞書はとりあえず英語にしておいてください.

次に,コマンド(Commands). 大体の人は,jsarticle か jsbook で文書を作成すると思います. ですので,コマンドの設定は以下のように.

  • LaTeX: platex.exe -synctex=1 -interaction=nonstopmode %.tex
  • DviPdf: dvipdfmx.exe %.dvi

次に,ビルド(Build)の項目.

  • Build & View: DVI->PDF Chain
  • Default Compiler: LaTeX

次に,エディタ(Editor)の項目. 日本語に対応していないスペルチェッカーの機能を無効にします. Inline Checking のチェックボックスをアンチェックしてください.

次に,設定画面の左下にある Show Advanced Options のチェックボックスにチェックを入れます.

行番号を表示させたいので,項目 Adv. Editor の Appearance 枠内の Show Line Numbers を All Line Numbers へ. 日本語入力時のカーソルのズレを直したいので,Hacks/Workarounds 枠内の "Try automatically choose best display options" をアンチェック,Render Mode を Qt へ変更します.

まとめ

以上で,Windows 上に LaTeX 環境を構築出来ました! F1 でビルドして PDF を確認できます.

テスラコイルについて

何故か強電系に手を出してしまっています.
製作次第書き足していきます.

テスラコイルの駆動方式

SGTC (Spark Gap Tesla Coil)

Nikola Tesla が発明したもので,最も基本的なテスラコイル
コンデンサによって回路電圧が上昇,スパークギャップ間の放電による短絡で高周波・高電圧交流を作り出し,それを1次コイルに印加.
2次コイルでは巻数比による昇圧,磁気的結合で伝わったエネルギーが作る定在波による昇圧によって更なる高電圧が作り出され,トロイド(空気コンデンサ)に蓄積,空気絶縁を破って空中を放電する.

f:id:yksris:20130908144301p:plain

SSTC (Solid State Tesla Coil)

SGTC のスパークギャップを半導体に置き換えて発振させるテスラコイル

DRSSTC (Dual Resonant Solid State Tesla Coil)

SSTC において,1次 LC 共振回路,2次 LC 共振回路 (コイルのインダクタンスと線間の浮遊容量による) を二重で共振させるもの.
共振時に回路のインピーダンスが最小になることを利用した,効率の高いテスラコイル

fetchmail で i.softbank.jp のメールを自動転送させる

Gmail の設定で i.softbank.jp のメールアドレスを追加することで,SMTP 経由で i.softbank.jp からメールを送信することはできますが,i.softbank.jp に送信されたメールをどう転送するか迷う.

普通に Gmail の設定で i.softbank.jp メールを転送しようとしたが,GmailPOP3 のみしかサポートしておらず,SoftbankIMAP のみしかサポートいないためどうにも無理が….

自分のサーバーを持っている人は fetchmail で転送出来ますので,今回はその設定方法です.

環境

手順

fetchmail をインストール.

$ sudo yum -y install fetchmail

一般ユーザーで fetchmail の設定ファイルを書いてもログイン後にしか起動してくれないので,root に設定ファイルを書きます.

$ su -
# cd /root/
# vi .fetchmailrc
set postmaster <転送先メールアドレス>
set nobouncemail

poll imap.softbank.jp
proto imap
timeout 30
username <i.softbank.jp のメールアドレスの @ 前>
password <i.softbank.jp メールのパスワード>
smtpname <転送先メールアドレス>
smtphost 127.0.0.1
idle
no mimedecode
keep
ssl

自動起動させるために,fetchmail スクリプトを書きます.

# cd /etc/rc.d/init.d/
# vi fetchmail
#!/bin/bash
#
# Fetchmail
# chkconfig: - 99 20
#
# description: Fetchmail auto start script

# Source function library.
. /etc/rc.d/init.d/functions
prog="fetchmail"
FETCH_PID=fetchmail.pid

function getpid()
{
    pid=0
    rc=-1
    if [ "$user" = "root" ]; then
      # for root.
      if [ -f /root/.fetchmailrc ]; then
        rc=0
        if [ -f /var/run/$FETCH_PID ]; then
          pid=`cat /var/run/$FETCH_PID  | sed -n '1p' | awk '{print $1}'`
        fi
      fi
    else
      # for users.
      if [ -f /home/$user/.fetchmailrc ]; then
        rc=0
        if [ -f /home/$user/.$FETCH_PID ]; then
          pid=`cat /home/$user/.$FETCH_PID  | sed -n '1p' | awk '{print $1}'`
        fi
      fi
    fi
}

start() {
    # Start daemons for root.
    user=root
    getpid
    if [ $rc -ne -1 ]; then
      if [ $pid = 0 ]; then
        echo "fetchmail for root starting..."
        /usr/bin/fetchmail
      else
        echo "fetchmail for root already runnning!!!(PID=$pid)"
      fi
    fi
    # Start daemons for users.
    for user in `ls /home/`
    do
      getpid
      if [ $rc -ne -1 ]; then
        if [ $pid = 0 ]; then
          echo "fetchmail for $user starting..."
          su $user -c "/usr/bin/fetchmail"
        else
          echo "fetchmail for $user already runnning!!!(PID=$pid)"
        fi
      fi
    done
}

stop() {
    # Stop daemons for root.
    user=root
    getpid
    if [ $rc -ne -1 ]; then
      if [ $pid = 0 ]; then
        echo "fetchmail for root No running"
      else
        echo "fetchmail for root stoping...(PID=$pid)"
        /usr/bin/fetchmail --quit
      fi
    fi
    # Stop daemons for users.
    for user in `ls /home/`
    do
      getpid
      if [ $rc -ne -1 ]; then
        if [ $pid = 0 ]; then
          echo "fetchmail for $user No running"
        else
          echo "fetchmail for $user stoping...(PID=$pid)"
          su $user -c "/usr/bin/fetchmail --quit"
        fi
    fi
    done
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart|reload)
    stop
    start
    ;;
  status)
    # Status daemons for root.
    user=root
    getpid
    if [ $rc -ne -1 ]; then
      if [ $pid = 0 ]; then
        echo "fetchmail for root No running"
      else
        echo "fetchmail for root runnning...(PID=$pid)"
      fi
    fi
    # Stop daemons for users.
    for user in `ls /home/`
    do
      getpid
      if [ $rc -ne -1 ]; then
        if [ $pid = 0 ]; then
          echo "fetchmail for $user No running"
        else
          echo "fetchmail for $user runnning...(PID=$pid)"
        fi
      fi
    done
    ;;
  *)
    echo $"Usage: $0 {start|stop|restart|status}"
    exit 1
esac

exit 0

スクリプトを認識させ,自動起動の設定をします.

# chkconfig --add fetchmail
# chkconfig fetchmail on

サーバーを再起動させて動作を確認してください.

Nested VM な環境で Live Migration する

ある VM を違うホストマシンの VM に移動させる技術を,Migration (マイグレーション) と言っています.Migration 指せる環境を作るにはサーバー機を 2 台用意する方法もありますが,仮想化の技術を試す中ではバカバカしいので,環境も仮想させて仮想マシンがサーバーを行き来する環境構築してみます.

f:id:yksris:20130314084400p:plain
サーバーで動いていた VM を…

f:id:yksris:20130314084407p:plain
別のサーバーの VM に移動,こんな感じ.

前提

今回はホストマシンの MacBook Pro 上に『移動させる VM をホストするサーバー』を仮想させた VM を 2 台用意して,その仮想 VM の間で VM を移動させます.(つまり,仮想 VM の中で仮想 VM を動かすということ)

※ 前提でホストマシンは MacBook Pro としていますが,Windows 機でも VMWare Workstation 等が動くのであれば同じように環境を構築できると思われます.

手順

Mac 上の VMWare Fusion を使って,ネットワークにブリッジ接続する形で仮想マシンを 2 台用意します.

それぞれの仮想マシンの設定ファイル MACHINE_NAME.vmwarevm/MACHINE_NAME.vmx を vim などで開き,最後の行に以下を追記します.

vhv.enable = "TRUE"

それぞれの VM に CentOS をインストールします.パッケージをカスタマイズする箇所では X Windwow System と GNOME,メインの仮想化に関するツール,最低限のビルドツールをインストールしておけば十分です.

CentOS で IP アドレスの固定,SELinuxiptables の停止を行います.

それぞれの VM で,GNOME のメニューバーから Applications → System Tools と辿って Virtual Machine Manager を起動します.

仮想サーバー 1 に QEMU を使って仮想マシンを 1 台作成します.

仮想マシンを作成すると /var/lib/libvirt/images に仮想ディスクが生成されるので,これを netfs で仮想マシン 2 と共有させます.この時,リモートから /var/lib/libvirt/images の読み書きの際に root 権限が必要になってしまうので,/etc/exports で設定してあげます.

仮想マシン 2 側で netfs で共有するように設定した仮想ディスクイメージを仮想マシン 2 自体 (正確には違うが…) に結びつけます.

仮想マシン 2 側でネットワーク共有している仮想ディスクイメージを主とした仮想マシンを作成します.

仮想マシン 1 側で作成した VM を起動させて,仮想マシン 2 側から Migration してやります.そうすると,仮想マシン 1 から 2 へ,VM が Migration できます.

ざっと流れはこんな感じです.詳しいことは後で付け足していきます.

今回のように仮想ディスクに関しては,ネットワークを通して使用することで VM を移動させる際のコピーの手間を省くことができますが,処理速度に直接関係する仮想メモリについてはそうはいきません.現在の仮想化技術で Migration を行う際は,このように仮想メモリの内容をネットワーク越しに移動先の VM にコピーしています.

なぜ移動させるか

仮想化のメリットとして,Migration が可能だということが挙げられますが,なぜか.負荷の低いサーバーを集約,または負荷の高いサーバーを分散させることによって,サーバー稼働率をあげられるからです.仮想マシンに対して,ホストマシンのスペック以上のスペックをあたえることを『オーバーコミット』と言いますが,これができるから集約・分散が行えます.負荷に合わせてリアルタイムで VM ホストサーバーを行き来するようなクラウドシステムになれば,より高い効率が望めるわけです.

Android をカスタマイズする上での知識

Android をカスタマイズする際は Android SDK をインストールしないと何も始まりません.
Windows の場合は Android の接続モードによって認識させるドライバーが違ったりしてるようなので,そのあたりのセットアップは各自で調べて行うといいと思います.

また,ブートローダーのアンロックや root 化を実施すると,メーカーのサポート対象外となるのでこれらは自己責任で行なってください.

ADB (Android Debug Bridge)

Android アプリケーションの開発の際のデバッグで使われるコマンドラインツール.
Android SDK をインストールすると,$sdk-path$/platform-tools/ の中に adb がインストールされている.この adb コマンドを用いてターミナル (コマンドプロンプト) から操作する.

主に *.apk (アプリケーション) のインストールや,端末内と PC でのファイルのやり取り,内部状態の表示などの機能を持っている.詳しくは Android公式サイト へ.

ブートローダ

Android は次のようなフローで起動し,操作可能となる.

  1. 電源 ON
  2. ブートローダー起動
  3. Android 起動
  4. システムアプリ起動
  5. 操作可能状態

通常の Android 端末ではこれらが自動的に行われ,操作可能状態となる.ブートローダーをアンロックすると,2 の状態でユーザーが起動するシステムを選択することが可能になる.すなわち,通常の Android システムを起動するか,各自で用意したリカバリーのようなシステムを起動するかが選択できるということである.

また,ブートローダーが起動している状態では fastboot コマンドを利用することができる.これもブートローダーをアンロックする利点の一つとして挙げられる.

Fastboot

USB ケーブルを介して PC から Android 端末のファイルシステムを操作するためのプロトコル.Android SDK をインストールし,Google USB Driver をインストールすると,$sdk-path$/platform-tools/ の中に fastboot コマンドがインストールされている.この fastboot コマンドを用いてターミナル (コマンドプロンプト) から利用する.

fastboot コマンドでは,各自用意したシステムやブートローダー,リカバリーのイメージデータを端末に書き込んだり (flash),一時的に起動 (boot) させたりすることができる.その他には以下の様な操作が可能.

usage: fastboot [ <option> ] <command>

commands:
  update <filename>                        reflash device from update.zip
  flashall                                 flash boot + recovery + system
  flash <partition> [ <filename> ]         write a file to a flash partition
  erase <partition>                        erase a flash partition
  format <partition>                       format a flash partition 
  getvar <variable>                        display a bootloader variable
  boot <kernel> [ <ramdisk> ]              download and boot kernel
  flash:raw boot <kernel> [ <ramdisk> ]    create bootimage and flash it
  devices                                  list all connected devices
  continue                                 continue with autoboot
  reboot                                   reboot device normally
  reboot-bootloader                        reboot device into bootloader
  help                                     show this help message

options:
  -w                                       erase userdata and cache (and format if supported by partition type)
  -u                                       do not first erase partition before formatting
  -s <specific device>                     specify device serial number or path to device port
  -l                                       with "devices", lists device paths
  -p <product>                             specify product name
  -c <cmdline>                             override kernel commandline
  -i <vendor id>                           specify a custom USB vendor id
  -b <base_addr>                           specify a custom kernel base address
  -n <page size>                           specify the nand page size. default: 2048
  -S <size>[K|M|G]                         automatically sparse files greater than size.  0 to disable

リカバリー

fastboot コマンドで行う操作をブラックボックス化することで,システムの修復やカスタマイズに必要な様々な操作を簡単に行うことができるシステム.メインシステムが起動しなくなった場合などに利用するサブ OS 的な位置付け.

端末によってはメーカーが作成したリカバリーがインストールされていることがあるが,ほとんどの場合大した機能を持っていない.そのため Android をシステムレベルでカスタマイズする場合,有志が作成したカスタムリカバリーをインストールして利用することが多い.カスタムリカバリーでは,システムイメージの書き込みやバックアップ/リストア,ディレクトリのマウント/アンマウントなどができるものが多い.ClockworkMod などが有名.

カスタム ROM

Androidオープンソースで開発されているため,ソースコードを取得することで誰にでもカスタマイズが可能.
Nexus シリーズの端末には Google 純正の Android (= Factory Image) が,メーカー製の Android 端末にはメーカーカスタマイズが施された Android がインストールされている.このどちらでもない,第三者がカスタマイズし作成した Android を カスタム ROM と呼んでいる.

カスタム ROM では,通常の Android では変更できない箇所がカスタマイズ可能になっていたり,メーカーの最適化では行き届いていない部分の最適化が行われていたりする.XDA Developer などの各コミュニティで制作が活発だったりする.

カスタム ROM は,先の Fastboot やリカバリーシステムを用いて端末に書き込むことができる.

root 化

通常の Android は,制限付きユーザーでのみ操作が可能である.例えば,/sdcard ディレクトリの読み書きは許可されているが,システムファイルの書き換えなどの操作には制限がかかる.root 化を実施し,su コマンドを叩くことでスーパーユーザー権限 (Windows で言う管理者権限) での操作が可能になる.

Android を root 化する場合,一般的に以下の操作が行われている.

以下は Nexus 4 を root 化する際のスクリプト./system ディレクトリを読み書き可 (RW) でマウントし,su コマンド,busybox コマンド,スーパーユーザー権限管理アプリをそれぞれの場所に書き込み,パーミッションを設定,シンボリックリンクを作成するなどしてコマンドのインストールを行なっている.

ui_print("=====================================================");
ui_print("===Root for Nexus Devices on Android 4.2 by HQRaja===");
ui_print("=Includes SuperSU 0.97, busybox and latest SU binary=");
show_progress(0.500000, 0);

ui_print("=================Mounting system...==================");
run_program("/sbin/busybox", "mount", "/system");
run_program("/sbin/busybox", "mount", "-o", "rw,remount", "/system", "/system");
run_program("/sbin/busybox", "mount", "-o", "rw,remount", "/", "/");

ui_print("===========Deleting old files if present...==========");
delete("/system/bin/su");
delete("/system/xbin/su");
delete("/system/app/Superuser.apk");
delete("/system/app/SuperUser.apk");

ui_print("=================Copying new files...================");
package_extract_dir("system", "/system");

ui_print("================Setting permissions...===============");
set_perm(0, 0, 06755, "/system/bin/su");
set_perm(0, 0, 0644, "/system/app/Superuser.apk");
set_perm(0, 0, 04755, "/system/xbin/busybox");

ui_print("==================Adding symlink...==================");
symlink("/system/bin/su", "/system/xbin/su");

ui_print("==================Installing busybox=================");
run_program("/system/xbin/busybox", "--install", "-s", "/system/xbin");

ui_print("=================Unmounting system...================");
run_program("/sbin/busybox", "umount", "/system");

ui_print("==========Finished. Reboot your device now.==========");
ui_print("=====================================================");
show_progress(1.000000, 0);

スーパーユーザー権限管理アプリでは,プログラムに必要以上の権限を与えないように,また不正なプログラムにスーパーユーザー権限を与えないように,適切に権限を管理する必要がある.

Nexus 4 を root 化する

root 化とは,su コマンドをインストールしてスーパーユーザー権限を開放し,システムレベルの変更を可能にすることです.

手順としては,まず root 化ファイルを導入するために ClockworkMod リカバリーというものをブートする (これを行うためにブートローダーのアンロックが必要). そして次に,su コマンドと関連のコマンド busybox,root 権限を使用するアプリの管理アプリ「SuperSU」を導入する,という流れ.
なお,ブートローダーのアンロックを行うと端末が初期化されるので注意.

これらの知識について,詳しいことは別記事でまとめました.
Android をカスタマイズする上での知識 - Javaな日々

root 化を行うためには Android SDK のセットアップ,Windows だと更にドライバーのインストールを行う必要があるので,その辺は他の方の記事を参考にしてください.

今回は Nexus Root Toolkit のようなブラックボックス化されたツールは使わず,ブートローダーアンロックからリカバリーのインストール,su コマンドの導入まですべて自力で行う手順を紹介しています.その分上級者向けの記事になっていますがあしからず.

環境

手順

root 化に必要なファイルをダウンロード

  1. ClockworkMod の公式サイト から Nexus 4 用の ClockworkMod リカバリー「recovery-clockwork-6.0.2.3-mako.img」をダウンロード.
  2. XDA の Nexus 4 root 化スレッド から SU_Busybox_Package.zip をダウンロード.
    (オリジナルは削除されているため当方は こちらのリンク のファイルを使用)

ブートローダーのアンロック

  1. Nexus 4 が起動した状態で PC と USB ケーブルで接続.以下のコマンドを実行してブートローダーを起動.
    (adb コマンドを利用するには,Android 側で「設定」→「開発者向けオプション」から USB デバッグを有効にしておく必要があります)

    $ adb reboot bootloader

    IMG_1456

  2. 次のコマンドを実行してブートローダーをアンロックする.ロック解除確認画面が表示されるので,ボリュームボタンで「Yes」にカーソルを合わせ,電源ボタンを押して選択し,ブートローダーのロックを解除する.
    ※ ロックを解除すると端末が初期化されるため注意が必要.
    ※ Windows の場合,fastboot コマンドを使用するにはドライバーのセットアップが必要.

    $ fastboot oem unlock

    IMG_1459

  3. ロック解除が成功すると再度ブートローダーが表示されるので,ボリュームボタンで上部が「Start」となるように選択し,電源ボタンを押して Nexus 4 を起動する.
    端末が初期化されているので各自セットアップを行う.

ClockworkMod リカバリーのブート

  1. Nexus 4 を PC に接続し,ダウンロードしておいた SU_Busybox_Package.zip を /sdcard 直下に配置する.
  2. 以下のコマンドでブートローダーを起動し,ClockworkMod リカバリーを Nexus 4 に書き込む.

    $ adb reboot bootloader
    $ fastboot flash recovery recovery-clockwork-6.0.2.3-mako.img

    Nexus 4 純正のリカバリーのまま root 化を行いたい場合は,以下のコマンドで ClockworkMod リカバリーを一時的にブートする.

    $ fastboot boot recovery-clockwork-6.0.2.3-mako.img

root 化実施
前の手順で ClockworkMod リカバリーを Nexus 4 に書き込んだ場合

ブートローダーが起動した状態で,上部を「Recovery Mode」となるようにボリュームボタンを使ってカーソルを合わせ,電源ボタンで選択してリカバリーを起動する.

前の手順で ClockworkMod リカバリーを一時的に Nexus 4 でブートするようにした場合

自動的に ClockworkMod リカバリーが起動する.

    IMG_1464

  1. ボリュームボタンを使って “install zip from sdcard” にカーソルを合わせ,電源ボタンを押して “Choose zip from sdcard” を選択する.
  2. /sdcard 直下にコピーしておいた “SU_Busybox_Package.zip” にカーソルを合わせ,電源ボタンを押して root 化ファイルを導入する.
  3. reboot system now” を選択して Nexus 4 をリブートする.