Rとjuliaとrubyとpython

フロー制御 4つの言語の比較の第三弾として,プログラムのフロー制御について,表にまとめてみた. Rjuliarubypython3 if a<-3 if(a==1){cat(1) }else if(a==2){cat(2) }else{cat(3)} a=3 if a==1 print(1) elseif a==2 print(2) else print(3) end a=3 if a==1 then p 1 elsif a==2 then p 2 else p 3 end a=3 if a==1:print(1) elif a==2:print(2) else:print(3) 三項演算子 a<-2 cat(ifelse(a>0,"+","-")) a=2 print(a>0 ? "+" : "-") a=2 print(a>0?"+":"-") a=2 print('+' if a>0 else '-') switch i<-"a" cat(switch(i,a=1,b=2)) i="a" p case i when "a" then 1 when "b" then 2
Read more...

Rとjuliaとrubyとpython

文字列の取り扱い 前回,4つの言語の比較したが,数値関係の使いやすさはjulia, R, ruby, pythonの順のように感じられた.今回は第二弾で,文字列の扱い方について書きたいと思う.表にまとめると,以下のようになった. Rjuliarubypython3 繰返 paste(rep("abc",3),collapse="") "abc"^3 "abc"*3 "abc"*3 連結 paste("abc","def",sep="") "abc"*"def" "abc"+"def" "abc"+"def" 結合 paste(1:5,collapse=", ") join(1:5,", ") [*1..5]*", " ", ".join(map(str,range(1,6))) 取出 substr("πℯ^2",2,2) collect("πℯ^2")[2] "πℯ^2"[1] "πℯ^2"[1] 部分 substr("πℯ^2",2,3) String(collect("πℯ^2")[2:3]) "πℯ^2"[1..2] "πℯ^2"[1,2] "πℯ^2"[1:3] 文字数 nchar("πℯ^2") length("πℯ^2") "πℯ^2".length "πℯ^2".size len("πℯ^2") 大文字 toupper("This") uppercase("This") "This".upcase "This".upper() 小文字 tolower("This") lowercase("This") "This".downcase "This".lower() 入れ替え chartr("A-Za-z","a-zA-Z","This") "This".swapcase "This".swapcase() 埋込 s="world" "Hello $(s)!" s="world" "Hello #{s}!" s="world" f"Hello {s}!" "Hello {}!".format(s) 書式 sprintf("%d %s"
Read more...

Rとjuliaとrubyとpython

数値の取り扱い
juliaを少しいじり始めたのだが,複数の言語の文法を混同して分からなくなってしまうので,並べて比較してみることにした.まずは,数値や数学関係の取り扱い方を,4つの言語について表にしてみた.

Rjuliarubypython3
5%%25.0%2.05.0%2.05.0%2.0
5%/%25.0÷2.05/2 or 5.0.div(2.0)5.0//2.0
分数5//25r/2from fractions import Fraction;Fraction(5,2)
xorbitwXor(3, 5)3⊻53^53^5
累乗2^0.52^0.52**0.52**0.5
平方根sqrt(2)√2Math.sqrt(2)import math;math.sqrt(2)
複素数(1+2i)^0.5(1+2im)^0.5(1+2i)**0.5(1+2j)**0.5
複素数sqrt(1+2i)√(1+2im)Math.sqrt(1+2i)import numpy;numpy.sqrt(1+2j)
実部 Re(1+2i) real(1+2im) (1+2i).real (1+2j).real
虚部 Im(1+2i) imag(1+2im) (1+2i).imag (1+2j).imag
共役 Conj(1+2i) conj(1+2im) (1+2i).conj (1+2j).conjugate()
偏角 Arg(1+2i) angle(1+2im) (1+2i).arg import cmath;cmath.phase(1+2j)
絶対値abs(-1)abs(-1)-1.absabs(-1)
円周率piπMath::PIimport math;math.pi
Euler数exp(1)Math::Eimport math;math.e
それぞれ,書き方に特徴がある.同じ記号でも,言語によって意味が違う場合があるので,注意が必要である.また,rubyではMathを使わないといけない場合があり,pythonはmathやnumpyなどを使わないといけない場合があり,どの場合にそれらを使わないといけないかを覚えるのが面倒に感じた.Rやjuliaは必要なものは,標準で大体は揃っているように感じるが,juliaではunicode文字を使えるのが特徴的である.eとℯが違うというのも少し驚いた.pythonの複素共役は関数なので括弧が必要というのが奇妙に感じた.
Read more...

行列の計算の言語による違い

Rとjuliaとpythonとruby

プログラム言語で数値計算をしようとするときに,行列を扱う必要がある場合がある.そのやり方が言語毎に特徴があるので,比較してみた.例として,行列を定義して,固有値を固有ベクトルを求めて,対角化を計算する場合について,やり方を見てみよう.

まず,私が数値計算をするときによく使っているRでは,インストールするだけで,行列を使うことができる.逆行列を求めるコマンドがsolveである点と,行列の掛け算が%*%であることに注意すれば,簡単に使うことができる.

a<-t(matrix(1:4,2,2))
r<-eigen(a)
r$values
r$vectors
solve(r$vectors)%*%a%*%r$vectors

次に,近年人気が出てきたjuliaであるが,これもインストールした時点で行列自体は使えて,さらにLinearAlgebraを組み込むことによって,固有値などの計算をすることができる.

a=[1 2; 3 4]
using LinearAlgebra
r=eigen(a)
r.values
r.vectors
inv(r.vectors)*a*r.vectors

数値計算の分野でもシェアを広げているpythonでは,numpyを使う必要がある.pipなどでこれをインストールできる.私の場合は,debianでaptitudeからpython3-numpyを入れた.numpyをimportして,linalgを使うと計算ができる.行列の掛け算がnp.dot()で書かないといけないのが面倒だったのだが,新しいversionでは@を使えるようになったようだ.

import numpy as np
a=np.array([[1,2],[3,4]])
r=np.linalg.eig(a)
r[0]
r[1]
#np.dot(np.dot(np.linalg.inv(r[1]),a),r[1])
np.linalg.inv(r[1])@a@r[1]

最後にrubyであるが,数値計算は比較的苦手である.行列計算はnarrayを使えば良いのだが,固有値の計算などは困難である.そこで,numo-linalgというものを使ってみた.このインストールは少し手間取ったが,以下のようにしたらdebianにインストールすることができた.

sudo apt install liblapacke libopenblas0
sudo apt install git ruby gcc ruby-dev rake make
sudo gem install specific_install
sudo gem specific_install https://github.com/ruby-numo/numo-narray.git
sudo gem install numo-linalg -- --with-backend=openblas --with-openblas-lib=/usr/lib/x86_64-linux-gnu

すると,numo/linalgをrequireしたら計算できるのだが,いちいちNumoと書くのが面倒なので,それをincludeした.narrayの場合には,NMatrixを定義すると,行列の積は*で書けるのだが,numoの場合には,numo-narrayのdotを使って書かないといけないのが面倒に感じた.

require "numo/linalg"
include Numo
a=NArray[[1,2],[3,4]]
r=Linalg.eig(a)
r[0]
r[2]
Linalg.inv(r[2]).dot(a).dot(r[2])

これらの4つの言語について,インストールのしやすさと,使いやすさを主観でまとめると,下の表のようになった.Rとjuliaはそれなりに使いやすいかな.pythonは行列の積が書きやすくなったことにより,昔よりは書きやすくなった.rubyはインストールが面倒だし,methodをうまく定義して,もっと使いやすくできるポテンシャルを秘めているが,まだまだのように感じる.ニーズが無いのかな.

installuse
R
julia
python△→○
ruby

数値計算をする場合には,Rを中心にやっていくことになりそうだ.juliaも使うようにすると,Rが苦手な処理を書きやすくなるかも知れない.

Read more...

Linuxのメモリ

DMIをdecode

PCでどのようなメモリを使っているかを,Linuxから知るにはどうしたら良いかを調べてみたら,

sudo dmidecode --type memory

とすると,現在搭載しているメモリの情報が得られるらしい.sizeやtypeはもちろん,part numberや,rankも調べることが出来るのは便利である.ECCかどうかは,total widthが72bitかどうかで判断するのかな.error correction typeというところにも書いてあるけど.

dmidecodeでprocessorを指定したら,CPUの情報も見れる.core数やクロックなども表示してくれるので,便利である.

Read more...

PGPかGPG

暗号化通信

暗号化通信としては,PGP(Pretty Good Privacy)が有名だったが,調べてみたら,GPG(Gnu PG)というのもあって,名前がややこしくなっていた.linuxには標準でGPGが入っているようなので,使い方を調べてみた.

まず,鍵のペアを作る.

gpg --gen-key

このとき,Real nameは五文字以上じゃないといけないが,emailは空欄でも良いし,復号のときに必要なpass phraseも不要なら適当で良いが空欄だと怒られた.-kオプションで実行すると,公開鍵の,-Kだと秘密鍵のリストが表示される.作った公開鍵をファイルに出力するには,

gpg -o pub.bin --export name

とする.別の公開鍵を読み込むには,

gpg --import keyfile

とする.公開鍵を削除するには,--delete-keyオプションを使う.暗号化するには,

gpg -e -r name file

とすると良い.このとき,file.gpgなどというファイルが出来るので,この状態で他の人に送ると良いだろう.復号化するには,

gpg file.gpg
で良い.この時,pass phraseが要求される.
Read more...

debianとpdf

pdfの編集
Linuxでpdfに文章を書き込む方法を探してみた.pdfを編集するには,libreofficeなどでもできる.しかし,もっと手軽にできないかと探してみたら,xournalというのを見つけた. インストールはaptで簡単にできる.少し使ってみたところ,編集としては,直線や手書きや文字を追加することはできたが,図形などは無理なようだった.修正液で消すことも出来た.用途は限定されるだろうが,簡単なことを簡単にやるには良さそうだ.

Read more...

cacheとswap

swapをあける

debianでメモリを大量に使う計算をやっていたら,メモリは足りているはずなのに,swapを使い始めた.swapを使っていると計算が遅くなるので,どうにかならないかなと思って調べてみたら,対応の仕方が分かった.このような場合には,メモリをcacheに使っていて,そのせいでswapが出来てしまうようだ.そこでまず,freeでメモリの使用状況を確認してから,cacheを開けるために,以下のコマンドを実行する.

sync
echo 1 > /proc/sys/vm/drop_caches

freeで確認するとcacheが減っているはずである.そして,swapの内容をmemoryに移すために,以下のコマンドを実行する.

swapoff -a && swapon -a

すると,それまで使っていたswapが使われなくってすっきりした.

Read more...

メモリ不足

swapを新たに設定

重い計算をしていたら,メモリが足りなくなったので,メモリを増設しないといけないかなと思っていたが,まずはswapでごまかすことにした.以前はHDDにlinuxをインストールするときに,swapを定義していたが,最近はSSDになり,メモリも増えたので,swapを定義しないようにしている.しかし,メモリ不足になったので,2nd storageであるHDDにswapを作ることにした.フォーマットをし直さないといけないのかと思っていたが,ファイルとしてswapを作ることができるようなので,やってみた.実行したコマンドを並べると,以下のような感じである.

cd /mnt/hdd
su
mkdir swap
dd if=/dev/zero of=/mnt/hdd/swap/swap0 bs=1M count=100000
chmod 600 /mnt/hdd/swap/swap0
/usr/sbin/mkswap /mnt/hdd/swap/swap0
/usr/sbin/swapon /mnt/hdd/swap/swap0
exit

まずはhddにswapのファイルを作り,それをswapとして有効にする.起動時にこれが有効になるようにするには,/etc/fstabに以下を書けば良いようだが,これはまだ実行していない.

/mnt/hdd/swap/swap0 swap swap defaults 0 0
swapを有効にしたことによって,メモリ不足で止まってしまっていたプログラムが無事に動くようになった.しかし,どの程度遅くなったかが問題だ.
Read more...

共用のHDD

ext4で戸惑った

linuxで誰からも使える共通のHDDを設定しようとしたら,少し苦労した.まず,lsblkでHDDの名前を確認して,/etc/fstabに以下のように書いて,ユーザーからマウントできるようにした.

/dev/sda1 /mnt/hdd ext4 rw,noauto,user,exec 0 0

このままだと,ユーザーが書き込めないので,umaskを設定してmountしたら,以下のようなエラーが出た.

mount: /mnt: wrong fs type, bad option, bad superblock on /dev/sda1, missing codepage or helper program, or other error.

この原因をいろいろと調べていたが,フォーマットをしていないとか,ユーティリティーが入っていないという記述も見つけたが,結局分かったのが,ext4ではumaskの設定が無いからだった.mountしてからrootでフォルダを作って,そのpermissionをgo+rwxにしたら,ユーザーから普通に読み書きできるようになる.結果としては,この方が楽なのだが,やり方が変わるのは面倒でもある.

Read more...