「String」を含む日記 RSS

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

2014-07-11

C#論理記号 || && は、VB でいう andalso や orelse の代替にならない?

わたしの勘違いだったら申し訳ないけど、C#で次のようにコードを書いたら、ぬるぽ例外が発生しましたよ。

public class DoSample : System.Management.Automation.PSCmdlet

{

...

public DoSample() {

...

if ((this.MyInvocation == null) || (string.IsNullOrEmpty(this.MyInvocation.ScriptName))) {

return;

}

...

}

}

コードを書いた箇所は static な関数内ではないので、this が null になることはありえないし。

2014-05-29

WinInetを使ってVBAでPOSTする

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 = &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) & "=" & jscript.encodeURIComponent(sendBuffer(1))
  Next
  Set jscript = Nothing

  Dim data
  data = submitPost(host, url_path, Join(sendArray, "&"))

  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

2014-05-22

またrebuild.fmJavaの悪口で盛り上がってたよ

http://rebuild.fm/44/

 Androidアプリ作ろうとしてJavaプログラマ募集したらクズしかこなかった全部クズだったとか、ひどくありません?

 まあそれは置いといて、UIみたいに最初から仕様を決められなくて何度も作り直すようなコードJavaは不向きみたいな話もまったく同意できないわ。

JavaじゃなくてC#だけど、昨日コードを書いていて

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) {}と修正したら修正漏れの箇所があってもエラーが伝播して言って、すぐ分かります

 OracleGoogle裁判がらみで「Java終了よかったよかった」みたいな話の流れで、AndroidアプリJavascriptで作ればいいって盛り上がってたけど、そうなったらIDEサポートが大幅になくなる原始的環境に逆戻りでしょ。

勘弁して欲しい。

ほんとうに動的型の言語はめんどくさい。

2014-05-13

単数形複数形区別してよ

プログラムの話ね。

別に英語の文法としてだけじゃなく、実用的に問題あるっしょ?

List<Stringname = getName();

なんでこれが平気なんだよ。読みづれーよ。

namesだろ?

nameListでもいいか。

2014-04-09

http://anond.hatelabo.jp/20140409111309

c++std::stringが+オペレータ文字列結合に割り当ててしまったゆえに生まれた悲劇

おかげで統一された文字列結合演算子が無くて、+とか.とか&とか||とか様々な記号

その目的に使われるという嬉しくない状況になってしまっている。

2013-09-04

世代UI/UX

フォロー、フォロワー数はTwitter社が手動入力している - Togetter

これを見て、いろいろと考えさせられた。

普段我々プログラマHTMLやそれに類するものを書くときに、

ソースコードユーザに見られてもいいように、クラス名やIDをちゃんとしたり不要コメントを残さないようにしたりしているが(もちろんコーディングルール等もあるが)、ユーザがそれを見たときにどう思うかについては配慮が足りないのではないかと思った。

たとえば、

<span>1234</span>

というHTMLを見たら、手入力していると思われても無理からぬことだ。

巷ではUIだ、UXだと言われているが、次世代UI/UXはここまで踏み込むべきではなかろうか。

まりHTMLJavascriptソースを見たユーザのことを考えるべきではないかと。

先程の例でいえば、

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

これだとどうだろう?ぐっと、それっぽさが増したのではないだろうか?

そしてこれが一番大事なことだけど、最初の例に比べて温もりが感じられるようになった。

これこそが、次世代UI/UXのあるべき姿ではないかと思う。

私は普段Rails(erb)を使っているのだが、

<span><%= "1234" %></span>

と書いたら、上記のようなコードが生成されるようになってくれると幸いである。

2013-08-02

Sails.jsを使ってpixiv検索サービス作った

Pixearch(ピクサーチ)

http://pixearch.net/

node.jsMongoDB勉強がてらpixiv画像タグ検索サービス作りました

はてブタグ検索のようにpixiv投稿された最近画像pixiv内でのブックマーク数でフィルタをかけて検索できるのが特徴です。

検索したり、タグをたどって、ダラダラと良い絵を眺めるのを目的としています

一応スマホからも見られるはず。

普段はブログを書いたりしてないので、今回学んだことのメモがてらの投稿です。

使ったもの

MongoDBを試そうと思ったのがサービスを作り始めた発端です。

Web部分はmongoDBと相性が良さそうなnode.js採用

MVCフレームワークで何か適当ものはないかとググってSails.jsが良さそうだったので今回採用しました。

ホスティング

今回はせっかくnode.js採用したので、噂のnode.jsPaaSのnodejitsuを試しに使っています

500MB分の容量のMongoDB最初から使えるのも大きかったです。

とりあえず最小のプランにしてるのでどのくらい捌けるのか気になるところ。

作ってみての感想
Sails.js

Web開発用のモジュール自分で用意するのがめんどいなー、という人向けな印象。

このくらいの規模のものだったらサクッと作れました。

ただある程度の規模のちゃんとしたサービスを作るのには色々足りてないので、自分カスタマイズしたりできる人じゃないと使うのは辛そうです。

後、ドキュメントも公式のものだけだと説明されてない機能結構あったりします。

デフォルトだとDBMySQL対応していて、MongoDBを使うにはsails-mongoを入れる必要がありました。

開発中に困ったことは、nodejitsuで動かそうとしてsails-mongoでエラーが出て、調べてみたらauthenticationに対応していないというバグがあったことでした。

手元で直したのでpull requestを送ろうかと思ったら既に他の人が送っていて、3日前ぐらいに取り込まれているので今は大丈夫なはず。

https://github.com/balderdashy/sails-mongo/pull/36

現在進行形で色々Issueが上がって修正がされているのでそのうちこなれてくるのに期待。

かいところで設計考慮がちゃんとされてるなーと感じたところも多かったので、node.jsで開発してる人は一回試してみると勉強になりそうです。

MongoDB

最初コレクション操作に戸惑ったのですが、結局JS連想配列なので思ったより早く馴染みました。

$setとか$gteとか特殊な意味を持つキーがいくつかあるので、その辺を把握できてから色々と捗りました。

MySQLに比べて特に更新系で複雑なクエリが発行できるので、ORMで使うと十全に機能を発揮できないのではないかな、と思ったり。

ご存知スキーマレスなので、何も考えずにデータを突っ込んでるとIntegerで保存したい値がStringになっててソートときに困ったりするので要注意。

指定した容量を超えたら自動で消してくれるCapped Collectionがあると知ったので、今回みたいな容量が限られてる場合に便利かなと試してみたのですが、このオプション有効にしたコレクションだとデータアップデートや削除ができなくなりました。

おそらく、追加しかしないログのようなデータの保存に使うもののようです。

nodejitsu

まだ微妙な部分も多かったですが、デプロイとかコマンド一発でできて、設定管理がpackage.jsonでできたりして面白かったです。

今回は、特に問題が起きたとき環境sshで入ったりできないので、表示されてるログだけで問題を調査するのに苦労しました。

MongoLabとMongoHQというMongoDBの外部ホスティングサービスが上述したように使えるのですが、無料の容量を超えて使うにはそこそこお金が掛かるのでモリモリ容量を使うものを考えている場合は注意がいります。(もちろん値段に見合ったプロダクトを提供してくれると思いますが)

ということで、せっかく作ったので是非試してみてください。

2013-04-01

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

32歳、営業職です。

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

作ってみました。

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

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

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

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

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

詳しくは、

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

NSString *html_path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory@"web"];

これでwebフォルダ内にあるindex.htmlファイル絶対パスを教えてくれるというわけだ。

あとはこれを読みこませればOK。

[web loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:html_path]]];

NSURL というのがURL書式を記述するためのオブジェクトだと思っていただきたい。

ここではローカルファイルパスを拾うため、 fileURLWithPath とするのがポイントだ。

file://nantarakantara/index.html みたいな書式になるんでしょうね。

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

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

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

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

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

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

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

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

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

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

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

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

Android場合は、assetフォルダというのをつくってあげて、そこにHTMLファイル

置けばいいらしいですよ。なるほどね。

WebViewでの開き方は、assetフォルダを直接開けばいいだけらしい。いえーい!

layoutに配置したWebViewオブジェクト変数に呼び出して、、、

webView.loadUrl("file:///android_asset/web/index.html");

ひらいたーおっけーーーーーーー。

だけども、リンクを開くとブラウザが開いてしまうなあ。どうすればいいのこれは。

調べてみるとこうすればいいらしい。

webView.setWebViewClient(new WebViewClient(){

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

return false;

}

});

これで無事、WebView内で画面遷移するようになりました。

やっほー

そんで、なんとかつくりあげて、申請・・・

とかないんですね、公開したら公開されましたw

ていう感じで始めてつくってみたんで

よかったらダウンロードしてみて下さい!

https://play.google.com/store/apps/details?id=ff.appgroup.app001_hrenai

2013-03-18

SI業界中の人間は、凄惨世界を望んでいる件について

http://d.hatena.ne.jp/iad_otomamay/20130318/1363596244

この記事。本当に腹が立ちました。

まず質問自体が酷いのが多い。

省略したのは知らないと障害の危険があるので知っとくべきってことで同意なんですが、

HTTPクライアントブラウザの種類などの情報を知るためのヘッダは何ですか?(筆記解答)

HttpRequestオブジェクトからPostされたデータを取得するServletメソッドは何ですか?(筆記解答)

これは使うときにググれば良い話。暗記しておくメリットがわからない。

結合テスト中のシステムで、OutOfMemoryErrorが発生しました。UTソースコードの変更はしていません。ヒープメモリは足りているようです。原因として何が考えられますか?(筆記解答)

UTソースコードの変更はしていません」という一文が意図不明単体テスト終わった後にソースコード変更したら、再度単体テスト必要だと思うのですが?この一文は何のヒントにも制限にもなっていないです。

String オブジェクトを+で結合するのはなぜNGなのかメカニズムを説明してください。(筆記解答)

なぜNGなのかというのは「文字列連結演算子(+)では速度が遅いから」であり、StringBufferかStringBuilderのような結合用クラスのappend()を使うことでパフォーマンスは向上する、というところまでが質問の狙いなのかと思いました。もう一歩踏み込むならば、+をしたときコンパイラでどのようになるかを知っているかどうか、みたいな。しかし結合用クラスにはデメリットもありまして、append()は冗長過ぎて可読性が酷く低下するデメリットがあります文字列の連結時にクラスをnewするタイミングを調節したほうが速くなることもあります近年ではマシンスペックもあがってますので、そんなに気にする部分ではないと思います。そもそも、このStringBufferの仕組みは絶望的に救いがないJava言語の汚点と言ってもよい部分です。なんで文字列の連結方法に複数のやり方を速度だけの理由で取捨選択させるというバッドノウハウなので、早くコンパイラ最適化して一元化くれることを望む部分です。

StringBufferかStringBuilderと書いていて、そういやスレッドに関しての質問がないのはどういうことなのかと感じました。JavaWeb系ってスレッド重要だと思うのですが。

JavaScriptHTML要素をid属性の指定により取得するメソッドは何ですか?(筆記解答)

もうjQueryDojoも使われるようになってきたからこれも知らなくてもいいんじゃないかと。id指定で取れるということとを知っておけば答えにはたどり着けるはず。バッドノウハウです。どうしてJavascript最近になって流行ってきたかを思い出して欲しいです。

プログラマーバッドノウハウの塊でなくてはならない、というのが見えてくる質問内容ですが、最近は覚えなければならないことが多く、技術更新スピードも早いので、あの質問のような重箱の隅まで暗記するようなことをしていては、重要な部分が抜け落ちているし、暗記の苦手な人は辛いと思います書籍ネットのような情報の蓄積と抽出する部分は充実してきたので、概念は知っておいて、実装手段はその都度調べるほうが効率的であるかと思います質問は、応用の効く根本的な部分を問う方がよかったです。

現実は、もっと凄惨世界を経て時代が進んでいくようだ。」などと締めくくっていますが、この人は凄惨世界が嫌なのでしょうか?不安を煽るだけで対策も講じていません。まず、質問の回答を書くだけでも、読んだ人の知識の底上げに貢献できると思うのが普通です。「これは基礎教育をやってれば当たり前」とか言ってドヤ顔して、できない人間馬鹿にしているだけに見えます本心では凄惨世界を望んでいるのでは?としか思えてなりません。

この記事を読んだことで、またSI業界から優秀な人が遠のくことでしょう。こんな人間が居る業界には居たくないと。

どうして悲しみを減らす方向に動いてくれないのかと…

※追記

頭沸騰しててスルーしてしまったのですが「淘汰」って書いてあったので、業界底上げは望んでないんだなあと、見当はずれなこと書いてしまったなあ、と、後悔した。

2013-01-23

http://anond.hatelabo.jp/20130123192717

✕ //そのまま比較しているわけでもstring比較しているわけでもないらしい

○ //そのまま比較しているわけでもstringキャストしているわけでもないらしい

どうも違うっぽいです

コメントありがとうございます元増田です。

一瞬そうかと思ったのですが、

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;

2013-01-20

ゴミ回収ドライバーが作るエロWebサービス

まったくの素人Nginx+Bootstrap+WordPressWebサービス作成しました。

影響を受けたサイト

オシャレエロサイト「h300」をリリースして、10PV/日を捌くためにやったこと

http://d.hatena.ne.jp/inouetakuya/20120410/1334058296

週6フリーターWEBサービス作ってみました。

http://anond.hatelabo.jp/20120914214121

はてブもっと快適に!「みんなのはてブ」を公開しました

http://anond.hatelabo.jp/20120930171125

--------------------------------------------------------------------------------------------------------

35歳 今は事務系の仕事をしてます。たまに運転。限りなくパートに近い労働条件ですが、

仕事がないよりはマシですので、続けているわけです。

前(5年ぐらい前)からWebサービスみたいなもの自分自身で作ることができたら楽しいだろうなぁと。

TwitterとかFacebookとか数回利用したことはあるけど、詳しいことはさっぱり。


朝6:00から夜18:00まで車を走らせてゴミ回収をしていた者です。

パッカー車って知ってますか。街でよく見かけるゴミ収集車のことです。

産業廃棄物というのでしょうか。スーパーとか

ドラッグストアとか回るんですよ。休憩時間は15分ぐらいなんですよ。一日。馬車馬のように働いていました。

そのパッカー車で物損事故を起こしてしまい、会社に居続けることはできなくなり仕事をやめました。

エロはもともと好きだったのですが、車を運転する以外の技術は持っていません。

何か手に技術を身につけたいと考えるようになりました。ただ30歳も過ぎたおっさんにあまり時間はないので、

資源の集中を意識時代の流れはパソコンだということで、始めたわけです。

はじめはHTML,CSSの本で基本的なホームページ制作を学ぶ。

HTMLが骨組みで、CSSが装飾みたいなイメージを持つ。

作成したエロサイト

エロックス

http://panpanwatch.net/

サイト構成

-----------------------------------------------------------

MySQL

Nginx+PHP-FPM proxy_cache

Bootstrap

Smarty

WordPress

PHP SimpleHTMLDOMParser

FeedWordPressを使ったエロブログ更新情報

-----------------------------------------------------------

Webサービスを作るにはプログラミング必要なことは知っていたけど、初めてみて暗号のように思える。

プログラミングの中でもPHPは簡単なのでしょうか?最近の流れからすると、Rubyなのでしょうけど、

習得しやすいと,聞いていたPHPを始めることに。

PHP自分の実現したいサービスが組み立てやすい気がします。

参考にした本

西沢直木のPHP Webアプリケーション スーパーサンプル

http://www.amazon.co.jp/gp/product/toc/479733245X/

手を動かしてプログラミング入力することは重要だと知る。

PHPだけでは動かなくてMYSQLとかデータベース勉強

PHPMYSQLの知識で就職できるのでしょうか?

小さいプログラムからテストテストを繰り返すことで、

foreachやif,forなどの基本的な使い方を身につける。

プログラムは結局小さいプログラムの集まりだとどこかに書いてあった。ことを思い出す。

PHPベタプログラムだどセキュリティ的に弱いということでPEARを使うように。

データベース接続MDB2
ページャーはPager
PHPテンプレートエンジンSmarty

ほかのプログラミング言語は知りませんが、PHPerというらしい。

プログラムに慣れてくるとPEARライブラリなどのクラスに抵抗がなくなってきた。

それでも、オブジェクト指向という考え方を体で理解するまで時間がかかる。

PHPについて参考にしたサイト

----------------------------------------------------------

http://php.xenophy.com/index.html

  • 組長的PHP入門

http://kumicyou.sakura.ne.jp/php/index.html

オブジェクト指向PHP入門講座

http://www.objective-php.net/

http://www.amazon.co.jp/gp/product/toc/479733245X/

http://www.amazon.co.jp/gp/product/toc/4797367571/

----------------------------------------------------------

PHP以外にも参考になったサイト

ドットインストール

http://dotinstall.com/

----------------------------------------------------------

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で時間を指定してファイル情報データベースへ投入。

これから欲しい情報は、著作権に気をつけながらスクレイピングして集めてくると楽しいなぁと思ってます

自分ホームページを公開するためにはサーバー必要なことは以前から知っていたのですが、具体的には手探り状態から

サーバーについて参考にしたサイト

CentOS自宅サーバー構築

http://centossrv.com/

サーバレンタルサーバとか専用サーバなどいろいろあるのですね。

全部自分管理しないといけないため、めんどくさい気がした。結局VPSサーバに。

エロサイトとは言え、web表示スピードにこだわりはじめる。

スピードアップのためにやったこと。データベースアプリケーションサーバを分ける。

データベース最適化、query_cache_sizeを設定したりなど。

参考にしたURL

自分WEBサービスを作りたいと思っている人へ

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 エンジンエックスというらしい。

NginxだけではPHPは動かない。php-fpmインストール

しかし、proxyサーバ設定がよくわからず。

Nginxについて参考にした記事

------------------------------------------------------------------------------------

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

------------------------------------------------------------------------------------

以上の記事でNginxproxyを設定することができ、とても参考になりました。

PHPで作られたCMSを知る。WordPress

どうにか既存サイトWordPressで作れないかと考えていたら、

WordPressは固定ページとブログ用のページを分けるテンプレート構造だと知る。

WordPressindex.phpファイル一枚あれば動くらしく、ページを表示する優先順位があるらしい。

        優先順位 高い          優先順位 低い

メインページ front-page.php → home.php  →  index.php

そのため、fromt-page.php自分で作ったSmartyをそのままコピペして,なんとか既存サイトWordPressをミックスさせることに。

詳しくは以下の本が参考になりました。

http://www.amazon.co.jp/gp/product/toc/479736758X/

WordPressプラグイン

FeedWordPress 登録したサイト更新情報表示

WordPress奥が深いです。

Twitter Bootstrapを知る。

スタイルシートなどを含めたデザインセンスがまったくなく、

途方にくれていたところ、CSSフレームワークTwitter Bootstrapを知る。

HTMLに少し手を加えるだけで今っぽいデザインにできる。その分、余った時間web構築に集中することができる。

エロサイト各ページについて

http://panpanwatch.net/douga.php

データベースに登録してある動画すべて。

http://panpanwatch.net/newdmm.php

DMM動画の当日配信が開始されたコンテンツDMMapiから収集。

http://panpanwatch.net/?page_id=5382

ネット上のエロ更新情報を収集して表示。メインはWordPressで構築。

--------------------------------------------------------------------

常日頃からネットエロにはお世話になっていたので、なんか恩返しではないですけど、

形にすることができて、自分自身では満足してます

Webサービス作るまで、ずっとパソコンの前ばかりにいたので、

少しパソコンから離れたい気持ちです。

01/22 追記。

こんにちは。みなさまからブクマコメントを多数いただき、ありがとうございます

いろいろご意見あると思いますが、大げさな嘘などは書いていないです。

PHPを理解するのも、こちらの本を一冊やれば、それなりに理解できるようになりました。

http://www.amazon.co.jp/gp/product/toc/479733245X/

次のサービス作成するときは本格的なアプリケーションソーシャルゲームなどやりたいなぁと

野望だけは持っています。ですけど、ずっとこのサイトだけに集中してきたので、今はパソコンから少しだけ距離を置くつもりです。

恐らくですけど、本物のプロの方から見れば、このサイトは大したことないでしょう。

素人趣味でやっているんだと温かく見守ってください。

2012-11-13

Python3でMeCab

python3.2にpythonバインディングを入れようとしても途中でエラーが出る

AttributeError: 'module' object has no attribute 'split'

setup.pyの中で使われているstring.splitがpython3.2では使えなくなってるからなので以下のように変更すればおk

setup.py

def cmd2(str):
    return string.split (cmd1(str))

を以下に変更

def cmd2(str):
    return cmd1(str).split()

これでいけます。困ってる人がいたら参考にしてください。

2012-08-13

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

1. 基礎
classの作成

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

public class Sample {

}
Mainメソッドの作成

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

public class Sample {

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

}
Console.WriteLineメソッド

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

Console.WriteLine( "Hello world" );
コメント

コメントです。

// 一行コメント

/*
   複数行コメント
 */
変数の宣言

変数の宣言です。変数の宣言時にはデータ型を指定します。

// 変数
int num;
データ型

データ型です。C#データ型には値型と参照型とがあります。以下は値型のデータ型です。

// int(整数)型
int num;
// char(文字)型
char c;
// float(単精度浮動小数点)型
float val;
// double(倍精度浮動小数点)型
double val;
// bool(論理)型
bool flag;
// DateTime(日付)型
DateTime date;

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

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

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

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

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

.net framework on Windows場合

Sample.exe

Mono.frameworkの場合

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

int、float、double型の変数に数値を代入できます。int型には整数だけ代入できます。float、double型には整数でも小数でも代入できます

int i = 2;
int i = 100000000;

float num = 1.234f;

double num = 1.234;
四則演算

四則演算です。

num = 1 + 1;
num = 1 - 1;
num = 1 * 2;
num = 1 / 2;

商の求め方です。割る数と割られる数が両方とも整数場合計算結果の小数点以下が切り捨てられます

num = 1 / 2;  // 0

割る数と割られる数のどちらかが小数場合計算結果の小数点以下が切り捨てられません。

num = 1.0 / 2;    // 0.5
num = 1 / 2.0;    // 0.5
num = 1.0 / 2.0;  // 0.5

余りの求め方です。

// 余り
mod = 4 % 2
インクリメントとデクリメント

インクリメントとデクリメントです。

// インクリメント
 ++i;

// デクリメント
 --i;
3. 文字列
文字列の表現

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

String str = "abc";
文字列操作

各種文字列操作です。

// 結合
String join = "aaa" + "bbb";

// 分割
String[] record = "aaa,bbb,ccc".Split( "," );

// 長さ
int length = "abcdef".Length();

// 切り出し
"abcd".Substring( 0, 2 )   // abc

// 検索
int result = "abcd".IndexOf( "cd" ) // 見つかった場合はその位置、見つからなかった場合は-1が返る
4. 配列
配列変数の宣言

配列です。

// 配列の宣言
int[] array;
配列の生成

配列の生成です。配列の生成時には要素数を指定するか、初期データを指定します。

int[] array;

// 要素数を指定して配列を生成
array = new int[5];

// 初期データを指定して配列を生成
array = new int[] { 1, 2, 3 };

// 宣言と同時に配列を生成
int[] array2 = new int[5];
配列の要素の参照と代入

配列の要素の参照と代入です。

// 要素の参照
array[0]
array[1]

// 要素の代入
array[0] = 1;
array[1] = 2;
配列の要素数

配列の要素数を取得するには以下のようにします。

array_num = array.Length;
配列のコピー

配列の要素を別の配列コピーするには以下のようにします。

int[] from = new int[] { 1, 2, 3 };
int[] to = new int[5];

from.CopyTo(to, 0);
5. 制御文
if文

if文です。

if ( 条件 )
{

}
if ~ else文

if ~ else文です。

if ( 条件 )
{

}
else
{

}
if ~ else if 文

if ~ else if文です。

if ( 条件 )
{

}
else if ( 条件 )
{

}
while文

while文です。

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

for文です。

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

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

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

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

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

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

    total = num1 + num2;

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

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

using System.IO;

以下がファイル入力の雛形になりますファイルオープンや読み込みに失敗した場合catch節に処理が移ります

String filename = "text.txt";
StreamReader reader = null;
try
{
    reader = new StreamReader(filename);

    String line;
    while ((line = reader.ReadLine()) != null)
    {

    }

}
catch (IOException e)
{
    // エラー処理:

}
finally
{
    if (reader != null)
    {
        try
        {
            reader.Close();
        }
        catch (IOException e) { }
    }
}

またはC#ではusing ステートメントと言うものがあり、この様にも書ける

String filename = "text.txt";
using (StreamReader reader = new StreamReader(filename))
{
    try
    {

        String line;
        while ((line = reader.ReadLine()) != null)
        {
            // 読み込んだ行を処理
        }

    }
    catch (IOException e)
    {
        // エラー処理:

    }
}

usingをつかうとCloseがなくなったことからわかるようにusing(){}を抜けるとき自動的にDisposeメソッドを呼び出し、オブジェクトを廃棄する。その分コードスッキリするが、使いにくい場面もあるので考えて使うこと。

以下がファイル出力の雛形になりますファイルオープンや書き込みに失敗した場合catch節に処理が移ります

String filename = "text.txt";
StreamWriter writer = null;

try
{
    writer = new StreamWriter(filename));

    writer.WriteLine("abc");
    writer.WriteLine("def");
    writer.WriteLine("fgh");

}
catch (IOException e)
{
    // エラー処理:

}
finally
{
    if (writer != null)
    {
        writer.Close();
    }
}

こちらもusingを使って書ける。が、割愛する。

知っておいたほうがよい文法

C#でよく出てくる知っておいたほうがよい文法の一覧です。

繰り返し文の途中で抜ける

繰り返し文の途中で抜けるにはbreak文を使用します。

for ( i = 0; i < 5; ++i ) {

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

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

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

for ( i = 0; i < 5; ++i ) {

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

}
例外処理

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

throw new Exception( "Error messsage" );

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

try {

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

} catch ( Exception e ) {

    // 例外発生時の処理

}

2012-06-15

http://anond.hatelabo.jp/20120615111615

スマートポインタは、ここで言われている アドレスの参照指定としてのポインタじゃないよ。単なるコンテナ名前ポインタってついてるからといって、いわゆるポインタじゃない。分類的にはコンテナ

 

const char *str = "hogehoge";

std::string str = "hogehoge";

std::tr1::smart_ptr<std::vectorchar> > hako(new std::vectorchar>);

の3種類があった時に string型も ポインタを代入しているが、 ポインタとは呼ばないだろ。コンテナと呼ぶ。

記法上 new を呼び出すが、 それが嫌なら、そういうコンストラクタ書いてもいいしな。

 

const char*なら

str++ とか str-- str+n という記法アドレス参照 ができるが

スマートポインタは そういう使い方はしない。 あくまでも指定されたオブジェクト管理するだけ。

たいていの使い方をする場合に、参照カウンタの増減なんて手動ではしないから。(というか、ポインタがわからない奴がするな コピコン使え という設計方針でいいとおもう)

そして、マーク&スイープはガベコレの技法からまして、自動でやるもので、たいていのプログラマーに書かせるものじゃない。

2011-07-16

[] Symbolについて

RubyのSymbolと文字列の違いを研究室輪講用に書いたのですが,折角なので公開したいと思います

元々学部生に対する輪講用に書いた物なので,若干上から目線ですがご了承ください.

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に対してrubyStringメソッドを使うなんてことは無いですよね.

なぜrubyにはSymbolが存在するのか

しかし,他の軽量言語ではSymbolなどなくHashのkeyとして普通に文字列を使うことが多いです.では,なぜrubyだけSymbolを使うのでしょうか.

その答えは一言でいうと,rubyの(プログラムコード上に直接書かれた,つまりリテラルの)文字列は他の言語と違いimmutable(不変)でない,からです.実際,pythonjavascript文字列(リテラル)は破壊的に変更することはできませんが,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だと定義もいりませんし,定数は大文字ですからつのが面倒ですし,あまりソース大文字が入ると見た目がすっきりしません(主観).

Symbolは非常に便利なものですので,その意義・用途を十分に理解して,Hashのkeyにとどまらず様々な所で使えるようになりましょう.

2011-05-30

http://anond.hatelabo.jp/20110530004826

Javaだけど。

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

typoバグの一種:p

2011-05-19

「これからの「パスワード」の話をしよう」のバグについて突っ込む

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

ここのロジックトレースしてみると

凡例

プレーンパスワードPASSWORD

ソルト:SSSSSSSS

トレース

最終的なハッシュパスワードが「XXXXXXXX」とする

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

プレーンパスワードループの外でハッシュ化し、

またソルトを毎回違う値にハッシュ変換することにより

元の文字列の推測を行いにくく修正した

2011-05-18

遺書の代わりのプレイリスト もしくは無人島に持っていくプレイリス

茉莉(昆蟲白)、Happy New-Yearが言いたくて(南野陽子)、一直到底(Nipples)、赤い戦車ヤプーズ)、南方蝶道(甜梅號)、

一個人的水道(甜梅號)、Air on the G stringBach)、春夏秋(チャットモンチー)、激光中(羅文)、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 songEGO-WRAPPIN')、

愛將(梅艷芳)、手のなるほうへ(チャットモンチー)、petsounds(the beach boys)、香格里拉(魏如萱)。

2011-03-03

ブログの問題を解いてみた

http://okajima.air-nifty.com/b/2011/01/2011-ffac.html

ぷよぷよを解く問題をやってみた

かかった時間はおおよそ1時間

途中でわからないところがあったのでくぐってしまった

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] = '*';
        }
    }
}

2011-02-25

if(string.Compare(hoge,hige)){}

if(hoge.CompareTo(hige)){}

こういうのってどっち使うべきなんでしょうか

そういうのをどういう基準で選ぶべきなんでしょうか

2011-02-17

http://anond.hatelabo.jp/20110216205420

Object.ToString();

Objectがnullだと例外発生

結果はそのクラスが持つToString()メソッドに応じる

Object as string;

キャスト出来ない場合はnullが返る

Objectキャスト出来る場合のみ実行したときに、nullかどうかで条件分岐させたり

(string)Object;

キャスト出来ない場合は例外発生

Objectが確実にキャスト出来るなら、asよりちょびっと速いか

2011-02-16

教えてC#

Object.ToString();

Object as string;

(string)Object;

型を変換する方法がいくつも用意されてるけど

どうやって使い分けたらいいの?

2011-02-09

JavaScript の内部関数が便利すぎる件

ちょっとした関数を作る時、一部処理が冗長だなと思っても、

わざわざ外に出して関数化するほどのことでもないよな、とか

この関数からしか呼ばないのに、並列に関数を置きたくないな、とか思うことがあるでしょう。

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 で一番好きなのはこの内部関数です

2011-01-15

12時間ほどでTwitter連携webサービスを作った記録

2010年年末から年始にかけて10連休ほどあったので、新しいサイトを作ろうと思い立った。

自分スペック

何を作るか

小遣いを稼げるサイトしたい、とまず思った。

月に1万円だと、毎日コーヒーを飲んでるだけでなくなってしまうので、コーヒー代くらい稼げたらうれしいなあ。じゃあどうする。何を作る?

ということで、まずTwitterを使ったものを作ることにした

テーマ

ひとつジャンルにしぼってツイートをかき集めれば、面白い流れになるんじゃないか。人が来るんじゃないか。そう思った。togetterたいな。で、ジャンルは、個人的に興味がある子育て。ていうか毎日帰宅してから朝まで子どもの寝かしつけや夜泣き対応サイト更新する暇も、俺が寝る暇もあんまりない。ので、手がかからないことが大前提。なんだったら自動更新でもいい。

自動更新かー。と思って「ブログ 自動更新」でググったら、wordpressRSSから更新するプラグインがあるらしいことを知った。はい決定。その瞬間、「TwitterAPIからRSSを引っ張ってwordpress投稿するサイト」に決まった。

やってみた

12時間は実装を初めてから時間になります

1時間

さくらインターネットスタンダードを申し込んだ。14日お試しがあるらしいけど、仮申し込みの時点で住所も入れてコンビニ請求にしたら、数日後に請求書が送られてきてビビった。(同時にドメインも申請しちゃった)

まあ、webで申し込んで、すぐにサーバコントロールパネルという画面に入れるようになった。「クイックインストール」というリンクがあったので見てみたらMovableTypeWordPress自動インストールしてくれるらしかったので、ボタンを押したインストールできましたというので発行されたURLクリックしたけど404だった。1時間くらい404で、その日はもう寝た。

2時間

次の日の夜。これはもう、10連休を利用して毎晩1時間ずつ捻出するしかない、さくらのお試し14日あるから約14時間で作りきるしかねえ、と思った。

サイトアクセスしたwordpressが入ったページが出てきた。おお、サイトができてる!

まずTwitterを調べるか、と思って、「Twitter API」で検索したけどOauth?とかいう面倒なことをしないといけないらしかったのでやめた。じゃあ普通に検索は?と思って「Twitter 検索」で検索したら、search.twitter.comの結果はjsonatomで取得できるし、APIコール制限もないらしいのでこれに決定。検索だけで1時間たった。

3時間

夜も更けて、続けて作業した。「wordpress xml 投稿」で検索していくつか探したらFeedWordpressというプラグインがあったので入れた。あ、事前知識としてMovableTypeでのブログはやったことがあったので、プラグインを入れるみたいな話はスムーズに進められた。

で、twitter検索結果をatomで返した結果を入れてみた。ら、本当に投稿されてた。よっしゃできた、と思った。1ツイートが1エントリになってたし、投稿者もツイートした人になってた。よかった。でも、満足できなかった。

4時間

次の日。同じことを自力でやる方法を探した。「wordpress xml 投稿」で検索して、XMLパースできるようになればいいんじゃないかと思い、simplepieというPHPライブラリにたどり着いた。が、PHPなんてまったく知らないし、憶える気もなかった。actionscriptで書かせてよ、とずっと思ってた。

5時間め・6時間

次の日。「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って馬鹿ねと思いながら寝た。

7時間

年があけて、3が日が終わりそうだった。年末にやってたこと(上記までのこと)を思い出しながら、XMLの必要な部分だけ抜き出す方法を模索したatomっていってもentryがたくさん入ってたか配列にするんだろうけど、ってんで「php foreach」を検索。なんとなくサンプルコードをまねしながら、記事タイトル、記事本文だけ取得した。あとはxmlrpcのサンプルにあわせて投稿するようにした。できた。寝た。

8時間

次の日の朝、ブログを見た。昨日更新したのしかあがってない。自動じゃねーじゃん。

で、「自動 投稿」で検索したら、クローン(cron)という仕組みを使わないといけないのだった。クローンサーバの仕組みらしく、そういえば俺はPHPをはじめDBサーバという単語を極力さけて仕事してきたので、もう気持ちが悪くなってきた。「さくらインターネット cron php」で検索して、なんとかやり方を見つけて、cronを登録した。(1時間に1回にした。設定は * * * 0)

9時間

仕事から帰ってきて、サイトを見ると、投稿が大量にたまっていた。やった!で、調子に乗ってツイッターアカウントを作った。なんだったらツイッター自動したかったので「twitter bot」で検索した。Easybotterというサンプルボットがあったので使わせてもらった。自動で一行ずつつぶやくようにした

時間外)

サイトテーマを考えてた。通勤電車で悶々とする時間

ツイートを集めることは成功したけど(毎時間100件のツイートを1エントリとして投稿してる)、それを眺めて面白いんだろうか? ボットを動かしてるけど人がくるんだろうか?

そんなとき「trivist」がはてブに載ってた。なんかにたものを感じた。やっぱツイートを引っ張ってきて投稿するサイトはアリなのか?アリなはずだ!

10時間

サイトの体裁を整えた

11時間

trivistをまねて、記事を評価(はてなスターかいいねボタンかにいもの)する仕組みが欲しくなった。「wordpress 評価 プラグイン」で「wp-postratings」というプラグイン発見して、入れてみた。どうやら1エントリーに1評価しかできないらしい。俺のサイトは1エントリーに100ツイートあるから、どのツイートを評価するのかが分からない。

いったん、wordpressの全投稿を削除した。で、cron に登録されてるPHPを、1記事に1エントリーした

12時間

エントリー投稿するついでに、Yahoo日本語解析APIをつかってツイートを分析して、名詞動詞だけを取り出そうと思った。それをタグにすれば、タグクラウドが作れると思った。はてブはずっとずっと昔からやってるからYahoo日本語解析っていうのが2006年くらいに流行ったことをなぜか憶えてたので、やってみた。できた。

なんか俺、PHP書くのが早くなってね?

そして微調整をしながら今に至る

アクセス解析を入れてみた。サイトに来てる人は、俺だけだった。

どうにかして人を増やしたい。サイト広告募集はする気がないしベタベタバナーを貼りたくなかった。みんなが気軽に見に来て、軽い気持ちで評価してくれて、更新を楽しみにしてくれるサイトしたかった。コミュニティサイトじゃないけど、やっぱりサイトコミュニケーション設計をしないと意味がないんじゃないか、見てくれるユーザはどうやったら楽しいんだろう、ということを考え続けて10日ほど経った。Twitter経由で来てくれた人が3人ほどいるようだけど、何がダメなのか分からないので増田にお願い。


ここまで書いて教えてくんじゃねーか、と思われるかもしれないが、ググレカス的な検索は上記で書いたみたいにいろいろやってきた。でも、サイトを作ってみてはじめて、ユーザに向けたサイトってどう作ればいいのかが分からないということに気づいた。

小遣い稼ぎもしたいんだけど、面白いサイトを作るヒントがほしいと思った。

kanzen21やtrivistみたいに、俺も過程を全部さらしたから辛辣意見を求む。そしてはてブされるのを待ってます

http://kosodate-now.com/

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