2015年8月9日日曜日

Gradleでtomcatプロジェクトを作成する

適当なディレクトリ配下で下記コマンドを実行。
※このディレクトリ名がデフォルトではTomcat実行時のコンテキストパスになります。

> gradle init --type java-library

・build.gradleを編集
buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath 'com.bmuschko:gradle-tomcat-plugin:2.2.2'
  }
}
apply plugin: 'war'
apply plugin: 'com.bmuschko.tomcat'
apply plugin: 'com.bmuschko.tomcat-base'

repositories {
    jcenter()
}

dependencies {
    providedCompile 'javax:javaee-web-api:6.0'
    compile 'org.slf4j:slf4j-api:1.7.12'
    testCompile 'junit:junit:4.12'

    def tomcatVersion = '7.0.59'
    tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}",
           "org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}",
           "org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}"
}

・Servletクラスを作成
src/main/java配下にHelloServlet.javaを作成
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet(name="HelloServlet", urlPatterns={"/hello"})
public class HelloServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
    res.getWriter().print("Hellow!!!!");
  }
}

・ウェルカムページを作成
src/main/webapp/index.htmlを作成し適当な文字を入力する

・gradleコマンドを使ってTomcatを起動する
> gradle tomcatRunWar

実行時のログに「The Server is running at http://localhost:8080/hoge」と表示されたら、ブラウザに入力してみましょう。
画面が表示されるはずです。


・warファイルだけ作りたいときは
> gradle war
というコマンドで「build/libs/」配下にwarファイルが作成されます。

MacにGVMでGradleをインストールする

・ターミナルを開いて下記を入力
> curl -s get.gvmtool.net | bash

・コマンドがインストールできているかを確認
gvm version

・下記コマンドで最新のgradleがインストールされます
> gvm install gradle

・もし、gradleのバージョンを変えたいなら
> gvm list gradle
// 表示されたバージョンを確認して
> gvm install gradle {インストールしたいバージョン}

2015年3月21日土曜日

「PHP Warning: Module 'PDO' already loaded in Unknown on line 0」が発生したら

/etc/php.iniの設定がミスっているようです。

pdoのモジュールを複数読み込みさせていると、下記のWarningメッセージが発生するようです。
PHP Warning: Module 'PDO' already loaded in Unknown on line 0

対応方法としては、php.iniのpdoの読み込みを1つにすれば良いようです。

修正前
extension=pdo.so
extension=pdo_mysqlnd.so

修正後
;extension=pdo.so
extension=pdo_mysqlnd.so

※参考URL
原因
https://www.extendwings.com/blog/2013/03/php-output-warning/

解決方法
http://ora.geo.jp/?p=538

2015年3月19日木曜日

sftpの権限だけのユーザを作成する(ディレクトリの制限も)

今回満たしたい要件は下記です
・ssh接続をさせない
・sftp接続は可能
・サーバ内のとあるディレクトリ配下しか利用させない。閲覧もさせたくない。
・umask 002でファイル配置
・ログインはパスワード(鍵ファイルではない)


・まずはユーザを作成します

adduser sftp-user -g www

※-g www はグループを指定しています。
(これは通常のユーザと同じにしてあります。そうすることにより、sftp-userが配置したファイルを通常ユーザが利用できる状態になります。(umask 002の設定しているので))

passwd sftp-user


・それでは、実際に今回の要件を満たす設定をしていきます。
修正するファイルは下記のみです。
/etc/ssh/sshd_config

○sshd_config 1カ所目
Subsystem sftpと記載のある箇所をかきの様に書き換えます。

Subsystem sftp /usr/libexec/openssh/sftp-server

Subsystem sftp internal-sftp -u 002

sftp-serverからinternal-sftpへの変更は、ディレクトリ制限をする都合上こちらのほうが都合がいいという理由です。
-u 002はumask 002という意味になります。
これで、sftpで作成されたファイルはumask 002の状態となります。

○sshd_config 2カ所目
ファイルの最終行に下記を追加してください。

Match User sftp-user
PasswordAuthentication yes
PubkeyAuthentication no
RSAAuthentication no
ChrootDirectory /home/neostage
ForceCommand internal-sftp -u 002


解説
・Subsystem sftp internal-sftp
これは、sftpでディレクトリ制限を付与するときにstfp-serverよりも楽に設定ができる記述のようです。
・Match User ユーザ名
これ以降の設定は、指定したユーザのみ適応されるという記述になります。
・PasswordAuthentication yes
パスワード認証にする
・PubkeyAuthentication no
公開鍵認証しない
・RSAAuthentication no
RSA認証しない
・ChrootDirectory
sftpの際のrootディレクトリとなる。これ以降のディレクトリしか操作出来ない
・ForceCommand internal-sftp -u 002
sftpにinternal-sftpを利用し、umaskを002設定する

上記設定後にsshdを再起動します。
/etc/rc.d/init.d/sshd restart

※再起動時には絶対に接続中の端末はログアウトしないでください。
再起動後は、別のターミナルで接続確認を行い、問題ないことを確認してください。
そうしないと、一生SSHでログインできない環境が出来上がってしまいます!


★上記設定のハマりポイント!
ChrootDirectory で指定しているディレクトリのPermissionには気をつけてください。
必ず、所有者はroot、グループもroot、権限は755で作成してください。
ChrootDirectory で指定している全ての階層のディレクトリが対象です。これをやらないとsftpが使えません!

2014年9月23日火曜日

Ruby on Rails4 で バッチ処理をする(rails runner, whenever)

railsのコマンドでrunnerというコマンドがある
例)
rails runner Tasks::AlertTask.execute
これを利用します。

crontabへの登録はcrontab -eで手書きすることもできるが、モジュール管理もできるのでrubyで書く方法をためします。

・バッチモジュール作成
> vim config/application.rb
config.autoload_paths += %W(#{config.root}/lib) # 追記する
バッチクラス作成
> vim lib/tasks/alert_task.rb
class Tasks::AlertTask

  def self.execute
    puts "Hoge"
  end
end

ちゃんと作成出来たかを確認する。
> rails runner Tasks::AlertTask.execute
Hoge

・スケジュール登録(crontabへの登録手順)
> vim Gemfile
gem 'whenever', :require => false # 追記

> bundle install

config/schedule.rbを作成
> wheneverize .

> vim config/schedule.rb

set :output, "log/cron_log.log" # ログファイルパス
set :environment, :development # 実行環境
every 1.day, :at => '5:00 am' do # 毎日5時に実行
  runner "Tasks::AlertTask.execute" # 実行するタスク(lib/tasks/alert_task.rbのexecuteメソッドを実行)
end

crontab登録
> bundle exec whenever -update-crontab

crontab確認
> crontab -l

もし、実行されなかった場合。
パターン1:
bin/rails:7: undefined method `require_relative' for main:Object (NoMethodError)
と表示される場合はrubyが複数存在する可能性があります。下記にて不要なrubyを消しましょう。
> yum remove ruby

パターン2:
/usr/bin/env: ruby: No such file or directory
と表示される場合は下記を実施。
> vim ~/.bashrc
export PATH=/usr/local/bin:$PATH