学生の備忘録なブログ

日々のことを忘れないためのブログです。一日一成果物も目標。技術系はQiitaにあげるように変更しました。

勉強法

学生時代*1に信じていた勉強法

わんこら式

 私が高校生時代に信じて実践していた勉強法にわんこら式というものがある.

 これは,高速大回転法とか,7回読みと類似する勉強法である.特徴は以下の通り.

  1. 問題がすらすらと解けるまで,スピードを落とさず,何度も解く.
  2. 詰まれば,即座に解答を見ても良い.
  3. なるだけ短い周期を決め,その周期で決めた範囲を繰り返す.所定の回数を周回したら,繰り返す範囲を変える.
  4. 問題が難しいならば,どこまでもレベルを落とす.
  5. 自分が解答なしに解けるかどうかはチェックする.

アジャイル開発

 これとは別に,アジャイル開発手法というものがある.

  1. スプリントという開発サイクルを決め,目標を達成するまでの期間にこれを繰り返す.
  2. 開発は一つのスプリントで完結させる単位で行う.そしてそれはプロダクトにマージする.
  3. スプリントの終わりにKPT分析などをして前のスプリントの評価をする.
  4. 定期的に開発の現状を外部に公表し,評価する.

つまるところ,hello world状態のモデルに周期的に肉付けをしていくのだ.

比較してみて

 これらを比較してみてどうだろうか,とても良く似ていると思う.

  • 勉強
    • 最大の目的は素早く問題を解くこと.
    • 一つの問題を解けなくても次に強制的に進むことで,テストまでの時間全てを解けない問題に費やし泥沼化することを防げる.  
  • 開発
    • 開発においては,良い成果物を作ることが目的である.
    • 実装できないものに時間を掛けギリギリまでできない実装をしようとすることがない.

回顧

 私はわんこら式をやってみたが,上手く行かなかった.それをアジャイル開発を学び,実際に開発を行った経験から,その原因を考えたい.

上手く行かなかった原因

成果の実感

 アジャイル開発においては,開発進行具合の確認は比較的容易である.そもそもアジャイル開発においてはスプリント単位で進歩は完結していなければならないため,完了したか遅延しているかは,本体にマージされたかどうかで判断できるため,分かりやすい.

 しかし,勉強においては,理解は定量的に図りにくい.問題を解答をなしに解けるかを自分でやってみるということが良いのだが,やりたくないのだ.一つの範囲を比較的時間を掛け,何周も下のにも関わらず,解けなければ,その時間は無駄だったということになる.これが怖くてテストが億劫になってしまい,個人では気持ちが続かない.

結論

 もっと原因はあるのだろうが,自分が言いたかったことは,プロジェクト管理とは幅広い範囲に応用できることである.よって,様々なメソッドが出て来るが,根本的な部分は共通している.といういことが言いたかったのだ.そして,アジャイル開発により,効率的にブロジェクト管理をできたならば,もう一度これをやってみて,過去の復讐をしたいと思うのだ.

*1:学生とは本来大学生を指す.

ふつうのHaskellのコードについて

サンプルコードが正しくない.

 ふつうのHaskell内容がjavaを例示しながら書かれているシンプルで分かりやすい本である.

 私にはすごいHaskellより分かりやすい.しかし,古いためサンプルコードが動かない.

先達

2016-01-11 『ふつうのHaskellプログラミング』 もくもく読書会(第12章) の振り返り - SE情報技術研究会’s blog

Haskellを始めるにあたって読むべき3冊の本 - セカイノカタチ::Techlog

github.com

ファイルの文字列検索 ~emacs,shellコマンド~

目的

複数のファイル間で,あるいはあるディレクトリ配下全てで,文字列検索をしたい.

動機

 サンプルプログラムを,ダウンロードしてきて,このコードを使ってるコードを網羅的に探したい.

emacs

M-x grep-find

C-o,o,C-p,pなど色々面白い.ただ,見るためにバッファが全て開かれる.これは良くない所.ほかにいいのないかな.

f:id:forhighlow:20170421185613g:plain

C-x C-b 
(あるいはC-x b)して,
markをつけて,
C-z (あるいはtab,Function)でpatternで選択,
kill bufferを選んで一気に消さなければならない.

shellコマンド

 どこからかコピペしてきたやつ.申し訳ありません.

##########################
# grep
#   -r : 再帰的にgrepコマンドを実行する
#   -n : 行番号を出力する
#   -w : 文字列全体にマッチする場合
#   -l : (option)これをつければファイル名だけを出力(マッチした部分は省く)
#
# Usage
#   # 現在いるディレクトリ配下から「httpd」という文字列を含むファイルすべてを抽出する
#   $ grep -rnw . -e "httpd"
##########################
grep -rnw 'directory' -e "pattern"

Haskell ~入出力~

入出力

コード

main = do
  out <- getLine -- input: out
  putStrLn (out ++ "は大事") 
% stack build;stack exec project1-exe 
project1-0.1.0.0: unregistering (local file changes: src/Lib.hs)
project1-0.1.0.0: build (lib + exe)
Preprocessing library project1-0.1.0.0...
[1 of 1] Compiling Lib              ( src/Lib.hs, .stack-work/dist/x86_64-osx/Cabal-1.24.2.0/build/Lib.o )
Preprocessing executable 'project1-exe' for project1-0.1.0.0...
[1 of 1] Compiling Main             ( app/Main.hs, .stack-work/dist/x86_64-osx/Cabal-1.24.2.0/build/project1-exe/project1-exe-tmp/Main.o ) [Lib changed]
Linking .stack-work/dist/x86_64-osx/Cabal-1.24.2.0/build/project1-exe/project1-exe ...
project1-0.1.0.0: copy/register
Installing library in
/.stack-work/install/x86_64-osx/lts-8.11/8.0.2/lib/x86_64-osx-ghc-8.0.2/project1-0.1.0.0-AckhfDVtQB568iPvGBSrt7
Installing executable(s) in
/.stack-work/install/x86_64-osx/lts-8.11/8.0.2/bin
Registering project1-0.1.0.0...

% stack exec project1-exe
hellowordl
hellowordlは大事

do式

コードのレイアウト

 do式の複数の式を束ねる構文である.Javaのブロック構文に相当する.

 do式のように複数の式を束ねる構文では,複数の式のインデントを揃えることが属するブロックを表す.

 この規則を,レイアウト,またはオフサイドルールという.

do式と遅延評価

 Haskellの特徴は遅延評価である.よって,命令型のプログラム言語のように上から順に実行されるわけではない.do式を使うと,上から処理されていく.

参考

ふつうのHaskell

Amazon CAPTCHA

ここの記事が小さく良くまとまって書いてある. Haskellで競技プログラミング IO編 - Qiita

markdownの見出し

見出しがほしい

 見通しが良いのに越したことはない.

人間の脳機能として

 人間は,一つのモデルを学習する(etc,,,技術本)際には,頭のなかに骨組みを作ってから,それに肉付けしていく.

 目次はそれの骨組みの構築の助けになる.よって,読者の理解度を向上するという点でも,重要なのだ.

目次をつける方法

[:contents]

まとめ

 定型文でつけるかは考えもの

Haskellの学習する動機

なぜhaskellを学ぶか

注意この記事は,全く固まっていない私の考えを形にするためのものです.

 これにはいろいろな記事が言語問わずある.  

 今日2017/04/19時点で学ぶ動機は,現状,まだ使われている純粋関数型の生き残りであるからである.

 純粋関数型と呼ばれる言語は数あれど,現在いまだ使われているものは少ない,そのなかでも,変数や引数の評価の際に,融通がきかないのはHaskellくらいである.他の言語は人間に歩み寄り,本来の純粋関数型の形では通らない表現が可能である.

 よって,純粋関数型を勉強したいと思った時Haskellが適切である.これは,別にHaskellが生産性が高く,直感的で,コミュニティが活発で,パッケージが充実していて,などそういった尺度で選ばれたわけではない.

結論

 純粋関数型の勉強のため

追記2017/04/19

 あまりにもあまりになので「ふつうのHaskellプログラミング」を読んでみた.

「ふつうのHaskellプログラミング」作者が言うには,,,

  1. 柔軟なプログラミング
    • 高階関数というものをhaskellは持つ.
      • これは,関数を引数として受け取ったり,返したりする関数のこと.
  2. コンパイル時の型のチェックが強力
    • 多相型という機能があり,様々な型を使いたいときに統一的に扱うことができる.これはJavaの総称型とほぼ等しい.
  3. 可読性が高い
    • 再代入ができないことは,現代の大人数のソフトウェア開発においても,代入の乱用による可読性の低下を0にできる.
  4. 遅延評価
    • 純粋関数型言語は他多数ある.ML,CommonLisp,Scheme,などだ.しかし,これらは遅延評価をしない.
      • 遅延評価とは引数を必要なときに評価するということである.これは,純粋関数型において,柔軟性を発揮する.

markdown記法について

 空白はめちゃくちゃ大事.

 特に,記号をリストとかにしたい時,記号の後に空白入れないといけない

 "「* 」でリスト表現,ただし,タブか空白文字4つで階層を表さないといけない"

* hoge
    * fuga
        * piyo
  • hoge
    • fuga
      • piyo