配列置換問題へのトラックバックありがとうございました!

  • 2009/02/10(火) 00:00:00

祝電

にぽたんさん、お誕生日おめでとうございました(・∀・)



配列置換の答えはひとつじゃないーの巻

配列の先頭はそのままに、先頭以外の要素をすべて0に置き換える。

初心者向けPHP練習問題リンク+学習ログ

先日のエントリ内で紹介した 「配列いじり」 について、”自分ならこう書く” というトラバをいただきました!
すごく嬉しい。ありがとうございますっ!!


$len = count($num);
$new_num = array_fill(0, $len - 1, 0);
array_unshift($new_num, $num[0]);

配列numの要素数を調べて、そこから-1した数だけ0で埋めた配列を作り、
配列numの先頭の要素をarray_unshiftで配列new_numの先頭に追加すれば完成。

配列の先頭以外の要素を0に置き換え - 243 inari 様

そうか、そういう考え方もあるのか。エンジニアの数だけ発想があるんだなぁ。
というのは言いすぎかもしれないけどw なんというか、純粋に面白いと思った。


$after = array_pad(array($before[0]), count($before), 0);

問題の意図は、「配列内の数字がどんな値であっても先頭の数値以外はすべて0にする」
ってことだと思いますよ。

「配列いじり」のコマンドライン版を作ってみた - 積み重ねた日々 様

array_pad!なんとビンゴの関数が!!
最初にトラバくれた ilo さんも、追記で「array_padの方がわかりやすいな〜」と書いていた。
そして、我らが(?)ギークなバスケットマンも array_pad を使っている。


$after = array_pad( array($num[0]), count($num), 0);

マニュアルをよく見ると適した関数とか見つかっていいよね。
array_padとか覚えておく類の関数じゃないしね・・。

人のコードを見ることは大事だよね - ito.tetsunosuke/notebook 様

?な!array_pad は覚えておく関数じゃないのか!
必要なときにマニュアルで検索すればおk、ってことか。マニュアルと仲良くしよう。


@(error surpression)はあんまり推奨しないかなあって感じ。
何より、@fileとかで開けなかった場合の後の処理を考慮していないのがいまいち。


エラーを無視するエラー制御演算子を多用するのはイクナイとのご指摘。
ふむ。どこでエラーが発生したか分からなくなるから気をつけろ!と、Saity先生が言ってた気がする。
# 違うサイトだったかも、ここでそう読んだ気がするが自信無い。


3人が使っている implodejoinimplode()関数のエイリアス)。
最初、「え!逆じゃない? implode(連結文字列,配列要素) なのでは!?」とテンパったが、
マニュアルをよく見たら注意書きがあった。

注意: implode()は、歴史的な理由により、引数をどちら の順番でも受けつけることが可能です。

PHP:implode - Manual

ブラウザで両方試してみたら、確かにどちらを先にしても結果は同じ。そうかー。そうなのかー。



あ。カテゴリが [コメント欄より] になってるけど気にしないでくださいね!
[コメント・トラバより]に変えようかな・・・ううむ。


LINEで送る

JavaScriptを知らない私がはまちちゃんのコードを解読してみる

  • 2008/11/15(土) 00:00:00

ぼくならこういう実装にするかな
javascript:alert(((((prompt('1-9の好きな数字をいれてね')*2+5)*50)+((new Date).getFullYear()-((prompt('今年の誕生日ってもう過ぎてたっけ?(y/n)')=='y'?0:1)+249))-(prompt('西暦何年うまれ?')))+'').substr(1))

Hamachiya2 - 「年齢は3行で割り出せるぞ!」のコメント欄より

(カッコ)が多すぎて目が死ぬ!マトリョーシカかよ!!!うっうっ・・・。
このままだとさっぱり分からないので、(カッコ)を色分けして縦に書いてみた。
邪道ぽいけど、私はこの方が分かりやすい。


javascript:alert

(
( (

(

(prompt
('1-9の好きな数字をいれてね')*2+5)

*50)

+

(


(new Date) . getFullYear() -

(

(prompt
('今年の誕生日ってもう過ぎてたっけ?(y/n)') =='y'?0:1)

+249)


)

-

(prompt
('西暦何年うまれ?') )

)
+'' ) .substr(1) )



さて、どこから手を付ければ良いものやら(;^ω^)
途方に暮れたが、ふと思い出した。

これ、[カッコ] が二重になってる。意味不明。
でもココは先週あきやんに聞いたの!
えとね、プログラミング言語っていうのはみんなそうらしいんだけど、
こういう場合は ”内側から評価” するらしい。

4日目 おみくじとか作っちゃうかモナー!

確かあのとき、あきやんは「プログラミングやってる人なら分かるんだけど」と言っていた気がする。
だからきっと javascript も内側から評価するはず。よし!出来る気がしてきた!


javascript:alert

ブラウザのアドレスバー(普段URLを入れたりURLが表示されたりしてるところ)に
javascript:alert(計算式); と打ち込んでみましょう。

[javascript]alertを活用する

ぉお!アドレスバーに直接これを打ち込むのか!
.js で保存してしまった。恥。


prompt()

promptメソッドは、指定したウィンドウに文字ダイアログを表示します。
window.prompt("ダイアログに表示される文字列","入力欄の初期値")と指定します。

JavaScriptリファレンス

だからウィンドウで「1-9の好きな数字をいれてね」と出てくるのか。
確かむかぁぁーしちょっとだけかじった javascript 入門書に、window は省略可能と書いてあった気がする・・・
と思って探してみたらやっぱりあった!

windowオブジェクトはブラウザのウィンドウそのものを指します。
わかりきっていることだから「暗黙の了解」ということで、
省略してもかまわないということなのです。

3ステップで覚えるJavaScript―こうすれば自分で書ける・作れる!


はっ、そうか。
いま入力欄の初期値がundefinedって入ってるんだけど、これは指定してないからなのか。

(prompt('1-9の好きな数字をいれてね','')*2+5)

こうするとブランクになる。なるほど感動した!
たぶんこれ常識なんだろうけど、私にとっては感動的なのだ><


*2+5)*50) は計算してるのかな。
算術演算子 - JavaScriptの演算子

そのあとの+ は、足し算じゃなくて文字列結合だろうか。
文字列結合演算子 - JavaScriptの演算子


(new Date) . getFullYear()
document.write((new Date).getFullYear()+"年")
現在の西暦を書き出す。

getFullYear()

現在の西暦を取得して、ここから何かを引くらしい。


(prompt ('今年の誕生日ってもう過ぎてたっけ?(y/n)') =='y'?0:1)

この一行の 'y'?0:1 が一番分からなかった><


== っていうのは、代入とは違う。
なんていうか、文字通りイコール。今度は本気のイコール。超イコール。だから2回書く。

5日目 もし私が女子高生だったら

javascriptの == もひょっとして超イコールか!?と思ったらやぱりそうだった!
比較演算子 - JavaScriptの演算子


「今年の誕生日ってもう過ぎてたっけ?」の答えがyesだったら、yだったら・・・なんなのさヽ(‘Д´)ノ
一瞬あきらめかけたんだけど、↑のページの一番下に希望を見た。

< 代入変数 > = < 条件式 > ? < 真 > : < 偽 > ;
条件演算子 - JavaScriptの演算子

む。条件演算子?

◆ exp1 ? exp2 : exp3 (e3/N2)
exp1 が真であれば exp2 を、さもなくば exp3 を返します。

演算子

とゆことは、「今年の誕生日ってもう過ぎてたっけ?」に対する答えが y だったら0,そうじゃなかったら1を返すってことか。


substr(1)
string の from 番目から len 文字分(最初の文字を 0 番目とする)の文字列を返します。
len を省略すると残りのすべてを返します。

文字列(String)

おおおおおおお!!!!!!
このスクリプト最大のなぞが!!!とけた!!!!!!!!!!!

や、最初に「1-9の好きな数字をいれてね」と言われて入力したのはどこに行っちゃったのかなあと。
あれはなんの意味があるんだろーって、いろいろな数字で試したけど結果は変わらず。
特に意味のない質問だったとしても、数字を入力したことは意味を持つ。
はまちちゃんの茶目っ気さ☆というニュアンスを、プログラムが組んでくれるはずがない><

そーかそーか、1番目の数字から残りすべてを返せ、と指定してるから、
0番目にあたる最初の質問の答えは表示されないのか!
すげー!すげーーー!!今年いちばん感動した!!!
しかし *2+5)*50 はなんだろう・・・うーむ。。。



冒頭のコードに数字を当てはめてみよう。
1979年11月12日生まれのござ先輩の場合でやってみる。
好きな数字には 9 を入力。

{ (9×2+5)×50 } + 2008 − 249 − 1979

答えは 930。substr(1) で 1 文字目から表示しろと指定してるので、30と出る。


あれ、ござ先輩って実はミソジー?


LINEで送る

コメント欄より - 君の瞳にクロスサイトスクリプティング

  • 2007/11/15(木) 23:00:00

日記

ボジョレ・ヌーボー(笑) 飲んだ!
南青山(笑) にある隠れ家(笑) っぽいイタリアンレストラン(笑) で!
シェフの気まぐれサラダ(笑) とかゴルゴンゾーラチーズのペンネ(笑) とか食べた!

以上、スイーツプロトコル。
こうですか?分かりません><

一緒に飲んでた人が帰りにコンビニで体温計買ってた。
「なんか熱っぽいんだよね」ってそれ多分ワインのせい/(^o^)\
コンビニで体温計買う人はじめて見た。
「日記に書くよ!」って言ったら 「領収書いる?」 と食いついてきてすごく嬉しそうだった。
日記のネタにしたからって領収書で落とせないよ!やっぱ熱測った方がいいかも><





クロスサイトスクリプティング脆弱性

コメントくださった方、ありがとうございます!



参考:input.php

POSTの方にクロスサイトスクリプティング脆弱性ができそうな予感がします。
保存していないので良いかもしれませんが、
勉強のために対応しておいたらいいのではないでしょうか?
名前のところに<script>alert("hoge")</script>を入力すると確認できます。



ぎゃあ!すみません、いま参考書見たら COLUMN の欄にその旨記載してありました><

えぇと、紅は参考書を見ながら勉強を進めてるんですが、
一応なにを使ってるか紹介しておきますね。
10日でおぼえようとした出来心は見逃してください。
けんすう先生も持ってるって言ってた! と巻き添えにしとこ。






で、この本にクロスサイトスクリプティングについての記載があったので
以下、一部引用します。


厳密には、本サンプルにはセキュリティ・ホールが潜んでいます。
というのも、ユーザが入力データに<script>のようなタグを指定した場合、
これがそのまま表示(実行)されるため第3者が任意のスクリプトを実行できてしまうのです。
(このような脆弱性を「クロスサイト・スクリプティング」と言います)。
これを防ぐためには、あらかじめリクエスト情報に含まれるタグを取り除く必要があります。
本レッスンでは詳述しませんが、本文のコードならば、以下のように書き換えればOKです。

こんにちは、<?php print(htmlspecialchars
($_POST['name'])); ?>さん!




了解。書き換えてみた。
サンプル:input_2.php


これでいいんだろか。
ちょっと、もう1回ソースを見てみよう。

※タグの最初は全角にしてあります。


<html>
<head><title>フォーム情報を取得する(対応後)</title></head>
<body>
こんにちは、<?php print(htmlspecialchars
($_POST['name'])); ?>さん!
</body>
</html>



んー。
htmlspecialchars ←コレ誰?
なんとなく言いたいことは分かるような気もするけど、
グーグルならもっとよく知ってる気がするのでグーグる。


参考:htmlspecialchars (以下一部引用)

htmlspecialchars - 特殊文字を HTML エンティティに変換する

この関数は、掲示板やゲストブックなどでユーザが書きこんだテキストから
HTML のマークアップ用文字を取り除く場合に有用です。




ちょっと分かってきた。
さらにグーグる。



参考:HTML文字のエスケープ (以下一部引用)

htmlspecialchars()には$_POST['textbox']を引数に指定して、
タグなどの変換をしてもらってから表示してます。
試してみると分かりますが、HTMLタグを入力して送信しても<と>に変換してから
出力するので、HTMLタグはちゃんと表示されるわスクリプトは無害になるわで
めでたしめでたしです。




けっこう分かってきた。
今はこのくらいの理解でもいいかなと思ってる。参考書もそうだけど、とりあえずざっくり行く。
経験上、完璧を求めると挫折するので、最初はツメが甘くてもいいかなーと。
ぬり絵のイメージだ。
線からはみ出さないように丁寧にぬってると全体像のイメージがなかなか湧いてこない。
とりあえずざぁっと色入れて、細かいとこはのちのち塗りつぶす。
PHPはホント、全体像の見当もつかないしなぁ。相手のイメージが湧かないのはしんどい。
なので、モチベーション上げるためにも、”いい意味で” 適当に進めようかなと思っちょるの!
参考書は何度でも読める。
それと、ギークに脆弱性を指摘されたいという気持ちもちょこっとある。あるのか?あるアル。





とゆことで。
気分転換にぬり絵した。

 


紅んち!マジで!クーピーとか超・充実してるカラ!!!
そしてドラゴンボールで復習。
サンプル:input_nurie.php



はっ。拡張子の話をしてない。
.htaccessの話はこの前あきやんにちょこっと聞いた気がする。
正直あまりよく分からなかった。これはもうちょっとツメとこう。


LINEで送る

コメント欄より - ”++” は ”イイ!” のサイン

  • 2007/11/06(火) 23:00:00

日記

  ハローハロー!ギークな私が来ましたよ。


  今日はメキシカンなお店でメキシカン料理を食べたよ。
  酔ぱらっているよ。メキシカっていい国だね!
  いい国つくろうメキシカ幕府!!


  ランチはけんすうと一緒にこんなの食べたよ。
  写メ撮ろうとしたら 「セッシャの方がいいよ!」 って何回も言うから、
  てっきり 「拙者の方がいいよ!」 というアピールと勘違いして、
  けんすう頭おかしくなったのかと思った。
  ”接写” のことだったぽいです。先に言え!クリアに言え!変換してから言え!!
  ブログでランチの話をするようになったら一人前だってスイーツ脳が言ってた。
  紅はスイーツよりギークが好きです。←結論!
  週末はどうよ?で思い出したけど、次回の講義は週末なの。
  だから平日は地道に自習する。




(id:lovecall)++とは

  コメントくださった方、ありがとうございます!


> Tom.H 様

++=イイ!
--=ちょっと・・・やっぱPerlでしょw的な。

  そぉか!感覚で理解した!!

  ++ = (・∀・)ィィ!!
  -- = (・A・)イクナイ!

  というのがギーク語ですね?


  + は2回しか使えないのかな。
  + 5つでアイシテルのサインだってドリカムが言ってた。気がする。自信はない。




  真顔で言うけど完全に酔っ払っている。
  けんすうに 「気軽に更新しる!」 とアドバイスされたので更新してみた。
  寝る。 print("おやすみなさい"); ←予習したヾ(゚∀゚*)ノ
LINEで送る

コメント欄より - 早速ギークに脆弱性を突かれた件!!!

  • 2007/11/04(日) 21:45:58

日記
  素敵なニートの男性からお誕生日プレゼントでワインが届いたよ!
  紅の生まれ故郷で造ってる赤ワイン!
  旅の途中で個人の酒造に立ち寄ったらビバ美味しかったんだって!wktk゚+.ヾ(0゚・∀・)ノ゚+.゚
  2本いただいたので、1本は次回の講義のあとでけんすうと飲もう。そうしよう。
  もう1本は1人占めしよう。なぜなら赤ワインが大好きだから。ギークの次にね>w<


  コメント欄でギークからたくさんフィードバックをもらったよ!
  まずはこの場を借りてお礼。ありがとうございました!!
  好きです。もっと突いてください。性的な意味で。間違った。ほんきにしないでね。




POSTは封書、GETは葉書


POSTとかGETは見たい奴がサーバに送ってくれるおてがみ(phpタンへの指示)
POST→封書
GET→はがき
はがきだと文字数が限られるし、裏を見れば中身がすぐ見れる。
封書だと見られないと思いきや、悪い郵便やさんが、封を開けて中見て
また封しちゃえば...
だから、パスワードとか電話番号は、httpsっていう鍵付きトランクに入れたほうが良いよ。

個人的に、この説明が非常に分かりやすかったです。
エロゲ風コンパイルについては後日言及しますが、比喩が本当にお上手です嫉妬><
て様、ありがとうございます。





POST で渡したとしてもパケットには平文でデータが入ってるので、
経路上のどこかで盗聴を受けた場合にはなす術なく情報が読み取られて
しまいます。
mixi のログイン情報くらいならそう大した使い道もないでしょうからあまり
神経質になる必要はないかもしれませんが、ショッピングやバンキングのような
クリティカルなシーンでは暗号化によって安全性を確保すべきです。
(実際には mixi にも SSL でのログインフォームがあるようです。)


mixiを使用する上で守りたいのがログインのためのパスワードではなく
mixiに保存されている情報にあるのだとすれば、セキュリティを確保する
ためにはすべての通信をhttpsで暗号化する必要があります。
ログイン時だけhttpsを用意してセキュリティはばっちりですとかいってる奴は
バッタです。

あ、https のページ!
戻るボタン押すとエラーが出るページ!守られてる感ありますの。
確かに買い物かごに入れたり個人情報を入力する時は https ってなってるなってる。
ああいう大事なデータは POST で渡しちゃまずいのですね。
&玄関だけhttpsでも、お部屋の窓に鍵がかかってないと悪い人に覗かれるということですね!
わぁい!ひとつ賢くなった♪
- 様ありがとうございます。





GET/POSTの違いは、その名の通り、データを取得するか、送るかの違いです。
ログインなんかは、アカウント名とパスワードを送るのでPOST。
グーグルの検索なんかは、キーワードなんかから検索したデータを取ってくるのでGET。

肝心なことを失念してました。
名前の意味をぜんぜん考えてなかった><
そか、知りたいキーワードを渡して結果をGETするからGET?
メールや掲示板みたいに、こちらがデータを投函するからPOST?
ってことかな、微妙に自信ないけど・・・。
masuidrive様、ありがとうございます。





正しくはクロスサイトスクリプティング

  「君のひとみにクロスサイトスクリプション!」というイラストの件。
  けんすう先生がレスしてくださったけど、クロスサイトスクリプティングの間違いですね^^^^
  間違ってるのに胸キュンしたあの日の純情を返して欲しい。紅としたことが不覚。
  これは以前、価格コムが不正アクセスされたアレかな?
  と思ったら違ってた。アレはSQLインジェクションというのですね。
  次回は 「君のひとみにSQLインジェクション!」 でお願いします。 >けんすう





ところで

  紅が憧れるギークが憧れるギーク(くどい)、dankogai様から、はてなブックマークで
  こんなコメントをいただきました。


ギークもお姉さんも大好き。(id:lovecall)++。でもPHP--


以下Skypeログ

べにぢょの発言: (id:lovecall)++。←これなに? ぷらすぷらす みたいの


けんすうの発言: インクリメント演算子といった気がする


べにぢょの発言: danさんのコメントの++はどゆう意味なのかな


けんすうの発言: うーん、インクリメントしかわからないな><


けんすうの発言: The Perl5 Manual - インクリメントとデクリメント
           マジカルインクリメントとなるものが!



べにぢょの発言: マジカル!なにそのネーミングふざけてるの!!


けんすうの発言: ご、ごめん! かわいいよね


けんすうの発言: 私、ちょっと今日はマジカルインクリメントな髪型にしてきたの
           みたいな感じがする



べにぢょの発言: 可愛くなれる魔法の呪文みたいです!


べにぢょの発言: マジカルインクリマジカルインクリ♪素敵なギークになぁれ♪みたいな!!!


けんすうの発言: おお それいいな


べにぢょの発言: きっとdanさんが言いたかったのはそういうことだと思う





何か違う気がする。ちょっぴり気になる気。


LINEで送る