みろりHP


緑色さんの多目的ブログ
みろりえいちぴー(旧)
引っ越し先 みろりHP: https://www.mrrhp.com
| カテゴリ:- |
スポンサーサイト

一定期間更新がないため広告を表示しています

| スポンサードリンク | - | - |
| カテゴリ:感想文 |
Andrew Hunt and David Thomas『達人プログラマー』



知り合いが貸してくれた。いや、先月Javaの技術書を読書したばかりだからあんまり食指は動かなかったのだが。けれどこうして偶然降ってくるままに読書することこそ雑食読書と呼べるんじゃないかと思い直してサクサク読んだ。
この本も先のJava本と同じで、どういうことを念頭においてプログラムを書くか、どういう思想でもってプロジェクトを回すか、って部分に主眼が置かれている。プログラミングのことをあんまり詳しく知ってなくてもすんなり読めたのはよかったかな。気になったところを書いていく。



割れ窓を放置しないこと
  • 綺麗に掃除された廊下にはなかなか誰もゴミを捨てない。だけどゴミがひとつでも落ちていると、みんな一斉にゴミを捨てだす。廃ビルの窓が一枚でも割れていると、一斉に窓は割られる。という理論。
  • プログラムのコードでも、適当な書かれ方をしていると、他の人たちも「ああこのプログラムは適当でいいんだ」とヘボな書き方をしだす。キチッと書いてそれを防ぎましょうってコト。

やめ時を知る
  • プログラミングは絵と似ている。決して完璧になることはない。十分に書けているのに、ついつい「もう一筆」とやりたくなってしまうがヤメ時を知ること。俺の思想 Done is better than perfect. と共通するところがあって理解しやすい。

早起きした鳥は虫にありつけるという格言があるが、早起きした虫には何が待っていた?
  • この文が面白くて他のことは忘れた。

自分の知識ポートフォリオへ定期的な投資を行うこと
  • 毎年ちがう言語を学習すること。
  • 四半期ごとに技術書を読むこと。
  • 四半期ごとに技術書じゃない本を読むこと。
  • 講習とかユーザグループに参加すること。
  • 思ったんだけれど、このみろりhpって俺のポートフォリオになってるよな。やったことほぼほぼ書いてるから。

DRY原則
  • Don't Repeat Yourself. 繰り返しを避ける精神のこと。まあ、プログラミングの基本精神よな。そんな名前があったのね。
  • これを実現するために関数とかfor文とかで処理をまとめるわけだ。

直交性
  • 関係ないもの同士が影響しあわないこと。これもプログラミングの基本精神だよな。
  • これを実現するためにプログラムをクラスとか関数に分割するんだ。
  • プログラム単位であれば「ある部分を変更するために他の部分を変更する必要がどれだけないか」が直交性をはかる尺度になる。プロジェクト単位であれば「その議論をするとき必要な人間がどれだけ少ないか」が尺度になる。
  • 別の言葉でいえば結合度の最小化。スパイや革命家はセルというグループに組織化されている。どこかのセルが摘発されても、他のセルの情報が漏れないという寸法だ。セルのような関数、クラス、モジュールを作ろう。

曳光弾
  • これ えいこうだん って読むんだって全然知らなかった。
  • ようは、プログラミングの書きミスに早めに気付くように短い間隔でテストをしようってコトみたい。

プロトタイプを作ること
  • 実際にコードを書き出す前に、全体図を作るってこと。普段からやってることだし、賛成。

見積もりをすること
  • 要求を洗い出し、システムをモデル化し、リスクを分析し、各パートに値を与える。というふうに見積もりを立てる。
  • これはパッとできる作業ではないので、見積もりを要求されたら必ず「のちほどお持ちします」と言うこと。

ツールを揃えること
  • まずは基本的な道具一式から始めて経験を積む。特殊な要求に出会ったとき、道具を追加していく。職人のように、つねに道具を増やすことを心がけよ。
  • プログラミングでいえば、ひとつのエディタやひとつのIDEに依存することをヤメろってことだ。俺もSublimeだけでpython書くのヤメて、IDEとか使ってみようかな。

知識はプレーンテキストに保存すること
  • 人間が読めるデータは、データ形式や生成したアプリケーションの枠を超えて生き続ける。Wordで書いたdocファイルとかさー、WordとかOpenOfficeがなきゃ読めないじゃん。そういうのヤメろってこと。
  • 俺はたびたびみろりhpにプログラミングのtipsとか書くけど、実はああいうの元は全部PCにプレーンテキストで保存しているのだよ。この習慣はバッチリってことみたいだな。
  • まあ、趣味レベルでもプログラミングやっていればプレーンテキストにもっとも好感をもつようになるよ。

ひとつのエディタに習熟すること
  • ひとつのエディタを知り尽くし、プレーンテキストをいじるプロになれってことみたい。
  • ってアレー? 上述の「ひとつのツールに依存するな」ってのと微妙に矛盾する感じがするな。まあ、いろんなツールを知りつつも一番得意はもっておけって感じか。

つねにソースコード管理システムを使うこと
  • めちゃめちゃタイムリー。最近Gitに手を出したばかりだからな。確かにあれは便利だよ。

誰かに説明するのは有用な問題解決法
  • 「あのさー、ちょっと質問があるんだけど、これこれこういうことしてたらこんな問題が起きてさー、あれこれ試したんだけどうまくいか……ってアレ? あ、そっか。ゴメン自己解決したわ。」
  • ってあるあるネタのこと。この場合の誰かはただ頷いてるだけでいい。Gregというスゲー開発者はそのためにいつもお風呂に浮かべる黄色いアヒルを持ち歩いていたらしい。そのアヒルに対して問題を説明していたってわけ。

コードジェネレータを使うこと
  • コードを生成するコードのことみたい。よくわかんない。えーとアレか? 以下のようなコードはいつもいつも書くんだから、そういうものは自動化しろってことかな?
    class Foo:
        def __init__(self):
    
  • ただしGUIのウィザードが記述するコードを使うなら、その内容を理解していなければならない。

Design by Contract
  • 契約による設計。このプログラムは何を受け取り、何を返すのかしっかり決める(契約)ってこと。
  • ようは、引数と返り値のことをDocに書けってことだよな? 引数とかは事前条件(require)と呼ばれ、返り値とかは事後条件(ensure)っていうらしい。

トラッシュ(めちゃくちゃ)にさせるんじゃなくクラッシュ(停止)させること
  • プログラム内でエラーが起きたら即座に例外飛ばして停止させること。エラーが起きたにもかかわらず最後まで処理が走ったら、結果はオカシイけどどこでおかしくなったのかわからんってことになる。

メタプログラミング
  • 設定項目はコード内に書かないこと。コードには抽象概念を書くこと。
  • これは普通に理解できるな。以前つくったDialogFrameで自然にやったことだ。ソースコードには処理だけが書いてあって、どんな情報でその処理を回すか、っていうの(メタデータというらしい)は設定ファイルに書いた。

O()記法
  • オーダー記法と読む。「実行時間がO(n**2)である」と言うとき、データが二倍になったら時間は四倍になる。

リファクタリング
  • スクリプトを見直して、繰り返しのあるところを関数化したりクラス化したり、ともかく構造をブラッシュアップすること。
  • 上述の「割れ窓を放置しない」というのは要はリファクタリングをバッチリやりましょうってこと。
  • ただしリファクタリングと機能追加は同時に行わないこと。そしてリファクタリングする部分のユニットテストを用意し、リファクタリングによって何かが壊れたときそれをすぐに察知できるようにすること。

ユーザの視点に立つには、ユーザと共に働くこと
  • 開発者側の視点とユーザの視点はズレるってこと。以前ゲーム作ったときそれは経験してる。俺が思いもしなかった操作をプレイヤーが行ったために、せっかく作ったイベントがスキップされちゃったんだよ。

枠にとらわれず考えるというのは、枠を無視するってことじゃなく、もっと広い枠を見つけるということ
  • そうだな。

早めにテスト、何度もテスト、自動でテスト
  • なんかね、ユニットテストってものが大事なことはすごくよく伝わってくるんだけどそれが何かよくわからん。次にpythonでやる遊びは、ユニットテストにしようかな。

達人はドキュメントを重んずる
  • 書くべきなのは、なぜそれをするか、という意図。
  • 書くべきでないのは、コードの内容をただ言い換えるもの。あと改訂履歴。改訂履歴はコード管理システムにやらせるべき。
  • そして作者の名前を書くべきである。それは作者に誇りと責任感を与える。



プログラミングの本に共通していることがあるように思う。
  • 「繰り返し同じことを書くな」
  • 「プログラミングは絵と似ている」
  • 「例外処理はうまく使え」
  • 冗談が多い


| 緑色 | 感想文 | comments(0) |
| カテゴリ:アコギ |
アコギ 緑色『AmとEメインの短い曲』



自作曲だぜー! 1分半ほどのインスト曲。

最初のアコギ演奏を公開したときちょろっと書いたように、俺はそもそも作曲がしたくてアコギを買ったんだ。今月でアコギ購入からちょうど一年なので、そろそろやんなきゃなと作曲に挑戦してみた。いやあ楽しめたぜ、タイヘンだったけど。作曲もタイヘンだったし、アルペジオが入ってるから弾くのもタイヘンだった。自分で書いた曲が自分でうまく弾けないときの情けない気持ちがご理解頂けるだろうか。ちなみに、『AmとEメイン』と銘打ってはいるんだけど、これは手の形がAmとEのコードの形だってだけなので、実演奏でこれが何の音になってるのかは俺にはわからん。



無事に完成はしたけれど、以下のような一ヶ月間の試行錯誤があった。
  • ヒマなとき適当に口笛を吹いてメロディを作ってみる。
  • フレーズができたら「こんなんどうかな?」と知り合いに吹いて見せる。
  • 「それってあの曲のフレーズじゃね?」と言われる。ゼロからオリジナルのメロディを作るのは無理筋と悟る。既存のメロディを頭から排除して口笛を吹くってのはめちゃめちゃキツイ。
  • これまでの演奏で知ったいろんなコードを鳴らしてみて、ピンとくるコードを探してみる。
  • 4カポでAmとEの組み合わせは好きかもしれんと思う。
  • そのコードのアルペジオでメロディをいろいろ作ってみる。(これで出来たのが序盤のイントロ、ヴァース部分。)
  • 思いつかなくなる。ここでだいぶ詰まる。
  • 「全部ストロークだったら簡単なのにー!!」とじゃかじゃか鳴らしてるうちに突然歌詞を作り出す
  • 歌詞が完成してしまう。(これのおかげで全体のコード進行が完成。)
  • 俺は歌をうたいたいんじゃなくてアルペジオがしたいんだと思い出す。
  • 「あれ? 作った歌詞の音を全部アルペジオに置き換えればいいんじゃね……!?」
  • 全部アルペジオにしたら、全体の雰囲気が薄味に感じたので、一部ストロークにしたり、和音にしたりする。
  • 演奏練習しながら細かいところを修正して完成。

「作った歌詞をアルペジオに変換すればいいんじゃね?」というのはナイスな思いつきだったと思う。あれが作業のターニング・ポイントだった。いろいろ回り道をしたけど、次回作曲をするならばもっとシンプルに……
  • 好みのコードを繋げてストローク曲を作る。
  • それに歌詞をつける。
  • 歌詞をアルペジオにする。
  • 薄味なところに音を足して調整。
  • あとは演奏しながら思いついた修正を入れる。
って感じでイケるか。

はじめのころは「絵だったら簡単に書けるのに!」と頭を抱えたりもしたが、絵も曲もやることは実際一緒なんだよな。
  • ペン、あるいは音で書きたいモティーフを思いつく。
  • それを象徴するモノ(アトリビュート)をスケッチ。(曲ではコード探しに相当。)
  • アトリビュートを引き立てる装飾をスケッチ。(そのコードを元にメロディをつける作業に相当。)
  • 実際に書く。(演奏に相当。)



これが楽譜。実演奏は一部違うケド。カポは0だろうが1だろうが4だろうが成立する。



| 緑色 | アコギ | comments(0) |
| カテゴリ:プログラミング |
Python accept_mouse_click pygameアプリ・クリック変換モジュール



前日譚: Python pygameをMacで使うのはヤメとこうぜ
前日譚では問題点がふたつあった。
  • mp3が読めねー
  • キー入力受け付けねー
後者のキー入力をマウスクリックで代用するモジュールを作ったぜ。現在緑さんはMacとWindowsの2台使いなわけだけれど、やっぱMacでもpygameアプリを開けないと不便だ。mp3のほうはムリ。OSがWindowsじゃなければ読み込みをスキップするくらいしか思いつかん。



# accept_mouse_click.py

import pygame.locals as pgl

def switch(event,
           left_click  =pgl.K_z,
           scroll_click=pgl.K_c,
           right_click =pgl.K_x,
           scroll_up   =pgl.K_UP,
           scroll_down =pgl.K_DOWN):
    '''マウスクリックをキー入力に変換します。
    かえたいとこだけ指定してください。
    '''

    change_table = {
        1: left_click,
        2: scroll_click,
        3: right_click,
        4: scroll_up,
        5: scroll_down,
    }

    if event.type != pgl.MOUSEBUTTONDOWN:
        return event

    if event.button not in change_table.keys():
        print('<accept_mouse_click NOTICE> Unknown mouse click:'
              + str(event.button))
        return event

    return DummyEvent(pgl.KEYDOWN, change_table[event.button])

class DummyEvent:
    '''eventのダミー。
    オリジナルのeventがreadonlyだったため、ダミーを作ります。
    ようはtypeの中にMOUSEBUTTONDOWN、keyの中にK_*が入ってりゃいいんだからさ!
    '''

    def __init__(self, type_, key):
        self.type = type_
        self.key = key
いやあモジュールを作るのにも慣れてきたなあ! クラスなんかもサクッと作っちゃったりしてね! ほんで使い方が以下。

for event in pygame.event.get():

    # 左クリックをZキー、スクロールボタンをAキーに変換したい場合。
    event = accept_mouse_click.switch(
        event,
        left_click=K_z,
        scroll_click=K_a
        )

    if event.type == KEYDOWN:
        # 以下、キー入力を受け付けるスクリプト……。
こんなのをこれまでのpygameアプリにぺたぺた貼り付ければ、Macでもマウス操作で遊べるようになるというわけだ。



今回のポイントは DummyEvent クラス。このモジュール、ようは event オブジェクトの中身を覗いてみて、マウスクリックだったらキー入力に入れ替えるってことをしてる。でも実は event オブジェクトの野郎が生意気にもreadonlyだったんだよな。だから書き換えられない。どうしたもんかと頭を捻ったのだが、こいつがどんな高度なクラスから生成されたオブジェクトだろうと、結局必要なのは type パラメータと key パラメータに定数が入ってるという事実だけなんだよな。であれば、そのふたつのパラメータをもったオブジェクトを自分で作っちまえばいいじゃんという流れで解決。やったー!

| 緑色 | プログラミング | comments(0) |
| カテゴリ:アコギ |
アコギ amazarashi『自虐家のアリー』



最近知り合った奴が無類のamazarashiファンで、バンド名聞いたこともねえって俺にオススメ曲とかめちゃめちゃ推してきた。その中でも俺が気に入ったのがコレ。

序盤のストロークは自分で考えた。お気に入りなんだけれども、Chorusには合わずにいつも通りのストロークを採用することになっちまった。ずっと序盤を弾いていたい。新規のストロークに歌を合わせるのはタイミングがむつかしくて若干苦労した。けどまあ所詮はストロークなのでたいしたことではない。問題は歌だ。歌ってみるたびにひろむさん歌うっめえってなる。たいして高い声で歌ってるように聞こえないのに、実際に歌うと裏声みたいになっちまう。どの音程でもあの特徴的なザラザラした声質をキープできんのすげーよな。Chorus部分を低音にしてみたり、裏声MAXにしてみたり、色々調整した結果、今回のような感じになった。

アルペジオと比較することでストロークなんてちょろいちょろいなんてことを割りと言ってるけれど、ストロークはストロークでかなり技量がいるぜ。この演奏だって、やたら「ビーン」が出てるし。そんなもんを公開すんのかよ、という話についてはもちろん「達人になるまで戦場に出ないつもりか」理論で。

件の知り合いによると、amazarashiの歌詞は考察がアツいらしい。たしかに『アリー』の歌詞にも、考察をしないと意味のわからない箇所がいくつかある。そういう箇所をほうっておくと弾き語りをするとき「?」ってなって感情が込めづらいので、俺も考察してみたぜ。

嘘とは?
「私死ぬわ」って母に言ったこと。そういえば抱きしめてもらえるかなあって思ったがまさかのガン無視だったので入水した。
いずれにしても立ち去らなければならないのはナゼ?
嘘ついた挙句入水したくせに生き残っちゃって今更帰宅できないし、入水の際に「被虐者の愛」が抜けたから母のもとにいる理由がなくなったから。いずれにしてももう家に戻る理由がない。
入水したくせに生き残ったってのはどこでワカる?
嘘ついたあの日を悔やんだりと、回想的な描写がたくさんあるから。回想できるってことは生きている。
あの海と一つになれたらと思ったあと笑ったのはナゼ?
海になったら、海が好きだった父のことが好きだった母が抱きしめてくれるんじゃなかろうかと推測したから。
最後のわがままとはなんだ?
愛されてないんじゃないだろうか、と疑ったことを許してほしいと要求すること。
被虐者の愛が波のまにまに沈んだとはどういうことだ?
アリーの身体は浮かんで助かったけど、いじめられまくっても母のそばにいたい、という気持ち(被虐者の愛)が抜けたということ。
まとめると
父がなんらかの理由で消えて、優しかった母は虐待をするようになった。アリーはそれでも母のもとにいたが、気の迷いで暴走して行った入水をきっかけに母の元を去ることができた。今でも海のそばに住んでおり、毎夜海を見ては母への愛を抱いている。



いやだから、また弾き語りなのかよ。と思われるかもしれないが、それは俺も思っている。次! 次はアルペジオをやるぜ!!


| 緑色 | アコギ | comments(0) |
1234567
891011121314
15161718192021
22232425262728
293031    
<< October 2017 >>
+ みろりHP内検索
+ 閲覧記事
+ 過去記事アーカイブ
+ 年月選択
  • 2019年 02月 (1)
  • 2019年 01月 (2)
  • 2018年 12月 (6)
  • 2018年 11月 (6)
  • 2018年 10月 (3)
  • 2018年 09月 (8)
  • 2018年 08月 (4)
  • 2018年 07月 (6)
  • 2018年 06月 (5)
  • 2018年 05月 (4)
  • 2018年 04月 (7)
  • 2018年 03月 (6)
  • 2018年 02月 (6)
  • 2018年 01月 (8)
  • 2017年 12月 (9)
  • 2017年 11月 (9)
  • 2017年 10月 (4)
  • 2017年 09月 (6)
  • 2017年 08月 (6)
  • 2017年 07月 (8)
  • 2017年 06月 (4)
  • 2017年 05月 (7)
  • 2017年 04月 (8)
  • 2017年 03月 (7)
  • 2017年 02月 (10)
  • 2017年 01月 (6)
  • 2016年 12月 (8)
  • 2016年 11月 (8)
  • 2016年 10月 (5)
  • 2016年 09月 (5)
  • 2016年 08月 (7)
  • 2016年 07月 (9)
  • 2016年 06月 (6)
  • 2016年 05月 (8)
  • 2016年 04月 (10)
  • 2016年 03月 (10)
  • 2016年 02月 (8)
  • 2016年 01月 (10)
  • 2015年 12月 (9)
  • 2015年 11月 (6)
  • 2015年 10月 (5)
  • 2015年 09月 (4)
  • 2015年 08月 (8)
  • 2015年 07月 (5)
  • 2015年 06月 (3)
  • 2015年 05月 (7)
  • 2015年 04月 (8)
  • 2015年 03月 (12)
  • 2015年 02月 (8)
  • 2015年 01月 (4)
  • 2014年 12月 (5)
  • 2014年 11月 (5)
  • 2014年 10月 (7)
  • 2014年 09月 (4)
  • 2014年 08月 (7)
  • 2014年 07月 (6)
  • 2014年 06月 (4)
  • 2014年 05月 (12)
  • 2014年 04月 (9)
  • 2014年 03月 (6)
  • 2014年 02月 (6)
  • 2014年 01月 (8)
  • 2013年 12月 (7)
  • 2013年 11月 (10)
  • 2013年 10月 (10)
  • 2013年 09月 (9)
  • 2013年 08月 (11)
  • 2013年 07月 (10)
  • 2013年 06月 (9)
  • 2013年 05月 (15)
  • 2013年 04月 (11)
  • 2013年 03月 (5)
  • 2013年 02月 (7)
  • 2013年 01月 (6)
  • 2012年 12月 (9)
  • 2012年 11月 (10)
  • 2012年 10月 (10)
  • 2012年 09月 (4)
  • 2012年 08月 (2)
  • 2012年 07月 (7)
  • 2012年 06月 (13)
  • 2012年 05月 (13)
  • 2012年 04月 (15)
  • 2012年 03月 (4)
  • 2012年 02月 (12)
  • 2012年 01月 (9)
  • 2011年 12月 (5)
  • 2011年 11月 (13)
  • 2011年 10月 (2)
  • 2011年 09月 (2)
  • 2011年 08月 (1)
  • 2011年 06月 (1)
  • 2011年 05月 (4)
  • 2011年 04月 (10)
  • 2011年 03月 (8)
  • 2011年 02月 (11)
  • 2011年 01月 (14)
  • 2010年 12月 (14)
  • 2010年 11月 (17)
  • 2010年 10月 (17)
  • 2010年 09月 (19)
  • 2010年 08月 (22)
  • 2010年 07月 (18)
  • 2010年 06月 (16)
  • 2010年 05月 (19)
  • 2010年 04月 (15)
  • 2010年 03月 (22)
  • 2010年 02月 (18)
  • 2010年 01月 (18)
  • 2009年 06月 (2)
  • 2007年 12月 (10)
  • 2007年 11月 (7)
  • 2007年 10月 (9)
  • 2007年 09月 (4)
  • 2007年 07月 (5)
  • 2007年 06月 (11)
  • 2007年 05月 (6)
  • 2007年 04月 (4)
  • 2007年 03月 (1)
  • 2006年 01月 (21)
  • + カテゴリ
    + ブックマーク
    + 最近のコメント
    + アクセスカウンター
    全体(since 2010.02.03.)
    今日… 昨日…