6月中に行ってきたこと

はじめに

この記事は、6月中に私自身が行ってきたことをまとめた記事です。 6月では、新しい技術を取り入れたり、勉強会に行ったりなど、今までとは違ったことをよく行った一ヶ月になりました。

サーバ監視ツールの導入

現在CodeCandyを動かしているサーバや自宅内で利用しているサーバにMackerelを導入しました。 そもそもは、自分でサーバ監視ツールを作成しようと思っていたのですが、今回はせっかくなので、前々から知っていたMackerelを利用してみたいと思い使い始めました。 Mackerelを選んだ理由としては大きく3つあります。

・手軽に導入できて、使用できる ・ポートを開けていないサーバにも利用できる ・前々から使ってみたいと思っていた

特に、2つ目のポートを開けていないサーバにも利用できるといった点が、採用に大きく影響しました。 自分の環境では、外部に公開していないサーバもあるので、そのサーバでも利用できるのはとてもありがたいことです。 そして、Mackerelを導入してまず思ったのが、とても手軽に導入できることです。 使い始めも、難しくなく、監視するサーバにツールを導入するものとても簡単にできました。 また、初めて使うときは14日間無料で有料プランを利用できるといったことも良い点だと思いました。 現在は無料プランで利用していますが、無料プランでもかなり使い勝手がいいです。 僕のサーバ環境なら十分すぎるくらいです。 また、様々なプラグインが用意されているので、今度使用してみたいと思っています。

技術大会に参加した

技術大会に参加しに、京都に帰省しました。 今回参加した勉強会は、はてな・ペパボ技術大会 #4 〜DevOps〜 @京都です。 はてなさんとペパボさんの合同技術大会ということで、過去に大学で講演していただきお世話になり、とても興味があったので参加しました。 内容はDevOpsに関することで、はてなのエンジニアさんとペパボのエンジニアさんがそれぞれ、講演(プレゼン)し、トークセッションを行い、懇親会といった流れでした。 私は、友人と二人で当日香川から京都に出発し参加しました。現地では、別の友人や、先輩も参加していました。 この技術大会を聴講して、今まで自分が考えていたインフラに対するイメージや、開発者としての目線について、大きく考えが変わりました。 また、たくさんの技術者の方との交流を深められて、とても刺激を得れた一日となりました。 ただ、日帰りで参加したこともあり、とても疲れてしまったということが個人的に残念でした。(次は、もっと余裕をもって参加したい) 個人的には、懇親会で、Mackerelを通して、たくさんお話ができたのがとても嬉しかったです。 たくさんのいい刺激や影響を受けれたので、参加してとてもよかったです。

CodeCandyの改良

URL: https://codecandy.tomosse.work

6月はあまり、開発が進みませんでしたが、CodeCandyの改良は少しずつ行っていました。 モデルの設計の見直し、Javaの実行環境を整えたことなどが大きなアップデートでしょうか。 また、使用しているDockerのコンテナのイメージを変更しました。 今まではUbuntuのイメージを利用していたのですが、openjdk:10のイメージを利用するようになりました。 理由としては、Javaの実行環境を導入するのに、一番適していると考えたからです。 今後は、現在開発している新機能の実装と、実行モジュールの改良を行っていきたいと思います。

まとめ

6月はあまり、開発面では大きな進捗はなかったですが、得るものはとても多くあったと思います。 今後も積極的にイベントに参加したいと思う一ヶ月でした。 7月では、CodeCandyの実行モジュールの改良に力を入れたいと思います。 もちろん大学の授業もおろそかにならないように頑張ります。

Rubyで外部コマンドを実行する方法と処理時間の測定方法

はじめに

現在、大学の授業でプログラムの性能実験を行っています。 実験では、C言語で作成されたコードの性能比較を行うのですが、実行時間の測定などを行うのが大変です。 そこで、今回はRubyを利用して、C言語のコードを実行し、その実行時間を測定する方法を紹介したいと思います。

C言語のコードを実行するために

RubyC言語のコードを実行するために、外部コマンドを利用します。 外部コマンドとは、簡単にな例をあげれば、Linux上であれば、BashRubyのコードを動かした時、RubyのコードでBashで動かすことです。 外部コマンドが利用できれば、あとはいつも通りターミナル上でC言語のコードを動かす感覚で、C言語のプログラムを実行することできます。 Rubyには外部コマンドを動かす方法がいくつか存在するのですが、今回はバッククォート(`)を使った方法とopen3を使った方法を紹介します。

バッククォートを使った場合

バッククォートを使った場合の、外部コマンドの実行方法は以下の通りです。

`echo "Hello World`

で囲った外部コマンドを実行できます。 標準出力しか、得ることができないのですが、Bashであれば、Bashの標準入力を使うことで標準入力を使うことができます。 簡単な実行結果であれば、を使うのがいいでしょう。

open3を使った場合

open3を使った場合の、外部コマンドを実行するサンプルを以下に示します。 今回はpopen3で説明を行います。

require 'open3'

Open3.poepn3("echo Hello World") do |stdin, stdout, stderr, status|
  stdin.puts ""
  stdin.close
  stdout.each do |line|
    puts line
  end
  stderr.each do |line|
    puts line
  end
end

open3を使えば、標準出力だけでなく、標準入力、標準エラー、ステータスなども使うことができます。 Open3.popen3の("")内の外部コマンドが実行されます。

時間測定

Rubyには、Benchmarkという時間測定に便利なライブラリが存在します。 サンプルコードを示しておきます。

require 'benchmark'

result = Benchmark.realtime do
  # 測定したい処理
end

puts "#{result}"

Benchmark.realtimeを使うことで、do ~ end内の処理時間を測定することができます。 Benchmark.realtimeが実行時間を返却してくれるので、変数に格納してあげるとよいでしょう。 返却値は、秒数となっています。

まとめ

今回は自分が最近よく使う、open3とBenchmarkを紹介しました。 みなさんも機会があれば使ってみてはいかがでしょうか。

5月中に行ってきたこと

はじめに

前回、4月に行った1ヶ月やってきたことをまとめる記事の続きです。 今回は6月になってしまいましたが、5月中に行ってきたことをまとめていきます。

4月の時点での5月の目標についての達成度

4月末の時点で決めた、5月の目標は以下の3つでした。

  • MontBlancLTをみんなに使ってもらえるようUI、コードなど様々な部分を改良していく
  • 現在作成中のオンラインコンパイラcode-candyをサークルの新入生に使ってもらう
  • Go言語、PythonJavaScriptの学習を行う。(題材は言語処理やWebアプリケーションの予定)

この中で5月中に達成できた項目は、以下の2つでした。

  • 現在作成中のオンラインコンパイラcode-candyをサークルの新入生に使ってもらう
  • Go言語、PythonJavaScriptの学習を行う。(題材は言語処理やWebアプリケーションの予定)

それでは、それぞれの内容を振り返ってみたいと思います。

まず1つ目のCodeCandyをサークルの新入生に使ってもらうという目標ですが、これは目標通り新入生に活用してもらえるようになりました。 それだけでなく、様々な人がソースコードやアプリケーションを見てくださり、現在では使用者が約30人程度にまで増えました。 ここまで利用してくれる人がいるとは思っていなかったので正直とても嬉しいです。 また、知らない人がGitHubにPull Requestを送ってくれたり、アプリケーションを活用してくれたこともあり、自分の自信にも繋がりました。
次に2つ目の項目についてですが、私は現在Go言語でプログラミングコンテストシステムのサーバサイドの開発をGo言語を用いて行っているのである程度目標は達成できたと感じています。 また、CodeCandyのフロントエンドの改良などでJavaScriptのコードに触れる機会が増えたり、友人のDjangoのコードを一緒に考えたりする機会もあるのでこの目標は達成できているのではないかと考えています。

トータルで考えると4月末の時点での5月の目標は概ね達成できたと思います。

1つ目のMontBlankLTのUIの改良についての目標が達成できなかったのは、CodeCandyの作成に時間を取りすぎたのが原因だと考えています。 MontBlankLT自体は機能は完成しているので、それの影響も少なからずあったとは思います。

技術面での成果

5月の技術面での成果としてはなんと言ってもCodeCandyをリリースしたことです。 CodeCandyの記事についてはまた後日記事にまとめたいと思っているのでここではあまり詳しくまとめませんが、簡単に言うとオンラインコンパイラ+オンラインジャッジ機能がついたWebアプリケーションです。 エディタから実行環境まで取り揃えているので、初心者の方でも簡単に使っていただけるのが特徴です。 Ruby on Railsで作成しました。 提出されたコードの実行にはDockerを使ったコンテナ環境で実行を行っています。 以下にGitHubリポジトリとアプリへのリンクを貼っておきます。

github.com

アプリのリンク↓

https://codecandy.tomosse.work

まとめ

5月は個人的にはかなり得られたものが多い月だと感じました。 6月は大学のレポートやテストで忙しい時期ですが、少しでも進捗をだせたらいいなと思っています。 特に現在Go言語で開発しているプログラミングコンテストシステムの開発とCodeCandyの保守・運用について力を入れて頑張りたいと考えています。 また、CodeCandyを高校などの実際の教育現場で運用できるようなタイプも作成していきたいと思っています。

形態素解析を体験するツールを作ってみた

はじめに

今回は僕が作った形態素解析を体験できるWebアプリケーションを紹介していきます。以下にサイトのリンクと、GitHubのリンクを貼っておきます。

誰でも簡単形態素解析

github.com

このアプリケーションについて

このアプリケーションは「誰でも簡単に形態素解析を試せる」をモットーに作成したwebアプリケーションです。 前回のブログ記事でも書きましたが、Sinatra + Unicornで動作させています。 サーバサイドでnatto + mecabを動作させフロントエンドで表示させている形になります。 また、APIも実装してあるのでcurlなどでリクエストを送って使うこともできます。 このアプリケーションを作成した上で得た知見は主に以下のことです。

このアプリケーションを作ったきっかけ

そもそもこのアプリケーションを作ったきっかけは、僕が高校生の時にとある大学のオープンキャンパスに行ったことから始まります。 その大学で展示されていたものの一つにこのような形態素解析を体験できるツールがあり、それに僕が興味を持ったからです。 そして、現在大学生となり、みんなにも同じように形態素解析に興味を持ってもらいたいと思い作成しました。

今後の発展

このアプリケーションはあくまで、形態素解析を体験してもらうためのツールとして作成しました。 なので、今後は形態素解析を使ったシステムや研究などをしてみたいと思っています。

4月中に行ってきたこと

はじめに

このブログは自分が所属しているサークルで行われているAdvent Calendrerの記事を書く時しか使っていませんでした。 それではもったいない!と思ってアウトプットも兼ねて今回は、4月中に自分がやってきたことを記事にまとめていきたいと思います。

生活スタイルについて

いきなり技術的なところからまとめてもいいのですが、4月は新学期がスタートしたということもあり、まずは自分の周りで変わったことから話していきたいと思います。 大きく変わったことといえば、以下のようなことです。

  • 今まで技術的なことを身近に聞けた先輩が卒業された
  • 授業が始まったので以前よりも自由な時間が減った
  • 学校が始まり、春休みより大学の友達と話す機会が増えた

ほとんどが3月から4月への移り変わりで生じたことです。 やはりいつも身近にいた先輩がいなくなるのは寂しく感じます。 昨年も同じことを思い、学校生活が始まった数週間この先どうなるのか不安だったことを思い出しました。 しかし、これは乗り越えないといけない壁なので、頑張って乗り切りたいと思います。 もちろん、悪いことばかりでなく、いいこともありました。 新しい後輩が入ってきたり、春休み中はあまり会わなかった同期と技術的なことからあんなことまで色々話す機会が3月より増えました。 あと3月よりは体調が優れるようになりました。

技術について

ここ最近はRuby、主にRuby on RailsSinatraを使うことが多かったです。 春休み中はRailsを使ったWebアプリケーションの開発をずーっと続けていたので、その流れで、4月もRailsでWebアプリケーションの開発を行っていました。 新しくアプリケーションを作る時は自分が今まで使ってこなかった技術昔の自分がわからなかった、使えなかった技術を使えるようにチャレンジすることの2点を意識しました。 ただコードを書くだけじゃなく、少しでも得るものを増やすためです。 また、Go言語やPythonなどを使ったWebアプリケーションを開発するための技術も学習し始めました。 RailsSinatraを使わなくてもWebアプリを作れるようになりたいと思ったからです。 まだまだ勉強を始めたばかりでわからないことがたくさんありますが、楽しんでやれています。

成果物

MontBlancLT

github.com

URL https://montblanc.tomosse.work/

誰でも簡単形態素解析ツール

github.com

URL https://kyo-industry.tomosse.work/

4月中に作成した主なアプリケーションとしては主に上記の2つがあります。

MontBlancLTはWebサイト上でLT用のプレゼンテーション資料を作成、管理できるようにしたツールです。 発表ツールも備えており、Webサイト上で動作するのでどのPCを使っても同じ環境で作業できるようになっています。 また、プレゼンテーション機能にVimキーバインドを少しだけ適用させてあるのも特徴です。 Twitterのアカウントがあれば誰でも利用できます。 このアプリはRailsで動作しており、プレゼンテーション機能はjQueryを使いました。 動的フォームはcocoonで実装しています。 現在は試験的に運用しています。

誰でも形態素解析ツール・kyo-industryはその名の通り、形態素解析を簡単に行うためのツールです。 形態素解析について学習したいと思ったのをきっかけに作成しました。 これはサーバサイドでnattoを使いmecabを利用し、動作しています。 このアプリはSinatra+Unicornで動作しています。

また、いくつか作成途中のアプリなどが存在するので、5月にはそれらを完成させれるようにしたいですね。 またそれぞれのアプリについては別の機会に記事を書きたいと思っています。

5月の目標

  • MontBlancLTをみんなに使ってもらえるようUI、コードなど様々な部分を改良していく
  • 現在作成中のオンラインコンパイラcode-candyをサークルの新入生に使ってもらう
  • Go言語、PythonJavaScriptの学習を行う。(題材は言語処理やWebアプリケーションの予定)

上に書いたすべての目標をこなすことができるのが一番良いのですが、まずはこれらの目標に取り掛かれるようにしたいです。

感想

1ヶ月間やってきたことをまとめると、自分のできたこと、できなかったことがわかったので今後も続けたいと思いました。 あとは、もっと技術的なことも記事にしていきたいと思います。

RailsのAPIモードを試してみた話

RailsAPIモードを試してみた話

はじめに

これは香川大学工学部サークルSLPのアドベントカレンダー14日目の記事です。 前後、怖い人に挟まれていますが頑張ります(ガクブル)。 今回はRails5から実装されたAPIモードを使ってAPIサーバを構築し、様々な言語でHTTPリクエストを送ってみたいと思います。 かなり緩くやっていけたらなと思います。

APIモードとは

API作成に特化したモードのことで、Rails5で実装された機能らしいです。 簡単に今までのRailsとの違いを説明すると、MVCでいう、Viewの部分が存在しません。 変わりにそのURLにアクセスするとerbを返さず、jsonを返す仕様になっています。 また、標準で入っているGemもViewの分が必要なくなっているので、普通に立ち上げたRailsのプロジェクトよりも少なくなっています。 詳しくは各々で調べてみてください。

とりあえず使ってみた

さっそくですが、RailsAPIモードを使って、APIサーバを構築してみたいと思います。 今回は名前と学籍番号を管理するAPIを構築してみます。

今回使用した開発環境をざっくり紹介するとこんな感じです。
- Ubuntu16.04
- Ruby 2.4.1
- Rails 5.1.4

それではまず、プロジェクトを立ち上げます。

Rails new name_api --api

プロジェクト名の後に、 --apiをつけることでAPIモードでプロジェクトが立ち上がります。 --apiをつけなければ今まで通りのRailsのプロジェクトとして立ち上がります(当たり前)。 では、プロジェクトの中に入ってみましょう。

cd name_api

Railsらしく、様々なディレクトリとファイルが生成されていると思います。 今回は手早くRESTfulなAPIを作りたいのでscaffoldを使います。 基本的にはAPIモードでもRailsのコマンドは同じように使えるみたいです。 それでは、コマンドを入力していきます。

rails g scaffold User name:string number:string

ずらーっと色々と表示されたと思います。createとかinvokeとかrouteが出てきて、正常に終わっていればOKです。 私側の実行では、以下のように表示されました。

Running via Spring preloader in process 19815
      invoke  active_record
      create    db/migrate/20171205074009_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    test_unit
      create      test/controllers/users_controller_test.rb

そしてmigrateします。

rails db:create && rails db:migrate

これでAPI側の実装はほとんど終わりです(すごく簡単!!)。 それではサーバを立ち上げてみましょう。

rails server -b=0.0.0.0

無事に起動したら、アクセスしてみます。

http://localhost:3000

アクセスできたら、いつものRailsのページが表示されると思います。

ルーティングを確認

以下のコマンドを入力して、ルーティングを確認します。

rails routes

以下のように表示されていると思います。

Prefix Verb   URI Pattern          Controller#Action
 users GET    /users(.:format)     users#index
       POST   /users(.:format)     users#create
  user GET    /users/:id(.:format) users#show
       PATCH  /users/:id(.:format) users#update
       PUT    /users/:id(.:format) users#update
       DELETE /users/:id(.:format) users#destroy

ためしに、users#indexにアクセスしてみます。

http://localhost:3000/users

通常、scaffoldを使うとあらかじめ完成されたページが表示されると思います。しかし、今回の場合だと、 [ ] だけが表示されたと思います。 なぜかというと、controllerを見ればわかりますが、APIモードでは、erbではなく、JSONを返してくれているからなのです。 [ ] なのは、まだ何もレコードされていないからですね。

様々な方法でPOSTしてみる

それでは、このAPIにPOSTリクエストを送ってみます。 基本的にはHTTPリクエストで、JSONをPOSTしてあげればOKです。 POSTするURLは先ほど確認したのでそれに従います。 今回の場合であれば以下のURLにPOSTしてあげればよさそうです。

http://localhost:3000/users

curlでPOST

curl -X POST -H "Content-Type: application/json" -d '{"name": "明示カール", "number": "17t200"}' http://localhost:3000/users

RubyでPOST

post.rb

require 'net/http'
require 'uri'
require 'json'

url = "http://localhost:3000/hoges"
sample_data = {"name": "白沢ルビィ" : "number": "16t200"}

uri = URI.parse(url)

http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.request_uri)
req["Content-Type"] = "application/json"
req.body = sample_data.to_json
res = http.request(req)

Python3でPOST

post.py

import requests
import json

url = 'http://localhost:3000/hoges'
method = "POST"
obj = {"name" : "本田パイソン", "number": "15t200"}
json_data = json.dumps(obj).encode("utf-8")

response = requests.post(url, json.dumps(obj), headers = {'Content-Type' : 'application/json'})
print(response.text)

JavaScriptでPOST

JavaScriptでPOSTする場合API側の設定を少し変更してあげなければなりません。 変更点は以下の記事を参考にしてみてください。 https://qiita.com/kaorumori/items/0a53c248343892c8f35c

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>JavaScriptからPOSTでJSONデータを送信する</title>
    <script src="jquery.js"></script>
    <script src="post.js"></script>
  </head>
  <body>
    <p>
      URL: <input type="text" id="url_post" name="url" size="100" value="http://localhost:3000/users">
    </p>
    <p>
      name:<input type="text" id="name" size="30" value="じゃばすく太郎">
    </p>
    <p>
      number:<input type="text" id="number" size="30" value="13T200">
    </p>
    <p>
      <button id="button" type="button">Submit</button></p>
    </p>
  </body>
</html>

post.js

$(function(){
  $("#response").html("Response Value");

  $("#button").click( function(){
    const url = $("#url_post").val();

    const JSONdata = {
      name: $("#name").val(),
      number: $("#name").val()
    };

    alert(JSON.stringify(JSONdata));

    $.ajax({
      type : 'post',
      url : url,
      data : JSON.stringify(JSONdata),
      contentType : 'application/JSON',
      dataType : 'JSON',
      scritCharset : 'utf-8',
      succes : function(data) {
        alert("success");
        alert(JSON.stringify(data));
        $("#response").html(JSON.stringify(data));
      },
      error : function(data) {
        alert("error");
        alert(JSON.stringify(data));
        $("#response").html(JSON.stringify(data));
      }
    });
  });
});

今回のサンプルコードでは、jqueryを使用しました。 今回の場合ですと、jqeuryをjquery.jsとして同じ階層のディレクトリに置いておいてあげて解決しています。

POSTしたデータを確認してみる

それでは先ほど、POSTしたデータを確認してみましょう。 まずはすべてのPOSTしたすべてのデータを確認してみます。

http://localhost:3000/users

上記のURLにアクセスすると、先ほどと違いPOSTした内容がレコードされていると思います。 せっかくなのでGETリクエストを送ってデータを取得してみます。 今回は、手っ取り早くcurlを使います。

curl http://localhost:3000/users

取得したのがこちら。

[{"id":1,"name":"明示カール","number":"17t200","created_at":"2017-12-05T08:15:37.735Z","updated_at":"2017-12-05T08:15:37.735Z"},{"id":2,"name":"白沢ルビィ","number":"16t200","created_at":"2017-12-05T14:51:40.472Z","updated_at":"2017-12-05T14:51:40.472Z"},{"id":3,"name":"本田パイソン","number":"15t200","created_at":"2017-12-05T14:52:46.918Z","updated_at":"2017-12-05T14:52:46.918Z"},{"id":4,"name":null,"number":"じゃばすく太郎","created_at":"2017-12-05T15:00:04.685Z","updated_at":"2017-12-05T15:00:04.685Z"}]

created_atやupdated_atは違う値を保持しているはずですが、似たようなデータを取得できたと思います。 次にレコードしたデータを一つずつ取得してみます。 試しに1番目と2番目のデータを取得してみます。 1番目

curl http://localhost:3000:users/1
{"id":1,"name":"明示カール","number":"17t200","created_at":"2017-12-05T08:15:37.735Z","updated_at":"2017-12-05T08:15:37.735Z"}%

2番目

curl http://localhost:3000:users/2
{"id":2,"name":"白沢ルビィ","number":"16t200","created_at":"2017-12-05T14:51:40.472Z","updated_at":"2017-12-05T14:51:40.472Z"}%

いい感じに取得できました。

まとめ

雑な説明になってしまいましたがいかかだったでしょうか。 いろいろな部分の説明を省いているので、詳しく知りたい方はこの記事ををきっかけにAPIモードについて調べてもらえたらなと思います。 私自身は、今後このモードを使って、様々なAPIを作ってみて、それに対応したネイティブアプリやスマホアプリを作ってみたいです。

最後に・・・

この記事で作ったサンプルコードの出来が悪くても、多めにみてやってください...。

Raspberry Pi を使ってサーバを構築しよう

はじめに

最近大学の授業やその他の行事やバイトやらで、プログラミングを教える機会がかなり増えてきました。僕自身こういったプログラミングを教えれる立場になることは、大学に入学する前にやれたらいいなと思っていたことなので、いい傾向にあります。そこで今回はそれに少しだけちなんで、あると凄く便利なサーバの構築を、サーバってなんぞやとかサーバ構築してみたいけどお金かかりそうだし敷居高そうっていう人に向けて、記事を書いて行きたいと思います。なので今回は、サーバ構築の経験がある人や高度な技術を持っている人は優しい目でみてくださると幸いです。また、今回はRaspberry Piを使ってサーバを構築していきます。理由は記事内でも書いてますが手軽に使えて手頃な価格で入手できるからと言った理由から使います。あとなんか面白そうじゃないですか。

サーバとは

まずそもそもサーバとはなんぞやっていう人もいると思います。サーバとは簡単に言うといろいろなサービスを提供するシステムです。
例としてはファイルサーバやSSHサーバやDNSサーバなど色々なものがあります。有名なものとしてはマインクラフトのゲームサーバもサーバの一種ですね。今回の記事ではSSHサーバについて取り扱っていきます。
長々と説明するより実際に作ってみたほうが理解しやすいと思うので早速サーバを構築していきましょう。

環境構築

まずはRaspberry Piをサーバとして使えるように環境を整えていきましょう。
今回紹介する例は僕の動作環境なのであくまで参考程度に環境を構築してみてください。

Raspberry Piでサーバを構築する際の大きな利点は以下の通りのことがあるかと。

  • Raspberry PiがPCに比べて安い
  • USBメモリを使うので簡単に組み立てられる
  • バイルバッテリーを使うことにより非常時の電源にもできる
  • とても小さいので場所に困らない

まあようするに手軽に使えるし必要な物も安く集められるのです。

それでは実際にOSをインストールしてSSHで接続するところまでやっていきましょう。


OSのインストールしよう

今回使用するOSはRaspbianというものです。Raspberry Piで使えるメジャーなOSだと思います。  他にもArch Linuxやwindows10Iotなどもありますがそれはお好みで使ってみてください(僕は使ったことがありません...)。 OSのインストール自体はRaspbianのサイトから入手してSDカードに書き込むだけです。

インストールの手順は以下の通りにすればできると思います。

  1. サイトからNOOBSのzipを入手 https://www.raspberrypi.org/downloads/noobs/
  2. 入手したzipフォルダを解凍しSDカードにコピーする
  3. Raspberry piにSDカードを差し込み起動する
  4. インストールするものを選択する画面になると思いますのでRaspbianを選択(この時画面下にある言語選択で自分の使いたい言語を選ぶと良い)
  5. Installを選択
  6. 本当に書き込んでいいですかと言ったことを聞かれるのではい(Yes)を選択する

これでインストールの作業は終わりです。

すごく簡単にできましたね。

それでは次にSSHを使えるように設定していきます。


SSHを有効化しよう

Raspberry PiSSH接続するにはSSHを有効化する必要があります。Ctrl+Alt+Tでターミナルを起動して以下のコマンドを入力しましょう。

$sudo raspi-config

すると設定画面のようなものが出てくると思います。
この中からAdvanced Optionsを選択してください。
次にA4のSSHを選択してください。
次の画面ではYesを選択してください。
これでRaspberry piSSHが有効になりました。

ここまできたらSSHで接続してみましょう。

実際にSSHで接続してみよう

ここまで色々環境構築をしてきましたがこれで一旦環境構築はおしまいです。ではSSHRaspberry Piサーバに接続してみましょう。SSHを使うにはMacLinuxを使っている人はTerminalで、Windowsを使っている人はTeraTermCygwinなどを使って接続します。今回はTerminal(Cygwin)を使っていきます。

OSX,Linux,Windows(Cygwin)の場合

$SSH pi@Raspberry PiのIPアドレス

とTerminalに打ち込みます。
すると英語で色々文がでてきてyesかnoで聞かれる状態になると思うのでyesを選択してください。その後パスワードを聞かれるのでraspberryと入力しましょう。
すると

pi@raspberry:~$

とでてきます。

ここでwarningが出た場合は

ssh-keygen -R Raspberry PiのIPアドレス

を打ち込んでからssh接続してみてください

これでSSHサーバの完成です。

セキュリティ問題を解決しよう

さてSSHRaspberry Piに接続できましたね。しかしこのまま使っているとユーザー名やパスワードがバレているということもありすごく危険な状態です。なので必要最低限の対策としてアカウントを新しく作りパスワードを設定してあげます。今回はローカル内で使用することを前提としているのでポートに関する設定はしません。

最初にrootユーザにパスワードを変えましょう。(rootの説明は省きます) Raspberry PiのTerminalに

$sudo passwd root

と打ち込みます。するとパスワードを聞かれますので自分が設定したいパスワードを入力しましょう。 次に新しいユーザを作っていきます。

$sudo adduser 新規ユーザー名

とTerminalに打ち込みます。何か色々聞かれる思いますので自分で確認しながら設定していってください。 これで新しいアカウントができました。

そして新規ユーザでsudoコマンドを使えるようにします。

sudo gpasswd -a 新規ユーザ名 sudo

これで新しいアカウントでsudoが使えるようになりました。

次に先ほど作った新規ユーザをpiユーザと同じグループに設定してあげます。

$groups pi

とTerminalに入力するとズラーッと色々出てくると思います。
pi: pi adm dialout ...みたいな感じに。

これがpiユーザの入っているグループです。

そして上記の:より右側にあるものをコピーしてあげます。

これを新規ユーザに追加してあげます。

コピーした文字列の区切りはスペースになってると思いますが,で区切るようにしてください。

例:pi,adm.dialout ...

$sudo usermod -G コピーした文字列 新規ユーザ名

とTerminalに入力することでグループに追加できました。

一応確認のために以下のコマンドをTerminalに入力して確認しておきます。

groups 新規ユーザ名

これでpiユーザと同じように表示されればOKです。

これで新しいアカウントでsudoが使えるようになりました。

ここで一旦rootユーザになっておきましょう。

$su

パスワードを聞かれたら先ほど決めたrootユーザのパスワードを入力しましょう。

そして最後にpiユーザを削除しておきます。

#userdel -rf pi

で削除してあげましょう

これで新しいアカウントのみがユーザとして使えるようになりました。

再起動後Raspberry Pi側で新規ユーザでログインした後に別のPCで新しいユーザにSSH接続してみます。

$ssh 新しいユーザ名@Raspberry PiのIPアドレス

接続でき、lsと打ち込んで色々フォルダがでてこればOKです。

まとめ

今回はRaspberry Piを使ってSSHサーバを構築してきました。結構簡単じゃない?ちょっと設定書くだけでサーバができるんだって思った人もいるかもしれません。ちょっとした機能のサーバは構築が簡単です。かなり内容的には薄っぺらいものになってしまいましたが少しでも誰かの役にたてばいいなと思います。これ以外にもsambaを使ったファイルサーバの構築などを行ってみるとサーバの構築がより楽しくなると思います。あとRaspbianはバージョンによって結構仕様が異なるみたい...? ぜひみなさんもサーバを構築してみましょう!