class: title, smokescreen, shelf, no-footer # Perl入学式in千歳 第1回後半戦 <div class=footnote> <small> Copyright 2019,2022 (C) Ken'ichi Fukamachi (<A HREF=https://www.fml.org/>fml.org</A>), CC BY-NC-SA. (注: <A HREF="/slides/lang/perl/caution/">諸注意から始めてね</A>) </small> </div class=footnote> --- class: compact # 前回までのあらすじ - 環境構築できましたでしょうか? - ターミナルを開いて perl が実行できることを確認してください - 確認方法の例:perlバージョンを表示させる ``` $ perl -v This is perl 5, version 32, subversion 1 (v5.32.1) built for x86_64-linux-gnu-thread-multi (with 47 registered patches, see perl -V for more detail) Copyright 1987-2021, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page. ``` --- class: compact # 今回だけのおまけ <div class=footnote> <small> (脚注1) 英語のとおりです。 バックアップはexport、元に戻すときはimport (脚注2) tarはUnix初期からあるアーカイブのフォーマット (tape archiveの略。本来は<B>磁気テープ</B>に保存する際に「一つにまとめる」コマンド) </small> </div class=footnote> - 構築したWSL環境のバックアップをとっておきましょう - windows terminalをひらいて次のコマンドを実行します <br> (export するとか、ノリとしてはdockerぽい感じですね) ``` > wsl --export OS名 保存先ファイル名 実行例 > mkdir wsl-backup > wsl --export Ubuntu-20.04 wsl-backup/20220528.tar ``` - wsl-backupという仮想環境イメージを保存する専用のフォルダを作成し、そこへ保存します。 週一でバックアップとかするとよいです。 容量を食うので、 (1)一番最初の綺麗なイメージと(2)最新の2つだけ残して、あとは消すとか運用は考えてね --- class: compact # 今回のハイライト <div class=footnote> <small> (脚注1) PerlリスペクトのPHPも似ていますが、 特殊文字を見るだけで変数の種類がほぼ確定できるのはPerlだけです。 ちなみに元ネタはUnixのシェルになります(その前があるのか?たぶん無いような気がする) <br> (脚注2) Rubyの作者いわく「この変数体系がperl4から5への大進化を可能にした」(出典?;直接聞いたのかも) </small> </div class=footnote> - 出力ができる - 変数 - 他の言語と異なり**変数名に種類を意味する特殊な文字をつけます** - 特殊文字を見るだけで変数の種類がほぼ確定できます: 例: `$x @y %z $y[0] $z{KEY}` - 千歳拡張 - デジタルで表現するとは何か? - 入力 (キーボードから読み込む) - 乱数 (ここは呪文だと思ってコピー&ペーストしてください) - 入力・出力・乱数を使い(少しダサい)じゃんけんプログラムを作ってみましょう - 次回は、じゃんけんプログラムを最後まで作ります(見栄えは悪いけれどね;-) --- class: compact # 講師陣の御紹介 <div class=footnote> <small> おおむね、業務用ネットワーク機器とUnix関係が好き(はぁと)で、まとめられますね; ちなみにPerl歴は30年 </small> </div class=footnote> - そういえば、環境構築のとき、なにもせずにスタートしちゃった:-) - 第2回め以降は手練の社会人IT技術者のみなさんがTAとして参加してくれます。 <br> 各回、自己紹介してもらいますね - 自分の分だけ - 深町賢一 (fukachan@fml.org) https://www.fml.org/ https://github.com/fmlorg/ - フリーソフトウエア開発者(最近の営業用語ではオープンソース) - ネットワークエンジニア(元IIJ=日本で最初にインターネットを売り始めた会社) - 言語: よく使う言語は**シェル**、とくいな言語は(昔の)Perl、さいきんの浮気先はGo:-) - wikipedia(<- 自分では編集したことないよ)先生いわく、なんか日本のプログラマ枠あつかいみたい。 ただ、フリーソフトウエアは散々開発してきたけど、職業プログラマだったことはないです。 ネットワーク、サーバの構築と設定〜フリーソフトウエアの開発まで、どっちも好きなんだけどな --- class: title, smokescreen, shelf, no-footer # Perl入学式in千歳 第1回後半戦<br>公式テキスト第1回 <div class=footnote> <small> <A HREF="https://github.com/perl-entrance-org/workshop-basic-online/blob/master/1st/slide.md"> 公式テキスト第1回は、こちら </A> </small> </div class=footnote> --- name: janken class: title, smokescreen, shelf, no-footer # Perl入学式in千歳 第1回後半戦<br>じゃんけんプログラム(ダサいけど)の作成 <div class=footnote> <small> できた!とか「できたけど、〜のあたりではまった!」とかtweetしてくれるの歓迎 </small> </div class=footnote> --- class: compact # データ表現? - コンピュータは0と1しか理解できないです(正確には2進数) - 細かいところはともかくとして、とにかく数字だけ扱えます - じゃんけんといえば、グー、チョキ、パーです。 この3種類の扱いは? - すこし考えてみてください <div class=footnote> <small> [おまけ情報] スカラー(scalar)って? 数学(線形代数)の話なんですけども、 ざっくりいって普通の実数がスカラーです。 スカラーの対比としてベクトルとかテンソルとかいう話が始まるよ。 ちなみに、プログラミング言語でスカラー変数という表現が出てくるのも珍しいよね? たいていは整数変数とか浮動小数点変数といった型の名前とコンビで変数の話が始まります。 Perlの場合、他の言語と違い、スカラー変数に整数、浮動小数点、文字、文字列その他を(実は何でも)代入できるしなぁ。 たんに(ベクトル的な)配列との対比でスカラーなのでは? </div class=footnote> --- class: compact # データ表現 <div class=footnote> <small> (脚注1) ちなみに1から数える言語は? 1950年代まで遡れる最も古い言語の一つFORTRANとかCOBOLあたりですかねぇ... 1から始める方が人間には素直なんですどね。 その他の情報はググってね (脚注2) グー、チョキ、パーの数字は1 2 3でも1 2 4でも何でもOK (脚注3) C言語はハードウエアを制御するから0スタートが素直ということだと思うのだけれど、 他の言語は必ずしもそうではないので、C言語にあわせてるだけなのでは? </small> </div class=footnote> - 人為的に決めるしかないんです:-)ここでは、次のようにしましょう | 表現 | じゃんけん | 備考 | |------|------------|--------------------------------| | 0 | グー | C言語では0から数え始める習わし | | 1 | チョキ | | | 2 | パー | | - 注意: C言語では0から数を数え始めます。 C言語はUnixというOSを書くために作られたプログラミング言語で、もっとも普及している言語の一つです。 そのため0から数える言語は多いです --- class: compact # 課題 (とりあえずテンプレートとして丸写し) - perl-entranceフォルダにjanken.plを作成してください。 中身は次のとおりです。このあとの課題の[雛形](examples/janken_01__template.pl.txt)なので、まずは丸写ししてみてください ``` #!/usr/bin/perl use strict; use warnings; print "じゃんけん: 0=グー, 1=チョキ, 2=パー\n"; my $aite = 0; print $aite, "\n"; exit 0; ``` - 注意: **スカラー変数**`$aite`とは対戦**相手**つまりコンピュータの選んだ手を保存する変数 - 保存した後、ターミナルで`perl janken.pl`を実行してください。コンピュータが0(つまりグー)と言いましたね? 何回実行してもグーなので人間の連勝(w) -> つまんないよね? --- class: compact # 乱数 <div class=footnote> <small> (脚注) 乱数の詳細は数値計算の本を勉強してね:-) 質のよい乱数生成とは?で本が何冊も書ける世界。 よい乱数は、インターネットショッピングから物理学のシミュレーションまで色々なもので必要とされます </small> </div class=footnote> - コンピュータに手を考えさせます。乱数なるものを使います - 乱数については丸写ししてください(コメントは、おまかせします) - プログラムの先頭で**一回だけ srand 関数を実行**してください - rand関数は**実行するたびに異なる数字**を返してくれます(ここが本体)。 - intは整数にする関数です。 例えば rand(3) は 2.2228894538593 などを返してくるので`int(rand(3))`とすれば`2`になります。 整数の0 1 2にしないと、グー、チョキ、パーにならないですもんね? ``` srand(time|$$); # 乱数の初期化 my $aite = int(rand(3)); # 乱数で0 or 1 or 2を生成 ``` --- class: compact # 課題 - **乱数を使い**実行するたびにコンピュータが違う手を出してくるようにしてください - perl-entranceフォルダにあるjanken.pl(先ほど作ったファイル)を編集(改造)しましょう ``` 実行例 % perl janken.pl じゃんけん: 0=グー, 1=チョキ, 2=パー 2 % perl janken.pl じゃんけん: 0=グー, 1=チョキ, 2=パー 1 ``` - 注意: 0 1 2 しかないので、同じ手を続けて出してくることもありえます - [解答例](examples/janken_01__random.pl.txt) --- class: compact # 入力 (キーボードから値を読み込む) - 自分の手も入力出来るようにしましょう - `$jibun` = 名前のとおり、自分の手を入れておく変数 - `<STDIN>`でキーボードからの入力を読みこめます。 読み込んだ情報を返すので、左辺の`$jibun`という変数に、その入力が入ります。 `$jibun`にはキーボードから入れたデータ(文字 + ENTERを叩いた分=改行文字)が入っています - `chomp`関数は余計な改行文字を取り除きます ``` my $jibun = <STDIN>; chomp $jibun ``` これを一行にまとめて ``` chomp($jibun = <STDIN>); ``` と書くことが多いです(注意: 事前に変数`$jibun`を宣言するのを忘れずにね!) --- class: compact # 本日の最終課題 - 自分の手を入力し、コンピュータの手と両方を表示してみましょう ``` 実行例 $ perl janken.pl じゃんけん: 0=グー, 1=チョキ, 2=パー 2 自分 = 2, 相手 = 1 ``` - 注意: 下から2行目に「2」とだけ書いてある行は、キーボードから入力している部分 - [解答例](examples/janken_01__input.pl.txt) - 次回は条件文と繰り返し文をならって次のプログラムを書けるようになろう <br> - コンピュータとジャンケンする(3回勝負) - 毎回、勝ち負けを表示する