「引数」を含む日記 RSS

はてなキーワード: 引数とは

2020-12-01

anond:20201201171157

追記

まず簡単なのはここに書いてある。

ttps://agk.saloon.jp/how-to-jp-series

結論をいうと対象ソフトが下記を満たすかどうかで難易度がかなり変わる。

1. 表示テキストが外部ファイルになっている or exe内部のリソースファイルから読み取られる ↔ プログラム埋め込み

2. 内部のテキストエンコード方式UTF-8 or 16 or 32 ↔ ASCIIなど

3. フォントシステムにあるのが使われる ↔ 外部ファイルになった画像フォントが使われる

すべてのソースが公開されていない限り、この条件を満たさなもの基本的日本語にできない。

例えば、自分C言語printfだけのHello world!プログラムを作ってみて、それをソース無しで、外からテキストを変更できるかためしてみればいい。

これは1に反するから多分簡単には出来ない。よしんば出来たとしても、Hello world!より文字数が多いテキストに変えるのはそれなりに面倒である

こういう表示をさせるやり方としてはprintfに渡すデータを実行時にすげ替えればいい。具体的にはprintfの直前で別の箇所にジャンプさせて引数レジスタに書き換えたいアドレスを渡して、またprintfまで戻ってくればいい。

これ以上に面倒なのが、2と3が合わさったもので、欧米アルファベットしか使わないため、ソフトの内部コードASCIIやCP12XXだったりする。さらにそのソフトに用意されているフォント文字はその範囲しか存在しない。これらはどう頑張っても普通に日本語を表示することは出来ないので、かなり強引に改造するしか無い。俗に中華パッチと呼ばれているものがそれである

具体的にはソフトのどこかで、表示させるテキスト配列から文字を1文字取得、1文字からコードポイントに変換、フォントファイルからそのコードポイントのグリフデータを取得、グリフデータを画面に表示させる処理があるため、そこに割り込む。1バイト取得している箇所を2,3バイト一気に取得して、それをなんとかしてコードポイントにして、そのコードポイントをグリフ取得の処理に回せばいい。

この方法にしても、技術的に難しい点は存在せず、技巧的であり、Cの本を読めば誰でもできる処理である

2020-11-16

anond:20201116050134

虎の威を借る狐のごとく他人に言われたことを鵜呑みにして自分の頭で解釈しようとしない愚図の三下には答えられるはずもないので、私が代わりに応えよう。

だったら「返り値と引数チェックにしか型チェックを使ってないC言語問題は起きないはずたが現実はどうよ?」「RubyPython動的言語だけど、強力な型付けのされた言語とは言えないのか?」という疑問に答えられるはず。

ひとつ前の人が言っていたのは、型チェックとテスト仕事バランスの取り方だ。

型チェックの仕事テストが奪うな、ということ。

ももっと悪い事態として、仕事放棄する場合もあり得る。C言語の例はそれに当たる。

C言語の弱い型の中で提言に則りベストを尽くしても型チェックにできる仕事は少ない。

からテストコードを書かざるを得ないが、テストコードを書くことをサボってしまえば問題は起きる。それが現実に起こっている。

RubyPython は強い型付けの言語だ。だが型システムは十分に整理されていない、と思う。

テストコードが膨れ上がるのがその証拠だろう。

実質的に、型システム言語側にビルトインされたテストコードだ。末端ユーザーが書いていたテストリファクタリングして共通化し、上流に巻き上げてコンパイラに組み込んだのが型システムと言える。

貧弱な型システムの元では末端ユーザーが個々に努力して不足を補う必要があって、言語ユーザー全体のコード総量は大きくなる。洗練された型システムを使うユーザーテストコード保守する責任を持たないので末端ユーザー間のコード冗長性は少なくなり、ラクになる。アプリケーションバージョン毎に特殊化されたテストコードは少なければ少ないほうがよい。品質が保たれる限り、なくしていくべき。

anond:20201116044801

おっ、売られた喧嘩は買ってやる。だったら「返り値と引数チェックにしか型チェックを使ってないC言語問題は起きないはずたが現実はどうよ?」「RubyPython動的言語だけど、強力な型付けのされた言語とは言えないのか?」という疑問に答えられるはず。

2020-11-15

anond:20201115125745

こういうことを教条主義的に言う奴はみんな型をちゃんと使ってないし、t_wadaはRubyを手放さないでTDDをやれと言い続けるし、果てにはテストコードドキュメントだとか言い始める奴も出てくるから本当に厄介

システム保証出来ない事前条件事後条件を引数チェック、表明を使って行うことは正しいし、テストコードを書くことも正しいが、

システム保証できるもの引数チェック、表明、テストコード保証するのは、コンピュータに出来ることをプログラマがやっていることになり、これは害しかない。

また、コード品質に大きく関わるのは設計能力でありテストコードプロダクトコードとを書く順序ではないし(全く関わらないとは言わない)、

プログラマ意図テストコードとは独立自然言語ドキュメントに書かれているべきだ もちろん適切にコメントを使う必要もある

もうじき40代かばを迎えるプログラマー遺言(少し追記)(もうちょっと追記)(さらにもうちょっと追記)

世の中にはプログラマー35歳定年説というものがあった。昔からそんなのはないという人と、あるという人がいた。40代も半ばになったときに「あぁ、これが35再定年説の根拠か」というものがなんかちらほら見えるようになってきたので書いてみようと思った。

世の中にはものすごいプログラマーというのはやっぱりいる。なんなら死ぬまでプログラミング書いていられるという人たちもいる(ブラック的な意味ではなく)。そんな彼らからしたらプログラマー35再定年説とか意味がわからない都市伝説しか映らないだろう。

だが、普通に職業プログラマとして生きている俺のような人からすると、この35歳定年説はかなりの真実味を帯びている。

だが、そんな俺でも40代半ばまで延命できたのはやはり技術革新のおかげかもしれないが、結局平均寿命が伸びただけとも言えるだろう。

まず、技術に対する姿勢が変わる。正直言うとプログラミングとかもうしたくなくなる。というか、そもそも一生プログラミング仕事にしたいと思う最初の頃は好きだと思っていたが、仕事にしてしばらく経ったら大して好きでもなかったな、と思うようになる。

大して好きでもないことを仕事にし続ける体力はやはり年とともになくなり、体力がなくなった分「自分本質的にしたいと思うこと」が見えてくる。そしてそれはプログラミングではないため、ギャップがきつくなっていく。

おそらく、この辺が35歳くらいのあたりに来るのではないだろうか。35歳定年説と言ったら35歳ピッタリしか想像できないのが離散数学世界で生きているプログラマらしいといえばらしいが。

そんな感じでやってても、20年もやればそれなりにスキルも身につく。さすがにGoogleの一線で働くような大天才たちと渡り合うことはできないが、もしかしたらGoogleの片隅で働ける程度のスキルはあるかもしれないが、正直もういいっす、っていう気持ちのほうが大きくなる。

次に、自分がどうにか身につけてきた知見というものがなかなか広まらない。コンセンサスが取れない、という状況にも苦しくなってくる。

自分がやってきたプロジェクトでこういうことをやったらうまく働いた、というような知見は共有するが、なかなか価値観が共有できないことに気がつく。若いうちは「だったら俺が全部やりますわ」くらいの気合を見せられたものだが、年を取ってくると「あ、そうですか・・・」となってしまう。純粋に体力も気力もなくなっていく。

プログラミングをやっているだけありみんな論理的思考が大変上手だ。「皆さんホント論理的でいはりますなぁ」と言いたくなるわけだが、悲しいことに自分たちの振りかざす論理が、単なる正論、飛躍、極論、屁理屈、と言ったものであることに気づけない人も結構多い。こういうのを各個撃破するのも疲れる。

これからプログラミング仕事にする人たちに言っておきたいことがある。もしこの世界で長く働きたい、定年までコード書いていたい、と思うなら、常に勉強をしなくてはならない。もしあなたFラン出ているなら、他の人の倍努力しなくてはならない。できないならそこそこで転職したほうがいい。この世界にいるといか若いうちの勉強大事だったかを日々痛感する。

実務の上での俺の感じていることを書く。DDDだとかクリーンアーキテクチャだとかも大事だがもっとそれ以前に俺が根源的に重要だと考えているポイントだ。この辺をないがしろにしたらDDDクリーンアーキテクチャ絶対崩壊する。

コードを書くとき重要ポイント

まず、心得てほしいのはどんなにすごいプログラマでも意図の通じないコードは本当の意味で直せないということだ。

まず、引数チェック、状態チェックは必ずやれ。コードが語る、というようなことを言ってやらないやつが昔は多かったが、今もいるんだろうか。悲惨バグメンテナンス性の低下はそういった自分意図の表明を横着したコードから起こり始める。「俺はこれをやる、だからこの機能を呼び出すならこういう状態にした上でこういう情報を渡せ、じゃないならやらない」とはっきり言え。もしこの辺を冗長だと考える同僚がいるならもう辞めたほうがいい。

引数チェックや状態チェックのコードで画面の半分が埋まったならそのコード設計おかしい。一旦手を止めてよく考えろ。一つの機能を動かすのにそんなに引数がいるのか、そんなにチェックする状態が多いのか、そしてそれらは本当に必要検討しろ

テストコード絶対に書け。テストコードが書けない技術絶対に使うな。意味のあるテストが書けないならやめたほうがいいという輩もいるが、とにかく意味があろうとなかろうと書け。引数にこれを入れたらこうなる、こういう状態でこういう事したらこうなる、というお前の意図はとにかく示せるだけ示せ。

だいたいこの辺を横着したやつは翌年酷く後悔するか、そこのメンテ担当した同僚を攻撃している。

就職活動するとき重要ポイント

コードが書けなくても大丈夫、という会社は、コードが書けたほうが有利な会社ではなく、本当にコードを書かない会社だというこは肝に銘じておけ。身につくスキルEXCEL方眼紙を最低限の手数で作れるようになることか、本気でやればビジネス理解できるかもしれないが、お前の技術者としてのキャリアはそこで止まる。

仮に憧れのスーパーハッカーがいる会社を目指しているとして、彼らがそこでどう働いているか、なにが泥臭いのかを想像できない、聞くことができないならやめておけ。浮かれ過ぎだ。

仮にGithubURLを教えろという会社を目指しているとして、そこのリポジトリを飾り立てようと考えたならやめておけ、そういう会社Githubアウトプットすることを日常的な趣味として苦ではなくやり続けられる人を求めている。

年収をその会社選択基準にしているならそこはおまえには分不相応会社からやめておけ。仮に入れたとしても馴染めることはまず無い。これは年収が低くても同じだ。

人間関係重要ポイント

嫌いな人がいるならその会社はやめていい

少しだけ追記

コメントを観てこの「最小且つ単一論理でなにか否定できた気になる」という輩への対処が一番疲れる

もうちょっと追記

一晩立ってみたらこんなにブクマついててびっくりした。気になったブコメもあったのでちょっと追記しておく。

いきなり視点ミクロに、と言うやつなんだが、結局若いうちにこういうのできてないやつはあとで苦労するが、最初のうちは体力でカバーできている。体力でカバーできなくなったときに本当の意味でつけを払う羽目になるという意味で言ったり、あとオレみたいなおっさんが大変つらい思いをする、という意味でも言っている。

Fラン関係なくねっていうやつだが、昭和世代ステレオタイプかもしれない、ごめん。勉強する習慣もなければ大してやってきてもいないやつはこの業界だと倍苦労する羽目になるというふうに言いたかったと思う。どんな業界でもそうだとは思うが。

返す刀で結論づけしたがる人々がやっぱり現れるな、君たちはそう思わない人なんだろうし議論する気もないが何かしら言いたい人なんだろう。別にそれはそれでいいよ。お仕事頑張ってね。

「俺は大して辛くないけどなー」っていう人もやっぱり現れるな。辛くないんだったらいいことだと思う、お仕事頑張ってね。

4Kモニターものすごく細かい文字を読んでいる若者を見た、という人、俺も同意する。もう見ていられないんだよね。

関白宣言っぽいな、というのは俺も思った。

結局の所、プログラマ35歳定年説は俺も打ち破りたいと思っていた口なんだが、打ち破れる人とそうでない人がいる、ということで、俺は後者だった、ということだ。当然50過ぎてもプログラマやっている人は見かけるので、数学的な真理というわけではなく、統計的な傾向なんだろうと思っている。

若いうちから、いい環境で働かないと、気持ちのほうがどこかで先にギブアップする。いくら大好きで転職だと思う仕事だとしても、体力や若さで捻じ曲げていることはなかなか気づかない。色んな本を読んで客観的指標判断したほうがいい。

遺言とか言って書いておいて追記したら俺はソンビか亡霊なんだろうか?

さらにもうちょっと追記

びっくりした。こんなおっさん愚痴みたいなエントリーがこんなにブクマされるとは思ってなかった。いくつか気になったブコメがあったのでやはり書いてみたくなったので書く。

まず、この遺言最後にいなくなるのかという話だが、おそらくいなくなる。ゾンビで居続ける体力ももはやない。

次の準備はすでにしている。それは俺が本質的にやりたかたことに近いことだと思うのをピックアップしている。

本質的にやりたかたことって何かという話なんだが、まず俺が感じるプログラマーという仕事は「良き作り手であり続けること」が根本的なモラルだと思っている。若手で右も左もわからないような状態でも、それこそやっとフィズバズが理解できたような状況でも今持っているレベルで最大限にできうる一番いいもの模索し続ける仕事だと思っている。初心者にはチェックコード書け、意図はできるだけ込めろというのはそういう意味でもある。これを真正から受け止めてくれる職場を探したほうがいいというのは追加しておきたい。

プログラム論とかそういう話がしたいんじゃないということだけは言っておく。

俺も体力があるうちは良きつくり手を目指していたのだが、本質的にやりたいこと、もうちょっと言うなら、俺のモラルの軸は作ることにではなく使うことにあった。プログラミングというアクティティを挟んでこっちにつくり手がいてあっちに使い手がいる。仕組みを理解して作るのがプログラマーなら、作ったプログラム理解してよりよい日常模索するのが使い手、と言ってもいいかもしれない。いいフィードバックループのあっちとこっち、と言ってもいいかもしれない。俺は「良き作りてが使ったものを使う良き使い手でいたい」ということに気づいたので、遺言を書くことにした。少なくともこれに気づいた時点でプログラマーとしての俺は死んだ。

まだ直感的なものしか無いので、うまく言語化できていないのは申し訳ないんだが、今後10年位はそれを模索していくのではないだろうか。

anond:20201115004233

名前付き引数という仕組みはこの問題をかなり筋良く解決しているように思う。

例えばSwift

func set(hoge: Int)

を呼び出す時は

obj.set(hoge: 42)

と書く。

メソッドオーバーロード名前単位可能なので、func set(fuga: Int)も定義できる。

Swiftアクセサメソッドなんて書くことはないというのはともかく。(例なので)

名前付き引数があるとかなり関数命名が変わり、hogeFromFuga(int fuga)やfooWithBar(string bar)が単にhoge(piyo: Int)やfoo(bar: String)になる。

2020-11-06

コード共通化するな

プログラミングできる気になった自称中級者は、ソースコード共通パターンが現れると決まって、その処理を関数などに共通化したがる。

しかに、そうすることでソースコードは短くなるし、一見して保守性が上がったような気になるのだが、それは間違った作法から止めろ。

かいこと言っても伝わらない自称プログラマが読んでることを想定して、先に結論簡単に書いておく。

お前は絶対コード共通化するな。

共通化してはいけない理由

なぜコード共通化するのがいけないのか。理由簡単だ。要するに、コードが似ているのは単なる偶然であって、それらは別の処理だからだ。

別の処理だから共通化するのはおかしいし、もし共通化した処理の一方のみ仕様が変わった場合、その修正は他方にも影響してしまう。つまり保守性が下がっている。

たとえば、同じプロジェクトの中に、10%の消費税を加える処理と、10%の金利を加える処理があったとする。この2つの処理はともに元の金額を1.1倍する処理であり、全く同じ処理であるが、共通化してはいけない。

これらを共通化してしまうと、たとえば金利が8%に変更になったとき金利計算の処理だけではなく、消費税計算している箇所すべてを変更しなければならなくなる。

実際のアプリケーションでやりがちなのは複数の処理の「事前処理」「事後処理」などを1つの関数にして、呼び出し毎に細かい挙動引数制御するようなパターンだ。

これは結局、改修を重ねる度に「事前処理」「事後処理」の内容が使用箇所によって全く異なるものとなり、それに対応するために

といった悲惨設計に陥る。

他にも、GUIアプリユーザーの応答を待つDialogクラスなんてものを作って、使用箇所ごとにメッセージボタンに割り当てる処理などを切り替えることがある。

これも間違いなく、プログラムが成長するにつれて破綻する。たとえば、ある場所ダイアログは、表示するメッセージテキスト形式のみではなくなり、脇に画像を表示するかどうかのフラグコンストラクタに渡したり、Dialog継承させて表組みを表示するTableDialogサブクラスを作ったりすることになる。ボタンが「OK」と「キャンセル」の2種類の場合じゃなくなって、表示するボタンの数をコンストラクタに渡したり、ボタンに割り当てる処理をリスト形式で渡したりし出す。

こうして、最初は良い設計に見えたDialogクラスはどんどん複雑になる。こうなった原因は明らかで、本来は異なるもの共通化したからだ。おかしな色気を出さずに、素直に別々に実装しておけばよかったのである

処理に名前をつけろ

プログラミングをする上で「コード共通化する」なんてことは意識しなくていい。それよりもプログラマがすべきことは、処理に適切な名前をつけることだ。そのプログラムにおいて「単なる変数操作」を超えた意味のある処理には名前をつけろ。そして、同じ意味の処理なら同じ関数を使うし、違う処理なら違う関数を使う。それだけだ。コード共通化できるかどうかなんて全く関係ない。

変数関数クラス名前空間等が再利用のための機構だという先入観は一旦捨てろ。それらの真の意義は、「関心の分離」にある。つまり実装隠蔽し、その意図抽象するために存在する。たまに勘違いしてる奴がいるが、別に1回しか使われない関数とか、1行しかない関数はあってもいい。というか、この原則にしたがって設計すると、ほとんどの関数(or メソッド)は数行になる。

上の消費税の例で言えば、「消費税を加える」「金利を加える」処理は、明らかに単なる算術演算以上の意味のある操作から関数化する。そして、それぞれの実装は当初の仕様では奇しくも全く同じになる。消費税を加える箇所では前者の関数を呼ぶし、金利を加える箇所では後者関数を呼ぶ。

これはこう言い換えることもできる。消費税を加える関数を変更するのは、消費税計算処理が変わったときのみであり、金利を加える関数を変更するのは、金利計算処理が変わったときのみである。つまり、すべての関数は、それを変更する理由がただ1つになるように設計しろということだ。

こういうアプローチプログラムを書くと、ソースコードはあたかもそのアプリケーションドメイン特化言語で書かれたかのような見た目になる。

また、一つ一つの関数は小さく、理解やすく、テストデバッグも容易になる。そして、結果として再利用もしやすくなるし、プログラムの変更も容易になる。

2020-10-30

お願いだからセンスの無い人はプログラマにならないで下さい

プログラミングセンスです。センスの無い人がプログラマになると、他のすべての人に迷惑がかかります。だからセンスの無い人は絶対プログラマにならないで下さい。

プログラミングセンスが無い人や、プログラミングをやったことの無い人は、知識を得たり経験を積んだりすれば、誰でも「良いプログラマ」になれると思っているようですが、無理です。

というのも、センスの無いプログラマ問題は、知識経験の不足ではないからです。センスの無いプログラマの救いようの無い問題は「頭がおかしいこと」なのです。

題材は何でもいいのですが、具体的なコードを見た方がイメージがつきやすいと思いますので、とりあえず以下の問題を考えます

問題

住民リストが与えられるので、背の低い順に男女ペアにしたリストを作って下さい。ただし、男女の数は同数であるします。

コード

ふつうの人は、難しく考えずに以下のようなコードを書きます

const makePair = (persons) => {
  const males = persons.filter(person => person.sex === MALE)
  const females = persons.filter(person => person.sex === FEMALE)
  const compareHeight = (a, b) => a.height - b.height
  males.sort(compareHeight)
  females.sort(compareHeight)
  return males.map((male, idx) => [male, females[idx]]) // 男女の数は同数
}

この例はJavaScriptなので高階関数を使っていますが、仮にそういう機能が無かったとしても、

というコード構成は大きく変わらないでしょう。

一方、センスの無いゴミプログラマは、以下のような名状しがたきコードを書いてきます

function pair(psns) {
  var i = -1;
  var cnt = 0;
  var flg = psns[0] && psns[0].sex;
  var j = -1;
  var tmp = null;
  for(i = 0; i < psns.length; i++) {
    //console.log('■■■■■■■■■■■■■■■■■■■■ BEGIN ■■■■■■■■■■■■■■■■■■■■')
    //console.log(psns, 'i=' + i, 'cnt=' + cnt, 'flg=' + flg);
    if(psns[i].sex == flg) {
      //console.log('cnt: ' + cnt + '->' + (cnt+1));
      cnt++;
    } else {
      j = i - cnt + 1;
      //console.log('swap ' + i + '<-->' + j);
      tmp = psns[j];
      psns[j] = psns[i];
      psns[i] = tmp;
      i = j - 1; // <- 理由は分からないが、i = jだと上手くいかない(by XXXX)。
      cnt = 0;
      flg = flg == MALE ? FEMALE : MALE;
      while(j > 1) {
        if(psns[j].height < psns[j-2].height) {
          //console.log('swap ' + j + '<-->' + (j-2));
          tmp = psns[j-2];
          psns[j-2] = psns[j];
          psns[j] = tmp;
        }
        j -= 2;
      }
    }
    //console.log(psns, 'i=' + i, 'cnt=' + cnt, 'flg=' + flg);
    //console.log('■■■■■■■■■■■■■■■■■■■■ END ■■■■■■■■■■■■■■■■■■■■')
    //console.log('')
  }
  for(i = 0; i < psns.length; i++) {
    //console.log('■■■■■■■■■■■■■■■■■■■■ BEGIN ■■■■■■■■■■■■■■■■■■■■')
    j = Math.floor(i / 2);
    //console.log(psns, 'i=' + i, 'j=' + j);
    tmp = psns[i];
    if(!(i % 2)) {
      psns[j] = [null, null];
    }
    if(tmp.sex == MALE) {
      psns[j][0] = tmp;
      psns[j][1] = psns[i+1];
    } else {
      psns[j][0] = psns[i+1];
      psns[j][1] = tmp;
    }
    i++;
    //console.log(psns, 'i=' + i, 'j=' + j);
    //console.log('■■■■■■■■■■■■■■■■■■■■ END ■■■■■■■■■■■■■■■■■■■■')
  }
  psns.splice(psns.length / 2, psns.length);
}

こんなコードメンテナンスは御免被りたいです。一見して配列の要素を入れ替えていることが分かるだけで、実装を全て読まなければ(いや読んでも)処理の意図が全く分かりません。また、たとえば「i = j - 1」が間違って「i = j」などと書かれていてバグを起こしたとしても、原因を突き止めるのは困難を極めます

さて、このコードは具体的に何がいけないのでしょうか。長すぎることがいけないのしょうか。変数名が分かりにくいのがいけないのでしょうか。引数破壊的に変更しているのがいけないのでしょうか。不要コメントが残っているのがいけないのでしょうか。よく見ると、ソート処理で車輪の再発明をしていたり、「j」や「tmp」などが場所によって意味が違うカメレオン変数になっていたりしますが、それがいけないのでしょうか。どれも正しいですが、それらを逐一直したところで、本質的解決にはならないでしょう。

後者コードはもはや「ここを直したら良くなる」とかいレベルを超えています。たしかに、問題を具体的に挙げることはできます。このコードの致命的な問題が、凝集度の低さと、単一責任原則(SRP)違反にあるのは間違いありません。しかし、後者コードを書いてくる人に、

住民リストを男女に分ける処理や、リストソートをする処理、2つのリストをまとめる処理は、この問題とは独立して意味のある操作から、別の関数として抽出しましょう。その方がコードの見通しがよくなるし、一部の処理を修正したときの影響も小さくなるし、単体テストも書きやすくなります

なんて言ったって聞く耳を持たないでしょう。

そもそも、こういうコードを書く人は、この処理自体を「pair」なんて関数抽出すらしません。まだこの問題では入出力のフォーマットが明確に定義されているので、他人が1から書き直せますが、実際のプロダクトでは、無数の副作用を起こす数千行のコード迷路を彼の脳内フォーマットデータが通るわけです。もちろん、テストコードなんてありません。

まり、指摘をしても絶対に直らないのです。いくら言語の優れた機能ベストプラクティスを紹介しても、馬の耳に念仏。それらの利点を理解できるだけの脳みそが足りていないのです。

どうして、同じ処理を実装するのに、ここまでの違いが生じるのでしょうか。

これは、プログラミング技術問題ではありません。既に述べた通り、ふつうの人なら、特定機能の有無とか知識の程度にかかわらず、ふつうコードを書くのです。なぜなら、ふつうの人にはそちらの方が楽だからです。つまり、前者のコード別に何か卓越した技術を身につけた結果書けるようになるものではなく、まともな感覚さえ持っていれば、プログラミング初心者にとっても前者のコードの方が書きやすいのです。

まり後者のようなコードを書いてくる奴というのは、現実世界の捉え方が常人とは著しくずれているのです。要するに、「頭がおかしい」のです。この病気はもう直りません。だからセンスの無い人は絶対プログラマにはならないで下さい。

2020-10-22

anond:20201022081332

リスコフの置換原則は、もとのクラス継承したクラスとで、引数レシーバーの型が T だとすると、継承したクラスはもとのクラスと同じ型を返さないといけないという話だよね?違ったらおしえて。

2020-10-04

anond:20201004132406

AIという売り文句で小部屋に詰めたホームレスオッサン10名に引数投げて返させるようなのを思いついた。

世界一うまい酒をおしえろ」→大関や みたいな

2020-08-25

FuelPHPのForm::selectvalueが0なoptionをselectedにしたい時

Form::select("field",$value,$options);でselectedされないからうんち

Form::select("field",array($value),$options);で第二引数配列にしないと駄目だからうんち

実質うんち漏らしなの増田に書きます

2020-07-21

anond:20200721213552

静的型の言語IDE使ってると、入力してる最中リアルタイムで指摘してくれるね。

昔、静的vs動的の論争で、動的型派はテストコード書いてるからかるとか、スペルミスするのはアホだとか、引数の型やら順番やら覚えていて間違えたことないとか、言ってたけど。

2020-07-20

MQL5のテクニカル指標ハンドルバッファーの扱い(MQL5勉強中おぼえ

まずMQL4とMQL5ではiMA等のテクニカル指標関係関数の使い勝手が大幅に変わってる。

MQL5で必要なのは以下のとおり

ハンドル(int型)

ひとつ指標に対してひとつハンドル必要

例えば期間75のEMAと期間200のEMAの2つのiMAを使うなら、MA075handleとMA200handleみたいにint型変数を用意しなきゃいけないらしい。

EAしろカスタムインジケーターしろひとつハンドルを作ったら同プログラム内で使い回すことになるだろうからグローバル宣言するのがよろしいっぽいな

バッファ

MQL4では関数を呼び出したらその都度計算してる訳で、過去の足の値を参照するにも毎度計算してるから重いっつーことで、一度計算した値はバッファ配列に放り込めば過去の値は読み出すだけで済むようになったらしい。

動的配列(すなわち最初インデックスを数値なしでの宣言、具体例は double MA075buffer[]; という形での宣言)でないとだめで、ArraySetAsSeries関数時系列並び(具体例は ArraySetAsSeries(MA075buffer,true); )にするべきだろう。

EAでの実践

では、移動平均では指標ひとつしかなくて参考になりづらいので、MACD(メイン線とシグナル線)でやってみよう。

ハンドルバッファグローバル変数宣言

int MacdHandle; //MACD関数ハンドル

double MacdMainBuffer[]; //MACDのメイン線バッファ

double MacdSignalBuffer[]; //MACDシグナル線バッファ

OnInit()関数ハンドルを取得する

int OnInit()

{

MacdHandle = iMACD(NULL,0,12,26,9,PRICE_CLOSE); // MacdHandleにiMACDハンドルが代入される。この時点ではメイン線・シグナル線の区別をつけないことに注目

return(0);

}

OnTick()関数内での使い方

void OnTick()

{

CopyBuffer(MacdHandle,MAIN_LINE,0,10,MacdMainBuffer); // 2個目の引数でメイン線・シグナル線を切り替える。MQL4ではMODE_MAINとMODE_SIGNALだったがMQL5では表記が変わった模様

CopyBuffer(MacdHandle,SIGNAL_LINE,0,10,MacdSignalBuffer); //勿論メイン線なら0、シグナル線なら1と入力しても差し支えはないが、僕の場合可読性重視の為に可能な限り定数型で書く

//過去10本の足だけバッファコピーするようにした。EAならそんなに過去を参照することもないだろうし、ぶっちゃけ10もいらない気もする

ArraySetAsSeries(MacdMainBuffer,true); //時系列並びにするとインデックス番号0が現在の最新足の値になる

ArraySetAsSeries(MacdSignalBuffer,true);

OnDeinit()関数にてメモリ上のキャッシュを開放

void OnDeinit()

{

IndicatorRelease(MacdHandle);

}

ってやらないといつまでもメモリを確保したまんまになっちゃうらしい。

MQL4と違って扱いはなにかと面倒くさくはなってるなーという印象

2020-06-12

anond:20200612130422

引数データ量の分スタック領域消費するじゃん

GC勝手に回収する動的領域よりよっぽどオーバーフローやすいじゃん

って思ってたけど自信無くなってきた

教えてくれ

2020-05-23

anond:20200523204505

やはり第三引数にはtrue指定して、onreadystatechangeイベント処理でreadystate毎に分岐した処理から結果を受け取る、というあちこちで紹介されている方法でやってみようと思います

ありがとうございました。

anond:20200523200759

元増田ですが、第三引数falseってそんなにダメですか?

かに、MDNwebdocs見ても、やめといた方がいいって書いてあるけど

結果帰ってくるまで待たないとその後の処理が成り立たないんですよねー

2020-05-22

プログラミングスクールに通ったゴミの末路

https://note.com/mksaryo/n/n69472228f68a

この、「プログラミングスクール卒業したゴミ面接した結果」という記事はてブ話題となった。

ブコメでは「ゴミは言い過ぎだ」「筆者の人間性を疑う」のような批判的なものが多かったが、雇う側の立場としては至極まっとうな意見でもあったとも思うよ。

実際にプログラミングスクール卒業した2008年製のゴミの末路を見て、プログラマ目指すのに、スクールに通うか通わないかの参考にしてみてほしい。

2007年に、初級シスアドとれたのでプログラマなれるんじゃねと勘違い

当時26歳だった私は、上京し某プログラミングスクールに通い始めた。40万支払ってジャバの動画を見る日々。講師はいたがジャバ知らないので質問もしなかった。

ジャバの動画を見終わって、はれて卒業した私は、エスアイアーやソフトハウス面接を受けまくった。

しかし、ポートフォリオ自身プログラミングスキル証明できる成果物)など全く作っておらず、実技試験ではフィズバズテストもできない有様。あんなにジャバ動画見てたのにね。もちろん変数引数の違いも分かってない。誰か雇うかと。

そんな就職活動半年ほど続け、ようやく正社員採用してもらえた。

だがそこで待っていたのは、C++既存コードメンテ作業だった。この頃にはジャバとかどうでもよくなり、ただプログラマとして潜り込めば良しとした。

ただ案の定何もできず、一日中ググって終わりという日々が続いた。そして一ヶ月半で解雇

27歳。プログラマになるの夢はすっかり消え去り、ただ東京で食いつなぐだけの生活が始まった。

失業手当が尽きた頃、派遣会社登録。督促コールセンターにぶちこまれ、3ヶ月で逃げ出した私には、日雇い派遣がちょうど良かった。漬物工場和菓子工場物流倉庫で黙々と働くほうが性に合ってたようだ。

そんな生活が続くわけもなく、結局上京してからたった1年半で地元に逃げ帰ることになりました。

今は地元運用保守SEとなり、ほとんどコードを書かなくて済んでます

2020-04-09

ねぇXちゃんさぁ。なんでこんな動的なオブジェクトをstaticにしてんの?

これさぁ、そこそこ重いけどさ、セッションごとに生成される一時的インスタンスで持ってるだけでも十分パフォーマンス的に問題ないよね?

なんでプロセス間でわざわざ共有してんの?

これってネットワーク接続管理してるオブジェクトだよね?

ネットワークリソースつったって利用者たかだか数百人でしょ?

その中でリソースを同時利用するってゆってもたかだか十数人でしょ?

プロセス内でこのオブジェクトを全共有することでリソースの削減なんてたかが知れてるよね?

それをわざわざプロセス内でこのオブジェクトを全共有ってマジ管理できるの?シンクロナイズドとか書いてっけどさぁ?削減できるリソースの量に比べて超危険すぎねぇ?

コミットログ見たけど、ぜんぜん性能問題とかと関係のない問題修正だったみたいだけど、なんでこんな危険コードになったわけ?

Xちゃんさ、そもそもコードが品雑なんだけど、これエンプラJava案件なのよ

なんでCの組み込みコードみたいにif文の鬼ネストとか、引数に空のList渡して破壊的に値を設定するような、読みづらいコード書いてるわけ?

Listくらい普通に返り値で返しなさいよ…

状態管理もif文の鬼ネストやめて専用クラスとかEnum使ってコマンドパターン対処しなさいよ

もしかして、Xちゃんオブジェクト指向にピンときていないのかな?

ちゃんはどっちかってーっとPHPパーなので、ゴリゴリオブジェクト指向はそりゃ専門じゃないよ

それでもさ、interfaceとか使って、各処理の実装を切り分けるとか、やりようはいくらでもあるじゃん

あと不要なnullチェックも多すぎです。コンストラクタ初期化保証されているfinalフィールド値がnullかどうかなんて確認しないでください

ユーザー入力DB入力環境リソースとか、外部の情報起源じゃない変数がnullとか、明らかなバグなんだから暗黙的なぬるぽクラッシュさせましょう

こんなバグが出荷に乗ることなんてありえません。わざわざ専用のエラー処理で専用の例外飛ばすとか無意味です。

いちいちなんか冗長で複雑なんですよねぇ。

ちゃんみたいな若造が、ベテランのXちゃんにこんなこといいたくないけどさ、

Xちゃんコード。どこか昭和匂いがするんだよねぇ。悪い意味で。

Xちゃん名誉のために言っておくと多分Cプログラミングうまいんじゃないかな?

そんなソース読んだこと無いから知らんけど

2020-03-29

[]演算子はだいたい関数

引数を取り結果を返すという意味演算子はだいたい関数と同じものである

演算子オペレータ)は被演算子オペランド)をとって式を構成する。

「1 + 1」「5 - 3」「 1 == 3」等の式はplus(1,1) minus(5,3) equals(1,3)といった関数の言い換えである理解できる。

値を返すものが式である

引数をとり値を返すもの関数である

式の中の特別もの関数だと言える。

Wikipediaによると、関数写像であるという。

写像英訳mapという。

プログラミングにおいてマップマッピングとは

まあだいたい「〇〇は□□と対応してる」という関係を指す。

連想配列とか。

まり関数マップであり、

連想配列マップであり、

まり連想配列関数である。だいたいのところ。

2020-03-10

anond:20200310164138

やりたいのは

whereIn

whereBetween

だと思うが

whereに想定外引数を渡したとき動作おかしいのは、初心者にも優しいはずのPHPフレームワークでは問題かもしれない

2020-03-06

anond:20200306104308

ローカル変数なんだか引数なしメソッド呼び出しなんだかすぐにはわからないRubyが最高ってことですね

ログイン ユーザー登録
ようこそ ゲスト さん