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

キンサクプログラマー

お金儲けと技術のメモ

年間600本以上ブラックコーヒーを飲む僕の、ブラック缶コーヒーランキング

f:id:pikurusux:20160318011249j:plain

仕事中は1日平均3本。
年間にして600本以上ブラック缶コーヒーを飲んでいます。
毎日同じものを飲んでいるわけではないので、だいぶ違いや好みがはっきりとしてきました。
なので、ここいらでブラック缶コーヒーをまとめようと思います。

*注意*
超好みが分かれるので、参考程度に聞き流してくれるとありがたいです。

10位 ジョージアヨーロピアン香ブラック

苦味は弱いが、香りが強い。
コーヒー飴っぽい味がするので、受け付けない人も多い気がする。

9位 タリーズ バリスタズブラック

苦味が強く、香りもなかなか強い。
ネットや周りの評価は高いが、ドリップのコーヒーに感じる苦味とはまた別物の
苦味なので個人的には好きじゃない。

8位 ポッカビズタイム 冴えるブラック

ポッカサッポロ ビズタイム 冴えるブラック 400g×24本

ポッカサッポロ ビズタイム 冴えるブラック 400g×24本

苦味、香りは弱い。
よく言えば飲み易いが、悪く言えば味が薄いとも言える。

7位 ダイドーブレンド ブラック

苦味、香りともに普通。
味はドリップのコーヒーに近いが少々うすい気もする。

6位 UCCブラック無糖

苦味は弱く、香りは普通。
癖がなく、のみやすい。まさに、smooth & clear。

5位 スターバックスブラックコーヒー

苦味はそこそこ。味はまろやか。
味自体は好きだが、ネットでべた褒めされるほどではない。
200円で275gは少なすぎる

4位 アサヒワンダ極

苦味、香りは普通。
しっかりとした味で、文句のないブラックコーヒー。

3位 キリンファイア燻製

キリン ファイア 燻製珈琲 ブラック ボトル缶コーヒー 400g×24本

キリン ファイア 燻製珈琲 ブラック ボトル缶コーヒー 400g×24本

苦味は弱いが、燻製の香りが強い。
ドリップのコーヒーとはちょっと違う匂いなので、合わない人もいるかもしれませんが、
個人的には好きな匂いです。

2位 プレミアムボスブラック

苦味は弱く、香り自体は普通。
ただ、味が濃い印象でとても飲み易い。

1位 キリン スーパーファイア スピードブレイクブラック

キリン スーパーファイア スピードブレイク ブラック 缶コーヒー 165g×30本

キリン スーパーファイア スピードブレイク ブラック 缶コーヒー 165g×30本

苦味、香りともに強い。
カカオの香りがする異色のブラックコーヒー。
普通のブラックコーヒーを求めている人には反対されそうだが、カカオとコーヒーが絶妙にマッチしていてうまい。

最後に

大道も良いですが、たまには異色系のブラックコーヒーを飲んでみるのも良いです。
いつも同じものを飲んでいる方は是非おためしあれ。

僕はもっとIDEを使うべきだと思うよ

ツール関係

こんな記事を見かけたので、ソフトウェアエンジニアとして自分の意見を書きたいと思います。
pineplanter.moo.jp

記事に対する感想

IDEを使うとプログラミングを覚えない について

言い過ぎ感は否めないですが、見出しの文については大方同意見です。
僕がプログラミングを習った際にもeclipsevisual studioを使っていましたが、
リンクとか依存関係とかそういった部分がわからなくなった気がします。
IDEが勝手にやってくれてた部分がごっそり抜け落ちた感じ)
ただ、この記事の著者が言うように、IDEをつかっていたからオブジェクト指向がみにつかない。
テキストエディタで書くとオブジェクト指向が身につく。なんてことはない気がします。

くそ重い について

これはPCにもよると思いますが、確かにIDEの方が重いです。
機能が多いのであたりまえだとは思いますが、開発ツールにとって動作速度は重要なポイントなので、
重くて使いたくないってのは至極まっとうな意見だと思います。

僕の開発環境

仕事で使う言語はC、主に使っているエディタはemacsです。
そこそこカスタマイズされていて、宣言・定義のジャンプや補完機能もしてくれます。
コードを書くのも読むのもスムーズに行えるので、エディタとしての満足度はかなり高いです。

それでもIDEを使うべきだと思う理由

人のコードを読んで、自分のコード書いて実行! ってだけならこれだけでも良いかもしれません。
ですが、仕事でプログラムを書く場合は品質に重点を置かなければなりません。
そういった、品質向上のための機能が充実したのがIDEなんじゃないかなぁと思います。

IDEでできること(Visual Studio2015を例に)

https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Visual_Studio_2012_logo_and_wordmark.svg/2000px-Visual_Studio_2012_logo_and_wordmark.svg.png

昨今のIDEは開発者の意図を汲んだ便利機能が充実しています。

デバッグ

当たり前ですが、ブレークやトレースポイントの指定、ステップ実行で1行ずつ実行したりできます。

テスト

単体テストも可能です。カバレッジなんかも計測してくれます。

パフォーマンス測定

ターゲット環境での実行速度、使用メモリ容量を測定できます。

コード分析

静的解析でコードの怪しい記述を発見したり、依存関係を可視化したりできます。

これらの機能を適切に使うことができれば、エディタだけで開発しているよりも品質を大幅に向上することができるはずです。

予想される反論

エディタでコード書いてデバッガはGDB、テストはCppTest、分析はDoxygenとか使えばエディタだって同じことできるじゃん!

っていう人
➡️1つで全部できた方がよくない?

いやいや!vimemacsを拡張すれば同じことができるよ!っていう人

➡️なるほど、でも、もうそれはエディタじゃなくてIDEなんじゃないですかね。

普通のリファクタリング (c言語)

なんだか最近リファクタリングばかりしている気がする。
そういうわけで、リファクタリングというのもおこがましい内容だけど、うんこーどにとっては絶大の効果がありそうな観点をまとめてみました。

呼びまくれまくりヘッダ

プロジェクトのきまり文句のように、インクルードされるヘッダは結構あると思います。
プロジェクトないで一貫して呼ぶ必要のある型定義、環境切り替え用の#defineなどがこれに該当します。
ただこいつは注意が必要で、
「どこからでも呼ばれるから、こいつに書いとけばどっからでも参照できるじゃん」
的な感覚で扱われると、何でもかんでもぶちこまれてしまいます。
(全体では使わないけど、そこそこ多くのファイルで呼ばれそうな関数とか)
こうならないよう、不要な依存は外に出しましょう。
聖域として扱ってあげてください。

関数名・変数名

うんこーどはたいてい変数名・関数名がやたら短いです。
長すぎるのはよくないにしても、短すぎるのもまた良くないことを思い出して下さい。
関数・変数の役割として適切名前をつけるべきです。
また、つけた後に確認して欲しいのが、「類似名の関数・変数」の存在です。
そこそこ良い名前がつけれても、類似名のものとの使い分けができなければ結局意味がありません。

無駄な条件文

以外とやってしまいがちなのが、条件文の氾濫です。
一階層上で判断した条件文を、次の階層、次の次の階層で再度判断したりしていないでしょうか。
可読性・サイズ・速度全てにおいて無駄なのでやめてください。

コードクローン

うんこーどはコピペが多いです。
リファクタリングを実施する際は、コードクローンがないかを探して(ツールor手動)
置き換えを考えることが先決です。これだけで、行数を減らすことができて理解しやすくなるはずです。

モジュール分割

うんこーどは99%の確率で、関数がクソ長いです。
初心者の多くは、関数分割する手間を嫌い、長い名前をつけることを嫌い、コーディング時の手間を最大限に考えてコーディングします。なので必然的に関数が長くなるのです。
機能毎に関数化してみてください。可読性は上がるはずです。

ファイル分割

うんこーどは99%の確率で、ファイルもクソ長いです。
こいつも同様に、一つのファイルに役割をもたせすぎです。
スコープが広がりすぎてしまうので適度に分割してください。

外国人wifiタダ乗り問題について

最近やたらと観光客以外の外国人を見るようになった。
僕の地元にいるのは東南アジア系の人々だ。

別に素行がえらく悪いというものでもないが、そこらじゅうでむろしているのがいただけない。
基本的にコンビニの周囲に夜11時くらいまでいるわけだが、毎晩10人以上も集まってくると流石に怖い。

さらに言うと、明らかに待ち合わせの目印でもなく、ベンチもない住宅街の道路で、突っ立てスマホで喋っているやつもいる。しかも、2時間以上も。。もうこいつは明らかにwifiタダ乗り勢なのだ。

モダンC言語プログラミング

読んだ

について読みたいと思ったので購入。
結論からいうと、かなり良かった。

C言語によるオブジェクト指向実装をスタック機能の実装を題材に紹介。
そのあとに、デザインパターンリファクタリングについてeclipseの機能を交えて説明している。

よかった点

わかりやすかった。ということに加えて、ところどころ知らない技法に出会うことができた。
内容は開発環境・プログラミング技法デザインパターンリファクタリング・CIとかなり広い話題を取り扱っているが、全く物足りなさを感じない内容だと思う。
デザインパターンの本だと各パターンの説明をしなければならない義務感から無理な説明がなされたりしているが、そういったことは全くないのがいい。

よくなかった点

前半のVMeclipse環境導入の話が少しばかりながく感じた。
ツールの紹介くらいはあっても良いけど、そこまで詳細にはいらないかなぁ。

まとめ

新人や若手で設計や実装に悩むことがある人には超おすすめの一冊。

Macでマウス自動操作

そうだアプリを自動化しよう

そんなもくろみで開発を始めるものの、いつも「マウスの自動操作が・・・」っていう序盤の序盤でつまづいていた。しかし、ちゃんと調べればいくつか手段はあるようだ。
やりたいこととしては、

  1. PCとandroidを接続
  2. PC上に表示されるandroid画面をタッチで操作

1についてはググればすぐに見つかると思うので今回は割愛する。
ここでは、2のマウスをプログラムから操作する方法を2つ紹介する。

その1 swiftでマウス操作

僕がはじめに発見したのはこっちの方法だ。
自宅のPCがMacなのでそっち方面で調査していたらみつかった。

func moveCursor(point: CGPoint) {
       CGEventPost(CGEventTapLocation.CGHIDEventTap,       
       CGEventCreateMouseEvent(nil,   CGEventType.LeftMouseDown,
      point,
      CGMouseButton.Left))
}

moveCursor(CGPoint(x:30,y:400))
sleep(1)
moveCursor(CGPoint(x:30,y:700))

Objective-Cでも同様のAPIを叩けばできるようだ。
日本語のドキュメントがないので探すのは多少困難だが、Appleのサイト
Quartz Event Services Reference
を探せばいろいろできるってことだけはわかった。

その2 pythonでマウス自動操作

swiftでマウス自動操作を実現して歓喜していたが大きな課題にぶち当たることになる。
swiftOpenCV叩けるんだけっけ・・・」
あいにく、cocoapodsっていうパッケージマネージャーから取ってこれるみたいだが、
iOSのみでOSX用のものがない模様。スクリプトとか別言語で書いて無理やり連携するのもありだが、そこまですると心が折れそうなので別の手段を考えることにした。
そもそも、OpenCVを叩けるpythonにマウス自動操作のAPIがあるのではないか・・・

あった。

Mouse Control Functions — PyAutoGUI 1.0.0 documentation

こんな感じで超絶簡単に実現できる。

import pyautogui
pyautogui.moveTo(100, 200)
pyautogui.moveTo(500, 200)
pyautogui.moveTo(200, 100)

やるじゃん、python。俺たちにできない事を平然とやってのけるッ
まぁ、オートインデントできないのは許せないけどな。

これでOpenCVを使えば画像認識でクリックできちゃったりする。
そして、tensorflowで画像とクリック位置を学習させれば晴れて最強のフレームワークが完成となる。

完成する日は・・ 
遠い。

tensorflowでsoftmax

tensorflowのtutorialでよく使われてるsoftmax関数。
説明はこことかにのってた
ソフトマックス関数 - 機械学習の「朱鷺の杜Wiki」

テンソルの和が1になるように正規化して出力するだけっぽい。
 

import tensorflow as tf
x = tf.placeholder(tf.float32,[3,None])

W = tf.placeholder(tf.float32,[4,3])
#W = tf.Variable([8,4]))
debug=[[0.],[1.],[2.]]
weight=[[5.,6.,7.],
          [5.,6.,7.],
          [5.,6.,7.],
          [5.,6.,7.]]

b =  [0.,0.,0.,0.]

rs = tf.nn.softmax(tf.matmul(W,x)+b)
with tf.Session() as sess:
    result = sess.run(rs,feed_dict={W:weight,x:debug})
    print result

with tf.Session() as sess:
    result = sess.run(tf.matmul(weight,debug))
    print result