はてなキーワード: 引数とは
https://b.hatena.ne.jp/entry/s/jp.quora.com/hotondo-no-puroguramingu-gengo-de-kansuu-no-return-ga-1-tsu-shika-deki-nai-no-ha-naze-desu-ka を呼んだんだけど、回答・ブコメともにとんでもないことを書いている人がたくさんいてびっくりした。本質的に多値返しは直積型の返しと同じで、これはタプル・構造体と本質的に同じ、というのは多くの人が指摘している通りではあるのだが…。
動的型付け言語に慣れてらっしゃる方が多いのかもしれないけれど、配列というのは「同じ型をまとめた型」であるべき。動的型でいろいろ突っ込める配列は本質的には「直和型の配列」と思った方がいいよね。多値返しという意味では(記憶領域の面で)余分なコストがかかりうる直和型を選択する意味はないですよね?回答でもなんか配列返しに言及している某有名人がいたが、あれれ?という感じ。
もっとも、immutableな配列をtupleと呼ぶPythonという言語があるせいで引っ張られている感は否めないけども、配列とは本質的に異なる型が存在しているのは明らかですよね?配列と構造体って違うよね…?(言葉の定義の問題と言われそうだけれど、型システムの分野での言葉の定義は存在しているわけで、反論になっているとは思えない。『俺は明日からこのわんわんなく動物をネコと呼ぶから』と言っているようなもんでは。)
確かにナイーブにはレジスタに入れて返すのが素直だというのは同意するけど、でもそれ構造体と一緒だよね?昔のCではこれはできなかったというのは知らなかったので勉強にはなりました(未検証だけど)。
あと構造体返しの関数がどう機械語で実装されているのか知らなさそうな人がいるのにはちょっとびっくり。それでなんでレジスタがどうとか言えちゃうのかしら。構造体の値を返す関数ならばポインタは返さないですよ。そのポインタはどこを指してるんですか。実装しづらいとか何とか言ってる人たち、ちゃんとアセンブラ読んだことあるんですか…?本質的に何の困難もないです(ちなみに少なくともlinux amd64ではスタックに領域を確保してそのポインタを関数の引数の一部として渡します。まあヒープに置く場合でも余計なmoveが出ないようにしたいとかあるかもだけど、そんなでかいデータは普通無名構造体では扱わないでしょう)。
確かに、返り値の型が(A, A)のような場合はドキュメント読まないとわからなくなってしまうので可読性が下がるし構造体を使うべしというのは(ほぼすべての場合において)同意(多値は使いづらいというのは構造体は使いづらいという意味ではないですよね?)。でもさ、某有名人もgoで挙げているけれど多値って普通(A, B)みたいに違う型の値を返したくなることの方が多くないですか。この場合どっちがどっちかは自明だよね?ただの無名構造体だよ。多値返しは設計が甘いとかわけわからんことを言っている人もいたけれど、なんかこちらが不安になってきた。
…本当に意味不明で驚いた。id:megumin1氏が言っているように、tupleのパック・アンパックに余分なコストをかける必要はない(まあアドレス渡しになるから複数本のレジスタで返すのと比べたら余分なmovが入りうるという話はあるけど、この人が多値返しというので何を想定しているかわからないので何とも。)。何遍呼んでも多値返しとtuple返しの違いが判らなかった。おそらく前述のようにimmutableなlistのことをtupleと思っているのかな?と予想はするが…。
はてな界隈ってエンジニア的な印象があったんだけど、ここら辺の話ってそんななじみないのかな…?てか某有名人氏も型システムとかあんまりご存じないのかな…?むしろこれは増田が無知なんだろうか…?
最近C#の質問ばっかしててごめん。知恵袋でやれといわれそうだ。
でも、あちらよりこちらの方が親切で丁寧な回答が来ることが多い気がする。
何よりレスが早い。
それはさておき。
C#のListってあるが、これに複数項目入れることは出来るのだろうか。
2次元とかじゃなくて、ClassをまとめてListに入れるみたいな。
IDとName、Ageなどなど……キーワードで内容も特定したい。
ClassをListに入れるというのもあるみたいだが、
デメリットがありそうな気がして出来ていない。
MainクラスでHumanクラスなどの情報を入れる。情報をもとにJudgmentクラスで判別?する。
人間の名前が「華子」だったらAを実行……などその後の処理にも関わるから分割したい。
Judgmentクラスで、引数?の数字を元に、学生か社会人かなどを分ける。
例えば以下の文章がメッセージで出力されてた時にエラーの根本原因が即わかる奴っているのかよ…
[ts]
型 '{ inputs: SymbolicTensor; outputs: (SymbolicTensor | Tensor<Rank> | Tensor<Rank> | SymbolicTensor)[]; }' の引数を型 'ContainerArgs' のパラメーターに割り当てることはできません。
型 '(SymbolicTensor | Tensor<Rank> | Tensor<Rank> | SymbolicTensor)' を型 'SymbolicTensor | SymbolicTensor' に割り当てることはできません。
型 '(SymbolicTensor | Tensor<Rank> | Tensor<Rank> | SymbolicTensor)' を型 'SymbolicTensor' に割り当てることはできません。
型 'SymbolicTensor | Tensor<Rank> | Tensor<Rank> | SymbolicTensor' を型 'SymbolicTensor' に割り当てることはできません。
型 'Tensor<Rank>' を型 'SymbolicTensor' に割り当てることはできません。
MacTypeはただのフォントレンダラーであってGithubで公開もされてる。beta5使っとけ。
Mac所有してるなら抜き出して使っても問題ないと思うが、MacぽいフォントにしたいならIPA Pゴシック(日本語部分は等幅がいいならExゴシック)にシステムフォント置き換えるだけでいいんじゃないかな。noMeiryoUIあたり使って。
あとChromeのUI部分に適用させるならChromeのショートカット引数に--disable-directwrite-for-uiを加える。
あとChromeの設定内のフォント設定でもIPA系フォントを指定しておくといいな。
アプリのタイトルバーに効かないなら使ってるプロファイルのiniファイルの、[UnloadDll]にあるdwm.exeをコメントアウトして再起動。
あ、ストアアプリでGoogle日本語入力使ってるとIMEオンできなくなるみたいな副作用はあるけど。直し方は知らん。
いやそれはちょっと違う。
日本語Windowsで見た時は游ゴシックが表示に使われるが、Windowsがほっそい游ゴシックをキレイに表示できるレンダリング性能を持ってないせい。
4Kモニタとかなら気にならんだろうが、FHDとかのモニタ使ってるならMacTypeを入れると大分マシになる。
というか多少検索能力に自信のあるWindows使いならみんなMacType使え。
blogとかのスクショでギッザギザのメイリオとか見ると無様すぎて泣けてくるようになる。
MacTypeと、githubにあるbeta2パッチを導入し、
noMeiryoUIでシステムフォントを全部IPA Pゴシック(10pt以上)に変更し、
UEFIでセキュアブートを無効にした上でMacTypeをレジストリモードで運用するといい。
Chromeのショートカットには引数で--disable-directwrite-for-uiを入れ、
Chromeの設定でフォントカスタマイズからデフォルトフォントをIPA PゴないしP明に変え、
Stylusでスタイルシート弄ってメイリオやMSPゴなどをIPA系に置き換えてしまえ。ここで游ゴも置き換えてもいい。細すぎるし。
タスクバーやスタートパネル、UWPアプリなどにはMacTypeやフォント置換は効かないが、これでだいたいフォント描画への不満はなくなる。
ただあらゆるトラブルの元凶になる可能性があるアプリなんで何か起きた時は真っ先にオフにすること。メジャーアプデ時も事前にオフにすること。
https://nekogata.hatenablog.com/entry/2018/09/10/163206
この記事がはてブで大絶賛されてるが、個人的にはセンス無いなーと感じたので言語化してみる。
今回の仕様を図で書くと
みたいな感じになるとする。
すると、今回スライドで問題視しているのは矢印の右側の通知の部分が1クラスに共通化されている点。
しかし、オブザーバーパターンの出番は図の矢印の部分が絡まり合って処理が複雑になってしまった場合。
今回は1つのイベントから複数のリアクションが発生することは想定しないので
オブザーバーが不要なのは当然。選択肢に出てくるほうがおかしい。
そもそも問題認識(通知部分が問題)と解決策(矢印部分を解決)がズレてるから話がおかしな方向にいってる。
Notificationクラスのサブクラスを作ろう、ならまだ分かる。
確かに設計を言語化するのは大事だが、言語化というのは「それっぽいことは幾らでも言える」危険性がある。そもそもプログラミングというのは芸術であり文学なんだから、センス無いのに言語化を頑張っても「一見それっぽく聞こえるけど間違ってる説明」しか出てこない。
具体的になんだろと思ってきたが、どうも下記のことを指しているのではないかと気づいた。
Object型の可変長の引数を受け取り、相手が求めている型(それがどんなものかは不明)で返却する関数を作ってください、それに必要なリソースは自分で確保してなと言われてるようなものでこれは不可能なのでは?と思ってる。
Nullpoは甘え。
って書いておきながら、引数で持ってくるのかnewするのかは書かないって、片手落ちじゃん
ロジックは実装に任せるっていうなら、設計はDBまでかもしくは、外部インタフェース仕様ぐらいまでにして、内部で使うクラスもメソッドも実装側に任せろよ
C言語でプログラミングの基礎を学び、今はJavaベースのシステムを設計し、プログラマに実装をお願いする立場。
まず、完成した設計を渡すと高確率で質問とともに突っ返されるのだが、その時の質問が、ほぼいつも
「『AオブジェクトのBメソッドを〜』とありますが、そのAオブジェクトはどっから引っ張ってくるんですか?それともnewするんですか?」
なのが閉口する。
俺は業務の詳細を俯瞰し、処理のフローチャートに落とすのが仕事なんだけど、そんなトコまで書かないといけないのかよ?
なんでインスタンスだnewだのって話になるんだよこっちはJavaの専門家じゃねーんだよ。ぶっちゃけそんな低レベルな話は知らねーよ。
コード書くのが俺の仕事じゃねーのに、なんでコード書きがするべき仕事を押し付けられるんだ。
まあそんな事を言っても仕方ないので、「引数で持ってくる」と直して実装させるじゃん?
「その修正は仕様変更になるので許可取ってください。てか、ビルドエラーになるのでやめてくれ」
そして、それもこれも、全て設計のせいになるので納得が行かない。
ペースは週2回、1回1〜2時間くらい。
PowerPointはよく分からないのであんまり教えてない、てかアニメーションとか要る?
換算一問一答とか、今使われてるのはSI単位が多いけど例外もあるよ、とか、トレーサビリティってのがあって世界中の計測器は〜、とか。
緯度と経度とか、大陸の名前とか、国当てクイズとか、大航海時代とか、メルカトル図法とか。
現状Hello Worldだけ。
ファイルシステムの使い方とか、巷でよくあるメモリを机上にたとえたり補助記憶を本棚にたとえるやつとか、Windowsのタスクマネージャーの起動方法と見方とトラブル対処法とか。
射出成形とかプレス機とかNC旋盤とかファクトリーオートメーションとか。
成果物として、毎日つけているOneDrive上のExcel家計簿がある。
普段はスマホで日付と金額と勘定科目?を入力してもらって、別シートにsumifs関数で期間と勘定科目の一致した金額を集計する。
大したものじゃないけど、自分で作ったから仕組みを全部理解しているというのが大きい。地方ならこれを提出するだけでも仕事もらえるんじゃないか。言い過ぎか。
この勉強が早速功を奏したかは分からないけど、今月の頭に某中堅製造業の契約社員になれることが決まった。
優秀なら学歴関係なく正社員になれるとのことで、本人のやる気があれば今の勉強を続けていこうと思っている。
たぶんしばらくは反復練習に充てることになるかな。
俺も勉強しなきゃ…