ラベル program の投稿を表示しています。 すべての投稿を表示
ラベル program の投稿を表示しています。 すべての投稿を表示

2014/09/17

プログラマに時として訪れる、悲しい別れ

という話をQiitaに投稿。

完全にQiitaの使い方間違ってるけど、まあプログラマが集まる場所ならここよりもQiitaだ!w

2014/09/09

Nitrous.IO

Nitrous.IO

Rubyの勉強しようと思っていろいろ見てたんだけど、このNitrous.IOというサイトが面白かった!



クラウド環境でWebアプリの開発が出来るんだけど、Webブラウザで使えるIDEがついているのね。
とりあえずRailsのサーバーを立てるところまでやってみようと!

まずはログインしてダッシュボードへ

「New Box」ボタンでBoxと言うものを作成する。

Box作成画面。

言語は「Ruby/Rails」「Node.js」「Python/Django」「Go」「PHP」の5つから選べて(Scala出ないかなw)、MemoryとStorageのスペック設定では「N2O(単位:雷マーク)」というのを使って、サーバースペックを設定できる。


N2O初期値は140雷で、Memoryのデフォルトが384MBで120雷、Storageのデフォルト1000MBで20雷。
この「N2O」は課金して増やすこともできるし、TwitterやらGithub連携しても(すこしだけ)増やすことができる。

僕はいろいろやって215雷まで増やせた


Memoryの設定に必要なN2Oは128MBごとに40雷必要で、最大2GB(2048MB)だと640雷になる。
Strageの設定に必要なN2Oは250MBごとに5雷必要で、こちらは最大20GB程度で400N2O。

まあ、明らかにオーバースペックだけどw

とりあえずこんな設定でBoxを作ってみる

「Create Box」をクリックすると、タコメータが回りだす。
Nitrousって言うだけあって、車好きが作ってるんかな。

Boxが完成すると、下記の様なWebIDEが立ち上がる。
なかなか良いではないか。


ペインも直感的?ソースツリーとソースと下部にコンソールがあって、コンソールは全部は試してないけどLinuxコマンドがおおよそ使えるっぽい(たぶん)。

HelloWorld

じゃあ、試しにRubyのHelloWorldを作ってみる。
まず、デフォルトで作成されている「workspace」ディレクトリを右クリックして、「New File」を選択。

ファイル名に「HelloWorld.rb」と入力してファイル作成。

作成した「HelloWorld.rb」を選択すると、右ペインでソースが開くので

RubyのHelloWorldを書く。
ソースの保存は「Ctrl+S」で出来たりと直感的。
ちなみにソース内容はこんな感じw
---
#!/usr/bin/env ruby
puts "Hello World"
---

 下部コンソールで、作成したHelloWorld.rbを指定してRuby実行。
おお、出来た。

Rubyのバージョンは2.1.1p76らしい
---
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]
---

Rails

もちろんBox作成時にRuby on Railsをテンプレートに指定したので、Railsコマンドも打てる。

action@omiend-ruby-helloworld-144513:~/workspace$ cd ~
action@omiend-ruby-helloworld-144513:~$ rails new HelloWorld
         ~割愛~
         run  bundle install
         ~割愛~
* bin/rails: spring inserted   
action@omiend-ruby-helloworld-144513:~

ビルドが完了した後、ソースツリーの再読み込みマークをクリックすると、Railsのプロジェクトが表示されれる。

作成されたRailsプロジェクトに移動して、「rails server」すればサーバーが稼働する。

ポート:3000番と言われているので、

上部の「Preview」から「Port 3000」を選択すれば、

別ウィンドウでWebページが作成される。

あとは、ScaffoldでCRUD作成したりを試したけど、全く問題なさそう。
(といってもRuby on Rails自体詳しくないから、開発する上でどっかつまりそうな気はするけど)

action@omiend-ruby-helloworld-144513:~/helloworld$ rails generate scaffold user name:string
action@omiend-ruby-helloworld-144513:~/helloworld$ rake db:create 
action@omiend-ruby-helloworld-144513:~/helloworld$ rake db:migrate




それから、今試しているのはここで作ったソースをGithubにPush出来たり?するっぽい。
...んだけど、まだそこまでやってない~。しばらくこのNitrous.IOで遊ぼうかなw

2014/04/06

Playframework2→Bitbucket→HerokuのデプロイをCodeshipを利用して実現

「読まれるにたるものを書くか、書かれるにたることをしろ」 – ベンジャミン・フランクリン
いやー、無理っす。でも、書く事で自分の中に根付くという感じがするので、今日も覚えた事を書く笑

Play使ってちまちまWebアプリを作っていて、Heroku上で動かそうと思ってる。
たまにHeroku上で動作確認したくなる。でもソース管理はBitbucketを使いたいと思ってる。
だから、BitbucketとHerokuの両方にPushしないと行けないのがめんどくさくなって、なんか良い方法無いのかと思ってちょっと調べてみた。
そしたら、Codeshipというのが面白そうだったのでやってみた。

タイトルはカッコ良く「〜実現」とか書いてあるんだけど、Codeshipの設定をして上げるだけで良いのでめっちゃ簡単でした。
今回myappというPlayアプリを使って、Bitbucketにpush→Codeship経由でHerokuにデプロイとうのをやってみまーす。



Play App作成

$ play new myapp
$ play run


はい、オッケーでーす。



Bitbucketにリポジトリを作成


Bitbucketを利用する上で、SSH設定やなんかはやっておきましょう。
どうでもいいけど、言語を選択するときに「Scala」が出てこないサービスはどうかと思うんだ。ナントカナビとかw


はい、オッケーでーす。



Bitbucketにプッシュ


$ git init
$ git add .
$ git commit -m "MyApp初回コミット"
$ git remote add origin git@bitbucket.org:omiend/myapp.git
$ git push -u origin --all


はい、オッケーでーす。



Herokuのアプリケーション作成

とりあえずこんな感じで。いつもはHeroku Toolbeltから作成していたんだけど、まあ今回は画面からアプリを作成。


はい、オッケーでーす。



Codeshipの設定

いよいよ今回のメイン、Codeshipの設定。Sign upやらなんやらはてきとうに済ませておく。
Create a new Projectする。


Bitbucketを選択。Githubもあるので、同じ手順でGithubからも出来ると思う。
僕はシャイな人間なので、プライベートリポジトリーがただで使えるBitbucketをいつもつかってマンモス。



CodeshipからBitbucketにログインしておけば、このように先ほど作成したBitbucketのリポジトリーが選択出来る。これを選択。


次が結構キモかな?Testの設定。

Select your technology to prepopulate basic commands:PlayってかScalaはJVM上で動くので、「Java」を選択。
Modify your Setup Commands:「bundle install」とか書いてあるので、Railsで使うんでしょう。この辺りの細かい設定は後で試してみる。(まあ書いてある通りなんだけど笑)
Modify your Test Commands:ここでコメントアウトされている「sbt test」を有効化しておく。
「play test」コマンドが出来ないからどうしようと思ってたけど、良く見たらsbt testで良かった。そりゃそうだ。sbt最高。


そしたらこんな画面が出るので、「Follow this link and add the url below as 'POST' hook to your repository:」をコピーしておく。


続いてHerokuの設定。
Project SettingsのDeploymentから、Herokuを選択し、Application Name(Heroku)とAPI Key(Heroku)を設定して保存。
ここら辺でDBのmigrate設定とか出来ると思うけど、取りあえず保留。







Bitbucketのフック設定


Bitbucketのリポジトリー設定からフックの設定を行う。
ドロップダウンから「POST」を選択し、URLに、Codeshipで取得したBitbucket push hookのURLを設定して保存。


BitbucketにPush


ここまでCodeshipの設定が完了したら、Bitbucketに改めてpush。
ソースは適当に更新したものとしておきマンモス。

Pushが成功すると、CodeshipのDashbordでインテグレーションの様子が確認出来る。
sbt test も回ってるのが分かる。このテストが成功すれば、自動的にHerokuにもPushされるハズ。


完了したのがこちら。
やや時間かかってるけど、まあこんな物か。


Herokuの確認

ok。(Procfile作るの忘れたのでこんな画面)



テストが失敗するケース


BitbucketにPushして、Codeshipでテスト実行し、エラーだったらHerokuへのデプロイが行われない事を確認してみる。
なので、わざとテストが失敗するケースを追加。

myapp/test/ApplicationSpec.scala
import org.specs2.mutable._
import org.specs2.runner._
import org.junit.runner._

import play.api.test._
import play.api.test.Helpers._

/**
 * Add your spec here.
 * You can mock out a whole application including requests, plugins etc.
 * For more information, consult the wiki.
 */
@RunWith(classOf[JUnitRunner])
class ApplicationSpec extends Specification {
  "Application" should {
    "send 404 on a bad request" in new WithApplication{
      route(FakeRequest(GET, "/boum")) must beNone
    }

    "render the index page" in new WithApplication{
      val home = route(FakeRequest(GET, "/")).get
      status(home) must equalTo(OK)
      contentType(home) must beSome.which(_ == "text/html")
      contentAsString(home) must contain ("Your new application is ready.")
    }

    "わざとテストNGになるケース" in new WithApplication{
      val home = route(FakeRequest(GET, "/hoge")).get
      status(home) must equalTo(OK)
      contentType(home) must beSome.which(_ == "text/html")
      contentAsString(home) must contain ("Your new application is ready.")
    }
  }
}


試しにsbt testして、エラーになる事を確認。

$ sbt test
[info] Loading project definition from /Users/myapp/project
[info] Set current project to myapp (in build file:/Users/myapp/)
[info] Compiling 1 Scala source to /Users/myapp/target/scala-2.10/classes...
[info] Compiling 1 Scala source to /Users/myapp/target/scala-2.10/test-classes...
[info] IntegrationSpec
[info] Application should
[info] + work from within a browser
[info] Total for specification IntegrationSpec
[info] Finished in 8 seconds, 325 ms
[info] 1 example, 0 failure, 0 error
[info] ApplicationSpec
[info] Application should
[info] + send 404 on a bad request
[info] + render the index page
[info] ! わざとテストNGになるケース
[error]     NoSuchElementException: None.get (ApplicationSpec.scala:31)
[error] ApplicationSpec$$anonfun$3$$anonfun$apply$6$$anon$3$delayedInit$body.apply(ApplicationSpec.scala:31)
[error] play.api.test.WithApplication$$anonfun$around$1.apply(Specs.scala:20)
[error] play.api.test.WithApplication$$anonfun$around$1.apply(Specs.scala:20)
[error] play.api.test.PlayRunners$class.running(Helpers.scala:45)
[error] play.api.test.Helpers$.running(Helpers.scala:364)
[error] play.api.test.WithApplication.around(Specs.scala:20)
[error] play.api.test.WithApplication.delayedInit(Specs.scala:17)
[error] ApplicationSpec$$anonfun$3$$anonfun$apply$6$$anon$3.(ApplicationSpec.scala:30)
[error] ApplicationSpec$$anonfun$3$$anonfun$apply$6.apply(ApplicationSpec.scala:30)
[error] ApplicationSpec$$anonfun$3$$anonfun$apply$6.apply(ApplicationSpec.scala:30)
[info] Total for specification ApplicationSpec
[info] Finished in 805 ms
[info] 3 examples, 0 failure, 1 error
[error] Error: Total 4, Failed 0, Errors 1, Passed 3
[error] Error during tests:
[error]  ApplicationSpec
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 34 s, completed 2014/04/06 14:39:36

BitbucketにPushする。


Codeshipで監視。


無事、エラーになってストップしました。いい感じ。


エラーでデプロイがこけた場合、こんな感じでメールくれます。
素晴らしい。実用出来るね。










2014/03/02

MavericksにしたらHomebrewのアプリが軒並み使えなくなったので

いろいろやっておいた

取りあえずXCodeとコマンドラインツールをアップデート。

さらに
/usr/local
/usr/local/bin
の権限とグループが755のwheelになっていたので

$ sudo chgrp staff /usr/local
$ sudo chmod 775 /usr/local
$ sudo chgrp staff /usr/local/bin
$ sudo chmod 775 /usr/local/bin

後はbrew uninstallで一旦すべて削除して、brew installで入れ直し
でもなんか気持ち悪いというか、環境が汚れていくようでいやだ〜

2014/02/26

Scalajsちょっとだけ試してみた

むむむ、最近Scala界隈でやたらバズってるので試してみたけど、ムムム
なにかっていうと、Scalaで書いたソースをJavascriptのソースにコンパイルするんだとか。



取りあえず、下記を参考にさせてもらい、やってみる。
Scala.jsが凄い − mizchi's blog

まずはサンプルプロジェクトをお借りする。
$ git clone https://github.com/sjrd/scala-js-example-app
$ cd scala-js-example-app

そしてコンパイルがこんな感じらしい。
$ sbt
$ sbt packageJS

そしたら下記ファイルを開いてみる。
太文字で「It works!」と表示されたらコンパイル成功。


そして下記がコンパイル元のScalaソース。
scala-js-example-app/src/main/scala/example/ScalaJSExample.scala
package example
import scala.scalajs.js
import js.Dynamic.{ global => g }
object ScalaJSExample {
  def main(): Unit = {
    val paragraph = g.document.createElement("p")
    paragraph.innerHTML = "<strong>It works!</strong>"
    g.document.getElementById("playground").appendChild(paragraph)
  }

  /** Computes the square of an integer.
   *  This demonstrates unit testing.
   */
  def square(x: Int): Int = x*x
}

このあとどうしようかw

2014/02/23

【リベンジ】PlayframworkとClearDBを使ったWebアプリをHerokuにデプロイする手順メモ

前回「PlayframworkとClearDBを使ったWebアプリをHerokuにデプロイする手順メモ」なんてのをやったんだけど、結局稼働せず。。。
それから暫くHerokuの勉強を中心に頑張ってて、やっと原因らしいものが判明。 
Playframeworkは2.2.1を利用しているのだけど、2.2からはProcfileの書き方が変わったそうで
前は

web: target/start -Dhttp.port=${PORT} {JAVA_OPTS} -Ddb.default.url=${DATABASE_URL}

とか書いてたんだけど、今は

web: target/universal/stage/bin/my_apprication -Dhttp.port=${PORT} -Ddb.default.url=${DATABASE_URL}

って書かなきゃ行けないみたい。「my_apprication」はアプリケーション名で、スネーク型で書けとのこと。
あと、{JAVA_OPTS}は書かなくて良いらしい。

アプリを作成してからHerokuにデプロイするまでのコマンドはこんな感じ。
まずgitの初期化。

$ git init
$ git add .

Herokuの設定と、ClearDBのインストール、さらにClearDBのエンドポイントを確認し、HerokuのDB設定に setする。

$ heroku create my-apprication$ heroku addons:add clear
$ heroku config

=== my-apprication Config Vars
CLEARDB_DATABASE_URL: mysql://ユーザー:パスワード@us-cdbr-east-05.cleardb.net/データベース名?reconnect=true

$ heroku config:set DATABASE_URL='mysql://ユーザー:パスワード@us-cdbr-east-05.cleardb.net/データベース名?reconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8'

そしたらPlayのapplication.confファイルにDB設定を追加。
conf/application.conf
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://us-cdbr-east-05.cleardb.net:3306/データベース名?reconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8"
db.default.user=ユーザー
db.default.password="パスワード"
# 下記はClearDBをミニマムで利用する際の設定で、まだ詳細はしらべてないけど、まあ書いてある通りですね
db.default.partitionCount=1
db.default.maxConnectionsPerPartition=5
db.default.minConnectionsPerPartition=5

gitのコミットと、プッシュ(=デプロイ)
git commit -m "初回コミット"
git push heroku master

これでok。
ちなみにheroku createするとgitの設定も書き換えてくれてるっぽい。
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = false
[remote "heroku"]
url = git@heroku.com:my-apprication.git
fetch = +refs/heads/*:refs/remotes/heroku/*
[branch "master"]
remote = heroku
merge = refs/heads/master

2014/02/22

Playfrmaework2.2.1で変なエラーが[IllegalStateException: JSR-303 validated property ...

Playfrmaework2.2.1つかってて、DBにアクセス時下記の謎エラーが。
アクセサが無い?
ん?
[IllegalStateException: JSR-303 validated property 'name' does not have a corresponding accessor for data binding - check your DataBinder's configuration (bean property versus direct field access)]

// @LINE:11
case controllers_Application_updateParent4(params) => {
   call(params.fromQuery[Int]("p", Some(1)), params.fromQuery[Long]("id", None)) { (p, id) =>
        invokeHandler(controllers.Application.updateParent(p, id), HandlerDef(this, "controllers.Application", "updateParent", Seq(classOf[Int], classOf[Long]),"POST", """""", Routes.prefix + """updateParent"""))
   }
}

// @LINE:12

下記をしてみたら治った。謎。
$ play clean-all
[info] Done!
$ play run

どうやらPlayではgetterとsetterを自動的に作成するとかなんとかで、何らかの理由で作成されてなかったとかなんとかで、play clean-allでsbtのキャッシュをクリアしてあげるとかなんとか? たぶん色々間違ってるけどとりあえず放置。

Developers Summit 2014 「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」 from Yoshimura Soichiro

実は個人的にPlay2/ScalaでWebアプリを作っているのだけど、周りにそんなことやってる人がいないので一人(というか独り)で暗闇を走ってる感があったんだよね。

Scalaなんて社内でやってる人ほとんどいないし。

でも、まったく同じ構成(DBもMySQLだし)でこれだけ大規模のシステムを作ったという事例は、とても励みになる。


2014/02/02

PlayframworkとClearDBを使ったWebアプリをHerokuにデプロイする手順メモ

前にやった事あったけど忘れてしまっているのと、そのときちゃんとしたメモも取っていなかったので、改めて。

アプリについて

Strutsはもう時代遅れなのかなと感じ始め、じゃあ今Javaで作るWebアプリって何が良いのかな?と調べた結果、良いか悪いかは別として、Scalaでも作れるPlayframworkに興味を持ち。

それからは勉強がてら、最低限CRUD機能+親テーブルと子テーブルのを兼ね備えていることを前提としてPlayframworkを勉強。
出来上がったアプリは、上記に併せてページング機能もあり、地味にめんどくさいロジックを組んでいるので、そこだけ我ながらの力作。
CSSはTwitterBoostrupを利用。とはいえ、今回は機能周りの勉強だったので、デザインは適当なんだけど。

今回はこのJava版のアプリをHerokuにデプロイするメモ。
DBについては、ローカルでは普段MySQLを使っているので、Heroku上ではClearDB(MySQLに似ているSaaSのDB)を使う。

実は、今はScalaでも同じものを作っていたりする。


HerokuのToolbelt

下記からHeroku Toolbeltをインストールしておく。

本当はHomebrewでインストールしたかったんだけど、上手く動かないので中止。


Herokuにログイン

さて、取りあえずディレクトリに移動。アプリ名は「crud_java」。
(ちなみに作り途中のScala版は「crud_scala」だったりして)

$ pwd
crud_java/

下記のHerokuコマンドでログイン。

$ heroku login
Enter your Heroku credentials.
Email: メールアドレス
Password (typing will be hidden):
Authentication successful.


Herokuのアプリケーション作成

下記コマンドでアプリケーションを作成する。

$ heroku create
Creating glacial-scrubland-3010... done, stack is cedar
http://glacial-scrubland-3010.herokuapp.com/ | git@heroku.com:glacial-scrubland-3010.git

Herokuにログインすると、今作成したアプリが見れる。



Herokuのアプリケーションをリネーム


「アプリを選択 > Settings > Name」で名前を変更。
(「glacial-scrubland-3010」→「playframwork-crud-java」と変更)


ローカルのgit設定も変更。

$ heroku rename playframwork-crud-java
Renaming playframwork-crud-java to playframwork-crud-java... done
http://playframwork-crud-java.herokuapp.com/ | git@heroku.com:playframwork-crud-java.git
Git remote heroku updated

一応両方やってみたけど、ローカルからの変更だけで良いっぽい?


ClearDBをインストール

下記コマンドでインストール。らくちん。

$ heroku addons:add cleardb
Adding cleardb on playframwork-crud-java... done, v3 (free)
Use `heroku addons:docs cleardb` to view documentation.

こんな感じ。



ClearDBのエンドポイントを確認

下記コマンドでエンドポイントを確認。
※{パスワード}の所はマスキング

$ heroku config | grep CLEARDB_DATABASE_URL
CLEARDB_DATABASE_URL: mysql://b1ecc59f0e6fb8:{パスワード}@us-cdbr-east-05.cleardb.net/heroku_c6bbbbd45a76b45?reconnect=true

ついでに、これらの情報を元にSequel Proとかでログインし、DatabaseやTableを作成しておく。


PlayのConfigを設定


conf/application.confのDB設定の所を、上記「ClearDBのエンドポイントを確認」で確認した内容を

db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://us-cdbr-east-05.cleardb.net:3306/heroku_c6bbbbd45a76b45?characterEncoding=UTF8"
db.default.user=b1ecc59f0e6fb8
db.default.password="{パスワード}"

db.default.partitionCount=1
db.default.maxConnectionsPerPartition=5
db.default.minConnectionsPerPartition=5

下の3行は、ClearDBの無料版を利用する際に必要な設定。
参考
一言多いプログラマーの独り言 ー Herokuで、Java Play framework 2.0 + cleardb を利用すると c.j.b.h.AbstractConnectionHook のエラー



Procfile作成


プロジェクトのルートディレクトリに、Herokuで使う為の「Procfile」と言う物を作成。

【Procfile】
web: target/start -Dhttp.port=${PORT} ${JAVA_OPTS} -DapplyEvolutions.default=true


Herokuへデプロイ

下記コマンドでデプロイを実行。

$ git push heroku master



アプリケーション稼働

下記コマンドを実行すると、ブラウザが起動して勝手にアプリケーションを開いてくれる。

$ heroku open



前はこれで出来たんだけど、変なエラーが...。

$ heroku logs
2014-02-02T06:40:24.702110+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path=/ host=playframwork-crud-java.herokuapp.com request_id=27b4f1e1-e61d-4c3a-b3b2-15a0dfcacda3 fwd="122.17.154.11" dyno= connect= service= status=503 bytes=

ログを見ても的を射ない。

今日は諦めて、ディアブロしよーっとww