Django, python, android, その他いろいろな情報をアップ
[ 1 2 3 4 5 6 7 ]

[プログラミング] プログラミング作法の第1章を読んでみたときのメモ

以下、読んでみた時のメモです。

第1章 スタイル

変数名や関数名はオブジェクトのラベル。その目的について情報を伝える。
グローバル変数にはわかりやすい名前を、ローカルには短い名前をつける
例:
ループインデックス i, j
ポインタ p, q
文字列 s, t

関数名には能動的な名前をつける
 能動的な動詞+名詞
 getTime()
isOctal()

構造がわかるようにインデントしよう
自然な形の式を使う
カッコを使って曖昧さを解消する
明快に書こう
目的はあくまでも明快なコードを書くことであって、小賢しいコードを書くことではない
明快さと短さは同義ではない。「?:」を使って良いケース
max = (a > b) ?: a: b;


副作用に注意する
++演算子の副作用に注意

一貫性はより優れたプログラムをもたらす。
インデントとブレースのスタイルを統一しよう
1つのスタイルを選んでそれを一貫して利用すればいい。議論するのは時間の無駄。

慣用句によってっ完成を確保しよう
forの例
     for(i = 0; i < n; i++)
          array[i] = 1.0

・Cでリストをたどる標準的なループ
     for(p = list; p != NULL ; p = p->next){
          ...
     }

・無限ループ
     for(;;){}
     while(1){}

・文字列コピー
strlenは文字列の終端を示す\0を勘定に入れないが、strcpyはそれも一緒にコピーする。

     p = malloc( strlen(buf) + 1);
     strcpy(p, buf);


ANSI Cの標準ではないがstrdupというライブラリを使うのもあり。

多分木の判定にはelse-ifを使う。
switch文(必ずbreakを必要とする文)ならば、else-if文を使ったほうが分かりやすさは向上する。
switch文の落下の技を利用するのは、数個のcaseに同一の小ど~をが使われる場合
     case '0':
     case '1':
     case '2':
          …
          break


関数マクロは使わない
関数マクロの短所は長所を上回っている。

マジックナンバーには名前をつける
0、1以外のすべての数字は大芸がマジックナンバー

数値はマクロではなく定数として定義する
C/C++ではenum文で定義できる
     enum{
          MINROW=1,
          MINCOL = 1,
          MAXROW = 24,
          MAXCOL = 80
     };

数値の定義としてC++ではconstを用いてできるが、Cでは、constで定義した変数を配列の境界値として利用できないので、選択しとしてenumを利用する

整数ではなく定数を利用する?
     str=NULL;
     name[i] = '\0';
     x=0.0


オブジェクトサイズは言語に計算させる
     char buf[1024];
     fgets(buf, sizeof(buf), stdin);


宣言が可視の配列の時は下記のマクロで要素数を計算できる
     #define NELEMS(array) (sizeof(array) / sizeof(array[0]))
     double dbuf[100];
     for(i=0; i< NELEMS(dbuf); i++)

実際に計算が実行されるのはプログラムのコンパイル時。
*これこそマクロの正しい使い方

当たり前のことはいちいち書かない
注意すべき細かい点に完結に触れたり、もっと大きな視野で処理を解説することでプログラムの理解を助長するようなコメントがベスト
コメントは、コードを見てもすぐにはわからない情報を付け加えたり、ソースのあちこちに散らばっている情報を1ヶ所にまとめる役割を果たさないとならない。

関数とグローバルデータにコメントをする
     struct State {/*プレフィックス+サフィックスリスト*/
          char *pref[NPREF]; /*プレフィックス用の単語*/
          Suffix *suf; /*サフィックスのリスト*/
          State *next; /*ハッシュテーブル中の次の項目*/
     }

-否定演算子はわかりづらいので避けること。
-変数名resultは役に立つ情報を含んでいない。

コメントは、コードと矛盾させるな
あくまでも明快に、混乱を招くな


参考文献
ープログラミング書法
ーコードコンプリート・完璧なプログラミングを目指して、
ーエキスパートCプログラミング;知られざるCの深層

タグ: programming, C言語,

[Apache] オレオレ認証局の作成

SSLでサイトを後悔する必要がでてきたので、その時にオレオレ認証局を使って、サーバの証明書を発行するっていうような作業(これで、表現があってるかどうかは不明ですが。)

1.認証局の作り方
1.1 秘密鍵の作成
openssl genrsa -des3 -out secret.key 2048

1.2 認証局の証明書を作成
openssl req -new -x509 -keyout cakey.pem -out cacert.pem -days 1825

2.サーバ側
2.1 秘密鍵の生成
openssl genrsa -rand /var/log/http-error.log -des3 2028 > server-secret.key

2.2 秘密鍵からサイン要求ファイルを生成
openssl req -new -key server-secret.key -out csr.pem

csr.pem ← これがサイン要求ファイル

3.サイン要求ファイルに認証局の署名をもらう(csr.pemを渡しておく)
openssl ca -in csr.pem -keyfile cakey.pem -cert cacert.pem -out yaoya-web.crt

yaoya-web.crt ← これが署名付きの証明書



Virtual HostでのApache

Listen 443
NameVirtualHost *:443



ServerName doman:443
SSLEngine On
SSLCertificateKeyFile "/home/www/yaoya-web/src/yaoya/apache/certification/yaoya-secret.nopass.key"
SSLCertificateFile "/home/www/yaoya-web/src/yaoya/apache/certification/yaoya-web.crt"




タグ: Apache,

[Django] ERROR (EXTERNAL IP): Internal Server Error: /favicon.icoへの対処法

Djangoのsetting.pyで

Debug = False


で、運用を開始しようとすると、早速、アラートメールが。

"ERROR (EXTERNAL IP): Internal Server Error: /favicon.ico"

favicon.icoがないのがエラーがの原因です。そういえば設定してなかった。

解決策は2つ。
1つ目はApacheの設定、2つ目はDjangoでの対処。

今回は、Djangoで対処することに。
url.pyに以下の記述を追加でOKです。

urlpatterns = patterns('', 
    
    (r'^favicon\.ico$',  redirect_to, {'url':'iconのURL'}),

)



タグ: python, Django,

[jquery] jqueryでテーブルレコードの全削除

テーブルレコードを削除する方法を調べてちょっと戸惑ったので、メモ的な意味で残しておきます。

HTML
   


JavaScriptで以下の記述を行う。
	$("#store_table_body *").remove();


ボタンなどを押したときに、上記のJavaScritpを実行すると、store_table_body以下のレコードを全部削除してくれます。
タグ: JavaScript, jquery,

[Django] ModelAdminの各場所がいつの間にか変更されてました。

apache mod_wsgi + django + sqliteで運用するために、DEBUG=TrueからFalseに変更を行いました。
すると、adminの管理画面のモデルの追加で500Errorが発生!

いろいろとウェブを調べると、下記のような記述は、<プロジェクト名>/アプリケーション/admin.pyに書き込みを行う必要があるということがわかりました。

admin.site.register(Product, ProductAdmin)

なので、ProductAdminと上記のレジスタの記述をadmin.pyへ移行して無事動作を確認しました。
*1.3のマニュアルには書いてありました。
タグ: python, Django,
[ 1 2 3 4 5 6 7 ]
Thunderbird_3_column mac_dyld_crash_config first_django garden_3day retasu_1 select_mail_template