はてなキーワード: classとは
わかりやすさについてとやかく言わないけどさ、攻撃するってことは、モンスターのHPだとかが減るんだよね?
勇者.attack(モンスター)
って書いたとしてもさ、勇者.attackメソッドの中で、モンスターのHPを直接書き換えるわけじゃないでしょ?
直接書き換えてたら、モンスターに守備力だとか、耐性追加した時に、勇者側を書き換えないといけなくなる。
守備力だとか、耐性だとかは、モンスターの属性なので、影響はモンスター側で面倒見てもらいたいから、
攻撃でHPを減らすのは、モンスターのメソッド経由になると思う。
結局、
class 勇者 : method attack(モンスター: monster): monster.attackedBy(self.attackPower)
みたいなコードになると思うんだけど。
例えば、攻撃力取得メソッド。
interface 攻撃方法: /** 攻撃力取得 */ method getAttackPower();
フィールドは、攻撃方法によって違うかもしれないが、攻撃者を持っとけば汎用的かな。
/** 通常攻撃は力=攻撃力 */ class 通常攻撃 implements 攻撃方法: field _attacker constructor(攻撃者: attacker): self._attacker = attacker method getAttackPower(): return self._attacker.strength
/** 突撃は力*すばやさ=攻撃力 */ class 突撃 implements 攻撃方法: field _attacker constructor(攻撃者: attacker): self._attacker = attacker method getAttackPower(): return self._attacker.strength * self._attacker.agility
そうすると、攻撃方法が違っても、モンスターのattackedByメソッドの処理は共通
class モンスター: method attackedBy(攻撃方法: attackMethod): self._hp = self._hp - attackMethod.getAttackPower()
monster.attackedBy(new 通常攻撃(player)); monster.attackedBy(new 突撃(player));
僕はプログラマーです。
でも僕のMacBookProには何故かAdobeのソフトウェアが入っています。
デザイナーの人がデザインファイルを.psdや.aiや.fw.pngのまま当然の様に投げて来るからです。
僕はAdobeのソフトウェアに精通しているわけではありません。
ですので複雑なレイヤー構造のファイルを切り出すのにはかなり時間を要します。
でもレイヤー構造の説明をしてくれるデザイナーの人は殆ど居ません。
デザイナー同士だとその複雑な構造でもやり取り出来るのかも知れませんが、僕には大抵よく分かりません。
例えば、Photoshopのエフェクトレイヤーが掛かっているボタンはボタンだけ切り出す時に凄く苦労します。
例えば、薄くシャドーが掛かってるデザインは素敵な質感を表現出来るかもしれませんが説明してもらわないとどこまで切り出したら良いか分かりません。
一所懸命頑張って切り出した画像でアプリを作っていたら「この部分が滲んでいる」とか「ここが1pxズレている」とか言われます。
僕はAdobeに精通する為の努力をしなきゃいけないのでしょうか?
そもそもAdobeのソフトウェアは高価です。 今なら毎月3000円払わなきゃいけません。
でも実際使う機会は月に2〜3回あるか無いかです。
一回の起動が1000円です。
じゃあデザイナーの人にも僕がソースコードのまま投げても良いのでしょうか?
Xcodeは無料です。 AppleのiOS Developerライセンスは年8400円です。
ビルドから実機へのインストールくらいならボタン押すだけで出来ます。
じゃあデザイナーの人にもGitでデザインファイルを共有して貰っても良いのでしょうか?
Gitは無料です。 レポジトリは僕が作ります。 GUIクライアントは有料かもしれません。
多少学習コストは掛かりますがcommitとpullとpushくらいならすぐ覚えられます。
デザイナーの人が数分で切り出せるボタンを試行錯誤して30分掛けて切り出す間、僕がコードを書けばデザイナーの人が8時間プログラムを書くよりも随分作業が進む自信はあります。
きっと何かしらのデザインルールでレイアウトされたデザインの座標を一個一個調べながらボタンを配置していく間、僕がコードを書くよりも、最初からこのボタンはここに配置するってレイアウト図を見せてくれればバグを一個や二個くらい潰せる時間が作れます。
デザインファイルを最初からpngで書き出して貰ってレイアウト図と一緒にくださいというのはプログラマーの怠慢でしょうか?
どう書き出すとプログラマーが使い易いか一番良いのか分からない、とよく言われます。
でも、最初に言ってくれればどういう風に切り出して欲しいか説明します。
もしかするとアニメーションを追加する為にレイヤーにしたり、書き出す構造が変化することもあるかもしれません。
それでも僕がどこまで切り出せば良いか分からないシャドーを書き出した方が良いのでしょうか?
AdobeのツールはGUIだから誰でも分かるのかもしれませんが、それはデザイナーの人が
self = [super init]; if(self) { [self setShadowImage:[UIImage imageWithNamed:@"shadow。png"]]; } return self;
別に上の謎の文字列だって適当な文字列じゃないんです。 きちんとした意味があります。 誰だってちゃんと分かるはずです。
ボタンが1px右が正解か2px左が正解かを判別するよりも簡単に間違ってるかどうか分かるシンプルなものです。
確かにAdobeのツールはよく出来ているので僕でも頑張れば使うことが出来ます。
でも、僕はAdobeのツールを使った時の生産性よりも、Stack OverflowやはてなダイアリーやClass Referenceと睨めっこしながらキーボードを叩いて居る方が生産性が高い人種だと思っています。
ただ、デザイナーの人がもう一手間かけて頂けるだけで、僕はもっとコードを書いたりデバッグ出来るし、結果的にプロジェクトとして良い物が出来上がるんじゃないかなというだけなんです。
デザイナーの人がAdobeのツールを習得するためにマウスやペンタブを触っていた時間を僕はプログラムを覚えるためにキーボードを叩き続けていたんです。
もし、デザイナーの人がもう一手間かけて頂けたら...
PHP最新版がようやく正式に発表されましたね。新機能等について調べてみたので流行に敏感な人はぜひ今のうちから勉強しておきましょう。
「?>」を積極的に使うことにより、余計なホワイトスペースを混入させてしまう問題がありました。
これは厄介で非常に根が深い問題でしたが、ようやく根本解決として廃止されました。素晴らしいですね。
今後「?>」を使うとコンパイルエラーとなるので注意が必要です。
昨今抽象化抽象化と特に意味もわからず言葉だけ連呼する人間が増えてきました。しかし新PHP時代における抽象化はもはや人間が理解しなくてもできるようになります。
$class = abstract { $人間 = array('name' => 'yamada', 'age' => 20); $佐藤 = array('age' => 20); $動物->name = '花子'; $動物->type = '犬'; function move ($a) { $a->position++; } }; $class->move();
このような処理が、自動で抽象化され再利用できるようになります。もちろんクラス抽象化だけでなく、手続きやデータ構造であっても適切に自動で抽象化されます。
またcatch文を繋げる事で抽象化に失敗した場合を検出することが可能です。
php実行時オプションに強力な型チェックオプション(-compile)が追加されました。
$ php -compile example.php
そのスクリプトにおける全ての処理パターンを実行し、全ての型のチェックを自動で行います。その際、外部に影響を与えるような処理(ファイルへの保存等)は型チェックのみを行い無視されます。
この強力な機能のおかげでもはや静的言語の利点といわれていたコンパイル時の型チェックを軽く超えました。
動的言語でありながら、考えられる全ての型の引数、例外系を全ての関数の組み合わせで網羅的にチェックします(しかもチェック時間は長くても0.数秒という驚異的なチェック能力です!)
これが今回の目玉機能でしょう。
theworld { // 止まった時間の中を動けるのは$dioだけ $dio->foo(); $dio->bar(); };
$dioという特殊変数が用意されているのでその変数を使って処理をすることができます。
用途としては非常に重たい処理をさせるのがいいでしょう。実時間0秒で実行することが可能となります。
ただし9秒までしか止められないので注意が必要です。ですが回避策として以下のようにすれば追加で5秒止めることも可能です。
theworld { $dio->foo(); $dio->bar(); } starplatinum { // 9秒過ぎた時点でこちらへ $jotaro->foo(); };
名前空間(namespace)が非推奨になりました。これを使用するとE_NAMESPACE_YEN_ARIEHENという警告が発生します。
非推奨となった理由ですが明確にはされていません。大人の事情ってやつでしょう。
ただ噂レベルでは、やはりというか区切り文字の「\」がありえへんという声が多かったからではないか?と一部囁かれています。
mandomキーワードが非推奨になりました。mandomはきっかり6秒戻すという機能ですが、逆に言うと6秒きっかりしか戻せないので扱いづらいという問題がありました。
また以下のような処理を書いた場合に$flagがバグ等で常に真になるケースにおいて無限ループとなり、非常に危険だという問題もあります。
// 何かしらの処理・・・ if ( $flag ) { mandom; }
このようにPHP初心者がmandom使って無限ループをさせてしまう事案が後を絶たず、なかなか現実時間が進まないという問題が発生したため、廃止予定となります。
$mail = google_search_exec("メール送信するやつ",2); $mail("user@example.com");
第一引数は検索ワード。PHPというワードは自動で含まれるので指定する必要はありません。
第二引数は検索結果一覧の指定位置。2だと上から二つ目の検索結果のURLのコード小片を使うという意味になります。
また第三引数にはコールバック関数を指定することによりコード小片にフィルターをかけることも可能です。
このような処理がたった2行で書けるというのがPHPの利点ですね。
日本語名の関数が新たに追加されました。これは非常に便利な関数です。
$code = 写経(" $a = 1 + 2; print $a; ");
引数に与えられたコード片を写経します。戻り値に写経結果が返ってくるのでそれを利用するだけです。簡単ですね。
この関数が呼ばれると一瞬処理が止まったように見えますが、実際には自動補完で動作が完了している状態になります。
for($i=0;$i<10000;$i++) { if ( $i % 2 == 0 ) { chronostasis(); } // 何かしらの処理・・・ }
素晴らしい機能ですね。今後はこれ無しじゃプログラムできなさそうです。
用途ですが、言わずもがな今流行の真契約プログラミング用ですね。アサートの代わりに使うとよいです。
function foo ($a) { pc_explosion(!is_null($a),'$aはNULLはダメー!'); // 何かしらの処理・・・ }
テストコードを実行する場合はPCの周囲に人が居ないか気をつけてから実行させましょう。
個人的に良いなと思ったのはpc_explosion関数ですかね。約束事を守らないプログラマーなんぞ爆死しちゃえばいいんです。僕を含めて(お
32歳、営業職です。
プログラムとかなんもわからんちんなのですが、アプリを作りたいと思いたちアプリを
作ってみました。
とりあえず、アプリのランキングを見ていると、エロ系がやっぱり強いと思って、エロは正義!の名の下に
簡単にアプリを作るために、まずは簡単に作れるフレームワークを探す所から始まります。
フレームワークってなんですか?
それはね、なんだかわからないけど、簡単につくれるようになるものなんですよ。
詳しくは、
外人「システムを作るときに、よく利用する機能とか、構造とか、予めあると便利だろ?
俺が作っといてやったよHAHAHAHAHA」
っていう感じのものだそうです。
プログラミングなんてわからんちんだけど、HTMLくらいは作れるよ!
そんなあなたにPhoneGap(http://phonegap.com/)ということで、
とりあえずPhoneGapを使って見ることに。
でも、実際使ってサンプルを作ったりしてみると、動くは動くんだけど、
色々やろうとすると、Web上にあるドキュメントが古いのか、PhoneGapが最近になって
突如バージョンがあがったせいか、書いてる通りにやってみてもできない。
とりあえずiPhone Developer登録は既に完了していたので、Xcodeをつかってやるぜ!
俺は赤の扉を選ぶぜ!と思ったがはてさてどうすりゃいいのか。
HTMLをプロジェクトに追加するのはドラッグ&ドロップすれば完了だ。
その際にダイアログが出てくるので、"Create folder references for any added folders" を選択しておくと
元々のフォルダ構造とかが失われずそのまま追加できるのでいいぞ。
ほんでもって、UIViewControllerというのを作成する。
IBOutlet で UIWebView を利用するためのオブジェクト変数を用意しておいて、InterfaceBuilderから接続をする。
Files's Owner とかを右クリックして出てきた変数名と画面上についかしたUIWebViewをマウスでつなぎあわせれば
接続できるぞ。なんて簡単なんだ。
一番最初に行われる初期化の処理は viewDidLoad にでも書いておけばいいらしいのでここに書く。
UIWebViewはURLの書式になっていないと開けないようなので、それを調べることから始まる。
アプリ内に追加したリソースファイルは、アプリのデータに内皮されるらしい。
アプリが展開されるフォルダというのは、デバイスにより様々なのだが、そこから内皮されている
ファイルを取得するための処理というのがあるのでそれを利用する。
NSString *html_path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory@"web"];
これでwebフォルダ内にあるindex.htmlファイルの絶対パスを教えてくれるというわけだ。
あとはこれを読みこませればOK。
[web loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:html_path]]];
NSURL というのがURL書式を記述するためのオブジェクトだと思っていただきたい。
ここではローカルファイルのパスを拾うため、 fileURLWithPath とするのがポイントだ。
file://nantarakantara/index.html みたいな書式になるんでしょうね。
なんだか色々理由はあるみたいなんですが、そうですかだめですか。
善は急げで、AndroidSDKとEclipseというものをダウンロード。
昔は色々設定が必要だったが、いまは開けば即使えるようになったらしい。便利便利。
こっちの場合も同じようなやつがあるんでしょう、ほらったWebViewこれを使えばいいらしい。
XCodeのときは、いかにもアプリの画面を作れば完成って感じだったけど、Androidの場合は
Layoutファイルというのを使わないといけないみたい。なんかこれはHTMLみたいな記法だな。。
どうなってんだかよくわかんないですけど、Layoutを作成して、WebViewを配置、
Androidの場合は、assetフォルダというのをつくってあげて、そこにHTMLファイルを
置けばいいらしいですよ。なるほどね。
WebViewでの開き方は、assetフォルダを直接開けばいいだけらしい。いえーい!
layoutに配置したWebViewをオブジェクト変数に呼び出して、、、
webView.loadUrl("file:///android_asset/web/index.html");
ひらいたーおっけーーーーーーー。
だけども、リンクを開くとブラウザが開いてしまうなあ。どうすればいいのこれは。
調べてみるとこうすればいいらしい。
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
これで無事、WebView内で画面遷移するようになりました。
やっほー
そんで、なんとかつくりあげて、申請・・・
とかないんですね、公開したら公開されましたw
ていう感じで始めてつくってみたんで
よかったらダウンロードしてみて下さい!
https://play.google.com/store/apps/details?id=ff.appgroup.app001_hrenai
プログラムはclassに記述します。たとえばSampleという名前のclassを作る場合、Sample.csファイル内に次のように書きます。(C#の場合、ファイル名とクラス名は同一でなくても良い。複数のクラスを書いても良い)
public class Sample { }
プログラムはclass内のMainメソッドの先頭から実行されます。Mainメソッドは次のように書きます。
public class Sample { public static void Main( String[] args ) { // 処理を書く } }
Console.WriteLine( "Hello world" );
コメントです。
// 一行コメント /* 複数行コメント */
// 変数 int num;
データ型です。C#のデータ型には値型と参照型とがあります。以下は値型のデータ型です。
// int(整数)型 int num; // char(文字)型 char c; // float(単精度浮動小数点)型 float val; // double(倍精度浮動小数点)型 double val; // bool(論理)型 bool flag; // DateTime(日付)型 DateTime date;
以下は参照型のデータ型です。
// String型 String s; // 配列型 String[] array;
プログラムをコンパイルするには、コマンドラインで以下のようにします。
csc Sample.cs
プログラムを実行するには、コマンドラインで以下のようにします。
Sample.exe
mono ./Sample.exe
int、float、double型の変数に数値を代入できます。int型には整数だけ代入できます。float、double型には整数でも小数でも代入できます。
int i = 2; int i = 100000000; float num = 1.234f; double num = 1.234;
四則演算です。
num = 1 + 1; num = 1 - 1; num = 1 * 2; num = 1 / 2;
商の求め方です。割る数と割られる数が両方とも整数の場合、計算結果の小数点以下が切り捨てられます。
num = 1 / 2; // 0
割る数と割られる数のどちらかが小数の場合、計算結果の小数点以下が切り捨てられません。
num = 1.0 / 2; // 0.5 num = 1 / 2.0; // 0.5 num = 1.0 / 2.0; // 0.5
余りの求め方です。
// 余り mod = 4 % 2
インクリメントとデクリメントです。
// インクリメント ++i; // デクリメント --i;
String str = "abc";
// 結合 String join = "aaa" + "bbb"; // 分割 String[] record = "aaa,bbb,ccc".Split( "," ); // 長さ int length = "abcdef".Length(); // 切り出し "abcd".Substring( 0, 2 ) // abc // 検索 int result = "abcd".IndexOf( "cd" ) // 見つかった場合はその位置、見つからなかった場合は-1が返る
配列です。
// 配列の宣言 int[] array;
配列の生成です。配列の生成時には要素数を指定するか、初期データを指定します。
int[] array; // 要素数を指定して配列を生成 array = new int[5]; // 初期データを指定して配列を生成 array = new int[] { 1, 2, 3 }; // 宣言と同時に配列を生成 int[] array2 = new int[5];
配列の要素の参照と代入です。
// 要素の参照 array[0] array[1] // 要素の代入 array[0] = 1; array[1] = 2;
array_num = array.Length;
int[] from = new int[] { 1, 2, 3 }; int[] to = new int[5]; from.CopyTo(to, 0);
if文です。
if ( 条件 ) { }
if ~ else文です。
if ( 条件 ) { } else { }
if ~ else if文です。
if ( 条件 ) { } else if ( 条件 ) { }
while文です。
int i = 0; while ( i < 5 ) { // 処理 ++i; }
for文です。
for ( int i = 0; i < 5; ++i ) { // 処理 }
int[] fields = new int[] { 1, 2, 3 }; foreach (int field in fields) { // 処理 }
C#では関数をメソッドと言います。メソッドを作るには次のようにします。戻り値を返却するにはreturn文を使います。
static int sum( int num1, int num2 ) { int total; total = num1 + num2; return total; }
ファイル入出力です。ファイル入出力を行うには、プログラムの先頭に以下を記述します。
using System.IO;
以下がファイル入力の雛形になります。ファイルのオープンや読み込みに失敗した場合、catch節に処理が移ります。
String filename = "text.txt"; StreamReader reader = null; try { reader = new StreamReader(filename); String line; while ((line = reader.ReadLine()) != null) { } } catch (IOException e) { // エラー処理: } finally { if (reader != null) { try { reader.Close(); } catch (IOException e) { } } }
またはC#ではusing ステートメントと言うものがあり、この様にも書ける
String filename = "text.txt"; using (StreamReader reader = new StreamReader(filename)) { try { String line; while ((line = reader.ReadLine()) != null) { // 読み込んだ行を処理 } } catch (IOException e) { // エラー処理: } }
usingをつかうとCloseがなくなったことからわかるようにusing(){}を抜けるときに自動的にDisposeメソッドを呼び出し、オブジェクトを廃棄する。その分コードがスッキリするが、使いにくい場面もあるので考えて使うこと。
以下がファイル出力の雛形になります。ファイルのオープンや書き込みに失敗した場合、catch節に処理が移ります。
String filename = "text.txt"; StreamWriter writer = null; try { writer = new StreamWriter(filename)); writer.WriteLine("abc"); writer.WriteLine("def"); writer.WriteLine("fgh"); } catch (IOException e) { // エラー処理: } finally { if (writer != null) { writer.Close(); } }
こちらもusingを使って書ける。が、割愛する。
C#でよく出てくる知っておいたほうがよい文法の一覧です。
繰り返し文の途中で抜けるにはbreak文を使用します。
for ( i = 0; i < 5; ++i ) { if ( 条件 ) { break; // 条件を満たす場合、for文を抜ける。 } }
残りの部分処理をスキップし、次の繰り返しに進むにはcontinue文を使用します。
for ( i = 0; i < 5; ++i ) { if ( 条件 ) { continue; // 条件を満たす場合、残りの部分処理をスキップし、次の繰り返しに進む。 } }
例外を投げるにはthrow文を使用します。
throw new Exception( "Error messsage" );
try { // 例外が発生する可能性のある処理 } catch ( Exception e ) { // 例外発生時の処理 }
Fooのプロトタイプ | Foo.prototypeのプロトタイプ | |
---|---|---|
class Foo | Function.prototype | Object.prototype |
class Foo extends Class | Class | Class.prototype |
class Foo extends NullOrObject | Function.prototype | NullOrObject |
writable | configurable | enumerable | |
---|---|---|---|
Foo.prototype | ☓ | ☓ | ☓ |
Foo.constructor | ○ | ○ | ☓ |
Foo.prototype.* | ○ | ○ | ☓ |
Rails3 と jQuery で、真面目にオシャレなエロサイトをつくってみました。 - h300
http://d.hatena.ne.jp/inouetakuya/20120331/1333192327
に触発されて、オシャレエロサイトを作ってみました。
オシャレエロサイトを作ろうと思ったのはいいのですが、デザインは苦手なので途方に暮れていました。
h300の方はペパボのソフトウェアエンジニアらしいのですが、こっちはただの素人プログラマー。
そこで何か裏ワザみたいなものはないかとググっていると、Twitter Bootstrapという文字が目にとまりました。
Bootstrapの名前は知っていましたが、深い内容までは知りませんでした。
ですが、紹介記事を読んでみると自分の理想に近かったので早速使ってみることにしました。
Twitter Bootstrapはある程度有名だと思うんですが知らない方のために説明すると、
CSSフレームワークの一つで、ウェブデザインの作成を手助けしてくれるものです。
色々なCSSフレームワークを見ましたがTwitter Bootstrapが一番完成度が高いと感じました。
ウィキを見ると最初のリリースが2011年8月なので比較的最近のものですね。
普段、みなさんがウェブサイトを作る時、HTML + CSSで作られるかなと思うんですよね。
この時、CSSが事前に用意されているとすごく楽じゃないですか?
CSSフレームワークはCSSの大部分を前もって用意してくれているんですよ。(フレームワークによりますが)
ですので基本的にCSSに合わせてHTMLを記述するだけでウェブサイトが出来てしまいます。
CSSに合わせてHTMLを記述するとはどういうことでしょうか?
この文章は薄い青色でハイライトされていますよね? Bootstrapで似たようなことをする場合 <div class="well"> ハイライトしたい文章 </div> という感じになります。
classにwellと指定しているだけですね。
なぜそうするだけで文章がハイライトされるかというと、
divのclassにwellが付いていたら、いい感じでハイライトしてねっていう指示が
Twitter BootstrapのCSSに書いてあるからです。
BootstrapのCSSには、divのclassにalert alert-errorっていうのがあったら警告文だしてねとか、
button class="btn"ってあったらボタン表示させてねとか色んなことが最初から書いてくれています。
もちろん見栄えがよくなるように記述されていますので、classを指定するだけでモダンなデザインになるわけですよ。
CSSに合わせてHTMLを記述するだけでウェブサイトが出来るというのはこういうことです。
でも、最近のウェブサイトは HTML + CSS + JQueryという場合も多いですよね。
安心してください。Twitter Bootstrapの場合はJQueryの基本的な部分も用意してくれています。
ですのでドロップダウンメニューやタブ、スライドショーなどの実装も簡単にできます。
それに加えてBootstrapはよく使うアイコン数百種類まで用意してくれています。
至れり尽くせりですよ。
神様ですね。
CSSが固定化されていると、HTMLも自動的に固定化されます。
CSSに合わせて記述するので当たり前といえば当たり前ですね。
CSSの記述は一定、HTMLもある程度一定なので、メンテナンスが格段にやりやすくなります。
個人プログラマーの方だと、サイトごとにHTMLもCSSもグチャグチャという方も多いのではないでしょうか?
フレームワークを使えばそういうこともなくなるということです。
Twitter Bootstrapの凄さはそれだけではありません。
現在、ユーザーがどんなデバイスでウェブサイトにアクセスしてくるか分かりません。
PC、スマートフォン、iPad、TV、3dsなど全てのデバイスに合わせてデザインを作るのは時間がかかりすぎます。
でもTwitter Bootstrapならbootstrap-responsive.cssというCSSを選ぶだけで、
デバイスの横幅に合わせてデザインが変わるレスポンシブなウェブサイトができます。
もちろんデメリットもありまして、サイトのデザインが似てしまうというのが難点です。
ですが基本はBootstrapを使って、ちょっと自分でカスタマイズしてオリジナルっぽくすることもできますので、
一度Twitter Bootstrapを使ってみる価値はあると思います。
http://twitter.github.com/bootstrap/
Bootstrapの説明が長くなってしまいましたね…。
1.エロいサイトを巡って、XVIDEOSやFC2動画などのリンク、embedされたものがあれば取得。
3.データベースに登録。
一連の作業をクローラーにやらせるプログラムをRubyで書く。
RailsでBootstrapを使うにはtwitter bootstrap railsというgemを使うらしいです。
しかし、使おうと思ったのですが、windowsでは上手くインストールできませんでした。
仕方なく、代わりにsass-rails-bootstrapというものを使いました。
違いはcssにLESSをつかっているかsass(scss)を使用しているかだと思います。
http://d.hatena.ne.jp/tkawa/20120219/p1
の記事が参考になりました。
ちなみにLESSとかSassってのはcssを効率的に書けるすぐれたものです。
最近、webクリエイターボックスさんでも紹介されていました。
http://www.webcreatorbox.com/tech/css-sass/
railsでは3.1からcoffee scriptと共にsassがデフォルトで使えます。
このあたりがRailsの素晴らしさですね。
Bootstrapは画像を綺麗に並べて表示することにも向いているので、
アダルトサイトと相性がいいなと感じました。
AV女優名とか女子校生、人妻などのジャンルのタグがあれば便利ですよね。
Railsではacts-as-taggable-onというgemを使い実装しました。
動画のタイトルが事前に用意したAV女優名リスト、ジャンルリストと合致すればタグ付けするという感じです。
AV女優リストはDMMから、ジャンルリストは大手アダルトサイトから作成しました。
タグ付けするときに あおいそら-蒼井そら みたいな感じでタグ付けするようにしました。
もっとスマートな方法があるはずですが思いつかなかったので仕方ないです。
ア行、カ行…のように行別にわけて、なおかつアイウエオ順で表記してますので
クッキーを使ってログイン不要のブックマーク機能を作りました。
jquery.cookie.jsを使って、cookieを配列に直してごにょごにょしてという感じで実装しました。
削除ボタンを押すと非同期で通信して…などいろいろ面倒でした。
でも、動画の数はかなり増やしていこうと思っていましたので頑張って実装しました。
動画の下のブックマークするボタンを押していただければブックマークできます。
ブックマークするボタンの表示などにBootstrapの便利さを感じました。
実はこれが一番やりたいことでした。
多くのアダルトサイトは広告だらけで、肝心の動画がポツンと小さくあるだけというのが多いです。
戦場で疲れた兵士たちに、そんなせせこましい画面でアダルト動画見ろって?
そんな野暮なこと言いませんよ。
PCスクリーンの画面いっぱいに、大画面で、ドカーンとエロ動画を楽しんで下さいよ。
動画はできるだけ大きく表示しています。もちろんレスポンシブです。
全画面表示にすりゃいいじゃん…っていうのは違うんですよ。
全画面表示だと逃げれないじゃないですか!
不意に誰かが部屋に入ってきたらどうするんですか?
そう考えております。
Bootstrapでデザイン面はスマホ対応にはなっているのですが、
加えてjpmobileというh300で紹介されていたgemを使って、
CPU 2.66GHz、メモリ 2.2GB HDD200GBです。
Railsは遅いので少しでも速くするためにApacheの代わりにNginx使おうと思ったのですが、
PC用のキャッシュとスマホ用のキャッシュを別々に保存して使う
ということがどうしてもできませんでした。
PC用のキャッシュがある場合、スマホ用のキャッシュがなくてもキャッシュがあると認識されるなど、
もともとNginxとrailsのページキャッシュは相性が悪いようです。
Nginx側でキャッシュする、もしくはスマホ用のアドレスを別にすればできるかもしれないですが、
http://m.サイト名 みたいにするのが嫌だったので最終的にNginxを使うことをやめました。
Nginxに関するネット上の記述も少ないので運用するのは危険かな、ということもあります。
Nginxを少しだけ使ってみた感触はかなり速いというものだったので残念でした。
バージョンが変われば、また挑戦したいですね。
【追記】
やっぱNginxでもいけるかもしれないですね。
紹介しないと終わらないということで紹介します。
http://nukisen.com (エロ注意)
サイト名はオシャレに横文字でNukisenにしました。読み方はヌキセンです。
http://bootswatch.com でダウンロードできるBootstrapのテーマそのままですが、
Bootstrapを使うと自動的に細部まで凝ったデザインになるので最高ですね。
下にスクロールしていくと背景のグラデーションが変化したりとか、とても一人ではできないですよね。
長々と説明してきましたが、
ぜひNukisenで大画面のアダルト動画を体感してほしいです。
しばらくは一日30本ぐらいの更新でいく予定です。
アダルトサイト同士の相互リンクでアクセス増やしてなどはしない方向です。
新しいことに挑戦すると得られるものが多いなと感じました。
ウェブサイトを作る際、無意識のうちに自分のできる範囲の技術で構築しがちだと思うんですが、
そうすると成長はないですね。
長文失礼しました。
いや、ごめん。再帰というのは、木構造による再帰、でも、Switchによる再帰でも同じ。そのアルゴリズムで Call命令を使うのか?って事。
あとCでもswitchが嫌で かつ 再帰によるCall命令が許容されるなら、Treeに関数ポインタ持たせて、関数ポインタで評価関数呼び出せばいいじゃん。
単純に要素だけ書けば
struct leaf{
int (*eval)(leaf *);
};
でよかろ 値を入れるときにAddなら eval_add sub なら eval_sub を呼び出せばいい (データー構造と アルゴリズムの分離はCでもできる。)
どっちみち C++でも、子どものevalを親が呼ぶ 時点で call が呼ばれているから、それ再帰。
というかC++自体が こういう vtableのC実装から 生まれている実装なので C++でできて、Cで実装できないって、テンプレとかそういうのぐらいだから。
究極的にはvtalbe実装すればCでもできる。つか、昔のCのコードなんてVtableを第1引数として渡すようなものばっかだろ。
何が言いたいかというと、別に データー構造と アルゴリズムの分離は関数ポインタとVtableの実装によりCでもできる。
switchテーブルが巨大化するのも 小さいクラスが無数にあるのも どっちも同じ事だよ。
Swithならよい Classならよいってことはない。
しわを気にする女優の秘密 www.437867.com 歳をとっても全くしわのない女優さん 秘密は高級エステ?いえ、実は…
リクルートの婚活サービスが登場 twincue.com 価値観の一致に注目した新しい婚活 まずは無料会員登録!
結婚写真をプチギフトに mygum.jp あの懐かしの 「フーセンガム」 を、 2人の幸せ写真で飾って皆に配ろう!
邸宅貸切ブライダルフォト enchante-nature.com/ 1日2組限定全天候型ガーデン付邸宅 を貸切って優雅にブライダルフォト
タイ・バンコク海外求人 work-asia.com 日本語だけで働けるタイ・バンコクの コールセンター海外求人情報
結婚まだ29歳、もう29歳 www.sunmarie.com 正規会員20,000名からめぐり会う! サンマリエの無料プロフィール紹介
デザインオフィス GRIZLAB www.grizlab.com 神奈川県横浜市のホームページ制作 SEOに強いホームページを作りませんか
WordPressでサイト制作 HomePageGallery.jp モニタープランあり。 大変リーズナブルです。
矯正でオススメの初診相談 www.sigma-kyousei.net 具体的なアドバイスができる。 /東京・巣鴨シグマ矯正歯科
"口臭いよ"と言われたら? www.w-direct.jp 人には聞けない、口が臭い理由… 困った時、1秒で出来る口臭対策は?
発達障害児のための塾なら sakuranbo-class.com お子様の状態に合ったコースが選べる 地域の学校の情報提供も致します。
発達障害のある子供の塾 www.shizengakuen.com/ 広汎性発達障害や不登校生の学習支援 生徒の特性を理解した上での春期講習
邸宅貸切ブライダルフォト enchante-nature.com/ 1日2組限定全天候型ガーデン付邸宅 を貸切って優雅にブライダルフォト
女性のみなさんへ direct.himawari-life.com 3年ごと15万円が受け取れる NKSJひまわり生命のフェミニーヌ
医師との結婚は誠心 seishin.net 医師を中心としたご紹介。 徹底したサービスで27年の実績。
婚活動画はじめませんか? konkatsu.douga.asia/ 婚活用インタビュー動画制作9,800円 魅力が伝わる!特設スタジオで即撮影
エグゼクティブと結婚希望 exe.11-deai.com/ エグゼクティブ専門の結婚相談所 アイエグゼ。無料パートナー紹介。
セレブと結婚を目指すなら exe.11-deai.com/ エグゼクティブ結婚相談所アイエグゼ 幸せな結婚。資料請求申込みはこちら
介護予防運動指導員学校 www.careshikakunavi.com/ 1分で完了!"無料"で一括資料請求。 介護予防講座をカンタン一覧比較可能
購買サプライチェーン転職 MichaelPage.co.jp/Engineering 自動車業界のマネージャー職 外資系転職はマイケル・ペイジ
ブライダル業界のプロに www.vantan-career.co.jp 通学は週1回!社会人・フリーター・ 大学生向け専門校。就職もサポート
ディズニーランドで合コン開催 4seen.jp 夢の国を思う存分楽しみませんか? ワンデーパスポートもセット 7/7(土)
"臨床工学技師"経験者限定の転職 doda.jp 臨床工学技師の転職実績が豊富なDODAで、 給料UP転職を実現しましょう!
幕張/家具の大バザール www.kanetaya.com 《6/22-24 in幕張メッセ》最大70%OFF 国内最大級の家具大バザール
≪ADHD児≫の学習支援 leaf-school.jp 期間限定で入塾金無料キャンペーン 実施中。無料体験も今だけ。@中目黒
療育施設で解決しない言葉の遅れ www.kotoba29.com 自閉症、発達障害児も実績有。2~6歳児の 言葉の引出し方。指導30年の著者がDVD化
自宅でコーヒーの資格取得 www.tusin-kyouiku.com 通信教育だから、自分のペースで 自宅で学べ、資格も取得できます。
結婚へ一直線≪ツヴァイ≫ www.zwei.com 貴方にはアナタだけに合った人がいる! 真剣だからこそ貴重な出会い 全力支援
なぜ あの人だけ結果が出るの? Seikou.me 仕事もお金も人間関係もすべてが 上手くいく人といかない人の違いとは?
ビジネスマンの勉強会なら www.isoroot.jp コミュニケーション力UPの秘訣を公開 まずは個別の無料アドバイス実施中。
再婚限定の結婚相談所 rema.11-deai.com/ アイリマリッジは再婚者を対象にした 再婚専門のお見合い結婚相談所です。
TOEIC高得点を目指すなら www.simulacademy.com オリコンCSランキング総合第1位! 7月期受講生募集。今なら入学金半額
赤ちゃん出な~い便秘解消 origotou.com 日本で1番選ばれているオリゴ糖食品! 赤ん坊に負担なく100%天然でスッキリ
≪障害仕事探し≫ work-salon.com 精神障がい者向け就職支援。働きたい と思ったら無料キャリア相談会へ
成長に合わせて選べる療育 yotsuyagakuin-ryoiku.com 自閉症・発達障害児に出来る自信を。 受講者からの嬉しい声が続々/四谷学院
CISA資格取得ならアビタス www.abitus.co.jp 合格率80%公認情報システム監査人 CISA合格のためのコツを伝授!
"婚活結婚診断テスト"無料 www.sunmarie.com 自分と理想の相手を、ズバっと診断! 結婚相談所 "サンマリエ"が婚活を応援
心理士スクール探しなら www.careshikakunavi.com/ 1分で完了!"無料"で一括資料請求。 カウンセラー講座をカンタン一覧比較
≪仕事精神障害者≫ work-salon.com 就業可能な精神障がい者向け就職支援 リクルートグループが運営。
≪仕事障害≫ work-salon.com 就業可能な精神障がい者向け就職支援 リクルートグループが運営。
ディベートトレーニング www.isoroot.jp/commu-training ビジネスに活きるディベート力UP 個別に無料アドバイス。20-30代限定
エグゼクティブの求人なら www.bizreach.jp 年収1000万円~3000万円の案件多数 最大級の転職情報でキャリアアップ
ピクノジェノール1000円 www.earthpure.co.jp 高品質ピクノジェノールが お試し価格で送料無料!
誠心”公式サイト” seishin.net 慶應大学医学部OBの交流クラブ からスタートして27年の実績。
離婚カウンセラー養成学校 rikon.tv/kouza/ 離婚カウンセラーは通信通学コースが あり独立もでき一生の仕事になります
今 一番売れている英語教材 every-e.com 第1位/英語教材部門第1位獲得! 今、最も売れている英語教材EEとは?
互換インク最安値挑戦 ink-revolution.com/ 安すぎ“インクカートリッジ”がズラり インクの事なら、インク革命.COM
プロジェクトマネージャー www.kobedenshi.ac.jp "神戸電子専門学校"ソフト分野を 極めるなら、ITエキスパート学科へ
医療事務はニック教育講座 www.29-4153.com 医療事務のパイオニア日本医療事務 センターの運営する就業直結スクール
質問:アスペルガー症候群 Doctor.JustAnswer.jp/Mental 専門家がオンラインで待機中です。 どんな質問でも今すぐ回答をゲット。
背中ニキビが気になる方へ www.jewel-rain.com 一日たった2回のケアで魅せる背中へ モニター満足度91%のボディジェル
サマソニ投票 buzz.getstage.com 濡れピーナッツに 汚れた一票を
精神に問題の人を10分診断で発見 www.psychotest.jp/ 人材派遣・人材紹介会社の企業防衛対策。 人材リスク診断。月24000万円~使い放題
子育て応援券で可愛い記念写真を studio-pure.net 杉並区西荻のスタジオピュア。衣装/撮影/ 写真のセットを応援券でお支払いできます
セラミックでお困りの方は old-new.co.jp セラミックの素材開発から商品化まで 素材調達から加工、試験まで相談可
子供たちの輝ける瞬間を写真撮影 www.studioetoile.com 《子供写真》撮るならココ!カラフル 空間から溢れ出す輝きの一枚@二子玉川
自宅で学習できる FAX教室 happy-study.jp/ FAX学習のハピスタなら自宅で効率良く 勉強する事が可能です。無料お試しも!
9月までにTOEFL iBTの基礎完成 www.lingollc.com/toefl/65.html 火曜iBT45クラス6/28開講。各自PC使用 エッセイ添削。無料体験授業6/24。飯田橋
ベビーマッサージスクール ihta.or.jp 赤ちゃんの為のマッサージ・ヨガ サイン・食育・すべてが学べるIHTA
おむつ替シートプレゼント www.shimajiro.co.jp 【全員無料】赤ちゃんのお出かけに便利! 《こどもちゃれんじBaby》資料請求へ
ブランド子供服オンラインセール glamour-sales.com ≪送料は完全無料≫お目当ての ブランドは早めの無料会員登録でGET!
高音質の速聴きソフト speed-listening2.net 音声・動画を高音質で倍速聴きして 頭の回転が早くなる!医学博士も推薦
お子様の言葉の発達が不安な方へ www.kotoba29.com 発達障害の子も実績有。2~6歳児の言葉を 引出す方を幼児指導歴30年の著者がDVD化
心の不調は成長の可能性 hikagedou.moo.jp アンティーク調の小さな心理相談室で 臨床心理士とカウンセリング・箱庭を
転職で年収を100万円以上アップ careerconnection.jp 年収100万円以上アップの求人情報多数! キャリコネ転職サービスに今すぐ登録。
やっぱりくだらない事をしてくれたもんだなあと思う。
class MyClass constructor: -> name = 'unknown' @getName = -> return name @setName = (newName) -> name = newName MyClass:: = do -> _greet = -> console.log('どうも、' + @getName() + 'です。') return { constructor: MyClass greet: _greet } myInstance = new MyClass() myInstance.setName('純子') myInstance.greet() #どうも、純子です。
CoffeeScript で @なんとかのプロパティが全部パブリックになるのが気になってて。
Webゲームっていうか、ブラウザ上で動くような奴。PHP(5.3)で突貫工事したので、ペラペラな感じだけど、なんとか公開できて、たまに遊びに来てくれる人がいて(一時はVIPに募集スレも立ったらしい)、何戦かして帰っていくので、とりあえずサーバー代を払った価値くらいはあったかなーという感じ。
で、どういうゲームかっていえば、人狼みたいに「陣営に別れて、決められた目標をクリアするゲーム」です。
『レジスタンス』っていう卓上ゲームというのかな?それを参考にして作りました。
ちょうど開発してから、一ヶ月程度になったので、宣伝をかねて、現状みたいなのをメモ。
一応、前提としては、Pythonだったら、何かしらのシェルプログラムを書いてcronしてるけど、それ以上のことはしていない程度の、技術ワナビー。
ほぼ業務経験なし。継続してスクリプトを開発したのは、今回が始めてという感じ。
単純にPHPで何か作りたいなーと思ったから。一度はPHPを書くべきだなあと思ったりした。それで、何かいい題材ないかなーと思って探してた。
「昔、人狼BBSで遊んだことあるなー、でも同じ人狼のゲームを作っても芸が無いしなー」と考えていたところ、知人と遊んだ『レジスタンス』ってゲームにピンと来て、「こういうゲームをWeb上で遊べたらいいかな。調べたところ、Web上でも人狼っぽいって言われるし、上手くそういう層にアピールできそう」ということで作り始めたのでした。
とはいえ、最初は勢いで書き散らしたので、本当にClassとかまったくなかった。それを徐々に整え直して、なんとかファイル分割できるようになった。それでも、全く足りない。具体的には下のような部分が汚い。
本当はCakePHPとかそういったフレームワークを使えば良かったんだろうけど、「重いんだったら仕方ないしなー」というわけで、フレームワーク無しで使ってみたんだけど、結果として表示部分にやたらと処理が入って醜いったらありゃしない。
表示部分と、実際のシステム部分はわけられるべきだし、フレームワークを使わないまでも、そういう風な機能分割は必要。
で、そういうコードを書いたせいで、下のようなことが起きる。
PHPUnit使ってユニットテストは書いているんだけど、まったく足りない。
全部グリーンにはなるんだけど、実際に動かしてみるとバンバンエラーが出る。
幾つかの関数はテストを先に書いたりしたんだけど、表示部分とかは「ここテスト書きにくいから誤魔化しちゃえー」といって書いたりした。
で、何が起きるかっつーと、リファクタリングするときにガンガン機能が落ちる。そして死ぬ。
さすがに一つのClassが1000行くらいになってきたので「うっわー、これは駄目だわ。分割するべき」って、ゴミみたいなコードに手を入れ始めるんだけど、全く歯が立たない。
とりあえず、既存のテストはグリーンになるけど、どこかで処理がつまづいているという状態でこれは駄目。
「うわ、この部分、テスト書きにくい!」って思った時点で、何かを嗅ぎつけてちゃんとテストに落としておけばよかった、と反省することしきり。
結果として手作業で複数ブラウザ起動して……みたいなことになっちゃう。バグの温存。
CSSとか勉強のために、自分で1から書いているけれども、これは本当にだるい。
知人から、綺麗にコードが書けるから、と薦めてもらったSaSSを使っているけれども、なかなか綺麗にできない。
一応、Twitter BootStrapは知っていたけれども、それに頼るよりは一から書こうと決心して書いたためか、ようわからないし、デザインとしてもこなれていないために気持ち悪いことになっている。
上記のフレームワークについてもそうだけど、流行っているものには、それなりの理由があって、それをわざわざ避けても、結果として、それ以上のものは(素人に毛が生えているくらいでしかない以上)ならないような気がする。
ならばとっととそういうものを使って、さっさと済ませてしまえばよかったなーと思ったりした。
ゲームという性質である以上、どんどん情報量が増えていくために、そういうのを表示しまくっていると、本当に画面がぐちゃぐちゃになる。
セキュリティーには本当手をつけられていない。(徳丸本読めという話になると思う)
(略)
で、本当にボロボロになりながら作ってみて良かったことをメモしておく。
自分は割と現実逃避の為に何かに没頭することがあって、その逃げ先としてプログラミングっていいなあと思ったりした。
あと、自分が書いたコードがヒョコヒョコ頑張っている姿をみていると、すごくかわいくなる。形にもなるし、「こういうものを作ったよ」とも言える。それは単純に楽しい経験。
元々、自分が好きそうなものから題材をピックアップしただけあって、自分が作っているものが、自分が一番愛用しているというのは幸せなことだなと思う。
自分が楽しむためのものだから、自分が一番のユーザーであるし、自分が快適に使いつづけるために改良を続けてる。
人から「こうしたらいいんじゃないの?」というのも勉強になるし、自分がちゃんと&楽に機能を拡張できるように、ちゃんと勉強しようとも思う。そういうのは本当にいい循環。
大抵は、自分が使うから自分だけのものだったので、あまり他の人が使ってくれることを期待していなかったんだけど、今回のは、ときどき遊びに来てくれる人が居る。
例えば、VIPでスレが立ってたり、あるいはニコニコ生放送でプレイ実況を配信してくれたり。
割と「くっだらねー」と思うけど、一人で細々と開発していると、そういう些細なことが嬉しかったりする。
なので、ついついみてしまったり、場合によっては、プレイしているところをいつまでも一緒に徹夜して観戦していたりする。人のプレイしている姿が楽しいというのも、自分が作って良かったなあと思う。
逆に言えば、使ってくれる人がいるからこそ、一ヶ月間開発が続いているようなもので、「ああ、自分のプログラムで楽しんでくれる人が居るんだな」という手応えみたいなものが、モチベーションになっている。
遊んでくれる人が見えるというのは、自分にとっては、モチベーション維持に大切になってる。
だいたい三日坊主で終わっている自分としては、開発が長く続いているほうだと思う。
目指すところは、もっと綺麗なソースコードにして、Githubで公開すること(いや、もうアカウントは既に持っているんだけど、公開するのは凄く恥ずかしい)。
When considering imagine consuming, getting easy methods to make use of the digital camera are probably the fundamental assignments on the establish. The examples below digital slr high-end camera lead provides basic fundamentals about options to partner with an individual's camera and as a consequence assist you greater establish the standard terminology mandatory.
Whereby Consumers Start out... A Security dslr camera
Even if there are a not difficult motor vehicle photo video camera intended to any ordinary snapshot taker planning to point and also return or simply warning buzzers together with whistle enhanced Digital slr, the most crucial starting point is to use what you consist of. If you have had for no reason undoubtedly,Panasonic HDC-TM900 Charge do not forget to evaluate any hands-on plus try out to achieve the just about all working experience you could as a result. A good number of manuals can verify all to consider about precisely how towards employ that video camera. Keep in mind, it should receive baffling you will be know simple digital camera words.
The most crucial several stipulations to consider together with taking photographs might be:
1. Shutter Full speed
step 2. Aperture
3. ISO
A good number of a handful of situations the many examine various things holdings and even debts high-end cameras which will understand cope with the simplest way and also variety of lighting is likely to be allow in the digicam to make sure you set-up scenes. Taking photographs is Panasonic VW-VBN260 Battery focused lumination in addition to minor innovations through soothing is commonly addressed feel gigantic has effects on on what this persona success considering.
Classified ads by just The search engines
Whatever aperture in our video camera is actually which usually "iris-like" product the opens and as well turns. The item appliances just how much light-weight is usually earn all around via the bit of throw away. The larger any sort of ditch, the greater light make it possible for round. This really is fantastic with F-Stops the moment f5. 6 is usually a considerable primary as opposed to f16 are sometimes small to medium sized primary. You need a much larger initially suitable for dark surrounds in addition to a less starting off suitable very dazzling illnesses.
Shutter Pace
In relation to aperture adjustments the figures on a fabulous throw away the fact that brightness switches into because of, almost any shutter accelerate apparatus just how long this approach light-weight is actually come up with interior. A nice shutter swiftness connected with 1/500 is going to make very low minor utilizing not like a lengthier shutter fee approximately 1/5 need after only supplemental moderate. It's fantastic with secs. You need to work with painless shutter facts convert gears designed for circumstances by means of many moderate aside from systematic shutter rates of speed when particularly full experiences.
Any sort of ISO adjustments a fabulous tenderness of the "film". Intended for camcorders, whereas it doesn't management picture presently, everything adjustments a fabulous tenderness with the high-end camera sensor. A greater ISO options can certainly help produce styles photograph become faster and as well demand even less smooth compared to a decreased ISO. Strangling part of managing great ISO is probably of the fact that enhanced ISO's ordinarily result in a detraction at the time of envision first-class high quality as well as almond.
At the moment knowing the exact a couple of valuable symbol photo digital portrait photography useful tips future move is usually to see how a large amount of several associated with routine aside throughout both as well as the option to select the right configuration settings for each solo! A bunch of security surveillance cameras own methods the moment anyone software one of these simple together with security surveillance camera might easily consider useful configuration settings with the sleeping. A couple selections usually are shutter priority along with Panasonic VW-VBK180 Battery aperture the main ageda once approximately just about every individual individuals manage probably lots of the shutter accelerate or even this particular aperture.
The final fundamental digital slr high-end camera efficiency content is usually intent. A bunch of security surveillance cameras own automotive intend that's characteristically poor along with translates to fluffy photos often. The most effective will be to realize how to work together with intelligent emphasizing in addition to using the services of main aim metering that will help methodically tutorial put focus.
You bring me right back down to the Earth from the Promised Land
We’re getting close to the center of the Earth with an honest plan.
確たる意志を携えて ぼくらは世界の中心にいくんだ
You’ll never be your mother or your father do you understand?
きみはとうさんやかあさんみたいになれない わかってる?
Until you understand!
なら きみがわかってくれるまで
We don’t have too much time here, and time it travels far too fast!
We’re not too far we’re turning, before they take it from our hands!
いつだってぼくら 引き返せるよ あいつらに全部うばわれるまえに
Why don’t you teach your heart to fill, and give your love love,
きみの心を満たしておくれよ そして 愛を 愛を
Give your love love and give it all away
愛をちょうだい そして すべてさらけだして
Why don’t you teach your heart to talk and give your love love,
きみの心を打ち明けておくれよ そして 愛を 愛を
愛をちょうだい
ぼくの欲しいもの ちょうだい
We’ll takのe you right back down to the Earth from the Motherland,
きみは呼ばれてここにくるんだ ぼくらは母国から君を呼ぶんだ
This is a first-class journey from the gods to the son of man.
You’re at the gates of human evolution don’t you understand?
きみは門の前まで来てるんだ 人類の進化の門の前まで わかるだろ?
Why don’t you understand [understand]?
わかってくれよ
We don’t have too much time here, and time it travels far too fast!
We’re not too far we’re turning, before they take it from our hands!
いつだってぼくら 引き返せるよ あいつらに全部うばわれるまえに
Why don’t you teach your heart to fill, and give your love love,
きみの心を満たしておくれよ そして 愛を 愛を
Give your love love and give it all away
愛をちょうだい そして すべてさらけだして
Why don’t you teach your heart to talk and give your love love,
きみの心を打ち明けておくれよ そして 愛を 愛を
愛をちょうだい
ぼくの欲しいもの ちょうだい
via http://b.hatena.ne.jp/torin/20110614#bookmark-46762850
// ==UserScript== // ==/UserScript== (function(){ if (null != window.frameElement) return false; if (! location.pathname.match(/^\/li\//)) return false; window.addEventListener('DOMContentLoaded', function() { var curator = document.querySelector('div.balloon_box.info_prof div.balloon_img.tltip').getAttribute('title').toLowerCase(); var tweeters = document.querySelectorAll('div.tweet_box div.status div.status_right a.status_name'); var len = tweeters.length; var tweeter = ''; for (var i = 0; i < len; i++) { if(curator != tweeters.item(i).textContent.toLowerCase()) { break; } } if (i >= len) { var data = 'data:image/png;base64,'+ 'iVBORw0KGgoAAAANSUhEUgAAAKQAAAA9CAYAAAAj3MLKAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAC'+ 'vUlEQVR4nO2YS27DMAxEffNerOteq0UDFEgXkinxMyN6FrOKYT0On5Ki18fX56UoLIEDKMp7Yl92'+ 'Xd9/SYWenFPFoCTtNuxFbyJkCjE7p4pByUuJKKHAErJ1UkXJEEJC9k66LNFSSMjeiX9hspTMQuoi'+ 'BHSYvZjoJbEKib4MXVK6oIglScjeKV+Sd1ESsncgi/IsS0L2DmxZuwuTkL1Td1CQlBKyd2oPC5BS'+ 'QvZO/YFOKauFHPF6g148azCHOpZUKWSWjBKTTEiPlN2ElJQkQu5KKSF7Bw/glHLlM0nJn9LS0am+'+ 'WFEX8El5jIzZi185y/Iseh4JKSHdu0DLJCGJFmY97+QZS4SsKIkhBTebQsjTxYQDrCwNzeUVstsl'+ 'fIyQJ0oZJWRUT+x9DedBA+yUjeayslbJ00lKOMBu2WguC2e1NKd0NZ0BDdClaI+QT+tqyo8G6FL0'+ 'jK3655S5p1t2NIC3aJayd4R8Yk+37GiALmWPmFC8jB2ZuNEAUWWjC5/9LCM4I8/OmGF4gdFyMRSe'+ 'yYNkjDg7Y45pP2ixMiRgYkGySUgiEVg42Jgi50rpCi1UpgwMDGzf2pFzpXS1W/ApYRASIWMrIdES'+ 'dRISJWOUkJHvsbyzrYgS8sz/RbYW8skyHi8kWp5uMjIsn5HJLSQakD0SMph5Vioajj0s39JWNnRf'+ 'Ju6T4dkWztQhG4+Z+2R4pmUzdcjGs8Q+GgANxhwJmcg+GgANxhqrjKgOmVi2+EdDoMEYsyIjokMW'+ 'DtcMo0HQYGy5Ew/dIdPFcM3BUOYJYRayi4yvWWYDoeFYYlk4qr9OMr7muRsMDQgtZ+FvRDYh0d1t'+ 'z2Mtv0syZEQJ2U3Gf0JKSruQ1ucRMkrIA+NZ+MrzktEp5FPE3F165POScUHIzlLuLj/j+Ugh0SKl'+ 'C6lwprOMr/nQAMrG0prK+JsfF3m2CCi6mVcAAAAASUVORK5CYII='; var div = document.createElement('div'); var img = document.createElement('img'); img.setAttribute('class', 'za-wa'); img.src = data; function remimg() { var rem = document.querySelector('img.za-wa'); if(rem) { window.setInterval(function() { rem.style.opacity -= 0.05; if (rem.style.opacity == 0) { document.body.removeChild(rem); return; } }, 100); } } function addimg() { var c_img = img.cloneNode(false); c_img.style.position = 'fixed'; c_img.style.top = Math.floor(Math.random() * 100) + '%'; var leftp = Math.floor(Math.random() * 100); if(leftp < 50) { leftp = Math.floor(leftp / 4); } else { leftp = 100 - Math.floor(leftp / 4); } leftp += '%'; var ratio = (120 - Math.floor(Math.random() * 70)); c_img.style.left = leftp; c_img.style.zIndex = -1; c_img.style.opacity = 1; c_img.style.width = (Math.floor(164 * ratio / 100)) + 'px'; c_img.style.height = (Math.floor(61 * ratio / 100)) + 'px'; document.body.appendChild(c_img); var r = Math.floor(Math.random() * 1000) + 1000; window.setTimeout(addimg, r); window.setTimeout(remimg, 2500); } addimg(); } }, false); })();
Javaだけど。
class HelloWorld { public static void main(String args[]) { System.out.println("Hellp World"); } }
fooのintへのキャストがtrue/falseを返すというように、fooのクラス仕様が決められてるんなら、
そしてboolへのキャストが未定義だったり、また違う意味なのなら
if (foo) {
ではなく
if (foo == true) {
って書かざるをえないだろう。嫌いとか好きとかの問題ではないと思う。
class { public: operator bool() { std::cout << "xxx\n"; return true; } //*1 operator int() { std::cout << "yyy\n"; return true; } //*2 } foo;
があったときに、「if (!foo)」だったら*1が、「if (foo == false)」だったら*2が実行されるような処理系がある。
最新のVC++だと後者は曖昧だってエラー出るね(たぶんC++だと「trueは1でfalseは0」なんかではなくあくまでもtrueとfalseなんだ)。
なんにせよ演算子や条件式などに関連する暗黙のキャストはわかりづらく、そしてそんなのを利用したコードはきっとバグる。
だから
というのが本当なら、==trueがどうこうなんて些細な問題はおいておいて、fooを暗黙のうちにintにキャストしたりboolにキャストしたりして使っているという危険な部分をまずなんとかすべきだろう。
古いC言語風に書けばこんな感じ。
#define FALSE 0 #define TRUE (!FALSE)確かに、実際に値を表示させてみると、昔のVC6だと「1」という結果が出てくるし、VB6だと「-1」という結果が出てくる。これ、当時混乱の元だったんだよね。
VC6とか関係なくてC言語の仕様でそうなんだが、それをわかってないとすればやばい。
個人的には
if( foo != FALSE ){
も十分きもちわるいので
if (foo) { ... } if (!foo) { ... }
にしてほしい。
最新はこれでいいんですか?
誰も話題にしてないので俺だけかな
reblogcount しか動いてなかったので自力で直そうと頑張ってみたが、
一応動画の再生と画像の拡大2種の3つに関しては動くようにできた
likeは使ってないのでとくに見てませんすみません
if (img[n].style.display != 'none') { click($X('./a', img[n])[0]); return stdin; } else{ click($X('./preceding-sibling::a[1]', img[n])[0]); return stdin; }
および
if (mov[n].style.display != 'none') { click($X('.//a', mov[n])[0]); return stdin; }
これは何をしてるんでしょうか?
残したままだとどうもうまくいかなかったので丸ごと削ってしまった
クリックすべき要素を直接XPath指定、にしたんだけどマズイ?
以下patchです
@include に www.tumblr.com/queue* も勝手に足してしまいました
どなたかまともにしてくださいm(__)m
--- 20101127_play_on_tumblr.user.js +++ 20110402_play_on_tumblr.user.js @@ -6,6 +6,7 @@ // @include http://www.tumblr.com/show/* // @include http://www.tumblr.com/tumblelog/* // @include http://www.tumblr.com/tagged/* +// @include http://www.tumblr.com/queue* // ==/UserScript== (function() { @@ -43,25 +44,15 @@ command: function(stdin) { try { if (!stdin.length) stdin = execute('current-node'); - var img = $X('.//div[starts-with(@id, "highres_photo")]', stdin[0]); + var img = $X('.//img[contains(@id, "thumbnail_photo_")]', stdin[0]); for (var n = 0; n < img.length; n++) { - if (img[n].style.display != 'none') { - click($X('./a', img[n])[0]); - return stdin; + click(img[n]); } - else{ - click($X('./preceding-sibling::a[1]', img[n])[0]); - return stdin; - } - } - var mov = $X('.//div[contains(@id,"watch_") and .//a]', stdin[0]); + var mov = $X('.//img[contains(@id,"video_thumbnail_")]', stdin[0]); for (var n = 0; n < mov.length; n++) { - if (mov[n].style.display != 'none') { - click($X('.//a', mov[n])[0]); - return stdin; + click(mov[n]); } - } - var timg = $X('.//img[contains(@src,"tumblr.com/tumblr_")]|.//img[@class="inline_external_image"]', stdin[0]); + var timg = $X('.//img[contains(@class, "inline_external_image")]', stdin[0]); for (var n = 0; n < timg.length; n++) { click(timg[n]); }
http://1-byte.jp/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer/
良いPHPerだって?そんなものは丸めてゴミ箱にでも捨ててしまった方が資源の再利用になる分いくらかマシだ。
つまり俺たちがしなくちゃならないことは「より良いPHPerにならないため」に何ができるかってことなのさ。
それじゃ、始めよう。
?>なんて使っちゃいけない。そう俺たちはBAD PHPer。
無駄なホワイトスペースの出力に悩まされるくらいなら対称性なんて丸めてゴミ箱にでも捨てた方がまだマシだ。非対称性こそが賛美。
require_once("config.php");
未だにこんなことやってるやつがいるのかいベイベー。絶対にダメだ。この一行を見たら俺は悶絶する。
ダメだ、早く何とかしないと。
大抵このconfig.phpの中身はこうなっている。見て絶望だ。
$hoge_path = ''; if (!LOCAL) { define('FOO_FLAG', 1); if (HONBAN) { define('HOGE_FLAG', 1); } else if (TEST) { define('HOGE_FLAG', 2); } } else { $hoge_path = '/local'; define('FOO_FLAG', 2); define('HOGE_FLAG', 3); } define('HOGE_URL', $hoge_path.'/hoge/');
こういうのが延々と続くわけだ。もういやだ。もう見たくない。
本番環境とテスト環境でどういう値の違いがあるのか、ローカル環境だとどうなるのか、まったく把握できる気がしない。
なまじPHPな設定ファイルのせいで、処理をついつい書いてしまう。そしてどんどん複雑になってしまう。
やはり設定データは基本的にYAML等のデータしか定義できない形式のもので用意すべきだ。そして環境ごとに設定ファイルを分けるべきである。
そうすることで何にどういう違いがあるのかすぐにわかるし、diffすれば一度にすべて把握することができる。
# 本番環境設定ファイル foo_flag: 1 hoge_flag: 1 hoge_url: '/hoge/'
# テスト環境設定ファイル foo_flag: 1 hoge_flag: 2 hoge_url: '/hoge/'
# ローカル環境設定ファイル foo_flag: 2 hoge_flag: 3 hoge_url: '/local/hoge/'
// ここで後の処理のためにhogeメソッドを呼び出しておく $q->foo(); // $a['foo']はここに来る時点で真のはず // 2010-03-10 判定がおかしいので修正 // 2010-06-21 やっぱり値が入ってる方が正しい if ( !isset($hoge[0]) ) { }
コメントは保守されない。そう、それは真実。こんなコメントを発見したら即効削除しよう。コメントは基本信じるな。
俺たちにちょっとしたヒントと大きな損害を与えてくれる、それがコメントの役割なのだ。
わかる。いいたい事はとてもわかる。俺たちはしばしばインデントにスペースを使うはずだ。一方でIDEのしっかりした言語ではタブも使うことがある。しかし悪いことに、両者を混同しているプログラマも一定数いるのだ。
タブを画面上で認識しにくいエディタが世の中には存在する(何とは言わないが)
そして画面上で認識しにくいことを理由にタブを気にしないプログラマがいる。
この二つの条件が重なると、タブとスペースの交じり合ったインデントが完成する。もうぐちゃぐちゃだ。これは永遠に続く戦いだ。
私たちが勝利を掴むためにできることなどせいぜい、常にスペースしか使わない。タブを見つけたらその都度スペースに変換する。そういった地道な活動が明日へとつながるのだ。
われわれがプログラムをするとき、何に一番時間がかかってるか。実は変数の命名なのである。ここで拘り過ぎて時間をかけ過ぎては何も進まない。
御託はイイからさっさと書け、だ。しかしとはいっても変数名は重要。日頃からどういうときにどんな名前を使うかを決めておくといい。
そして変数名に型はまったく必要ない。型宣言のないPHPにおいて、型の変数名をつけること自体ナンセンスだ。
$iNumber = 'aaa';
になんの意味もない。コメントを信じるなでも言ったが、これはプログラマを混乱させるだけの害悪なものだ。
変数を使う前に初期化するのは、警告を出さないという意味でも良い癖だ。しかし具体的にどこでやるかが問題だ。
$foo = null; $foo = $q->foo();
こんな初期化に意味はない。よくあるのはやはり、if文で値を振り分けるケースだろう
$foo = null; if ( $hoge ) { $foo = 1; } else if ( $bar ) { $foo = 2; }
このときの初期化はとても有効だ。もしnullの初期化を忘れたまま$fooを使うと警告が出るが、ちゃんと初期化してるので出ない。基本中の基本だ。
function getStatus() { $bReturn = false; if ($i == 2) $bReturn = true; return $bReturn; }(中略)
もし、何かしらの理由で、あなたの書いたif文が間違っていたら?
この書き方をしていれば、間違った値に対して、常にfalseが返る。
私たちが、PHPでsensitiveなデータを取り扱うなら、正しいデータが入力されるまでは、動かないコードを書くべきだ。
trueとfalseの条件がいまいち明確ではないが、本当に動かないコードを書けというのであれば以下のようにすべきだ
function getStatus() { $bReturn = false; if ($i == 2) $bReturn = true; else if ($i == 1) $bReturn = false; else throw new Exception("bad status! $i"); return $bReturn; }
中途半端にfalseを返して生存させる必要性はまったくない。今すぐ死ね!
連想配列のキーを指定する場合だけ定数と間違わないようにクオートで囲まなければならない。そして逆に定数を使いたい場合はクオートで囲ってはいけない。
更に後世のプログラマが処理を見たときに、定数が使いたかったのか、文字列が使いたかったのかを明確にしたい場合はconstantを使うと良い。
// 定数のFOOを使うよということが明確になる print $a[constant('FOO')];
もし、文字列を変数の値と一緒に出力するとき、PHPではコンマの代わりにprintfを使うことが使える。
printf( “Hello, my name is %s“, $sName);
以下の代わりに上記のコードを使う。
echo “Hello, my name is “, $sName;
出力すべき変数が増えれば増えるほど、有効になっていく。とにかく迷ったならば、printfを使え、だ。
三項演算子はとても有効だ。しかし優先順位に難があるせいで、三項演算子をネストしようとすると以下のようなコードになってしまう
$n = (($i == 1) ? 2 : (($i == 2) ? 3 :$i));
括弧だらけで読みにくいったらありゃしない。三項演算子を使うなら一回まで。約束守れないやつは丸めてゴミ箱にでも捨てちまえ。
if ( $flag ) { }
仕様をちゃんと把握しているなら真偽値のチェックなどこれで十分。
もし事前にbool型だというのが確定してるのなら「$flag === true」を使えばいい。
インクリメント、デクリメント演算子は前に付くか後ろに付くかで意味が変わるので慣れるまでは非常にややこしい。
わけがわからなくなるくらいなら初めから使わないほうが良い。見極められないなら使うな。それがPHPerなのだ。
文句なしだ。これは文句がない。
他にも色々あるので覚えておこう
$a %= 1; $a &= 1; $a |= 1; $a ^= 1; $a <<= 1; $a >>= 1;
てっとり早く画面に表示する際にpreはよく使うが、デザインの関係上画面の文字が見えないときがある。
なのでdivを使って以下のようにしとくと便利だろう。
function p($var) { echo "<div align='left' style='background-color:white;color:black;'><pre>"; print_r($var); echo "</pre></div>"; }
君らが通常作るアプリケーションなんぞに、定数なんぞ必要ない。いいか、もう一度言う、お前ら程度のもんが、定数使おう何ぞ、おこがましいわ!
大丈夫。なんでもかんでも定数にする必要はない。結局設定ファイルに定数をずらずら作りまくってわけがわからなくなってるパターンが多い。
貴様みたいなもんに、定数は制御できん。いいか設定ファイルはYAML等のデータで持つようにし、その連想配列のデータ構造を一つ持ってるだけで定数の変わりになる。
このメリットに比べれば、定数だと書き換えられなくて良いという利点などこの歯のカスほどのものだ。そんなものは丸めてゴミ箱へ捨ててしまうといい。
認識を改めろ。俺たちはより良いPHPerにならないために努力している。
class Request { private $parameters; private $method; function __construct () { $this->method = $_SERVER['REQUEST_METHOD']; if ( strtoupper($this->method) === 'POST' ) { $this->parameters = $_POST; } else { $this->parameters = $_GET; } } function param ($key) { return isset($this->parameters[$key]) ? $this->parameters[$key] : null; } }
これだけでもいい。たったこれだけでもとても便利だ。ここから拡張してGETやPOSTを明示的に取るメソッドとかも作ってみるといい。自分の手を動かすのだ!
例が良くない。こんなのは引数が20個ある関数から、setを20回呼ぶオブジェクトに変わっただけではないか。
そもそもこの20個の引数とはなんなのか。何かのデータ構造なんであれば連想配列にして引数一つとして渡すべきだし、それぞれまったく異なる用途の変数なのであればWindowsプログラミングじゃあるまいし、20個も引数取る時点で設計が間違えている。
何がいいたいか。別に関数でもオブジェクトでもどっちでもいいということだ。
そんなことで悩んでる暇があったら設計を見直せ。
スキあらば自分自身を返せ。スキあらばオブジェクトを返せ。配列はArrayObjectのARRAY_AS_PROPSで返せ。
ひたすらメソッドチェイン。来る日も来る日もメソッドチェイン。とにかくメソッドチェインを使い続けろ。そこに未来はある。
どんなコードも繰り返すな。もし、少しでも同じコードを書いていたなら、それは関数に置き換えてしまえ。
・・・と、いうのはやめなさい。
一見同じように見えた処理でも前後の流れでまったく違うものということが往々にしてある。
まとめ方にも問題があるケースもある。何でもかんでも関数化すると、関数が膨大に増えていく。君は見たことがあるだろうか。common.phpやfunction.phpの恐ろしさを。
確かに細かく関数化はされているが、適切に関数化していないのである。結合度が非常に高い。なんでもかんでも盲目的にまとめれば良いという話ではないのだ!
あまりに極度に意識しすぎると、プログラムそのものができなくなる。そういう状態に陥る。
気を抜いて。そう気を抜いて。所詮あなたのコードなんてすぐに消えてなくなるよ。きっともっと偉い人が作り直すよ。だからまずは思うが侭にやるといい。
結合度を減らすというのは非常に難しい。何度も何度も失敗し続けて、ようやくここは分けた方が良かったんだなと気付く。次に活かそうと心に決める。そしてまた同じ過ちを繰り返していくわけだ。
まずは実装することだ。これが一番の早道だ。まずはがっつり結合した関数をあえて作るといい。何も考えずに作ろう。
そしてその後に、一部分使いまわしたいとおもうことがあるはずだ。その時に関数に切り出そう。それを繰り返すといい。そのうち初めから分けた方が良いと気付く。
何事も経験が必要である!経験を積まないプログラマは丸めてゴミ箱に捨ててしまえ。
さて、先の例で言うならば、私ならadd_result_outputという関数を作ってしまうだろう。だって、addとresultを連続して呼ぶのはめんどくさいんだもん。一連の流れをいつも使うのなら、その流れをやってくれる関数を作ればいいじゃないか。
function add_result_output ($iVar, $iVar2) { $r = add($iVar, $iVar2); echo result($r); }
もっと言えばクラス化してしまってもいいかもしれない。どんな感じになるかは君の手を動かして確認しよう!
このTipsはとてもわかりにくく、ニッチ過ぎる部分も多いかもしれない。
あくまでも「より良いPHPerにならないための20Tips」なのだ。
君はこの記事を鵜呑みにしてはならない。PHPをPHPと見抜けないPHPerはPHPを使うのは難しい。
もし、あなたがPHPプログラマなら、公式のPHPドキュメントはあなたのケツの穴を拭くための紙になるだろう。
私は、それぞれのセクションを眺めて、各関数でどんなことが出来るかなんぞ、歯クソのゴミ程に役に立たないとおもっている。動けばいい。はは。
あなたは、PHPで用意された既製関数で多くのことが実現できることに、(俺の仕事を減らすなと)驚くはずだ。
この記事があなたの役に立たない事を。
ふざけんな!
これは http://anond.hatelabo.jp/20110316202255 の続編です。
GTをやる前に改を書いてくれている人がいてとてもしっかりした内容なのでちゃんと勉強したい人はそっちを見てね!
d:id:ryoasai:20110317 - ドラゴンボールで学ぶオブジェクト指向 改 | 達人プログラマーを目指して
またオブジェクト指向については
d:id:m-hiyama:20080109 いまさらながらだけど、オブジェクトとクラスの関係を究めてみようよ | 檜山正幸のキマイラ飼育記
がとても詳しいです。合わせて読むとかなりしっかりと理解出来ると思います。
ホットエントリに行くとは思っておらず、皆様ありがとうございます。
「ドラゴンボールをオブジェクト指向にする」というコンセプトではなく、「オブジェクト指向を(無理矢理)ドラゴンボールで説明する」という遊びだったので
プログラマーの方々にはツッコミを受けてしまいましたがここは遊びだと思って楽しんで下さい…。
ドラゴンボールは小さい頃から大好きでしたが流石にうるおぼえ過ぎました。
それはさておき「説明する題材を決める→好きな漫画から無理矢理当てはまりそうな例を考える」という思考実験なので、気が向いた方は色々考えてみると楽しいと思います。僕は楽しかったです。
これは難易度が高そうです。
やっぱりドラゴンボールで例えると分かりやすいな!
無理がある!
デザインパターンとはドクターゲロが考えた「こうやって設計すれば色々捗るぞ」という例のことです。実際はGoFという人たちが考えたもので23個のよくあるパターンに名前を付けて整理してくれたわけですね。
23個の中にはブルマさんですらわからないものが多いので(さすがドクターゲロですね)良く使う、代表的な物をいくつか紹介します
Singletonは世界に一つだけしか存在出来ないようにする方法です。
balls = new DragonBalls(); //これでは誰でもドラゴンボールを作れてしまう! balls.callShenron();
クラスの中にはいくつかのメソッドがありますが、簡単に言うと外から呼べるもの、外からでは呼べないものの
二種類があります。そうやってメソッドを保護することで世界の崩壊を防ぐわけですね。
基本的な戦闘力をアップさせるには本人の努力が必要になり、外から簡単に挙げられてしまうとジャンプの三本柱が外れてしまいます。
ただナメック星の最長老や界王神などはかなり偉いので、本人の才能を引き出すことが可能でした。
現実には思いつきのような仕様を後から言われることが多々あります。困ります。
//地球上にひとつだけ存在するドラゴンボールをつくろう class DragonBalls{ private DragonBalls(){ //ドラゴンボールを作れないように生成メソッドを保護します。 } static function sagasouze(){ static singleton_dragonball; //ドラゴンボールを生成。 //DragonBallsクラスの中なので、保護してある「new DragonBalls()」を呼べます。 if(!singleton_dragonball)singleton_dragonball = new DragonBalls(); return singleton_dragonball; } }
地球のみんなは地球語しか話せませんが、ナメック星にいるクリリンを通して願いを叶える必要があります。
クリリンももちろん地球語しか話せませんが、ナメック語を話せるデンデがいるため、地球のみんなは願いを叶えることが出来ます。
class Kuririn{ private dende = new Dende(); function request( wish1, wish2, wisth3){ this.dende.request(wish1); this.dende.request(wish2); this.dende.request(wish3); } } kuririn.request( "ピッコロを生き返らせてくれ", "ピッコロをナメック星へとワープさせてくれ", "ナメック星にいる孫悟空とフリーザ以外を全員地球へとワープさせる" );
この場合のメリットはデンデが何をやっているかクリリンをプログラミングした人が知る必要が無いということです。
地球の人はナメック星にいるナメック星人が「デンデ」であることを知る必要もありません。
それでも願いは叶うんです。
本来であればデンデやクリリンは願いが叶うのを待つ必要がありましたが、地球の人は一気に伝えることが可能なように設計しました。
//デンデクラス。ナメック星人は英語でNamekianらしいです。 class Dende extends Namekian{ function translate(word){ namekian = *****//ナメック語に翻訳します。 return namekian; } function request(wish){ static polunga; if(!polunga){ polunga = DragonBalls.spell("タッカラプト ポッポルンガ プリピット パロ"); } polunga.ask(this.trasnlate(wish)); } }
大まかなアルゴリズムだけ決めておいて、実装はサブクラスに任せる設計がTemplate Methodです。
ナメック星に行く方法を考えた時いくつかの方法がありました。古い宇宙船を探してきて直して載せて…っていちいち書くより同じメソッドでナメック星に行けたほうが便利ですね。
abstract class WayToNamek{ abstract function prepareSpaceShip(); abstract function launchSpaceShip( ship ) ; function gotoSU839045YX( people ){ ship = prepareSpaceShip( ); //船を修理します ship.load(people); //人を載せます this.launchSpaceShip(ship); //船を出発します。 } }
ナメック星に行く方法を定義したので「ブルマ、クリリン、悟飯」組と「悟空」をそれぞれナメック星に連れて行きましょう。
way = new WayWithKamisamaShip(); way.gotoSU839045YX( buruma, kuririn, gohan ); way = new WayWithSaiyajinShip(); way.gotoSU839045YX( goku );
と簡単に方位SU83、距離9045YXまで乗員を連れて行くことが出来ます。
二つの方法を実装します。神様の船を修理して行く方法と、サイヤ人の船(悟空が乗ってきた船)で行く方法の二つです。
//神様の船で行きます。 class WayWithKamisamaShip extends WayToNamek{ function prepareSpaceShip(){ return new KamisamaShip(); //船を準備します。神様の船を使います。 } function launchSpaceShip(ship){ ship.inputByVoice("ナメック星に出発"); // } } class WayWithSaiyajinShip extends WayToNamek{ function prepareSpaceShip(){ return new SaiyajinShip(); //船を準備します。サイヤ人の船(フリーザの船?)を使います。 } function launchSpaceShip(ship){ //audio = new HighSpecAudio(); //ship.setAudio(audio); ship.turnOnCenterButton(); //真ん中のボタンを押すだけ } }
元になる船も違いますし、発射の仕方も違いますが同じ呼び出し方が出来ます。
オーディオの位置が決まりませんでしたが、今回の運用では不要とのクライアントからのご意見でしたのでだったので
せっかく用意したオーディオも無駄になりましたが、コメントアウトしてあります。
http://anond.hatelabo.jp/20110316202255 - ドラゴンボールで学ぶオブジェクト指向
また、ポイポイカプセルのように技を塊にして色んな人が使えるように出来ます。
var shotKamehameha = new function(){ //かめはめ波を打ちます。 } noumin.kougeki = sendKamehameha; buruma.kougeki = sendKamehameha; noumin.kougeki(); //カメハメ波がでます。
って書いてるけど、クロージャってのはそういうものじゃないよなぁ、と。 まあファーストクラスの関数オブジェクトっていうところはあってるけど、それだけでクロージャと言えるのかというとちょっと違う。
"a closure is a first-class function with free variables that are bound in the lexical environment." (Closure - Wikipedia) とあるように、関数内の変数がレキシカルスコープに結び付けられているようなものがクロージャなのである。 JavaScript で例を書くなら、次のようになる。
// クロージャを返す関数 var getClosure = function getClosure() { // クロージャからアクセスされる変数 var counter = 0; // クロージャ var closure = function closure() { return counter++; }; return closure; }; // クロージャを取得 var closure = getClosure(); // クロージャを実行 closure(); //=> 0 closure(); //=> 1 closure(); //=> 2
http://anond.hatelabo.jp/20110316202255
亀仙流やつ鶴仙流など、世の中にはいくつかの流派があり、それぞれ カメハメ波やドドン波、舞空術などの技(メソッド)がある。 実際に技を使う場合、技を覚えているZ戦士(インスタンス)が必要。
クラス = 流派
メソッド = 技
インスタンス = Z 戦士
というのはおもしろいと思うし, 例えばゲームを作るなら実際にそういう実装になると思う.
例)セルを作りましょう。 class Cell extends Goku,Veget,Picoro,Tenshinhan,Kuririn{ .... } cell_inst = new Cell(); cell_inst.shotKienzan(); //Kuririnをextendsしているので気円斬が使えます。
しかし, ここではクラス = Z 戦士になってしまっているので, 混乱を招くだろう.
むしろ, 「JavaScript における prototype」 に絞って説明するのはどうだろう.
(ついでに「撃つ」の現在形は shot でなく shoot ですね)
var Goku = function () {}; Goku.prototype.shootKamehameha = function () { console.log("波!!!"); }; var goku = new Goku; goku.shootKamehameha(); // 波!!! var Gohan = function () {}; Gohan.prototype = new Goku; var gohan = new Gohan; gohan.shootKamehameha(); // 波!!!
そしてセルによる吸収は, 動的な継承として考えるのがより自然だろう.
var Goku = function () {}; Goku.prototype.shootKamehameha = function () { console.log("波!!!"); }; var Vegeta = function () {}; Vegeta.prototype.shootBigBangAttack = function () { console.log("ビッグバンアタック!!!"); }; var Cell = function () {}; // 吸収メソッド Cell.prototype.absorb = function (target) { for (var method in target) { this[method] = target[method]; } }; var goku = new Goku; var vegeta = new Vegeta; var cell = new Cell; cell.absorb(goku); // 悟空を吸収 cell.absorb(vegeta); // ベジータを吸収 cell.shootKamehameha(); // 波!!! cell.shootBigBangAttack(); // ビッッグバンアタック!!!
そして次にクロージャの使用例として挙げられた次の例.
例)連続エネルギー波 var shotRenzokuEnergy = function( count ){ var shotEnergy = function(){ //エネルギー波を放ちます }; for(var i=0;i<count;i++){ shotEnergy(); } };
この実装では, shotRenzokuEnergy を実行するたびに shotEnergy が毎回定義されてしまい, 非効率である.
以下のように書き換えることで, shootEnergy の定義は, shootRenzokuEnergy の定義時の 1 回のみとなる.
var shootRenzokuEnergy = (function () { var shootEnergy = function () { console.log("エネルギー波!!!"); }; return function (count) { for (var i = 0; i < count; i++) { shootEnergy(); } }; })(); shootRenzokuEnergy(10); // エネルギー波!!! x 10
亀仙流やつ鶴仙流など、世の中にはいくつかの流派(=クラス)があり、それぞれの流派にかめはめ波やどどん波、舞空術などの技(メソッド)がいくつかあります。
実際に流派にある技を使う場合、技を覚えているZ戦士(インスタンス)が必要になります。
例)亀仙流を覚えた孫悟空を使ってかめはめ波を放って敵を倒す goku = new KamesenRyu("goku"); goku.shootKamehameha(teki);
Z戦士によっては複数の流派の技が使えたり、自分の技を人に教えることが出来ます(継承)。
また悟空とクリリンのように同じ流派でも同じ技で違う性能を持っていたり、オリジナルの技を持っているなどの違いがあります。
クラスはセルを作るためのZ戦士達の遺伝子情報と言っても良いかもしれません。
例)セルを作りましょう。 class Cell extends Goku,Veget,Picoro,Tenshinhan,Kuririn{ .... } cell_inst = new Cell(); cell_inst.shootKienzan(); //Kuririnをextendsしているので気円斬が使えます。
世界(プログラミング言語)によってはただの人を後付でZ戦士にすることが可能です。
(JavaScriptやRubyなど)
noumin = new Hito(); noumin.kougekiKuwa = function(){ //戦闘力たったの5…ゴミめ! }; noumin.shootKamehameha = function(){ //な、なんだと!? };
農民がいきなりかめはめ波をうつようになったら危険ですね、危ないです。
このように後付でメソッドを追加出来るタイプは危険性を含んでいます。
とても良いつっこみが来たので追記します。
前半部分ではZ戦士をインスタンスとしましたが、セルを作るにはZ戦士がインスタンスでは出来ないので
何をインスタンスにして、何をクラスにするかが「設計」なんですね。
セルの第一段階ではGokuなどのZ戦士の遺伝子があれば作ることが出来ました。
cell_inst = new Cell(); //このセルは第一段階
cell_inst.absorb(17gou); //第二段階に変身 cell_inst.call18gou(); cell_inst.absorb(18gou); //最終段階に変身 class Cell ....{ function call18gou(){ if(!this.17gou)return error(); //17号を吸収していないと失敗する this.17gou.speak("****略*****ドクターゲロ様****略****"); } }
17gouを吸収したので、17号の声で18号を呼ぶことが出来るようになりました。
でもドクターゲロ「様」って言ったのでセルだってバレバレですね。
http://anond.hatelabo.jp/20110316224648
クロージャについてちゃんと書こうと思って挫折。どなたか良いアイディアを下さい。
変数のスコープを解説する必要があるかなと思ったんですがオブジェクト指向からは外れるような気がします。
エネルギー波→連続エネルギー波がどこかに使えそうな気がしましたが、気のせいだったぜ…