暇だったから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で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と省略することができる。
John the Ripperを使ったんだよ
ksnctfのなんかの問題でjohn the ripperを使った。
せっかくだからjohn the ripperの使い方をメモっとく
辞書ファイルとパスワードファイルがあるときの方法をメモっとく。(他の方法は必要になった時に追加するめう)
辞書ファイルがdict.txt
パスワードファイルがpass.txt
の時に
john --wordlist=dict.txt pass.txt
とすると
パスワード (user)
みたいな形式で出てきた(・∀・)「
出てくるのにすこし時間がかかった。
数秒で出るわけではないから少し待つ必要がある。