はてなキーワード: STRとは
git →ぎっと
ifttt →?
str →すとりんぐ
char →ちゃー
eth0 →いーさぜろ
ifcfg →あいえふこふぃぐ
ifconfig →あいえふこんふぃぐ
ptr →?
txt →てきすと
bat →ばっち
ahk →?
py →び
rb →るびーは使わない
win7 →うぃんなな
win10 →うぃんじゅう
asus →あすす
which →ふぃっち
git → 「ギット」
ifttt → 使ったことがない
ieee → 「アイイーイーイー」
eth0 → 「イーサゼロ」
ptr → 「ポインタ」
bat → 「バッチ」
ahk → 使ったことがない
py → 「パイ」
rb → 「ルビー」
win10 → 「ウィンテン」
which → 「ウィッチ」
「publicてなに?staticってなに?voidってなに? mainはメインなんだろうけど []ってなに?argsってなに?なんでint main?str mainとかあかんの?たまに*印ついてるのなに?全部意味が分からんし解説もなしにおまじないって言って飛ばしてるケースも多いしなんか詳しく言ってるっぽいのもあるけどその分かる人だけが分かるような言い方やめて私のライフはもう0よ!なんで一言「やぁ!」っていうのにどれだけのことを理解せなあかんのよ!」
スクリプト言語だろうとその辺の物でてくるだろ。
C++とかだってpubclicだとstaticだの最初に出てこないし。最初からは[]もargsも必要ないし。voidもまあ要らんし。
つまりは色々細かいこと出来ないけどなんとなくインタラクティブに"「はろーわーるど」と出力"としたらはろーわーるど、って出したい、
ってだけだろ?
そしたらターミナル立ち上げてシェルでecho Hello World!とかやるのが一番手っ取り早いだろ。
それ以上やりたいなら中途半端なスクリプト言語やっても詰まった時にわからなくなるからC++とかやった方がよっぽどきちんと覚えやすい。
意見を聞かせて欲しい。
なるほど確かに教養としてPerlは知っておいた方が良いが、より優れた言語がある。
そして、推される筆頭はRubyだろうか。
そう思ってきた。
ブラウザで使うなら選択の余地はないので、あの言語は除外しよう。
で、未経験者でも聞いたことの有りそうなこのあたりはこの辺り。
C, C++, C#、 Java、Perl、PHP、Ruby、Python。
Hello, World!を見比べたら
「publicてなに?staticってなに?voidってなに? mainはメインなんだろうけど []ってなに?argsってなに?なんでint main?str mainとかあかんの?たまに*印ついてるのなに?全部意味が分からんし解説もなしにおまじないって言って飛ばしてるケースも多いしなんか詳しく言ってるっぽいのもあるけどその分かる人だけが分かるような言い方やめて私のライフはもう0よ!なんで一言「やぁ!」っていうのにどれだけのことを理解せなあかんのよ!」
となるのでスクリプト言語が残るだろう。
Webでしか使わない言語は関数名もキモイから除外しておくと、Perl、Ruby、Pythonの三択となる。
私がPerlを選んだ当時は、Rubyは信者が先鋭的で他人を攻撃しないと気が済まないという風評を目にしたので外した。
そしてPythonはまだ日本では弱いらしい一方、Perlははてなやmixi、Amazonでまで使われていて、
恰幅のいいヒゲのおっさん他、情報を発信する人の量・質ともに非常に高い様子だったから、Perlを選んだ。
ここから本題。
あれから数年。
新たなものを学ぼうと思い、Pythonは昔バージョンの違いでなかなか動かせず、またPython2と3で随分変わってしまうようなので、
Rubyを始めてみようと思ったんだ。
Next Perlというだけあって馴染みやすい書き方も多く、洗練されてるなってすごく関心した。
学ぶこと自体が目的なので、何をしたいって、何もないので、とりあえずPerlでやってることを全て移植してみることから始めた。
Net::FTPSSL
うごかない。
まぁそんなこともあるよね。
うごかない。
まぁPerlでもActive Directoryに繋ぐのは随分苦労したしな・・・
WWW::Mechanize:
うごかない。
CentOS 6に入ってるRubyではバージョンが違って動かないって・・・
上手くいかないのは仕方ないよ。でもmechanize、昔動いてたのに今動かないって何なの?
モジュールクリックしたら作者のサイトに飛ぶし、マニュアルの書き方も作者次第でバラバラ…読みづらい…
CPANみたいにちゃんとやってよ。
ネット上の情報もバージョンが違って動かないことも多々あるようだ。Perlなら5.8で書いたものが5.20になっても当たり前に動くよ?
CentOS 6とFedora 20のそれぞれで出てくるエラーも違うし、Perlの下地があっても正直キツイ。
洗練されていいな!って思った分余計に残念だ。
こんなバージョン違えば動かなくて当たり前で、Rail抜いたら情報も半減するような言語、本当に初心者向けでいいの?
使える人が使える用途で使えるバージョンを選んで使うとステキ。そんなん初心者向けじゃねぇぇぇっぇ。
いや、言語の学びやすさとこれとは別問題なんだろうけど、Perlの安定度と情報の量・質・多彩さで比較になってない。
言語そのものはRubyの方が上でも、使えない道具は劣る道具じゃんよ。
「身の回りの雑多な仕事を片付ける」って用途の方が特殊なんだろうか。
Rubyは良い言語だって思ってた。しかし、分からなくなってしまった。
教えてくれ。
キリシア様に届けていい言語はなんなんだ?
s/キリシア/キシリア/
でもたいした議論もないということは、概ね合ってるのだろうか。
あと、perldocの情報量もすごいと思う。ある程度Perlが使えるようになってからじゃないと読むのはキツイけど、
他言語で書籍じゃなしにあれだけ詳しく書かれたものってあるかな?
kiyo_hiko型が動的なのが耐えられなくて結局Java
プログラムはclassに記述します。たとえばSampleという名前のclassを作る場合、Sample.csファイル内に次のように書きます。(C#の場合、ファイル名とクラス名は同一でなくても良い。複数のクラスを書いても良い)
public class Sample { }
プログラムはclass内のMainメソッドの先頭から実行されます。Mainメソッドは次のように書きます。
public class Sample { public static void Main( String[] args ) { // 処理を書く } }
Console.WriteLine( "Hello world" );
コメントです。
// 一行コメント /* 複数行コメント */
// 変数 int num;
データ型です。C#のデータ型には値型と参照型とがあります。以下は値型のデータ型です。
// int(整数)型 int num; // char(文字)型 char c; // float(単精度浮動小数点)型 float val; // double(倍精度浮動小数点)型 double val; // bool(論理)型 bool flag; // DateTime(日付)型 DateTime date;
以下は参照型のデータ型です。
// String型 String s; // 配列型 String[] array;
プログラムをコンパイルするには、コマンドラインで以下のようにします。
csc Sample.cs
プログラムを実行するには、コマンドラインで以下のようにします。
Sample.exe
mono ./Sample.exe
int、float、double型の変数に数値を代入できます。int型には整数だけ代入できます。float、double型には整数でも小数でも代入できます。
int i = 2; int i = 100000000; float num = 1.234f; double num = 1.234;
四則演算です。
num = 1 + 1; num = 1 - 1; num = 1 * 2; num = 1 / 2;
商の求め方です。割る数と割られる数が両方とも整数の場合、計算結果の小数点以下が切り捨てられます。
num = 1 / 2; // 0
割る数と割られる数のどちらかが小数の場合、計算結果の小数点以下が切り捨てられません。
num = 1.0 / 2; // 0.5 num = 1 / 2.0; // 0.5 num = 1.0 / 2.0; // 0.5
余りの求め方です。
// 余り mod = 4 % 2
インクリメントとデクリメントです。
// インクリメント ++i; // デクリメント --i;
String str = "abc";
// 結合 String join = "aaa" + "bbb"; // 分割 String[] record = "aaa,bbb,ccc".Split( "," ); // 長さ int length = "abcdef".Length(); // 切り出し "abcd".Substring( 0, 2 ) // abc // 検索 int result = "abcd".IndexOf( "cd" ) // 見つかった場合はその位置、見つからなかった場合は-1が返る
配列です。
// 配列の宣言 int[] array;
配列の生成です。配列の生成時には要素数を指定するか、初期データを指定します。
int[] array; // 要素数を指定して配列を生成 array = new int[5]; // 初期データを指定して配列を生成 array = new int[] { 1, 2, 3 }; // 宣言と同時に配列を生成 int[] array2 = new int[5];
配列の要素の参照と代入です。
// 要素の参照 array[0] array[1] // 要素の代入 array[0] = 1; array[1] = 2;
array_num = array.Length;
int[] from = new int[] { 1, 2, 3 }; int[] to = new int[5]; from.CopyTo(to, 0);
if文です。
if ( 条件 ) { }
if ~ else文です。
if ( 条件 ) { } else { }
if ~ else if文です。
if ( 条件 ) { } else if ( 条件 ) { }
while文です。
int i = 0; while ( i < 5 ) { // 処理 ++i; }
for文です。
for ( int i = 0; i < 5; ++i ) { // 処理 }
int[] fields = new int[] { 1, 2, 3 }; foreach (int field in fields) { // 処理 }
C#では関数をメソッドと言います。メソッドを作るには次のようにします。戻り値を返却するにはreturn文を使います。
static int sum( int num1, int num2 ) { int total; total = num1 + num2; return total; }
ファイル入出力です。ファイル入出力を行うには、プログラムの先頭に以下を記述します。
using System.IO;
以下がファイル入力の雛形になります。ファイルのオープンや読み込みに失敗した場合、catch節に処理が移ります。
String filename = "text.txt"; StreamReader reader = null; try { reader = new StreamReader(filename); String line; while ((line = reader.ReadLine()) != null) { } } catch (IOException e) { // エラー処理: } finally { if (reader != null) { try { reader.Close(); } catch (IOException e) { } } }
またはC#ではusing ステートメントと言うものがあり、この様にも書ける
String filename = "text.txt"; using (StreamReader reader = new StreamReader(filename)) { try { String line; while ((line = reader.ReadLine()) != null) { // 読み込んだ行を処理 } } catch (IOException e) { // エラー処理: } }
usingをつかうとCloseがなくなったことからわかるようにusing(){}を抜けるときに自動的にDisposeメソッドを呼び出し、オブジェクトを廃棄する。その分コードがスッキリするが、使いにくい場面もあるので考えて使うこと。
以下がファイル出力の雛形になります。ファイルのオープンや書き込みに失敗した場合、catch節に処理が移ります。
String filename = "text.txt"; StreamWriter writer = null; try { writer = new StreamWriter(filename)); writer.WriteLine("abc"); writer.WriteLine("def"); writer.WriteLine("fgh"); } catch (IOException e) { // エラー処理: } finally { if (writer != null) { writer.Close(); } }
こちらもusingを使って書ける。が、割愛する。
C#でよく出てくる知っておいたほうがよい文法の一覧です。
繰り返し文の途中で抜けるにはbreak文を使用します。
for ( i = 0; i < 5; ++i ) { if ( 条件 ) { break; // 条件を満たす場合、for文を抜ける。 } }
残りの部分処理をスキップし、次の繰り返しに進むにはcontinue文を使用します。
for ( i = 0; i < 5; ++i ) { if ( 条件 ) { continue; // 条件を満たす場合、残りの部分処理をスキップし、次の繰り返しに進む。 } }
例外を投げるにはthrow文を使用します。
throw new Exception( "Error messsage" );
try { // 例外が発生する可能性のある処理 } catch ( Exception e ) { // 例外発生時の処理 }
スマートポインタは、ここで言われている アドレスの参照指定としてのポインタじゃないよ。単なるコンテナ。名前にポインタってついてるからといって、いわゆるポインタじゃない。分類的にはコンテナ。
std::tr1::smart_ptr<std::vector<char> > hako(new std::vector<char>);
の3種類があった時に string型も ポインタを代入しているが、 ポインタとは呼ばないだろ。コンテナと呼ぶ。
記法上 new を呼び出すが、 それが嫌なら、そういうコンストラクタ書いてもいいしな。
str++ とか str-- str+n という記法=アドレス参照 ができるが
スマートポインタは そういう使い方はしない。 あくまでも指定されたオブジェクトを管理するだけ。
たいていの使い方をする場合に、参照カウンタの増減なんて手動ではしないから。(というか、ポインタがわからない奴がするな コピコン使え という設計方針でいいとおもう)
Pythonの方が弄れる対象が多いのに、なんでウェブ系だとPHPの方が流行ってんだろ
端末からのテキスト処理も楽だし、数値計算周りのライブラリも充実しているのに
PHPが優遇されているのって歴史的な経緯以外に何か他の理由でもあるのか?
けどまぁ、情弱な文系SEが大半を占めているバカだらけの日本じゃ別にPHPで困ることもないか
数値計算や端末からのテキスト処理なんてWeb系じゃ大して使わないからなあ…
Pythonに関しては、ZopeさえコケていなければWebサーバ用LLとして大成功していたはずなのに、
Railsなんかが登場したおかげで、すっかり影が薄くなってしまいますた....
ってか、railsにインスパイアされたフレームワークって今じゃ幾らでもあるよね
djangoとかCakePHPとか。rubyってRoRを使いたいユーザを除くと、
pythonやPHPの方がユーザー数は圧倒的に多いと思うんだけど
本家のrailsって、他を遥かに越えるほど良いものなんだっけ?
44
Zopeが登場した当時、「RDB+PHPはもう古い、これからはOODB+ZopeがWebの中軸になる!」と
少なくとも自分はZopeからPythonという言語を知ったし、その時点でRubyは知らなかった
そして、その後のORM(RDB)+Railsの出現と華々しい革新性への注目は、誰もが知っているだろう
今でもZopeの開発は継続されてはいるが、結果的に当初の期待が大きく裏切られたという事実は動かしがたい
djangoとCakePHPについては実際に触っていないので憶測になるが、おそらく技術水準ではRailsと同等だろう
しかしRailsはRailsでコミュニティの活動が活発だし、その進化は異常に早い
Railsに何か致命的なトラブルが発生して開発が停滞する、あるいはdjangoやCakePHPから
何かのイノベーションが提示されでもされない限り、後発のdjangoやCakePHPがRailsに追いつくのは無理
Railsは決して技術的に完璧なWebフレームワークではないんだけどね....(たとえばSeaSideのような.... )
だからこそ「もしもZopeが....だったなら」という「たら・れば」感はPythonコミュニティの潜在認識になっている
C a k e P H P は う ん こ
CakePHP使ってんの?
可哀そうにw
でもやっぱりいつもの使い慣れたLL(Python/Ruby)で
Webサービスを書きたいってのがある
求人数は
Ruby on Rails>>>>>>>>Django
http://www.indeed.com/jobtrends?q=django%2Cruby+on+rails&l=
どういうことなの?
求人数が多いのはそのためだと思うよ
なんかのミスかと思ったがアメリカでもRuby on Railsは人気があるのかなあ・・・
Pythonのほうが使いやすいと思うのだがフレームワークはRailsが優位なんだろうか
Djangoは周辺ライブラリが微妙だし本体も鈍くさい感じがする。
でも、FlaskはSinatraより好きだから、Pythonが嫌いってわけではない。むしろ好き。
ただ、いざ作り始めるとやっぱりRailsが楽だなあってなって、Railsを使い続けている。
同感だ
同じように思っている人が他にもいて安心した
PHPはフレームワークが乱立しすぎているから、RailsをPHPで実装してみようというやつが出てきた。
それに比べてPythonは、Zopeというデファクトスタンダードが既に存在していたけど、
ただ、どうやってもRailsもどきがRailsを超えることはできないのは間違いない。
パクリはオリジナルを超えられない(キリッ って定型句だけど、
これってキリッって言いたいだけだと思う。
D言語って超えたって?
B言語って超えたって?
PHPで同じ事をできないわけではないだろうけど、Ruby on Railsほど簡潔にはできない
まあくだらねえWEBサービス作って喜んでる情弱は早く死ねって事だよ
そういう理由じゃなくてRailsのほうが単純に情報もプラグインも多いからでしょ
linuxじゃデフォのツールなんだし、ツールとの連携を考えたらpython一択じゃん
わざわざ不合理で不完全な言語を使うなんて
もしも
>linuxじゃデフォのツールなんだし、ツールとの連携を考えたらpython一択じゃん
真実であるのなら、今頃はdjangoの情報とプラグインが溢れかえっているはず
yumや、gdbとgnomeの拡張がpythonであるからといって、それをwebアプリでも使いたいと思う人は少ないというだけのこと。
ソースからインストールする必要があったとしても、web開発ではrubyを使いたいという人が多いというだけのこと。
というか、世界中のPythonプログラマが Remeber Zope!! を合い言葉に
打倒RailsたるWebフレームワークを開発しているはずだけど、
Railsも登場してから、かなりの年月が経過しているんだけどなぁ....
その間にもRailsはRails 3が登場して、REST/AJAXの強化等の進化が継続しているよ
Ruby では
ary.map {|x| x**2}
map(lambda x: x**2, ary)
となり、lambda の本体が1つの式では表現しきれなくなると
.....
と書き換える必要があります。
f = lambda x:(x and f(x-1)*x)or 1
RubyにはPythonのように「lambda本体は式でなければならない」という限定がありませんから、
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です。
348
これはPythonをdisっているように見せかけてRubyをdisっているのか? と一瞬思ってしまったw
だってRubyのほうが長くない?CLのfuncallみたいなcall()がちょっとうざいし…
そしてどっちもlambda式の中で束縛変数の名前で再帰可能、と
print [x*2+100 for x in [1,2,3,4,5] if x > 2 and x < 5]
暗号のように見える。
puts [1,2,3,4,5].select{|i| i > 2 and i < 5}.map{|i| i*2+100}
思考の流れと、コードの流れが一致しているので書きやすい。
map(lambda x: x*2+100, filter(lambda x: x > 2 and x < 5, [1,2,3,4,5]))
pythonて可読性が高いのをうたってる割にはそこいまいちだよね
Rubyの場合には、左から右へと無名関数がデータフローあるいは
関数型プログラミングに不慣れな初心者でも、参照透明性のあるコードが自然に書ける
プログラマにとって優しい or プログラミングの楽しさを教えてくれるのがRuby
それと比較すると、Pythonのコードは、関数型プログラミングというものが
いかに高度で難解なものであるかという事をもったいぶってプログラマに押し付ける
もしもPythonしか知らないプログラマであれば、関数型 = 難解 という印象を持つだろう
階乗計算くらいだと単純すぎて、ナゼ重要なのかが分かりづらいと思うのでコードで示す
result_list = source_list.map { |elem|
x = foo(elem.x) # ここが局所宣言を書く部分
x + y # 最後に評価された式の値が、無名関数のリターン値になる
}
Rubyでは、map等に与える無名関数の中で局所的な環境(クロージャ)が作られるから、
x = foo(...) のような代入文がいくつでも(= 複雑な処理でも)書ける
このポイントは、実用的なプログラムを関数型風で書こうとした時に、威力を発揮する
余計分かりづらくなった
高卒ドカタなんだろうなぁと可哀想になる
集合の表記に似せてることが分かるから
355
>map/filterはfor/ifと同じだと言っているだけだから、難解という印象は持たない。
関数型プログラミングに慣れた、あるいは得意な人であれば、そういった印象なんだろね
Rubyの魅力はこれから関数型プログラミングを学ぼうとする初心者、 あるいはそんな初心者へ教える立場から見た、優しさ or 分かりやすさなんだ
[1,4,3,2].sort.reverse.map{|x| x.to_s}.join('-')
Pythonだと読みにくい。
'-'.join(map(str, reversed(sorted([1,4,3,2]))))
Pythonでは思考の流れと一致しないばかりか、「カッコだらけ」のコードになると.....
カッコだらけのコードを分かりやすくする基本的な方法は静的単一代入じゃないか
Rubyのやり方は基本ではなく玄人のやり方だろ
Pythonでは組み込みの型でメソッドチェインはやって欲しくないな
似たようなコレクションtuple,deque,array,queue等にも同じメソッドが必要になってくるし。
372
外部のライブラリでも列挙可能なものは、たいていEnumerableモジュールをimportしてますね
Rubyユーザーは列挙可能なものはmapやselectできて当然だろって思ってる気がします
Pythonは「何かを便利に書くためのしわ寄せ」をはっきり寄せてくる
得意と不得意を言語レベルではっきり主張するのでメリケン好みと言えなくもない
Rubyは全方位になんとなく八方美人なので、全体的になんとなく書きやすくてなんとなくキモくて遅い
「書きにくいってことはその処理に向いてないってことだから諦めろ」を地で行く
無名関数が文を使うほど複雑なら名前を付けるのが Python 流と想像。
これを読みづらいと感じるのは、左から右に流れる
もしかしてアラビア語ネイティブな人からすると逆に読みやすいのか?
Rコンソールに一行ずつコマンドを入力してもいいけど、実際に使うにはテキストファイルにコマンドを書いて(ソースコード)一気に実行させる方が楽。
source('hogehoge.R')
hogehoge.Rというのがソースコードを書いたファイル(ソースファイル)の名前。
CRANという、CPANのパクリがある。膨大な数のライブラリがあるので、好きなものをインストールするには、
install.packages('hoge',dependencies=TRUE)
とするのが楽。
> あ<-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。
要望があれば続くかも。
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 ); }
↓
<style type="text/css">dt{float:left;clear:left;width:10em;}</style>
<meta content="charset=Shift_JIS"/>
<script type="text/javascript"></p> <p>window.onload = init;</p> <p>var url = [</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/h19sangiin/san_kekka/h19san_hkai.html">http://www.senkyo.metro.tokyo.jp/h19sangiin/san_kekka/h19san_hkai.html</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/h17shugiin/sokuhou/7kaijyo_s.htm">http://www.senkyo.metro.tokyo.jp/h17shugiin/sokuhou/7kaijyo_s.htm</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/h17togisen/sokuhou/2kaijyo_s.htm">http://www.senkyo.metro.tokyo.jp/h17togisen/sokuhou/2kaijyo_s.htm</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/data/h16san_hkai.html">http://www.senkyo.metro.tokyo.jp/data/h16san_hkai.html</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/data/h15shu_hkai.html">http://www.senkyo.metro.tokyo.jp/data/h15shu_hkai.html</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_01_03.html">http://www.senkyo.metro.tokyo.jp/data/data01_01_03.html</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_02_05.html">http://www.senkyo.metro.tokyo.jp/data/data01_02_05.html</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/data/data03_04.html">http://www.senkyo.metro.tokyo.jp/data/data03_04.html</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_05_05.html">http://www.senkyo.metro.tokyo.jp/data/data01_05_05.html</a>"</p> <p>];</p> <p>var base = "<a href="http://www.senkyo.metro.tokyo.jp/data/tokuhyo_23ku/">http://www.senkyo.metro.tokyo.jp/data/tokuhyo_23ku/</a>";</p> <p>var file = ["chiyoda","chuou","minato","shinjyuku","bunkyo",</p> <p> "taitho","sumida","koutho","sinagawa","meguro",</p> <p> "ohta","setagaya","shibuya","nakaono","suginami",</p> <p> "toshima","kita","arakawa","itabashi","nerima",</p> <p> "adachi","katushika","edogawa"];</p> <p>for(var i=0; i<23; i++){</p> <p> url.push(base + file[i] + "\.html");</p> <p>}</p> <p>var id = [</p> <p> "2007 参院比", "2005 衆院比", "2005 都議会", "2004 参院比", "2003 衆院比",</p> <p> "2001 参院比", "2001 都議会", "2000 衆院比", "1998 参院比", "1997 都議会"</p> <p>];</p> <p>var ku = [</p> <p> "千代田","中央","港","新宿","文京",</p> <p> "台東","墨田","江東","品川","目黒",</p> <p> "大田","世田谷","渋谷","中野","杉並",</p> <p> "豊島","北","荒川","板橋","練馬",</p> <p> "足立","葛飾","江戸川"</p> <p>];</p> <p>var regexku = new RegExp("(" + ku.join("|") + ")区");</p> <p>var iframe = [];</p> <p>var data = {};</p> <p>var parse = [ function(){</p> <p> var d = iframe[0].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if(regexku.test(td[i].firstChild.nodeValue)){</p> <p> for(var j=0, e=td[i]; j<10; j++){</p> <p> e = e.nextSibling;</p> <p> }</p> <p> data[RegExp.$1 + "0"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[1].contentWindow.document;</p> <p> var nobr = d.getElementsByTagName("nobr");</p> <p> for(var i=0, l=nobr.length; i<l; i++){</p> <p> if(regexku.test(nobr[i].firstChild.nodeValue)){</p> <p> for(var j=0, e=nobr[i].parentNode; j<4; j++){</p> <p> e = e.nextSibling;</p> <p> }</p> <p> data[RegExp.$1 + "1"] = e.firstChild.nodeValue;</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[2].contentWindow.document;</p> <p> var nobr = d.getElementsByTagName("nobr");</p> <p> for(var i=0, l=nobr.length; i<l; i++){</p> <p> if(regexku.test(nobr[i].firstChild.nodeValue) && nobr[i].parentNode.tagName == "SPAN"){</p> <p> for(var j=0, e=nobr[i]; j<6; j++){</p> <p> e = e.parentNode;</p> <p> }</p> <p> var e2 = e.nextSibling.nextSibling.firstChild.childNodes[2].firstChild;</p> <p> var k = 0;</p> <p> data[RegExp.$1 + "2"] = 0;</p> <p> while(e2){</p> <p> if(e2.firstChild.firstChild.nodeValue.indexOf("公明党") != -1){</p> <p> data[RegExp.$1 + "2"] += parseInt(e2.parentNode.nextSibling.childNodes[k+2].firstChild.nodeValue.replace(",",""), 10);</p> <p> }</p> <p> e2 = e2.nextSibling;</p> <p> k++;</p> <p> }</p> <p> data[RegExp.$1 + "2"] = int2str(data[RegExp.$1 + "2"]);</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[3].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if(regexku.test(td[i].firstChild.nodeValue)){</p> <p> for(var j=0, e=td[i]; j<19; j++){</p> <p> e = e.nextSibling;</p> <p> }</p> <p> data[RegExp.$1 + "3"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[4].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> var regexku2 = /(大田|世田谷|練馬|足立|江戸川)/;</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if(regexku.test(td[i].firstChild.nodeValue)){</p> <p> data[RegExp.$1 + "4"] = td[i].nextSibling.nextSibling.firstChild.nodeValue.replace(/\.\d+/,"");</p> <p> continue;</p> <p> }</p> <p> if(regexku2.test(td[i].firstChild.nodeValue)){</p> <p> data[RegExp.$1 + "4"] = (data[RegExp.$1 + "4"] || 0) </p> <p> + parseInt(td[i].nextSibling.nextSibling.firstChild.nodeValue.replace(",","").replace(/\.\d+/,""));</p> <p> }</p> <p> }</p> <p> for(var j=0; j<5; j++){</p> <p> data[ku[[10,11,19,20,22][j]]+"4"] = int2str(data[ku[[10,11,19,20,22][j]]+"4"]);</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[5].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p> <p> for(var j=0, e=td[i]; j<10; j++){</p> <p> e = e.nextSibling;</p> <p> }</p> <p> data[RegExp.$1 + "5"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[6].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p> <p> for(var j=0, e=td[i]; j<7; j++){</p> <p> e = e.nextSibling;</p> <p> }</p> <p> data[RegExp.$1 + "6"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"").replace("-","0");</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[7].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p> <p> for(var j=0, e=td[i]; j<9; j++){</p> <p> e = e.nextSibling;</p> <p> }</p> <p> data[RegExp.$1 + "7"] = e.firstChild.firstChild.nodeValue;</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[8].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p> <p> data[RegExp.$1 + "8"] = int2str(td[i].nextSibling.firstChild.firstChild.firstChild.nodeValue);</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(n){ return function(){</p> <p> var d = iframe[n+9].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> data[ku[n]+"9"] = 0;</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if((((td[i].firstChild || 0).firstChild || 0).nodeValue || "").indexOf("公明") == 0){</p> <p> data[ku[n]+"9"] += parseInt(td[i].parentNode.lastChild.firstChild.firstChild.nodeValue.replace(",",""));</p> <p> }</p> <p> }</p> <p> data[ku[n]+"9"] = int2str(data[ku[n]+"9"]);</p> <p> show();</p> <p>}}];</p> <p>function init(){</p> <p> for(var i=0; i<23; i++){</p> <p> var dl = document.createElement("dl");</p> <p> dl.appendChild(document.createTextNode("\n【" + ku[i] + "区における公明票】\n"));</p> <p> for(var j=0; j<10; j++){</p> <p> var dt = document.createElement("dt");</p> <p> var dd = document.createElement("dd");</p> <p> dt.innerText = id[j];</p> <p> dl.appendChild(dt);</p> <p> dl.appendChild(dd);</p> <p> }</p> <p> document.body.firstChild.appendChild(dl);</p> <p> }</p> <p> for(var i=0; i<32; i++){</p> <p> var e = document.createElement("iframe");</p> <p> iframe[i] = e;</p> <p> e.style.display = "none";</p> <p> if(i<9) var f = parse[i];</p> <p> else var f = parse[9](i-9);</p> <p> e.attachEvent("onload", f);</p> <p> e.src = url[i];</p> <p> document.body.appendChild(e);</p> <p> }</p> <p>}</p> <p>function show(){</p> <p> for(var i=0; i<23; i++){</p> <p> var dl = document.body.firstChild.childNodes[i];</p> <p> for(var j=0; j<10; j++){</p> <p> var dt = dl.childNodes[j*2+1];</p> <p> dt.innerText = id[j] + " " + (data[ku[i]+j] || "");</p> <p> dt.nextSibling.innerText = bar(data[ku[i]+j], j);</p> <p> }</p> <p> }</p> <p>}</p> <p>function int2str(num){</p> <p> return new String(num).split("").reverse().join("").replace(/(\d{3})/g,"$1,").split("").reverse().join("");</p> <p>}</p> <p>function bar(str, flag){</p> <p> str = str || "";</p> <p> if(str == "" || str.length < 5) return "";</p> <p> var num = parseInt(str.match(/\d+/)) + 1;</p> <p> var arrow = (flag == 2 || flag == 6 || flag == 9) ? " ←" : "";</p> <p> var _bar = new Array(num).join("|") + arrow;</p> <p> return _bar;</p> <p>}</p> <p></script>
よりそいプログラミングによりそってみる。
>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 = ',';
再利用性を高めようとする意識はいい。けど、後で関数単体で再利用できるように書けって。
> うるさい!だまってて!
すいません・・・
タイトル | アーティスト | 再生回数 |
---|---|---|
ブラックアウト | 東京事変 | 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を動かせる環境がそろってる人なら、すぐに出来ると思う。
さあ、みんなも再生回数晒してみようぜ。
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; }
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; }
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
さっきのはあまりに汚かったのでちゃんと書いたよ!!
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; }
どうでしょうか?>元増田
最近、巷で噂の『 第3回日本ケータイ小説大賞:あたし彼女 』を読んでみた。
ケータイ小説といってもパソコンでも読むことは可能。(しかし絵文字は表示できない)
数ページ読み進めた所で思った。
本文を読む→次ページに進む→本文を読む→次ページに進む
これが結構なストレスになる。
1ページが短いので数秒で読み終わる。その度に改ページするのがめんどくさい。
とりあえず、50ページまで一気に取得する系。みたいな。
<html><body> <?php //表示するページ数を指定 for($i=300;$i<360;$i++){ $url = "http://nkst.jp/vote2/novel.php?auther=20080001&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ってあんまり触らないんだよね。
だからもっとうまいやり方があるんだろーなぁ。
補足大歓迎です。
みたいな。