はてなキーワード: Stringとは
わたしの勘違いだったら申し訳ないけど、C#で次のようにコードを書いたら、ぬるぽ例外が発生しましたよ。
public class DoSample : System.Management.Automation.PSCmdlet
{
...
public DoSample() {
...
if ((this.MyInvocation == null) || (string.IsNullOrEmpty(this.MyInvocation.ScriptName))) {
return;
}
...
}
}
Option Explicit Private Const INTERNET_OPEN_TYPE_PRECONFIG = 0 Private Const INTERNET_OPEN_TYPE_DIRECT = 1 Private Const INTERNET_OPEN_TYPE_PROXY = 3 Private Const INTERNET_SERVICE_HTTP = 3 Private Const INTERNET_DEFAULT_HTTP_PORT = 80 Private Const INTERNET_FLAG_RELOAD = &amp;H80000000 Private Declare Function InternetOpenA Lib "wininet.dll" (ByVal sCallerName As String, ByVal dwAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal dwFlags As Long) As Long Private Declare Function InternetConnectA Lib "wininet.dll" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nProxyPort As Integer, ByVal sUserName As String, ByVal sPassword As String, ByVal dwService As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByRef sBuffer As Byte, ByVal lNumberBytesToRead As Long, ByRef lNumberOfBytesRead As Long) As Long Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInternetHandle As Long) As Long Private Declare Function HttpOpenRequestA Lib "wininet.dll" (ByVal hConnect As Long, ByVal sVerb As String, ByVal sObjectName As String, ByVal sVersion As String, ByVal sReferer As String, ByVal sAcceptTypes As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long Private Declare Function HttpSendRequestA Lib "wininet.dll" (ByVal hRequest As Long, ByVal sHeaders As String, ByVal dwHeadersLength As Long, ByVal lpOptional As String, ByVal dwOptionalLength As Long) As Long Private Function submitPost(ByRef host, ByRef url_path, ByRef sendString) As Variant Dim dataArray() As Byte, dataPosition, dataSize 'WinInet初期化 Dim hInternet hInternet = InternetOpenA(vbNullString, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0) If hInternet = 0 Then submitPost = dataArray Exit Function End If 'サーバ接続 Dim hConnect hConnect = InternetConnectA(hInternet, host, INTERNET_DEFAULT_HTTP_PORT, vbNullString, vbNullString, INTERNET_SERVICE_HTTP, 0, 0) If hConnect = 0 Then InternetCloseHandle hInternet submitPost = dataArray Exit Function End If 'リクエストを初期化 Dim tmpURL As String * 255 tmpURL = url_path Dim hRequest hRequest = HttpOpenRequestA(hConnect, "POST", tmpURL, "HTTP/1.1", vbNullString, 0, INTERNET_FLAG_RELOAD, 0) If hRequest = 0 Then InternetCloseHandle hConnect InternetCloseHandle hInternet submitPost = dataArray Exit Function End If 'リクエストを送信 Const strHeader = "Content-Type: application/x-www-form-urlencoded" HttpSendRequestA hRequest, strHeader, Len(strHeader), sendString, Len(sendString) 'データ取得 Dim readResult, tmpArray(1023) As Byte, tmpPosition, tmpSize dataPosition = 0 dataSize = 0 Do tmpSize = 0 Erase tmpArray readResult = InternetReadFile(hRequest, tmpArray(0), 1024, tmpSize) If Not readResult = 1 Or tmpSize = 0 Then Exit Do End If dataSize = dataSize + tmpSize ReDim Preserve dataArray(dataSize - 1) For tmpPosition = 0 To tmpSize - 1 Step 1 dataArray(dataPosition) = tmpArray(tmpPosition) dataPosition = dataPosition + 1 Next Loop 'クローズ処理 InternetCloseHandle hRequest InternetCloseHandle hConnect InternetCloseHandle hInternet submitPost = dataArray End Function Public Function downloadFilePost(ByRef targetURL, ByVal sendArray, ByRef savePath) As Boolean 'URLの分解 Dim startE, endE, host, url_path startE = InStr(1, targetURL, "//") + 2 endE = InStr(startE, targetURL, "/") endE = IIf(startE > endE, Len(targetURL) + 1, endE) host = Mid(targetURL, startE, endE - startE) url_path = Mid(targetURL, endE) 'ポストデータのエンコード Dim jscript With CreateObject("ScriptControl") .Language = "JScript" Set jscript = .CodeObject End With Dim ix, sendBuffer For ix = 0 To UBound(sendArray) Step 1 sendBuffer = Split(sendArray(ix), "=") sendArray(ix) = sendBuffer(0) &amp; "=" &amp; jscript.encodeURIComponent(sendBuffer(1)) Next Set jscript = Nothing Dim data data = submitPost(host, url_path, Join(sendArray, "&amp;")) If LenB(data) <= 0 Then downloadFilePost = False Exit Function End If 'バイナリで書き込み With CreateObject("ADODB.Stream") .Type = 1 .Open .Write data .SaveToFile savePath, 2 .Close End With downloadFilePost = True End Function
Androidアプリ作ろうとしてJavaプログラマ募集したらクズしかこなかった全部クズだったとか、ひどくありません?
まあそれは置いといて、UIみたいに最初から仕様を決められなくて何度も作り直すようなコードはJavaは不向きみたいな話もまったく同意できないわ。
string url = "http://www…";
のように、URLを文字列で持っていたけど、やっぱアドレス用のクラスでもったほうが安心だなって思って
URI url = new URI("http://www…");
と書き直しました。
当然、このurlを参照しているところは全部エラーになります。
Javaをはじめとする静的型の言語をけなしてる人たちは、これが面倒だと思うんでしょうか。
逆にエラーの出ている箇所を片っ端から直してエラーが無くなれば、修正漏れなしの証拠だからめちゃくちゃ安心できます。
JavascriptやらRubyでこういうことをしたら、人間が目を皿のようにして全部チェックしないといけないわけでしょ。
どう考えても変更の多いコードこそ動的型の言語は不向きだと思われますが。
こういう話をすると、エディタの検索でどうこうって反論がくると思いますけど、あれは言語を理解しないでテキストでマッチしてるだけでしょ。
たとえば func($url); と他のサブルーチンに渡して、
function func($address) {} みたいに受け取って、そこから先は文字列として扱ってるコードがあっても探しきれませんよね。
静的型の言語なら、void func(string address) {} を void func(URI address) {}と修正したら修正漏れの箇所があってもエラーが伝播して言って、すぐ分かります。
OracleとGoogleの裁判がらみで「Java終了よかったよかった」みたいな話の流れで、AndroidアプリはJavascriptで作ればいいって盛り上がってたけど、そうなったらIDEのサポートが大幅になくなる原始的な環境に逆戻りでしょ。
勘弁して欲しい。
ほんとうに動的型の言語はめんどくさい。
フォロー、フォロワー数はTwitter社が手動入力している - Togetter
これを見て、いろいろと考えさせられた。
普段我々プログラマはHTMLやそれに類するものを書くときに、
ソースコードをユーザに見られてもいいように、クラス名やIDをちゃんとしたり不要なコメントを残さないようにしたりしているが(もちろんコーディングルール等もあるが)、ユーザがそれを見たときにどう思うかについては配慮が足りないのではないかと思った。
たとえば、
<span>1234</span>
というHTMLを見たら、手入力していると思われても無理からぬことだ。
巷ではUIだ、UXだと言われているが、次世代のUI/UXはここまで踏み込むべきではなかろうか。
つまりHTMLやJavascriptのソースを見たユーザのことを考えるべきではないかと。
先程の例でいえば、
<span id="hoge"> <script type="text/javascript"> $("#hoge").text("1234"); </script> </span>
ちなみに、こんなとこにscriptタグ書いてるのは位置が対応している方が分かりやすいというユーザへの配慮である。
ただし、これでもちょっと勘の良い人なら、"1234"ってテキストをただ出してるだけじゃないの?と思ってしまうだろう。
それならば、もうちょっと飾り付けすればいい。
<span id="hoge"> <script type="text/javascript"> var foo = String.fromCharCode(49) + String.fromCharCode(50) + String.fromCharCode(51) + String.fromCharCode(52); $("#hoge").text(foo); </script> </span>
これだとどうだろう?ぐっと、それっぽさが増したのではないだろうか?
そしてこれが一番大事なことだけど、最初の例に比べて温もりが感じられるようになった。
私は普段Rails(erb)を使っているのだが、
<span><%= "1234" %></span>
Pixearch(ピクサーチ)
node.jsとMongoDBの勉強がてらpixivの画像のタグ検索のサービスを作りました。
はてブのタグ検索のようにpixivに投稿された最近の画像をpixiv内でのブックマーク数でフィルタをかけて検索できるのが特徴です。
検索したり、タグをたどって、ダラダラと良い絵を眺めるのを目的としています。
普段はブログを書いたりしてないので、今回学んだことのメモがてらの投稿です。
MongoDBを試そうと思ったのがサービスを作り始めた発端です。
Web部分はmongoDBと相性が良さそうなnode.jsを採用。
MVCのフレームワークで何か適当なものはないかとググってSails.jsが良さそうだったので今回採用しました。
今回はせっかくnode.jsを採用したので、噂のnode.jsのPaaSのnodejitsuを試しに使っています。
500MB分の容量のMongoDBを最初から使えるのも大きかったです。
とりあえず最小のプランにしてるのでどのくらい捌けるのか気になるところ。
Web開発用のモジュールを自分で用意するのがめんどいなー、という人向けな印象。
このくらいの規模のものだったらサクッと作れました。
ただある程度の規模のちゃんとしたサービスを作るのには色々足りてないので、自分でカスタマイズしたりできる人じゃないと使うのは辛そうです。
後、ドキュメントも公式のものだけだと説明されてない機能が結構あったりします。
デフォルトだとDBはMySQLに対応していて、MongoDBを使うにはsails-mongoを入れる必要がありました。
開発中に困ったことは、nodejitsuで動かそうとしてsails-mongoでエラーが出て、調べてみたらauthenticationに対応していないというバグがあったことでした。
手元で直したのでpull requestを送ろうかと思ったら既に他の人が送っていて、3日前ぐらいに取り込まれているので今は大丈夫なはず。
https://github.com/balderdashy/sails-mongo/pull/36
現在進行形で色々Issueが上がって修正がされているのでそのうちこなれてくるのに期待。
細かいところで設計や考慮がちゃんとされてるなーと感じたところも多かったので、node.jsで開発してる人は一回試してみると勉強になりそうです。
最初にコレクションの操作に戸惑ったのですが、結局JSの連想配列なので思ったより早く馴染みました。
$setとか$gteとか特殊な意味を持つキーがいくつかあるので、その辺を把握できてから色々と捗りました。
MySQLに比べて特に更新系で複雑なクエリが発行できるので、ORMで使うと十全に機能を発揮できないのではないかな、と思ったり。
ご存知スキーマレスなので、何も考えずにデータを突っ込んでるとIntegerで保存したい値がStringになっててソートのときに困ったりするので要注意。
指定した容量を超えたら自動で消してくれるCapped Collectionがあると知ったので、今回みたいな容量が限られてる場合に便利かなと試してみたのですが、このオプションを有効にしたコレクションだとデータのアップデートや削除ができなくなりました。
おそらく、追加しかしないログのようなデータの保存に使うもののようです。
まだ微妙な部分も多かったですが、デプロイとかコマンド一発でできて、設定管理がpackage.jsonでできたりして面白かったです。
今回は、特に問題が起きたときに環境にsshで入ったりできないので、表示されてるログだけで問題を調査するのに苦労しました。
MongoLabとMongoHQというMongoDBの外部ホスティングサービスが上述したように使えるのですが、無料の容量を超えて使うにはそこそこお金が掛かるのでモリモリ容量を使うものを考えている場合は注意がいります。(もちろん値段に見合ったプロダクトを提供してくれると思いますが)
ということで、せっかく作ったので是非試してみてください。
32歳、営業職です。
プログラムとかなんもわからんちんなのですが、アプリを作りたいと思いたちアプリを
作ってみました。
とりあえず、アプリのランキングを見ていると、エロ系がやっぱり強いと思って、エロは正義!の名の下に
簡単にアプリを作るために、まずは簡単に作れるフレームワークを探す所から始まります。
フレームワークってなんですか?
それはね、なんだかわからないけど、簡単につくれるようになるものなんですよ。
詳しくは、
外人「システムを作るときに、よく利用する機能とか、構造とか、予めあると便利だろ?
俺が作っといてやったよHAHAHAHAHA」
っていう感じのものだそうです。
プログラミングなんてわからんちんだけど、HTMLくらいは作れるよ!
そんなあなたにPhoneGap(http://phonegap.com/)ということで、
とりあえずPhoneGapを使って見ることに。
でも、実際使ってサンプルを作ったりしてみると、動くは動くんだけど、
色々やろうとすると、Web上にあるドキュメントが古いのか、PhoneGapが最近になって
突如バージョンがあがったせいか、書いてる通りにやってみてもできない。
とりあえずiPhone Developer登録は既に完了していたので、Xcodeをつかってやるぜ!
俺は赤の扉を選ぶぜ!と思ったがはてさてどうすりゃいいのか。
HTMLをプロジェクトに追加するのはドラッグ&ドロップすれば完了だ。
その際にダイアログが出てくるので、"Create folder references for any added folders" を選択しておくと
元々のフォルダ構造とかが失われずそのまま追加できるのでいいぞ。
ほんでもって、UIViewControllerというのを作成する。
IBOutlet で UIWebView を利用するためのオブジェクト変数を用意しておいて、InterfaceBuilderから接続をする。
Files's Owner とかを右クリックして出てきた変数名と画面上についかしたUIWebViewをマウスでつなぎあわせれば
接続できるぞ。なんて簡単なんだ。
一番最初に行われる初期化の処理は viewDidLoad にでも書いておけばいいらしいのでここに書く。
UIWebViewはURLの書式になっていないと開けないようなので、それを調べることから始まる。
アプリ内に追加したリソースファイルは、アプリのデータに内皮されるらしい。
アプリが展開されるフォルダというのは、デバイスにより様々なのだが、そこから内皮されている
ファイルを取得するための処理というのがあるのでそれを利用する。
NSString *html_path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory@"web"];
これでwebフォルダ内にあるindex.htmlファイルの絶対パスを教えてくれるというわけだ。
あとはこれを読みこませればOK。
[web loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:html_path]]];
NSURL というのがURL書式を記述するためのオブジェクトだと思っていただきたい。
ここではローカルファイルのパスを拾うため、 fileURLWithPath とするのがポイントだ。
file://nantarakantara/index.html みたいな書式になるんでしょうね。
なんだか色々理由はあるみたいなんですが、そうですかだめですか。
善は急げで、AndroidSDKとEclipseというものをダウンロード。
昔は色々設定が必要だったが、いまは開けば即使えるようになったらしい。便利便利。
こっちの場合も同じようなやつがあるんでしょう、ほらったWebViewこれを使えばいいらしい。
XCodeのときは、いかにもアプリの画面を作れば完成って感じだったけど、Androidの場合は
Layoutファイルというのを使わないといけないみたい。なんかこれはHTMLみたいな記法だな。。
どうなってんだかよくわかんないですけど、Layoutを作成して、WebViewを配置、
Androidの場合は、assetフォルダというのをつくってあげて、そこにHTMLファイルを
置けばいいらしいですよ。なるほどね。
WebViewでの開き方は、assetフォルダを直接開けばいいだけらしい。いえーい!
layoutに配置したWebViewをオブジェクト変数に呼び出して、、、
webView.loadUrl("file:///android_asset/web/index.html");
ひらいたーおっけーーーーーーー。
だけども、リンクを開くとブラウザが開いてしまうなあ。どうすればいいのこれは。
調べてみるとこうすればいいらしい。
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
これで無事、WebView内で画面遷移するようになりました。
やっほー
そんで、なんとかつくりあげて、申請・・・
とかないんですね、公開したら公開されましたw
ていう感じで始めてつくってみたんで
よかったらダウンロードしてみて下さい!
https://play.google.com/store/apps/details?id=ff.appgroup.app001_hrenai
http://d.hatena.ne.jp/iad_otomamay/20130318/1363596244
この記事。本当に腹が立ちました。
まず質問自体が酷いのが多い。
省略したのは知らないと障害の危険があるので知っとくべきってことで同意なんですが、
これは使うときにググれば良い話。暗記しておくメリットがわからない。
結合テスト中のシステムで、OutOfMemoryErrorが発生しました。UT後ソースコードの変更はしていません。ヒープメモリは足りているようです。原因として何が考えられますか?(筆記解答)
「UT後ソースコードの変更はしていません」という一文が意図不明。単体テスト終わった後にソースコード変更したら、再度単体テスト必要だと思うのですが?この一文は何のヒントにも制限にもなっていないです。
なぜNGなのかというのは「文字列連結演算子(+)では速度が遅いから」であり、StringBufferかStringBuilderのような結合用クラスのappend()を使うことでパフォーマンスは向上する、というところまでが質問の狙いなのかと思いました。もう一歩踏み込むならば、+をしたときにコンパイラでどのようになるかを知っているかどうか、みたいな。しかし結合用クラスにはデメリットもありまして、append()は冗長過ぎて可読性が酷く低下するデメリットがあります。文字列の連結時にクラスをnewするタイミングを調節したほうが速くなることもあります。近年ではマシンのスペックもあがってますので、そんなに気にする部分ではないと思います。そもそも、このStringBufferの仕組みは絶望的に救いがないJava言語の汚点と言ってもよい部分です。なんで文字列の連結方法に複数のやり方を速度だけの理由で取捨選択させるというバッドノウハウなので、早くコンパイラが最適化して一元化くれることを望む部分です。
StringBufferかStringBuilderと書いていて、そういやスレッドに関しての質問がないのはどういうことなのかと感じました。JavaのWeb系ってスレッド重要だと思うのですが。
JavaScriptでHTML要素をid属性の指定により取得するメソッドは何ですか?(筆記解答)
もうjQueryやDojoも使われるようになってきたからこれも知らなくてもいいんじゃないかと。id指定で取れるということとを知っておけば答えにはたどり着けるはず。バッドノウハウです。どうしてJavascriptが最近になって流行ってきたかを思い出して欲しいです。
プログラマーはバッドノウハウの塊でなくてはならない、というのが見えてくる質問内容ですが、最近は覚えなければならないことが多く、技術の更新スピードも早いので、あの質問のような重箱の隅まで暗記するようなことをしていては、重要な部分が抜け落ちているし、暗記の苦手な人は辛いと思います。書籍もネットのような情報の蓄積と抽出する部分は充実してきたので、概念は知っておいて、実装手段はその都度調べるほうが効率的であるかと思います。質問は、応用の効く根本的な部分を問う方がよかったです。
「現実は、もっと凄惨な世界を経て時代が進んでいくようだ。」などと締めくくっていますが、この人は凄惨な世界が嫌なのでしょうか?不安を煽るだけで対策も講じていません。まず、質問の回答を書くだけでも、読んだ人の知識の底上げに貢献できると思うのが普通です。「これは基礎教育をやってれば当たり前」とか言ってドヤ顔して、できない人間を馬鹿にしているだけに見えます。本心では凄惨な世界を望んでいるのでは?としか思えてなりません。
この記事を読んだことで、またSI業界から優秀な人が遠のくことでしょう。こんな人間が居る業界には居たくないと。
どうして悲しみを減らす方向に動いてくれないのかと…
※追記
頭沸騰しててスルーしてしまったのですが「淘汰」って書いてあったので、業界の底上げは望んでないんだなあと、見当はずれなこと書いてしまったなあ、と、後悔した。
一瞬そうかと思ったのですが、
stringにキャストしてから比較してるわけではないようです。
http://anond.hatelabo.jp/20130123190650
------------------------------------------------------------
if ('5e0' == 5) {
//こっちに分岐
echo "true";
} else {
echo "false";
}
if ('5e0' == '5') {
//こっちに分岐
echo "true";
} else {
echo "false";
}
$ArrTest = array(
'5e0' => ''
);
if (array_key_exists(5, $ArrTest) == true) {
echo "true";
} else {
//こっちに分岐
//そのまま比較しているわけでもstringに比較しているわけでもないらしい
echo "false";
}
exit;
まったくの素人がNginx+Bootstrap+WordPressでWebサービスを作成しました。
オシャレエロサイト「h300」をリリースして、10万PV/日を捌くためにやったこと
http://d.hatena.ne.jp/inouetakuya/20120410/1334058296
http://anond.hatelabo.jp/20120914214121
http://anond.hatelabo.jp/20120930171125
--------------------------------------------------------------------------------------------------------
35歳 今は事務系の仕事をしてます。たまに運転。限りなくパートに近い労働条件ですが、
仕事がないよりはマシですので、続けているわけです。
前(5年ぐらい前)からWebサービスみたいなものを自分自身で作ることができたら楽しいだろうなぁと。
TwitterとかFacebookとか数回利用したことはあるけど、詳しいことはさっぱり。
朝6:00から夜18:00まで車を走らせてゴミ回収をしていた者です。
パッカー車って知ってますか。街でよく見かけるゴミ収集車のことです。
ドラッグストアとか回るんですよ。休憩時間は15分ぐらいなんですよ。一日。馬車馬のように働いていました。
そのパッカー車で物損事故を起こしてしまい、会社に居続けることはできなくなり仕事をやめました。
エロはもともと好きだったのですが、車を運転する以外の技術は持っていません。
何か手に技術を身につけたいと考えるようになりました。ただ30歳も過ぎたおっさんにあまり時間はないので、
資源の集中を意識し時代の流れはパソコンだということで、始めたわけです。
はじめはHTML,CSSの本で基本的なホームページ制作を学ぶ。
-----------------------------------------------------------
Bootstrap
-----------------------------------------------------------
Webサービスを作るにはプログラミングが必要なことは知っていたけど、初めてみて暗号のように思える。
プログラミングの中でもPHPは簡単なのでしょうか?最近の流れからすると、Rubyなのでしょうけど、
PHPは自分の実現したいサービスが組み立てやすい気がします。
http://www.amazon.co.jp/gp/product/toc/479733245X/
foreachやif,forなどの基本的な使い方を身につける。
プログラムは結局小さいプログラムの集まりだとどこかに書いてあった。ことを思い出す。
PHPはベタのプログラムだどセキュリティ的に弱いということでPEARを使うように。
ほかのプログラミング言語は知りませんが、PHPerというらしい。
プログラムに慣れてくるとPEARライブラリなどのクラスに抵抗がなくなってきた。
それでも、オブジェクト指向という考え方を体で理解するまで時間がかかる。
----------------------------------------------------------
http://php.xenophy.com/index.html
http://kumicyou.sakura.ne.jp/php/index.html
http://www.amazon.co.jp/gp/product/toc/479733245X/
http://www.amazon.co.jp/gp/product/toc/4797367571/
----------------------------------------------------------
----------------------------------------------------------
Simple HTML DOMParser メモリーオーバー?が発生するので頻繁には使えない。
正規表現って便利ですよね。(preg_match("/ab/", $string);など)
Webサイトのどんな情報でも切り取ったり、貼りつけることができるので。
Web上で特定の情報を好きなように集めてきて、加工することができるスクレイピングを発見。
PHPでスクレイピングするにはどうしたらいいか考えるようになり、かなり時間を使いました。
該当URLのサイトマップからリンクページ(aタグ)をすべて取得する。
ページの中にあるエロ動画URLやサムネイル画像などをファイルへ出力。
$fp = fopen("/var/www/html/sample.txt", "a"); fwrite($fp, $title."\n"); fclose($fp); }
出力したファイルの中で重複データなどないように一つにまとめて使えるように加工する。
あらかじめCronで時間を指定してファイルの情報をデータベースへ投入。
これから欲しい情報は、著作権に気をつけながらスクレイピングして集めてくると楽しいなぁと思ってます。
自分でホームページを公開するためにはサーバーが必要なことは以前から知っていたのですが、具体的には手探り状態からで
サーバはレンタルサーバとか専用サーバなどいろいろあるのですね。
全部自分で管理しないといけないため、めんどくさい気がした。結局VPSサーバに。
スピードアップのためにやったこと。データベースとアプリケーションサーバを分ける。
データベース最適化、query_cache_sizeを設定したりなど。
http://anond.hatelabo.jp/20101203150748
ウェブ開発者のための、1時間でできるLAMP環境構築術(CentOS編)
http://tanaka.sakura.ad.jp/2011/05/centos-linux-apache-php-perl-mysql-lamp.html
定番のPHP MYSQL Apacheから調べていくとNginxというWebサーバが高速だという
記事が多いので、使ってみることに。
NginxだけではPHPは動かない。php-fpmをインストール。
------------------------------------------------------------------------------------
http://d.hatena.ne.jp/yoshi-ken/20120205
http://kray.jp/blog/wordpress-tuning/
http://server-setting.info/centos/apache-nginx-2-php-fpm-install.html
http://hara19.jp/archives/5817
http://tech.aainc.co.jp/archives/3022
------------------------------------------------------------------------------------
以上の記事でNginxのproxyを設定することができ、とても参考になりました。
どうにか既存のサイトをWordPressで作れないかと考えていたら、
WordPressは固定ページとブログ用のページを分けるテンプレート構造だと知る。
WordPressはindex.phpファイル一枚あれば動くらしく、ページを表示する優先順位があるらしい。
メインページ front-page.php → home.php → index.php
そのため、fromt-page.phpに自分で作ったSmartyをそのままコピペして,なんとか既存のサイトとWordPressをミックスさせることに。
詳しくは以下の本が参考になりました。
http://www.amazon.co.jp/gp/product/toc/479736758X/
WordPress奥が深いです。
途方にくれていたところ、CSSフレームワークのTwitter Bootstrapを知る。
HTMLに少し手を加えるだけで今っぽいデザインにできる。その分、余った時間をweb構築に集中することができる。
http://panpanwatch.net/douga.php
http://panpanwatch.net/newdmm.php
DMM動画の当日配信が開始されたコンテンツをDMMのapiから収集。
http://panpanwatch.net/?page_id=5382
ネット上のエロ更新情報を収集して表示。メインはWordPressで構築。
--------------------------------------------------------------------
常日頃からネットのエロにはお世話になっていたので、なんか恩返しではないですけど、
Webサービス作るまで、ずっとパソコンの前ばかりにいたので、
こんにちは。みなさまからのブクマとコメントを多数いただき、ありがとうございます。
いろいろご意見あると思いますが、大げさな嘘などは書いていないです。
PHPを理解するのも、こちらの本を一冊やれば、それなりに理解できるようになりました。
http://www.amazon.co.jp/gp/product/toc/479733245X/
次のサービスを作成するときは本格的なアプリケーションやソーシャルゲームなどやりたいなぁと
野望だけは持っています。ですけど、ずっとこのサイトだけに集中してきたので、今はパソコンから少しだけ距離を置くつもりです。
プログラムは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 という記法=アドレス参照 ができるが
スマートポインタは そういう使い方はしない。 あくまでも指定されたオブジェクトを管理するだけ。
たいていの使い方をする場合に、参照カウンタの増減なんて手動ではしないから。(というか、ポインタがわからない奴がするな コピコン使え という設計方針でいいとおもう)
RubyのSymbolと文字列の違いを研究室の輪講用に書いたのですが,折角なので公開したいと思います.
元々学部生に対する輪講用に書いた物なので,若干上から目線ですがご了承ください.
文字列とSymbolはよく似ています.プログラマから見ればどちらも文字列です.違いを一言で説明すると『プログラムが扱う』文字列か,『プログラマが見る』文字列かの違いです.例えば変数名は『文字列』ですが,rubyのオブジェクトである『文字列』ではないですよね?
例えば,今あなたがC言語でお絵描きライブラリを作っているとしましょう.その中に,色で塗りつぶすfillという関数があり,色を青・赤・緑の3色から選べ,fillの引数でそれを指定できるとしましょう.
fillの引数の設定方法として一番単純なのが,0を青,1を赤,2を緑として,0〜2で選択させる方法でしょう.しかし,それでは,どの数値が何色か覚えないといけないし,fill関数を知らない人から見れば,どういう意味の引数かすらさっぱり分かりません.
ではどうするかと言えば,普通はBLUE = 0, RED = 1, GREEN = 2と適当に定数を設定して,その定数を引数で指定させますよね.
こうして,fill関数の引数が意味の無い数値から意味のある文字列に変わったことによってプログラムが分かりやすい物となります.さて,ここで注意してほしいのは,ここで言う文字列はプログラムが扱うオブジェクトとしての文字列では無いということです.fill関数の引数として,"BLUE","RED", "GREEN"などとC言語の文字列を渡すということは普通しませんよね.それは,ここで言う文字列は,あくまでプログラマがプログラムコードを分かりやすくするために必要な文字列であって,プログラムがオブジェクトとして扱う(例えば,長さを求めるとかする)文字列ではないからです.
分かってきたでしょうか?
プログラムコード上では(つまりプログラマから見れば)どちらも同じ文字列(文字の列という意味で)ですが,実際に動くプログラムから見れば単なる数値と本物の文字列という大きな違いです.結局,fill関数の引数の具体的な値は何でもいいわけです.プログラマから見て文字列であればそれだけでよく,プログラムが動くときの実際のその中身は何でもいいわけです.これのために存在するのが,Symbolであり,:fooとひとたびSymbolを作成すれば:fooの実態は適当な数値となります.(この数値がいくらかなんていうことはもちろん気にする必要はありません)
そして,もちろん同じプログラム上では:foo == :fooはちゃんと成り立ちます.もうここまでくれば,Hashのkeyとして文字列でなくSymbolを使う理由が分かりますね.Hashのkeyはあくまで,プログラマが見る(プログラムコードを分かりやすくするための)文字列であってプログラムが扱うオブジェクトとしての文字列では無くて,keyの実際の値は何でもいい,からですね.(特別な場合を除いて)Hashのkeyに対してrubyのStringのメソッドを使うなんてことは無いですよね.
しかし,他の軽量言語ではSymbolなどなくHashのkeyとして普通に文字列を使うことが多いです.では,なぜrubyだけSymbolを使うのでしょうか.
その答えは一言でいうと,rubyの(プログラムコード上に直接書かれた,つまりリテラルの)文字列は他の言語と違いimmutable(不変)でない,からです.実際,pythonやjavascriptの文字列(リテラル)は破壊的に変更することはできませんが,rubyの文字列は破壊的に変更することができます. ('abc'.concat('d')の様に)
これがどういう違いを生むかというと,コード上に直接現れる文字列がimmutable(不変)であるならば,実行時に一つだけそのオブジェクトを作成し,後はそれを使いまわすという最適化ができます.
そうした時,Hashのkeyの様なプログラマから見た文字列というのは,プログラムコード上のリテラルとして現れるわけですが,これらは実行時に一つだけオブジェクトが作成され(特にコード上に現れる同じ文字列は全て一つのオブジェクトにまとめると),それらの比較はそれらに対する参照(そしてこれは大抵メモリのアドレスなど単なる数値)の比較で済むので,結局Symbolと同じ様な働きをするわけです.
本当はプログラマが見るためだけの文字列だけど,それをオブジェクトとしての文字列としても,Symbolと同じ様な働き,パフォーマンスが得られるならば,別にオブジェクトとしての文字列であってもいいわけです.
繰り返しになりますが,プログラマが見るためだけの文字列は,その中身・実態は何でもいいわけですが,その実態がオブジェクトとしての文字列でも十分なパフォーマンスが得られるならば,別にオブジェクトとしての文字列でもいいわけです.
さて,rubyに話を戻しますと,rubyはコード上に現れる文字列であっても,実行時にそのコードを通る度に毎回新たな文字列オブジェクトを作成します.
(以下のプログラムを動かすことで確認できる.)
def foo 'foo'.object_id end p foo, foo
つまり,rubyでは文字列が可変であるため,先に述べたような最適化ができない(または難しい)ので毎回新たな文字列オブジェクトが作成されるのです.
こうなると,先ほどの話とはうってかわって,プログラマが見る文字列はその実態は何でもいいのに,それを文字列リテラル(rubyのオブジェクトとしての文字列)にしてしまうと,毎回毎回文字列オブジェクトが作成されてしまうという非常にばかばかしい状況になってしまいます.我々はそれらの文字列オブジェクトに文字列としての操作は一切施さないのにも関わらず,です.
こういうわけで,rubyではプログラマが見るためだけの文字列にSymbolというruby特有のものを使うのです.
もちろん,プログラマが見るためだけの文字列を全て定数として(そしてもちろん中身は適当な値で)定義しても構わないわけですが,Hashのkeyとかで数多くのプログラマが見るためだけの文字列が現れることを考えると,とてもじゃないですけどそんなことは面倒でやってられないですよね.ですので,実行時に自動で適当な値にしてくれるSymbolというものが存在するのです.
以上で,Symbolについての説明を終えます.以下は蛇足です.
最初の方で出てきたfill関数をrubyで実装しようとしたとき,青・赤・緑の各色はその実際の値はなんでもいいのでrubyのSymbolを使って:blue, :red, :greenとしてもいいのですが,ライブラリとかでは大抵ちゃんと定数として定義されていることが多いです.
これは恐らく,定数として明示的に定義することで値の存在を明示でき,ドキュメント化の際にも役立つことによっているのでしょう.
しかし,あくまでこれは外部に公開するようなライブラリでの話であって,自分が使うちょっとしたプログラムならこういう場面でも精力的にSymbolを使っていってもいいと思います.ちなみに,僕ならSymbolを使います.
Symbolだと定義もいりませんし,定数は大文字ですから打つのが面倒ですし,あまりソースに大文字が入ると見た目がすっきりしません(主観).
Symbolは非常に便利なものですので,その意義・用途を十分に理解して,Hashのkeyにとどまらず様々な所で使えるようになりましょう.
Javaだけど。
class HelloWorld { public static void main(String args[]) { System.out.println("Hellp World"); } }
Web屋のネタ帳( http://neta.ywcafe.net/ )様の
これからの「パスワード」の話をしよう( http://neta.ywcafe.net/001184.html )で
紹介されているパスワードのハッシュ化のバグについて突っ込んでみる
「1回ハッシュ化を解読できただけ、プレーンパスワードを入手することが可能である」
というものである。
問題の部分はここ
/** * 平文のパスワードをハッシュ&stretchするメソッドです。 * loop回数は1000としていますが、999でも1001でもお好みでどうぞ。 * ただしループ回数は処理時間に直結しますのでほどほどの数値で。 */ private static final String hashAndStretch(String plainPasswd, String salt) { int loop = 1000; String hashedPasswd = ""; for (int i = 0; i < loop; i++) { hashedPasswd = DigestUtils.sha256Hex(hashedPasswd + plainPasswd + salt); } return hashedPasswd; }
<凡例>
ソルト:SSSSSSSS
<トレース>
XXXXXXXX ← DigestUtils.sha256Hex("YYYYYYYY" + "PASSWORD" + "SSSSSSSS")
クラッカーがXXXXXXXXXのハッシュ値を解析し、元の文字列が「YYYYYYYYPASSWORDSSSSSSSS"」と判明したとする。
この時点で元文字列の中にプレーンパスワードが含まれていることになる。
また、ハッシュ化された文字列には「0123456789abcdef」の文字しか含まれておらず、
「それ以外の文字が含まれていた場合容易にプレーンパスワードではないか」
一般的なパスワードには少なからず「0123456789abcdef」以外の文字が含まれているだろうし、
上記のことをふまえてプログラムを修正すると。。
/** * 平文のパスワードをハッシュ&stretchするメソッドです。 * loop回数は1000としていますが、999でも1001でもお好みでどうぞ。 * ただしループ回数は処理時間に直結しますのでほどほどの数値で。 */ private static final String hashAndStretch(String plainPasswd, String salt) { int loop = 1000; String hashedPasswd = DigestUtils.sha256Hex(plainPasswd + salt);; for (int i = 0; i < loop; i++) { hashedPasswd = DigestUtils.sha256Hex(hashedPasswd + DigestUtils.sha256Hex(salt + i)); } return hashedPasswd; }
旭茉莉(昆蟲白)、Happy New-Yearが言いたくて(南野陽子)、一直到底(Nipples)、赤い戦車(ヤプーズ)、南方蝶道(甜梅號)、
一個人的水道(甜梅號)、Air on the G string(Bach)、春夏秋(チャットモンチー)、激光中(羅文)、Merry Christmas Mr. Lawrence(坂本龍一)、
恋愛スピリッツ(チャットモンチー)、安眠藥(歐陽靖 陳奐仁)、甜蜜蜜(薛凱琪)、MAY(斉藤由貴)、ダンシング・ヒーロー (荻野目洋子)、
雙失情人節(Twins)、青山黛瑪(何韻詩)、汽水樽裡的咖啡(何韻詩)、情歌(側田)、when i listen to the field mice(my little airport)、
習慣失戀(容祖兒)、糖不甩(薛凱琪)、VALON-1(Salyu)、戀人未滿(S.H.E)、美空雲雀(何韻詩)
東風(Yellow Magic Orchestra)、Lucky(スーパーカー)、我有一段情(吳鶯音)、曙(ゲルニカ)、2EM12_KK_A09(ヱヴァ破)、
光榮之家(何韻詩)、北歐是我們的死亡終站(my little airport)、隆重登場(容祖兒)、電力組曲 C:電化の暮らし(ゲルニカ)、妮歌(何韻詩)、
Komm, Susser Tod/甘き死よ、来たれ(Arianne )、ホープ(testpattern)、給十年後的我(薛凱琪)、安靜了(S.H.E)、女朋友(歐陽靖 陳奐仁)、
体操(YMO)、You Only Live Twice(Nancy Sinatra)、小茉莉(楊丞琳)、Oh!(少女時代)、圓謊(容祖兒)、
管他什麼音樂(范曉萱&100%)、Blue Paradise(Martin Denny)、泡泡(魏如萱)、Sunny Road To Salina(Christophe)、Be True(容祖兒)、
優しいたそがれ(南野陽子)、最後的歌(楊千嬅)、Le premier chagrin d'amour(France Gall)、眼球綺譚(戸川純ユニット)、愛しのキッズ(小島麻由美)、
月世界旅行(アポジー&ペリジー)、韻律泳(何韻詩)、飛べない翼(Lily Chou Chou)、手のなるほうへ(チャットモンチー)、ヒステリヤ(ヤプーズ)、
Green Grass Of Tunnel(Mum)、夢伴(梅艷芳)、舊約(何韻詩)、再見...露絲瑪莉(何韻詩)、AXIA~かなしいことり~(斉藤由貴)、
就算世界無童話(衛蘭)、점핑(Kara)、夢のスキマ(鷺巣詩郎)、空しき流れ(鷺巣詩郎)、閉塞の拡大(鷺巣詩郎)
那年夏天寧靜的海(王心凌)、痛愛(容祖兒)、落寞莉(昆蟲白)、憤怒の河(戸川純)、惚たる蛍(チャットモンチー)、
愛一個上一課(容祖兒)、最後一課(容祖兒)、時不與我(容祖兒)、Dear. Mom(少女時代)、男孩像你(薛凱琪)、
沙堡壘(容祖兒)、A Wishful Way(Hopscotch)、ONE(斉藤由貴)、拳銃(チャットモンチー)、脆弱(謝安琪)、
立つ鳥跡を濁さず(トップをねらえ2!!)、時の河を越えて(トップをねらえ!)、親知らず(チャットモンチー)、媽媽我考試考100分(selfkill)、搜神記(容祖兒)、
想想(何欣穗)、リフトの下で逢いましょう(南野陽子)、ギルガメッシュ(ヤプーズ)、Roller Coaster Rock(selfkill)、a love song(EGO-WRAPPIN')、
愛將(梅艷芳)、手のなるほうへ(チャットモンチー)、petsounds(the beach boys)、香格里拉(魏如萱)。
http://okajima.air-nifty.com/b/2011/01/2011-ffac.html
ぷよぷよを解く問題をやってみた
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { StringBuilder[] blocks = { new StringBuilder("**GYRR"), new StringBuilder("RYYGYG"), new StringBuilder("GYGYRR"), new StringBuilder("RYGYRG"), new StringBuilder("YGYRYG"), new StringBuilder("GYRYRG"), new StringBuilder("YGYRYR"), new StringBuilder("YGYRYR"), new StringBuilder("YRRGRG"), new StringBuilder("RYGYGG"), new StringBuilder("GRYGYR"), new StringBuilder("GRYGYR"), new StringBuilder("GRYGYR") }; bool updated = true; while (updated) { breaked: DumpBlock(blocks); for (int i = 0; i < blocks.Length; i++) { for (int j = 0; j < blocks[i].Length; j++) { char c = blocks[i][j]; if (c == '*') continue; updated = false; if (KillBlocks(blocks, i, j)) { updated = true; goto breaked; } } } } DumpBlock(blocks); Console.Read(); } struct Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } static bool KillBlocks(StringBuilder[] blocks, int x, int y) { bool[,] visted = new bool[blocks.Length,blocks[0].Length]; MarkBlock(visted, blocks, x, y); Queue<Point> queque = new Queue<Point>(); for (int i = x; i < blocks.Length; i++) for (int j = y; j < blocks[i].Length; j++) if(visted[i,j] == true) queque.Enqueue(new Point(j,i)); if (queque.Count < 4) return false; while (queque.Count > 0) { Point p = queque.Dequeue(); RemoveBlock(blocks, p.x, p.y); } return true; } static void MarkBlock(bool[,] visted, StringBuilder[] blocks, int x, int y) { if (x < 0 || y < 0 || x >= blocks.Length || y >= blocks[0].Length || visted[x, y] == true) return; char c = blocks[x][y]; visted[x, y] = true; if (x + 1 < blocks.Length && blocks[x + 1][y] == c) MarkBlock(visted, blocks, x + 1, y); if (y + 1 < blocks[0].Length && blocks[x][y + 1] == c) MarkBlock(visted, blocks, x, y + 1); if (x > 0 && blocks[x - 1][y] == c) MarkBlock(visted, blocks, x - 1, y); if (y > 0 && blocks[x][y - 1] == c) MarkBlock(visted, blocks, x, y - 1); } static void DumpBlock(StringBuilder[] blocks) { foreach (StringBuilder s in blocks) Console.WriteLine(s); Console.WriteLine(); } static void RemoveBlock(StringBuilder[] blocks,int x,int y) { int i; if (y == 0) { blocks[y][x] = '*'; return; } for (i = y; i > 0; i--) { blocks[i][x] = blocks[i - 1][x]; } blocks[i][x] = '*'; } } }
わざわざ外に出して関数化するほどのことでもないよな、とか
この関数からしか呼ばないのに、並列に関数を置きたくないな、とか思うことがあるでしょう。
JavaScript ならこんな思いに見事に答えてくれます。
たとえば個人情報が云々なので文字列のマスク処理を作ろうとしましょう。
String.prototype.mask = function() { var maskedText = ""; for(var ix = 0; ix < this.length; ix++){ maskedText += mask1(this.substring(ix, 1)); } return maskedText; function mask1(character) { var maskedCharacter = ""; swith(chr) { case 数字: 処理A, 個別処理 case 英字: 処理B, 個別処理 case 全数字: 処理A, 個別処理 case 全英字: 処理B, 個別処理 case ひらがな: 処理C, 個別処理 case カタカナ: 処理C, 個別処理 case 漢字: 処理D, 個別処理 default: 未処理 } return maskedCharacter; } };
こういうメソッドを作った時、処理A、処理B、処理Cは冗長な処理になっているわけです。
個別処理があるのでbreakしなければいいや、というわけでもありません。
しかしこの処理A,B,Cはこの関数外に置くような処理でもないわけです。
この関数内でしか使いませんし、むしろ使って欲しくないわけです。
function mask1(character) { var maskedCharacter = ""; swith(chr) { case 数字: shoriA(), 個別処理 case 英字: shoriB(), 個別処理 case 全数字: shoriA(), 個別処理 case 全英字: shoriB(), 個別処理 case ひらがな: shoriC(), 個別処理 case カタカナ: shoriC(), 個別処理 case 漢字: 処理D, 個別処理 default: 未処理 } return maskedCharacter; function shoriA() { 処理A } function shoriB() { 処理B } function shoriC() { 処理C } }
こう書けるのです。
JavaScript で一番好きなのはこの内部関数です。
2010年の年末から年始にかけて10連休ほどあったので、新しいサイトを作ろうと思い立った。
月に1万円だと、毎日コーヒーを飲んでるだけでなくなってしまうので、コーヒー代くらい稼げたらうれしいなあ。じゃあどうする。何を作る?
ということで、まずTwitterを使ったものを作ることにした。
ひとつのジャンルにしぼってツイートをかき集めれば、面白い流れになるんじゃないか。人が来るんじゃないか。そう思った。togetterみたいな。で、ジャンルは、個人的に興味がある子育て。ていうか毎日帰宅してから朝まで子どもの寝かしつけや夜泣きの対応でサイトを更新する暇も、俺が寝る暇もあんまりない。ので、手がかからないことが大前提。なんだったら自動更新でもいい。
自動更新かー。と思って「ブログ 自動更新」でググったら、wordpressにRSSから更新するプラグインがあるらしいことを知った。はい決定。その瞬間、「TwitterのAPIからRSSを引っ張ってwordpressに投稿するサイト」に決まった。
さくらインターネットのスタンダードを申し込んだ。14日お試しがあるらしいけど、仮申し込みの時点で住所も入れてコンビニ請求にしたら、数日後に請求書が送られてきてビビった。(同時にドメインも申請しちゃった)
まあ、webで申し込んで、すぐにサーバコントロールパネルという画面に入れるようになった。「クイックインストール」というリンクがあったので見てみたらMovableTypeとWordPressを自動でインストールしてくれるらしかったので、ボタンを押した。インストールできましたというので発行されたURLをクリックしたけど404だった。1時間くらい404で、その日はもう寝た。
次の日の夜。これはもう、10連休を利用して毎晩1時間ずつ捻出するしかない、さくらのお試し14日あるから約14時間で作りきるしかねえ、と思った。
サイトにアクセスしたらwordpressが入ったページが出てきた。おお、サイトができてる!
まずTwitterを調べるか、と思って、「Twitter API」で検索したけどOauth?とかいう面倒なことをしないといけないらしかったのでやめた。じゃあ普通に検索は?と思って「Twitter 検索」で検索したら、search.twitter.comの結果はjsonかatomで取得できるし、APIコール制限もないらしいのでこれに決定。検索だけで1時間たった。
夜も更けて、続けて作業した。「wordpress xml 投稿」で検索していくつか探したらFeedWordpressというプラグインがあったので入れた。あ、事前知識としてMovableTypeでのブログはやったことがあったので、プラグインを入れるみたいな話はスムーズに進められた。
で、twitterの検索結果をatomで返した結果を入れてみた。ら、本当に投稿されてた。よっしゃできた、と思った。1ツイートが1エントリになってたし、投稿者もツイートした人になってた。よかった。でも、満足できなかった。
次の日。同じことを自力でやる方法を探した。「wordpress xml 投稿」で検索して、XMLをパースできるようになればいいんじゃないかと思い、simplepieというPHPライブラリにたどり着いた。が、PHPなんてまったく知らないし、憶える気もなかった。actionscriptで書かせてよ、とずっと思ってた。
次の日。「wordpress xml 投稿」でまた検索。どうやらwordpressの投稿って、xmlrpcというやり方を使ってるらしかった。ので、「wordpress xmlrpc 自動投稿」で検索したら、なんかサンプルコードが載ってたのでそのまんまコピペ(結局PHPだった)。したらちゃんと投稿されていた。ふむ。ここで何を思いついたのか、「wordpress xml パース」と昨日みたいなことを検索した。simpleXML?というライブラリがあるらしかったので、それを試してみることにした。(たぶんPHPが動いたので気をよくしてたんだと思う)
こういう流れでいけると思った。考え方はactionscriptをエディタに書いて、ノリであてにいった。変数に宣言するのはできた。$var1とかで宣言したことになるらしい。URLRequestに相当するコードを探したら「file_get_contents」らしいことが分かった。(「PHP 外部ファイル」で検索)
で、ゲットしたのはXMLなんだけど、上記検索したなかにたまたま書いてあった「simplexml_load_string」というのを使うとXMLをパースできそうな気がしたので、ノリで書いたactionscriptでは
var req:String = "http://search.twitter.com/?q.atom=mogemoge";
var r:URLRequest = new URLRequest(req);
var kekka:XML = r.send() as XML; ←いまここ
なので、XMLにキャストしたんだろうなみたいな感じだった。E4Xを使えればいいのにPHPって馬鹿ねと思いながら寝た。
年があけて、3が日が終わりそうだった。年末にやってたこと(上記までのこと)を思い出しながら、XMLの必要な部分だけ抜き出す方法を模索した。atomっていってもentryがたくさん入ってたから配列にするんだろうけど、ってんで「php foreach」を検索。なんとなくサンプルコードをまねしながら、記事タイトル、記事本文だけ取得した。あとはxmlrpcのサンプルにあわせて投稿するようにした。できた。寝た。
次の日の朝、ブログを見た。昨日更新したものしかあがってない。自動じゃねーじゃん。
で、「自動 投稿」で検索したら、クローン(cron)という仕組みを使わないといけないのだった。クローンはサーバの仕組みらしく、そういえば俺はPHPをはじめDB、サーバという単語を極力さけて仕事してきたので、もう気持ちが悪くなってきた。「さくらインターネット cron php」で検索して、なんとかやり方を見つけて、cronを登録した。(1時間に1回にした。設定は * * * 0)
仕事から帰ってきて、サイトを見ると、投稿が大量にたまっていた。やった!で、調子に乗ってツイッターアカウントを作った。なんだったらツイッターも自動化したかったので「twitter bot」で検索した。Easybotterというサンプルボットがあったので使わせてもらった。自動で一行ずつつぶやくようにした。
ツイートを集めることは成功したけど(毎時間100件のツイートを1エントリとして投稿してる)、それを眺めて面白いんだろうか? ボットを動かしてるけど人がくるんだろうか?
そんなとき「trivist」がはてブに載ってた。なんかにたものを感じた。やっぱツイートを引っ張ってきて投稿するサイトはアリなのか?アリなはずだ!
サイトの体裁を整えた
trivistをまねて、記事を評価(はてなスターとかいいねボタンとかに近いもの)する仕組みが欲しくなった。「wordpress 評価 プラグイン」で「wp-postratings」というプラグインを発見して、入れてみた。どうやら1エントリーに1評価しかできないらしい。俺のサイトは1エントリーに100ツイートあるから、どのツイートを評価するのかが分からない。
いったん、wordpressの全投稿を削除した。で、cron に登録されてるPHPを、1記事に1エントリーにした。
エントリーを投稿するついでに、Yahoo日本語解析APIをつかってツイートを分析して、名詞と動詞だけを取り出そうと思った。それをタグにすれば、タグクラウドが作れると思った。はてブはずっとずっと昔からやってるから、Yahoo日本語解析っていうのが2006年くらいに流行ったことをなぜか憶えてたので、やってみた。できた。
なんか俺、PHP書くのが早くなってね?
アクセス解析を入れてみた。サイトに来てる人は、俺だけだった。
どうにかして人を増やしたい。サイトの広告募集はする気がないし、ベタベタとバナーを貼りたくなかった。みんなが気軽に見に来て、軽い気持ちで評価してくれて、更新を楽しみにしてくれるサイトにしたかった。コミュニティサイトじゃないけど、やっぱりサイトはコミュニケーション設計をしないと意味がないんじゃないか、見てくれるユーザはどうやったら楽しいんだろう、ということを考え続けて10日ほど経った。Twitter経由で来てくれた人が3人ほどいるようだけど、何がダメなのか分からないので増田にお願い。
ここまで書いて教えてくんじゃねーか、と思われるかもしれないが、ググレカス的な検索は上記で書いたみたいにいろいろやってきた。でも、サイトを作ってみてはじめて、ユーザに向けたサイトってどう作ればいいのかが分からないということに気づいた。
小遣い稼ぎもしたいんだけど、面白いサイトを作るヒントがほしいと思った。
kanzen21やtrivistみたいに、俺も過程を全部さらしたから、辛辣な意見を求む。そしてはてブされるのを待ってます。