apt-getとaptitude
はじめに
Linuxでは、コンパイラやエディタ、ライブラリ等のパッケージのインストールを、コマンドを使ってできます。そのコマンドは、apt-getとaptitudeというコマンドがあります。下記ではそれぞれの違いについて簡単に説明します。
apt-getとaptitudeの違い
2つのコマンドの違いは、簡単に言えば推奨パッケージを自動的にインストールするかどうかです。推奨パッケージとは、あるパッケージをインストールした時に、必ずしもインストールする必要はないものの、同時にインストールすることを推奨されるパッケージのことです。
apt-get
apt-getはパッケージのインストールをするためのコマンドです。インストール可能なパッケージの検索はできません。別のコマンドapt-cacheを使います。推奨パッケージは手動でインストール必要があります。
update-alternativesの使い方
update-alternativesとは
Linuxを使う時、シンボリックリンクを使う時があります。例えばgccでは、生成したバイナリを動かす環境に応じて、バージョンを使い分ける必要があります。この時、毎回必要なバージョン以外のgccを削除することもできますが、シンボリックリンクを使ってバージョン管理をするのが便利です。lnコマンドを使ってシンボリックリンクを張ることもできますが、管理対象が別のパッケージに依存しており、かつそのパッケージのバージョンも変更しないといけないときは面倒です。update-alternativesコマンドはそうした時に使う、目的とするパッケージとそれに従属するパッケージのシンボリックリンクを、一括で切り替えることができるコマンドです。
Fig.1 update-alternativesコマンドのイメージ
update-alternativesコマンドの使い方
update-alternativesの主要なオプションは、
・--install
シンボリックリンクの作成・登録
・--slave
installオプションで作成したシンボリックリンクに従属するシンボリックリンクの作成・登録
・--set
使用するシンボリックリンクの設定(コマンド)
・--config
使用するシンボリックリンクの設定(一覧から選択)
・--display
現在選択されているシンボリックリンクの内容を表示
の5つがあります。下記ではそれぞれのオプションについて説明します。
--install
installオプションを使う時は下記の様に記載します。
sudo update-alternatives --install <作成するシンボリックのパス> <グループ名> <実体へのパス> <優先度>
例えばgccの管理を行う時は、
作成するシンボリックのパス = /usr/bin/gcc
グループ名 = gcc
実体へのパス = /usr/bin/gcc-4.8(管理したいバージョンのパスを設定)
優先度 = 10(任意の数字)
とします。
--slave
slaveオプションを使う時は、下記の様にinstallオプションを登録する時に、関連するシンボリックリンクを全て記載して使います。
sudo update-alternatives --install <作成するシンボリックのパス> <グループ名> <実体へのパス> <優先度>\
--slave <作成するシンボリックのパス> <グループ名> <実体へのパス>\
・・・・・・・・
--slave <作成するシンボリックのパス> <グループ名> <実体へのパス>
例えばgccと連動してg++のバージョンを変更したい場合は、
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 10\
--slave /usr/bin/gcc g++ /usr/bin/g++-4.8
として実行する。
--set
コマンドライン上でグループ名をタイプした時、呼び出される実体が、グループの中のどれを指すか、下記の様にコマンドラインで指定する。
sudo update-alternatives --install <グループ名> <実体へのパス>
例えばgccとタイプした時、gccの4.8を使いたい場合、
sudo update-alternatives --install gcc /usr/bin/gcc-4.8
として実行する。
メモリバンクとメモリインターリーブ
メモリにアクセスする時、メモリはRead / Writeされるための準備時間が必要になります。準備時間中はメモリへのアクセスが止まっている状況なので、処理時間においてこの時間は無駄な時間です。この無駄時間を短縮し、プロセッサのメモリアクセス時間を高速化する技術がメモリインターリーブです。
メモリインターリーブでは、アドレスマッピングとメモリアクセスの方法に、それぞれ下記の様な特徴があります。
・アドレスマッピング:複数のメモリバンクにまたがってアドレスをマッピングする。
・メモリアクセス :複数のメモリバンクに対して連続してアクセス要求を出す。
メモリインターリーブでのアドレスマッピング[1]
メモリインターリーブを使うとき、複数のバンクを1つのバンクのようにして扱います。下図のように、通常1つのバンクにおいてマッピングされる番地は連続です。しかし、メモリインターリーブを使うときは下図の様に、複数のバンクを使うことで連続にマッピングします(1バンクだけみると不連続)。
図1. メモリインターリーブでのメモリアドレスマッピング方法
最尤推定とベイズ推定とMAP推定
最尤推定
最尤推定とは、ある確率モデルが最も尤もらしい時のパラメータを推定する手法です。例えばコインの表・裏が出る確率を推定するモデルがある時、その確率はコインの状態に左右されます。よってコインの表・裏の出る確率を示すモデルは、
として表されます。
ここで、試行を繰り返して得たxの集合があるがパラメータの値が不明である時、パラメータがどのような値か推定することを考えます。確率モデル中のxは試行で得た固定の値とするため、確率モデルはパラメータを変数に持つ関数とみなせます。つまり確率モデルは、データXを取る時のパラメータの確率分布とみなせます。この確率分布の中で確率が最大となるが、データXを得た時のパラメータとなります。この操作を、確率モデルに対する最大尤度の算出、すなわち最尤推定と呼びます。
ベイズ推定
追々書きます
MAP推定
追々書きます
厚生年金について調べてみた
厚生年金という言葉は知っているものの、制度について全然理解していないことに最近気づきました。今回は厚生年金について調べた結果を纏めます。ただし、会社勤めをしている1980年以降生まれの方を対象として記載したので、一部省略した記述となっています。自分のケースは下記を参考にご自身で調べていただければと思います。
厚生年金の納付額
厚生年金加入者は、国民年金と厚生年金の両年金分を納付する必要があります。納付する額は、
- 毎年4月~6月の間の報酬(基本給+各種手当)の平均
- 国の定める標準報酬月額表[1]
- その時の保険料率
から算出されます。
例えば平成26年9月分からの保険料額表を見ると、1.の平均報酬額が30万だと、標準報酬月額表では18等級になります。この時の保険料率は17.474%であることから、保険料は月額約5.24万円とわかります。ただし厚生年金は、会社と個人が50%:50%の折半で保険料を納付します。そのため上記例では、個人で納付する額は月額約2.62万円となります。
この額は同年9月~次年の8月まで適用されます。ただし、7月以降に平均報酬が4~6月の平均報酬から大きく変化した場合、適宜保険料は改定される模様です[2]。
なお、厚生年金受給資格に満たない人は、個人での任意加入も可能です。
休職中の取り扱い
出産前後休業や育児休業中は、会社分・本人分の両方が免除となります(育児休業については子供が3歳になるまで)[3]。その他休業中の厚生年金料負担は、会社の決まり次第で変化する模様です(本人はその時納めないにしても、会社が負担してくれたり、会社が一時的に肩代わりして別途支払いするときがあります)[2]。
厚生年金の受給額
年金機構のサイト[4]を見ると、
年金額 = 定額部分(1)+報酬比例部分(2)+加給年金額(3)
(1)1,626円 × 定額部分の単価[5] × 被保険者期間の月数
(2)平均標準報酬月額(*2) × 報酬比例部分の乗率[5] × 被保険者期間の月数
(3)厚生年金保険の被保険者期間が、20年以上または40歳(女性は35歳)以降15年の人で、定額部分支給開始年齢に達した時点で、その人に生計を維持されている対象者がいる場合に支給[4]。
(*2)被保険者期間の各月の標準報酬月額と標準賞与額の総額を、被保険者期間の月数で除して得た額。
として算出されます。
例えば昭和59年9月8日に生まれた人が下記の条件を満たす時、
- 定額部分の単価 : 1.000([4]より)
- 報酬比例部分の乗率 : 5.481([4]より)
- 厚生年金加入期間 : 40年 = 40×12 = 480月
- 平均標準報酬月額 : 70万(生涯平均年収840万)
- 加給年金の対象となる家族はいない
年金額 = (1,626×1.000×480) + (70×5.481×480) + 0
= (780,480) + (184,162)
= 964,642(月額約8万円)
となります。
うーん。厚生年金だけの額とはいえ、少ない気がしますねぇ。。。
特異値分解(SVD)の概要
データの開先手法の1つとして、特異値分解(SVD:Singular Value Decomposition)という手法があります。SVDでは、不要なデータを取り除くことができるため、画像やテキストデータの圧縮や解析に使われます[1][2]。以降では数式を用いてSVDについて概要を説明します。
特異値とは
そもそも特異値とは、ある行列とその行列の随伴行列(ある行列の共役かつ転置した行列)の積の固有値の非負な平方根のことです。
#直感的にわかる説明ができずすいません。そのレベルまでは理解できてないです。。
特異値分解(SVD)の数式表現
SVDは行列とベクトルを使った2種類の表し方があります。まず最初に行列を使って表現してみます。例として、AというI×J行列のSVDを行うと、
と分解できます。ここで、
- : I行K列のユニタリ行列
- : K行K列の対角行列(対角成分は特異値で、を満たす)
- : I行K列のユニタリ行列の随伴行列
とします。このとき、Kとは、行列のランクを指します(K I, J)。
次にベクトルを使って表現すると、
とできます。ここで、
- : 左特異ベクトル(上記のk行成分
- : 特異値
- : 右特異ベクトル(上記のk列成分
とします。
上記のように、SVDを使うことで対象となる行列を、行列のランクKまでサイズを縮小、つまりデータサイズを圧縮してデータを表現できます。
SVDによる擬似近似
特異値の値に閾値を設けることで、SVDでは擬似的にランクを落とすことが可能です。この操作により、サイズをK→K'(K K')に落とすことができます(計算式は[3]の1.4節を参照)。
参考文献
[1]潜在的意味インデキシング(LSI)徹底入門 - あらびき日記
[2]Topic model
[3]Greenacre1984.pdf
ROSでパラメータを登録する方法
ロボット業界でよく使われるフレームワークとして、ROS[1]というものがあります。ROSでは、生成するプロセス(ROS的にはノード)毎にパラメータを設定することが出来ます。先日そのパラメータを使う機会がありましたので、パラメータの設定方法を書きます。なおプログラミング言語を用いて説明する部分に関しては、Pythonを使って記述します。
パラメータとは
パラメータとは、ノードが外部に公開する変数のことです。外部からパラメータに値を設定することで、ノードの挙動を変更することが出来ます。例えば移動を司るノードが外部にパラメータとして速度を公開している時、外部からパラメータを操作することで速度を変更することができます。
パラメータの設定方法
パラメータを設定する方法には
1. ソース上で設定
2. ノード起動時に設定する
3. コマンドラインで設定する
の3パターンがあります。それぞれの設定方法により、同じプログラムを使っても生成されるノード毎に保有するパラメータが異なるので注意が必要になります。また上記3つの方法があることで、ROSではいつでもノードにパラメータを設定することができるとわかります。
ソース上で設定する
ソースコードで設定するには、set_param関数を使います。ソースコード上で設定することで、そのソースを元に作られたノードには必ずパラメータが設定された状態で生成されます。つまり、
rospy.set_param('foo', 0.1) # デフォルト値0.1
とすれば、ノードは起動時点で必ずデフォルトで0.1という値が入ったfooというパラメータを持つことになります。
ノード起動時に設定する
ノードを起動する時、パラメータを設定して起動することができます。方法としては、
./foo.py /foo/bar:=0.1
とすることで、ノードfooに0.1という値を持つ変数barを持たすことができます。
起動時にパラメータを設けることで、同じプログラムから生成するノードで別々のパラメータを設けることができます。また、プログラムを修正するせずにパラメータを設定することで、お試しでパラメータを使って、ノードの動きを検証してみるということができます。