Riverside Learning LABO(Skill/Idea/Code)

よりよいシステムのため工学系と人間系の学習下書きメモ

読書 君の膵臓を食べたい

君の膵臓を食べたい
作者:住野よる

印象的なシーン
1日の価値は全部一緒、何をしたかで今日の価値は変わらない
意味ないことを言ったんだから追求しないで
誰も興味がないことをべらべら喋れない
死に直面して毎日生きていると思うようになった
もうちょっと人間と接しなさい
治りますように
傍観者でありたい僕と当事者になろうとする彼女
問題は君がきちんと話さないから
誰かと心を通わせること
きみがそこまで必要としてくれるなんて
僕自身で選びここにいる
反対側から対岸をみていた..
笑い声が聞こえる

生きることの意味を見出した幸せな時間
ないものをお互い求める若者
まっすぐさが可愛らしい

読書メモの作り方

読書メモの作り方

〜制約を持つ事で重要箇所を絞り込む〜

1:目的を持って読み始めること
2:付箋は1章3つまで。1冊10こまでetc
3:本の内容を1センテンスにまとめる
4:3点に集約する
5:3アクションにまとめる
※気になった点の概要をメモしていくだけでも良いから何かしら
 アウトプットを。人に話すでも良いかもしれない。

プログラミング作法5

第5章 デバッグ
・コーディングと同じ時間をデバッグにかけ過ちから学ぶ
(またバグを見つけたら同じ過ちを犯さないような方法、
再び発生したときの突き詰める方法を学ぶ)
・やみくもにデバッガを使うよりもプリント文とチェックコードの方が融通が利く
・おなじみのパターンを見つける (見慣れた問題かどうかのチェック)
・最新の変更点のチェック (最後に何を変更したか)
・同じ間違いを繰り返さない (同じ間違いが他の場所にないか)
デバッグは今すぐ放置せずに行う
スタックトレースを取得する
・打つ前に読んでみる (印刷してみる、休憩してみる)
・自分のコードを他人に説明してみる
・バグを再現できるようにする
・分割統治する (可能性の範囲を狭めていく)
・誤作動を特定の数値パターンから検証する
・出力表示でバグの検索範囲を狭める
・自己検証コードを記述する (問題の発生前に行うのがポイント)
・ログファイルを出力する
・作図する (度数分布図など)
・ツールを使う (diff、grep など)
・記録を取る (何を行ったのか)
・デバッガによって思い込みではない動作による検証ができる
・対象コードやバージョンを間違えている場合も往々にしてある
メモリリークが原因の場合
・極めて稀にライブラリやハードによる原因という場合もある
・再現性の難しいバグでは逆に動的に変化する部分やメモリが怪しい
・他人のバグのときは受け取る側に分かりやすいテストケースで知らせる

プログラミング作法4

第4章 インターフェイス


設計において解決すべき課題。これらが決まったら仕様としてまとめる。
インターフェイス (提供するアクセスやサービス)
・情報の隠蔽 (可視、プライベート)
・リソース管理 (割り当て、解放)
・エラー処理 (検出、報告、報告手段、復旧措置)
・面倒な入力解析プログラムで入力例を付ける
・一度しのぎのはずのプログラムが、その後も使われることは多い
・原則としてライブラリルーチンはエラー発生時に死んではならない


よいインタフェースを作るための留意点。優れたインターフェイスはシンプルで普遍的で整然としており、予測可能で堅牢、更には変化に対応できている。実装が隠蔽されポインタからしかアクセスできないようなもののことを不透過型(opaque type)という。
・実装の詳細を隠蔽する
・直交性のあるプリミティブなセットを選択する
・ユーザに内緒で何かをしない (インタフェースの拡大を含む)
・同じことはどこでも同じように実行する (一貫性と規則性)


リソース管理での要点。ポイントは解放を割り当てと同じレイヤで行う点。マルチスレッドなどではプログラムが再入可能(reentrant)である必要がある。
・初期化/生成
・状態管理
・共有とコピー
・後始末/破棄


strtok は処理の目印として NULL をデータに書き込むので多重呼び出しができない。(スレッドセーフでない。)
・標準関数のエラー処理までをラッパーとして包んで提供する
・勝手に終了はしないようにする(ログに残すなど)
・エラー検出を低いレベルで行い、処理は高いレベルで行う
(呼び出し側で対処するということ)
・例外は例外的な状況でのみ使う
・エラー情報をユーザには分かりやすく伝える (エラー + 正しい方法)
C/C++ では atexit で正常終了直前の制御を取得できる

NaN (Not a Number : 非数) IEEE 浮動小数点数の返す特殊なエラー値

プログラミング作法3

第3章 設計と実装

データ構造が決まればアルゴリズムもすんなり決まることが多い。(データ構造によって全体像が定義されるから。)そのためにもシンプルなアルゴリズムとデータ構造を選択することが重要になる。そして、プロトタイプ(捨てるためのプログラム)を有効的に使う。

アルゴリズムの異なる言語による実装の違いと性能差について。C はソースが長くなるが高速、C++Java はソースはすっきりするが速度面で C に劣る。

プログラミング作法2

第2章 アルゴリズムとデータ構造
安定した結果を出すには一定の経験を積むしかない
不慣れな分野に取り組むときは、その分野で既に何が解明されているのかを調べないと、
優れた手法のあることに気付かずに、下手なやり方で苦労することになる。


・逐次検索(sequential search)はデータが少なければ十分実用(逐次検索は線形検索(linear search)ともいう)
・もう少し多い場合は二分検索(binary search)を使う(バイナリサーチではデータが事前にソートされている必要がある)
・汎用的なソート手法としてクイックソートがある (C.A.R Hoare/1960)(ある値を選択して以上/以下に分割し、それを再帰的に行う。
しかし値が全て同じなら n の 2 乗に比例する時間がかかるANSI C なら qsort や bsearch が用意されている、Java の例もあり)

O 記法(O-notation)による、実行時間を n の関数に見立てた計算量(complexity)の算出。
これだけではなく最悪のケースと期待される動作の把握が必要になる。以下に重要となるケースを挙げる。

    • -

記法 名称 例
O(1) 定数 配列インデックス
O(logn) 対数 二分検索 (段階ごとに半分)
O(n) 1 次 文字列比較
O(nlogn) nlogn クイックソート
O(n2) 2 次 単純なソート手法
O(n3) 3 次 行列乗算
O(2n) 指数 集合分割問題 (全ての可能性の評価)

    • -

・巡回セールスマン問題等の指数的アルゴリズムの問題は近似値で代用されることが多い
・配列は要素数が可変だったり膨大なときには別のデータ構造を検討する
・アロケートを 1 バイトずつではなくある程度まとめて行う
・memcpy よりも memmove の方が安全でおすすめ*1
・リストは頻繁に順序の変更されるときに向く
・書式文字列を引数に取るという方法
・ルートからリーフまでの個々の経路がほぼ同じ長さのツリーをバランス木(balanced tree)という
再帰が最終的に自分自身の呼び出し結果の返すことを末端再帰(tail recursion)という
・間順走査(in-order traversal)は部分木を左から右へ行く中間で処理の行うことをいう
・降順走査(post-only traversal)は子を訪れてから現在のノードに対する処理の行うことをいう
・ハッシュをうまく使えばルックアップや挿入、削除が一定時間で可能になる
・ハッシュの配列サイズはルックアップ作業が O(1) になるような大きさにする
・ASCII 文字用のハッシュ関数の乗数には 31 と 37 が適している


アルゴリズムの使用では、まず使えそうなアルゴリズムとデータ構造の吟味し、その上でどの程度の量のデータを処理するのか考え、更にライブラリや言語の機能で使えるものがないか考える。それでも適当なものがなければ、短い実装を書くかどこかから拝借する。


あくまで高度なテクニックに頼るのは上記を行って、なおかつ性能の問題が出たときにする。ほとんど場合、配列、リスト、ツリー、ハッシュで対処できる。

*1:重複アドレスでも上書きしない

プログラミング作法1

第1章 スタイル
基本原則は簡潔性、明両性、一般性
低レベル階層の仕組みを理解するのは有益だ


・よいスタイルは習慣の問題である
・グローバルには分かりやすい名前、ローカルには短い名前
(インデックスの i,j、ポインタの p,q、文字列の s,t など)
・関連性のあるものは統一した命名をする
(queue、Q、Queue などと併用しない、bool を返す is・ など 関数には能動的な名前(動詞 + 名詞)を付ける)
・名前を的確にする
・構造が分かるようにインデントする
・自然な式を使う
(条件式を否定演算(!)ではなく、肯定となるように記述)
・カッコを使って式の曖昧さをなくす
(優先度の高いオペランド同士をくっつけて書く)
・複雑な式を一文にまとめず分割する
・明快に書く (小賢しいコードを書かない)
・副作用に注意する
・インデントとブレースのスタイルを統一する
(作業内容が常に同じ方法なら、それが違うだけで注目できる)
・言語の慣用句によって一貫性を確保する
(gets ではなく fgets を使う、strlen は \0 を含めず strcpy は含む、
多分岐に else-if を使う (可能性の高いものから記述))
落下シーケンスのcase文はきちんとbreakしよう
・関数マクロはなるべく使わない (C++ ならインライン関数で代替)
・マクロの本体と引数はカッコに入れる
マジックナンバーには名前を付ける (原則として 0/1 以外の全て)
・数値はマクロではなく定数として定義する
(define ではなく enum や const にする)
・整数より文字定数を使う
(0 をヌルポインタなら (void*)0 や NULL 、文字列終端なら \0 で区別、
0 はリテラルの数字 0 で使う)
・オブジェクトサイズは言語に計算させる
(sizeof(array)/sizeof(array[0]))
・当り前のことをいちいちコメントにしない
・関数、グローバル変数、定数定義、構造体・クラスメンバにはコメント
・悪いコードではコメントを付けるのではなく書き直す
・(修正があっても)コードと矛盾しないコメントを維持する
・あくまでも明快に、混乱を招かないコメントにする
(難問を増やすのがコメントの目的ではない)

ニュース201502

WBS20150201-20152228
メモ
バイオ工場でものづくり
サイバー攻撃企業の外から盗む
テロ対策は企業にも対策が求められる
日本人の心をつかむ3分でわかるピケティ
ただゼミ足立学生が塾を開く
世襲が大きな格差を生み出す
NPO法人キッズドア
リターン資本収益率はグロース経済成長率労働収益率を上回る場合格差は常に拡大し続ける
TPP政策一定量も枠を設けて保品物も輸入する
資本主義が格差を生む
格差が民主主義を壊す
戦争が格差を減らす
スペースマーケット空き場所×ニーズ
増える心の病自分では気づけないストレスチェックを企業に義務化する
2世帯住宅の相続税減税など税制優遇
科学の力でカシミヤを判定する
インバウンド消費対策
金利0パーセントで車を売る家電を売る
テレマティックス車の運転情報を使って保険料を決める
ARアプリ、カーザスかざすと翻訳
受験サプリ人工知能が家庭教師
ニュースアプリの編集長に人工知能
生涯年収は20代で決まる
深夜0時以降は勉強しない
オススメ伴走学習
14年9カ月ぶりの高値1万8305円
名目GDPは509兆円から488兆円に賃金は35万から31万
雇用者は4,300人から4,680万人だが、非正規500万人アップ
大きなシェアを求め起業するなら小さな市場を狙うべきだ
キッズサポーター、カラーズ
マーケティング会社トレンダーズ設立最年少女性上場社長
テクノロジー戦略チーム
設立される前にどのような歴史を経てきたかが重要だ
学習塾サバイバル月5万4,000円の学童保育
病院マイナンバー実証実験
仮のカード、保険証とクレジット
顔認証の銀行口座解決
公共インフラ契約解除
マイナンバー3000億円
番号反対、納税、社会保障は良い
40分でも才能発掘あなたも天才アスリート
民法200年項目120年ぶり改正不利な約款は無効

ベイマックス

ベイマックス
あなたの健康を守ります
尊敬するモノの死
未来への研究
研究の悪用

とてもおもしろい。
技術で世の中をより良い方向に導けるでしょうか。
サンフランソウキョウの美しい街並み。
空虚さを埋めるのは思い出の共有...
実験、実験の繰り返しが新しいものを作り出すために欠かせない.

疑似コード

疑似コードでロジックを設計


利点
疑似コードは言語に依存せずに、処理の流れ
作成するべき部品群を記述できる.


捕捉
仕様を満たすため、特に性能を満たすためには
ロジックまで十分検討されていることが必要である
核心部分はできるだけ半永久的にメンテする意識を
持ったものが設計し作成することで品質が上がる