2017年4月22日土曜日

react-router  を使った遷移の話

キンドルセール情報のサイトでreact-routerを使ってホーム画面と検索画面の遷移を作成したのでメモ。
はまったのは検索画面のURLが直接叩かれても、正しい検索結果を返さなければならないところ、普通にやるとサーバサイドのURLはホーム画面しかないので検索画面のURLを入力しても404になってしまう。

ホーム画面
検索結果画面



そこでreact-routerの処理だけでなく、railsの方にも同じURLを登録すると、ホーム->検索画面といったノーマルな遷移だけでなく、検索画面URLが直接叩かれたり、ブラウザの戻るににも対応できる。

rails側 config/routes.rbに設定しURLを有効にする
ここで重要なのは/booksで受け取ったものはホーム画面と同じパスに渡して、ルーティング処理はフロントのreact-routerに任せるところ。
root 'main#index' # ホーム画面
get '/books', to: 'main#index' # 検索結果画面

react側のルーティング処理 
import React from 'react';
import ReactDOM from 'react-dom';
import darkBaseTheme from 'material-ui/styles/baseThemes/darkBaseTheme';
import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import getMuiTheme from 'material-ui/styles/getMuiTheme';
import Sales from './components/sales.jsx';
import Books from './components/books.jsx';
import injectTapEventPlugin from 'react-tap-event-plugin';
import { IndexRoute, Link, Router, Route, browserHistory } from 'react-router';

export default class Main extends React.Component {

  constructor(props) {
    super(props);
    injectTapEventPlugin();
  }

  render() {
    return (
      <MuiThemeProvider muiTheme={getMuiTheme(lightBaseTheme)}>
        <div>
          <Header query={this.props.location.query}/>
          { this.props.children }
          <Footer />
        </div>
      </MuiThemeProvider>
    );
  }
}
ReactDOM.render((
  <Router history={browserHistory} > 
    <Route path="/" component={Main}>
      <IndexRoute component={Sales} />
      <Route path="/books" component={Books} />
    </Route>
  </Router>

  ), document.getElementById('app'),
);

なかなかWebにぴったりの情報がなくてはまったが、これでうまくいき検索結果がブックマークできるようになった。









2017年4月16日日曜日

EC2の外部接続許可について

セルフプロジェクトとして頑張っている、Kindleセール情報おすすめサイトの開発環境、バッチサーバをAWSに移行したのだが、外部からの接続ではまったのでメモ。

通常サーバを立ち上げたあと、セキュリティの設定iptablesなどいじいじしてポートを開けたりしなければならないのだがEC2ではその必要がなさそうだ。


EC2でサーバを立ち上げた後、開発環境なので

bundle exec rails s -b 0.0.0.0 -p 3000

で開発環境サーバを立ち上げ、外部から接続してみたが繋がらないのでIptables -L で調べてみると何も設定されたない。。。

なんじゃこりゃ?と思ってAWSコンソールを調べてみると、なんのことはない、Security Groupを設定する必要があった。

以下画像のように開けたいポートをSecurity GroupのInboundに追加する必要あり。




AWSやっぱすごい。

2017年4月10日月曜日

Ubuntuスクレイピングサーバの構築

なんかしらの価値ある情報サービスを提供するばあい、

  1. 自分でコンテンツを作成する
  2. コンテンツを集めて加工する
  3. ユーザがコンテンツを提供するフラットフォームを提供

のどれかの手段を取る必要があるが、今回作成したキンドルセール情報の検索サイトは「2」なので、スクレイピングして情報を集めることにした。

結構この手段を使うひとはいると思うので、構築手順を書いておく。

スクレイピングサーバ構築手順

node.js install
 sudo apt-get install nodejs
ruby install
apt install rbenv ruby-build
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
sudo apt-get install -y autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev ruby-dev  libmysqlclient-dev
mkdir -p "$(rbenv root)/plugins"
git clone https://github.com/rkh/rbenv-update.git "$(rbenv root)/plugins/rbenv-update"
rbenv install 2.3.1 
ruby project deploy
git clone xxxxxxx
sudo apt install ruby-bundler
bundle install
ブラウザ動作環境を整える
chromium install
sudo apt-get install chromium-browser
sudo apt-get install xvfb
chrome-driver install
wget https://chromedriver.storage.googleapis.com/2.26/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
cp chromedriver ~/.rbenv/versions/2.3.1/bin
~/.bash.rcに追加
# rbenv
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
nohup Xvfb :99 -ac -screen 0 1024x768x8 &
export DISPLAY=":99" 

のちにAnsibleで書いて自動化する気持だけは強くもっている。