「STR」を含む日記 RSS

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

2012-02-14

そっとうに。

/**
 * そっとうに。
 *
 * そっとうにを置く。
 *
 * @param string $str
 * @return string
 * @see <a href="http://vipsister23.com/archives/5204131.html">とある小学生が書いた詩が哲学的過ぎる件</a>
 */
function sottoUni($str) {
  return 'そっと'    .PHP_EOL
         . $str.'に' .PHP_EOL
         .'うに'     .PHP_EOL;
}

$arr = array('せなか','わたげ','たにま');
foreach($arr as $d) {
  echo sottoUni($d);
}

2012-01-18

Python vs Ruby vs PHP vs Haskell プログラミング言語バトル part1

 

42 : デフォルト名無しさん : 2011/11/12(土) 23:53:51.20

Pythonの方が弄れる対象が多いのに、なんでウェブ系だとPHPの方が流行ってんだろ

端末からテキスト処理も楽だし、数値計算周りのライブラリも充実しているのに

PHPが優遇されているのって歴史的な経緯以外に何か他の理由でもあるのか?

けどまぁ、情弱文系SEが大半を占めているバカだらけの日本じゃ別にPHPで困ることもないか


45 : デフォルト名無しさん : 2011/11/13(日) 01:41:24.25

数値計算や端末からテキスト処理なんてWeb系じゃ大して使わないからなあ…


43 : デフォルト名無しさん : 2011/11/13(日) 00:04:23.30

PHPが未だに現役なのは、単に歴史的な経緯でしかないだろ

Pythonに関しては、ZopeさえコケていなければWebサーバLLとして大成功していたはずなのに、

Railsなんかが登場したおかげで、すっかり影が薄くなってしまますた....


44 : デフォルト名無しさん : 2011/11/13(日) 00:49:55.28

zopeってコケてたんだ

ってか、railsインスパイアされたフレームワークって今じゃ幾らでもあるよね

djangoとかCakePHPとか。rubyってRoRを使いたいユーザを除くと、

pythonPHPの方がユーザー数は圧倒的に多いと思うんだけど

本家railsって、他を遥かに越えるほど良いものなんだっけ?


48 : デフォルト名無しさん : 2011/11/13(日) 08:30:25.68

44

Zopeが登場した当時、RDB+PHPはもう古い、これからOODB+ZopeWebの中軸になる!」

さかんに宣伝され、雑誌でもZope特集が組まれていた

 

少なくとも自分ZopeからPythonという言語を知ったし、その時点でRubyは知らなかった

そして、その後のORM(RDB)+Railsの出現と華々しい革新性への注目は、誰もが知っているだろう

今でもZopeの開発は継続されてはいるが、結果的に当初の期待が大きく裏切られたという事実は動かしがたい

 

djangoCakePHPについては実際に触っていないので憶測になるが、おそらく技術水準ではRailsと同等だろう

しかしRailsはRailsコミュニティの活動が活発だし、その進化は異常に早い

 

Railsに何か致命的なトラブルが発生して開発が停滞する、あるいはdjangoCakePHPから

何かのイノベーションが提示されでもされない限り、後発のdjangoCakePHPRailsに追いつくのは無理

Railsは決して技術的に完璧Webフレームワークではないんだけどね....(たとえばSeaSideのような.... )

 

からこそ「もしもZopeが....だったなら」という「たら・れば」感はPythonコミュニティの潜在認識になっている


51 : デフォルト名無しさん : 2011/11/13(日) 12:55:40.83

 C a k e P H P は う ん こ   

遅い、設計が古い、動作がおかしいの3重苦

日本では流行ってないけど海外だとYiiが流行ってきてる


55 : デフォルト名無しさん : 2011/11/13(日) 17:31:12.14

CakePHP使ってんの?

可哀そうにw


53 : デフォルト名無しさん : 2011/11/13(日) 14:44:48.55

求人PHPばかりだからPHPやるしかないだろ。


57 : デフォルト名無しさん : 2011/11/13(日) 19:34:04.95

でもやっぱりいつもの使い慣れたLL(Python/Ruby)で

Webサービスを書きたいってのがある


73 : デフォルト名無しさん : 2011/11/15(火) 17:32:46.07

アメリカ言語ユーザー数は

Python>>>>>>>>Ruby

求人数は

Ruby on Rails>>>>>>>>Django

http://www.indeed.com/jobtrends?q=django%2Cruby+on+rails&l=

どういうことなの?


74 : デフォルト名無しさん : 2011/11/15(火) 17:48:15.59

RubyRails以外に使い道がないか


75 : デフォルト名無しさん : 2011/11/15(火) 17:54:35.50

海外ではRubyは昨今のRailsバブルのお陰で

もはやWebスタートアップ共通語になってるらしいからね

求人数が多いのはそのためだと思うよ


76 : デフォルト名無しさん : 2011/11/15(火) 18:03:23.05

なんかのミスかと思ったがアメリカでもRuby on Railsは人気があるのかなあ・・・

Pythonのほうが使いやすいと思うのだがフレームワークRailsが優位なんだろうか


77 : デフォルト名無しさん : 2011/11/15(火) 18:23:14.33

Djangoは周辺ライブラリ微妙だし本体も鈍くさい感じがする。

でも、FlaskはSinatraより好きだからPythonが嫌いってわけではない。むしろ好き。

 

ただ、いざ作り始めるとやっぱりRailsが楽だなあってなって、Railsを使い続けている。


78 : デフォルト名無しさん : 2011/11/15(火) 18:38:46.28

同感だ

同じように思っている人が他にもいて安心した


79 : デフォルト名無しさん : 2011/11/15(火) 18:54:37.13

PHPJavaScalaには

Railsみたいなフレームワークあるのに

Pythonはいいのないんだよな


80 : デフォルト名無しさん : 2011/11/15(火) 21:19:09.89

PHPフレームワークが乱立しすぎているから、RailsPHPで実装してみようというやつが出てきた。

Scalaも注目されだしたのはつい最近のことだしな。

それに比べてPythonは、Zopeというデファクトスタンダードが既に存在していたけど、

つの間にかフェードアウト


ただ、どうやってもRailsもどきRailsを超えることはできないのは間違いない。


83 : デフォルト名無しさん : 2011/11/15(火) 21:25:38.55

パクリオリジナルを超えられない(キリッ って定型句だけど、

これってキリッって言いたいだけだと思う。

後発品が先に出たものを超えたものなんていくらでもあるから


84 : デフォルト名無しさん : 2011/11/15(火) 21:30:04.39

D言語って超えたって?


85 : デフォルト名無しさん : 2011/11/15(火) 21:31:12.00

B言語って超えたって?


86 : デフォルト名無しさん : 2011/11/15(火) 21:53:33.76

でもRailsRubyの黒魔術を使いまくりから

PHPで同じ事をできないわけではないだろうけど、Ruby on Railsほど簡潔にはできない


90 : デフォルト名無しさん : 2011/11/15(火) 22:50:07.81

スタートアップなんて根無し草の集まりにとって、

googleが囲った言語coolさを見出せないんだろ


123 : デフォルト名無しさん : 2011/11/20(日) 11:32:16.79

まあくだらねえWEBサービス作って喜んでる情弱は早く死ねって事だよ


91 : デフォルト名無しさん : 2011/11/15(火) 22:52:42.98

そういう理由じゃなくてRailsのほうが単純に情報プラグインも多いからでしょ


3 : デフォルト名無しさん : 2011/11/15(火) 23:07:07.67

linuxじゃデフォのツールなんだし、ツールとの連携を考えたらpython一択じゃん

わざわざ不合理で不完全な言語を使うなんて

社会からハミ出た奴らの精神的な作用によるものじゃないの?


95 : デフォルト名無しさん : 2011/11/15(火) 23:20:20.21

django情報プラグインが増えないという、

現実に対する鬱憤を吐いてるようにしか聞こえないな

もしも

linuxじゃデフォのツールなんだし、ツールとの連携を考えたらpython一択じゃん

真実であるのなら、今頃はdjango情報プラグインが溢れかえっているはず


104 : デフォルト名無しさん : 2011/11/16(水) 01:20:49.05

Python信者乙。

yumや、gdbgnome拡張pythonであるからといって、それをwebアプリでも使いたいと思う人は少ないというだけのこと。

ソースからインストールする必要があったとしても、web開発ではrubyを使いたいという人が多いというだけのこと。


94 : デフォルト名無しさん : 2011/11/15(火) 23:15:11.93

というか、世界中Pythonプログラマが Remeber Zope!! を合い言葉

打倒RailsたるWebフレームワークを開発しているはずだけど、

いまだにRailsを超えるプロダクトが登場しないのはナゼ?


Railsも登場してから、かなりの年月が経過しているんだけどなぁ....

その間にもRailsRails 3が登場して、REST/AJAXの強化等の進化継続しているよ

347 : デフォルト名無しさん : 2011/12/09(金) 10:16:35.22

Ruby では

ary.map {|x| x**2}

となるものが、Python では

map(lambda x: x**2, ary)

となり、lambda の本体が1つの式では表現しきれなくなると

def mapper(x):

.....

map(mapper, ary)

書き換える必要があります


348 : デフォルト名無しさん : 2011/12/09(金) 10:24:20.94

Pythonのlambdaを用いた階乗計算

f = lambda x:(x and f(x-1)*x)or 1

RubyにはPythonのように「lambda本体は式でなければならない」という限定がありませんから

andやorを使った不自然記述をしなくても

f = lambda{|x|if x == 0 then 1 else x*f.call(x-1) end}

または

f = lambda{|x|x == 0 ? 1 : x*f.call(x-1)}

と書けます。lambda内でreturnが使えますから、書きたければ

f = lambda{|x|if x == 0 then return 1 else return x*f.call(x-1) end}

でもOKです。


390 : デフォルト名無しさん : 2011/12/10(土) 15:35:41.62

348

これはPythondisっているように見せかけてRubydisっているのか? と一瞬思ってしまったw

だってRubyのほうが長くない?CLのfuncallみたいなcall()がちょっとうざいし…

そしてどっちもlambda式の中で束縛変数名前再帰可能、と

350 : デフォルト名無しさん : 2011/12/09(金) 11:12:13.28

要素に対する関数適用と、抽出を組み合わせる場合

Python

print [x*2+100 for x in [1,2,3,4,5] if x > 2 and x < 5]

暗号のように見える。

Ruby

puts [1,2,3,4,5].select{|i| i > 2 and i < 5}.map{|i| i*2+100}

思考の流れと、コードの流れが一致しているので書きやすい。


351 : デフォルト名無しさん : 2011/12/09(金) 11:22:55.04

だれだPythonなら書き方はひとつとか言ってるのは

map(lambda x: x*2+100, filter(lambda x: x > 2 and x < 5, [1,2,3,4,5]))

354 : デフォルト名無しさん : 2011/12/09(金) 12:22:07.37

pythonて可読性が高いのをうたってる割にはそこいまいちだよね


353 : デフォルト名無しさん : 2011/12/09(金) 12:10:08.46

Ruby場合には、左から右へと無名関数データフローあるいは

パイプラインのように並ぶからコードが読みやすい

 

関数型プログラミングに不慣れな初心者でも、参照透明性のあるコード自然に書ける

プログラマにとって優しい or プログラミングの楽しさを教えてくれるのがRuby

 

それと比較すると、Pythonコードは、関数型プログラミングというもの

いかに高度で難解なものであるかという事をもったいぶってプログラマ押し付け

 

もしもPythonしか知らないプログラマであれば、関数型 = 難解 という印象を持つだろう


356 : デフォルト名無しさん : 2011/12/09(金) 12:53:45.66

階乗計算くらいだと単純すぎて、ナゼ重要なのかが分かりづらいと思うのでコードで示す

result_list = source_list.map { |elem|

  x = foo(elem.x)  # ここが局所宣言を書く部分

  y = bar(elem.y)  # ここも局所宣言の続き

  x + y       # 最後に評価された式の値が、無名関数のリターン値になる

}

Rubyでは、map等に与える無名関数の中で局所的な環境(クロージャ)が作られるから

x = foo(...) のような代入文がいくつでも(= 複雑な処理でも)書ける

このポイントは、実用的なプログラム関数型風で書こうとした時に、威力を発揮する

357 : デフォルト名無しさん : 2011/12/09(金) 12:59:21.07

余計分かりづらくなった

358 : デフォルト名無しさん : 2011/12/09(金) 13:17:26.54

リスト内包表記が暗号みたいと言ってる奴は

高卒ドカタなんだろうなぁと可哀想になる

大学数学に触れる機会があれば

集合の表記に似せてることが分かるから

386 : デフォルト名無しさん : 2011/12/10(土) 01:41:34.46

数学とかで慣れてるし区切りが関数のがわかりやすい


359 : デフォルト名無しさん : 2011/12/09(金) 13:46:31.97

355

map/filterはfor/ifと同じだと言っているだけだから、難解という印象は持たない。

関数型プログラミングに慣れた、あるいは得意な人であれば、そういった印象なんだろね

Rubyの魅力はこれから関数型プログラミングを学ぼうとする初心者、 あるいはそんな初心者へ教える立場から見た、優しさ or 分かりやすさなんだ



360 : デフォルト名無しさん : 2011/12/09(金) 13:53:28.85

Rubyだと直感的に書けるコード

[1,4,3,2].sort.reverse.map{|x| x.to_s}.join('-')

Pythonだと読みにくい。

'-'.join(map(str, reversed(sorted([1,4,3,2]))))


361 : デフォルト名無しさん : 2011/12/09(金) 14:07:17.88

360

Pythonでは思考の流れと一致しないばかりか、「カッコだらけ」のコードになると.....


364 : デフォルト名無しさん : 2011/12/09(金) 14:28:55.99

カッコだらけのコードを分かりやすくする基本的な方法静的単一代入じゃないか

Rubyのやり方は基本ではなく玄人のやり方だろ


372 : 369 : 2011/12/09(金) 16:21:03.82

Pythonでは組み込みの型でメソッドチェインはやって欲しくないな

listにmap,filterメソッドができたとしても、

似たようなコレクションtuple,deque,array,queue等にも同じメソッドが必要になってくるし。

シーケンスプロトコルの利点が活かせない。

383 : デフォルト名無しさん : 2011/12/10(土) 01:17:28.39

372

外部のライブラリでも列挙可能なものは、たいていEnumerableモジュールをimportしてます

Rubyユーザーは列挙可能なものmapselectできて当然だろって思ってる気がしま


377 : デフォルト名無しさん : 2011/12/09(金) 18:41:51.79

Pythonは「何かを便利に書くためのしわ寄せ」をはっきり寄せてくる

得意と不得意を言語レベルではっきり主張するのでメリケン好みと言えなくもない

Rubyは全方位になんとなく八方美人なので、全体的になんとなく書きやすくてなんとなくキモくて遅い

379 : デフォルト名無しさん : 2011/12/09(金) 18:48:52.27

Pythonユーザー調教っぷりは異常

「書きにくいってことはその処理に向いてないってことだから諦めろ」を地で行く


387 : デフォルト名無しさん : 2011/12/10(土) 13:40:40.74

リストの内包表記はシンプルに書けるときは使うけど

基本その場でdefするのがPython風なんだと思う。

389 : デフォルト名無しさん : 2011/12/10(土) 14:40:31.04

無名関数が文を使うほど複雑なら名前を付けるのが Python 流と想像

384 : デフォルト名無しさん : 2011/12/10(土) 01:23:49.48

outer(center(inter( arg )))

これを読みづらいと感じるのは、左から右に流れる

日本語文に慣れているからだと思うが、

もしかしてアラビア語ネイティブな人からすると逆に読みやすいのか?


385 : デフォルト名無しさん : 2011/12/10(土) 01:34:57.89

なるほど、ということは右から左、左から右どっちでも行ける言語が最高ですね

F#パイプライン演算子最高ということで

2010-02-13

R基礎文法最速マスター

基礎

外部スクリプトの読み込み

Rコンソールに一行ずつコマンド入力してもいいけど、実際に使うにはテキストファイルコマンドを書いて(ソースコード)一気に実行させる方が楽。

source('hogehoge.R')

hogehoge.Rというのがソースコードを書いたファイルソースファイル)の名前

ライブラリの追加

CRANという、CPANパクリがある。膨大な数のライブラリがあるので、好きなものをインストールするには、

install.packages('hoge',dependencies=TRUE)

とするのが楽。

変数宣言

不要。変数に使える文字も結構多い。日本語でもOK。

> あ<-1
> あ
[1] 1
代入
a<-1
b=2
1->a

どれでもいい。但し推奨されてるのは一番上。Rの人は「束縛」という言葉を使いたがる傾向があるけど、どっちでもいいと思う。

余談だけど、関数引数の中で代入できる、しかもその値をそのあとの引数で使える。これ実は便利。

> sum(a<-1,a)
[1] 2
変数の内容を確認

基本は変数名を入力すれば表示される。

> a
[1] 1
> str(a)
 num 1
> summary(a)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      1       1       1       1       1       1 

最後のsummaryはRっぽい。strっていうのはstringではなくstructの略(だと思ってる)。Rの変数はいくらでも複雑な構造になり得るけど、そのときにぱっと見がわかるように構造を出力してくれる。

ベクトル

Rの基本はベクトル

ベクトルを作る

ベクトルの作り方はいくらでもあるけど、例示するのが早いでしょう。

> x<-1:3
> y<-c(TRUE, FALSE, TRUE)
> z<-c("a","b","c")
> x
[1] 1 2 3
> y
[1]  TRUE FALSE  TRUE
> z
[1] "a" "b" "c"

他にもいっぱいあるし、関数返値ベクトルってこともよくある。

> runif(3)
[1] 0.2200965 0.6391403 0.1089252

一様乱数を三個作った。

ベクトルの要素にアクセス
> x<-letters[1:5]
> x
[1] "a" "b" "c" "d" "e"
> x[2]
[1] "b"
> x[4:5]
[1] "d" "e"
> x[c(1,3,5)]
[1] "a" "c" "e"

こんな感じで、[]の中に添え字でアクセス。1-indexなので注意。2,3番目の例では添え字にもベクトルを使って、複数の要素に一気にアクセスしてる。

ベクトルの要素に代入
> x[3]<-"z"
> x
[1] "a" "b" "z" "d" "e"

でOK。

終わりに

要望があれば続くかも。

2009-03-26

http://anond.hatelabo.jp/20090326123924

適当ググる。がいくつかあったので羅列

str.charCodeAt(0) + str.charCodeAt(str.length-1)
(str.charCodeAt(0) + str.charCodeAt(str.length-1)) * str.length
    while (*key != '\0') 
        hashval += *key++;
    do{
        x = (x * 0x60 + *s - 0x20) % hashsize;
    }while(*++s);
/* ハッシュ値算出ルーチン */
/* 各文字コードを左に3シフトしたものでXORをとり、 */
/* ハッシュテーブルのサイズで割った余りを返す */
int HashCalc( SearchData )
char *SearchData;
{
  int HashValue;

  for ( HashValue = 0 ; *SearchData != '\0' ; )
    HashValue ^= (int)*SearchData++ << 3;
  return( HashValue % HASHSIZE );
}

2009-03-18

公明党都議選重視?

コピーして、test.htaのような拡張子HTAで保存

HTAプログラム

 ↓

<html&gt;

<head&gt;

<style type="text/css"&gt;dt{float:left;clear:left;width:10em;}</style&gt;

<meta content="charset=Shift_JIS"/&gt;

</head&gt;

<body&gt;

<script type="text/javascript"&gt;</p&gt; <p&gt;window.onload = init;</p&gt; <p&gt;var url = [</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/h19sangiin/san_kekka/h19san_hkai.html"&gt;http://www.senkyo.metro.tokyo.jp/h19sangiin/san_kekka/h19san_hkai.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/h17shugiin/sokuhou/7kaijyo_s.htm"&gt;http://www.senkyo.metro.tokyo.jp/h17shugiin/sokuhou/7kaijyo_s.htm</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/h17togisen/sokuhou/2kaijyo_s.htm"&gt;http://www.senkyo.metro.tokyo.jp/h17togisen/sokuhou/2kaijyo_s.htm</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/h16san_hkai.html"&gt;http://www.senkyo.metro.tokyo.jp/data/h16san_hkai.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/h15shu_hkai.html"&gt;http://www.senkyo.metro.tokyo.jp/data/h15shu_hkai.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_01_03.html"&gt;http://www.senkyo.metro.tokyo.jp/data/data01_01_03.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_02_05.html"&gt;http://www.senkyo.metro.tokyo.jp/data/data01_02_05.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/data03_04.html"&gt;http://www.senkyo.metro.tokyo.jp/data/data03_04.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_05_05.html"&gt;http://www.senkyo.metro.tokyo.jp/data/data01_05_05.html</a&gt;"</p&gt; <p&gt;];</p&gt; <p&gt;var base = "<a href="http://www.senkyo.metro.tokyo.jp/data/tokuhyo_23ku/"&gt;http://www.senkyo.metro.tokyo.jp/data/tokuhyo_23ku/</a&gt;";</p&gt; <p&gt;var file = ["chiyoda","chuou","minato","shinjyuku","bunkyo",</p&gt; <p&gt; "taitho","sumida","koutho","sinagawa","meguro",</p&gt; <p&gt; "ohta","setagaya","shibuya","nakaono","suginami",</p&gt; <p&gt; "toshima","kita","arakawa","itabashi","nerima",</p&gt; <p&gt; "adachi","katushika","edogawa"];</p&gt; <p&gt;for(var i=0; i<23; i++){</p&gt; <p&gt; url.push(base + file[i] + "\.html");</p&gt; <p&gt;}</p&gt; <p&gt;var id = [</p&gt; <p&gt; "2007 参院比", "2005 衆院比", "2005 都議会", "2004 参院比", "2003 衆院比",</p&gt; <p&gt; "2001 参院比", "2001 都議会", "2000 衆院比", "1998 参院比", "1997 都議会"</p&gt; <p&gt;];</p&gt; <p&gt;var ku = [</p&gt; <p&gt; "千代田","中央","港","新宿","文京",</p&gt; <p&gt; "台東","墨田","江東","品川","目黒",</p&gt; <p&gt; "大田","世田谷","渋谷","中野","杉並",</p&gt; <p&gt; "豊島","北","荒川","板橋","練馬",</p&gt; <p&gt; "足立","葛飾","江戸川"</p&gt; <p&gt;];</p&gt; <p&gt;var regexku = new RegExp("(" + ku.join("|") + ")区");</p&gt; <p&gt;var iframe = [];</p&gt; <p&gt;var data = {};</p&gt; <p&gt;var parse = [ function(){</p&gt; <p&gt; var d = iframe[0].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<10; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "0"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[1].contentWindow.document;</p&gt; <p&gt; var nobr = d.getElementsByTagName("nobr");</p&gt; <p&gt; for(var i=0, l=nobr.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(nobr[i].firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=nobr[i].parentNode; j<4; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "1"] = e.firstChild.nodeValue;</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[2].contentWindow.document;</p&gt; <p&gt; var nobr = d.getElementsByTagName("nobr");</p&gt; <p&gt; for(var i=0, l=nobr.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(nobr[i].firstChild.nodeValue) &amp;&amp; nobr[i].parentNode.tagName == "SPAN"){</p&gt; <p&gt; for(var j=0, e=nobr[i]; j<6; j++){</p&gt; <p&gt; e = e.parentNode;</p&gt; <p&gt; }</p&gt; <p&gt; var e2 = e.nextSibling.nextSibling.firstChild.childNodes[2].firstChild;</p&gt; <p&gt; var k = 0;</p&gt; <p&gt; data[RegExp.$1 + "2"] = 0;</p&gt; <p&gt; while(e2){</p&gt; <p&gt; if(e2.firstChild.firstChild.nodeValue.indexOf("公明党") != -1){</p&gt; <p&gt; data[RegExp.$1 + "2"] += parseInt(e2.parentNode.nextSibling.childNodes[k+2].firstChild.nodeValue.replace(",",""), 10);</p&gt; <p&gt; }</p&gt; <p&gt; e2 = e2.nextSibling;</p&gt; <p&gt; k++;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "2"] = int2str(data[RegExp.$1 + "2"]);</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[3].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<19; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "3"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[4].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; var regexku2 = /(大田|世田谷|練馬|足立|江戸川)/;</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.nodeValue)){</p&gt; <p&gt; data[RegExp.$1 + "4"] = td[i].nextSibling.nextSibling.firstChild.nodeValue.replace(/\.\d+/,"");</p&gt; <p&gt; continue;</p&gt; <p&gt; }</p&gt; <p&gt; if(regexku2.test(td[i].firstChild.nodeValue)){</p&gt; <p&gt; data[RegExp.$1 + "4"] = (data[RegExp.$1 + "4"] || 0) </p&gt; <p&gt; + parseInt(td[i].nextSibling.nextSibling.firstChild.nodeValue.replace(",","").replace(/\.\d+/,""));</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; for(var j=0; j<5; j++){</p&gt; <p&gt; data[ku[[10,11,19,20,22][j]]+"4"] = int2str(data[ku[[10,11,19,20,22][j]]+"4"]);</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[5].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<10; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "5"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[6].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<7; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "6"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"").replace("-","0");</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[7].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<9; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "7"] = e.firstChild.firstChild.nodeValue;</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[8].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p&gt; <p&gt; data[RegExp.$1 + "8"] = int2str(td[i].nextSibling.firstChild.firstChild.firstChild.nodeValue);</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(n){ return function(){</p&gt; <p&gt; var d = iframe[n+9].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; data[ku[n]+"9"] = 0;</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if((((td[i].firstChild || 0).firstChild || 0).nodeValue || "").indexOf("公明") == 0){</p&gt; <p&gt; data[ku[n]+"9"] += parseInt(td[i].parentNode.lastChild.firstChild.firstChild.nodeValue.replace(",",""));</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; data[ku[n]+"9"] = int2str(data[ku[n]+"9"]);</p&gt; <p&gt; show();</p&gt; <p&gt;}}];</p&gt; <p&gt;function init(){</p&gt; <p&gt; for(var i=0; i<23; i++){</p&gt; <p&gt; var dl = document.createElement("dl");</p&gt; <p&gt; dl.appendChild(document.createTextNode("\n【" + ku[i] + "区における公明票】\n"));</p&gt; <p&gt; for(var j=0; j<10; j++){</p&gt; <p&gt; var dt = document.createElement("dt");</p&gt; <p&gt; var dd = document.createElement("dd");</p&gt; <p&gt; dt.innerText = id[j];</p&gt; <p&gt; dl.appendChild(dt);</p&gt; <p&gt; dl.appendChild(dd);</p&gt; <p&gt; }</p&gt; <p&gt; document.body.firstChild.appendChild(dl);</p&gt; <p&gt; }</p&gt; <p&gt; for(var i=0; i<32; i++){</p&gt; <p&gt; var e = document.createElement("iframe");</p&gt; <p&gt; iframe[i] = e;</p&gt; <p&gt; e.style.display = "none";</p&gt; <p&gt; if(i<9) var f = parse[i];</p&gt; <p&gt; else var f = parse[9](i-9);</p&gt; <p&gt; e.attachEvent("onload", f);</p&gt; <p&gt; e.src = url[i];</p&gt; <p&gt; document.body.appendChild(e);</p&gt; <p&gt; }</p&gt; <p&gt;}</p&gt; <p&gt;function show(){</p&gt; <p&gt; for(var i=0; i<23; i++){</p&gt; <p&gt; var dl = document.body.firstChild.childNodes[i];</p&gt; <p&gt; for(var j=0; j<10; j++){</p&gt; <p&gt; var dt = dl.childNodes[j*2+1];</p&gt; <p&gt; dt.innerText = id[j] + " " + (data[ku[i]+j] || "");</p&gt; <p&gt; dt.nextSibling.innerText = bar(data[ku[i]+j], j);</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt;}</p&gt; <p&gt;function int2str(num){</p&gt; <p&gt; return new String(num).split("").reverse().join("").replace(/(\d{3})/g,"$1,").split("").reverse().join("");</p&gt; <p&gt;}</p&gt; <p&gt;function bar(str, flag){</p&gt; <p&gt; str = str || "";</p&gt; <p&gt; if(str == "" || str.length < 5) return "";</p&gt; <p&gt; var num = parseInt(str.match(/\d+/)) + 1;</p&gt; <p&gt; var arrow = (flag == 2 || flag == 6 || flag == 9) ? " ←" : "";</p&gt; <p&gt; var _bar = new Array(num).join("|") + arrow;</p&gt; <p&gt; return _bar;</p&gt; <p&gt;}</p&gt; <p&gt;</script&gt;

</body&gt;

</html&gt;

2008-12-24

http://qune.cside.com/mt/mt-tb.cgi/1064

よりそいプログラミングによりそってみる。

>int

>count_comma(const char* str) {

別に comma に限定する必要はないから、count_char にして、char 引数もう一つもとうよ。


>int

>count_comma(const char* str) {

> int ret;

ret って?count?じゃあ count って変数名のほうがいいよ。あと = 0 ね。


> for (ptr = str; *ptr != '\0'; ptr++) {

>

> }

ヌル文字最後にない場合どうすんだよ、おめー


> static const char COMMA = ',';

だから、グローバルになんてするなよ。

再利用性を高めようとする意識はいい。けど、後で関数単体で再利用できるように書けって。


> うるさい!だまってて!

すいません・・・

2008-11-29

iTunes再生回数Top25を意味もなく晒してみる+晒させてみたい。

タイトル アーティスト 再生回数
ブラックアウト 東京事変 566
アララト WHITE-LIPS 522
R.O.D. やなぎなぎ 490
強引niマイYeah〜 大槻ケンヂと絶望少女達 483
Nowhere FictionJunction YUUKA 448
空想ルンバ 大槻ケンヂと絶望少女達 445
God knows... 平野綾 387
メロスのように -LONELY WAY- AIRMAIL from NAGASAKI 376
だから涙をふいて 佐倉沙織 376
赤橙 ACIDMAN 368
未来への咆哮 JAM Project featuring Kageyama Hironobu, Endoh Masaaki, Kitadani Hiroshi & Fukuyama Yoshiki 332
明日へのBrilliant Road Angela 304
Do you feel loved? KOTOKO 296
Born On Judgment Day Helloween 292
鏡の中のアクトレス 中原めいこ 288
Days of promise SHIHO 283
PEARLS Seatbelts 271
metamorphose 高橋洋子 268
STORM JAM Project 260
雪、無音、窓辺にて 長門有希 260
El Alma feat. SHINJI TAKEDA Dragon Ash 252
まるい月 fau. 249
飛光 ACIDMAN 248
未完成協奏曲 (ロングヴァージョン) 錦織健 247
パノラマ -Panorama- 水樹奈々 246

この表を作る方法は以下のとおり。Macユーザならすぐ出来る。

1.まず、デフォルトスマートプレイリストのTop25を表示する。そしてiTunesでの情報表示を、上のバーを右クリックしてタイトルアーティスト再生回数のみにチェックする。

2.全体を選択。iTunes.txtというファイル名で保存する。UTF-8で。

3.次のソースコードコピペして、iTunes_list.rbという名前iTunes.txtを保存したのと同じフォルダに保存する。

f = open("iTunes.txt")

printf "|*タイトル|*アーティスト|*再生回数|\n"

f.each{|str|
  str = str.gsub(/\t/, "|")
  str = str.chop
  printf "|"+str+"|\n"
}

4.ターミナルを立ち上げ、cdと打ち込んだ後にスペースを空けて、iTunes.txtとiTunes_list.rbが入っているフォルダを、ターミナルウインドウドラッグアンドドロップする。その後returnキー。

5.ruby iTunes_list.rbと打つと、はてな記法で表組されたテキストが出てくるので、これをはてダコピペすればおk。

もしアルバム名なども表示したかったら、まずiTunesで表示したいヤツを出して選択してiTunes.txtにコピペ。そして最初のprintfのところを適宜書き換えればいい。

WinユーザRubyを動かせる環境がそろってる人なら、すぐに出来ると思う。

さあ、みんなも再生回数晒してみようぜ。

2008-10-28

http://anond.hatelabo.jp/20081026132547

FizzBuzz続き

Cにもlambdaがあればいいのに

#include <stdio.h>
#include <unistd.h>
#define FALSE 0
#define TRUE !FALSE

typedef struct state_t {
    int state;
    int num;
    int max;
    int outputted;
} state_t;

typedef struct fsm_t {
    state_t *(*func)(struct fsm_t *, state_t *);
    int divider;
    char *str;
} fsm_t;

static state_t *fizzbuzz(fsm_t *, state_t *);
static state_t *end_of_line(fsm_t *, state_t *);
static state_t *cond(fsm_t *, state_t *);
static state_t *succ(fsm_t *, state_t *);

static fsm_t fsm[] = {
    { fizzbuzz, 3, "Fizz" },
    { fizzbuzz, 5, "Buzz" },
    { end_of_line, 0, NULL },
    { cond, 0, NULL },
    { NULL, 0, NULL },
};

static state_t *fizzbuzz(fsm_t *fsm, state_t *cur) {
    if ((cur->num % fsm[cur->state].divider) == 0) {
        printf("%s", fsm[cur->state].str);
        cur->outputted = TRUE;
    }
    return succ(fsm, cur);
}

static state_t *end_of_line(fsm_t *fsm, state_t *cur) {
    if (!cur->outputted)
        printf("%d", cur->num);
    puts("");
    cur->outputted = FALSE;
    return succ(fsm, cur);
}

static state_t *cond(fsm_t *fsm, state_t *cur) {
    if (++cur->num > cur->max)
        return NULL;
    return succ(fsm, cur);
}

static state_t *succ(fsm_t *fsm, state_t *cur) {
    if (fsm[++cur->state].func == NULL)
        cur->state = 0;
    return cur;
}

int main(void) {
    state_t state = { 0, 1, 100, FALSE };
    state_t *cur = &state;

    while ((cur = (*fsm[cur->state].func)(fsm, cur)) != NULL)
        ;

    return 0;
}

2008-10-26

DRYFizzBuzz

http://anond.hatelabo.jp/20081026002746

ステートマシン大好きっ子としては書かずにいられない

もう少しがんばればforも無くせるな

fsmの中身ってDRYなの?的な話もあるだろうが,こんなもの他のプログラム自動生成すればいいんだよ!(開き直り)

#include <stdio.h>

static int process(unsigned char *str, int c) {
    if (str != NULL)
        puts(str);
    else
        printf("%d\n", c);
    return ++c % (3 * 5);
}

static int iter(int c) {
    return process(NULL, c);
}

static int fizz(int c) {
    return process("Fizz", c);
}

static int buzz(int c) {
    return process("Buzz", c);
}

static int fizzbuzz(int c) {
    return process("FizzBuzz", c);
}

static int (*fsm[])(int) = {
    fizzbuzz, iter, iter, fizz, iter,
    buzz, fizz, iter, iter, fizz,
    buzz, iter, fizz, iter, iter
};

int main(void) {
    int i, state;

    for (i = state = 1; i <= 100; i++) {
        state = (*fsm[state])(i);
    }

    return 0;
}

http://anond.hatelabo.jp/20081025233759

Thanks. 確かにそうなんだけど、putsだと勝手に改行が出力されてしまうので一ヶ所しか使えなかった。DRY、forなし、ifなし(:?使ってるのでインチキだけど)、main以外に関数なし風味。これで完成ということにして寝ます。

int main() {
  int fizz_buzz(int i, int limit) {
    int do_fizz_buzz(int num, int divisor, const char* str, int print) {
      return num % divisor == 0 ? do_fizz_buzz(num / divisor, divisor, str, 1) : (printf("%s", print ? str : ""), num);
    }
    do_fizz_buzz(do_fizz_buzz(i, 3, "Fizz", 0), 5, "Buzz", 0) == i ? printf("%d\n", i) : puts("");
    return i++ == limit ? 0 : fizz_buzz(i, limit);
  }
  return fizz_buzz(1, 100);
}

移植性の話は厳禁でw

2008-10-25

http://anond.hatelabo.jp/20081025233552

printf("%s", str);

printf(str);又はputs(str);

"%s"をパースする時間もったいない

とかどうでしょうか?

http://anond.hatelabo.jp/20081025231830

さっきのはあまりに汚かったのでちゃんと書いたよ!!

static int do_fizz_buzz(int num, int rem, const char* str, int print) {
  if (num % rem == 0) {
    return do_fizz_buzz(num / rem, rem, str, 1);
  }
  if (print)
    printf("%s", str);
  return num;
}
int fizz_buzz(int num, int rem, const char* str) {
  return do_fizz_buzz(num, rem, str, 0);
}
int main(){
  int i;
  for(i=1; i<=100; i++){
    if(fizz_buzz(fizz_buzz(i, 3, "Fizz"), 5, "Buzz") != i)
      printf("\n");
    else
      printf("%d\n", i);
  }
  return 0;
}

どうでしょうか?>元増田

2008-10-20

Re:Re:Re:エガミくんの脆弱性のやつ

http://anond.hatelabo.jp/20081020045037

早速お返事有難う御座います!id:hiroyukiegamiです!

id:Hamachiya2先生からのまとめ

なるほど!前回

$Hamachiya2 = htmlspecialchars($_GET["data"], ENT_QUOTES); //←ここを追加

$params = array('api_key' => 'フリッカーAPIキー',

'method' => 'flickr.photos.search',

'text' => $Hamachiya2,

と$_GET のところ(入力)で何かしようとしてたけど

レスポンスのコーナーのところ、html変数埋め込んで echo してるとこ。”

が大事なんですね!勉強になります!

先生からの説明で

その際に注意すべきは、html属性内(alt=ナントカとか、src=ナントカとか)に変数を埋め込んでいる場合は、ちゃんとクオートの類もエスケープする感じ?

とあって、うーんどういう意味だろうとグーグル先生に聞いてみたよ!

クオート(正確にはクォーロみたいですね!) ・・・ クォートとは、文字が通常有する特別な意味を奪うことである。

つまり”とか’の事ですね!勉強になります。

実際にやってみよー

今回echoで実際に書き出している部分は

$query = $_GET["data"];

echo "$query";

でした!

じゃぁ、ここをこうすればいいのかな??

$query = $_GET["data"];

echo nl2br(htmlspecialchars($query, ENT_QUOTES));

今回はXSS対策の定番『nl2br』を追加してみたよ!

PHP: nl2br - Manual

http://php.benscom.com/manual/ja/function.nl2br.php

nl2br ・・・ nl2br()関数は、改行文字(\n、\r、\n\rなど)を
タグに置き換えます。

$str = nl2br("STUDIO WINGでは\nPHP開発を行っています。");

print $str;

※上記の結果、「STUDIO WINGでは
PHP開発を行っています。」を出力します。

どうなったかな?

うーん、、、ではid:zapa氏の荒らしURLをみてみよう・・・。

http://flickr2.in/fli.html?data=%3Cscript%3Ejavascript%3Aalert(%27xss%27)%3B%3C%2Fscript%3E

id:Hamachiya2先生!全然解決されないよ(涙)

今回nl2brタグで改行を回避したけど・・・これじゃダメみたいですね・・・!

あれ・・・荒らしソースを見てみると・・・

<script>javascript%3Aalert('xss')%3B<%2Fscript>

・・・!!!

先生!僕は大きな間違いをしていたようです!

htmlspecialcharsとかnl2brタグも大事だけど、、、これじゃ解決できないみたい!!!!

これって、どうしたらいいんですか!?ヘルプミー!!!

追伸

最近朝型生活になってきました。

なんとか直さないと・・・。

どうにか解決方法はありますかね??

2008-10-17

http://anond.hatelabo.jp/20081006220009

YourFileHostのCAPTCHA画像をなんとかするの続き。

その後、適当にいじったら、手元環境で1枚あたり25秒くらい→だいたい2.5秒くらいで判別できるようになった。このくらいなら使えるかな。

速度向上に一番効いたのは、Token#importで画像を比較しているところの修正。他は細かい手直し。

使い方は前のやつと変わってません。

あと、テストに100枚くらいCAPTCHA画像食わせてみたけど、とりあえず全部正しく判定できた。

動作確認用のスクリプト (run.rb)

カレントディレクトリ以下にある*.gifCAPTCHA画像ファイル適当に判別するスクリプト。動作確認用にどうぞ。

後述のdecaptcha.rbと同じディレクトリ適当に置いてchmod +xしてね。

#!/usr/local/bin/ruby
$LOAD_PATH << File::dirname(File::expand_path($0))
require 'decaptcha'

STDOUT.sync = true

Dir.glob('*.gif').sort.each do |file|
  correct = File::basename(file, '.*')
  puts "Processing file: #{file}"
  start_time = Time.now
  ret = DeCAPTCHA.decode(file)
  elapsed = Time.now - start_time

  puts "  Result: #{ret} (=> #{(correct == ret) ? "Ok" : "Fail"})"
  puts "  Elapsed time: #{elapsed}"
  puts
end

コード (decaptcha.rb)

#!/usr/local/bin/ruby
require 'rubygems'
require 'gd2'
require 'pp'

#
#= CAPTCHA画像解析モジュール
# CAPTCHA画像ファイルを食わすとあら不思議Stringが出てくるよ。
# YourFileHostのやつに対応。
#
#== Usage
# decoded_str = DeCAPTCHA.decode("some_captcha_image.gif")  #=> String
# 失敗したらnilが返る。
#
module DeCAPTCHA
  DEBUG = false

  #=== CAPTCHA画像デコード
  # file::    画像ファイル名のパス
  # method::  未指定でよい。男は細かい事を気にするな。
  # returns:: CAPTCHA画像解析結果(String) or nil (デコード失敗時)
  def self.decode(file, method = DeCAPTCHA::Site::YourFileHost)
    return method.new(file).decode
  end



  #= CAPTCHA画像デコードクラス
  # このクラスサブクラスはimport, tokenize, stream_parseメソッドの
  # 実装を含む必要がある。
  class Site
    def initialize(file = nil)
      @pix = nil
      self.import(file) unless file.nil?
    end
    def decode
      return stream_parse(tokenize())
    end
  end

  #= YourFileHostのCAPTCHA画像を解析するクラス
  class Site::YourFileHost < Site
    def import(file)
      @pix = PixelMatrix.new.import(file)
      return self
    end

    # importしたイメージ(PixelMatrix)から、文字と思わしきパターンを
    # 抽出して上下マージンを切り取ってArrayにして返す。
    # returns:: Array of PixelMatrix
    def tokenize
      ret = []
      state = :initial
      for x in 0...@pix.width
        case state
        when :initial
          if !@pix.vline_blank?(x) then
            state = :tokenize
            pixel = PixelMatrix.new(0, 0, true)
            ret << pixel
            redo
          end
        when :tokenize
          if @pix.vline_blank?(x) then
            state = :initial
            next
          end
          x0 = pixel.width
          for y in 0...@pix.height
            pixel[x0, y] = @pix[x, y]
          end
        else
          raise 'NOTREACHED'
        end
      end

      ret.map! {|token| Token.new.import(token.cutoff_vmargin!) }
    end


    # PixelMatrixのArrayを受け取り、数字を判別。
    # tokens:: Array of PixelMatrix
    # returns:: String (判別結果)
    def stream_parse(tokens)
      rs = tokens.map {|x| x.guess.to_s }.join('')
      if rs.length != 4 then
        rs = nil
        if DEBUG then
          puts '- guess failed. dumping guess result of each token:'
          tokens.each_index do |i|
            print "##{i}:#{tokens[i].guess} "
            pp tokens[i].candidate
          end
          puts
        end
      end
      return rs
    end

    class Token
      @@digits = nil
      attr_accessor :candidate

      def initialize
        if @@digits.nil? then
          # 文字画像サンプルを作っておく
          @@digits = DIGITS_ASSOC.map {|digit|
            PixelMatrix.new(0, 0, true).import_array(digit) }
        end

        @candidate = Hash.new
      end

      # PixelMatrixを受け取り、文字画像サンプルと比較して
      # 一致率を計算しておく。
      # pixel:: PixelMatrix
      # returns:: self
      def import(pixel)
        @@digits.each_index do |i|
          digit = @@digits[i]

          if (digit.width - pixel.width).abs   > 4 or
             (digit.height - pixel.height).abs > 4 then
            @candidate[i] = -1  # サイズが違いすぎな場合、一致させない
            next
          end

          correct_bits = 0
          enlarged_width  = [digit.width,  pixel.width ].max
          enlarged_height = [digit.height, pixel.height].max
          for y in 0...enlarged_height
            dy = (y.to_f / digit.height * enlarged_height).to_i
            py = (y.to_f / pixel.height * enlarged_height).to_i
            for x in 0...enlarged_width
              dx = (x.to_f / digit.width * enlarged_width).to_i
              px = (x.to_f / pixel.width * enlarged_width).to_i
              correct_bits += 1 if digit[dx, dy] == pixel[px, py]
            end
          end

          @candidate[i] = correct_bits * 100 /
                          (enlarged_width * enlarged_height)
        end

        return self
      end

      # importのときの比較結果をもとに文字を推測
      # returns:: Fixnum or nil(失敗時)
      def guess
        digit, ratio = @candidate.sort {|a, b| a.last <=> b.last}.last
        digit = nil if ratio < 0 or ratio < 65
        return digit
      end
    end
  end


  #= 画素マトリックスクラス
  # 画像ファイルを食わせると、各ピクセル(画素)を2値(black(1) or white(0))に
  # 変換して、内部で保持する。
  # 以後、Matrixクラスのような感じで個々の画素アクセスできる。
  class PixelMatrix
    BLACK = 1
    WHITE = 0

    attr_accessor :width
    attr_accessor :height

    # width::  幅
    # height:: 高さ
    # is_flexible:: 自動的に伸張するか
    def initialize(width = 0, height = 0, is_flexible = false)
      @matrix = Hash.new {|hash, key| hash[key] = Hash.new(WHITE)}
      @width, @height, @flexible = width, height, is_flexible
    end

    # file:: 画像ファイル名のパス
    # brightness_threshold:: 画素を黒とみなす閾値 (0 - 255, default: 0x40)
    # returns:: self (DeCAPTCHA::PixelMatrix)
    def import(file, brightness_threshold = 0x40)
      gd = GD2::Image.import(file)
      @width, @height = gd.width, gd.height

      self.each_with_axis do |x, y|
        color = gd[x, y]
        greyscale = (color.red + color.green + color.blue) / 3
        self[x, y] = (greyscale > brightness_threshold) ?
          WHITE :
          BLACK
      end
      return self
    end

    def import_array(array)
      array.each_with_index do |str, y|
        str.split('').each_with_index do |c, x|
          self[x, y] = c.to_i
        end
      end
      return self
    end

    # PixelMatrixを画像ファイルとしてexport
    # file:: 新たに作る画像ファイル名のパス
    def export(file)
      gd = GD2::Image::IndexedColor.new(@width, @height)
      gd.palette << GD2::Color::WHITE
      gd.palette << GD2::Color::BLACK
      self.each_with_axis do |x, y|
        gd[x, y] = {
          WHITE => GD2::Color::WHITE,
          BLACK => GD2::Color::BLACK,
        }[self[x, y]]
      end
      gd.export(file)
      return self
    end

    # 指定された位置の画素を返す。
    # returns:: PixelMatrix::BLACK(1) or WHITE(0)
    def [](x, y)
      if !@flexible and !in_range?(x, y) then
        raise RangeError
      end
      return WHITE if !@matrix.has_key?(y)  # XXX: for optimize
      return @matrix[y][x]
    end

    # 画素に値を設定。
    # returns:: PixelMatrix::BLACK(1) or WHITE(0)
    def []=(x, y, val)
      unless in_range?(x, y) then
        raise RangeError unless @flexible
        @width  = (x >= @width)  ? x + 1 : @width
        @height = (y >= @height) ? y + 1 : @height
      end

      @matrix[y][x] = val
    end

    def in_range?(x, y)
      ((0...@width) === x and (0...@height) === y)
    end

    # 指定された軸をもとに画素を走査し、Arrayに変換。
    # 例えば、to_a(:vertical, 10) とすると、x == 10 な列を取り出して
    # Arrayにして返す。
    #
    # axis:: 軸を指定 (:vertical または :horizontal)
    # pos:: 位置を指定。_axis_で指定した軸と直交する軸における位置を指定。
    def to_a(axis, pos)
      {:vertical => lambda {
        (0...@height).map {|y| self[pos, y]}
       },
       :horizontal => lambda {
        (0...@width).map  {|x| self[x, pos]}
       },
      }[axis].call
    end

    # returns:: Array
    def hline(y)
      self.to_a(:horizontal, y)
    end

    # returns:: Array
    def vline(x)
      self.to_a(:vertical, x)
    end

    # X軸方向に画素を走査。
    # y:: どの位置で走査するか
    # returns:: 指定された軸の上にドットが存在: false, 無い: true
    def hline_blank?(y)
      return true if @matrix.has_key?(y) == false # XXX: for optimize
      for x in 0...@width
        return false if self[x, y] == BLACK
      end
      return true
    end

    # Y軸方向に画素を走査。
    # x:: どの位置で走査するか
    # returns:: 指定された軸の上にドットが存在: false, 無い: true
    def vline_blank?(x)
      for y in 0...@height
        return false if self[x, y] == BLACK
      end
      return true
    end

    # 上下のマージン削除した新しいPixelMatrixを返す。
    # returns:: PixelMatrix
    def cutoff_vmargin
      pixel = PixelMatrix.new(0, 0, true)
      head = 0
      tail = self.height - 1

      head.upto(tail) do |y|
        if !self.hline_blank?(y) then
          head = y
          break
        end
      end
      tail.downto(head) do |y|
        if !self.hline_blank?(y) then
          tail = y
          break
        end
      end

      head.upto(tail) do |y|
        0.upto(self.width - 1) do |x|
          pixel[x, y - head] = self[x, y]
        end
      end

      return pixel
    end
    
    # 自身の上下のマージン削除する。cutoff_vmarginの破壊版。
    # 速度稼ぎのために直接@matrixを触ったり、すこしずるをしている。
    # 効率は、ほんの少しだけ速くなったような誤差の範囲のような感じ。
    # returns:: self (PixelMatrix)
    def cutoff_vmargin!
      head = 0
      tail = self.height - 1

      head.upto(tail) do |y|
        if !self.hline_blank?(y) then
          head = y
          break
        end
      end
      tail.downto(head) do |y|
        if !self.hline_blank?(y) then
          tail = y
          break
        end
        @matrix.delete(y) if @matrix.has_key?(y)  # XXX
      end

      if head > 0 then
        head.upto(tail) do |y|
          next if !@matrix.has_key?(y)            # XXX
          @matrix[y - head] = @matrix.delete(y)   # XXX
        end
      end
      self.height = tail - head + 1

      return self
    end
    
    def each_with_axis
      for x in 0...@width
        for y in 0...@height
          yield(x, y)
        end
      end
    end
  end
end

class DeCAPTCHA::Site::YourFileHost::Token
DIGITS_ASSOC = [
  # 0
  ["00000000011111110000000000",
   "00000001111111111110000000",
   "00000011111000001111000000",
   "00001111111100010011110000",
   "00011111100000110000111000",
   "00111111000000100001111000",
   "00111111110001000001111100",
   "01111111000010000011111110",
   "01111100000110000111111110",
   "01111111000100000111111110",
   "11111100001000001111111111",
   "11100000001000011111111111",
   "11111000010000011111111111",
   "11111000110000111111111111",
   "10000000100001111111111111",
   "01100001000001111111111110",
   "01100010000011111111111110",
   "01100010000111111111111110",
   "00111100000111111111111100",
   "00011100001111111111111000",
   "00001100011111111111111000",
   "00001111111111111111100000",
   "00000011111111111111000000",
   "00000000111111111100000000"],
  # 1
  ["00001",
   "00111",
   "11111",
   "11111",
   "10001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001",
   "00001"],
  # 2
  ["0000011111111110000000",
   "0001111111111111000000",
   "0011110000000010000000",
   "0110000000000100000000",
   "1100000000001100011110",
   "1000000000001000001111",
   "1000000000010000000111",
   "1000000000110001111111",
   "1000000000100001111111",
   "1000000001000000011111",
   "0100000011000001111111",
   "0011000010000111111110",
   "0011000110000001111110",
   "0000001100000111111100",
   "0000001000011111110000",
   "0000011000000111100000",
   "0000110000000000000000",
   "0000111111111111111111",
   "0001111111111111111110",
   "0011111111111111111100",
   "0011111111111111111100",
   "0111111111111111111000",
   "0111111111111111110000"],
  # 3
  ["000000011111111110000000",
   "000001111111111111100000",
   "000011100000011111111000",
   "000111000000111111111000",
   "000110000001111111111100",
   "000100000001111111111100",
   "000100000011111111111100",
   "000110000111111111111000",
   "000010000111111111111000",
   "000000001111111111100000",
   "000000011111111111000000",
   "000000011111111110000000",
   "000000000000001100000000",
   "000000000000011100011100",
   "000000000000111000111110",
   "000000000000110000001110",
   "000000000001110001111111",
   "110000000011100011111111",
   "111000000111000000111110",
   "011100000110001111111100",
   "001111001110000111111000",
   "000011111100000011100000",
   "000000011000111000000000"],
  # 4
  ["0000000000011",
   "0000000000011",
   "0000000000111",
   "0000000001111",
   "0000000001111",
   "0000000011111",
   "0000000111111",
   "0000000110111",
   "0000001100111",
   "0000011100111",
   "0000011000111",
   "0000110000111",
   "0001110000111",
   "0001100000111",
   "0011000000111",
   "0111000000111",
   "0111111111111",
   "1111111111111",
   "0000000000111",
   "0000000000111",
   "0000000000111",
   "0000000000111",
   "0000000000111"],
  # 5
  ["000000001111111111111110",
   "000000011111111111111100",
   "000000111111111111111100",
   "000000111111111111111000",
   "000001111111111111110000",
   "000011100000000000000000",
   "000011011111111110000000",
   "000111111111111111000000",
   "001111100000000111000000",
   "001110000000000110001100",
   "000000000000000100011110",
   "000000000000001100000110",
   "000000000000011000011111",
   "000000000000011001111111",
   "000000000000110000011111",
   "000000000001100000111111",
   "110000000001100111111110",
   "011000000011000001111110",
   "011100000110000011111100",
   "001111000110011111111000",
   "000111111100001111110000",
   "000001111100000011000000",
   "000000001000011000000000"],
  # 6
  ["000000000000000110000000",
   "000000010001111111111000",
   "000001110000011100111100",
   "000011100000011000001000",
   "000111000011111000000000",
   "001111000001110000000000",
   "001110000000111100000000",
   "011110001111111111100000",
   "011100000111000011110000",
   "011000000010000001111000",
   "011000011110000011111100",
   "010000111100000111111110",
   "100000001000000111111110",
   "100001111000001111111111",
   "000011110000011111111111",
   "000000100000011111111111",
   "000011100000111111111111",
   "001111000001111111111110",
   "000010000001111111111110",
   "001110000011111111111100",
   "000111000111111111111000",
   "000011111111111111110000",
   "000000111111111111000000",
   "000000000111111000000000"],
  # 7
  ["0011111111111110001111",
   "0011111111111100000011",
   "0111111111111000000110",
   "1111111111111000111100",
   "1111111111110000001100",
   "0000000000000000011000",
   "0000000000000011111000",
   "0000000011000000110000",
   "0000001110000011100000",
   "0000011110001111100000",
   "0000111100000011000000",
   "0001111000000110000000",
   "0001111000111110000000",
   "0011110000001100000000",
   "0011110000001000000000",
   "0011100011111000000000",
   "0011000001110000000000",
   "0001000000110000000000",
   "0000000111100000000000",
   "0000000111000000000000",
   "0000000011000000000000",
   "0000001110000000000000",
   "0000001100000000000000"],
  # 8
  ["0000000111111111110000000",
   "0000011111111111111100000",
   "0000001111100000011110000",
   "0000000001110000000111000",
   "0011000011111000000011100",
   "0011100001111100000011100",
   "0011110000001110000011100",
   "0001111000011111000111000",
   "0000111100000111101110000",
   "0000011110000001111100000",
   "0000001111000011111110000",
   "0000111111110000011111000",
   "0011110011111000001111100",
   "0111100001111100011111100",
   "0111000000111110000111110",
   "1111000000011111000000111",
   "1111000000001111100011111",
   "1111000000000011111000010",
   "0111100000000001111100000",
   "0011110000000000111110000",
   "0001111110000001111110000",
   "0000011111111111111000000",
   "0000000011111110000000000"],
  # 9
  ["000000111111111110000000",
   "000001111111111111100000",
   "000111111111111001111000",
   "001111111111110000010000",
   "011111111111110000010000",
   "011111111111100000100000",
   "011111111111000001100000",
   "111111111110000001000111",
   "111111111110000010000001",
   "111111111100000110000111",
   "011111111000000100011111",
   "011111111000001000001111",
   "001111110000011000011111",
   "001111100000010001111110",
   "000111110000100000011110",
   "000001111111100000111110",
   "000000011111000111111100",
   "000000000010000001111100",
   "000000000110000001111000",
   "000100001100011111110000",
   "000111001100001111100000",
   "000011111000001111000000",
   "000000010000110000000000"],
]
end
__END__

2008-09-27

[][]「あたし彼女」をパソコンで読みやすくしてみた。

最近、巷で噂の『 第3回日本ケータイ小説大賞:あたし彼女 』を読んでみた。

ケータイ小説といってもパソコンでも読むことは可能。(しかし絵文字は表示できない)


数ページ読み進めた所で思った。

本文を読む→次ページに進む→本文を読む→次ページに進む

これが結構なストレスになる。

1ページが短いので数秒で読み終わる。その度に改ページするのがめんどくさい。


なのでPHPで簡単なコードを書いてみた。

とりあえず、50ページまで一気に取得する系。みたいな

<html><body>
<?php
//表示するページ数を指定
for($i=300;$i<360;$i++){
$url = "http://nkst.jp/vote2/novel.php?auther=20080001&amp;page=".$i;
$con = @file_get_contents($url);
//本文以外を削除する
$con = eregi_replace("<a.href.*","",$con);
eregi("<hr.*",$con,$array);
$str = $str.$array[0];
}
//表示
print $str;
 ?>
</body></html>


でも実はPHPってあんまり触らないんだよね。

それ以前にHTMLイマイチ理解してない。

だからもっとうまいやり方があるんだろーなぁ。


補足大歓迎です。

みたいな

2008-03-22

[]Python 2.6だと、オブジェクト辞書のキーに使えない場合がある

Python2.5のときは、新スタイルクラスインスタンス辞書のキーとして必ず使用できたけど、Python 2.6ではそういうわけじゃなくなってるぽい。という話。

class TestClass(object):
    def __init__(self, i_name):
        self._name = i_name

    def __eq__(self, i_other):
        if not isinstance(i_other, TestClass):
            return False
        return self._name == i_other._name

print 'object.__hash__ = ' + str(object.__hash__)
print 'TestClass.__hash__ = ' +str(TestClass.__hash__)

上記のようなコードを実行したら、Python 2.5とPython 2.6で結果が違いました。


Python 2.5の場合の結果。

object.__hash__ = <slot wrapper '__hash__' of 'object' objects>
TestClass.__hash__ = <slot wrapper '__hash__' of 'object' objects>

Python 2.6の場合の結果。

object.__hash__ = <slot wrapper '__hash__' of 'object' objects>
TestClass.__hash__ = None

Python 2.6だと、objectクラス継承すると、__hash__がNoneになっちゃってる。このままだと辞書のキーとして使えないね。object継承したクラスで__hash__を実装すれば、大丈夫みたい。

ハッシュ値の計算方法 (2)」というページも参考になりそう。

2008-03-12

アマゾン個人情報だだもれ祭り

http://namidame.2ch.net/test/read.cgi/news/1205255797/

Amazonほしい物リスト個人情報漏れまくりで祭に発展|デジマネット

 このサービス、名前とメールアドレスのどちらかで検索することができるのだが、

このメールアドレスが曲者だ。率直に言おう。メールアドレスが分かれば

その人の本名を知ることができるのだ。


メールアドレスアカウント名で他人のウィッシュリストや購入済みのリストが見れる



で、アフィとか貼ってるひとはアカウントからメルアドがばれて購入履歴がばれるに発展してるっぽ。

女子アナがバイブ買ってるとか、そういうことで炎上加速中。


http://namidame.2ch.net/test/read.cgi/news/1205262805/1-100

これお届け先登録してあれば、その人のほしいもリストから商品カートに入れると

あて先を登録した住所にできて、購入の最終確認までいけば住所確認できるぞ。



http://find.2ch.net/?BBS=ALL&PARTNER=FENRIR&TYPE=TITLE&COUNT=10&STR=%A5%A6%A5%A3%A5%C3%A5%B7%A5%E5%A5%EA%A5%B9%A5%C8

そんなわけでウイッシュリスト。あとはよろしく。

俺の購入履歴は素敵なほどまじめだ。


AmazonOK!

!KOnozamA


伝説になったな。

2008-03-04

[]PHPPerlのqwを実現するお!


function qw ($str) {
    return preg_split('/\s+/',$str,-1,PREG_SPLIT_NO_EMPTY);
}

$data = qw('
    hoge
    muge
    dae
');

print_r($data);

にゃろめ。


プログラ増田のあなぐら

2008-03-03

Shift_JISにおける危険な文字まとめ

今時Shift_JISプログラミングするバカな奴はいないだろうけど折角まとめたので公開

2バイト目がアスキーコードど丸被りしているものを列挙する

@ [ \ ] ^ _ ` { | } ~
40 5B 5C 5D 5E 5F 60 7B 7C 7D 7E
81   ?? ?? ± ×
82
83
84 А Ъ Ы Ь Э Ю Я к л м н
85
86
87 ?? ?? ?? ?? ?? ?? ??
88
89
8A
8B
8C
8D
8E
8F
90
91
92
93
94
95
96
97 輿
98
99
9A
9B
9C 忿
9D
9E
9F
E0
E1
E2
E3
E4
E5
E6
E7
E8
E9
EA
EB
EC
ED ?? ??
EE ??
EF
F0 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
F1 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
F2 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
F3 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
F4 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
F5 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
F6 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
F7 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
F8 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
F9 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
FA ?? ??
FB ?? ?? ?? ??
FC
40 5B 5C 5D 5E 5F 60 7B 7C 7D 7E
@ [ \ ] ^ _ ` { | } ~

縦軸が1バイト目で、範囲は81ー9F、E0ーFC

横軸が2バイト目で、アスキーコードを含むもの。

# ちなみに「??」って表示されてるのはまー外字部分だしそんなに気にしなくていいかと

これらの文字コードには気をつけること。

特に2バイト目が5C(\)ものは要注意。

"や'と引っ付くのでまともにプログラミングできない。


 print '予定表';
 print "無能";

上記コードPerlでもPHPでもエラーとなる。

特にPerlの場合は文字列中に展開できる構文が多いのもあり、色々なエラーを出せるので注意が必要だ。


 print qq[夕焼け小焼け]; # 「夕」の2バイト目でエラー
 print "警察24時!";     # @24という変数とみなされる

また、正規表現でも厄介な問題が起きまくるので注意すべし。


my $str = 'ダ';
print 'match' if $str =~ /_/; # マッチしちゃう

こういう様々な理由からShift_JISプログラミングをしてはいけないわけだ。

だからUTF8を使うべきだ。UTF8が無理でもせめてEUC-JPのどちらかでプログラミングすることをオススメする。

まーEUC-JPEUC-JPShift_JISと一部文字コードが重なっているので正直扱いにくいのでやっぱりUTF8を強く推奨する。


プログラ増田のあなぐら

2008-02-02

jcode.plっぽい使い方で

$_POST = array_map('htmlspecialchars', $_POST); 
$_GET = array_map('htmlspecialchars', $_GET);
$HTTP_COOKIE_VARS = array_map('htmlspecialchars', $HTTP_COOKIE_VARS);

//$_SERVER = array_map('htmlspecialchars', $_SERVER); 
$_SERVER['HTTP_USER_AGENT'] = htmlspecialchars($_SERVER['HTTP_USER_AGENT']);
$_SERVER['PHP_SELF']  = htmlspecialchars($_SERVER['PHP_SELF']);

//改行コード→改行タグ
function del_tag($str) {
return $str = str_replace("\r\n", "<br>", $str);
}

$_POST = array_map("del_tag", $_POST);
$_GET = array_map("del_tag", $_GET);

$HTTP_COOKIE_VARS = array_map('del_tag', $HTTP_COOKIE_VARS); 
$_SERVER['HTTP_USER_AGENT'] = del_tag($_SERVER['HTTP_USER_AGENT']);
$_SERVER['PHP_SELF']  = del_tag($_SERVER['PHP_SELF']);

//タブ除去
function del_tab($str) {
return $str = str_replace("\t", "", $str);
}
$_POST = array_map("del_tab", $_POST);
$_GET = array_map("del_tab", $_GET);
$HTTP_COOKIE_VARS = array_map('del_tab', $HTTP_COOKIE_VARS); 
$_SERVER['HTTP_USER_AGENT'] = del_tab($_SERVER['HTTP_USER_AGENT']);
$_SERVER['PHP_SELF']  = del_tab($_SERVER['PHP_SELF']);

セキュリティ全然詳しくないだけども・・・

例えばこんな感じのファイルを置いてから、最初に

require 'secure.php';

そのファイルをincludeするように先頭に書いておくだけで、いろんなサニタイズとかを一気にやってくれるような仕組みってないのかな(SQLインジェクションとやらもちゃんと防げるようにして)。

無ければ増田でみんなで作る程度の価値はありそうなものだと思う。

こういうのって名前出して公開しちゃうと危険だから2ch増田向きだと思うし。

2008-01-03

もっとうまく書きたい

文字列から、その長さの分だけ、ランダムに1文字づつ拾ってきて、新たに文字列を作成する

ってのを、何となく思いついて書いてみたけど。。。

おれ、才能ないよなぁ。。

cnt = 10

cnt.times do |j|
	str = ["h","a","t","e","n","a"]
	length = str.length
	length.downto(1) do |i|
		idx = rand(i)
		print(str[idx])
		str.delete_at(idx)
	end
	print("\n")
end

2007-11-09

Pythonではなぜ string.len() でなく len() なのか?

http://anond.hatelabo.jp/20071021143442


その理由は知らないが、なければ作ればいいじゃないか。

class MyString(str):
    def length(self):
        return len(self)

というクラスを作って

string = MyString("Hello world")
print string.count("o"), string.length()

Rubyライクにやれば

2 11

とでるよ。え、リストもlist.length()が使いたいって?それも簡単。

class MyList(list):
    def length(self):
        return len(self)

l = MyList([1, 2, 3, 4, 5, 6])
l.length()

6

きちんと他のメソッドも使えるよ。

l[1:]

[2, 3, 4, 5, 6]

l.reverse()
l

[6, 5, 4, 3, 2, 1]

ね。簡単でしょ。


Pythonは仕組みが統一されているものが多いので、いじりやすいのですよ。上の例のやつは組み込みクラスオブジェクトユーザー定義のクラスオブジェクトがおおむね統一されているからこそ簡単にできる。他にも関数なんかもほかのオブジェクトと同じオブジェクトなので、高階関数なんてもの簡単に作ることができて関数プログラミングぽくできる。例えば今はなきapply関数なんかは

def myApply(func, *args):
    return func.__call__(*args)

と定義できる。実際に

def sumUpThree(num1, num2, num3):
    return num1 + num2 + num3

でためしてみる。

myApply(sumUpThree, 1, 2, 3)

結果はちゃんと

6

とでる。将来廃止されそうなmap関数も簡単に定義できる。他にも複数の引数をもつ関数の部分適用のようなことを行う関数も次のように簡単に定義できる。

def partial(func, *oldArgs):
    def wrapper(*newArgs):
        return func.__call__(*(oldArgs + newArgs))
    return wrapper

sumUpThree関数テストすると

sum_1 = partial(sumUpThree, 1)
sum_1(2, 3)

6

sum_1_5 = partial(sum_1, 5)
sum_1_5(9)

15

sum_10_20 = partial(sumUpThree, 10, 20)
sum_10_20(30)

60

こういう風に高階関数が簡単にできるのは関数オブジェクト関数の実行とはメソッドの呼び出しにすぎないからだ。以上のように組み込みオブジェクトユーザー定義オブジェクトの差があまりないことや関数オブジェクトであることに見られるようにPythonは仕組みが統一されていてシンプルだ。そのためひとつのことがわかれば他のこともわかることが多いし、簡単にいじることもできる。


だからなければpythonをいじればいいと思うよ。


最後にラムダ式信者のためにpartialをラムダ式を使って書いておく。

def partial(func, *oldArgs):
    return lambda *newArgs:func.__call__(*(oldArgs + newArgs))

Pythonラムダ式がだめだといわれているが、こんな風にかけたとして何がうれしいというのだ。

2007-10-30

40行で作るPerlテンプレートエンジン

60行で作るPHP用テンプレートエンジン

やってしまった・・・。

方針:

  • PHPのように<?php・・・?>が無いのでそのまま表示と(foreach|if|unless)に対応。
  • [% $c{title} %]で普通に表示(TTっぽい?)
  • [# $c{title} #]でHTMLエスケープ表示

package SixtyLinesTemplate;

use strict;
use warnings;
our $VERSION = '0.01';

sub convert {
    return unless defined(my $str = shift);
    $str =~ s{&amp;}{&amp;}gso;
    $str =~ s{<}{&lt;}gso;
    $str =~ s{>}{&gt;}gso;
    $str =~ s{\"}{&quot;}gso;
    $str;
}

sub include_template {
    my $tmpl = shift;
    my %c = %{+shift};
    eval convert_template($tmpl);
    die $@ if $@;
}

sub convert_template {
    my $tmpl = shift;
    my $cache = $tmpl.'.cache';
    return scalar do { open my ($FH) , $cache; local $/; <$FH> }
        if ( -f $cache &amp;&amp; (stat($tmpl))[9] <= (stat($cache))[9] );
    my $out = do { open my ($FH) , $tmpl; local $/; <$FH> };
    $out =~ tr/()/\x28\x29/;
    $out =~ s/\[%\s*(foreach|if|unless|end)\s*(.+?)\s*{?\s*%\]/");".(lc($1) eq 'end' ? '} print q(' : "$1 $2 { print q(")/ige;
    $out =~ s/\[%(.+?)%\]/);print $1; print q(/g;
    $out =~ s/\[#(.+?)#\]/);print SixtyLinesTemplate::convert($1); print q(/g;
    $out = 'print q('.$out.');';
    open my ($FH) , '>' , $cache;
    print $FH $out;
    $out;
}

1;

サンプルコード


use SixtyLinesTemplate;

my $context = {
    'title' => 'Example',
    'list'  => [10,'<A&amp;B>']
};

SixtyLinesTemplate::include_template('template.tmpl',$context);

サンプルテンプレート


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head&gt;
    <title>[# $c{title} #]</title>
  </head&gt;
  <body>
    <h1>[# $c{title} #]</h1>
    <table>
[% foreach my $i (0..@{$c{list}}-1) %]
      <tr bgcolor="[% $i % 2 ? '#FFCCCC' : '#CCCCFF' %]">
        <td&gt;[% $i %]</td&gt;
        <td&gt;[# $c{list}[$i] #]</td&gt;
      </tr>
[% end %]
    </table>
  </body>
</html>

出力例:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Example</title>
  </head>
  <body>
    <h1>Example</h1>
    <table>

      <tr bgcolor="#CCCCFF">
        <td>0</td>
        <td>10</td>
      </tr>

      <tr bgcolor="#FFCCCC">
        <td>1</td>
        <td>&lt;A&amp;amp;B&gt;</td>
      </tr>

    </table>
  </body>
</html>

foreachんところが汚く見えるかもしれませんが、あれは添え字を取ろうとするとああなるんでご勘弁を。

普通ループするだけならforeach my $item (@$c{title}) でいけますゆえ。

あと存在しない変数とか使うと死んだり警告でたりするのでevalの前にno strictとno warningsをやった方がいいかもねぇ。

って何まじめに検証してんだ俺・・・orz



追記:

SixtyじゃなくてFortyだね。恥ずかし!

追追記:

danさんに添削頂いたYO!

でも&amp;の奴はちゃんと書いてるんだけども投稿すると勝手エスケープされてしまってるんだよね。何でだろ?

ちなみにこのconvertの処理はCGI::Utilから拝借しました。

2007-10-19

[]yomutonougakusarimasu 1/5 以下、某ロダからのこぴぺ

紅楼夢のなんか主観的な適当にそんなの気に食わないなら読まないほうがよろしい気分が落ち込んでも責任は取りませんと言うか取れるわけも無いし取りたくもない 18禁と言うか18以下がこんなの見てないでさっさと将来悲観して自殺でもしなさい大人になっても良いことは別にない サークルペンネーム ホームページ 画像など 余計な一言の順 下に合同誌とかそんなの 東方紅楼夢 参加サークル一覧 (2007/09/14確定) *サークル五十音順、 As-Zadkiel 鈴乃音彼方 http://www.geocities.jp/plastic_harmony/ http://www.geocities.jp/plastic_harmony/irasuto/Princess_patyu_a.jpg http://www.geocities.jp/plastic_harmony/doujinshi/C72_sample01.jpg http://www.geocities.jp/plastic_harmony/doujinshi/C72_sample05.jpg そこはかとなくというには激しく顔がおかしく見える全体的にバランス微妙 Artistic Imitation 虹階、藍川樹 http://www.k5.dion.ne.jp/~triortre東方主従録 第弐節」でございます。もちろん、SSです。藍川さんの挿絵も当然入ります。 との事 EARNESTLY JET CITY 小嶋,佐々木,蒼雅 http://remiliareimu.seesaa.net/ http://remiliareimu.up.seesaa.net/image/pac.jpg http://remiliareimu.up.seesaa.net/image/1A1A1A1A1A1A1A1AQ.jpg http://remiliareimu.up.seesaa.net/image/1A1A1A1A1A1A1A1AP.jpg http://remiliareimu.up.seesaa.net/image/dakiiiiiiiiiiiiiiiiiiiiiiii.jpg 霊夢霊夢 妄想Lunatic というエロゲ完成版で良いのかあと抱き枕ブログなのはもうしょうがないけれど、分かりやすく情報を纏めて欲しいと常々 青 ヨハネ http://sangensei.okoshi-yasu.com/ http://sangensei.okoshi-yasu.com/img028.jpg http://sangensei.okoshi-yasu.com/img027.jpg http://sangensei.okoshi-yasu.com/img001.jpg http://sangensei.okoshi-yasu.com/img002.jpg http://sangensei.okoshi-yasu.com/img004.jpg http://sangensei.okoshi-yasu.com/img006.jpg 陰影のつけ方が強いのかその割には明るい方向が弱い感じ虹彩を増やすと良いかもしれないと思ったまあ上のほうにそう見える絵が多かったせいか 蒼空市場http://www7a.biglobe.ne.jp/~aozora-market/ http://www7a.biglobe.ne.jp/~aozora-market/suwako01.jpg http://www7a.biglobe.ne.jp/~aozora-market/flan2.jpg http://www7a.biglobe.ne.jp/~aozora-market/yukarin2.jpg http://www7a.biglobe.ne.jp/~aozora-market/02.gif 青だの蒼だの逆にここは虹彩が激しすぎる感じ目に痛い色塗りに力入れてるんだろうけど髪の毛の線なんか細いけれど体の線を引くのは余り得意じゃなさそうまあ一枚絵が上手い人が描く漫画が面白いとも言わないそもそも上手いとも言わない 青空給食 コトブキ   HPなしかな C72とかにでてたらしいです 蒼空の丘 蒼井さつき http://aoi-aozora.hp.infoseek.co.jp/ http://aoi-aozora.hp.infoseek.co.jp/illust/junk_toho/070413.jpg http://aoi-aozora.hp.infoseek.co.jp/illust/junk_toho/070116.jpg http://aoi-aozora.hp.infoseek.co.jp/illust/toho/060926.jpg http://aoi-aozora.hp.infoseek.co.jp/illust/toho/060626reimu.jpg 実に普通です間違いなく記憶に残りませんがこれからも地道にがんばってください 碧弐の伊呂波 伊造 http://homepage2.nifty.com/izou/ http://homepage2.nifty.com/izou/gallery/syotyuumimai2007.jpg http://homepage2.nifty.com/izou/gallery/natukomikansya.jpg http://homepage2.nifty.com/izou/gallery/ataisaikyou2.jpg http://homepage2.nifty.com/izou/gallery/sample013.jpg http://homepage2.nifty.com/izou/gallery/sample012.jpg カラーは結構アニメ調のポップな絵でそれなりと思いかけたけれど気のせいですねなれた構図以外だと崩れてる?というか目が気になってしょうがない あかい☆きつねあきの りょう http://www5.ocn.ne.jp/~red-fox/ http://www5.ocn.ne.jp/~red-fox/IMG/webryugi.jpg http://www5.ocn.ne.jp/~red-fox/IMG/akatukiww.jpg http://www5.ocn.ne.jp/~red-fox/IMG/koma_cut_format.jpg レミリア・スカーレット合同誌に参加します。 あかだのあおだの本当に多いなあと 紅い紅茶 KOKOA http://kokoacafe.sblo.jp http://kokoacafe.sakura.ne.jp/sblo_files/kokoacafe/image/DSC01855.JPG http://kokoacafe.sakura.ne.jp/sblo_files/kokoacafe/image/DSC01856.JPG 台湾とかの即売会?に出たとかどうとかその行動力は普通にすごいと思う。見習いたくはない絵・音楽・グッツどっちつかずの迷い道とのことで何を作るのかわかりませんそもそも更新がないけれど生きて帰ってきてるのか 紅いつけ物 えぬてい http://akaitsukemono.sakura.ne.jp/ http://akaitsukemono.sakura.ne.jp/reisen01.jpg http://akaitsukemono.sakura.ne.jp/yuyuko01.jpg http://akaitsukemono.sakura.ne.jp/lunachild01.jpg http://akaitsukemono.sakura.ne.jp/rumia-mahjong-01.jpg くっきりはっきり分かれた絵ですね画像大きいですねがんばってください AKACIA 銀一 http://bullish.fc2web.com/ http://bullish.fc2web.com/illustration/07080601.jpg http://bullish.fc2web.com/illustration/07080602.jpg http://bullish.fc2web.com/illustration/07080603.jpg http://bullish.fc2web.com/illustration/07080607.jpg http://bullish.fc2web.com/illustration/06080701.jpg http://bullish.fc2web.com/illustration/06080702.jpg 徒歩に似た匂いがするガチバトルですか絵自体は綺麗に見えたけれど頭身が高すぎる正直バトルとかいりませんから あかちょこ 紅乃 http://www.xn--l8jsy9c4k.jp/ 二人でやっているサークル?どちらも絵が微妙にのっぺりしている東方について欠片も触れたところのないページでハルヒだのなんだの言っていてとても不安です 紅の碧落 岳る   今まで活動など見つからないと言うか名前とかなんて読むんだこれたける?ダミーぽい AXEL7 羽瀬ななせ http://hase7se.ame-zaiku.com/ http://hase7se.ame-zaiku.com/media/yakumo01.jpg http://hase7se.ame-zaiku.com/media/udon03.jpg http://hase7se.ame-zaiku.com/media/myon01.jpg http://hase7se.ame-zaiku.com/media/aya01.jpg http://hase7se.ame-zaiku.com/media/sakuya01.jpg http://file.hase7se.blog.shinobi.jp/dfc32591.jpg http://file.hase7se.blog.shinobi.jp/db10b39b.jpg 過不足なく上手です言う事がない 浅香山黒板部 Nowell http://www.kokubanbu.com/ http://www.kokubanbu.com/image/top.jpg 東方紅楼夢参加決定しましたが、サイトが間に合ってないよ!完成予定は8月中ごろなので、もうしばらくお待ち下さい。 違う時の中を生きてる気がしてならない あさつき堂 うがつまつき http://asatsukido.moryou.com/index.html http://asatsukido.moryou.com/55.jpg http://asatsukido.moryou.com/58.jpg http://asatsukido.moryou.com/48.jpg 原作のままな絵を描いたことありますか?それっぽい感じを出そうとしすぎて違和感があるミッシングとか断章のグリムとかそれっぽいけれど中身の伴わないものに似ている あと棘とかで名前が出ていたような。絵板スレだったも知れないけれどようやく名前と絵が一致しました ACID CLUB EAST nagare http://acidclub.sakura.ne.jp/ http://acidclub.sakura.ne.jp/br6-hyousi.jpg http://acidclub.sakura.ne.jp/oh03.jpg http://acidclub.sakura.ne.jp/avsksample.jpg フラッシュとか作っているところですね壊れ系でキャライメージを固めた事もあって余り良い印象をもてない絵はまあ地味 az az http://az.que.jp/ http://az.que.jp/gift/giftrabel.jpg http://az.que.jp/imb_blog/20070917az1_kazehahuri.jpg http://az.que.jp/web/685.jpg http://img.toranoana.jp/popup_img/04/0010/13/02/040010130217-3p.jpg 何十年代なのか分からないけれど昔風カラー普通に描けば普通に上手い。4コマも結構好きでした中の人のことは知るものじゃないです坊主を嫌うとどうしても純粋に見れないもので本人と知り合いとかそういうのではないよ 後思案計画 地上屋   出てこないわけです AfternoonT     検索しようがない あまとう こよみ   かなり検索しづらいですよ(^^ここら軒並みダミーサークルかと こよみとかどっかの漢字三文字を思い出すんだけれど あみだ佐野 さのこ http://amidakuzu.blogspot.com/ http://bp2.blogger.com/_wS1C6g9vYLc/Rt4vT8yX8DI/AAAAAAAAAHs/G7E_QmVA_DE/s1600-h/page.jpg http://bp0.blogger.com/_wS1C6g9vYLc/Rt4xLcyX8EI/AAAAAAAAAH0/FPucA9RxU3g/s1600-h/ã??šã????ã??¸ã????ã??¡ã??¤ã????.jpg http://bp0.blogger.com/_wS1C6g9vYLc/Rrh72AK6MpI/AAAAAAAAAG8/jlMxS8J13K8/s1600-h/æš‘ä¸??ã??Šè¦??è??žã????ã????ã????ã??°png.png http://bp1.blogger.com/_wS1C6g9vYLc/Rns2dFycoKI/AAAAAAAAADk/d9uhMXIO6YI/s1600-h/è????æ??¸ã????.jpg お上手で羨ましいほどにURLの文字列は転載防止のためかなひぐらし漫画のどれかを描いていた人の絵とイメージが被る あめだまひとつぶ。 あめ。   以前から紅楼夢に参加しているようですHPはないのかな 歩いて行きまっしょい!! 遊歩道 http://aruite1024.web.fc2.com/ http://aruite1024.web.fc2.com/hinatyan.jpg http://aruite1024.web.fc2.com/misuti01.jpg http://aruite1024.web.fc2.com/misusenga.jpg 背景も描こうとするのは良いことだと思いますけれど立体感がありません角度の付いた絵はどれも首をかしげるようなものです中々これを修正するのは大変だと思いますが頑張ってくださいあと全体のバランスをたまに一旦眼を離して遠くから見直すと良いかとついでに男性女性の描き分けの練習もどうぞ 歩いていく空想屋 アルマ   ちょっとどうなのか判断できない あるふ??と めーり http://nagika.topaz.ne.jp/ http://nagika.topaz.ne.jp/gl/toho_000094.png http://nagika.topaz.ne.jp/books/cc071104.jpg ちょっと判断できない アンニュイ赤蛸 たこ http://takotakonet.sakura.ne.jp/ http://takotakonet.sakura.ne.jp/ilust/toho/ayyyy.jpg http://takotakonet.sakura.ne.jp/ilust/toho/sana.jpg まあいまさら何を言う事もない動きのある絵はまだ苦手なのか少し絵が硬くなったような平たく言えば下手になった気がする あん@らぼ しぐれM http://www.geocities.jp/nip_sigurem/ 今回は おすわりPOP Project とか言う事をやってます正直これは誰が喜ぶんだ 個人では何かをするつもりはないのか いーえむふぁんたずむ 間崎えいじ http://masaki-eiji.sakura.ne.jp/ http://masaki-eiji.sakura.ne.jp/2007/070903.jpg http://masaki-eiji.sakura.ne.jp/2007/070823.jpg http://masaki-eiji.sakura.ne.jp/2007/070821.jpg http://masaki-eiji.sakura.ne.jp/2007/070409.jpg http://masaki-eiji.sakura.ne.jp/2007/070419.jpg 何とも言えず微妙一番上は激しく誰てめ絵 生駒蓮華生駒 忠治  以前のイベントに参加してた模様 石ろこ 石ろこ   さりげなく付き合いのあるページは見つかりましたHPはないんでしょう多分 IZMIZM izna http://izmizm.sakura.ne.jp アレンジ いそため 秋野落葉 http://isotame.fc2web.com/ 何と言うかいきなりポップアップ開いたりこのサイトは行かない方が良いかもスパイウェアとかしこまれるかもね☆ と言うかなんでこのURLなんだ いのちふるさと たぽ http://inofuru.fc2web.com http://f28.aaa.livedoor.jp/~inohuru/images/nitori.jpg http://f28.aaa.livedoor.jp/~inohuru/images/tilennrann.jpg 高校生の時に月姫の本を描いていた人ですいえ別に18禁だったよななんて思っていませんジャンプ系のネタを多用するギャグ漫画ばかり描いていた人です二次創作なのになんでわざわざ他の作品のキャラに置き換えるとか全然思ってません頑張って絵柄を似せてるなあとは思った 異文家めげぷ??莢  結構他のイベントに参加しているようです Imitation Room 野瀬裕一 http://www.imitationroom.com/ http://www.imitationroom.com/doujin/cm72/noface.jpg http://www.imitationroom.com/doujin/cm72/noface03.jpg 頑張ってください いよかん。 ほた。 http://hotaiyokan.blog86.fc2.com/ http://blog-imgs-10.fc2.com/h/o/t/hotaiyokan/563260402_132.jpg http://blog-imgs-10.fc2.com/h/o/t/hotaiyokan/20070908152626.jpg http://daruman.at.infoseek.co.jp/utage/utage5.jpg http://daruman.at.infoseek.co.jp/utage2/utage4.jpg あくが無いさっぱりした絵二次ネタに頼っていない感じがしてこういうのは好きですがちがちのシリアスはちょっとあれですが   IncluDe ふぅりすと http://include.matrix.jp/ http://include.matrix.jp/image/junk163.jpg http://include.matrix.jp/image/junk161.jpg 絵柄と合っているのは知りませんががっちがちの18禁好みでどうぞ interim 阿佐ヒナ http://fw-rise.sub.jp/east/ http://fw-rise.sub.jp/east/pwrigle.jpg http://fw-rise.sub.jp/east/pkaguya.jpg http://fw-rise.sub.jp/east/lettyw.jpg どれもこれも同じような顔と目に見えますけど割りと上手なのかな?塗りは綺麗で良いと思います WAVEDRIVE SIV   http://www006.upp.so-net.ne.jp/ochadokoro/toho_ss_mc.htm アレンジはるのひとの絵だけください Watergate Ruin 伊関ミツハル http://watergateruin.iza-yoi.net/ http://watergateruin.iza-yoi.net/illust/circle-cut.jpg http://watergateruin.iza-yoi.net/Gallery/gallery1.jpg http://watergateruin.iza-yoi.net/Gallery/gallery2.jpg まあ反応しづらいくらい普通です頑張ってください WATER■DUCTS 名無さん http://untitled-774.hp.infoseek.co.jp/ http://untitled-774.hp.infoseek.co.jp/gazou/wd.JPG http://untitled-774.hp.infoseek.co.jp/gazou/205908.jpg 欠片もやる気が感じられない気がする今日この頃皆さんいかがお過ごしでもどうでも良いです絵板のほうには見れる絵はありますがご本人の絵なのか分からないのでのせませんでした絵板もそうだし、人を選びそうなサークルでしょうきっと ウサギてゐ因幡 どういう神経してればこういうサークル名とかつけるんでしょうね   牛半殺し まちょー http://honmagu.hp.infoseek.co.jp/ HPへのリンク間違ってる http://blog72.fc2.com/m/matyooo/file/iroiro.jpg 余りやる気はないようです 有造無造 鈴音 千葉http://uzoumuzou.fc2web.com/ http://uzoumuzou.fc2web.com/image/messa-0708003-01.jpg だそうで 歌えない太平洋 夏那瀬秋穂 http://www.saturn.dti.ne.jp/~kanase/ http://www.saturn.dti.ne.jp/~kanase/YOYOGI_S.jpg http://www.saturn.dti.ne.jp/~kanase/CG/udonge3.jpg 何度もこういう風に纏めると面倒だと思うこともある何故本人は顔の平面差と目の大きさが気にならないのか気になっていても直せないのかまあそんな感じ 空木幽幻 saboten http://uturogi.hp.infoseek.co.jp/ http://uturogi.hp.infoseek.co.jp/niki/20070816_lumia_06.jpg http://uturogi.hp.infoseek.co.jp/niki/20070805_lumia_04.jpg http://uturogi.hp.infoseek.co.jp/niki/20070731_lumia_02.jpg http://uturogi.hp.infoseek.co.jp/niki/20070731_lumia_01.jpg http://uturogi.hp.infoseek.co.jp/niki/20070605_lumia_03.jpg http://uturogi.hp.infoseek.co.jp/niki/20070523_kataga_01.jpg http://uturogi.hp.infoseek.co.jp/niki/20070510_reimu_02.jpg それなりに上手かなあと思って上から見ていったら皆同じような表情で俺はもう少し他の形に行って見ても良いかもしれない 宇部ソフトウェア技術研究所 骨折飲料 http://www.fmp.jp/~kossetsu/ アレンジ 海鴎髭   シーガルって読むんですかね参加イベントは見つかりましたがHPはないようです多分 うみねこおしるこ http://uminekotewi.x0.com/ http://uminekotewi.x0.com/TOP20070908.jpg http://uminekotewi.x0.com/CG/B004/B004top20070908.jpg http://uminekotewi.x0.com/CG/A013/hina1.jpg あちこちイベント参加しまくってるようですね暇なのか時間を作り出してるのか絵は前からさほど上手くなっているような気もしませんが上手くなってるのかな塗りは綺麗になってきている気はします うらみち通り らじねす   紅楼夢の件が引っかかるくらいです ウルフルズ 卯月なんとか http://nan.babymilk.jp/ http://blog17.fc2.com/n/nantokasan/file/29.jpg http://blog17.fc2.com/n/nantokasan/file/28.jpg 上手いですよね手とかでも目が全部同じに見えるんですあと本の中で中の人押し出すような内輪話とかいまいち Azure&Sands 鯛の小骨 http://bunbun-aya.ath.cx/~tainokobone/ アレンジ エヴァラ 若鶏 何処の焼肉のたれかと思いましたが参加暦も見つかりましたウェットにとんだ毒ギャグがミーのハートガッチリキャッチですね らしいです  A・L 殿様 http://tonosa.hp.infoseek.co.jp/altop.htm http://tonosa.hp.infoseek.co.jp/001.JPG http://tonosa.hp.infoseek.co.jp/015.JPG http://tonosa.hp.infoseek.co.jp/070321b.JPG 結構前からいる人な気がしますがぜんぜんですね上手くはなっているのだろうけれど致命的に絵が可愛くないというか人の絵が微妙 エカナテテ 若山摩知 http://ekanatete.web.fc2.com/ http://ekanatete.web.fc2.com/picture/info/eiyuuka3.jpg http://ekanatete.web.fc2.com/picture/hanken/070325-suika-jishin.jpg http://ekanatete.web.fc2.com/picture/info/sakuranbo.jpg 可愛いとは思うけれど目が変それ以外目に入らない えきたいきんぞく ぎんさん   http://www7a.biglobe.ne.jp/~metal_over_man/ ここの人の同士らしいです同士ってなんだ SCN 葵 実樹 http://www.saikoroclub.net/ http://blog71.fc2.com/s/scn/file/kz1_jacket_01.jpg http://blog71.fc2.com/s/scn/file/kz_ss_10.jpg http://blog71.fc2.com/s/scn/file/kz_ss_06.jpg 東方サウンドノベル空即是紫記??Emptiness in the True Memory.」 オリジナルサントラ空即是紫記音源録?? ??TOHO TEMPEST EXTRA.」 この辺りの再販でしょう多分 NZKSTYLE bell   驚くほど何も出ない N' なにわうぐぅ   Tシャツとか作ってるところかな言葉は悪いけど金のためにやってるようなサークルか F.m.l えだ   見つかりませんダミーっぽい MMD トキhttp://homepage2.nifty.com/MMD/ http://homepage2.nifty.com/MMD/070512top.jpg http://homepage2.nifty.com/MMD/060527.jpg 模型ガレキフィギュア?まあ何でも良いけれど上のを見る限り余り上手いとは思えません更新が遅いので刮目してみるべきな可能性もありますが、まあほぼありえないでしょうあと趣味は個人の勝手で良いけれど、プロフィールにあんな写真があると引く MxM-Factory 水無月あくあ http://homepage2.nifty.com/~aqua/index.html http://homepage2.nifty.com/~aqua/poprumya.jpg http://aquaneko.cocolog-nifty.com/.shared/image.html?/photos/uncategorized/2007/08/11/koa.jpg http://aquaneko.cocolog-nifty.com/./photos/uncategorized/2007/08/06/oppatyu.jpg みすちー、るーみあ合同誌に参加したそうです 下手ではないかもしれないけれど上手でもない細部まで書き込むような絵柄ではないですね M.O.S K助スケ http://mo-sky.hp.infoseek.co.jp http://mo-sky.hp.infoseek.co.jp/imgl/natuerin.jpg http://mo-sky.hp.infoseek.co.jp/imgl/youm.jpg http://mo-sky.hp.infoseek.co.jp/imgl/aris.jpg http://mo-sky.hp.infoseek.co.jp/imgl/2007nenga.jpg パースかけたりして挑戦は良いことですでもそれより先に基本をしっかりこなしてください AREA TYS J-YMG http://areatys.mods.jp/ http://areatys.mods.jp/g/th10k01b.jpg http://areatys.mods.jp/g/10000cb.jpg http://areatys.mods.jp/j/alice_20070321.jpg 今後の予定なんですが、東方妖々夢ベースにした、荒唐無稽のバトル漫画を作成中です。GUNDOROWARZシリーズ第一部 デュエルウィザード第二部 高度1万2千フィート幻想曲 第三部 冥界決闘シンドローム  バトル漫画ですか画力と見せ方が伴わないと陳腐になると思いますけど適当に頑張ってください中の人は二人いるのかな 分かりづらいです画像小さいのは容量削減のためでしょうかね elista 宮野えりな http://el.rgr.jp/ http://el.rgr.jp/picture/sakuya.jpg http://el.rgr.jp/picture/yuyuko.jpg http://el.rgr.jp/picture/0815.png http://el.rgr.jp/picture/comic7.jpg 蛸に似ている黒さはないけれどそこはかとなく好きです LM らんさ http://l-m.s35.xrea.com/ http://l-m.s35.xrea.com/pro.jpg http://l-m.s35.xrea.com/comic/yuyu_to_flan.jpg http://l-m.s35.xrea.com/comic/metyahie_11.gif http://l-m.s35.xrea.com/comic/nattyan_01.gif http://l-m.s35.xrea.com/hikikomori/HDD.gif イラストよりは漫画畑でしょうか特に絵が上手くもなければ話が面白いとも言いませんがそこまで酷いネタもないし安定して見れる感じがします?引きこもりニートネタはもういりませんが LDI9r   ドクシノ http://ldi9r.blog113.fc2.com/ http://blog-imgs-11.fc2.com/l/d/i/ldi9r/20070822214601.jpg やる気がないなら無理にページを作るなよと思う今日この頃自分にも当てはまって非常に墓穴 絵だけ見ると少し気になります AngelicQuasar 天音アマネ http://youzyo.net/ アレンジ angel slap 水無月 そうし http://angelslap.karou.jp/ http://angelslap.karou.jp/kokuchi/yuugikyou.jpg http://angelslap.karou.jp/kokuchi/yuugikyou2.jpg http://angelslap.karou.jp/gallery/mas/suika.jpg なのはの方へ行っていたらしいけれど帰ってきた模様三期は微妙らしいですね別に何の関係もありませんが絵はまあ上手くなってるんですかね分かりません水無月さん二人目ですねご家族でしょうか神無月さんもどこかのサークルにいましたね ANGELTYPE 猫描・ネジキリオ http://blackangel.under.jp/ http://angeltype.under.jp/natuotudesu.jpg http://angeltype.under.jp/tp_l.jpg http://angeltype.under.jp/reimu_tima.jpg http://angeltype.under.jp/bag_3.jpg サークル名が「BLACK†ANGEL」から「ANGELTYPE」にかわりました。 何を考えて名前変えるのか理解できないですカンバッチとか色々やってるところですね多分それなりに人気があるじゃないでしょうか EnHANCE HEART羽田 共 http://heart.sabax.jp/ http://heart.sabax.jp/youmu_0316b.jpg http://heart.sabax.jp/th_meikai0607p.gif http://heart.sabax.jp/th_sakuya0604c.jpg 上手ですね色々見ていると画像は結構見かけます線が鋭角的なのか柔らか味に欠ける気はします 軍艦写真があってはじめてみたので絵よりそっちに興味がいや関係ないけれど 炎氷刺丸亭 炎氷刺丸 http://www.geocities.jp/enju1162/ http://www.geocities.jp/enju1162/y-color15.jpg http://www.geocities.jp/enju1162/coolier65.png http://www.geocities.jp/enju1162/tohocomic1.jpg 名前とか見る限り朱に交わればと言うか類友と言うか以前もこんなことを書いた気がするサークル代表者の名前は上記のものなのか絵を描いている人は別の人です 桜花月間 萩宮アルト http://www.aikis.or.jp/~kt373 SSに東方萃夢想カラーパレット多分SSの本でしょうか 大熊猫飯店 岡平 閑 http://kit.or.tp/~pandaza/ http://kit.or.tp/~pandaza/2007.jpg http://file.pandaza.blog.shinobi.jp/20070826.jpg http://file.pandaza.blog.shinobi.jp/mixi153.jpg ルーミア合同誌に参加しています! 下手ということはないけれど何か違和感をおぼえる絵頬のひげだかなんだか良く分からない物体と目辺り? O.P.E.N 阪木洋一 http://www.geocities.jp/ocean_sakaki/index.htm SSの本でしょうオリキャラ三次創作と良い印象を受けない作品紹介でした おしゃれどろぼう STR http://o-dorobou.main.jp http://o-dorobou.main.jp/top9.jpg http://o-dorobou.main.jp/070813.jpg http://o-dorobou.main.jp/070415.jpg http://o-dorobou.main.jp/tk6.jpg 垢抜けてない絵顔が平面的です office-φ 216 http://n216.com/nrszn リンク間違い↓で http://n216.com/hrszn/ http://n216.com/hrszn/img/nito_e1.jpg http://n216.com/hrszn/img/c_r.jpg http://n216.com/hrszn/img/exm_e1.png 頭が微妙にでかいのとどれもこれも同じような顔に見えるのを除けばそれなりに上手い気もします棘とか絵板とか絵茶とかHPとかmixiとかで色々問題起こしてるような人みたいですが絵とは関係ないからね おまんまんらんど( ゜д゜ ) 尊治 http://kuronisiki.web.fc2.com/ http://kuronisiki.web.fc2.com/atoti.jpg http://kuronisiki.sakura.ne.jp/top96.jpg http://kuronisiki.sakura.ne.jp/top58.jpg http://kuronisiki.sakura.ne.jp/top61.jpg http://kuronisiki.sakura.ne.jp/top77b.jpg エロの方に行くこと自体は特に何も思いませんけどキャラに合った頭身にしたほうが良いとは思うデフォルメ効いていないというべきかあとアレンジと言うか違う服にすると誰か分からないのはこの界隈の仕様か オムチキン 久林丼 http://www2.accsnet.ne.jp/~omelet75/index.htm http://omchicken.hp.infoseek.co.jp/cgi-bin/nicky/2007/mixi0816-1.jpg http://omchicken.hp.infoseek.co.jp/cgi-bin/nicky/2007/grp0803011539.thumb.jpg http://omchicken.hp.infoseek.co.jp/cgi-bin/nicky/2007/mixi0509.jpg http://www2.accsnet.ne.jp/~omelet75/gallery/th18.jpg それからやつきさん主催ミスティア合同誌にも漫画2pで参加しています。 顎が鋭角的になってきてるので丸みを覚えるようにすると良いんじゃないかなあいやどうでもいいけれどね 表参道まわりみち 静流 http://stormypetrel.sakura.ne.jp/ http://stormypetrel.sakura.ne.jp/itumikitoteka2.jpg http://stormypetrel.sakura.ne.jp/natuyasumikouhanno11.jpg 東方大学とか別に嫌いではないけれど余り行き過ぎるとアレだと思う長く続くと独自の方向へ行ってしまうのか当たり障りのないネタで続けるのが難しくなるものかな 普通に作っているお話など含め嫌いではないです Ortho-Para ねこいた http://orthopara.blog3.fc2.com/ http://blog3.fc2.com/o/orthopara/file/alfs11.jpg http://blog3.fc2.com/o/orthopara/file/siki.gif http://blog3.fc2.com/o/orthopara/file/20070717133611.jpg 雰囲気の出ている絵 暗めの色を良く使うのかな目が大きいせいかより目に見えるイラスト向き 漫画には余り向かない形でしょうかねえ ORANGE CIRCUS 如月ぽん   http://jihad.suppa.jp/picture/circle/07th03_0.jpg http://jihad.suppa.jp/picture/circle/07th03_2.jpg 他の方のページからですが 以前に合同誌などを作ってるようです 18禁イラストを手がけたようで 今回は個人でしょうかね HPは合同誌を作ったサークルさんからもリンクもなかったので多分無いようです オレンジペコ 七瀬祐 http://www.orange-pekoe.net/ http://www.orange-pekoe.net/gallery/data/upfile/102-1.jpg http://www.orange-pekoe.net/gallery/data/upfile/89-1.jpg http://www.orange-pekoe.net/gallery/data/upfile/87-1.jpg http://www.orange-pekoe.net/gallery/magicalmini.jpg http://www.orange-pekoe.net/gallery/magicalsample2.jpg まあ頑張ってください出来れば頑張らないで消えてください ON/OFF ポポ http://onoff.michikusa.jp/index.html http://onoff.michikusa.jp/top/top.jpg http://onoff.michikusa.jp/image/jc3.jpg http://onoff.michikusa.jp/image/hc7.jpg まあ頑張って というかボボという人は画像一枚も無いですね東方の絵も多分無いイベント参加数が多い三人サークルでしょうか 音速走行 はるきち http://blogs.dion.ne.jp/sonicrun/ http://www.k5.dion.ne.jp/~sonicrun/LOVELOG_IMG/.jpg 死ぬほど忙しい日々なのかと思うほど更新が無い本作ってるんだからそんなこともないのだろうけど無理にHPを残しておく事はないと思う がーねっとすたー ねき   見つからないな Calm of Moon River 月凪聖 http://licht-sichel.hp.infoseek.co.jp/index.html http://licht-sichel.hp.infoseek.co.jp/garally/sakuya013.png http://licht-sichel.hp.infoseek.co.jp/garally/sakuya012.png http://licht-sichel.hp.infoseek.co.jp/garally/kouma007.png 平面的なのっぺり顔凹凸のない顔が流行でしょうかそんなわけないな 海運 こうば http://ffkaiura.hp.infoseek.co.jp/ http://ffkaiura.hp.infoseek.co.jp/2007meziroositopb.jpg http://ffkaiura.hp.infoseek.co.jp/0716catadioptrica.jpg http://ffkaiura.hp.infoseek.co.jp/494500hit.ysbuisyareimu.jpg 色々なところで名前を見ます 主に人には言えないようなところで話は良い話は良いと言われてますが 自分は読む前に絵で駄目な方です正直あちこちで宣伝して盛り上げてるのかと邪推するほど 快眠予報 緋月 優 http://u-akatuki.moe-nifty.com/ http://tridymite.sakura.ne.jp/throwlife/img/c72/5.gif 改行が多くて読みづらいブログしかもフレームに日付ごとまとまっていたりもしないからさらに辛いギャラリーもなくて読みたくも無い日記を読まされるのは乳酸がたまりそうで画像とかもなくてそちらは判断しかねます 鏡の中の弾 慧音ゆき http://keineyuki.fc2.com リンクPermalink | トラックバック(2) | 15:21

- 転職ならen
- 派遣ならen
2ページ中1ページ目を表示(合計:31件)