ちゃっくのメモ帳

ちゃっくがメモしときたいことをメモしとくよ

暇だったからSICPの1章の何問かをHaskellで解いてみたんだよっ

春休みに入って暇だったからSICPを眺めてて問題を幾つかHaskellの練習がてら解いてみた

問題1.3

square x = x * x
sum_of_square x y = (square x) + (square y)
prob1_3 x y z 
  | x <= y && x <= z  = sum_of_square y z
  | y <= z && y <= x  = sum_of_square x z
  | z <= x && z <= y  = sum_of_square x y
  | otherwise = -1

問題1.7

square x = x * x                               
average x y = (x + y) / 2                       
improve guess x = (average guess (x / guess))  
good_enough cur pre = if ((abs (cur-pre)) / cur) < 0.001 then True else False  

sqrtiter cur pre x = if (good_enough cur pre) then cur else (sqrtiter (improve cur x) cur x)
mysqrt x = sqrtiter 1.0 10.0 x

問題1.8

improve guess x = ((x/guess/guess) + 2*guess) / 3

good_enough cur pre = if ((abs (cur-pre))/cur) < 0.001 then True else False
cubeiter cur pre x = if (good_enough cur pre) then cur else (cubeiter (improve cur x) cur x)
cube x = cubeiter 1.0 10.0 x

問題1.11

fib n = if n<3 then n else fib (n-1) + fib (n-2) + fib (n-3)

問題1.12

pascal r c
  | r <= 0  = 1
  | c <= 0  = 1
  | r == c  = 1
  | otherwise = (pascal (r-1) (c-1)) + (pascal (r-1) c)

問題1.16

fastpowpow a b n
  | n == 0  = a
  | even n  = fastpowpow a (b*b) (n `div` 2)
  | otherwise = fastpowpow (a*b) b (n-1)

fastpow b n = fastpowpow 1 b n

問題1.17

double a = a * 2

halve a = a `div` 2

mymul a b
  | b == 0  = 0
  | even b  = (mymul (a*2) (b `div` 2))
  | odd b   = (mymul (a*2) (b `div` 2)) + a

問題1.18

double a = 2 * a
halve a = a `div` 2

fastmulmul a b ret
  | b==0    = ret
  | even b  = (fastmulmul (double a) (halve b) ret)
  | odd b   = (fastmulmul a (b-1) (ret+a))

fastmul a b = fastmulmul a b 0

うーん。飽きてしまったから問題を解くのはもういいかなって感じだ。
あとコードが汚い。
やっぱり括弧が多くなってしまうような場所は $ 演算子を使った方が良いのかな

stringstreamを使ってみたんだよ

C++でstringstreamを使ってみた。

空白区切り

何がしたかったかというとC++で空白区切りの文字列を処理したかった。
しかし、C++にはsplit関数がない。そこでstringstreamが使えるらしい。
ソースコード

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main(){
    string s = "abc def ghi jkl mno";
    stringstream ss;

    ss << s;
    string ret;
    while(!ss.eof()){
        ss >> ret;
        cout << ret << endl;
    }
}

出力

abc
def
ghi
jkl
mno

のようになる。

文字列から数値への変換

stringstreamを使えば文字列を数値に変換することもできるらしい
ソースコード

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main(){
    string s ="3.141592";
    stringstream ss;
    double pi;

    ss << s;
    ss >> pi;
    cout << pi << endl;
}

出力

3.141592

また文字列が数字とそれ以外が混ざっていた場合次のようになる

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main(){
    string s1 = "3.14aaa";
    string s2 = "aa3.14";
    string s3 = "aa3.14aa";
    string s4 = "3.1hoge415";
    stringstream ss1,ss2,ss3,ss4;
    double d1=0,d2=0,d3=0,d4=0;

    ss1 << s1;
    ss2 << s2;
    ss3 << s3;

    ss1 >> d1;
    cout << d1 << endl;
    ss2 >> d2;
    cout << d2 << endl;
    ss3 >> d3;
    cout << d3 << endl;
    ss4 >> d4;
    cout << d4 << endl;
}

出力

3.14
0
0
3.1

読み飛ばし

ignoreを使えば読み飛ばしができる。
ignore(n,delim)で
「最大n文字を読み飛ばす。もしくはdelimに一致するするまで読み飛ばす。」
となる。
但し引数がなければignore(1,EOF)となる。

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main(){
    string s = "123,456";
    stringstream ss;
    int r1,r2;
    ss << s;
    ss >> r1;
    ss.ignore();
    ss >> r2;
    cout << r1 << " : " << r2 << endl;
}
123 : 456

vim と tmuxで色がおかしいんだよ

なんかtmux上でvimを動かしてcolorschemeをjellybeansにした時に背景色が既に何かを書いた部分とそうでないところで変化してしまいおかしくなった。何故かneovimでは発生しない。正直neovimを使っているので問題は無いけど気持ち悪いので解決しておこうと思う。

まず[vim tmux]とかでググると.tmux.confに次を記述しろって出てくる
set -g default-terminal "xterm"
このxtermの部分はscreen-256colorだったりまちまちなので適当に??

でもこれでも解決しない。
調べてたらここに書いてあった。
Fixing Vim's Background Color Erase for 256-color tmux and GNU screen - The Terminal Programmer

なんかいろいろとvimrcに書き加えるのもあれなので

set t_ut=

と書き加えておいたらなんか解決した。(正直これが何を意味してるか知らないからなんで解決したかわかってないけどとりあえず解決ということで)

Ubuntuでtimeコマンドがなんかおかしい?

タイトル通り、ubuntu
time hoge
としても確かに計測はできているようではあるが出力にreal,user,sysとかがない。また、オプションを付けてもエラーがでる。
どうやらbashのtimeコマンドを呼び出してるのかなぁ。。。

結局直接timeコマンドを呼び出す必要がアルらしい

real,user,sysは次のようにすれば綺麗に見えた

/usr/bin/time -p hoge

これでうまくいった。

ubuntuでnpm使ったらちょっと辛い目にあったんだよ

ubuntu15.04でnodejs,npmをインストールした(結構前で何をどうやってインストールしたかは忘れたのでググってください)

そして
sudo npm install madoko -g
とかして、madokoをインストールしても、実際にmadokoを動かすと
/usr/bin/env: node: No such file or directory
というエラーが出てくる。
どうやらこれはubuntuだと名前がnodejsとnodeで違っていてパスが通っていないらしい(よくわかってないから説明がぐだぐだ)

これを解決する方法としてシンボリックリンクを貼って/usr/bin/nodejsと/usr/bin/nodeを同じにしちゃえばいいじゃんというものがあった。
つまり
sudo rm /usr/bin/node
sudo ln -s /usr/bin/nodejs /usr/bin/node

とすれば良い。

これでmadokoも動いた。やったね。

ちなみに他の解決方法でなんか
npmの新しいのをインストールするとかnodejs-legacyをインストールするとかあったけどどれもダメだった。最終的に動いたのが上記の方法だった。
でもなんか結構人によって解決方法が違ったらしい。

GDBを使ったんだよ

GDBを使ってデバッグすると便利らしいけど意外と使う機会がなかった。
でもちょっと使う機会が出来たから今後使う時に困らないように使い方をメモっとく。

まずコンパイル時にファイルにデバッグ情報を追加して最適化を向こうにする。つまりコンパイルするときにコンパイルオプション-g -O0を付けておく。

これを付けてコンパイルされたプログラムを走らせる。
gdb a.out

ブレークポイントの設定

ブレークポイントを設定するのにはbreakコマンドを使えばよい。main関数に入るまで走らせるなら
(gdb)break main
とすればよく、行番号で指定したいなら
(gdb)break 行番号
とすればよい。
またbreakはbと省略することもできる。

実行

実行するには
(gbd) run
とすればプログラムが開始される。
関数の中を追いかけるときは
(gdb) step
関数の中を追いかけない時は
(gdb) next
とすればプログラムが1行ずつ実行されていく
次のブレークポイントまで一気に動かすのには
(gdb) continue
とすればよい。
これらはどれもn,s,cと省略することができる。

レジスタを見る

アセンブリレジスタの値を覗きたければ次のようにすれば良い
(gdb) print /x $eax
とすれば%eaxレジスタの値を16進数で覗くことができる。
もし10進数で見たければ/d,2進数で見たければ/tとすればよい。
また-8(%ebp)みたいなアドレスを指定して値を覗きたいときは次のようにすれば良い
(gdb) print /x *(int *)($ebp-8)pr
さらに汎用レジスタの値を全て見たいときは
(gdb) info register
とすれば良い。これはコマンド i rと省略することができる。

layout機能

GDBにとても便利な機能としてlayout機能がある。例えばアセンブリソースコードを見ながら進めたい時には
(gdb) layout  asm
とすればよく、レジスタの値を見たいならば
(gdb) layout regs
とすれば良い。ソースコードを見たいならば
(gdb) layout src
とすれば良い。

僕が今求めているもの

layoutとかで変数の一覧を監視するみたいなことができたらうれしいから誰か知ってたら教えてくださいな

John the Ripperを使ったんだよ

ksnctfのなんかの問題でjohn the ripperを使った。
せっかくだからjohn the ripperの使い方をメモっとく

辞書ファイルとパスワードファイルがあるときの方法をメモっとく。(他の方法は必要になった時に追加するめう)

辞書ファイルがdict.txt
パスワードファイルがpass.txt
の時に

john --wordlist=dict.txt pass.txt

とすると
パスワード (user)
みたいな形式で出てきた(・∀・)「

出てくるのにすこし時間がかかった。
数秒で出るわけではないから少し待つ必要がある。