【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、Android、iOS、Mac OS X、および Microsoft Windows へのアプリケーションのストリーミングを現在サポートしています。
◇どんな用語が使われているか
以下の表に、IT用語とその意味を示す
参照元:
①IT用語辞典_e-Words
IT用語辞典 e-Words
用語 | 意味 |
---|---|
リソース | 資源 |
ストリーミング | マルチメディアファイルを転送・再生する方式の一種。 |
レイテンシー | データ転送要求などのリクエストを発してから、リクエストの結果が返ってくるまでにかかる遅延時間。 |
インフラストラクチャ | 基盤、下部構造 |
デプロイ | 配備する、配置する、展開する |
レンダリング | データ記述言語やデータ構造で記述された抽象的で高次の情報から、コンピュータプログラムを用いて画像・映像・音声などを生成すること |
スケーリング | (対象の規模に応じて)増減する、拡大・縮小する |
ユースケース | 機能的要求を把握するための技法。 |
◇固有名詞を置き換えれば少しは理解が進むのか
Amazon AppStream は、大量のシステム資源(リソース)を使うアプリケーションやゲームをクラウドから転送・再生(ストリーミング)できるようにする、柔軟性が高く、データ遅延の少ない(低レイテンシーの)サービスです。
Amazon AppStream は、AWS 基盤(インフラストラクチャ)でアプリケーションを配置(デプロイ)して画像、音声等を生成(レンダリング)し、PC、タブレット、携帯電話などのマスマーケットデバイスに出力をストリーミングします。
アプリケーションはクラウドで実行されるため、お客様が使用するデバイスと関係なく、処理とストレージの膨大なニーズを処理するよう増減(スケーリング)できます。
クラウドから、アプリケーション全体またはアプリケーションの一部を転送・再生(ストリーミング)することを選択できます。
Amazon AppStream を使用すると、マスマーケットデバイスでネイティブに実行した場合には不可能な、ゲームとアプリケーションの用途(ユースケース)が可能になります。
Amazon AppStream を使用することで、ゲームとアプリケーションはお客様の手元にあるハードウェアに制約されないようになります。
Amazon AppStream に含まれる SDK では、Microsoft Windows Server 2008 R2 から
FireOS、Android、iOS、Mac 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頭よりもキータイプのための腕が先に動く勢いで、
その組み合わせを記述する人は結構いそうだ。(少なくとも僕はそうです)
それだけで終わってもいいのかい
#includeは、プリプロセッサとよばれるもの。コンパイル時に動作して、色々なものに置き換わってくれる。
置き換わったものを元に、コンパイルを実行する。
#include
内容(プロトタイプ宣言)を持ってきてくれる。
プロトタイプ宣言とは、どんな関数を利用するのか事前に定義しておくもの。
(※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>