SOLG System Blog

【未経験者にもおすすめ!】 おすすめプログラミング勉強サイト「Progate」

2016年11月07日

こんばんは、2年目システムエンジニアの城所です。

早いもので、もう11月。あっという間に3年目になってしまうなぁ・・と焦りを感じつつ、今月から今までやったことのなかった「Ruby on Rails」に挑戦しようと考えています。

ところで、皆さんは新しく言語を取り入れたりする場合にはどんなサイトを見ますか?
railsチュートリアルのようなサイトをいきなり始める人もいるかとは思いますが、基礎から学ぶ場合には「ドットインストール」を思い浮かべる方も多いのではないでしょうか?

ドットインストール


ドットインストール
特徴
・3分間の動画による説明
・講座の種類がかなり豊富


説明がわかりやすく、1動画も長くて3分と空いた時間にも見れるため結構自分も重宝しているサービスです。
こんな感じで学習の記録も見れます。
プロフィール


今回も例にならい、ドットインストールで勉強を始めようと思ったのですが、やったことのない言語ということもあり、基礎知識のないまま動画を見てプログラムを打ち込むとなると思ったよりも進まない印象を受けました。


今までオンライン上で勉強できるサイトはドットインストールくらいしかないと思っていたのですが、この機に調べてみるとサイト上での勉強ができるサイトが他にも多くあることを知り驚きました。

どれもユニークだったのですが、中でも下記の「Progate」がとても良かったのでご紹介したいと思います。

Progate
公式サイト:https://prog-8.com/

特徴
・最初にスライドを読み、スライド通りにコードを打ちこみ正解すると次のステップに進んでいく
・ブラウザ1画面で完結する
・サーバーが用意されており、動作結果がすぐにプレビュー画面で見れる

【Progateがおすすめな3つの理由!】

一つ目:レッスンを読むことでがゴールではなく、アウトプットまでがゴールになっている!
本や動画での学習の場合、インプットが目的になってしまい、読んだ上でアウトプットするためにはひと頑張りが必要なケースが多くありがちです。特に簡単な箇所だと読むだけで終えてしまい、後々それが響いてきたりすることが自分の場合よくありました。
「Progate」では実際にコードを書くまで次のステップにも行けないため確実にアウトプットが行えます。

2つ目:ブラウザのみで完結できるため、環境構築がいらない!
「ブラウザのみで良い!」という点が非常に便利です。参考書等の場合、まず冒頭に環境構築がありますがその参考書が古かったりすると、同じ環境にできずに謎のエラーが出たりして、そもそも学習にたどり着けない可能性があります。また最近はweb上の情報がほとんどMacユーザー向けになっていることでWindowsユーザ(エンジニア職以外の方はWindowsユーザの方が多いはず、、)が勉強するのは困難になっていますが「Progate」ではブラウザさえあればできるのでその心配もないです。

三つ目:やっていて面白い!
このサイトでは結果をすぐに確認できたり、学習に応じてステータスが伸びたりと楽しめるための工夫が多くされていると感じました。楽しみながら上達できるのが一番だと思うのでその点で是非おすすめしたいです。

以上、簡単にですが「Progate」の紹介をしてみました。

ドットインストールもとても良いサイトなので、使い分けとして「Progate」で一通り動かしてみた後で、「ドットインストール」で確認するといった流れが効率的なのではないかと思います。


数値(Lv)で達成度が確認できるので、それもモチベーションに繋がりやすいです。
自分も3年目までに「Progate」でLv50、ドットインストールの講座完了数も「500」くらいまでは進めようと思います!


ブラウザさえあれば簡単に学習できるので「エンジニアでないけどプログラムに興味がある」といった方にもオススメです!

ぜひぜひ試してみてください。  

Posted by iA SEチーム at 21:14Comments(0)railswebサービス

[Rails]AWS SDK for Ruby(2.5系)を使用してファイルをS3にアップロードしてみた

2016年09月06日

aws

まだまだ日中は夏のような暑さですが、
日が暮れると風が涼しく、ひぐらしも鳴き始め、もうすぐ夏も終わりなんだなー
っとしみじみと感じている榊原です。

今回はタイトル通り、AWS様が提供しているAWS SDK for Rubyを使用して、
S3にファイル(今回はCSVファイル)をアップロードするまでの流れをさっくり書きたいと思います。
Qiita、公式等、色々なところでやり方について書かれているので、今更と思う人がいるかもしれませんが、
AWS SDK for Rubyを最新にしたことによって色々変わっていたので、今更と思わず、すこし見ていただけたらなと思います。

AWS SDKとは


まず、AWS SDKとはなんぞやということですが、簡潔に言うと、各言語にてAWSサービスを簡単に利用するためのライブラリという認識ですが、間違えていたらご指摘ください…

AWS SDK for Rubyのインストール


bundlerを利用してAWS SDKのインストールを行います
まず、Gemfileに以下のような記述を追加します。

gem 'aws-sdk', '~> 2.1'


その後、コンソールから以下のコマンドを実行して、
AWS SDKのインストールを行います、インストールするフォルダを指定する場合は、
--pathオプションを忘れないようにしてください

$ bundle install


bundle installで正常終了したら、コンソールから以下のコマンドを実行していただき、
同じような結果が表示されていればインストール完了となります
今回のGemfileに記述した'aws-sdk', '~> 2.1'は2.1から3.0の手前までの最新Verをインストールするという記述になるため、
実行するタイミングによって、Verが更に新しいものになる可能性があるという点にご注意ください

$ bundle list | grep aws-sdk
* aws-sdk (2.5.3)
* aws-sdk-core (2.5.3)
* aws-sdk-resources (2.5.3)



S3へのファイルのアップロード


まずはじめにQiitaの記事を参考にした下記の内容で試してみました。

AWS.config(
access_key_id: 'YOUR_ACCESS_KEY_ID',
secret_access_key: 'YOUR_SECRET_ACCESS_KEY'
)

s3 = AWS::S3.new
bucket = s3.buckets[bucket_name]
obj = bucket.objects[s3_path + '/' + file_name]
obj.write(file: upload_file_path + '/' + file_name)


結果としては、「uninitialized constant AWS」という内容で、AWS.config実行のタイミングでエラーとなりました。
インストールされたライブラリの中身を見てみるとモジュール名が「Aws」になっており、どのVerからかは不明ですが、モジュール名がアッパーキャメルケースに変更されていたようです。

次に公式の日本語ドキュメントを参考にした下記の内容で試してみました。

s3 = Aws::S3::Resource.new(region:'region')
obj = s3.bucket('bucket-name').object('key')
obj.upload_file('/path/to/source/file')


結果としては、実行する以前にIDEの方で「Found 1 extra argument(s). Required 0」となり、
そもそも引数していできないよとのこで、当然実行してもエラーとなりました。

最終的に問題なく動作したものは公式の英語ドキュメントを参考にした下記の内容のものとなります。

Aws.config.update({
region: 'region'
credentials: Aws::Credentials.new('YOUR_ACCESS_KEY_ID', 'YOUR_SECRET_ACCESS_KEY')
})

s3 = Aws::S3::Resource.new
obj = s3.bucket('bucket-name').object('key')
obj.put(body: String)

今回はput部分にCSVの文字列を引き渡す形にしましたが、ファイルでも同様のことができるかと思います。
また、一点確認していない部分なのですが、今回、Aws.config.updateの部分でregionとcredentialを指定しています。
しかし、ドキュメントのConfiguration部分をGoogle翻訳にかけてざっくり見てみたところ、どうやら指定の環境変数、または、iniファイルに記述することで、Aws.config.updateで記述しなくても設定してくれるようです。
セキュリティ的にはソースに直接書くよりも、環境変数、または、iniファイルに記述した方がいいと思うので、そちらも試してみようと思います。

まとめ


AWSを使用している人がかなり多いこともありQiita、ブログ、公式ドキュメントなど様々なところに情報があります。
ただし、サービスの追加、更新、SDKの更新等がかなり頻繁に行われているので、古い情報というのも多くあり、公式ドキュメント見たほうがいいとはわかっていましたが、文章が難しいとか、目的の情報をうまく見つけられない等で敬遠していました。
新しいサービスを使っているなら、好き嫌いせずに公式ドキュメントをしっかり見よう!
っということで、今回はこのあたりで閉めさせていただきます、次回は、すこしAWS Lambdaについて書こうかなーっと考え中です

その他


JAWS FESTA 東海道
この頃、静岡のJAWS-UGでLT等で話させていただいていますが、2016.10.22[sat]に名古屋でJAWS FESTA 東海道 2016という大きなイベントを開催するそうなので、AWSに興味があるという方はぜひ参加してみてください。
参加については、connpassのこちらで募集しています。先着順となっていますので、お早めに!

こちらはすでに終わってしまったのですが、2016.08.27に行われたJAWS-UG東海道 in 浜松に登壇させていただきました。
内容はasciiさんの以下のページにて掲載していただいておりますので、内容に興味があるよという方は、次回の参加をお待ちしております!
http://ascii.jp/elem/000/001/209/1209985/
  

Posted by iA SEチーム at 11:42Comments(0)AWSrails

[Rails]多言語対応をさっくりやってみた

2016年04月18日

global
やっと春らしい気温になり過ごしやすくやってきました
今まですっかり名乗り忘れていましたが、榊原というものです。以後、よろしくお願いします

さっそくですが、本題に入ります!
今回はタイトルを見ての通りですが、さっくりと多言語対応しようということで、Railsのglobalizeというgemを使用した際の話をしていこうと思います

globalizeとは


globalize
Railsには元々国際化(i18n)する機能が備わっていますが、それを更に拡張・手軽に実装するためのgemです
公式のDocument等については、githubに公開されていますので、こちらをごらんください

globalizeのインストール


まずは以下のようにインストールされているActiveRecordのバージョンを確認
$ bundle list | grep activerecord
* activerecord (4.2.5.1)

ActiveRecordのバージョンが4.1以降のものなので、githubのドキュメントの通りにGemfileにglobalizeのgemの記述を追加、っといいたいところだったのですが…sidekiqを導入してスレッドで処理を行う箇所があり、5.0.0だと不具合があったため、5.1.0をインストールする必要がありました。そのため、以下のように記述してbundle installを実行
gem 'globalize', git: 'https://github.com/globalize/globalize.git'

bundle install時に以下のような記述がでていれば問題なくglobalizeのインストールができたことになります
$ bundle install
Using globalize 5.1.0 from https://github.com/globalize/globalize.git (at master@f8a8e0a)


多言語化したいmodelの変更・テーブル作成


今回は該当modelに紐づくテーブルのカラムが[id, name, address, geom, created_at, updated_at]であり、かつ、既にデータが入っていることを前提とします
では、[name, address]を多言語化したい場合、以下のように該当modelに記述します。
記述することによって[name, address]が多言語化の対象と認識されます
class Sample < ActiveRecord::Base
translates :name, :address
end

次に各言語情報を保持するためのテーブルを作成するため、以下のようなmigrate用のファイルを作成し、rake db:migrateを実行します。この際、:migrate_dataをtrue指定することで、作成されるテーブルに元のテーブルのデータをmigrateしてくれます
※元のテーブルのデータをmigrateする際に設定される言語については、config/application.rbのconfig.i18n.default_localeに設定されている値に依存すると思うのですが…試した方いたら教えて下さい!
class CreateTranslateSample < ActiveRecord::Migration
def self.up
Sample.create_translation_table!({
:name => :string,
:address => :string
}, {
:migrate_data => true
})
end

def self.down
Sample.drop_translation_table! :migrate_data => true
end
end

migrateに成功すると以下の構成でsample_translationsテーブルが作成されます。
以降、sampleテーブルの[name, address]カラムは参照・保存・更新はされず、sample_translationsテーブルの各言語の[name, address]カラムが参照・保存・更新されます

FieldTypeNullKeyDefaultExtra
id int(11) NO PRI NULL auto_increment
sample_id int(11) NO MUL NULL
locale varchar(255) NO MUL NULL
created_at datetime NO NULL
updated_at datetime NO NULL
name varchar(255) YES NULL
address varchar(255) YES NULL


自分の場合は、更新されないカラムが残り続けるのが気持ち悪かったので、以下のようにmigrateファイルを作成してsampleテーブルのカラムを削除しました
class RemoveSampleTranslateColumns < ActiveRecord::Migration
def change
remove_column :locations, :name
remove_column :locations, :address
end
end


多言語化したテーブルの保存・更新・参照


設定については、一通り終了したので、実際に多言語化したテーブルに複数の言語の登録等を行っていきます
保存・更新・参照は以下のようにI18n.localeの値を切り替えるだけで、自動的にやってくれます
#日本語で新規データ作成
I18n.locale = :ja
ja_data = Sample.create({name: '名前', address: '住所'})
ja_data.name # => '名前'
ja_data.address # => '住所'

# 英語で新規データ作成
I18n.locale=:en
en_data = Sample.create({name: 'name', address: 'address'})
en_data.name # => 'name'
en_data.address # => 'address'

# 各言語データ取得
data = Sample.first
I18n.locale = :ja
data.name # => '名前'
I18n.locale = :en
data.name # => 'name'

# 各言語データ更新
data = Sample.first
I18n.locale = :ja
data.name # => '名前'
data.name = '名前_変更'
data.save
I18n.locale = :en
data.name # => 'name'
data.name = 'name_mod'
data.save

data = Sample.first
I18n.locale = :ja
data.name # => '名前_変更'
I18n.locale = :en
data.name # => 'name_mod'

ただし、I18n.localeなんですが、いろいろ調べた際、擬似グローバルという記述を見つけました。グローバルの値なので、複数のユーザが操作していると、タイミングによってはI18n.localeの値が変わってしまい、意図しない言語で保存してしまう場合があります。そのため、保存・更新時は基本的にI18n.localeの値を直接使うのではなく、以下のように対応することでI18nの値に左右されなくなります
実際、その擬似グローバルという記述を確認したサイトは、こことなりますので、気になる人はご確認ください
# 日本語で新規データ作成・更新
I18n.with_locale(:ja) {
data = Sample.create({name:'名前', address:'住所'})
data.name # => '名前'
data.address # => '住所'
data.name = '名前_変更'
data.address = '住所_変更'
data.save

data_mod = Sample.first
data_mod.name # => '名前_変更'
data_mod.address # => '住所_変更'
}

# 英語で新規データ作成
I18n.with_locale(:en) {
data = Sample.create({name:'name', address:'address'})
data.name # => 'name'
data.address # => 'address'
data.name = 'name_mod'
data.address = 'address_mod'
data.save

data_mod = Sample.first
data_mod.name # => 'name_mod'
data_mod.address # => 'address_mod'
}


設定されていない言語を表示した際に変わりの別言語を表示する


例えば以下のように、日本語のデータは作成したけど、英語のデータを作成していない場合、英語で該当データを参照するとnilが戻されます
# 日本語で新規データ作成・更新
I18n.with_locale(:ja) {
data = Sample.create({name:'名前', address:'住所'})
data.name # => '名前'
data.address # => '住所'
}
I18n.locale = :en
data.name # => nil
data.address # => nil

こういう場合、英語データがない場合は日本語データを表示するみたいなことやりたくなりますよね…?
もちろん方法があって、config/application.rbに以下のように記述すると対応できます。左から優先順位が高く、必ず元の言語も書かないとならないというところにご注意ください
config.i18n.enforce_available_locales = true
config.i18n.fallbacks = {
:en => %i(en ja)
}


まとめ


まだまだ注意点が多いのですが、ざっくりとはこんな感じになります
間違っていたり、回りくどいことやってる場合は、びしびし指摘してください

最初からglobalizeを使うのであれば、タイトル通りさっくりとできるのですが、すでにがっつりと運用しているサイトに使用するとなるとそれなりに影響範囲は広くなるので、使用する際はご計画的に!

っということで今回は長くなりましたがこの辺りで終わりにします。
次回はsidekiqの導入について書こうかなっと思います。  

Posted by iA SEチーム at 17:44Comments(1)rails

[Rails]Railsのバージョンを上げたことでspatial_adapterが使用できなくなりました

2016年01月14日

遅くなりましたが、明けましておめでとうございます。
今年もよろしくお願いいたします。

さっそくですが、本題に入ります!
今回はRails4.2にて標準搭載となったActive Jobを使用したいために、Railsのバージョンをあげたところspatial_adapterが使用できなくなってしまった件について話していこうと思います。

spatial_adapterとは


標準のRailsではMySQLのgeometry型が取り扱い使いづらいため、使いやすくしてくれるgemです。
githubにて色々な方が公開されているため、実際に使用したものが気になる方はこちらをごらんください。

Rails4.2でのspatial_adapterのエラー


githubを見ていただいた方は、お分かりになったかと思いますが、
ActiveRecordのバージョンが3.2.0 and upとなっており、Railsのバージョンが上がったことで合わせてActiveRecordのバージョンが上がったので、対応していないバージョンになってしまいました。

どのようにエラーが出たかというと…
マイグレーションなど処理実行時に以下のようなエラーがでてしまいました。
$ bundle exec rake db:migrate
rake aborted!
NoMethodError: undefined method `type' for "varchar(255)":String

原因箇所については、dbに関わりそうなgemを1個ずつ削って調査しました…

Rails4.2では何を使えばいいのか?


google先生にいろいろ教えていただいたところ、Rails4.2でgeometry型を扱うにはactiverecord-mysql2spatial-adapterを使用すればいけるとのこと。
ただ、インストールされているActiveRecordのバージョンが4.2だったため、今回はこちらのactiverecord-mysql2spatial-adapterを使用させていただきました。

ではマイグレーションから…
$ bundle exec rake db:migrate
== 20151225060238 DeviseCreateUsers: migrating ================================
-- create_table(:users)
-> 0.0109s
-- add_index(:users, :email, {:unique=>true})
-> 0.0123s
-- add_index(:users, :reset_password_token, {:unique=>true})
-> 0.0134s
== 20151225060238 DeviseCreateUsers: migrated (0.0368s) =======================

うまくいったので、次はgeometry型の値を取得してみます(実際には他にもテーブル生成しました)。
$ rails c
Loading development environment (Rails 4.2.5)
irb(main):001:0> l = Location.first
Location Load (0.3ms) SELECT `locations`.* FROM `locations` ORDER BY `locations`.`id` ASC LIMIT 1
=> #Location id: 1, geom: 0
irb(main):002:0> l.geom.class
=> Fixnum

むむむ…
geometry型のはずの値が数値となっていました。再度いろいろ調べてみるとrgeorgeo-activerecordのgemが必要ということでインストールしてgeometry型の値を取得。
$ rails c
Loading development environment (Rails 4.2.5)
irb(main):001:0> l = Location.first
Location Load (0.3ms) SELECT `locations`.* FROM `locations` ORDER BY `locations`.`id` ASC LIMIT 1
=> #Location id: 1, geom: 0
irb(main):002:0> l.geom.class
=> Fixnum

むむむむむむ…
結果は変わらず、geometry型のはずの値が数値となっていました。なにがおかしいんだと思いながらactiverecord-mysql2spatial-adapter-42のドキュメントを再読…
すると、db設定のadapterを「mysql2」ではなく「mysql2spatial」にするという記述があったため変更してgeometry型の値を再度取得。
$ rails c
Loading development environment (Rails 4.2.5)
irb(main):001:0> l = Location.first
Location Load (0.2ms) SELECT `locations`.* FROM `locations` ORDER BY `locations`.`id` ASC LIMIT 1
skip_logging (1.7ms) SHOW FIELDS FROM `locations`
=> #Location id: 1, geom: #RGeo::Geos::CAPIPointImpl:0x3fd68132ac34 "POINT (138.48486379999997 35.0239507)"
irb(main):002:0> l.geom.class
=> RGeo::Geos::CAPIPointImpl
irb(main):003:0> l.geom.x
=> 138.48486379999997
irb(main):004:0> l.geom.y
=> 35.0239507

見事geometry型の値を取得することに成功しました!
ちなみに、データについてはspatial_adapterのgem使用時に登録しておいたデータでも問題なくgeometry型の値を取得できましたが、どうやらspatial_adapterのバージョンが低いとそのままでは使用できず、sql文でgeometryからxy値を取得して変換をしないとエラーとなるようです。

まとめ


Railsのgemは便利なものが多く、一度環境さえ作成できればかなり簡単に開発が行えるのですが、Ruby、Railsのバージョンを上げ、使ってたgemが使えなくなった際、どのgemが使えなくなったのか原因調査が難しく、代わりを見つける、または、自作しなければならないということになり、結構難易度が高いなーっと改めて実感しました。
gem周りについては、とにかく経験を積むしかないと思うので、また同じようなことがあれば情報共有ということで書いていければと思います。

では、今回はこの辺りで!  

Posted by iA SEチーム at 23:03Comments(0)プログラミングrails

PageTop