aoma blog

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

【JavaScript】varとletとconstとブロックスコープについて検証してみた

はじめに

以前までJavaScriptにはvarしかなくブロックスコープはありませんでした。
最近はletconstが現れ、こちらはブロックスコープになります。
ググると『JavaScriptブロックスコープはない』ってのがヒットしますが古い情報なので注意してね。

検証コード

ブロックスコープの挙動については下記console.logの結果に注目しながらご確認ください。
ちなみにconstは上書き禁止の宣言ですが、スコープが異なれば当然別物になりますのでそのあたりも気にしながら! ついでに変数巻き上げについても見ていきます!

// ----------------------------------------
// 変数a, b, c をグローバル変数で宣言し、挙動見ていく
var a = "A";
let b = "B";
const c = "C";
console.log(a, b, c); // A B C

// ----------------------------------------
// 関数スコープでは全て別物
(function () {
  console.log(a); // undefined ※変数巻き上げのため
  //console.log(b); // Uncaught ReferenceError: Cannot access 'b' before initialization
  //console.log(c); // Uncaught ReferenceError: Cannot access 'c' before initialization
  var a = "AA";
  let b = "BB";
  const c = "CC";
  console.log(a, b, c); // AA BB CC
})();
console.log(a, b, c); // A B C

// ----------------------------------------
// varはブロックスコープではないので上書きされる
{
  console.log(a); // A
  //console.log(b); // Uncaught ReferenceError: Cannot access 'b' before initialization
  //console.log(c); // Uncaught ReferenceError: Cannot access 'b' before initialization
  var a = "AA";
  let b = "BB";
  const c = "CC";
  console.log(a, b, c); // AA BB CC
}
console.log(a, b, c); // AA B C

// ----------------------------------------
// ブロックスコープ内で上書き
{
  a = "AAA";
  b = "BBB";
  //c = "C"; // Uncaught TypeError: Assignment to constant variable.
}
console.log(a, b, c); // AAA BBB C

// ----------------------------------------
// グローバルスコープ上で再定義
var a = "AAAA";
//let b = "BBBBB"; // Uncaught SyntaxError: Identifier 'b' has already been declared
//const c = "CCCC"; // Uncaught SyntaxError: Identifier 'c' has already been declared
console.log(a, b, c); // AAAA BBB C

ややこしいですが状況に応じて使い分けていきましょう!

さいごに

JSの挙動確認するときはRunstant Liteがオススメです!
上記ソースをコピペして試してみてね。

I Love RUBYグッズ作りました!

I LOVEシリーズ大好評につきRUBY版作りました!

ハートがいい感じでしょ?笑

購入はこちらから!
I Love RUBY / エンジニア専用 ITシャツ ( aoma )のTシャツ通販 ∞ SUZURI(スズリ)

いまならSUZURIキャンペーン中でTシャツ1000円オフです!急げー!

【超簡単】SUZURIでオリジナルTシャツを作ろう!

みなさんオリジナルTシャツって作ったことありますか?

クラスTシャツなんかで誰しも1枚は持っていたことあるのではないでしょうか。

色を複数色使うとお金がかかったり、大量注文しないといけなかったりといったイメージはないですか?

だが時は経ち、~今じゃ雑誌のカバー ~

今ではで1枚から安価で素敵なデザインのTシャツが注文できるようになりました!

おすすめがSUZURIです!

SUZURIはいいぞ!

suzuri.jp

SUZURIの使い方はカンタンです。

なんと画像をアップロードするだけ

それだけでオリジナルグッズが作れちゃうんです。

しかもTシャツだけじゃなく、パーカーやマグカップやスタイやステッカーなどなど、様々なアイテムが作れます。

作品はインターネット上に公開されて、そこから買うだけ。 もし誰にも見られたくないよーって人はさっと公開してパッと買ってささっと削除しちゃえばいいでしょう。

儲けはトリブンという形で原価にプラス100円単位で設定するので、とってもわかりやすいです。

ぜひ使ってみてください。

iPhoneアプリもあるよ!

aomaはSUZURIをiPhoneアプリから利用しています。

エンジニア専用ショップ「ITシャツ」を運営していますので、是非来て見て触って購入ください!

こんな感じのTシャツ売ってます。

f:id:aoma23:20190804001833p:plain

しかもなんと現在SUZURIのキャンペーン中で8/5の23:59:59までTシャツ1000円オフ!

今すぐショップへGO!

suzuri.jp

【ブログ運営報告】日々のPV数と今月の目標

久々の運営報告です。

3ヶ月ほど前の記事で書いた通り、僕はいま脱ビギナー(月間3,000pv~)を目指しています。

そう、3ヶ月経ったのにまるで達成してない。。。

最近のPV数はこちらになります。

1日平均90PVくらいでしょうか。 でも当時は平均50PVくらいだったと思うので、成長はしています! 平均100いくようになれば3000到達しそうですね。あと少し!

ということで今月は毎日更新を目指します。 毎日更新することでどれほどの成果が出るか検証してみたいのです。 結果報告もしますのでお楽しみに。

そうこう書いてるうちに今日も終わりますね。

今日はもうラーメン食って寝ます。

ほな、いただきます。

パブリックIPの枯渇問題について調べてみた

今まではIPv4

EC2とか立ち上げるとグローバルIPアドレスが付与されますよね! こんな感じの。

255.255.255.255

で、ふと思ったんです。EC2なんて毎日何千何万もの人が立ち上げてるはず。上限いかないのかなーと。

いまの形式はIPv4と呼ばれていて約43億個のIPアドレスを割り当てることができるそうです。
43億って少ないよなーと思っていたら、やっぱり枯渇問題がありました。もう限界だそうです。

これからはIPv6

で、これからはIPv6を使っていくとのこと。
こんな感じでコロン区切り8ブロックの表記になります。

2001:0db8:bd05:01d2:288a:1fc0:0001:10ee

長いので0始まりや、セクション全てが0の場合は::で省略できるそうです。(::は可変長なので、1箇所だけ使用可)

[例1] 2001:0db8:0000:0000:1234:0000:0000:9abc = 2001:db8::1234:0:0:9abc
[例2] 2001:0db8:0000:0000:0000:0000:0000:9abc = 2001:db8::9abc

今後EC2もこの値が割り当てられる日が来るはずなので、今のうちに慣れておきましょう。

すでにGoogleとかでは設定されていたりします。(IPv4と併用)
nslookup でオプション-type=AAAAを付けると確認できます。

$ nslookup www.google.com
Server:     192.168.1.1
Address:    192.168.1.1#53

Non-authoritative answer:
Name:   www.google.com
Address: 172.217.25.228

$ nslookup -type=AAAA www.google.com
Server:     192.168.1.1
Address:    192.168.1.1#53

Non-authoritative answer:
www.google.com  has AAAA address 2404:6800:4004:801::2004

Authoritative answers can be found from:

IPv6・無限大

IPv6は約340澗(かん)のIPアドレスを割り当てることができるそうで、これならしばらく枯渇の心配はありませんね!
澗ってピンと来ない人多いと思いますが、

億→兆→京(けい)→垓(がい)→秭(じょ)→穣(じょう)→溝(こう)→澗(かん)

です。
全人類約70億人で分配したとして1人あたり約4穣8,600𥝱個です。すごい!

人生80年として約25億秒なので毎秒立てても余裕です。
地球が生まれたのが46億年前で約14京秒なので、たとえ地球誕生から毎秒立ててたとしても余裕。IPv6すげー!!

参考サイト

sedコマンドでシングルコーテーションやダブルコーテーションを含む文字列を置換する

シングルコーテーションやダブルコーテーション内の文字列だけ置換したいときありますよね。

sedコマンドで"aaa""bbb"に置換したい!囲まれてないaaaは置換したくない!みたいな。

その場合はシングルコーテーションやダブルコーテーションで囲ってやる必要があります。

何を言っているのかわからねーと思うから例を示すぜ!

"aaa""bbb"に置換したい

こんなファイルがあったとする

$ cat a.txt
"aaa"
'aaa'
aaa

単純にaaasedコマンドで置換しようとするとこんな感じ。

$ sed s/aaa/bbb/ a.txt
"bbb"
'bbb'
bbb

置換対象にダブルコーテーションを指定してみる。

$ sed s/"aaa"/bbb/ a.txt
"bbb"
'bbb'
bbb

意味なし。。。
シングルコーテーションはどうか?

$ sed s/'aaa'/bbb/ a.txt
"bbb"
'bbb'
bbb

意味なし。。。
ところでオプションはシングルコーテーションやダブルコーテーションで囲むことができます。
こんな感じ。

$ sed 's/aaa/bbb/' a.txt
"bbb"
'bbb'
bbb

この状態でダブルコーテーションを指定してみる。

$ sed 's/"aaa"/bbb/' a.txt
bbb
'aaa'
aaa

おお!対象が絞れた!
シングルコーテーションはどうか?

$ sed "s/'aaa'/bbb/" a.txt
"aaa"
bbb
aaa

こちらもイケた!
ということで置換後の文字列にもコーテーションを付与してあげて一件落着。

$ sed 's/"aaa"/"bbb"/' a.txt
"bbb"
'aaa'
aaa
$ sed "s/'aaa'/'bbb'/" a.txt
"aaa"
'bbb'
aaa

ファイルを上書きしたい場合はiオプションを付与すればOK!

sed -i 's/"aaa"/"bbb"/' a.txt

最近外に恐怖を感じる。それでも僕は働いてる

ぼくはお金持ちになりたい。

最近、通勤に恐怖を感じる。

道を歩いてたらいきなり刺されるかもしれないし、車が突っ込んでくるかもしれない。
電車もそうだ。満員電車だったら逃げ場もないし、駅の階段で後ろから突き落とされるかもしれない。
会社にいたってそうだ。何かの恨みで建物に火をつけられるかもしれない。

それでもぼくは通勤してる。
なぜかって?お金が欲しいからだ。お金がないと家族を養っていけない。
逆に言えばお金があれば通勤なんてしないだろう。
大好きな子どもたちとずっと一緒にいたい。
だからぼくはお金持ちになりたい。

リモートワークなら少しはマシかもしれない。
ただ問題は通勤だけじゃない。
休みの日はやっぱりどこかに出かけたい。

当然通勤時と同じ危険は潜んでる。
車に乗ったら煽り運転をくらう可能性もあるし、遊園地にいったら爆弾が仕掛けられてるかもしれない。

とはいえずっと家にいるわけにもいかない。
最悪ぼくにだけ危険が及べばいいが、子どもたちは成長していずれ学校に通う。
当然通学路も危険だし、学校だってイジメやケンカいろいろある。

いっそ孤独だったら良かったかもしれないと思ったりもする。

子どもたちに先に死なれたらと思うと気が狂いそうだし、親より先に死ぬわけにもいかない。 もちろん愛する妻だって。

独身だったとしても悲しんでくれる友人たちはいる。死ねない。

死ねないから怖い。だからお金ください。

そんなこと思いながら帰りの電車に揺られてる15の夜〜