2014年12月27日土曜日

MacにAWS-ElasticBeanstalkコマンドコマンドツールをインストールする方法


AWS-ElasticBeanstalkコマンドコマンドツールをインストールする方法のメモです。

zipのダウンロード

cd ~/Workspaces/aws/Elastic-Beanstalk/
curl https://s3.amazonaws.com/elasticbeanstalk/cli/AWS-ElasticBeanstalk-CLI-2.2.zip -o AWS-ElasticBeanstalk-CLI-2.2.zip

zipの解凍

unzip AWS-ElasticBeanstalk-CLI-2.2.zip

bashrcに環境変数を追加

echo 'export PATH="$HOME/Workspaces/aws/Elastic-Beanstalk/AWS-ElasticBeanstalk-CLI-2.2/eb/macosx/python2.7:$PATH"' >> ~/.bashrc

bashrcのリロード

source ~/.bashrc

確認

eb --help

ヘルプが表示されれば成功。

Macにboot2dockerとfigをインストールして使う方法

boot2dockerのインストールと設定

インストール

下記よりpkgをダウンロードして、インストールできます。

GitHub - boot2docker/osx-installer

期化

$ boot2docker init

開始

下記で、boot2dockerを起動できます。

$ boot2docker start

起動すると、下記のように表示されるので、これを、.bash_profileに追加する。

export DOCKER_HOST=tcp://192.168.59.103:2376
export DOCKER_CERT_PATH=/Users/jun1/.boot2docker/certs/boot2docker-vm
export DOCKER_TLS_VERIFY=1

または、下記を実行すると、良きに環境変数を変更してくれます。

$ $(boot2docker shellinit)

figのインストール

インストール

figを 公式サイト(Fig)に従って、以下を実行してインストールします。

curl -L https://github.com/docker/fig/releases/download/1.0.1/fig-`uname -s`-`uname -m` > /usr/local/bin/fig; chmod +x /usr/local/bin/fig

確認

インストールが終わったら、確認。

$ fig --version
fig 1.0.1

コンテナの起動

設定ファイルの作成

コンテナを起動するには、YAML形式の設定ファイルを fig.yml を作る必要があります。

今回は、nginxのコンテナを動かすパターンです。
Docker hubはここ => dockerfile / nginx

fig.ymlを下記のように記述します。

nginx:
  image: dockerfile/nginx
  ports:
    - '80'
    - '443'

起動

ターミナルから、下記を実行します。

$ fig up -d

-d : デタッチモードで起動

そうすると、数分で作成されます。

動作確認

$ fig ps

すると

 Name     Command   State                       Ports
--------------------------------------------------------------------------
fig_nx_1   nginx     Up      0.0.0.0:49153->443/tcp, 0.0.0.0:49154->80/tcp

こんな感じになります。
State が Upになっていれば、ちゃんと動いてます。

Docker の ipの確認のため以下を実行すると

$ docler ip

結果が返ってくるので、

192.168.59.103

下記をブラウザでアクセスすると。

http://192.168.59.103:49154/

nginxが起動してることがわかります。

enter image description here

ざっとこんな感じです。


$ fig stop

で停止します。

2014年12月25日木曜日

Rubyで相対パスを絶対パスに変換する方法

スクレイピング中に、リンクが相対パスで記述されていることが、よくあるのですが、そのリンクのパスを絶対パスに変換したい時ってないでしょうか?

私は、結構あります。

そんな時は、下記のようにすると相対パスを絶対パスに変換できます。

require 'uri'
require 'open-uri'
require 'nokogiri'

url = 'http://www.sample.com'

charset = nil
html = open(url) do |f|
  charset = f.charset
  f.read 
end

doc = Nokogiri::HTML.parse(html, nil, charset)
pdf_list = []
doc.xpath('//a').each do |node|
  next if node.attribute('href').blank?
  p href = node.attribute('href').value

  href.match(/.*\.pdf$/) do |md|
     pdf_url = md[0]
     pdf_url = URI.join(url, pdf_url).to_s # 相対パス => 絶対パス
     pdf_list << pdf_url
  end
end

http://www.sample.comのページから、pdfのリンク先の一覧を取得するようなものを想定しており、pdf_listに pdfのurlの一覧が格納されます。

2014年12月24日水曜日

AWS Elastic Beanstalkで作られたS3 のバケットを削除する方法

Elastic Beanstalkを使って、試しの環境を作成して、
使い終わったので、環境を管理コンソールから削除したらS3のバケットだけ残ってしまった。
しかも、手で削除しようとしたら、以下の”パーミッションがない”的なメッセージが出て削除できなかったため、なくなく調べました。

You don't have permissions to delete this bucket. You can check your bucket's permissions within bucket properties

バケットの [Permissions] > [ Edit bucket policy]を開いて以下のように修正。

"Effect": "Deny" => "Effect": "Allow"

設定を保存して、削除すると無事に削除できます。

RubyでStringからTime型に変更する方法

タイトル通り、RubyでStringからTime型に変更する方法です。

文字列から、Time型に変換したい時ってちょくちょくあると思います。
そんな時は、Time.parseを使います。

例えば、

20141105134054

みたいな文字列を、Time.parseに渡すと。

Time.parse('20141105134054')

下記のように結果を返してくれます。素敵です。

2014-11-05 13:40:54 +0900

ただし、これは日本語が入っていないようなパターンで通用します。

日本語が入っている場合、例えば

2014年 12月 24日 1:20:30

のような物に関しては、Time.strptime を使います。

Time.strptime('2014年 12月 24日 1:20:30', '%Y年 %m月 %d日 %H:%M:%S')

個人的には、Time.strptimeの方が、自分の意思で変換している気分になるので
安心感がある気がしています。

2014年12月19日金曜日

Mac OSXにredisをインストールして、少し触ったメモ

Mac OSXにredisをインストールして、少し触った時のメモです。

redis公式サイト
redisドキュメント日本語訳

redisのインストール

HomebrewでRedisをインストール

インストール

brew update
brew install redis

 確認

下記を実行してversion情報が帰ってく来るか確認

redis-server --version

結果のサンプル

Redis server v=2.8.18 sha=00000000:0 malloc=libc bits=64 build=9addc0f74106cfbc

redisの起動

redis-server /usr/local/etc/redis.conf

redisの接続

redis-cli

redisの停止

redis-cliでCtrl + C とか shutdouwとか

値の設定

設定

set count 12

取得

get count
12

寿命の設定

10秒間countを保持する。

expire count 10

寿命の確認

ttl count

EC2インスタンスからAMIを作成する

AWSでマシンイメージを生成する方法です。
簡単に作成できます。
サーバーのコピーやバックアップが簡単に行えます。

以下簡単ですが、作業の手順です。

AMIの作成

AMIを作成するEC2のインスタンスを選択して

[Action] > [Image] > [Create Image]

Create Imageダイアログ

下記の各項目を設定して、[Create Image]ボタンをクリック

Create Image

マシンのイメージ名 必須項目です。

以下のようにサーバー名と日付で主に名前を付けています。

sever-name_yyyy-mm-dd

Image description

マシンイメージの説明。任意項目です。

No reboot

サーバーを再起動させてたくない場合は、チェックを入れる。
チェックを入れないとリブートしてくれます。こちらの方がきれいにイメージがとれそうな気がします。

定期的なバックアップ用でAMIを作成する時などには、サーバーを動かしたまま、No rebootにチェックを入れて作成するには有効だと思います。
ただし、データが消えたりする事例もあるようなので、要注意です。
Qiita - No RebootでAMIを作成したらファイルが消えたりした

Instance Volumes

イメージ生成に含めるEBSを選択。

状況確認

AMIsから状況の作成状況の確認ができます。

statusがpendingからavailableに変わったら完成です。

2014年12月10日水曜日

Railsでdatetimes型のvalidatetionをvalidates_timelinessを使ってする方法

Railsでdates や times, datetimesのバリデーションをするメソッドが標準で用意されていないので、下記のGemを導入して対応しました。

その時の、手順メモです。

GitHub adzap/validates_timeliness

インストール

以下をGemfileに追記して、bundle install を実行する。

# Datetime型 validates
# https://github.com/adzap/validates_timeliness/
gem 'validates_timeliness', '~> 3.0'

gemのinstallが終わったら、下記を実行して設定ファイルを生成する。

rails generate validates_timeliness:install

上記を実行すると、下記のファイルが生成される。

create  config/initializers/validates_timeliness.rb
create  config/locales/validates_timeliness.en.yml

実装

# フォーマット確認
validates_datetime :occurred_at

# 18歳以上の確認
validates_date :date_of_birth, :before => lambda { 18.years.ago },
                               :before_message => "must be at least 18 years old"

# 開始日 < 終了日の確認
validates_datetime :finish_time, :after => :start_time # Method symbol

# 今日以降の日付かの確認
# :todayは、config/initializers/validates_timeliness.rbで設定可能。
validates_date :booked_at, :on => :create, :on_or_after => :today 

# AM 9:00~PM5:00の間の確認
validates_time :booked_at, :between => ['9:00am', '5:00pm']
# 同じくAM 9:00~PM5:00の間の確認
validates_time :booked_at, :between => '9:00am'..'5:00pm'

# 確認した時間によってメッセージを切り替える。
validates_time :breakfast_time, :on_or_after => '6:00am',
                                :on_or_after_message => 'must be after opening time',
                                :before => :lunchtime,
                                :before_message => 'must be before lunch time'

config/initializers/validates_timeliness.rb

:nowや:today を使用する場合、下記のコメントアウトを外す。

config.restriction_shorthand_symbols.update(
  :now   => lambda { Time.current },
  :today => lambda { Date.current }
)

config/locales/validates_timeliness.[en|ja].yml

バリデーションのメッセーを日本語に変更したい場合は、config/locales/validates_timeliness.ja.ymlファイルを作成して編集する。

ファイルのなかみのサンプル

ja:
  errors:
    messages:
      invalid_date: "は、日付のフォーマットが間違っています"
      invalid_time: "は、時間のフォーマットが間違っています"
      invalid_datetime: "は、日時のフォーマットが間違っています"
      is_at: "は、%{restriction} を指定してください"
      before: "は、%{restriction} より小さい日時を指定してください"
      on_or_before: "は、%{restriction} 以前の日時を指定してください"
      after: "は、%{restriction} より大きい日時を指定してください"
      on_or_after: "は、%{restriction} 以降の日時を指定してください"
  validates_timeliness:
    error_value_formats:
      date: '%Y-%m-%d'
      time: '%H:%M:%S'
      datetime: '%Y-%m-%d %H:%M:%S'

2014年12月5日金曜日

Railsでファビコンを設定する

よくブラウザのアドレスバーの横やブックマークした時に表示される画像を作って登録しましょうという話です。
主な手順としては、
1. ファビコンの作成
2. ファビコンの登録
です。
それぞれ、下記に説明していきます。

ファビコンの作成

今回ファビコン用の元画像としてこれを使います。
enter image description here
そして、この画像をファビコン用に変換する必要があるので、
下記のサイトでファビコン用の画像に変換してもらいます。
http://favicon.qfor.info/c/
使い方は、画像を選択して、アイコン作成ボタンをクリックすればすぐに作成されます。
enter image description here
正方形ではないので、こんな感じで、ちょん切られて作成されます。

ファビコンの登録

今回は、Railsでの登録なので favicon_link_tagメソッド を使います。
/layouts/application.html.erbに下記を追記します。
<%= favicon_link_tag %>
この設定を行った場合、/favicon.ico を見にいってくれるので。
作成したアイコンのファイル名を favicon.icoにしてpublicフォルダ配下に配置すれば完成です。

2014年12月4日木曜日

NginxにBasic認証を設定する

nginx.confの設定

nginx.confに以下を追加
server {
    listen       80;
    server_name  www.sample.com;

    ## ここから 追加
    auth_basic "please login test";
    auth_basic_user_file "/etc/nginx/authfiles/.basicauthpasswd";
    ## ここまで 追加
    ・・・・

パスワードファイルの作成

パスワードの作成には、htpasswd コマンドを使用します。

新規に作成する場合

以下を実行して、作成されたファイル(.basicauthpasswd)を
/etc/nginx/authfiles/配下に設置します。
htpasswd -bc .basicauthpasswd testuser testpassword

複数ユーザーを追加する場合

htpasswd -bn testuser2 testpassword2
とすると、下記のような結果が帰ってくるので、
これを、.basicauthpasswdファイル内に追加で記述すればOKです。
testuser2:$apr1$inx7Pllo$fqPEAt0uwgBxwxGe5/35v0

htpasswd

呼び出しは下記の通りです。
htpasswd -b[cmdpsD] passwordfile username password

htpasswdのオプション

オプション 説明
-c 新しいパスワードファイルを作成します。もし、同名のパスワードファイルがすでに存在する場合は、既存の内容が削除されます。
-n どのような結果になるかのみを標準出力して終了します。パスワードファイルを変更しません(テスト実行用)。
-m パスワードをファイルに書き込む際、MD5 でハッシュします。
-d パスワードをファイルに書き込む際、CRYPT でハッシュします(デフォルト)。
-p パスワードをファイルに書き込む際、ハッシュしないで、プレーンなテキストのまま書き込みます。
-s パスワードをファイルに書き込む際、SHA でハッシュします。
-b パスワードを、対話式入力ではなくて、コマンドライン引数として指定できるようにします。

Nginxをリロード

/etc/init.d/nginx configtest
を実行して、以下のようにOKであれば
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
下記を実行。
/etc/init.d/nginx reload

2014年11月29日土曜日

オススメ!markdownエディタ MacDownのインストールして使う

MarkdDown エディタのMacDownのインストール方法です。
MacDown logo
MacDown 公式サイト

概要

Blogを書くときはStackEdit を使っているんです。
ローカルファイルのマークダウンファイルの編集でもStackEditを使いたいと思ったのですが、.mdの拡張子のファイルをクリックしたら、chromeのStackEditを起動してもらいたいと思ったのですが、うまくできなかったので一旦諦めました。
(もし、ご存知の方いらっしゃいましたら、教えてください。)
これまで、Mouを使っていたんですが、Mouからの進化系と信じして今回MacDownを採用しました。とりわけ、スタイルとかが綺麗で見やすいです。

インストール

インストールは公式サイトから、Appをダウロンロードできます。

起動

appを起動しようとすると
"MacDown.app"は、開発元が未確認のためひらけません。
と怒られて開けなかったです。
こちら、MacDownはあんまり関係なくって、macの設定で下記から、設定変更かのうです。
  1. システム環境設定から[セキュリティとプライバシー]
  2. [一般]タブの[ダウンロードしたアプリケーションの実行許可]

使い方

あとは、Markdodwnの記法で書いてください。
公式そのままですが、以下のような書き方はできます。

サンプル

MacDown

MacDown logo
Hello there! I’m MacDown, the open source Markdown editor for OS X.
Let me introduce myself.

Markdown and I

Markdown is a plain text formatting syntax created by John Gruber, aiming to provide a easy-to-read and feasible markup.
The original Markdown syntax specification can be found here.
MacDown is created as a simple-to-use editor for Markdown documents. I render your Markdown contents real-time into HTML, and display them in a preview panel.
I support all the original Markdown syntaxes. Various non-standard ones can also be turned on/off from the Markdown preference pane:
Markdown preferences pane
You can also specify extra HTML rendering options through the Rendering pane:
Rendering preferences pane
And you can also configure various behaviors in the General preferences pane.
General preferences pane

Block Formatting

Table

This is a table:
First Header Second Header
Content Cell Content Cell
Content Cell Content Cell
You can align cell contents with syntax like this:
Left Aligned Center Aligned Right Aligned
col 3 is some wordy text $1600
col 2 is centered $12
zebra stripes are neat $1
The left- and right-most pipes (|) are only aesthetic, and can be omitted. The spaces don’t matter, either. Alignment depends solely on : marks.

Fenced Code Block

This is a fenced code block:
p 'Hello world!'
You can also use waves (~) instead of back ticks (`):
~
print('Hello world!')
~
In either case, you can add an optional language ID at the end of the first line:
<div>
    Copyright © 2014
    <a href="https://uranusjr.com">Tzu-ping Chung</a>.
</div>
The language ID will be used to highlight the code inside if you tick the Enable highlighting in code blocks option. This is what happens if you enable it:
Syntax highlighting example
I support many popular languages as well as some generic syntax descriptions that can be used if your language of choice is not supported. See relevant sections on the official site for a full list of supported syntaxes.

2014年11月28日金曜日

Rails でサイトマップ目的のRSSフィードを配信する

概要

GoogleがXMLサイトマップとRSSの両方を送信することを推奨しているようなので、XMLサイトマップと追加でRSSを設定するようにしました。
RSSをwebマスターツールに登録するにあたって、当然のことながらRSS自体を配信できるようにします。

実装

rss配信用のcontrollerを作成するような設計にしました。
そこから、商品であったりブログであったりのRSSを生成していくことを想定しています。

routes.rd

resources :rss, :only => [:index] do
    member do
      get "blog"
    end
  end

rss_controller.rd

# -*- encoding : utf-8 -*-
class RssController < ApplicationController


  def blog

    start_id = params[:id].to_i
    @blogs = Blog.order('updated_at desc')
    @blogs = @blogs.where('id >= ? AND id < ?', start_id, start_id + 500)

  end

end
最大で、500件づつ区切って指定することを想定しています。

blog.rss.builder

xml.instruct! :xml, :version => "1.0"
xml.rss("version" => "2.0", "xmlns:dc" => "http://purl.org/dc/elements/1.1/") do
  xml.channel do
    xml.title 'ブログRSSテスト'
    xml.link 'http://www.sample.com/blogs'
    xml.description "新着ブログのお知らせ"
    xml.language "ja-jp"
    xml.ttl "40"

    @blogs.each do |blog|
      xml.item do
        xml.title blog.title
        xml.description blog.description if blog.description.presents?
        xml.pubDate blog.updated_at.in_time_zone("Asia/Tokyo").to_s(:rfc822)
        xml.guid blog_url(blog.code)
        xml.link blog_url(blog.code)
      end
    end
  end
end
実装は、というような感じです。

webマスターツールへの設定

あとは、webマスターツール > サイトマップ画面 > [サイトマップの追加/テスト] ボタンをクリックして以下のようにURLを指定します。
rss/1/blog.rss
rss/500/blog.rss
rss/1000/blog.rss

2014年11月27日木曜日

RailsでHashからcheckboxを生成する方法

RailsでHashからcheckboxを生成する方法です。
複数チェックボックスに対応することを想定しています。
<%
sex = {
  unisex: 0,
  men: 1,
  women: 2
}
%>
<div class="form-group">
  <%= f.label :sex, '性別' %>
  <% sex.each do |key, value| %>
    <div class="checkbox">
      <%= f.check_box :sex, {checked: false, multiple: true}, value, nil %><%= key %>
    </div>
  <% end %>
</div>
とすると、下記のようなcheckboxが生成されます。
<div class="form-group">
<label for="sex">性別</label>
<div class="checkbox">
  <input name="feature[sex][]" type="checkbox" value="0">unisex
</div>
<div class="checkbox">
  <input name="feature[sex][]" type="checkbox" value="1">men
</div>
<div class="checkbox">
  <input name="feature[sex][]" type="checkbox" value="2">women
</div>
</div>

Dropzoneで非同期ファイルアップロードをする方法

ファイルアップロードを非同期でかつ、ファイル選択をドラッグ&ドロップでおこなうため、Dropzoneを使って実装する方法です。
デフォルトのまま使ってもUIがかっこよくっておすすめです。
公式のページはいかになります。
http://www.dropzonejs.com/
GitHub - enyo/dropzone

インストール

dropzone.jsのダウンロードは、公式サイト or GitHubからダウンロードして読み込み。
<script type="text/javascript" src="js/dropzone.js"></script>

フォームの追加

<form id="my-awesome-dropzone" action="/target" class="dropzone">
      <div class="dz-default dz-message"><span>「ドラッグ&ドロップ」またはここをクリック</span></div>
      <div id="upload_message"></div></form>
dz-messageで、デフォルトの表示メッセージを変更しています。

configファイルの設定

dropzone用のconfigファイル(dropzone_config.js)を作成します。
Dropzone.optionsのオブジェクとを定義して行きます。
Dropzone.options.myAwesomeDropzoneのmyAwesomeDropzoneはformのidをキャメルケースにした文字列を指定します。
jQuery(function () {
    if ($('form.dropzone').length > 0) {
      Dropzone.options.myAwesomeDropzone = {
            maxFiles: 2,
            autoProcessQueue: true,
            init: function () {
                this.on("maxfilesexceeded", function (file) {
                    this.removeAllFiles();
                });
                this.on("addedfile", function (file) {
                    if (this.files[1] != null) {
                        this.removeFile(this.files[0]);
                    }
                    return $('#upload_message').html("");
                });
                this.on("success", function (file) {
                    var shop_category = jQuery.parseJSON(file.xhr.response).shop_category;
                    return $('#upload_message').html("
                      <b style='color: green;'>アップロード成功しました。</b>");
                });
                this.on("error", function (file) {
                    return $('#upload_message').html("<b style='color: red;'>アップロードに失敗しました。</b>");
                });
                this.on("complete", function (file) {
//                    this.removeFile(file);
                });

            }
      }
    }
});
上記設定では、maxFiles: 2としていますが、1個づつファイルをアップロードするようにしています。
addedfileイベントで、2個目のファイルをアップロード使用とした時に、0番目のファイルを削除しています。
こうすることで、ファイルを先入先出にして、使い勝手がよくなると思います。
上記で作成した、dropzone_config.jsは、scriptタグで使う場所に読み込みます。
<script type="text/javascript" src="js/dropzone.js"></script>
<script type="text/javascript" src="js/dropzone_config.js"></script>
これまでの設定で、Server側へのファイルの送信が可能となります。

今回使用した、オプションとイベントは下記の通りです。
他にもオプションやイベントが使えるので詳細は、公式ページをご確認ください。

オプション

option 説明
maxFiles 指定できるファイル数を指定する。指定数を超えた場合、dz-max-files-reached が呼ばれます。
autoProcessQueue 複数ファイルアップロードした場合に、アップロードを自動でqueueで処理するかの設定。falseにした場合、.processQueue() を自分で呼び出す必要がある。基本 true でよいと思います。

イベント

event 説明
maxfilesexceeded ファイル数がmaxFilesの指定を超えてた時に呼び出される。
addedfile ファイルを追加した時に呼び出される。
success ファイルアップロード成功時に呼び出される。
error ファイルアップロードでエラーが発生した時に呼び出される。
complete ファイルアップロードが成功 or エラーの時に呼び出される。

2014年11月25日火曜日

ActiveRecordのMigrationでAddColumnしたカラムに別カラムの値を代入する。

ActiveRecordのMigrationでAddColumnしたカラムに別カラムの値を代入する方法です。
結果直接、SQLを投げる結論に行き着きました。
def change
  add_column :users, :value2, :integer
  execute 'UPDATE users SET value2 = value1'
end
Usersテーブルにvalue2カラムを追加して、初期値として、value1の値をいれるようなケースを想定しています。

他の方法として、modelを使うパターンもあります。
class User < ActiveRecord::Base; end

def change
  add_column :users, :value2, :integer

  User.all.each do |user|
      user.value2 = user.value1
      user.save
  end
end

bash_profileを再読み込みする方法

bash_profileに変更を加えたときなどに、bash_profileをさい読み込みさせたい時は、下記を実行する。
source .bash_profile
ターミナルを立上げ直す方法もあるが、面倒なので上記方法がおすすめです。

2014年11月24日月曜日

Macにhomebrewをインストールする


MacのOSXのパッケージマネージャー homebrewのインストール方法です。
公式サイトはこちら
GitHub - Homebrew/homebrew
下記をターミナルで実行します。
途中でEnter とpasswordの入力を求められます。
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2014年11月23日日曜日

Macにxcode コマンドラインツールをインストールする


環境

OS Yosemite
xcode 6.1

概要

xcodeをインストールして、コマンドラインツールもインストールしようかと思ったら、すでにインスールされていたので、インストール不要でした。

方法

もしインストールする場合は、ターミナルから下記を実行する
xcode-select --install

2014年11月21日金曜日

iTerm2に色を付けて見やすくする

.bash_profileに下記を追加する。
#iterm
#color setting
bind "set completion-ignore-case on"

export PS1="[\[\033[01;38m\]\u\[\033[00m\]@\[\033[01;32m\]\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]]\$"
export CLICOLOR=1
export LSCOLORS=DxGxcxdxCxcgcdabagacad

export LESSHISTFILE="-"
unset HISTFILE
# iterm
この設定を追加するだけで、可読性がかなりよくなります。

Sublime Text 2 をVimのキーバインディングにして使う

そもそもVimを使いなさいよっ!という話に簡単にもっていくことはできますが、
Sublime Text 2 をVimのキーバインディングにして使います。
メニューの[Preference] > [Settings - User]を開いて
下記を追加。
{
    "color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme",
    "ignored_packages":
    [
    ],
    "vintage_ctrl_keys": true,
    "vintage_start_in_command_mode": true
}
これだけで、結構 Vimっぽい動きになります。

Macにインストールした開発に必要なツール

Macを新調したので、よいタイミングか思いインストールしたツールをメモしたものです。基本的に無料のものを積極的に使っています。

主に、開発に使うものメインです。

ブラウザ

Google Chrome

http://www.google.com/intl/ja/chrome/

Firefox

https://www.mozilla.org/ja/firefox/new/

一応、主要ブラウザをサポートするために。。。

ターミナル

iTerm2

http://iterm2.com/

Mac標準のターミナルでもよいかもしれませんが、私はこのiTerm2を愛用させていただいております。

ランチャー

alfred

http://www.alfredapp.com/

ファイル、app、ブラウザでの検索。ほぼほぼやりたいことは、かなえてくれる凄いやつです。
一度使ったら手放せなくなりました。 気がつけば option + space を押してしまいます。
未体験の方はぜひ使ってみれください。

FTP クライアント

cyberduck

https://cyberduck.io/?l=ja

主にAWSのS3に画像を手動でアップする時に使用しています。

テキストエディタ

sublime text

http://www.sublimetext.com/

IDE

xcode

https://developer.apple.com/jp/xcode/downloads/

RubyMine

https://www.jetbrains.com/ruby/

一度使い始めたら、やめられなくなってしまいました。
Eclipseなどに比べたら断然動きが軽くrubyを使っている人にはオススメです。

ただし、有料のツールになります。個人版で$99 です。

30日間お試しもあるので、使ってみてから決めるのもありかと思います。

クラウド系ストレージ

Google Drive

https://tools.google.com/dlpage/drive?hl=ja
メインのOnline ストレージです。

Drop Box

https://www.dropbox.com/ja/

Google Driveとどっちつかずになる時があるので注意。
浮気をするとどっちにデータ入ってたっけ?って気分になります。

Evernote

https://evernote.com/intl/jp/?PHPSESSID=cab8ca5dca16b0bc2937fff529d3d1c0

Simplenote

http://simplenote.com/

タイトルに偽りなし、本当にシンプルで気にっています。ちょっとしたメモに最適です。iPhone, Mac App, Chromeアドオンになるので共有も楽チンです。
Evernoteを使うまでもない時に。

スクリーンショット

Skitch

https://itunes.apple.com/jp/app/skitch-cuoru-miaoki-rumu-gong/id490505997?mt=8

スクリーンショットを取るのに使っています。


ざっとこんな感じでしょうか。
まだまだ、これから出てきそうですが、ひとまず今回はこのへんで。

2014年11月20日木曜日

小さなCSSのインライン化で読み込み時間を短縮する

CSSのインライン化

小さなCSSに限っての話になりますが、外部ファイル化せずに、そのままHTML内に記述した方が、読み込み時間を短縮できます。

変更前

test.html
<html>
  <head>
   <link href="/css/home.css" media="all" rel="stylesheet" type="text/css">
  </head>
  ....
/css/home.css
p {
  font-size: 20px;   
}

変更後

test.html
<html>
  <head>
    <style type="text/css">
        .p {
          font-size: 20px;   
        }  
    </style>
  </head>
  ....

CSSのサイズと可読性にも影響してくるので一概にメリットだけとは思いませんが、とことんスピードを追求したい人は是非お試しください。

StackEdit + Blogger で MarkdownでBlogを書く

このブログがまさにそうですが、BlogをMarkdownで書きたいなぁと思って探してみました。
その結果、私は StackEdit + Blogger の組み合わせを採用することにしました。
ほかにも、はてなブログtumblrも簡単にMarkdownは使えそうです。
なぜ、StackEdit + Bloggerの組み合わせかと言えば、ほぼほぼの理由は StackEdit がいろいろとやってくれるかですね。
ブラウザ上でMarkdownのEditorが使えて、GoogleDrive,Dropboxなんかと同期をとれたり、下記のサービスに簡単に公開できたりとなかなかの優れものなんです。
  • Blogger
  • Github
  • tumblr
  • Drop Box
  • Google Drive
  • WordPress
私の使い方としては、StackEditで書いたものをGoogle Driveに保存しておいて、公開できそうなものをBloggerにアップするようにしています。
当然、Google Driveに保存しているので、自宅と出先とで1つのものを編集できるので何かと重宝しています。

2014年11月18日火曜日

画像をロスレス圧縮する方法

googleのPageSpeedで分析をかけたら、画像をロスレス圧縮するように言われたので、その対応方法です。

PNG画像

PNGの圧縮はtinypng (https://tinypng.com/)

JPEG画像

jpegの圧縮はmedia4x (http://media4x.com/)
いずれのサイトも、D&Dで画像を圧縮した画像をダウンロードできます。

結果

PNGで試したところ、以下のようにサイズが小さくなりました。
2.7KB => 804B
1.1KB => 159B
コツコツやっていけば、相当量のサイズ削減できるかもしれないです。

2014年11月14日金曜日

Railsでmeta-tagsやOpen Graphを設定する方法

SEO対策として、Railsのmeta-tagsを設定するために、GitHub - kpumuk/meta-tags を使ったやりかたです。

Gemのインストール

Gemfileに下記を追加して、bundle install
# https://github.com/kpumuk/meta-tags
gem 'meta-tags'

書き方

以下の様にset_meta_tagsして、<%= display_meta_tags %>場合のシンプルな例です。
<% set_meta_tags :title => ‘Member Login’ %>
Member Login

<% set_meta_tags :site => ‘Site Title’, :title => ‘Member Login’ %>
Site Title | Member Login

<% set_meta_tags :site => ‘Site Title’, :title => ‘Member Login’, :reverse => true %>
Member Login | Site Title

Open Graph

Open Graphの設定は下記のように行います。

書き方

set_meta_tags 
  :title => 'item AAAA',
  :og => {
         :title => "Member Login",
         :type => 'website',
         :url => 'https://www.sample.com/',
         :site_name => 'SITE',
         :description => '説明アアアア',
         :image => 'https://www.sample.com/logo.jpg'
 }
}
とすると、下記のようになります。
<meta content="product" property="og:type" />
<meta content="https://www.sample.com/" property="og:url" />
<meta content="SITE" property="og:site_name" />
<meta content="説明アアアアア" property="og:description" />
<meta content="https://www.sample.com/logo.jpg" property="og:image" />
typeは色々とあるようなので、ページに適宜指定してください。
詳しくは、下記のページを参照ください。
https://developers.facebook.com/docs/reference/opengraph
ちなみに、topページにはwebsite を商品ページには、productを指定したりしています。

app_idの取得

それから、facebookのapp登録をして、app_idを取得します。
Appの登録は下記より行ってください。
https://developers.facebook.com/apps
登録したapp_idをもとに、meta-tagにapp_idも設定します。
<meta property="fb:app_id" content="111111111111111" />
※ 111111111111111部分に取得した、app_idを指定

設定の確認

Open Graphの確認は下記から確認できます。
https://developers.facebook.com/tools/debug/og/object/

Twitter Cards

summaryカード

上記のOpen Graphの設定を行っておくと、Twitter Cardsの指定が、かなり簡単になります。
<%
set_meta_tags :site => 'RESTIR リステア',
                     :reverse => true,
                     :og => {
                       ・・・・・・
                     }
                     :twitter => {
                             :card => 'summary',
                             :site => '@twitter_id',
                     }
%>                    
twitterのcardとsiteを指定すれば、あとの画像や説明は、Open Graphから取得してくれます。

Productカード

Productカードの設定サンプルは下記です。
Open Graphが未設定な状態を想定して書きました。
brand_name = 'BrandA'
item_name = 'ItemA'

set_meta_tags 
  :title => 'item AAAA'
  :twitter => {
                         :card => 'product',
                         :site => '@twitter_id',
                         :domain => 'www.sample.com',
                         :title => "#{brand_name} - #{item_name}",
                         :description => '説明AAAAA',
                         :image => ['http://www.sample.com/item-img.jpg',
                                    {       :width => 207,
                                            :height => 234
                                    },
                         ],
                         :label1 => 'BRAND',
                         :data1 => brand_name,
                         :label2 => 'PRODUCT NAME',
                         :data2 => item_name
                 }
とすると、下記のようなタグが発行されます。
<meta content="product" property="twitter:card" />
<meta content="@twitter_id" property="twitter:site" />
<meta content="www.sample.com" property="twitter:domain" />
<meta content="BrandA - ItemA" property="twitter:title" />
<meta content="説明AAAAA" property="twitter:description" />
<meta content="http://www.sample.com/item-img.jpg" property="twitter:image" />
<meta content="BRAND" property="twitter:label1" />
<meta content="BrandA" property="twitter:data1" />
<meta content="PRODUCT NAME" property="twitter:label2" />
<meta content="ItemA" property="twitter:data2" />
imageに指定する画像サイズは160 x 160pxが推奨されています。
imageのwidthとheightを指定すると、縦横比を維持してくれるようです。
GitHubの公式サイトをみると下記のようにしてしていますが
:image => {
    :_      => "http://example.com/1.png",
    :width  => 100,
    :height => 100,
  }
下記のように指定した方が、きれいにタグが生成されました。
:image => ["http://example.com/1.png",
  {
    :width  => 100,
    :height => 100,
  }
]

その他

SEOの効果出て欲しいです。
経過を見守ります。

参考サイト

Twitter Card

Railsでテキストのhtmlタグを削除する方法

RailsのViewでHTMLタグを含んだStringからHTMLたぐだけを削除したい場合、strip_tags を使います。

サンプル

html_str = '<p>test</p>'
strip_tags(html_str)
上記のようにすると、以下の結果が帰ってきます。
test

Bootstrapのテーマサイト Black Tieがかっこいい

Bootstrapのテーマを探している方は、是非こちらのサイトもご覧ください。







Black Tie というサイトです。
有料・無料のテーマがありますが、
無料のテーマでもシンプルながらかっこいいです。
テーマを使わなくても、デザインの参考にもなると思います。

2014年11月13日木曜日

RailsのActive RecordでDISTINCTする方法

商品一覧の中から、重複を除いたブランドIDの一覧を取得したい場合、SQLのDISTINCTの代わりに、
Active Recordではuniqを使います

コード

@items = Item.select('bland_id').uniq

結果

結果として以下のような結果が返却されます
selectしているので、selectに指定したカラムにしかアクセスできません。
<Item bland_id: 3249>
<Item bland_id: 3250>
<Item bland_id: 1737>

使い方

ループでまわした場合は、以下のようにします。
@items.each do |item|
  p item.bland_id
end

2014年11月12日水曜日

Rubyのハッシュでeach_with_indexする方法

Rubyのハッシュでeach_with_indexする方法です。
key_value_hash.each_with_index do |(key, value), i|
  break if i >= limit_count
  p "#{key} => #{value}"
end
下記のようにkey , valueを括弧で囲ってください。
(key, value)

2014年11月11日火曜日

SSL3.0の脆弱性POODLEへの対応

SSL3.0の脆弱性POODLEが騒がれているので、下記のサイトで確認したら、
しっかりアウトでした。
https://www.ssllabs.com/ssltest/index.html
Nginxをつかっているので、nginxの設定でSSL3.0を使わないようにすればOKです。
ssl_protocolsのデフォルトが以下なので
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
以下のように設定変更して、nginxをreload
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
server {
    listen       443;
    server_name          www.example.com;
    ssl                  on;
    ・・・・・
    #ssl_protocols  SSLv2 SSLv3 TLSv1; # POODLE対応
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ・・・・・
}

参考サイト

下記を参考にさせて頂きました。
http://nginx.org/ja/docs/http/configuring_https_servers.html
http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_protocols
http://dev.classmethod.jp/cloud/aws/cve-2014-3566-poodle-issue/

2014年11月10日月曜日

Rails3のasstsのコンパイル速度をturbo-sprockets-rails3を使って改善する

Railsのassetsのコンパイルに時間がかかっていたので、改善するために、下記のGemを試してみました。
GitHub - ndbroadbent/turbo-sprockets-rails3
変更があった、assetsのみ再コンパイルしてくれるので、時間が短縮されます。
Rails4からは、この方法が採用されているみたいです。

インストール

Gemfileのassetsグループに下記を入れて、bundle install
group :assets do
  ...
  # turbo-sprockets-rails3
  # https://github.com/ndbroadbent/turbo-sprockets-rails3
  gem 'turbo-sprockets-rails3'
end

有効期限設定

assetsファイルに有効期限をつける場合は、以下のように設定します。
下記では2週間の設定を行っています。
config/environments/production.rb
config.assets.expire_after 2.weeks
インストール&設定は以上なので、とても簡単です。

実行結果

実際に動かしてみたところ、以下のように改善されました。
これだけで、成果がでるのでありがたいです。

環境A

約 55秒 => 30秒

環境B

1分56秒 => 1分6秒

2014年11月8日土曜日

RailsにWebアイコンフォント Font Awesomeを導入する方法

Webアイコンフォント Font Awesomeの導入方法です。
フォントのアイコンなので、簡単に使えて便利でしかも、かっこ良くなります。
今回は、GitHub - bokmann/font-awesome-railsを使って、導入します。

インストール

gemの追加

Gemfileに下記を追加して、bundle install します。
Gemfile
# font-awesome
# https://github.com/bokmann/font-awesome-rails
gem "font-awesome-rails"

cssの読み込み

application.css
/*
 *= require font-awesome
 */
以上で完了です。簡単です。

使い方

こんな感じです
Link <i class="fa fa-external-link"></i>
あとの使い方は、font-awesomeと変わらないので、公式の使い方 を参照して頂ければと思います。

Rubyで文字列からTime型に変換する方法

任意の時間のTime型のオブジェクトを生成したい場合は、parse関数を利用します。
こんな感じ。
order_t = Time.parse('2014-11-08 12:34:30 +0900')
指定する時間の部分は、日本なので、+0900しています。
日時だけでなく、UTCの考慮もお忘れなく
ちなみに、他の時間関係の型も使えます。

Date型

order_d = Date.parse('2014-11-08')

DateTime型

order_dt = DateTime.parse('2014-11-08 12:34:30 +0900')

2014年11月7日金曜日

Rubyで現在時刻と特定の時間を判定する方法

今日の15時までなら、当日出荷、15時以降なら翌日出荷なんてことをしたい時に
Rubyで判定するロジックです。
if Time.now.beginning_of_day + 15.hours <= Time.now
    ## 当時つ出荷の処理
else
    ## 翌日出荷の処理
end
様は、今日の00:00を取得して、それに15時間足してやります。

2014年11月6日木曜日

Googleアナリティクスのイベント トラッキングを設定する方法

Googleアナリティクスでクリックしたボタンを計測したい時など、イベントトラッキングを設定することで、計測が可能になります。

jQueryでの実装

コードは以下のようになります。

$('.button').on('click', function() {
  ga('send', 'event', 'button', 'click', 'nav-buttons', 4);
});

ga 関数の send コマンドを利用します。


旧バージョンはこちら

  $('.button').on('click','a',function(event) {
        _gaq.push(['_trackEvent', 'button', 'click', 'nav-buttons', 4])
  });

オプション

必須 説明
Category String 通常は操作対象のオブジェクト(例: button)。
Action String 操作の種類(例: click)。
Label String イベントの分類に便利(例: nav-buttons)
Value Number 正数値を指定する必要があります。

2014年10月31日金曜日

Railsでsitemap_generator使ってS3にサイトマップを作成する方法

Railsでサイトマップを作成して、登録する方法です。
サイトマップの生成は、GitHub - kjvarga/sitemap_generatorのGemを利用して行います。
また、サイトマップ自体はアマゾンのS3に保存しておきます。

インストール

Gemfileに下記を追加して、bundle install

gem 'sitemap_generator'

設定ファイルの作成

下記を実行して、config/sitemap.rb を作成します。

rake sitemap:install

サンプルコード

本来であれば、上記で生成されたconfig/sitemap.rbに設定を書けばよいと思いますが、
rakeでサイトマップ生成とS3のアップロードを行うようにしました。

コードは以下のような感じです。

  namespace :batch do
    desc 'サイトマップを作成して、S3にアップする。'
    task :create_site_map => :environment do |task|
      success_msgs = []
      success_msgs << 'success'

      batch_start_at = Time.now
      puts "run #{task.name} with env: #{Rails.env} : #{batch_start_at}"

      begin

        SitemapGenerator::Sitemap.default_host = 'http://ore-tech.blogspot.jp/'
        SitemapGenerator::Sitemap.public_path = 'tmp/'

        SitemapGenerator::Sitemap.adapter = SitemapGenerator::S3Adapter.new({
            :aws_access_key_id    => 'xxxxxxxxxxxxxxxxxxxxxxxxx',
            :aws_secret_access_key => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
            :aws_region            => 'ap-xxxxxxx-1', # リージョン 東京の場合、ap-northeast-1
            :fog_provider          => 'AWS',
            :fog_directory         => 'bucket-name' # bucket name
        })
        SitemapGenerator::Sitemap.sitemaps_host = 'http://bucket-name.s3-ap-xxxxxxx-1.amazonaws.com'

        site_maps_path = 'sitemap/'
        unless Rails.env == 'production'
          site_maps_path = "sitemap/#{Rails.env}/"
        end

        SitemapGenerator::Sitemap.sitemaps_path = site_maps_path

        SitemapGenerator::Sitemap.create do

          # home
          add '/home', :changefreq => 'daily', :priority => 0.9

          # contact 
          add '/contact_us', :changefreq => 'weekly'

          # Blog
          group(:sitemaps_path => site_maps_path, :filename => 'blog') do
            Blog.all.each do |blog|
              add blog.url, lastmod: blog.updated_at
            end
          end

        end

        if Rails.env == 'production'
          SitemapGenerator::Sitemap.ping_search_engines
        end

        batch_end_at = Time.now
        puts "end time : #{batch_end_at}"
        puts "Processing time #{batch_end_at - batch_start_at}"

      rescue => e
        puts "error occurred batch : #{Time.now}"
        puts "error occurred batch : #{e.message}"
      end

    end
  end

サイトマップ生成の設定

サイトマップ生成の設定は、主に下記の部分で行っています。

SitemapGenerator::Sitemap.default_host = 'http://ore-tech.blogspot.jp/'
SitemapGenerator::Sitemap.public_path = 'tmp/'

SitemapGenerator::Sitemap.adapter = SitemapGenerator::S3Adapter.new({
    :aws_access_key_id    => 'xxxxxxxxxxxxxxxxxxxxxxxxx',
    :aws_secret_access_key => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    :aws_region            => 'ap-xxxxxxx-1', # リージョン 東京の場合、ap-northeast-1
    :fog_provider          => 'AWS',
    :fog_directory         => 'bucket-name' # bucket name
})
SitemapGenerator::Sitemap.sitemaps_host = 'http://bucket-name.s3-ap-xxxxxxx-1.amazonaws.com'

site_maps_path = 'sitemap/'
unless Rails.env == 'production'
  site_maps_path = "sitemap/#{Rails.env}/"
end

SitemapGenerator::Sitemap.sitemaps_path = site_maps_path

上記設定を行った場合、下記の場所にサイトマップ用のファイルが生成されます。

application側

/tmp/sitemap/blog.xml.gz
/tmp/sitemap/sitemap.xml.gz
/tmp/sitemap/sitemap1.xml.gz

S3側

/bucket-name/sitemap/blog.xml.gz
/bucket-name/sitemap/sitemap.xml.gz
/bucket-name/sitemap/sitemap1.xml.gz

また、下記を行っているので実行されるenv環境によって、生成されるファイルの場所が異なります。

site_maps_path = 'sitemap/'
unless Rails.env == 'production'
  site_maps_path = "sitemap/#{Rails.env}/"
end

production => /bucket-name/sitemap/
staging => /bucket-name/sitemap/staging/blog.xml.gz
development => /bucket-name/sitemap/development/blog.xml.gz

サイトの登録

主には以下の部分で、ページを登録しています。
add メソッドでページ単位で登録していきます。

SitemapGenerator::Sitemap.create do

   # home
   add '/home', :changefreq => 'daily', :priority => 0.9

   # contact 
   add '/contact_us', :changefreq => 'weekly'

   # Blog
   group(:sitemaps_path => site_maps_path, :filename => 'blog') do
     Blog.all.each do |blog|
       add blog.url, :lastmod => blog.updated_at
     end
   end

 end

addメソッドのオプション

:changefreq

ページの予想される更新頻度
デフォルトは、weekly

設定可能な値は以下の通り

  • always:アクセスがあるたびに内容を更新するページに使用します。
  • hourly
  • daily
  • weekly
  • monthly
  • yearly
  • never: アーカイブ ページの URL に使用します。

:priority

サイト内のURLの優先順位を指定します。
0.1(重要でない)~1.0(重要)の範囲で指定します。
デフォルトは 0.5

ここの数値で、掲載順位には影響はないようです。

:lastmod

最終更新日を指定します
デフォルトは Time.now 現在日時

:host

ホストを指定します。
デフォルトはdefault_hostの値。
loginページなど、https://xxxxxなどに変更したい時などに使えると思います。

:expires

有効期限を設定可能です。

group

groupを使うことで、別ファイルで管理することができます。

サイトマップの登録

routes.rb

Googleのウェブマスターツールに /sitemapと登録させるために
routes.rbでS3のサイトマップのパスへリダイレクトさせます。

 match '/sitemap'  =>  redirect('http://backet-name.s3.amazonaws.com/sitemap/sitemap.xml.gz')

robots.txt

検索エンジンのrobot用に以下を追加

Sitemap: http://backet-name.s3.amazonaws.com/sitemap/sitemap.xml.gz

参考サイト

Goolge サイトマップを作成する

2014年10月30日木曜日

wheneverで特定のENV環境のみタスクを追加する方法

RailsのCron管理をしてくれる、Github - javan/whenever
本番環境だけとか、ステージング環境だけcronのタスクを追加という場合の対処方法です。
@environmentをcase文で分岐する方法です。
以下のサンプルコードでは、production環境では、rake ‘batch:rate’が追加されて、staging環境では、rake ‘batch:test:rate’されます。
サンプルコード
case @environment

  # 本番のみタスク
  when 'production'

    every '0 * * * *' do
      rake 'batch:rate'
    end
  when 'staging'
    every '0 * * * *' do
      rake 'batch:test:rate'
    end

end

2014年10月29日水曜日

Postgresで年代毎の人数を集計する方法

Postgresで今日現在の年齢で年代別に集計する方法です。
Userテーブルにbirthdayというtimestamp型のカラムがあると想定します。
SELECT
    CASE
        when date_part('year', age(birthday)) between 1 and 9  then 0
        when date_part('year', age(birthday)) between 10 and 19 then 10
        when date_part('year', age(birthday)) between 20 and 29 then 20
        when date_part('year', age(birthday)) between 30 and 39 then 30
        when date_part('year', age(birthday)) between 40 and 49 then 40
        when date_part('year', age(birthday)) between 50 and 59 then 50
        when date_part('year', age(birthday)) between 60 and 69 then 60
        when date_part('year', age(birthday)) between 70 and 79 then 70
        when date_part('year', age(birthday)) between 80 and 89 then 80
        when date_part('year', age(birthday)) between 90 and 99 then 90
        when date_part('year', age(birthday)) >= 100 then 100
    end AS age_group,

    count(
        case 
        when date_part('year', age(birthday)) between 1 and 9  then 0
        when date_part('year', age(birthday)) between 10 and 19 then 10
        when date_part('year', age(birthday)) between 20 and 29 then 20
        when date_part('year', age(birthday)) between 30 and 39 then 30
        when date_part('year', age(birthday)) between 40 and 49 then 40
        when date_part('year', age(birthday)) between 50 and 59 then 50
        when date_part('year', age(birthday)) between 60 and 69 then 60
        when date_part('year', age(birthday)) between 70 and 79 then 70
        when date_part('year', age(birthday)) between 80 and 89 then 80
        when date_part('year', age(birthday)) between 90 and 99 then 90
        when date_part('year', age(birthday)) >= 100 then 100
        end
    ) AS age_count
FROM user   
GROUP BY age_group
ORDER BY age_group
結果は、以下のようになります。値は適当です。
age_group age_count
0 335
10 515
20 27632
30 65276
40 12572
50 819
60 161
70 31
80 3
90 2
100 1
年代の算出に以下を使っています。
age(timestamp)
これは、現在から引数のタイムスタンプを減算します。
それを年に変換してグループ化しています。
例えば、2014-01-01時点の場合は、age(timestamp, timestamp)を使えば、算出可能です。
age('2014-01-01', birthday)

コマンドで最終更新日が1週間経過したファイルを削除する方法

logdata配下の、最終更新日が7日以上経過したファイルを削除することを想定しています。
find /logdata -maxdepth 1 -type f -ctime +7 -delete
-maxdepth : 最大何階層まで検索するか
-type : f => ファイル
-ctime : 最終更新日が、n日以前かを指定
-delete : 削除

Gitでブランチ名をリネームする方法

ローカルリポジトリ

git branch -m [old-branchname] [new-branchname]
例えば、masterをmaster-orgに変更する場合
git branch -m master master-org

リモートリポジトリ

これが本当によい方法かわかりませんが、以下のように対応しました。
  1. localでリネーム
  2. リネームしたブランチをリモートにpush
  3. リモートから元の名前のブランチを削除
例えば、masterをmaster-orgに変更する場合
git branch -m master master-org
git checkout master-org
git push origin/master-org 
git push origin :master

statistics

Arsip