dorapon2000’s diary

忘備録的な。セキュリティとかネットワークすきです。

ns3.29のcodelのサンプルコードでSojournTimeを正しくトレーシングできない

正確には、ns-3-dev-git/codel-vs-pfifo-asymmetric.cc at master · nsnam/ns-3-dev-git · GitHubのSojournTimeを正しくトレーシングできません。その値をトレーシングしない以外は正常に動いていました。

特定の値の推移を記録できるトレーシングの仕組みについては、公式チュートリアルに詳しい説明があります。

環境

問題

github.com

codel-vs-pfifo-asymmetric.ccはns3に同封されているサンプルコードで、CoDelの性能評価することができます。 特にDroppingState・SojournTime・QueueLengthなどCoDelの性質を知るために必要な値をトレースできます。

問題は、SojournTimeだけなぜか出力ファイルが空白になってしまっていることです。 本来ならばcodel-vs-pfifo-fast-asymmetric-CoDel-sojourn.trにSojournTimeの値が時系列順に列挙されているはずです。

しかし、それ以外のトレースソースについては値をトレースできていますし、プログラム自体もエラーを出しません。

むむむ🤔

修正場所

2箇所修正すべき箇所があります。

$ diff -u codel-vs-pfifo-asymmetric.cc.orig codel-vs-pfifo-asymmetric.cc
--- codel-vs-pfifo-asymmetric.cc.orig   2018-10-12 00:50:29.826270000 +0900
+++ codel-vs-pfifo-asymmetric.cc        2018-10-12 00:51:16.568112000 +0900
@@ -92,9 +92,9 @@
 }

 static void
-SojournTracer (Ptr<OutputStreamWrapper>stream, Time oldval, Time newval)
+SojournTracer (Ptr<OutputStreamWrapper>stream, Time val)
 {
-  *stream->GetStream () << oldval << " " << newval << std::endl;
+  *stream->GetStream () << val << std::endl;
 }

 static void
@@ -109,7 +109,7 @@
   else
     {
       Ptr<OutputStreamWrapper> stream = ascii.CreateFileStream (sojournTrFileName.c_str ());
-      Config::ConnectWithoutContext ("/NodeList/2/$ns3::TrafficControlLayer/RootQueueDiscList/0/$ns3::CoDelQueueDisc/Sojourn", MakeBoundCallback (&SojournTracer, stream));
+      Config::ConnectWithoutContext ("/NodeList/2/$ns3::TrafficControlLayer/RootQueueDiscList/0/$ns3::CoDelQueueDisc/SojournTime", MakeBoundCallback (&SojournTracer, stream));
     }
 }

1箇所目は、Sojournというトレースシンク名で、正しくはSojournTimeでした。

  • SojournTime: Sojourn time of the last packet dequeued from the queue disc Callback signature: ns3::Time::TracedCallback

@ ns-3: ns3::CoDelQueueDisc Class Reference

2箇所目は、SojournTimeのコールバック関数のシグネチャが違いました。 上の記述にもCallback signature: ns3::Time::TracedCallbackとありますが、このシグネチャは引数を1つしか持ちません。

typedef void(* ns3::Time::TracedCallback) (Time value)

@ ns-3: ns3::Time Class Reference

当のコールバック関数SojournTracerはstreamと合わせて引数が2つじゃないかと思われるかもしれませんが、streamはns3の便利機能の1つで、いわばおまけです。 MakeBoundCallbackでファイルストリームをコールバック関数に渡すことでファイルに結果を出力してくれます。

過去の情報が修正されずに残ってしまったという感じでしょうか。

出力結果の可視化

トレース結果はgnuplotなどで可視化したいので、下に示すコードのように、時刻の値とsojournTimeの値を並べて出力するのがいいと思います。

static void
SojournTracer (Ptr<OutputStreamWrapper>stream, Time val)
{
  *stream->GetStream () << Simulator::Now ().GetSeconds () << " " << val.GetMilliSeconds() << std::endl;
}

Ubuntu 16.04 LTS で ns3.29 をインストールする

ns3.29が2018年9月4日にリリースされました。 ns3は1年に1回というペースでバージョンアップを繰り返しています。 早速自分もインストールしてみました。 以下では全部のせ(ns-allinone-3.29)のインストールをします。

エラーを被りながら、右往左往して得た最短ルートをうろおぼえで書いています。 間違っていたらコメントで指摘してくださると助かります。

環境

プレインストール

ns3のインストールの前に、必要なパッケージをaptコマンドでインストールしていきます。

$ sudo apt update
$ sudo apt upgrade

とりあえず、Installation - Nsnamに従って必要なパッケージをすべて入れます。 16.04でない環境の方は若干違うので、詳細はリンクを参照してください。

sudo apt install gcc g++ python python-dev
sudo apt install mercurial python-setuptools git
sudo apt install qt5-default
sudo apt install gir1.2-goocanvas-2.0 python-gi python-gi-cairo python-pygraphviz python3-gi python3-gi-cairo python3-pygraphviz gir1.2-gtk-3.0 ipython ipython3  
sudo apt install openmpi-bin openmpi-common openmpi-doc libopenmpi-dev
sudo apt install autoconf cvs bzr unrar
sudo apt install gdb valgrind 
sudo apt install uncrustify
sudo apt install doxygen graphviz imagemagick
sudo apt install texlive texlive-extra-utils texlive-latex-extra texlive-font-utils texlive-lang-portuguese dvipng
sudo apt install python-sphinx dia 
sudo apt install gsl-bin libgsl2 libgsl-dev
sudo apt install flex bison libfl-dev
sudo apt install tcpdump
sudo apt install sqlite sqlite3 libsqlite3-dev
sudo apt install libxml2 libxml2-dev
sudo apt install cmake libc6-dev libc6-dev-i386 libclang-6.0-dev llvm-6.0-dev automake
pip install cxxfilt
sudo apt install libgtk2.0-0 libgtk2.0-dev
sudo apt install vtun lxc
sudo apt install libboost-signals-dev libboost-filesystem-dev

ns3のダウンロード

以下はほぼGetting Started — Tutorialの翻訳みたいなもの。

ホームディレクトリを汚したくない方はワーキングディレクトリを作成してそちらにインストールしてください。 ns3のダウンロードにはいくつか方法がありますが、ここではbakeを使います。 別の方法としてtarballをダウンロードしてからインストールする方法もあるのですが、私の環境ではエラーが出てしまいました。

$ cd
$ mkdir workspace
$ cd workspace
$ hg clone http://code.nsnam.org/bake

bakeというディレクトリが作成されます。

$ ls bake
bake                  bakeconf.xml  doc       generate-binary.py  TODO
bake.py               examples      test

一時的にbakeディレクトリへのプログラムパスを通します。

cd bake
export BAKE_HOME=`pwd`
export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin
export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib

bakeを用いてns3をダウンロードします。 ns-allinone-3.29の部分のバージョン番号を直せば特定のバージョンを入れられます。 また、必要最低限のns3パッケージだけでいい場合は-e ns-3.29として下さい。

$ ./bake.py configure -e ns-allinone-3.29
$ ./bake.py check
$ ./bake.py download

sourceというディレクトリが新しくできます。

$ ls source
BRITE          netanim-3.108  openflow-ns-3.25  pygccxml-1.9.1
castxml        ns-allinone-3.29        pybindgen         v1.9.1.tar.gz
click-ns-3.25  nsc-0.5.3      pygccxml

ns3のビルド

ns3のビルドをします。

$ ./bake.py build

ns3のテスト

ns3に同封されているテストコードを実行して正常に動くか確認します。

$ cd ns-allinone-3.29
$ ./test.py

30分くらいかかりました。

最後にns3のサンプルスクリプトを動かしてみます。

$ ./waf --run hello-simulator
Hello Simulator

Hello Simulatorと表示されれば無事ns3.29のインストールは完了です。 お疲れ様でした。

参考

ネットワークシミュレータ ns-3.28 を Ubuntu 16.04 にインストール - ハードでもソフトウェア http://orsnken.hatenablog.com/

※記事のURLを貼るとバグるのでサイトトップページのURLで失礼します。

gnuplotほどよく必要最低限まとめ

実験で出たデータを手っ取り早くグラフ化して確認したいときに毎度gnuplotでぐぐってる気がするので、自分のために必要最低限だけまとめておきます。

環境

インストール

$ sudo apt install gnuplot

実行

グラフ化したいデータファイルを次のように用意しました。

$ cat data.tr
# comment
# x y z
1 2 1
2 4 4
3 6 9
4 8 16
5 10 25
6 12 36
7 14 49
8 16 64
9 18 81
10 20 100

gnuplotスクリプトをファイルへ書きます。 今回はxとyの値を使ったグラフを出力します。zの値は使いません。

$ cat graph.plt
set xlabel "x"
set ylabel "y"
plot "data.tr" using 1:2 w lp title "y = x ^ 2"
set terminal png
set output "graph.png"
replot
  • xlabelylabelはx軸y軸のラベル名。

  • plot "data.tr"gnuplotの核で、そのファイルを読み込んでグラフにプロットする。

  • using 1:2は1行にある空白区切りの1個目(=x)の値をx軸、2個目(=y)をy軸の数字として読み取れという意味。

  • w lpwith linespointsの短縮形で折れ線グラフになる。

  • title "y = x ^ 2"はそのまま。

ここまでがgnuplotによる画面への出力/描画で、出力先をpngファイルへ切り替えて、ファイル名の指定、pngファイルへの再描画をそれ以下で行っています。

gnuplotコマンドに渡して実行してみます。

$ gnuplot graph.plt

f:id:dorapon2000:20181007082508p:plain

ファイルへの出力だけにしたい場合は、いきなり出力先をpngに切り替えておきます。 WSL上でgnuplotを動かす場合はこうしないとうまく動きませんでした。

$ cat graph.plt
set terminal png
set output "graph.png"
set xlabel "x"
set ylabel "y"
plot "data.tr" using 1:2 w lp title "y = x ^ 2"

指定できるグラフの種類

with ???
lines ライン表示
points データポイント表示
linespoints ラインとデータポイント表示(折れ線表示)
impulses インパルス表示
dots ドット表示
steps ステップ表示
errorbars 誤差グラフ
boxes 棒グラフ
boxerrorbars 誤差と棒グラフ

CSVファイル

ファイルの先頭にset datafile separator ","を入れることで区切り文字をカンマへ変更できます。

引数を渡す

$ gnuplot -e 'indir="input"; outdir="$OUTPUT_DIR"' myscript.plt
set terminal png
set output outdir."/my_plot.png"
plot indir."/my_data.dat"

.は文字列結合

参考

シェル芸入門忘備録

突然シェル芸が勉強したくなったので、勉強したコマンドたちをまとめました。 シェル芸を忘れた未来の自分と、シェルは使ってるけどシェル芸のコマンドは知らない人向けです。 説明はできるだけ省いて、上から実行結果を見ていくだけで内容とシェル芸の雰囲気がつかめるよう努めました。


実施環境

紹介するコマンド

  • man
  • seq
  • shuf
  • tac
  • rev
  • yes
  • bc
  • tr
  • cut
  • sort
  • uniq
  • sed
  • awk
  • xargs
  • grepオプション
  • lsオプション

man

基本のキ。ホームポジションから手を離さず使い方を思い出せる。

$ man man

seq

連番を生成。1からなので注意。

$ seq 10
1
2
3
4
5
6
7
8
9
10

0から生成。

$ seq 0 5
0
1
2
3
4
5

bashの機能でも似たようなことができる。

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10

shuf

出力の順番をシャッフルする。

$ seq 5 | shuf
3
4
2
1
5

tac

逆順に表示。

$ seq 5 | tac
5
4
3
2
1

rev

各行の文字列をリバースする。

$ echo "いろはにほへと" | rev
とへほにはろい

yes

yを無限出力。

$ yes | head -5
y
y
y
y
y

文字を指定。

$ yes hello! | head  -5
hello!
hello!
hello!
hello!
hello!

bc

文字列を計算する。

$ echo "1+2*3" | bc
7

tr

置換。引数に空白""指定不可。

$ echo 1 2 11 10 2 | tr " " "\n"
1
2
11
10
2

$  echo 1 2 11 10 2 | tr "12" "ab"
a b aa a0 b

特定の文字列削除。

$ echo 1 2 11 10 2 | tr -d " "
1211102

cut

半角空白" "を区切り文字として3フィールド目を取得。区切り文字はデフォルトでタブ\t

$ echo 1 2 11 10 2 | cut -d" " -f3
11

-bでバイト目を取得。-cで文字目を取得だが、ubuntu@WSLではマルチバイト文字があるとエラーを吐いた。Macのcutは正しく動いた。

$ echo hello! | cut -b 2
e

$ echo hello! | cut -b 2-
ello!

sort

$ echo 1 2 11 10 2 | tr " " "\n" | sort
1
10
11
2
2

# --numeric-sort
$ echo 1 2 11 10 2 | tr " " "\n" | sort -n
1
2
2
10
11

# --reverse
$ echo 1 2 11 10 2 | tr " " "\n" | sort -nr
11
10
2
2
1

# --uniq
$  echo 1 2 11 10 2 | tr " " "\n" | sort -nu
1
2
10
11

uniq

重複削除

$ echo 1 2 11 10 2 | tr " " "\n" | sort -n | uniq
1
2
10
11

# --duplicated
$ echo 1 2 11 10 2 | tr " " "\n" | sort -n | uniq -d
2

# --count
$ echo 1 2 11 10 2 | tr " " "\n" | sort -n | uniq -c
     1 1
     2 2
     1 10
     1 11

sed

置換。

# ABC -> XYZ
sed 's/ABC/XYZ/g'

# 10行目~20行目で置換
sed '10,20s/ABC/XYZ/g'

# 2つ置換
sed -e 's/AAA/XXX/g' -e 's/BBB/YYY/g'

# AAAを含む行のBBBをCCCへ置換
sed -e '/AAA/s/BBB/CCC/g'

行の削除。

# 1行目削除
sed 1d

# 1~3行目削除
sed 1,3d

# #から始まる行を削除
sed '/^#/d'

文字の削除。

sed -e "s/ABC//g"

awk

ある種のプログラミング言語なので詳細は他のサイトに譲る。基本はawk PATTERN{ACTION}でif (PATTERN) ACTIONと捉えられる。

空白またはタブで区切られた5番目が10000以上のとき。

$ ls -l / | awk '$5 >= 10000 {print}'
-rwxr-xr-x  1 root root 87944 Jan  1  1970 init

$ ls -l / | awk '$5 >= 10000 {print $5}'
87944

ACTIONを省略すると{print}と同義。~は==の正規表現版。==はなぜか動かなかった。

$ ls -l / | awk '$6 ~ /Sep/'
drwxr-xr-x  1 root root   512 Sep 13 22:07 dev
dr-xr-xr-x 11 root root     0 Sep 13 22:07 proc
drwxr-xr-x  1 root root   512 Sep 13 22:07 run
dr-xr-xr-x 12 root root     0 Sep 13 22:07 sys
drwxrwxrwt  1 root root   512 Sep 12 22:00 tmp

PATTERNを省略すると全行に適応

$ ls -l / | awk '{print $1,$2,$3}' | head -5
total 88
drwxr-xr-x 1 root
drwxr-xr-x 1 root
drwxr-xr-x 1 root
drwxr-xr-x 1 root

$ ls -l / | awk '{print $1$2$3}' | head -5
total88
drwxr-xr-x1root
drwxr-xr-x1root
drwxr-xr-x1root
drwxr-xr-x1root

PATTERNには正規表現も可能

$ ls -l / | sed 1d | awk '/^[^d]/{print $9, "is not a directory"}'
init is not a directory

NRはNum of Recordsで現在行が入るawkの変数。NFもある。

ls -l / |  awk '/^[^d]/ && NR>1{print $9, "is not a directory"}'
init is not a directory

--field-separator。区切り文字をデフォルトの"[ \t]+"から":"に変更。-F","でCSVに使える。

$ cat /etc/passwd | awk -F":" '$7 ~ /bash$/{print $1}'
root
dorapon
  • ENDは最後に1回だけ実行されるPATTERN。BEGINもある。
  • PATERN{ACTION}は並べて複数書ける。
  • 仮想配列もある。ただし出力順番は不定
  • ACTION自身もセミコロン;で複数書ける。
  • for,while,case,ifも雰囲気で使える。
$ ls -l / | awk 'NR>1{month[$6] += $5} END{print "The sum of capacity of each month."; for(m in month) print m,month[m],"bytes"}'
The sum of capacity of each month.
Sep 1536 bytes
Jan 87944 bytes
Apr 5120 bytes
Jul 2560 bytes

xargs

空白タブ改行を一緒くたにまとめる。

$ echo "1 23\n4\t5 6  7\n\t89"
1 23
4       5 6  7
        89

$ echo "1 23\n4\t5 6  7\n\t89" | xargs
1 23 4 5 6 7 89

# 2行ごと改行出力
$ echo "1 23\n4\t5 6  7\n\t89" | xargs -L2
1 23 4 5 6 7
89

# 1行ごと
$ echo "1 23\n4\t5 6  7\n\t89" | xargs -L1
1 23
4 5 6 7
89

$ echo "1 23\n4\t5 6  7\n\t89" | xargs -L1 | tr " " "+" | bc
24
22
89

取得した複数のファイル名を1つづつ引数に取りたい時

$ grep -ils info /var/log/*
/var/log/dpkg.log

# xargsがないと出力自体を引数にとってしまう。
$ grep -ils info /var/log/* | tail -3
/var/log/dpkg.log

$ grep -ils info /var/log/* | xargs tail -3
2018-09-06 22:47:28 trigproc man-db:amd64 2.8.3-2 <none>
2018-09-06 22:47:28 status half-configured man-db:amd64 2.8.3-2
2018-09-06 22:47:33 status installed man-db:amd64 2.8.3-2

# 実際に実行するコマンドは-tオプションで見られる。
$ grep -ils info /var/log/* | xargs -t tail -3
tail -3 /var/log/dpkg.log
2018-09-06 22:47:28 trigproc man-db:amd64 2.8.3-2 <none>
2018-09-06 22:47:28 status half-configured man-db:amd64 2.8.3-2
2018-09-06 22:47:33 status installed man-db:amd64 2.8.3-2

便利なオプション

grep

オプション 説明
-r, --recursive 再帰的に探索 grep Error -r /var/log
-i, --ignore-case 大文字小文字区別なし grep Error -ri /var/log
-l, --files-with-matches ファイル名だけ出力 grep Erro -rl /var/log
-e, --regexp 正規表現
-o, --only-matching 一致した文字を出力 grep -e -o "eth[0-9]\+" hoge.log
-v, --invert-match を含まない grep -v 0 dropstats.log
-s, --nomessages エラー出力なし

ls

オプション 説明
-1 1行で表示 ls -1
-t 更新時間順 ls -lt
-S サイズ順 ls -lS
-F ディレクトリの後ろに/ ls -lF

乱数生成

bash環境変数$RANDOMを使う場合。ただし、0~32767。

$ echo $((RANDOM%+101))
47

連続で

$ yes 'echo $((RANDOM%+101))' | head -5 | bash
21
60
50
70
88

/dev/urandomを使う場合。

echo $(($(od -vAn -N1 -tu < /dev/urandom) % 101 ))
99

参考サイト

用語集:ランダム・乱数まとめ: UNIX/Linuxの部屋

AWKのトリッキーな配列&連想配列の仕組み・動作と目からウロコのテクニック (1/2):CodeZine(コードジン)

macをHigh Sierraにアップデートしたらoh-my-zshでタブ補完ができなくなった

1年ぶりのブログ更新になってしまいました。

ブログにまとめようとメモはたくさん残しているんですが、メモで満足してしまう感があります。

環境

さて、今のmacのターミナル環境はiterm2にzshとoh-my-zshを入れているのですが、気づかぬうちにタブ補完ができなくなりました。

1単語目ならコマンドの候補が、2単語目以降はファイルの候補が出てくるはずです。

タブを押してもボンボンというビープ音しか聞こえません。

自分のようなせっかちな人のために結論から述べると、High Sierraにアップデートしたことでoh-my-zshで謎の不具合が発生したことが原因です。

当初はzshからbashに切り替えてもタブ補完はできず、zshとoh-my-zshをアップデートしてもできず。

しかし、iterm2ではなくmacに初期搭載されているターミナルで試すとタブ補完できるということからiterm2に問題があるのだと思っていました。

High Sierraがiterm2のタブキーの機能を上書きしてしまったという当たりをつけて検索しても解決出来ませんでした。

結局放置してファイル名は長らくタイプしていました。

解決策

最近改めて検索したところ、oh-my-zshgithub issueに解決策が投稿されていました。

1nv3rse commented on 3 Dec 2016

I have solved it! in .oh-my-zsh/oh-my-zsh.sh, look at 14th line:

:${ZSH_DISABLE_COMPFIX:=true}

turn true to false, save it,then execute source ~/.zshrc ,restart your terminal,you will know some directory which are insecure,then execute chmod 755 <insecure-directory>, at last, back to .oh-my-zsh/oh-my-zsh.sh,the 14th line,turn false to true, and source ~/.zshrc

it will be solved!!!

github.com

まずホームディレクトリ以下にある.oh-my-zsh/oh-my-zsh.shの14行目をfalseにします。

 $ vim ~/.oh-my-zsh/oh-my-zsh.sh

.zshrcを再読込し、ターミナルを再起動します。

 $ source ~/.zshrc

すると次のようなメッセージがoh-my-zshから出ます。

Last login: Tue Feb 27 22:12:50 on ttys000
[oh-my-zsh] Insecure completion-dependent directories detected:
drwxrwxr-x    5 dorapon2000  admin    160  7  4  2015 /usr/local/Cellar/zsh/5.0.5/share/zsh
drwxrwxr-x  915 dorapon2000  admin  29280  7  4  2015 /usr/local/Cellar/zsh/5.0.5/share/zsh/functions
[oh-my-zsh] For safety, completions will be disabled until you manually fix all
[oh-my-zsh] insecure directory permissions and ownership and restart oh-my-zsh.
[oh-my-zsh] See the above list for directories with group or other writability.

[oh-my-zsh] Insecure completion caches also detected:
-rw-r--r--  1 dorapon2000  staff  1090  2 27 22:33 /Users/dorapon2000/.zcompdump-dorapon2000-MBA-5.0.5
[oh-my-zsh] Moving to "/Users/dorapon2000/.oh-my-zsh/cache/zcompdump-bad/"...

/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:81: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:95: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:102: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:115: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:125: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:135: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:144: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:150: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:153: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:156: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:159: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:169: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:172: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:174: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:188: command not found: compdef
/Users/dorapon2000/.oh-my-zsh/plugins/git/git.plugin.zsh:200: command not found: compdef

上のファイルパスが示されている2行に注目して、それらに対して権限を755にします。

 $ chmod 755 /usr/local/Cellar/zsh/5.0.5/share/zsh
 $ chmod 755 /usr/local/Cellar/zsh/5.0.5/share/zsh/functions

再び~/.oh-my-zsh/oh-my-zsh.shの14行目をtrueに戻せば.zshrcを再読込すればタブ補完が復活します!

 $ vim ~/.oh-my-zsh/oh-my-zsh.sh
 $ source ~/.zshrc

具体的な原因やなぜ復活するのかなどの疑問は塵となり海未の藻屑と化しました。

issueではタブキーをオーバーライドしてHigh Sierraのキー設定を上書きした方もいらっしゃるようです。

検索した当初は同じように悩んでる人がたくさんいると思ってたのですが、日本語記事は見当たらず、そんな人の助けになれば幸いです。

参考

stackoverflow.com

GF(仮)の小技

GF(仮)をやり始めてもう3年半程になりました。やりながら気づいた便利だと思うことやノウハウが結構あるので、初めてやる方やそうではない方でも役にたてばと思います。GFユーザーの中では当たり前に使われてるテクニックもあります。一応、wikiやGF公式には書かれていないようなことが多いので参考になるはずです。

前提

  • PC版(スマフォでは使えないものもあり)

時間短縮系

  • 無料キュピとスマイルキューピッドは1回押してブラウザバックすれば、キャッシュがあるのですぐ次の作業に移れる。
  • キュピチケはブラウザバック+再読込しないと使えず、画面下のタブを移動する必要があるため、同じキュピを連続で使うときは普通に画面に従ったほうが吉。1枚しかないときはブラウザバック+再読込。
  • 部活対抗戦を含むバトルはボタンを押して再読込すると再びバトル画面にもどる。バトルの結果はわからない。
  • 各イベントの「レターボックス」や「ブースチケット」なども再読込で先頭画面に戻る。
  • 多くのイベントでイベントアニメ(イベントOPやストーリーでゼリーを上げたあとのアニメ)を再読込で飛ばせる。
  • ぷちひろばやおでかけは画面上にマイページボタンがないため、ぷちガールちゃんトップ→マイページと2回ボタンを押さないといけない。マイページをブックマークにしているならば、ブックマークを押すほうがよい。
  • その日はじめてログインすると様々なPRやログインボーナスがあるが、ブックマークの連打ですぐ回避できる。

知識系

  • 前日の当日炭酸と当日ルンバーは午前3時にマイページへアクセスすることで失われる。正確には「出席簿の○○日連続ログイン」のページへのアクセス。それを回避できれば前日の当日炭酸ルンパーは使えるため、もし消費し忘れていたら、回避すればよい。(私はキューピッド画面をブックマークしている。)貯めた状態で無料キューピッドをすると、さらに貯まる。ただしログインはしたことにならないため、使い切ったらマイページにアクセスしないと連続ログインは途切れる。
  • デートをすれば進展度が2倍の量増える。進展度をあげたいガールだけを主選抜にした選抜をつくり、GF公式サークル(マイページ下方)の凸待ちのトピックで、その人達に3回バトルすれば進展度をすぐマックスにすることができる。登校でも可。
  • 体力ゲージを使うボタンは連続で押せないようになっているが、複数の端末でならその制限はないため、PCとスマフォでボタンを押し続けていれば2倍の速度で消費できる。
  • 選抜ボーナスはすべてLv.5以上にするようにするべき。弱いガールでも選抜ボーナスがLv.5になるように調整したほうが発揮値は高い。http://www52.atwiki.jp/vcard/pages/51.html
  • 主選抜ガールの声援効果は「自分の攻援力スーパー特大アップ」よりも「COOLの攻守大アップ」の方が最終的な発揮値は基本的に高い。http://www52.atwiki.jp/vcard/pages/141.html
  • 部活対抗戦の対戦相手はGFDBで部活検索すれば過去の順位などを確認できる。http://gfdb.info/
  • 部活対抗戦の選抜における獲得pt上昇率
    • 副選抜は声援Lv5以上でないとptはアップしない。
    • 副選抜は声援Lv10だと一人につき1.0%上昇する。
    • 主選抜は声援Lv1でも上昇し、0.1~4.0?%まで上昇する
    • 声援Lv10だとして、主全員&副1人の攻守大UP(約10%↑) > 属性大UP(約9%↑) >> 全体大UP(約5%↑) >> 自分自身スーパーUP(約3%↑)
    • 相手DOWN攻援UPと攻守UPは同じ。
    • 中〜特大UPは大UPとほぼ同じ。
    • 相性が悪くても1~2%しか落ちず、属性専用のデッキつくるより一番力を発揮できるデッキの方がいい。

GFの関連サイト

Sierraにバージョンアップしたらlatexコマンドが打てなくなった

今までOS X Yosemiteからバージョンアップせずに過ごしてきて、最近Sierraにバージョンアップしました。

特に不具合もなく好調だったんですが、platexコマンドを打とうとしてnot foundと出てしまいました。

とは言っても、今回は比較的簡単に問題解決しました。

前提

  • Yosemite -> Sierra
  • TeX Live Utility (MacTex-2014)

問題の部分

MacTexの公式サイトに載っています。

Sierra - MacTeX - TeX Users Group

要約すると、El Capitan以降でインストールする場所のパスが変わっていて、

MacTex-2014以前はそれに対応していないということです。

MaxTex-2016で上書きすれば、パスの書き換えをしてくれて問題も解決します。

ということで、MacTex-2016のダウンロードページ に行ったら下の方に、

リンクの書き換えだけなら"very small package FixLink.pkg"をインストールすればよいとありました。

MacTex-2016.pkgは2GBもあるので、私はこっちで済ませました。