パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください -37ページ目

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

会員No.18です。

基本認証(Basic認証)が設定されているWebサービスにアクセスするサンプルコード(JAX-WS 2.0)


public static void main(String[] args) {
TestService testService = new TestService();
TestPort testPort = testService.getTestPort();

// Test Service URL
String serviceUrl = "http://xxx.yyy.com:1234/test/";
((BindingProvider) testPort).getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY, serviceUrl);

// 基本認証ユーザーID
((BindingProvider) testPort).getRequestContext().put(
BindingProvider.USERNAME_PROPERTY, "testuser");

// 基本認証パスワード
((BindingProvider) testPort).getRequestContext().put(
BindingProvider.PASSWORD_PROPERTY, "password");

// Webサービス呼び出し
testPort.xxx();

:
}
こんにちわ。iOSアプリ開発担当の ゆんぼう です。

今回は、Xcode 4.5 の使い方を説明します。
説明する環境は以下の通りです。
・Mac OS X v10.8.2
・Xcode v4.5.2

Xcodeを起動すると、メイン画面が表示されます。
そのメイン画面は、5つの画面で構成されています。

1. ツールバー
2. ナビゲータエリア
3. エディタエリア
4. ユーティリティエリア
5. デバッグエリア


各画面について説明します。

1. ツールバー
プロジェクトの実行及び各エリア表示切り替えを行うことができます。

[Run]は、押下することで、設定されたターゲットでプロジェクトが実行されます。
[Stop]は、実行中のプロジェクトを停止します。


[Scheme]は、ターゲット(実機(iPhone,iPad,iPod)やシミュレータ(iPhone,iPad))を選択することができます。


[Breakpoints]は、設定済みのブレークポイントの有効/無効を切り替えます。


[Editor]は、エディタエリアの表示切り替えが行えます。

「修正前と修正後の2画面表示」は、ソース管理(Git,SVN)を導入するとソースコードの差分が表示されますので便利です。
・左…全体表示
・中…ヘッダーファイルとソースファイルの2画面表示
・右…修正前と修正後の2画面表示

[View]は、各エリアの表示切り替えが行えます。

・左…ナビゲータエリアの表示有無
・中…デバッグエリアの表示有無
・右…ユーティリティエリアの表示有無

[Organizer]は、実機やソース管理などの設定が行えます。


2. ナビゲータエリア
プロジェクト全体の編集を行うことができます。

[プロジェクトナビゲータ]は、プロジェクトのファイルをツリー状に表示します。
ファイルの選択、変更、追加、削除が行えます。この画面を表示する頻度は高いと思います。


[シンボルナビゲータ]は、クラスやメソッド毎に表示します。


[検索ナビゲータ]は、プロジェクト内のキーワード検索や置換が行えます。

プロジェクトが大きくなると頻度が高くなるので覚えておきましょう。
・Find…キーワード検索
・Replace…置換

[問題ナビゲータ]は、Run時のエラーやワーニングを表示します。

エラーやワーニングが表示されないようにプログラミングしましょう。

[デバッグナビゲータ]は、ブレークポイントやクラッシュでプロジェクトが停止した場合に表示されます。
停止した時点のコールスタックが表示されます。


[ログナビゲータ]は、ビルドやエラー発生時の履歴を表示します。

3. エディタエリア
ソースコードの編集を行うことができます。

4. ユーティリティエリア
各ファイルのプロパティ情報や設定を行うことができます。

5. デバッグエリア
デバッグを行うことができます。

実際に簡単なデバッグ操作を行いましょう。
AppDelegate.m の didFinishLaunchingWithOptions メソッドにコードを追加します。

1. エディタエリアで、ブレークポイントを貼ります。


2. ツールバーで[Run]を実行すると、1のブレークポイントを設定した箇所で停止します。(緑の矢印が表示されます。)


3. デバッグエリアの[→](左から3番目)を押下すると、ステップ実行が行えます。


4. ステップ実行で緑の矢印が移動します。


5. デバッグエリアのウォッチ画面を見ると、変数「test」に文字列「test!」が格納されていることが確認できます。


6. 更にステップ実行を行います。NSLogのコードが実行されると、デバッグエリアのログ出力画面にログが出力されます。
こんにちは、中村です。
最終回の今回は、RedmineのプラグインをインストールしてSVN/Gitとの連携できるようにしていきます。

まずはSVN、Gitをインストール、リポジトリの親ディレクトリを作成します。
$ sudo yum install subversion mod_dav_svn git
$ sudo mkdir -p /var/www/repos/{svn,git}
$ sudo chown -R apache:apache /var/www/repos

Redmineとリポジトリの連携ができるプラグイン、SCM Creatorをインストールします。
バージョンは2012/12/24現在の最新バージョン、0.4.2を使っていきます。
$ sudo yum install mod_perl perl-DBI perl-Digest-SHA perl-Digest 今回は-SHA1 perl-DBD-MySQL
$ cd $HOME/temp
$ curl -o redmine_scm-0.4.2.tar.bz2 http://projects.andriylesyukcom/attachments/download/388/redmine_scm-0.4.2.tar.bz2
$ tar xvjf redmine_scm-0.4.2.tar.bz2
$ sudo mv redmine_scm /var/lib/redmine/plugins/redmine_scm
$ sudo chown -R apache:apache /var/lib/redmine/plugins/redmine_scm

SCM CreatorのDBを構築します。
$ cd /var/lib/redmine
$ rvm use 1.9.3-p327@redmine
$ rvmsudo rake redmine:plugins:migrate RAILS_ENV=production

SCM Creatorの設定ファイルを作成します。
production:
  deny_delete: true
  auto_create: false
  svn:
    path: /var/www/repos/svn
    svnadmin: /usr/bin/svnadmin
    url: repos/svn
  git:
    path: /var/www/repos/git
    git: /usr/bin/git
    options: --bare
    url: repos/git
    update_server_info: true
    git_ext: true
  mercurial:
    path: /var/lib/mercurial
    hg: /usr/bin/hg
  bazaar:
    path: /var/lib/bazaar
    bzr: /usr/bin/bzr
    init: init-repository
    log_encoding: UTF-8

development:


Redmine.pmをperlのインクルードパス配下にコピーします。
ちなみに、このRedmine.pmはRedmine 2.0系まではGitを使用するためにpatch当てが必要だったんですが、2.1に上がってからRedmineのtrunkにpatchが反映されて、(少しですが)面倒な作業がなくなってます。
$ cd /var/lib/redmine/extra/svn
$ sudo mkdir -p /usr/lib64/perl5/vendor_perl/Apache/Authn
$ sudo cp /var/lib/redmine/extra/svn/Redmine.pm /usr/lib64/perl5/vendor_perl/Apache/Authn/Redmine.pm

Redmineの設定ファイルを記述します。
PerlLoadModule Apache::Authn::Redmine

# Subversion
<Location /repos/svn>
  DAV svn
  SVNParentPath "/var/www/repos/svn"

  AuthType Basic
  AuthName "Redmine SVN Repository"
  Require valid-user

  PerlAccessHandler Apache::Authn::Redmine::access_handler
  PerlAuthenHandler Apache::Authn::Redmine::authen_handler

  RedmineDSN "DBI:mysql:database=redmine_db;host=localhost"
  RedmineDbUser "redmine_user"
  RedmineDbPass "redmine"
</Location>

# Git
SetEnv GIT_PROJECT_ROOT /var/www/repos/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /repos/git/ /usr/libexec/git-core/git-http-backend/
<Location /repos/git>
  AuthType Basic
  AuthName "Redmine Git Repository"
  Require valid-user

  PerlAccessHandler Apache::Authn::Redmine::access_handler
  PerlAuthenHandler Apache::Authn::Redmine::authen_handler

  RedmineDSN "DBI:mysql:database=redmine_db;host=localhost"
  RedmineDbUser "redmine_user"
  RedmineDbPass "redmine"
  RedmineGitSmartHttp yes
</Location>
httpdを再起動します。
$ sudo /etc/init.d/httpd restart

これでRedmineにアクセスすると、プロジェクトにSVN/Gitのリポジトリが追加できるようになっているはずです。
SVN/Gitクライアントでの認証もRedmineのユーザ/パスワードでできようになっているので、確認してみてください。


尚、プロジェクトがPublic(Redmineでプロジェクト作成時のデフォルト)だと、Redmine.pmが原因で500エラーが発生します。
"Anonymous"Roleの閲覧権限があるかどうかのチェックでコケているので、以下のいずれかの方法で解決できます。
     
  1. Redmineの管理者アカウントでログインし、プロジェクトの"Public"チェックボックスを外す
  2.  
  3. Redmineの管理者アカウントでログインし、"Anonymous"Roleの編集画面で、何も編集せずにSaveボタンをクリック
  4.  
  5. Redmine.pmを以下のように編集し、anonymous_role_allows_browse_repositoryのif文の中で変数チェックを記述
sub anonymous_role_allows_browse_repository {
  my $r = shift;

  my $dbh = connect_database($r);
  my $sth = $dbh->prepare(
      "SELECT permissions FROM roles WHERE builtin = 2;"
  );

  $sth->execute();
  my $ret = 0;
  if (my @row = $sth->fetchrow_array) {
     if (defined($row[0]) && $row[0] =~ /:browse_repository/) { # 変数チェックを追加
      $ret = 1;
    }
  }
  $sth->finish();
  undef $sth;
  $dbh->disconnect();
  undef $dbh;

  $ret;
}

今回の内容は下記のサイトを参考にさせていただいています。
http://mistymagich.wordpress.com/2011/10/19/redmine_and_subversion-git-mercurial-repository
アセンブラが分からないのに、MSILについて調べてみました。

■MSILとは?
MSIL(Microsoft Intermedia Language)とは中間言語のことです。
MSILは.NET環境で使用される、実行可能コードを記述するための中間言語で、プログラミング言語の一種になります。
C++/CLIなどを除く、.NETのプログラムは、コンパイル後に中間言語になり、実行時にネイティブコードになります。
そのため、MSILを学べば、少なからず.NETの知識が深まるのではないかと思います。

■MSILコードを見てみる
初心者がいきなり中間言語を書くのは無理なので、C#で簡単なアプリを作り、それをILに変換してみようと思います。
MSILへの逆アセンブルには、ildasm.exeを使用します。

C#のコードは以下のようにします。

namespace MSIL_1
{
class Program
{
static void Main(string[] args)
{
int n = 5;
Console.WriteLine(n);
}
}
}

上記コードをコンパイルして、実行ファイルを作成します。
作成した実行ファイルを早速、ildasm.exeで実行します。

C:\temp>ildasm MSIL_1.exe

実行すると、GUIが表示され、ツリーが表示されます。
しかし、欲しいのはコードなので、今度はテキストで出力してみます。

C:\temp>ildasm MSIL_1.exe /text

/text オプションを使用するとテキスト形式で、"コンソール上に"表示されます。これまた見にくいので、ファイルに出力したいと思います。

C:\temp>ildasm MSIL_1.exe /out=MSIL_1.il

出力ファイルの拡張子は、ilにします。
ilファイルと同時に、resファイルも作成されます。

以下が、出力されたilファイルになります。
一部自動生成コメントは、削除しています。


// Metadata version: v4.0.30319
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 4:0:0:0
}
.assembly MSIL_1
{
.custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( 01 00 06 4D 53 49 4C 5F 31 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = ( 01 00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) = ( 01 00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = ( 01 00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = ( 01 00 06 4D 53 49 4C 5F 31 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = ( 01 00 12 43 6F 70 79 72 69 67 68 74 20 C2 A9 20 // ...Copyright ..
20 32 30 31 32 00 00 ) // 2012..
.custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string) = ( 01 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = ( 01 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 30 37 62 31 34 61 65 31 2D 61 35 65 66 // ..$07b14ae1-a5ef
2D 34 64 61 36 2D 39 61 37 61 2D 30 32 61 39 62 // -4da6-9a7a-02a9b
61 61 30 32 63 34 66 00 00 ) // aa02c4f..
.custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( 01 00 07 31 2E 30 2E 30 2E 30 00 00 ) // ...1.0.0.0..
.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 29 2E 4E 45 54 46 72 61 6D 65 77 6F 72 6B // ..).NETFramework
2C 56 65 72 73 69 6F 6E 3D 76 34 2E 30 2C 50 72 // ,Version=v4.0,Pr
6F 66 69 6C 65 3D 43 6C 69 65 6E 74 01 00 54 0E // ofile=Client..T.
14 46 72 61 6D 65 77 6F 72 6B 44 69 73 70 6C 61 // .FrameworkDispla
79 4E 61 6D 65 1F 2E 4E 45 54 20 46 72 61 6D 65 // yName..NET Frame
77 6F 72 6B 20 34 20 43 6C 69 65 6E 74 20 50 72 // work 4 Client Pr
6F 66 69 6C 65 ) // ofile

// --- 次のカスタム属性が自動的に追加されました。コメントを解除しないでください -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 02 00 00 00 00 00 )

.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
.hash algorithm 0x00008004
.ver 1:0:0:0
}
.module MSIL_1.exe
// MVID: {2014487B-D438-4882-A6E6-EFE6E79EE04B}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000003 // ILONLY 32BITREQUIRED
// Image base: 0x00300000


// =============== CLASS MEMBERS DECLARATION ===================

.class private auto ansi beforefieldinit MSIL_1.Program
extends [mscorlib]System.Object
{
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// コード サイズ 9 (0x9)
.maxstack 1
.locals init (int32 V_0)
IL_0000: ldc.i4.5
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: call void [mscorlib]System.Console::WriteLine(int32)
IL_0008: ret
} // end of method Program::Main

.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// コード サイズ 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Program::.ctor

} // end of class MSIL_1.Program

次回、ILの基礎を調べながら、ilコードの解析をしてみます。
.NetのWCFについて調べてみました。

■WCFとは何か?
WCF(Windows Communication Foundation)とは、マイクロソフトが.Net Framework 3.0で提供している通信基盤技術です。
ASP.NET Webサービス、Enterprise Services、WSE、System.Messaging、.Net Remotingなどを
統一したものになります。
属性ベースの定義が出来たり、セキュリティ、トランザクションが標準機能になっているのが特徴です。

■WCFの仕組み
WCFを理解するうえで必要な定義を”ABC”といいます。
ABCとは、「Where」・「How」・「What」を示しています。

A(Where):アドレス
アドレスは、どのアドレスに対してメッセージを送るか、どのアドレスでメッセージを受け取るのかを定義します。

B(How):バインディング
バインディングは、どのようにメッセージを送るのか、受け取るのかを定義します。

C(What):コントラクト
コントラクトは、何を通信するのかを定義します。

■とりあえず実装してみる
WCFについて基本的なことを色々調べてはみましたが、いまいち理解が進まなかったので、
実装してみました。

とりあえず、テストが簡単なプロセス間通信を利用するアプリを作ってみました。

アプリ概要は以下の3つです。
WcfServiceContract:コントラクト
WcfClient:メッセージを送信アプリ(Windowsフォーム)
WcfServer:メッセージを受信するアプリ(コンソールアプリ)


using System.ServiceModel;

namespace WcfServiceContract
{
[ServiceContract]
public interface IServiceContract
{
[OperationContract]
void SendMessage(string message);
}
}



using System.ServiceModel;
using WcfServiceContract;

namespace WcfClient
{
public partial class Form1 : Form
{
IServiceContract client = null;

public Form1()
{
InitializeComponent();

// チャネル作成
client = new ChannelFactory(
new NetNamedPipeBinding(),
"net.pipe://localhost/WcfConnection/").CreateChannel();

}

private void button1_Click(object sender, EventArgs e)
{
client.SendMessage(textBox1.Text);
}
}
}



using System.ServiceModel;
using WcfServiceContract;

namespace WcfServer
{
class Program
{
static ServiceHost host = null;

static void Main(string[] args)
{
WcfReceveService server = new WcfReceveService();
server.ReceveEvent += new Action(server_ReceveEvent);

host = new ServiceHost(server);
host.AddServiceEndpoint(
typeof(IServiceContract),
new NetNamedPipeBinding(),
"net.pipe://localhost/WcfConnection/");

host.Open();
Console.WriteLine("Server Opne");
Console.ReadLine();
}

static void server_ReceveEvent(string obj)
{
Console.WriteLine(obj);
}
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
internal class WcfReceveService : IServiceContract
{
public event Action ReceveEvent = null;

public void SendMessage(string message)
{
if (ReceveEvent != null)
{
ReceveEvent(message);
}
}
}
}

今回名前付きパイプで、手軽にプロセス間通信できました。
通信といっても、クライアントは、インターフェイスの関数を呼び出すだけで済むし、
サーバーもインターフェイスを継承したクラスでイベント通知してしまえば、通常のアプリとして実装ができました。
思っていた以上に簡単に実装できて驚きました。

ただ、このクライアントアプリは、少し時間をおき、いきなりサーバーにアクセスするとエラーが発生します。原因は分かりません。
次回は、この原因を調べてみたいと思います。