はてなキーワード: 標準出力とは
契約書袋綴じを指示されて和書の袋綴じをして怒られたって棘がバズってるけど
https://b.hatena.ne.jp/entry/s/togetter.com/li/2205369
いや、元々契約書の綴じ方も和綴じの袋綴じをしていて今でもやる場合があるのだ。そして昭和の契約書やら判決文、戸籍謄本などの法的文書は和綴じの方の袋綴じがされている。
そもそも現代の契約書の綴じ方には「袋」になっているところがない。なのに袋綴じと言われるのは和綴じから変わったからなのだ。
なんで平成中期というか1990年代前半に替ったかというと、コンピュータの出力法が変わったせいなのだ。
契約書などには割り印をする。ページの差し替えをされない為だ。そして契約時点で書面の内容に異存なしという意味で双方のハンコをページにまたがる形で押す。また背表紙の封紙と表紙にも割り印をする。
ページの割り印の仕方は、上の余白で折って隣のページとまたがる様に押印する。
でもこれちょっと無理やりだと思わない?
実は1990年代までは今のように両面印刷して製本するのではなく、原稿用紙のような升目用紙(内容証明用紙のようなの)に手書きで書き、それを半分に折って重ね袋綴じしていた。綴じるのに使うのは布の「こより」で、千枚通しで穴を開けてから紐を通す。河野太郎が廃止させたやつだね。だから千枚通しはオフィス用品だったのだ。
そして袋綴じされた紙を膨らませて片側のページを山型に折ってそこに割り印をしていた。
「ワープロ」を使うようになっても同じ。片面印刷して袋綴じにして割り印をする。
なんでパソコンじゃなくてワープロなのか?これは後で説明する。
戸籍謄本などはやはり手書きで同じように袋綴じされて割り印され渡された。
そもそも「謄本」と云う言い方をするのは、昔はコピーが無かった(青焼きはあるがコストが高くナンセンス)ので手写しであり、書面の中身を全部写したのが謄本で、労力が大変なので必要な部分だけ写したのが「抄本」だった為だ。今でも閉鎖謄本/抄本を請求するとこの形式で出てくる(流石にコピーを使うが)。そして和綴じ式の袋綴じで割り印されている場合がある。
こより綴じの方は昭和後期には省略されてホチキスになり、これは市役所や弁護士が先行したようだ。だが契約書類はこよりorこより+封紙+割り印が使用されていた。
コンピュータで印刷するというのは今では当たり前で、印刷するのは白いオフィス用紙で、一枚ずつ印刷される。
だが嘗てはコンピュータで使われるプリンタはラインプリンタが主流だった。ページプリンタはDTPなど特殊分野でのみ使用され、一般的なOA機器メーカーはラインプリンタしか製造していなかった。
ラインプリンタの用紙というのは、両側に穴が沢山開いてて薄緑などで罫線が引かれていて、ミシン目が入ってて切り取りが出来る連続用紙の事である。
ラインプリンタの場合、印刷の区切りが一行づつになっていて、プリンタに印刷指示が送られるとそのテキストを印刷して改行の必要がある場合は改行しそこで終了する。ミシン目まで行送りするという事は無い。
だから票として一枚ずつ切り離す場合は、ミシン目が来るところまで行送りを行って停止するという印刷指示を組んでおく。
また、嘗ての標準出力の延長でもあるのでコマンドラインとの相性も良く、リダイレクトやパイプ(|)でデバイスファイル(lp、PRN)にテキストを流すとそれが印刷されるという簡単さであった。
ラインプリンタはページプリンタに押されて無くなったかに見えるが、実はPC POSで印刷されるレシートはラインプリンタの生き残りだ。
プリンタの印刷方法はインクをしみ込ませたインクリボンを活字で叩くというのが主流で、日本語圏だと沢山のピンを弾いて打つ、ドットマトリックス方式が主流だった。これだと一字のドット数が16*16くらいが限界なので、細かい漢字は打てない。
だからカタカナ+数字しか出力されない伝票などの使用が主で、ページプリンタは普及しなかった。
一方、ワープロ専用機は最初からサーマルプリンタを備えていてページプリントが前提であった。だから普段のオフィス業務はコンピュータ+ドットマトリクス、文書の清書はワープロというのが一般的だった。
これで法的文書もワープロで作成し、縦書きで出力して手書きと同じ袋綴じにするというのが増えてきた。
今でも弁護士の文書で表題に倍角文字が使われたりするのもこの名残だ。
これがWindows95が普及するとページプリンタの普及も進み、イントラネットに接続される複合機が普及するなどで印刷=ページプリントとなったのだ。そしてやがて法的書類も両面印刷して製本するという形になった。
その時に本来の袋が出来る袋綴じは過去のものとなって袋が無いのに袋綴じと言われるようになった。故に今の袋綴じ方が当たり前になったのは20年位かと思われる。
因みにワープロより早くから、またワープロと平行する形で和文タイプというのがあり、これで升目用紙に、または白紙に升目用紙と同じ字の間隔で印刷するという方法もあったのだが、和文タイプというのはとても時間が掛かった。
この人は流石に遅過ぎなのだが、タイプするのが超絶大変な代物で、行政書士、弁護士など気合が入った士業と法務局、裁判所など気合が入った役所、気合が入った大企業の契約書など、兎に角気合が相当入ってないと使われない清書用アイテムだった。ある意味、100kgぐらいの巨大複合機より気合がある。
というわけで袋の部分が無いのに袋綴じという謎かけみたいな名前の背景にはオフィス史とコンピュータのプリンター史が隠れていたのであります。
昭和日本ではオフィス用紙も法的文書も原稿用紙も、B5だった。ずっとA4より小さい。会社でも役所でも裁判所の判決文でも全てB5だ。
だが1990年頃に役所関係の書類をA4にするというお触れが出た。これは国際化の一環で、ISOに定めれているのはA列だけでB列は日本独自規格。困ったことに当時一番の貿易相手国だったアメリカはアメリカンレターサイズをN倍したANSIという独自規格なのだが(またですか)、まぁレターサイズはA4に近いしA4を標準化すれば万事うまくいくでしょとの見込みだ。
これに数年遅れで企業も倣ったのでB5というのはパージされることになった。
世の中全部B5からA4に変わったのに、大学ノートだけはB5が主流のままだ。あれは何でなんでしょね?小さいと使いにくいのに。
今はオフィス用紙として白くてある程度の厚みがあるものが使われているが、これはコンピュータ印刷が一般化するまではとても薄いペラペラでテカテカつるつるしている紙が使われ、これが「公的な場所で使う」紙だった。
先述の手書き&ワープロの升目用紙も全てこの極薄+つるつるの紙である。両面印刷して製本されなかったのもこれが理由の一つだろう。
これは「カレンダー紙」で、紙を押しつぶす鉄製のカレンダーロールの間を極圧で通して押しつぶし、薄くする。
トレーシングペーパーやクッキングペーパーと同じだ。
また、請求書類の封筒は中の請求書の名前住所が見えてあて名書きを省略してあるが、あの透けた部分が透明ビニルじゃなくて透けた紙である場合もある。この透ける紙もカレンダー紙だ。
公的書類でカレンダー紙が使わるようになった理由だが、増田は羊皮紙の代替ではないかと考えている。羊皮紙は中世の欧州から使われていた「紙」で、羊やその他の皮膚の薄い動物の皮を剥ぎ、石灰水で皮下脂肪を除去して薄く削いで引っ張り、紙のようにした。 https://w.wiki/7FnV
鞣しをしないのがポイント。これは高額なので貴族の手紙や証文、聖書の写本など「公的」な書面に使われた。
これの代替の紙としてカレンダー紙が使われ、それが「高級紙」として日本に輸入されて、ペラペラなカレンダー紙を契約書や判決文に使うようになったのではないか?と推測している。
こういう訳で、昔の契約書やら公的書類などはやたら薄いのが特徴だ。破れそうで怖いのだが、そっとめくるだけなら破れない。
なお、トレーシングペーパーやクッキングシートは長期間放置するとバラバラに崩壊してしまう。これは硫酸で晒しをする為に酸性になっているからで、昔のペラペラ重要書類はそうはならないので、硫酸晒しをやってないのではないかと考えられる。
口癖は「あーそういうこと!」
普通の人なら脳みその理解が追いついて初めて使う言葉だろ。聞いたことを脳みそで理解する前に「あーそういうこと!」って言っている。
適当なはったりかましても同じように言うし、「そういうこと」なんだろうなあ。
ヤツができもしない仕事をできると言って受けて3週間進捗0だった状況から結局ワイがやることになって着手から1日未満で終わった。
スクリプト書けないなら書けないって言えよ。
標準出力無加工でリダイレクトする1行書いただけで仕事した気になってるんじゃねえよ。
あーそうよな。知らないことを知ってるって言うやつはできないことをできるって言うんだよな。
しんどい。
ヤツが「あーそういうこと!」って言う度に心が荒む。一挙手一投足にイライラする。ムカつく。
そしてしったかぶりする同僚は、自分より更に仕事できない人間に偉そうにしている。
「分からないことは分からないって言ってもらっていいですか?」
とかどの口が言ってるんだ。お前の口縫うぞ。
あー嫌い。
結構多くのWEBサーバのアクセス制限で.co.jp .ne.jp .jpがdeny設定されていたって話である。
https://b.hatena.ne.jp/entry/s/twitter.com/kanose/status/1601270223386324992
個人のネット利用で大きな転換点は2005年くらいで、例えばブログのはしりのはてなダイアリーサービス開始は2003年でアルファブロガー選考開始は2004年、youtubeサービスインが2005年だが、これらの特徴は「アカウントをとって企業のWEBサービスを利用する」という、今では当たり前の方法だ。
だがこの以前にはそういう方式のものは少なく、ISPや借りたレンタルサーバに自分でコンテンツをアップロードして構築するというのが主流だった。
これは内部的にはLINUXサーバ制限アカウントを貰ってユーザーディレクトリの/WWWにファイルを置くという事やね。
だから最初のうちは個人サイトのURLは「http://www.yourisp.co.jp/~aybabtu」って感じだった。~はUNIXのユーザーホームディレクトリを示すのね。やがてバーチャルドメインに対応するサーバ会社が増えてhttp://www.aybabtu.rentarusabaa.comみたいな今では当たり前のURLになったんだが、最初はバーチャルドメイン設定は有料だった。
MS Officeには「パブリッシュ」ボタンがあってそれを押すと編集してるファイル群の構造のまま指定したサーバにFTPでファイル送るみたいな機能もあった。(だがこれはShift-JISでUpするというクソ仕様で後に読めなくなるのだった)
httpの頭のHTはハイパーテキストで、参照箇所にはリンクが設定できて参照元にジャンプ(これも死語だ)できる電子文書なわけで、まさに公開はパブシュッシュ=出版なわけだ。今もサブスクリプション=新聞雑誌の定期購読というのはこの建付けが残ってるからだ。
ISPやWEBレンサバにはユーザー権限の多寡で違いがあって、ユーザに実行権限も付与してperlなどのインタープリタを構築しておくと、テキストであってもファイル先頭にインタープリタへのパスを書いておくとそれが実行され、標準出力をhttpで返す。これがCGIで、ISP供与で多いHTMLファイルの公開だけの権限制限されたサーバに不満な層は「CGI実行可」のレンサバ屋に移っていった。
但しプログラムであるから、いい加減に書いてループ参照とか起こすとサーバのCPUやメモリを喰いつくしてサーバダウンを惹き起こす。だからISP供与のでは実行権限を与えなかったわけだ。逆に言えばISPが必ずホームページ公開スぺースを供与するのに個人向けレンサバが成り立ったのは何故?と言えばCGIの実行が出来たからだ。
故にWindowsしか使わない人には難しい上級者向けだったのだが、これを優しいチュートリアルで簡単設定出来るようにしてユーザーを増やして会社を大きくしたのがpaperboy&co.の家入一真氏なわけだ。はてな創業者の近藤淳也氏と並ぶ個性的なアントレプレナーと謂われた。その後堀江などと共にインターネッ党を作って都知事選に出て箸にも棒にもな結果になったのは黒歴史なので触れないで上げてください。特に堀江は野菜でいじられるよりも傷つくので偉そうに政治の話してる時に「インターネッ党」とボソっというのは残酷な事なので止めてあげて欲しい。お願いします。
また、CGIでの使用言語はperlが圧倒的で、perlで書いた掲示板スクリプトを配布するサイト、趣味プログラマが星の数ほどいた。
こういう訳で初期のWEBで動的ページ=perlであってJcode.pmを開発した小飼弾氏は魔術師扱いされて崇拝されており、ブログブームが来ると圧倒的な人気を誇った。
今では多言語が普通に扱えるのが当たり前だが、マルチバイト文字の扱いというのは難しく、文字コードがそれぞれ違うのがそれに輪をかけていた。例えば今でも日本語Windows上でフランス語や中国語のファイル名は作れないだろう。また、最初期からかなりの期間、Twitterでは日本語の検索が出来なかった。youtubeでも日本語で投稿できなかった期間は長い。
子飼氏はperlで日本語を使用できるようにするライブラリをUNICODE対応にしてWEBで普遍的に日本語が使えるようにしたものだ。
ただ、HTLMと実行文を混ぜ書きできるPHPがver.4になるとデータベース連携が強化されていてデフォルトでSQL文発行関数が実装されており、perlCGIは廃れていってしまう。
またISPより高い自由度を求めて自宅にサーバを立ててそれを公開するという者も現れた。
はてなはサーバをデータセンターに置いてはいたものの、筐体は町工場に設計図を持ち込んでステンレスの1U筐体を自前で作っていたし、Pixivはギガバイトのシステムボードを使って自作した多数のサーバをエレクター上に置いてむき出し運用してしていたので、自宅サーバ組の延長にあったのだな、実は。
こういう中で画像を公開する、動画を公開するというのはなかなか大変だった。
仲間内で見るという分にはファイルを置けばいいだけだが、問題になったのが「2ch晒し」であった。これは悪意を持って2chにURLを貼るのだけじゃなくて、単にURLを書くというのも含まれた。
というのも2chにURLが書かれるとアクセスが集中して大抵はサーバダウンしてしまう。すると他の契約者のサイトもページも見れなくなってしまう。
例えばヒーロー戦記主題歌みたいな社歌でbuzzった日本ブレイク工業のサイトは重すぎて何週間も閲覧出来なくなった。社歌の動画ファイルを置いていたためだ。
こういうサーバダウンは契約者の責任ではないがホスティング会社も許してはくれない。契約解除、つまり出ていけか、法人契約への変更かを迫られる。転送量制限なしと言っていても実際に転送過多になると干すティングになるわけだ。
だから2chは悪意の塊の他にサーバーダウンとサーバからの追い出しを惹き起こすので蛇蝎のように嫌われていた。2ch晒し→その時点でサイトを閉じてしまう人も多く居た。
するとこれを逆手に取ってアップローダ(あぷろだ)を自作サーバで運用してアフィリエイトで収入を上げる者が現れてくる。
ただこれは著作権違反のファイルが上げられて訴えられる事もあるからそのリスク低減のためと転送量制限の為にファイル容量に制限が設けられていた。
すると大きなファイルを共有したい連中はこれでは満足できない。
そこで目を付けたのが海外でアップローダを運用しているサーバだ。運用動機は日本のアップローダと変わらない。だがファイルの大きさの制限が緩かった。
そこでそういう海外のアップローダが違法性が高いファイルの共有に使われるようになった。やってたのは2chのダウンロード板と半角板がメインだ。
だがこれは運営には迷惑な話で、日本人は英語の広告なんてクリックしない。しかも商品の販路が無いので日本からのアクセスに報酬は支払われない。つまり金を落とさず転送量だけ上がるのだ。しかも海外では転送量従量課金は多かった。
更に問題なのがロリ画像がアップロードされることだ。2次元ロリでも規制があるのに実写ロリは完全アウトだ。実写ロリが発覚した場合、サーバ管理者は必ず逮捕される。マグショットが新聞に掲載されTVで晒され、釈放後も幼児が被害者の性犯罪者なのでGPSロガ装着が義務付けられ住所は共有される。二度と部屋を借りる事は出来ずに一生トレーラーハウスかキャンピングカーを買って橋の下で生活となる。
こんな実写ロリ画像や動画をアップロードする奴が居たのである。
そこで管理者としては日本からのアクセスが増えたのを確認した時点で遮断するしかない。一生を棒に振る可能性を回避するためだ。
圧倒的によく使われるWEBサーバのapacheでは.htaccessというシステムファイルに記述してアクセス制限を掛ける事が出来る。ここで国別IPアドレス指定するのはちょっと難しいのでdeny from co.jp deny from ne.jpという風に書くとドメインがco.jp、ne.jpからのアクセスを全部弾くことができる。
この時にディレクトリ指定を「/」にするとそのサーバの全てが弾かれて403エラーが出てしまう。しかもバーチャルドメインも同じなので思わぬところで403エラーが出る事もある。
そういう訳であちこちの海外サーバで日本からのアクセスが拒否されていた。全て2chダウンロード板と半角板のやつらのせいである。
自分はアメリカの田舎の新聞社のトップページで403を食らったことがあるから嫌われ方は相当なものだと思う。「やるべき.htaccessの基本設定」みたいなのに書かれて共有されたのかも知れない。
因みにダウンロード板と半角板は2ch名物の厨房板だったのに、今見たら無くなってるのな。諸行無常だ。
2005年にサービスインしたYoutubeだが、翌年にGoogleに買収されたもので最初は元paypal社員らが作ったベンチャーだった。
だが最初は著作権違反コンテンツばかりであって、自作ビデオというのは少なかった。
特に酷かったのがまた日本人で、最初は10分制限がなかったのをいいことにアニメの全話丸上げみたいなのが大量にされており、当事者のアニオタ達も「ここまでやったら閉鎖されるだろ!」と諫めるほどだった。
そんな中で2006年6月にYoutubeが数日間の大メンテナンスに突入し、画面には「All your video are belong to us」というブロークン英語が書かれていて騒ぎになった事があった。
これの元ネタは「All your base are belong to us」で、古いセガのゲームの英語版で出てきたセリフだ。深刻な場面で突然めちゃくちゃな英語をいう。このおかしさでFLASHが作られたりとミーム化していたものだ。
しかも日本産ゲームは結構あちこちでバカ英語を作ってて、engrishとかjanglishとか言われてネタにされていた。日本で言えばアヤシイ中国製品の日本語を愛でるような感じだ。
そこでYoutubeがあんなメッセージを出したので、日本のネット民は身に覚えがありすぎて「アニオタのせいだろ!また排除されるだろ」と責任のなすり合いと相なったのだった。
因みにその後も日本人の利用が制限とかは無かったので誤解だったのだが、海外アップローダ見つけては403の焼き畑とかロリ画像問題とかがあって、その後のアニメフル全話という流れだったので過剰反応をしたのであった。
普段から俺様が使っているスクリプトあるから、公開してほめちぎってもらうぞー!
出力はただの文字列だから音声読み上げアプリでも何でも、突っ込んで遊んでくれ。
jq必須です。
ログインせず使うので当然アカウント固有の非表示設定とかは動きません。
あれなIDのコメントも全部所得することになるのでご注意ください。
まあそこらへんはsedでも使って気に入らないidの行を勝手に削除してくれ
hatebu_comment.sh
#!/bin/bash if [[ "$1" =~ ^http ]];then : # Success else echo "Error: 引数に指定したURLのブックマークのコメント一覧を取得するやーつ" echo "例: ./hatebu_comment.sh 'https://www3.nhk.or.jp/news/html/20200405/k10012369381000.html' | less" exit; fi if [[ "$1" =~ b.hatena.ne.jp/entry/s ]];then # はてブページのURLでも動作するように url="https://$(echo $1 | sed -e 's@.*/entry/s/@@')" else url=$1 fi if ! jq --version > /dev/null ;then echo "Error: jqがインストールされていません" exit; fi curl -s "https://b.hatena.ne.jp/entry/jsonlite/?url=$url" | jq '.bookmarks[] | if .comment != "" then ("「" + .user + "」 " + .comment) else empty end' | sed 's@^"@@g' | sed 's@"$@@g'
まじな話をすると、N予備校のプログラミング入門コースやるのがオススメ。
一日8時間勉強時間があるなら、だいたい一ヶ月で終わる内容。
月額1000円だけどしっかり勉強すれば一ヶ月の無料期間中に終わると思う。
もともとN高等学校のノンプログラマーの生徒をWebエンジニアとして就職させるために作られたカリキュラムで講師曰く去年はこれで二人エンジニア就職を決めたらしい。
内容も相当親切に説明していて、プログラミングで何か作るだけじゃなくて、就職に必要な環境構築やセキュリティまでみっちりやる。
で講師が書いてる入門コースで習うことがまとめ。テキスト教材もあるけど授業も1項目を2時間で説明している。授業は週2の生放送とそのアーカイブがある。
↓みたいなことが学べる
----
Web ブラウザとは (Chrome, デベロッパーコンソール, alert)
はじめてのHTML (VSCode, HTML, Emmet)
さまざまなHTMLタグ (h, p, a, img, ul, tableタグ)
HTMLで作る自己紹介ページ (HTMLタグ組み合わせ, コンテンツ埋め込み)
はじめてのJavaScript (JS, ES6, エラー)
JavaScriptでの計算 (値, 算術演算子, 変数, 代入)
JavaScriptで論理を扱う (論理値, 論理積, 論理和, 否定, 比較演算子, if)
JavaScriptのループ (ループ, for)
JavaScriptのコレクション (コレクション, 配列, 添字, undefined)
JavaScriptの関数 (関数, 関数宣言, 引数, 戻り値, 関数呼び出し, 再帰)
JavaScriptのオブジェクト (オブジェクト, モデリング, プロパティ, 要件定義)
はじめてのCSS (CSS, セレクタ, background-color, border)
CSSを使ったプログラミング (transform, id, class)
Webページの企画とデザイン (企画, 要件定義, モックアップ, 16進数カラーコード)
診断機能の開発 (const, let, JSDoc, インタフェース, 正規表現, テストコード)
診断機能の組込み (div, 無名関数, アロー関数, ガード句, truthy, falsy)
ツイート機能の開発 (リバースエンジニアリング, URI, URL, URIエンコード)
LinuxというOS (VirtualBox, Vagrant, Ubuntuのインストール, OS, CUIの大切さ)
コンピューターの構成要素 (ノイマン型コンピューター, プロセス, lshw, man, ps, dfの使い方)
ファイル操作 (pwd, ls, cd, mkdir, rm, cp, mv, find, ホストマシンとの共有ディレクトリ)
標準出力 (標準入力、標準出力、標準エラー出力、パイプ、grep)
vi (vimtutor)
シェルプログラミング (シバン, echo, read, 変数, if)
通信とネットワーク (パケット, tcpdump, IPアドレス, TCP, ルーター, ping)
サーバーとクライアント (tmux, nc, telnet)
HTTP通信 (http, https, DNS, hostsファイル, ポートフォワーディング)
GitHubでウェブサイトの公開 (GitHub, リポジトリ, fork, commit, 情報モラル)
イシュー管理とWikiによるドキュメント作成 (Issues, Wiki)
GitとGitHubと連携 (git, ssh, clone, pull)
GitHubへのpush (init, add, status, インデックス, commit, push, tag)
Gitのブランチ (branch, checkout, merge, gh-pages)
Node.js (Node.js, nodebrew, Linux, REPL, コマンドライン引数, プルリク課題)
集計処理を行うプログラム (集計, 人口動態CSV, Stream, for-of, 連想配列Map, map関数)
アルゴリズムの改善 (アルゴリズム, フィボナッチ数列, 再帰, time, プロファイル, nodegrind, O記法, メモ化)
ライブラリ (ライブラリ, パッケージマネージャー, npm)
Slackのボット開発 (slack, mention, bot)
HubotとSlackアダプタ (hubot, yo)
モジュール化された処理 CRUD, オブジェクトライフサイクル, filter)
ボットインタフェースとの連携 (モジュールのつなぎ込み, trim, join)
同期I/Oと非同期I/O (同期I/O, 非同期I/O, ブロッキング)
例外処理 (try, catch, finally, throw)
HTTPサーバー (Web, TCPとUDP, Webサーバーの仕組み, Node.jsのイベントループ, リスナー)
HTTPのメソッド (メソッド, GET, POST, PUT, DELETE, CRUDとの対応)
HTMLのフォーム (フォームの仕組み, form, input)
HerokuでWebサービスを公開 (Webサービスの公開, heroku, dyno, toolbelt, login, create, logs)
認証で利用者を制限する (認証, Basic認証, Authorizationヘッダ, ステータスコード)
Cookie を使った秘密の匿名掲示板 (Cookie, Set-Cookie, expire)
UI、URI、モジュールの設計 (モジュール設計, フォームのメソッド制限, リダイレクト, 302)
フォームによる投稿機能の実装 (モジュール性, textarea, 303)
認証された投稿の一覧表示機能 (パスワードの平文管理の問題, 404, テンプレートのeach-in)
データベースへの保存機能の実装 (データベース, PostgreSQL, 主キー)
トラッキングCookieの実装 (トラッキング Cookie, IDの偽装, Cookie の削除)
削除機能の実装 (データベースを利用した削除処理, 認可, サーバーサイドでの認可)
管理者機能の実装 (Web サービスの管理責任, 管理者機能の重要性)
デザインの改善 (Bootstrap, レスポンシブデザイン, セキュリティの問題があるサイトを公開しない)
脆弱性 (脆弱性, 脆弱性で生まれる損失, 個人情報保護法, OS コマンド・インジェクション)
XSS脆弱性の対策 (XSS, 適切なエスケープ処理, リグレッション)
パスワードの脆弱性の対策(ハッシュ関数, メッセージダイジェスト, 不正アクセス禁止法, パスワードジェネレーター, 辞書攻撃)
セッション固定化攻撃脆弱性の対策 (セッション, セッション固定化攻撃, ハッシュ値による正当性チェック)
より強固なセッション管理 (推測しづらいセッション識別子, 秘密鍵)
安全なHerokuへの公開 (脆弱性に対する考え方, HTTPの廃止)
Webフレームワーク (Express.js, フレームワーク導入, 簡単なAPI, セキュリティアップデート, Cookie パーサー, ミドルウェア, 外部認証, ロガー)
ExpressのAPI (app, Properties, Request, Response, Router)
GitHubを使った外部認証 (Passport, OAuth)
テスティングフレームワーク (Mocha, レッド, グリーン, リファクタリング)
継続的インテグレーション (CircleCI)
クライアントのフレームワーク (Webpack, Chrome 以外のブラウザでもES6)
DOM操作のフレームワーク (jQuery, jQueryアニメーション, this)
AJAX (jQuery.ajax, クロスドメイン, 同一生成元ポリシー, x-requested-by, CORS)
WebSocket (WebSocket, WebSocketの状態遷移, Socket.io)
RDBとSQL (DDL, DCL, CREATE, DROP, INSERT, DELETE, UPDATE, WHERE)
テーブルの結合 (外部結合, 内部結合, 片側外部結合, JOIN ON)
インデックス (インデックス, 複合インデックス, Bツリー)
集計とソート (SUM, COUNT, ORDER BY, GROUP BY)
「予定調整くん」の設計 (要件定義、用語集、データモデル、URL設計、モジュール設計、MVC)
認証とRouterモジュールの実装 (Mocha, supertest, passport-stub, モックテスト)
予定とユーザーの保存 (セキュリティ要件, UUID, 複合主キー)
予定とユーザーの一覧の表示 (非同期処理, Promise, then)
出欠とコメントの表示 (入れ子の連想配列, Promise.all, 子どもからデータを消す)
どのように調べたのか。デバッガが使えない環境だとしても、標準出力、ファイル出力、ウィンドウ表示など、いくらでも方法はあるだろう。他トラバでも指摘されているように、コードそのものに不備がないのなら依存関係を含めて環境を疑うのが定石。
何と、何を、どのように見比べたのか。コード?ドキュメント?目視?diffコマンド?これもまた、他トラバでも指摘されているが、ドキュメントは英文でも読むのは基本。それと、パンチャーなんていう時代ではないのだから、現代のプログラマーであれば、人間の力など信じてはいけない。
readfile:
header('Content-Type: image/jpeg') とか header("Content-Length: ???"); とか、ちゃんと書いているのに、ブラウザでなんで画像で表示されないんだろ...もしくは " headers already sent by ... "とエラー表示されてる... readfile のあと、データ出力前にソッコーで header 出力させているのになぁ。。
こんなとき、そのPHPコード、readfile の戻り値が読みこまれたデータであると勘違いしてつくられてていませんか?
この件に限りませんが、サンプルコードとか勘違いが多いので要注意です。「脳内でうまく動いた」ものを、検証せずにそのままWEBに載せている人って結構いますから。
ほかには php.ini の output_bufferingを On にしたら直った、php のファイルが BOM 付き <?php や ?> の前後に空白や改行などがある、などが原因の場合もありますね。
これまで他の人に用意してもらったサーバで自分のプログラムを動かしたことはありましたが
自分自身で一からサーバをセットアップしたことはほとんどなかったので、いろいろとハマりました。
作業を進める上で困ったり考えたりしたことを書いていきます。
ちなみにサーバ自体はさくらのクラウド、OSにはCentOSを使用しているので、それ前提のお話になります。
最初にサーバを起動してから速やかにSSHとファイヤーウォールの設定を変更しました。
はてブなんかでも定期的に話題になっているのでおなじみですね。
・SSHやHTTP(S)など、どうしても公開しなければならないポート以外は遮断する
さらっと書きましたが、設定をミスって自分自身もログインできなくなり、何度かOSの再インストールを繰り返しています。
後から気付いた事ですが、さくらのクラウドではクラウド管理画面のリモートスクリーン経由でローカルログインできるので
別にOS再インストールしなくてもiptablesの設定を変更できたんですよね...
逆に言うといくらファイヤーウォールとSSHを設定しても管理画面にパスワードログインの環境が残ってしまうので
パスワードの管理には引き続きしっかり気を使う必要がある。ということでもあります。
httpd,php,mySQL,memcachedなど必要なサービスをインストール、設定し
作成したWebアプリのプログラムを乗せて動かしてみました。が、動作が重いような...
開発環境ではさくさく動いていたのに、本番環境ではどのページ遷移ももっさりしています。
abで計測してみたところ、開発環境のおよそ2分の1のスコアとなってしまいました。
開発環境が仮想2コアのメモリ1Gだったのに対し、本番環境が仮想1コアのメモリ2Gと
CPUの性能について半減しているのでそのせいかな、と思いつつ設定を見なおしていたところ
特に使っていないと思われたipv6を停止した途端にパフォーマンスが改善されました。
ページ遷移に伴うもっさり感が解消され、abの計測結果も開発環境と遜色ない結果が出ています。
デフォルトで有効になっていたipv6の影響により余計な処理が走っていたのかもしれません。
パフォーマンス改善に喜んだのも束の間、会員登録などの処理でWebアプリからメールを送信したところ、Gmail宛のメールがことごとく迷惑メールと判定されるという事案が発生。
spfの設定を行なう、メールの内容について吟味するなどの回避策を試してみましたが一向に改善されません。
試しにHotMailとexciteのメールアカウントに送信したところ、そちらではそもそもメールを受け付けてもらえずエラーコードが返って来る始末。
困り果てていたところ、エラーの内容からサーバのIPがspamhousにスパム送信元として登録されていることが判明しました。
postfixのホスト名の設定がデフォルトで「localhost.localdomain」などとなっており、それをそのまま使っていたためにGmailがスパム送信元として通報してしまったようです。
設定を修正し、spamhousに解除依頼を提出。事なきを得ました。
クラウドを利用すれば、サーバを停止することなく簡単な設定でスケールできるようになる。
と、自分で勝手に思い込んでいたせいなのですが、消えては困るデータの一部をmemcachedに保存する実装を行なっていました。
実際のところさくらのクラウドではサーバを完全に停止しなければプラン変更を実施できないし
そもそもサーバが落ちたらどうするんだよ。ということで、急遽KVSを変更する必要に迫られました。
速度の低下が気にかかったため、いくつかの候補を実際に動かし
phpのスクリプトから1万件のデータ読み書きを行うという形でmemcachedと比較してみたところ次のような結果に。
サービス | 1万件書込 | 1万件読込 |
memcached | 2.55秒 | 2.30秒 |
handlersocket | 21.23秒 | 2.71秒 |
InnoDB | 20.23秒 | 5.10秒 |
kyotoTycoon | 8.22秒 | 7.72秒 |
さすがに読み書きそれぞれmemcachedが最速ですが、読み出しについてはhandlersocketも負けていません。mySQLから普通にSELECTしてもmemcachedの2倍程度の時間しかかからないという結果が意外でした。
しかしながら書き込みのほうではhandlersocketもmemcachedの10倍近くの時間がかかっており、少々速度的な影響が気になってきます。memcachedの倍のパフォーマンスを記録したという記事を見たことがあるので、設定、チューニングについて生かしきれていない部分があるのかもしれないとも思いましたが、知識が不足しているところで無理をすると問題が発生した時に対処できないと考え、候補から除外することとしました。
結局、今回の用途では読み込み処理より書き込み処理のほうが圧倒的に多いことも考慮し、kyotoTycoonを採用しました。実際の利用箇所に組み込んでabで計測してみたところ、だいたい30%程度のパフォーマンス低下にとどまっており、これなら許容範囲かと考えています。
実行系と参照系に分ける形でmySQLのレプリケーションを行なっていたのですが、度々レプリケーションが停止する現象が発生しました。
一部のテーブルについて肥大する可能性が考えられたため、参照系に接続するプログラムで使わないテーブルをレプリケーションから除外していたのが原因です。
例えばtabelAをレプリケーションし、tableXをレプリケーションしないという設定にしたうえで
実行系でINSERT INTO `tableA` SELECT `value` FROM `tableX`などといったクエリを発行すると、参照系にtableXが無いためエラーが発生して止まってしまいます。
レプリケーションするテーブルを限定する場合はプログラム側でも注意を払わないと危険です。当たり前ですが。
監視といえばcactiやnagiosが定番なのかもしれませんが、設定が複雑そうで尻込みし、monitを使用することにしました。
簡単な設定でloadaverageやメモリ、HDDの使用量をチェックできるほか
httpdやmysqldなどといったサービスのプロセスを監視し、もし落ちていたら自動で起動してくれるので助かります。
パスワード保護を行うとしても、サイト全体の管理画面など自分しか使わないプログラムはWebに晒しておきたくない。
というわけで、一部のWebアプリを秘匿する設定を行いました。
管理画面のWebアプリを9999番など閉じているポートに設置した上で、SSHを利用したトンネルを掘ります。といっても
上記のようなコマンドで管理画面のWebアプリを置いたサーバへログインするだけです。
ブラウザのアドレス欄にhttp://localhost:9999/と打ち込めば、接続が開いている間のみアクセス可能になる感じですね。
サーバにログインできる人でなければ実行できないことなので、気分的にある程度安心します。
自動でログのバックアップを行いたいと考えたのですが、パスワード無しの鍵でログインして転送する形には抵抗がありました。
調べてみたところ、authorized_keysに公開鍵を記入する際の設定で、その鍵でできることを制限するという手段があるようでした。
具体的には、authorized_keysに
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="some commands" ssh-rsa AAAAB3NzaC1yc2EAAA...
などとして公開鍵を追加しておくと、その鍵でログインした直後にcommand=""の部分で設定したコマンドを実行して接続を終了する挙動となり
接続のフォワードもできなくなるため、パスワード無しでも鍵の流出に関するリスクを最低限に留めることができるというわけです。
commandの実行結果は標準出力から受け取ることができるので、例えばcommand=""の部分にファイルの内容を表示する処理を設定していたとすれば
ssh -i .ssh/no_password_key user@xxx.xxx.xxx.xxx > /path/to/file
などとしてログインの結果をファイルに書き込むだけで、簡単にファイルの転送が実現できます。
他にも大小さまざまな問題に行きあたりましたが、忘れてしまったor書ききれないのでここまでとします。
たった1つのサイトを公開するにしても問題というのは尽きないものだと実感させられました。
今は基本的な情報だけでなく、ちょっと突っ込んだ内容でも検索で解決していけるので嬉しいですね。手がかりを残してくれた先達に感謝することしきりです。
現状ではひとまずの見切りを付けて公開していますが、より堅牢で負荷に強いサーバとなるよう、随時チューニングを行なっていこうと考えています。
個人サイトや小規模な商業サイトなどプロモーションにあまりお金をかけられないサイトを主な対象とした、無料で出稿できる広告ネットワークサービスです。
既存のサービスで近いのは「あわせて読みたい」や「zenback」、各社提供のRSS相互リンクサービスなどになるでしょうか。
広告としての体裁がある分、それらより若干積極的な性質になるのではと考えています。
現時点ではサービス本体のプロモーションに苦心するという本末転倒そのものの状況でありますが、もしよろしければ見ていただけると嬉しいです。