タグ

プログラミングに関するrryuのブックマーク (539)

  • マトリョーシカ人形のようなメソッド設計を避ける - give IT a try

    フィヨルドブートキャンプのコードレビューでよく指摘してるシリーズです。 次のようなパンを焼くRubyプログラムがあります。 このプログラムはどういう工程を経てパンが焼かれるのか、ぱっと把握できますか? def main パンを焼く(粉, 水) end def パンを焼く(粉, 水) 焼く(パンを発酵させる(粉, 水)) end def パンを発酵させる(粉, 水) 発酵させる(パンを整形する(粉, 水)) end def パンを整形する(粉, 水) 整形する(パンをこねる(粉, 水)) end def パンをこねる(粉, 水) こねる(粉, 水) end main 上のプログラムは次のように書いても同じように処理されますが、工程の全体像がつかみやすいのはどちらでしょうか? def main 生地 = パンをこねる(粉, 水) 整形された生地 = パンを整形する(生地) 発酵した生地 = パ

    マトリョーシカ人形のようなメソッド設計を避ける - give IT a try
    rryu
    rryu 2022/11/28
    「焼く(発酵させる(成形する(こねる(粉,水)))」ならまだましなので、2工程ずつの謎の分割が悪さの元だと思う。
  • コードは2回書きたい - Mitsuyuki.Shiiba

    TDD についておさらいしておきたいなと思ったので読んだ t-wada.hatenablog.jp とても良かった。自動テスト、テストファースト、テスト駆動開発のそれぞれについて、どういうものなのか・効果・注意点が分かりやすく説明されている。たしかに、自動テストは必ず使うけど、テストファーストやテスト駆動開発は状況に合わせてやったりやらなかったりする 書籍「テスト駆動開発」の付録Cと対になっているということなので、付録Cも読みたくなって読み直しておいた。そちらにはテスト駆動開発のこれまでとこれからについて書いてあるので、頭の整理ができてとてもよかった Checking Driven Development 付録Cでは、開発者自身が書く自動テストはテストではなくてチェック、ということについて触れられている。そうだなぁって思う。自動テストでは、自分が考えたとおりに動くかどうかをチェックしている

    コードは2回書きたい - Mitsuyuki.Shiiba
    rryu
    rryu 2022/11/12
    最終的な形が見えてない場合は大きな構造の変更が必要になる時が多いが、そういう時にテストも全部書き直しになると気力が尽きてやめたくなるという…
  • 先輩エンジニアから「メモリを意識してプログラムを書かないやつは三流だ」と言われたのですが、今は令和ですよと言いたかったです。メモリを意識してプログラムを書く必要性を分かりやすく教えて頂けませんか?

    回答 (25件中の1件目) 令和だろうがなんだろうが意識はしてないとダメだと思いますよ。 ハードウェア資源の限られた組み込み系やゲーム系は別として、業務系でもWeb 系でも 1バイトでも少なくなるように無駄を削るみたいなことはしなくてもいいでしょうし、たいていは解放漏れも意識しなくて良くなってます。 昭和〜平成初期のハードウェア/ ソフトウェア事情から考えれば、およそ足りなくなることが考えられないような大量のメモリーを使えはしますが、無限ではありません。 メモリー搭載量は予算次第で増減しますしね。 そして使えるメモリーの量よりも知識や想像力の欠如、考えなしのプログラミングからくる...

    先輩エンジニアから「メモリを意識してプログラムを書かないやつは三流だ」と言われたのですが、今は令和ですよと言いたかったです。メモリを意識してプログラムを書く必要性を分かりやすく教えて頂けませんか?
    rryu
    rryu 2022/10/10
    令和であっても瞬間的にどれくらいメモリを使ってその内どれ位かが居座り続けるのかくらいは意識しないとダメだと思う。
  • 独学でも教えてもらってもダメ、プログラミングができない本当の理由

    今はプログラミングができないけれども、ゆくゆくはできるようになりたい。そう思っている人は多いだろう。そうした人が知りたいのは「独学でプログラミングができるようになるのか」ということではないだろうか。 こうしたことを考えているのは、「独学コンピューターサイエンティスト Pythonで学ぶアルゴリズムとデータ構造」(日経BP発行)という書籍を読み始めたからだ。著者のコーリー・アルソフ氏は、大学の政治学科を卒業し、独学でプログラミングを学んで職業プログラマーになったという。前著の「独学プログラマー Python言語の基から仕事のやり方まで」(日経BP発行)は、そうした経験を通して同氏が得たプログラミングの知識をまとめたもの。そうした知識の中から、特にアルゴリズムやデータ構造といったコンピューターサイエンスに焦点を当てて解説したのが書だ。 もっとも同氏がいう「独学」は、大学でコンピューターサイ

    独学でも教えてもらってもダメ、プログラミングができない本当の理由
    rryu
    rryu 2022/10/10
    文字を書くのが精一杯な人が小説を書けるはずもなく、そういう基礎的な技術は反復練習で身につけるしかないというのはある。まあ、好きでもなく目標もない場合は単なる苦行だが…
  • Deno のめっちゃ難しいバグを修正した - Qiita

    2022年4月、Deno に以下のバグが報告されました。 fetch API を使って 300KB ぐらいあるファイルをアップロードすると、一定確率でアップロードされたファイルが壊れるというバグの報告です。 報告者によれば、1.20.6 まではバグは発生しておらず、1.21.0 から発生するようになったという事です。1.20.6 の次のリリースが 1.21.0 なので、パッチバージョン1個分まで、バグの発生時期が特定されている状態です。 fetch 周りは自分はほぼ実装していないので「担当範囲ではない」感覚だったので、普通にスルーしていました。 自分に限らず、Deno Land コアチームの誰もこの issue にピンと来る人が居なかったようで、stale ボット (数ヶ月進捗の無い issue を自動的にクローズしようとするボット) に2回もクローズされかけていました。Deno の st

    Deno のめっちゃ難しいバグを修正した - Qiita
    rryu
    rryu 2022/10/05
    要は共有バッファを返すタイプのスレッドアンセーフなのだが、yieldだと同期的に使ってくれそうというイメージがあるからなのかメソッドを見ただけではなかなか理解できない。
  • 【計算結果が正しくない!?】案外知らない、計算誤差の話 - Qiita

    ■なぜ、正しく計算できないのでしょう? まず、最初の $333.75b^{6}$ を手計算してみましょう。 $b^{6}$ は、$1,314,174,534,371,215,466,459,037,696$ なので、$438,605,750,846,393,161,930,703,831,040$ です。 次の項のカッコの中を計算していきます。 $11a^{2}b^{2}$ は、$72,586,759,116,001,040,064$、 $b^{6}$ は、$1,314,174,534,371,215,466,459,037,696$、 $121b^{4}$ は、$145,173,518,207,904,485,376$ なので、 カッコの中は $-1,314,174,606,957,974,558,362,483,010$。 それに$a^{2}$ を掛けて $-7,917,111,779

    【計算結果が正しくない!?】案外知らない、計算誤差の話 - Qiita
    rryu
    rryu 2022/09/23
    最終的に2だけ差がある36桁の整数の減算になるはずが浮動小数点数の丸め誤差が蓄積して大きな差になってしまうということらしい。仮数の桁数が多いほど差が小さくなるので80bitのCは他と比べて小さい。
  • https://twitter.com/fukku7010gmail1/status/1570160314402107392

    https://twitter.com/fukku7010gmail1/status/1570160314402107392
    rryu
    rryu 2022/09/19
    このプログラムを実行にするはインタプリタが必要で、そのインタプリタは別のコンパイラで生成されていて、そのコンパイラはさらに別のコンパイラで…みたいな感じ。
  • 期間の扱い方とその名前 - いけだや技術ノート

    とあるAPIのスキーマの叩き台をクライアントサイドとして検討している際に、コンテンツの公開期間やイベントの開催期間のような期間について議論が少し盛り上がった。 要件としては、期間の開始と終了の日時をそれぞれ取得できたい。 期間を考える時、開始と終了がそれぞれinclusiveなのかexclusiveなのかをまず考慮すべきであるが、開始日時の重複や終了日時に隙間を発生させないためには、開始はinclusive、終了はexclusive、つまり半開区間(左閉右開)にするのが望ましいだろう。 終了をexclusiveにすると、例えば8月の1ヶ月間、つまり8月1日0時0分〜9月1日0時0分という期間の場合、ユーザー向けの表示としては終了日時は「8月31日23時59分まで」と表示したくはなるが、これはプレゼンテーションロジックとしてクライアントサイドの責務としてやる。基的には-1秒してからフォーマ

    期間の扱い方とその名前 - いけだや技術ノート
    rryu
    rryu 2022/09/09
    期間に含まれる終了時刻と含まれない終了時刻が混ざる場合にどういう名前にすれば良いのか悩む訳だが、この記事の結論としては良さげなものはないということらしい。
  • オブジェクト指向は継承で多態するプログラミング - きしだのHatena

    オブジェクト指向って継承による多態があるからこそなんだけど、継承が非推奨になって以降に雰囲気でオブジェクト指向を知った人には、継承はオプションでカプセル化だけでオブジェクト指向って言ってしまいがちに思います。 実際はカプセル化はオブジェクト指向固有じゃなくて、クラスでカプセル化を実現してるだけです。 さまざまな人のオブジェクト指向の定義 来ならどのように継承こそがオブジェクト指向なのかという説明をするんですが、かなり長くなりそうなので、とりあえずはいろいろな人たちのオブジェクト指向の定義を抜き出してみます。 「ここに挙がってるのはオブジェクト指向の一派にすぎない」というような意見もありますが他の派閥についてまとまって定義され共通認識になっているようなものは見当たらないので、プログラミングの指針には なりづらいと思います。 ストラウストラップ C++を産んだストラウストラップは「C++の設

    オブジェクト指向は継承で多態するプログラミング - きしだのHatena
    rryu
    rryu 2022/08/27
    まあユーザー定義型のある言語との差は継承と多態になると思うが、抽象データ型がやりやすいのは確かなので特徴にしてもいいと思う。
  • 関数の再帰的な定義に名前付けは必要か - 貳佰伍拾陸夜日記

    結論から言うと, 名前を付けることなく再帰的な関数を定義することは可能. 特定のプログラミング言語でどうかというよりは抽象概念としての関数の再帰を名前なしに実現可能かどうかという話(名前なしに実現できるプログラミング言語は存在するかという話). 発端 id:naoyaさんがこういうツイートをしていた. 再帰を書くときに何気なく関数に名前つけたり let で束縛したりしてたけど「再帰には三項関係が必要でありその実現には記号が質的に関わる」とあり、名前づけの行為が必然だったことが分かった。プログラミングするときの視点が変わるな— naoya (@naoya_ito) 2022年8月12日 たとえば以下のように書いたときのlet fact =みたいな話. let fact = n => n <= 1 ? 1 : n * fact(n-1) ちなみに, 話は一見逸れるけど, こう書けると必然的に

    関数の再帰的な定義に名前付けは必要か - 貳佰伍拾陸夜日記
    rryu
    rryu 2022/08/19
    全くよく分からないが、記号論的には名前をつけるという行為は不動点関数であるということなのだろうか。
  • 【悲報】ワイPythonプログラマー、Go言語が難しいすぎて咽び泣く : IT速報

    Go言語ってまじでゴミだよな 少しなにかしようとすると、馬鹿みたいに長ったらしいスペルで ライブラリインポート強要されるし

    【悲報】ワイPythonプログラマー、Go言語が難しいすぎて咽び泣く : IT速報
    rryu
    rryu 2022/08/15
    デコレーターパターンのIOライブラリはコンソールだけを考えるとめんどくさいだけだが、ファイルもネットワークも同じ仕組みが使えるのが強い。
  • オブジェクト崇拝は罪! 古ヘブライ文字で記述する創世的プログラミング言語が降臨/そこはかとなく神聖な感じのするソースコードがやんごとない【やじうまの杜】

    オブジェクト崇拝は罪! 古ヘブライ文字で記述する創世的プログラミング言語が降臨/そこはかとなく神聖な感じのするソースコードがやんごとない【やじうまの杜】
    rryu
    rryu 2022/08/10
    THE HOLY LICENSEの日付が「11 Av 5782」でユダヤ暦になってるぽくて細かい。
  • なぜオブジェクト指向方法論に代わる方法論が出ないのか - きしだのHatena

    1990年代にオブジェクト指向分析・設計の方法論がめちゃ流行ったことがあります。 ただ、そのブームが終わって、後続となるような方法論が流行ることはありませんでした。 で、なぜなのか考えていたのですけど、オブジェクト指向方法論のウリは分析段階で出てきたオブジェクト(といいつつクラス)がコードにそのまま引き継がれるというものでした。ようするにオブジェクト指向方法論というのはコードのスケッチを書いて詳細化していくというものだったのです。 しかしながらこれは、スケッチとして書いた分析・設計が間違っていればコードも間違うわけで、強くウォーターフォールの性質をもつものでした。 結局のところスケッチの妥当性というのはコードを書かないと検証ができません。分析・設計段階で見出されたクラスが妥当かというのは、コード書かなければわからなかったのです。逆に、コードを書けば妥当かどうかわかります。であれば、最初から

    なぜオブジェクト指向方法論に代わる方法論が出ないのか - きしだのHatena
    rryu
    rryu 2022/08/05
    構成要素が手続とデータしかないからそんなにバリエーションが作れないと思う。オブジェクト指向以降に出てきたものとしてはアスペクト指向があり、仕組みとしては使われているが誰も名前を言わなくなってしまった。
  • オブジェクト指向プログラミングは終わった - Qiita

    追記: 振り返りを書いてみました~ -- ここから元記事 別題: 抽象化って言葉もう。。 社内の記事にて、オブジェクト指向のこころ (SOFTWARE PATTERNS SERIES) | アラン・シャロウェイ, ジェームズ・R・トロット, 村上 雅章 | | 通販 | Amazonを紹介してもらいました。 取り上げられた、共通性/可変性分析の解説を見て、はっと思うことがありポエムを仕立てました。 共通性/可変性分析 共通性/可変性分析については、書籍を読むかググって頂けると良いですが、社内記事が良かったので引用させて頂きます。 問題領域にある概念を見つける(共通性の分析) その流動的要素を洗い出す(可変性の分析) 流動的要素を見ながら、その概念が持つ責務を果たすための抽象的側面(≒インタフェース)を導く 各流動的要素の実装上の観点から、インタフェースが適切かどうかを見極め、補正する オ

    オブジェクト指向プログラミングは終わった - Qiita
    rryu
    rryu 2022/08/05
    Javaでよくある必ずインターフェースと具象クラスに分けるという考えはアレというのは分かるが、そうはしないというのは普通のことなのだから終わるような話ではない気がする。
  • ファイル書き込みをするプログラムで気をつけた方がよいこと | IIJ Engineers Blog

    この記事について この記事では、ファイルに書き込みを行うプログラムを実装する時の注意点について説明します。 ファイル書き込みは、プログラミングにおいて比較的よく利用される機能でありながら、実装時に注意していないと、システムクラッシュ(意図しない電源の喪失や OS のクラッシュ等)後にファイル上のデータが整合性を失う可能性、平たく言えば、データが破損する場合があります。 今回の主な内容はトランザクションに関連する事柄で、ご存知の方からすると当たり前と思われることだと思われますが、執筆者がプログラミングの勉強を始めて以降知らない期間が長かったことと、他にもご存知ない方がある程度いらっしゃるのではないかと思ったため、このように記事にさせていただきました。 また、ここで説明する注意点は、クラッシュ後にデータの整合性が重要でない場合は、気を付ける必要がないものであることを先に書いておきます。 先にこ

    ファイル書き込みをするプログラムで気をつけた方がよいこと | IIJ Engineers Blog
    rryu
    rryu 2022/07/07
    rename()も途中でクラッシュしたら壊れるような気がするが、もはや全てジャーナルファイルシステムで要は方法2でクラッシュからガードしているから大丈夫なのか。
  • データ取得で try...catch しない理由

    try { const data = await fetchSomething(); // 正常系レスポンスの処理 } catch (err) { if (isAxiosError(err)) { // 異常系レスポンスの処理 } } 動機はつぎの 3 つです。 データ取得も宣言的に書きたいから データ取得に関係ない例外も catch してしまうから HttpError の集計に不便だから データ取得も宣言的に書きたいから 要約すると、データ取得時は常にこのように書きたい、という話です。useSWR・useQuery や apollo/client でお馴染みのインターフェイスです。 const { data, err, status } = await fetchSomething(); if (data) // 正常系レスポンスの処理 if (err) // 異常系レスポンスの処理

    データ取得で try...catch しない理由
    rryu
    rryu 2022/04/28
    データ取得というかHTTPの200以外のレスポンスを例外で返さないという話。この手のライブラリをHTTPのステータスコードも使うREST APIで使うと地獄みが生じる。
  • 見通しの悪いコードができあがってしまう、その理由 - Magnolia Tech

    クソコードができあがるのは「影響の及ぼすコンポーネント量を最小にする」という個別最適の価値観が支配的になった時、です 影響の及ぶ範囲を小さくするために、巨大で複雑なコードの塊を一箇所に追加し始めたりするのです そうした方が関心の範囲が限定できるから...だけど、全体最適ではない— magnoliak🍧 (@magnolia_k_) 2022年3月12日 でも悪気はないんです 真面目に巨大で見通しの悪いコードを作り上げていくけど、影響範囲が最小になる方が常に正しい、という価値観は「わかりやすい」んですよ— magnoliak🍧 (@magnolia_k_) 2022年3月12日 「変更量が最小になる」「影響が最小になる」...目の前のタスクをこなすためには、それが一番良いことに見えるんですよね でも、「継続的に同じペースが保てるか?」「スケールするか?」というと、そんなことは無いけど、そ

    見通しの悪いコードができあがってしまう、その理由 - Magnolia Tech
    rryu
    rryu 2022/03/18
    コードの修正範囲と影響範囲の大きさは比例しないというのが原因だと思う。ちょっと分岐を入れて一つのルーチンに複数の処理を重ね合わせていくと、やがて影響範囲が読めない化け物ができあがる。
  • spliceを使って高速・省メモリでGzipからZIPを作る - knqyf263's blog

    良い話を含むので概要の最初だけでも読んでもらえると幸いです。この話が実用的かと言うと多分全然実用的ではないので理解しても仕方ないかなと言う気がします。 概要 ファイルフォーマット gzip 10-byteのヘッダ 拡張ヘッダ ファイル体 フッタ(trailer) zip ローカルファイルヘッダ Data descriptor セントラルディレクトリエントリ セントラルディレクトリの終端レコード gzipからzipへの変換 gzipヘッダの処理 gzipファイル体の処理 gzip trailerの処理 複数gzipファイルの連結 PoC まとめ 概要 先日Dirty PipeというLinuxカーネルの脆弱性が公表されました。 dirtypipe.cm4all.com この脆弱性の原理自体も面白いのですが、その前に報告者の組織で行っているGzipZIPの処理で引っかかったのでまず先にそち

    spliceを使って高速・省メモリでGzipからZIPを作る - knqyf263's blog
    rryu
    rryu 2022/03/12
    RCSとCVSみたいにgzipの上にアーカイバを乗せてZIPを作ったみたいな感じだったのだろうか。
  • クソコードの思い出 in 2021

    最近、クソコード話が少ない気がするので、直近のクソコード情報を提供する。 出会い昨年夏、新卒二年目にして初めてクソコードに出会った。 あれは、新しいチームに移動した初日のことだった。 ファイルを開いた瞬間、大量のDimと、画面から見切れている、自動生成みたいな長さの変数宣言の行が目に飛び込んできた。 初めて見たクソコードのあまりの衝撃に、私は言葉を失った。ありえない。しかし、同時に興奮していた。これが俗にいうクソコードか...当に存在していたんだ...と。 気を取り直して変数宣言のすぐ下にある関数の中身を確認する。MainProcess()と名付けられた15,000行の関数は、GUIの制御と入力値のバリデーションと業務ロジックの制御と処理結果の出力を司っていた。共通化できそうな処理は当然のようにコピペで済まされていた。 コピペの山を越えると、今度は、50~100行程度の関数たちが現れ始め

    クソコードの思い出 in 2021
    rryu
    rryu 2022/03/10
    これはおそらくGOSUBとRETURNしかないBASICのノリで書かれたVBSで、かなりの年代ものな気がする。
  • else 句に「// 何もしない」コメントを書く意味について

    確かに、パッと見で 「なんだこれ?」 になりますね。 意味のないコメントとして else 句ごと削除してしまって良さそうにみえます。 しかし、実はこの「何もしない」コードは、 プログラミング(理論)的に面白い側面を持っている ので、簡単に記事にまとめてみたいと思います(記事中では Swift に似た擬似コードを使用します)。 キーワード if 式、網羅的パターンマッチ、参照透過、副作用、モナドと単位元 else 句が省略できる条件 例えば、次のコード例を考えてみます: let array: Array<Int> = ... var positiveArray: Array<Int> = [] // var = 可変変数 for x in array { if x > 0 { positiveArray.append(x) } else { // 何もしない } } ここでは array か

    else 句に「// 何もしない」コメントを書く意味について
    rryu
    rryu 2022/01/11
    あれはif文のブロックとelseを必ず書くというコーディングルールで発生する空のelseが意図したものなのか書き忘れなのか分からない問題への対処というだけなのでそんな大層な意味はないと思う。