uoz 作業日記

様々な作業の記録を共有するブログです。

# railsって遅いのかね

cake, rails, spring boot, expressで、ほとんど同じアプリを作ってざっくり試してみる

Jmeterで負荷をかけることに

Jmeterインストール

$ brew install jmeter --with-plugins
$ jmeter

f:id:uoz:20160702170840j:plain

1. Railsで最初にちょっと試してみる

Railsアプリをlocalhsot:3000で立てて...

rails 4.2.6 ruby 2.3.1 mysql 5.7.10

アプリ

こんなアプリ

f:id:uoz:20160702170936j:plain

/articles で記事+コメント一覧を表示する

コントローラ app/controllers/articles_controller.rb

class ArticlesController < ApplicationController
  def index
    @article = Article.includes(:comments).all
  end
end

ビュー app/views/articles/index.erb

<h1>test</h1>


<table>
  <tr>
    <th>
      タイトル
    </th>
    <th>
      内容
    </th>
    <th>
      更新日
    </th>
  </tr>
  <% @article.each do |article| %>
    <tr>
      <td>
        <%= article.name %>
      </td>
      <td>
        <%= article.content %>
        <% if article.comments.present? %>
            <br />コメント:
            <% article.comments.each do |comment| %>
                <br /><%= comment.content %>
            <% end %>
        <% end %>
      </td>
      <td>
        <%= article.updated_at %>
      </td>

    </tr>
  <% end%>
</table>

Alt text

テスト実施

このサイトの通り、パスだけアプリの/articlesに変えて

http://language-and-engineering.hatenablog.jp/entry/20081014/1223905380

左ペインの「テスト計画」を右クリックし,「追加」→「スレッドグループ」。

スレッド数: 50 Ramp-Up期間(秒): 10  (←スレッド立ち上げ期間のこと)

と入力。

左ペインの「スレッドグループ」を右クリックし,「追加」→「サンプラー」→「HTTPリクエスト」。

サーバ名またはIP: localhost パス: ./x.php

と入力。

左ペインの「スレッドグループ」を右クリックし,「追>加」→「リスナー」→「結果を表で表示」。

Ctrl+S し,保存。

ツールバーで「実行」→「開始」。

結果

平均25msってこと? webrickで、デバックで動かしてこれ

f:id:uoz:20160702171144j:plain

unicornでproductionだと、半分くらいになった。

f:id:uoz:20160702171153j:plain

2. 次はcake

cake php 3.2です

php 5.6 mysqlも5.6 細かいバージョンは忘れた

手抜きでmampで動かす DBはrailsと同じ感じだけど、カラム名等はcake標準になるように

アプリ

コントローラ /src/Controller/ArticlesController.php

<?php

namespace App\Controller;

class ArticlesController extends AppController
{
    public function index(){
        $articles = $this->Articles->find('all');
        $this->set(compact('articles'));
    }
}

ビュー /src/Template/Articles/index.ctp

<h1>test</h1>


<table>
    <tr>
        <th>
            タイトル
        </th>
        <th>
            内容
        </th>
        <th>
            更新日
        </th>
    </tr>
    <? foreach($articles as $article){ ?>
    <tr>
        <td>
            <?= $article->name ?>
        </td>
        <td>
            <?= $article->content ?>
            <? if(count($article->comments) > 0){ ?>
            <br />コメント:
            <? foreach($comment as $article->comments){ ?>
            <br /><?= $comment->content ?>
            <? } ?>
            <? } ?>
        </td>
        <td>
            <?= $article->modified ?>
        </td>

    </tr>
    <? } ?>
</table>

テスト実施

debugでない

平均 170ms なんでこんなに遅いのかな?

ここを参考に、OPcacheとついでにxdebugを止めてみる http://www.y-com.info/contents/?p=1165

がかえって遅くなる f:id:uoz:20160702171300j:plain

dockerでサーバ立ててみたら更に遅い

3. spring boot(java)

spring boot 1.3.5 java 1.8.0_92

java8をいれるところから

brew cask install java

DBにつなげられない.....

途中

4. express(node.js)

途中

結果まとめ

途中

参考

spring boot

http://maplesystems.co.jp/blog/programming/18474.html https://www.jetbrains.com/help/idea/2016.1/creating-spring-boot-projects.html https://pgcolony.com/entry/117 http://confrage.jp/springmvc%E3%81%A7modelattribute%E3%82%A2%E3%83%8E%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B/ http://www.riem.nagoya-u.ac.jp/~ohta/etc/springboot-3.html

java8 http://www.task-notes.com/entry/20150406/1428289200 http://qiita.com/shuntaro_tamura/items/60b8c19f62edfd942c2e

jmetor

http://language-and-engineering.hatenablog.jp/entry/20081014/1223905380 めっちゃ古いけど

おまけ

ある時、 railsでこんなエラーがでるように

undefined method `tr' for nil:NilClass Did you mean? try
Extracted source (around line #37):

         raise "Database URL cannot be empty" if url.blank?
          @uri     = uri_parser.parse(url)
          @adapter = @uri.scheme.tr('-', '_')
          @adapter = "postgresql" if @adapter == "postgres"

          if @uri.opaque

database.ymlがうまく読み込まれていない

ヒント http://raysapida.github.io/more-debugging/

別なプロジェクトでDATABASE_URLという環境変数を設定してしまったせいだった

Rails使ってる環境でDATABASE_URLには気をつけろ

CakePHP 3.x の migrationが失敗するとき

問題

$ bin/cake migrations migrate


 [InvalidArgumentException]                 
  Could not infer database type from driver 

これは、設定ファイルの読み込みがおかしいのが原因

対策

config/app.phpの下記、'url'というオプションをコメントアウトしろ!

/**

            'url' => env('DATABASE_URL', null),

それか、環境変数DATABASE_URLをちゃんと設定するか

原因

cakephpが設定ファイルを読み込む

vendor/cakephp/cakephp/src/Core/StaticConfigTrait.php

  if (isset($config['url'])) {
            $parsed = static::parseDsn($config['url']);
            unset($config['url']);
            $config = $parsed + $config;
        }

この部分のコードがが$configを壊す

ASINコードからAmazon商品の画像を取得するwindowsツール

動機

クラウドワークスみてるとAmazon関連の案件は一定数あるが、めんどくさそうという食わず嫌いで全然やってなかった。

今回、一念発起してちょっとやってみた。

といっても、APIを使わず、単にスクレイピングで画像のURLを取得するだけ。

方法

プラットフォームは、今回は想定使用者に合わせてWindowsのアプリとしてつくるので、.netのWPFアプリだ。 C#でかく。

コアになる技術は例によってヘッドレスブラウザのphantomjs。ほかにもHTTPクライアントっぽいのはいろいろあるがやはりjsが絡むとこれしかない。

PhantomJS | PhantomJS

こいつの.netのラッパーを使った。

NReco.PhantomJS: PhantomJS wrapper for C#/.NET

成果

作った。 f:id:uoz:20160606023358p:plain

ASINをいれると、AMAZON商品の画像URLを一つだけ取得する。

gitにあげたので見てください。

github.com

もしくは、ご連絡をいただければビルド済みのツール(インストーラ)をあげます。 何かカスタマイズしてほしい場合もご連絡ください。

後記

そもそも画像のURLってルールできまってんのかな。無駄なことしたかも。 Amazon画像をASINから生成する方法

LINE BOT Rubyリベンジ

数カ月前にLINEのボットがはやったとき、人の書いたPHPのやつをコピペして
一応動かせた。

その時は何がなんだかわかってなかったけど、
Rubyで作り直してちょっとわかった。


メッセージを送るだけの単純な代物
.envでいろんな値を管理しています。

github.com



こちらにある、from(mid)を間違う問題でめっちゃはまったよ。

今更だけどラウル様と会話できる LINE bot を作ってみようとしてやめました→動きました - Qiita

Webstorm (Intellij idea) でnode.jsデバッグが止まらねえ

症状

タイトルのとおり。
ブレークポイントを設定しても止まらない。



厳密に言えば、とまってるっぽいけど、Webstorm上でそれが検出されない。
Resume buttonにも反映されないので、止まってるのを動かすこともできない。
再起動するしかない。

原因

とりあえず、console.logを実行するとそれ以降のブレークとポイントで止まらない事がわかった。

対策

stackoverflow等、いろいろ探してみた。
debugging - Webstorm console.log interrupts debugger - Stack Overflow
今のところ、解決策なし...

How to take sreencapture (screenshot) of WebView for OSX app (swift) | OSXのSwiftアプリでスクリーンショットを取る方法(webViewのiframe内)

I found two ways.
ググりまくって、2つの方法を見つけた。iOSの場合は多いが、OSXアプリの情報は少ない。

Using WKWebView | WKWebViewを使う方法

References
https://github.com/lemonmojo/WKWebView-Screenshot
http://qiita.com/edo_m18/items/3df1861dfb837838d33b(timer)

let delay = 3.0 * Double(NSEC_PER_SEC)
let timeout = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))

let image = self.webView!.captureScreenshotWithTimeout(timeout)

"self.webView" is a instance of WKWebView.

This method works, but can not take contents inside iframe.

Another problem is that this code use private API, so you cannot publish apps through the App Store using this codde.

ただし、この方法だとiFrame内が真っ黒になってとれない。

Using screencapture command | OSXのscreencaptureコマンドを使う方法

References
https://github.com/leemachin/say-cheese

 system("screencapture -c -x");
 let imageFromClipboard = NSImage(pasteboard: NSPasteboard.generalPasteboard())

This code can get iframe content.
However, you have to crop image if you need only a part of the whole screenshot.

  • R option allows you to take a part of the whole screen.

http://qiita.com/South_STR/items/f4624134726eca839647