「class」を含む日記 RSS

はてなキーワード: classとは

2014-01-17

http://anond.hatelabo.jp/20140117045337

わかりやすさについてとやかく言わないけどさ、攻撃するってことは、モンスター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));

利点は、攻撃方法が増えた時に、攻撃方法型を実装したクラス定義すればよくて、

勇者モンスターも書き換える必要がないことだよ。

2013-11-20

http://marupeke296.com/OOD_No2_CS1_HalloWorld.html

コンポジションを表す線が、UMLと逆じゃないっすか?これ。

ClassA ◆─── ClassB

は、

class ClassA {
	ClassB _classB;
	public ClassA() {
		_classB = new ClassB
	}
}

class ClassB {}

ですよね?

2013-09-08

僕はプログラマーです。

僕はプログラマーです。

 

でも僕のMacBookProには何故かAdobeソフトウェアが入っています

iPhoneアプリデザインをするわけではありません。

デザイナーの人がデザインファイルを.psdや.aiや.fw.pngのまま当然の様に投げて来るからです。

 

僕はAdobeソフトウェア精通しているわけではありません。

ですので複雑なレイヤー構造ファイルを切り出すのにはかなり時間を要します。

でもレイヤー構造の説明をしてくれるデザイナーの人は殆ど居ません。

デザイナー同士だとその複雑な構造でもやり取り出来るのかも知れませんが、僕には大抵よく分かりません。

 

例えば、Photoshopエフェクトレイヤーが掛かっているボタンボタンだけ切り出す時に凄く苦労します。

例えば、薄くシャドーが掛かってるデザインは素敵な質感を表現出来るかもしれませんが説明してもらわないとどこまで切り出したら良いか分かりません。

 

一所懸命頑張って切り出した画像アプリを作っていたら「この部分が滲んでいる」とか「ここが1pxズレている」とか言われます

 

僕はAdobe精通する為の努力をしなきゃいけないのでしょうか?

そもそもAdobeソフトウェアは高価です。 今なら毎月3000円払わなきゃいけません。

でも実際使う機会は月に2〜3回あるか無いかです。

一回の起動が1000円です。

 

じゃあデザイナーの人にも僕がソースコードのまま投げても良いのでしょうか?

Xcode無料です。 AppleiOS Developerライセンスは年8400円です。

ビルドから実機へのインストールくらいならボタン押すだけで出来ます

 

じゃあデザイナーの人にもGitデザインファイルを共有して貰っても良いのでしょうか?

Git無料です。 レポジトリは僕が作りますGUIクライアントは有料かもしれません。

多少学習コストは掛かりますがcommitとpullとpushくらいならすぐ覚えられます

 

デザイナーの人が数分で切り出せるボタン試行錯誤して30分掛けて切り出す間、僕がコードを書けばデザイナーの人が8時間プログラムを書くよりも随分作業が進む自信はあります

 

きっと何かしらのデザインルールレイアウトされたデザインの座標を一個一個調べながらボタンを配置していく間、僕がコードを書くよりも、最初からこのボタンはここに配置するってレイアウト図を見せてくれればバグを一個や二個くらい潰せる時間が作れます

 

デザインファイル最初からpngで書き出して貰ってレイアウト図と一緒にくださいというのはプログラマーの怠慢でしょうか?

どう書き出すとプログラマーが使い易いか一番良いのか分からない、とよく言われます

でも、最初に言ってくれればどういう風に切り出して欲しいか説明します。

しかするとアニメーションを追加する為にレイヤーにしたり、書き出す構造が変化することもあるかもしれません。

でもそのときはまたきちんと説明します。

それでも僕がどこまで切り出せば良いかからないシャドーを書き出した方が良いのでしょうか?

 

AdobeのツールはGUIから誰でも分かるのかもしれませんが、それはデザイナーの人が

  self = [super init];
  if(self) {
    [self setShadowImage:[UIImage imageWithNamed:@"shadowpng"]];
  }
  return self;

を見ているのと同じくらいよく分からないものなんです。

別に上の謎の文字列だって適当文字列じゃないんです。 きちんとした意味があります。 誰だってちゃんと分かるはずです。

ボタンが1px右が正解か2px左が正解かを判別するよりも簡単に間違ってるかどうか分かるシンプルものです。

 

確かにAdobeのツールはよく出来ているので僕でも頑張れば使うことが出来ます

でも、僕はAdobeのツールを使った時の生産性よりも、Stack OverflowはてなダイアリーClass Referenceと睨めっこしながらキーボードを叩いて居る方が生産性が高い人種だと思っています

 

別にデザイナーの人と敵対したいわけじゃないんです。

ただ、デザイナーの人がもう一手間かけて頂けるだけで、僕はもっとコードを書いたりデバッグ出来るし、結果的にプロジェクトとして良い物が出来上がるんじゃないかなというだけなんです。

デザイナーの人がAdobeのツールを習得するためにマウスペンタブを触っていた時間を僕はプログラムを覚えるためにキーボードを叩き続けていたんです。

 

もし、デザイナーの人がもう一手間かけて頂けたら...

僕はデザイナーの人から貰うファイルリネームに集中出来るんです。

2013-04-01

PHP13.4.1の新機能

PHP最新版がようやく正式に発表されましたね。新機能等について調べてみたので流行に敏感な人はぜひ今のうちから勉強しておきましょう。

下位互換性のない変更点

  • 「?>」の廃止

「?>」を積極的に使うことにより、余計なホワイトスペースを混入させてしまう問題がありました。

これは厄介で非常に根が深い問題でしたが、ようやく根本解決として廃止されました。素晴らしいですね。

今後「?>」を使うとコンパイルエラーとなるので注意が必要です。

機能

abstract文で囲うとそのコード自動抽象化します。

昨今抽象化抽象化特に意味もわから言葉だけ連呼する人間が増えてきました。しかし新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文で囲うとその間の時間が止まります

theworld {
    // 止まった時間の中を動けるのは$dioだけ
    $dio->foo();
    $dio->bar();
};

$dioという特殊変数が用意されているのでその変数を使って処理をすることができます

用途としては非常に重たい処理をさせるのがいいでしょう。実時間0秒で実行することが可能となります

ただし9秒までしか止められないので注意が必要です。ですが回避策として以下のようにすれば追加で5秒止めることも可能です。

theworld {
    $dio->foo();
    $dio->bar();
}
starplatinum {
    // 9秒過ぎた時点でこちらへ
    $jotaro->foo();
};


PHP 13.4.x で推奨されなくなる機能

名前空間(namespace)が非推奨になりました。これを使用するとE_NAMESPACE_YEN_ARIEHENという警告が発生します。

非推奨となった理由ですが明確にはされていません。大人の事情ってやつでしょう。

ただ噂レベルでは、やはりというか区切り文字の「\」がありえへんという声が多かったからではないか?と一部囁かれています

mandomキーワードが非推奨になりました。mandomはきっかり6秒戻すという機能ですが、逆に言うと6秒きっかしか戻せないので扱いづらいという問題がありました。

また以下のような処理を書いた場合に$flagバグ等で常に真になるケースにおいて無限ループとなり、非常に危険だという問題もあります

// 何かしらの処理・・・

if ( $flag ) {
    mandom;
}

このようにPHP初心者がmandom使って無限ループをさせてしまう事案が後を絶たず、なかなか現実時間が進まないという問題が発生したため、廃止予定となります

新しい関数

Google検索したコード小片取得し、実行させる関数

$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();
    }
    
    // 何かしらの処理・・・
}

素晴らしい機能ですね。今後はこれ無しじゃプログラムできなさそうです。

PCが爆発します。

用途ですが、言わずもがな流行の真契約プログラミング用ですね。アサートの代わりに使うとよいです。

function foo ($a) {
    pc_explosion(!is_null($a),'$aはNULLはダメー!');
    
    // 何かしらの処理・・・
}

テストコードを実行する場合PCの周囲に人が居ないか気をつけてから実行させましょう。




というわけで新しい機能てんこ盛りでしたね。

個人的に良いなと思ったのはpc_explosion関数ですかね。約束事を守らないプログラマーなんぞ爆死しちゃえばいいんです。僕を含めて(お

全くプログラムも何も出来ないサラリーマンアプリを作って公開して

32歳、営業職です。

プログラムとかなんもわからんちんなのですが、アプリを作りたいと思いたちアプリ

作ってみました。

とりあえず、アプリランキングを見ていると、エロ系がやっぱり強いと思って、エロ正義!の名の下に

エロアプリを作ってやろうと思いました。

簡単にアプリを作るために、まずは簡単に作れるフレームワークを探す所からまります

フレームワークってなんですか?

それはね、なんだかわからないけど、簡単につくれるようになるものなんですよ。

詳しくは、

外人システムを作るときに、よく利用する機能とか、構造とか、予めあると便利だろ?

   俺が作っといてやったよHAHAHAHAHA」

っていう感じのものだそうです。

プログラミングなんてわからんちんだけど、HTMLくらいは作れるよ!

からHTMLアプリが作れるといいな。

そんなあなたにPhoneGap(http://phonegap.com/)ということで、

とりあえずPhoneGapを使って見ることに。

でも、実際使ってサンプルを作ったりしてみると、動くは動くんだけど、

色々やろうとすると、Web上にあるドキュメントが古いのか、PhoneGapが最近になって

突如バージョンがあがったせいか、書いてる通りにやってみてもできない。

こりゃだめだーと思って、最初からやることに。

とりあえずiPhone Developer登録は既に完了していたので、Xcodeをつかってやるぜ!

俺は赤の扉を選ぶぜ!と思ったがはてさてどうすりゃいいのか。

調べてみるとUIWebViewというのを使えばいいらしい。

HTMLプロジェクトに追加するのはドラッグドロップすれば完了だ。

その際にダイアログが出てくるので、"Create folder references for any added folders" を選択しておくと

元々のフォルダ構造とかが失われずそのまま追加できるのでいいぞ。

ほんでもって、UIViewControllerというのを作成する。

IBOutlet で UIWebView を利用するためのオブジェクト変数を用意しておいて、InterfaceBuilderから接続をする。

Files's Owner とかを右クリックして出てきた変数名と画面上についかしたUIWebViewマウスでつなぎあわせれば

接続できるぞ。なんて簡単なんだ。

さてコードの方に移り、HTMLを開くことにする。

一番最初に行われる初期化の処理は viewDidLoad にでも書いておけばいいらしいのでここに書く。

じゃあさっき追加したHTMLファイルはどうやって開くの?

UIWebViewURLの書式になっていないと開けないようなので、それを調べることから始まる。

アプリ内に追加したリソースファイルは、アプリデータに内皮されるらしい。

アプリが展開されるフォルダというのは、デバイスにより様々なのだが、そこから内皮されている

ファイルを取得するための処理というのがあるのでそれを利用する。

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 みたいな書式になるんでしょうね。

これで、無事HTMLファイルがひーらーいーたーー!

html 内のリンク普通に動作する。ばっちり。

よし、アプリの申請だー。リジェクトされました。。。。

なんだか色々理由はあるみたいなんですが、そうですかだめですか。

というわけで、Android版を作って出すことにしました。

善は急げで、AndroidSDKとEclipseというものダウンロード

昔は色々設定が必要だったが、いまは開けば即使えるようになったらしい。便利便利。

こっちの場合も同じようなやつがあるんでしょう、ほらったWebViewこれを使えばいいらしい。

XCodeときは、いかにもアプリの画面を作れば完成って感じだったけど、Android場合

Layoutファイルというのを使わないといけないみたい。なんかこれはHTMLみたいな記法だな。。

どうなってんだかよくわかんないですけど、Layoutを作成して、WebViewを配置、

これをClassかいうやつから開いてやればいいらしいよ!

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

2012-08-13

C#基礎文法最速マスター

1. 基礎
classの作成

プログラムclass記述します。たとえばSampleという名前classを作る場合、Sample.csファイル内に次のように書きます。(C#場合ファイル名とクラス名は同一でなくても良い。複数のクラスを書いても良い)

public class Sample {

}
Mainメソッドの作成

プログラムclass内のMainメソッドの先頭から実行されます。Mainメソッドは次のように書きます

public class Sample {

    public static void Main( String[] args ) {
         // 処理を書く
     }

}
Console.WriteLineメソッド

文字列を表字するメソッドです。

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;

以下は参照型のデータ型です。

// StringString s;
// 配列String[] array;
プログラムのコンパイル

プログラムコンパイルするには、コマンドラインで以下のようにします。

csc Sample.cs
プログラムの実行

プログラムを実行するには、コマンドラインで以下のようにします。

.net framework on Windows場合

Sample.exe

Mono.frameworkの場合

mono ./Sample.exe
2. 数値
数値の表現

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;
3. 文字列
文字列の表現

文字列ダブルクォートで囲みます

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が返る
4. 配列
配列変数の宣言

配列です。

// 配列の宣言
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);
5. 制御文
if文

if文です。

if ( 条件 )
{

}
if ~ else文

if ~ else文です。

if ( 条件 )
{

}
else
{

}
if ~ else if 文

if ~ else if文です。

if ( 条件 )
{

}
else if ( 条件 )
{

}
while文

while文です。

int i = 0;
while ( i &lt; 5 )
{
    
    // 処理
    
    ++i;
}
for文

for文です。

for ( int i = 0; i &lt; 5; ++i )
{
    // 処理
}
for-each文

for-each文です。配列の各要素を処理できます

int[] fields = new int[] { 1, 2, 3 };

foreach (int field in fields)
{
    // 処理
}
6. メソッド

C#では関数メソッドと言いますメソッドを作るには次のようにします。戻り値を返却するにはreturn文を使います

static int sum( int num1, int num2 )
{
    int total;

    total = num1 + num2;

    return total;
}
9. ファイル入出力

ファイル入出力です。ファイル入出力を行うには、プログラムの先頭に以下を記述します。

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 &lt; 5; ++i ) {

    if ( 条件 ) {
        break;    // 条件を満たす場合、for文を抜ける。
    }

}
繰り返しの残り部分の処理をスキップする

残りの部分処理をスキップし、次の繰り返しに進むにはcontinue文を使用します。

for ( i = 0; i &lt; 5; ++i ) {

    if ( 条件 ) {
        continue;    // 条件を満たす場合、残りの部分処理をスキップし、次の繰り返しに進む。
    }

}
例外処理

例外を投げるにはthrow文を使用します。

throw new Exception( "Error messsage" );

例外処理をするにはtrycatch文を使用します。

try {

    // 例外が発生する可能性のある処理

} catch ( Exception e ) {

    // 例外発生時の処理

}

2012-07-30

http://www.2ality.com/2012/07/esnext-classes.html memo

 FooのプロトタイプFoo.prototypeプロトタイプ
class Foo Function.prototypeObject.prototype
class Foo extends ClassClassClass.prototype
class Foo extends NullOrObjectFunction.prototypeNullOrObject



 writableconfigurableenumerable
Foo.prototype
Foo.constructor
Foo.prototype.*

2012-07-08

Rails3 とTwitter Bootstrapで、オシャレなエロサイトをつくってみました。

Rails3 と jQuery で、真面目にオシャレなエロサイトをつくってみました。 - h300

http://d.hatena.ne.jp/inouetakuya/20120331/1333192327

に触発されて、オシャレエロサイトを作ってみました。

以下は製作記になります

オシャレエロサイトを作ろうと思ったのはいいのですが、デザインは苦手なので途方に暮れていました。

h300の方はペパボソフトウェアエンジニアらしいのですが、こっちはただの素人プログラマー

オシャレなサイトなんて作れるわけがありません。

そこで何か裏ワザみたいなものはないかとググっていると、Twitter Bootstrapという文字が目にとまりました。

Bootstrapの名前は知っていましたが、深い内容までは知りませんでした。

ですが、紹介記事を読んでみると自分理想に近かったので早速使ってみることにしました。

Twitter Bootstrapとは?

Twitter Bootstrapはある程度有名だと思うんですが知らない方のために説明すると、

CSSフレームワークの一つで、ウェブデザイン作成を手助けしてくれるものです。

色々なCSSフレームワークを見ましたがTwitter Bootstrapが一番完成度が高いと感じました。

ウィキを見ると最初リリース2011年8月なので比較最近のものですね。

CSSフレームワークの説明は難しいんですが、

普段、みなさんがウェブサイトを作る時、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フレームワークを使うメリットはまだまだあります

CSS固定化されていると、HTML自動的に固定化されます

CSSに合わせて記述するので当たり前といえば当たり前ですね。

CSS記述一定HTMLもある程度一定なので、メンテナンスが格段にやりやすくなります

個人プログラマーの方だと、サイトごとにHTMLCSSもグチャグチャという方も多いのではないでしょうか?

フレームワークを使えばそういうこともなくなるということです。

Twitter Bootstrapの凄さはそれだけではありません。

現在ユーザーがどんなデバイスウェブサイトアクセスしてくるか分かりません。

PCスマートフォンiPadTV3dsなど全てのデバイスに合わせてデザインを作るのは時間がかかりすぎます

でもTwitter Bootstrapならbootstrap-responsive.cssというCSSを選ぶだけで、

デバイスの横幅に合わせてデザインが変わるレスポンシブなウェブサイトができます

iPhoneiPad対応もすぐですよ。

もちろんデメリットもありまして、サイトデザインが似てしまうというのが難点です。

ですが基本はBootstrapを使って、ちょっと自分カスタマイズしてオリジナルっぽくすることもできますので、

一度Twitter Bootstrapを使ってみる価値はあると思います

http://twitter.github.com/bootstrap/

Bootstrapの説明が長くなってしまいましたね…。

ここからアダルトサイト作成の説明です。

クローラ作り

1.エロいサイトを巡って、XVIDEOSやFC2動画などのリンク、embedされたものがあれば取得。

2.リンクから動画サイトアクセスしてサムネイルを取得。

3.データベースに登録。

一連の作業をクローラーやらせプログラムRubyで書く。

RailsでBootstrapを使う。

RailsでBootstrapを使うにはtwitter bootstrap railsというgemを使うらしいです。

しかし、使おうと思ったのですが、windowsでは上手くインストールできませんでした。

windowsRubyを使うとバグが多いです。

仕方なく、代わりに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/

LESSとかSass(Scss)もお勧めですよ。

railsでは3.1からcoffee scriptと共にsassがデフォルトで使えます

このあたりがRailsの素晴らしさですね。

Bootstrapは画像を綺麗に並べて表示することにも向いているので、

アダルトサイトと相性がいいなと感じました。

タグリスト実装

AV女優名とか女子校生人妻などのジャンルタグがあれば便利ですよね。

Railsではacts-as-taggable-onというgemを使い実装しました。

動画タイトルが事前に用意したAV女優リストジャンルリスト合致すればタグ付けするという感じです。

AV女優リストDMMからジャンルリストは大手アダルトサイトから作成しました。

AV女優タグ名前順でソートしたいと思ったのですが、

漢字ソートできないのでしばらく悩んだ結果、

タグ付けするときに あおいそら-蒼井そら みたいな感じでタグ付けするようにしました。

もっとスマート方法があるはずですが思いつかなかったので仕方ないです。

ア行、カ行…のように行別にわけて、なおかつアイウエオ順で表記してますので

お気に入りAV女優名を探しやすいはずです。

簡易ブックマーク実装

クッキーを使ってログイン不要ブックマーク機能作りました

jquery.cookie.jsを使って、cookie配列に直してごにょごにょしてという感じで実装しました。

削除ボタンを押すと非同期で通信して…などいろいろ面倒でした。

でも、動画の数はかなり増やしていこうと思っていましたので頑張って実装しました。

動画の下のブックマークするボタンを押していただければブックマークできます

ブックマークするボタンの表示などにBootstrapの便利さを感じました。

アダルト動画を大画面で見れるようにする。

実はこれが一番やりたいことでした。

多くのアダルトサイト広告だらけで、肝心の動画がポツンと小さくあるだけというのが多いです。

世の男達は疲弊しています。それは本当に疲弊しています

戦場で疲れた兵士たちに、そんなせせこましい画面でアダルト動画見ろって?

そんな野暮なこと言いませんよ。

PCスクリーンの画面いっぱいに、大画面で、ドカーンエロ動画を楽しんで下さいよ。

動画はできるだけ大きく表示しています。もちろんレスポンシブです。

全画面表示にすりゃいいじゃん…っていうのは違うんですよ。

全画面表示だと逃げれないじゃないですか

不意に誰かが部屋に入ってきたらどうするんですか? 

1クリックと2クリックは大違いですよ。

コンマ一秒で守れる尊厳がある。

そう考えております

スマホ対応

Bootstrapでデザイン面はスマホ対応にはなっているのですが、

加えてjpmobileというh300で紹介されていたgemを使って、

スマホアクセスされたら表示する動画の数を減らしてとか、

広告の種類を変えるなどの微調整をしました。

サーバー選び

osukiniサーバーのGT2プランしました。

初期費用1900円、月940円で

CPU 2.66GHz、メモリ 2.2GB HDD200GBです。

チューニングは正しいかからないですね。

まぁ、アクセス捌けなくなってから考えます

Nginx + Unicornを使おうとして結局やめる。

Railsは遅いので少しでも速くするためにApacheの代わりにNginx使おうと思ったのですが、

PC用のキャッシュスマホ用のキャッシュを別々に保存して使う

ということがどうしてもできませんでした。

PC用のキャッシュがある場合スマホ用のキャッシュがなくてもキャッシュがあると認識されるなど、

もともとNginxrailsのページキャッシュは相性が悪いようです。

Nginx側でキャッシュする、もしくはスマホ用のアドレス別にすればできるかもしれないですが、

http://m.サイト名 みたいにするのが嫌だったので最終的にNginxを使うことをやめました。

Nginxに関するネット上の記述も少ないので運用するのは危険かな、ということもあります

Nginxを少しだけ使ってみた感触はかなり速いというものだったので残念でした。

バージョンが変われば、また挑戦したいですね。

Apache + passengerは遅いんですよ…。

【追記】

キャッシュの問題はRails側の問題だったので

やっぱNginxでもいけるかもしれないですね。

暇なときに試してみます

出来上がったサイト紹介

オシャレのハードルを上げすぎて紹介しづらくなったのですが、

紹介しないと終わらないということで紹介します。

http://nukisen.com  (エロ注意)

サイト名はオシャレに横文字でNukisenにしました。読み方はヌキセンです。

http://bootswatch.com でダウンロードできるBootstrapのテーマそのままですが、

オシャレというかクールデザインです。

Bootstrapを使うと自動的に細部まで凝ったデザインになるので最高ですね。

下にスクロールしていくと背景のグラデーションが変化したりとか、とても一人ではできないですよね。

長々と説明してきましたが、

ぜひNukisenで大画面のアダルト動画体感してほしいです。

動画の数をいきなり大量に増やすグーグル様に怒られるので、

しばらくは一日30本ぐらいの更新でいく予定です。

アダルトサイト同士の相互リンクアクセス増やしてなどはしない方向です。

最後

新しいことに挑戦すると得られるものが多いなと感じました。

ウェブサイトを作る際、無意識のうちに自分のできる範囲の技術で構築しがちだと思うんですが、

そうすると成長はないですね。

新しい技術に柔軟に対応していきたいです。

長文失礼しました。

2012-07-05

http://anond.hatelabo.jp/20120705093826

いや、ごめん。再帰というのは、木構造による再帰、でも、Switchによる再帰でも同じ。そのアルゴリズムで Call命令を使うのか?って事。

あとCでもswitchが嫌で かつ 再帰によるCall命令が許容されるなら、Tree関数ポインタ持たせて、関数ポインタで評価関数呼び出せばいいじゃん。

単純に要素だけ書けば

struct leaf{

  leaf *subleaf[2];

  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ならよいってことはない。

2012-06-17

バカには見えない増田広告まとめ (Ads by Google

しわを気にする女優秘密    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万円以上アップの求人情報多数! キャリコネ転職サービスに今すぐ登録。

やっぱりくだらない事をしてくれたもんだなあと思う。

2012-05-06

CoffeeScriptプライベート関数パブリックメソッドとして開示するやつ

class MyClass
	constructor: -&gt;
		name = 'unknown'
		
		@getName = -&gt;
			return name
		
		@setName = (newName) -&gt;
			name = newName
	
		
MyClass:: = do -&gt;
	_greet = -&gt;
		console.log('どうも、' + @getName() + 'です。')
	
	return {
		constructor: MyClass
		greet: _greet
	}


myInstance = new MyClass()
myInstance.setName('純子')
myInstance.greet() #どうも、純子です。

CoffeeScript で @なんとかのプロパティが全部パブリックになるのが気になってて。

2012-04-25

無職が一ヶ月かけてWebゲームみたいな奴を作った

Webゲームっていうか、ブラウザ上で動くような奴。PHP(5.3)で突貫工事したので、ペラペラな感じだけど、なんとか公開できて、たまに遊びに来てくれる人がいて(一時はVIPに募集スレも立ったらしい)、何戦かして帰っていくので、とりあえずサーバー代を払った価値くらいはあったかなーという感じ。

で、どういうゲームかっていえば、人狼みたいに「陣営に別れて、決められた目標クリアするゲーム」です。

レジスタンス』っていう卓上ゲームというのかな?それを参考にして作りました

レジスタンス・チャット

ちょうど開発してから、一ヶ月程度になったので、宣伝をかねて、現状みたいなのをメモ

俺のスペック

一応、前提としては、Pythonだったら、何かしらのシェルプログラムを書いてcronしてるけど、それ以上のことはしていない程度の、技術ワナビー

ほぼ業務経験なし。継続してスクリプトを開発したのは、今回が始めてという感じ。

作ろうと思ったきっか

単純にPHPで何か作りたいなーと思ったから。一度はPHPを書くべきだなあと思ったりした。それで、何かいい題材ないかなーと思って探してた。

「昔、人狼BBS遊んだとあるなー、でも同じ人狼ゲームを作っても芸が無いしなー」と考えていたところ、知人と遊んだレジスタンス』ってゲームにピンと来て、「こういうゲームWeb上で遊べたらいいかな。調べたところ、Web上でも人狼っぽいって言われるし、上手くそういう層にアピールできそう」ということで作り始めたのでした。

反省

綺麗なコード意識する

はいえ、最初は勢いで書き散らしたので、本当にClassとかまったくなかった。それを徐々に整え直して、なんとかファイル分割できるようになった。それでも、全く足りない。具体的には下のような部分が汚い。

MVCをちゃんと意識する

本当はCakePHPとかそういったフレームワークを使えば良かったんだろうけど、「重いんだったら仕方ないしなー」というわけで、フレームワーク無しで使ってみたんだけど、結果として表示部分にやたらと処理が入って醜いったらありゃしない。

表示部分と、実際のシステム部分はわけられるべきだし、フレームワークを使わないまでも、そういう風な機能分割は必要

そうなるとある程度までは綺麗なコードになるような気がする。

で、そういうコードを書いたせいで、下のようなことが起きる。

テストは丁寧に書いておく

PHPUnit使ってユニットテストは書いているんだけど、まったく足りない。

全部グリーンにはなるんだけど、実際に動かしてみるとバンバンエラーが出る。

幾つかの関数テストを先に書いたりしたんだけど、表示部分とかは「ここテスト書きにくいから誤魔化しちゃえー」といって書いたりした。

で、何が起きるかっつーと、リファクタリングするときガンガン機能が落ちる。そして死ぬ

さすがに一つのClassが1000行くらいになってきたので「うっわー、これは駄目だわ。分割するべき」って、ゴミみたいなコードに手を入れ始めるんだけど、全く歯が立たない。

とりあえず、既存テストグリーンになるけど、どこかで処理がつまづいているという状態でこれは駄目。

「うわ、この部分、テスト書きにくい!」って思った時点で、何かを嗅ぎつけてちゃんとテストに落としておけばよかった、と反省することしきり。

結果として手作業で複数ブラウザ起動して……みたいなことになっちゃう。バグの温存。

楽ができるならば、楽をする

CSSとか勉強のために、自分で1から書いているけれども、これは本当にだるい

知人から、綺麗にコードが書けるから、と薦めてもらったSaSSを使っているけれども、なかなか綺麗にできない。

一応、Twitter BootStrapは知っていたけれども、それに頼るよりは一から書こうと決心して書いたためか、ようわからないし、デザインとしてもこなれていないために気持ち悪いことになっている。

上記のフレームワークについてもそうだけど、流行っているものには、それなりの理由があって、それをわざわざ避けても、結果として、それ以上のものは(素人に毛が生えているくらいでしかない以上)ならないような気がする。

ならばとっととそういうものを使って、さっさと済ませてしまえばよかったなーと思ったりした。

ゲームという性質である以上、どんどん情報量が増えていくために、そういうのを表示しまくっていると、本当に画面がぐちゃぐちゃになる。

ユーザーインターフェイスまじで苦労する。

セキュリティー……

セキュリティーには本当手をつけられていない。(徳丸本読めという話になると思う)

ドキュメント……

(略)

一ヶ月間続けてみてよかったこと

で、本当にボロボロになりながら作ってみて良かったことをメモしておく。

単純にプログラミングって楽しいよね

自分は割と現実逃避の為に何かに没頭することがあって、その逃げ先としてプログラミングっていいなあと思ったりした。

あと、自分が書いたコードがヒョコヒョコ頑張っている姿をみていると、すごくかわいくなる。形にもなるし、「こういうものを作ったよ」とも言える。それは単純に楽しい経験

自分が作ったものが単純に楽しい

元々、自分が好きそうなものから題材をピックアップしただけあって、自分が作っているものが、自分が一番愛用しているというのは幸せなことだなと思う。

自分が楽しむためのものから自分が一番のユーザーであるし、自分が快適に使いつづけるために改良を続けてる。

から「こうしたらいいんじゃないの?」というのも勉強になるし、自分がちゃんと&楽に機能拡張できるように、ちゃんと勉強しようとも思う。そういうのは本当にいい循環。

使ってくれる人がいる

大抵は、自分が使うから自分だけのものだったので、あまり他の人が使ってくれることを期待していなかったんだけど、今回のは、ときどき遊びに来てくれる人が居る。

例えば、VIPスレが立ってたり、あるいはニコニコ生放送プレイ実況を配信してくれたり。

割と「くっだらねー」と思うけど、一人で細々と開発していると、そういう些細なことが嬉しかったりする。

なので、ついついみてしまったり、場合によっては、プレイしているところをいつまでも一緒に徹夜して観戦していたりする。人のプレイしている姿が楽しいというのも、自分が作って良かったなあと思う。

逆に言えば、使ってくれる人がいるからこそ、一ヶ月間開発が続いているようなもので、「ああ、自分プログラムで楽しんでくれる人が居るんだな」という手応えみたいなものが、モチベーションになっている。

遊んでくれる人が見えるというのは、自分にとっては、モチベーション維持に大切になってる。

今後として

だいたい三日坊主で終わっている自分としては、開発が長く続いているほうだと思う。

目指すところは、もっと綺麗なソースコードにして、Githubで公開すること(いや、もうアカウントは既に持っているんだけど、公開するのは凄く恥ずかしい)。

まだまだ勉強することが多いなー、というわけではてブPHPの記事をあさったりしているところです。

2012-01-09

Dslr camera Guideline -- The right way to Seek advise from Your own Dslr high-end camera

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

Aperture

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.

ISO

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.

Applying it on whe whole

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.

2011-10-17

http://anond.hatelabo.jp/20111017182754

そういう原理的にどうかという話ではなくて、単にC#とかJavaとかだと何するにもまずclass宣言から入らないといけなくて、初心者的にはなんだよそれってなると思うという程度の話。

python(LL)ならクラスも使えるけど(便利な関数のついた)Cっぽくも書けるわけだし、型付けとか煩わしいことも少なくていいじゃんという程度。

Javascriptって触ったことないけど、むしろ関数型だと聞いたんだけどどうなのかね。pythonもかなり関数型っぽいけど。

ただまぁVBはねーだろって思う。

2011-10-12

秀丸auVCardiPhone用に編集

au携帯からiPhoneへの移行メモ(アドレス帳)

基本的には上のリンク先の通りにすればいいのが、メモ部分に不要記述が残ってしまうので

正規表現の置換でこれを消したい時に、サクラエディタでは

X-(\S+)\r\n|CLASS:PUBLIC\r\n|NOTE:(\S+)\r\n|PREF,

この正規表現で消えるみたいだが、秀丸では一部消えなかったので、これを秀丸の置換で消せるようにするには、

X-REDUCTION:(\S+)\n

X-GNO:(\S+)\n

CLASS:PUBLIC\n

を、それぞれ一度ずつ置換の検索ボックス入力。置換ボックスは空白のまま。その後、全置換。

これで不要箇所は消える。

あとはメールiPhone転送し、添付ファイルを読み込ませるだけ。

2011-07-05

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.

確たる意志を携えて ぼくらは世界の中心にいくんだ

Youll 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,

きみの心を打ち明けておくれよ そして 愛を 愛を

Give your love love.

愛をちょうだい

Gimme, gimme what I need.

ぼくの欲しいもの ちょうだい

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,

きみの心を打ち明けておくれよ そして 愛を 愛を

Give your love love.

愛をちょうだい

Gimme, gimme what I need.

ぼくの欲しいもの ちょうだい

2011-06-16

via http://b.hatena.ne.jp/torin/20110614#bookmark-46762850

もうTogetterは本人IDしかないまとめなら福本伸行風味に「ざわ…」を大量に背景表示する機能を実装すべき

Togetterが実装することはないだろうから、俺が作る。

// ==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 &lt; len; i++) {
      if(curator != tweeters.item(i).textContent.toLowerCase()) {
        break;
      }
    }
    if (i &gt;= 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 &lt; 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);
})();

2011-05-30

http://anond.hatelabo.jp/20110530004826

Javaだけど。

class HelloWorld {
  public static void main(String args[])
  {
    System.out.println("Hellp World");
  }
}

typoバグの一種:p

2011-05-15

http://anond.hatelabo.jp/20110515101054

C++言語

fooのintへのキャストがtrue/falseを返すというように、fooのクラス仕様が決められてるんなら、

そしてboolへのキャストが未定義だったり、また違う意味なのなら

    if (foo) {

はな

    if (foo == true) {

って書かざるをえないだろう。嫌いとか好きとかの問題ではないと思う。

class {
public:
    operator bool() { std::cout &lt;&lt; "xxx\n"; return true; } //*1
    operator int() { std::cout &lt;&lt; "yyy\n"; return true; } //*2
} foo;

があったときに、「if (!foo)」だったら*1が、「if (foo == false)」だったら*2が実行されるような処理系がある。

最新のVC++だと後者曖昧だってエラー出るね(たぶんC++だと「trueは1でfalseは0」なんかではなくあくまでもtrueとfalseなんだ)。

なんにせよ演算子や条件式などに関連する暗黙のキャストはわかりづらく、そしてそんなのを利用したコードはきっとバグる。

から

(fooはいろんなオブジェクトだと思ってほしい

というのが本当なら、==trueがどうこうなんて些細な問題はおいておいて、fooを暗黙のうちにintにキャストしたりboolにキャストしたりして使っているという危険部分をまずなんとかすべきだろう。

VCとかVBとかじゃなくてC言語仕様の話だろ

古いC言語風に書けばこんな感じ。

#define FALSE 0
#define TRUE (!FALSE)

かに、実際に値を表示させてみると、昔のVC6だと「1」という結果が出てくるし、VB6だと「-1」という結果が出てくる。これ、当時混乱の元だったんだよね。


aとbが等しいときに、

C言語だと、(a==b)の評価結果が1になるけど、

BASICだと(a=b)の評価結果は-1になる。

VC6とか関係なくてC言語仕様でそうなんだが、それをわかってないとすればやばい

個人的な好き嫌い

個人的には

   if( foo != FALSE ){

も十分きもちわるいので

   if (foo) { ... }
   if (!foo) { ... }

にしてほしい

2011-04-02

play on tumblr 動いてる?

via http://coderepos.org/share/browser/lang/javascript/userscripts/playontumblr.user.js?rev=38679 | text post image open : http://gyazo.com/0722c749cb50c704d4e9923bdd6b6fce.png -> http://gyazo.com/e8f082af69a038e0ea58775c2cec7ad5.png — Gist

最新はこれでいいんですか?

誰も話題にしてないので俺だけかな

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 &lt; 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 &lt; 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 &lt; timg.length; n++) {
               click(timg[n]);
             }

2011-03-20

より良いPHPerにならないための20Tips

http://1-byte.jp/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer/

良いPHPerだって?そんなものは丸めゴミ箱にでも捨ててしまった方が資源の再利用になる分いくらかマシだ。

つまり俺たちがしなくちゃならないことは「より良いPHPerにならないため」に何ができるかってことなのさ。

それじゃ、始めよう。

1. ?>を使うな

?>なんて使っちゃいけない。そう俺たちはBAD PHPer。

無駄ホワイトスペースの出力に悩まされるくらいなら対称性なんて丸めゴミ箱にでも捨てた方がまだマシだ。非対称性こそが賛美。

2. 設定ファイルPHPで書くな

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/'

3. コメントを信用するな

そう、あなたはこんな状況に遭遇したことがあるんじゃ?

// ここで後の処理のためにhogeメソッドを呼び出しておく
$q->foo();

// $a['foo']はここに来る時点で真のはず
// 2010-03-10 判定がおかしいので修正
// 2010-06-21 やっぱり値が入ってる方が正しい
if ( !isset($hoge[0]) ) {
}

コメント保守されない。そう、それは真実。こんなコメント発見したら即効削除しよう。コメントは基本信じるな。

俺たちにちょっとしたヒントと大きな損害を与えてくれる、それがコメントの役割なのだ。

4. タブとうまく付き合うしかない

わかる。いいたいはとてもわかる。俺たちはしばしばインデントにスペースを使うはずだ。一方でIDEのしっかりした言語ではタブも使うことがある。しかし悪いことに、両者を混同しているプログラマも一定数いるのだ。

タブを画面上で認識しにくいエディタが世の中には存在する(何とは言わないが)

そして画面上で認識しにくいことを理由にタブを気にしないプログラマがいる。

この二つの条件が重なると、タブとスペースの交じり合ったインデントが完成する。もうぐちゃぐちゃだ。これは永遠に続く戦いだ。

私たちが勝利を掴むためにできることなどせいぜい、常にスペースしか使わない。タブを見つけたらその都度スペースに変換する。そういった地道な活動が明日へとつながるのだ。

5. 変数名に時間をかけるな

われわれがプログラムをするとき、何に一番時間がかかってるか。実は変数の命名なのである。ここで拘り過ぎて時間をかけ過ぎては何も進まない。

御託はイイからさっさと書け、だ。しかしとはいっても変数名は重要。日頃からどういうときにどんな名前を使うかを決めておくといい。

そして変数名に型はまったく必要ない。型宣言のないPHPにおいて、型の変数名をつけること自体ナンセンスだ。

コンパイラ様に保証されてない状態での

$iNumber = 'aaa';

になんの意味もない。コメントを信じるなでも言ったが、これはプログラマを混乱させるだけの害悪なものだ。

6. 変数初期化場所

変数を使う前に初期化するのは、警告を出さないという意味でも良い癖だ。しかし具体的にどこでやるかが問題だ。

$foo = null;
$foo = $q->foo();

こんな初期化意味はない。よくあるのはやはり、if文で値を振り分けるケースだろう

$foo = null;
if ( $hoge ) {
    $foo = 1;
}
else if ( $bar ) {
    $foo = 2;
}

このとき初期化はとても有効だ。もしnullの初期化を忘れたまま$fooを使うと警告が出るが、ちゃんと初期化してるので出ない。基本中の基本だ。

7. 不正なら常に死ね

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を返して生存させる必要性はまったくない。今すぐ死ね

8. 連想配列キーアクセスする場合

単なる配列に対して数値をクオートで囲う必要はない。

連想配列キーを指定する場合だけ定数と間違わないようにクオートで囲まなければならない。そして逆に定数を使いたい場合はクオートで囲ってはいけない。

更に後世のプログラマ処理を見たときに、定数が使いたかったのか、文字列が使いたかったのかを明確にした場合はconstantを使うと良い。

// 定数のFOOを使うよということが明確になる
print $a[constant('FOO')];

9. echoよりもprintfを使え

もし、文字列変数の値と一緒に出力するときPHPではコンマの代わりにprintfを使うことが使える。

なぜ?コンマを使うよりも可読性がグッとあがるから

printf( “Hello, my name is %s“, $sName);

以下の代わりに上記のコードを使う。

echoHello, my name is “, $sName;

出力すべき変数が増えれば増えるほど、有効になっていく。とにかく迷ったならば、printfを使え、だ。

10. 三項演算子は一回まで

三項演算子はとても有効だ。しか優先順位に難があるせいで三項演算子ネストしようとすると以下のようなコードになってしま

$n = (($i == 1) ? 2 : (($i == 2) ? 3 :$i));

括弧だらけで読みにくいったらありゃしない。三項演算子を使うなら一回まで。約束守れないやつは丸めゴミ箱にでも捨てちまえ。

11. 真偽値のチェックは生でいけ

if ( $flag ) {
}

仕様をちゃんと把握しているなら真偽値のチェックなどこれで十分。

もし事前にbool型だというのが確定してるのなら「$flag === true」を使えばいい。

12. ++と--の演算子を見極めろ

インクリメント、デクリメント演算子は前に付くか後ろに付くかで意味が変わるので慣れるまでは非常にややこしい

けがからなくなるくらいなら初めから使わないほうが良い。見極められないなら使うな。それがPHPerなのだ。

13. 代入演算子を使え

文句なしだ。これは文句がない。

他にも色々あるので覚えておこう

$a %=  1;
$a &=  1;
$a |=  1;
$a ^=  1;
$a <<= 1;
$a >>= 1;

14. 変数dump関数はより便利に

てっとり早く画面に表示する際にpreはよく使うが、デザインの関係上画面の文字が見えないときがある。

なのでdivを使って以下のようにしとくと便利だろう。

function p($var) {
    echo "<div align='left' style='background-color:white;color:black;'><pre>";
    print_r($var);
    echo "</pre></div>";
}

15. 定数から手を洗え

君らが通常作るアプリケーションなんぞに、定数なんぞ必要ない。いいか、もう一度言う、お前ら程度のもんが、定数使おう何ぞ、おこがましいわ!

大丈夫。なんでもかんでも定数にする必要はない。結局設定ファイルに定数をずらずら作りまくってわけがからなくなってるパターンが多い。

貴様たいなもんに、定数は制御できん。いいか設定ファイルYAML等のデータで持つようにし、その連想配列データ構造を一つ持ってるだけで定数の変わりになる。

このメリットに比べれば、定数だと書き換えられなくて良いという利点などこの歯のカスほどのものだ。そんなものは丸めゴミ箱へ捨ててしまうといい。

認識を改めろ。俺たちはより良いPHPerにならないために努力している。

16. $_GETと$_POSTを生で使うな

できれば何かしら簡単なクラスでもいいのでラップしろ。

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を明示的に取るメソッドとかも作ってみるといい。自分の手を動かすのだ!

17. 関数だのオブジェクトだのの問題ではな

例が良くない。こんなのは引数20個ある関数からset20回呼ぶオブジェクトに変わっただけではないか

そもそもこの20個の引数はなんなのか。何かのデータ構造なんであれば連想配列にして引数一つとして渡すべきだし、それぞれまったく異なる用途の変数なのであればWindowsプログラミングじゃあるまいし20個も引数取る時点設計が間違えている。

何がいいたいか。別に関数でもオブジェクトでもどっちでもいいということだ。

そんなことで悩んでる暇があったら設計を見直せ。

18. メソッドチェインを愛用せよ

スキあらば自分自身を返せ。スキあらばオブジェクトを返せ。配列はArrayObjectのARRAY_AS_PROPSで返せ。

ひたすらメソッドチェイン。来る日も来る日もメソッドチェイン。とにかくメソッドチェインを使い続けろ。そこに未来はある。

19. コードの汎用化は慎重に

どんなコードも繰り返すな。もし、少しでも同じコードを書いていたなら、それは関数に置き換えてしまえ。

・・・と、いうのはやめなさい。

一見同じように見えた処理でも前後の流れでまったく違うものということが往々にしてある。

まとめ方にも問題があるケースもある。何でもかんでも関数化すると、関数が膨大に増えていく。君は見たことがあるだろうか。common.phpやfunction.phpの恐ろしさを。

かに細かく関数化はされているが、適切に関数化していないのである。結合度が非常に高い。なんでもかんでも盲目的にまとめれば良いという話ではないのだ!

20. 結合度は適切に減らし、適切に結合せよ

あまりに極度に意識しすぎると、プログラムそのものができなくなる。そういう状態に陥る。

気を抜いて。そう気を抜いて。所詮あなたコードなんてすぐに消えてなくなるよ。きっともっと偉い人が作り直すよ。だからまずは思うが侭にやるといい。

結合度を減らすというのは非常に難しい何度何度も失敗し続けて、ようやくここは分けた方が良かったんだなと気付く。次に活かそうと心に決める。そしてまた同じ過ちを繰り返していくわけだ。

まずは実装することだ。これが一番の早道だ。まずはがっつり結合した関数をあえて作るといい。何も考えずに作ろう。

そしてその後に、一部分使いましたいとおもうことがあるはずだ。その時に関数に切り出そう。それを繰り返すといい。そのうち初めから分けた方が良いと気付く。

何事も経験が必要である経験を積まないプログラマ丸めゴミ箱に捨ててしまえ。

さて、先の例で言うならば、私ならadd_result_outputという関数を作ってしまうだろう。だってaddとresultを連続して呼ぶのはめんどくさいんだもん。一連の流れをいつも使うのなら、その流れをやってくれる関数を作ればいいじゃないか

function add_result_output ($iVar, $iVar2) {
    $r = add($iVar, $iVar2);
    echo result($r);
}

もっと言えばクラス化してしまってもいいかもしれない。どんな感じになるかは君の手を動かして確認しよう!

最後

このTipsはとてもわかりにくく、ニッチ過ぎる部分も多いかもしれない。

しかしもう一度タイトルを確認してほしい

あくまでも「より良いPHPerにならないための20Tips」なのだ。

君はこの記事を鵜呑みにしてはならない。PHPPHPと見抜けないPHPerはPHPを使うのは難しい

おまけ

もし、あなたPHPプログラマなら、公式のPHPドキュメントあなたのケツの穴を拭くための紙になるだろう。

私は、それぞれのセクションを眺めて、各関数でどんなことが出来るかなんぞ、歯クソのゴミ程に役に立たないとおもっている。動けばいい。はは。

あなたは、PHPで用意された既製関数で多くのことが実現できることに、(俺の仕事を減らすなと)驚くはずだ。

この記事があなたの役に立たない事を。

どんなコメントでも待ってます

ふざけんな!

個人的な感想

この記事に書かれている内容は、丸めゴミ箱に捨てた方が良いレベルです

もしここまで読んでしまったら、丸めゴミ箱に捨てましょう。

プログラ増田のあなぐら

2011-03-19

ドラゴンボールで学ぶオブジェクト指向Z

これは http://anond.hatelabo.jp/20110316202255 の続編です

GTをやる前に改を書いてくれている人がいてとてもしっかりした内容なのでちゃんと勉強したい人はそっちを見てね!

d:id:ryoasai:20110317 - ドラゴンボールで学ぶオブジェクト指向 改 | 達人プログラマーを目指して

またオブジェクト指向については

d:id:m-hiyama:20080109 いまさらながらだけど、オブジェクトクラスの関係を究めてみようよ | 檜山正幸のキマイラ飼育

がとても詳しいです。合わせて読むとかなりしっかりと理解出来ると思います。

変な書籍を買うよりこちらがオススメです

はじめに(いいわけ

ホットエントリに行くとは思っておらず、皆様ありがとうございます

ドラゴンボールオブジェクト指向にする」というコンセプトではなく、「オブジェクト指向を(無理矢理)ドラゴンボールで説明する」という遊びだったので

プログラマーの方々にはツッコミを受けてしまいましたがここは遊びだと思って楽しんで下さい…。

ドラゴンボールは小さい頃から大好きでしたが流石にうるおぼえ過ぎました

専門家の方々からも厳しいツッコミを受けました

それはさておき「説明する題材を決める→好きな漫画から無理矢理当てはまりそうな例を考える」という思考実験なので、気が向いた方は色々考えてみると楽しいと思います。僕は楽しかったです

ジョジョの奇妙な冒険で学ぶオブジェクト指向

 スタンドとか波紋法とか色々面白そうです

ジャニーズで学ぶオブジェクト指向

 これは難易度が高そうです

BLで学ぶオブジェクト指向

 継承誘い受け、移譲=ヘタレ攻めだと思います。

結論

やっぱりドラゴンボールで例えると分かりやすいな!

無理がある!


ドラゴンボールで学ぶオブエジェクト思考Z ドラゴンボールで学ぶデザインパターン

デザインパターンとはドクターゲロが考えた「こうやって設計すれば色々捗るぞ」という例のことです。実際はGoFという人たちが考えたもので23個のよくあるパターン名前を付けて整理してくれたわけですね。

23個の中にはブルマさんですらわからいものが多いので(さすがドクターゲロですね)良く使う、代表的な物をいくつか紹介しま

Singletonパターン

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;
	}
}

これで界王神から怒られることもありませんね。

プログラマーは神なのでドラゴンボールを作れます


Proxyパターン

何かの処理を行うためにProxy、代理人を立てる設計です

地球のみんなは地球しか話せませんが、ナメック星にいるクリリンを通して願いを叶える必要があります

クリリンももちろん地球しか話せませんが、ナメック語を話せるデンデがいるため、地球のみんなは願いを叶えることが出来ます

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

大まかなアルゴリズムだけ決めておいて、実装はサブクラスに任せる設計が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();	//真ん中のボタンを押すだけ
 	}
 }

元になる船も違いますし、発射の仕方も違いますが同じ呼び出し方が出来ます

オーディオの位置が決まりませんでしたが、今回の運用では不要とのクライアントからのご意見したのでだったので

せっかく用意したオーディオ無駄になりましたが、コメントアウトしてあります


他のパターン

他にもまだまだあります。のんびり紹介していこうと思います。

ではでは。

2011-03-16

ドラゴンボールで学ぶオブジェクト指向」 のクロージャに関して

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(); //=&gt; 0
closure(); //=&gt; 1
closure(); //=&gt; 2

匿名ダイアリーで大なり記号とか書くときってどうしたらいいんですかね... "&gt;" ってなっちゃ

ドラゴンボールで学ぶオブジェクト指向ツッコミ

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&lt;count;i++){
		shotEnergy();
	}
};

この実装では, shotRenzokuEnergy を実行するたびに shotEnergy が毎回定義されてしまい, 非効率である.

以下のように書き換えることで, shootEnergy の定義は, shootRenzokuEnergy の定義時の 1 回のみとなる.

var shootRenzokuEnergy = (function () {
  var shootEnergy = function () {
    console.log("エネルギー波!!!");
  };

  return function (count) {
    for (var i = 0; i &lt; 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戦士にすることが可能です

(JavaScriptRubyなど)

noumin = new Hito(); 
noumin.kougekiKuwa = function(){
	//戦闘力たったの5…ゴミめ!
};

noumin.shootKamehameha = function(){
	//な、なんだと!?
};

農民がいきなりかめはめ波うつようになったら危険ですね、危ないです。

このように後付でメソッドを追加出来るタイプ危険性を含んでいます。

クラスインスタンス

http://anond.hatelabo.jp/20110316204446

インスタンスなのかクラスなのかはっきりしろよ・・・

セルを作るならZ戦士(インスタンス)を継承しなきゃならんぞ

とても良いつっこみが来たので追記します。

前半部分ではZ戦士をインスタンスしましたが、セルを作るにはZ戦士がインスタンスでは出来ないので

なのでZ戦士それぞれをクラスという形に再定義しました

何をインスタンスにして、何をクラスにするかが「設計」なんですね。

何がインスタンスで何がクラスか、加えて説明します。

セルの第一段階ではGokuなどのZ戦士の遺伝子があれば作ることが出来ました

cell_inst = new Cell(); //このセルは第一段階

でも第二段階以降は人造人間17号、18号が必要でしたね。

cell_inst.absorb(17gou); //第二段階に変身
cell_inst.call18gou();
cell_inst.absorb(18gou); //最終段階に変身

class Cell ....{
   function call18gou(){
        if(!this.17gou)return error(); //17号を吸収していないと失敗する
        this.17gou.speak("****略*****ドクターゲロ様****略****");
   }
}

この場合、17号と18号はそれぞれインスタンスです

17gouを吸収したので、17号の声で18号を呼ぶことが出来るようになりました

でもドクターゲロ「様」って言ったのでセルだってバレバレですね。

かいセリフは忘れたのでどなたか資料を下さい…。

追記

コメントへのレスを追加。

http://anond.hatelabo.jp/20110316224648

追記2

クロージャについてちゃんと書こうと思って挫折。どなたか良いアイディアを下さい。

変数スコープ解説する必要があるかなと思ったんですオブジェクト指向からは外れるような気がします。

エネルギー波→連続エネルギー波がどこかに使えそうな気がしましたが、気のせいだったぜ…

追記3

続編書きましたhttp://anond.hatelabo.jp/20110319020332

ログイン ユーザー登録
ようこそ ゲスト さん