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

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

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

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

ここでは、iOSアプリを作ってみたい貴方に
iPhoneアプリ「大好き!みなと区」を例にあげて、わかりやすく説明して行きたいと思います。

iOSアプリ開発の流れ
アプリ開発の大まかな流れは以下の通りです。

1. AppleのMacマシンを購入する。
Mac PRO(デスクトップ型)でなくとも、MacBook Air(ノート型)でも開発は十分可能です。
Mac OS Xは最新版にした方が安定します。(最新は 10.8.2)

余談ですが、OS Xのコードネームはネコ科の動物名になっています。
versionコードネーム
10.5Leopard
10.6Snow Leopard
10.7Lion
10.8Mountain Lion

2. Xcode(開発環境)をインストールする。
インストール方法の詳細は次回説明します。
最新版が安定しています。(最新は 4.5.2)

3. プログラミングを行う。
Xcodeのエディタでプログラミングを行います。
プログラミング言語は、Objective-c となります。

4. アプリを実行する。
アプリを実行するためには以下の2通りあります。
・iOSシミュレータ・・・xcodeに付属されていますので、Macだけで動作確認が行えます。
・iPhone,iPod,iPadなどの実機・・・iOSシミュレータよりは、メモリや処理速度の制限が多いので実機テストも必要となります。ただし、実機テストには、「iOS Developer Program」(有料)の登録が必要となります。

5. アプリをデバッグする。
Xcodeにデバッガが付属されています。
ブレークポイントやステップ実行、ウォッチなどが行えます。

6. iOS Developer Program に登録する。
作成したアプリをApple Storeで公開するために
「iOS Developer Program」(有料)の登録が必要となります。
2012/12/11 現在で、年間参加費 8,400円 となります。

7. iTunes Connect に登録する。
Apple Store に表示するアプリの情報を登録します。
アプリ審査(後述)のステータスを確認できます。

8. 作成したアプリをiTunes Connectにアップロードする。

9. アプリ審査
Apple側でアプリの審査が行われます。
審査基準に満たないと、リジェクト(却下)となり、アプリ修正後、再審査が必要となります。

10. Apple Storeで公開

まとめ
・Xcodeは無料ですので、Macマシンさえあれば、プログラミング~iOSシミュレータの実行まで無料で試せます。
・実機で実行やAppleStoreに公開する場合は、「iOS Developer Program」(有料)を登録しましょう。

それでは次回具体的に説明していきます。
Python勉強中のパク太郎です。

以前の記事で、Python3.3でMySQLに接続する準備が出来ましたので、
今回は、実際にPython3.3でMySQLに接続を行いたいと思います。

接続を行う前に、DB、ユーザー、テーブルの作成を行います。

まず、MySQLを使用するために、下記コマンドを実行します。

>mysql -u root -p

パスワードを求められるので、rootユーザーのパスワードを入力します。

MySQLにアクセス出来たので、まずDBを作成します。

今回はpracticeと言うDBを作成しました。

CREATE DATABASE practice CHARACTER SET utf8;


次に、DBにアクセスできるユーザーを作成します。

今回はpakuというユーザーをパスワードpakuで作成します。

アクセス出来るテーブルはDB:practiceの全てのテーブルとします。


GRANT ALL PRIVILEGES ON practice.* TO paku IDENTIFIED BY 'paku' WITH GRANT OPTION;


次に、DB:practiceにテーブルを作成します。
今回はユーザーID,ユーザー名,パスワードをカラムに持つテーブルを作成しました。

USE practice
CREATE TABLE account (user_id int unique, user_name char(16), user_passwd char(41) );


これでテーブルが出来たため、
MySQL Connector/Pythonを使用してPythonからテーブルに対して操作を行います。
操作を行うためのクラスを作成しました。
コードは下記のようになります。
コードをaccountdao.pyという名前で保存します。

import mysql.connector


class AccountDao():
    insert_str = "INSERT INTO account (user_name, user_id, user_passwd) VALUES ('{0}', '{1}', '{2}')"
    delete_ser = "DELETE FROM account WHERE user_id='{0}'"
    select_str = "SELECT {0} FROM account WHERE user_id='{1}'"
    def __init__(self, host_name, db_name, user_name, user_passwd):
        self.host_name = host_name
        self.db_name = db_name
        self.user_name = user_name
        self.user_passwd = user_passwd


    def insert(self, user_name, user_id, user_passwd):
        try:
            con_obj = mysql.connector.connect(host=self.host_name,
                                              database=self.db_name,
                                              user=self.user_name,
                                              password=self.user_passwd)
            con_cursor = con_obj.cursor()
            try:
                con_cursor.execute(self.insert_str.format(user_name, user_id, user_passwd))
                con_obj.commit()
            finally:
                con_cursor.close()
        finally:
            con_obj.close()


    def delete(self, user_id):
        try:
            con_obj = mysql.connector.connect(host=self.host_name,
                                              database=self.db_name,
                                              user=self.user_name,
                                              password=self.user_passwd)
            con_cursor = con_obj.cursor()
            try:
                con_cursor.execute(self.delete_ser.format(user_id))
                con_obj.commit()
            finally:
                con_cursor.close()
        finally:
            con_obj.close()


    def select(self, user_id, column=None):
        ret = None
        try:
            con_obj = mysql.connector.connect(host=self.host_name,
                                              database=self.db_name,
                                              user=self.user_name,
                                              password=self.user_passwd)
            con_cursor = con_obj.cursor()
            try:
                if column == None:
                    con_cursor.execute(self.select_str.format( "*", user_id))
                else:
                    con_cursor.execute(self.select_str.format( column, user_id))
                ret = con_cursor.fetchall()
            finally:
                con_cursor.close()
        finally:
            con_obj.close()


        return ret


実際に、AccountDaoクラスを用いてテーブルの操作をしてみます。
コマンドライン上で、accountdao.pyがあるディレクトリに移動し下記コマンドを実行します。

>python


Pythonの対話型シェルが起動するため、下記コマンドを打ち込みます。

import accountdao
import hashlib
account_dao = accountdao.AccountDao( 'localhost', 'practice', 'paku', 'paku' )
account_dao.insert('test', 'test', hashlib.sha1('test'.encode(encoding='utf_8', errors='strict')).hexdigest())

ユーザー名:test
ユーザーID:test
パスワード:test
というアカウントを追加しました。
パスワードはSHA1で暗号化しています。

正常に動いているか、MySQLで確認してみます。
MySQLにアクセスし、下記コマンドを打ち込みます。


SELECT * FROM account;


ユーザー名:test
ユーザーID:test
のユーザーが表示されれば成功です。

次に、selectメソッドの確認です。
対話型シェルで下記コマンドを打ち込みます。

rows = account_dao.select('test')
for row in rows
    for data in row
        print(data)



下記内容が表示されれば成功です。

test
test
*************

*************の部分は暗号化された文字列

次に、deleteメソッドの確認です。
対話型シェルで下記コマンドを打ち込みます

account_dao.delete("test")


MySQLにアクセスし、下記コマンドを打ち込みます。


SELECT * FROM account;


ユーザーID:test
のユーザーが表示されなくなっていれば成功です。

これで、MySQLConnector/Pythonを使用してMySQLにアクセスできることが確認できました。

今回は、無線LANの標準規格である「IEEE802.11」について書きます。

まず、「IEEE802.11」とは、
 ① IEEE:アメリカの電気電子技術学会
 ② 802 :IEEEの802委員会
 ③ .11 :グループ11
つまり、アメリカの電気電子技術学会の802委員会のグループ11が
策定した無線LANの標準規格が、「IEEE802.11」となります。

IEEE802.11には以下のような種別があります。
/*-------------------------------------------------------*/
●伝送規格
 ① IEEE802.11
 ② IEEE802.11b
 ③ IEEE802.11a
 ④ IEEE802.11g
⑤ IEEE 802.11j (IEEE 802.11aを日本向けに修正した規格)
 ⑥ IEEE802.11n
 ⑦ IEEE 802.11ac (2013年12月 策定予定)
 ⑧ IEEE 802.11ad (2012年12月 策定予定)
~~~~~~~~~~~~~~~~~~~~~
●セキュリティ規格
 ① IEEE802.11i
~~~~~~~~~~~~~~~~~~~~~
●QoS関連規格
 ① IEEE802.11e
/*-------------------------------------------------------*/

今後は、伝送規格で重要となる
・IEEE802.11b (1999年策定)
・IEEE802.11a (1999年策定)
・IEEE802.11g (2003年策定)
・IEEE802.11n (2009年策定)

をメインに記述していきます。

まずは、IEEE802.11のa/b/g/nの違いについて簡単に書きます。
規格により、速度、周波数、チャネル幅などが異なります。
/*-----------------------------------------------------------------------*/
・IEEE802.11b ~ 速度:11Mbps, 周波数:2.4GHz, チャネル幅:20MHz
・IEEE802.11a ~ 速度:54Mbps, 周波数:5.0GHz, チャネル幅:20MHz
・IEEE802.11g ~ 速度:54Mbps, 周波数:2.4GHz, チャネル幅:20MHz
・IEEE802.11n ~ 速度:600Mbps, 周波数:2.4/5GHz, チャネル幅:20MHz or 40MHz
/*-----------------------------------------------------------------------*/
次回は、各規格の詳細を記述します。
はじめまして。中村です。

Redmine+SVN/Gitの環境を(半分趣味で)構築してみたので、ここでまとめておきます。
インスール環境は CentOS 6.3の64bit版 です。

記事が少し長くなりそうなので、3回くらいに分けて書いていこうと思います。
第1回の今回は、rvmやRailsをインストールしていきます。

まずはrvmのインストールから。
rbenvとかでもいいんですが、個人的にrvmが好きなのでrvm使っていきます。
$ bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

インストール後、表示された指示通りにコマンドを叩いてスクリプトを実行します。
$ source /home/nakamura/.rvm/scripts/rvm

インストールするRubyやRailsのバージョンはRedmineに合わせていきます。
対応するバージョン番号は、以下のリンクを参考にしてください。
http://www.redmine.org/projects/redmine/wiki/RedmineInstall

Ruby(ruby-1.9.3-p327)をインストールします。
$ rvm install 1.9.3

redmine用のgemsetを作成します。
$ rvm gemset create redmine
$ rvm use ruby-1.9.3-p327@redmine

Railsのインストールや起動に必要なパッケージをインストールします。
$ sudo yum install -y make gcc gcc-c++ sqlite-devel

Railsをインストールします。
$ gem install rails -v 3.2.8 --no-ri --no-rdoc

devの配下にテストプロジェクトを作成してみます。
$ cd $HOME
$ mkdir dev
$ cd dev
$ rails new rails_sample

tokyo-m.rubygems.orgの調子が悪くてgem installやbundle installが失敗することがあるので、その時にはミラーを追加しましょう。
$ gem source --add http://production.s3.rubygems.org

Gemfileを編集して、下記の行のコメントアウトをはずします。
# gem 'therubyracer', :platforms => :ruby

v8とtherubyracerをインストール
$ gem install libv8
$ bundle install

テストプロジェクトを起動します。
(ファイアウォールの3000を事前に開けるのを忘れずに。)
$ rails s

これでRailsの起動までの確認までが完了です。
次回はRedmineのインストールまでしてみようと思います。
NUnitを使用してGUIのテストを行うことができる。
GUIのテストをするために、今回はUIAutomationを使用する。

今回は、テキスト、ボタン、コンボボックスを使用して簡単なプログラムを作成した。

テスト対象のプログラム
下記はテスト対象のプログラムである。

動作は、テキストに設定されている文字列をボタン押下でコンボボックスに追加するたけのプログラムである。

using System;
using System.Collection.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Sample.UIApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button_Click(object sender, EventArgs e)
{
comboBox.Item.Add(textBox.Text);
textBox.Text = "";
}
}
}

テストプログラム
テストのプロジェクトに下記の参照設定を行う。
UIAutomationClient
UIAutomationTypes

テストは、テキストに文字列を設定してボタンを押下すうとコンボボックスにテキストの文字列が追加されたことを確認するものである。
下記がテストプログラムである。

using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Automation;
using NUint.Famework;

namespace Sample.UITest
{
[TestFixture]
public class UITest
{
pivate AutomationElement from;

///
/// テストの初期化
///

[TestFixttureSetUp]
public void TestFixttureSetUp()
{
// テストするUIAppを起動させる
Process process = Process.Start(@".\UIApp.exe");
      
      // UIAppが立ちあがらないと、from取得に失敗すうのでスリープさせる
Thread.Sleep(1000);

// 起動したUIAppを参照
from = AutomationElement.FromHandle(process.MainWindowHandle);
}

///
/// テストの終了処理
///

[TestFixttureTearDown]
public void TestFixttureTearDown()
{
// UIAppを終了させる
WindowPattern patternFrom = (WindowPattern)from.GetCurrentPattern(WindowPattern.Pattern);
patternFrom.Close();
}

///
/// テストの処理
    /// TextBoxに文字列を設定
/// Buttonを押下するとTextBoxに設定した文字列をComboBoxに追加
/// ComboBoxに正常に追加されたかを確認。
///

[Test]
public void Test()
{
// UIApp画面のtextBoxを取得
AutomationElement elementTextbox = this.GetFromControl("textBox");
// textBoxのパターンを取得
ValuePattern valueTextbox = (ValuePattern)elementTextbox.GetCurrentPattern(ValuePattern.Pattern);
// textBoxに文字列を設定
valueTextbox.SetValue("park");

// UIApp画面のbuttonを取得
AutomationElement elementTextbox = this.GetFromControl("button");
// buttonのパターンを取得
InvokePattern patternButton = (InvokePattern)elementTextbox.GetCurrentPattern(InvokePattern.Pattern);
// buttonを押して
// textBoxに設定していう文字をcomboBoxに追加
patternButton.Invoke();

// UIApp画面のcomboBoxを取得
AutomationElement elementComboBox = this.GetFromControl("comboBox");
// comboBoxからアイテムリストを取得
AutomationElementCollection collection = elementComboBox.FindAll(TreeScope.Subtree,
new PropertyCondition(AutomationElement.ControlTypeProperty.ControlType.ListItem));
// アイテムリストの先頭を選択する
SelectionItemPattern patternItem = (SelectionItemPattern)collection[0].GetCurrentPattern(SelectionItemPattern.Pattern);
patternItem.Select();

// UIApp画面のcomboBoxの文字を取得して確認する。
    Assert.AreEqual("park", elementComboBox.Current.Name, "失敗");
}


///
/// テスト対象のAppから指定したコントロールを取得
///

private AutomationElement GetFromControl(String controlName)
{
PropertyCondition condition = new PropertyCondition(AutomationElement.AutomationIdProperty, controlName);

AutomationElement control = null;
// テスト対象のAppからcontrolNameのコントロールを取得
AutomationElementCollection collection = from.FindAll(TreeScope.Descendants, condition);
foreach(AutomationElement element in collection)
{
if(element.Current.ControlType == ControlType.Edit ||
element.Current.ControlType == ControlType.Button ||
element.Current.ControlType == ControlType.ComboBox)
{
control = element;
break;
}
}
return control;
}
}
}

@some