aoma blog

エンジニアの日常とか技術とか

jQueryでサニタイズしつつ改行コードを<br>に置換する簡単な方法がなかった話

表題の件、令和なのにスマートな書き方がないなんて!!!という話です。

やりたいこと

  • JavaScriptでとあるタグに文字列を出力したい。
  • 改行は改行して表示したい
    • 改行コードが含まれていたら<br>タグに置換
  • 他のタグは当然サニタイジングする

対応までの流れ

var str = 'xxxxx' + "\n" + 'yyyyy';

まず単純に文字列を出力しました。 jQuery使ってたのでtext()でいいやと。

$('#target').text(str);
// xxxxx yyyyy

改行コードは改行表示したいので<br>タグに置換してあげました。 この場合、text()サニタイズされるのでブラウザ上は下記のように表示されてしまいます。

$('#target').text(str.replace(/\n/g, '<br>'));
// xxxxx<br>yyyyy

ということで'text()'ではなく'html()'にします。

$('#target').html(str.replace(/\n/g, '<br>'));
// xxxxx
// yyyyy

すると見事に改行してくれました。でも当然これで完成ではありません。
文字列の中にタグが含まれていたら、タグとして判定されてしまいます。

var str = 'xxxxx' + "\n" + 'y<b>yyy</b>y';
$('#target').html(str.replace(/\n/g, '<br>'));
// xxxxx
// yyyyy // 真ん中3つのyが太字になる

この場合、サニタイジングして下記のように出力されなければいけません。

// xxxxx
// y<b>yyy</b>y

さてどうしたものか。

ググったら意外と簡単な方法がなかった

意外にもこれ!という方法がなく。。。 jsってネイティブコードとかでサニタイズするような関数ないんですね。普通ないのか。PHPが優しさに包まれてるだけ?

ということで最終的に下記コードにしました。

$('#target').html($('<dummy>').text(str).html().replace(/\n/g, '<br>'));

おまけ

余談ですが、特定の文字だけ無害化してる人の中で下記一文があったんですね。

最初はjQueryのtext()でいいんじゃないかと思ったが、「innerText(textContent)/innerHTMLを使ったHTMLエスケープは充分でないので今すぐやめろ、お前たちはもう終わりだ - TODESKING」の記事によると、それだと”がエスケープされるとは限らず不完全であるらしい。

一応text()使っちゃってるので調べましたが、この記事だとサニタイズした文字を属性値の中に入れて出力しようとしてました。

'<a href="/path/to/some_content/' + escape(user_input) + '">CLICK HERE THIS IS SAFE I PROMISE</a>'

そりゃーその場合はダブルコーテーションもサニタイズする必要あるよねってことで、今回のように要素に出力する場合は問題なし。

このあたりしっかり理解するためのサイトとか作ったら需要あるかな??

昨今の高齢者自動車事故に思うこと

ぼくはエンジニアだ。

最近、高齢者の自動車事故が問題になっている。

今まで長い間生きてきた素晴らしい人生が時速100km近いスピードで突っ込んで終わってしまうって、どんな気持ちなんだろう。想像したくもない。

ぼくはエンジニアだ。

エンジニアならこんな悲惨な事故が起きないよう対策を考えるだろう。

自動運転、急発進防止、生物検知、危険予測、AI、アスラーダ

ぼくはエンジニアだけど、こんな最新のテクノロジーで解決する必要は一切ないと思う。

命を奪う原因はスピードだ。
車の最高時速を30kmまでしか出せないようにしてしまえば死亡事故は大きく減ると思う。
実装も簡単だ。ギアを1速だけにしてしまえばいい。

なぜこれが議論されないのか本当に疑問だ。

急いでいる?
倍の時間がかかるようになったのなら、その分早く出発すればいい。時間と命どちらが大切なのか。

思うに、もし乗用車が全て時速300kmほど出る車だったとしたら、街中を150kmほどで走る世界が普通だったかもしれない。それは速すぎる!危険だ!と思いますか?いま同じ話をしています。

思うに、車がなかった時代は馬に乗っていたはずだ。それより随分と便利で快適になっただろう?そこまでスピードを求めてはいなかったはずだ。

本当に大切なものは何か、幼い頃の気持ちを思い出してほしい。

一瞬の操作ミスやパニックが問題なのだから、高齢者の免許更新試験など無駄だ。事故が発生するのは試験中じゃない。

免許返納したら生活できなくなるのも理解できる。
必要なのは返納じゃない。事故が起きても被害が小さい、スピードの出ない車だ。

もうこんな悲しい事故は見たくない。
速度を出したいならサーキットに行ってくれ。

ぼくはエンジニアだ。

根本的な再発防止策を盛り込んだ障害報告書を提出してほしい。
本当に大切なもののために。

GitHubリポジトリを友達とコラボレートする

複数人でGitHubリポジトリを共有したいとき、あると思います。

そんな時はコラボレートしましょう!

やり方は簡単です。

コラボレートする方法

リポジトリの設定でCollaboratorsを選んでユーザーIDかメアドで招待するだけ!

f:id:aoma23:20190610180625p:plain

これだけで複数人で開発できちゃいます。

無料アカウントの場合、コラボレーターはプライベートリポジトリで3名まで、パブリックリポジトリなら無制限となっています。

組織という選択もある

組織(オーガナイゼーション)で共有する方法もありますが、こちらは有料アカウントのみで、友人とというよりは企業向けでした。

詳しくはGitHubの価格表をご確認ください。

Gitpodも当然使える!

以前紹介したGitpodですが、コラボレートされたリポジトリでも当然使えます!

これはブラウザでの開発が捗りますね!

最後に

個人開発も良いですが、心が折れることもあります。 そんな時は仲間と開発してみるのも良いでしょう! 1人より2人!誰かがいるということはそれだけでパワーになる!そもそも『人』という字は......

sedコマンドで行単位に処理するオプションの挙動メモ

行追加

特定の行の前に挿入するiオプション(insert)

aaa
ccc
eee

ccc行の前に挿入する

sed -i "/ccc/i bbb" test.txt

aaa
bbb
ccc
eee

部分一致でも行単位で処理される

sed -i "/c/i bbb" test.txt

aaa
bbb
bbb
ccc
eee

一致する行すべて処理される

sed -i "/b/i x" test.txt

aaa
x
bbb
x
bbb
ccc
eee

特定の行の後ろに追加するaオプション(append)

aaa
ccc
eee

ccc行の後ろに追加する

sed -i "/ccc/a ddd" test.txt

aaa
ccc
ddd
eee

部分一致でも行単位で処理される

sed -i "/c/a ddd" test.txt

aaa
ccc
ddd
ddd
eee

一致する行すべて処理される

sed -i "/d/a x" test.txt

aaa
ccc
ddd
x
ddd
x
eee

特定の行を置換するcオプション(change?)

aaa
ccc
eee

ccc行を置換する

sed -i "/ccc/c xxx" test.txt

aaa
xxx
eee

部分一致でも行単位で処理される

sed -i "/e/c xxx" test.txt

aaa
xxx
xxx

一致する行すべて処理される

sed -i "/x/c z" test.txt

aaa
z
z

おまけ

sedで文字列置換

sed -i "s/a/A/" test.txt

Aaa
z
z

これはgオプション(grep?)で一致する文字列すべてになる

sed -i "s/a/A/g" test.txt

AAA
z
z

さらにおまけ

上記すべてに付いてた-iオプション(--in-place)はファイルを上書き保存する。

おしまい。

スプレッドシートでExcelファイルをExcelのまま編集できるようになったよ!

タイトルだけだと何言ってるんだお前は?という感じでしょうか。汗

さて、以前こんな記事がありました。

www.gizmodo.jp

エクセルやWordやパワポなどのMicrosoftのOfficeファイルを直接編集できるようになるっていう告知でした。

で、待ちに待っていたのですが、本日何気なくExcelファイルをスプレッドシートで開いてみたら、なんとリリースされているじゃないですか!ありがとうGoogle

スプレッドシートExcelを直接編集可能に!

ということで手順を見てみましょう!

いつものように「Googleスプレッドシートで開く」を選択

f:id:aoma23:20190611132726p:plain

すると、、、待ってました!

f:id:aoma23:20190611132933p:plain

編集できるようになりました!のポップアップに歓喜!!

使い方ガイドを読むと、なんと履歴管理もしてくれます!(スプレッドシートと同様)

これでもうBooks.xlsx_20190612bkとかいらないですね!

従来のようにスプレッドシートとして保存することも可能です。

編集してみました

スプレッドシートかエクセルかどちらで保存されているかは拡張子が目印です。 恐る恐る編集してみました。

f:id:aoma23:20190611133225p:plain

しっかりExcelファイルとして保存されてる!

Before

以前はスプレッドシートとして保存されファイルが複数になっていましたが、、 f:id:aoma23:20190611133500p:plain

After

ファイルは一つのまま。しっかり上書きされてます!

f:id:aoma23:20190611133619p:plain

ダウンロードしても問題なし

念の為ダウンロードしてExcelで開いてみましたが、全く問題ありませんでした!

さいごに

自分はスプレッドシート大好き人間なのですが、これでExcel好きな人たちとも仲良くお仕事できそうです。

本当にありがとうGoogle様!

GitHub Pagesが404エラーのまま表示されない場合の対処法

正しい方法でGitHub Pages作ったのに、なぜか404エラーのままページが表示されないということがあります。

私はありました。昨日。

{username}.github.ioでリポジトリ作ってmasterにindex.html置いたのになぜか表示されない。。

ググったら、海外でも同様の現象に遭遇した人がいる模様。。

stackoverflow.com

1時間待て、とか書いてありましたが、待っても表示されず。。

仕方なくリポジトリ削除して、作り直しました。

すると奥さん、表示されましたよ。

違いといえば、404エラーのときは初回でReadmeを作らず、コラボレーターがindex.htmlをfirst commitしたくらいかなぁ。。。

同様の現象になったら作り直してみてください。

GitHub Pagesはindex.htmlよりREADME.mdが優先される!

下記のようにREADME.mdとindex.htmlが共存している場合、 GitHub Pagesとして表示されるのはREADMEだぞ!気をつけろ。

f:id:aoma23:20190610175303p:plain

index.htmlを表示したい場合はREADME.mdを削除すればOK。