だぶるばいせっぷす 新館

ホワイトカラーではないブルーカラーからの視点

【プログラミング】 python奮闘記 その16 ~リスト

この記事は、現在進行系でゼロからプログラミングを勉強している私が、勉強の一環として進展状況をアウトプットする目的で投稿しています。
その為、間違った記述や無駄な作業が結構多めとなっていますが、『それでも良いから一緒に勉強している気になりたい』という方に向けて書いていますので、予め御了承ください。

前回は、ラジオボタンを作ることで、ユーザーに4つの選択肢を選んでもらって、それを計算に反映させるというところまで書きました。
これによって、今まで書いたif文に更に条件を付け加えることによって、ユーザーの指定した回答にたどり着けるように出来たのですが…
この方法だと、書く量も多い、まぁこれは、同じ様な文なのでコピペでも良いわけですが、そもそも同じ様な文章を書かなければならないってだけで、プログラムとして変。
また、訂正するときにかなりの箇所を訂正しなければならない為、大変。 どちらにしても、もっと良い方法があるだろうというところで終わりました。
kimniy8.hatenablog.com

という事で今回は、この事を解決するために、新たな技術を導入したいと思います。
それが、『リスト』です。

入門書などを読むと、かなり最初の方に書いてあるリストなのですが、そこで紹介されている例を見ても、私のような素人にはイマイチ、便利機能に思えなかったんですよね。
ただ、実際にプログラムを書いてみると、『この機能を利用すれば、もっとコンパクトに書けるんじゃ?』と思い、今回、導入してみることにしました。

その前に、私と同じように、pythonを勉強中の方に向けて、簡単なリストの説明を書いていきます。

リストとは、簡単にいうと、一つの変数に複数の値を覚えさせることが出来る機能です。
例えば、『a=3』とした場合に、aに3が代入されるというのは、簡単に理解できますよね。
一つの変数に対して一つの数字を当てはめるというのは、理解も簡単だし使い方も容易に想像できると思います。

でも、プログラムでは、一つの変数に複数の値をもたせることが出来て、それを可能にするのがリストなんです。
例えば

a=[3, 5, 6, 7, 1]

といった感じで代入する事で、この例の場合は5つの数字を変数『a』に覚えさせることが出来ます。
では、『値を呼び出すときはどうするの?』と疑問を持たれる方もいらっしゃるでしょう。
複数の値を覚えさせることが出来たとして、呼び出すときに5つ全部を一度に呼び出すことしか出来ないのであれば、リストの使い勝手は激減します。

でも安心してください、リストは、覚えさせた数字を1つ1つ呼び出すことが可能なんです。
その方法とは、こんな感じ

>>>a=[3, 5, 6, 7, 1]
>>>a
[3, 5, 6, 7, 1]
>>>a[2]
6

変数『a』に5つの数字を覚えさせて、そのまま『a』の値を聞くと、リスト内の全ての数字を返してくるのですが、『a[2]』といった感じで、指定することで、3番目の数字の6が返ってきます。
『え? 2番を指定したのに3番目が返ってくるの?』と思われる方もいらっしゃるでしょうが、リストの一番最初の番号は『0』なので、『2』は3番めに当たるんです。。
『0.1.2.3.4.』
その為、5つ目の数字を呼び出すためには『a[4]』としなければなりません。この辺りは慣れですね。

このリストには、3つの種類があります。

>>> b=[0,1,2,3,4,5]
>>> b[3]
3
>>> c=(6, 7, 8, 9, 0)
>>> c[2]
8
>>> d={"a":4,"b":2,"c":9}
>>> d["c"]
9

一番上がリストで、次がタプル()、最後が辞書{}です。
それぞれの違いを書いていくと、リストは後から書き換えが可能(ミュータブル)なもので、リストへの追加なども簡単にできて使い勝手が良いものです。
2つ目のタプル()は、中の要素の書き換えが出来ない(イミュータブル)ので、使い方が限定されます。 絶対に変えたくない値などを入れる時に使います。
この2つの呼び出し方は同じで、複数の値を代入した変数の横に
を書いて、中に呼び出したい数字を書くだけです。
注意点としては、タプルの呼び出しはc(2)ではなく、c[2]と[]で書くことです。

3つ目の辞書だけが少し違って、この辞書には順番という概念がありません。
そのかわり、2つの要素を結びつけて覚えさせることが可能となっています。
2つの値が『:』で分けられて、『,』で区切られていますが、『:』で区切られたほうがベアーで、左側の値がキーとなる値で、これを指定することでペアになっている左側の値を呼び出せます。

このリストですが、単純に複数の値を入れるだけではなく、リストの中にリストを入れることもできちゃったりします。

>>> h=[({"a":1,"b":3},{"c":4,"d":5}),(3,5),[4,6,7]]
>>> h[2][1]
6

一つのリストの中に、辞書やタプルといった異なるタイプのリストを保管することが出来るので、使い方によっては大幅に労力を短縮できそうです。
という事で次回は、早速、実装していこうと思います。

人手不足なのに低賃金は、何故なのか

ここ最近、やたらと『人手不足』を訴える声が、主にテレビから聞こえてくる。
テレビによると、現状の日本は『人手不足』なので、労働市場の需給関係が改善し、もう少し経てば給料も上がるし、トリクルダウンによる景気回復も起こるらしい。

日本に住む私としては、トリクルダウンでもなんでも起こって庶民の給料が増えて、景気回復してくれれば良いと思っています。
特に私が従事しているのは邦人観光客目当ての商売な為、日本に住むみんなに経済的に余裕が生まれて『旅行にでも行くか!』と思ってもらわないと困ってしまいます。

ただ、現状の日本の状態を冷静に観ると、今後給料が増えることも無いでしょうし、トリクルダウンなんて起こらないという悲しい現実が見えてきます。
という事で今回は、現状の人手不足の構造について考えていこうと思います。

簡単に結論から書くと、今の日本は供給過多の状態なので、どれだけ頑張っても…というより、労働者が頑張れば頑張るほどに、日本は貧しくなっていきます。
供給過多だから、価格競争になってモノやサービスの値段は上がらないし、頑張れば頑張るほど、過当競争が激化していくわけですから、労働環境は悪くなっていく。
つまり現在の日本は、資本主義のどん詰まりにいるって事で、発想を根本的に変えない限り、自体を好転させることは無理でしょう。

具体的にみていくと、例えば、超絶ブラックと言われている建設業。
東北の震災の復興需要に、消費税増税前の駆け込み需要。オリンピック開催によるホテル建築や、団塊世代がこの世から卒業する事による節税対策のマンション建設など、様々な要因が一度に重なって、今の建設需要はとんでもないことになっています。
ここまで需要が旺盛なのであれば、建設業者は強気に出られるわけで、本来であれば、労働環境は改善してブラック体質は改善されていないとおかしいです。
何故なら、発注元から無理難題を突きつけられた場合、他に好条件の仕事があるのであれば、『ウチは手を引くから、他に頼んで』といえば良いだけなので、条件が良くなることは有っても悪くなる事はありません。

しかし実際にはどうなのかというと、ここまで需要が重なっているにも関わらず、依然、発注側の方が声が大きく、その要望がそのまま通る形になり、建設業の労働環境はブラックなまま。
何故、ブラックなままなのかというと、単純に、建設業者の数が多すぎるから。
多すぎる為に過当競争になり、利益が上がらないので給料も上がらない。 工期の短縮を迫られれば、弱い立場の建設業は受け入れるしかなくなり、長時間労働になってしまう。
考えられる全ての需要がこの数年に一気に集まっていて、この状況なので、当然、需要が一巡するオリンピック後は、更に待遇は悪くなる。

仕事の量に対して建設業者の数が圧倒的に多い。会社運営には、最低限の人数が必要。
この条件が重なると、企業が出す求人としては『低賃金で長時間働いてくれる人募集!』にならざるをえない為、人材募集が多い割に条件が悪いなんてことが起こってしまう。

別にこれは、建設業に限った話ではありません。
例えば最近、お値段据え置きで内容量が少なくなったとして話題の食料品ですが、日本では毎年2000万トン近い食品を廃棄しています。
日本は食料自給率が低いと言われていて、海外から約6000万トンの食料を輸入しているようですが、その3分の1に当たる量を捨てています。

この数字だけ見てもわかりますが、食料の場合も単純に、供給量が多すぎる事が原因で、食品メーカーが儲からないという事態に陥っています。
儲からないにも関わらず、円安やエネルギー価格の高騰により、輸入物価そのものが上がってしまったので、値上げしなければならないけれども、値上げすると他社製品を選ばれてしまう可能性がある為、値段据え置きでモノを小さくするという方法を取らなければならなかったのでしょう。

食料品といえば、その中でも『魚』の乱獲の問題を、ここ最近、頻繁に目にするようになりました。
乱獲によって魚の量が減少し、下手をすれば絶滅する種が出てくるなんて話も耳にしますよね。『鰻』の問題などが有名ですね。
wedge.ismedia.jp

ここでも一番の原因は魚の取り過ぎ、つまりは供給過剰です。
中学ぐらいで習う経済の基本ですが、価格というのは需要と供給が交わったところで成立します。
つまり、需要が伸びない状態で供給だけがのびるとどうなるのかというと、価格が下落していきます。

価格が下落した状態で儲けを出そうと思う場合、本来であれば、持続可能性を考えた上で、漁獲量の制限などを行って、必要以上の価格の下落を無くす方向で進めるのが理想的です。
しかし日本の漁業は、単価が下がった分を漁獲量を増やす事で補っちゃったんですよね。
これにより、市場価格は更に下落し、安定した利益を得るためには、更に漁獲量を増やさなければならないという負のスパイラルに陥ってしまった。

魚というのは、ゲームのように無限にリスポーンされるわけではないので、繁殖する量よりも乱獲する量が上回ってしまった時点で、魚という種の数は減少していきます。
結果として、私達は安い値段で魚を食べられるようにはなりましたが、魚そのものが絶滅する可能性が出てきました。
こういう状態に陥ってしまうと、漁獲量を制限せざるをえなくなる為、漁師の収入は少なくなって、手間の割の儲けが出ない状況に追いやられます。
この状態で人手が足りなくなったとしても、そもそも利益が出ていないので、人件費に回せるお金はない為、人手が足りなけれども金は出せないという状態になります。

こういった現象は、全ての産業に言えることです。
そして、全産業でこのようなことが起こっている場合、働いている従業員には遊びで使えるような余裕なんてありません。

飲食業がブラック体質とよく言われますが、余裕のない人間が一番最初に削るのって、外食や呑み代ですよね。
1杯800円のショットバーに通うよりも、立ち呑み屋で呑むほうが安いし、立ち呑み屋よりも、吉野家の方が安いかもしれない。
そして吉野家よりも、家でストロング系を呑んでいる方が安い。

こんな人達を相手にしていくわけですから、コストが極限まで切り詰めないといけないので、職場環境は悪化する。
そして、家呑みを選択する人が増えれば増える程、飲食店という存在が供給過多になっていくので、その中で更に過当競争が進んでいく。

別の話題でいうと、少し前にTwitter界隈で、『企業が絵師を買い叩き過ぎて、単価が下がりすぎている!』なんて言説が流れていましたが、これも同じ。
単純に、絵の需要に対して絵師が多すぎるので、買い叩かれているだけの話。
最近はスマホゲーの乱立で(これも供給過多)絵の需要が高まっているなんて言われているけれども、これは、絵師が多すぎて絵の単価が下がりまくってるから、気軽に開発できるようになってるだけで、イラストを高い値段で発注してまで作ろうなんて思ってないんでしょう。
産業革命で繊維製造が自動化されたことによって供給過多になり、価格が暴落したから、用途が増えて需要が増えたのと同じで、単価の下落が需要を呼んでいるだけでしょう。

この様に、全産業で供給過多の状態にある為、経済や労働環境の事を考えると、多くの企業が市場から撤退しないと、本当の意味での改善にはつながらないでしょう。
一部では、後継者不足で127万社が廃業か?なんていわれていますが、単純に供給過多で儲からない為、子供のことを考えると継がせたくないと考える人が多いだけでしょう。
diamond.jp

だって、冷静になって考えてみてくださいよ。
実家が工場で、通勤しなくても仕事場に行く事ができて、その上、月の給料が50万円もらえるとなれば、事業を継ぎたい!と考える人間は大多数でしょう。
しかし実際は、事業は黒字だけれども利益はほぼ無く、実際の生活は年金でやっているなんてところが多いのではないでしょうか。
本当に儲かっていたり、他にはない素晴らしい技術を持っているのであれば、たとえ後継者がなかったとしても、事業の買い手はいくらでも存在します。


こうして考えると、日本は、全く人手不足ではありませんよね。
需要に対して企業の数が多すぎるというのが問題で、適正水準まで企業が淘汰されれば、当然、大量の失業者が出るわけですから、その人員を足りない分野に移動させることができれば、人手不足は解消します、むしろ人余りの可能性すら出てきます。
なんぜ、先ほど紹介した記事によると、大廃業時代の到来によって、650万人が職を失うそうですからね。

今は、団塊の世代の大量離職によって企業の人材が減る一方で、少子化によって新入社員の人数が減っている。
特に日本は、新卒一括採用が文化になっているので、新卒の取り合いになっていて、一時的に求人倍率が改善して人手不足といわれていますが、先ほどから書いている通り、そもそもが供給過多の社会なので、人手不足は『まやかし』と言わざるをえないと思います。

【プログラミング】 python奮闘記 その15 ~Radiobutton導入

この記事は、現在進行系でゼロからプログラミングを勉強している私が、勉強の一環として進展状況をアウトプットする目的で投稿しています。
その為、間違った記述や無駄な作業が結構多めとなっていますが、『それでも良いから一緒に勉強している気になりたい』という方に向けて書いていますので、予め御了承ください。
kimniy8.hatenablog.com

前回は、フレームを利用してレイアウトを簡単にする事に挑戦してみました。
次は、ラジオボタンという機能を実装していきたいと思います。

その前に、改めて『ラジオボタン』を実装したい理由を書いておくと、ラジオボタンというのは、複数の選択肢の中から1つだけを選択できるという道具です。
つの丸があって、どれか一つをマウスでクリックして選択する事が出来るという、『あれ』ですね。
似たようなものにチェックボックスというのもありますが、こちらは複数回答が可能な為、今回のものには使いにくい。
前に使ったボタン(Button)を使っても良いのですが、これを作るぐらいならラジオボタンを導入したほうが楽そうということで、ラジオボタンにしました。

導入方法は簡単で、tkinterにRadiobuttonというのがあるので、それを利用して作ります。
ここで重要なのが、最初に値を取るための変数を定義して置かなければならないとう事です。
というのもRadiobuttnは、この変数によってグループを見分けている為、これを設定しておかないと、複数のRadiobuttonを設置できないんですね。

という事で早速、変数を作っていこうと思います。

frame5 = tkinter.Frame(root)
radio1_val = tkinter.IntVar()
radio1_val.set(0)
paper_a = tkinter.Radiobutton(frame5, text = "紙【a】", variable = radio1_val, value = 0)
paper_a.pack(side = tkinter.LEFT)
paper_b = tkinter.Radiobutton(frame5, text = "紙【b】", variable = radio1_val, value = 1)
paper_b.pack(side = tkinter.LEFT)

frame6 = tkinter.Frame(root)
radio2_val = tkinter.IntVar()
radio2_val.set(0)
paper_a_f = tkinter.Radiobutton(frame6, text = "紙【a】", variable = radio2_val, value = 0)
paper_a_f.pack(side = tkinter.LEFT)
paper_b_f = tkinter.Radiobutton(frame6, text = "紙【b】", variable = radio2_val, value = 1)
paper_b_f.pack(side = tkinter.LEFT)

スペースの関係で、蓋と身の『紙【a】【b】』しか書いてませんが、実際にはa~dまで書いてます。
『radio1_val』と『radio2_val』という2つの変数を作って、tkinterの数値(int)の値(val)を代入しています。
そして、それぞれの初期値として、『0』をセットしています。

次に、paper_a b…といった感じでラジオボタンの変数を作り、tkinterのRadiobuttonを代入しています。
Radiobuttonの引数として、『表示させるフレーム』『ボタンに表示させる名前(text)』『ラジオボタンのグループ名(variable)』『ボタンが押されたときに取得する値』を入れていきます。
この他にもオプションが有るようですが、今回は使わないので書きません。 気になる人は調べてみてください。
注意点としては、frame5と6のラジオボタンの引数『variable』の値が変わっているというところです。
ここを変えずに同じ値を設定してしまうと、同じ『value』値のボタンが連動して反応してしまいます。
今回は端折って紙【a】【b】しか書いていないので、『value』値は0と1だけですが、本来はa~dまであるので、value値も0~3になります。

これで、ラジオボタンの設置が完了しました。
後は、ラジオボタンが押された際の値を取得して、それを計算結果に反映させるだけです。
という事で早速、関数内にラジオボタンの値を取得する為の変数を書きます。

    # ラジオボタンの値取得
    radio1 = radio1_val.get()
    radio2 = radio2_val.get()

前に『Entry』からget()で値を取り出したときは、整数値として取り扱うためにint()でくくりましたが、今回は、radio1_valの値は『tkinter.IntVar()』によって整数値として取り扱うと指定しているので、int()と書く必要はありません。

これで、ユーザーの選択がラジオボタンによって取得できる。
後はプログラムとしては、そのユーザーの選択を計算式に組み込んで、結果として反映するだけ。
これは、if文を使うことで可能な為、関数内のボール紙のカテゴリーわけをしている部分に、更にif文を追加して、書いていくだけ。

ただ、今までと同じように書いていくと、ものすごく長くなりますよね…
というのも、今までのif文はこんな感じで書いていましたから

    # 身のボール紙の価格
    if cardboard_a:
        cardboard_price["text"] = "ボール紙の価格" + str(40) + "円"
    elif cardboard_b:
        cardboard_price["text"] = "ボール紙の価格" + str(50) + "円"

このif文の下に、更に4行のif文、を書いていくのはかなり疲れる…

    # 身のボール紙の価格
    if cardboard_a:
        cardboard_price["text"] = "ボール紙の価格" + str(40) + "円"
        if radio1 == 0:
        処理1…       
        elif radio1 == 1:
    処理2…

というか、この方式の場合、何らかの理由で単価を変えなければならない場合は、全部の箇所を訂正しなければならない。
プログラムって、自分でやることが面倒くさいことを変わりにコンピューターにやらせることなのに、その訂正作業で同じことをやらされるのって、なんか違う気がします。。
という事で、この単価の部分を書き直そうと思いますが、それはまた次回に。

【ネタバレ感想・考察】Detroit: Become Human (デトロイト ビカム ヒューマン)【PS4】

今回の投稿は、ゲームをクリアーした上での感想となっていますので、ネタバレを多分に含みます。
その為、まだプレイされていない方で情報を入れずにプレイしたいと思われている方は、先にプレイしてから読まれることをおすすめします。

前置きが終わったので、早速、本題に入っていきましょう。
今回、取り扱うゲームは、『Detroit: Become Human (デトロイト ビカム ヒューマン)』です。


      

この作品は、ゲームというよりも、自分で選択肢を選んで物語を作っていくタイプの映像作品といっても良いかもしれません。
ゲームシステム的に一番近い作品としては、『ライフ イズ ストレンジ』とかでしょうかね。
様々な場面で選択肢を迫られて、その選択肢によって、物語の結末が大きく変わっていく。
ゲームの製作者によって、『ベストエンド』が決められているわけではないので、様々に変化していく物語の中で、自分が一番納得できるストーリーを探していくゲームといえば良いのかもしれませんね。

ゲームの大まかなストーリーは、今から20年後の2038年のデトロイトが舞台となって繰り広げられる物語。
人が生み出してきた技術が進化し、人類は、人間と同等かそれ以上の能力を持つ自立式のアンドロイドの開発に成功した近未来が舞台となっています。
このアンドロイドの性能は素晴らしく、バッテリーは年単位でもち、多少の故障なら自己診断機能によって破損部分を自分で治せる。
足りない部品は、ネット経由で自分で発注まで出来る代物。 当然、食べ物も水分もなく持続して動くことが出来るため、肉体的には完全に人類の上位互換となる存在です。
しかも、ここまで凄い性能にも関わらず、お値段はなんと、ミドルモデルでも8000ドル程度。

では、そんな便利な製品が開発された未来は、さぞかし輝かしいものとなっている…と思いきや、実はそうでもない。
今の為替相場換算で、日本円で100万円以下で、こんな素晴らしい製品が発売されたら、真っ先に購入を検討するのは、庶民ではなく資産階級の人間です。
今まで、一人の人間を雇うのに1年で300万円も払い、その上、昇給までする。

そんな『人間』を1人、1年間雇う金があれば、3体のアンドロイドを買うことが出来ます。
アンドロイドは1度買えば、給料無しで働いてくれるうえ、故障しても自分で自分を治すことも可能。

こんな状態になれば、当然のように起こるのが、失業率の大幅な増加です。
今現在でも、『20年後になくなる仕事』なんてものが頻繁に発表されていますが、こんなアンドロイドが発売されたら、単純労働の全てがアンドロイドに取って代わられます。
アンドロイドを制御できる程のAI技術も開発されているわけですから、中途半端なエンジニアの仕事も、当然の様に仕事を奪われる。

結果として、大多数の人たちが職を失う事となり、その怒りは、アンドロイド達に向けられる事になります。産業革命時代のライダト運動の様に。
また人間というのは社会を作って生きていく生き物なので、職もなく、誰からも必要とされない状態では生きていく事は困難です。
誰からも必要とされない人達は、承認を得ることが出来ない為に欲求不満になり、その欲求を埋めるかのように、『レッドアイス』という名のドラッグが大流行し、治安はますます悪化。

『レッドアイス』の原材料は、アンドロイドにとって血液の役割を果たす『ブルーブラッド』の原材料だったりで、アンドロイドによって社会から追われた人達がアンドロイドが動くのに絶対に必要な物質を快楽の為に消費するという、なんとも言えない状況だったり。
また、ブルーブラッドの製造に欠かせないシリウムという物質は、北極圏に大量に眠っているようで、アンドロイド技術が完成すると同時に、領土権闘いが勃発。
世界は、第三次世界大戦に突入する勢いだったりします。

アンドロイドの登場によって、貧富の差はますます拡大し、一部の人達の生活は確実に悪化したわけですが、そんな貧困層の人達が、アンドロイドを購入して家事をやらせているという矛盾。
また、社会に溶け込めるように人間そっくりに作られたアンドロイドは、人間に出来る事は全て出来る上に、文句も言わずに人間の機嫌を取ってくれる為、アンドロイドをパートナーとして選ぶ人が続出。
パートナーだけならまだしも、学校の費用や食費がいらずに、寂しさを紛らわせてくれるという事で、子供タイプのアンドロイドも発売され、少子化がますます進んで人類に未来は無い状態。

このゲームでは、こんな環境下で、アンドロイドが自我に目覚め始める事で生まれるドラマを自分の意志を反映させながら体験できます。

登場人物は3人で、一人は、『変異体』と呼ばれる自我に目覚めたアンドロイドを見つけ出して逮捕する捜査官タイプのアンドロイド『コナー』

2人目は、アンドロイドの登場で社会からはじき出され、所謂『毒親』と呼ばれるシングルファーザーに購入された、家事代行アンドロイド『カーラ』

3人目は、大富豪の画家『カール』に、身辺の世話をする為に購入されるも、道具としてこき使われるわけでもなく、息子の様に人間と差別されること無く扱われている『マーカス』

最初はバラバラに展開していく、それぞれのドラマ。それが、最終的に絡み合って一つのストーリーになっていく展開は、よくあるといえばそうですが、実際にプレイしてストーリーに没入している状態で体験すると、かなり凄いものがありました。

【此処から先は、かなり深刻なネタバレを含みますので、読むかどうかを慎重に考えて行動してください】


自我を持ったアンドロイドというテーマは、『アンドロイドは電気羊の夢をみるか』や『攻殻機動隊』などで語られているし、アンドロイドと奴隷を結びつける発送は、Fallout4などでもテーマになっていたりしますから、このゲームも話も、使い古された話と言われればそうなのですが、この手の話が個人的に大好きなせいもあって、かなり楽しめた作品でした。
わたし自身が、何故、この様な種類の作品が好きなのかというと、自我を持つアンドロイドというテーマには、ほぼ確実に、人間とは何なのかという疑問が含まれているからです。

作品の中では、アンドロイドだというだけで暴行を加えられたり、差別されたり、見下されるということが普通に起こっています。
当然といえば当然ですよね。 なぜなら、アンドロイドはショップで販売されている商品に過ぎませんし、消費者は生活を豊かにする道具として商品を購入しているだけ。
今現在の技術で例えるなら、自動掃除機ロボットに感情移入をするのか?っていう話。仮に、『自動掃除機に人権を! 彼らには正統な報酬を払うべきだ!』って訴える人がいたら、変な人に思われるでしょう。

ただ、面白いのが、これがアンドロイドにまで進化すると、『彼らにも人権を!』『アンドロイドにも愛情を感じる可能性がある。』と答える人が過半数を超える。
何故、過半数を超えるのかというと、このゲームは、クリアー後にアンケートが開始され、それに答えることで、何%の人間がどんな回答をしたのかというのがわかるようになっているんです。
当然、このゲームをクリアーした人が対象になっているアンケートですから、アンドロイドに対して好意的なバイアスがかかっている訳ですが、そんな人達でさえ、『自動販売機と結婚したい』と考える人は少ないでしょう。

では、このアンケートでアンドロイドに好印象を持った人は、何処から、アンドロイドに人間性を見出すことになるのかということです。
外見が似ていたら? コミュニケーションが取れたら? 
どのレベルをクリアーしたら人間扱いするのかというのは、どのレベルから人間と呼ぶのかというのと同じ事となり、機械の定義を明確にする事が、そのまま人間の定義になるんですよね。

ここで、『人間とアンドロイドの定義なんて簡単だろ!アンドロイドは機械なんだから!』と思われる方も多いと思います。
では、人間と機械の違いは何なのでしょうか?
人間の五感で得られた情報は、電気信号に変えられて脳に伝達され、それが感覚として脳内で再生され、その再生によって脳内で電気信号が発せられて、感情という反応をしているに過ぎません。
アンドロイドと人間の違いは、素材がタンパク質とミネラルか、鉄とプラスチックかというぐらいの差しか無い。

魂の様な霊的なものを想像している方もいらっしゃるかもしれませんが、そもそも、そんなものは科学で証明されていませんし、存在を証明することも出来ません。
デカルト的に『我思う故に我あり!』と思い込むことしか出来ません。また、機械として作られたアンドロイドも、自身の中に魂の存在を主張するかもしれませんが、人間に魂があることを主張する人達は、それを完全に否定することは出来ません。
こういう事を改めて考えさせられるから、こういう作品って好きなんですよね。

この作品では、3つのケースを通して、この事を考えさせられます。
最初に操作するコナーは、アンドロイドに偏見を持つ人間の捜査官・ハンクの相棒になって事件を解決していくわけですが、自身が取る行動によって、ハンクが徐々に自分を受け入れてくれるようになっていくストーリー。
一方で、毒親・トッドのもとで家事を行うカーラ編では、トッドから人間の少女・アリスを守らなければという使命感から、購入者である毒親の命令を違反してアリスを守るという行動を取る。
トッドに恐怖や敵意といったマイナスの感情を持つ一方で、アリスには愛情を注ぐ母親の様な役割を演じるという複雑な心境を体験。
マーカス編では、人間に愛情を注がれながら生活をし、哲学や芸術を教えられるというベースを持つアンドロイドが、自分たちの権利を主張して革命を起こすというストーリーを体験します。

この中で、個人的に一番衝撃を受けたのが、カーラ編。 【ネタバレ注意!!!】


カーラは、虐待やDVを行うトッドから、娘のアリスを救う為に行動した結果、変異体となって自身の意思で動くようになるわけですが、物語の後半で、人間の少女だと思いこんでいたアリスが、アンドロイドである事が判明します。
このゲームをプレイして後半まで来た人間の多くは、『アンドロイドも人間も同じだし、差別は良くない。』と漠然と思いながらプレイしていたと思うのですが、アリスがアンドロイドだとわかった時点で、少なからずショックを受ける人が多いと思います。
これを書いている私も、そうでした。 軽い裏切りのようなものを感じてしまったのですが、この演出が、かなり凄いと言わざるをえません。

というのも、この演出は、『自分はアンドロイドにも人権を認めているし、人間と同じ様に接する』と表面的に演じている人間の本性をさらけ出させているからです。
本気で、『アンドロイドも人間も同じ』と思っているのであれば、アリスが人間であってもアンドロイドであっても、何も思わないし扱いを変えるなんて事も行いません。
しかし、少なからずショックを受けたということは、真相意識の中で、人間とアンドロイドとの間に差を設けているから、ショックを受けるわけです。

この、自身でも気が付いていない差別する気持ちを掘り起こさせる演出というのが、本当に凄かったです。。
ちなみにですが、この演出の直後に、アリスを抱き寄せるか突き放すかの選択肢がでるというね。 本当にやられました。

ネタバレ前回で書きましたが、まだ未プレイで、これを読んで興味を持った方は、是非、プレイしてもてください。
いろいろと考えさせられます。


      

【プログラミング】 python奮闘記 その14 ~フレームでまとめる

この記事は、現在進行系でゼロからプログラミングを勉強している私が、勉強の一環として進展状況をアウトプットする目的で投稿しています。
その為、間違った記述や無駄な作業が結構多めとなっていますが、『それでも良いから一緒に勉強している気になりたい』という方に向けて書いていますので、予め御了承ください。
kimniy8.hatenablog.com

前回までで、ユーザーの入力値を元にボール紙の大きさを計算し、それを元に価格を割り出すというところまで書きました。
次は、ボール紙の種類をベースに、追加で紙の種類を指定して、紙の値段を算出していこうと思います。
紙の種類は値段によって4種類に分けてあり、ボール紙の大きさが4種類なので、合計、16種類の値段があることになります。

カテゴリーが4つで、大きさはボール紙の大きさを流用するという事で、ユーザーには4種類の紙のカテゴリーを選択してもらう事で、価格が出るようにしたいと思います。
『4つの中から1つを選ぶ』というのは、tkinterの中のRadiobuttonというウィジェットを使う事でできそうなので、それを使っていこうと思いうのですが…

ここで、一つ問題が。
追加するウィジェットが多くなってきて、いちいち『place』でx,yを指定してられなくなってきました。
というのも、この方式で一つ一つ指定していくと、既にあるウィジェットの間に別のウィジェットを挿入しようと思うと、それより下の位置を全て修正しなければなりません。
そんな面倒くさいことはしたくないので、もっと簡単に配置する方法を考えていきます。

ウィジェットに対して位置を指定しておく方法は、実は『place』だけではなく、その他にも2つ存在します。
それが、『pack』と『grid』です。
『pack』は、何も指定しない状態で『()』として置くと、一番上の真ん中に表示されます。
複数のウィジェットを指定なしで『pack()』で置くと、プログラム上で一番上で指定したものが中央そろえで上に表示され、次のものはその下に配置されていきます。
ただ、引数として(side=LEFT)って感じで指定すると、左詰めて順番に横方向に並べていきます。
この他にも引数として指定できるものは沢山あるようですが、これだけわかれば大丈夫でしょう。気になる人は、自分で調べてみてください。

もう一つの『grid』は、ウィジェット表計算ソフトのように規則正しく並べてくれる。
引数として『column』(x軸方向)と『row』(y軸方向)を設定する事で、置く場所を指定することが出来ます。
例えば、grid(column=1,row=5, padx=5)って書くと、2列目の6行目という感じで置いてくれる(数字は1からではなく0から始まるから)
この2つを利用すると、今までのようにx,yを指定しなくても適当に配置するだけで自動で調整してくれるのでかなり便利。

ただ、この2つだけでは、自分が思い描いたとおりの配置は難しい…
という事で、別の機能をもう一つ使うことにします。それが、『Frame』です。
『Frame』は、境界線のようなもので、このフレイムを表示カテゴリーの数だけ作ってまとめておけば、レイアウトがより簡単に調整できるようになります。
例えるなら、『Frame』自体は空箱のようなもので、そこに、4つある入力欄をまとめて入れておく。
そして、プログラム上で『Frame』を配置すれば、好きな場所に入力欄をまとめたものを配置できる。

これを、さっきの『pack』や『grid』と組み合わせることで、自分の好きなレイアウトを簡単に実現することが出来て、その上、配置換えの手間も楽になります。
という事で早速、『Frame』を作っていきましょう。

現段階では、『見出し部分』『入力欄』『見積価格』『詳細内訳』があり、これに加えて『ラジオボタン』を追加したいので、フレームを5個作ります。
作り方は簡単で、こんな感じで記述します。

frame1 = tkinter.Frame(root)

分かりやすいように、変数に『frame1』として、tkinterのFrameを呼び出し、引数に(root)を当てます。
引数の『root』は、メインとなるWindowの名前でしたよね。そのWindow上にフレームを配置するという意味で、引数を当てています。
これを1~5まで作ります。

各場所は、分かりやすいように、それぞれのフレームに入れる要素の一番上に書いておけばいいと思います。
フレームを作ったら、それぞれのウィジェットをフレームに入れていくわけですが、入れ方というのは、それぞれのウィジェットの引数に、入れたいフレームの変数を入れるだけです。
例えばこんな感じ。

# テキスト表示
frame1 = tkinter.Frame(root)
heading = tkinter.Label(frame1, text="お見積り")
heading.pack()

ウィジェットの引数は、『表示させる場所』の受付を行っているので、その場所にそのまま書き込むだけです。
ちなみに何も書かなければ、『root』に表示されます。 デフォルト値としてメインウィンドウが指定してあるんでしょうね。

このフレームですが、フレーム自体もプログラムで位置を指定して設置するという指示をしないと、設置されません。
その為、画面表示の最後の方に、このように記述して配置を行います。

# Frame配置
frame1.pack()
frame3.pack()
frame2.pack()
frame5.pack()
frame4.pack()

1~6のフレームを作ったからと言って、1から順番に並べなければならないということはありません。
好きな順番で並べても大丈夫です。
今回は試していませんが、Frameの中にFrameを入れることも可能でしょうから、フレーム配置が多くなって配置が面倒になる場合などは、更に大きなFrameで括って整理するのも良いかもしれません。

という事で今回は、ウィジェットの位置を指定して配置する『pack』『grid』『Frame』について書いていきました。
次回は、ラジオボタンの設置について書いていこうと思います。
kimniy8.hatenablog.com

【Podcast #だぶるばいせっぷす 原稿 】第30回【ヒッピー】ティモシー・リアリー(6) ~ヒューマン・ビーイン

この投稿は、私が配信している Podcast番組『だぶるばいせっぷす ~思想と哲学史』で使用した原稿です。
放送内容は、私が理解した事を元に行っています。ご了承ください。
goo.gl

youtubeでも音声を公開しています。興味の有る方は、チャンネル登録お願い致します。
www.youtube.com

youtu.be

前回までで、長く続いてきたヒッピー回が終了しましたので、今回から、新しいテーマに移っていこうと思います。
今回から取り扱うテーマは、もう一度基本に戻って、『ギリシャ哲学』を最初から勉強していこうと思います。

最初に言っておきますと、このコンテンツ全体について言えることなのですが、このコンテンツは、私自身が勉強して理解した範囲の事を話しているに過ぎません。
現在進行系で勉強しながらのコンテンツ制作なので、読んでいない本も知らない情報も多く、中には、私自身が誤解して理解していることも多数あると思います。
もし気になった点や、興味のある部分が見つかった際は、自分自身で情報を集めて勉強することをおすすめします。

話を戻すと、このコンテンツでは、第2回からギリシャ哲学のソクラテスプラトンアリストテレスをテーマに取り上げましたが、その時は、もの凄く簡単にしか触れていませんでした。
その理由としましては、このコンテンツの立ち上げ当初は、文字で書いていたブログの延長としてやって行くつもりだったというのが大きいです。
文字で書くだけだと伝わらないようなニュアンスを、音声で読み上げることで伝えようとして始めたので、テーマも哲学や思想に関わるものだけではなく、日々思った事を話すようなコンテンツを想定して立ち上げたのですが…

アリストテレスをテーマに取り上げたくらいからですかね。
アリストテレスの主張を簡単に伝えることは難しいなと思い始め、もっと詳しく丁寧に説明しようと思って、哲学や思想に限定したコンテンツに方向転換したんです。
その為、それ以前のソクラテスプラトンについては、本当に簡単に触れただけ…
というより、私自身が勉強不足で知らない事が多過ぎた為に、簡単にしか紹介できませんでした。

今回からの回は、その部分について、私自身も改めて勉強しながら、作っていく回となります。
という事で今回は、哲学の祖とも呼ばれているソクラテス以前の話からしていこうと思います。

このコンテンツの第2回では、元々は世界のあり方は、神様が登場する神話などで説明していたという話をしました。
元々は小さな人々の集団が、それぞれの文化の中で神話を作り出していく。そして、時間の経過と共に共同体の人数が大きくなっていって、住む土地の広さが拡大していく。
そこら中に点在していた小さな集団が、同じように住む地域を拡大していくことで、違った神話を持つもの同士がふれあって、そこで違った価値観に出会う事で、相対主義が生まれたという話をしたんですが…

まず、その話は一旦、忘れてください。
完全に間違った話といったわけでは無いと思いますが、全体の話を大雑把に理解する為の話になるので、一旦忘れて、まっさらな気持ちで聴いてください。

前に説明した際には、物事を神話によって説明していたと言いましたが、果たして本当にそうなのかという事について考えていきます。
人間が意識を持って、自分自身の頭で考えるという行動を取れるようになって、一番最初に考え出すことって、神様の存在なんでしょうか?

私達のように、現代に生まれてきた人間については、小さな頃から『神様』という存在について、親から教えられます。
これは、神様や仏様、お天道さま、なんでも良いのですが、躾の一環として、悪いことをした際などに、同じことを繰り返さないようにと、人間以外の上位の存在から『罰が当てられる』と刷り込まれます。
こうして育った人間が、何らかの超常的な減少を目にしたときや、奇跡のような事が重なった際に、『神』といった概念が頭を過る事は不思議でもなんでもないのですが…

なんの刷り込みもなく、前提とした知識もなく、ただ、大自然の前に放り出された、意識を持った人間が、目の前に起こっていることを理解する為に、神といった存在を持ち出すのでしょうか?
おそらく、持ち出さないでしょう。 仮に、いきなり神という存在を定義して、その神を中心とした神話を作り出せる人間がいたとしたら、その人間は天才です。

大部分の普通の人間は、太陽が登ってくるのを目にして『神が最初に『光りあれ!』と言ったから太陽が出来て、その後6日間で世界を作り上げた!』なんて思いません。
普通に、眩しい存在が定期的に光を照らすとしか思いません。
山火事などが起こって火を目撃したとしても、『火の神が!』なんて思わずに、単純に熱いと思うでしょうし、夜でも明るいなとしか思わないでしょう。

『神』という存在は、その存在そのものが一種の発明で、その発明品である『神』という概念が無かった原始の世界では、あるがままをそのまま受け入れるという事しか行われていなかったと考えるのが自然でしょう。
つまり、あるがままをそのまま観察して、経験として蓄積していく、科学という分野が最初に生まれたと考える方が自然という事です。

太陽と呼ばれる、光り輝く丸い物体が一定期間ごとに登る事で、昼という状態が生まれる。
それが沈んで暗くなると、その変わりに、月や星々と言った別の物体が夜空に浮かび上がる。
適当に散りばめられていると思いこんでいた星々は、よくよく観察すると、その配置は毎回同じもので、時間と共に場所を移動していく。

パターン認識によって、大自然の中に法則性を見つけ出していくという事が最初に行われ、その知識は時間の経過とともに蓄えられていったんでしょう。
知識というのは、ある一定以上の蓄積によって、演繹的に発展していきます。
演繹とは、推測の様なものと捉えても良いと思います。
例えば数学の場合、足し算・引き算・掛け算・割り算を覚えると、頭の良い人であれば、そこから考えを応用して発展させて、方程式という概念を生み出せます。

このようにして、最初は科学というものが発展していきます。
ちなみに、この科学という言葉ですが、昔は哲学と呼ばれていました。 哲学は『考える事』全般を指す言葉だったので、全ての学問は哲学と呼ばれていたようです。

この哲学が発展していき、古代エジプトでは、天体の動きから暦を発明して、ナイル川の反乱を予測する事に使われるようになりました。
また、ナイル川が反乱することで周囲の田畑が水浸しになり、土地の境界線も消えてしまう為に、土地の大きさを正確に測る計算方法も開発されます。
古代ギリシャ人は、古代エジプト人の平面の計測方法を学んでギリシャに持ち帰り、それを応用する事で、四角形以外の面積も測れることを発見したようです。

この計算方法の応用・発展によってギリシャの数学は飛躍的に進歩したようです。
では、神という存在や神話は、どのようにして生まれたのでしょか。

これは私自身の推測も多く含まれますが、天文学の研究の派生として生まれていったんだと思います。
先程も言いましたが、夜空に輝く星々の配置というのは決まっていて、それを覚える事で、季節や方角と言った情報を知ることが出来ます。
これをパターン認識によって法則化したものが天文学の起源なんでしょうけれども、無数にある星の配置をそのまま覚える事って、かなり難しいですよね。

人は、無機質に羅列するものを覚える場合は、どうするでしょう。
元素記号でも、ルートの計算でも、歴史の年号でもそうですが、何のつながりもない記号や数字を覚える場合は、単純に丸暗記するよりも、語呂合わせ等によって一つのストーリーにしてしまう方が覚えやすいです。
Hの後にHe、Hが水素で、次がヘリウムと覚えて行くよりも、『すいへーりーべーぼくのふね』と覚える方が楽ですし、順番も間違いにくいですよね。

星座の場合も同じで、単純に星の配置を丸暗記するというのは効率も悪いし、間違いも起こりやすい。
それよりも、数個の星を1グループにして、それに絵を当てはめていって星座にして、その星座を役者に見立てて物語を展開させれば、物語を覚えるだけで、星の配置を覚えられる上に、間違いが起こりにくい。
こうして生み出された物語には、当然のように、パターン認識によって蓄えられた現実世界で起こる法則も、組み込まれていったんでしょう。
例えば、特定の星座が特定の位置に来る頃にナイル川が反乱するので、その星座の行動をナイル川の反乱と結びつけようといった具合にですね。
ナイル川の反乱という現実世界の出来事を物語に投影するわけですから、その星座が持つ役者としての性格も、そのように設定されて作られていきます。

こうして作られた物語は、印刷技術がまだない古代では、演劇などを通して、一般に娯楽として提供されて居たのでしょうし、親が子に語り継ぐなどして、代々と受け継がれていったんでしょう。
そして、代を重ねるごとに、科学や学問としての要素が徐々に削ぎ落とされていって、物語そのものに焦点が当たるようになり、最終的には神話として語り継がれていったんだと思います。
このようにして、一度、神話という概念が生まれると、科学と同じように、応用されて発展していきます。

神話そのものがメインになり、現実世界にも登場人物を祀る神殿などが作られるようになっていきます。
神殿が作られて、そこに聖地巡礼をしに来る観光客などが訪れるようになると、大都市と聖地を結ぶ道に飲食店や土産物店などが出来るようになって、経済的にも潤うようになってくる事もあるでしょう。
経済的に利益が得られるのであれば、辺鄙な場所にある地域なんかは、観光客を誘致するために、自分達の地域ゆかりの登場人物を神話に登場させて、観光収入を得ようと頑張る地域も出てくるでしょう。

また、神話は経済面だけでなく、人々のコミュニケーションも円滑にします。
今の私達もそうですが、日々、顔を合わすだけで、特に繋がりのない人間であったり、繋がりはあってコミュニケーションを取りたいけれども、何を話して良いのかわからないと言ったことはよくありますよね。
でも、そういった際でも、共通の話題があれば、話しかける際のハードルは一気に下がったりしますよね。

神話を共同体全体で共有するということは、共同体の中で価値観を共有するのに役立ちますし、コミュニケーションを円滑に進める為にも効率的です。

この神話の成り立ちがピンとこない場合は、この出来事を現代の出来事に当てはめてみると分かりやすいかもしれません。
例えば、数年前に『ゆるキャラブーム』というものがありましたが、あの時は、いろんな自治体がキャラクターを一斉に作って、地域を盛り上げようとしましたよね。

地域の宣伝としては、アニメなんかも貢献していたりします。
特定の地域を舞台としたアニメ作品が公開されると、そのアニメの舞台を聖地として、聖地巡礼などがファンの間で行われます。
名シーンに使われた場所などを特定し、その場所に行って同じ様なシチュエーションで写真を撮ったりといった行動を行う人達も少なからず存在します。
そういう人たちが増えていけば、一時的には、その地域の経済も潤うこともあるでしょう。

そして、2018年の今、現在進行形で作られている、世界レベルで有名な神話といえば、マーベル・シネマティック・ユニバースでしょう。
アイアンマンから始まったアメコミ映画は、その後、新たに誕生した数々のヒーローが登場するようになり、アベンジャーズシリーズではそれぞれのヒーローが共演します。
ここで描かれる物語は、単純な勧善懲悪のストーリーではなく、それぞれの立場の違う人達に寄り添った物語となっています。

最初のアイアンマンこそ、事業家として成功したチョイ悪オヤジが、自分のやってきた事を反省することで、正義に目覚めたヒーローになるという分かりやすいストーリーとなっていますが…
それ以降、ストーリーが派生してきて新たに登場するキャラクターたちは、アイアンマンとは別の正義を掲げて戦っていたりします。
そして、それぞれの観点の元に出来上がった価値観が衝突したりもします。

マーベル・シネマティック・ユニバースに登場するキャラクターは、敵も味方も含めて、神話に登場する神レベルの能力を持っているので…
そんなキャラクター達が、全力を出してそれぞれの正義の元に戦うわけですから、無力な人類は、ただただ、逃げ惑うことしか出来ません。
この構成というのは、昔に生み出された神話そのものですよね。

強大な力を持ったキャラクターが大量に生み出されて、そのキャラクターはそれぞれの信じる正義を遂行する為に行動します。
映画を見た人たちは、純粋な人であっても、捻くれた人であっても、サイコパスだったとしても、登場人物の誰かに感情移入できるように作られています。
映画の中で取り上げられる問題は、世の中で実際に起こりそうな問題を、より派手に、ドラマティックにした内容で、その問題に対して、それぞれの正義を持つキャラクターが、自分の信念の元に行動をしていく。

この様な、映画の中で語られる神話の物語を共有している人の間では、会話をする際のハードルがかなり引き下げられますよね。
だって、合計で百時間を超えるような時間を一つのシリーズに注ぎ込んでいる者同士なわけですから、その作品を観た感想を語り合うだけで、一気に打ち解けることが出来ます。
また、その登場人物の誰を支持するのかによって、その人の性格を短時間で深く知る事も可能になります。

これは、古代ギリシャで生み出された神話にも当てはまります。
星座から派生して生み出された神々というキャラクターは、ナイルの反乱や山火事、噴火など、人には不可能な天変地異を起こすことが可能だったりします。
神々には、それぞれに生い立ちが合って、それぞれの観点からみた正義を持っていて、そのように振る舞います。

これは、マーベル・シネマティック・ユニバースの構造と同じですよね。
また、神話という物語が発明されて、それが発展していって膨張していくと、神話を発展させる為のキャラ付けというのも生まれてきます。
ギリシャ神話でゼウスという最高神がやたらと浮気をして子供を作りまくるというキャラクターだったりするんですが、これも、物語としてのキャラ付けだったんでしょう。

既にある程度完成している神話に、新キャラを生み出して加えようと思うと、単独でいきなり出すよりも、何らかの有名キャラクターと紐づけて出す方が覚えてもらいやすいです。
有名なキャラクターであればある程、覚えてもらいやすくなる為、ゼウスの親族として登場させるという方法が多用されたんでしょう。
そして、それを正当化するように、ゼウスの性格も、そこら中で子供を作るキャラクターへと変貌していったんでしょう。

夫が浮気ばかりをすると、妻の性格もいじらざるを得ません。
物語というのは感情移入出来なければ面白さは半減してしまいますから、浮気をしまくるゼウスの妻のヘラは、嫉妬深いキャラクター像へと固定されていきます。
浮気グセがあるゼウスとヘラとの喧嘩は、現実世界で起こりうる何らかの不幸とリンクされて、神話というのは、より、具体性を増していき、物語として膨らんでいったのでしょう

これは、現代の神話であるマーベル・シネマティック・ユニバースでも同じなんでしょう。
例えば、スパイダーマンですが、スパイダーマンは単体でも有名なキャラクターですが、改めて、マーベル・シネマティック・ユニバースという神話に組み込もうと思うと、何らかのキャラクターと紐付けなければ孤立してしまいます。
結果としてMCUでは、アイアンマンがスポンサーになって、アベンジャーズ内での父親の代わりという役を演じることで、スパイダーマンが神話の中に自然と溶け込めるような環境が作られています。

また、世界大戦等の大きな事件も、その影にはヒーローに匹敵するような力を持ったヴィランが暗躍していたりしますし、そのヴィランとヒーローが対峙して対話することで、物語や歴史は進んでいきます。
今の時代は、この様なエンターテイメントがそのまま神話として定着することもないでしょうし、世界大戦の裏側にはヴィランが居たなんて本気で信じる人もあまり居ないとは思いますけれども…
今のように科学も教育も進んでおらず、情報の伝達手段も限られている古代では、このようにして作られていった神話が一般層を中心に鵜呑みにされていったんでしょう。

【ゲーム感想】ゴッド・オブ・ウォー (God of War) 【最高難易度】

今日は、少し前に『約束された神ゲー』という触れ込みで話題となった、『ゴッド・オブ・ウォー (God of War)』のプレイ感想となります。



      

ゴッド・オブ・ウォーといえば、PS2時代から続くシリーズで、全世代・全々世代のハードで出していたのにもかかわらず、超絶グラフィックで世間を驚かせていたアクションゲーム。
舞台となっているのはギリシャ神話で、元々はスパルタの戦士だったクレイトスが神となって…といった感じの話。
私自身は、『3』しかプレイしていないので、1と2の詳しい話は知らないのですが、ストーリー云々よりも、圧倒的なパワーで敵を蹂躙していく爽快なアクションが売りって感じのゲームだったように思えます。

そんなゴッド・オブ・ウォーが、ナンバリングをリセットして新たに発売したのが、今回、紹介する『ゴッド・オブ・ウォー』です。

タイトルを新たに一から作るということだからか、ゲームのシステムそのものも変わり、ダークソウル的な感じのアクションに変化。
カメラは基本的には主人公のクレイトスを斜め後ろから追いかける感じで固定されていて、自分もその現場にいるような感覚が味わえるようになっています。
また、今までの作品が基本的にクレイトス1人で動いていたのに対し、今回はアトレウスという自身の子供が一緒に行動する為、謎解きやパズル要素は、アンチャーテッドシリーズのようになっていたりもします。

プレイした感想としては、グラフィックは相変わらず、エグいくらいキレイ。。
ただ、グラフィックにかなりこだわり過ぎて、ゲームを動かすのに物凄いパワーがいるからなのでしょうか…
私はPS4Proでプレイしていたのですが、ファンが掃除機のような大きな音を建ててフル回転し続けていました。

その代わりといってはなんですが、エグいぐらいのグラフィックにもかかわらず、ロード時間がなくノーカットでゲームが進んでいくのは、純粋に凄いと思いました。
普通のゲームであれば、イベントや新マップと、事あるごとにロードが挟まってゲームが中断されるところですが、このゲームにはそれが無く、没入感が削がれること無くゲームが楽しめる作りになっています。

ストーリーは、これからやる方もいらっしゃると思うので、あまりネタバレにならないように書いていこうと思いますが、父と子の物語って感じで、結構楽しめました。
私は結婚もしておらず、当然のように子供もいないわけですが、仮に子供がいたら、こんな感じの感情を抱くのかなと思ったり。
若い世代がやれば、子供であるアトレウスの方に感情移入が出来ますし、世代を選ばずにストーリーを楽しめるという意味では、よく出来た作品だと思いました。
とはいっても、表現にグロがある為、ソフトの方で年齢制限がされているので、本当の子供は出来なかったりするんですけどね。

こんな感じで、客観的にゲームを振り返ってみると、『約束された神ゲー』の名に恥じない、よく出来たゲームだと思いましたが…

個人的には、手放しでベタ褒め出来るゲームなのかというと、そうとは言えないとも思いました。
という事で、ここからは個人的なプレイ感想を書いていこうと思います。

このゲームですが、買おうかどうかを迷っていたところ、Twitterで背中を押してくださる方がいて、その勧めもあって購入したんですよね。
その際に、『ゲームに慣れた方の場合は、難易度 『God of War』でやると良いですよ!と勧められたんですよ。

素直な私は、その助言をそのまま受け入れて、初プレイで最高難易度である『God of War』でプレイしたわけですが…
これが、本当に辛い。というか、バランス悪すぎ。
(以降、ちょっとした悪口になるわけですが、一応言っておきますと、クリアーはしましたからね。)
f:id:kimniy8:20180615205909j:plain
どれほど辛いのかというと、チュートリアルと思われる一番最初の敵が倒せない。
最初の先頭は、合計で10体程度のドラウグルを倒すというものだったと思いますが、これを全て倒すのが難しすぎる。
というのも、こちらは3回攻撃を食らうとゲームオーバーな訳ですが、チュートリアルで出てくるドラウグルは20発程度斬りつけないと倒すことが出来ない。

3体同時で出てこられたりすると、1体を仕留める前に他の敵が攻撃してきたりする。その為、絶えず敵を1方向にまとめるような操作を要求される。
これだけなら、まだ、マシ。 最高難易度で辛いのは、敵に傷を負わせた状態で一定時間放置すると、敵が力を溜めるモーションを行い、2秒程で覚醒状態に!
覚醒状態になると目が光り、体力が回復した上にレベルが1個上がり、スーパーアーマーが付与されます。。。

このゲームでは、敵と自キャラの相対レベルによって、ダメージ計算などがされているようで…
こっちは初めての戦闘でレベル1なのに対し、敵は覚醒でレベル2になるので、レベル差2倍。 ただでさえ硬い敵が、倍ほど固くなった上にスーパーアーマーで怯みなしですから、難しいというよりも理不尽。
一番最初の敵で困難ですから、かなりストレスが溜まる…

でもまぁ、根気強くやって慣れていけば、対処できそうな感じではあるので、何とか頑張ってプレイしていったわけですが…
チュートリアルのレベルがどんどん上っていく。。
まぁ、先に進めば進むほどに難しくなるのは頷けますが、とにかく、新しい敵や新たなアクションを覚えている段階のチュートリアルで、ヤバイぐらいの難易度になっていきます。

一番弱いはずのドラウグルは、一度に5体ぐらいが襲いかかってくるようになり、その上、飛び道具を撃つ敵も出現。
その上、ドラウグルの3倍ぐらい打たれ強くて、2倍ぐらい火力が高いヘビードラウグルなんかも乱入してくる。
ひどい場合には、レヴェナントと言われる、遠距離攻撃をしてくる上に近距離攻撃の火力も高く、こちらが攻撃してもテレポートで攻撃を避ける敵まで出てくる。。

一応言っておきますと、まだこの時点でチュートリアルですからね。
正直、チュートリアルの時点でかなり心が折れ、ゲームオーバーのなり過ぎて、心が完全に死んで、死んだ魚の様な目で無心でボタンを押し続ける。
半ば投げやりで、ゲームをしているのにストレスが溜まっていく状態まで追い込まれました。

ここまで読まれた方は、『最高難易度』なんて選ぶからでしょ。とツッコまれるでしょう。
確かのそのとおりです。 イージー・ノーマル・ハード・ゴッド・オブ・ウォーと選べる状態で最高難易度を選んだのは私ですし、その最高難易度が難しいと感じるなら、私のプレイレベルが低いだけ。
そう思いますよね。 私もそう思っていました。 中盤の後半まで進めるまでは。

最初の方でも、『バランス悪すぎ』と書きましたが、このゲーム、中盤以降、2回程、一気に難易度が下がるんです。
一つは、アトレウスが魔法の矢(雷)を覚えたタイミングで、もう一つが、主人公のクレイトスが2つ目の武器を手に入れた時。
この2つのタイミングで一気に難易度が下がる為、後半になるに連れて簡単になっていきます。

つまり、どういうことかというと、最高難易度でプレイした場合、一番難しいのはチュートリアルという事です。
逆にいえば、チュートリアルがクリアーできるのであれば、最後までクリアーするのは簡単だという事です。
厳密にいえば、ダークエルフとその王。それと、『マグニ』『モージ』という兄弟キャラクターがボスとして中盤に出てくるのですが、チュートリアル後の難関は、ダークエルフ関連とこの兄弟ぐらいで、他は手こずらずにクリアーできます。

ついでに言っておくと、この兄弟戦もバランス調整が最悪です。
2体動時に襲いかかってくるわけですが、最終形態では画面の7割ぐらいをカバーする上に1発喰らえば体力が9割減る合体攻撃を頻繁にしてきます。
この攻撃はガード不能なので、モーションを観た瞬間に範囲外に走って逃げなければその時点でゲームオーバー。
ちなみ、画面の7割ぐらいをカバーする範囲攻撃なので、マップの中心ぐらいで出されると回避が間に合わずに喰らいます。

ここで、『合体攻撃であれば、なんとかして1体を倒せば後は楽だよね。』って思うじゃないですか。。
そこが、バランス調整が悪い部分なんですが、その戦略はイージー~ハードまでなら片方ずつ倒すというのは有効な手段っぽいんですが、最高難易度で1体を先に倒すと、数秒のインターバルを開けて体力全回復するんです…
つまり、最高難易度でクリアーしようとする場合、同時撃破が条件になってるんです。 無茶苦茶です。
片一方が鎧着た上で盾持ちで、もう一方は裸で両手武器。 全面に出てくるのは裸の方なので、どうしても裸の兄貴のライフが先に削れてしまうわけですが、先に倒しちゃうと体力全回復するので、体力を調整しながら攻撃し続けなければなりません。
1発食らったら終わりの範囲攻撃を避けながら! コイツラを倒すだけで、数時間もかかってしまいました。

これが終わると、しばらくして2個めの武器が手に入るわけですが、此処から先はイージーモード。
攻撃ボタンを連打してるだけで敵が勝手に死んでいくので、今までの苦労が何だったのかというほどにスムーズに進んでいきます。
ラスボスも同様で、正直、チュートリアルのドラウグルの方が強い。

何度も書きますが、バランスが悪すぎるんですよ。

タイミングよくパリィを決めても優位になるわけでもなく、致命傷を与えられるわけでもない。
背後をとっても、スタン値が溜まりやすいぐらいで、一方的に有利になるわけでもなく、相変わらずザコ敵に数十発の攻撃を当て続けなければならない。
『最高難易度では死にゲーの雰囲気が味わえますよ!』って触れ込みでしたが、このゲームをやって改めて、『BLOOD BORN』の調整の素晴らしさが理解できました。

…とまぁ、最後の方はかなり愚痴っぽくなったわけですが、雰囲気やストーリーを味わうのが目的であれば、ノーマルでやればストレスも溜まること無く、楽しめる作品だと思います。
グラフィックなどは現時点でのPS4で最高峰だと思うので、それを観るだけでも価値のある作品だと思います。
      

【プログラミング】 python奮闘記 その13 ~さらなる条件分枝

この記事は、現在進行系でゼロからプログラミングを勉強している私が、勉強の一環として進展状況をアウトプットする目的で投稿しています。
その為、間違った記述や無駄な作業が結構多めとなっていますが、『それでも良いから一緒に勉強している気になりたい』という方に向けて書いていますので、予め御了承ください。
前回は、if文を追加することによって、入力された数値を元に大きさのカテゴリー分けをするところまで進みました。
今回は、その条件をもう少し細かく設定していきます。
kimniy8.hatenablog.com
前回のカテゴリー分けでは、大きく4つのカテゴリーに分けたわけですが、それでは、いろいろと問題も出てきます。
というのも、前回の分け方では、どんな小さな数値を入力したとしても、『cardboard_a』にカテゴライズされてしまいます。
しかし実際には、作るのが無理な大きさのものも存在します。
例えば、高さや幅が1mmしかないとかね。

という事で今回は、作るのが無理な大きさを指定された場合は、見積自体を断るという条件を設定していきます。
まずは、NG項目を考えていきます。

・高さが100mmを超える、または20mmを下回る
・幅または長さの1辺の長さが70mmを下回る
・必要なボール紙の大きさが、600mm且つ450mm以上の場合
思いつくのはこんな感じなので、この条件に当てはまった場合は、見積価格の場所に『作れません』といった内容のコメントを表示させたい。
ということで取り敢えず、価格表示欄を作るところから始めてみます。

これは、ボール紙の大きさなどを表示させたのと同じ手法で出来そうなので、簡単ですね。
ボタン表示と内訳表示の間ぐらいに、こんな感じで記述します。

# 答え表示
answer = tkinter.Label(text="一箱あたりの価格")
answer.place(x=10, y=80)

準備が整ったので、次に、受付できない条件を書いていこうと思います。『条件』という所から推測出来る通り、これも、if文を使えばできそうですね。
実行のタイミングとしては、前回に書いた、詳細表示やカテゴリー分けよりも前のタイミングでif文が発動しないと駄目なので、それらよりも前に記述します。
関数内に書くため、インデントに注意して書き込んでいきます。

    # NG要項
    if b_hi > 100 or b_hi < 20 or b_wid < 70 or b_long < 70 \
       or not(max(b_tate, b_yoko) <= 600 or min(b_tate, b_yoko) <= 450):
        answer["text"] = "申し訳ございませんが、弊社の設備では製造できません"

if以降に、不等号と『or』『and』『not』を使用して、NG項目を設定しています。
『b_hi > 100』というのは、高さが100mmを超えた場合という意味ですね。
それらのNG項目を『or』で繋げています。 『or』は、どれかに当てはまった際は『if』を実行するという事になる為、逆にいえば、どれか1個の条件に当てはまるだけで、NG項目として認識されます。
途中で挟まっている『\』マークは、改行の意味です
プログラムでは、改行そのものに意味が出てくるようで、改行マークを入れなければ一つの文として認識してもらえません。
その為、長くなりそうな場合は『\』マークを入れて、改行しているということをコンピューターに伝えましょう。 

これでNG項目の設定は完了です。後は、NG項目に入っていない場合は関数による計算で処理が続くようにするだけですが、これは簡単で、前回に書いた文の直ぐ上に『else:』と書くだけです。
こうすることで、NG項目に抵触しない場合だけ、前回書いたプログラムが動き始めます。
当然ですが、前回に書いた処理は『else:』の下に入るので、else:以降の文は全部、インデントとして字下げしなければなりません。

複数行をまとめて字下げする場合は、マウスで範囲を指定した状態で『tab key』を押すと出来ます。

良い感じで進んできましたね。
ただ、今の状態では、蓋の高さというものが変更できません。
浅い蓋や深い蓋など、お客さんにとっては選べたほうが便利ですよね。
という事で、その分を追記してみました。

#テキストボックス
box_height_f = tkinter.Entry(width=10, bd=4)
box_height_f.place(x=210, y=80)
# ボール紙の大きさ
b_hi_f = int(box_height_f.get()) # 箱の蓋の高さ

テキストボックス欄に、Entryを追加し、ボール紙の大きさの欄で、Entryから値をとってきています。
ただ、お客さんによっては、『蓋の深さとか決めたくないから、適当に』という方もいらっしゃるかもしれないので、デフォルト値として、『身』の深さの3分の2の高さを入れてみたい。。
という事で、先程の『# 箱の蓋の高さ』の下に、何となくこんな文を追加してみましたが…

    if b_hi_f is "":
        b_hi_f = int(float(b_hi)*0.67)

見事に動かず。
エントリーが空欄の場合に、蓋の高さ(b_hi)の高さに0.67を掛けたものを整数値にして、『b_hi_f』に代入するってイメージで書いたのですが、間違ってたようです。
その後、2日ぐらい考えたのですが全く先に進まないので、この機能は後回しということにしようと思います。

次は、ボール紙の値段を元に、紙の値段を表示させてみようと思いますが、それはまた次回にしようと思います。
kimniy8.hatenablog.com

【プログラミング】 python奮闘記 その12 ~ifでカテゴリー分けをする

この記事は、現在進行系でゼロからプログラミングを勉強している私が、勉強の一環として進展状況をアウトプットする目的で投稿しています。
その為、間違った記述や無駄な作業が結構多めとなっていますが、『それでも良いから一緒に勉強している気になりたい』という方に向けて書いていますので、予め御了承ください。
前回は、ボタンを押すことで関数が実行されるという状態にして、その上で、実行される関数を作り始めました。
最終的には、ボタンを押すと見積価格が出るようにするところを目指します。
kimniy8.hatenablog.com
見積ソフトは、極論をいえば見積価格さえ出れば良いのですが、ボタンを押すことで単純に答えだけが出力されるよりも、材料の単価などが出てくれた方が、見積に説得力があります。
どちらにしても、計算の過程で材料単価は出てくることになるので、見積の詳細表示として、単価を表示させるようにしてみましょう。
念の為にもう一度、ボール紙のカテゴリーや単価の表を貼り付けておきますね。
f:id:kimniy8:20180604224543j:plain
まずは、ボール紙のカテゴリー分けです。
関数内で行った『ボール紙の大きさ』の変数の定義の直ぐ下辺りに、こんな感じで書いていきます。

    # 身のボール紙の種類
    cardboard_a = max(b_tate, b_yoko) <= 232 and min(b_tate, b_yoko) <= 222
    cardboard_b = max(b_tate, b_yoko) <= 354 and min(b_tate, b_yoko) <= 323
    cardboard_c = max(b_tate, b_yoko) <= 505 and min(b_tate, b_yoko) <= 354
    cardboard_d = max(b_tate, b_yoko) <= 748 and min(b_tate, b_yoko) <= 505

    # 蓋のボール紙の種類
    cardboard_a_f = max(b_tate_f, b_yoko_f) <= 232 and min(b_tate_f, b_yoko_f) <= 222
    cardboard_b_f = max(b_tate_f, b_yoko_f) <= 354 and min(b_tate_f, b_yoko_f) <= 323
    cardboard_c_f = max(b_tate_f, b_yoko_f) <= 505 and min(b_tate_f, b_yoko_f) <= 354
    cardboard_d_f = max(b_tate_f, b_yoko_f) <= 748 and min(b_tate_f, b_yoko_f) <= 505

変数名は、ボール紙の英語名となる『cardboard』にする事にし、それぞれのカテゴリーにa~dを付けています。
『max』とか『min』といったよく分からない物が出てきましたので、解説しましょう。
『max』と『min』は、何となく想像できるかも知れませんが、数値を比較して条件にあったものだけを抽出してくれる関数です。
『max』は、引数で渡された数字の中から大きいものを取り出す関数で『min』はその逆で、引数の中から小さい方を取り出してくれる関数です。

前にも出てきた『and』を使い、両方の条件に当てはまるものだけを変数としています。
具体的に、cardboard_aの条件を見た場合、縦横の大きい方の数値が232以下で『且つ(and)』縦横の大きさの小さい方が222以下の場合はcardboard_aに当てはまると行った感じで設定しています。
これと同じ様な方法で、a~dを設定しています。

ただ、この方法で書くと、『cardboard_d』は、全ての条件が満たされている状態になるので、何でもかんでも『cardboard_d』になってしまう可能性もあるんですけどね。
まぁ、プログラムは上から順番に読んでいくそうなので、一番条件がタイトな『_a』を一番最初に記載しているので、期待通りのカテゴリー分けをしてくれるとは思いますが…
若干不安は残りますが、今回は初めて作るプログラムという事で、テスト的な意味合いも大きいので、このままにしておこうと思います。

これで、カテゴリー分けの変数の定義は出来たわけですが、これだけでは、しっかりとカテゴリー分けが出来ているかどうかを確認できませんので、何らかの形で出力が出来るようにします。
まず、表示させるための場所を確保しましょう。
プログラムの『# 内訳表示』の部分に、以下の文を書き込みます。

cardboard_price = tkinter.Label(text="【身】ボール紙の価格")
cardboard_price.place(x=10, y=170)

cardboard_price_f = tkinter.Label(text="【蓋】ボール紙の価格")
cardboard_price_f.place(x=10, y=230)

場所の指定は『place』で指定して有るので、このコードは何処に書いても良いのですが、後から見返した時に見やすい位置に書いておくと良いと思います。
変数『cardboard_price』に、tkinterのLabelを使って、表示スペースを確保しています。
ただこのままだと、『cardboard_price』に値がない状態の時は何も表示されないので、デフォルト値として引数に『text="【身】ボール紙の価格"』を指定しておきます。

場所の確保が終わったので、次は、『cardboard_price』の定義を書いていきます。
書く場所は、関数内の変数定義の下です。 まぁ、現状では関数で変数の定義しかしてないので、一番下と言っても良いかも知れません。

        # 身のボール紙の価格
        if cardboard_a:
            cardboard_price["text"] = "ボール紙の価格" + str(40) + "円"
        elif cardboard_b:
            cardboard_price["text"] = "ボール紙の価格" + str(50) + "円"
        elif cardboard_c:
            cardboard_price["text"] = "ボール紙の価格" + str(70) + "円"
        elif cardboard_d:
            cardboard_price["text"] = "ボール紙の価格" + str(100) + "円"
            
        # 蓋のボール紙の価格
        if cardboard_a_f:
            cardboard_price_f["text"] = "ボール紙の価格" + str(40) + "円"
        elif cardboard_b_f:
            cardboard_price_f["text"] = "ボール紙の価格" + str(50) + "円"
        elif cardboard_c_f:
            cardboard_price_f["text"] = "ボール紙の価格" + str(70) + "円"
        elif cardboard_d_f:
            cardboard_price_f["text"] = "ボール紙の価格" + str(100) + "円"

入力された数値に基づいてカテゴリー分けを行いたいので、手段としては、if文を使った条件分枝が良さそうです。
上記のように入力する事で、もし、『cardboard_a』の条件に当てはまるなら、『cardboard_price』という、先程、表示場所を確保した変数に、テキスト表示『["text"]』として、『=』以降の計算式の結果を出力してください。という命令を行っています。
足し算は文字列でしか行えないので、数字の部分を文字列に変換するために、str()で括っています。

プログラムは上から順番に読まれるので、a~dといった具合に上から順番に書く事で、カテゴリー分けがしっかりとされるはずです。
早速テストしてみましょう。
f:id:kimniy8:20180613210427j:plain
成功です!!
という事で、今回はここまでで、次回は、更に別の設定を付け加えていきます。

今までのコードのまとめはこちら

import tkinter

# ウィンドウ作成
root = tkinter.Tk()
root.title("見積もり")
root.minsize(640, 480)

# 画像表示
canvas = tkinter.Canvas(bg="black", width=640, height=480)
canvas.place(x=0, y=0)


# テキスト表示
heading = tkinter.Label(text="お見積り")
heading.place(x=10, y=10)


# テキストボックス表示
box_width = tkinter.Entry(width=10, bd=4)
box_width.place(x=10, y=40)

box_length = tkinter.Entry(width=10, bd=4)
box_length.place(x=110, y=40)

box_height = tkinter.Entry(width=10, bd=4)
box_height.place(x=210, y=40)

# ボタン表示
askbutton = tkinter.Button(text="見積開始")
askbutton.place(x=310, y=40)


# 内訳表示
b_areax = tkinter.Label(text="ボール紙の身の横幅")
b_areax.place(x=10, y=140)
b_areay = tkinter.Label(text="ボール紙の身の縦幅")
b_areay.place(x=180, y=140)

cardboard_price = tkinter.Label(text="【身】ボール紙の価格")
cardboard_price.place(x=10, y=170)

b_areax_f = tkinter.Label(text="ボール紙の蓋の横幅")
b_areax_f.place(x=10, y=200)
b_areay_f = tkinter.Label(text="ボール紙の蓋の縦幅")
b_areay_f.place(x=180, y=200)

cardboard_price_f = tkinter.Label(text="【蓋】ボール紙の価格")
cardboard_price_f.place(x=10, y=230)

# ボール紙の大きさ
def ask_click():
    b_hi = int(box_height.get()) # 箱の高さ
    b_wid = int(box_width.get()) # 箱の幅
    b_long = int(box_length.get()) # 箱の長さ
    b_tate = b_long + b_hi*2 # ボール紙の長さ
    b_yoko = b_wid + b_hi*2 # ボール紙の幅
    b_tate_f = b_long + 5 + b_hi*2 # ボール紙の蓋の縦
    b_yoko_f = b_wid + 5 + b_hi*2 # ボール紙の蓋の横

        # 身のボール紙の種類
    cardboard_a = max(b_tate, b_yoko) <= 232 and min(b_tate, b_yoko) <= 222
    cardboard_b = max(b_tate, b_yoko) <= 354 and min(b_tate, b_yoko) <= 323
    cardboard_c = max(b_tate, b_yoko) <= 505 and min(b_tate, b_yoko) <= 354
    cardboard_d = max(b_tate, b_yoko) <= 748 and min(b_tate, b_yoko) <= 505

    # 蓋のボール紙の種類
    cardboard_a_f = max(b_tate_f, b_yoko_f) <= 232 and min(b_tate_f, b_yoko_f) <= 222
    cardboard_b_f = max(b_tate_f, b_yoko_f) <= 354 and min(b_tate_f, b_yoko_f) <= 323
    cardboard_c_f = max(b_tate_f, b_yoko_f) <= 505 and min(b_tate_f, b_yoko_f) <= 354
    cardboard_d_f = max(b_tate_f, b_yoko_f) <= 748 and min(b_tate_f, b_yoko_f) <= 505

    b_areay["text"] = "身のボール紙の身の縦" + str(b_tate) + "mm"
    b_areax["text"] = "身のボール紙の身の横" + str(b_yoko) + "mm"
    b_areax_f["text"] = "身のボール紙の蓋の縦" + str(b_tate_f) + "mm"
    b_areay_f["text"] = "身のボール紙の蓋の横" + str(b_yoko_f) + "mm"
    # 身のボール紙の価格
    if cardboard_a:
        cardboard_price["text"] = "ボール紙の価格" + str(40) + "円"
    elif cardboard_b:
        cardboard_price["text"] = "ボール紙の価格" + str(50) + "円"
    elif cardboard_c:
        cardboard_price["text"] = "ボール紙の価格" + str(70) + "円"
    elif cardboard_d:
        cardboard_price["text"] = "ボール紙の価格" + str(100) + "円"
        
    # 身のボール紙の価格
    if cardboard_a_f:
        cardboard_price_f["text"] = "ボール紙の価格" + str(40) + "円"
    elif cardboard_b_f:
        cardboard_price_f["text"] = "ボール紙の価格" + str(50) + "円"
    elif cardboard_c_f:
        cardboard_price_f["text"] = "ボール紙の価格" + str(70) + "円"
    elif cardboard_d_f:
        cardboard_price_f["text"] = "ボール紙の価格" + str(100) + "円"


askbutton["command"] = ask_click            
# メインループ
root.mainloop()

【映画感想・考察】 インフィニティ・ウォー

このブログでは、偶に行っている映画関連の投稿ですが、今回は『インフィニティ・ウォー』を取り上げたいと思います。


今回の投稿では、映画を見た上での感想や考察を中心に書いていく予定ですので、当然ですが、ネタバレも多分に含んでいます。
まだ見ていない方で、情報を入れたくないという方は、読まないようにお願い致します。


私はこの映画は1度しか観てないのですが、最初に感想を書いておくと、来年の後編が始まる前にDVDで見れば良かったかなといった感じの印象でした。
というのも今回の映画は、今までのMCUのキャラクター総出演(出てきてないキャラもいますが)ってところが最大のウリになっているわけですが、出てくるキャラクター数が多過ぎるんですよね。
そして、多すぎるキャラクター全てに見せ場を用意しようと頑張った結果、キャラクター紹介映像の詰合せのような感じになってしまっていたような印象を受けました。

こんな印象を受けたからといって、面白くなかったのかと聴かれれば『そんな事はない』と答えますし、扱っているテーマも、現実の世界に住む私達の生活にもリンクしていて、考えさせられる。
全体的に観て楽しめたわけですが、一つ一つのチームの物語が短かったせいなのか、物語の中に没入出来なかった印象がありました。

ただ、先程も書きましたが、取り扱われているテーマは非常に重いものですし、考えさせられるものだったので、今回は、個人的な考察などを書いていこうと思います。

今回の敵役として登場したのは、MCUの作品でも度々登場していたサノスという人物。
今までの登場回でも、悪者たちを影から操るボス的な描かれ方をしていましたし、本作でも、宇宙の人間を半分抹殺することを目的とした、最悪・最凶のキャラクターとして登場します。
その登場の仕方も絶望的で、最初はマイティ・ソーとハルクが乗っている宇宙船を襲撃し、中の住人を虐殺していきます。

当然のように、ソーとハルクはサノスの前に立ちはだかるわけですが…
アベンジャーズの中でも最強のパワーを持つと言われていて、1人で核弾頭クラスのパワーがあると表現されている2人が、単純なパワーで蹂躙される。
この出来事でハルクは、完全に自信を失ってしまい、変身できなくなってしまう程のトラウマを抱えることになります。

手が届く範囲の射程距離にさえ入ってしまえば、確実に殴り勝てると思われていた最強のハルクが、単純に腕力でボロ負けになるというサノスの登場シーンは、シリーズを観ている人間に絶望を与える表現としては凄かったと思います。
ただ、ストーリーが進んでいくと、そんな完全無欠の力を持ち、全宇宙の半分の生命を抹殺すると宣言している悪の親玉・サノスの主張が全面に押し出され始めます。

そこから先の話では、この映画の主人公が完全に入れ替わります。
つまりは、サノスが物語の主人公となり、アベンジャーズ達は、その事が理解できていないし理解しようとも思わない無能集団となり果てます。
アベンジャーズ達は感情に身を任せて、単純に目の前の事だけに対処していく集団として描かれ、それに対するサノスは、自分の事は一切考えずに、全宇宙のことを考えた上で『善い』と思った事を確実に成し遂げる男として描かれる。

起こった出来事に対して『対処』しかしていないアベンジャーズに対し、この計画の為に全てを捧げてきたサノス。
『意思』の違いによって、当然のようにサノスの願いは成就し、全宇宙のバランスは調整されて宇宙に安定がもたらされ、見事にハッピーエンドとなる。

インフィニティ・ウォーを要約すると、この様な感じの物語になるわけですが、この、サノスが突きつけた問題というのは、現在の私達に突きつけられた問題でもあるんですよね。
というのも、現在、私達は地球に住んでいるわけですけれども、その地球のキャパというのが、既に限界を超えているからなんです。

地球には70億人という人間が住んでいる訳ですが、その全ての人が、日本人や欧米人と同じ様な生活を送ったとすれば、地球環境的にも資源的にも、破滅するといわれているからです。
冷静になって考えればわかりますよね。
中国で消費が活発になり、その需要を埋める為の供給を増やしただけで、中国の大気汚染が凄い事になって、日本にまでPM2.5が来ると大騒ぎになっているわけです。

中国だけでなく、インドやアフリカなど、人口が多い地域が一斉に先進国の人と同じ様な暮らしを望めば、環境汚染は地球全土に広がり、資源はアッという間に枯渇し、文明に完全依存している人類は生きていくことが出来なくなります。
では、全ての人が先進国と同じ様な生活をおくれる人口というのはどれぐらいなのでしょうか。
これは、約30億人程度と言われていますので、誤差などを入れたとしても、今の地球人口が半分にならないと地球が保たない事を意味します。

つまり、今までというのは、人口が多い中国やインド、アフリカ等の後進国と呼ばれる人達に地球環境に負荷をかけない生活をしてもらう事で、何とかバランスが取れていた状態ともいえます。
その為に、圧力をかけたり特定の集団を後押ししたり、国境を歪な形で引いたりして内乱などを起こさせてきたわけですが、それも限界が来始めている。
資本主義という、膨張し続けないと破綻する経済システムでは、後進国には先進国の仲間入りをしてもらわないと、需要が伸びずに破綻してしまう。

『直近の儲け』にしか興味がない資本家たちと、その援助を受けている政治家達は、資本主義をより膨張させる為に新たなマーケットを求め、貧困を押し付けていた国を顧客に仕立て上げる。
今の地球というのは、『直近の事』に対する『儲け』を最優先し、それによって生じる問題の『対処』しか考えていない人達が政治経済の中心となり、先々を見ずに運営している。

これは、今の日本の政治を見てもわかりますよね。
日本というのは島国で、国土の7割程は山岳地帯。 住む場所が限定されている状態なのに、破綻している年金システムの寿命を先延ばしするためだけに、『少子化対策』を掲げています。
地球全体で観ると人口は3~40億人減らなきゃだめなのに、経済システムを延命させるためだけに、人口を増やそうとしているのが日本です。

そんな直近の儲けを優先した際に生じる問題の対処しか出来ない人たちの前に、さっそうと現れたのが、サノスです。
現状の地球というのは、後進国に負担を押し付けることで何とかバランスを保っているわけですが、サノスの主張は違います。
『老いも若きも、美醜も資産の有無も、男女の区別も優劣の差も、全て関係なく、平等に、きっちり半分消す。』

サノスはこの理想を実現する為に、最愛の娘を手にかけます。
付き従う部下も同じで、サノスの理想が実現されれば、自分も含めて仲間の半分が消え去るかもしれない。
それでも、大義の為に付き従う。 まさに、『大正義』

地球の問題に置き換えて考えてみるとわかりますが、これって、単純にサノスを倒せば終わるという話ではないんですよ。
サノスが下した決断は、全宇宙の半分の命を消し去ることではなく、半分の命を助けるということなんですから。
半分の命を救済したサノスを倒すということは、全滅を受け入れるという事と同意です。

また、この映画では問題を『地球』というのではなく、全宇宙規模の話にしているので、逃げ道がないのも辛いですよね。
単純に、地球の環境や資源の問題というだけなら、ガンダムのように、スペースコロニーを使って170億人の人類を地球外に捨ててしまえば良い。
でも、全宇宙の問題になると、宇宙よりも外には何も無いわけですから、脱出のしようも、他から資源やエネルギーを持ってくるといった選択も出来ないわけです。

こんな、重大な問題を突きつけられたアベンジャーズ。 一体、どうするんでしょうかね。

個人的な考察としては、宇宙の捉え方という部分に問題の解決方法があるような気がします。
というのも、宇宙であるユニバースの『ユニ』という部分には、『1つの』という意味が込められています。
宇宙が1つしかなく、その宇宙には外側がないのであれば、ユニバースは1つの閉じた世界となり、その中でバランスをとろうと思うのであれば、サノスの決断が最良のモノということになります。

しかし、宇宙が1つのユニバースではなく、マルチバースで有ったとしたらどうでしょうか?
今作内で、唯一、サノスに打ち勝つ方法を見つけたと断言したドクター・ストレンジは、魔術士の弟子になる前に、後に師匠となるエンシェント・ワンによって、魔術の世界の片鱗を観させられます。
その正に最中に、エンシェント・ワンから、『世界がマルチバースである可能性』について告げられます。

仮に世界がマルチバースであり、可能性の数だけ無限に存在する多宇宙が存在するのであれば、多宇宙を含めた上でのバランス調整が可能になるわけで、サノスの決断が最良のものにはならない可能性もあるんですよね。
まぁ、答えは1年待つだけで出てくるので、後はそれを楽しみに待つだけなんですが、希望を言うなら、『友情パワー』や、『頑張れば、道は見つけられる!』等の絆だけで何とかなるなんてオチだけは止めて欲しかったりはしますけどね。

【プログラミング】 python奮闘記 その11 ~ボタンを作ってみる

この記事は、現在進行系でゼロからプログラミングを勉強している私が、勉強の一環として進展状況をアウトプットする目的で投稿しています。
その為、間違った記述や無駄な作業が結構多めとなっていますが、『それでも良いから一緒に勉強している気になりたい』という方に向けて書いていますので、予め御了承ください。

前回は、記入欄の設置と、そこから値を取り出して、関数によって数値を加工するというところまでやりました。
ただ、前回までの記述では、関数を動かすことが出来てないので、プログラム上で正常に動くかどうかも分かりません。
プログラム上で動いている事が分かるように、関数を動かすための仕組みを作ろうと思います。
kimniy8.hatenablog.com

このプログラムでは、『見積もり開始』ボタンが押された事をキッカケにして、プログラムが動くようにしたいので、まず、そのボタンを作ります。
ボタンを作るのは、『tkinter』の『Button』で作れます。
質問ボタンという意味で、ボタンの値を入れる変数には『askbutton』という名前を付けてみました。

# ボタン表示
askbutton = tkinter.Button(text="見積開始")
askbutton.place(x=310, y=40)

『text』部分には、ボタンに表示させる文字列が書いてあります。
ボタンの大きさは、文字の長さによって自動的に決めてくれるので、非常に簡単に設置できますね。
placeでは、お馴染み、ボタンの場所を指定しています。
f:id:kimniy8:20180607234826j:plain
ボタン部分の記述は、ボタンの位置が記入欄の横なので、記入欄の次ぐらいに書いておくと良いかも知れません。

次に、ボタンが押された際に実行できるようにする為には

askbutton["command"] = ask_click    

と書きます。
位置としては、メインループの真上ぐらいが良いと思います。
この記述の意味としては、『askbutton』が押された時に『命令(command)』が下され、命令によって、『ask_click』が発動するという意味です。
ボタンが押された際に関数が発動するという状態にしたい場合は、取り合えす『ボタンの変数名["command"] = 関数名』と書いておけば良いと暗記しておけば良いでしょう。
私もまだまだ知識が浅いので、これぐらいの認識しか出来ていません。

これで、ボタンを押すことで関数を実行することは出来るんですが、作った関数が答えを出力する場所を作っていないので、実行したとしても意味がありません。
という事で、何らかの数値を出力するようにしてみましょう。

取り敢えず動く感じが見たいという事で、簡単な出力にしておきます。
表示させるのは、ボール紙の『縦』『横』の大きさだけです。
画面上に変数を表示させるので、まずは、変数に必要な情報を代入していきます。

関数内で変数を定義した場所の下ぐらいの場所で、変数に表示させたい内容を代入していきます。
関数内なので、インデントを合わせる事に注意しましょう。

    b_areay["text"] = "身のボール紙の縦" + str(b_tate) + "mm"
    b_areax["text"] = "身のボール紙の横" + str(b_yoko) + "mm"
    b_areax_f["text"] = "身のボール紙の縦" + str(b_tate_f) + "mm"
    b_areay_f["text"] = "身のボール紙の横" + str(b_yoko_f) + "mm"

変数名の意味合いとしては、ボール紙のローマ字の頭文字と、面積を表す『aera』に、x軸とy軸という意味のx,yをくっつけただけで、_fは『蓋』の略です。
これで、実行できるはずです。早速、数値を適当に入れて実行してみましょう。

このついでに、結果を画面に出す為の場所も作っておきましょう。
ボタン表示の下ぐらいのスペースに、内訳表示としてこう書きます。

# 内訳表示
b_areax = tkinter.Label(text="ボール紙の身の横幅")
b_areax.place(x=10, y=140)
b_areay = tkinter.Label(text="ボール紙の身の縦幅")
b_areay.place(x=180, y=140)

b_areax_f = tkinter.Label(text="ボール紙の蓋の横幅")
b_areax_f.place(x=10, y=200)
b_areay_f = tkinter.Label(text="ボール紙の蓋の縦幅")
b_areay_f.place(x=180, y=200)

もう説明も不要ですね。
ウィンドウに文字を表示させてくれる『tkinter.Label』です。引数である『text=""』の中身は、関数発動前のデフォルトの値として表示される内容で、関数が発動すると、文字の内容は変数の内容に変化します。
つまり、関数が発動前で、変数に何の値も入っていない時は、デフォルト値として『text=""』以降の文が表示されるけど、関数が発動して変数に値が入ると、表示内容が変数の値に変わるって認識で良いと思います。
引数としてなにも設定しない場合は、何も表示されません。

これで、入力した値を元に計算を行い、結果を出力するというプログラムが完成しました。
早速実行してみましょう。
f:id:kimniy8:20180607234914j:plain
はい、見事にエラーが出ました。
私は英語は読めませんが、『b_tate_f = b_long + 5 + b_hi*2 # ボール紙の蓋の縦』の部分で『typeエラー』が出ていて、『str』『not』『int』という言葉が読み取れます。
エラーの種類としては、『str』という文字列と、『int』という整数値という『type』が違う者同士を計算式、厳密には足し算に織り交ぜたことが原因のようです。文字列と掛け算は可能ですしね。
でも変ですよね? 変数『b_tate_f』も『b_hi』も『5』も、全部整数値であるintのハズなのに、なんでエラー?
これは、私が設定した記入欄の問題で、『tkinter.Entry』は、記入欄を作ってくれるんですが、その入力値は文字列になってしまうようなんです。
つまり、数字を入力したとしても、『"100"』という文字として受け取っている為、文字列を足し算がある計算式に入れると、『違うタイプ同士は計算できないよ!』というエラーが出てきたという事。

解決策として、関数開始直後の変数値を、改造します。
改造前がこちら

    b_hi = box_height.get() # 箱の高さ
    b_wid = box_width.get() # 箱の幅
    b_long = box_length.get() # 箱の長さ

そして改造後がこちら

    b_hi = int(box_height.get()) # 箱の高さ
    b_wid = int(box_width.get()) # 箱の幅
    b_long = int(box_length.get()) # 箱の長さ

記入欄である『Entry』の値を格変数に代入する際に、int()で括ることによって、値を整数値に変換しています。
注意としては、()の数は合わせましょう。 最後の部分は、get()の)とint()の)が被ることによって『))』となっています。
これで値の『type』が揃ったはずなので、エラーが出ずに結果が出るはずです。
早速試してみましょう。
f:id:kimniy8:20180607235013j:plain
はい、見事に出ました。
これで、数値を入力して結果を表示するという簡単なプログラムが完成したことになります。
後は、見積もりが出来るようにするために、この関数を改造していくだけですが、それは次回以降にしていきます。
kimniy8.hatenablog.com

今回までで書いたプログラムの全体はこんな感じです。

import tkinter

# ウィンドウ作成
root = tkinter.Tk()
root.title("見積もり")
root.minsize(640, 480)

# 画像表示
canvas = tkinter.Canvas(bg="black", width=640, height=480)
canvas.place(x=0, y=0)


# テキスト表示
heading = tkinter.Label(text="お見積り")
heading.place(x=10, y=10)


# テキストボックス表示
box_width = tkinter.Entry(width=10, bd=4)
box_width.place(x=10, y=40)

box_length = tkinter.Entry(width=10, bd=4)
box_length.place(x=110, y=40)

box_height = tkinter.Entry(width=10, bd=4)
box_height.place(x=210, y=40)

# ボタン表示
askbutton = tkinter.Button(text="見積開始")
askbutton.place(x=310, y=40)


# 内訳表示
b_areax = tkinter.Label(text="ボール紙の身の横幅")
b_areax.place(x=10, y=140)
b_areay = tkinter.Label(text="ボール紙の身の縦幅")
b_areay.place(x=180, y=140)

b_areax_f = tkinter.Label(text="ボール紙の蓋の横幅")
b_areax_f.place(x=10, y=200)
b_areay_f = tkinter.Label(text="ボール紙の蓋の縦幅")
b_areay_f.place(x=180, y=200)


# ボール紙の大きさ
def ask_click():
    b_hi = int(box_height.get()) # 箱の高さ
    b_wid = int(box_width.get()) # 箱の幅
    b_long = int(box_length.get()) # 箱の長さ
    b_tate = b_long + b_hi*2 # ボール紙の長さ
    b_yoko = b_wid + b_hi*2 # ボール紙の幅
    b_tate_f = b_long + 5 + b_hi*2 # ボール紙の蓋の縦
    b_yoko_f = b_wid + 5 + b_hi*2 # ボール紙の蓋の横

    b_areay["text"] = "身のボール紙の身の縦" + str(b_tate) + "mm"
    b_areax["text"] = "身のボール紙の身の横" + str(b_yoko) + "mm"
    b_areax_f["text"] = "身のボール紙の蓋の縦" + str(b_tate_f) + "mm"
    b_areay_f["text"] = "身のボール紙の蓋の横" + str(b_yoko_f) + "mm"

askbutton["command"] = ask_click            
# メインループ
root.mainloop()

【プログラミング】 python奮闘記 その10 ~記入欄を作る

この記事は、現在進行系でゼロからプログラミングを勉強している私が、勉強の一環として進展状況をアウトプットする目的で投稿しています。
その為、間違った記述や無駄な作業が結構多めとなっていますが、『それでも良いから一緒に勉強している気になりたい』という方に向けて書いていますので、予め御了承ください。

前回は、ウィンドウを作成したところまで書きました。
kimniy8.hatenablog.com

今回からは、このウィンドウに色々と部品であるウィジェットを貼り付けていきます。
まず、右上の分かりやすい部分に『お見積り』と表示させたいと思います。
画面に文字を表示させるためには、お馴染み『tkinter』の『Label』を使います。
この『Label』は、ものにラベルを貼り付けるように、渡した引数を指定の場所に貼り付けてくれる便利な奴です。

# テキスト表示
heading = tkinter.Label(text="お見積り")
heading.place(x=10, y=10)

英語で見出しのことを『heading』というらしいので、変数名は『heading』とし、そこに、引数に(text="お見積り")を渡したtkinterのLabelを代入しています。
tkinterのLabelが代入された『heading』の位置『place』として、x,yともに10ピクセルを指定しています。

次に必要になるのが、ユーザーが箱の寸法を入力することが出来る、テキストボックスの導入です。
テキストボックスの導入は、『tkinter』の『Entry』で可能になります。
箱には、『幅』と『長さ』と『高さ』がある為、数値を打ち込めるスペースは3つ必要です。早速書いていきましょう。

# テキストボックス表示
box_width = tkinter.Entry(width=10, bd=4)
box_width.place(x=10, y=40)

box_length = tkinter.Entry(width=10, bd=4)
box_length.place(x=110, y=40)

box_height = tkinter.Entry(width=10, bd=4)
box_height.place(x=210, y=40)

f:id:kimniy8:20180604224500j:plain
変数名には、それぞれ『box_』の後に『幅』『長さ』『高さ』を表す英単語を付けています。
テキストボックスを表示してくれる『Entry』には、テキストボックスの長さと装飾具合を引数として渡してあります。
この数値を変えてみると、どうなるのでしょうか?
変数『box_width』に代入している『Entry』の引数を変えてみましょう。

box_width = tkinter.Entry(width=5, bd=20)
box_width.place(x=10, y=40)

こうすると…
f:id:kimniy8:20180604224403j:plain
テキストボックスの長さが半分になって、縁取りの部分が凄いことになりました。『bd』の部分は縁取りの装飾度合いのようです。
大きくするほどにデカくなっていくっぽいですね。

入力欄も出来たことですし、この入力を元に、材料費を算出していこうと思います。
材料費を計算するのに、まず必要なのが、材料をどのぐらい使うのかということですよね。
紙箱のベースとなるボール紙を製紙会社から買う場合は、大きさが決まっていますので、それを何分割出来るのかによって、材料の単価が決まってきます。

今回の簡易見積りでは、細かい計算はせずに、このボール紙を2分割・4分割・6分割・12分割の4つのカテゴリーに分けて、原価に手間賃をプラスした値を材料費とします。
4つのカテゴリーと手間賃を加えた材料費を表にすると、こんな感じ。
f:id:kimniy8:20180604224543j:plain
カテゴリー分けが出来たので、次に、入力された数値を、原材料であるボール紙の大きさに変換しようと思います。
どうやれば、原材料の数字が出てくるのかというと、単純な箱の展開図を思い描いてもらえれば分かりますが、『幅+高さx2』『長さ+高さx2』で出せます。
f:id:kimniy8:20180604224607j:plain
計算式が分かったので、早速、入力欄に打ち込まれた数値を取り出して、計算式を関数に組み込んでみようともいます。
という事で早速、関数の定義です。関数名ですが、見積もりボタンを押した際に発動する予定なので、質問という意味の英単語『ask』とクリックをあわせて、『ask_click』にしておきます。

# ボール紙の大きさ
def ask_click():
    b_hi = box_height.get() # 箱の高さ
    b_wid = box_width.get() # 箱の幅
    b_long = box_length.get() # 箱の長さ

特定の場所から値を取り出すには、get関数を使うと取り出せます。
記入欄の名前は、記入欄の要素を代入した変数なので、その変数に『の』という意味の『.』を付けて、『get()』とし、それを、新たな変数である『b_hi』などに代入しています。
getの隣の『()』は、引数無しで関数を実行するという意味合いのカッコです。

これで、計算の元となる『幅』『長さ』『高さ』の数値が関数内の『b_hi』などの変数に代入できました。
後は、この変数を計算式に組み込む事で、ボール紙の大きさが出せそうです。

    b_tate = b_long + b_hi*2 # ボール紙の長さ
    b_yoko = b_wid + b_hi*2 # ボール紙の幅
    b_tate_f = b_long + 5 + b_hi*2 # ボール紙の蓋の縦
    b_yoko_f = b_wid + 5 + b_hi*2 # ボール紙の蓋の横

『b_tate』という変数に、ボール紙の縦の長さである『箱の長さ+箱の高さ*2』を代入。『b_yoko』にも同様に、ボール紙の横の長さを代入しています。
下の二行は、蓋の場合です。 蓋の方が大きくないと、蓋が閉じられませんから、『+5』と長さを足しています。

これで、入欄から値を取り出して、目的の値に加工することが出来ました。
ちなみにこの関数ですが、発動条件を設定していないので、このままだと動きませんし、正常に動いているかどうかも解らない状態だったりしますがけども。
一応、ネタバレしておくと、この記述では思ったようには動きませんが、次回は、そのあたりの事も扱っていこうと思います。

今回までのプログラムで書いた、コードのまとめはこちら。

import tkinter

# ウインドウ作成
root = tkinter.Tk()
root.title("見積もり")
root.minsize(640, 480)

# 画面装飾
canvas = tkinter.Canvas(bg="black", width=640, height=480)
canvas = place(x=0, y=0)

# テキスト表示
heading = tkinter.Label(text="お見積り")
heading.place(x=10, y=10)

# テキストボックス表示
box_width = tkinter.Entry(width=10, bd=10)
box_width.place(x=10, y=40)

box_length = tkinter.Entry(width=10, bd=4)
box_length.place(x=110, y=40)

box_height = tkinter.Entry(width=10, bd=4)
box_height.place(x=210, y=40)

# ボール紙の大きさ
def ask_click():
    b_hi = int(box_height.get()) # 箱の高さ
    b_wid = int(box_width.get()) # 箱の幅
    b_long = int(box_length.get()) # 箱の長さ
    b_tate = b_long + b_hi*2 # ボール紙の長さ
    b_yoko = b_wid + b_hi*2 # ボール紙の幅
    b_tate_f = b_long + 5 + b_hi*2 # ボール紙の蓋の縦
    b_yoko_f = b_wid + 5 + b_hi*2 # ボール紙の蓋の横

# メインループ
root.mainloop()

【Podcast #だぶるばいせっぷす 原稿 】第29回【ヒッピー】ティモシー・リアリー(5) ~永遠の愛兄弟団

この投稿は、私が配信している Podcast番組『だぶるばいせっぷす ~思想と哲学史』で使用した原稿です。
放送内容は、私が理解した事を元に行っています。ご了承ください。
goo.gl

youtubeでも音声を公開しています。興味の有る方は、チャンネル登録お願い致します。
www.youtube.com
www.youtube.com

ここ最近は定型文のようになっていますけれども、この回から聴き始めた方の為に、一応、言っておきますと
第20回と21回で、ヒッピー・ムーブメントがどの様にして起こったのかという簡単な説明をし、22回と23回で、その運動に大きな影響を与えた幻覚剤、LSDについて、開発の経緯や使われ方について説明しました。
そして、24回からは、このムーブメントの中心的な人物であるティモシー・リアリーに焦点を当てて、より詳しく、この出来事を追っていっています。

その前に、当たり前の事では有るんですけれども、一応注意点として言っておきますと、ヒッピーを取り扱う回では、LSDなどの幻覚剤を始めとした禁止薬物が、頻繁に登場することになります。
それも、ネガティブな取り扱い方だけではなく、人間の可能性を伸ばすといった感じの取り上げ方をしますが、あくまでも、当時、そのように捉えられて研究されていたという解説をしているだけで
現在、使用することを推奨しているわけではありません。 現在は禁止薬物になっているものが大半なので、使用は行わないようにしてください。
法律で禁止されているだけではなく、中毒になって抜け出せなくなったり、最悪の場合は死ぬケースも有りますのでね。

という事で、本題に入る前に、前回の簡単な振り返りから始めていきます。
前回は、ティモシー・リアリーとケン・キージー達の活躍で、様々なヒッピーコミューンが登場したという話から、その一つのディガーズを取り上げてみました。

ディガーズは、資本主義とそれを前提とした社会システムに反抗し、共産主義な主張を自分達の行動で示したコミューンです。
名前の由来は、清教徒革命期に地主の搾取によって富裕層と貧民層が二極化した事に対して抵抗し、共有地とされていた荒れ地を自分達で掘って耕して、反抗する意思を態度で示した団体から取ったものです。
このディガーズを先導していた人物であるウィンスタンリーは、宗教的神秘体験によって啓示を受けて人々を扇動したとされています。
この、神秘的体験が元で考え方や物の見え方が変わり、それを行動に移すという事そのものが、ヒッピー達の行動と重なる部分が多いですよね。

このディガーズに限らず、ヒッピーコミューンは今までの価値観に対して疑問や反感を持つ物が多く、政府としては面白くなかったようです。
幻覚剤のLSDは、この動きの中心に位置していたわけですが、政府はこの薬物を1965年に禁止することになります。
政府としては、元々が冷戦時代に共産主義陣営との戦争に備えて研究開発していた薬が自国で出回り、それによって国民が反政府的な行動をする事が面白くなかったんでしょうね。

ですが、LSDが禁止されたとしても、ヒッピーはそもそもが反体制的な人達なので、そんな事を簡単に聞き入れるわけがありませんよね。
ただ、LSDを公に入手することは難しくなったのですが、禁止された年と同じ年の65年には、オーズリー・スタンリーという大学生が、大学を中退して、カリフォルニアでLSDの製法を独学で習得し、製造を始めます。
この人物の作るLSDですが、大学中退者が独学でつくった代物にもかかわらず、純度が高い最高級品として世界的に人気があったそうです。有名人では、ビートルズなんかもオーズリーの顧客だったようですね。

ヒッピーといえばカルフォルニアなどの西海岸が地域としては有名なイメージがありますが、オーズリーの拠点が西海岸だったことが、大きく影響していると考えても良いんでしょう。
オーズリーが製造するLSDを捌いていたのは、The Brotherhood of Eternal Loveという、『永遠なる愛の共同体』とか『永遠の愛兄弟団』呼ばれる団体です。

この団体は、元々がバイカーと呼ばれる日本で言うところの暴走族とか半グレとかになるんでしょうか。バイクを乗り回すアウトロー集団でした。
ですが、ある日のこと、リーダーのジョン・グリッグスが通行人に銃を突きつけて強盗をした際に、その被害者が所持品として持っていたLSDも奪い取り、それを試した事で神秘的体験をしてしまい、神秘主義にハマってしまいます。
神秘主義にのめり込んだグリッグスは、LSDが引き起こす神秘体験について研究を行っているリアリーを訪ねに、ニューヨークのミルブルックにまで会いに行き、その後、崇拝するようになったようです。これが、1966年のことです。

リアリーといえば、神話の中だけと思われていた神や天使との邂逅などの神秘体験を起こし、人間の思想や行動に影響を与える研究をしていたわけですが、その人物を崇拝しているという事で、グリッグスもその考えに傾倒していくことになります。
つまり、暴走族だった自分が変化したように、神やキリスト、ブッダは実在し、その存在を認識する経験を皆が体験する事で、世の中が本当に変わると思うようになっていったようですね。
そして同年にはカルト団体を立ち上げます。 それが、永遠の愛兄弟団です。

主な活動としては、西海岸のラグナ・ビーチに、健康食品や衣服、喫煙具の販売、そしてLSDの供給をする「ミスティック・アート・ワールド」というヒッピーショップを立ち上げたそうです。
この店は、ヒッピー文化に慣れ親しんでいたり興味がある若者たちや、芸術家を引きつけ、この店に訪れたものの多くがThe Brotherhood of Eternal Loveに共感し、入信したようです。
ラグナ・ビーチ周辺というのは、今でもアーティストに愛されている地域だそうですが、その理由の一つは、兄弟団がコミューンに引き入れたというのもあるんでしょう。

また、アートというものは神秘体験を前提としたヒッピーカルチャーと、相性が良いんですね。
近代芸術などを観てみればよくわかりますが、理解に苦しむ物が多いですよね。 何故、あのような理解がしにくい物が近代芸術に多いのかというと、アートそのもののあり方として、逸脱というものがあるからです。
まだ、誰もやっていない事であったり、既存のものに新たな解釈を与えるなど、前人未到の領域に自分がまっさきに入ることで、新たな価値観を見つけ出して、今やこれからの未来に大きな影響を与えるという事、そのものが一つのあり方だったりするんです。

その方法として一部で使われていたのが、LSDなどの幻覚剤なんですね。
幻覚剤を利用することで、今まで見たことがない景色を見れたり、今まで見ていた景色が違った解釈で見れるということがあるそうなんですが、それを利用すると、今までの常識から逸脱しやすくなるようなんですね。
まぁ、一度も観たことがなかったり感じたことがないものを、自分自身で考えた末に生み出すよりも、幻覚を使用して実際に目で見て感じるほうが早いし楽そうですもんね。

また、ヒッピー側も、アーティストという存在は必要だったんでしょう。
例えば、リアリーのように実験をし、それを元に仮説を重ねていってレポートを書いて、それを読んでもらって理解してもらうというのは、受け手側に一定以上の知識が無いと難しいです。
その一方で、アーティストに思想や考えをイメージ化して貰って、演出してもらえば、そこまで知識レベルの高くない層にも訴求効果がありますよね。

どの宗教でもそうですが、その世界観を伝えるためには、単純に文字や言葉で訴えるだけでなく、建設や絵画、そして音楽によって世界観を提示して、体験してもらうということを行っていますよね。
この様な感じで、考えを見た目で表現できるアーティストは、必要な存在だったんでしょう。

永遠なる愛の共同体は、このヒッピーショプを通じて信者を集めていって、その信者と共に共同生活を行う事でコミューンを形成していったわけですが、人数が多くなりすぎて、次第に土地が足りなくなってきます。
その土地の取得費用や共同体の運営費用を捻出する為に、麻薬販売に手を染めだします。最初はマリファナなどを取り扱っていたようですが、その後は、オーズリーがつくったLSDを取り扱うようになっていったみたいです
ただ、このオーズリーは、1967年には禁止薬物であるLSDの製造を行っていたということで、逮捕されてしまいます。

少し余談になりますが、このオーズリーさんですが、逮捕を機に、LSD製造からは完全に足を洗うことになります。
ではその後、ヒッピーカルチャーを捨てて普通の生活に戻ったのかというと、そういう事もなく、今までとは別の合法的な活動でヒッピーカルチャーに貢献することになります。
その活動が、音響システムの設計です。

オーズリーは、当時、ヒッピームーブメントの中心的存在だったアーティストであるグレイトフル・デッドと行動をともにして、彼らが目指す音を観客に提供する為に、音響システムを作り上げます。
そのシステムが、サウンドウォール、音の壁という意味を持つシステムです。どんなものなのかというのを簡単に説明すると、スピーカーを横だけではなく、縦方向に積み上げる事で、大音量と高音質を実現したようです。
これも単純に上方向に積み上げて、それを並べて壁のようにするのではなく、一列一列の高さを変えて、遠目から見ると波のように見えるよに積み上げていて、その波の形もベース音と同じ様な形になるようにしていたようですね。
この時の様子は、Amazonがオリジナル動画で『グレイトフル・デッドの長く奇妙な旅 』というのが有るんですが、そこで詳しく語られていたりします。プライム会員なら無料で見れるので、興味があったら見てみてください。

せっかくなので、ついでにグレイトフル・デッドについても軽く説明してみましょう。
よくバンドなんかでは、同じ音楽性の人達が集まってバンドを組んで、音楽性の違いによってバンドを解散するなんて事をしますが、このグレイトフル・デッドは、全く違った分野の人達が集まって組まれたバンドです。
メンバーの構成も、前衛クラシックの作曲家がベースをして、R&Bやマーチングバンドのドラマー達がいたそうです。他にも、ブルース出身のハーモニカ吹き、ブルーグラスバンジョー弾き、フォークのギターリストなど、
それぞれバラバラの道を進んでいた人間が集まって、グレイトフル・デッドというバンドを結成しました。

その音楽も、当時の音楽の常識から外れていたようですね。 
今の日本の環境からは想像しづらいですが、当時は…というか、今でもそうなんでしょうけれども、車社会のアメリカでは、ラジオというメディアが結構な存在感で地位を確立していたんですね。
それに加えて、今に比べると記録メディアなども、そんなには発達も普及もしていなかった時代なので、音楽を聞く場合はラジオを通して聞く場合が殆どだったようです。

その様な環境だと、音楽は当然、ラジオで流しやすい事を意識した形で作られることになります。つまり、イントロの長さや盛り上がり、最後の終わり方などを、ラジオ放送に迎合した形で作っていたんですね。
ですが、このグレイトフル・デッドは、当時の社会のあり方に疑問を持つビート世代であったり、これから育っていくヒッピー達の中で活動してきたバンドなので、当時としての普通の音楽は作らなかったようです。
ラジオ側としては、3~5分程度で解りやすく終わってくれる音楽の方が、番組作りがし易いために良かったそうですが、グレイトフル・デッドが作る音楽は、単調なリズムが延々と10数分続く様な音楽で、ラジオでは使われにくい音楽だったようです。

何故、この様な音楽を作ったのかというと、自分達はあくまでもカウンターカルチャー側だという意識が強かったからなんでしょうね。
音楽でメジャーになって、レコードを売って大金持ちになるよりも、ファンとのつながりを大切にする気持ちから、ライブを中心に置いた曲作りを行っていったからなんでしょう。
メンバーの構成や、その曲作りに至るまで、今までの常識にとらわれない行動を取ろうとしていたバンドだったようです。

こういった思想に傾いたのには、LSDの影響も大きかったようです。 LSDには、自分を客観視したり、他の人達を自分と同一視するような体験が出来る効果も有るようで、自分とは違った価値観を、まるで自分のモノの様に再認識出来るようなんですね。
この効果によって、仲間や自分達を支えてくれるファンたちと、より強い一体感を体験できたのも、大きな影響を与えたようです。

話を戻すと、この1967年という年に、このカルト集団がリアリーの拠点をカルフォルニアに用意することで、再びつながります。
というのも1965年にLSDは禁止薬物になた事で、違法薬物を摂取、投与して経過を見守るというリアリーの研究も、当然、違法のものとなるわけです。その為、ニューヨークのミルブルックの拠点はFBIなどからマークされていたんですね。
そして1966年には、先走った保安官、ゴードン・リディーによって、踏み荒らされる事になります。

ただ、この時は、令状も何もない状態で保安官が先走った形になったので、違法捜査という事で逮捕されたりはしなかったようなんですけれどもね。
ちなみにですが、このゴードン・リディーという人物は、愛国心が強い…というか、権力に対して物凄く忠誠が高いようで、現政権の敵とみなした者は、、方法を問わずに追い詰める為に行動する人物のようなんですね。
その為、後の1972年、ニクソン大統領時代になった際、大統領の敵になりうる者、これは、政治関係や反政府組織 問わずのようですが、大統領の足を引っ張りそうな人たちの情報収集を熱心にしまくって、その当時、違法だった盗聴器を仕掛けるなんて事まで行います。
そしてこの行動が、後に、ウォーターゲート事件へと発展し、大統領が辞任へと追い込まれていく事になるようなんですけどね。

話を戻すと、この警告なしの『がさ入れ』や、常時、政府などのシステム側から監視されるという状態に晒されることで、ミルブルックでの実験が難しくなってしまうんですね。
というのも、LSDというのは、摂取すれば いつでもどんな状態であっても、神秘体験が得られるという代物では無いからなんです。
グッドトリップする為には、精神状態を安定させて、特定の方向に持っていかなければならないようなんです。

リアリーは、その神秘的体験をより確実に起こす為に、トリップ中の人にヒアリングをしたりして情報を集めたり、空間づくりを行ったり、普段から瞑想を行ったり。
その他には、チベット死者の書という大昔に書かれた本を引っ張り出してきて翻訳を行う事で、歴史という説得力を持った物をベースにして特定の儀式を行うといった事まで行い、神秘体験が出来るように誘導していくセッションを開発し、改良を続けていました。

ここまで準備をしなければ、リアリーが目指す体験を得る事は難しいと考えられていたわけですけれども、その環境その物が、LSDの違法化や、それに伴う『がさ入れ』によって、大きく変わってしまったんです。
CIAやFBIといった権力側から、常時、犯罪者、またはその予備軍として監視され続けているわけで、リアリーが主催するコミューンの参加者は、絶えずストレスに晒され続ける状況に追い込まれたわけです。
この様な状態に置かれると、トリップによって神秘体験を行うことが難しくなる為、ニューヨークのミルブルックを拠点としたリアリーのコミューンは、次第に崩壊していくことになります。

崩壊した理由としては、この他にも、コミューン内の派閥争いなどもあったそうですね。
主観を前提としたリアリーの研究は、その性質上、意見が別れることも多かったのでしょう。 というのも、普通の物理現象の研究であれば、他の人間も客観的に観察することで確認することが出来ますが、リアリーの研究は、主観的なものですよね。
幻覚剤の投与によって、誰にでもヴィジョンが見えるといっても、そのヴィジョンが同じかどうかを確かめるすべはないですよね。 自分が体験した神秘体験と他人のそれとが同じとは限らないし、断言も出来ないわけです。

この様な性質上、様々な考えや憶測が発生したとしても、どちらの理論が優れているのか、または、正しいのかというのがわからない為、自分の考える理論こそが正しいと考える人達が、それぞれの派閥を作っていったんでしょう。
その派閥同士で、どちらの理論が正しいのかと行った闘いが続いていたらしく、その疲れと、常時、権力者側から監視されているというストレスから、崩壊していったようです。

様々な要因でコミューンは崩壊して常に監視対象となっているミルブルックにも居づらくなったリアリーに、救いの手を差し伸べたのが『永遠の愛の兄弟団』だったというわけです。
リーダーのジョン・グリッグスは、この前年にリアリーを訪問して対談した際に、神秘体験との向き合い方や考え方に対して心を打たれて崇拝していたようなので、手助けがしたかったんでしょうね。
その援助を受ける形で、リアリーは拠点を西海岸のカルフォルニアに移す事になります。

この頃ぐらいからなんでしょうかね。 西海岸のカルフォルニア州がヒッピー達の活動の場となっていくんですが、この続きは、また次回に。

【プログラミング】 python奮闘記 その9 ~関数とかメソッドとかクラスとか

この記事は、現在進行系でゼロからプログラミングを勉強している私が、勉強の一環として進展状況をアウトプットする目的で投稿しています。
その為、間違った記述や無駄な作業が結構多めとなっていますが、『それでも良いから一緒に勉強している気になりたい』という方に向けて書いていますので、予め御了承ください。

前回からは、実際にプログラミングをしてみようという事で、私の本業の見積もりソフトを製作し始めています。
その準備として、前回は『Visual Studio Code (以下 VS code)』の説明を書きました。
今回からは、本格的に書いていこうと思います。
kimniy8.hatenablog.com

作ろうと思っているプログラムは、私が本業の紙箱製作の簡易見積もりの自動化ソフトでしたね。
プログラムを作るのに必要なのは、パッと思いつく限りでは、ユーザーが寸法を入力する『入力窓』と、見積もりボタンを押すと結果が出る『ボタン』です。
この2つの機能を持つのが、『tkinter』というモジュールです。
tkinter』の使い方というのは、第1回でも紹介した本、『12歳からはじめるゼロからのPythonゲームプログラミング教室』に書かれていますので、興味の有る方は、そちらを参考にしてみてください。
取り敢えず最初に『tkinter』を使いたいという事が決まりましたので、早速、1行目に書いていきます。

import tkinter

これで、import終了です。 コンピューターはプログラムを上から順番に読んでいくので、import文は、プログラムの冒頭にまとめて書くようにしておくと良いそうです。
そして次に必要なのが、入力欄やボタンを表示させる為のウインドウです。
このウインドウも、tkinteの中に道具として存在しますので、その関数を呼び出し、ウインドウの設定をしていきます。

# ウインドウ作成
root = tkinter.Tk()
root.title("見積もり")
root.minsize(640, 480)

# メインループ
root.mainloop()

一番最初の『#』から続く文はコメントと呼ばれるもので、プログラムを後から見直す際に見やすくする為の解説文です。
『#』を付けると、その後に続く文1行分ををコードから除外してくれます。改行はできないので注意してください。

2行目で、rootにtkinterというモジュールのTkというウィンドウ作成の関数を代入しています。語尾の()で関数が実行されているっぽいです。(この辺りの認識が甘いので断定できない)
今更になりますが、関数に引き渡される値のことを引数(ひきすう)と呼び、引数がある場合は関数の後の()内に引数を入れます。今回の場合は、引数無しという事です。
3行目で、ウィンドウのタイトルを決めています。ピリオド『.』は、日本語で『の』という理解でいいと思います。
この場合でいうと、root『の』titleとして、見積もりという文字列を引数として渡しています。 見積もりの周りの『""』は、文字列ですよとコンピューターに伝える記号で、『''』でも代用可能です。
最後の列の、root.minsize(640, 480)というのは、root『の』メインサイズを決めるメソッド『minsize』に(640, 480)という引数を渡しています。
意味は、x軸方向(横方向)に640ピクセル、y軸方向(縦方向)に480ピクセルという意味です。

ここで、x軸とかy軸といった一についての話が出てきたので、ついでに説明しておきます。
プログラムでは基本的に、一番左上の隅っこを、x軸y軸共に0として表し、xの値が増える程、右に行く事を表し、yの値が増える程、下方向に行く事を表します。

ピクセルとは単位のことで、お使いのディスプレイがフルHDの場合は1440×1080ピクセル。4kの場合は3840×2160ピクセルが画面イッパイという事になります。
4kやフルHDのテレビを思い出してみれば分かると思いますが、同じ4Kテレビでも40インチや60インチといった幅があることからも分かる通り、ピクセルに絶対的な大きさというものは存在しません。
40インチ4Kのテレビのピクセルと60インチ4Kのピクセルの大きさは違います。
その為、ピクセルというのは『画面のどれ位を占めるのか』といった認識で良いと思います。
当然ですが、ピクセル指定をした場合、ユーザーが出来上がったソフトを4Kで使うのかHDで使うのかで観た印象が変わってくるということも出てきます。

最後のメインループによって、ここで書いたプログラムが起動します。
取り敢えずウィンドウは出来たので、次はそのウィンドウに、色を付けていきたいと思います。
ウィンドウを装飾する関数は、tkinterCanvasです。
ここでまた、後付の説明をしていこうと思いますが、前回にメインウィンドウを作った際に『Tk』という関数を呼び出したと書きましたが、実際にはクラスです。(たぶん)

関数の回で、ちょっとだけ説明をしたと思いますが、pythonでは関数そのものも関数に取り込むことが出来ます。
その特徴を使ってなのか、関数の中で複数の関数を定義している、大本の関数というものが存在するのですが、その様な存在をクラスと呼びます。
書き方は

class クラス名:
	変数の定義、処理など

	def メソッド名:
		処理1
		処理2
	def メソッド名:
		処理1
		処理2

って感じで、クラスの中に組み込まれている(インデント内に有る)『def』から始まる関数のことをメソッドと呼ぶようです。
クラス名の命名方法は一文字目を大文字にして、『_』などは利用しないというのが、暗黙の了解で決まっているそうなんですね。
どうしても『_』を利用したいって時は、使わずにその次の文字を大文字にすることで差別化するようです。例えば、『Japan_kyoto』というクラスを作りたい場合は、『JapanKyoto』って感じ。
これは、後から読んだ時のわかり易さを重視しているだけなので、こう書かないと動かないというわけではないですが、この様なルールを皆で共有できれば、無駄な時間が省けたりしますよね。

一通り説明が終わったところで、本題に戻りましょう。
最初に書いたコードえを繋げたのがこちら

import tkinter

# ウインドウ作成
root = tkinter.Tk()
root.title("見積もり")
root.minsize(640, 480)

# メインループ
root.mainloop()

この、ウインドウ作成とメインループの間に、画面装飾を追加します。
最初に書いておきますと、メインループは一番下固定にしておき、これより下には何も書きませんので、注意してください。

# 画面装飾
canvas = tkinter.Canvas(bg="black", width=640, height=480)
canvas = place(x=0, y=0)

変数『canvas』にtkinterCanvasという引数(bg="black", width=640, height=480)と入れたクラスを代入します。
Canvasの引数の意味は、『bg』がbackground(バックグラウンド、背景)の略で、そこに『"black"』を指定しているので、背景色が黒という意味になります。
『width』と『height』は、日本語直訳そのままの意味で、幅と高さを意味しますので、ここでは『Canvas』の大きさ指定をしているという意味。
次の行では、『canvas』に場所を指定しています。前回も書きましたが、基本的には左上が基準になる為、xとyが共に0のところに置くことで、rootとcanvasを左上で揃える感じで重ねることが出来ます。
今回は、分かりやすいように真っ黒にしましたが、この『canvas』を使うことによって、背景に画像やイラストを指定することも出来ます。

これを実行すると、大きさが640x480ピクセルの、真っ黒な画面が出てくると思います。
これでした準備は終了!この真っ黒な画面の上に、色んなウィジェットと呼ばれる道具を置いていくことにしますが、続きは、また次回にということにします。
kimniy8.hatenablog.com

今回のプログラムで書いたコードのまとめはこちら。

import tkinter

# ウインドウ作成
root = tkinter.Tk()
root.title("見積もり")
root.minsize(640, 480)

# 画面装飾
canvas = tkinter.Canvas(bg="black", width=640, height=480)
canvas = place(x=0, y=0)

# メインループ
root.mainloop()

【プログラミング】 python奮闘記 その8 ~初めてのプログラミングに挑戦

前々回の投稿では、モジュールの簡単な説明を、そして、前回の投稿では、モジュールのimportの仕方を書いていきました。
kimniy8.hatenablog.com
これで、今まで勉強してきて出来るようになった事は、『変数に値を代入』『条件分枝』『関数』『モジュールのimport』と増えてきたわけですが、これだけあれば、物凄く簡単な計算プログラム程度ならかけるようになります。
という事で今回からは、実際に私がプログラムを作っていく過程を、解説を加えつつ書き綴っていこうと思います。

その前に、今までにも何度も注意点として書いてきましたが、この『python奮闘記』は、プログラミング自体を1から始めた人間が、現在進行系で勉強している過程を書いている投稿です。
当然ですが、まだまだ知識不足ですし、プログラミング上級者から見れば、無駄な記述なども多数あると思いますが、そういうものだと思って読んでください。
プログラミングの知識があって、他の人間が書いたスマートなコードを読んで勉強したいって方は、もっと上級者の書いているブログなど検索して見つけて、そちらを読まれることをお勧めします。

前置きはこの辺りにしておいて、早速、簡単な計算プログラムを作っていきましょう。
プログラムを書いていく前に、まず、しなければならない事は、計算プログラムで何を計算するのかというのを明確にしておく事です。
作るべきものがある程度、明確になっていなければ、そもそも作り始めることが出来ませんからね。

という事で今回は、私の本業の『簡易見積もり』を自動で行ってくれるプログラムを作っていきたいと思います。
私の本業は、紙の箱を作るという仕事なのですが、その箱の簡易見積りを自動化しようという試みです。

最終的にコンピューターにやって貰いたいのは、ユーザーが、箱の『幅』『長さ』『高さ』を入力するして『見積もり』ボタンを押すと、一箱あたりの値段が表示してくれるという事です。

箱というのは、モノを入れる側の『身』の部分と、蓋をする『蓋』の部分で出来ています。
『蓋』と『身』は、ボール紙という厚紙を土台にして、その上から色や模様の付いた紙を貼り付ける事で完成します。
つまり、『蓋』と『身』のそれぞれの、『ボール紙の値段』と『紙の値段』を特定し、それらを全て足し合わせれば、最終的な商品の値段が出てくる事になります。

箱の大きさを固定化すると、単純に数個の選択肢から選ぶだけになるので、プログラム的には簡単になりますが、それでは面白くない。
という事で、箱の大きさは、ユーザーが自由に決められるようにします。

とはいっても、製造の設備の問題から、製造できない大きさの箱というのも存在します。
仮にユーザーがその様な数値を入力した場合は、『設備の関係上、作れません』という警告文を出し、値段は表示されないようにしたい。

つまり、まとめると、ユーザーが数値を入力すると、それを元に材料の価格が算出されて、その合計値としての見積もりが表示される。
設備の問題で作れない場合は、その旨を伝えるメッセージを表示させるというのが最終目標です。

という事で、早速作っていきましょう。
・・・と、その前に、プログラムを何処に書いたら良いのかという話をしましょう。
私が主に使っているのは、マイクロソフト提供のフリーで使えるソフト、Visual Studio Code(以下 VS code)です。
使っている理由は簡単で、フリーで使えるからです! プログラムを書くソフトは沢山ありますが、機能が充実しているものほど、有料だったりするんですよね。
プログラミングが本業であるなら、そんなのは必要経費として良いものを使うべきでしょうが、まだまだ勉強中の私は、いつ飽きるかもわからないので、フリーで使えるものを使っています。
他に良いソフトがあれば、教えてください!

という事で、VS codeの簡単な使い方から。
まぁ、私自身が機能を使いこなせてないから、簡単な使い方しか解説できないんですけれどもね。
詳しい解説が観たい方は、googleで検索してください。

まず、VS codeを立ち上げてください。次にすることは、作業用のフォルダーを作る事です。
練習用のプログラムを入れる為のフォルダーを作り、セーブデータは全て、そこに入れるようにしておきましょう。
フォルダーは、普通にマウスを使って作ることも出来ますが、そうすると次の作業が面倒なので、他の方法で制作します。

VS codeを立ち上げると、画面が3分割に分かれていますが、その右下の場所に注目すると、『問題』『出力』『デバックコンソール』『ターミナル』と言葉が並んでいると思いますが、ターミナルを選択します。
すると、windowsコマンドプロンプトと同じ様な画面が立ち上がります。
PS C:~と書かれているのは、今現在自分がいる場所なので、取り敢えず、そこにフォルダーを作ります。
作り方は、『md フォルダー名』と入れれば完成です。

次に、新規で作ったフォルダーの中に移動してみます。
方法は、cd フォルダー名です。 エラーが出ていなければ、今まで書かれていたPS C:~の部分が書き換わり、一番右に先程記入したフォルダー名が書かれているはずです。
これで、ひとまずの準備は完了です。
f:id:kimniy8:20180529205652j:plain
準備が終わったら、左上にある『ファイル』から新規ファイルを選ぶと、上のウィンドウにプログラムが書けるようになります。
プログラムを書く前に、ファイル名を決めて保存しておくと良いかも知れません。
保存方法は、同じく『ファイル』から、『名前をつけて保存』で良いです。 保存先には、先程自分で作ったフォルダーを指定しましょう。
先程自分で作ったファイルの場所がわからない場合は、『ターミナル』のC:~以下の文をコピーして、フォルダーのアドレスを書き込む場所にペーストでも大丈夫だと思います。
保存する際のファイル名は、python(.py)を指定するのを忘れないようにしましょう。じゃないと、動きません。
f:id:kimniy8:20180529205748j:plain
書いたプログラムを実行する際は、ターミナルからファイル名を書くことで実行できます。
ここでも注意ですが、単純にファイル名だけを指定してプログラムを実行しようと思う場合、自分がいる場所にファイルがないといけません。
先程、ターミナルからフォルダーを作って、その場所に移動したのも、保存ファイルを移動先に指定したのもその為です。
実行する際は、.バックスラッシュと打った後に、ファイル名.pyと打ち込みます。

バックスラッシュは、使用しているOSや使っているアプリによっては『\』と表示されてしまいまうので、カタカナで書いているだけで、スラッシュの逆向きの事です。
キーボードでいうと平仮名の『ろ』の場所を半角文字の状態で押すと、バックスラッシュになるはずです。『\』になってしまう場合は、そのまま『\』で置き換えても問題ないと思います。
簡単な操作の説明はこれぐらいにして、次回からは、実際にプログラムを書いていきます。
kimniy8.hatenablog.com