logo

paizaがお届けする、テック・キャリア・マネジメント領域の「今必要な情報」を届けるWebメディア

Node.js入門 - 初心者向け、はじめてのNode.js入門

f:id:paiza:20180607135435p:plain
(English article is here)

f:id:paiza:20151217152725j:plainこんにちは、吉岡([twitter:@yoshiokatsuneo])です。

Node.jsはサーバサイドのJavaScript環境です。

JavaScriptは、現在広く使われているプログラミング言語の一つです。

JavaScriptはブラウザ上でプログラムを動かすために作られた言語で、ネットワーク処理や非同期処理に強いといった特徴があります。

そのJavaScriptを、ブラウザの枠を飛び出して、サーバサイドでも使えるようにしたのがNode.jsです。Node.jsをサーバサイドで動作させることで、柔軟で効率よく、リアルタイム処理にも強いWebサービスが作れます。

通常Webサービスを作る場合は、ブラウザで動作するJavaScriptとサーバサイドで動作する別の言語(Ruby on Railsなど)を使う必要がありますが、複数の言語を行ったり来たりすると開発効率も下がってしまいますよね。

そんなときもNode.jsを使えば、ブラウザ側もサーバ側もJavaScriptひとつで記述できます。言語の切り替えがなくなり、サーバとブラウザで同じコードやライブラリを利用できるので、開発効率が上がります。特に、開発初期やプロトタイピングなど試行錯誤が必要で、ブラウザ側とサーバ側ではっきり役割分断することが難しい場合には大きな効果を発揮します。

実際、Node.jsは人気が高く、質問サイト「StackOverflow」でも、Node.jsは開発者に最も使われているツールとしてあげられています。

f:id:paiza:20180607135653p:plain (From Developer Survey Results 2018)

ただ、いざ開発で使おうとすると、Node.jsやデータベースを動かすための環境構築やデプロイなどが必要になります。これが意外と厄介で、手順通りにインストールしたつもりでも、OSやバージョン、他のソフトウェアなど、さまざまな原因でエラーが出たりして失敗することもあります。

そこで、今回はブラウザだけでNode.jsを使ったWeb開発ができるPaizaCloud Cloud IDEを使ってみます。

PaizaCloudは自由度が高く、さまざまなフレームワークや言語を使ったWeb開発が、初心者でも簡単にできます。PaizaCloudを使えば、最短でNode.jsを使ったWeb開発が始められます。

開発環境がクラウド上で動作しているので、自分でサーバなどを用意しなくても、作ったウェブサービスはその場で公開することもできます!

まずは簡単なプログラムからはじめて、ToDoリスト(タスクリスト)を編集するサービスをNode.jsで作ってみましょう。現時点で最新の安定板Node.js 8.xでの手順を紹介します。手順に沿って進めれば、10分程度で作れるかと思いますのでぜひ挑戦してみてください。

PaizaCloud Cloud IDEを使う

それでは、始めていきましょう。

PaizaCloud Cloud IDEのサイトはこちらです。

https://paiza.cloud/

メールアドレスなどを入力して登録すると、登録確認メールが送られてきます。GitHubやGoogle(Gmail)ログインを利用すると、ボタン一つで登録することもできます。

サーバを作る

開発環境となるサーバを作りましょう。

f:id:paiza:20171213234155p:plain

「新規サーバ作成」ボタンを押して、サーバ作成画面を開きます。

今回はデータベースにMondoDBを利用しますので、MongoDBをクリックして「新規サーバ作成」ボタンを押します。

f:id:paiza:20180607135933p:plain

3秒程度で、Node.jsを使える開発環境がブラウザ上にできあがります。

プロジェクトの作成

それでは、Node.jsを使ってWebアプリケーションを作成してみましょう。

アプリケーション作成時には、"npm init"というコマンドを使います。

PaizaCloudでは、ブラウザ上でコマンドを入力するための「ターミナル」を使うことができます。

画面左側の、「ターミナル」のボタンをクリックします。

f:id:paiza:20171213234317p:plain

ターミナルが起動しますので、"npm init"のようにコマンドを入れて、エンターキーを押します。 "package name:"とプロンプトが表示されますので、アプリケーション名を入れます。

"アプリケーション名"というのは作るアプリケーションの名前なので、"music-app"、"game-app" みたいな感じで、好きな名前にするといいですね。

ここでは、アプリケーション名は"myapp"としておきます。他の項目は特に設定する必要はありませんので、空欄でエンターキーのみ入力しておきます。

$ npm init
...
package name: (ubuntu) myapp
...

f:id:paiza:20180905144532p:plain

画面左側のファイルファインダを見ると、package.jsonというファイルが作られています。 package.jsonは、アプリケーションが利用するライブラリを管理するNode.jsのアプリケーションに必要なファイルです。

f:id:paiza:20180607140318p:plain

Node.jsでWebサービスを作成する場合、通常ExpressというWebアプリケーションフレームワークを利用しますので、Expressパッケージをインストールしておきます。パッケージをインストールするには、"npm install パッケージ名 --save"というコマンドを使います。

$ npm install express --save

インストールすると、node_modulesというディレクトリが作成されます。 この中に、アプリケーションが利用するパッケージがインストールされます。

次に、Webアプリケーションのプログラムを作成します。まずは、"Hello Node.js!"と表示するアプリケーションを作成してみましょう。

ファイルを作成するには、PaizaCloudの画面左側の"新規ファイル"ボタンをクリックするか、ファイル管理ビューの右クリックメニューから"新規ファイル"を選択します。

f:id:paiza:20180607140405p:plain f:id:paiza:20180607140439p:plain

ファイル作成ダイアログが表示されますので、ファイル名に"server.js"と入れて、作成ボタンを押します。

f:id:paiza:20180607140526p:plain

ファイル"server.js"が作成されますので、以下のようにコードを書いていきましょう。

server.js:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Hello Node.js!');
});

app.listen(3000, () => {
    console.log("My app listening on port 3000!");
});

f:id:paiza:20180607140657p:plain

編集したら、「保存」ボタンを押すか、「Command-S」または「Ctrl-S」で保存します。

このコードを見ていきましょう。1,2行目では、利用するExpressライブラリを読み込んでいます。 4行目の"app.get('/',..."では、トップページ、つまりURLのパス名が"/"の時の動作を関数で書いていきます。ここでは、"res.send()"関数を使って'Hello Node.js'という内容を表示しています。 8行目のapp.listen(3000, ...)でサーバを3000番ポートで起動します。

アプリケーションの起動

それでは作成したアプリケーションを実際に動かしてみましょう!

"node server.js"コマンドで、作成したプログラムを起動します。

$ node server.js

f:id:paiza:20180607141032p:plain

画面の左側に、"3000"と書かれたボタンが追加されました。

f:id:paiza:20180607141059p:plain

作成したアプリケーションは3000番ポートでサーバが起動します。PaizaCloudでは、この3000番ポートに対応したブラウザ起動ボタンを自動で追加しています。

ボタンをクリックすると、ブラウザ(PaizaCloudの中で動くブラウザ)が起動して、メッセージが表示されました!

f:id:paiza:20180607141152p:plain

なお、このサーバはHTTPで動作していますが、PaizaCloudではこれをHTTPSに変換しています。またサーバはlocalhostで動作していますが、PaizaCloudでは"https://localhost-サーバ名.paiza-user.cloud:ポート番号"というURLでlocalhostに接続できるようになっています。

データベースの起動

今度はこのアプリケーションで、データベースを使ってみましょう。 サーバ作成時に"MongoDB"をチェックしたので、すでにデータベースは起動していますが、もし起動していない場合は、以下のコマンドで起動しておきます。

$ sudo systemctl enable mongod
$ sudo systemctl start mongod

PaizaCloudでは、このようにroot権限でパッケージをインストールすることもできます。

ToDoリストの作成(サーバ)

それでは、ToDoリストを作成していきます。

まずは、サーバ側のプログラムを作成します。

ToDoリストでは、一覧表示、タスクの追加、タスクの削除の3つの操作を行います。 それぞれ、以下のようなルーティングを割り当てます。

メソッド パス名 操作
GET /todos タスク一覧表示
POST /todos タスク追加
DELETE /todos/{id} タスク削除

これらの操作を実装していきます。

まず、プログラムで利用するmongooseライブラリを追加します。

$ npm install mongoose --save

次に、server.jsファイルを開いて、以下のように書き換えます。

server.js:

const express  = require('express');
const app = express();
const mongoose = require('mongoose');
const bodyParser = require('body-parser');

app.use(express.static(__dirname + '/public'));
app.use(bodyParser.json());

mongoose.connect('mongodb://localhost/mydb');

const Todo = mongoose.model('Todo', {
    text : String
});

app.get('/api/todos', (req, res) => {
    Todo.find()
        .then((todos) => {
            res.json(todos);
        })
        .catch((err) => {
            res.send(err);
        })
});

app.post('/api/todos', (req, res) => {
    const todo = req.body;
    Todo.create({
            text : todo.text,
        })
        .then((todo) => {
            res.json(todo);
        })
        .catch((err) => {
            res.send(err);
        });
});

app.delete('/api/todos/:todo_id', (req, res) => {
    Todo.remove({
            _id : req.params.todo_id
        })
        .then((todo) => {
           res.send(todo); 
        })
        .catch((err) => {
            res.send(err);
        });
});

app.get('/', (req, res) => {
    res.sendfile('./public/index.html');
});

app.listen(3000, () => {
    console.log("My app listening on port 3000!");
});

コードを見ていきましょう。 1-4行目では、利用するライブラリを読み込んでいます。

6-7行目では"app.use()"でミドルウェアを設定しています。ミドルウェアを使えばNode.jsに機能を追加できます。ここでは、"public"ディレクトリのファイルを静的ファイルとして読み込むための"express.static(__dirname + '/public')"と HTTPリクエストでJSON形式を利用するための"bodyParser.json()"を利用しています。

9行目の"mongoose.connect('mongodb://localhost/mydb')"では、Mongooseというライブラリを利用してMongoDBと接続しています。MongooseはMongoDBをNode.jsから利用するためのライブラリです。

11行目では、以下のようにMongoDBのコレクション(テーブル)をモデルとして定義していきます。

const Todo = mongoose.model('Todo', {
    text : String
});"

MongoDBはスキーマのないデータベースですので、型を定義する必要はありませんが、Mongooseを利用することで型が利用でき、データベースの整合性を保ちやすくなります。 ここでは、"todo"コレクション(テーブル)と、その中の文字列型の"text"フィールド(カラム)を定義しています。

その後、"app.get", "app.post", "app.delete"関数で、ルーティングを設定しています。Todo.find()、Todo.create()、Todo.remove()関数を使って、データベースのドキュメント(レコード)を検索、作成、追加します。これらの関数はPromiseとして利用できるので、成功したらthen()の関数が、失敗したらcatch()の関数が呼びだれます。ここでは成功した場合、res.send()で結果をJSON形式でレスポンスとして返しています。

そして、"app.get('/'..."ではトップページで"public/index.html"ファイルを返すようにしています。

ToDoリストの作成(HTML)

次に、ブラウザで表示するHTMLファイルを作成しましょう。

まず、静的ファイルを保存する"public"フォルダを作成します。 ファイル管理ビューのホームディレクトリ("/home/ubuntu")を右クリックして、「新規フォルダ」を選択し、"public"ディレクトリを作成します。

次に、"public"ディレクトリを右クリックして「新規ファイル」を選択し、"index.html"ファイルを作成します。

"public/index.html"ファイルが作成できましたので、以下のように記述します。

public/index.html:

<!doctype html>
<html>
<head>
    <title>Todo List</title>
    <link rel="stylesheet" href="//cdn.rawgit.com/milligram/milligram/master/dist/milligram.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="client.js"></script>
</head>
<body>
    <div class="container">
      <h1>Task List</h1>

      <div class="form-group">
          <input type="text" name="name" class="new-todo-text form-control" placeholder="task">
          <button type="submit" class="btn btn-default" onclick="createTodo()">Add</button>
      </div>

      <h2>Current Tasks</h2>
      <table class="table table-striped task-table">
          <thead>
              <th>Task</th><th>&nbsp;</th>
          </thead>

          <tbody class="todos">
              <tr class="todo template" style="display: none;">
                  <td>
                      <span class="text"></span>
                      <span class="id" style="display: none;"></span>
                  </td>
                  <td>
                      <button onclick="deleteTodo(this)">Delete</button>
                  </td>
              </tr>
          </tbody>
      </table>
    </div>
</body>
</html>

このHTMLファイルを見ていきましょう。ヘッダでは、Milligramという簡単に利用できるCSSフレームワークと、jQueryと、あとで作成するclient.jsファイルを読み込んでいます。

"Add ToDo"ボタンでは、クリックされたときに"createTodo()"関数を呼び出します。

ToDo一覧表示はテーブルで行います。<tr>タグの中は繰り返し表示する内容で、client.jsで処理します。"Delete"ボタンが押されたら、削除動作を行う"deleteTodo()"関数を呼び出します。

ToDoリストの作成(クライアントJavaScript)

次に、ブラウザで動作するクライアントサイドJavaScriptのコードを書いていきましょう。

PaizaCloudで"public"フォルダを右クリックし、"client.js"ファイルを作成します。

作成した"client.js"ファイルに以下のように記述します。

public/client.js:

function render(todos){
    $(".todos").children().not(".template").remove();
    const template = $(".todos").children(".template");

    todos.forEach((todo) => {
        const node = template.clone(true).show().removeClass("template")

        node.find(".text").text(todo.text);
        node.find(".id").text(todo._id);
        $(".todos").append(node);
    });
}
function getTodos(){
    fetch('/api/todos')
        .then((data) => data.json())
        .then((json) => {
            const todos = json;
            render(todos);
        });
}

function createTodo(){
    const text = $(".new-todo-text").val();
    fetch('/api/todos', {
            method:"POST",
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({text: text}),
        })
        .then(() => {
            getTodos();
        });
}

function deleteTodo(el){
    const id = $(el).closest(".todo").find(".id").text();
    fetch(`/api/todos/${id}`, {
            method: 'DELETE'
        })
        .then(() => {
            getTodos();
        });
}

$(getTodos);

コードを見ていきましょう。 render()関数では、引数で指定されたToDo一覧を表示します。一覧表示は、"template"クラスの部分をコピーし、"text", "id"クラスのテキストを置き換えて行います。

getTodos()関数では、"GET /api/todos"リクエストでサーバからToDo一覧を取得し、render()で一覧表示を行います。

createTodo()関数では、"new-todo-text"クラスのテキスト入力フォームの値を取得し、"POST /api/todos"リクエストを送信してToDoを追加します。

deleteTodo()関数では、"DELETE /api/todos/${id}"リクエストを送信し、指定IDのToDoを削除します。

ページ取得時にToDo一覧を表示できるように、$(getTodos)で、"getTodos()"関数を呼び出します。

動作確認

プログラムは以上です。実際に動かしてみましょう。

実行中の"node server.js"コマンドをCtrl-Cキーで終了し、再起動します。

$ node server.js

このように、コード変更後の再起動が必要になりますが、以下のようにnodemonを利用すれば 自動で再起動するようになります。

$ npm install nodemon --save
$ nodemon server.js

ブラウザアイコン(3000)をクリックして、PaizaCloud内のブラウザを起動します。

最初はタスクはないのですが、"Task List"ページが表示されています。

タスクの追加や削除もやってみましょう。

f:id:paiza:20180607142401p:plain

動きましたね!これでNode.jsで作ったタスクリストの完成です!

なお、PaizaCloudの無料プランでは、一定時間が経つとサーバは停止します。継続的に動かしたい場合は、ベーシックプランへアップデートしてください。

詳しくはこちら https://paiza.cloud

まとめ

というわけで、PaizaCloudを使って、開発環境を構築することなく、ブラウザだけでNode.jsのWebアプリケーションを作ってみました。

PaizaCloudを使えばすぐに作れますし、そのまま公開もできますので、みなさんもぜひ試してみてください!

(何かサービスができたらpaiza( @paiza_official )まで教えてくれるとうれしいです!)


PaizaCloud」は、環境構築に悩まされることなく、ブラウザだけで簡単にウェブサービスやサーバアプリケーションの開発や公開ができます。 https://paiza.cloud


paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。

そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

paizaのスキルチェック

初心者でもゲーム感覚でプログラミング練習問題を解きまくれるサイト6選

f:id:paiza:20180606133155j:plain
Photo by Paris Buttfield-Addison
f:id:paiza:20140916135428p:plainこんにちは。谷口です。

ITエンジニアやプログラミングを勉強中の皆さんは、プログラミング問題を解くのはお好きですか?

プログラミングが好きな方の中には

  • 業務とは直接関係ないけどプログラミング問題をもっと解きたい!
  • プログラミング初心者で勉強中だから、練習問題をたくさん解きたい!

という方も多いかと思います。

プログラミング入門者にとって、練習問題を解きまくるのは非常によい勉強方法です。

そこで今回は、プログラミングの勉強に使える、練習問題をたくさん解けるサイトを6件ご紹介いたします。


【目次】

■プログラミングの練習問題をたくさん解けるサイト

Codecademy

f:id:paiza:20150203192239p:plain
Codecademyは、問題を解きながら実際にWebサイトを作ったりする実践的で本格的なコースで学習をすることができます。JavaScript、HTML/CSS、Ruby、Python、PHPなど多数の言語が学べます。

サイト内は一部のみ日本語対応していますが、ほとんどは英語のみの表示となっています。

CodinGame

f:id:paiza:20151214182233p:plain
CodinGameは対応言語が大変多く、ビジュアルも美しいゲームで、多数の言語に対応しています。

f:id:paiza:20151214182528p:plain
シューティングやアクション、パズル等いろいろなゲームがあり、レベルもトレーニングコースから応用コースまであるので、初心者から中・上級者まで楽しく遊びながらたくさんの問題を解けます。

CodingBat

f:id:paiza:20150902150700p:plain
CodingBatでは、JavaとPythonの問題をオンラインで練習することができます。英語にしか対応していませんが、その場で回答コードを書けば結果を判定してくれますので、とにかくたくさん問題を解いて練習がしたい人にはぴったりだと思います。

CheckiO/Empire of Code

f:id:paiza:20180606133650j:plain
CheckiOとEmpire of Codeは、JavaScriptかPythonでプログラミング問題を解きながら進めていくゲームです。問題は段階的に難しくなっていくので、初心者でも始めやすいかと思います。

Elevator Saga

f:id:paiza:20160530175817p:plain
ちょっと変わり種ですが、Elevator Sagaは、エレベーターのアルゴリズムをJavaScriptで書くゲームです。

何秒間のうちに何人を運ぶなどといった条件がステージごとに決まっているので、クリアを目指してコードを追記・修正したりしながら、エレベーターの動きを制御します。

実際に画面に表示されたエレベーターの動きで実行結果がわかるので、シンプルですが意外にハマります。

paizaのスキルチェック問題


paizaでは、Ruby、Python、JavaScript、Java、PHP、C、C++、C#など多数の主要言語に対応したスキルチェック問題を公開しています。

プログラミング問題を解いた結果によりS・A・B・C・D・Eの6段階で自分のスキルのランクが分かります。問題はレベルごとに分かれており、初心者から上級者の方まで挑戦していただけますので、「自分のプログラミングスキルを客観的に知りたい」「とにかくたくさん問題が解きたい」という方はぜひチャレンジしてみてください。

paizaのスキルチェック問題では、本日からもうすぐ累計100万受験突破記念キャンペーンを開始しました。

スキルチェック問題を解くと、100万人目ジャスト賞・ニアピン賞、もしくはチャレンジ賞として抽選でAmazonギフト券が当たります!

「まだ解いていないスキルチェック問題がある!」という方は、ぜひこの機会に挑戦してみてください!

100万受験突破記念キャンペーンについて詳しくはこちら

■まとめ

プログラミング問題を解くことは勉強になりますし、何より自分のレベルに合ったプログラミング問題が解けるとプログラミングの楽しさを実感することができると思います。

問題が公開されているサイトはたくさんありますので、ぜひプログラミング問題に挑戦して、スキルアップにつなげていただければと思います。



 

paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。

詳しくはこちら

paizaラーニング

そしてpaizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

詳しくはこちら

paizaのスキルチェック

Rubyっぽいコードが爆速で動く!?CrystalとRubyを比較してみた

f:id:paiza:20180601114111p:plain
(English article is here)

f:id:paiza:20151217152725j:plainこんにちは、吉岡([twitter:@yoshiokatsuneo])です。

皆さんは、Crystalというプログラミング言語を知っていますか?

Rubyは、綺麗な構文のオブジェクト指向言語で、シンプルで短く素直なコードを書きやすいのが魅力ですが、速度は高速なわけではありません。

速度を求めるならC言語、Rust, Go言語といったコンパイル言語が強いですが、これらの言語はどうしてもコードの記述量が多くなったり、複雑になったりしがちです。

そこで、Rubyとコンパイル言語のいいところ取りをした言語がCrystalです。

Crystalは、Rubyに近い文法にもかかわらずコンパイルでき、コンパイル言語並みの速度で実行できます。

最近話題になっているので、名前ぐらいは知っている方も多いかと思いますが、実際に使った経験がある方は少ないのではないでしょうか?

新しい言語は、情報を読むだけではなく実際に手を動かして使ってみることで、より理解を深められます。…と言っても、ちょっと一つの言語を触ってみるために開発環境などをすべて用意するのは面倒ですよね。

CrystalはまだWindowsには対応していませんし、手順通りにインストールしたつもりでも、OSやバージョン、ほかのソフトウェアなど、さまざまな原因でエラーが出たりして失敗することもあります。

そこで、今回はブラウザだけでCrystalを使ったWeb開発ができるPaizaCloud Cloud IDEを使ってみます。

PaizaCloudは自由度が高く、さまざまなフレームワークや言語を使ったWeb開発が、初心者でも簡単にできますので、最短でCrystalを使った開発が始められます。開発環境がクラウド上で動作しているので、自分でサーバなどを用意しなくても、作ったWebサービスをその場で公開することも可能です!

今回は、CrystalとRubyで、簡単な計算をするプログラムと、基本的なWebアプリを作って動かします。また、CrystalとRubyでの速度の比較もしてみます。

手順に沿って進めれば、5分程度で試せると思いますのでぜひ挑戦してみてください。

PaizaCloud Cloud IDEを使う

それでは、始めていきましょう。

PaizaCloud Cloud IDEのサイトはこちらです。

https://paiza.cloud/

メールアドレスなどを入力して登録すると、登録確認メールが送られてきます。GitHubやGoogle(Gmail)ログインを利用すると、ボタン一つで登録することもできます。

サーバを作る

開発環境となるサーバを作りましょう。

f:id:paiza:20171213234155p:plain

「新規サーバ作成」ボタンを押して、サーバ作成画面を開きます。

インストール時にMySQLが動作している必要がありますので、MySQLをクリックして「新規サーバ作成」ボタンを押します。

f:id:paiza:20180228111202p:plain

3秒程度で開発環境がブラウザ上にできあがります。

f:id:paiza:20180228120822p:plain

Crystalのインストール

作成したPaizaCloud上のサーバに、最新のCrystalをインストールしてみましょう。

PaizaCloudでは、ブラウザ上でコマンドを入力するための「ターミナル」を使うことができます。

画面左側の「ターミナル」のボタンをクリックしましょう。

f:id:paiza:20171213234317p:plain

まず、Crystalのパッケージインストール時にはMySQLが動作している必要があるので、以下のコマンドで起動しておきます。

$ sudo systemctl enable mysql
$ sudo systemctl start mysql

続いて、Crystalのパッケージをインストールします。

$ curl https://dist.crystal-lang.org/apt/setup.sh | sudo bash
$ sudo apt-get install crystal

以上で準備ができました!

Crystalを使ってみる

まず、文字を表示してみましょう。まず、"hello.cr"という名前のファイルを作成しましょう。Crystalのプログラムは、通常".cr"という拡張子を使います。

PaizaCloudの左側の「新規ファイル」ボタンをクリックするか、ファイル管理ビューの右クリックメニューから"新規ファイル"を選択します。

f:id:paiza:20171218232330p:plain

ファイル作成ダイアログが表示されるので、"hello.cr"と名前を入れて「作成」ボタンを押します。

f:id:paiza:20180601112055p:plain

"hello.cr"ファイルが開きますので、以下のようにCrystalのコードを書きましょう。Crystalの文法はほぼRubyと同じですから、Rubyに近い感覚でコーディングできます。

hello.cr:

puts "Hello world!"

f:id:paiza:20180601112352p:plain

編集できたら、「保存」ボタンまたはCtrl-S(Command-S)で保存します。

作成したプログラムを実行するには、crystalコマンドを使います。

$ crystal hello.cr

f:id:paiza:20180601112508p:plain

"Hello world!"と表示され、Crystalでプログラムが正常に実行できました!

Crystalでは、このように直接プログラムを実行できますが、"crystal build ファイル名 --release"で一度コンパイルして、実行ファイルを作成してから実行することもできます。

"--release"オプションを付けないと最適化がされず、「高速に動作する」というCrystalの利点が活かせませんので、忘れずに付けておきましょう。

$ crystal build hello.cr --release
$ ./hello

f:id:paiza:20180601112607p:plain

CrystalとRubyで円周率を計算してみる

次に、CrystalとRubyで円周率を計算して、計算速度やメモリ使用量を比べてみましょう。

以下のようなプログラムを作成してみます。

pi.cr:

def pi(n)
  count = 0
  n.times do
    x=rand; y=rand
    if x*x + y*y < 1
      count += 1
    end
  end
  return count.to_f / (n/4)
end

puts pi(10000000)

今回は、モンテカルロ法で計算してみます。

モンテカルロ法では、1x1の正方形の中にランダムに点を作り、円の中に入る点の数を数えます。ランダムな点の数を増やせば増やすほど計算精度が上がります。今回は、1000万個の点を作ってみましょう。

このコードはRubyのコードで、RubyでもCrystalでも動作します。

まずはRubyで実行してみましょう。

~$ time ruby pi.cr
3.1417268

real    0m2.553s
user    0m2.491s
sys     0m0.059s

円周率が表示されました。約2.6秒かかっていますね。

次に、Crystalで実行してみましょう。まずはコンパイルします。

$ crystal build pi.cr --release

実行ファイル"pi"が作成されました。

それでは実行してみましょう。

$ time ./pi
3.1423996

real    0m0.265s
user    0m0.262s
sys     0m0.002s

同じく円周率が計算できましたが、今度はわずか0.27秒で、約10倍速くなっています!すごいですね!

メモリ使用量も比べてみましょう。

まずはRubyです。

$ /usr/bin/time -v ruby pi.cr 
...
        Maximum resident set size (kbytes): 8984
...

約8MBのメモリを利用していますね。

今度はCrystalです。

$ /usr/bin/time -v ./pi
...
        Maximum resident set size (kbytes): 2820
...

わずか2.8MBと、Rubyの30%ほどのメモリで動作しています!

CrystalとRubyでWebサービスを動かしてみる

次に、簡単なWebサービスを作って動かして、性能を比べてみましょう。

まずは、RubyのシンプルなWebアプリケーションフレームSinatraを使って、Webサービスを作って動かします。

以下のような"Hello Sinatra!"と表示するサービスを作成します。

sinatra_app.rb:

require 'sinatra'

get '/' do
  'Hello Sinatra!'
end

動かしてみましょう。ターミナルから"ruby sinatra_app.rb"と実行します。

$ ruby sinatra_app.rb

SinatraのWebサーバが動作しました。Sinatraはデフォルトで4567番ポートでサーバが動作します。

サーバが動作すると、PaizaCloudの画面左に、"4567"と書かれたブラウザアイコンが表示されます。

アイコンをクリックすると、PaizaCloud上でブラウザが起動します。

ここでは、Sinatraのプログラムが作成した"Hello Sinatra!"とメッセージが表示されました。

次に、Crystalで動作する、Sinatra風のWebアプリケーションフレームワークKemalでWebサービスを作成します。

まずは、Crystalのプロジェクト"crystal init app アプリケーション名"で作成します。

$ crystal init app crystal_app

crystal_appというディレクトリが作成されました。このディレクトリの中に、shard.ymlというファイルが作成されます。

CrystalではRubyのgemのようなパッケージ管理ツールshardが利用できます。ここでは、karmaパッケージを利用するので、shard.ymlファイルにパッケージを記述しましょう。

crystal_app/shard.yml:

dependencies:
  kemal:
    github: kemalcr/kemal

そして、"shards install"コマンドでパッケージをインストールします。

$ cd crystal_app
$ shards install

"src/crystal_app.cr"というファイルが作成されていますから、以下のように変更して、"Hello Crystal!"というメッセージを表示するWebサービスを作成します。

crystal_app/src/crystal_app.cr:

require "kemal"

get "/" do
  "Hello Crystal!"
end

Kemal.run

コード自体は、Sinatraで作ったときとほとんど同じですね。

それでは、コンパイルして実行してみましょう。

$ cd ~/crystal_app
$ crystal build src/crystal_app.cr --release
$ ./crystal_app

CrystalのWebサーバが動作しました!

Crystalはデフォルトで3000番ポートでサーバが動作します。

サーバが動作すると、PaizaCloudの画面左に、"3000"と書かれたブラウザアイコンが表示されます。

アイコンをクリックすると、PaizaCloud上でブラウザが起動します。

ここでは、Crystalのプログラムが作成した"Hello Crystal!"とメッセージが表示されました。

それでは、作成したRuby(Sinatra)と、Crystal(Kemal)の性能を比べてみましょう。

性能比較には"ab"コマンドを使ってみます。

まずはRuby(sinatra)の性能を測ります。

以下のコマンドでは、KeepAliveを有効にして10並列で3000リクエストを送っています。

$ time ab -k -c 10 -n 3000 http://127.0.0.1:4567/
...
real    0m1.583s
...

約1.6秒かかっています。

次に、Crystal(Kemal)の性能を測ります。

$ time ab -k -c 10 -n 3000 http://127.0.0.1:3000/
...
real    0m0.362s
...

わずか0.36秒ということで、Ruby(Sinatra)より4倍以上速くなっていますね!

メモリ使用量も比べてみましょう。 Ruby(Sinatra)とCrystal(Kemal)を/usr/bin/time -vコマンドで起動し、先ほどのabコマンドを実行したあとCtrl-Cで終了し、メモリ使用量を見てみましょう。

まずはRuby(Sinatra)です。

$ /usr/bin/time -v ruby sinatra_app.rb
...
Ctrl-C
...
        Maximum resident set size (kbytes): 22128
...

約22MBですね。

次にCrystal(Kemal)です。

$ /usr/bin/time -v ./crystal_app
...
        Maximum resident set size (kbytes): 6992
...

わずか約7MBで、1/3程度のメモリ使用量となっています!

まとめ

というわけで、CrystalとRubyを使った円周率測定とWebサービスをPaizaCloud上で作成し、比較してみました。

円周率測定ではCrystalの方が10倍程度、Webサービスでも4倍程度速くなっていましたね。両方ともメモリ使用量も1/3以下になっていたので、Crystalが非常に高速かつ軽量に動作することがわかりました。高速に動くコードを簡潔に書きたい場合などに適しているかと思います。

また、今回はPaizaCloudを使って、開発環境などを用意しなくても簡単に試すことができました。Crystalのような新しいプログラミング言語は、実際に使ってみてわかることや学べることも多いので、ぜひいろいろ試してみてください。


PaizaCloud」は、環境構築に悩まされることなく、ブラウザだけで簡単にウェブサービスやサーバアプリケーションの開発や公開ができます。 https://paiza.cloud


paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。

そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

paizaのスキルチェック

初心者におすすめ!プログラミング未経験でもJavaを学べる入門書


今回は、先日翔泳社より発売された『Java1年生 体験してわかる!会話でまなべる!プログラミングのしくみ』が、Javaをこれから勉強する入門者の方にぴったりの内容でしたのでご紹介します!

Java1年生 体験してわかる! 会話でまなべる! プログラミングのしくみ

Java1年生 体験してわかる! 会話でまなべる! プログラミングのしくみ

※Javaについて

Javaは、1990年代前半にサン・マイクロシステムズ(2010年オラクルにより吸収合併)でジェームズ・ゴスリン、ビル・ジョイらによって開発されました。

Javaは企業向けの大きなシステムから、Androidアプリなどの小さなシステムまで、さまざまな分野で非常に多く利用されている人気の言語です。

Javaを習得できれば、Webサービスだけではなく組込み系やデスクトップアプリ等、大小様々なシステムで活用できます。OSに依存せず、ライブラリも豊富なので開発の幅が広く、有名なサービスではTwitterやEvenoteでもJavaが使用されています。

Java1年生 体験してわかる!会話でまなべる!プログラミングのしくみ

<内容紹介>

第1章 Javaに触れてみよう
第2章 データと変数
第3章 プログラムの基本
第4章 オブジェクト指向って何?
第5章 もっとオブジェクト指向を知ろう

中身はこんな感じで、フルカラーイラストを交えながら、キャラクターの対話形式でJavaの基礎知識が解説されています。

f:id:paiza:20180531135214j:plain

プログラミング未経験者向けに、プログラムの書き方からしっかりページ数を割いてやさしく教えてくれます。

f:id:paiza:20180531135233j:plain

入門書として初歩的な内容の解説から始まりますので、「プログラミング全くの未経験です」という方も無理なく使える内容になっていると思います。

f:id:paiza:20180531135249j:plain

f:id:paiza:20180531135319j:plain

『Java1年生 体験してわかる!会話でまなべる!プログラミングのしくみ』、「Javaを学びたい」また「Javaを使ってプログラミング教育をしたい」という方には大変役に立つ書籍だと思いますのでご興味のある方はぜひごらんください!

Java1年生 体験してわかる! 会話でまなべる! プログラミングのしくみ

Java1年生 体験してわかる! 会話でまなべる! プログラミングのしくみ

paiza.IOについて


「第1章 Javaに触れてみよう」では、paizaが運営する無料オンラインプログラミング実行環境サービス「paiza.IO」についてもご紹介いただいております。

paiza.IOは、ブラウザ上でコードが書ける、コードをその場で実行できるオンラインプログラム実行環境です。ブラウザさえあれば、面倒な環境構築なしに、プログラミングができちゃいます。Javaはもちろん、多数のプログラミング言語に対応しています。

ブログパーツとして使えたり、GitHub(Gist)連携なんかもできますので、ぜひpaiza.IOでコードを書いてみてください!

詳しくはこちら
Online PHP/Java/C++... editor and compiler | paiza.IO



 

paizaラーニングでは、Python、Java、C#、Ruby、C言語、PHP、SQL、JavaScript、HTML/CSSなど、人気言語の動画レッスンを公開しています。

詳しくはこちら

paizaラーニング

そしてpaizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

詳しくはこちら

paizaのスキルチェック

機械学習などで人気のPythonが学べる・初心者向け動画レッスン紹介


paizaラーニングでは、動画レッスンとオンラインエディタ&実行環境を通して、未経験者でもプログラミングが学べます。

今回は、paizaラーニングの「Python入門編」で公開しているレッスン内容をご紹介します。

Pythonでプログラミングするスキルが動画と演習課題で身につく「Python入門編」は今年から全編無料となっておりますのでぜひごらんください。

■Python入門編の学び方

f:id:paiza:20150216111136p:plain

各チャプターに進むと、上のようなレッスン画面が開きます。

動画エリアでは、各チャプター約3分の動画が表示されます。

補足テキストエリアでは、動画の補足説明や、解説している問題の問題文などが表示されます。「演習課題へ進む」ボタンを押すと、そのチャプターの学習内容をもとにした類似問題が出題されます。

コードエリアでは、自由にコードの記述、実行が可能です。動画の内容を実際にコーディングして試すことができます。

入出力エリアでは、コード実行時に標準入力する入力値の設定ができ、コード実行後の出力値が表示されます。

エディタエリアでは、動画を見ながら、動画に出てきたものと同じコードをすぐに書くことができ実行結果もすぐに入出力エリアで確認することができます。面倒な設定や環境構築が不要なオンライン実行環境になっていますので、「こうしたらどうなるのかな?」と思うことがあれば、演習問題とは関係のないコーディングも自由にできます

Python入門編の概要


Python入門編1:プログラミングを学ぶ

まずはPythonでプログラミングの初歩を学びます。第一回では変数と計算について学びます。「サイコロ」Webアプリを作れるようになることを目指します。

01:Pythonとは?

このコースの目的や学習方法などを解説します。

02:Pythonでプログラムを書いてみよう

オンラインエディタを使って実際にPythonプログラムを書いていきます。まずはお約束のHello world!を書いてみましょう。

03:コメントでプログラムを見やすく!

プログラムで何をやっているかがわかりやすくなるように、コードにコメントを付ける方法を学びます。

04:HTMLを表示してみよう

Pythonを使ってHTMLを出力する方法を学びます。文字をH1や太字などにしてみましょう。

05:変数を使えるようになろう

文字や数字などのデータを格納する変数(へんすう)について学びます。変数を使えば、データが変化したときもいちいちプログラムを修正しなくてよくなります。

06:サイコロを作ろう

実行するたびに数字が変わるWebサイコロを作ります。

07:演算子で計算してみよう

演算子を使えるようになると、いろいろな計算処理を作れるようになります。

08:値段を計算してみよう

オンラインショッピングのような単価と個数に応じて合計金額を計算するプログラムを作成します。

09:データの型を覚えよう

Pythonで扱う基本的なデータの種類(型)について学びます。

Python入門編2:条件分岐、比較演算子を学ぶ

Pythonでプログラミングの初歩を学びます。「平成年度の計算」や「おみくじ」など、簡単なWebアプリケーションを作れるようになりましょう。

01:IF文による条件分岐

数値に応じて、表示するメッセージを切り替えるプログラムを作成することで、条件に応じて処理を枝分かれさせるif文について学習します。

02:複数の条件を組み合わせてみよう

複数の条件式を指定する「elif」について学習します。

03:比較演算子で条件分岐してみよう

if文で、数値が大きかったら・小さかったら…といった判断をするための比較演算子について学習します。

04:おみくじを作ってみよう

if文による条件分岐とrandint関数を使って、実行するたびに結果が変わる「おみくじプログラム」を作成してみましょう。

05:RPGのクリティカルヒットを再現

これまで覚えたif文による条件分岐とrandint関数を使って、RPGの戦闘シーンに出てくるようなクリティカルヒットをメッセージとして表示します。

06:西暦から平成何年かを求めてみよう

入力しておいた西暦年数に応じて、平成何年かを計算するプログラムを作成しましょう。

Python入門編3: ループ処理を学ぶ

同じ手順を繰り返すループ処理の基本を学びます。大量のデータを処理するためには、ループ処理が欠かせません。また、プログラムの外部からデータを入力する方法についても取り上げます。

01:数値を繰り返し表示してみよう

数字を0から9まで表示させて、for inという繰り返し命令を学びましょう。

02:条件に合わせてくり返してみよう1

条件に合わせてループ処理をするwhileの使い方を学びます。

03:条件に合わせてくり返してみよう2

whileを使ったループ処理をさらに学習して、数値を10から1までカウントダウン表示させるプログラムを作ります。またwhileを使ってRPGの攻撃シーンのようなプログラムも作ってみましょう。

04:繰り返しでHTMLを作成しよう

ループ処理の具体例として、HTMLのプルダウンメニューを作成します。また、会員登録の入力フォームで年齢を1歳から100歳まで入力できるようにしましょう。

05:データの読み込み(標準入力)

ループ処理からちょっと離れて、プログラムの外部からデータを入力する標準入力について学習します。標準入力を使うと、ファイルのデータを読み込んだり、プログラムの実行時にデータを指定したりできます。

06:複数データを読み込んでみよう

標準入力を使って、複数のデータを読み込む方法を学びます。標準入力にループ処理を組み合わせてみましょう。

07:西暦年と平成年の対応表を作ろう

ループ処理を使って、西暦年と平成年の対応表を作ります。ひとつの年だけではなく、1989年から2016年まで全ての年を出力してみましょう。

Python入門編4: リストの基礎

リストの基礎について学び、より高度で柔軟性の高いランダムくじ引きが作れるようになりましょう。

01:リストとは何かを学ぼう

規模が大きなプログラムを作るときなどに必要なリストについて、基本的な使い方を学びましょう。

02:リストを作ろう

リストの基本操作を学んで、リストの作成機能を試してみましょう。

03:リストの要素を取り出してみよう

リストの要素をいろいろな方法で取り出してみましょう。リストでは、番号を使って要素を取り出します。番号は変数で指定したり、計算して指定したりすることもできます。

04:リストを操作しよう

リストにおける要素の追加、上書き、削除といった機能を使ってみましょう。

05:ループでリストを処理しよう

リストをループ処理とともに使ってみましょう。for inとリストを組み合わせて、HTMLのプルダウンリストを作成します。

06:カンマ区切りデータを、splitで分割しよう

標準入力から取り込んだデータをリストに格納する方法を学びます。カンマで区切られた1行データを、区切りごとに分割してリストに格納しましょう。

07:複数行データを、リストに格納しよう

標準入力から読み込んだ複数行のデータをリストに格納します。読み込む行数が事前にわからなくても対応できるようにしましょう。

08:リストを使ったランダムくじ

リストを使って、RPGの戦闘シーンのようなメッセージを表示するプログラムを作ります。

Python入門編5:辞書(ディクショナリ)の基礎

Pythonにおける辞書(ディクショナリ)の基礎を学んで、RPGのアイテム一覧を作ってみましょう。

01:辞書とは何かを学ぼう

Pythonでリストと並んでよく使われる辞書について、基本的な扱い方を学びましょう。

02:辞書を作る

辞書の作成、表示、代入といった機能を試してみましょう。

03:辞書の基本操作

辞書の追加、上書き、削除といった便利な機能を試してみましょう。

04:辞書をループで処理する

辞書とループ処理を一緒に使えるようになるために、itemsと辞書を組み合わせてみましょう。

05:リストの整列

辞書から少し離れて、リストのソートについて学習します。リストをソートすると、データをアイウエオ順や数字順などに整列させることができます。

06:辞書の整列

辞書のソートについて学習します。

07:RPGのアイテム一覧を再現1

ここから、辞書とループを使ってRPGのアイテム一覧を作成します。まずは、どのようなプログラムを作るのか基本的な内容を整理しましょう。

08:RPGのアイテム一覧を再現2

実際にRPGのアイテム一覧を作りましょう。

Python入門編6:多次元リストを理解しよう

Pythonにおける多次元リストの基礎を学び、多次元リストのループ処理についても理解を深めます。

01:2次元リストとは何かを学ぼう

2つのインデックスで要素を指定する2次元リストについて、基本的な考え方を学習しましょう。2次元リストを使うと、複雑なデータを操作できるようになります。

02:2次元リストを作成する

実際に2次元リストを作成し、要素を表示させてみましょう。

03:2次元リストを操作する1

2次元リストの基本操作を学習します。リストの要素を更新したり、長さを調べたりしてみましょう。

04:2次元リストを操作する2

引き続き、2次元リストの基本操作を学習します。要素の追加や削除をしてみましょう。

05:ループでリストを処理する

2次元リストから離れて、ループを使ってリストを処理する方法について、さらに理解を深めましょう。たくさんのデータを持つリストを処理するには、ループ処理が欠かせません。

06:2次元リストをforで作成する

forを使って2次元リストを作成してみましょう。

07:ドット絵を表示する

2次元リストを使って簡単なドット絵を表示させてみましょう。元になるイラストのドットの有無を、数字のゼロイチで表して、テキストで表示します。

08:3次元リストで複数のドット絵を表示する

複数のドット絵を表示するために、3次元リストを使ってみましょう。ドット絵のパターンごとに、リストを切り替えて表示してみます。

09:enumerateで2次元リストを操作する

Pythonのenumerateを使って、2次元リストを出力します。実際にRPGの簡単なマップを作って、城と町の間を道路で接続することを目指します。

10:2次元リストのマップに道を追加する

前回に引き続き、RPGの簡単なマップを作って、城と町の間を道で接続します。

11:標準入力から2次元リスト

標準入力から2次元リストを読み込んでみましょう。複数行のカンマで区切ったデータを用意して、それを2次元リストに割り当てます。

12:2次元リストで画像を配置

ここでは、標準入力から読み込んだ2次元リストデータに合わせて、RPGのキャラクターを配置して表示させてみます。将棋のコマの初期状態のような感じで、画像を表示してみましょう。



 

paizaラーニングでは、ほかにもJava、C#、Ruby、C言語、PHP、SQL、JavaScript、HTML/CSSなど、人気言語の動画レッスンを公開しています。

詳しくはこちら

paizaラーニング

そしてpaizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

詳しくはこちら

paizaのスキルチェック

初心者がプログラミング学習中の「わからないこと」を解決するには

f:id:paiza:20180515190747j:plain
Photo by Chris Potter
f:id:paiza:20140916135428p:plainこんにちは、谷口です。

初心者がプログラミングの勉強をしていて、わからないことにぶつかると、どう解決したらよいかがわからず、そのまま挫折してしまうケースも珍しくありません。

特に初心者の場合、

  • 使ったことあるはずのメソッド名を思い出せず考え続ける
  • 作ったことない処理をどうすれば作れるか考え続ける

といったことに時間を費やしてしまう人が非常に多くいます。

また、初心者のなかには「プロのエンジニアは言語の仕様やメソッド名などをすべて理解して暗記している(そして自分も覚えようとする)」と思い込んでいる人もいます。

しかしこれは大きな勘違いで、プロのエンジニアも、たとえば開発に使っている言語のすべてを暗記しているわけではありませんし、ど忘れすることだってあります。思い出せないこと、わからないことが出てきたら、みんな「調べる・試す」ことで、さっさと解決して先へ進んでいるのです。

今回は、そんなプログラミング学習中の疑問を解決する方法について説明します。

■プログラミング中の疑問を解決するには

◆手を動かして試してみる

疑問点に対して、「こういうやり方はできるのかな?」「たしかこうすればできたような?」といった感じで、何か思いついている場合は、実際にコードを書いて結果を見てみるのが一番です。

手元に実行環境がない場合も、今はオンライン実行環境サービスがたくさんありますから、そういったものを利用すれば手軽にコードを書いて試すことができます。

paiza.IO
f:id:paiza:20150205121058p:plain
たとえばpaiza.IOは、ブラウザ上でコードが書け、書いたコードをその場で実行出来るオンラインプログラム実行環境です。面倒な環境構築なしに、ブラウザさえあればすぐにコードを書いて実行結果を見ることができます。

paiza.IOについて、詳しくはこちら

◆検索して調べてみる

「具体的にどうすればいいのか思いつかない」のであれば、検索して調べてみましょう。

たとえばeachの使い方を知りたいのであれば「Ruby each」、eachを使った数字のカウントダウン方法が知りたいのであれば、「Ruby each カウントダウン」などで調べれば、いろいろな情報サイトが出てきます。

f:id:paiza:20180515171151j:plain

また、「Ruby カウントダウン」などで調べると「downto」というメソッドが見つかるかと思います。downtoの詳しい使い方が知りたいなら、さらに「Ruby downto」などで調べれば、自分の実行環境に貼って試せる例文なども出てきます。

こういったプログラミング中のわからないことの調べ方・試し方などについては、paizaラーニングの「エンジニアの小話編 :paiza.IOとGoogleで疑問解決」(全編無料)でも解説しています。

エンジニアの小話編 :paiza.IOとGoogleで疑問解決」について、詳しくはこちら

◆勉強中の言語に関するドキュメントやサイトを知っておく

プログラミング中にわからないこと・思い出せないことはどんどん検索して調べればよいのですが、検索でひっかかったすべてのページに正しい情報が掲載されているとは限りません。

たとえば、Rubyの場合は「Ruby ドキュメント」などで検索すれば、Rubyの公式ドキュメントが出てきます。確実に正しい情報を得るには、まずはこうした公式ドキュメントをあたってみるのがよいでしょう。

【Rubyドキュメント】
f:id:paiza:20180515172312j:plain

また、「逆引きRuby」というサイトを使うと、メソッド名などではなく「Rubyで平方根を求める方法が知りたい」のように目的から調べることもできます。

【逆引きRuby】
f:id:paiza:20180515172935j:plain

「これをしたい!」と思ったときに、手元の入門書や公式ドキュメントを順に探したりするのは大変ですよね。そんなときは、逆引きサイトや逆引きハンドブックなどを使うのが便利です。

■まとめ

プログラミングの勉強をしていると、わからないこと、思い出せないことにしょっちゅうぶつかります。

プログラミングスキルを向上させるには、そこで立ち止まって終わるのではなく、「試してみる・調べてみる」という習慣づけが必要なのだと思います。


プログラミング学習中のわからないことの調べ方・試し方などについては、paizaラーニングの「エンジニアの小話編 :paiza.IOとGoogleで疑問解決」(全編無料)でも解説しています。

エンジニアの小話編 :paiza.IOとGoogleで疑問解決」について、詳しくはこちら


また、現在paizaラーニングでは、演習問題(どのレッスン・どの問題でもOK)を解いて正解画面からツイートすると、抽選で霧島京子役の声優・上間江望さんのサイン入りぱいじょ!クリアファイルやAmazonギフト券が当たるキャンペーンを実施中です。

上間さんからのメッセージ動画も公開しておりますので、ぜひごらんください。



 

paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。

詳しくはこちら

paizaラーニング

そしてpaizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

詳しくはこちら

paizaのスキルチェック

Pythonでブロックチェーンを実装して採掘までやってみたので解説する

f:id:paiza:20180509180714j:plain
Photo by Stock Catalog
秋山です。

皆さんは暗号通貨で遊んでいますか?

エンジニアの中には、ブロックチェーンなど暗号通貨で使われている技術に興味がある…という人も多いのではないでしょうか。最近は、ブロックチェーンを活用した新しいモノもどんどん増えていますね。

というわけで今回は、ブロックチェーンや採掘(≒Proof of Work)について、Pythonでコードを書きながら説明してみたいと思います。

■ブロックチェーンをPythonで実装してみる

最も単純なブロックチェーンの場合、ブロック単位のデータにハッシュ値があり、そのハッシュ値は一つ前のブロックのハッシュ値を含んで計算されています。そのため、すべてのデータはチェーン上に繋がって前後関係のもとにある…という状態です。

ハッシュ値が何かわからない人はググったりして調べていただければと思いますが(ハッシュ値(ダイジェスト値)とは - IT用語辞典)、ざっくり言うと、各データを要約した数列…のようなものです。

プログラミング的に表現すると、例えば配列に要素を追加するときは、必ず1つ前の要素をハッシュ値として含む…みたいなことです。

文章だけで説明するのは大変なので、とりあえず実際にコードで書いてみましょう。(実用するには脆弱なコードだとは思いますが、とりあえずこの記事で説明に使うためのコードとして大目に見てください…)

最後の行で順に出力した結果を見ると、最初のブロックを除いて、すべてのブロックが一つ前のブロックのハッシュ値を含んでいる鎖(チェーン)のような構造ができていますよね。

図にすると以下のような感じです。Bitcoinなどと比べてもかなり簡略化されたブロック構造ですが、ブロックチェーン的な構造になっています。

f:id:paiza:20180510150446p:plain

このチェーン構造は、途中でデータの書き換えが発生すると、当然ハッシュ値も変わってしまいます。そのため、どこかで書き換えが発生すると、それ以降のハッシュ値は全て再計算しなければなりません。

下図のように、一つ前のブロックのハッシュ値も含まれるため、2番目以前の書き換えが起こっても矛盾が発生してしまいます。

f:id:paiza:20180510150501p:plain

このような形で、ブロックチェーンは改ざんを検出できるようになっています。

ただ、どのブロックチェーンが真であるかは多数決なりで決まるため、この場合、たとえば悪意のある人が大多数で都合のいいように書き換えて、すべてのチェーンのハッシュ値を別のものへ置き換えてしまったりすると、取引データの改ざんが可能となってしまいます。

前述の簡単なコードだと、たとえば5ブロック分の取引を改ざんした上でハッシュ値を再計算し、複数人で「こっちが本物です」と言えば改ざんも可能となってしまいます。

■ルールを追加してみる

改ざんを防ぐために、新しいブロックを追加する際のルールを追加導入します。

  1. 新しいブロックのハッシュ値には任意の値を加算し、ハッシュ化した際にn桁目までは0で埋めなければならない。
  2. 1を満たす値を計算する際、取引データには好きな値を一つだけ加えてよい。

1.はブロックを作る時間をかけさせるために、任意の値(これ以降 nonce と呼びます。number used onceの略称で「一度だけ使われる値」という意味です)を探させます。(また「n桁目までは0で埋めなければならない」のn桁目は、これ以降difficulty(難易度)の頭をとってdiffと以降呼びます)

2.は、その計算をしてくれた人へのご褒美ではないですが、好きな値を一つだけ加えられる権利を与えます。このルールがあることによって、Bitcoinで言う採掘報酬、現在は12.5btcを好きなアドレスにもらえる権利…みたいなものが発生します。

で、このルールが追加されることによってどんないいことがあるかというと、新しいブロックを生成するのに時間がかかるようになります。ブロックチェーンでは、あるブロックを改ざんしようと思ったら、それ以降の連なるブロックも、すべて正しいハッシュ値に調整し直す必要がありますから、改ざんする場合も時間がかかってしまうのです。

今回のコードでは、paiza.IOでも実行できるようにブロックの生成時間は短くなるようにしていますが、これを10分、20分、30分…と延ばしていくことも簡単にできます。たとえば5ブロック分を改ざんしようとして5ブロック×10分の時間をかけていると、10分後には新しいブロックが追加されているため、永久に追いつけない…つまり改ざんができない!となるわけです。(もちろん5倍の計算力があるスーパーコンピューターを持っている人がいたりすると話は別ですが…)

それでは前述のコードにルールに沿った処理を追加していきましょう。

import hashlib, json
 
class Block:
    def __init__(self, index, timestamp, prev_hash, transaction):
        self.index = index
        self.timestamp = timestamp
        self.prev_hash = prev_hash
        self.transaction = transaction
        self.diff = 4 #難易度 diff を追加
        self.now_hash = self.calc_hash()
        self.nonce = None #採掘時に計算する対象 nonce を追加
 
    def calc_hash(self):
        joined_data = {
            'index'       : self.index,\
            'timestamp'   : self.timestamp,\
            'prev_hash'   : self.prev_hash,\
            'transaction' : self.transaction,\
            'diff'        : self.diff
        }
        json_text = json.dumps(joined_data, sort_keys=True)
        return hashlib.sha256(json_text.encode('ascii')).hexdigest()

ここで、nonceが正しいかをチェックする関数を作ります。

nonceが正しいかどうかを判断するのは、「sha256( 現在のブロックのハッシュ値 + nonce ) の上 diff 桁目までが 0 で埋まっているか?」という条件です。

この条件を満たすならTrue、満たさないならFalseを返す関数を作りましょう。

def check(self, nonce):
    nonce_joined = self.now_hash+str(nonce)
    calced = hashlib.sha256(nonce_joined.encode('ascii')).hexdigest()
    if calced[:self.diff:].count('0') == self.diff:
        return True
    else:
        return False

こんな感じですね。

ただ、チェックする関数だけがあっても、nonceを手で計算しまくって探すわけにもいかないので、今度は探す関数を作りましょう。と言っても、愚直にnonceを1ずつ増やしてハッシュ値を計算していくだけの関数です。

def mining(self, append_transaction):
    nonce = 0
    self.transaction.append(append_transaction)
    self.now_hash = self.calc_hash() #報酬の好きな取引を一つ入れた後にハッシュ値を再計算、このハッシュ値に nonce を足して上diff桁まで0が続くものを探していきます。
    while True:
        nonce_joined = self.now_hash+str(nonce)
        calced = hashlib.sha256(nonce_joined.encode('ascii')).hexdigest()
        if calced[:self.diff:].count('0') == self.diff: #見つかった場合は処理を抜ける。
            break
        nonce += 1
    return nonce

sha256はハッシュ値から任意の元のデータを作る(ここでは対応するnonceを作りたい…)のが現実的な計算時間では困難なので、愚直に計算するしかありません。

関数の引数の append_transaction は、採掘報酬として好きな取引を追加するための引数です。

■ルールを追加した結果を見てみる

関数もできたので、これらがちゃんと動作するか試してみましょう。

先ほどはブロックをただ繋げただけでしたが、今回は繋げる前に採掘をして、nonceを得るという作業があります。nonceは何も考えずに加算しているので、その数が採掘にかかった時間と考えればいいですね(時間と言っても今回は1秒以下ですが)。

また、今回はdiffを4としていますが、5以上にするとpaiza.IOではタイムアウトしてしまうので注意してください。

この結果を簡単に図にしてみました。最初とは違って、nonceという要素が加わっています。

f:id:paiza:20180510154402p:plain

さらにnonceとブロックのハッシュ値を使って、ブロックが難易度通りにルールを守っているか?を検証する流れは、以下の図のような感じです。

f:id:paiza:20180510154423p:plain

こんな感じで、nonceが真であるか否かのチェックは一度の計算でできます。

一方でnonceを探すには、今回のブロックで言うと 48192 回の計算を行っています。採掘している人が複数いる場合を考えると、採掘報酬の書き込みをしてハッシュ値を計算…という流れが前段に入ります。そのためブロックのハッシュ値は人によって変わるので、nonceの値も採掘している人たちそれぞれが別のモノを探すことになります。

それぞれのブロックはこのようにしてnonceを採掘し、正しいnonceかどうかを周りが確認して、正しいnonce・正しいデータであると皆が認めたものだけが繋がっていく…というわけです。

■まとめ

上記の例ではdiff = 難易度 を固定値として4を使いましたが、これを調整することで採掘を困難にさせたり、平均10分程度で採掘が終わるように調整させたり、Bitcoinみたいなこともできるようになります。

また、複数人で採掘を行う場合、nonceを見つけたブロックが枝分かれのように複数になってしまう場合もあり得ます。その場合は、それぞれのプログラムで採掘された結果に対して、最も長いブロックチェーンが優先されるというルールが導入されます。

たとえば、1番目のブロックが生まれ、Aさんが 2番目、3番目のブロックを作った時に、 Bさんが遅れて2番目のブロックを採掘してしまったとします。このとき、Aさんの作った2番目のブロックの nonce とBさんの作った2番目のブロックの nonce は異なっています。ここで最も長いブロックチェーンを優先するというルールに基づいて、Bさんは 2番目のブロックを破棄し、Aさんがすでに採掘したブロックを自分のブロックに取り込み、 4番目のブロックの採掘に取り掛かる…ということになります。(Bさんのブロックに取引を書き込んでしまった人の取引は巻き戻ることになります)

Bitcoinを使ったことがある人は、送金しても取引所にすぐ反映されない…といった経験があるかと思います。これは、上記のような巻き戻りを避けるために、一定のブロック数が進むまで待機状態になっているような場合が多いです。Bitcoinではよく6ブロック待ったりします。

機会があれば、そのへんの話も実際のコードと突き合わせながら書けたらと思います。


ほかにも暗号通貨やPythonや機械学習などに関する記事をいろいろ書いているので、興味のある方は見てみてください。
paiza.hatenablog.com
paiza.hatenablog.com

「プログラミング自体が初心者なので、まずはPythonを使えるようになりたい!」という方は、プログラミングが動画で学べる「paizaラーニング」の「Python入門編」(今年から全編無料になりました)から始めてみてください。
paizaラーニング

途中でブログパーツとして使ったオンライン実行環境サービス「paiza.IO (パイザ・アイオー)」はこちら



 
PaizaCloud」では、環境構築に悩まされることなく、ブラウザだけで簡単にWebサービスやサーバアプリケーションなどの開発・公開ができます。
https://paiza.cloud

 


 

paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。

詳しくはこちら

paizaラーニング

そしてpaizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

詳しくはこちら

paizaのスキルチェック

一人でサービス作ってわかった、個人開発における3つの重要なこと

スクリーンショット 2018-03-29 7.23.25.png こんにちは、フジワラ(@Fujiyama_Yuta)です!

普段はフリーランスのエンジニアとして働いています。仕事の合間や、休日のプライベートの時間を使って個人で勤怠管理サービスの開発・運用も行なっています。2ヶ月前にリリースして、現在は保守・運用をしつつ、ちょっとずつ改良をしています。

私もそうでしたが、エンジニアだったら「自分で考えたサービスを作ってみたい!」って思うことありますよね。でも、何から手をつけたらいいのか、どうしたらいいのかわからない...って人もきっと多いはずです。

今回の記事では、私が実際にサービスの企画・開発・運用までやってみてわかった、個人開発するメリットや、個人開発において大事なこと、モチベーション維持についてなどの知見を共有したいと思います。

個人開発、やってみたい!興味ある!という人の参考になればと思います。

1. 作ったもの - OFFICECLOCK

OFFICECLOCK - WebとLINEで勤怠管理ができるサービス

officeclock.work

作ったサービスのイメージ

作ったものは勤怠管理ができるWebサービスです。

【勤怠画面】 スクリーンショット 2018-03-29 7.23.25.png

こんな機能があります

このサービスは、ざっくり以下の4つの機能があります。

  • 機能説明
    • ①Webで勤怠管理ができる
    • ②勤怠の出退勤の登録、休みの登録ができる
    • ③エクセルの勤務表が作成できる
    • ④LINEbotとも連携している

【HATARACLOCK - LINEで勤怠管理ができるbot】 スクリーンショット 2018-03-29 7.23.25.png

開発スケジュール

私の場合は仕事のかたわらで開発していたというのもあり、リリースまで4ヶ月かかっています。平日は1日2〜3h、休日は5〜6hというサイクルを繰り返し、3ヶ月でカタチにして、1ヶ月で気になる部分を修正して、4ヶ月目にリリースをしました。1日8hかけてフルでコミットできるのであれば1ヶ月〜2ヶ月でリリースできたかもしれませんが…。仕事と並行して開発する場合は、どうしても毎日長い時間はとれないので、毎日1hでも2hでも「続けていく」ということが大切だと思います。

ざっくりしたスケジュール感は以下のようなイメージです。

フェーズ 時間
要件定義 20h
設計 30h
デザイン・モック 15h
実装 30h
テスト 10h
バグ修正 30h
リリース準備 10h
リリース 2h
打ち上げ(@串カツ田中) 2h

2. 開発環境

最短で開発するための技術選定

個人開発なので、自分が得意な言語や、勉強したい言語を選定できますが、私は「どの言語で開発すれば最短でサービスを作れるか?」ということを最優先に考えました。自分の得意な技術や、技術の情報量の多さなどを考慮するとPHPとJQueryを使って開発する手法が一番早く開発できると思い、これらを採用しました(結果的に4ヶ月もかかりましたが...)。

今後、違うサービスを作るのであれば、フロントはAngular/TypescriptでサーバーサイドはCakePHPのフレームワークを使って書きたいと思っています。

役に立ったツール

開発中特に役に立ったツールをまとめてみました。

ツール 機能
Transmit ファイル転送ツール
BootstrapStudio Bootstrapのフレームワークを使ったモックがGUIで簡単につくれるツール
Wunderlist タスク管理ツール
POSTMAN RESTを確認できるツール

この中でもBootstrapStudioはとても役立ちました。このツールはドラック&ドロップでBootstrap製のモックを生成してくれます。そしてhtml・cssも自動で作ってくれます。メインページ以外にもログイン画面・サインオン画面のフォームなどは、Bootstrapstudioで作成しています。

もしモックも自分で作らなければいけない場合、このツールを使うのも一つの手法かもしれません。ベースになる部分は簡単に作成することができます。

【BootstrapStudio】

3. 個人開発で大切だと思うこと

個人開発で大切だと思うことを3つまとめました。

  • モチベーションの維持
  • 開発だけではなく運用面も考慮する
  • このサービスは失敗かもしれないという恐怖

モチベーションの維持

個人開発で一番大変なことは「モチベーションの維持」でした。開発をはじめて1ヶ月目の作業はスムーズに進みました。大変だったのはモチベーションが落ちてしまったときです...。チーム開発の場合、PMやPLが士気を高めてくれたり、仲間がいたり、モチベーションを維持するための材料が多々あるのですが、個人で開発している場合、鼓舞してくれる人は自分しかいません。当たり前かもしれませんが、自分で自分を鼓舞なんて意味がありません。

この問題を解決する具体的な方法はないのですが「モチベーションに頼らない」ということを心がけていました。

雨の日も、風の日も、ツラいことがあった日も、飲みすぎた次の日も、モチベーションが低くても平日の朝7時30分〜9時30分の2時間はパソコンを開いていました(ずっとTwitterを眺めている日もあったのは秘密です...)。そしてこのサイクルを習慣化するというのが、とても大切だと思いました。

開発だけではなく運用面も考慮する

サービスをリリースして、しばらく経った時に知人から「アカウント登録できないんだけど...」と連絡をもらいました。すぐに調査すると、その日の朝に修正した箇所にバグがあり、本登録ができないという障害が発生していました。この時、多くのユーザーに影響があり、ご迷惑をかけてしまうということがありました。

リリースして間もなかったこともあり、障害を検知するための仕組みなどの運用面での考慮が足りていませんでした。当たり前のことですが、個人開発の場合、開発だけではなく運用も一人で対応できるフローを考えなければなりません。

これを機にエラーを検知したとき、slackに通知する仕組みや、質問がきたらslackでチャットでレスができる仕組みを取り入れたりしています。

このサービスは失敗かもしれないという恐怖

このサービスを開発している最中に『ヤバイ...これ全然面白くないかもしれない...』と、自分の作っているものが、とてつもなくつまらなく感じてしてしまう瞬間がありました。モックが完成した瞬間にその感覚を味わってしまい、開発を止めて、なにか別のモノを作ろうかと思いました。

この感覚は、何かを作り出している仕事をしていると、一度は味わう感覚だと思いますが、大丈夫です。「つまらないかもしれない」と感じている部分も、時間が経てば、どこがつまらないのかが見えてくるようになります。「もっといいサービスを作り上げるんだ!」という気持ちを忘れずに、開発を進めてみてください。きっと最後まで完成させることができます。

4. なぜ個人開発をするのか?(個人開発をするメリット)

スキルの習得

技術を習得しようとしたときに、どうすれば身につけることができるかは人それぞれですが、私の場合は(1)動かす(2)作る(3)公開するというやり方が、最短で技術を習得できる方法です。

プログラミングを習得する場合、自分で手を動かしてコードを書くというアウトプットが非常に重要です。簡単なサービスでもいいので、公開するということを意識して開発を進めるといいと思います。

作ったものがアピールのポイントになる

これは私の経験上の話ですが、プロジェクトの面談で「個人でサービスを運用しています」と言うと、必ず話が盛り上がります。「ゼロからサービスを開発して、運用している」という点は「勉強しています」と書いているよりも、アピールのポイントになると思います。

お金になる(かもしれない)

「サービスを会社で使いたいんですけど、いくらですか?」など、「売却してくれませんか?」というような問い合わせをいただくことが実際にありました。現時点では収益にはなっていませんが、自分のサービスでお金を稼げるって、とても夢がありますよね。もしお金を稼ぐサービスになったとき、チームだったら利益もワリカンですが、個人開発だと全部自分がもらえますよね。そう考えると個人開発も悪くないな...。と、思ったりします。

5. まとめ

というわけで個人開発を通してわかったことの話でした。

一人で開発やっているとモチベーションの維持とか、時間の制限とか…大変なことも多々あります。でも、それ以上に自分で考えたサービスを自分の手で形にしていくのってすごく楽しいですし、勉強にもなります。何より、自分の作ったものが多くの方に使ってもらえるというのは、とてもうれしいことです!

作ったモノを見せられるというのは転職にも役に立つかと思いますので、皆さんもぜひチャレンジしてみてください!


「個人開発」と言うと初心者だとハードルが高く感じるかもしれませんが、paizaラーニングだとプログラミング未経験者から始められる「Ruby入門編」「Java入門編」などから、実際に動くWebアプリが作れる「Webアプリ開発入門」まで公開していますので、興味のある方はぜひごらんください。




paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。

そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

paizaのスキルチェック

ゲームや問題集など、初心者でも楽しくPHPを学習できるサイト10

f:id:paiza:20180508121821j:plain
Photo by Martin Hassman
f:id:paiza:20140916135428p:plainこんにちは。谷口です。

プログラミング初心者の中には「PHPを勉強したい」という方も多くいらっしゃるかと思います。

PHPは比較的コードが書きやすく、初心者から上級者まで幅広く使われているプログラミング言語です。日本国内に20万人もの開発エンジニアがいるとも言われ、求人も豊富です。Webサービス開発やゲーム開発等で広く使われ、CakePHPやSymfonyといったフレームワークが多く利用されています。また、最近はLaravelというWebアプリケーションフレームワークの人気が高まっています。

ちなみにLaravelについては昨日の記事でも解説しています。
paiza.hatenablog.com

今回は、プログラミング初心者の方がPHPの学習に役立てられるコンテンツを、練習問題・プログラミングゲーム・実行環境・動画やスライドによるレッスン…とジャンル別に10件ご紹介していきます。

【目次】

■練習問題系

初心者のためのPHP練習問題

f:id:paiza:20170626184017p:plain
名前の通り初心者用の問題が数多く出題されており、解答コードも見られます。

TECH Projin PHP練習問題

f:id:paiza:20170626184824p:plain
選択式の練習問題と、実際にコードを書くプログラム演習問題があります。こちらのサイトは解答に簡単な解説もついていて、問題も最新のものがどんどん追加されているので、私もちょくちょく拝見しています。

paizaのスキルチェック問題


paizaでは、PHPはもちろんJava、Ruby、Python、C、C++、C#、JavaScriptなど多数の主要言語に対応したスキルチェック問題を公開しています。

プログラミング問題を解いた結果によりS・A・B・C・D・Eの6段階で自分のスキルのランクが分かります。問題はレベルごとに分かれており、初心者から上級者の方まで挑戦していただけますので、「自分のプログラミングスキルを客観的に知りたい」「とにかくたくさん問題が解きたい」という方は是非チャレンジしてみてください!!

■プログラミングゲーム系

CodinGame

f:id:paiza:20141014143648p:plain
ゲームを通してプログラミング学習ができるCodinGameは、学習サイトとは思えないグラフィックと内容で構成されています。

f:id:paiza:20141014143759p:plain

対応言語はPHPの他にもJava、JavaScript、Go、C、C++、C#、Python、Ruby……などなど20言語以上に対応しています。

レベル1から始まって、もちろん最初の方の問題は簡単なのですが、レベルを上げるごとに問題も難しくなっていきますので、初心者の方が全てをクリアするには継続した学習が必要となってきます。

コードガールこれくしょん

コードガールこれくしょん略してガルこれは、ナビゲーターと一緒にプログラミング問題を解き、「コードガール」を集めながらストーリーを進めていく、プログラミング学習ゲームコンテンツです。PHPはもちろんPyhton、Ruby、Java、C、C++、C#、JavaScriptに対応しています。

ゲーム内ではクエスト報酬やログインボーナス・ミッションクリア等の各種特典として手に入る「コイン」や「ダイヤ」を使って、ガチャでさまざまな「コードガール」を収集することができます。クエストで有利になる特殊スキルを発動させたり、「これくしょん」に入れてマイページに飾ったりと、コードガールをたくさん集めるほど楽しみ方が広がります。

■実行環境系

PHP Sandbox

f:id:paiza:20141126170532p:plain

PHP Sandboxは英語にのみ対応していますが、PHP用のオンライン実行環境サービスで、バージョンも子細に選択できます。コードを書いて実行すると、下の方に結果表示スペースがぺろっと現れます。

paiza.IO

f:id:paiza:20150205121058p:plain
paiza.IOは、ブラウザ上でコードが書け、書いたコードをその場で実行出来るオンラインプログラム実行環境です。面倒な環境構築なしに、ブラウザさえあればすぐにコードを書いて実行結果を見ることができます。もちろんPHPにも対応していますので、「ちょっとコード書いてみたい」というときはぜひ試してみてください。

■動画・スライドによるレッスン系

ドットインストール

f:id:paiza:20141014152641p:plain
動画でPHPのコードの書き方、環境構築方法などが学べます。

Progate


スライドによるレッスンで基礎を学び、オンラインエディタでコーディングをして実行結果を見ることができます。

paizaラーニングPHP入門編PHP基礎編


オンラインでプログラミング学習ができる「paizaラーニング」では、PHPはもちろんJava、Ruby、Python、JavaScript、HTML/CSS、SQL、などなど多数の言語を学べるレッスンを公開しています。

paizaラーニングではこのように、動画を見ながらコードを書くことができます。面倒な環境構築も必要なく、ブラウザを開くだけでプログラミングが学べます。動画の後には演習課題も用意されており、初心者でも無理なく・楽しく学習を進められます。また、わからないことがあれば無料でアドバイザーに質問もできます。

PHPのレッスンとしては、プログラミング未経験者向けの「PHP入門編入門編を終えたレベルの方向けの「PHP基礎編があります。

本日「PHP入門編6:多次元配列を理解しよう」が追加されましたので、この機会にぜひごらんください。

■まとめ

プログラミング初心者の方でも、学習サービスをうまく使ってPHPの基礎スキルを身につけていくことは充分可能です。

「興味がわいてきた!」という方は、学習サイトでも、書籍でも、自分が気になるところから挑戦して、ぜひPHPに触れてみてください。

そしてある程度の基礎が身につきましたら、ぜひpaizaでご自分のスキルをはかってみてくださいね。





paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。

そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

paizaのスキルチェック

どれ使うべき?3大WebフレームワークRails・Django・Laravelを徹底比較してみた

f:id:paiza:20180502181055p:plain
(English article is here)
ブラウザを開くだけでWeb開発環境が整う PaizaCloud クラウドIDE

f:id:paiza:20151217152725j:plainこんにちは、吉岡(@)です。

Webサービスを作成する時に迷うのが、「どのWebアプリケーションフレームワークを使うか?」ですよね。

今からWebサービスを作るなら、Ruby on Rails, Django, Laravelが主流となる3大フレームワークかと思われます。

いずれもフルスタックフレームワークと呼ばれるもので、Web開発に必要な機能を一通り揃えていますが、もちろんそれぞれ開発言語、機能、構成などは異なります。

どれも有名なフレームワークなので、名前だけならすべて知っているという人も多いかと思いますが、実際に全てを使ったことがある人は少ないのではないでしょうか。

すでにどれかを使って開発している人も、ほかのフレームワークに触れてみることで、違った角度から開発の考え方や構成などを知ることができるようになります。

とはいえ、単に機能一覧を眺めてみるだけでは、なかなか特徴や雰囲気をつかむことは難しいので、今回は実際にデータベースを使ったToDoリストサービスを作りながら、Ruby on Rails, Django, Laravelの特徴や違いなどを比べてみます。

開発環境を構築しなくてもブラウザ上でWeb開発ができるPaizaCloudを利用しながら進めていきますので、皆さんもぜひ実際にそれぞれのフレームワークに触れながら比べてみてください。

トレンド

まずはRails・Django・Laravelのトレンドについて、Google Trends, Stackoverflow Trendsで見てみましょう。

f:id:paiza:20180507160320p:plain

(Google Trends より)

f:id:paiza:20180507161233p:plain ( Stack Overflow Trends より )

いずれも拮抗していますね。

成熟したRuby on Rails、安定のDjango、伸びているLaravelと言えるかと思います。

ブラウザを開くだけでWeb開発環境が整う PaizaCloud クラウドIDE

比較

それぞれのフレームワークの違いを表にしてまとめてみました。

Ruby on Rails、Djangoはほぼ同時期に発表されていますが、Laravelは比較的新しいフレームワークです。

Ruby on Rails, Laravelはコードの自動生成などの機能が豊富で、コードをほとんど書かなくてもある程度の機能を実現できます。対してDjangoは必要なコードを明示的に書かなければならない部分が多く、魔法的な要素も少ないため、コードの見た目はわかりやすくなります。

Ruby on Rails
f:id:paiza:20180502181239p:plain:w100
Django
f:id:paiza:20180502181248p:plain:w100
Laravel
f:id:paiza:20180502181255p:plain:w100
言語 Ruby Python PHP
発表 2005年12月13日 2005年7月21日 2011年6月中
最新版
(2018年5月時点)
5.2 2.1 5.6
知名度 ★★★ ★★ ★★
機能 ★★★ ★★ ★★★
コード自動生成 ★★★ ★★
わかりやすさ ★★ ★★★ ★★
AI・機械学習 ★★ ★★★
事例 Cookpad, GitHubなど Instagram, 日経新聞など STARTUPS.CO, LaravelIOなど
哲学 - 設定より規約(CoC)
- 繰り返しを避けろ(DRY)
- 暗黙より明示
- 疎結合と高凝集性
- 幸せな開発者が最高のコードを作る
- 表現力、エレガント

開発環境の準備 (PaizaCloud)

3つ分の開発環境を用意するのは大変ですから、今回はクラウド上の開発環境PaizaCloudで開発しましょう。

PaizaCloudでは、ブラウザ上でWeb開発できる環境で、ファイル管理、ファイル編集、ターミナル、Web閲覧などもブラウザ上で利用できるようになっています。もちろんRuby on Rails, Django, Laravelの開発環境もあらかじめ用意されているため、ローカルに開発環境を構築しなくてもすぐにWeb開発を始められます。

それでは、始めていきましょう。まずは、PaizaCloudにログインします。

PaizaCloud Cloud IDEのサイトはこちらです。

https://paiza.cloud/

メールアドレスなどを入力して登録すると、登録確認メールが送られてきます。GitHubやGoogle(Gmail)ログインを利用すると、ボタン一つで登録することもできます。

次に、開発環境となるサーバを作りましょう。

f:id:paiza:20171213234155p:plain

「新規サーバ作成」ボタンを押して、サーバ作成画面を開きます。

データベースを利用できるように、phpMyAdmin, MySQLをクリックして「新規サーバ作成」ボタンを押します。

f:id:paiza:20180228111202p:plain

3秒程度で、Ruby on Rails, Django, Laravelを使える開発環境がブラウザ上にできあがります。

f:id:paiza:20180228120822p:plain

これで開発環境ができたので、各フレームワークに触れていきましょう!

Ruby on Rails - 設定より規約, 繰り返しを避けろ

f:id:paiza:20180502181239p:plain

言語: Ruby
発表: 2005年12月13日
最新版: 5.2
知名度: ★★★
機能: ★★★
コード自動生成: ★★★
わかりやすさ: ★★
AI・機械学習: ★★
事例: Cookpad, GitHubなど
哲学: 設定より規約(CoC), 繰り返しを避けろ(DRY)

Webアプリケーションフレームワークの王道とも言えるのがRuby on Railsです。

Ruby on Railsが現れるまでは、Webアプリケーションを自分で作ろうと思ったら、簡単なアプリ向けのPHPか、大規模開発向きだけど複雑なJavaか…といった選択肢ぐらいしかなく、個人やスタートアップ企業が簡単にWebアプリケーションを作れるような状況ではありませんでした。

そこに颯爽と登場したのが、「15分で本格的ウェブアプリが作れる」というRuby on Railsです。

Ruby on Railsは、膨大な設定が必要なJavaフレームワークを反面教師に、「繰り返しを避ける(DRY, Don't Repeat Yourself)」「設定より規約(CoC, Convention over Configuration)」という哲学を持っています。

「設定より規約」というだけあって、Ruby on Railsが引いた「レール」に乗っていくだけで、本格的なWebアプリケーションが自然と作れるような仕組みが用意されています。

Ruby on Railsは、Web開発を効率化するための豊富な機能を持ち、MVC、スキャッフォルド、ジェネレータ、マイグレーション、ルーティング、モデル、コントローラ、ORM(Active Record)…といった機能は、それまでのWeb開発手法を大きく変えました。また、オブジェクト指向をスクリプト言語で実現したRubyを使ったことで、スピード感と柔軟性が必要なWeb開発との相性も抜群です。

加えて、Rubyが日本で開発された言語ということもあり、RubyもRuby on Railsも、日本語の情報が豊富です。

Railsはすでに広く使われており市場も成熟していますが、いまだに開発は活発で、最近ではwebpack等、フロントエンド開発向けの機能も取り入れられています。

では、実際にRailsを使って開発してみましょう。

まずは、PaizaCloudの画面左側のターミナルアイコンのボタンをクリックして起動します。

f:id:paiza:20171213234317p:plain

"myapp"プロジェクトを作成します。ここでは、データベースにmysqlを指定しておきましょう。

$ rails new myapp --database=mysql

次に、"rails generate scaffold"で、データベースのマイグレーション、コントローラ、ビュー、モデル、ルーティングを一気に作ります。

$ cd myapp
$ rails generate scaffold todo body:text

"rake db:migrate"でデータベースマイグレーションを実行し、データベースにテーブルを作成します。

$ rake db:migrate

"rails server"でサーバを3000番ポートで起動します。

$ rails server

このコマンドだけで完成です。

1行目の"rails new"ではプロジェクトディレクトリと、その中に雛形となるファイルを作成しています。 3行目の"rails generate scaffold"では、データベースのマイグレーション、コントローラ、ビュー、モデル、ルーティングを一気に作ります。 4行目の"rake db:migrate"では、マイグレーションを実行し、データベースにテーブルを作成します。 5行目の"rails server"ではサーバを3000番ポートで起動します。

PaizaCloudで左側の3000と書かれたアイコンをクリックして、URL欄にhttp://localhost/todos/ と入れると、ToDoリストが表示されます。

f:id:paiza:20180502172606p:plain

ファイル管理ビューでファイル構造を見てみましょう。appディレクトリ内に、コントローラ、モデル、ビューが配置されています。

f:id:paiza:20180502172755p:plain

モデルを見てみましょう。実質的にコードはゼロです。ActiveRecordという仕組みで、データベースの構造がオブジェクトの構造に反映されるので、コードの記述が不要になっています。

myapp/app/models/todo.rb:

class Todo < ApplicationRecord
end

コントローラを見てみましょう。データの作成、表示、更新、削除(CRUDと呼ばれる)に対応したアクションが定義されています。@変数名"というインスタンス変数がビューから参照できるので、この変数を操作します。

myapp/app/controllers/todos_controller.rb:

class TodosController < ApplicationController
  before_action :set_todo, only: [:show, :edit, :update, :destroy]

  # GET /todos
  # GET /todos.json
  def index
    @todos = Todo.all
  end

  # GET /todos/1
  # GET /todos/1.json
  def show
  end

  # GET /todos/new
  def new
    @todo = Todo.new
  end

  # GET /todos/1/edit
  def edit
  end

  # POST /todos
  # POST /todos.json
  def create
    @todo = Todo.new(todo_params)

    respond_to do |format|
      if @todo.save
        format.html { redirect_to @todo, notice: 'Todo was successfully created.' }
        format.json { render :show, status: :created, location: @todo }
      else
        format.html { render :new }
        format.json { render json: @todo.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /todos/1
  # PATCH/PUT /todos/1.json
  def update
    respond_to do |format|
      if @todo.update(todo_params)
        format.html { redirect_to @todo, notice: 'Todo was successfully updated.' }
        format.json { render :show, status: :ok, location: @todo }
      else
        format.html { render :edit }
        format.json { render json: @todo.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /todos/1
  # DELETE /todos/1.json
  def destroy
    @todo.destroy
    respond_to do |format|
      format.html { redirect_to todos_url, notice: 'Todo was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_todo
      @todo = Todo.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def todo_params
      params.require(:todo).permit(:body)
    end
end

ビューを見てみましょう。HTMLにERB記法を用いて、"<% %>"、"<%= %>"でコードを埋め込んでいます。"<% %>"ではRubyのコードを実行します。"<%= %>"では、実行した結果をHTML中に埋め込み、ブラウザ上で表示します。

myapp/app/views/todos/index.html.erb

<p id="notice"><%= notice %></p>

<h1>Todos</h1>

<table>
  <thead>
    <tr>
      <th>Body</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @todos.each do |todo| %>
      <tr>
        <td><%= todo.body %></td>
        <td><%= link_to 'Show', todo %></td>
        <td><%= link_to 'Edit', edit_todo_path(todo) %></td>
        <td><%= link_to 'Destroy', todo, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Todo', new_todo_path %>

RailsでWebサービスを開発する方法について、詳しくはこちらの記事でも書いています。 paiza.hatenablog.com

Django - 暗黙より明示

f:id:paiza:20180502181248p:plain

言語: Python
発表: 2005年7月21日
最新版: 2.1
知名度: ★★
機能: ★★
コード自動生成: ★
わかりやすさ: ★★★
AI・機械学習: ★★★
事例: Instagram, 日経新聞など
哲学: 疎結合と高凝集性(loose coupling and tight cohesion)、暗黙より明示(Explicit is better than implicit)

Djangoは、Pythonの有名なWebアプリケーションフレームワークです。Pythonは人気のスクリプト言語ですが、特に最近は、機械学習やAIの開発といえばPython…と言ってよいほど浸透しています。

Ruby on Railsのように魔法みたいなコード生成はしてくれないため、最初から自分である程度コードを書く必要がありますが、無駄のないわかりやすいコードを書いてWeb開発をすることができます。

Djangoも、一般的なWebアプリケーション開発に必要な機能はひと通り揃っています。また、機械学習などにもよく使われるPythonの豊富なライブラリを利用できるのが大きな特徴です。

ほかにも、Djangoには管理画面が組み込まれており、データベースの閲覧・編集などの管理画面が簡単に作れるというのも特徴的です。

開発も活発で、最新のDjango2.1は2018年8月にリリースされています。Python開発の場合、よく「Python2系を使うか?Python3系を使うか?」が議論になりますが、Django2では、Python3にのみ対応していくことで終止符が打たれていますので、迷わずPython3が使えます。

では、実際にDjangoを使って開発してみましょう。

まずは、PaizaCloudの画面左側のターミナルアイコンのボタンをクリックして起動します。

f:id:paiza:20171213234317p:plain

$ django-admin startproject mysite
$ python3 manage.py startapp todo

Djangoでは、プロジェクトの中に複数のアプリケーションを入れることができるようになっていますので、ここでは"mysite"というプロジェクトの中に"todo"というアプリケーションを作成します。

ジェネレータはないので、ファイルを修正していきましょう。

サイト全体のルーティングでは、todoアプリのパスを設定します。

mysite/urls.py:

from django.urls import include, path
from django.contrib import admin
from django.views.generic import RedirectView

urlpatterns = [
    path('todo/', include('todo.urls')),
    path('admin/', admin.site.urls),
    path('',  RedirectView.as_view(url='/todo/')),
]

アプリケーションのルーティングでは、URLパス"/todo"のアクションで"views.index"関数を呼び出すようにします。

mysite/todo/urls.py:

from django.urls import path
from . import views

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

データベース設定では、MySQLの設定を行います。特に設定しない場合はSQLiteが使われます。"pymysql.install_as_MySQLdb()"の追加を忘れないようにしましょう。

mysite/mysite/settings.py:

# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
import pymysql
pymysql.install_as_MySQLdb()

DATABASES = {
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#    }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

そしてサイト全体の設定で、todoアプリを追加するため、INSTALLED_APPSに'todo.apps.TodoConfig'を追加します。

mysite/mysite/settings.py:

INSTALLED_APPS = [
    'todo.apps.TodoConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

モデルを作成します。モデルクラスでは、データベーステーブルのフィールドの型に対応した変数を定義します。

mysite/todo/models.py:

from django.db import models


class Post(models.Model):
    body = models.CharField(max_length=200)

Djangoでは、このモデルファイルからマイグレーションファイルを自動的に生成します。

$ python3 manage.py makemigrations todo

マイグレーションを実行します。

$ python3 manage.py migrate

ビューも作成します。Ruby on Railsではコントローラと呼ばれている部分になります。Djangoでは、HTMLテンプレート中で利用する変数はrender関数のコンテキストとして明示的に渡します。

mysite/todo/views.py:

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse
from .models import Post
from .forms import PostForm

# Create your views here.
def index(request):
    posts = Post.objects.all()
    form = PostForm()
    context = {'posts': posts, 'form': form, }
    return render(request, 'todo/index.html', context)
    
def create(request):
    form = PostForm(request.POST)
    form.save(commit=True)
    return HttpResponseRedirect(reverse('todo:index'))

def delete(request, id=None):
    post = get_object_or_404(Post, pk=id)
    post.delete()
    return HttpResponseRedirect(reverse('todo:index'))

テンプレートファイルも作成します。ここでは、MilligramというCSSフレームワークも使ってみます。

テンプレート中では、Pythonのインデントを使ったコードはそのままでは書けないため、テンプレート用の記法を使います。

Djangoのテンプレートファイルでは"{% %}"、"{{ }}"という記法でテンプレート中に操作を記述したり、値を表示したりすることができます。

レイアウトファイル(base.html)を記述します。

mysite/todo/templates/todo/base.html:

{% load staticfiles %}
<!DOCTYPE html>
<html>
    <head>
        <title>Todo List</title>
        <!-- CSS And JavaScript -->
        <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic">
        <link rel="stylesheet" href="//cdn.rawgit.com/necolas/normalize.css/master/normalize.css">
        <link rel="stylesheet" href="//cdn.rawgit.com/milligram/milligram/master/dist/milligram.min.css">
        <link rel="stylesheet" href="{% static 'css/todo.css' %}">
    </head>
    <body>
        <div class="container">
            {% block content %}
            {% endblock %}
        </div>
    </body>
</html>

表示するHTMLに対応するテンプレートファイル(index.html)を記述します。

mysite/todo/templates/todo/index.html:

{% extends 'todo/base.html' %}

{% block content %}
    <h1>Todo List</h1>

    {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
    <form action="{% url 'todo:create' %}" method="post">
        {% csrf_token %}
        <!-- Todo Name -->
        <div class="form-group">
            <label for="todo" class="col-sm-3 control-label">Todo</label>
            <div class="col-sm-6">
                {{ form.body }}
            </div>
        </div>

        <!-- Add Todo Button -->
        <div class="form-group">
            <div class="col-sm-offset-3 col-sm-6">
                <button type="submit" class="btn btn-default">
                    <i class="fa fa-plus"></i> Add Todo
                </button>
            </div>
        </div>

    </form>
    

    <!-- Current Todos -->
    <h2>Current Todos</h2>
    <table class="table table-striped todo-table">
        <thead>
            <th>Todos</th><th>&nbsp;</th>
        </thead>

        <tbody>
            {% for post in posts %}
                <tr>
                    <!-- Todo Name -->
                    <td>
                        <div>{{ post.body }}</div>
                    </td>
                    <td>
                        <form action="{% url 'todo:delete' post.id %}" method="post">
                            {% csrf_token %}
                            <button>Delete</button>
                        </form>
                    </td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
    
{% endblock %}

Djangoでは、HTMLフォームをフォームクラスとして定義しておき、そこからHTMLの入力フォームを生成することができます。Postフォームのクラスを定義しておきます。

mysite/todo/forms.py:

from django import forms

from .models import Post

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ('body',)

以上で完成です。 開発用サーバを8000番ポートで起動します。

$ python3 manage.py runserver

サーバが8000番ポートで起動します。PaizaCloud画面の左側に"8000"と表示されたブラウザアイコンが表示されます。クリックすると画面が表示されます。

f:id:paiza:20180228120124p:plain

DjangoでWebサービスを開発する方法について、詳しくはこちらの記事でも書いています。 paiza.hatenablog.com

Laravel - 幸せな開発者が最高のコードを作る

f:id:paiza:20180502181255p:plain

言語: PHP
発表: 2011年6月中
最新版: 5.6
知名度: ★★
機能: ★★★
コード自動生成: ★★
わかりやすさ: ★★
AI・機械学習: ★
事例: STARTUPS.CO, LaravelIOなど
哲学: 表現力、エレガント(expressive, elegant syntax), 幸せな開発者が最高のコードを作る(Happy developers make the best code.)

PHPにおいては、RubyにおけるRailsのような圧倒的なフレームワークはなく、CakePHP、Zend Framework、Code Igniter、Symfony…といったさまざまなフレームワークが群雄割拠していました。

その中で、比較的新しいフレームワークとして登場したLaravelは、Railsをはじめとするほかのフレームワークのよいところを取り入れることで、先進的で豊富な機能の搭載を実現しました。

コミュニティ運営が活発なこともあってか、Laravelは知名度をぐんぐん広げ、一気に有名フレームワークの仲間入りをしています。Google Trendsを見ても、PHPフレームワークの中ではLaravelの伸びが圧倒的であることがわかります。

f:id:paiza:20180216013143p:plain (Google Trends より)

PHPはもともとHTMLテンプレートとして作られた言語で、Web開発向きの言語としては最も古いものの一つです。開発自体は比較的簡単に始めることができますが、コードは複雑でわかりにくいものになってしまいがちです。

ただ、Laravelの場合はオブジェクト指向やパッケージマネージャ(composer)といった最新の機能を使い、さらにMVC、ジェネレータ、モデル、マイグレーション、ORM(Eloquent)、テンプレートエンジン(Blade)、DIといった機能も取り入れることで、わかりやすいコードを書きつつ本格的なWebアプリケーションが作れるようになっています。

PHPは、CMSやWordPressの開発にも採用されるなど広く使われていますが、LaravelではこのPHPを使ったWeb開発の資産やノウハウを流用できるというのも魅力のひとつです。

では、実際にLaravelを使って開発してみましょう。

まずはPaizaCloudで、ターミナルアイコンをクリックしてコマンドを入力します。

f:id:paiza:20171213234317p:plain

"myapp"という名前でプロジェクトを作成します。

$ laravel new myapp
$ cd myapp
$ php artisan serve

データベースを作成します。

$ mysql -u root
create database mydb;

データベース設定ファイルを編集します。PaizaCloudのファイル管理ビューで右クリックから「隠しファイルを表示」を選択し、ドット(".")で始まるファイルを表示しておきます。

myapp/.env:

DB_DATABASE=mydb
DB_USERNAME=root
# DB_PASSWORD=secret

モデル、コントローラ、マイグレーションファイルを一気に作成します。

$ php artisan make:model Task -m -c -r

マイグレーションファイルに"$table->string('name');"を追加することで、データベーステーブルのnameフィールドを追加します。

database/migrations/2018_xx_xx_xxxxxxxx_create_tasks_table:

    public function up()
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });
    }

マイグレーションを実行します。

$ php artisan migrate

ルーティングファイルを編集し、"GET /tasks", "POST /tasks", "DELETE /tasks/{id}"に対応したTaskController内のアクションを呼び出すようにします。

routes/web.php:

Route::get('/', function(){return redirect('/tasks');});
Route::get('/tasks', 'TaskController@index');
Route::post('/tasks', 'TaskController@store');
Route::delete('/tasks/{id}', 'TaskController@destroy');
\URL::forceScheme('https');

ページを表示する時に呼ばれるアクションをコントローラとして記述します。Eloquentモデルを使うことで、テーブル内のフィールドを"$task->name"のように、オブジェクトのインスタンス変数として参照できます。

app/Http/Controllers/TaskController.php:

<?php

namespace App\Http\Controllers;

use App\Task;
use Illuminate\Http\Request;

class TaskController extends Controller
{
    public function index()
    {
        $tasks = Task::all();
        return view('tasks', ['tasks' => $tasks]);
    }

    public function store(Request $request)
    {
        $task = new Task;
        
        $task->name = request('name');
        $task->save();
        return redirect('/tasks');
    }

    public function destroy(Request $request, $id, Task $task)
    {
        $task = Task::find($id);
        $task->delete();
        return redirect('/tasks'); 
    }
}

ビューファイルを作成します。

PHP自身はもともとテンプレートエンジンですが、記述が冗長でわかりにくくなってしまいがちな部分があります。

ただ、LaravelではBladeというテンプレートエンジンを用いることで、HTML中に操作を記述したり、値を表示したりといったことが簡潔にできるようになっています。

モデルファイルを見てみましょう。

app/Task.php:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    //
}

…といってもModelクラスを拡張したクラスがあるだけで、中身はカラです。

LaravelではEloquentというORMを利用することで、データベーステーブル上のカラムの値を、モデルオブジェクトからプロパティ名を使って参照できるようになっています。

以上で完成です。

サーバを動かしてみましょう。

$ cd ~/myapp
$ php artisan serve

サーバは8000番ポートで起動しています。PaizaCloud画面の左側の"8000"と書かれたブラウザアイコンをクリックすると、作成したWebアプリが表示されます。

f:id:paiza:20180216011331p:plain

LaravelでWebサービスを開発する方法について、詳しくはこちらの記事でも書いています。 paiza.hatenablog.com

まとめ

というわけで、Ruby on Rails・Django・Laravelの機能を比較しつつ、実際にデータベースを使ったWebアプリケーションを作ってみました。それぞれ特徴がありますが、いずれも機能豊富なWebアプリケーションフレームワークです。

今回の記事のようにPaizaCloudを使うと、面倒な環境構築なしで、ブラウザだけでさまざまなフレームワークを使ってみることができます。書籍や記事を読むだけよりも、実際に触ってみることで雰囲気や特徴などがつかめるようになるので、ぜひ使ってみてください。


PaizaCloud」は、環境構築に悩まされることなく、ブラウザだけで簡単にウェブサービスやサーバアプリケーションの開発や公開ができます。 https://paiza.cloud


paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。

そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

paizaのスキルチェック

ブラウザを開くだけでWeb開発環境が整う PaizaCloud クラウドIDE

paizaのおすすめコンテンツ

“denno2088” プログラミングゲーム「電脳少女プログラミング2088 ─壊レタ君を再構築─」 CGC codemonster プログラミングゲーム「コードモンスター大図鑑 プログラミングでゲットだぜ!」
paiza転職 paiza新卒 EN:TRY paizaラーニング 記事内に記載している情報は、記事公開時点でのものとなります。 Copyright Paiza, Inc, All rights reserved.