オブジェクト指向でモナドするならメソッドチェーンで書くと自然になるかも

オブジェクト指向の言語でモナドっぽいことをするなら、メソッドチェーンできるように実装すると自然になるかなと思った。 JavaScript では Promise がモナドなのだけど、 bind 的なことをしているのは then なわけです。 // doSomethingAsync の型が number…

ヘッドレスChromeでスクレイピングする例

ヘッドレス Chrome でスクレイピング。かなり手軽にやれることがわかった。 簡単な例をいくつか書いてみた。 準備は npm install chromy するだけ。 Google 検索して、タイトルとURLを取ってくる Amazon 検索して、本のタイトルを取ってくる Instagram ハッ…

【JavaScript】reduce(Object.assign)で失敗した

コレクションの配列をオブジェクトにしようとして、こんな感じのコードをよく書くのだけど、 const users = [{ id: 1, name: 'suzuki' }, { id: 2, name: 'sato' }] const usersById = users .map((user) => ({[user.id]: user})) .reduce((obj, userObj) =>…

【JavaScript】配列のreduce関数の可読性を少し上げるテクニック

JavaScript の話題です。配列の reduce 関数、書きやすいけど可読性が低いですよね。 たとえば以下のようにコレクションを変換して id をキーとしたオブジェクトにするという操作。慣れてくれば普通に読めますけど、なんとなく読みにくいんですよね。 const …

Webエンジニアでも圏論したい!(関手篇)

この記事の目標は、「配列の map 関数は関手である」とドヤ顔で言えるようになることです。 初回の記事はこちら。 Webエンジニアでも圏論したい! 配列の map 関数を観察する まずは配列の map 関数をよく観察してみます。 map 関数はこんなやつですね。(コ…

二度と忘れないawkコマンドの基本

結論としては、これだけ。 awkはテキストの各行に対して pattern { action } を実行する。 これだけ覚えれば間違えずに使える。 awk コマンドはテキスト整形に便利だが、使い方をよく忘れるのでいつもググっている。 使い勝手が悪いわけではないけど、多機能…

Rustの練習でenvsubstを車輪再発明

Rustの練習がしたかった。新しくプログラミング言語を学ぶときにはテンプレートエンジンを作るのが手頃な難易度で良いと誰かが言っていたので、envsubst みたいなやつを作ろうと思った。 envsubstはテキスト中の$FOOのような文字列を環境変数の値に置き換え…

.bashrcで機密情報の環境変数を設定するべきではない

npm でマルウェアが発見されました。プロセスの環境変数を勝手に外部サーバーに送るそうです。 npmjs.com で著名ソフトウェアによく似た名前のマルウェアが大量に発見された 環境変数でパスワードや API Key などの機密情報を管理しているとやばい。対策とし…

Webエンジニアでも圏論したい!

この記事の目標は、「型付きの純粋な関数は圏をなす」を理解することです。 始めていきましょう。 TypeScript で圏を作ろう なじみある具体例から始めます。圏論はとりわけ抽象度が高いため、圏の定義を天下り的に書いても何を言っているのかわかりませんか…

sedコマンドはチューリング完全

チューリング完全とは、万能チューリングマシンと同じ計算能力を持つこと。ざっくり言うと、条件分岐やループが実現できて普通のプログラミング言語で実現できるアルゴリズムを作れる能力を持つことです。 sedコマンド sed コマンドは、テキスト処理を手軽に…

Node.jsでOption型を学ぶ

Option 型というものがある。 Option type - Wikipedia 概要部分を Google 翻訳に突っ込むと、 プログラミング言語(関数型プログラミング言語ほど)と型理論では、オプション型または多分型は、任意の値のカプセル化を表す多型です。 例えば、それが適用さ…

GitHub as a Data Storage的なやつ

データベースを立てるほどじゃないけど気軽にデータを保存したい。GitHub as a Data Storage 的な考え方のツールを Node.js で作った。 remote-git-storage 使い方はこんな感じ。アクセストークンを用意して、リポジトリを指定する。 ref()でファイルにアク…

【最小構成】React + Firebase で認証つきリアルタイムDBアプリ

Firebase の練習。 リアルタイムDB 認証 を使ったミニマムな Web アプリケーションを React で実装してみる。 成果 GitHub https://github.com/FujiHaruka/react-firebase-simples アプリ https://test-app-dd4f5.firebaseapp.com/ 1. 準備 [create-react-ap…

【JavaScript】class構文で宣言したクラスのメソッド名を取得する

結論としては、prototypeに対して Object.getOwnPropertyNames()を使えばよい。 class Person { sayHello () { console.log('hello') } } let methods = Object.getOwnPropertyNames(Person.prototype) console.log(methods) // > [ 'constructor', 'sayHell…

ReactでMarkdown Editorを爆速で作る

n番煎じだけど気にしない。完成品。 React Markdown Editor Github 1. create-react-appでひな型を作る create-react-appを使う。 $ yarn global add create-react-app $ create-react-app react-markdown-editor 待つこと数十秒。yarn が速いので助かる。 2…

【JavaScript】Arrayのreduce関数を自由に使いこなす

配列の reduce 関数は、配列から一つの何か(オブジェクト、数値、文字列)を作りたい時に使います。 いつものように具体例から。 let array = [1, 2, 3, 4, 5] let sum = array.reduce(function (sum, num) { return sum + num }, 0) console.log(sum) // 1…

【JavaScript】深さ優先探索をジェネレータで書く

深さ優先探索をジェネレータファンクション function * () で書いてみよう。 深さ優先探索の素朴な例 まず、深さ優先探索が必要になる課題を考える。 【課題】 ネストされたオブジェクトを deep freeze せよ。 Object.freeze はオブジェクトをフリーズしてく…

Go言語で競プロの問題を解く

練習したのを貼る。 https://gist.github.com/FujiHaruka/650f50a4f6a86a879b4ecebd4d822bb8 雰囲気はこんな感じ。AtCoder Contest 053 D問題の解答。言語に関しては競プロの解答が書けるために必要な知識は少ない。練習にはちょうどいいが、これくらいでは …

Reactでベンチマークテストするならreact-addons-perf

React でパフォーマンスが気になった時にレンダリングの時間をどうやって計測するんだろうと思ったら、公式にあった。 Performance tools react-addons-perf というツールで計測できる。 以下、簡単なサンプルコード。 import React, { Component } from 're…

JavaScript で動的にメソッド/プロパティを生成する

JavaScript で動的にメソッドやプロパティを生成するには、 Proxy を使うという方法がある。 Proxy - JavaScript | MDN - Mozilla Developer Network 例えば、あるメソッドをあらかじめ定義せずに実行したい。とりあえずメソッドを実行したら、そのメソッド…

Node.js 8.0.0 から promisify が使えるようになった

Node.js 8.0.0 から util.promisify が使えるようになった。 これで、外部ライブラリを使わなくても promisify ができる。 const { promisify } = require('util') const { readFile } = require('fs') const readFileAsync = promisify(readFile) async fun…

docker execで実行したコンテナ内のプロセスを kill する

インストールがめんどくさいツールを使う時に、 Docker コンテナ立てて exec すれば楽じゃん、と思った。 ところが、 docker exec で実行したプロセスを kill するにはひと手間必要だった。 # コンテナを立てる。 $ docker run -d --name my-ubuntu ubuntu:1…

0.999...=1を中学生にわかるように厳密に証明した。

この記事を読んで、中学生にもわかる証明を書きたくなった。でもεδ論法とか実数の公理とかは使いたくない。そういうのを使わずにできるだけ厳密にやってみたいと思った。 以下、対話の続きっぽく書いた。 0.999...=1の証明 先生「あれから先生考えてみました…

シンプルな数式のパーサー(操車場アルゴリズム)

構文解析にちょこっと興味が出てきたので、単純な数式をパースする関数を Node.js で書いた。参考にしたのは 操車場アルゴリズム(Wikipedia) と JavaScript で数式パーサを書いてみた。 です。 数式の定義 できるだけ実装をシンプルにしたいので、数式の定義…

プログラミングの写経サイトを作った

プログラミングの練習用に他人のコードを写経することってよくありますよね? そこで、写経用のサイトを作りました。 写経ザ・プログラム ぜひ使ってみてください! なぜ写経なのか プログラミング言語を習得するために「写経」がおすすめ、みたいな記事はグ…

Reactの最低限のテストをEnzymeで書く

React.js のテストをさくっと書きたい。とりあえず、 jsdom とか本格的なことはしたくない。最低限、コンポーネントがエラーを吐かずにレンダリングされることぐらいはテストしたい。そこで Mocha + Enzyme を使う。 Mocha Enzyme 必要なことは Enzyme の RE…

いろいろなモーダルウィンドウの実装

モーダルウィンドウを実装するためには、ウィンドウを表示している状態と表示していない状態を切り替える仕掛けがあればよい。 CSS のみでモーダルウィンドウを実装 (1) 状態の区別をチェックボックスで行い、css の擬似属性 :checked を使って表示/非表示…

【JavaScript】Arrayのmapメソッドは習うより慣れろって感じ

JavaScript で Array の map メソッドが使いこなせるようになると人生が楽しくなってくる。 map の簡単な例 map が何をするのかという説明は後回しで、次の例を見てください。 var array = [1, 2, 3] var newArray = array.map(function (value) { return 2 …

ブール値を関数で定義する(ラムダ計算)

以下、 型システム入門 −プログラミング言語と型の理論− の P.44-45 を参考にした。 ラムダ計算を使って、ブール値を関数で実装する。言語は、Node.js (バージョン 6 以上)。関数型プログラミングに興味あるなら Haskell とか使えよって感じですが、許してく…

主の祈りを出力するコマンドラインツール

「主の祈り」を標準入力に出力するコマンドラインツールを作った。 理由は、最近 npm パッケージの作り方を覚え、npm で簡単にコマンドラインツールを作れることを知ったから。 ソースコードは github で公開している。 npm : oratio github : oratio そのう…