highlight.pack.js

2016年1月4日月曜日

Visual Studio 2015 の std::map について

STL の勉強をするために Visual Studio 2015 の std::map をコードレーディングした時のメモ。

  • _Tree にアルゴリズムの実装がある。(ヘッダーファイル xtree)
  • アルゴリズムは赤黒木。
  • _Tmap_traits がキーを使って比較するための関数オブジェクト。
  • _Tmap_traits を噛ませることで実際の木の実装と,内部オブジェクトの分離を図っている。
  • 高速化やデバッグコードの分離のために複数のイテレーターが存在する模様。

2015年2月20日金曜日

make_shared の弱点

make_shared の弱点

make_shared で確保されたメモリ領域は,それを参照する weak_ptr が無くならない限り解放されない がイマイチしっくり来なかったので、自分でコード作る+make_sharedのコードを追いかけて理解したので、 それのメモ。

以下のようなコードをメモリ使用量を監視しながらステップ実行して確かにそのようなことを起こっていることを確認出来た。

というわけで、どうしてそうなっているのかをソース追いかけてみる。 そうすると内部で、

_Ref_count_obj<_Ty> *_Rx =
        new _Ref_count_obj<_Ty>(_STD forward<_Types>(_Args)...);

と内部オブジェクトを作っているようだが、事実上これが shared_ptrの中身だと思って良さそうだ。 で、実際にそのコンストラクタのコードがこんな感じ。

template<class... _Types>
  _Ref_count_obj(_Types&&... _Args)
  : _Ref_count_base()
  {    // construct from argument list
  ::new ((void *)&_Storage) _Ty(_STD forward<_Types>(_Args)...);
  }

つまり、placement new を使って _Ref_count_obj の中に、そのままオブジェクトを構築していることになる。

この _Ref_count_obj_Ref_count_base を継承しているが、これが参照カウンタを持っている。 管理用のカウンタとオブジェクト本体が一緒になっているので、 オブジェクトを参照している weak_ptrshared_ptr がなくならなければオブジェクトが開放されないというのも納得である。

make_shared の中ではメモリの確保回数を減らすためにこのような処理を行っている、ということがわかっていればそれほど難しい事ではなかった。

2014年12月1日月曜日

フーリエ変換の結果

\begin{equation} F(k)=\dfrac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty} f(x)e^{-ikx}dx \end{equation}

で定義されるフーリエ変換の結果を纏めておく。

f(x)=exp(-a|x|) (a>0) の時

\begin{equation} f(x)=e^{-a\left|x\right|} (a>0) \end{equation}
\begin{equation} F(k)=\sqrt{\dfrac{2}{\pi}}\dfrac{a}{a^2+k^2} \end{equation}

f(x)=exp(-a^2x^2) (a>0) の時

\begin{equation} f(x)=e^{-a^2x^2} (a>0) \end{equation}
\begin{equation} F(k)=\dfrac{1}{\sqrt{2a}}e^{-\frac{k^2}{4a}} \end{equation}

f(x)=1/(x^2+a^2) (a>0) の時

\begin{equation} f(x)=\dfrac{1}{x^2+a^2} (a>0) \end{equation}
\begin{equation} F(k)=\sqrt{\dfrac{\pi}{2a^2}}e^{-a\left|k\right|} \end{equation}

2014年11月23日日曜日

AMS-LaTeXの環境に関するタグの使い方

基本的な環境

split以外の環境名の直後に*を付けると、式番号が振られなくなる。

equation 環境

一つの数式を表示する。

\begin{equation}
  a=b
\end{equation}
\begin{equation*}
  a=b=c
\begin{equation*}
実際の表示
\begin{equation} a=b \end{equation} \begin{equation*} a=b=c \end{equation*}

align 環境

複数の数式を&記号の後の文字でそろえて表示する。

例1

\begin{align}
a &= b \\
  &= c
\end{align}
\begin{align*}
d &= e + f \\
  &= g - h
\end{align*}
実際の表示1
\begin{align} a &= b \\ &= c \end{align} \begin{align*} d &= e + f \\ &= g - h \end{align*}

例2

\begin{align}
x   &= y   & X   &= Y \\
x'  &= y'  & X'  &= Y \\
x'' &= y'' & X'' &= Y \\
\end{align}
実際の表示2
\begin{align} x &= y & X &= Y \\ x’ &= y’ & X’ &= Y \\ x” &= y” & X” &= Y \\ \end{align}

gather 環境

複数の数式を整列せずに表示する。

\begin{gather}
a = b + c \\
c = d + e + f + g
\end{gather}
\begin{gather} a = b + c \\ c = d + e + f + g \end{gather}

実際の例

multline 環境

一行に入りきらない数式を複数行に分割して表示する。

\begin{multline}
  a=b+c+d+e+f+g+h+i+\\
    j+k+l+m+n+o+p+q+r+\\
    s+t+u+v+w+x+y+z
\end{multline}
実際の表示
\begin{multline} a=b+c+d+e+f+g+h+i+\\ j+k+l+m+n+o+p+q+r+\\ s+t+u+v+w+x+y+z \end{multline}

split 環境

他の環境の中で使うことで、複数行に跨がる数式を作ることが出来る。
equation 環境と合わせて使うことで、複数行に跨がりながら一つの数式番号しか与えないようなことも出来る。

\begin{equation}
  \begin{split}
    x_1 + y_1 &= a_1 \\
    x_2 + y_2 &= a_2 \\
    x_3 + y_3 &= a_3
  \end{split}
\end{equation}
実際の表示
\begin{equation} \begin{split} x_1 + y_1 &= a_1 \\ x_2 + y_2 &= a_2 \\ x_3 + y_3 &= a_3 \end{split} \end{equation}

notag, tag, tag*, text, eqref コマンド

notag
現在の行の数式に式番号を与えない。
tag
現在の行に任意の式番号を括弧付きで与える。
tag*
現在の行に任意の式番号を括弧なしで与える。
text
数式に注釈を入れることが出来る。
eqref
式番号を参照することが出来る。

\begin{equation}
  x^2 + 2x + 1 = 0 \notag
\end{equation}
\begin{equation}
  (x + 1)^2 = 0 \tag{}
  \label{eq:star}
\end{equation}
\begin{equation}
  (x - 1)^2 \neq 0 \tag*{式1}
  \label{eq:dagger}
\end{equation}
\begin{equation}
  x = -1 \qquad \text{\eqref{eq:star}から重解}
\end{equation}
実際の表示
\begin{equation} x^2 + 2x + 1 = 0 \notag \end{equation} \begin{equation} (x + 1)^2 = 0 \tag{※} \label{eq:star} \end{equation} \begin{equation} (x - 1)^2 \neq 0 \tag*{式1} \label{eq:dagger} \end{equation} \begin{equation} x = -1 \qquad \text{\eqref{eq:star}から重解} \end{equation}

gathered, aligned 環境

数式の幅が実際に文字が置かれている分だけになる。
括弧で括りたい場合などに使う。

例1

\begin{equation*}
  \left.
  \begin{gathered}
    &\nabla \times \boldsymbol{E} - \dfrac{\partial \boldsymbol{B}}{\partial t} = 0 \\
    &\nabla \times \boldsymbol{H} + \dfrac{\partial \boldsymbol{D}}{\partial t} = \boldsymbol{i} \\
    &\nabla \cdot \boldsymbol{D} = \rho \\
    &\nabla \cdot \boldsymbol{B} = 0
  \end{gathered}
  \right\} 
  \quad \text{マクスウェルの方程式}
\end{equation*}
実際の表示1
\begin{equation*} \left. \begin{gathered} &\nabla \times \boldsymbol{E} - \dfrac{\partial \boldsymbol{B}}{\partial t} = 0 \\ &\nabla \times \boldsymbol{H} + \dfrac{\partial \boldsymbol{D}}{\partial t} = \boldsymbol{i} \\ &\nabla \cdot \boldsymbol{D} = \rho \\ &\nabla \cdot \boldsymbol{B} = 0 \end{gathered} \right\} \quad \text{マクスウェルの方程式} \end{equation*}

2014年11月15日土曜日

AUCTeX のチートシート

AUCTeX を使うときに便利なコマンドを纏めておく。

C-c C-p C-p現在位置の図や数式のプレビュー状態を切り替え
C-c C-p C-c C-p現在位置の図や数式のプレビューを削除

2014年7月3日木曜日

Denyhosts が Ubuntu 14.04 LTS で削除されたようなので Fail2ban に乗り換えてみた

Denyhosts は ssh でのログインログを解析して、不正アクセスを検知すると自動的にそのユーザーからの ログインを拒否するように /etc/hosts.deny を書き換えるというものでした。

しかし Denyhosts は長い間放置されていたせいで、 Debian のパッケージから削除されてしまった模様です。 その関係で、Ubuntu 14.04 でも denyhosts が消されてしまいました。 Package denyhosts in Ubuntu Trusty Tahr is deleted: temporary or forever? というわけで、denyhosts から同等機能を持つ fail2ban に乗り換える事にしました。

「とある魔術の禁書目録」を途中で投げた僕が「魔法科高校の劣等生」を読み通せた理由

巷では、「魔法科高校の劣等生」(以下劣等生)がネタも含み、色々と叩かれているようですが、 私としてはそんなに悪い作品ではないかなぁと思っているのでちょっと援護してみようかなと思います。