とりとめのないことを書いております。
by tempurature
カテゴリ
全体
プログラミング
scheme
verilog
未分類
以前の記事
2016年 04月
2016年 03月
2016年 02月
2016年 01月
2015年 12月
2015年 11月
2015年 10月
2015年 09月
2015年 08月
2015年 07月
2015年 06月
2015年 03月
お気に入りブログ
PHPで競技プログラミング
メモ帳
最新のトラックバック
ライフログ
検索
タグ
その他のジャンル
ブログパーツ
最新の記事
情報処理技術者試験 お疲れ様..
at 2016-04-17 18:55
基本情報技術者試験 平成27..
at 2016-04-14 04:48
基本情報技術者試験 平成27..
at 2016-04-13 23:03
苦い薬(ハーブ、サプリメント..
at 2016-04-09 14:03
「おバカ度チェックリスト」を..
at 2016-03-24 09:54
外部リンク
ファン
記事ランキング
ブログジャンル
画像一覧
<   2015年 06月 ( 5 )   > この月の画像一覧
【racket】正五角形を書く
c0364169_01074515.png
#lang racket/gui

(define x-size 300)
(define y-size 300)

(define target (make-bitmap x-size y-size))
(define dc (new bitmap-dc% [bitmap target]))

(define (regular-polygon n)
  (define angles (map (lambda (m) (* 2.0 pi (/ m n))) (range 0 n)))
  (map (lambda (phi) (list (sin (- phi)) (cos (- phi)))) angles))
(define (shift x y) (lambda (p) (list (+ (first p) x) (+ (second p) y))))
(define (magnify x y) (lambda (p) (list (* (first p) x) (* (second p) y))))

(define star (map (shift (/ x-size 2) (/ y-size 2))
                  (map (magnify (/ x-size 2) (/ (- y-size) 2)) (regular-polygon 5))))

(send dc set-pen "blue" 1 'solid)

(define line-index-pairs (map (lambda (n) (list n (remainder (+ n 1) 5))) (range 0 5)))
(define lines (map (lambda (pair) (append (list-ref star (first pair))
                                          (list-ref star (second pair))))
                   line-index-pairs))

(for-each (lambda (line) (send dc draw-line (first line) (second line) (third line) (fourth line)))
     lines)
(send target save-file "pentagon.png" 'png)

[PR]
by tempurature | 2015-06-27 01:08 | scheme
ものごとを続ける方法
私はPCのヘビーユーザーなので、次のような方法をとっています。

まず、PCのデスクトップのアイコンをほとんど無くしてしまいます。
「ドキュメント」フォルダの中にサブフォルダを作って全部分類するなどして、デスクトップ上にアイコンがない状態にします。

その上で、継続したいことの記録をつけるExcelファイル(Open Officeでも可)を1つ用意します。そして、ファイルには計画は書かずに実績だけ書きます。

そうすれば、継続している場合は楽しくなるし、やってなくてもリスタートすればいいということになります。

[PR]
by tempurature | 2015-06-22 00:02
プログラミングは難しいか?
プログラミングをどう習得すればいいかがわからないという話を聞いたことがあります。

プログラミングを習得するには、プログラミングができる人に相談するのが一番ですが、ここではプログラミングの学習を阻害する要因について考えてみます。


1. 何から手をつければいいのかわからない

プログラミング言語には、C, Java, VBA, Javascriptなど多種多様な種類があり、自分がしたいことに対してどの言語を選択するべきなのかがわからないのだと思います。そのようなことに対して、真摯に、包括的に論じた文献を私は知りません。とりあえずCやっとけということなのでしょうか?

例えば3Dのゲームやタブレットのアプリ、Webアプリなどはプログラミングを習得するのに時間がかかると思いますが、具体的にどのくらいかかるのかをあらかじめ調べておいた方がいいでしょう。

1ついえることは、未経験者でもソフトウェアハウスに就職すれば、その会社でやっていることくらいは習得できるので、人生は短いですし、独学でやるよりも就職活動に力を入れた方が効率的なのは間違いないです。


2. 習得したい言語の入門書の内容がわからない

プログラミングの本を小説のように読むと、わからないと思います。大学の微積分学の教科書よりはやさしいといった感じでしょうか?
 大体、入門書の著者がプログラミング全般に対して不勉強な場合も多々あります。入門書を買う前にインターネットで評判を調べた方がいいでしょう。

プログラミングの書籍を読むコツは、とにかく書いてあるコードは打ち込んでコンパイルしてみること、です。書籍の内容が文章やコードスニペット(それ単体では実行できないコード)ばかりだととたんに理解度は下がります。

また、プログラミングの書籍やインターネットの解説をそのまま実行してもうまくいかないことは多々あります。はなから「うまくいかないのが普通」という前提で臨んだ方がいいでしょう。

また、プログラマは暇ではないので、プログラミングのあれこれについて手取り足取り教えてもらおうとすると相手にしてもらえないと思います。だから、できるだけ自分で解決するクセをつけましょう。プログラミングもテスト勉強と同様、「ある意味」誰でもできますが、簡単ではないのです。


3. 文法は理解できたが、ライブラリが理解できない

プログラミング言語の文法についての理解は入門書である程度できると思いますが、ライブラリは文法に比べて膨大なので頭をかかえてしまうことが多いと思います。

そんな人は、Java, C#, rubyなど、比較的簡単だといわれている言語で同じことをしてみるといいと思います。これらの言語は割と最近にできた言語なので、ライブラリが整理されています。とはいえ、最初は非常に壁が大きいように思えるのではないかと思います。

わからないものに取り組む際、例えばファイルI/O, 正規表現, 文字コード, XMLパーサなど多々ありますが、1つ取り組んで、わからなければ他のをやる、疲れたら一旦離れるなどして、だましだまし取り組む必要があると思います。


4. プログラムを作っている途中で手が止まってしまう

これの答えは「Joel on Software」に書いてあります。プログラムの仕様書を最初に書きましょう。とはいえ、プログラマの中には文章スキルのない人も多いです。本当に悩ましい問題なんです。

もう一つのやり方としては、ソフト設計の定石を覚えてしまうことです。デザインパターンは抽象的なのであまりおすすめしません。ライブラリがモジュール設計の手本になるでしょう。私のお勧めはSchemeを勉強することです。


[PR]
by tempurature | 2015-06-21 19:55 | プログラミング
【verilog】スクリプトの活用について
UNIX系のEDAツールを使っている時、スクリプトが活用できるかどうかが仕事の効率アップの鍵になることが多いようです。
UNIXの作業効率を上げるためのスクリプトの活用についてまとめました。

1. まずはプログラミングをしないで済ませられないか検討しよう。

UNIXには豊富なコマンドが用意されており、プログラミングをしなくとも編集や繰り返し実行などが簡単にできるようになっています。例えば、テキストファイルの一括編集にはsedを使います。ファイルの表示にはcat, head, tailなどを使用します。また、パイプ機能を使えばテンポラリファイルを作らずに複数の作業を行うことができます。

2. 次に、シェルスクリプトで済ませられないか検討しよう。

スクリプトを書く必要がある場合にだけ書くようにします。なぜなら、シェルスクリプトのデバッグは意外に難しいからです。特にsedのような正規表現が絡むコマンドはスクリプトの中に書く前に、その1文だけをコマンドラインで思うとおりの動作をするかデバッグしましょう。
 UNIXのスクリプト作成でperlなどよりもシェルスクリプトを薦めるのは、コマンドライン上で1文デバッグできるということがあげられます。
 また、スクリプトは100行を超えないのが理想です。スクリプトが長大になると、スクリプトのテスタビリティが失われてデバッグしづらくなるためです。スクリプトが200行を超える場合は、その記述の一部を別ファイルに抜き出せないかを検討した方がいいです。

3. perl, rubyは作業環境に用意されていないコマンドを実装したり、移植性を高めたりするために使おう。

例えば、realpathというコマンドは環境によっては用意されていない場合がありますが、rubyを使うと1,2行で実装できます。また、コマンドラインやシェルスクリプト上でperl, rubyの1行実行をするのも有効な使い方です。

4. pythonは使わない。

pythonは、モジュールのコンパイルを行うのでインタプリタによるデバッグがしづらいです。また、pythonの1行実行もpython特有のインデントルールによって、あまり使い勝手がよくないです。


[PR]
by tempurature | 2015-06-21 18:30 | verilog
【verilog】ポートリスト間の食い違いを素早く見つける方法
verilogでは、ポート数が多いモジュールを作成して、インスタンス化するようなことが多々あるかと思います。

/* chaplin.v */
module chaplin ( you_ll, never, find, a, rainbow, if_, you_re, looking, down );

input you_ll, never, find, a, rainbow;
output if_, you_re, looking, down;

endmodule

/* united_artists.v */
module united_artists;

chaplin actor ( you1, will, never, find, a, rainbow, if_, you2, are, looking, down );

endmodule

そのとき、モジュールのポート数が食い違ってシミュレータのコンパイルが通らないことがあります。しかし、シミュレータのエラーメッセージには「どのポートが」食い違っているかまでは教えてくれないことがあります。そのような場合に、私がやっているテクニックをまとめます(UNIX系OSの場合)。

1. 2つのverilogファイルをコピーして、テキストエディタでそれぞれのポートリストを
切り出す。

/* tmp1 */
you_ll, never, find, a, rainbow, if_, you_re, looking, down
/* tmp2 */
you1, will, never, find, a, rainbow, if_, you2, are, looking, down

2. テキストエディタ上で、スペースを空文字列に置換する。
(viでは、:%s/ //g)

3. コンマを改行文字に置換する。
(viでは、:%s/,/^M/g ただし^MはCtrl+V, Ctrl+Mと入力してください)

4. tmp1, tmp2に空白行がある場合は削除します

5. ソートします
sort tmp1 > tmp3
sort tmp2 > tmp4

6. テキストファイルを比較します
$ diff tmp3 tmp4
1a2
> are
8,9c9,11
< you_ll
< you_re
---
> will
> you1
> you2

この比較によって、chaplin.vには、are, will, you1, you2ポートが不足していて、
united_artists.vにはyou_ll, you_reポートが不足していることがわかります。



[PR]
by tempurature | 2015-06-21 17:16 | verilog