読者です 読者をやめる 読者になる 読者になる

キンサクプログラマー

お金儲けと技術のメモ

Macのシステム領域使いすぎ問題

気づいたらストレージがいっぱい

何も気にせずMacBookProをつかっていたら120GBのディスクがもうすぐいっぱいになるとの通告が出た。
まじか。
システム領域が70%に突入してるんだが・・・どうしたら良いんだ・・・

いまさらシェル

#!/bin/sh
filename=$1
cat ${filename} | while read line
do
  set -- $line
echo $1
echo $2
if [ $5 == "*\(*\)" ]; then
echo "oraora"
fi
echo $5
done

リファクタリングしながらコードを書く難しさ

完全スクラッチでコードを書ける環境にいる人はまれかと思われる。
たいていの人は、流用でコードを書くことになるはずだ。
引き継いだコードが良質であれば幸せだが、多くの場合クソコードに出くわす。
そうなった時に取れる行動は、状況によるが、

の3つが考えられる。

問答無用で2を選びたくなるが、実際フルスクラッチで実装をするほど工数はとれないので、3を選ぶことが多い。

しかし、3が一番難しいことに気づく。

既存のコードに合うようにそれでいて、流用ソースのクソな部分を直し、機能の実装も必要。工数は最小限にしながら掃除を完遂しなきゃいけない。

一旦、1のようにそのまま実装した後で、リファクタリングするべきだったか・・・

2万円台のスマホは3世代前のiphoneにも劣るから気をつけろ

最近では格安simを使っている人も増え、キャリアを離れる人も少なくないだろう。
僕はというと、1年前くらにiphone5に別れを告げ、再びandroidに舞い戻った。端末代を含めて月額3000円という、格安運用を実現して満足をしたのもつかの間、予期せぬストレスに悩まされることに。

カックカクやないかーい

僕が購入したのはこちらZenfone laser 2

当時も今もそこそこ評判は良いみたいだが、iphone5という化石モデルあがりの僕ですらカクツキを感じた。3Dのレンダリングをするゲームならまだしも、ニュースあぷりとかですら動きがあやしい。
最新CPUだのクアッドコアだのというキャッチーな謳い文句に乗せられた僕が馬鹿だったようだ。

ベンチマークを見て戦慄

「お前の携帯カックカクじゃね?」
たのでベンチマークを調べることにした。
とりあえずAntutuがメジャーらしいのでこちらで測定。
play.google.com

26462という結果になった。この情報をもとに、自分のスマホの立ち位置を調べたところ驚愕した。
iphone6s 130000
iphone6 80000
iphone5s 60000
iphone5 30000

なんと前使っていたiphone5よりも遅い。買い換えた意味がない・・・

いまの格安スマホは?

言わずもがな1万円台のものは、zenfone laser2なんかよりもっと遅い。
おそらく、そこそこ重いゲームはできないだろう。また、評判の良いzte blade v580とかもベンチマーク的には30000程度と、iphone5並なので、嬉々として買い換えると絶望すること間違いなしだ。

今買うべきスマホは?

3万円を切るようなスマホはどれも同じかと思いきや、良さげなのを見つけた。
中華スマホ Xaomi redmi note3  2万円台前半だがiphone6に近いantutuスコアと(ベンチマークにこだわりすぎか・・)指紋認証が付いている。

中国製だとなにかと爆発したり、データをぶち抜かれたりしそうだが、気にしない人にとってはおすすすめだ。

動的計画法(Dynamic Programing(DP))の話 その1

 動的計画法って難しい。何度読んでもイマイチ身にならない。
なので、ちゃんと理解するために書き残していこうと思う。

動的計画法とは

TopCoderやCodeJamといったアルゴリズムコンテンストによく出るアルゴリズム
愚直に(たとえば全探索)などの方法ではTLE(time limit exceeded)してしまうような問題を、サクッと出すことができる(うまくいけば)。簡単に言うと、漸化式のようなものだと思えば当たらずとも遠からず。

  • メモ化(再起による計算をするが、一度解いた問題はメモしておくことで、高速化する)
  • 分割統治法(小さな問題を徐々に大きくしていく)

の2パターンがあるが、本質的には同じやり方。
メモ化については、再起呼び出しをするためスタックを食いつぶす恐れがあるが、なんというかイメージがしやすい。
分割統治法の方がスタックオーバーの恐れなどはないものの、なんというか理解しにくい。配列のインデックス内で引き算とかするのが個人的には苦手。

ナップサック問題(Knapsack Problem)

ナップサックのスペルがKnapsackということを初めて知った。
現代の子供達はナップサックを使うのかもよくわからないが、このナップサック問題は基本的に以下のような形体をとる。

    • 耐久11kgのナップサックがあります
    • 忍び込んだ部屋にはパソコン、プレイステーション、時計、カメラがあります
    • それぞれ、重さは2kg、10kg、5kg、6kg
    • 一方でお値段は、それぞれ、1万円、10万円、6万円、7万円
    • ナップサックに可能な限り高価になるように詰め込んでください

ちょっと考えてみよう

何も知らない人はまず、「よっしゃ、一番高いもんいれたろ!」ということになるが、
ここて10kg、10万円のプレーステーションをいれてしまうと、その時点でナップサックに追加できるものがなくなってしまうが、これは正解ではない。正解は時計とカメラのペア=13万円だ。軽さ重視で詰め込んでいっても同様の問題にすることは自明だろう。

 そこまで考えた人は多分、「よっしゃ全通り考えたろ!」と思うに違いない。
ここで、全通りの組み合わせを考えた場合、
パソコン        入れる or 入れない
プレイステーション   入れる or 入れない
時計          入れる or 入れない
カメラ         入れる or 入れない
の2*2*2*2の16通となる。

16通り程度であれば余裕だが、盗めるものが10個あるだけで1000通りを越えてしまう。
しかも、アルゴリズムコンテストで出題されるような内容では100個など、全探索では解けない内容になっていることが多い。
それではどうするか・・・

もちろん動的計画法で解くしかない。

基本アイデア

11kgの時の最大価値を調べるというのは、先ほどの例から考えるとちょっと難しそうだが、
1kgの時の最大価値から考えれば簡単だ。

1kgの場合、なんもはいらないので0円
2kgの場合、パソコンがはいった!   1万円
3kgの場合、どちらにしろパソコンだけだ1万円
4kgの場合、あきはあるがパソコンだけか1万円
5kgの場合、お!時計が入る!     6万円
6kgの場合、む。カメラがはいるぞ   7万円
7kgの場合、時計とパソコンもはいるぞ!8万円
8kgの場合、同じ!          8万円
   ・・・・

重さを徐々に増やしていきながら、物を突っこむべきか否かを判断するだけ。

Rubyで書いた
github.com

プリンシプルオブプログラミング 読んだ

プログラミングの原理・原則がババっとかかれた本。
購読しているブロガーの人が書いた本で、非常に分かりやすく面白かった。
ブログはこちら↓
d.hatena.ne.jp

3年以内に身に付けたいとはあるが、「達人プログラマー」のように1年目でも3年目でも10年目でも役に立つ本だと思う。
ただ、上記のブログにも十分な情報が載っているので、購入すべきかという点では悩ましいところだ。