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 そのう…

シェルスクリプトの変数の代入・参照、値が空のときの処理

参考 : プロフェショナル・シェルプログラミング (アスキー書籍) シェルスクリプトの変数の代入と参照 # 変数の代入は前後にスペースを入れない name=Jonh # 変数の参照は"$"をつける echo $name # => John # これでもOK echo ${name} # => John # 文字列の…

React.js と Redux でナンプレのサイトを作った

作った。日替わりナンプレ楽しかった。

「カリー化」を例でさっくり理解する

カリー化を例でさっくり理解する 「カリー化」です。 いきなり定義から入ると数学っぽくなってやる気がなくなるので、例から入ります。以下、JavaScript です。 カリー化の基本 べき乗を求める関数 pow(x, y) があるとします。 function pow(x, y) { return …

反転(2題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本(通称:蟻本)の章末で紹介されている練習問題をひたすらといている。反転。端っこを決めるとそこからカタカタと自動的に全部…

しゃくとり法(2題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本(通称:蟻本)の章末で紹介されている練習問題をひたすらといている。 POJ2566: Bound Found 2566 -- Bound Found 問題概要 N …

二分探索:その他(2題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本(通称:蟻本)の章末で紹介されている練習問題をひたすらといている。二分探索。その他。 POJ1759: Garland 1759 -- Garland …

二分探索:k 番目の値を検索(2題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本(通称:蟻本)の章末で紹介されている練習問題をひたすらといている。二分探索。k 番目の値を検索する問題である。 10^9 個く…

二分探索:k 番目の値を最小化(1題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本(通称:蟻本)の章末で紹介されている練習問題をひたすらといている。二分探索。k 番目の値を最小化する問題である。 POJ3662:…

二分探索:平均の最大化(2題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本(通称:蟻本)の章末で紹介されている練習問題をひたすらといている。二分探索。平均の最大化の問題である。 やっていることは…

二分探索:最小値の最大化(4題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本(通称:蟻本)の章末で紹介されている練習問題をひたすらといている。第3章の章末に入った。二分探索。最小値の最大化である…

繰り返し二乗法(2題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本(通称:蟻本)の章末で紹介されている練習問題をひたすらといている。繰り返し二乗法。べき乗の高速な計算アルゴリズムなんだ…

素数(4題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本(通称:蟻本)の章末で紹介されている練習問題をひたすらといている。素数の問題。エラトステネスのふるい。有名だし、これと…

ユークリッドの互除法(2題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本(通称:蟻本)の章末で紹介されている練習問題をひたすらといている。今回はユークリッドの互除法。最近はユークリッドの互除…

最小全域木:クラスカル法(4題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本の章末で紹介されている問題をひたすら解いている。 今回はグラフの最小全域木を求める問題。 最小全域木とは、(連結なグラフ…

【Python】組み込み関数zip()でディクショナリを初期化する

zip()はディクショナリの初期化に向いている。 zip()の基本的な使い方 公式ドキュメント2. 組み込み関数 — Python 3.4.3 ドキュメントより zip(*iterables) それぞれのイテラブルから要素を集めたイテレータを作ります。この関数はタプルのイテレータを返し…

最短経路問題:ダイクストラ法、ベルマンフォード法、ワーシャルフロイド法(6題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本(通称:蟻本)の章末で紹介されている練習問題をひたすら解いている。今回は最短経路問題。はじめに最短経路問題を解くアルゴ…

Union-Find木(3題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本(蟻本)の章末で紹介されている練習問題をひたすら解いている。 今回は、Union-Find木を使う問題。 Union-Find木に関するいち…

プライオリティキュー(2題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本の章末で紹介されている練習問題をひたすら解いている。 今回はプライオリティキューを使う問題。 POJ2010: Financial Aid 2010…

動的計画法:少し考察を要する問題(5題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本(通称「蟻本」)の章末で紹介されている練習問題を淡々と解いている。 今回は動的計画法の第三弾。難しかった。しかも解いてか…

動的計画法:漸化式を工夫して高速化(3題)

漸化式を工夫して高速化をはからなければならない動的計画法の問題。 だいたい最初に思いつく漸化式が、間違っているわけではないけれど効率が悪く、提出するとTime Limit Exceededになる。 そこで、漸化式を改善して時間内に解けるようにしましょうね、とい…

個数制限付き部分和問題(POJ1742)

1742 -- Coins POJ1742を解こうとしたが、蟻本P.62の「個数制限付き部分和問題」とほぼ同じだった。 この問題の漸化式の作り方が難しかったので、ここで整理しておく。以下、蟻本P.62-63を参考に書いた。 蟻本:プログラミングコンテストチャレンジブック […

基礎的な動的計画法(5題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ いわゆる「蟻本」である。この章末で紹介されている練習問題をひたすら解いている。 今回は基礎的な動的計画法。基礎的といっても最後…

貪欲法…その他(5題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本の章末で紹介されている練習問題を解いている。貪欲法(その他)だ。 貪欲法とはいっても、この問題群は要素を選ぶ順番をうまく…

貪欲法…線分(3題)

プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~ この本の章末で紹介されている練習問題をひたすら解いている。解説だけでなくテーマに沿った類題も豊富に紹介してくれているのがこの…