ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

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

スマホアプリをクロスプラットフォーム開発できる「Xamarin」をMacにインストールしたときの手順です。

環境

OS X 10.11.5
XCode 未インストール

手順

1.Xamarinダウンロードページにアクセスします。
www.xamarin.com


2.全項目を入力し、チェックボックスにチェックを入れ、ダウンロードボタンをクリックします。
f:id:shinsuke789:20160628170243p:plain


3.「XamarinInstaller.dmg」のダウンロードが開始されます。


4.ダウンロードが完了したら、dmgファイルを実行し、表示されたアイコンをダブルクリックします。
f:id:shinsuke789:20160628170334p:plain


5.Webからダウンロードしたので「開く」をクリックします。
f:id:shinsuke789:20160628170401p:plain


6.「同意する」にチェックします。
f:id:shinsuke789:20160628170415p:plain


7.インストールの準備中でしばらく待ちます。
f:id:shinsuke789:20160628170434p:plain


8.インストールするプロダクトを選択します。
f:id:shinsuke789:20160628170448p:plain


9.設定のインストール先を設定します。
f:id:shinsuke789:20160628170504p:plain


10.XCodeがインストールされていない場合のお知らせです。
f:id:shinsuke789:20160628170520p:plain


11.インストールされるプロダクトの一覧です。
f:id:shinsuke789:20160628170541p:plain

12.Android SDKのライセンスに同意します。
f:id:shinsuke789:20160628170556p:plain


13.Macのパスワードを入力します。
f:id:shinsuke789:20160628170607p:plain


14.インストールが開始されるので待ちます。
f:id:shinsuke789:20160628170624p:plain


15.インストールの進捗バーがなくなりますが、インストール中で、3回程Macのパスワードが求められるので入力します。
f:id:shinsuke789:20160628170654p:plain


16.インストールが完了しました。XCodeがインストールされていな場合、「インストールしてね」と表示されます。
f:id:shinsuke789:20160628170708p:plain


17.アプリケーションフォルダの「Xamarin Studio.app」を起動します
f:id:shinsuke789:20160628170922p:plain

f:id:shinsuke789:20160628171035p:plain

登録後に届くメール

以下の様なメールが届きます。
最終行に配信停止のリンクがあるので不要であればそこから手続きします。

Hi


Thanks for downloading Xamarin Studio! We just wanted to point you to a few key resources to help you get started quickly:

  • Cross-platform development with Xamarin Studio
  • Prebuilt Apps
  • Xamarin Developer Center


If you have any questions, please post them here in StackOverflow and our support team will answer them as quickly as they can.


Warm regards,


Unsubscribe from Xamarin marketing emails.
Team Xamarin

「doma-spring-boot-starter」を使ってSpringBootとDomaの連携を楽にする

JavaのDBアクセスフレームワーク「Doma2」にSpringBootと連携し自動で設定してくれる「doma-spring-boot-starter」が追加されました。

今までは独自にDoma用のクラスを作成し連携していましたが、それをする必要がなくなり導入と設定が楽になりました。


github.com

doma-spring-boot-starter」の適用概略

1.build.gradleに「https://oss.sonatype.org/content/repositories/snapshots」のリポジトリを追加する

2.build.gradleに「org.seasar.doma.boot:doma-spring-boot-starter」の依存を追加する

3.application.propertiesに必要であればdoma用の設定を追加する

doma-spring-boot-starter」を使うことでdoma設定クラスが不要になります。
application.propertiesdoma.namingを追加することで、@EntityNamingTypeの定義が不要になります。

サンプルコード

build.gradle

repositories {
	mavenCentral()
	// 追記
	maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
}

dependencies {
	// 追記
	compile('org.seasar.doma.boot:doma-spring-boot-starter:1.0.2')
	// 削除
	//compile('org.seasar.doma:doma:2.6.2')
}

src/main/resources/application.properties

# DB
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:test_db
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver

# DOMA
doma.dialect=ORACLE
doma.naming=SNAKE_LOWER_CASE

src/main/java/com.example.dao.EmpDao

package com.example.dao;

import java.util.List;

import org.seasar.doma.Dao;
import org.seasar.doma.Select;
import org.seasar.doma.boot.ConfigAutowireable;

import com.example.entity.Emp;

@ConfigAutowireable
@Dao
public interface EmpDao {

	@Select
	List<Emp> findAll();
}

src/main/java/com.example.entity.Emp

package com.example.entity;

import java.util.Date;

import org.seasar.doma.Entity;
import org.seasar.doma.Id;

// application.propertiesの「doma.naming」で指定済みなので不要
//@Entity(naming = NamingType.SNAKE_LOWER_CASE)
@Entity
public class Emp {

	@Id
	public String empNo;

	public String empNm;
}

src/main/java/com.example.web.TestController

package com.example.web;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.example.dao.EmpDao;
import com.example.entity.Emp;

@Controller
public class TestController {

	@Autowired
	private EmpDao empDao;

	@RequestMapping("/test")
	public String index() {

		List<Emp> list = empDao.findAll();
		for (Emp emp : list) {
			System.out.println(emp.empNo);
		}

		return "test/test";
	}

さくらのレンタルサーバーでCodeigniterを使いHTTPアクセスをHTTPSに強制リダイレクトする.htaccessの書き方

さくらのレンタルサーバーでHTTPアクセスをHTTPSに強制リダイレクトするのにかなりハマりました。

ネットでひたすらHTTPSにリダイレクトする方法を調べ試してみましたが、リダイレクトループばかりで全く実現できず。

最終的にさくらの仕様のせいで通常の設定が効かないということが分かりました。

困っている方、コードをコピペしてさっさと解決してしまいましょう。

環境

サーバー さくらのレンタルサーバー スタンダード
Codeigniter 3.0.3
PHP 5.4

有効な「.htaccess」の設定

RewriteEngine On

# HTTP->HTTPSリダイレクト設定
RewriteCond %{ENV:HTTPS} !^on$
RewriteCond %{HTTP:X-SAKURA-FORWARDED-FOR} ^$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Codeigniterの設定
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]


さくらの共有SSL、独自SSLとも上記設定でHTTPSリダイレクトが可能です。

%{ENV:HTTPS}と%{HTTP:X-SAKURA-FORWARDED-FOR}がミソです。


次のサイトで詳しく説明があり大変助かりました。
furyu.hatenablog.com


上記サイトより引用です。

%{SERVER_PORT} には、SSLかそうでないかによらず '80' が設定される。
このため、%{SERVER_PORT}ではSSL接続かどうかの判別はできない。
「RewriteCond %{SERVER_PORT} ^80$」や「RewriteCond %{SERVER_PORT} !^443$」は常に真となるために、リダイレクトループが発生してしまう。

SSLアクセス時には通常、 %{ENV:HTTPS} には 'on' が、%{HTTP:X-Sakura-Forwarded-For} にはクライアント(リクエスト元)のIPアドレスが設定される。*1
ただし、SSLアクセスした場合であっても、mod_rewrite.c の RewriteRule によりリライトされるケースでは、リライト後には %{ENV:HTTPS} が未設定となってしまう。
RewriteRuleの[R]フラグによりhttps://〜にリダイレクトされた場合には 'on' が設定される。

まとめ

さくらのレンタルサーバーでは独自仕様があるのでまずそれを確認すること。
Codeigniterで他にフックを使った方法があるが、この仕様を考慮したPHPコードを書く必要がある。
めんどくさいと思ったら.htaccessで設定した方が簡単!


サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)

さくらレンタルサーバーではRuby on Railsは動作するけどレスポンスが糞遅いのでやめとけ

タイトルの通りの内容で、さくらレンタルサーバーRailsは糞遅いというお話です。

経緯

ホームページを作成する案件があって、それに付随するプログラムの開発がありました。
ホームページを動作させるのがメインだったので、レンタルサーバーが選択されました。

個人的にPHPが嫌い(Java育ちなのでPHPの曖昧さがなじめない)なのでそれ以外の言語はないのかとRubyを選択しました。

初めてのRuby on Railsでしたが、Java経験者からすると今までにない感じのプログラミングだったので、非常に楽しくワクワクしながら開発できました。

Ruby on Rails動作環境構築

さて、ひと通り出来上がったのでテストしてもらうために、動作環境であるレンタルサーバーRuby on Railsが動作する環境を構築しました。

事前に動作するというのは確認できていたので、いろんなサイトを参考にしながら試行錯誤で環境を構築しました。

この時点で、レスポンスが遅いというのは情報として知ってました。

でも、本当に遅いのかというのがわからなかったのと、FCGIだと速いという情報もあったので大丈夫だろうと思ってました。

デプロイ

環境の構築も完了したのでデプロイしていました。

トップページにアクセスしてみると、なかなか画面が表示されません。
何度やっても遅い、遅い、遅い。

確か画面表示に10秒以上かかってたと思います。

「これはあかん」ということで、PHPで最初から作りなおしました…。

構築手順

かなり日にちが経っててよく覚えてませんが、当時のメモをそのまま載せておきます。ものすごく適当です。

お遊びで構築したい人向けです。間違っても本番運用しないで下さい。泣くのは開発者であるあなたです。


1.wwwディレクトリと同階層にappディレクトリを作成する

2.appディレクトリにRailsプロジェクトを配置する

3.Rails/publicに.htaccessを作成する

RewriteEngine On
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]

ErrorDocument 500 "Application errorRails application failed to start properly"

4.Rails/publicにdispatch.cgiを作成し、権限を755にする

#!/home/user/local/rbenv/versions/2.2.3/bin/ruby

# 本番環境設定
ENV["RAILS_ENV"] = "production"
# rake secretで生成したもの
ENV["SECRET_KEY_BASE"] = "7cd8a5e38cfeddd0d0a4b45ad4bf75fd2cffe124f43388c34e6f29cf2c2e78f7d9cc1b2003f913be65c54f6ec61c7032609d3c9d88d6b3dc5226925a825b8379"
# 静的ファイル
ENV["RAILS_SERVE_STATIC_FILES"] = "true"

require File.dirname(__FILE__) + '/../config/environment'

class Rack::PathInfoRewriter
  def initialize(app)
    @app = app
  end
  def call(env)
    env.delete('SCRIPT_NAME')
    parts = env['REQUEST_URI'].split('?')
    env['PATH_INFO'] = parts[0]
    env['QUERY_STRING'] = parts[1].to_s
    env['PATH_INFO'] = env['PATH_INFO'].gsub(/\A#{ENV['RAILS_RELATIVE_URL_ROOT']}(.*)\Z/, '\1')
    env['SCRIPT_NAME'] = ENV['RAILS_RELATIVE_URL_ROOT']
    @app.call(env)
  end
end
# アプリケーション名を設定する
Rack::Handler::CGI.run  Rack::PathInfoRewriter.new(Hoge::Application)

5.Rails/config/boot.rbに以下を追記する

ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)

require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])

$LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib/ruby/2.2.0')
$LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib/ruby/site_ruby/2.2.0')
$LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0')
$LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib/ruby')
$LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib')

ENV['PATH'] += ':/home/user/local/bin'

ENV['GEM_HOME'] ||= '/home/user/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0'

# パスを設定する
ENV['RAILS_RELATIVE_URL_ROOT'] = '/hoge'

6.静的ファイルをプレコンパイルする

rake assets:precompile RAILS_ENV=production

7.node.jsを編集する
/local/src/node-v0.10.38/deps/v8/tools/gyp/v8.gyp

['OS=="freebsd"', {
    'include_dirs+':[
      '/home/user/local/include'
    ],
    'link_settings': {
      'libraries': [
        '-L/usr/local/lib -L${HOME}/local/lib -lexecinfo',
    ]},
    'sources': [
      '../../src/platform-freebsd.cc',
      '../../src/platform-posix.cc'
    ],
  }
],

FCGI対応

$ cd ~/local/src
$ wget http://www.fastcgi.com/dist/fcgi.tar.gz
$ tar xvzf fcgi.tar.gz
$ cd  fcgi-2.4.1-SNAP-0311112127
$ ./configure --prefix=$HOME/local CFLAGS="-g -O2 -Wall -fPIC" CXXFLAGS="-g -O2 -Wall -fPIC"
$ make
$ make install

#### $ gem install fcgi -- --with-fcgi-include=$HOME/local/include --with-fcgi-lib=$HOME/local/lib
$ cd ~/appdir
$ bundle exec gem install fcgi -- --with-fcgi-include=$HOME/local/include --with-fcgi-lib=$HOME/local/lib
$ vi Gemfile
   追記 gem 'fcgi'
$ bundle update

まとめ

さくらレンタルサーバーでは、Ruby on Railsは動作するが、レスポンスが糞遅いのでやめましょう。

レンタルサーバーというと全てのサーバーをイメージされると思いますが、root権限のない制約のあるレンタルサーバーのことです。
さくらのVPS等root権限のあるサーバーでは、普通に動作しますので勘違いされないようにお願いします。

さくらレンタルサーバーでPHPからベーシック認証を行うと入力値が取得できない対処方法

さくらレンタルサーバーPHPでベーシック認証を実装し、対象のページにアクセスするとIDとパスワードを入力するダイアログが表示されます。

ここでID、パスワードを入力しても認証できない現象に遭遇し困ったので、その時の対処方法を説明します。

環境

サーバー さくらレンタルサーバー
PHPフレームワーク Codeigniter 3

手順

Codeigniterの配下にある「.htaccess」を次のように編集します。

変更前

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

変更後

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

さくらレンタルサーバーにMercurialをインストールする

f:id:shinsuke789:20141003110840p:plain

さくらのレンタルサーバーMercurialをインストールした時の手順です。


1.ホームディレクトリ内に「local」ディレクトリを作成する

$ mkdir ~/local


2.ホームディレクトリ内に「tmp」ディレクトリを作成する

$ mkdir ~/tmp


3.Mercurialのソースを公式サイトよりダウンロードし、「tmp」ディレクトリに置き、解凍する

公式サイトでは、「Mercurial 3.7.2 source release」の記載欄にあるリンクからダウンロードします。

$ cd ~/tmp
$ wget http://mercurial.selenic.com/release/mercurial-3.7.2.tar.gz
$ tar xvzf mercurial-3.7.2.tar.gz


4.Mercurialをインストールする

さくらレンタルサーバーでは、Pythonがデフォルトでインストールされています。

$ cd mercurial-3.7.2
$ python setup.py installhome=$HOME/local —force


5.インストールされたか確認する

$ hg version

Mercurial Distributed SCM (version 3.7.2)
(see https://mercurial-scm.org for more information)

Copyright (C) 2005-2016 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

VMware Fusionでサブネットアドレスと固定IPアドレスを画面から設定する

以前に設定ファイルを修正してゲストOSのIPアドレスを固定する方法を紹介しました。

shinsuke789.hatenablog.jp

MacのOSをクリーンインストールでバージョンアップして仮想環境を移行しました。
その時にIPアドレスの構成が変わってしまったので変更する必要がありました。
設定ファイルの修正では上手くいかなかったので、画面の設定から変更する手順で設定する方法を紹介します。
こちらの方が簡単に設定できるのでおすすめです。

参考サイト

調べていると公式サイトにヒントとなる記事がありました。
kb.vmware.com

最後辺りに次のような記述があり画面から設定できるようなことが書いてありました。

To access the network editor:

1. Click VMware Fusion in the menu bar.
2. Click Preferences.
3. Click Network.
4. Click the + sign located at the bottom right to add a custom network connection.

環境

仮想環境 VMware Fusion 8.1.0
ゲストOS CentOS 6.4 (x64)
ホストOS Mac OS X 10.11.2

設定の流れ

1.VMware Fusionの環境設定でネットワーク構成を追加する
2.VMware FusionでのゲストOSのネットワーク設定で1のネットワーク構成を選択する
3.ゲストOS内のネットワーク設定で固定IPアドレスを設定する

手順

VMware Fusionの設定

1.VMware Fusionを起動しファイルメニューの「VMware Fusion」→「環境設定」をクリックします
f:id:shinsuke789:20151231205248p:plain

2.ネットワークをクリックし、画面下部の鍵アイコンをクリックします
f:id:shinsuke789:20151231205218p:plain

3.パスワードを聞かれるのでMacの管理者パスワードを入力します
f:id:shinsuke789:20151231205142p:plain

4.「+」ボタンをクリックして構成を追加します(vmnet2が追加される)
f:id:shinsuke789:20151231205231p:plain

5.1つ目と3つ目にチェックを入れ、サブネットIP、サブネットマスクに任意の値を入力し適用します
f:id:shinsuke789:20151231205238p:plain

VMware FusionでのゲストOSの設定

1.仮想マシン一覧画面でゲストOSを選択し設定ボタンをクリックします
f:id:shinsuke789:20151231205300p:plain

2.「ネットワークアダプタ」をクリックします
f:id:shinsuke789:20151231205308p:plain

3.VMware Fusionの設定で追加した構成(vmnet2)を選択します
f:id:shinsuke789:20151231205320p:plain

ゲストOS内での設定

1.ネットワーク接続を起動します
f:id:shinsuke789:20151231205101p:plain

2.「Auto eth1」を選択し「編集」をクリックします
f:id:shinsuke789:20151231205115p:plain

3.「IPv4のセッティング」で方法を「手動」、アドレスに固定IPアドレスDNSDNSサーバーアドレスを入力します
ゲートウェイDNSの末尾は設定ファイルを見る限り「2」が使用されています。
f:id:shinsuke789:20151231205124p:plain

4.ゲストOSを再起動します

疎通確認

1.ホストOSからゲストOSにpingを実行し疎通を確認します

2.ゲストOSからホストOSにpingを実行し疎通を確認します

まとめ

この方法だと仮想環境上に全て設定がされているので、設定ファイルのバックアップを忘れても再設定が簡単です。
画面上での設定なのでやりやすいのも良いところです。


プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化