Curlコマンド

はじめに

Curlコマンドを少し勉強しましたのでブログで整理を行っていきます。

HTTPアクセス

本題に入る前にHTTPについて整理を行ったほうが通りが良いので整理してます。 HTTPとはWebサーバーとWebブラウザなどのクライアントがデータを送受信する際のルール(取り決め)です。

つまり、HTTPアクセスとはWebサーバーとブラウザなどがHTTPでデータ送受信を行うことを示します。

ちなみにHTTPSはHTTP Over SSL/TLSの略で、暗号化をしてデータの送受信を行うことを意味しています。 HTTPSのおかげでデータを悪用されないため、安心して(?)ネットショッピングなどが行えます。

Curlコマンドとは何か

本題に戻ります。まずは言葉の定義から説明致します。 CurlとはClient for URLの略で 「URLで示される場所からデータを様々なプロトコル(HTTPなど)を用いて送受信することができるプログラムおよびコマンド」を意味しています。

具体的に言うと、コマンド上で、特定のURLに紐付いたファイルのダウンロードを行ったりすることが出来ます。

ターミナルからソフトインストールを行う際、Curl〜といった言葉が出てくることがあります。 あれはHTTPリクエストによりインストールするファイルをダウンロードしているんです。

実践してみる

前回作ったSinatra GETCurlコマンドを用いて実行してみます。

まずは前回実行したファイルをローカルで立ち上げます。 curlコマンドでのGET、POSTは簡単です。 ターミナルで「curl」+ URLを書けばOKです。以下に実行例を記載します。

$curl http://localhost:4567/form?get_name=test

実行例

https://gyazo.com/f666300fb32493bcb0755963bea0677f

コマンドプロンプトからCURL、URLを打たなくても、Google ChromeからCURLコマンドを取得することも出来ます。

chrome

https://gyazo.com/5fbfc11c43bcc272566fa572186713c5

Sinatraに出会った

初体験

先日Sinatraというフレームワークを触ってみたので頭の整理がてらカキコします。

Sinatraとは

Rubyフレームワークです。フレームワークRailsと捉えられやすいですが、 SintraもRuby界では有名なようですね(失礼!)

第一印象

「え、これってフレームワークなんですか??」っていうぐらいの簡素です。 Sinatra公式Rails公式を比較すると、 非常に簡素なのがわかりますね!

Sinatraの魅力は簡素なため、しっかりと理解しないと コードがかけないという利点(苦笑)があります。

以下ではSinatraを題材にして紹介を行っていきます。 環境設定はググるといっぱいあるので、説明は割愛します!

ビューの表示方法

Sinatraはルーティングが非常に大切です。

Railsでもありますが、 ルーティングとは HTTPメソッドとURLマッチングパターン(パス) が一致した際に行うアクションを規定したものです。

ルーティングは以下のような形で記述します。

get / do      #getメソッドパスは「/」

    処理
end

※HTTPメソッドとはクライアント(ブラウザ)が行いたいアクション (Get、Postなど)をサーバーに伝えることです。

※URLマッチングパターンとあるように正規表現を使ったり、 ワイルドカードを使うことも出来ます。

※ルーティングには2つの記述方法があるようですが、 シンプルなクラシックスタイルで記述しています。

HTTP GETメソッド 個人メモ

yahoo.co.jpをみたいとしたらchrome(もしくはIE、もしくはFireFoxもしくはsafari)さんにhttp://www.yahoo.co.jp と入力し、「enter」を押します。

これはブラウザを通して、GETメソッドとしてサーバー側にリソースの取得をお願いしていることです。 で、ブラウザ上でホームページが見れるのはサーバーさんがビュー表示をブラウザさんに返しているということ。

Hello World

手軽なものを実行してみます。

hello-world.rb

require 'sinatra'

get '/' do
  erb :hello
end

順に説明します。

require 'sinatra'

と記述することでHTTPメソッドが使える+実行すると、Webrick実行(サーバー立ち上げ)してくれます。

get '/' do
    erb :hello
end

クライアント側が/method get(リソースの取得リクエスト)を 行った際のアクションを記述しています。 上記は / のアクセスをした際にerb形式のhello.erb(シンボルで表記するので「:」を付け加える)を出力しろと記述しています。

./view/hello.erb

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>hello</title>
</head>
<body>
  hello sinatra
</body>
</html>

実行は当該ディレクトリで ruby hello.rb するだけでサーバー(Webrick) が立ち上がります!

実行結果

https://gyazo.com/79bdc382beb8ffc747d4a4f27b7c703b

get、post(Params)

次にget、postメソッドを使ってみます

form.rb

post '/form' do
  @post_name = params[:post_name]
  erb :form
end

get '/form?:get_name?' do
  @get_name = params[:get_name]
  erb :form
end

get、post形式で、パラメータを渡す際はparamsで受け渡しが行われます。 Railsでもおなじみですね。

view(抜粋)ですが、以下のようにしときます。

./view/form.erb

  <h1>シナトラ</h1>
  <form action="" method="post">ポスト
    <input type="text" name = "post_name">
    <input type="submit">
  </form>

  <form action="" method="get">ゲット
    <input type="text" name="get_name">
    <input type="submit">
  </form>

  <% if @get_name %>
    <div>
      ゲットしました。<br>
      こんにちわ<br>
      <%= @get_name %>さん
    </div>
  <% elsif @post_name %>
    <div>
      ポストしました。<br>
      こんにちわ<br>
      <%= @post_name %>さん
    </div>
  <% end %>

ビューにはform.rbで定義されたインスタンス変数が渡されます。

実行結果

https://gyazo.com/570cfdbadb1c8bbc2a685ba03bbfd6b1

最後に

ここでは紹介しませんでしたが、rubyの代表的なDB Gemである 「Active Record」 も使いました。今回Sinatraを使うことでDB、ビューの理解が非常に理解が進み、感動しました。

というのも、

ここ一ヶ月 Railsを勉強してなんというか

サービス作るには Rails new して、DB作るには、Rails generate ・・・っていう風に

「コマンドゲー」 ぽい感じで作業していて、 プログラミングに対するモチベーションが 下がっていく一方だったんです。 それもこれも僕が初心者なんで、理解が不十分なまま、使っていたのが起因なんですがm( )m

そんな状況下でSinatraを触ってコードを書いていくと「受け身」にならずに「能動的」にコードを書く事が出来て理解が進むと同時にプログラミングを楽しむことが出来ました。

これからも、gemの試しなどSinatraを積極的に利用していこうと思います!

JSON

 先日、JSONを扱う機会がありました。 復習も兼ねて定義及びRubyのコード例を元に頭の整理をしていきます。

JSONとは

まず、恒例の「定義通り」の説明をします。 JSONとはJavaScript Object Notationの略です。 テキストベースのデータフォーマットで 多くのプログラム言語でカバーされているため、 ブラウザ(JS)−サーバー(PHPPythonなど)間でのデータ交換において 使われ、記述が容易(後述)なのでメジャーなデータ・フォーマットです。

表記方法

方法は2つあります。

1つ目が「配列型」 JSON例①

["python", "Ruby", "HTML"]

2つ目が「オブジェクト型」 JSON例②

{"gsacademy":"プログラミング学校","プログラミング経験": "ruby"}

またオブジェクト型の中に配列を入れ子にするとことも出来ます。 ここでは紹介しませんが逆も行えます。ここでは「入れ子型」 とでも名づけておきます。

JSON例③ 「入れ子型」

{"gsacademy":"プログラミング学校","学生番号":"18",
"プログラム経験":[{"Ruby":"1ヶ月"},{"Python":"3ヶ月"}]} 

JSONに入れられる値の型はboolean,string,number等が入るので特に意識せず使えそうです。

使用方法

 一般的なサーバー言語ではJSONフォーマットのまま、使用  出来ないため、一回各言語のフォーマット形式に合わせた配列、連想配列へ変換して使用します。

JSON

JSONデータをRuby用に変換(パースと呼ぶ)を行うには JSONモジュールにある parse (もしくは load ) を用います。

require 'json'
 
data_json = 
'{"gsacademy":"プログラミング学校","プログラム経験":"ruby"}' #オブジェクト型

data_json2 = 
'["gsacademy","学生番号","プログラム経験","ruby"]'  #配列型

#入れ子型
data_json3 = 
'{"gsacademy":"プログラミング学校","学生番号":"18",
"プログラム経験":[{"Ruby":"1ヶ月"},{"Python":"3ヶ月"}],
"好きなFW":[{"Ruby":"SinatraとRailsしか知りません。。。"},{"Javascript":"riot"}]}' 

print data1["gsacademy"].to_s + "\n"  #出力->プログラミング学校
print data2[3] + "\n"             #出力->ruby
print data3["好きなFW"][0]["Ruby"] #出力-> SinatraとRailsしか知りません。。。

Python

ptyhonの例は以下となります。

宗定先生

Pythonも勉強しよー

では。

タイムスタンプとは何か

ある日の研修

タイムスタンプ(正確にはUNIXタイムスタンプ) を使う機会がありました。

これは「1970年1月1日」UTC時点からの経過秒数(整数型) を示すものだそうです。

恥ずかしながら初めて聞く単語だったので、 まとめておきます。

使用方法

以下ではRubyを用いてタイムスタンプを使用してみます。 現時刻から変換するには以下の通りとなります。

例1 タイムスタンプ使用

print Time.now #出力→2016-09-12 22:58:48 +0900
print "\n" #改行
print Time.now.to_i #出力→1473688728
                 #1970年1月1日からの経過秒数
print "\n" #改行

上記のTime.nowは Time型 を表しています。 Time型→タイムスタンプの変換は .to_iをつけるだけです。 また、タイムスタンプは 整数型 を表しています。

用途

こんなことやって何か意味あるの??って思う人も いるかもしれません。 少なくとも私は思ってました。

ですが、前述したようにタイムスタンプは整数型なので、 時間帯を比較する際には簡潔にコードを書くことができ、 非常に有効です。

次項では、 「入力した日付が現時刻と比較して過去ではないか検証する」 コードを例に説明を行います。

コード例

例2 現時刻と入力値比較

require 'time'

print "予約日を入力して下さい\n例)2016年10月22日\n"
enter_time = ((gets.chomp).split(/[年,月,日]/)).join("-")

if enter_time
  if Time.parse(enter_time).to_i >= Time.now.to_i
    print Time.parse(enter_time).to_i
  else
    print "今日の日付より過去です\nもう一度入力して下さい。\n"
  end
end

コードが長くなったので順を追って噛み砕いて説明します。

1行目

require 'time'

→組み込みではないtime ライブラリを 用いることによりありがたーい機能(後述します)が使えます。

2-3行目

print "予約日を入力して下さい\n例)2016年10月22日\n"
enter_time = ((gets.chomp).split(/[年,月,日]/)).join("-")

→予約日入力メッセージを出力し、 「2016年10月23日」といった風に入力すると、 「2016-10-23」と変換されるようにしています。

残り

 if enter_time #入力を受け取る
  if Time.parse(enter_time).to_i >= Time.now.to_i #比較
    print "予約承りました"
  else
    print "今日の日付より過去です\nもう一度入力して下さい。\n"
  end
 end

→Time.parseはtimeライブラリの機能です。timeライブラリは   組み込みで入っていないので、require timeをする必要があります。  この機能により、色々な表現(2016-10-22や2016/10/22)  をTime型に変換してくれます。  そしてto_iをつけてやると現時刻との比較が簡単に  行なえますね。  

※補足 タイムスタンプ型→Time型への変換はTime.atを使います。  

まとめ

タイムスタンプを用いないと例2は場合分けが多くなります。 (私の力では・・・)

一方、例2のコードはスッキリしてますね(^^)

UTF-8とSHIFT-JISの違いとは

はじめに

現在、見習いrubyエンジニアとして働いています。 業務中に詰まったところをアップしていきます!

初日 詰まったところ

Shift-JIS形式でのHTMLファイル作成のタスクを 振られて「??」状態でした・・・

HTMLを作成するときにmetaタグに「utf-8」を つけているな〜位しか認識していなかったので、 Shift-JIS??って感じでした汗

以下では頭の整理のためにUTF-8、Shift-JIS についてまとめていきます!

前提知識① Unicode

まず、本題に入る前に前提知識として Unicodeの話から進めていきます。

Unicodeとはえらーい人が集まって業界標準文字コード体系です。

字面だけ聞いても、なんだか「???」状態ですね。 自分なりに咀嚼すると、Unicodeは全世界の人が つかいやすいようにアルファベット、日本語、ハングル語 といった文字集合を扱う統一規格です。

つまり、全世界の人がコンピューターを用いるための 表示文字集合を統一化した訳です。 例えば、日本語のひらがなだったら「あいうえお・・・わをん」 という風に規定したわけです。

キーポイントはUnicodeはあくまでも「表示文字」だけを 規定したという事です。

前提知識② 文字符号化スキーム

但し、表示文字を規定していても、コンピューター がそのまま読める訳ではありません。 そこでどのように文字に落としこむかがポイントになります。

コンピューター→人間が読める文字(Unicode)

へのつなぎを「文字符号化スキーム」と呼びます。

本題 文字符号化スキーム UTF-8

文字符号化スキームはUTF-8UTF-16UTF-32 など色々とあるようですが、代表格は「UTF-8」のようです。 HTMLによく出てくるタグ < meta charset="utf-8" > がありますね。

これは 「utf-8形式で書いたから、ブラウザ(コンピュータ)さん、 翻訳よろしくね〜」って事です。

本題2 文字符号化スキーム② SHIFT-JIS

SHIFT-JISは日本語を表示するために 文字符号化スキームの一種です。 但し、対応する文字集合がJIS規格(日本工業規格)という 文字コード集合のために用いられています。

何故に2つの文字集合コードが混在するの???って 困惑しますね。 実はコンピューターが出来た当初、JISのように 各国で独自の文字集合ができていたようです。 で、各国が世界中の文字コード体系を一つにまとめようとして 出来たのがUnicodeとなります。

現在、インターネットで表示する文字符号化スキームは UTF-8形式が多いですが、SHIFT-JISでも表示することが出来ます。

自分でSHIFT-JIS形式で書く際は、  < meta charset="shift_jis" >と書いて、 ブラウザさんにshift-jis形式で読み込みを行うよう 指示する必要があります。