fujithuro.log

プログラマーの雑多な書き残しです

1から100までの偶数の和を1行で求める

1から100までの偶数の和を1行で求めるっていうのをTwitterで見かけたので、Kotlinで書くとどうなるか考えた。


最初に浮かんだのはこれ。

(1..100).filter { it % 2 == 0 }.sum()

1から100までの偶数の和という日本語がそのままコードになった感じで一番素直かと。


こっちの方が短く書けてスッキリ。短いのは良いこと。

(2..100 step 2).sum()

でも奇数からスタートするとダメになるから、任意の数から任意の数までの偶数の和に変わると対応できないって意味で汎用性が低いかも。

要件に出てきた1,100以外の数値でrange作ってるのも個人的にちょっとイヤ。


こういうパターンもある。任意の数から100までの偶数の和みたいにstartが変わるだけなら、これで対応できる。

(100 downTo 1 step 2).sum()

題意を満たすだけなら、こういうのも有り。

(1..50).sum() * 2

Kotlinでの文字列ゼロ埋め

(2024.04.03 追記)

本記事のアップデート版をQiitaに投稿しました。 そちらもあわせてご確認ください。

qiita.com


Kotlinでゼロ埋めする時の話。

それくらいサクッといくだろと思ってたら、意外と時間取られて切なくなったので書き残す。

ちなみに動かしてる環境のKotlinは1.3.21です。

Javaだとこうだよね

numberの値を4桁でゼロ埋めする

String.format("%04d", number);

Kotlinだとどうする?

最初に見つけたのは、こうしたらできるよって情報だったけど、これはさすがにあんまり、、

java.lang.String.format("%04d", number)

で、ちゃんと英語でkotlin zero paddingって検索したら一発で公式が出てきた。調べるときは横着やめよう。

padStart - Kotlin Programming Language

"12".padStart(4, '0')

ちゃんとこうなる

0012

ちなみに後ろを文字埋めしたかったらpadEndっていうのがあるみたいですね。

padEnd - Kotlin Programming Language

"12".padEnd(4, '0')

こうなる

1200

認証と認可、多要素認証と多段階認証

7payのこともあったので、セキュリティの基本的なことについて、理解がフワフワしていたり半ば忘れていたりする情報を改めて整理。

認証と認可

認証と認可の違いは、この記事が分かりやすかった。

dev.classmethod.jp

基本的にこの記事の繰り返しになってしまうけど、咀嚼するために自分でも文章にしてみる。

認証

Authentication (AuthN)

相手が誰なのかを確認すること。本人確認。

相手が誰なのかを確認する、というところまでが認証であって、確認できたからどうする、という話はまた別。

認証の3要素

何を使って認証するかには3種類ある。

生体認証 (WHAT YOU ARE: WYA)

その人自身を提示することによる認証。

顔、指紋、署名、動作など。

所有物認証 (WHAT YOU HAVE: WYH)

その人だけが持っているものを提示することによる認証。

家の鍵、印鑑、身分証明書、非接触ICカード、セキュリティトークンなど。

知識認証 (WHAT YOU KNOW: WYK)

その人だけが知っていることを提示することによる認証。

パスワード、合言葉、暗証番号、特定のパターン(Androidのロック画面とか)など。

認可

authorization (AuthZ)

特定の条件に対して、アクセスする権限を与える(許可する)こと。

特定の条件を満たしているから許可する、というところだけが認可であって、どうやって条件を満たしたか(あなたが誰なのか)は別の話。

先の記事から引用すると、切符を持っているから電車に乗れる。切符を自分で買ったのか誰かにもらったかは関係ない。
鍵を持っているから家に入れる。あなたの身元が確認できたから入れるのではなく、鍵があったから入れたというだけ。

多要素認証と多段階認証

さっきの記事から離れます。
名前が似てるけど別物の「多要素認証」と「多段階認証」について。

この記事が分かりやすい。

www.segunabe.com

多要素認証

認証の3要素のうち、複数を示すことで認証するやり方。

つまり、クレジットカード(WYH) を示した上で暗証番号(WYK) を入力しないと決済できない、とか、暗証番号(WYK) と静脈認証(WYA) を通らないとATMでお金を下ろせないとかそういうの。

ちなみに同じ要素を複数求めるだけでは、あまりセキュリティは上がらない。理由は、一度にまとめて奪いやすいから。

具体的に言うと、通帳(WYH) と印鑑(WYH) が同じ場所に置いてあったらまとめて盗まれちゃうし、指紋認証(WYA) + 虹彩認証(WYA) を求めても、本人がさらわれて強要されたらまとめて突破される。

でもキャッシュカード(WYH) と暗証番号(WYK) なら、キャッシュカードが盗まれただけではまだ突破できない。なので比較的強度が高い。

多段階認証

認証プロセスを二段階に分けるやり方。

典型的な例は、まず一段階目としてIDとパスワードでの認証を行い、二段階目に、スマートフォンに送られてきたSMSのワンタイムパスワードで認証するパターン。

ワンタイムパスワード用のトークンを使う場合もある。オンラインバンキングとか。

デプロイ設定のexploded

IntelliJで開発してるとき、社内の環境構築資料に従ってhoge.war (exploded) をデプロイする設定にしてたけど、explodedって何か分かってなかったのでググった。

What does Exploded Development mean? (In Java) https://stackoverflow.com/questions/1289358/

つまり、explodedは全部WARとかEARに固めてしまうのではなくて生の状態も含めてデプロイすること。

explodedであればAPサーバーのHot Deploy(コードとかJSPとかの変更を動作中のアプリケーションに即時反映させる)が効くから、開発の時便利だよね、みたいな話ですかね。

JavaScriptとかCSSについて整理

自分の中でフワフワしてて、毎回も調べてる言葉をちゃんと定着させるために少しずつ整理。

用語

ECMAScript

  • JavaScriptの標準規格。
  • ES6の時から毎年更新しようということになったのでバージョン表記が西暦になった。ES6=ES2015。
  • 今はES5~6くらいが主流。それ以上はブラウザが追い付いてない。

トランスパイル(transpile)

  • あるバージョンで記述されたJavaScript/TypeScriptから別のバージョンのJavaScriptを生成すること。
  • 新しすぎるとブラウザの種類やバージョンによっては対応していないので、広く対応している形式にする。

ポリフィル(Polyfill)

  • 古いブラウザでは実現できないAPIを、同等の機能を利用できるように補うための小さなライブラリみたいなもの。
  • IEをスタートラインに立たせる。ES5まで追いつかせる

バンドル(bundle)

  • ファイルを1つにまとめる。
  • 例えば、node_modulesにあるjsを一纏めにbundleして、HTML側ではそのファイルだけ読み込む、とかすると、モジュールが新しくインストールされてもいちいちHTML側を触る必要がない。

ミニファイ(minify)

  • サイズを小さくする。読み込みが早くなる。

プラットフォーム

Node.js

  • サーバーサイドで動くJavaScriptフレームワークやライブラリではなく、JavaScriptアプリケーションのプラットフォーム。
  • 非同期。I/Oの結果を待たないで処理を進める。
  • リアルタイムなアプリケーションに合う。SPAとか
  • 何かのイベントを受けて動き始める。
  • 例えばC10K問題の解決に使われる。ディスクへの書き込みには時間がかかって、それをCPUやメモリが待たないといけないのは時間の無駄。書き込みの命令だけ出して、結果を待たずにどんどん次の処理に行くことで、大量のリクエストがあってもすごく早く捌けるようになる。

パッケージ管理

npm

  • Node.jsのパッケージのバージョン管理ツール。
  • インストールしたパッケージはnode_modulesに入る。

yarn

  • JavaScriptのパッケージマネージャー。
  • npmに対して後発で、より速くて簡潔。
  • インストールしたパッケージは、やはりnode_modulesに入る。

タスク自動化ツール

gulp

  • Node.js を使ったタスク自動化ツールで、フロント周りのビルド(CSSJavascriptの結合(bundle)や圧縮(minify)、Sassのコンパイルなど)を任せられる。
  • Javaの世界でいえばGradleとかAntみたいな。
  • Gruntの後発。

Grunt

  • Node.js を使ったタスク自動化ツールで、フロント周りのビルド(CSSJavascriptの結合(bundle)や圧縮(minify)、Sassのコンパイルなど)を任せられる。
  • Javaの世界でいえばGradleとかAntみたいな。
  • gulpよりも先輩。

モジュールバンドラー

webpack

  • cssファイルのbundle化が簡単にできる。
  • gulpとかGruntが自力でもやれるけどwebpackの方が簡単にできる
    • と言いつつ、webpackもそんなに簡単じゃないので、簡単にするためのラッパーも出てきてる

トランスパイラー

Babel

  • ES6(2015)以上をES5に変換する

CSS関係

PostCSS

  • Node.js製の、CSSツールを作るためのフレームワーク
  • これ自体はただのCSSパーサー。
  • 今後標準になりそうなCSSの書き方でいける
  • こんな流れ

    • PostCSS: CSSを受け取って、ASTを作る。
    • プラグイン: そのASTを受け取って任意の操作をする
    • PostCSS: 操作後のASTを文字列に戻して、新しいCSSの出来上がり

SASS

  • CSSを拡張したメタ言語。プログラムっぽくcssを書けるので、書きやすいし保守性も上がる。関数や変数も使える。
  • そのままだとブラウザが認識してくれないので、gulpなどでCSSを書き出す(コンパイルする)必要がある。

  • 書き方は「SASS記法」と「SCSS記法」がある。

    • SASS記法
      • 本来のSassの記法。
      • 記述がRubyライクで、簡潔。
    • SCSS記法
      • SASSがCSSとの互換性が乏しかったので生まれた。
      • CSSの書き方がそのまま使える。

参考にさせて貰ったページ

gulpとbabelとwebpackというフロント開発3銃士

https://qiita.com/bakira/items/3c4e2d10aae085767817

Webpack の考え方について

https://mizchi.hatenablog.com/entry/2018/11/26/164523

フロントエンド知らない私のwebpack入門 その1

https://qiita.com/knjname/items/b8ca62c12238ade9c263

Node.js を5分で大雑把に理解する

https://qiita.com/hshimo/items/1ecb7ed1b567aacbe559