h365info's blog

http://h365.info というアダルトサイトの管理人のブログ

Rails で group by して count を取りたい時のイディオム

Rails4 で group by して count を取りたい時にこんなふうに書けます。

本に対してレビューが書かれていて、本ごとのレビュー件数を取りたい場合は

Review.group(:book_id).order('count_all desc').count

こんなふうに書くと

(0.3ms) SELECT COUNT(*) AS count_all, book_id AS book_id FROM `reviews` GROUP BY book_id ORDER BY count_all desc
=> {588=>5, 589=>2, 590=>1, 591=>0, 592=>4, 593=>3}

みたいな結果になります。{ book_id => count } のハッシュが返ってきます。

そういうメモ。

Webサイトの構造を簡単にAPI化できるサービス kimono

今日は、スクレイピングに便利なサービスのご紹介です。

kimono : Turn websites into structured APIs from your browser in seconds

これは、画面上でスクレイピングしたいサイトのURLを入力して、どの部分を使いたいかを選択するだけで、その部分だけを手軽に API 化できるサービスです。

エッチなサイトを表示させて、タイトルとか動画のURLとかをぽちぽち選択すれば下のような JSON を返す API の出来上がり。

H365 - エッチなエロ動画を XVIDEOS などから厳選して配信(スマートフォン対応)無料動画です

でも利用させていただいています。

{
    name: "ero-porn_net",
    lastrunstatus: "success",
    lastsuccess: "Mon Feb 03 2014 23:34:48 GMT+0000 (UTC)",
    nextrun: "Tue Feb 04 2014 00:34:48 GMT+0000 (UTC)",
    frequency: "hourly",
    newdata: true,
    results: {
        collection1: [
        {
            thumbnail: {
                src: "http://example.com/videos/1.jpg",
                title: "エロ過ぎてたまらない。美人妻の乱れ"
            },
            header: {
                text: "エロ過ぎてたまらない。美人妻の乱れ",
                href: "http://example.com/movie/1"
            },
            date: "更新日:2014/02/03 10:28"
        },
        {
            thumbnail: {
                src: "http://example.com/videos/2.jpg",
                title: "エロエロ動画サンプル"
            },
            header: {
                text: "エロエロ動画サンプル",
                href: "http://example.com/movie/2"
            },
            date: "更新日:2014/02/03 9:42"
        }
        ]
    }
}

すごく便利です。いろいろな使い方がありそうですね。 Yahoo! Pipes なんかと組み合わせれば、プログラムを書かなくてもデータの整形や抽出が簡単にできちゃいそうです。

取得先のサイトをどれくらいの間隔で訪問するかを決めることができたり(Realtime、Hourly、Daily、Weekly、Monthly)もしますし、返すことのできるデータ形式JSONCSVRSS があるので、RSS を配信していないサイトの新着を知るなんてことお簡単にできそうです。

オススメのサービスです。著作権等には注意して利用してください。

自動相互リンクチェック機能の実装方法

今日は自動相互リンクチェック機能の実装の説明をしたいと思います。

相互リンクとはご存知のとおり、AというサイトとBというサイトがお互いにリンクを張り合うというものです。検索エンジンSEO として有名なやつです。

相互リンクは一昔前はメールで連絡をとりあってお互いにリンクを張り合うという作業が多かったと思いますが、最近では自動で相手のサイトに自分のURLが登録されているかを確認して、自分のサイトのURLがあればこちらもリンクを登録するという形式が増えています。

その機能を Rails で実装してみます。

実装の参考は h365.info を御覧ください。アダルトサイトなので見るときは気をつけてください。

相互リンクと新規登録 - [H365]エッチなエロ動画を365日厳選配信(スマートフォン対応)

Link モデルを作成する

bundle exec rails g model Link

db/migrate/20140201150636_create_links.rb

class CreateLinks < ActiveRecord::Migration
  def change
    create_table :links do |t|
      t.string :title, null: false
      t.string :url, null: false
      t.string :comment
      t.string :validation_url
      t.boolean :invalid_url, default: false

      t.timestamps
    end

    add_index :links, :url, unique: true
  end
end

urlvalidation_url を分けているのは、リンク先として登録する URL (トップページがほとんどだと思います)とリンク集のページが違うことが多いからです。

models/link.rb

require 'open-uri'

class Link < ActiveRecord::Base
  before_validation :normalize
  validates :title, presence: true
  validates :url, presence: true, uniqueness: true
  validates :validation_url, presence: true
  validate :cross_linkable

  class << self
    def sweep_unlinked_site
      Link.find_each do |link|
        unless valid_site?(link.validation_url)
          link.invalid_url = true
          link.save(validate: false)
        end
      end
    end

    def valid_site?(url)
      uri = URI.parse(url)
      doc = Nokogiri::HTML(open(uri, 'Referer' => Settings.site.url))
      doc.xpath("//a[@href='#{Settings.site.url.chomp('/')}']", "//a[@href='#{Settings.site.url}']").present?
    rescue => e
      logger.warn "Link site validation exception: #{e.message}"
      false
    end
  end

  def cross_linkable
    if errors.empty?
        errors.add(:validaion_url, I18n.t('errors.invalid_validation_url')) unless Link.valid_site?(self.validation_url)
    end
  end

  private

  def normalize
    self.url.chomp!('/') if self.url && self.url.end_with?('/')
  end
end

open-urinokogiri を使ってリンク先のページを見に行き、URL が含まれているかを確認しています。

f:id:h365info:20140203123322p:plain

Webプログラマが最初にアダルトサイトを作るといい7つの理由

Rails でアダルトサイトを作ったら、これは新人の Web プログラマはアダルトサイトを作るべきだわと思ったので書き連ねます。

ちなみに、作ったサイトはこちらです。アダルトサイトなので閲覧には気をつけてください。

H365 - エッチなエロ動画を XVIDEOS などから厳選して配信(スマートフォン対応)無料動画です

1. Web の仕組みを理解できる

アダルトサイトっていうのは、基本的に不特定多数の人に見てもらうものです。閲覧機能がまず必要になります。そして、コンテンツを編集するための管理機能が必要になります。

管理機能は誰でも触れていいわけではないので、当然認証機能が必要になります。認証機能 + CRUD 機能をひと通り作る必要があるのです。

また、アクセス数が比較的増えやすいことから、キャッシュをどこで使うかなんていうのも考える必要があります。

2. サーバの知識が身につく

サイトを作ったら公開するためのサーバが必要になります。アダルトサイトを置くことができるサーバは多くあるものではありませんので、自分でサーバを立てるか、VPS を借りて自分で環境を作る必要があります。

まっ更なサーバを自分色に染めていくことになるわけですが、デプロイ一発で動くように設定するのは、初めての人にはなかなか大変です。Rails には Capistrano というデプロイツールがあるので、デプロイ作業が全自動でできますが、Web サーバの設定や Ruby のインストール、アプリケーションサーバの設定なんかは最初にしておく必要が出てきます。

ドメインを取ったら DNS の設定も必要です。また、アダルトサイトは比較的アクセスが増える傾向にあります。そのため、負荷対策も考えなければいけません。

3. 検索の知識が身につく

コンテンツをたくさん作ったら当然検索できるようにしたいと考えますよね。全文検索、聞いたことはあるけどどうやってやればいいか?考える必要がでてきます。

最近では全文検索サーバも簡単にインストールできますし、Apache solr なんかは Rails からも簡単に扱えるので導入しやすいですね。

4. SEO の知識が身につく

アクセス数を伸ばすために、どういうタグを入れたらいいか、サイトの構成はどうしたら良いか?を考える必要がでてきます。受託でやってるとサイト構成とかは決まっていることが多いですが、自分のサイトですので自分で考える必要がでてきます。

サイトマップとかツリー構造とか、検索エンジンがたどりやすいサイト構成やタグ構成を学ぶいい機会になります。

5. 人間性が身につく

アダルトサイトを作るのは結構後ろめたい気持ちになります。エロとギャンブルをやるやつは人間の屑みたいに思われているからですかね?

ですので、作ったアダルトサイトを広めるのに、自分の名前やいつも使っている FacebookTwitter のアカウントなんてのは使いたく有りません。そうなるとどうするか?相互リンクを活用するしかなくなります。

相互リンクのお願いをするのに、いろんなサイトを回って、登録フォームにお願いのメッセージを記入する。ほとんどのところは先にこちら側がリンクを貼る必要があるケースになるので、「人に何かしてもらいたければまず、自分がする」が身につけられます。

6. お金儲けの知識がみにつく

アダルトサイトをやる以上、アフィリエイトは必須でしょう!アフィリエイトのためにアダルトサイトをやると言ってもいいかもしれません。ただ、あまりアフィリエイトに注力してしまうとユーザが逃げていく原因になります。

アクセス数を増やすのと、アフィリエイトでうまく稼ぐこと。コレを両立する方法を常に考える必要がでてきます。一端の経営者ですね。

7. 趣味が増える

アダルトサイトを自分で運営するようになると、コンテンツを継続的に増やす必要が出てきます。また、アクセス数を増やす努力をしたり、繁盛しているサイトはどういうことをやっているのか知りたくなってきます。

いろいろなところに自然とアンテナを張るようになり、いろんなコトに興味が出てくるように成ります。

H365 - エッチなエロ動画を XVIDEOS などから厳選して配信するサイトを作った裏側

H365 とは?

http://h365.infoドメインH365 というサイトを公開しました。このサイトはビデオ投稿サイトの XVIDEOS などからビデオを厳選してピックアップするエロ動画紹介サイトです。

アダルトサイトなので、18歳未満は立ち入り禁止です。

h365.info の由来は?

H を365日配信したいという思いです。エロとギャンブルは人の心をつかむ(良い意味でも悪い意味でも)と思っていますので。

どうやって作ったの?

このサイトは2日間かけて、Ruby2.1 と Rails4 の構成で作りました。知っている人は知っていると思うけど、去年、一昨年くらいにエロサイトを作るウェーブがあって、乗り遅れましたがここで作った次第です。

rails4 の初期状態から追加して使っている gem は次のとおりです。日々更新しているので内容が古くなっている場合もあります。

gem 'jquery-turbolinks'
gem 'fastclick-rails'
gem 'sitemap_generator'
gem 'rails_config'
gem 'font-awesome-rails'
gem 'kaminari'
gem 'acts-as-taggable-on'
gem 'devise'
gem 'nokogiri'
gem 'carrierwave'
gem 'ruby-duration'
gem 'rails-observers'
gem 'actionpack-action_caching'
gem 'cached_counts'
gem 'newrelic_rpm'
gem 'whenever', :require => false
gem 'twitter'
gem 'sunspot_rails'
gem 'sunspot_solr'

ざっと並べました。スマートフォンに対応したサイトを作る上で、 fastclick-rails は必須ですよね。タップへの反応速度が全く違います。sitemap_generator は sitemap を作ってくれるプラグインです。Rails でブログを作る人は是非利用したい gem です。あとは、キャッシュ系のために、 actionpack-action_caching を入れたり、cron で色々回すために whenever全文検索用に sunspot_rails を入れたりしています。

参考にしたサイトはちょっと検索したら出てくると思いますが、ほとんどインスパイアさせていただきました。

他の動画紹介サイト様で紹介されている動画をクローラ(nokogiri を利用)として作成して、ほぼ全自動で動画を集めてきています。最後は自分の目で確認して、適用ボタン一発でサイトに反映される感じです。

動画サイトの裏に管理機能を持ったWebアプリがいて、管理者(自分だけですけど。。)はそこで動画や広告の配信の設定を全部できるようにしました。無駄に凝ってますw

XVIDEOS から直接も登録できるように、Microsoft の Translation API も活用しています。

作ったあとは?

ぶっちゃけ、プログラム部分の作成は特段難しいことは無かったです。サーバの構築もアダルトサイト運営が可能なサーバ(今回は osukini サーバを借りました)を借りてちゃちゃっと構築しています。

ドメインレンタルサーバ代金(3ヶ月分)で、初期費用3,000円位です。公開後はアフィリエイト用の広告を探してサイトにぺたぺた貼って現在公開しています。

http://h365.info

問題はなかったの?

作りの部分に関していうと特に問題は無かったですが、いかんせん作ったばかりのサイトはアクセス数が増えません。今回は2chのいろんな板を回らせていただいて宣伝しましたが、宣伝部分が一番難しいと感じました。

アダルトサイトの相互リンクとかも探したんですが、登録しても効果があるのかさっぱりですし。。とりあえず、まだ作って間もないですのでいろいろなところで宣伝記事を書いたり、リンクを貼りまくっています。

ぶっちゃけアフィリエイトって儲かるの?

サイトを始めて3日経ち、リンクを貼りまくった結果、1日で3000PVくらいいきました。ユニークユーザ数も600くらいあり、広告のインプレッションもそこそこありますが、クリック広告が少ないせいで、今のところアフィリエイトの収入は0円です。。

そんなに甘いものではないとは思っていましたが、うーむ、ここからどうしようか?という感じです。。

今後の展開

とりあえずもう少し運用してみますとしか言えませんが、こういう動画がもっと欲しいとか、こういう機能が欲しいというのがあれば実装したいと思いますのでよろしくおねがいします。

H365 - エッチなエロ動画を XVIDEOS などから厳選して配信するサイトをつくりました

こんにちは。H365 というエロ動画紹介サイトを公開しましたので宣伝です。

H365 - エッチなエロ動画を XVIDEOS などから厳選して配信(スマートフォン対応)無料動画です 

次の記事でどうやって作ったかの技術的なところを紹介します。

H365 を作った裏側»