プログラミングをしてみよう。

今まで、複数の言語を同時並行で学んでいたんだけど、頭に入ってこなくて
継続することができなかった。だから、1つ1つ終わりまで学んで成果物ができる
くらいまでは1つの言語で学ぼうと思います(遅いw)

「いいね!」 2

TEMPLATEの意味がわからない。

#include <stdio.h>

typedef char String[1024];

int main(void)
{
    typedef struct {
        String name;
        int hp;
        int attack;
    } Monster;


    Monster seiryu = { 
        "青龍",
        80,
        15
    };

    const String TEMPLATE = "%s: HP=%3d 攻撃力=%2d\n";

    printf(TEMPLATE, seiryu.name, seiryu.hp, seiryu.attack);


    return 0;
}
「いいね!」 1

1年ぶりにこのトピックに戻ってきました。

最近読んでる本は以下の本です。

新・明解Pythonで学ぶアルゴリズムとデータ構造

です。

アルゴリズムをかじりたくて、いろいろ読んではみたのですが、わかりやすい系の本だと表面上の知識しか身につかない気がして、教科書っぽいこの本で勉強することにしました。

章末問題は、実際の基本情報技術者試験から出題されているので、そういう資格に興味のある人の参考書としても役立ちそうです。

章末問題は答えしか載ってないので、解説がほしいひとは過去問サイト(古いのは載ってないみたいですが)を参考にするとよいでしょう。

pythonがわからない人は、同著者の入門書があるのですが、レビューを見ていると、他の言語を学んだ人でないとちょっと難しいということなので、簡単な入門書を探してみましょう。

「いいね!」 1

TEMPLATEっていう名前のただの変数ですねー

ちなみにString型なので文字列って意味ですかね

ありがとうです。文字の意味が理解できていなかった!

「いいね!」 1

1年と半年前に購入して、ちまちま読んでいたtypescript入門本をようやく読み終えた。去年はいろいろあって、(という定番のいいわけ)本を読むどころではなかったので、時間がようやくできた、今ごろになって、ようやく読み終えたしだいである。

kindleアンリミテッドで読めるtypescript本(自費出版みたいなやつ)を前に何冊か読んだことがあるので、そんなに難しくは感じられなかったのだけど、(むしろ簡単すぎて、お金がもったいなかったかなぁ・・と思ったほど)javascriptがよくわかってない人が読むと、つまづく可能性が高そうな気がする。

なので、javascriptをまったく知らない人は、javascriptの入門書をまず読んだほうがいいと思う。

sveltっていうフレームワークがけっこういい感じで、いちおうtypescriptも使えるみたいで、これでなんとかプログラミングを実際にやってみたいんだけど、基本的な型以外はあんまり使わなさそうな気がする。(というか、いろんな機能を覚える余裕が老化した脳みそには厳しい)まぁ、javascriptと併用できるんで、そのへんはあまり気にしない感じでやっていきたいものである。

っていうか、4年前に発売されたこの本(いちおう同じ会社というか執筆グループ)のほうが、詳しいし、値段も4分の1くらいで、コスパがいいような気がする。Kindleアンリミテッドなので、会員なら無料で読めるし。

アテクシも昔、読んでいたようで、読み直しているうちに、上の本に書いてなかった情報もきちんと書いてあって、上の本を読んでいるときに、あれ?こういう機能があったはずだけど、のってないなぁ、アテクシの勘違いだったのかしら?みたいな疑問がだいたい解消した。

この本は値段が安いだけあって、上の本と比べて、デザインは簡素だし、説明もjavascript(オブジェクト指向をある程度理解してないと難しそう)がかなりわかっていることを前提としているので、上の本よりもとっつきにくいことは確かである。

それでも、上の本はこの本よりかなり内容が薄いので(わかりやすくはある。説明に大幅にページ数を割いているので、値段が高い)お金の節約のためにも、上の本は図書館にあれば、借りてすませて、こちらを購入したほうがいいと思われる。

一人でアプリケーションを作るにはやっぱり限界がある。だからチーム開発がある。

「いいね!」 3

こういうクリエイター系のB型事業所はあるんだけど、だいたいは、イラストとかゲーム?(これはプログラミングとかあんのかしら)ブログラミング特化型B型事業所って見たことないんだよねぇ。

下請けで小さなプログラムを作る個人事業主むけの委託募集サイトはあるんだけど、ある程度のプログラミングスキルがないと、仕事を請け負えないので、単価は激減するけど(そもそもB型事業所の工賃は安いから問題ない(いや、問題はありまくりだが、それは置いておく))B型事業所でそういう仕事を引き受けて、さらに仕事を細分化して、利用者の人に仕事を与えるみたいな事業があってもよさそうなんだけど、見かけないのは、それなりのスキルのある人間は普通に働いたほうが儲かるので、しょぼい補助金もらってB型事業所を運営して、低スキルであまりもの覚えも良くない(アテクシも30年間くらいプログラミング本読んでるけど、一つのスキルを覚えるとすぐに新しいスキルを覚えないといけないいわけで、本読んでるだけでプログラムはやったことがない!(断言)って次はAIかよみたいな感じで・・・おじさん、プログラミングするまえに寿命がきちゃうよ・・・)利用者に仕事とはいえ、スキル習得の訓練をほどこすのは、まぁ、よほどの聖人以外はやらんだろうなぁ・・・と思ったりもするw

就業支援全般に言えることなんだけども、支援する職員の人って別に就業のプロというわけではないし、(福祉の資格があっても)障がい者雇用の担当者だったとかいう経歴の持ち主はあんまりいなさそうなわけで、なにがいいたいかというと、たしかに知的障がいや身体障がい者むけの就労支援はある程度の力仕事が必要だろうから、(精神で力仕事が必要そうな利用者の方は、利用者ではなく、患者として入院してそうなので)若い人を職員として採用しないといけないとは思うけども、精神系の人は、むしろ、ある程度の仕事の経験がって、世渡りの仕方とかを十分積んできた、定年退職した人なんかがいいように思える。(とはいえ、まだ時代的に昭和の感覚が強すぎる人が多いので、精神的な障がいに対する偏見やら気合でのりこえるみたいな根性論で対応する人がいそうなので、人選がかなりシビアになりそうだけど)

1年くらい前の本だけど、(去年の9月ごろ購入してまだ途中までしか読み終えてない)これが直近では、svelt本の決定版のような気がする。(というか、reactやらvueに比べて、書籍の数が少ないのよねぇ・・)

reactが難しすぎて、vueをさわってみるも、再度、挫折した(アテクシのような)人でもsveltならなんとかアプリケーションもどきを作れそうな希望を与えてくれます。

アプリは作りたいけど、プログラミングはしたくない・・・でもAIはよーわからんし、自分で一度は自作してみたいんや!(なんやねんこいつ・・)みたいなアテクシを救済してくれる福音の書です。

頭があまりよろしくないアテクシのおバカな質問でも、嫌な顔ひとつせず(むしろ :blush:で)答えてくれるcopilot先生が偉大すぎる。

const arrayLike = { length:3 }; const array = Array.from( arrayLike , e => 100 ); console.log( array ); // [ 100, 100, 100 ]

arrayLIke変数に入っている、{ length:3 }オブジェクトはlengthプロパティをひとつ持つだけなのに、なぜarry.from関数において、3回コールバック関数を作動させることができるのですか?

Copilot

webを使用しています

回答を生成しています…

Copilot が送信しました:

[Array.from() メソッドは、配列のような構造を持つオブジェクトを本物の配列に変換するために使用されます。このメソッドは、指定されたオブジェクトの length プロパティを読み取り、その回数だけコールバック関数を実行します。具体的には、arrayLike オブジェクトの length プロパティが 3 なので、コールバック関数が 3 回呼び出され、配列 [100, 100, 100] が生成されます。このように、Array.from() はオブジェクトを配列に変換する際に便利なメソッドです。

もしさらなる質問があればお知らせください! :blush:

アテクシは、array.from関数ならぬメソッドは、オブジェクトの中のプロパティを数えてから、ひとつずつ取り出して、コールバックしてるかと思ってたんだけど、lengthプロパティを読み取ってから、その回数分のプロパティを抽出する感じなのね。

配列にはlengthプロパティが標準装備されてるし、DOM要素オブジェクトもlengthが入ってるみたいだから、array.fromで配列化できていたわけか。

自前でオブジェクトを作って、それをarray.fromで配列化させようとしたら、きちんとlengthプロパティを入れないと、配列化されないみたいね。

と、ここでまた疑問が生じたので、copilot先生に再度質問をしてみた。

const arrayLike = { length:3 , 0 : 1 , 1 : 2 , 2 : 3 }; const array = Array.from( arrayLike , e => e * 2 ); console.log( array ); // [ 2, 4, 6 ]

上の式で、array.fromメソッドがarrayLikeオブジェクトを配列化していますが、コールバック関数のe引数にlengthプロパティは渡されないのですか?

Copilot

webを使用しています

回答を生成しています…

Copilot が送信しました:

[Array.from() メソッドは、反復可能オブジェクトや配列風オブジェクトから新しい配列を生成するために使用されます。このメソッドは、指定されたオブジェクトの length プロパティを読み取り、その回数だけコールバック関数を実行します。しかし、コールバック関数には length プロパティは渡されません。代わりに、配列風オブジェクトの各要素に対してコールバック関数が呼び出されます。具体的には、arrayLike オブジェクトの length プロパティが 3 なので、コールバック関数は 3 回呼び出され、配列 [2, 4, 6] が生成されます。

もしさらなる質問があればお知らせください! :blush:

す、、すばらしい!これ人間に聞いたら、「人の時間を奪ってんじゃねー」って蹴りを入れられるような、(他人にとっては)どうでもいい(仕事をすすめるにはどうでもいいが、javascriptの挙動を深く知るためにはここまでつっこむ必要があると思われる)質問でさえ、笑顔で答えてくれるcopilot先生が素晴らしくて涙が出てきました。 :sob:

言語によって、変数への代入方法が異なるので、これどうだったかなぁ?っていうのが頭に思い浮かんで、気になりすぎて、他のことが手につかなくなったときは、copilot先生にお尋ねすることにしている。

javascriptで let a,b,c=3; と入力したら、a,b,cのそれぞれの変数に3が入力されますか?

いいえ、そのコードはJavaScriptでは動作しません。JavaScriptでは、複数の変数に同じ値を一度に代入するためには、以下のように書く必要があります:

let a = 3, b = 3, c = 3;

このコードは、変数ab、そしてcそれぞれに値3を代入します。あるいは、次のように書くこともできます:

let a = b = c = 3;

このコードも、変数ab、そしてcそれぞれに値3を代入します。ただし、この方法はvarletconstのスコープの違いにより予期しない結果をもたらす可能性があるため、注意が必要です。安全な方を選ぶなら、最初の方法を推奨します。それぞれの変数に値を明示的に代入することで、意図しないグローバル変数の作成を避けることができます。以上、ご参考までに。:blush:

というか、なぜこの質問をしたくなったか?というと、sveltでちょっときになる記述があって、javascriptのオブジェクトを表記するときに{}をそのまま {a,b,c}みたいに書いてしまうと、{}がブロックと判定されて、うまく変数への入力にならず({a,b,c}={a:1,b:2,c:3,});

みたいに書く必要があるみたいなんだけど、({a,b,c}={a:1,b:2,c:3,});と表記した場合、a,b,cそれぞれにlet の変数宣言がかかるのか、varの変数宣言がかかるのか?という疑問があったわけね。

それをcopilotに尋ねたら、

javascriptで {a,b,c}={a:1,b:2,c:3,};と表記した場合、変数a,b,cの変数宣言はどうなりますか?

JavaScriptでは、{a, b, c} = {a:1, b:2, c:3};という表記はオブジェクトの分割代入と呼ばれるもので、オブジェクトから特定のプロパティを抽出してそれぞれの変数に代入します。

この場合、{a:1, b:2, c:3}というオブジェクトからabcというプロパティを抽出し、それぞれ同名の変数abcに代入します。つまり、このコードの後では、変数aの値は1bの値は2cの値は3となります。

ただし、このコードを実行する前に変数abcが宣言されていなければならない点に注意が必要です。つまり、以下のように事前に変数を宣言する必要があります:

let a, b, c;
{a, b, c} = {a:1, b:2, c:3};

このようにすると、変数abcはそれぞれ123という値になります。以上、ご参考までに。:blush:

その場合、{a,b,c}の{}部分はブロックと判断されないのですか?

いいえ、この場合{a, b, c}の部分はブロックとは判断されません。JavaScriptでは、{}は通常ブロックを示しますが、代入の文脈ではオブジェクトリテラルを示します。そして、=の左側にある{}はオブジェクトの分割代入を示します。

したがって、{a, b, c} = {a:1, b:2, c:3};というコードでは、{a, b, c}はブロックではなく、オブジェクトの分割代入の一部として解釈されます。

ただし、このような曖昧さを避けるためには、分割代入の式を括弧()で囲むことが推奨されます。例えば:

let a, b, c;
({a, b, c} = {a:1, b:2, c:3});

このようにすると、JavaScriptエンジンは{a, b, c}をブロックとしてではなく、分割代入の一部として正しく解釈します。以上、ご参考までに。:blush:

変数 a,b,cにletの変数宣言をせずに、 {a, b, c} = {a:1, b:2, c:3}; のように記述すると、エラーになりますか?

はい、その通りです。JavaScriptでは、変数を使用する前にvarlet、またはconstを使用して宣言する必要があります。したがって、{a, b, c} = {a:1, b:2, c:3};というコードを実行すると、abcが宣言されていないため、エラーが発生します。

以下のように、変数を宣言してから分割代入を行うとエラーは発生しません:

let a, b, c;
({a, b, c} = {a:1, b:2, c:3});

このコードでは、let a, b, c;で変数abcを宣言した後、({a, b, c} = {a:1, b:2, c:3});でオブジェクトの分割代入を行っています。以上、ご参考までに。:blush:

まとめると

・変数への代入

letやvarなどの変数宣言をしたものでないと、代入できない。

・オブジェクトの分割代入時の文頭におけるブロック判定について

let a, b, c;
{a, b, c} = {a:1, b:2, c:3};

と表記した場合、let宣言がなされているので、どうやらjavascriptは{}をブロックではなく、オブジェクトとみなすようであるが、

とあるように、表記のあいまいさを避ける意味では、()でくくったほうがよさげ。

というか、そもそも分割代入のやり方が2つあって、配列を使うやり方とオブジェクトを使うやり方があるわけよね。

アテクシは、配列を分割代入するやりかたでオブジェクトの分割代入はできないと考えていたのよね。つまり、オブジェクトの場合は、オブジェクトのプロパティ名と同じ変数名にしか代入できないのではないか?ということね。

copilotへの質問はこんな感じ。

オブジェクトの分割代入は、オブジェクトのプロパティ名の順番と、変数名側の順番が逆になっても、同じプロパティ名の変数名に入力されるのですか? たとえばこんなかんじです。

let a=1;
let b=2;

({ b, a} ={a,b});

はい、JavaScriptにおいてオブジェクトの分割代入は、オブジェクトのプロパティ名の順番と変数名側の順番が逆になっても、同じプロパティ名の変数名に正しく値が代入されます。具体的には、以下のようになります。

let a = 1;
let b = 2;

({ b, a } = { a, b });

console.log(a); // 2
console.log(b); // 1

このコードでは、ab の値が入れ替わっています。分割代入は、プロパティ名を指定してオブジェクトから値を抜き出すため、変数名の順番は関係ありません。

いやいやこれ、入れ替わったらあかんやろ。

copilotさんは信用ならないので、(手のひら返し)、geminiで詳しく調べてみると、

let a = 1;
let b = 2;

({ b,a } = { a, b });

とした場合、オブジェクト名と変数名の値は同じになりますか?

ご提示のコード例の場合、オブジェクト名と変数名の値は 同じになりません

オブジェクト分割代入において、オブジェクト内のプロパティ名と変数名を一致させるかどうかは、バインドパターンの書き方によって決まります。

1. プロパティ名と変数名を一致させる場合

let a = 1;
let b = 2;

({ a, b } = { a, b });

この場合、{ a, b } オブジェクトのプロパティ a の値は変数 a に、プロパティ b の値は変数 b にそれぞれ代入されます。つまり、以下のコードと同等の処理となります。

a = 1;
b = 2;

2. プロパティ名と変数名を一致させない場合

let a = 1;
let b = 2;

({ b, a } = { a, b });

この場合、{ a, b } オブジェクトのプロパティ a の値は変数 b に、プロパティ b の値は変数 a にそれぞれ代入されます。つまり、以下のコードとは の処理となります。

a = 2;
b = 1;

ご提示のコード例では、{ b, a } と記述しているため、2. のパターンとなり、a と b の値が入れ替わります

オブジェクト分割代入を用いる際は、バインドパターンの書き方によって代入される変数が異なることに注意が必要です。意図した処理を実行できるように、正しく記述するようにしましょう。

まとめ

よーするに、オブジェクト分割代入の場合でも、プロパティ名の順番と変数名の順番を同じにしておかないと、配列分割代入と同じようにオブジェクト側の値が順番に変数へ代入されるということなのかしら?(プロパティ名と変数名を一致させることで、オブジェクト内で計算した値を外側に出すときに、同じ名前で出せるので、便利ではあるけど、順番を気にしなければならないのであれば、配列で出すのと変わらんような気がしないでもない)