「引数」を含む日記 RSS

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

2022-02-27

[]だけどjavaクラスオブジェクトメソッド勉強してンだが

メソッドで使う戻り値の型と引数の型が別の物になるケースってあるの?

仮にあるとしたら実務ではどういう時に使うん?

全く想像つかねンだわ

2022-02-12

ググった結果出てくるサイト最近ほんとうにクソすぎ

たとえばエクセルのVLOOKUPの仕様をど忘れしたとする。

そしてググる

上位あたりのサイトにいくと、もう必ずと言っていいほど

1.VLOOKUP とは何か

2.VLOOKUP 関数の式と引数

3.VLOOKUP 関数入力前の準備

4.VLOOKUP 関数入力

5.便利な使い方

6.まとめ

みたいなレジュメがでてきてクソ鬱陶しい。

こちとらさっさと答えが知りたいんじゃ。

「=VLOOKUP(検索値, 範囲, 列番号, 検索の型)」が出てくりゃそれでいいんじゃ。

「VLOOKUPとは、「Vertical」 (垂直) を意味する V と「LOOKUP」 (探す) の略で…」とか知ったこっちゃないんじゃ。

オマケスクロール中にはバカデカ広告がうじゃうじゃ出てくるし。

なんか最近、何でもこうだよな。

だんだん使えなくなってきてる感じかする。

anond:20220212120540

言語によるけど

関数引数原則レジスタに入れて渡すことになってて、でも計算結果はほっといても必ず一度レジスタに入るわけだからほとんどのケースでは変わらない

 

forの条件判定に計算式を入れる場合は念のため変数に入れておいた方が安全

単純な式だったら最適化されるから変わらないと思うけど、コンパイラに「forの中身の進行に応じて条件式の結果が変わるかもしれない」と判断されると最適化対象にならず、ループごとに計算し直される可能性がある

特に for ( i=0; getNanika(i) < 100; i++) みたいに条件の中に関数が入ってたら100%毎回関数が実行されるので注意

プログラミングの素朴な疑問

引数に足し算の数値とかを渡すときって変数に代入してから渡すのと計算そのまま引数にするのってパフォーマンスかわる?

言語によるかもしれないけどTaskとかでその処理がしばらく続きそうな場合

Forの条件文みたいなパターンでもいい

メモリ的には数値自体が使われる?それとも使うたびに計算しなおす?

for(i = 20 * i...)みたいな感じもありそうだから計算されてるのかな

2022-01-25

anond:20220125141559

俺は設計より実装の方が苦手だわ。プログラミング言語特に脈絡のない仕様ファイルオープンして1行読むのってどうやるんだっけ?改行コードの扱いはどういう仕様だっけ?EOF判定はどういう関数だっけ?str2numに対応する処理の関数はなんだっけ?文字コードがUTF8じゃない場合にはなんか特別引数書かないといけないんだっけ?1行読んでポインタを先頭に戻したい場合はどう書くんだっけ?ていうかディレクトリ内のファイルリスト取得する関数はなんだっけ?あー余計なファイルをはじくための正規表現仕様はなんだっけ?.......)が全く記憶できなくてすげーストレス。なんど覚えても雑然としすぎていてすぐ忘れる。ファイル云々に限らずプログラミング一事が万事全部そうだし…。

設計とかアルゴリズムのものの構築はもっとずっとすっきりした数学論理学的な構造で考えられるから楽。

2022-01-16

[]社畜プログラマ気分を味わえた2Dアクションパズルゲーム

Steamで買った『Recursed』というゲーム全ステージクリアしたので、記念に感想を書く。

Steam:Recursed

https://store.steampowered.com/app/497780/Recursed/?l=japanese

操作方法/目的

一見すると『Recursed』は2Dレトロ雰囲気アクションゲームである操作シンプルで、方向キーで左右に移動し、アクションジャンプと物をつかむ/投げるだけだからだ。部屋の中を移動してブロックをつかんで足場を作ったり、鍵をつかんで扉を開錠したりしてゴールへと到着(crystalを獲得)すればステージクリアだ。

概要/パズル

ステージの始めはチュートリアルの様に簡単だが、ステージを経るごとに難しくなり、そのうち何度も試行錯誤したり難しさのあまり何十分も頭を抱えたりもした。

この複雑さを生み出す要因は箱(ゲーム表記ではChest)である。このゲームでは箱の中へジャンプすることで部屋の内に入れるが、一度箱の外にでると箱の内部状態リセットされてしまうのだ。よって箱の中にブロックや鍵などのオブジェクトを持ち込んでも保存することはできないし、ブロック位置リセットされるし、開錠した扉もまた施錠されてしまうことになる。

さらに大きな特徴として、箱を持ち歩いて移動することができるのだ。それにより、箱を持ったまま別の箱に入ったり箱を持って箱の外にでることもできる。

そして、ステージを経ると箱の中の部屋は箱の外と同じ部屋という場面に出くわす。Recursedは『再帰呼び出し』という意味らしいが、まさにこのゲームタイトル通りの現象が起こるのだ。そして、以降のステージでは再帰を交えることでパズルの複雑さはより深まっていく。

再帰プログラミングとRecursed

再帰数学的帰納法アルゴリズムでは定番概念だが、それがパズルとなってプレイヤー思考回路を奪ってくる。私はかつて社畜プログラマとしてJavaプログラミング経験していたので、箱に入ることはメソッドを呼び出すことの様に感じた。オブジェクトを持って箱に入ることは引数を使ってメソッドを実行することであり、オブジェクトを持って箱の外に出ることはreturn文でメソッドを終わらせることであった。

「ゴール前の段差が大きくブロック必要からブロック生成メソッドを呼び出してブロックオブジェクトを返り値として渡さなくてはいけないけど、そうすると鍵オブジェクトをゴールメソッド引数として渡すことができなくて……、いっそのこと、ブロックメソッドからゴールメソッドを呼び出すべきか……、メソッドの返り値は一つだけだが何度も呼び出せばいけるか? この緑色オーラはなんだ? Staticを意味するのか? Staticなオブジェクト位置情報をあらかじめ変更しておけば、ゴールメソッド引数渡しをする必要がなくなるのか?」

こんなことを一つのステージクリアするだけのために何十分も考えていたのだ。念のために書いておくが、ゲーム内には数学用語プログラミング用語は一切出てこない。ただ単に、私にJavaプログラミング経験があるからその用語パズルを考えていただけだ。ゲーム内で箱から出入りしたりオブジェクトを箱の中から出し入れするとどうなるかを、Eclipseステップ実行するように想起していた。ちなみに、ゲーム内で存在しない部屋や壁の中に移動しようとするとparadoxが発生して強制的特殊な部屋へ移動されるが、私はその度にステップ実行でExceptionに遷移されたことの様に感じた。他の言語精通するプログラマだったり数学畑の人ならば、私とは異なる概念パズル思考をするのだろうか。

プログラマを辞めて何年もプログラミング思考をしてこなかった私でも全ステージクリアすることができたのだから学校プログラムを学んでいたり現役でプログラミングをしてきた人ならばこのゲーム『Recursed』をクリアすることは可能だろう。いっそのこと、『Recursed』のクリアすらできない人にプログラミングができるのか? と煽ってみたいくらいだ。

ちなみに、もし私が社畜プログラマ時代にこのゲームをやったらブチ切れていただろう。なんで仕事プログラミングで脳を酷使した上に自宅のゲームでも同じようなプログラム的な思考をしなければならないんだよと。プログラミングから何年も離れていた今の私にとって『Recursed』は、プログラミング単体テストが無事成功した時の快楽を思い出させるものだった。

感想

『Recursed』はパズルとしての難易度は非常に高いが、理不尽な解法を求められることはない。理不尽な解法のクイズパズルには怒りが湧いてくる。ひと昔前のクイズ番組を見たことのある人なら『モヤッとボール』を投げつけたくなる、と言えばその感情が伝わるだろう。『Recursed』はどんなに難しいステージでも、ただただ開発者パズル作成能力に感嘆するだけで怒りは湧いてこない。

似たようなアクションパズルゲームとして有名なのは『The Witness』であろう。『The Witness』も私が好きなパズルゲームであり、ゲームとして高い評価を得ていることに間違いはないのだが、しばしば理不尽な解法を求められるパズルがありその度に私は怒りが湧いてきたものだ。そう考えると、『Recursed』はパズルとしての洗練さだけなら『The Witness』を超えるものだと私は思う。

好きなステージ

具体的にパズル解説するととただのネタバレになってしまうので(もっとも、文字だけでパズルの解法を説明できないのだが)、『Recursed』で私が好きなステージを述べる。順番は攻略順に並べた。

Woodland/Loop

再帰概念が利用される最初ステージ

チュートリアルの様に簡単だったこれまでのステージから突如再帰概念を見せつけられることで、このゲームタイトル名の意味理解することになった。

Ruins/Interlock

鍵を手に入れたら扉に到達できず、先に扉に到達したら鍵が手に入らずで、まさにインターロック名前に相応しいステージだった。

Temple/Blister

一画面だけのオブジェクトが少ないシンプルステージだが、氷の壁に阻まれてゴールできず苦戦した。試行錯誤の繰り返しの末クリアできたが、何故クリアできたのかがわからない。

The Void/Sojourn

The Voidステージはどれもこれまでの集大成という感じでやりごたえあったが、中でも頭をひねらせたのがこれ。ゴールの部屋を水没させたり水の無い状態で入ったりして鍵を運搬するのに苦労した。

The Void/Escalate

箱を左右へ投げて移動を繰り返して、高い位置にあるゴールを目指すのがまさにEscalateというステージ名そのものだった。paradoxを発生した後のパターンが複雑だったのが印象に残っている。paradoxを発生させたらcrystal獲得(通常のクリア)できないのかよ……という落胆は大きかった。しかし、それだけにcrystal獲得とdiamond獲得(paradox発生によるクリア)のどちらも大きな達成感を得られた。

The Oobleck Conundrum/Transfer

簡単そうに見えて難しく、唯一ステージ飛ばして次のステージへと進んだので印象に残っている。後に複数日に及ぶ数時間試行錯誤で改めてこのステージクリアができて、クリアにかかった時間が最も長くなったステージでもある。しかしながら、おそらく開発者想定外方法でのクリアであり。初期画面から右の方へ一切行かずにOobleckさえ使用しないというクリア方法スッキリしなかった。といっても、開発者の想定を無視するゴリ押し的なクリアを見つけたのはこのステージだけだった。

The Last Tapestry/Flight

The Void/Escalateと似たコンセプトのステージだが、釜(JavaにおけるThread?)のギミックを利用したより複雑な構成となっている。高い位置にあるゴールを目指すのは、やはりFlightというステージ名そのものだった。

最後

この記事投稿する前にエンディングを見れていないことに気づいた。

全ステージクリア(全てのCrystal取得)したからと、この記事執筆するためにネタバレを気にせず攻略情報を調べていたけど、エンディングなんてわかる訳ねえよ。The Void/Trilemmaの最後にCrystal取得とは関係ない意味深なオブジェクトがあることには気づいていたけど……。ちなみに、私のSteam実績によるとdiamondとrubieの全取得はできてないけれども、もう取得する気力はない。パズルゲームガチ勢にとっては、実績全解除を目指さない私は軟弱者に映るのだろうか? 攻略を調べずに実績全解除できる人は、高い論理的思考能力を有しているに違いない。

2021-12-11

anond:20211211042626

問題の源流をどこに求めるかも大事だが

この件の最大のミスは、大半の人間必要としていないどうでもいい(しかも過剰にパワフルな)機能デフォルト有効にしてリリースしていたことで、それは言語とは独立していると思う

第一引数にlookupを含む文字列が入るとフォーマットプロセス操作される可能性があることを理解していないユーザー問題だが、それでもLDAP経由でclassダウンロードしてRCEできるとならなけりゃここまで問題にはならなかったのだからユーザー側の責任log4j側に比してだいぶ小さい

2021-12-08

anond:20211208080728

さら同性婚とか同性パートナーシップとか言っちゃうのは周回遅れなので、「婚姻平等」と言おう。

じゃないと将来、ノンバイナリーの人のための性別をXとして法的に登録できるようになったとしても (ざっくりBing検索した限りではドイツとかオーストラリアでは既にそうなっている) 、FMとかFFとかMMとかXXの組み合わせじゃないと結婚できなくなっちゃってXFやXMの組み合わせはどうすんのってなるだろ。

引数の想定が甘いままでメソッド設計しちゃダメだろ。

2021-11-17

GoMockテスト辛い問題とかDDDって何それうまいの?とか

GoMockってのはGo言語ライブラリで、依存するinterfaceテストモックに置き換えてくれる。

それで、テスト中のモックの期待される振る舞い等を簡単定義できるのだ。

期待される振る舞いってのは、モックメソッド呼び出しやその引数とかだな。

期待される呼び出しが無かったり、引数が違ったりするとテストが失敗してくれる。

他に、メソッド戻り値副作用記述できる。

非同期処理のテストだとよく、wg.Done()をモックにさせたりする。

正直、これまで書けなかったテストがモリモリ書けて楽しい

けれどそのうち辛くなってくる。

まり、たくさんのinterface依存するサービスオブジェクトメソッドテストしようとすると、たくさんのモックのたくさんのメソッド呼び出しの全部の期待される振る舞いを書かないといけない。

モックメソッド戻り値によってサービスオブジェクトメソッド内の挙動が変わる。

すると連鎖的に、メソッド内で続いて呼ばれるモックに期待される挙動も、変わる。

依存interfaceが増えるとこの場合けが指数関数的に増える。

当然だ。

Go言語にはテーブルリブテストっていう、テストケースは配列簡単にまとめられると良い、という慣習・哲学がある。

しかし俺のサービスオブジェクトテストケースが肥大化複雑化しすぎてしまったようだ。

モックの期待される挙動を細かくケースに分類して配列にするのは恐ろしく辛い作業だ。

やりたくない。

どうしてこうなった

どうしてこうなったかは明らかだ。

サービスオブジェクトが巨大すぎるのだ。

ノシリックで巨大で複雑なものは凡人には扱えないからやめとけ、と偉い人は言う。

そうだなモノシリックは辛い。DDDかにすればいいんだろ?

やったよ(見様見真似で)。

モックでこれまでできなかったテストが書けるのはいいね

でもじつはここはまだ山麓だったのです。

サービスオブジェクトが巨大なモノリス化してしまったのです。

分け入っても分け入っても青い山。

おれはどこに行けばいいのだ。

参考文献

https://little-hands.hatenablog.com/entry/2020/12/22/ddd-in-first-3month

あとどこかにDDD100本ノックとかないかな。

2021-11-01

Pythonオブジェクト指向はなぜ出来が悪いのか……

2021-10-18

PHP callable型の仮引数デフォルト値はnullしか指定できない

function hoge(callable $f = fn ($a) => $a) {} // エラー

function hoge(callable $f = 'intval') {} // エラー

function hoge(callable $f = null) {} // 合法

即時関数くらい書かせろよなぁ。せめて文字列でcallableな関数指定できるようにしてほしいわ

省略するには、$fがnullか確認してコールバック実行時にif文だか三項演算子だかで切り分けるしかない

なんで callable型 に null 入れられんだよ。キメェなぁ。なんでデフォルト値として関数代入できねーんだよ。使えねぇなぁ

いかにも増築増築で別々の機能を後付けて盛り付けてるって感じで、機能間の生合成がいまいちなんだよなぁPHP

まあ呼び出し元では hoge(fn ($a) => $a) みたいな呼び出しできるので、マシっちゃマシだけど

参考:

https://stackoverflow.com/questions/55587939/default-callable-in-function-definition-in-php-7

2021-08-16

【未経験から1ヶ月で】現役エンジニアが教える最良のプログラミング勉強法

プログラマーに憧れる皆さん!こんばんは。

自分文系から」「未経験から」と諦めていませんか?大丈夫です!プログラミングセンス不要です。正しい手順で学べば、文系や未経験でも、誰でも一流のプログラマとして活躍することができます

今日は、未経験から最短でWeb企業就職するための勉強法をご紹介します!

オススメ方法

もっとオススメ方法は、顕正会セミナーに参加することです。

顕正会は、日本で最大のエンジニアコミュニティであり、非常に良質なテキストを用いて、プログラミング初心者向けのセミナーをしていることで有名です。顕正会に入ることで、未経験からでも一流エンジニアノウハウを学ぶことができます

また、意外と知られていませんが、日本エンジニアの8割は顕正会出身です。実はあのひろゆきビル・ゲイツ顕正会出身です。ですので、顕正会ネットワークを介して就職先を斡旋してくれたりしますし、自分顕正会員だと、面接時にも非常に有利になります

顕正会セミナーは、インターネットからも応募することができますし、秋葉原などで声をかけられることもありますので、誰でも簡単に参加できます。会員もフレンドリーな方ばかりですので、是非、お気軽に応募してみて下さい!無料体験もできますよ。

準備

プログラミング勉強を始める前に、まず、必要ものを準備しましょう。必ず必要ものと、できればあると良いものは以下の通りです。

必ず必要もの

まず、プログラムを書いて実行するためにパソコン必須です。

可能な限りスペックの高いものを買いましょう。2021年現在であれば、CPUは18コア、36スレッドRAMは128GBくらいはあると良いでしょう。ストレージSSDであれば1TBもあれば十分です。

OSは、Windowsで開発するならWindowsが、Macで開発するならMac必要です。よく分からなければMacを買っておく方が良いでしょう。基本的MacにできてWindowsにできないことはありません。

インターネットは、この記事を見ている人は既に持っているでしょう。ただし、モバイル回線で見ている人は、自宅に有線のインターネット環境を用意した方が良いです。

顕正会に入会すれば、上記スペックPC無料で貸し出ししてくれます。また、法人向けの専用線無料で取付工事を行ってくれる上に、通信費を全て負担してくれます

できればあると良いもの

まず、他の会員と連絡を取るために、SNSアカウントを持っていると良いでしょう。

最近は完全にPC上での学習もできますが、やはり、勉強の基本は紙のノートに直接書くことです。医学的にも、手指の動きと脳の記憶回路が関連していることは証明されており、手を動かすことで効率的ものを覚えることができます

Kindleなどの電子書籍リーダーは持っておいた方が良いです。紙の本は時代遅れです。いやしくもITプロを目指そうという人間が、このような最先端デバイスを使っていないのは恥だと思うべきです。紙の本を買わないことは、環境を守ることにも繋がります現金も持つのはやめましょう。

自宅での学習

せっかくセミナーに参加しても、受身聴くだけでは、プログラミング習得することは難しいです。ここでは、自宅でどのような勉強をすればよいのか、ご紹介します。

教科書写経する

まずは、教科書参考書写経することから始めましょう。教科書参考書の本文を一字一句正確に書き写すのです。

よく、「写経理屈を学べないからだめだ」と批判されますが、まずは正しい「型」を体に覚え込ませるのが先です。野球水泳などでも、細かい理屈よりも先にフォームを固めるのと同じです。書き写している内に理屈自然と身に付きます

また、写経メリットは「飛ばし読み」を防げるところです。一字一句正確に写経をすれば、細かい部分を「分かったつもり」になって飛ばししまうことを防げます。たとえば、比較演算子の等号は=ではなくて、==です。プログラミングはこういうところに注意して学ばなければいけません。

ソースコードフローチャートUML)に変換する

教科書サンプルコードノートに書き写したら、それを今度は自力フローチャートUML)に変換してみましょう。そうすることで、自分が本当にそのコード理解しているのか、確かめることができます

フローチャートUMLが素早く正確に描けることは、プログラマーとして働く上で非常に重要スキルです。それらはソフトウェア設計の基礎となりますし、ソースコードを読めない営業顧客にとっては貴重な資料となるからです。プロエンジニアは、COBOLソースコード10万行を1週間でフローチャートにして、Excel転載することができます

ここで一つ注意すべきことがありますフローチャートを描くときは、必ず専用の定規を用いて描いて下さい。フリーハンドで描いたもの業務ではフローチャートとは認められません。これはまともな企業就職すれば研修などで必ず習うことですから、今の内に覚えておきましょう。

Excel勉強する

エンジニアを目指すのであれば、プログラミングだけではなく、Excelの使い方も学びましょう。Excelエンジニアにとっての万能プラットフォームです。エンジニアはあらゆる作業Excelで行いますセル結合や罫線を用いて、見栄えの良い資料を作る技術は、エンジニアにとって必須です。

プログラミング学習中であれば、たとえば以下のような題材の資料を作ってみると良いでしょう。

尤も、以上の資料は、ツールを使うことで自動作成することもできます。たとえば、ソースコード更新履歴Gitなどのバージョン管理システムを使うことでも管理できますしかし、それらの資料としてのクオリティは非常に低いため、アマチュアしか使うことはありません。プロを目指す皆さんは、必ずExcelを使いこなせるようになりましょう!VBA習得必須です。

プログラミングのコツ

以上、プログラミング勉強法について解説しました。ここからは、実際にソースコードを書くときのコツを紹介していきます。他のプログラマと差をつけることができる技術ですので、意識するようにして下さい。

変数名は短く

プログラムで使う変数名は可能な限り短くしましょう。

理想は、aやxなどの一文字です。ただし、これだけだと26文字しか使えないので、a1, a2, ...のように連番でグルーピングすると良いです。

また、変数宣言使用箇所が離れた場合に、変数の型がすぐに分かるように、たとえばint型であればi1, i2, ...、string型であればs1, s2, ...のように命名すると、読む人に親切で自分ミスしにくくなります

変数名を長くするのは、以下のデメリットがあるため、絶対にやめましょう。


なるべく関数を作らない

多くのプログラミング言語には、クラス関数といった機能がありますが、これらは基本的ライブラリ提供者などが使う想定の機能であり、一般プログラマが使うのは好ましくありません。したがって、クラス関数はなるべく使わないようにして下さい。

関数を作ると、以下のデメリットがあります

不要関数を作らないためのテクニックには、以下のようなものがあります

まず、関数引数に「フラグ」を渡し、関数内部で処理を切り替えれば、1つの関数複数の処理をすることができます

function f(i) {
  switch(i) {
    case 1:
      // i = 1のときの処理
      break;
    case 2:
      // i = 2のときの処理
      break;
    case 3:
      // i = 3のときの処理
      break;
    // ...
  }
}

この方法は、以下に述べる「変数寿命を伸ばす」効果もあります。つまり、この関数内で宣言された変数は、すべての処理で共通して使用することができます

クラス不要関数を作らないようにするには、「継承」を用います複数クラスで用いる関数定義したクラスを1つ作っておき、そのクラス継承すれば、新しいクラス関数定義する必要はありません。

理想的には、プログラム内のすべての関数を同一のクラス定義し、それを継承するべきです。そのようなクラスは俗に「神」と呼ばれ、プログラマからはこの上なく尊ばれています

class God {
  f1() {
    // 関数1
  }
  
  f2() {
    // 関数2
  }
  // ...
}

class C1 extends God {
  // 何も書かなくても上の関数が使える!
}

class C2 extends God {
  // 何も書かなくても上の関数が使える!
}
// ...

変数寿命を長くする

変数宣言する場所によって、ソースコードのどの範囲から参照できるかが決まっています。この範囲が広いことを、「変数寿命が長い」と言います

たとえば、以下のコードのaは、関数定義の外側からは参照することができません。

function f() {
  var a = 1;
  return a;
}

一方、以下のコードのaは関数の内外どちらからでも参照することができます

var a = 1;

function f() {
  a = 2;
  return a;
}

変数寿命を長くするのは、プログラマの腕の見せ所です。

せっかく作った変数がすぐに死んでしまうのは、非常にもったいないです。ソースコードの表面には現れませんが、変数を作ったり捨てたりするのには、計算コストがかかります。したがって、寿命の短い変数を作りすぎてしまうと、プログラムが遅くなってしまます

また、変数寿命が長いということは、変数をたくさん作らなくても、1つの変数を色々なところで利用できるということであり、とても便利です。たとえば、上記の前者のコードでは、関数の外部からaの値を参照したくなっても、参照することができません。後者のように書いておけば、プログラムのどの箇所からでも、aの値を参照したり、更新することができます。したがって、変数寿命を長くするとプログラムを変更しやすくなります。つまり保守性が上がります

例外を潰す

例外とは、プログラムが予期しない処理をしようとした場合に、プログラムの実行を停止し、呼び出し元にエラーを通知する機能です。たとえば、「test.txt」というファイルを開こうとしても、そのファイル存在しない場合は、例外となります

例外が発生すると、プログラムが停止してしまうため、非常に困ります。したがって、プログラマ例外をきちんと処理しなければなりません。

ほとんどのプログラミング言語には、例外処理のための機構があります。たとえば、以下のような構文です。

try {
  // 例外が発生し得る処理
  // ex. ファイルを開く
}
catch (e) {
  // 例外が発生したときに、実行する処理
}

例外への対処は実はとても簡単です。是非ここで覚えて下さい。上記のような機構のある言語であれば、catch節の中身を何も書かなければ、例外が発生しても、何事もなくプログラム動作を続けます

try {
  // 例外が発生し得る処理
}
catch () {}

全ての例外を潰せば、決して不慮の動作で停止することのないプログラムを作ることができます。ですから例外が発生し得るコードは、積極的上記try-catch構文を用いて、例外を潰すようにしましょう。

おわりに

全体的に専門用語盛りだくさんの記事になってしまいましたが、

部分的にでも理解すればプログラミングを見る目が変わるはずです。

うさんくさい記事インターネットには多いですが、

そういう情報に惑わされずに本物の技術を身につけてもらえればと思います

2021-08-13

Automatons Hacking Guideというブログを覚えているか

ホームレス死ね発言メンタリストDAIGOって奴が絶賛炎上中だが、意識高い系不労所得民なんて生き方してる奴のテンプレみたいなもんだ。

10年前にその一歩先のホームレス殺人を唱導して名を馳せたAutomatons Hacking Guideというはてな日記があった。

ブロガーは「華殉」というビジュアル系っぽい名前を付けた自称東大卒国内一流会社勤務で大学院に通う20代後半という設定の男性平成初期のトレンディドラマの設定みたいな生活をする人がこの世には居るんだね。

「Automatons Hacking」のAutomatonはオートマタとも言い自動人形のこと。原爆コンピュータの父、ノイマン提唱したセル・オートマトンという概念があり、これはそのままライフゲームアルゴリズムなのだが、フランス現代思想流行するとこれら情報科学概念を借用してこねくり回す議論流行した。

その過程個人特定アルゴリズムを持って社会的活動をする自動人形と扱う社会学手法などが出来た。この辺まではAI自動学習ベースでもある。

するとこれが人文系逆輸入されて罵倒や見下しに使われるようになる。自分で考え経験してアップデートし続ける人生を送る人間じゃなくて、与えられたアルゴリズム社会的入力引数付き関数)を与えると安定した反応を出す人形として扱う。それは群衆アナロジーでもある。群衆に属さず上から俯瞰する観察者が自分だ。だから「俺は他の大衆とは違う」と思いたい意識高い系若者はこのソーカルコケにされたポモの概念無断借用的な考えに靡きやすい。

ビジュアル系みたいな名前トレンディドラマみたいな生活を送る華殉は人文家ポモの薫陶を受けている事が判るね。

ハッキングコンピュータハッキングの事だからこのオートマタ普段の処理とは違う入力を直接与えて愉快犯的に恐慌状態にしたり自分の思うままに操縦する事を表す。

おや?メンタリストっていうのに似ているね。やってる事も知的スノッブの基礎もフォロワーを釣ったり釣られたりする部分も。

 

オートマタハッカーを名乗る華殉だったがかなり誠実な性格だった。自意識に。

実存の強さ、自意識の高さ故に「群衆俯瞰者」に惹かれるのであるから自意識に誠実なのはありがちだ。

 

例えば

批判されてメタから見ている姿勢は崩さないが相当数のレスをする。

・「安全地帯から言うだけで実際には殺せないだろう」と挑発され熱くなり「自分は実際ホームレスを殺す」と言ってしまう。

ブログ副題に「〇〇劇場」と書いていたのだが、ホームレス殺人エントリなどで風呂無駄氏にはっきりと拒絶を受け、直後に外してしまう。

Twitterで「痛い」ツイートをした直後に「ちんこまんこちんこまんこ」というツイートを十数回して流す。

 

そういえばメンタリスト君も動画炎上コメントを数百個削除しているようだ。コメントが数百になると閲覧も大変なのに熱心だよね。

 

華殉はそもそも最初googleの開発がどうとかアップル製品哲学がどうとか、ニーチェ超人がどうとか、今では意識高い系テンプレみたいな事ばかり書いていた。でもPVが伸びなかった。そこに「ホームレス人権なんて行使される事も無い状態だろ」佐川ニキ「ホームレス人権無いとかいい年してバカじゃねーの」という誤解みたいな論争があり、そこにホームレス殺人エントリ割り込みPVを浚ったのであった。

 

こんな華殉だったが最後はギーグ精神論的なものシフトしてフェードアウトしていった。ホームレス殺人偽善批判などの挑発エントリから手を引いた理由増田が見たところ以下による

 

挑発エントリへの反応に対して実存開陳し過ぎた。

 

善への挑発をしたらはてなリベラルが直情的にひどいと吹き上がる反応をする事を期待していたがネットには宮勤め以外の人間も居り特に不良の経験を持つ人間喧嘩慣れしている。更にポモ以前の思想素養がある人間は同系の人間実存をむき出しにして効果的に怒らせ誘導する術を持つ。これらによって「劇場」が状況劇場になってしまい、実存開陳しすぎ、刺さり過ぎた。思想系の人間実存の剥き方を知っているのは自分がその動機実存カバー)で思想なんてものに惹かれているから。

 

自分への賛同者に底辺テンプレネトウヨみたいなのが多かった。

 

ニーチェ援用したりしてるのにルサンチマンで歪んで挑発されると安定した出力する連中に擦り寄られたら立場が無い。というかなまじっか思想なんてやってるので羞恥心で「あ゛あ゛あ゛ー」となる。同意されて懸命に距離を取りたがる姿は侘び寂びが漂っていた。でもこれは華殉も悪くて過去エントリTwitterではテンプレ的なデマや「自分税金外国人生活保護に吸われて」みたいなテンプレを良く書いていた。そもそもそれってニーチェルサンチマンのものじゃね?

 

子供主体にとって世界暴力であり規範強制してくる装置だ。特に若者」になり大学や院に進むと知で征服した自分世界と隷従を求められる外の世界格差は大きくなる。オートマトンハッキングメンタリストの行動が似ているのは共にこの需要相手にするものからだ。

 

今回のメンタリスト炎上を見てデジタルタトゥーを持つ華殉はどうしているのだろうか?

「あ゛あ゛あ゛ー」となっているかしら?とニヤニヤしてしまう。

2021-08-12

anond:20210812104821

俺環では起きてないな

Chrome バージョン: 92.0.4515.131(Official Build) (64 ビット

IME GoogleJapaneseInput-2.25.3700.0+24.7.9

Windows 10 Pro 21H1

Chromeに常に与えてる引数 --disable-features=RendererCodeIntegrity

MacType適用

2021-07-12

anond:20210712172732

グローバルな配列必要な全てのデータを保存しておくというのは、引数や返り値の考え方を知る必要がなく、配列として確保した分以上のメモリリークもなく、初心者にとっては考えやすかろう

配列

0番目: ヒットポイント

1番目: 攻撃

2番目: ...

のような設計も、他人が作ったプログラムを読み解くのは悪夢だが、自分ひとりしか触らないならなんとかなるだろう

2021-07-02

初心者から中級者になるためのプログラミングのコツ

変数や構文などのプログラミングの基礎は覚えた人向けに、ソースコードを書くときのコツを紹介していきます。どれも今日から実践できるものばかりです。他のプログラマと差をつけることができる技術ですので、ぜひ意識するようにして下さい。良い子はまねしないで下さい。

変数名は短く

プログラムで使う変数名は可能な限り短くしましょう。

理想は、aやxなどの一文字です。ただし、これだけだと26文字しか使えないので、a1, a2, ...のように連番でグルーピングすると良いです。

また、変数宣言使用箇所が離れた場合に、変数の型がすぐに分かるように、たとえばint型であればi1, i2, ...、string型であればs1, s2, ...のように命名すると、読む人に親切で自分ミスしにくくなります

変数名を長くするのは、以下のデメリットがあるため、絶対にやめましょう。


なるべく関数を作らない

多くのプログラミング言語には、クラス関数といった機能がありますが、これらは基本的ライブラリ提供者などが使う想定の機能であり、一般プログラマが使うのは好ましくありません。したがって、クラス関数はなるべく使わないようにして下さい。

関数を作ると、以下のデメリットがあります

不要関数を作らないためのテクニックには、以下のようなものがあります

まず、関数引数に「フラグ」を渡し、関数内部で処理を切り替えれば、1つの関数複数の処理をすることができます

function f(i) {
  switch(i) {
    case 1:
      // i = 1のときの処理
      break;
    case 2:
      // i = 2のときの処理
      break;
    case 3:
      // i = 3のときの処理
      break;
    // ...
  }
}

この方法は、以下に述べる「変数寿命を伸ばす」効果もあります。つまり、この関数内で宣言された変数は、すべての処理で共通して使用することができます

クラス不要関数を作らないようにするには、「継承」を用います複数クラスで用いる関数定義したクラスを1つ作っておき、そのクラス継承すれば、新しいクラス関数定義する必要はありません。

理想的には、プログラム内のすべての関数を同一のクラス定義し、それを継承するべきです。そのようなクラスは俗に「神」と呼ばれ、その利便性からプログラマからはこの上なく尊ばれています

class God {
  f1() {
    // 関数1
  }
  
  f2() {
    // 関数2
  }
  // ...
}

class C1 extends God {
  // 何も書かなくても上の関数が使える!
}

class C2 extends God {
  // 何も書かなくても上の関数が使える!
}
// ...

変数寿命を長くする

変数宣言する場所によって、ソースコードのどの範囲から参照できるかが決まっています。この範囲が広いことを、「変数寿命が長い」と言います

たとえば、以下のコードのaは、関数定義の外側からは参照することができません。

function f() {
  var a = 1;
  return a;
}

一方、以下のコードのaは関数の内外どちらからでも参照することができます

var a = 1;

function f() {
  a = 2;
  return a;
}

変数寿命を長くするのは、プログラマの腕の見せ所です。

せっかく作った変数がすぐに死んでしまうのは、非常にもったいないです。ソースコードの表面には現れませんが、変数を作ったり捨てたりするのには、計算コストがかかります。したがって、寿命の短い変数を作りすぎてしまうと、プログラムが遅くなってしまます

また、変数寿命が長いということは、変数をたくさん作らなくても、1つの変数を色々なところで利用できるということであり、とても便利です。たとえば、上記の前者のコードでは、関数の外部からaの値を参照したくなっても、参照することができません。後者のように書いておけば、プログラムのどの箇所からでも、aの値を参照したり、更新することができます。したがって、変数寿命を長くするとプログラムを変更しやすくなります。つまり保守性が上がります

例外を潰す

例外とは、プログラムが予期しない処理をしようとした場合に、プログラムの実行を停止し、呼び出し元にエラーを通知する機能です。たとえば、「test.txt」というファイルを開こうとしても、そのファイル存在しない場合は、例外となります

例外が発生すると、プログラムが停止してしまうため、非常に困ります。したがって、プログラマ例外をきちんと処理しなければなりません。

ほとんどのプログラミング言語には、例外処理のための機構があります。たとえば、以下のような構文です。

try {
  // 例外が発生し得る処理
  // ex. ファイルを開く
}
catch (e) {
  // 例外が発生したときに、実行する処理
}

例外への対処は実はとても簡単です。是非ここで覚えて下さい。上記のような機構のある言語であれば、catch節の中身を何も書かなければ、例外が発生しても、何事もなくプログラム動作を続けます

try {
  // 例外が発生し得る処理
}
catch () {}

全ての例外を潰せば、決して不慮の動作で停止することのないプログラムを作ることができます。ですから例外が発生し得るコードは、積極的上記try-catch構文を用いて、例外を潰すようにしましょう。

2021-06-18

anond:20210618140722

こういうのは中身知らなくてもいいように、引数無しが最も高速なように作ってある

とはいえ、知らなかったからググったけど、Pythonリストは内部的にはCの配列からpop(要素を取り出しつつ削除)する場合は末尾からがいいんだね

(末尾以外からpopすると空いた場所に詰める処理が入る)

for文でインデックスアクセスなら高速じゃん、って言ってる増田も正解だね

2021-05-25

昔の職場は、Cで引数を見るときargv[]にNULLが入ってるかどうかで引数の数を判定してたりした。

int main(int argc, char*argv[])

{

for (・・・) {

 if (argv[i] == NULL) // 引数の終わりの判定

}

}

それがバグることがあったので、普通にargcを見るようにして「デバッグしました、原因はコレコレです」と報告したら「よくそんなの分かったな」と感心されたことがあった。

個人的には、それまで本やコードで、引数の数をargc以外で判定してるコードを見たことなかったから、その職場コードを見て新鮮な驚きがあったんだけど。

「独学でかじってるやつは変な癖がついてダメだ。使えない。なにも知らない新人のほうが素直で延びる」とか言ってる人をたまに見るけど、ネットや本で勉強しないで、職場で教えてもらうだけのほうがむしろ変な癖がつきやすいと思うわ。

2021-05-21

anond:20210521211849

せやね。型がないというか、変数引数に型がないと言うべきか。もちろん、型宣言があるのは知っているよ。

個人的Python についての不満

良い言語だと思うが、不満がある。

Perl比較して、


Ruby比較して、


Java比較して、


PHP比較して、

  • 後発のくせに、なんであの時に負けたのだろうねー。
  • OOP としては、流石に Python の方が良いと思う。

JavaScript と比較して、

  • カオス具合は、五十歩百歩ですね。
  • 文法的には、JS のが好き。
  • OOP としては、JS の方が優れていると思う。

Haskell比較して、


R と比較して、


C と比較して、

  • まぁ、比較ができんね。どうせ Python も中身は C だし。
  • どーせ C が最後には勝つんだよ。


という愚痴がある。他人の書いたものを読む分には良い言語だと思うよ。

追記。または、コメント欄への返事。

今日日型ヒント書くし、タプルは複数の値を返すけどクラスを作るほどではない関数を書く局面でよく使う

型ヒントはコンパイル時のエラーにならないじゃん。だったら、いらなくね?タプルは複数の値を返すときに使うのね。Go みたいだね。または Ruby の Struct みたいな。

リスト内包表記書かせるのやめてもらえません?

あれ嫌いな人おるのか。俺も好きじゃないが。純粋Haskell と同じ文法だったら良かったのにね。

三項演算子について

アレはキモいね。素直に ?! で良いと思う。というか、Python英語圏の人も納得はできないだろ、っていう文法が多くないか

インデントブロックなのて可読性が上がる

というのは同意する。ただ、書くときにそうは思わない。例えば、with 構文は Ruby の方がブロックを抜けたらクローズするという方針のが良いと思う。

互換性を断ち切って増田にも認めてもらえる仕様Python 4が待望される。

それ Python 2 から 3 になったときに既にやったじゃん。そして大成功したじゃん。ニャンニャン

2021-05-09

ワイ「今日Haskell学んだるで!とうとう副作用の章やな!」

Haskellでは対話プログラムを、「ある状態世界」を引数に取り「別の状態世界」を結果として返す、純粋関数とみなします。

(プログラミングHaskell 10.2 解決策より)

ワイ「??????????」

2021-04-25

動的型付け言語を使える人は、マゾ天才ではないか

仕事Pythonコードに触れることになった。Djangoアプリ

まずはDjango理解する。

urls.py で リクエストURL とビューのマッピングします」 → ふむふむ

「views.py に定義されたビューで リクエストを受け取りレスポンスを返します」 → うんうん

引数で渡される リクエストオブジェクトはこれ https://docs.djangoproject.com/en/3.2/ref/request-response/ 」 → 予想通り

よし完全に理解した!!!

同僚により実装済みの views.py を IDEで開く。 引数にrequestがある。うんうん。

requestにマウスをかざしてみる。

IDE無反応

まだ私は気づかない。不審に思いながら、requestの中に詰まっているモノ(method とか header とか body とか)のラインナップが現れることを期待して

request. とタイプしてみる

IDE無反応

ここで私はようやく、置かれている状況(相手にしているのはPythonスクリプトであること)に気づき発狂しそうになった。

型付けに慣れきっている私にとっては

こんなものを使える人はマゾ天才だとしか思えない

2021-03-04

anond:20210304152140

InfinityはJavaScriptが標準で持っていてどこからでもアクセスできる定数(読み取り専用変数)の名前。その名のとおり無限大を表す

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Infinity

 

min, maxはこの関数内で定義されている普通変数定義がないように見えるかもしれないが、引数のところに書いてあるので使用できる

var getParamNumber = function(paramNames, min, max) {

 

で、valueにはたぶん文字列が入っているのでparseInt(value, 10)で10進数の数値に変換するわけだが(parseIntの第二引数は基数)、

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt

このときvalueが未定義だったり、まったく数値化できない謎の文字列が入っていたりすると「NaN」という特殊な数値になってしまい、こいつは厳密には0ではないため問題を引き起こすので、そういう変な値がとれてしまった場合ちゃんと0にする必要がある

「parseInt(value,10) || 0」と書くことにより「左辺(parseIntの返値)を真偽値とみなして判定し、もし偽として判定される値(0, NaNのほかnull, undefined等が該当する)であれば||の右辺(0)を採用する」という意味になる

 

.clamp()って標準のメソッドにあったっけ…?まあ一般的想像すれば、数値がminmax範囲を超えていたら範囲内におさめるってことじゃないの

2021-02-21

anond:20210221101218

そもそも、経文を唱えたり書いたりしたら悪霊が退散するって考えたことが凄い発明

引数オプションてんこ盛りのコマンドライン命令みたいなノリなのかね?

2021-02-10

依存性逆転の法則理解した気がする

抽象依存するってことなんだよね。発想が抽象的でむずかしい。

以下に示すbeforeコード欠点は、IOに関係する部分とビジネスロジック(誇張)が密結合していることで、このメソッドを変更する理由複数存在している点である。(単一責任原則違反)

変更理由は、IOにnullが入ってくることを考慮するとか、暗号化アルゴリズムを変更するあたりがぱっと浮かんだ。

afterのコードは、readerwriter引数から受け取れるようになっていて、インターフェース依存するようになって、単一責任原則を守るようになった。

```

# before

def encrypt

while char = readChar do

writeChar(trunslate(char))

end

end

# after

def enctypt(reader, writer)

while char = reader.read do

writer.write(trunslate(cahr))

end

end

```

まとめ

インターフェース依存していこうな。

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