俺、サービス売って家買うんだ

Swift, Vue.js, 統計, GCP / このペースで作ってればいつか2-3億で売れるのがポっと出来るんじゃなかろうか

【年末企画】広島県呉市の島しょ部のすすめ

f:id:ie-kau:20161228112218p:plain:w500


ハロー @hazumu です。

年末気分だし、今年やろうと思っていた仕事はすべて終わったので気ままにブログを書いてみる。 何を書こうかなってーって思ったんだけど、ここ2,3数ヶ月釣りにも行ってないし。プログラミング系の記事を書いてもあまりおもしろい記事に仕上がる気はしなかったので、適当に島の話をしてみよう。

僕自身、内地生まれで別に島で生まれ育ったわけではないのだけど、何故か母方の墓地が瀬戸内海に浮かぶ下蒲刈島という島にあったり、高校の同級生の中にはフェリーで呉市内まで通ってくる人が多くいたのでわりかし瀬戸内の島嶼部には愛着がある。

実家に帰省した時に釣りに行くのもだいたい、島嶼部方面だったりする。
手持ち無沙汰な時間になんとなくGoogle ストリートビューで島嶼部の県道を進んでいっていたので、お気に入りにスポットを適当に挙げてみたい。

倉橋島

呉の中央地区に住む人間に取っては最も馴染み深い島だと思う。
実際に住んでる人からすると違うのかもしれないけど、一つの島の中で手前を「音戸」、奥を「倉橋」と呼んでいる。

気候も波も穏やかなこともあり、海水浴場が多くあったり、みかんの栽培や漁業が有名なようだ。 島に渡るには、第一音戸大橋、最近できた第二音戸大橋に加え、橋の下を渡船が走っているので自転車や徒歩で本州側へ渡る人は渡船を利用することになる。

見どころ

音戸大橋(第一)のぐるぐる回るところ

音戸大橋へ車で登り降りする際はこのぐるぐる道を通る必要がある。
運転が慣れてないと怖かったりする。

塩の山

工業用の塩を貯めてるところ。所見の人に「氷」って言ったらだいたい騙せる。

早瀬大橋の橋脚

橋を渡るのも面白いんだけど、海峡が狭いので潮の流れがめっちゃ速い。
大潮の日は川みたいになる。

その他

甘い醤油
item.rakuten.co.jp

瀬戸内ベリーファームのボイセンベリー www.setouchiberryfarm.com

ボイセンベリーってここのソースで初めて知った。たまに弟から貰えるので、無糖のヨーグルトにかけて食べている。

ヨーロッパキイチゴRubus idaeus、ブラックベリーRubus fruticosus、ローガンベリーRubus × loganobaccus の交配種

※出典: ボイセンベリー - Wikipedia
とのこと。

鹿島

倉橋島の更に奥にある小さな島。瀬戸内海のど真ん中にある、呉の市街地から車で1時間半ぐらいかかるので、実際に出かけてみると遠くまで来た感覚を味わえる。 とにかく海がキレイと言う言葉に尽きる。

見どころ

海がきれいなので、晴れた日にドライブするだけでほんとに気持ちいい。

とびしま海道

「とびしま街道」とは、呉市から瀬戸内海の島々を結ぶ橋とそれによって結ばれる道の愛称。
ドライブで目的なく行く人も多いが、今だと自転車でも走り抜ける人も多くなってきている。また、今回は取り上げていないけど、岡村島という島まで行けば、フェリーで愛媛県の今治市まで行くこともできたり。あまり知られてないけど、呉〜岡村〜今治〜道後という経路も狙い目だったりする。

www.tobishima-kaido.net

下蒲刈島

本州から、安芸灘大橋で渡れる島。 橋ができるまで行く方法はフェーリしか無かったでアクセスは良くなった。島内には美術館もあったりして、知る人ぞ知る知名度になってきている。(はず) 道の至る所に柑橘類の即売所がある。

見どころ

安芸灘大橋

橋長1,175mらしく。
徒歩20分ぐらいで渡れるので、風が強くない日は是非歩いて渡りたい。

大地蔵のトンネルの外にあるとこ

車でストリートビューに移っている、先端まで行ける。ガードレールが無いので海岸への落下に注意。

上蒲刈島

母方の墓がこの島の山中にあるのでほぼ毎年訪れる。
県民の浜という有名な海水浴場もあったりしてて、県内からの観光客は多そう。

見どころ

戸田地区

ストリートビューは海からの長めだけど、実際は山に登って海を見渡すと眺めはがいい。
周りはみかん畑だらけ。イノシシに注意。

豊島大橋の下

橋脚クラスタにはたまらない。

豊島

西には上蒲刈島と豊島大橋で、東に大崎下島と豊浜大橋でつながっている島。
大人になっても読み方に自身が無かったが島事態の名前は「とよしま」が正しいらしい。これまた勘違いしてたんだけど、「豊町(ゆたかまち)」は次に出てくる大崎下島の町名。「ゆたか」と呼んでいる年配の人をよく見るがそれは「豊町」のことを指しているっぽい。発音は「ゆ↑た↓か↓」じゃなくて「ゆ↑た↑か↓」。

見どころ

実は集落まで降りたことが無いけど、ここからの眺めが好き。
集落の波止場からコブダイが釣れるっぽいのでいつか本気出したい。

大崎下島

理由はわからないけど、大崎下島は呉市で大崎上島は豊田郡。 結構な大きさの島で、重要伝統的建造物群保存地区もあったりして見どころは充実してる。

見どころ

県道355号線のここ

ここの水の色だけ周囲と比べてとても深い青をしている。

御手洗地区

御手洗地区には古い町並みを保存してあって、雰囲気が良いのだけど。
ストリートビューに写っている洋館から、小道を通って海に抜ける瞬間が最高だったりする。

御手洗天満宮

御手洗地区を一回りした後にお参りに行くのが恒例になっている。
夏に行くと、セミがものすごく多く一瞬で夏を満喫することができる。

まとめ

そういえば、瀬戸内の島嶼部って晴れの日が多いんですよね。 天気がいいと前向きになるって話もでてきたし、若者の移住とかテレビでやってたりネットで話題になってたりするご時世、あまり候補に上がらないけど瀬戸内側に移住するのってワンチャンありなんじゃないですかね。

f:id:ie-kau:20161227160725p:plain:w100
そんじゃーね。

関連記事

www.ie-kau.net

www.ie-kau.net

カーネル密度推定とは何か?

こんにちは、Hayatoです。年末ですね。
カーネル密度推定をおさらいしようと何度かググったのですが良い感じの記事が見当たらなかったので、書き落としておきます。

Index

  • カーネル密度推定って?
  • どういうときに使うといいの?
  • カーネル密度の算出方法 (実際にPythonで)
  • 2次元でカーネル密度推定

カーネル密度推定って?

カーネル密度推定は、一言で表すと「なめらかなヒストグラム」です。
なめらかなヒストグラムを利用して、実際のいくつかのデータ(標本)から、全体の分布を推定する事ができます。 左がヒストグラムで、右がそれを元にして作成したカーネル密度分布のグラフです。 f:id:hayato1986:20161226164449p:plain

参照:Kernel density estimation - Wikipedia

どういうときに使うといいの?

ヒストグラムとは違い曲線になっているので、X値に対応するYを取ることが出来ます。あくまで推定ではありますが、おおよそX=0.2635ならY=2.45など、あらゆる値に対応できるようになります。

カーネル密度分布を書くことで、複数の突出(peak)がある場合に異なる複数の母集団から標本が抽出されている可能性がわかったり、複数のカーネル密度分布を足し合わせたときに視覚的な比較優位を取ることが出来ます。

カーネル密度の算出方法 (実際にPythonで)

さて、では実際にカーネル密度推定を順序立ててやっていきましょう。Githubに iPython Notebook を上げておいたのでそちらも参考にしてください。

1. サンプルデータを作成してヒストグラムを描画

正規分布に従うサンプルデータを作成して、ラグを表示しつつヒストグラムを書いてみます。ラグがたくさんあるところがグラフも高くなっていますね。

data = randn(50)
plt.hist(data, alpha=0.5)
sns.rugplot(data)

f:id:hayato1986:20161227112932p:plain

2. カーネル密度関数を重ねてみる

このグラフにカーネル密度関数を重ねてみます。やはりヒストグラムをなぞったような形になっています。

sns.rugplot(data)
sns.distplot(data)

f:id:hayato1986:20161227123707p:plain

こういうときSeabornはめちゃめちゃ便利ですねぇ。diplot(hoge)で一発描画。。

3. バンド幅とカーネル関数を選択する。

カーネル密度関数を調整するに当たり、バンド幅とカーネル関数を選択します。

バンド幅の違いでグラフを表示

バンド幅とは、データ(標本)一つ一つをどれくらい左右に広げるかの設定をします。0.1, 1.0などなど数値で表します。試しにいくつかのバンド幅を書いてみましょう。

sns.rugplot(data)
list =  [0.1, 0.3, 0.5]

for num in list:
    sns.kdeplot(data, bw=num, label=num)

f:id:hayato1986:20161227122014p:plain

選択するカーネル関数の違いでグラフを見比べる

カーネル関数は、データ(標本)一つ一つをどのような形で広げるかの設定です。ガウス分布(正規分布)が基本かと思いますが、三角、一様などなどいろいろ種類があります。詳しくはWikipediaを参考にしてください。 カーネル (統計学) - Wikipedia

[f:id:hayato1986:20161227121905p:plain]sns.rugplot(data)
options = ['biw', 'tri', 'gau']

for option in options:
    sns.kdeplot(data, kernel=option, label=option, bw=0.5)

f:id:hayato1986:20161227121917p:plain

やはりガウス分布安定ですかね。。 こんな感じでPythonを使ってさくっとカーネル密度推定ができちゃいます。便利!

2次元でカーネル密度推定

ちょっと応用して、2次元でのカーネル密度推定もやってみます。相関分析時に、どのようにデータが分布されているかを把握するのに便利。「複数の突出(peak)がある場合に異なる複数の母集団から標本が抽出されている可能性」を見分ける強い味方ですね。

いつものirisデータを引いてきて、plotします。

iris = sns.load_dataset("iris")
sns.kdeplot(iris.sepal_length, iris.petal_width, shade=True)

できた!のですが、Seabornでやったほうが楽だしきれいだし見やすいです。

sns.jointplot(x="sepal_length", y="petal_width", kind="kde", data=iris);

f:id:hayato1986:20161227122501p:plain

まとめ

今年はあんまり分析できず残念。。オラッオラッオラッ(ΦωΦ)

matplotlib, seaborn のラベルを日本語対応する。

iPythonでデータ分析するときに、当然matplotlibやseabornでグラフを描画するのですが、日本語対応されてなく文字化けを起こします。
グラフの描画はデータの概要を掴んだりビジュアライズしたりするためなので、文字化けを起こしていると割と致命的です。

今回はその修正方法でちょっとだけハマったので、まとめておきます。

環境:

Mac OS Sierra
Python 3.5.1 :: Anaconda 4.0.0 (x86_64)
iPython (jupyter)

手順

0. フォントがあるかどうか確認。

以下のようにすると使えるフォントが一覧で確認できます。

import matplotlib as mpl
font_paths = mpl.font_manager.findSystemFonts()
font_objects = mpl.font_manager.createFontList(font_paths)
font_names = [f.name for f in font_objects]
print(font_names)

日本語フォントがある場合は、

sns.set(font='AppleMyungjo')#日本語フォント設定

で設定すると対応できますが、ない場合は下記手順でダウンロードしてくる必要があります。

1. TTF形式でIPAフォントをダウンロード

IPAフォントを公式サイトからダウンロードします。
使うのはXXX.ttfの4つのファイルです。 f:id:hayato1986:20161222205107p:plain

2. TTFファイルをmatplotlibフォルダ内にコピー

僕はpyenvを使っているので下記のようなパスでした。

/Users/[user名]/.pyenv/versions/anaconda3-4.0.0/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/ttf/

こちらにダウンロードした*.ttfファイルをコピーします。

$ cp ~/Downloads/IPAfont00303/*.ttf /Users/[user名]/.pyenv/versions/anaconda3-4.0.0/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/ttf/

3. matplotlibの設定ファイルを作成

終わったらフォントファミリーのデフォルトを指定します。seabornはmatplotlibのラッパーぽい雰囲気なので、設定はmatplotlibだけでOKです。

vi ~/.matplotlib/matplotlibrc

でファイルを作成して、以下を追加。

font.family         : IPAmincho

4. 再起動

Pythonを再起動すると日本語が表示されるようになってます。 f:id:hayato1986:20161222210608p:plain

以上で日本語が使えるようになったと思います。 オラッオラオラオラッ(•ө•)♡

webclip から url scheme でパラメータを渡してアプリを起動する

f:id:ie-kau:20161220143209p:plain:w300


ユースケース

  1. エンドユーザーに任意のページを webclip してもらう
  2. エンドユーザーはiOSホーム画面に webclip されているページを Safari の standalone モードで起動する
  3. そのままネイティブアプリにディープリンクでリダイレクト
    • その際に url scheme を利用してパラメータをネイティブアプリに渡す

どういうメリットがあるか?

これにより webclip のURLに仕込んであるパラメータをアプリに渡せ、直接該当アプリの対象画面をパラメータ付きで開くことができます。
既に該当するアプリはユーザーのiOS端末にインストールしてあることが前提ですが、検索結果経由のurl scheme起動ではなく、まるでネイティブのアプリを開くかのように webclip から該当のアプリケーションの対象となる画面を開くことができるようになります。

Web側

<meta name="apple-mobile-web-app-status-bar-style" content="black" />                
<meta name="apple-mobile-web-app-capable" content="yes" />
<link rel="apple-touch-icon" href="[touchアイコンへのパス]">

以前は、下記記述でスプラッシュ画像を表示できたのですがiOS9からはできなくなったようです。

<link rel="apple-touch-startup-image" href="[スプラッシュ画像へのパス]">

standalon モードで起動した場合はwindow.navigator.standaloneがtrueになるので、 webclip からの起動と判断でき、それを条件に該当アプリにリダイレクト。

if (("standalone" in window.navigator) && window.navigator.standalone) {
  location.href = 'test_app://?id=1
}

スプラッシュ画像っぽくwebclipから起動した画面を見せたい場合は、こんな感じにすればいいかと。
※雑です。

  <head> 
-- 省略 --
  <style>
    body {
      width: 100%;
      height: 100%;
    }
    body > div {
      width: 100%;
      height: 100%;
      background-repeat: no-repeat;
      background-size: cover;
    }
  </style>
  </head> 
  <body>
    <div style="background-image:url([スプラッシュ画像代わりの画像のパス])"></div>
  </body>
// ※要 jQuery
  $('body > div').hide();
  $(window).on('load', function() {
    if (('standalone' in window.navigator) && window.navigator.standalone) {
      var img = new Image();
      img.onload = function() {
        $('body > div').fadeIn(300, function() {
          setTimeout(function() {
            location.href = 'test_app://?id=1
          }, 500);
        });
      }
      img.src = '[スプラッシュ画像代わりの画像のパス]';
    }
  });

アプリ側

通常通り url scheme が使えるようにしておきます。
info.plist > URL types

f:id:ie-kau:20161218173028p:plain

参考

独学でネットワークスペシャリストに合格するための対策、勉強方法、勉強時間、参考書を公開するよ

※最終更新 2017.06.05

こんにちは。@hazumu です。

昨年度しれっと落ちたネットワークスペシャリストに今年はかろうじて受かったので、今後取得しようと考えている人に向けて勉強方法と、勉強内容をまとめておきます。

f:id:ie-kau:20161218195512p:plain
ギリギリ!!!

ネット上には緻密に計画を練って合格している記事が多いのですが、僕自身そこまで計画して勉強するタイプじゃなくモチベーションが乗ってきて面白いから勉強するってタイプなのでどちらかというとそういう人向けです。

合格ラインが60%だから逆算で何点取れば…みたいな勉強方法は得意じゃありません。 (要領悪いけど)

対象読者

  • 今後ネットワークスペシャリストの受験を考えてる人
  • 開発職だけどネットワークには詳しくない人でネットワークを勉強したい人
  • 計画して勉強するのが苦手な人

ネットワークスペシャリストとは?

ネットワークの固有技術からサービス動向まで幅広く精通し、目的に適合した大規模かつ堅牢なネットワークシステムを構築し運用できるネットワークエンジニアやインフラ系エンジニアを目指す方に最適です。

※引用元
IPA 独立行政法人 情報処理推進機構:制度の概要:ネットワークスペシャリスト試験

試験形式

午前Ⅰ 午前Ⅱ 午後Ⅰ 午後Ⅱ
多肢選択式
(四肢択一)
※今回はパス
多肢選択式
(四肢択一)
記述式 記述式

社内ネットワークやサーバーのネットワークの構築から保守、VoIPの問題まで多岐にわたる問題が出題されます。

受験理由

  1. 本職はフロントエンジニアなのでインフラ周辺の実務経験が少く理論と知識だけでも補完しておきたい
    • ただ、何故かリアルタイム通信を必要とする案件に当たる確率が高いので知識の拡充は避けて通れない
  2. なんとなく通信プロトコルとか面白そう

転職を繰り返したり採用をしたりとしてると分かるのですが、Web系で自社プロダクト開発をしている企業だとほとんど資格は重視されないので本当に飾りにしかならないのですが、得た知識は実務で役立つので勉強して損になることはないと思っています。

本を読むだけよりも一定の反復が生まれるので学習内容の定着もいいですしね。

2015年

で、2015年秋に一回受けたのですが、午後2で3点足りずに落ちましたorz
この年に行った学習内容と期間は以下のとおりです。

学習開始時は
ICPM? ( ᐛ) パァ
みたいなレベルでした。

8月

9月

10月

結果、午前2は通過して、午後1通過ならず。

2015年の反省

  • L2の知識(LAN、ルーティングプロトコル)、セキュリティ周りの知識・経験不足が顕著
  • 午前1は過去問丸暗記で行けるから試験5日前ぐらいからの勉強開始でいい
  • 面白がって基礎理論を悠長に勉強していたけど、受かるためには過去問を解き続ける方が要領がいい
    • 時間も限られているので2016年は少しスタンスを変える

2016年

2015年の反省を元に、日程的な計画は立てずにやることだけを絞りました。
他に勉強しないといけないとこも多いし、これ以上同じ試験を受けたくないので受かる方向にフォーカスします。

少々仕事が忙しかったので9月からの勉強開始になりましたが、昨年の貯金も多少あったのでギリギリなんとかなったイメージです。

読み込む本

ルーティング&スイッチング標準ハンドブック 一番大切な知識と技術が身につく

ルーティング&スイッチング標準ハンドブック 一番大切な知識と技術が身につく

L2の知識補完が選定理由。

問題集

このシリーズの解答と解答の理由を3冊分丸暗記。
とても丁寧に解説が書かれているので、他の問題集に脇目も振らず「これだけやればいいんじゃね?」という仮説のもと専心することに。

ネスペ 27 礎 -ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

ネスペ 27 礎 -ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

ネスペ 26 道 ?ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

ネスペ 26 道 ?ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

ネスぺの剣25 ~ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

ネスぺの剣25 ~ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

※追記 2017.06.05

新しい書籍でていましたね。

ネスペの基礎力 -プラス20点の午後対策 (情報処理技術者試験)

ネスペの基礎力 -プラス20点の午後対策 (情報処理技術者試験)

午前2対策

  • 5日前から過去問丸暗記

はい、パワープレーです。なんとかなりました。
余談ですが、午後2がWebRTCの問題で前前職の社内輪読会で話題に上がっていたのも大きかったかも・・

総評

2015年にヘマをしたので、えらく時間がかかってしまいましたが。 ネットワークに関する知識がそこまでない状態からでも、お そ ら く、以下のことをすればなんとか受かるのではないでしょうか。

  1. 「ネットワークはなぜつながるのか」、「マスタリングTCP/IP」の二冊で外観を得る
    • L2の知識補填のため「ルーティング&スイッチング標準ハンドブック」を読み込む
      • ※L2の知識が薄い場合の任意
    • 細かいプロトコルやアルゴリズムの用語はここで覚える
  2. 「ネットワークスペシャリストの最も詳しい過去問解説 」の出版されてているもの全ての解答と解説を丸暗記
  3. 試験の週に午前2の解答を丸暗記

(※午前1がパスの場合になっていますが。)

まとめ

ほぼ趣味みたいなところもある受験でしたが、業務でも早速「(AWSの) SESのメールが届かない」みたいな話題になった時に大体どこを見ればいいか即座に見当がつくようになったので勉強してよかったなと思います。

今回はギリギリ合格だったし仕事でも守備範囲を広げられるようにもう少し勉強しないとね。( ᐛ) オラッオラッ

Vimの置換で後方参照とvery magic modeを利用してReactのJSXのclassNam属性を通常のHTMLのclass属性に一括変換する

f:id:ie-kau:20161213195449p:plain:w400

やりたいこと

ReactのJSXにCSS modulesなどを使って以下のように動的にクラスを適応したとします。

<div className={CSS.modal}>
  <div className={CSS.title}>タイトル</div>
  <div className={CSS.contents}>コンテンツ</div>
</div>

で、Reactの利用を途中でやめたので、className属性をのclass属性に変更したいと思います。

<div class="modal">
  <div class="title">タイトル</div>
  <div class="contents">コンテンツ</div>
</div>

Vimのバージョン

vim 7.4

結論

結論から言ってしまうと下のようにかけます。

:%s/\vclassName\=\{CSS.(.*)\}/class="\1"/g

後方参照
Vimの置換における後方参照は置換後の文字列で\1, \2というメタ文字を利用します。

very magic mode

これ知らなかったんだけど、Vimの正規表現で利用できるメタ文字をすべて「\」記述のなしで書くことができる検索モードのようです。/(^o^)\ シラナカッタ
書式としては、検索文字の前に「\v」を記述するだけ。

very magic modeを利用しない場合はと言いますと、グループ用のメタ文字()をエスケープさせる必要があります。 ↓

:%s/className={CSS.\(.*\)}/class="\1"/g

ん?
今回の場合「{」がメタ文字じゃなくて通常の文字だから very magic modeじゃないほうが楽じゃない?

追伸

祝!100記事目!

Swiftのmap,filter,reduceに慣れる

f:id:ie-kau:20151120074851p:plain


勉強不足でSwiftのcollection型にmapやreduceなどの関数が存在していることを知らずfor文で回してたので慣れるためにも幾つか遊んで見る。

map

引き数のクロージャ内でコレクションの値を計算して新しいコレクションを返す。

計算する

let arr = [1, 2, 3, 4]
let arr2 = arr.map { $0 * 2 } 
// arr2 => [2, 4, 6, 8]

型変換

let arr = [1, 2, 3, 4]
let arr2 = arr.map {
    (i: Int) -> String in
    return String(i)
}
// arr2 => ["1", "2", "3", "4"]

Dictionary型でもOK

let arr = ["a":1, "b":2, "c":3, "d":4]
let arr2 = arr.map {
    (_: String, val: Int) -> Int in
    return val * 2
}
// arr2 => [4, 2, 8, 6]

filter

引き数のクロージャ内の条件式でtrueを返す条件に合致した値のみのコレクションを返す。

よくある使い方

let arr = [1, 2, 3, 4]
let arr2 = arr.filter { $0 % 2 == 0 } 
// arr2 => [2, 4]

Dictionary型に使う
タプルの配列で返ってくる。

let arr = ["a":1, "b":2, "c":3, "d":4]
let arr2 = arr.filter {
    (key: String, val: Int) -> Bool in
        return key == "a" || key == "c"
    }
// arr2 => [(.0 "a", .1 1), (.0 "c", .1 3)]
// arr2[0].0 => "a"

reduce

コレクションの値をすべて組み合わせて新しい値を返す。

短く書く

let arr = [1, 2, 3, 4]
let val = arr.reduce(0, +)
// val => 10

クロージャを使う

let arr = [1, 2, 3, 4]
let val = arr.reduce(0, { 
    (accum: Int, current: Int) -> Int in 
        accum + current 
})
// val => 10

チェーン

当然チェーンさせて組み合わせることもできる。

let arr = ["a":1, "b":2, "c":3, "d":4]
let arr2 = arr.filter {
    (key: String, val: Int) -> Bool in
        return key == "a" || key == "c"
    }.map({
    (key: String, val: Int) -> Int in
        return val * 2
    })
// arr2 => [2, 6]

まとめ

他によく使うところでは、forEachやsortも組み込みで存在する。 次回はflatMapを含めてもうちょい深入りしてみよう。

参考