paiza開発日誌

IT/Webエンジニア向け総合求人・学習サービス「paiza」(https://paiza.jp ギノ株式会社)の開発者が開発の事、プログラミングネタ、ITエンジニアの転職などについて書いています。

初心者向け・Pythonのdoctestモジュールを使ってユニットテストする方法

f:id:paiza:20190315130147j:plain
Photo by Mark Hawkins
f:id:paiza:20180910132940p:plainこんにちは。倉内です。

皆さんはプログラミング問題を解くときに自分が書いたコードをテストしていますか?

paizaラーニングの演習課題やスキルチェック問題ではあらかじめ用意されたテストケースをWebブラウザ上でボタンを押すだけで実行できるため、テストコードを書かなくても出力結果の誤りに気づくことはできます。

しかし、用意されたテストケース以外の入力値を試したいときや、バグがある箇所を特定したいときなどは自分でテストコードを書く必要があります

テストコードはいろいろな書き方ができますが、Pythonではdoctestという標準モジュールを使って簡易的なユニットテストを実施できます。

一見難しく感じるかもしれませんが、基本から順に説明していきますので一緒に習得していきましょう!

オンライン実行環境で試しながら学ぼう

このあとサンプルコードが出てきますが、できれば眺めるだけではなく実行したり自分で一部書き換えたりしたほうが理解が深まります。

とはいえ今からPythonの実行環境を自分のPCに準備するのは大変なので、ブラウザ上でコードを書いて即実行できるpaiza.IOを利用してみてください。

paiza.io

doctestを使ってみよう

◆doctestとは

doctestはdoc+testという名称からも分かるとおり、ドキュメントとして書かれたコメントを使ってテストをするためのモジュールです。

Pythonでは関数やクラスの先頭に文字列を記述するとdocstring(ドキュメンテーション文字列)として扱われます。用途としては「どんな処理かあとで見て分かるように先頭に説明文を書いておこう」という感じなのですが、このdocstringの中に入出力例を書いてテストをしてみようというのがdoctestです。

docstringに入出力を書くだけで実際に動かせるテストコードになり、ソースファイルにドキュメントとして残せるので便利です。

ただし、doctestには注意事項もあります。他のモジュールと組み合わせたテストを書くのに制限がある、ドキュメントなので大量に書くとそれだけソースファイルが肥大化する、テストコードとして必ずしも読みやすいものになるとは限らない…などです。

なお、きちんとしたテストモジュールはunittestといって別に用意されているため、doctestはあくまで簡易版であると捉えていただければと思います。

(参考)Python公式ドキュメント doctet --- 対話的な実行例をテストする

◆docstringの基本的な書き方

docstringの基本的な書き方は次のとおりです。

  • コメントをトリプルクォート("""もしくは''')で囲って記述する。
  • 関数またはクラスの先頭に記述する。
def my_function():
    '''docstring-test
    line1
    line2
    line3
    '''


定義の先頭に式などがあるとdocstringとみなされないので注意しましょう。

def my_function_error():
    n = 0
    '''docstring-test
    line1
    line2
    line3
    '''

◆doctestの簡単な例

実際にdoctestの例を見ていきます。コードはコピペで実行できますので、paiza.IOに貼り付けて試してみてください。

コードの下3行に出てくる呪文のような部分はdoctest を実行するためのコードです。詳しくはこちらの記事が分かりやすく説明してくださっているので参考にしてください。

エラーにならないケース:
2+3=5で正しい結果が得られます。doctestはエラーがない場合、何も出力されません。

def add(a, b):
    '''
    # 例えば足し算のテストコード
    >>> add(2, 3)
    5
    '''

    result = a + b
    return result

if __name__ == '__main__':
    import doctest
    doctest.testmod()


エラーになるケース:
間違ったコードを書いて実行するとエラーが出力されます。

def add(a, b):
    '''
    # 足し算のつもりで式が間違っている
    >>> add(2, 3)
    5
    '''
    
    result = a - b
    return result

if __name__ == '__main__':
    import doctest
    doctest.testmod()

期待値と実際得られた結果も教えてくれます。

**********************************************************************
File "Main.py", line 4, in __main__.add
Failed example:
    add(2, 3)
Expected:
    5
Got:
    -1
**********************************************************************
1 items had failures:
   1 of   1 in __main__.add
***Test Failed*** 1 failures.


エラーの有無に関わらず常に出力結果を表示したい場合は、doctest.testmod()の引数にverbose=Trueを指定してください。

def add(a, b):
    '''
    # 例えば足し算のテストコード
    >>> add(2, 3)
    5
    '''

    result = a + b
    return result

if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose=True)

上記のコードはエラーにはなりませんが出力結果はこのように表示されます。

Trying:
    add(2, 3)
Expecting:
    5
ok
1 items had no tests:
    __main__
1 items passed all tests:
   1 tests in __main__.add
1 tests in 2 items.
1 passed and 0 failed.
Test passed.

Dランク相当の問題でdoctestを使ってみよう

paizaが提供しているプログラミングスキルを測るスキルチェックでは、制限時間内に問題を解いて提出し、採点されたスコアでランクづけをおこなっています。

paizaのスキルチェック問題について詳しくはこちら
paizaのスキルチェック

スキルチェックでは、あらかじめテストケースが1~3個用意されており、入力値と出力値が示されています。ただ、このケースを通ったからと言って必ずしも採点で100点を取れるとは限らず、確実にスコアを取るには自分でテストを実施する必要があります。

以前、システム開発におけるテスト工程について解説した記事で、西暦を入れたら和暦を返す簡単なプログラム問題についてテストを実施しました。

今回は同じ問題で、doctestを使ってテストコードを書いてみることにします。


問題:
半角数字で渡された数字Yを西暦とし、「元号(漢字2文字)X年」という表記の和暦に変換します。このとき、1926≦Y≦2030、元号には「昭和」・「平成」のどちらかを表示してください。2020以降は「未定」とだけ表示します。

今回は単純化するため日付は考慮せず、1926年~1988年を昭和、1989年~2019年を平成、2020以降を未定とします。また、「元年」表記はせず「1年」でいいです。


最初に書いたコード:

# 西暦Yをyearで受け取る
year = int(input())

# yearを昭和・平成・未定に変換
res = str(year) + "年は、"
if(1925 < year < 1988):
    print(res + "昭和" + str(year - 1925) + "年")
elif(1988 < year < 2019):
    print(res + "平成" + str(year - 1988) + "年")
else:
    print(res + "未定")

このコードに対して、昭和1年の1926年と昭和63年の1988年の2つをテストします。


doctestを用いたテストコード:
前回は入力エリアに手動で値を入力して実行しましたが、doctestを使うと以下のように書くことができます。

def Gengo(year: int) -> str:
    '''
    >>> Gengo(1926) #1926年のテスト
    '1926年は、昭和1年'
    >>> Gengo(1988) #1988年のテスト
    '1988年は、昭和63年'
    '''
    
    res = str(year) + "年は、"
    if(1925 < year < 1988):
        res += "昭和" + str(year - 1925) + "年"
    elif(1988 < year < 2019):
        res += "平成" + str(year - 1988) + "年"
    else:
        res += "未定"
    
    return res

if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose=True)

実行すると…

Trying:
    Gengo(1926) #1926年のテスト
Expecting:
    '1926年は、昭和1年'
ok
Trying:
    Gengo(1988) #1988年のテスト
Expecting:
    '1988年は、昭和63年'
**********************************************************************
File "Main.py", line 5, in __main__.Gengo
Failed example:
    Gengo(1988) #1988年のテスト
Expected:
    '1988年は、昭和63年'
Got:
    '1988年は、未定'
1 items had no tests:
    __main__
**********************************************************************
1 items had failures:
   1 of   2 in __main__.Gengo
2 tests in 2 items.
1 passed and 1 failed.
***Test Failed*** 1 failures.

1988年のときの結果が誤っていることが分かりました。「昭和63年」と表示されるべきなのに、現在の処理では「未定」と表示されてしまいます。

よく見てみると「<」記号で範囲指定している箇所で、境界値が条件外になってしまっているところがあります。意外にこの値の範囲指定というのは馬鹿にできなくて、まあまあやりがちなミスなので気をつけましょう。

範囲指定を修正して再度コードを実行してみます。

def Gengo(year: int) -> str:
    '''
    >>> Gengo(1926) #1926年のテスト
    '1926年は、昭和1年'
    >>> Gengo(1988) #1988年のテスト
    '1988年は、昭和63年'
    '''
    
    res = str(year) + "年は、"
    if(1925 < year <= 1988):
        res += "昭和" + str(year - 1925) + "年"
    elif(1988 < year <= 2019):
        res += "平成" + str(year - 1988) + "年"
    else:
        res += "未定"
    
    return res

if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose=True)

実行すると2つとも正しい結果が返ってきました。

Trying:
    Gengo(1926) #1926年のテスト
Expecting:
    '1926年は、昭和1年'
ok
Trying:
    Gengo(1988) #1988年のテスト
Expecting:
    '1988年は、昭和63年'
ok
1 items had no tests:
    __main__
1 items passed all tests:
   2 tests in __main__.Gengo
2 tests in 2 items.
2 passed and 0 failed.
Test passed.


(参考)doctestを使った例外処理:

doctestではraise Exceptionのテストができます。yearにint型以外の値が渡された場合にNotIntを出す処理を追加してみます。ここではisinstance(object, class)を使って型の判定をしています。

例外処理については、paizaラーニングで公開している「Python入門編10: 例外処理を理解しよう」講座もぜひ受講してみてください。

class NotInt(ValueError):
    pass

def Gengo(year: int) -> str:
    '''
    >>> Gengo(1926) #1926年のテスト
    '1926年は、昭和1年'
    >>> Gengo(1988) #1988年のテスト
    '1988年は、昭和63年'
    >>> Gengo(10.99) #例外テスト "..."は省略を示す
    Traceback (most recent call last):
    ...
    NotInt
    '''
    
    if not isinstance(year, int):
        raise NotInt
    
    res = str(year) + "年は、"
    if(1925 < year <= 1988):
        res += "昭和" + str(year - 1925) + "年"
    elif(1988 < year <= 2019):
        res += "平成" + str(year - 1988) + "年"
    else:
        res += "未定"

    return res

if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose=True)

実行してみると「10.99」を渡したところはちゃんとNotIntが返ってきて、テストも通りました。

Trying:
    Gengo(1926) #1926年のテスト
Expecting:
    '1926年は、昭和1年'
ok
Trying:
    Gengo(1988) #1988年のテスト
Expecting:
    '1988年は、昭和63年'
ok
Trying:
    Gengo(10.99)  #例外テスト "..."は省略を示す
Expecting:
    Traceback (most recent call last):
    ...
    NotInt
ok
2 items had no tests:
    __main__
    __main__.NotInt
1 items passed all tests:
   3 tests in __main__.Gengo
3 tests in 3 items.
3 passed and 0 failed.
Test passed.


それでは最後に昭和・平成・未定のいずれのケースでも正しいかを確認するテストコードを書きましょう。テストケースの導出はこちらの記事を参考にしてください。

ちなみにdoctestを使わず書いたコードは以下のとおりです。何が出力されたら正しいかは別にドキュメントにするか、頭の中で考えないといけません。

この問題は入力値が1つで複雑ではないのでまだいいですが…。

# テストしたい値を配列yearに格納
year = []
year = [1926, 1950, 1988, 1989, 2000, 2019, 2020, 2025, 2030]

for i in range(len(year)):
    # yearを昭和・平成・未定に変換
    res = str(year[i]) + "年は、"
    if(1925 < year[i] <= 1988):
        print(res + "昭和" + str(year[i] - 1925) + "年")
    elif(1988 < year[i] <= 2019):
        print(res + "平成" + str(year[i] - 1988) + "年")
    else:
        print(res + "未定")

doctestを使って書いたコードは以下の通りです。ちょっとドキュメント部分のボリュームがありますが、入力値と正しい結果が記述できそのままテストができるので、平成の次の元号が発表されたあとのテストも実施しやすそうですね。

def Gengo(year: int) -> str:
    '''
    >>> Gengo(1926) #1926年のテスト
    '1926年は、昭和1年'
    >>> Gengo(1950) #1950年のテスト
    '1950年は、昭和25年'
    >>> Gengo(1988) #1988年のテスト
    '1988年は、昭和63年'
    >>> Gengo(1989) #1989年のテスト
    '1989年は、平成1年'
    >>> Gengo(2000) #2000年のテスト
    '2000年は、平成12年'
    >>> Gengo(2019) #2019年のテスト
    '2019年は、平成31年'
    >>> Gengo(2020) #2020年のテスト
    '2020年は、未定'
    >>> Gengo(2025) #2025年のテスト
    '2025年は、未定'
    >>> Gengo(2030) #2030年のテスト
    '2030年は、未定'
    '''
    
    res = str(year) + "年は、"
    if(1925 < year <= 1988):
        res += "昭和" + str(year - 1925) + "年"
    elif(1988 < year <= 2019):
        res += "平成" + str(year - 1988) + "年"
    else:
        res += "未定"
    
    return res

if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose=True)

実行してみるとすべてのテストが通り、正しい結果であることを確認できました。

Trying:
    Gengo(1926) #1926年のテスト
Expecting:
    '1926年は、昭和1年'
ok
Trying:
    Gengo(1950) #1950年のテスト
Expecting:
    '1950年は、昭和25年'
ok
Trying:
    Gengo(1988) #1988年のテスト
Expecting:
    '1988年は、昭和63年'
ok
Trying:
    Gengo(1989) #1989年のテスト
Expecting:
    '1989年は、平成1年'
ok
Trying:
    Gengo(2000) #2000年のテスト
Expecting:
    '2000年は、平成12年'
ok
Trying:
    Gengo(2019) #2019年のテスト
Expecting:
    '2019年は、平成31年'
ok
Trying:
    Gengo(2020) #2020年のテスト
Expecting:
    '2020年は、未定'
ok
Trying:
    Gengo(2025) #2025年のテスト
Expecting:
    '2025年は、未定'
ok
Trying:
    Gengo(2030) #2030年のテスト
Expecting:
    '2030年は、未定'
ok
1 items had no tests:
    __main__
1 items passed all tests:
   9 tests in __main__.Gengo
9 tests in 2 items.
9 passed and 0 failed.
Test passed.

まとめ

Pythonの標準モジュールであるdoctestを使って、テストコードを書くことについて学んできました。

doctestは例で挙げた問題のように入出力結果を確認したいときに便利ですし、何よりドキュメントとして残すことができるのであとで見ても分かりやすいというのがいいですね。

スキルチェック問題を解くときは提出前に用意されたテストケースで確認することはもちろん、自分でテストコードを書いて確認してみることが確実にスコアを伸ばすことにつながります。

また、テストケースを考えたりテストコードを書いたりということは実務でも役に立ちますので慣れておいて損はありません。

もしこの記事の内容が「ちょっと難しかったな…」と感じた人はpaizaラーニングの「Python3入門編」(完全無料)を受講してから再度チャレンジしてみてください。

Python入門編は全11レッスンあってけっこうなボリュームなので、四則演算とfor文・if文あたりは問題ないという方は「Python入門編7:関数を理解しよう」を受講すればdoctestを理解できると思います。





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

詳しくはこちら

paizaラーニング

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

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

詳しくはこちら

paizaのスキルチェック

【2019年版】JavaScript開発環境をブラウザに構築するクラウドIDEを厳選してみた!

f:id:paiza:20190320111822j:plain
どうも、まさとらん(@0310lan)です!

今回は、ブラウザを本格的なJavaScript開発環境に変えるクラウドIDEを厳選してご紹介しようと思います!

現在では、クラウドIDEといってもさまざまな特徴を持ったサービスが存在しています。

フレームワークを活用したプログラミングに特化していたり、Linux環境の構築に強いサービスなど…それぞれの特徴も合わせて紹介するのでぜひ参考にしてみてください!

なお、JavaScriptはpaizaラーニングの「JavaScript入門編」で学ぶことができます。そちらも合わせてチェックしてみてください。

■万能型のJavaScript開発環境を提供するクラウドIDE

Glitch

f:id:paiza:20190320112018j:plain

JavaScriptによるフロントエンド開発とNode.jsによるバックエンド開発を1つのエディタで作業できる万能型のクラウドIDEが「Glitch」です。

現時点ですべての機能を無償で利用できるうえ、開発環境をいくつでも保持することができます。また、GitHubと連携することでソースコードのインポート・エクスポートも可能ですし、ターミナルも搭載されているのでコマンド操作の実行もできます。


Node.jsのパッケージを検索して1クリックで導入できる機能も特徴的。

f:id:paiza:20190320112036j:plain

導入後は自動的にpackage.jsonへ書き込まれるようになっているので便利です。


また、Glitchで編集した内容はバックグラウンドで自動的にバージョン管理が行われています。

f:id:paiza:20190320112049j:plain

いつ・だれが・どんな変更をしたかグラフィカルに閲覧することが可能で、1クリックで任意の状態へ簡単に戻せるようになっています。

その他、便利な機能としては以下のとおり!

  • 独自ホスティング機能
  • 環境変数や非公開データの作成
  • 複数人で同時コラボ編集
  • IDE自体をそのまま埋め込み可能
  • ポートフォリオ作成機能
  • デバッグ機能

etc...

さらに、最近のバージョンアップでソースコードをFirebaseへ1クリックでデプロイすることも可能になっているので、以下の記事も合わせて参考にしていただくと幸いです。

paiza.hatenablog.com


<参考リンク>

■GitHubから起動できる本格的なクラウドIDE

Gitpod

f:id:paiza:20190320112245j:plain

ソースコードをGitHubで管理している人も多いと思いますが、そのGitHubから起動できるクラウドIDEが「Gitpod」です。


例えば、任意のリポジトリページを開くと以下のような感じのURLになると思います。

https://github.com/sample/mysample


このURLの先頭に「gitpod.io#」を付与してみましょう。

gitpod.io#https://github.com/sample/mysample


すると、即座にリポジトリのソースコードを読み込んで自動的にクラウドIDEが起動します。(※初回のみログインが必要)

f:id:paiza:20190320112400j:plain

ファイルの作成・編集はもちろん、ターミナルからコマンドラインでの操作も可能です。

また、GitHubとの相性も良いのでコミットやマージ、プルリクエスト、変更履歴や差分をエディタ上で制御することもできるので便利です。

その他、便利な機能としては以下のとおりです!

  • コマンドパレットによる検索・操作
  • カラーテーマの設定
  • Gitの履歴表示
  • 変更箇所の可視化(インジケーター)
  • gpコマンドによるプレビュー表示&公開
  • エディタの共有機能
  • 毎月100時間の無償利用付き

etc...


GitpodはTheiaをベースにしたVS Codeライクなエディタで、豊富な拡張性を備えているのも特徴です。

Theia

f:id:paiza:20190320112511j:plain

Theiaは自分が所有している独自サーバーへも簡単にインストールできるので、個人的に使いたい場合にも活用できますよ。


<参考リンク>

■JavaScriptフレームワークを即座に使えるクラウドIDE

CodeSandbox

f:id:paiza:20190320112643j:plain

JavaScriptのフレームワークと言えばReact、Angular、Vueなど…さまざまな種類があるわけですが、これらのフレームワークを利用するための導入準備などが一切不要ですぐにでもプログラミングを始められるのが「CodeSandbox」の特徴でしょう。


1クリックで即座に任意のフレームワークが導入された状態の開発エディタが起動するうえ、プロジェクトをホスティングしてそのまま公開までしてくれます。

f:id:paiza:20190320112704j:plain

現在も活発にバージョンアップが行われており、今ではサーバサイドのフレームワークとして人気のNext.jsやNuxt.jsも利用可能です。

学習用途や勉強会などでも便利に活用できるし、個人開発のプロジェクトを公開する目的でも利用価値は高いでしょう。

その他、便利な機能としては以下のとおり!

  • ターミナルからのコマンド操作(サーバサイド構築時)
  • npmパッケージを1クリックで導入
  • 複数人で編集できるコラボ連携
  • デバッグ機能
  • コードエディタの埋め込み機能
  • GitHubアカウントとの連携&エクスポート
  • コードエディタのカスマイズ機能
  • ホスティング機能
  • プロジェクトのダウンロード機能
  • PWA対応


<参考リンク>

■スクリーンキャストも可能なクラウドIDE

Scrimba

f:id:paiza:20190320112850j:plain

一般的なHTML / CSS / JavaScriptを使ったプログラミングができるのですが、スクリーンキャスト機能を使ってブラウザの画面と自分の声を録画しながら動画を作成できるのが大きな特徴でしょう。


ソースコードのテキストデータを記録することで動画を作っているので、録画中も非常に軽快な動作を実現しています。

コード補完やファイルのディレクトリ構造を作ったり、独立して操作可能なプレビューウィンドウやコンソールログの表示など機能も充実しています。

f:id:paiza:20190320112913j:plain

外部ライブラリも利用可能で、package.jsonやGoogleスライドのファイルをインポートすることもできます。


録画したあとは、自分の声を編集したり不要な箇所をカットするなど、基本的な編集も可能になっています。

f:id:paiza:20190320112933j:plain

また、動画を途中でストップするとソースコードを自由に編集できる機能もあり、ただ動画を見て学習するだけでなく実際にコードを書きながら学べるので便利です。

プレイリストも作成可能なので、自分でオリジナルのプログラミング教材も簡単に作成することができるでしょう。

その証拠に、公式サイトには多数のプログラミング実況動画が公開されています。


例えば、以下のような講座を今すぐ作成したり公開することができます。


<参考リンク>

■日本語対応のLinux環境を即座に構築できるクラウドIDE

PaizaCloud

f:id:paiza:20190320113541j:plain

PaizaCloudは一般的なLinux環境をブラウザ上に構築できるため、JavaScriptやNode.jsはもちろんのことPHP / Ruby / Python / Goなどのプログラミング開発環境も簡単に用意できるのが大きな特徴です。


この特性を活用してLAMP環境をわずか数秒でブラウザ上に用意できるうえ、RailsやDjangoといったフレームワークや、WordPress、Jupyter notebookなどを即座に構築して利用することもできます。

f:id:paiza:20190320113604j:plain

多彩なプログラミング言語に対応したコードエディタやコマンド操作を行うターミナルも標準で搭載されており、プレビュー確認などに便利なブラウザも利用することができます。

また、ユニークな点として共有機能を1クリックで準備することが可能で、URLをシェアするだけでPaizaCloudのアカウントを持っていない人と複数人で1つの開発環境を共有することが可能です。

その他、便利な機能としては以下のとおり!

  • 3秒で通常のLinux環境を構築
  • コードエディタのカスマイズ機能
  • すべての環境で日本語対応済み
  • 拡張アプリの作成
  • ファイル操作(作成・編集・ディレクトリ)
  • 独自ホスティング機能(有料プラン)
  • SSH接続

無料プランの場合は24時間で環境がリセットされますが、何度でも好きな開発環境を構築できるのでプロトタイプや学習用にも最適です!


<参考リンク>

■おまけ

開発環境というテーマから少しズレますが、JavaScriptやNode.jsのコードエディタと文章を書けるエディタがミックスした変わったサービスがあるので合わせてご紹介しておきます!

簡単に言うとJavaScript版のJupyter Nodebookのような使い方ができるサービスになります。

Observable

f:id:paiza:20190320113733j:plain

ブログのように記事を書いたり画像や動画などを埋め込んだりできるエディタなのですが、JavaScriptでプログラミングできるエディタと実行環境が搭載されています。

そのため、グラフやマッピングをJavaScriptで作成してリアルタイムに表示したり、Canvasを利用して自由に描画させることも可能です。

変数や関数なども作成可能で、他ユーザーが作成した関数を自分のノートブックに読み込んで再利用できる仕組みなども提供されています。

RunKit

f:id:paiza:20190320113803j:plain

こちらはObservableのNode.js版のようなイメージで利用できるサービスになります。

同じように文章を書くことができるエディタとNode.jsのプログラミングが可能なエディタが搭載されており、npmからパッケージをインストールすることもできるので便利です。

Node.js本体のバージョンも細かく指定可能で、サーバーレスな独自APIも簡単に作成して公開できます。


「Observable」「RunKit」はいずれも無料で使えるうえ、独自のノートブックをいつでもネット上に公開することができます。

ブログのような使い方もできるし、個人用のプログラミング学習ログとしても使える便利なツールなのでブックマークしておくことをオススメします!

■動画でプログラミングが学べるpaizaラーニング


動画でプログラミングが学べるpaizaラーニングでは、Python、Java、C言語、C#、PHP、Ruby、SQL、JavaScript、HTML/CSSなど、プログラミング初心者でも動画で学べる入門レッスンを公開しています。

Python入門編」「C#入門編」「ITエンジニアの就活準備編」といった人気講座も完全無料となっておりますので、プログラミングを学びたい方・ITエンジニアを目指したい方はぜひごらんください。

■まとめ

今回はブラウザをJavaScriptの開発環境に変えるクラウドIDEを厳選してまとめてみました。

いずれも無料プランが用意されており、ブラウザから気軽に使えるのでまずは気になったIDEを試してみるのがいいでしょう。

また、何度でも開発環境を新しく作り直せるので、新しい技術を試してみたりプログラミングを勉強する際にはとても重宝するはずです。

ぜひ、みなさんもクラウドIDEを活用してプログラミングの世界を楽しんでみましょう!





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

詳しくはこちら

paizaラーニング

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

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

詳しくはこちら

paizaのスキルチェック

アンドロイドと冒険しながら解いたプログラミング問題の回答コード公開


paizaで公開していた『エンジニアが死滅シタ世界〜アンドロイドとふたりぼっちで生きろ〜』、みなさんチャレンジしていただけましたでしょうか?

今回はこちらで出題されているプログラミング問題の回答コードを公開いたします。「挑戦してみたけど、解けない問題があった」「一応解けたけど、誰かが考えたコードも見てみたい」という方の参考になればと思います。

エンジニアが死滅シタ世界〜アンドロイドとふたりぼっちで生きろ〜』とは

エンジニアが死滅シタ世界〜アンドロイドとふたりぼっちで生きろ〜』は、プログラミング問題を解きながら物語を進める近未来SFアドベンチャーゲームです。死滅したエンジニアたちが遺したシステムを復旧させ、失われた【RIN】の記憶と文明社会を取り戻すのがミッションです。

各地の探索スポットは、長い時を経てシステムが止まっていますが、あなたがプログラミング問題に正解することで復活します。さらに、施設が復活すれば【RIN】の記憶とパーツがGETできます。集めたパーツは【RIN】に自由に装備させることができ、ビジュアルを自在にチューニングすることも可能。世界にたった1つ、あなただけの【RIN】を作り上げることができます。

各問題の回答コード

※この記事に掲載している回答コードはすべてPythonです。
※実際の問題ページには、より詳しい条件や図式、入力例や期待される出力なども記載されていますので、実際に問題にチャレンジする際は参考にしてください。
※プログラミング問題の解き方や正解はひとつではありません。回答コードはあくまでひとつの解き方として参考にし、ぜひご自分でも解き方を考えてみてください。

荒れ果てた警察署 [MISSION LEVEL: D]

あなたは 0 から 9 の数字を 3 つ入力すると開く扉を開こうとしています。
鍵の番号は左から 2 つまで判明しています。 3 つ目に関しては以下の法則で決まることがわかりました。
・2 つ目までをすべて足す
・足したものを 10 で割ったときの余り
2 つ目までの数字が与えられるので 3 つ目を計算し出力してください。

荒れ果てたオフィス [MISSION LEVEL: D]

あなたは書類の整理をしています。
書類には 1 から 3 までの重要度 e が設定されています。数字が大きいほど重要な書類とされています。
書類のタイトル文字列 S_i と重要度 e_i が n 件与えられます。
重要度が 3 の書類のタイトルのみを入力された順に出力してください。

アンドロイドの生産工場 [MISSION LEVEL: D]

ある暗号化された文字列 S が与えられます。
文字列 S のうち奇数文字目を取り出せば解読できることがわかりました。
文字列 S が与えられるので奇数文字目の文字を取り出して解読した文字列を出力してください。

錆びついた電波塔 [MISSION LEVEL: D]

電波でデータ通信するプログラムが壊れてしまっており、あなたはそれを直そうとしています。
n回の通信をしたとき、受信した各データ各電波強度 d_i が与えられます。各電波強度 d_i は 0 から 10 の整数で表され、 5 以下では通信に失敗します。
n 回の通信のうち通信に成功した回数を出力してください。

お金が引き出せない銀行 [MISSION LEVEL: D]

あなたは残高からお金を引き出すプログラムを作成しています。
残高 n と引き出したい額 w が与えられます。
この時、引き出し額が残高を上回ってマイナスになる場合は "error" と出力し、引き出せる場合は残高を出力するプログラムを作成してください。

機械の総合病院 [MISSION LEVEL: C]

PAIZA病院のシステムを解析します。
不正アクセスを試みるクラッカーからユーザーを守るために、ユーザーが設定するパスワードが十分に複雑であるようにしなくてはなりません。
PAIZA病院は、パスワードの複雑さの条件として以下の 3 つを定めました。
・長さが 6 以上
・英字と数字の両方を含む必要がある
・同じ文字を 3 つ以上連続で使用することはできない
なお、英字の大文字と小文字は区別する必要はありません。
パスワードの候補が入力として与えられるので、複雑さの条件をすべて満たす場合は "Valid"、そうでない場合は "Invalid" と出力してください。

学べない学校 [MISSION LEVEL: C]

学校の子どもたちがじゃんけんをしています。特にA くんと B くんはじゃんけんが大好きで毎日しており、それぞれ「自分のほうが強い」と言い合っています。
そこであなたは二人のじゃんけんの結果を記録し、どちらが強いのか判定するプログラムを作ってあげることにしました。
これからAくんとBくんは N 回じゃんけんをします。
A くんと B くんの出した手が N 回分与えられるので、A くんが勝った回数と B くんが勝った回数を数えるプログラムを作成してください。
じゃんけんの手はグー、チョキ、パーのいずれかで、グーはチョキに勝ち、チョキはパーに勝ち、パーはグーに勝ちます。

入力では
・グーは "g"
・チョキは "c"
・パーは "p"
で表現されます。

荒れ果てたショップ [MISSION LEVEL: C]

あなたは、ファイルの管理をしようとしています。
各ファイルは番号で管理されていますが、一目でどの番号かわかるように、番号の左に適当な数の 0 を埋め込んで、番号の長さを固定することにしました。
例えば、番号の長さを 3 で固定したい場合、0 は 000, 4 は 004, 13 は 013, 144 は 144 というようにファイル番号をつけます。
3 つの整数 N, A, B が与えられます。
A 以上 B 以下の数それぞれについて、番号の長さが N にするようなゼロ埋めをするとファイル番号はどのように表示されるかを出力してください。

高層タワー [MISSION LEVEL: B]

単語を組み合わせて新単語を作ります。
新単語は N 個の文字列を、前から順に結合して作ります。
この時、冗長さをなくすため、 前から結合した単語の末尾 と 後ろの単語の先端 が一番長く一致するように結合します。
例えば、 入力例 1 の "paiza", "apple", "letter" の場合、先頭から "paiza", "apple" を条件どおり重ねると "paizapple" となります。
この単語を更に次の単語と重ねると "paizappletter" となります。
なお、必ず前から順番に重ねるため、 入力例 2 の "poh", "p", "oh" を結合する場合は、"poh" と "p" を重ねた後の単語 "pohp" と "oh" を重ね "pohpoh" となります。
N 個の単語が与えられるので、前から順番に単語を結合した場合の新単語を出力してください。

砂漠の公園 [MISSION LEVEL: B]

昔この公園ではある競技の大会がよく開催されていました。各試合結果の記録が見つかりましたが、どのチームが優勝したかの記録は欠損しています。
そこであなたは各試合結果から優勝チームを調べるプログラムを作成することにしました。
大会は勝ち点方式の総当たり戦で行います。勝つと2点、引き分けで1点、負けると0点勝ち点が増えます。
すべての試合が終わったあと、勝ち点が一番多いチームが優勝です。
大会の参加人数と、試合結果が入力されたときに、何番目のチームが勝ち点いくつの何勝何敗何引き分けで優勝したか出力するプログラムを書いてください。

隔離された街のゲート [MISSION LEVEL: B]

あなたは作りかけのゲームプログラムを発見しましたが、キャラクターの動きの制限する方法が未実装でした。

制作中のゲームは、縦方向に H マスと横方向に W マスだけ広がる格子上のマップを用います。
左下のマスが原点であり、その座標を (0, 0) とします。
原点から横方向に x マス、縦方向に y マス進んだ座標を (x, y) と表記します。
現在の開発段階では障害物などはなく、キャラクターの初期座標が必ず (0, 0) です。
この状態から合計で N 回の上下左右への移動操作が行われます。
各移動操作はキャラクターの座標 (x, y) を以下のように変更します。

・上への移動 : キャラクターの座標を (x, y) から (x, y + 1) へ変更する。
・下への移動 : キャラクターの座標を (x, y) から (x, y - 1) へ変更する。
・左への移動 : キャラクターの座標を (x, y) から (x - 1, y) へ変更する。
・右への移動 : キャラクターの座標を (x, y) から (x + 1, y) へ変更する。

開発依頼書には、N 回の操作中にキャラクターが不正な座標にいることがないか判定するプログラムの作成が指示されています。
ここで不正な座標とは、マップ外の座標、すなわち格子上に存在しない座標すべてのことを指します。
N 回の移動操作の中で、キャラクターが不正な座標にいることがある場合は"invalid"を、そうでない場合は"valid"を 1 行に出力してください。

有名なプールサイド [MISSION LEVEL: A]

あなたは今度新しくできる町のデザインを任されました。
町は南北に H、東西に W の広さで、計 H × W 個の区画からなっています。
また、それぞれの区画には、次の図のように座標が割り当てられているものとします。
f:id:paiza:20190312194406p:plain
町に建設したい建物のリストが与えられます。
どの建物も長方形の形をしており、ただ一つの扉を持っています。

リストにはたくさんの建物が含まれているため、リストに載っているすべての建物を建設することができるとは限りません。
そこで、町のどこにどの建物を建設するかを決めるのがあなたの仕事です。

建物を建設する場所を決める際には、次の 3 つのルールを守らなくてはいけません。
1. どの 2 つの建物も重なってはいけない。
2. 建設する建物の向きはリストに与えられたとおりでないといけない (建物を回転して配置してはいけない)。
3. どの 2 つの建物についても、それらの扉の間を「建物がない区画」を通って移動できる。
ルール 3 を正確に述べると、次のようになります: すべての建設する建物の組に対して、それらの扉の座標を P, Q とするとき、 以下の条件 (i)-(iii) を満たすような座標の列 (r_1, c_1), (r_2, c_2), ..., (r_m, c_m) が存在する (m は 0 以上の整数)。

(i) 1 ≦ r_i ≦ H, 1 ≦ c_i ≦ W が成り立つ (1 ≦ i ≦ m)。
(ii) 座標 (r_i, c_i) にはどの建物も建設されていない (1 ≦ i ≦ m)。
(iii) 座標 (r_i, c_i) と (r_{i+1}, c_{i+1}) は上下左右のいずれかで隣接している (0 ≦ i ≦ m)。ただし、P = (r_0, c_0), Q = (r_{m+1}, c_{m+1}) とする。

次の図は条件 (i)-(iii) が守られている建物の配置と守られていない配置の例を表しています。
f:id:paiza:20190312194457p:plain
灰色の建物と緑の建物については、それらの扉の間を「建物がない区画」を通って移動することができます。
一方、灰色の建物と青の建物については、そのような移動方法は存在しません。
町の区画 X 個分の大きさの建物は、X 万円の利益を生み出します。

建物が生み出す利益の合計ができるだけ多くなるような、建物の配置を求めるプログラムを書いてください。

最低1個以上の利益を生み出す建物を配置することで正解となり、建物の面積がスコアとして計算されます。

単純に、左上から置けそうなら1個だけ置いていく方法


少し工夫をして、左上から扉の横は1つ開けて置いていく方法

※単純な解き方のコードは、提出前動作確認でエラーとなることがありますが、問題文の『最低1個以上の利益を生み出す建物を配置することで正解となり』を満たしているため、提出するとクリアとなります。

最後の「有名なプールサイド [MISSION LEVEL: A]」の問題は、上記の単純な解き方でも提出をすればとりあえず正解はできますが、点数はあまり高くなりません。ほかにももっと効率のよい解き方は複数ありますので、これについては、後日担当のエンジニアが詳しく解説する記事を書きます。

これらの問題にはいつでもオンライン上で挑戦・実行して採点結果を見ることができます。プログラミング問題を解いてみたい方は、ぜひ挑戦してみてください!

エンジニアが死滅シタ世界〜アンドロイドとふたりぼっちで生きろ〜』はこちら





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

詳しくはこちら

paizaラーニング

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

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

詳しくはこちら

paizaのスキルチェック





※このブログで紹介しているキャンペーンやイベント、およびサイト内の情報については、すべて記事公開時の情報となります。閲覧されたタイミングによっては状況が変わっている場合もございますのでご了承ください。

ITプログラマー・エンジニア転職・就活・学習のpaiza

プログラミング入門講座|paizaラーニング

PHP入門編Ruby入門編Python入門編Java入門編JavaScript入門編C言語入門編C#入門編アルゴリズム入門編AI機械学習入門

エンジニアのためのプログラミング転職サイト|paiza転職

プログラミング スキルチェックエンジニア求人一覧

未経験からエンジニアを目指す人の転職サイト|EN:TRY

プログラミング スキルチェックエンジニア未経験可求人一覧

エンジニアを目指す学生の就活サイト|paiza新卒

プログラミング スキルチェックエンジニア求人一覧

ブラウザを開くだけで エディタ、Webサーバ、DB等の開発環境が整う|PaizaCloud