関数の引数として関数をとる

C++なら関数オブジェクト使えとかいう記述をどこかで見かけたんだけど、結局よくわからなかったので関数ポインタを使う事にした。

引数の型 (*関数ポインタ名)(その関数がとる引数の型)

という形で宣言して使う。

例えばintで1つ引数をとって、5足したものを返してくれる関数を考えてみる。

int calc(int in){
return in+5;
}

int main(){
int (*fp)(int);
fp = calc;
fp(2)    // 7が返ってくる
return 0;
}

細かいアレはともかくとして、fpが関数ポインタ。こういう使い方だと今のとこあんま面白くないけど、関数ポインタを使えば関数の引数に関数を使える。

与えられた関数から返ってきた値の正負を判定する関数pmを考える。

int calc(int in){
return in+5;
}

bool pm(int (*fp)(int), int in){
if(fp(in)<0){
return false;
}else{
return true;
}
}

int main(){
pm(calc, -6)    //false
pm(calc, 3)    //true
return 0;
}

使いどころは、計算の一部分を利用者から与えてもらって、それを使って全体の計算をやるって場面。(ていうかそういう場面があったのでこうやって書きました)

具体的に言うと、数値解析のときにつかうテクニックがあるんだけど、これを毎度書いてるとウザいので、オレオレライブラリにしてやろうという感じ。テクニックのアルゴリズム自体はライブラリ側で全部書いておいて、利用者は目的関数の定義だけしてあとはそれを放り込むだけ〜というやつ。

ぶっちゃけこういう内容1年くらい前にやるべきみたいな雰囲気はある(今年度何した?に答えたくない)

あけましておめでとうございます(今更)

今更なんですが、あけましておめでとうございます。

年末のまとめ記事とか年始の目標記事とかそこかしこで見かけるので、てきとうにマネしてみようかと思いました。

まぁ、てきとうに何かを書きます

 

今年の目標(いまのとこ)
・シュウカツ
・学業なんとか
・放置しているプログラムを発掘してちゃんとしようかなとか
・自宅サーバのReplace
・ノートPCの新調

 

就活は言わずもがななんですよね。自分今大学院の1年生なんですけど(これから2年生になる)、進路キメないとっていう…

学業も、そろそろ本腰入れて研究進めないと何もやらないまま終わってしまう…アカン…………

 

で、放置しているプログラム。ぱっと思いつくのは2つ。

1つはAskMonaのクライアント(もな茶漬け)。タブ機能つけようとして色々いじってたら、過去自分が書いたコードが汚すぎてフルスクラッチで作り直す事を決意した…のはいいけど作業を何もやってないんですよね。今まで書いたものを全部無かったことにする訳だし勇気が…

2つめはツムツムの自動プレイヤー。ツムツムはその他のソシャゲと同じで、プレイにスタミナみたいなもの(ハート)が必要になる。で、このハートをLINE友達と相互に送り合う事が出来るので、時間で回復するのとは別に、ハートを得ることが出来る。一時期ハート交換グループに所属していた事があって、そのときに得たハートが沢山残っている(1ヶ月間以上連続プレイ出来る分量)。
で、ツムツムっていうゲーム、上手にプレイする事もそうなんだけど、とにかく沢山プレイしてレベルを上げていかないとスコアが上がらない。
つー訳でこれ自動化出来ればだいぶ捗るんじゃね〜〜〜〜?と思って1年ちょいくらい前にOpenCVでなんやかややってたんだけど、その当時まだプログラミングに全然慣れていなかったのでクソみたいなコードを書き連ねて、そのままお蔵入りになってしまった…
多少慣れてきたはずなので、今ちゃんとやりたいところ。

実は他にもあると言えばあるんだけど、面白そうかな〜やりたいな〜って思ってるのは取り敢えずこの2つ。

これとは別に、友達と「こんなシステム(サービス)あったら便利だよな〜」ってお話をして、設計とかやってる最中なのがあるんですが、これはもう用途がニッチなのであんまりおおっぴらにはしないかなーと。

 

つぎ。自宅サーバのReplace

今使ってる鯖は、もう十年近くもまえに組んだデスクトップPCの流用なので、相当キツい。オンボードのグラフィック機能が死んで画面表示が出来ない状況になっていて、結構ギリギリの状態で生きている。

AMDで組めば安くそれなりのものが出来るんじゃないかと(Ryzen期待)思っている。消費電力も抑えられればそりゃ嬉しいし、性能が上がれば仮想化してサーバを分けたりしたい。(今は自宅鯖とは別にNASとして別マシンを稼働させてる)

Ryzenの続報とか実際のベンチとか、情報が出てくるまで待つ心積もり。

 

さいご、ノートPCの新調

今使ってるのは大学入学時に購入したVAIO(S series)。載ってるのはCore i5 480Mで、もう世代的にキツい。それから、ずっと持ち歩いているからか、普通に角とか破損してるし、液晶周りのベゼルとかももうバキッと行きそうなレベルで亀裂が入っている。あと重い(物理的に)

という訳で新調を考えている。

候補はMacBook Pro Late 2016かDell XPS13 9360あたりかな。他にもあるかも?

・US配列に出来る事
->JIS配列本当にやめてほしい
・トラックパッドのスイッチが扱いやすい(出来れば独立して欲しいけど妥協可)
->Surface Pro 4のトラックパッドとか最悪
・Linuxうごく
->某Lenovoのヨガった奴みたいな事してくれないでくれると助かる(修正BIOS出てるらしいけど怖いジャーン?)

あたりを気にしている。モニタサイズは13インチくらいであれば良いけど、本体重量とか厚みとか電池持ちとかはあまり気にしてません。どうせ今使ってる奴より状態が悪くなる事はきっとないのだ、古いし劣化してるしなので。

なんでMacBookが入り込んでいるのかというと、どうせ新しくするなら、今まで触れたことのない新しい世界に飛び込んでみるのもいいんじゃないかなと思っただけ。ちょうどAppleレートも効いてるし、24回ローン金利0%キャンペーンもやってるし。あとバタフライキーボード割と嫌いじゃないです。

Linuxは現状動かないみたいだけど、macOSってUNIXベースなんでしょ?まぁなんとかなるっしょ()みたいな感じでナメきっている。で暫くしてLinux動くようになりそうだったら、ArchLinux突っ込んでしまえと思っている感じ。

で、まぁ、候補がいくつあろうが、どれにしようかなと悩もうが、結局お金が無いのでどうしようも無いんですけどね。

 

 

また何か思いついたらまた新しい事やると思います。いきあたりば(ま)ったり。

bashでゼロパディングする手法2つ

連番を頭につけたファイル群を取り扱う時、並び順を考えるとゼロパディングしておきたくなる。

例えばソートしたときに、

1
10
11
~略~
2
20
21
~略~

みたいな事されると、理想の並び順ではない。理想は勿論、

1
2
~略~
10
11
~略~

というような状況。最大桁数をカバー出来る桁数でゼロパディングしておけばこういう事故も起こらないはず…

という訳でゼロパディングする手法2つ。

話を簡単にするために8~12の5つを作ってみる。

 

その1

$ for ((i=8; i<13; i++));do
str=00$i;
str=${str:(-3)};
echo $str;
done
008
009
010
011
012

2行目では008~0012までを単純に作る。後にこれを${str:(-3)}で、末尾から3文字だけ取り出す事によってゼロパディングをする。

 

その2

$ for ((i=8; i<13; i++));do
str=`printf "%03d" ${i}`;
echo $str;
done
008
009
010
011
012

C言語のprintfでゼロパディングするときと同じ感覚。

 

 

その1の方がすっきりと言えばすっきりだけど、2行にまたがるのが微妙な気持ち(1行にまとめる方法は勿論ありそうだけど)

その2なら新たな記法を覚えなくて済むし簡単に1行にまとまるから良い…けれどbashで、という気持ちのくせになぁ、みたいな…そもそもforの中身がCスタイルなんですけど。