根無し草日記

好きな事についての雑記帳

Djangoの始めの一歩

pythonのwebフレームワークを学ぶための始めの一歩として こちらのサイトを参考に、PythonのwebフレームワークであるDjangoHello Worldプロジェトクを作成する。

Djangoをインストール

pipでdjangoを入れる。

>> pip install django

プロジェクトを作成

pipでdjangoをインストールした後は、任意のフォルダの下で以下のコマンドを打つ事でプロジェクトが生成される。 ,,, HelloWorld_Django/ >> django-admin startproject HelloWorldProject . ,,,

アプリケーションの追加

作成したプロジェクトの下にはHelloWorldプロジェクトが生成される。manage.pyというファイルが作成され、ここでHello Worldプロジェクトの管理が行われる。 言われるがままにコマンドを打つと下記のエラーが発生。

HelloWorld_Django/ >> python manage.py startapp hello
  File "manage.py", line 17
    ) from exc
         ^
SyntaxError: invalid syntax

似たようなトラブルはググると出て来て、pythonの2.系を使っているのが原因らしい。確かにコマンドラインのデフォルトはpython2.0系だ。特に拘るわけでは無いのでこちらのサイトを参考にpython3.0系にする。単純には出来なかったのでこちらのサイトも参考にさせて頂いた。

設定の追記

HelloWorldProject/settings.py のINSTALLED_APPSにhelloを追加する。

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    ## add
    'hello',
]

routesの追加

urlpatterns = [
    path('admin/', admin.site.urls),
    ## add
    path('',include('hello.urls')),
]

helloの下にurls.pyというファイルを新規作成する。

from django.urls import path
from . import views

urlpatterns = [
    path('hello',views.index),
]

helloの下のviews.pyにindex関数を定義する。

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.

def index(request):
    return HttpResponse("Hello World!")

マイグレーションを実施

以下のコマンドでマイグレーションを実施する。

HelloWorld_Django/ >> python manage.py migrate

migrationとは英語では移住という意味で作成したwebのデータベースの定義を自動的に作成・管理してくれる。

ローカルホストでの起動

下記コマンドを実行し、ローカルホストで起動する。

HelloWorld_Django/ >> python manage.py runserver

http://127.0.0.1:8000/helloにアクセスすることで、hello worldと表示させることが出来た。

PLAYフレームワークでHello World!

こちらのドワンゴさんの新卒向け研修資料を参考にして、PLAYフレームワークを使ってwebアプリを作ってみる。この研修資料ではsbtでPLAYのテンプレートを呼び出す事はせずに、スクラッチで作成しており、最初の勉強として最適だと思う。

やっぱりここでもHello World!

プロジェクトの作成とbuild.sbtの作成

PLAYのフォルダ構成からスクラッチで作成するため、トップディレクトリを作成する。研修資料では"hello-world"となっていたが今回は"play_sample"とした。

SCALA/ >> mkdir play_sample

資料に従い、playのsbt-pluginを入れる。 次にbuild.sbtにプロジェクトの設定を始める、とある。いつも通りと書いてあるが、今回初めて行うので、build.sbtを何処に置けば良いかでつまづく。他の書籍を参考にすると、rootディレクトリの下に置けば良さそうだ。

資料のscalaのバージョンは2.12.4になっていたが、これは今入っているバージョンに合わせた方が良さそうなので、バージョンを調べて3.3.0にする。

play_sample/ >> scala --version
Scala code runner version 3.3.0 -- Copyright 2002-2023, LAMP/EPFL

build.sbt

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "3.3.0"

libraryDependencies += guice

資料には"最後のlibraryDependencies += guiceでDIコンテナのGuiceを使えるようにする。"とある。判らないので調べる。DIコンテナとはソフトウェアを構成するコンポーネントの依存性を管理するソフトウェアの事らしい。DIコンテナも幾つか種類があって、guicegoogleが提供するコンポーネントらしい。とりあえず入れておいて損は無さそうだ。

confの作成

資料に沿ってrootディレクトリの下にconfディレクトリを作成する。その下にapplication.confroutesを作成する。application.confの方は空のファイルで良い。routesには下記の様に書く。

GET    /    controllers.HelloController.get(name: Option[String])

HelloControllerの実装

資料そのままだが、一応コピペせずに写経する。

package controllers

import javax.inject.Inject
import javax.inject.Singleton
import play.api.mvc.AbstractController
import play.api.mvc.Action
import play.api.mvc.AnyContent
import play.api.mvc.ControllerComponents
import play.api.mvc.Request

@Singleton
class HelloController @Inject()(cc:ControllerComponents) extends AbstractController(cc){
    def get(name: Option[String]) = 
        Action{implicit request: Request[AnyContent] => 
            Ok{
                name
                .map(s => s"hello, $s!")
                .getOrElse("""Pleases give a name as a query parameter named "name".""")
            }
        }
}

実行

下記のコマンドでsbtを実行する。

play_sample/ >> sbt run

大量のエラーメッセージが出る。。。

=== 略 ===
[error]   not found: https://repo1.maven.org/maven2/com/typesafe/play/play-akka-http-server_3/2.8.15/play-akka-http-server_3-2.8.15.pom
[error] Error downloading com.typesafe.play:filters-helpers_3:2.8.15

=== 以下略 ===

どうも、依存関係が解決出来ないようなエラーのようだ。 確かにエラーメッセージに出てくるhttps://repo1.maven.org/maven2/com/typesafe/play/play-akka-http-server_3/2.8.15/play-akka-http-server_3-2.8.15.pomを打ってもそのリンクに到達しない。

https://repo1.maven.org/maven2/com/typesafe/play/play-akka-http-server_3/を打つと確かに2.8.15は無い。代わりに2.9.0-M6っぽいものが出てくるので、一度それに変えてみる。

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.9.0-M6")
--- (Running the application, auto-reloading is enabled) ---

INFO  p.c.s.AkkaHttpServer - Listening for HTTP on /[0:0:0:0:0:0:0:0]:9000

(Server started, use Enter to stop and go back to the console...)

何となくエラーなく走ったようだ。 webブラウザでローカルホストに以下のようにアクセスする。

localhost:9000/?name=World

以下のように表示された。

hello, World!

何とか出来ていそうだ。

Pythonの基本を学ぶ

Pythonの基本を学んでみる。

お題

プログラミングを学習するときの有名な題材にFizzBuzz問題というのがある。英語圏の飲み会とかで行われる山手線ゲームみたいなものらしく、数字をカウントして行き、3の倍数ならFizz、5の倍数ならBuzz、15の倍数ならFizzBuzzというのがルールらしい。とは言え、日本人には馴染みが無いゲームなので近くてイメージが付きやすいものを題材にする。そう、世界のナベアツである。

学ぶ事

世界のナベアツの実装を通して下記の事を学ぶ。

  • print文の使い方
  • for文の使い方
  • if文の使い方
  • 関数について
  • クラスについて

いよいよ実装

何はともあれHello World!

先ずはHello Worldから始める。print文を使えばそのまま表示する事が出来る。

print("Hello World!")

実行結果

Hello World!

0から99までカウントする

世界のナベアツを作る一歩目として、先ずは普通にカウントしてみる。for文を使い、rangeで100を指定すると100回繰り返す事が出来る。

for count in range(100):
    print(count)

実行結果

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

3の倍数の時だけアホになる

繰り返す時に、if文を使って3の倍数の時だけアホになるようにする。3の倍数かどうかを判定するには%を使う。これは割り算の余りを出してくれるのでそれが0であれば3の倍数と言うことである。また、アホになる時のprint文でも%dを使い、printの中に数字を入れ込む。

for count in range(100):
    if count %3 == 0 : ## 3で割った時余りが0であれば
        print("( ´∀`) %d !" % count) ## %d の中にcountを入れる。
    else: ## それ以外の時は普通にカウント
        print(count)

実行結果

( ´∀`) 0 !
1
2
( ´∀`) 3 !
4
5
( ´∀`) 6 !
7
8
( ´∀`) 9 !
10
11
( ´∀`) 12 !
13
14
( ´∀`) 15 !
16
17
( ´∀`) 18 !
19
20
( ´∀`) 21 !
22
23
( ´∀`) 24 !
25
26
( ´∀`) 27 !
28
29
( ´∀`) 30 !
31
32
( ´∀`) 33 !
34
35
( ´∀`) 36 !
37
38
( ´∀`) 39 !
40

=== 以下省略 ===

数字に3がつく時もアホになる

本家ナベアツは数字に3がつくときもアホになっている。その判定を追加する。条件を追加するためにはelif文を使う。今度はプログラム中のcountの変数を数字としてではなく、文字として判定しないといけない。また、先ほどのように"=="で判定すると、"3"しか条件に引っかからないので、inを使った少し緩い条件文にする。

for count in range(100):
    if count %3 == 0 : ## 3で割った時余りが0であれば
        print("( ´∀`) %d !" % count) ## %d の中にcountを入れる。
    elif "3" in str(count) : #countを文字として扱い、その中に3が含まれているかどうか判定する。
         print("( ´∀`) %d !" % count) ## %d の中にcountを入れる。
    else: ## それ以外の時は普通にカウント
        print(count)

実行結果

( ´∀`) 0 !
1
2
( ´∀`) 3 !
4
5
( ´∀`) 6 !
7
8
( ´∀`) 9 !
10
11
( ´∀`) 12 !
( ´∀`) 13 !
14
( ´∀`) 15 !
16
17
( ´∀`) 18 !
19
20
( ´∀`) 21 !
22
( ´∀`) 23 !
( ´∀`) 24 !
25
26
( ´∀`) 27 !
28
29
( ´∀`) 30 !
( ´∀`) 31 !
( ´∀`) 32 !
( ´∀`) 33 !
( ´∀`) 34 !
( ´∀`) 35 !
( ´∀`) 36 !
( ´∀`) 37 !
( ´∀`) 38 !
( ´∀`) 39 !
40

=== 以下省略 ===

3の倍数でさらに数字に3がつく場合は大アホになる

さらに本家ナベアツに近づけるため3の倍数で、さらに数字に3が付く場合は大アホになって貰う。if文の条件式を工夫して行けば実現出来る。

for count in range(100):
    if count %3 == 0 and "3" in str(count) : ## 3で割った余りが0で数字に3が含まれていれば
        print("・:*+.\(( °ω° ))/.:+  %d !!!"%count)
    elif count %3 == 0 : ## 3で割った時余りが0であれば
        print("( ´∀`) %d !" % count) ## %d の中にcountを入れる。
    elif "3" in str(count) : #countを文字として扱い、その中に3が含まれているかどうか判定する。
         print("( ´∀`) %d !" % count) ## %d の中にcountを入れる。
    else: ## それ以外の時は普通にカウント
        print(count)

実行結果

( ´∀`) 0 !
1
2
・:*+.\(( °ω° ))/.:+  3 !!!
4
5
( ´∀`) 6 !
7
8
( ´∀`) 9 !
10
11
( ´∀`) 12 !
( ´∀`) 13 !
14
( ´∀`) 15 !
16
17
( ´∀`) 18 !
19
20
( ´∀`) 21 !
22
( ´∀`) 23 !
( ´∀`) 24 !
25
26
( ´∀`) 27 !
28
29
・:*+.\(( °ω° ))/.:+  30 !!!
( ´∀`) 31 !
( ´∀`) 32 !
・:*+.\(( °ω° ))/.:+  33 !!!
( ´∀`) 34 !
( ´∀`) 35 !
・:*+.\(( °ω° ))/.:+  36 !!!
( ´∀`) 37 !
( ´∀`) 38 !
・:*+.\(( °ω° ))/.:+  39 !!!
40

=== 以下省略 ===

3以外の条件でもナベアツを作る

世界のナベアツは、元々はジャリズムと言う漫才コンビのボケ担当であった。さらに現在は落語家に転身され、"桂三度"と名乗っておられる。三度の由来は持ちギャグだけではなく、深い意味があるとのこと。。。これについてはもう少し話したい所ではあるが本題に戻す。世界のナベアツ桂三度であるならば、異世界には桂四度がいるかも知れないし、桂九度が居るかも知れない。そこで、桂N度を作って行こうと思う。

例えば、桂四度を作ろうと思うとどうするか?勿論プログラム中の3を4に変えれば簡単に作ることが出来る。しかしその方法だと、この程度の規模のプログラムならともかく、今後複雑なプログラムで対応しようと思うと非常に大変になる。そこで、今回のプログラムを関数にすることを考える。関数とは、似た様な処理をまとめる仕組みの事である。

関数を作るためにはdefを使う。

def 関数名(引数):

で作る事が出来る。 あとは、3にしていた所をNにして行けば良い。 但し、"3"を単純に"N"にしてしまうと、数字に"N"という文字が含まれているかの判定になってしまい、意図した動作にならない。str(N) として、変数Nで指定した数字を文字として扱うようにしないといけない。 作成した関数を使うのは簡単で関数名と引数を指定すれば実行出来る。これで桂四度でも、桂九度でも作る事が出来るようになった。

def COUNT(N): ## 桂N度を関数にする。
    for count in range(100):
        if count % N == 0 and str(N) in str(count) : 
            print("・:*+.\(( °ω° ))/.:+  %d !!!"%count)
        elif count % N == 0 : 
            print("( ´∀`) %d !" % count) 
        elif str(N) in str(count) : 
            print("( ´∀`) %d !" % count) 
        else: 
            print(count)

COUNT(N=4) ## 桂四度として実行

実行結果

( ´∀`) 0 !
1
2
3
・:*+.\(( °ω° ))/.:+  4 !!!
5
6
7
( ´∀`) 8 !
9
10
11
( ´∀`) 12 !
13
( ´∀`) 14 !
15
( ´∀`) 16 !

=== 以下省略 ===

複数の関数をまとめたクラスを作る

世界のナベアツは現在は落語家であるし、最近は3の時だけアホになるギャグをテレビで見かける事はほぼ無い。ここでは桂N度に落語家らしい色々な動作をさせてみようと思う。つまり、色々な関数を作るというである。さて、関数を作るだけなら何通りも作れば良いだけなのだが、後々利用する事を考え、関数をまとめて管理することを考えたい。この複数の関数をまとめて上手く管理する仕組みこそクラスと呼ばれ、オブジェクト指向プログラミングの大切な入り口となる考え方である。

以下にコードを示す。記述内容は、冒頭にclassを宣言し、関数が増えたようなイメージであるが、いくつか見慣れないものがあると思う。まず、変数としてNを使っていたが、大部分がself.Nに変わっている。他にもちらほらselfという言葉が含まれている。これはclassを使う時に必要になるものである。じゃあ、classって何だ?という事になるが、一番イメージしやすいのは"学校のクラス"では無いだろうか?色んな生徒や場合によっては先生や教室が集まってクラスの要素を形成しているが、学校ではクラスを区別するために、3組の担任の先生、とか3組の佐藤さんとか、言う必要があったのでは無いだろうか?selfとは、自分のクラスのという意味である。ちなみに、クラスを複数まとめてさらに大きなクラスを作ったり、まとめる規模が大きくなるとパッケージの様な階層構造になって行くが考え方は同じである。東京都の桜中学の3年のB組の担任というように階層が増えて行くイメージである。 また、先程までdefで定義するのは関数と呼んでいたが、classの中の関数はメソッドと呼ぶ。ただ、これは呼び方だけの問題だと思って差し支えは無いだろう。

class NABEATSU():
    def __init__(self,N):
        self.N = N

    def COUNT(self): ## 桂N度を関数にする。
        for count in range(100):
            if count % self.N == 0 and str(self.N) in str(count) : 
                print("・:*+.\(( °ω° ))/.:+  %d !!!"%count)
            elif count % self.N == 0 : 
                print("( ´∀`) %d !" % count) 
            elif str(self.N) in str(count) : 
                print("( ´∀`) %d !" % count) 
            else: 
                print(count)

    def YOSE(self): ## 挨拶するプログラムを作る。
        print("どうも〜、桂%d度です〜"%self.N) 

Nabeatsu = NABEATSU(N = 3) ## 桂三度を呼び出す。
Nabeatsu.YOSE()
Nabeatsu.COUNT()

実行結果

どうも〜、桂3度です〜
( ´∀`) 0 !
1
2
・:*+.\(( °ω° ))/.:+  3 !!!
4
5
( ´∀`) 6 !
7
8
( ´∀`) 9 !
10
11
( ´∀`) 12 !
( ´∀`) 13 !
14
( ´∀`) 15 !

=== 以下省略 ===

オブジェクト指向プログラミングとは

世の中には様々なプログラミング言語が存在するが、Pythonは分類で言うとオブジェクト指向プログラムに属する。オブジェクト指向プログラミングにおいて、重要なクラスと言う概念が出て来たので簡単にオブジェクト指向プログラミングについて触れておく。先程、世の中には様々なプログラミング言語があると書いたが、何故それ程多くのプログラミング言語があるのだろうか?それは、バグの少ないコードを書くためにプログラミング言語自体を工夫して行った結果である。では規模の大きなプログラムを書く場合、つまりプログラムで解決しようとする課題が難しい場合、どの様に解決して行くだろうか?通常は、難しい課題に直面した時は、簡単な課題に分解して行くのが普通ではないでしょうか?それをオブジェクト指向プログラミングでは担当者に分担するようなイメージで分解して行く。つまり、classが担当者のイメージである。担当者が出来る事がメソッドである。オブジェクト指向において、プログラミングをするという事は新人を育てて、一人前の担当者に育て上げる事に似ている。まずはclassを定義し、どの様な業務を担当して欲しいか考える。その業務に必要な作業をメソッドとして教え込む。必要なメソッドを教え込む事が出来れば、それで立派な担当者となってくれる。実際のプログラムで、例えばエクセルのデータを処理するプログラムを作る場合、

* エクセルを読み込むクラス
* データを処理するクラス
* データをエクセルに書き出すクラス

のように作業を幾つかのクラスに分担して、必要なメソッドを実装して行くと、効率良く間違えにくいプログラミングをすることが出来る。

まとめ

世界のナベアツを実装することから始まり、オブジェクト指向的なプログラムの書き方まで一気に進めた。但し、内容はかなり端折っていて、細かいことにはかなり目を瞑って進めた。実際にプログラムを進めるためには他にも様々なことを知る必要はあるものの、ある程度プログラミングの全体像を学ぶことは出来たと思う。

sbtについて学ぶ

以前scala世界のナベアツを実装した。これは、scalaの基本を学ぶためにスクリプトと呼べる位の小規模なプログラムで、scalaコマンドを使い、特にファイルやライブラリの依存とかは気にせずに実行した。しかし、プログラミングの規模が大きくなると、sbtのようなビルドツールは欠かせない。しかしながら、sbtが何をやっているか理解せず使うと謎のエラーに苦労することは目に見えている。と、いうことで実際にsbtを使う前に基本的な所を学んで行こうと思う。

ビルドとは?

sbtとは、ビルドツールである。ではそもそもビルドとは、作成したプログラムを使える状態にする事である。似たような言葉に"コンパイル"がある。これは意味としてはプログラムで書いた命令を機械語に翻訳する事だが、実はコンパイルだけでは作成したプログラムは使える状態にならない。つまり "ビルド = コンパイル + α" である。ちなみに世界のナベアツのようなプログラムは、このプラス・アルファがなく、コンパイルだけで使える。

では、そのプラス・アルファとは何か?簡単に言うと必要な命令を整理する事である。

規模が大きなプログラムになると、プログラムのソースコードは分割され、様々なファイルに散らばっている。また、様々なライブラリも活用している。プログラムの中で使うクラスが別のファイルにあり、その中でも別のファイルのクラスを参照している事はザラにある。そんなとき、どこのファイルやライブラリを参照するか?等を色々自動で考えて上手い事処理してくれるのがビルドツールである。

具体的な作業は?

アプリを開発するときのフローはプロジェクトの立ち上げ、コーディング、テスト、ビルドの順だと思うので、それぞれのフローでの具体的な作業や注意事項を見て行く。

プロジェクトを立ち上げるとき

先程のsbtコマンドでフォルダを作っても良いし、下記のサイトにあるようにhello worldのプロジェクトをロードしても良い。

sbt Reference Manual — Hello, World

コーディング

sbtのフォルダ構成に従う必要があるが、特別な作業は必要無く、普通にコーディングして行けばよい。

テスト

テストのフォルダにあるコードにテストの内容を記述して実行する。

ビルド

sbt compileで、ビルドが出来る。出来上がった実行可能なファイルはtargetの下に置かれる。

 

まとめ

今回はsbtの機能を確認した。実際に使う前なので間違って理解している事や理解が不足している事もあるかも知れないが、あとは実際に使いながら少しずつマスターして行こうと思う。実際に使いながら便利な使い方を発見したら何処かで更新して行こうと思う。

 

 

scalaの基本を学ぶ

scalaの名前はscalableなプログラミング言語というのが由来になっている。scalableとは、小規模から大規模なプロジェクトまでサポートすることを意味する。大規模なプロジェクトになると、ソースファイルも膨大になり、管理も煩雑になる。その様なファイル管理やビルドを楽に自動化してくれるツールがsbtであったりEclipseの様なIDEがある。が、何をやってるか理解せずに自動化ツールを使うのは後々の事を考えると良くない気がする。先ずは小規模なスクリプトとして使ってみるのが良いと思う。と言う事で基本的な文法を理解するまではsbtは使わずにscalacコマンドとscalaコマンドを使って勉強して行く事にする。

 

 

改めてhello world!

sbtはインストールしたのにscalaと打ってもコマンドが無いと怒られた。

以下のサイトを参考にしてscalaを入れ直す。

入門 | Scala Documentation

実行すると、sbtも入れている気配がする。

どうやらこれを入れるとsbtも入るらしい。なら最初からこのサイトを参考にすれば良かったと思わなくも無い。依存関係でおかしくならないか不安だが、とりあえず困ってから考えよう。

Hello Worldとして、下記のコードを記述する。

 

<hello.scala>

object Hello extends App{
  println("Hello World!")
}

 

コマンドとしては以下を打つと実行結果は以下の様になった。

>>scala hello.scala Scala
Hello World!

出来ていそうだ。

 

日本版FizzBuzz

プログラミングを学習するときの有名な題材にFizzBuzz問題というのがある。英語圏の飲み会とかで行われる山手線ゲームみたいなものらしく、数字をカウントして行き、3の倍数ならFizz

5の倍数ならBuzz、15の倍数ならFizzBuzzというのがルールらしい。とは言え、日本人には馴染みが無いゲームなので近くてイメージが付きやすいものを題材にする。そう、世界のナベアツである。

世界のナベアツを作る

数字を40まで数えて、3の倍数か数字に3が含まれるときはアホになる。

早速この動作を実装して行く。

object Nabeatsu extends App{
  println("Count Start")
  for(count <- 1 to 40){
    if(count % 3 == 0 || count.toString.matches(".*3.*")){
      println("(^ o ^ )/ %d".format(count))
    }
    else{
      println("count %d".format(count))
    }
  }
}

実行結果

>> scala nabeatsu.scala Scala
Count Start
count 1
count 2
(^ o ^ )/ 3
count 4
count 5
(^ o ^ )/ 6
count 7
count 8
(^ o ^ )/ 9
count 10
count 11
(^ o ^ )/ 12
(^ o ^ )/ 13
count 14
(^ o ^ )/ 15
count 16
count 17
(^ o ^ )/ 18
count 19
count 20
(^ o ^ )/ 21
count 22
(^ o ^ )/ 23
(^ o ^ )/ 24
count 25
count 26
(^ o ^ )/ 27
count 28
count 29
(^ o ^ )/ 30
(^ o ^ )/ 31
(^ o ^ )/ 32
(^ o ^ )/ 33
(^ o ^ )/ 34
(^ o ^ )/ 35
(^ o ^ )/ 36
(^ o ^ )/ 37
(^ o ^ )/ 38
(^ o ^ )/ 39
count 40

異世界のナベアツを作る

この世界のナベアツは3の時と数字に3が含まれるときだった。落語家としての名前も桂三度である。だけど、異世界には桂四度が居るかも知れないし、桂九度だって居るかも知れない。と、言う事で桂N度を作ってみよう。

先程の処理をCOUNTという関数に定義し、Nという引数で桂N度を作る。

最後にN = 4として実行する。

object Nabeatsu extends App{
  val COUNT = (N:Int)=>{ // COUNTと言う関数を定義する。
    println("Count Start")
    for(count <- 1 to 40){
      if(count % N == 0 || count.toString.matches(".*%s.*".format(N.toString))){
        println("(^ o ^ )/ %d".format(count))
      }
      else{
        println("count %d".format(count))
      }
    }
  }
  COUNT(4) // その関数を使う。今回はN = 4とする。
}

実行結果

>> scala nabeatsu2.scala Scala
Count Start
count 1
count 2
count 3
(^ o ^ )/ 4
count 5
count 6
count 7
(^ o ^ )/ 8
count 9
count 10
count 11
(^ o ^ )/ 12
count 13
(^ o ^ )/ 14
count 15
(^ o ^ )/ 16
count 17
count 18
count 19
(^ o ^ )/ 20
count 21
count 22
count 23
(^ o ^ )/ 24
count 25
count 26
count 27
(^ o ^ )/ 28
count 29
count 30
count 31
(^ o ^ )/ 32
count 33
(^ o ^ )/ 34
count 35
(^ o ^ )/ 36
count 37
count 38
count 39
(^ o ^ )/ 40

出来ていそうだ。

 

ナベアツは落語も出来る

先程も少し触れたが世界のナベアツは現在は落語家に転身されている。と、言う事で先程は数字をカウントするメソッドを作ったが、寄せで自己紹介するメソッドも追加してみる。

object Test extends App{
  val Nabeatsu = new Nabeatsu() // ナベアツクラスのインスタンス化
  Nabeatsu.yose(3) // 寄せのメソッドを使う。
  Nabeatsu.count(3) // カウントのメソッドを使う。
}

class Nabeatsu { //ナベアツクラスを作る。
  def yose = (N:Int)=>{ // 寄せで自己紹介するメソッドを定義する。
    println("どうも〜、桂%d度です〜".format(N))
  }

  def count = (N:Int)=>{ // countと言うメソッドを定義する。
    println("Count Start")
    for(count <- 1 to 40){
      if(count % N == 0 || count.toString.matches(".*%s.*".format(N.toString))){
        println("(^ o ^ )/ %d".format(count))
      }
      else{
        println("count %d".format(count))
      }
    }
  }
}

実行結果

free/ >> scala nabeatsu3.scala Scala
どうも〜、桂3度です〜
Count Start
count 1
count 2
(^ o ^ )/ 3
count 4
count 5
(^ o ^ )/ 6
count 7
count 8
(^ o ^ )/ 9
count 10
count 11
(^ o ^ )/ 12
(^ o ^ )/ 13
count 14
(^ o ^ )/ 15
count 16
count 17
(^ o ^ )/ 18
count 19
count 20
(^ o ^ )/ 21
count 22
(^ o ^ )/ 23
(^ o ^ )/ 24
count 25
count 26
(^ o ^ )/ 27
count 28
count 29
(^ o ^ )/ 30
(^ o ^ )/ 31
(^ o ^ )/ 32
(^ o ^ )/ 33
(^ o ^ )/ 34
(^ o ^ )/ 35
(^ o ^ )/ 36
(^ o ^ )/ 37
(^ o ^ )/ 38
(^ o ^ )/ 39
count 40

出来ていそうだ。

 

今回学んだ事のまとめ

今回はscalaの基本的な文法を世界のナベアツを題材にして学んだ。sbtを使わずにscalaコマンドを使う事でオブジェクトやクラスの仕組みを学んだ。必要な事はその都度検索する事にはなるものの、ある程度プログラミングで何かが作れるようにはなった筈。最後に学んだ事を以下にあげる。

  • scalaコマンドによる実行方法(Hello World)
  • for文の使い方
  • if文の使い方
  • printlnの中に数字を入れ込む方法(formatの使い方)
  • IntをString型に変換する方法
  • 正規表現の使い方(match)
  • 関数の作り方
  • クラスの作り方

Scala逆引きレシピ すぐに美味しいサンプル&テクニック300 (Programmer’s recipe) [ 竹添直樹 ]

価格:3,520円
(2023/6/8 07:27時点)
感想(0件)

 

 

scalaの開発環境を整える

0:はじめに

scalaに限らず、全てのプログラミングにおいて最低限必要な物は実行環境だと思うので、先ずはそれを準備する。

1:なにはともあれ'hello world!'

scala の実行環境と言えばsbtらしいのでそれをそのまま鵜呑みにする。

www.sejuku.net

とりあえず、この記事の通り、適当なディレクトリを作って、

'sbt'と打ってみると

何となくプロジェクトフォルダっぽいものが出来上がった。

'hello.scala'を作って、sbt内で'compile→run'でHello Worldが表示された。

2:テキストエディタくらいは欲しい

テキストエディタとして、VS CODEを導入。

下記のリンクからダウンロードしてダブルクリックするだけで動かせた。

code.visualstudio.com

vislal stdio codeはターミナルとも連携が出来るので、画面の下でターミナルを動かす事も可能。

ただ、scalaの文法がデフォルトでは入ってないのか、ハイライトが付かない。

code ->preference->extention を選択すると、色々と拡張出来る。

scalaと検索し、一番上に出て来たScala Syntax Officialをinstall すると、色が着いた。

3:将来はIDEも。。。

とりあえず、SCALAのコードを書いて動作を確認する事までは出来た。しかし、ソースコード意外に必要なファイルの準備やプロジェクト作成、コンパイルなどが結構手間。世の中にはそのような手間を省いてくれるIDE(Integrated Development Environment,統合開発環境)なるものがあり、その手の手間をかなり省いてくれる。しかし、仕組みを理解しないまま、それに頼ると後々苦労しそうなので、一旦は今の環境で進めてみる事にする。