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

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

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

この記事は「flickSimpleでフリック!」の2回目です。


今回は flickSimple の使い方を説明するために、
下記のフリックページを作ってみたいと思います。

  • 横にフリック
  • フリックするページは3枚(3ページ)



まずは下記サイトから flickSimple をダウンロードします。


ダウンロードが終わったら、html と css の準備です。

<html>
<head>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script type="text/javascript" src="./jquery.flicksimple.js"></script>
<style>
.flick-visible {
width: 200px;
}
ul.whole {
width: 300%;
margin: 0;
padding: 0;
list-style-type: none;
}
ul.whole li {
float: left;
width: 200px;
margin: 0;
padding: 0;
list-style-type: none;
}
</style>
</head>
<body>
<div id="flick" class="flick-visible">
<ul class="whole">
<li>1ページめ</li>
<li>2ページめ</li>
<li>3ページめ</li>
</ul>
</div>
</body>
</html>


見た目はこうなります。
ソフトウエア開発(android・iphone・windows・java等)の事なら株式会社パークにお任せください_パク太郎のソフトウエア開発者ブログ-flickSimple: html と css
※分かりやすいよう CSS で色や文字位置を調整しています。


1つ1つ説明していきますネ。

■プラグインへのリンク
<head>内で jQuery と flickSimple にリンクを張ります。

<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script type="text/javascript" src="./jquery.flicksimple.js"></script>

flickSimple は jQuery を使用しているので、
flickSimple の前に jQuery にリンクを張ってあげてください。

flickSimple のスクリプトのパスは、
どこに flickSimple をダウンロードしたかで変わります。


■html と css

<div id="flick" class="flick-visible">
<ul class="whole">
<li>1ページめ</li>
<li>2ページめ</li>
<li>3ページめ</li>
</ul>
</div>

.flick-visible {
width: 200px;
}
ul.whole {
width: 300%;
margin: 0;
padding: 0;
list-style-type: none;
}
ul.whole li {
float: left;
width: 200px;
margin: 0;
padding: 0;
list-style-type: none;
}


<body>内に以下3つの要素を書きます。

  • フリックさせる範囲を示す<div>

  • フリックさせるページ全体のサイズを示す<ul>

  • フリック対象のページを示す<li>



フリックさせる範囲はフリック対象のページ1個と
同じサイズにするので、

<div>の width = <li>の width

になります。

この部分はページ全体で一意に決まる要素になっている
必要があります。
なので、id名をふってあげましょう。


フリックさせるページ全体のサイズを示す<ul>には、
「width:300%;」を指定しています。

今回は3ページあるので、100%×3 ですネ。

margin と padding が指定されていると
width で指定した範囲が全体の幅とイコールにならないので、
これらは 0 にしておきます。


ここでは横にフリックさせたいので、
各ページは横に並んでいる必要があります。
なので、<li>には「float: left;」を指定して
各ページを横に並べています。

margin、padding、マーカーはあると邪魔なので、
「margin: 0; padding: 0;」と「list-style-type: none;」で
消しておきましょう。


■flickSimple を適用する。
ここまで来たら flickSimple の適用です!

<head>内に下記を追加してください。

<script>
$(function() {
$("#flick").flickSimple();
});
</script>

"$( )"の中には

「#」+「フリックさせる範囲を示す<div>の id 名」

を指定します。


flickSimple を適用すると、見た目がこのように変わります。

ソフトウエア開発(android・iphone・windows・java等)の事なら株式会社パークにお任せください_パク太郎のソフトウエア開発者ブログ-flickSimpe: 適用

見える範囲が「フリックさせる範囲を示す<div>」に限定され、
フリックでページを変えることができるようになりました!


フリックのスピードを変えたい場合は、
引数でコントロールできます。

$("#flick").flickSimple({
duration: 1000 // アニメーションの長さ(ミリ秒)
});


flickSimple 適用時に戻り値を取得することで、
スクリプトでページ移動(goTo()メソッド)させることもできます。
(詳細は jQuery.flickSimple デモ / マニュアル のページをご覧ください。)



...と、ここで問題が。

戻り値を取得するときに下記のように記述しても、
flickSimple オブジェクトを取得することができません!

var flickObj = $("#flick").flickSimple();


原因は、初めて flickSimple を適用する要素の場合は
flickSimple がインスタンスを返してくれないためです。

なので、下記のように2回目でオブジェクトを取得しましょう。

$("#flick").flickSimple();

// 2回目以降でないとflickSimpleオブジェクトが返ってこない
var flickObj = $("#flick").flickSimple();

flickObj.goTo(2); // 2ページ目に行けるよ!

引数を指定したい場合は、1回目の flickSimple() に
指定しましょう。



では、今回はここまで!
最近 WebView を利用したスマートフォンアプリを
作成する機会がありました。

私は Html/JavaScript の実装を担当しましたが、
フリックを実現するのって結構手間がかかるんですね!

ということで、苦労したフリックの実装、
せっかくなので皆さんと技術共有したいと思います。

■この記事の対象者■
下記を満たす方
  • jQuery を触ってみたことがある
  • html を書いてみたことがある
  • cssでの「#hoge」や「.hoge」といった
    書き方が何を意味しているか分かる


■目次■
(1)flickSimple とは
(2)実装:flickSimple の基本
(3)実装:Android でスクロールさせてみる
※flickSimpleでは問題が発生したので、flipsnapを利用しました。
上記ではこの問題とflipsnapについて解説します。
(4)実装:ある程度フリックしないと反応しないようにする
(5)実装:循環させてみる


目次の各章ごとに1つの記事を書こうと思います。
なお、この記事は「(1)flicksimpleとは」です。


----------


フリックを実現するために、私は「flickSimple」という
jQuery を利用したプラグインにお世話になりました。


flickSimple はスマートフォン上だけでなく
マウス(PC)でのフリックも実現できます!
なので、開発に超便利♪

また、引数でアニメーションのスピードも調整できます。

flicksimpleのDemo をご覧いただいても分かると思いますが、
横フリックだけでなく縦フリックにも対応し、
カスタマイズをし易いように実装されているので
flickSimple の中身をいじらなくても
自分で追加機能をホイホイ作れちゃいます。

ライセンスは MIT/GPL です。



とまぁ、ここまで flickSimple 便利~ってことを書きましたが、
flickSimple 単独では実現できないこともあります。

私が見つけた限りでは3つありました。

  • Android でスクロールができなくなる

  • タッチするとフリックがすぐに始まる
    → 感度を調整できない

  • 最後のページに行ったら最初のページに
    戻るようにできない(循環できない)


flickSimple の中身をいじらず上記3つを実現するために、
私は下記の方法をとりました。

  • Android でスクロールができなくなる
    → iScroll でスクロールを実現

  • 感度を調整できない
    → flickSimple の外でカスタマイズ

  • 循環できない
    → flicksimple の外でカスタマイズ


上記の実装方法は、これから下記のタイトルで書いていきます。

a →「(3)実装:Android でスクロールさせてみる」

b →「(4)実装:ある程度フリックしないと反応しないようにする」

c →「(5)実装:循環させてみる」


(a)の iScroll はヘッダー・フッターを固定した
スワイプも実現できるプラグインです。


「(3)Android でスクロールさせてみる」では
iScroll の使い方も書かせていただきます。


では、今回はここまで!
今回は、Gitを使用して、Herokuへのプッシュ方法を記載します。
※前回で「Git」の「インストール」を記載しました。
 http://ameblo.jp/softwaredeveloper/theme-10070162689.html

1.Git Bash(コンソール)起動
 - heroku へのログイン
  ・コマンド:「heroku login」
  ・メールアドレス、パスワードを入力

◆注意
  ssh の公開鍵の登録していない場合は、キーの登録をしてください
  - キーの確認
   - 以下のフォルダの確認
     C:\Users\<ユーザー名>\.ssh
    →「ssh」フォルダーがあればキーの登録済みです。
  - キーが未登録の場合
    ・キーの登録
     以下のコマンドを実行
      [heroku keys:add]
      - 上記のフォルダが作成されていることを確認

2.リポジトリ作成場所へ移動
 コマンド:「cd <リポジトリに使用するフォルダパス>」
  例) cd C:\development\git\repository

3.herokuのアップロード先のクローン作成
   a.アプリケーションIDの確認
     コマンド:「heroku apps 」
    ==== My Apps以下に表示されたIDがアプリケーションIDになります。
   b.GitリポジトリのURL確認
     コマンド:「heroku info --app アプリケーションID」
   c.クローン作成
     コマンド:「git clone
     例)git clone git@heroku.com:<アプリケーションID>.git
    →ローカルPCにアプリケーションIDの同様のフォルダが作成されています。

4.ソースの修正
 ローカルPCに作成されたクローン(フォルダ)内にindex.phpのファイルがあるので、
 そのファイルの内容を修正します。
 ※修正内容は任意

5.ローカルリポジトリでのコミット設定
   a.階層をアプリケーションフォルダ(クローン)へ移動
    コマンド:「cd アプリケーションIDフォルダ」
    例)C:\development\git\repository/<アプリケーションID>
   b.ステージングエリア
    コマンド:「git add .」
   c.コミット
    コマンド:「git commit -m "修正した内容に関する説明"」

6.herokuへデプロイする
   コマンド:「git push origin master」

以上がデプロイ方法です。
以下に一部エラー対応を捕捉しておきます。  

◆注意
 - リポジトリが存在しない
   エラー内容
   ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
   ※fatal: '<アプリケーションID>' does not appear to be a git repository
   ※fatal: Could not read from remote repository.
   ※
   ※Please make sure you have the correct access rights and the repository exists.
   ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
   ■原因
    git remote add したリポジトリのパスが間違ってる場合があります。
   ■対策
    - git remote rmしてパスを確認
    - 間違っているならaddし直す

 - リポジトリが存在しない
   エラー内容
   ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
   ※fatal: '<アプリケーションID>' does not appear to be a git repository
   ※fatal: Could not read from remote repository.
   ※
   ※Please make sure you have the correct access rights and the repository exists.
   ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
   ■原因
    git remote add したリポジトリのパスが間違ってる場合があります。
   ■対策
    - git remote rmしてパスを確認
    - 間違っているならaddし直す

現在携わっているプロジェクトにて取り扱っている、キヤノンソフトの商品Integrity(インテグリティ)。

Integrityとは、ソフトウェア開発におけるプロセスと成果物を管理し、開発部門やIT部門における生産性や品質向上に寄与するALM(Application Lifecycle Management)プラットフォームです。
また、アプリケーション・ライフサイクルの上流から下流まで、すべての工程のプロセスとワークフローを定義して、プロセスに従ったアプリケーション開発を実現することが可能となります。
開発プロジェクトを可視化することができ、迅速かつ正確な問題把握やコンプライアンス対策にも役立ちます。

特徴は以下の通りです。
①変更要求と作業対象となるソースやファイルを紐づけた管理に対応
 →従来、個別に管理されていた各種作業要求と作業対象となるソースやファイルといった成果物を紐づけて管理することができる。
②柔軟な設計
 →オープンな開発工程管理統合ソリューションであるため、お客さまの環境やプロセスに対応した開発工程管理を行うことができる。
③一元管理が可能
 →オープン系から汎用機まで様々なプラットフォームが混在したシステム環境の開発プロジェクトの一元管理が可能です。
④管理対象となる全てのデータをシングルリポジトリに保管・管理
 →単一のデータベースに管理対象となる全てのデータを格納します。

主な機能は以下の通りです。
①プロセス管理
 →ワークフロー機能により全工程のプロセス管理や標準プロセスへの適合が可能
②チャート、レポート、ダッシュボード機能
 →蓄積された各種データを任意の角度から分析、可視化が可能
③充実したソース管理機能
 →管理ファイルのバージョン管理はもちろん、直感的なバージョン遷移の表示、ロック設定や権限設定など詳細なポリシーを設定が可能

このように、Integrityを導入することにより、以下のようなメリットがあります。
①柔軟なプロセス定義と権限設定により、業務プロセスをそのまま実装可能
 →お客さまの開発プロセスをそのままシステム化することが可能なため、柔軟にプロセス改善が可能となる。また、「ステータスの変更」や「担当が割り当てられた」などをメールにより通知が可能となっている
②関連するすべての作業状況(プロジェクト状況、要員状況、タスク状況 等)について、リアルタイムな把握、指定日時の把握が可能
③業務の効率化、品質向上を目的としたプロセス改善の結果として、プロジェクト管理、ITサービス管理(IT統制)の支援が可能

上記に記載した機能のほかに、Integrity内で作成した文書をword形式にてエクスポートする機能もあります(import機能もあり)。
その際、「Integrity内でのドキュメント⇔word形式ドキュメント」の変換処理としてXSLTファイル(変換ファイル)が用意されています。
お客さま毎にこの変換ファイルの内容を変更し、出力する項目をカスタマイズします。

今回、この「XSLTファイル」関連の作業を初めて行ったので、技術調査として取り上げたいと思います。

1.XSLTとは
 ・XSLTはXML Stylesheet Language Transformationsの略
 ・XSLのもっとも重要な部分
 ・XSLは、以下の3つの部分から構成されている
  ①XSLT - XML文書を変換するための言語
  ②XPath - XML文書内をナビゲートするための言語
  ③XSL-FO - XML文書をフォーマットするための言語
 ・XML文書を他のXML文書に変換するための簡易言語
 ・「XSLTスタイルシート」とXSLTプロセッサ(Internet Explorer6など)によりXML文書のデータ構造を変換
 ・拡張子は「.xsl」
 ・W3C勧告

2.HTMLとの違い
 [HTML]
  ・決められたタグを持つ
  ・スタイルシート(CSS)の使用により、HTML要素へのスタイル追加が容易

 [XSLT]
  ・決められたタグを持たない(好きなタグ名の使用が可能)
  ・「スタイルシート」はHTMLのCSSとは全く異なるもので、どうXML文書を表示するかを記述するもの

3.テンプレートルール
 ・XML文書中の「どの要素をどのように変換したいか」を記述
 ・XML文書をXSLファイルで変換し、結果ツリーを生成することで実現する。
 ・1つのスタイルシートの中に複数のテンプレートルールの記述が可能

4.XMLファイル側の対応
 XSLを作成するだけではなく、XMLに関連付けをする必要があります。
 以下のように、XMLドキュメントに「xml-stylesheet」処理命令を追加し、「href」属性に関連付け対象となるXSLファイルを記述します。
 (例として、作成するXSLファイル名を「xslFileName.xsl」とします。)
 なお、XMLファイルとXSLファイルは同一フォルダに配置する必要があります。





5.問題点と解決策
 [問題点①]
  ブラウザがXSLT未対応の場合は動作しない
 [原因]
  XSLスタイルシートをXMLファイルに追加しブラウザ側で変換する方法であるため
 [解決策]
  ・変換にJavaScriptを使用する
  ・クライアント側でXMLをHTMLに変換する
  (注)だたし、ブラウザがXMLパーサを持っていることが条件
 [ポイント]
  ・XSLスタイルシートをXMLファイルに記述する必要がない
  ・XMLとXSLファイルをロードし表示するためのソースコードがクライアント側で必要となる

 [問題点②]
  ブラウザがXMLパーサを持っていない場合はJavaScriptでも動作しない
 [解決策]
  ・サーバ側でXMLをHTMLに変換し、ブラウザに返す
 [ポイント]
  ・XSLスタイルシートをXMLファイルに記述する必要がない
  ・サーバ側でXMLファイルをHTMLに変換するためのソースコード(ASP)が必要となる

7.まとめ
 今回、XML文書をHTMLのような他の形式に変えるためにXSLTを使用する方法を学んだ。
 XMLとの関連付けをソースに埋め込む方法だけでなく、クライアント側およびサーバ側での対応方法があることも知ることができたのでとても勉強になった。
 また、XSLTには100以上の組み込み関数が含まれているとのことなので、今後も勉強を続けていきたいと思う。
簡単そうで意外と面倒な矩形波の作成を紹介します。
ウェブにも意外と落ちてないんですよね。

面倒なのは周期ごとに場合分けしないとならない点と、
位相と周波数のからみです。(sin関数の時なんかは周波数は考慮しなくてもそのまま渡せるんですが。)

では、サンプリング間隔nInterval(ms)のデータにおける矩形波のデータを作成してみます。

int nInterval // サンプリング間隔(ms)
double dbOffset // 縦軸オフセット(0点)
double dbAmp // 振幅
double dbFrequency   // 周波数
double dbPhase // 位相

for( nDataCnt = 0; nDataCnt < nDataNum; nDataCnt++ )
{
nRemain = (int)( nInterval * nDataCnt - 1000 * dbPhase / 360 ) % (int)( 1000 / dbFrequency );

if( 0 == nRemain || 500/dbFrequency == nRemain || -500/dbFrequency == nRemain)

adWaveData[ nDataCnt ] = dbOffset;

if( -1000 < nRemain && nRemain < -500/dbFrequency)

adWaveData[ nDataCnt ] = ( dbOffset + dbAmp );

else if( -500/dbFrequency < nRemain && nRemain < 0)

adWaveData[ nDataCnt ] = ( dbOffset - dbAmp );

else if( 0 < nRemain && nRemain < 500/dbFrequency)

adWaveData[ nDataCnt ] = ( dbOffset + dbAmp );

else if( 500/dbFrequency < nRemain && nRemain < 1000/dbFrequency)

adWaveData[ nDataCnt ] = ( dbOffset - dbAmp );
}

矩形波なのでとりうる値は、dbOffset + dbAmp、dbOffset - dbAmp、dbOffset
3種類なので右辺は簡単です。
2種類だと思いきや、中間のdbOffsetがあるのは、中途半端な周波数などの場合は
上限値⇔下限値に移行する際の点が未定義になって波形が切れたりしますのでご注意!

nRemainの計算の所ですが、
まずは nInterval * nDataCnt で現在の点の位置になります。
で、- 1000 * dbPhase / 360 の部分は位相ずれ分になります。
% (int)( 1000 / dbFrequency ) は周波数を考慮してます。

ちなみにsin波だとこれだけで済みます。

#define PAI (3.14159265358979323846)

int nInterval // サンプリング間隔(ms)
double dbTime // 時間
double dbOffset // 縦軸オフセット(0点)
double dbAmp // 振幅
double dbFrequency   // 周波数
double dbPhase // 位相

for( nDataCnt = 0; nDataCnt < nDataNum; nDataCnt++)
{
dbTime = ( nInterval * nDataCnt - 1000 * dbPhase / 360 );

adWaveData[ nDataCnt ] = ( dbOffset + dbAmp * sin( dbFrequency * dbTime / 1000 * 2 * PAI ) );
}

.wavファイル等自作で音源を作ったりするのに役にたつかと思います。その際はぜひ参考に。
一部数値がハードコーディングなのは、ご容赦を。。汗

次回は別の波形の紹介をしたいと思います。
では、また。