いつかエンジニアになりたい

Nothing is too late to start

[日記] 何かが変わる気がするのでブログを書こうと思う

タイトル通り、ふと唐突に、2016年はブログを書こうと思った。

まだ、2015年はあと1ヶ月以上残っているので振り返るというのは少し早い気もするが、こういうのは早いほうがいい。

会社に入り、あっという間に4年がたち、年齢としても28歳。

大学を卒業する時はどんな社会人になってると思ったんだろう。

東京での社会人生活に高揚し、未来の自分にきっと期待していたに違いない。

昔の自分の思いなんて覚えていないけど、ただ1つ今言えることは、何も昔と変わっていない。

毎日に追われて、未来のことなんかこれっぽっちも考えないで、今しか生きていない。

今の自分がそこまでダメかと自問自答すると、そこまでだめなわけではない。

でも、これが自分自身がなりたかった、生きたかった人生で、今この瞬間に誇りを持てるかと言われると黙ってしまう。

きっと何かを変えようと思わなければ、きっとこの先もずっと何も変わらないんだと思う。

誰かの為でもない、自分自身のためにブログを書こうと思う。

Redmine2.3のGmailを利用したメールでのチケット登録方法

Redmineのメールでのチケット登録でつまったので、その時のメモ。

メールでのRedmineのチケット登録方法

Redmineのメールでのチケット登録方法は、大きく分けて以下の3つがありますが、 (1)、(3) は設定するのが面倒だったので、メールアドレスを新規で作るだけの 一番簡単そうな (2) の方法を実施する。

(1) メールサーバからメールを転送:

- 利点: メールサーバがRedmineとは異なるサーバでもよい, メールが即座に処理される, 高速(アプリケーションのリロードが不要)
- 欠点: needs some configuration on your mail transfer agent (eg. Postfix, Sendmail…)

(2) IMAPサーバからの受信:

- 利点: 設定が容易、MTAの設定が不要, メールサーバがRedmineとは異なるサーバでもよい
- 欠点: メールの処理が即座には行われない (定期的にメールの取得を行うためのcronのジョブを追加する必要がある)

(3) 標準入力からのメール読み込み:

- 利点: テスト用途に最適
- 欠点: 遅い(メールが到着するごとにRedmineのアプリケーションのリロードが行われる), MTA上での設定が必要

参考:http://redmine.jp/guide/RedmineReceivingEmails/

Gamilを用いたチケットの登録、通知の設定手順

設定方法としては、IMAPサーバに送られたメールをチェックして、更新があるならメール通知するだけの以下の図の感じ。 f:id:berukann:20131006171009p:plain

設定環境は以下のようになります。

Redmine構築環境
 ・OS:CentOS 6.4
 ・Redmine:2.3.3
Redmineユーザ用アカウント:sender@gmail.com
Redmine用メールアカウント:recever@gmail.com
Redmine 構築手順

Redmine 構築方法は良いサイトがいろいろとあるので割愛。 注意点としては、Ruby 2系だとPassengerがうまく動作しないので、Ruby 1.9.3を使用する。

Gmailアカウント作成し、IMAP機能を有効にする

redmineチケット登録用のIMAPが利用可能なメールアドレスを取得。

色々とあるとは思いますが、私はGmailアカウントを新規に作成しました。

※ デフォルトだとIMAP機能は無効なので、[設定] → [メール転送とPOP/IMAP] → [IMAPアクセス] → [IMAPを有効にする] よりIMAP機能を有効にする。

Gmailアカウントからのチケット登録設定

Redmine登録ユーザのメールアドレス(sender@gmail.com)より、Redmine用メールアドレス(receiver@gmail.com)にチケット登録メールを送る。メールでのチケット登録でも、プロジェクトだけでなく、担当者や優先度など様々な項目をきめれるので、詳細については次のサイトを参照

メールサンプル例:
 宛先:receiver@gmail.com
 件名:チケット登録テスト
 本文:
  チケット登録テストメール。
  start date: YYYY-MM-DD
  assigned to: test

メール送信後、Redmineサーバより以下のコマンドを実行し、Redmineを更新する。

rake -f /var/www/html/redmine/Rakefile redmine:email:receive_imap RAILS_ENV="production" port=993 ssl=1 host=imap.gmail.com username=receiver@gmail.com password=****** project=sample

Rakefileの場所は、自身がインストールしたRedmineRakefileを指定。 ※「username」と「password」は、Redmine用のメールアドレスを指定。 ※「project」は更新するプロジェクトを指定しているので、省略可能。

毎回、redmineに入って、上記のコマンドを実行するのは現実的ではないので、 以下の用に設定ファイルを変更し、cronで定期的に実行。(例:一分毎にコマンドを実行)crontabの設定ファイルにPATHを追加しても、「/usr/bin/env ruby そのようなファイルやディレクトリはありません」というふうに怒られるので、コマンド実行前に「source /root/.bashrc」するシェルスクリプトを作成し、それをcronに登録しました。(20131006 追記)

  • 修正前:
% vim /etc/crontab
 SHELL=/bin/bash
 PATH=/usr/local/bin:/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin
 MAILTO=root
 HOME=/
% crontab -e
 */1 * * * * /usr/local/bin/rake -f /var/www/html/redmine/Rakefile redmine:email:receive_imap RAILS_ENV="production" port=993 ssl=1 host=imap.gmail.com username=receiver@gmail.com password=****** project=sample
  • 修正後:
% vim CronFile/redmine_mail.sh
#!/bin/bash
 source /root/.bashrc
 rake -f /var/www/html/redmine/Rakefile redmine:email:receive_imap RAILS_ENV="production" port=993 ssl=1 host=imap.gmail.com username=receiver@gmail.com password=****** project=sample
% crontab -e
 */1 * * * * /root/CronFile/redmine_mail.sh
% service crond restart
Gmailアカウントからの通知設定

以下の用に設定することで、チケットが登録、更新された際にRedmineGmailアカウントからRedmineユーザに通知がいく。

  • Redmineの[管理] → [設定] → [メール通知] → [送信元メールアドレス] → receiver@gmail.com

  • Redmineの設定ファイルを以下のように変更

% vim /root/redmine/config/configuration.yml
 production:
     email_delivery:
       delivery_method: :smtp
     smtp_settings:
       enable_starttls_auto: true
       address: "smtp.gmail.com"
       port: 587
       domain: "smtp.gmail.com"
       authentication: :plain
       user_name: "receive@gmail.com"
       password: "******"

これで、通知がきたメールに返信するだけで、チケットが更新されるので、便利。

以上

InstagramAPIを利用して特定のユーザの最新画像を表示する iPhoneアプリを作成①

InstagramAPIを利用して特定のユーザの最新画像を表示するiPhoneアプリを作成してみた。

InstagramAPIを利用するためにクライアントIDを取得

InstagramAPIを利用するためにまず、http://instagram.com/developer/ にアクセス。
アプリケーション登録を行って、クライアントIDを取得する。

f:id:berukann:20130612011546p:plain

登録方法の詳細については、わかりやすいページが既に多数あるため割愛。
Instagram APIからデータをもってくる | フローズンブラウニー

WEBSITEなどは適当にlocalhostで登録し、以下の様にクライアントIDを取得。

f:id:berukann:20130612012411p:plain

最新画像を取得する特定のユーザを決定

適当にInstagramをやっている特定のユーザを探す。
自分の場合、インスタグラム(Instagram)【芸能人・著名人100人】 - NAVER まとめ より、一番上にあったきゃりーぱみゅぱみゅさんに決定。

特定のユーザの最新の投稿をもってくるURLを取得

自分の場合、きゃりーぱみゅぱみゅさんのUSERIDを探す。
先ほどのInstagram Developerページに戻り、左横のAPIコンソールをクリック。
API実行にユーザ認証が必要なため、Authentication->OAuth2をクリック。

f:id:berukann:20130612013543p:plain

Sign in with instagram をクリック。

f:id:berukann:20130612013552p:plain

Authenticationのところに、 Instagram-AuthenticatedUserと表示されていることを
確認し、ユーザを検索する user/search をクリック。

f:id:berukann:20130612013559p:plain

Parameter=qのValueに検索したいユーザ名(例:kyarypamyupamyu)を入力し、
右上の Send をクリック。

f:id:berukann:20130612013606p:plain

そうすると以下のように、HTTP/1.1 200 OKとなっていたら成功。
出力された結果から、ユーザのIDを探す。

f:id:berukann:20130612013612p:plain

きゃりーぱみゅぱみゅさんのUSERIDが「16213907」であることがわかった。
先ほどの同様に、users/{user-id}/media/recent に
user-idのvalueを先ほどのIDを入力したURLが、最新の投稿を持ってくるURLになる。
自分の場合は以下のURL。
https://api.instagram.com/v1/users/16213907/media/recent

次回は、最新の投稿を持ってくるURLを用いて、
iPhoneアプリに表示する部分を説明する。

以上

Amazon Product Advertising API を利用してみる

Amazonの商品情報をAPIから取得できるかどうかを試してみる。

Amazon Product Advertising API とは

Amazonの商品情報を利用して独自のEコマースサイトを作成するためのAPI群。
これにより、APIを叩くだけでAmazonの商品情報をはじめ、様々な情報を取得できる。

Amazon Product Advertising API を利用する

詳細については、以下のサイトが非常に分かりやすいので、参考にしてください。
Amazon Web サービス入門(Product Advertising API)

APIを利用する上で必要なもの
  • トラッキングID

 事前にAmazonアソシエイト・プログラムへの参加し、トラッキングIDを取得 *1
 参考:Amazonアソシエイト・プログラムへの参加

  • Access Key ID, Secret Access Key

 Product Advertising API アカウントを作成し、上記のID, Keyを取得
 参考:Access Key IDとSecret Access Keyの取得

Product Advertising APIREST APIなので、XMLが取得できるかどうかだけなら、
ブラウザのURL部分に下記のリクエストを入力すればXMLが取得できるはず。
※AccessKeyID部分を自分のAccess Key IDに置き換える
※プログラムからXMLを取得する際は、署名などを加えたりしてめんどくさい。

http://ecs.amazonaws.jp/onca/xml?
Service=AWSECommerceService
&AWSAccessKeyId=[AccessKeyId]
&Operation=ItemSearch
&SearchIndex=Books
&Title=Harry%20Potter
&Version=2009-07-01
APIを利用してみる
yum -y install httpd php pear
pear install Services_Amazon-0.9.0

※Amazonにリクエストを送る際に、タイムスタンプ、署名を加える必要があるので、今回は、PearServices_Amazonを利用する。

  • Services_Amazonを利用し、リクエストを取得する
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8" />
    <title>Amazon API</title>
</head>
<body>
    <h1>Amazon API</h1>
    <form action="" method="post">
	<input type="text" placeholder="Keyword" name="test">
	<button type="submit" class="btn">Submit</button>
    </form>
	
    <?php
    require_once "Services/Amazon.php";

    $amazon = new Services_Amazon();
    $amazon->setLocale("JP");
    $amazon->setAccessKeyID("****************");
    $amazon->setSecretAccessKey("*************************");
    $amazon->setAssociateID("************");
    $options = array();
    $options['Keywords'] = $_POST['test'];
    $options['Sort'] = 'salesrank';
    $options['ResponseGroup'] = 'ItemIds,ItemAttributes,Images';
	
    $result = $amazon->ItemSearch('Books', $options);
	
    if(!empty($_POST['test'])){
	if (PEAR::isError($result)) { // Error
		$error = $amazon->getError();
		echo $error['Code'];
		echo $error['Message'];
	} else { // Correct
		echo "<pre>";
		var_dump($result);
		echo "</pre>";
	}
    }
    ?>
</body>
</html>

詳しい関数の説明については、Services_Amazon を参照。
XMLで取得したい情報はResponseGroupで指定。

今回はAmazon Product Advertising APIを利用して、商品の検索しか行なっていませんが、他にもカートの追加、削除であったり色々とできるみたいなので、気になる方は調べてみてください。


以上

*1:Amazonアソシエイト・プログラムへの参加の為に、利用するWEBサイトの情報を入力するんだけど、しっかりとしたサイトや目的がないとAmazonの審査が通らない。審査に落ちても確認はできないがAPIは利用できるっぽいので、審査が通らない場合は、トラッキングID, Access Key ID, Secret Access Keyは確認したらメモしといたほうが良い。

Homebrewを使ったMANP環境構築

今さらながらmacportsからhomebrewに乗り換えてみた。

とりあえず以下の環境でPHP, mysql, apacheの環境を揃えた。

PC:Macbook 

OS:Mac OS X lion

パッケージ管理:homebrew

% brew install coreutils
% brew install bash-completion
% brew install curl
% brew install zsh
% brew install readline
# php, mysql, apache
% curl -O https://raw.github.com/ampt/homebrew/php/Library/Formula/php.rb
% mv php.rb `brew --prefix`/Library/Formula
% brew options php
% php
  --with-mysql
% Include MySQL support
  --with-pgsql
  Include PostgreSQL support
% --with-mssql
  Include MSSQL-DB support
% --with-fpm
  Enable building of the fpm SAPI executable
% --with-apache
  Build shared Apache 2.0 Handler module
% --with-intl
  Include intl extension
% --with-readline
  Include readline extension
% brew install php --with-mysql --with-apache --with-readline
# php
% vi /etc/apache2/httpd.conf で以下を追加
LoadModule php5_module    /usr/local/Cellar/php/5.3.10/libexec/apache2/libphp5.so
# mysql
% mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp
% mysql_install_db

いつも分からなくなるので、以下は、設定ファイル、コマンドなど。

php

/user/local/Cellar/php/5.3.10/etc/php.ini

apache

/etc/apache2/httpd.conf
apachectl start (= /usr/sbin/apachectl start)
apachectl stop (= /usr/sbin/apachectl stop)
apachectl restart (= /usr/sbin/apachectl restart)

mysql

/usr/local/Cellar/mysql/5.5.25/bin/mysqld_safe &
/usr/local/bin/mysql.server start
/usr/local/bin/mysql.server stop
/usr/local/local/bin/mysql.server restart    

phpinfo();にアクセスして確認

f:id:berukann:20120621011804p:plain

想像していた通り、元々macに入っているapache2.2を利用してくれてる。

homebrewすげえええええええ。 とりあえずこんな感じ。

 

はてなブログのサイドバーにYoutube貼り付ける

タイトル通りです。自分用のPlayerをブログに。Youtube自体がHTML5ですし、はてなブログのサイドバーは「html」、「javascript」挿入可能なので非常に簡単にできる。 

  1. 管理 -> デザイン

    f:id:berukann:20120619003349p:plain

  2. カスタマイズ -> サイドバー -> モジュールを追加

    f:id:berukann:20120619003406p:plain

  3. 追加したいYotubeの埋め込みコードを挿入 
    <iframeclass="youtube-player"type="text/html"width="200"height="200"src="http://www.youtube.com/embed/3cupbrwhNp0"frameborder="0">
    </iframe>
    ※ 注意点として、画像サイズを200px x 200pxより小さくし過ぎると
    「Video player is too samll.」って言って再生できないので注意。
    参考:YouTube API Blog: Minimum embeds: 200px x 200px

 

一曲だけじゃなくて複数の曲をランダムに流したいと思って検索してみた。

  • javascriptの配列に複数のyoutubeのURLを入れてランダムにする方法
    PARA MI GENTE「複数のyoutube動画を埋め込んでランダム再生する方法」 
  • サイドバー用にリストを作成し、リストを再生する方法
    Youtube ヘルプ
     
    1. [動画の管理] に移動し、[再生リスト] を選択します。
    2. 埋め込む再生リストを選択します。ページの上部にある [共有] ボタンをクリックします。
    3. [共有] タブをクリックして埋め込みコードをコピーします。
    4. そのコードをウェブサイトやブログに貼り付けます。

ブログ用のリストをyoutubeで作って再生するのが一番スマートなのかな。

プレーヤーのカスタマイズとかもできるみたいなので暇な時にカスタマイズしよう。

Youtube API

ニフティクラウド関連の個人的なリンク集

f:id:berukann:20120616222830j:plain

 

基本的にはAPIを利用するために以下のSDKなどのツールが公開されている。

[公式] コマンドラインツール (zip)

コマンドラインツールリファレンス (pdf)

− コマンドラインツールリファレンス

コマンドラインツール 使用例

% cd NIFTY_Cloud_api-tools/bin
% chmod 700 nifty-*
% ./nifty-describe-instances SERVER_NAME -I ACCESS_KEY -S SECRET_KEY
% INSTANCE  SERVER_NAME  xxx.xxx.xxx.xxx  xxx.xxx.xxx.xxx  
running  USER_NAME  mini  2011-03-12T00:00:00+09:00  japan  
disabled xxx.xxx.xxx.xxx  xxx.xxx.xxx.xxx  disk  2  2  static  x86_64  centos
LOADBALANCING  LB  80  80

 

[公式] ニフティクラウド SDK for Java (zip)

ニフティクラウド SDK for Java リファレンス (JavaDoc)

 

[公式] ニフティクラウドSDK for Ruby (zip)

− ニフティクラウド SDK for Ruby リファレンス (RDoc)

ニフティクラウド SDK for Ruby 使用例

% cd NIFTY_Cloud_SDK_for_Ruby/sample/instances
% vi  describe-instances.rb
require 'rubygems'
require File.dirname(__FILE__) + "/../../lib/NIFTY"
require 'pp'

ACCESS_KEY = "ACCESS_KEY"
SECRET_KEY = "SECRET_KEY"

ncs4r = NIFTY::Cloud::Base.new(:access_key => ACCESS_KEY, :secret_key => SECR
ET_KEY)

options = {
  #:instance_id => ["SERVER_NAME"]
}

pp response = ncs4r.describe_instances(options)

% ruby describe-instances.rb

 

[非公式] ニフティクラウドSDK for PHP (zip)

 

以下便利なリンク集。

ニフティクラウド コントロールパネル

ニフティクラウド サーバータイプ・仕様

ニフティクラウド サポート掲示板

NIFTY Cloud ユーザーブログ

ニフティクラウドの技術関連ユーザブログ。

− 起動スクリプトなど便利なスクリプト多数。

− おすすめスクリプト

 ・ニフティクラウド探検隊 起動時スクリプトでサーバーを自動構築してみた。

 ・15分でCakePHP環境を作ってみよう

ニフティクラウド関連 Github

− Githubで「nifty cloud」で検索した結果。

− 2012/06/16 100件以上のプログラムが公開されています。