Memo Life

ビギナーSEのメモ書き

【AWS】Amazon AppStreamの概要説明がすぐに頭に入ってこなかった

◇僕はどうやら読解力が低いらしい

Amazon AppStreamの説明を読んでいたが、
各文章内で、ひっきりなしにIT用語が述べられていて、何がなんだかよくわからなかった。

 Amazon AppStream は、大量のリソースを使うアプリケーションやゲームをクラウドからストリーミングできるようにする、柔軟性が高く低レイテンシーのサービスです。
 Amazon AppStream は、AWS インフラストラクチャでアプリケーションをデプロイしてレンダリングし、PC、タブレット、携帯電話などのマスマーケットデバイスに出力をストリーミングします。
アプリケーションはクラウドで実行されるため、お客様が使用するデバイスと関係なく、処理とストレージの膨大なニーズを処理するようスケーリングできます。
 クラウドから、アプリケーション全体またはアプリケーションの一部をストリーミングすることを選択できます。
 Amazon AppStream を使用すると、マスマーケットデバイスでネイティブに実行した場合には不可能な、ゲームとアプリケーションのユースケースが可能になります。
Amazon AppStream を使用することで、ゲームとアプリケーションはお客様の手元にあるハードウェアに制約されないようになります。
Amazon AppStream に含まれる SDK では、Microsoft Windows Server 2008 R2 から FireOS、AndroidiOSMac OS X、および Microsoft Windows へのアプリケーションのストリーミングを現在サポートしています。

◇どんな用語が使われているか

以下の表に、IT用語とその意味を示す

参照元
①IT用語辞典_e-Words
IT用語辞典 e-Words

Wikipedia

用語 意味
リソース 資源
ストリーミング マルチメディアファイルを転送・再生する方式の一種。
レイテンシー データ転送要求などのリクエストを発してから、リクエストの結果が返ってくるまでにかかる遅延時間。
インフラストラクチャ 基盤、下部構造
デプロイ 配備する、配置する、展開する
レンダリング データ記述言語やデータ構造で記述された抽象的で高次の情報から、コンピュータプログラムを用いて画像・映像・音声などを生成すること
スケーリング (対象の規模に応じて)増減する、拡大・縮小する
ユースケース 機能的要求を把握するための技法

◇固有名詞を置き換えれば少しは理解が進むのか


 Amazon AppStream は、大量のシステム資源(リソース)を使うアプリケーションやゲームをクラウドから転送・再生(ストリーミング)できるようにする、柔軟性が高く、データ遅延の少ない(低レイテンシーの)サービスです。
 Amazon AppStream は、AWS 基盤(インフラストラクチャ)でアプリケーションを配置(デプロイ)して画像、音声等を生成(レンダリング)し、PC、タブレット、携帯電話などのマスマーケットデバイスに出力をストリーミングします。
 アプリケーションはクラウドで実行されるため、お客様が使用するデバイスと関係なく、処理とストレージの膨大なニーズを処理するよう増減(スケーリング)できます。
 クラウドから、アプリケーション全体またはアプリケーションの一部を転送・再生(ストリーミング)することを選択できます。
 Amazon AppStream を使用すると、マスマーケットデバイスでネイティブに実行した場合には不可能な、ゲームとアプリケーションの用途(ユースケース)が可能になります。
 Amazon AppStream を使用することで、ゲームとアプリケーションはお客様の手元にあるハードウェアに制約されないようになります。
 Amazon AppStream に含まれる SDK では、Microsoft Windows Server 2008 R2 から
FireOS、AndroidiOSMac OS X、および Microsoft Windows へのアプリケーションのストリーミングを現在サポートしています。

なんとなく伝わる気がする。

◇結論

スケーリング、レイテンシー等の用語を知っていれば、
わかる人には伝わる文章である。

何が言いたいかというと、僕の勉強不足であった。

【python】バイトの値を取得-ord-

【調査トリガー】
pythonで、文字を引数として渡すことで、ASCIIコードを取得するようなものはないか?

【結果】

ord(c)

長さ 1 の与えられた文字列に対し、その文字列が unicode オブジェクトならば Unicode コードポイントを表す整数を、8ビット文字列ならばそのバイトの値を返す。

ord('A') # => 65
ord('0') # => 30

http://docs.python.jp/2.5/lib/built-in-funcs.html
(Pythonライブラリリファレンス)

雑記。C言語の再再再々入門4

再帰関数で階乗の計算

// nata_water 2014/01/28
#include <stdio.h>

int fact(int n)
{
	int v = 0;
	if (n > 1)
		v = fact(n - 1);
	else 
		v = 1;
	return v * n;
}

int main(int argc, char *argv)
{
    int result = 0;
    result = fact(5);
    printf("%d", result);  // #=> 120
}

factを呼び出す仕組みとアセンブリコード

再帰ごとにローカル変数をスタックに確保する

return:ベースレジスタ(戻りアドレス)

______
return
v(n=1)
______
return
v(n=2)
______
return
v(n=3)
______
return
v(n=4)
______
return
v(n=5)
______

push	 ebp
mov	 ebp, esp

sub	 esp, 204		; 000000c
push	 ebx
push	 esi
push	 edi

lea	 edi, DWORD PTR [ebp-204]
mov	 ecx, 51			;
mov	 eax, -858993460		;
rep stosd


mov	 DWORD PTR _v$[ebp], 0

cmp	 DWORD PTR _n$[ebp], 1
jle	 SHORT $LN2@fact

mov	 eax, DWORD PTR _n$[ebp]
sub	 eax, 1
push	 eax
call	 ?fact@@YAHH@Z		; fact
add	 esp, 4
mov	 DWORD PTR _v$[ebp], eax

jmp	 SHORT $LN1@fact



mov	 DWORD PTR _v$[ebp], 1


mov	 eax, DWORD PTR _v$[ebp]
imul	 eax, DWORD PTR _n$[ebp]

pop	 edi
pop	 esi
pop	 ebx

add	 esp, 204		; 000000c
cmp	 ebp, esp
call	 __RTC_CheckEsp
mov	 esp, ebp
pop	 ebp
ret	 0

雑記。C言語の再再再々入門3

文字列定数

int main(void) 
{
    char *cp = "文字列定数";
    printf("%s\n", cp); // 文字列テーブルのアドレス

    // コンパイルできるが、実行時にアクセス違反例外が発生する
    // strcpy(cp, "変更はできない"); 
    

    char *cp2;
    cp2 = "ここは設定可能(初期化のため)";
    
    // コンパイルできるが、実行時にアクセス違反例外が発生する
    // gets_s(cp2, sizeof(cp2));
}

関数の仮引数としてのchar *

void strany(char *target, char *source)
{
}

int main(void)
{
    char buffer[256] = {0};
    // charのポインタ(配列の先頭アドレス)を渡す
    strany(buffer, "hoge"); 
    // "hoge"はこの時点では const char *ではない・・・のだと思われる
    
}

雑記。C言語の再再再々入門2

double型へのポインタ宣言の方法

#include <stdio.h>
int main(void) {
    double *dp, dval = 0.0;
    dp = &dval;
    printf("%lf", *dp)
    return 0;
}

ポインタを利用してmystrcat関数を作成してね

#include <stdio.h>
#include <string.h>

void mystrcat(char *, char *)

int main(void) {
    char buffer[256];
    
    strcpy(buffer, "Hi, Tany.");
    mystrcat(buffer, "Do you like C Language?");
    printf("%s", buffer); // => Hi, Tany.Do you link C Language?

}

void mystrcat(char *str1, char *str2) {
    // ヌル文字が出るまでループ
    while(*str1)
        
        *str1++;
    
    while(*str2)
        *str1++ = *str2++;
    *str1 = '\0';
}

関数の仮引数に利用しているポインタ
char *str1, char *str2のやつ。
→文字列のアドレス受け取って処理してあげるよ。

スコープ内で利用する*hogeと役割が違うことに気を付ける。
何が言いたいかというと、該当アドレスに格納された変数内容を表示するわけではなく、
指定された基本データ型のポインタとして受け取ってあげることを明示するだけ。



ヘッダーファイルとメインファイルともう一つのcファイル

ソースコードの量が多くなったら、複数のファイルに分割して管理したいと思うようになる。

そこで、登場するのがヘッダーファイルである。

//hoge_lib.h
void hogecron(void);
void hogesh(void);
//hoge_lib.c
#include "hoge_lib.h"
void hogecron(void)
{
    // hogecron処理
}

void hogesh(void)
{
    // hogesh処理
}
//main.c
#include "hogelib.h"
int main(void) 
{
   hogecron();
   hogesh();
}

適当な流れ
1.hoge_lib.cをコンパイルすると、hoge_lib.objが作成される。
2.main.cをコンパイルすると、main.objが作成される。

3.exeとして実行するために、これらのobjファイルをリンカーによってリンクする。

4.リンカーは、mainの外部シンボル解決をするためhoge_lib.hを参照し、
hoge_lib.objに行きつく

hoge_lib.obj内には、hoge_lib.cのソースコードを最適化したオブジェクトが格納されており、
hogecron関数、hogesh関数の処理が抽出できる。

雑記。C言語の再再再々入門

通称おまじない

#include <stdio.h>

int main(void) {
    printf("Hello, World");
    return 0;
}

おまじないを書いたらコンソールにこんにちは世界

#include を書いただけで、printf関数が利用可能になる。

頭よりもキータイプのための腕が先に動く勢いで、
その組み合わせを記述する人は結構いそうだ。(少なくとも僕はそうです)

それだけで終わってもいいのかい

#includeは、プリプロセッサとよばれるもの。
コンパイル時に動作して、色々なものに置き換わってくれる。
置き換わったものを元に、コンパイルを実行する。

#include は、stdio.hというヘッダーファイルの
内容(プロトタイプ宣言)を持ってきてくれる。

プロトタイプ宣言とは、どんな関数を利用するのか事前に定義しておくもの。
(※PL/SQLプログラムで言うところの、パッケージ宣言部のようなもの。逆にわかりづらい)

今回で言えばstdio.hをincludeして、コンパイルしたからprintfが使えた・・・
ように見える。
確かにコンパイル時点では、printfの定義はヘッダーから取り込んでいるため
「何を呼んでいるんだコイツ・・・」状態にはならない。
プロトタイプ宣言を取り込んだことで、関数呼ぶことはすでにコンパイルが把握しているためだ。

しかし、お察しのとおり、
stdio.hには、「プロトタイプ宣言」しか書かれていない。
そう、処理の内容がないのだ。(このブログには中身がない)

// Visual C++(2013) Microsoft Visual Studio 12.0\VC\include\ 配下のstdio.h
_Check_return_opt_ _CRTIMP int __cdecl printf(_In_z_ _Printf_format_string_ const char * _Format, ...);

宣言しただけじゃ、何もできないよ。

コンパイルすると何ができるの?

「exeファイルができる!!!」

包括的に考えると大正解。
おしまい。



というわけにもいかない。



コンパイルを行うと、
(プログラムにとって不要な)コメントやプリプロセッサを除外した「オブジェクトファイル」が作成される。(コンパイラが色々と気を遣って、無駄を省き最適化してくれたファイルと考えると少し応援したくなる)

オブジェクトファイルと静的リンクライブラリを結合し、実行ファイルを作成する

オブジェクトファイルと静的リンクライブラリを結合

これをリンクという。

このリンク部分で、オブジェクトファイルの宣言を元に、「静的なライブラリ」から宣言した定義そのものをピックアップしているのだった。

まとめようと頑張る

・printfという関数のプロトタイプはstdio.hヘッダーファイルに存在する
・printfの内容がどうなっていようと、コンパイル時点では、プロトタイプどおりに
 正しく利用しているかどうかだけみる。
 言ってしまえばプログラムが適切な形で呼び出されるか、
 判定するだけであり、呼び出した先の定義内容までチェックしない
・リンク時・・・要するに、
 ライブラリとして別のオブジェクトファイルから呼ばれる、もしくは
 実行ファイルとしてメモリ上に居座る前段で、
 ここで始めて宣言した関数の中身が適切に対象ライブラリーに存在するかを確認する
・もしライブラリーにすら存在しなければ、
 「未解決の外部シンボル」としてリンカー(リンク用のプログラム)からお叱りを受けることになる。


静的リンクライブラリと動的リンクライブラリ

静的リンクライブラリは、
リンカーによってオブジェクトファイルと結合され、
アプリケーションの一機能として動作する。

動的リンクライブラリは、リンクの必要なしに、
アプリケーションの一機能として、そのままメモリ上に読み込むことができる
素敵なライブラリー。(主観


色々と調査不足でごめんなさい

jQuery Mobileのプラグイン設定001

複数の画像をスライドショー形式で表示するプラグイン

http://www.pixedelic.com/plugins/camera/

リンク先のDownloadより、必要なファイルをダウンロード
・camera.js
・camera.css

「download Camera slideshow (zip with demo inside)」
をダウンロードすると、スライドショー操作用のアイコン画像ファイル等まとめて入っているため
そちらを利用すると検証しやすいかもしれない。

camera.jsを開いてみる

defaultsオブジェクトに各値を設定している模様。
僕が変更したのは以下の値。

{
    loader  : 'none', // 次の画像表示用のローダー画像は表示しない
    slideOn : 'next', 
    time    : 1000,
    transPeriod : 1000

camera.jsをプラグインとして配置する

デフォルト値では、
camera.jsが見に行く画像ディレクトリは以下のとおりとなっている。

{
    imagePath : 'images/' // camera.jsの一つ上にあるimagesフォルダ
}

camera.jsを利用してみる

<link href="./plugins/camera/camera.css" rel="stylesheet" />

//...

<script src="./plugins/camera/camera.js"></script>
//...

<script type="text/javascript">
jQuery(function() {
    jQuery('#my_slideshow').camera({
        height:'50%',
        pagination: false
    });
    
});
</script>

// ...

<div id="my_slideshow" class="camera_chocolate_skin">
    <div data-src="../images/hoge1.jpg"></div>
    <div data-src="../images/hoge2.jpg"></div>
    <div data-src="../images/hoge3.jpg"></div>
</div>