Sqale終了するので、Herokuに移行中

Sqaleが終了するということで、公開しているサービスを移行中です


とりあえず、ドメインはまだですが、http://sqale.yoseba.org/ の方は一旦移動させましたが、DBの移行がちょっと面倒なので諦めました。
https://yoseba.herokuapp.com/

Sqaleのデータ移行のなにが面倒と言えば、scpは禁止、~/.sshはreadしか権限がない、ftpコマンドすら使えないという有様。
ヘルプによるとs3で移行しろらしいのですが、Amazonとの契約はしていないし、たかがバックアップのために移行程度に契約はしたくない。
一応scriptコマンドでバックアップはしたものの、HerokuはメインのDBはPostgreSQL。もちろんMySQLも使えますがせっかくならPostgreSQLを使いたい。
ということで、データ移行は諦めました。

http://mohadana-khondalit.sqale.jp の方は、ちょと通常と違うサービスなので少し復旧まで時間ください。
GW中にはなんとかしたいですね。このapi意外と利用している人がいるので、がんばります。
あと仕事関係でシソーラス作成もしていて、落ち着いたら1から個人で作成してみるつもりだったりします。
うまく言えば良いなぁ...

静的サイトゲネレータをNanocからMiddlemanへ乗り換えました

linuxc.info

linux.infoはずーっとNanocを使ってきたわけですが、アップデートをサボっていたたらいつの間にか最新版ではまともに動作せず少し我慢をしていたのですが、
更新は続けていくのに不自由していたのでMiddlemanへ乗り換えることにしました


躊躇してみた割には結構簡単に終わりましたので、簡単にメモ程度ですが特徴を公開します。

ファイルの置き場所

Nannocは content/ 以下にhtmlファイルを置くのですが、Middlemanは source/以下となります。
また、nanocだとlayoutは layouts/ 以下となるわけですが、Middlemanは source/layaouts以下になっていたりします。
基本的にMiddlemanはコンテツに関わるものは全て source/ 以下に置くこととなります。

htmlの書き方

Nanocでは基本的にhtmlのままですが、MiddlemanはERBを採用しているのでlink_toやimage_tagなどのヘルパーが使えます。
Railsになれた人ならば非常に使いやすくなています。

また、Sitemap作成機能や、MarkdownHaml、Sass等も使えるなど、モダンな開発環境となっています。

ファイルの置き場所など細かいルールは違いますが、基本的にNanocで困っていたことが大体解決していて上位互換と捉えて問題ないかと思います。
移行作業時間はおそらく、公開まで1時間かかってないでしょう。

Rails4系からRails5へのアプデ

sqale.yoseba.org

以前リリースしたサービスですが、Rails4.2.6からRails5.0.0へのアップデートを行いましたので手順を残しておこうかと思います。
ちなみに、仕事でも現在アップデート作業を頑張っていますが、こっちは規模が違うので色々大変で難航しています。


# テストコード
可能な限りテストコードは用意しておきましょう。
サービスが大きくなればなるほどアップデート作業が大変になります。
こまめに、無理のない範囲で用意しましょう。

まったくテストコードがない場合は、重要な部分、テストコードが簡単に用意できる部分、RailsであればModelのように下位レイヤーあたりから始めるのがおすすめです。
テストコードが1つもないより、1つだけでもあるプロジェクトの方が安心感がぐっと上がります。


# Rubyのアップデート
最近のRubyでは互換性が無い修正はまずありません。
可能な限りRubyのアップデートから始めましょう。
アップデート前と後でテスト結果に変化が無いことも試しましょう。

もし、問題が発生するとすればRubyのバージョンとGemのバージョンの依存関係が多いと思います。
Gemは普段からアップデートしておき、開発が停止している場合は乗り換え先を探しましょう。
可能ならば、Gemを使わなくて済む方法を探しましょう。ちょっとした機能であれば自前で開発するのが良いです。


# Rails4系の最新版へのアップデート
自分のサービスは小さいので定期的にアップデートを行っていますが、最新になっていない場合はまずメジャーバージョンは固定しつつ最新にしましょう。
ここでもGemの依存関係に悩まされるはずです。Gemは少ないほうがバージョンアップ時に苦しまなくても済みます。

テストはもちろんテストコードを利用しましょう。

# Rails4系からRails5系へアップデート
いよいよ本題です。

私の場合は次のような手順を踏むことが多いです。

  • アップデート作業開始は大体ベータ版がリリースされたタイミング
  • リリースノートやリリース情報をチェックする
  • 新しいRails5のプロジェクトを作成する
  • 仕入れた情報と合わせつつ、現在のプロジェクトとRails5のプロジェクトを見比べる

- 例えばbin/以下に違いが出てないか? config/以下は? Gemfileは? などなど
- 現在のプロジェクトが大きい場合はRails4系の新規プロジェクトを作成して比較すれば分かりやすい

  • 違いが分かれば適時Rails5に合わせていく
  • リリースノートやRailsのログを見つつ使われなくなる機能や各種警告に対応する
  • Gemの整理


今回の追加、修正の目ぼしい箇所をいくつか上げておきます

  • app/models/application_record.rb、app/controllers/application_controller.rbがデフォルトで追加された
  • bin/以下に修正が入っている
  • config/application.rbの書き方が一部変更になっている
  • config/cable.yml、app/channels/、app/jobs/等新しい機能に対応するファイル/ディレクトリが増えている
  • 他にもpublic/apple-touch-icon*.png等の追加ファイルもある
  • Gemfileには追加や削除されたものがあるので、適時追加、削除、修正を行う

これらを試しつつ'rails s'が動けば最低限の山は超えたと言ってよいでしょう
もちろん、テストコードの結果、rakeタスクのようにテストコードが書きにくい機能の手動テスト、デザインやJSなどUI/UX周り、等など確認する部分は多々有ります。

最終的に納得する部分まで来たら、最後は覚悟を決めてリリースです。
いつでもrollback出来るように準備を忘れずに...

MeCabのWebAPIを公開してみた

仕事でmecabを使わざるを得ない機会が出てきました。
やりたいことは複合名詞の取得。

SEOを目的としたサイト内リンクの増加の為に、キーワードを増やしたいわけですが、これがどうしてもサイトがターゲットの業界でよく使われるキーワードが多く、データは毎日何万、何十万という単位での変更があるため、手動では追いつきません。
そこでMeCabでの複合名詞の自動取得というわけです。

ただ、サーバのOSのバージョンやライブラリの関係から全サーバにMeCabを入れるのが辛い状況。
そこでWebAPIなのですが、仕事用ということでどうしても独自性が出てきて汎用的ではありません。また割り込みも多く開発がどうしても遅くなりがちです。
個人的にNLP機械学習系は興味があったのですが、これを機会に個人で作ろうかと思いたち公開しました。


サイトはここです。
形態素解析 Mecab(複合名詞対応) Web版


とりあえず、以前作成した http://sqale.yoseba.org/ と同じくSqaleさんを利用します。
内容的には大したことないですし(DataBaseすら必要無い),個人でクラウド借りてサーバの管理までしたくはないので、これで十分でしょう。

ちなみに、mohadanaはMeCab->和布蕪->海苔から調べると、こういう記述がありまして、パクりました。
海苔 - Wikipedia

和銅3年(710年)に遷都した平城京には、海草類を売る「にぎめだな」(和布店)、海苔や昆布を佃煮のように加工したものを売る「もはだな」(藻葉店)という市場も存在した。

WebAPIを使ってみる

http://mohadana-khondalit.sqale.jp/api のサンプルから持ってきます。
complexオプションを付けることにより、複合名詞を推測します

$ curl -G http://mohadana-khondalit.sqale.jp/api/v1/parse --data-urlencode sentence="日本語の形態素解析" -d complex|jq
{
  "status": 200,
  "message": "Success",
  "results": [
    {
      "surface": "日本語",
      "reading": "ニホンゴ",
      "pronunciation": "ニホンゴ",
      "pos": "名詞",
      "pos_detail": [
        "一般"
      ],
      "conjugated_form": null,
      "conjugated_type": null,
      "infinitive": "日本語"
    },
    {
      "surface": "の",
      "reading": "ノ",
      "pronunciation": "ノ",
      "pos": "助詞",
      "pos_detail": [
        "連体化"
      ],
      "conjugated_form": null,
      "conjugated_type": null,
      "infinitive": "の"
    },
    {
      "surface": "形態素解析",
      "reading": "ケイタイソカイセキ",
      "pronunciation": "ケイタイソカイセキ",
      "pos": "名詞",
      "pos_detail": [
        "複合"
      ],
      "conjugated_form": "",
      "conjugated_type": null,
      "infinitive": null
    }
  ]
}

複合名詞の判定

品詞の種類で判定しています。
初めは名詞+名詞という単純なルールで実験をしていましたが、これが結構ダメなようでして色々調べた所、幾つかのパターンがあるようです。

例えば、「医療機関」。これは一般名詞の連続で、この場合は複合名詞と判定して良いようです。

$ echo 医療機関|mecab
医療    名詞,一般,*,*,*,*,医療,イリョウ,イリョー
機関    名詞,一般,*,*,*,*,機関,キカン,キカン
EOS

$ curl -G http://mohadana-khondalit.sqale.jp/api/v1/parse --data-urlencode sentence="医療機関" -d complex|jq
{
  "status": 200,
  "message": "Success",
  "results": [
    {
      "surface": "医療機関",
      "reading": "イリョウキカン",
      "pronunciation": "イリョーキカン",
      "pos": "名詞",
      "pos_detail": [
        "複合"
      ],
      "conjugated_form": "",
      "conjugated_type": null,
      "infinitive": null
    }
  ]
}

では「交通費」はどうでしょうか。
この場合は「費」が名詞ですが、接尾語のようです。逆に接頭語とかもありそですね。
この場合も複合名詞として良いでしょう。

$ echo 交通費 |mecab
交通    名詞,一般,*,*,*,*,交通,コウツウ,コーツー
費      名詞,接尾,一般,*,*,*,費,ヒ,ヒ
EOS

$ curl -G http://mohadana-khondalit.sqale.jp/api/v1/parse --data-urlencode sentence="交通費" -d complex|jq
{
  "status": 200,
  "message": "Success",
  "results": [
    {
      "surface": "交通費",
      "reading": "コウツウヒ",
      "pronunciation": "コーツーヒ",
      "pos": "名詞",
      "pos_detail": [
        "複合",
        "後接続不可"
      ],
      "conjugated_form": "",
      "conjugated_type": null,
      "infinitive": null
    }
  ]
}
||>

このように幾つかのパターンをWeb上で調べまして、複合名詞処理を行いました。
専門家ではない人間が行った処理ですので、推測が正確ではないかもしれませんが、テストをした範囲ではそれなりに動くようです。


** 今後の対応
複合名詞以外にも、複合動詞というのがあるそうですので対応を行うのも良いかもしれません。
名詞でもアニメのタイトルなど判定が難しい新語もありますので、このあたりは辞書を強化する必要があるでしょう。
また、分野によってはアスキーアートの対応が欲しい場面もあるようです。

まだまだ追加したい処理はありますので、これから対応したいと考えています。

WebサービスをRailsで1週間程度で作ってみた:技術編2 PaaSなSqale

年も開けて1ヶ月経ちます。もう1/12が過ぎましたね、時間が経つのは早いです。

WebサービスをRailsで1週間程度で作ってみた:技術編1 - khondalitのWebを学ぶブログ
前回の続きです。

今回はサーバについてです。
sakura辺りを借りても良かったのですが、今回はSqaleを借りてみたので軽く感想を書きます。

SqaleはいわゆるPaaSですね。Herokuと同じようなサービスですね。
サーバサイドのコードさえ書けばOSからDBまで用意してくれて個人開発には非常に有り難い存在です。
chefなり自前で用意するのも可能なのですが、リリースまでそれなりに時間がかかりますし最近はそこまで頑張る気力も無いのでありがたく使わせてもらいます。

特徴

gitでデプロイできます。非常に楽ですが、デプロイ後サーバの強制再起動を行っているのか一時的につながらない時間があるようです。
gracefulじゃあないのがちょっと辛いですね。
sshログインもできますし、cronも使い放題です。
最初の2週間はただですので、お試しができるので初心者の方には嬉しいかも。
あと、スケールアウトも可能な点も嬉しい。

逆に辛いところは、DB容量が2GBだったりメモリも512MBなど結構厳しい。
ちょと大きめのサイトを作るには向いてないですね。中小企業のサイトや個人のちょっとしたサイト等、データが小さめのサイト向けでしょうか。
画像等コンテンツを配信する場合には向いてないので諦めるかAmazon S3等別のサービスとの併用となりそうです。
ただファイルはS3でもよいけど、DBを大量に必要とするサービスにはさすがに向いていないようです。


落語の動画をまとめているサイトを公開しています。よろしくお願いします。
sqale.yoseba.org

WebサービスをRailsで1週間程度で作ってみた:技術編1

さて、前回の続きです。
khondalit.hatenablog.com


今回はスクレイピングに必要なYoutube周りの話となります。

作ったサービス

落語の動画をまとめています。
http://sqale.yoseba.org/

技術

開発したいものは前回に決めているので、まずは技術の選定から。

フレームワーク

Sinatoraとか他にも使ったことのあるフレームワークはいくつもありますが、仕事の延長もあってRailsを選択しました。
このレベルだとちょっとフルスタックすぎる気もしますが、gemもRails前提が多いですしね。
Ruby以外のフレームワークもありですが、Ruby以外だと過去互換性が弱い言語やセキュリティがアレだったりしますし...

個人開発ですと、なるべくメンテが少ないほうが嬉しいです。仕事だと毎日時間を使えますけど、そこまでコストは掛けれないですし。
RubyRails界隈はアップデートが多いのですが、このサイト自体は機能的にかなり少ないですしテストを書く余裕もあるかと思います。

DataBase

個人だとPostgreSQLを使うことも多いのですが、今回はMySQL
これはレンタルサーバーとかまで考えるとまだまだMySQLが強いですしね。

サーバ

はじめはHerokuを考えていましたが、Sqaleを選択しました。
Herokuは制限が多かったりしますが、Sqaleは日本語というのも大きな理由。
Sqaleはメール使えないとかメモリが少ないとかありますが、まあさほど大きくないサービスですしこれで良しとしましょう。
MySQLを選択したのもSqaleも影響しています。

個人開発だとこれぐらいのサーバーで動作するのを前提にアイディアを出したほうが良いかもしれません。
風呂敷を広げても完成しませんし、制限がある前提で考えるぐらいで調度良かったです。

Gem

今回のメイン機能はYoutubeAPIです。
YoutubeAPIを使用するGemはyoutube_itが有名だと思います。
github.com


ただ最終更新が1年以上前で、現状のYoutubeAPIでは使い物にならないようです。
代わりのGemを探していた所Ytというのを見つけましたので、ありがたく採用することに。
github.com

APIキーの取得

Google Developers ConsoleからYoutubeDataAPIのキーを所得しておきましょう。
console.developers.google.com

APIキーの設定

Yt.configuration.api_key = "APIのキー"

検索

検索も非常に簡単です。

videos = Yt::Collections::Videos.new
videos.where(q:"落語").each do |video|
  p video.title
  p video.id
end

IDから取得

IDが分かっていれば動画単体でも取得できます。

video = Yt::Video.new(id:"youtubeの動画ID")
p video.title
p video.description

詳しい使い方はこちらから
fullscreen.github.io


これでYoutubeからスクレイピングする準備が整いました。
あとは、落語家名なり演目名なりでひたすら検索、DBへの保存を行えば良いでしょう。


今回大変だったのはyoutube_itが死んでいたことです。
このGem数年前に試しに使ってみて問題がなく普通に使えていたのですが、久しぶりに使ってみるとまったく動かず対応するのにそれなりに時間を使いました。
Gemの便利な所でもあり不便な所でもありますね。

WebサービスをRailsで1週間程度で作ってみた

ここ半年以上やる気が出ず、仕事はやることやって定時で帰宅という状況でした。
やっとなんとかプライベートでのやる気も戻ってきましたので、長年やりたかった個人でのWeb開発をしてリリースができました。

プロジェクトが開発停止

実は去年ぐらいにはある程度まで完成していたアプリがあります。
マスターデータだけで数GBという結構大き目のデータを扱う予定でしたが、gemが開発停止になっていたり、時間ややる気の問題で開発停止に追い込まれました。


やる気が消えた原因が2つありまして、1つがgemの開発停止。もう1つがデザイン。
gemは仕方がないですが、デザインが本当に辛かったです。


私自身はもうプログラムで10年以上はお給料を頂いていますので、プログラム自体はなんとでもできる自信はあります。
ただ、デザインは本当に辛いです。Bootstrapを使っても非常に出来が悪い物しか出来ないですし、そもそもパーツの配置すら難しいという自分の低い技術レベル。Bootstrapだと大分楽ではありますが。

公開されているテンプレートを探してもTOPページ等の特定のページのみで他のページも考えるとちぐはぐになって統一感が出せないし...。
最近ですとスマホ対応も求められてそれも辛い所です。
そして仕事が忙しくなり開発はめでたく中止となりました。

そして新たな開発

開発は停止したものの、コンセプトは悪くないなぁとは思っていまして、実際ヒットしなくても自分自身で欲しいサービスではあります。
嘆いていてもしかたがありませんし
そこで、練習台になるサービスを作ることとしました。

今回のテーマはWebAPIと落語。
テーマの選択基準はこのあたりでしょうか。

  • WebAPIを使って楽をしたい!
  • WebAPIならYouTube? これだと動画を検索、表示程度なので機能も少なそう...
  • 落語自体はそこそこ好きな方
  • 落語のマスターデータ自体はさほど多くはない(はず...)
  • リリース優先、年内リリース目標、可能ならRubyKaigiまでに!

Webサービス作ってみた系だと、エロ系が割と定番ですがさすがに同じのばかりですと面白くないですし、ライバルが少ない方が良いかもですし...

サイト

URLはこちらになります。
http://sqale.yoseba.org/


開発やこれからのことについては別途投稿するつもりです。
年末年始や夜長な時にいかがでしょうか?