「const」を含む日記 RSS

はてなキーワード: constとは

2017-03-20

http://anond.hatelabo.jp/20170320001230

htmlpdfって変数名とかでよくあるけど

web固有名詞constっぽいかWEBと書くのが俺的に正しい。

はい固有名詞ならWWW使った方がもっと正しいのだが俺の中で発音できなかったのでWEBとした。

という言い訳を思いついたが実のところどうしてそう書いたのかよくわからない。

2016-09-30

JavaScript配列初期化の話

JavaScriptで、配列を各要素がユニーク新規オブジェクトになるよう初期化したい。

Ruby

ary = Array.new(8) { Hash.new }

みたいなことをしたいのだけど、うまい書き方がわからない。

単純な実装としては

const ary = [];
for(let i; i < 8; i++){
  ary[i] = {};
}

みたいな感じだけれどもこれはなんとも微妙であるワンライナーで書きたい。

ちょっとかっこつけると

const ary = Array.call(null, ...Array(8)).map(() => { return {}; } );

とか

const ary = [...Array(8)].map(() => new Object() );

とかできなくもないけど、これらもどうにも不格好である

何かもっとシンプルクレバースマートなやり方はないものであろうか。

const ary = Array(3).map(()=> new Object());

とかできたらよかったのだけれども、残念ながら空要素はスキップされるらしく、これでは空配列が返ってくるから

一旦展開させてundefinedで埋めた配列を生成してからmapしなければいけないらしい。最終的に得たい配列が1つなのに、その前に別の配列を2つも生成するのが気持ち悪い。

2016-07-25

gitにおけるコミットログ/メッセージ例文集100

私はコミットログの書き方に悩む英語の苦手な人間である。実際、似たような人は世の中に結構いるようで、頻出単語を集計したりまとめたものは既にあって役に立つのだけれど、これらはあくま単語の話であり、具体的な文を構成する過程でやっぱり困る部分がかなりあった。

要するに、どういう時にどういう文が使われているのか、ということを示した例文集が欲しいのであるググると他にも「例文集があればいいのに」みたいな声はあるくせして、しかし誰も作ろうとしない。何なんだお前ら。それじゃ私が楽できないじゃないか

仕方なく自分でまとめたので、増田に垂れ流しておく。

はじめに

ここで挙げているコミットログは全て実際のコミットログから転載である。当然ながら各コミットログ著作権はそれぞれの書き手にある。いずれも各英文でググれば出てくるし、フェアユース範囲なら許してくれるだろうと考え名前プロジェクト名は割愛したが、ここにお詫びと感謝を述べておきたい。

抽出条件だが、参考にできそうなコミットログを多く含んでいそうなリポジトリGitHubSTARの多い方からざっと目で見て適当に選び、それぞれ最新コミットから5000件抽出した(あわせて前処理として、コミットログ冒頭のタグ情報は消去した)。

結果として対象としたリポジトリは以下の通り。

atomのみ5400件抽出していたため、計25400件のコミットログベースである。このうち、以下の条件に合致するものは参考例にすべきでないとして一律排除した。

こうして残った8540件を眺めながら、適当に切り出したのがこの用例集である個人的に「うーんこの」と思った表現も、散見される場合は載せた。

ということで、以下用例を羅列していく。

用例集

オプションフラグメニューを追加した
ファイルを追加した
メソッド機能を追加した
実装を別のものへ切り替えた
  • Use args.resourcePath instead of args.devResourcePath
  • Use arrays instead of while loops
  • Use auto instead of repeating explicit class names
  • Use weak pointer instead of manual bookkeeping
  • Change all uses of 'CInt' to 'Int32' in the SDK overlay
  • Change Integer#year to return a Fixnum instead of a Float to improve consistency
新しく何かに対応した/機能上の制約を取り払った
何かを使うようにした
より好ましい実装に改良した
何かを出来ない/しないようにした
  • Don't bail reading a metadata instance if swift_isaMask isn't available
  • Don't exit until the parent asks for an instance
  • Don't include Parent pointer in Nominal/BoundGeneric TypeRef uniquing
  • Don't use MatchesExtension for matching filters
  • Don't use ES6 class for AutoUpdater windows class
  • Don't use MatchesExtension for matching filters
  • Avoid `distinct` if a subquery has already materialized
  • Avoid infinite recursion when bad values are passed to tz aware fields
オブジェクトの内容や挙動確認やすくした
Assertを追加した
不要コードを除去した
コードを移動した
名前修正した
さなバグタイポ修正した, 警告を潰した
バグや好ましくない挙動修正した
テストコメントドキュメントを追加した
テストを削除した
テストコメント修正した
ドキュメント修正した

表現傾向とまとめ

以上の用例をふまえ、今回の参考ログ8540件から先頭の単語を出現回数で並べると次のようになった。

Add1149
Fix1014
Update584
Remove566
Use382
Don't260
Make228
Move178
Change103
Rename85
Improve76
Avoid68
Allow65
Implement60
Handle58

コミットログの基本形はもちろん動詞 + 名詞である名詞固有名詞複数形、不可算名詞が多いが、単数形場合冠詞は a が使われるか、あるいは省略される。the はまず使われない。

何かを追加した、という表現では非常に広く Add が使われる。メソッドからテストドキュメントに至るまで大概これでまかなえる。

一方、何かを修正した、という表現では広く Fix が使われる。「何か」は typocrash といった単語からメソッド名まで幅広い名詞を取るが、動名詞はあまり取らないのと、that節は取らないのでその点は注意が必要である

Fix は「何かが正しく動くようにした」ことを示し、正しい動作内容が何かを説明しない。そこで正しい動作内容に言及したい場合Make sure が使われる(こちらはthat節が取れる)。ただし Fix よりもニュアンス的に重い表現と思われ、Fix を使わず Make sure ばかり使うのはちょっとキモいのではないかと思う(Ensure はさらに重い表現っぽい)。

また、Fixtypo 以外でのドキュメント修正に対して使われることは稀である。対して Update はドキュメントコメントテストに使われ、本体コード修正に対しては使われない。本体コード修正にあわせてテスト更新したなら Update が使われる。ただ、テスト機構それ自体バグ修正したなら Fix である

無駄な何かを単純に除去したなら Remove を使う。これまでのもの(A)からのもの(B)に切り替えたのであれば Use B instead of A か Change A to B が使われる。新たに何かを利用するようにしたのであれば Use を、利用を取りやめた場合Don't use を使うことが多い。

何かをしないようにしたなら Don't を、内部実装効率化なら Make A + 比較級/形容詞Improve が使われる。

中身の変更を伴わない単なる名前の変更なら Rename A to B、コード機能論理上の場所を移動させたなら Move A to B である

この辺はリファクタリングと呼ばれる行為と思うが、Refactor というぼんやりした動詞はあまり使われず、このように変更内容の種類に応じて動詞が使い分けられている。

余談

コミットログにはWhyを書くべきだ、というのを何かで見かけたので because とか since を使ったログがどの程度あるかを調べたが、8540件のうち22件だった。基本的に短く、シンプルに、一目で意味が取れるログが好まれる傾向がある。例えば get rid of とか2件しか使われておらず、圧倒的に remove である

一方で、シンプル単語だけど開始単語としては使われないものもある。例えば次のような単語である。Expand(9)、Extend(8)、Print(5)、Optimize(5)、Publish(4)、Append(4)、Modify(3)、Manage(2)、Revise(2)、Dump(2)、Insert(2)、Migrate(2)、Enhance(1)、Edit(1) 。いずれもカッコ内は8540件に対する冒頭での登場回数である。結局、より一般的平易な単語で表せたり、Refactor同様に抽象度が高すぎると使われないのだろう。

おわりに

8000件もログを見たおかげで、迷いなくコミットメッセージが思いつくようになったのが個人的には今回書いてて最大の収穫だった。たぶんカンニングペーパーを作る行為それ自体効率のいい学習になるという話と同じだと思う。

このまとめも100以上用例を転載してあるので、それを読むだけでも多少は効果があるんじゃないかと思う。同じようにコミットログ書きたくねぇなぁ英語わっかんねぇなぁと思っている人にとって、何か役に立つところがあれば幸いである。

2016-06-12

言語ごとの定数の宣言方法

C,C++

→defineを使って、主にヘッダファイル定義

VBVBA

Constステートメントを使って定義

Java

→定数定義という概念がないので、

 final変数を変更不可の変数として宣言する。

 定数をクラスでまとめるのが普通

2016-05-24

http://anond.hatelabo.jp/20160524151555

FRPライブラリサブタイトルに、 library that provides first class reactive value 'over time' と書かれている、これ拡張じゃないのか?

拡張なら「関数型的じゃない」っていわれたら「関数型を拡張してるから」って答えればいいだけの話

すでに出たサンプルからFRPの効力がまざまざと見せつけられている。

FRPの効力を否定なんて誰もしてない(よね)

「これが正しい関数型でお前らの状態渡しは間違ってる」みたいに言うから荒れる

間違っている電波

個人的電波だと思うのはこういう匿名書き込みを住井だ駱駝だ言い出すところ

いやだから、定数なんだから書き換わらないんだよ、FRPストリームconst 定数なんだから

ストリームから定数とか、過去の値保存してるから定数とか言ってみたところで、プログラム内の色んな関数から読み書きされる可能性があって誰が書き換えたか中身読まないとわからないんじゃ、グローバル変数使ってるプログラム欠点をそのまま持ってるじゃん

http://anond.hatelabo.jp/20160524145224

よーわからんw 岡部氏は、自作ライブラリHPで、

FRP純粋理想とする関数型+時間で変化するストリームを値にマップして扱うリアクティブプログラミングの組み合わせ

まり関数型の拡張っていうなら誰も反対無いと思うんだけど。

FRPライブラリサブタイトルに、 library that provides first class reactive value 'over time' と書かれている、これ拡張じゃないのか?

https://www.npmjs.com/package/timeengine

HaskellのIOモナドみたいな別の抽象化DISりつつ、FRPこそ正しい関数型みたいに言うから荒れるんじゃないの?

IOモナドDisってるのかどうかまでは知らない。しかし、すでに出たサンプルからFRPの効力がまざまざと見せつけられている。

荒れるのは自由だけど、両方正しいとかそういうのじゃなくて、間違っている電波だみたいな叩きしかなくて、要するに感情論で反対派は反発しているだけでOK?

あるよ。

関数がどのパラメータ依存して、何を結果として返すのか明確になる。

グローバルな値を参照したり書き換えたりしてたら、関数の中身読まないとわからなくなる。

短いプログラムならそれでもいいけどね。

別の誰かが書いてたように、上位スコープ内に定義されてるDOMでも、数学ライブラリでもなんでも、引数関数に渡すのか?

グローバルな値を参照したり書き換えたりして

いやだから、定数なんだから書き換わらないんだよ、FRPストリームconst 定数なんだから

関数型のわかりやす説明であって、住井派に反対してるとか、岡部路線とかじゃないよね、と。

オブジェクト指向と対比して考え方をまず学ぶって岡部路線、住井グループはそれを目の敵にしていて集団的攻撃している様をみたプログラミングコミュニティは逃げ、その後、不毛な大地のみが残った。

http://anond.hatelabo.jp/20160524143022

そうなんだよね・・そもそもconstの定数をわざわざ、関数引数にすべき必要があるのか??という根本的な問題がある。

たとえばGlobalにアクセスできて当然のDOM要素とか、Piとか、スコープ可視の定数は引数にしないよね?

2016-05-20

http://anond.hatelabo.jp/20160520134528

すでに出てるけどユーザから見て

const __x = __();
undefined
> __x.t = 1;
1
> __x.t = __x.t + 1;
2
> __x.t;
2

昔の値を別の場所に保存していようが、これを関数型とは言わないし、普通命令型。

kenokabeのGUIプログラムも、イベントが起こるたびに変数の値を繰り返し更新してる。

いくら哲学ガーとか言い訳しても、この単純な事実は動かない。

http://anond.hatelabo.jp/20160519142942

何度も指摘されているが「岡部氏のFRP」は同じメンバ変数tに何度も値を上書きしてるだけの

FRP以前に関数型でもない普通命令プログラムいくら論文曲解したり哲学とか言い訳しても

客観的には単なるメンバ変数への破壊的代入。オブジェクトconstをつけたところで

メンバ変数constにはならない。


http://kenokabe-techwriting.blogspot.com/2016/05/ocamlgui-esumii-camloebanonstarter.html

__items.t = __value.t

コードで、これがもし破壊的代入ならば、

const ListElement = __Element(__([__items])

.__(() => ......

というように、「破壊」されたはずの、過去の__items.tすべてのデータアクセスして列挙表示できてるのは何故?

説明どうぞ?

http://anond.hatelabo.jp/20160519135844

http://kenokabe-techwriting.blogspot.com/2016/05/ocamlgui-esumii-camloebanonstarter.html

__items.t = __value.t

コードで、これがもし破壊的代入ならば、

const ListElement = __Element(__([__items])

.__(() => ......

というように、「破壊」されたはずの、過去の__items.tすべてのデータアクセスして列挙表示できてるのは何故?

説明どうぞ?

2016-05-19

http://anond.hatelabo.jp/20160518171946

何度も指摘されているが「岡部氏のFRP」は同じメンバ変数tに何度も値を上書きしてるだけの

FRP以前に関数型でもない普通命令プログラムいくら論文曲解したり哲学とか言い訳しても

客観的には単なるメンバ変数への破壊的代入。オブジェクトconstをつけたところで

メンバ変数constにはならない。

 

じゃあOCaml純粋関数型や(本当の)FRPで複雑なGUIアプリが書けるかと言うと、

理論的には不可能ではないかもしれんが、もともと非純粋なので

誰もそういうライブラリを整備してないから、ライブラリから作るのは

まあ面倒だろうし、わざわざ非純粋関数型言語純粋関数型のGUIを作る動機

現時点ではまずないだろう。これもすでに指摘されているとおり。

 

もっとも「岡部氏」は「お絵かきアプリ」も「FRP実装が必ず必要となります。」と自分ブログで断言し、

その反例としてOCamlやらHaskellやらのコード直ちに書かれた以上、また話を逸らすのも大概ではある。

http://anond.hatelabo.jp/20160516192742

http://kenokabe-techwriting.blogspot.com/2016/05/ocamlgui-esumii-camloebanonstarter.html

自称関数コードに出てくる

__value.t = e.target.value
__items.t = __value.t

等々も、kenokabe氏の心の中では「時間軸でインデックスされた何か」なのかもしれないが、

客観的にはマウスクリック等のたびに同じメンバ変数__value.tや__items.tへの

破壊的代入が何度も実行される命令プログラムのもの

__valueや__itemsにconstがついていても、__value.tや__item.tはconstではない。

2016-05-16

http://anond.hatelabo.jp/20160516112619

実際、timeengine.js を読み込んだ状態で、以下のようになります

const __x = __();
undefined
> __x.t = 1;
1
> __x.t = __x.t + 1;
2
> __x.t;
2

これは岡部健氏が著書で「論理破綻」と批判していた、命令言語破壊的代入そのものです。

なお私を他の誰かと決めつけるのは、その方たちにご迷惑ですのでおやめください。

……と言っても聞き入れていただけるとは思えないので、私ももうこれ以上の書き込みはやめます

できるだけ丁寧に技術的な誤りだけを指摘したつもりですが、やはり誹謗中傷しか返ってこないようで残念です。

2015-07-25

不定方程式の解を求めるためのC++のコード(2chプログラマ板の片山氏の作成

// Copyright (C) 2015 Katayama Hirofumi MZ. All Rights Reserved.

2.//

3.// http://p...content-available-to-author-only...h.net/test/read.cgi/tech/1437736018/

4.//

5.// 式 1/2^(a1) + 1/2^(a2) + … + 1/2^(an) = 1

6.// を満たす非負整数a1~an(ただしa1≦a2≦・・・≦an)を求める

7.// プログラムBASICで作りたい。nを適当指定できるようにして

8.// すべての解を出力するプログラムを書け。

9.#include <iostream>

10.#include <set>

11.#include <map>

12.using namespace std;

13.

14.int n;

15.set<map<int, int> > solutions;

16.

17.void print(const map<int, int>& m) {

18. for (auto& pair : m) {

19. for (int i = 0; i < pair.second; ++i) {

20. cout << pair.first << " ";

21. }

22. }

23. cout << endl;

24.}

25.

26.int total_count(const map<int, int>& m) {

27. int c = 0;

28. for (auto& pair : m) {

29. c += pair.second;

30. }

31. return c;

32.}

33.

34.void do_it(const map<int, int>& m) {

35. if (total_count(m) == n) {

36. solutions.emplace(m);

37. return;

38. }

39. for (auto& pair : m) {

40. if (pair.second > 0) {

41. auto m2 = m;

42. m2[pair.first] -= 1;

43. m2[pair.first + 1] += 2;

44. do_it(m2);

45. }

46. }

47.}

48.

49.int main(void) {

50. cout << "n: ";

51. cin >> n;

52.

53. map<int, int> m;

54. m.emplace(0, 1);

55. do_it(m);

56.

57.

58. cout << "solutions: " << endl;

59. for (auto& ans : solutions) {

60. print(ans);

61. }

62.

63. return 0;

64.}

2015-02-12

メンバ名を見直す前にスコープを見直すべきだ!!!

例えば、こういうクラスがあったとする

/**
** ゲームキャラクラス
**/
class Character {

    /**
    * 歩行の状態にする。
    * @param $place 歩行する場所。
    */
    private function _walk($place){
        $this->_state = Const::STATE_WALK;
        $this->_place = $place;
    }

    /**
    * 山を歩いている状態にする。
    */
    public function walkInMountain(){
        $this->_walk(Const::PLACE_MOUNTAIN);
    }
}

「walkIn~~ってメソッド名長くね?」

「良く使うメソッドから、あんまり書くと、ソースが読みづらくなるんだよね。」

という突っ込みが入ったとする。

対応として、

walkInMountain → walkInMt

とかやってもいいけど、逆に分かりづらくなる。mtってなんやねんと。

そういうときは、メンバのスコープを見直すべきだ。

/**
** 歩行クラス
**/
class Walk {

    private $_chara = null;

    public function __construct($chara){
        $this->_chara = $chara;
    }

    /**
    * 歩行の状態にする。
    * @param $place 歩行する場所。
    */
    private function _walk($place){
        $this->_chara->state = Const::STATE_WALK;
        $this->_chara->place = $place;
    }

    /**
    * 山を歩いている状態にする。
    */
    public function mountain(){
        $this->_walk(Const::PLACE_MOUNTAIN);
    }
}

とすれば、呼び出し元から

$chara = new Character();
$chara->walk->mountain();

みたいに、

主語->動作->述語

という構文で記述できるので、すっきりすると思う。

before)
$chara->walkInMountain();

after)
$chara->walk->mountain();


アレ?名前の長さが変わらない!!!

でも、やりたいことはそういうことだ!

つたわれ!俺の思い!

他にも、メソッドスコープでいくと

int write()
{
    int numberWritable = 0;
     :
}

こんなのは

int write()
{
    int number = 0;
     :
}

にしてしまえ!

writeメソッドにあるんだから、writableだろう!

みたいな。

2014-05-29

WinInetを使ってVBAでPOSTする

Option Explicit

Private Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Private Const INTERNET_OPEN_TYPE_DIRECT = 1
Private Const INTERNET_OPEN_TYPE_PROXY = 3
Private Const INTERNET_SERVICE_HTTP = 3
Private Const INTERNET_DEFAULT_HTTP_PORT = 80
Private Const INTERNET_FLAG_RELOAD = &H80000000

Private Declare Function InternetOpenA Lib "wininet.dll" (ByVal sCallerName As String, ByVal dwAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal dwFlags As Long) As Long
Private Declare Function InternetConnectA Lib "wininet.dll" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nProxyPort As Integer, ByVal sUserName As String, ByVal sPassword As String, ByVal dwService As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByRef sBuffer As Byte, ByVal lNumberBytesToRead As Long, ByRef lNumberOfBytesRead As Long) As Long
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInternetHandle As Long) As Long
Private Declare Function HttpOpenRequestA Lib "wininet.dll" (ByVal hConnect As Long, ByVal sVerb As String, ByVal sObjectName As String, ByVal sVersion As String, ByVal sReferer As String, ByVal sAcceptTypes As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
Private Declare Function HttpSendRequestA Lib "wininet.dll" (ByVal hRequest As Long, ByVal sHeaders As String, ByVal dwHeadersLength As Long, ByVal lpOptional As String, ByVal dwOptionalLength As Long) As Long

Private Function submitPost(ByRef host, ByRef url_path, ByRef sendString) As Variant

  Dim dataArray() As Byte, dataPosition, dataSize

 'WinInet初期化
  Dim hInternet
  hInternet = InternetOpenA(vbNullString, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
  If hInternet = 0 Then
    submitPost = dataArray
    Exit Function
  End If

 'サーバ接続
  Dim hConnect
  hConnect = InternetConnectA(hInternet, host, INTERNET_DEFAULT_HTTP_PORT, vbNullString, vbNullString, INTERNET_SERVICE_HTTP, 0, 0)
  If hConnect = 0 Then
    InternetCloseHandle hInternet
    submitPost = dataArray
    Exit Function
  End If

 'リクエスト初期化
  Dim tmpURL As String * 255
  tmpURL = url_path
  Dim hRequest
  hRequest = HttpOpenRequestA(hConnect, "POST", tmpURL, "HTTP/1.1", vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
  If hRequest = 0 Then
    InternetCloseHandle hConnect
    InternetCloseHandle hInternet
    submitPost = dataArray
    Exit Function
  End If

 'リクエストを送信
  Const strHeader = "Content-Type: application/x-www-form-urlencoded"
  HttpSendRequestA hRequest, strHeader, Len(strHeader), sendString, Len(sendString)

 'データ取得
  Dim readResult, tmpArray(1023) As Byte, tmpPosition, tmpSize
  dataPosition = 0
  dataSize = 0
  Do
    tmpSize = 0
    Erase tmpArray
    readResult = InternetReadFile(hRequest, tmpArray(0), 1024, tmpSize)
    If Not readResult = 1 Or tmpSize = 0 Then
      Exit Do
    End If

    dataSize = dataSize + tmpSize
    ReDim Preserve dataArray(dataSize - 1)
    For tmpPosition = 0 To tmpSize - 1 Step 1
      dataArray(dataPosition) = tmpArray(tmpPosition)
      dataPosition = dataPosition + 1
    Next
  Loop

 'クローズ処理
  InternetCloseHandle hRequest
  InternetCloseHandle hConnect
  InternetCloseHandle hInternet

  submitPost = dataArray

End Function

Public Function downloadFilePost(ByRef targetURL, ByVal sendArray, ByRef savePath) As Boolean

 'URLの分解
  Dim startE, endE, host, url_path
  startE = InStr(1, targetURL, "//") + 2
  endE = InStr(startE, targetURL, "/")
  endE = IIf(startE > endE, Len(targetURL) + 1, endE)
  host = Mid(targetURL, startE, endE - startE)
  url_path = Mid(targetURL, endE)

 'ポストデータエンコード
  Dim jscript
  With CreateObject("ScriptControl")
    .Language = "JScript"
    Set jscript = .CodeObject
  End With
  Dim ix, sendBuffer
  For ix = 0 To UBound(sendArray) Step 1
    sendBuffer = Split(sendArray(ix), "=")
    sendArray(ix) = sendBuffer(0) & "=" & jscript.encodeURIComponent(sendBuffer(1))
  Next
  Set jscript = Nothing

  Dim data
  data = submitPost(host, url_path, Join(sendArray, "&"))

  If LenB(data) <= 0 Then
    downloadFilePost = False
    Exit Function
  End If

 'バイナリで書き込み
  With CreateObject("ADODB.Stream")
    .Type = 1
    .Open
    .Write data
    .SaveToFile savePath, 2
    .Close
  End With

  downloadFilePost = True

End Function

2014-03-04

http://anond.hatelabo.jp/20140304185035

何の言語かしらないが、正しい定義を書けよ


const MODE_VIEW = 1;
const MODE_PRINT = 2;
const MODE_DOWNLOAD = 3;

/* 表示モード */
const MODE_1 = 1;

/* 印刷モード */
const MODE_2 = 2;

/* ダウンロードモード */
const MODE_3 = 3;

というか Cだと

enum ENUM_Mode{
    MODE_NONE=0,
    MODE_VIEW,
    MODE_PRINT,
    MODE_DOWNLOAD,
};

enumになってないと デバッガーで追い切れない?

※使わなくても、NONEは作って0にしておくのは小技

※MODE_DOWNLOADは 和訳すれば ダウンロードモード(和訳なのか?)なのでコメントを書く必要性がそもそも無い。

 

なんつーか、コメント日本語を使うな!がコメント上達への第一歩だと思う。

変数名まともに付けないプログラマは滅びろ

/* 表示モード */
const MODE_1 = 1;

/* 印刷モード */
const MODE_2 = 2;

/* ダウンロードモード */
const MODE_3 = 3;

何だ?この定数?

マジックナンバーやめろ下さいって言ったけどさ、これじゃ意味ねーだろ。

コメント内容を定数名に含めろっつーの。

お前のコード全部こんなんだよ。

滅びろ。

2013-04-29

http://anond.hatelabo.jp/20130429031901

t時点のキャッシュフローがΔc_0(t) (給与収入)、Δc_1(t) (運用益)、-Δc_2(t) (返済)だとして、資産額をU(t)、負債をD(t)とすると、

Δc_1(t) = r*U(t-1)、Δc_2(t) = c (= const.)で、U(t+1) = U(t) + Δc_0(t) + Δc_1(t) - Δc_2(t)、D(t+1) = (1+s)*D(t) - cであるから、r,sをgivenだとしたときに、

cを色々に変えてみるとどういうUの時間発展が得られるか

与えられた条件を代入し式を整理すると

U(t+1) = U(t) + Δc_0(t) + r*U(t-1) - c

D(t+1) = (1+s)*D(t) - c

ここで2つの式の差を取ると、

U(t+1)-D(t+1) = U(t) + Δc_0(t) + r*U(t-1) - (1+s) * D(t)

資産額と負債額との差は正である、すなわち左辺>0であることから

Δc_0(t) + U(t) + r*U(t-1) - (1+s)*D(t) > 0

である

なんでcが関係あるんですかね?

http://anond.hatelabo.jp/20130429025342

そりゃさすがに逐一説明していくほど余裕は無いからね…。

まぁ簡単に言えばt時点のキャッシュフローがΔc_0(t) (給与収入)、Δc_1(t) (運用益)、-Δc_2(t) (返済)だとして、資産額をU(t)、負債をD(t)とすると、

Δc_1(t) = r*U(t-1)、Δc_2(t) = c (= const.)で、U(t+1) = U(t) + Δc_0(t) + Δc_1(t) - Δc_2(t)、D(t+1) = (1+s)*D(t) - cであるから、r,sをgivenだとしたときに、

cを色々に変えてみるとどういうUの時間発展が得られるか考えればいいんだよ。分かりやすく噛み砕いて説明するのってコストかかるんだよ。

2012-07-05

http://anond.hatelabo.jp/20120705023743

自己評価自分でも高いかいかよく分からない。

問題を他人に押し付けられる感じが嫌なんだよね。

まったりと、自分の好きな課題だけに取り組んでいきたい。そういう風にして生きている。

プログラミングも同じで、自分の作りたいものだけを作って生きている。

それともう一つ不満なのは(或いは『自分に合ってない』と表現した方が適切なのかも知れない)、洗練されたデータ構造設計必要性が問題中に殆ど出現しない所。

これは多くの言語に対して同じ問題を提供するには仕方のない事かも知れない。でも個人的にはそれが不自由で仕方がなかった。

例えばC++における純粋仮想関数インターフェイス)と継承を使った下記の様な「木」を表現した構造、まず出てこないでしょ?C++ではなくCならswitchテーブルを使った再帰関数で実現する必要があるし、これが言語間で共通な問題を隔てる原因にもなっている。

struct interface_tree{
    virtual double eval() const = 0;
    virtual std::size_t subtree_num() const = 0;
    virtual interface_tree *subtree(std::size_t) = 0;
    virtual ~interface_tree(){}
};

// expression tree, add
struct tree_add : public interface_tree{
    tree_add(std::size_t n, interface_tree **t){ subtree_[0] = t[0], subtree[1] = t[1]; }
    virtual double eval(){ return subtree(0)->eval() + subtree(1)->eval(); }
    virtual std::size_t subtree_num() const{ return 2; }
    virtual interface_tree *subtree(std::size_t i){ return subtree_[i]; }
    virtual ~tree_add(){ delete subtree_[0]; delete subtree_[1]; }
    interface_tree *subtree_[2];
};

// expression tree, sub
struct tree_sub : public interface_tree{
    tree_add(std::size_t n, interface_tree **t){ subtree_[0] = t[0], subtree[1] = t[1]; }
    virtual double eval(){ return subtree(0)->eval() - subtree(1)->eval(); }
    virtual std::size_t subtree_num() const{ return 2; }
    virtual interface_tree *subtree(std::size_t i){ return subtree_[i]; }
    virtual ~tree_add(){ delete subtree_[0]; delete subtree_[1]; }
    interface_tree *subtree_[2];
};

// expression tree, value
struct tree_val : public interface_tree{
    tree_val(double n_) : n(n_){}
    virtual double eval(){ return n; }
    virtual std::size_t subtree_num() const{ return 0; }
    virtual interface_tree *subtree(std::size_t i){ assert(0); }
    virtual ~tree_add(){}
    double n;
};

// ...

2012-06-29

どのプログラミング言語が最も美しいか

■ C

for( const char *s="12345"; *s; ++s ) if( '2'<*s&&*s<'5' ) printf( "%d", (*s-'0')*2 );

JavaScript

console.log([1,2,3,4,5].filter(function (i){ return (i > 2 && i < 5 ); }).map(function(i){ return 2 * i; }));

Python

print(map(lambda x: x*2, filter(lambda x: x>2 and x<5, [1,2,3,4,5])))

Ruby

puts [1,2,3,4,5].select{|i| i > 2 and i < 5}.map{|i| i*2}

C#

new{}{ 1,2,3,4,5 }.Where(x => 2 < x && x < 5).Select(x => x*2);

Common Lisp

(print (loop for x in '(1 2 3 4 5) if (< 2 x 5) collect (* x 2)))

Haskell

print [x*2| x <-[1,2,3,4,5], x > 2, x < 5]

■ J

  1. :(((>&2)*.(<&5)) a) # a=:1+i.5

■ R

print((function(){x<-c(1,2,3,4,5);x[2<x&x<5]*2})())</p>

Clojure

(print (for [x [1,2,3,4,5] :when (< 2 x 5)] (* x 2)))

Squeak Smalltalk

(1 to: 5) select: [:x | x between: 3 and: 4] thenCollect: [:x | x * 2]

2012-06-15

http://anond.hatelabo.jp/20120615111615

スマートポインタは、ここで言われている アドレスの参照指定としてのポインタじゃないよ。単なるコンテナ名前ポインタってついてるからといって、いわゆるポインタじゃない。分類的にはコンテナ

 

const char *str = "hogehoge";

std::string str = "hogehoge";

std::tr1::smart_ptr<std::vectorchar> > hako(new std::vectorchar>);

の3種類があった時に string型も ポインタを代入しているが、 ポインタとは呼ばないだろ。コンテナと呼ぶ。

記法上 new を呼び出すが、 それが嫌なら、そういうコンストラクタ書いてもいいしな。

 

const char*なら

str++ とか str-- str+n という記法アドレス参照 ができるが

スマートポインタは そういう使い方はしない。 あくまでも指定されたオブジェクト管理するだけ。

たいていの使い方をする場合に、参照カウンタの増減なんて手動ではしないから。(というか、ポインタがわからない奴がするな コピコン使え という設計方針でいいとおもう)

そして、マーク&スイープはガベコレの技法からまして、自動でやるもので、たいていのプログラマーに書かせるものじゃない。

2012-06-14

http://anond.hatelabo.jp/20120612090336

最近はもう STLもあるしBoostもあるから ポインタを使うという事自体がレアケースなんじゃねーか?正直もうデフォルトでは教えない。でもいいと思うよ。

ぶっちゃけポインタを理解できない奴にポインタを触らせるな。というのが現場での共通見解

メモリ周りを奴らに触らせるな!と 絶対壊すから

むしろ、constとexplicit と 参照を厳密に使えるようになれって方がよほど重要

引数const char * とか const vector<T>&とかくところを それぞれ char * とか vector<T>とかかかれると

お前待て って話 の方がよほど重要

 

あと ポインタっていつ使うの?って 正直 高速化とかのチューニング以外ではもう使わないと思う。

listとかvectorとかを再発明するぐらいなら、大抵の場合STL使えよと。 逆にSTLじゃだめ Boostじゃだめとなったら、ポインタ必要性を知ってからポインタ学ぶからいんじゃね?

アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん