soy-curd's blog

The blog is written about maebashi or sake or beer or program. [https://twitter.com/soycurd1]

JavaScriptでforの二重ループからforを一個削除する方法

プログラマのためのコードパズル」を読んでいたところ、かなり始めのほうに、for文の二重ループから forを一個削除することによりプログラムを短くするコードゴルフの技法が載っていた。 しかし、簡単な説明のみで式変形され、すぐには理解できなかったので、 理解しがてらその方法を紹介していく。

まずは以下のような二重ループがあったとする。

function solve() {
  for (var a = 0; a < 10; a++) {
    for (var b = 0; b < 10; b++) {
      if (a * b === 81) {
        console.log("solve!");
      }
    }
  }
}

solve()

このとき、変数aとbがそれぞれ0から9までインクリメントされ、a*b9*9=81となる場合が発生するので、"solve!"というログを見ることができるだろう。

これをfor一個で書く方法として以下のようなものがある。

function solve() {
for(a=0,b=-1;a<10;b<9||(b=-1,a++))b++,a*b==81&&console.log("solve!")
}
solve()

確かにコードからはforが一個消えている。しかし、消えた分のforの処理はどこで行われているのだろう?

これではわからないので、まずは読みやすくフォーマットしてみる。

function solve() {
  for (var a = 0, b = -1; a < 10; b < 9 || (b = -1, a++)) {
    b++;
    if (a * b == 81) {
      console.log("solve!");
    }
    // ※
  }
}

forの加算式の、b < 9 || (b = -1, a++)が目につくと思う。 ここで、※の部分にconsole.log(a, b)を仕込んでaとbがどのように増えるか見てみる。

0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
1 0
1 1
1 2
.
.
.

普通にforを二重にした場合と同じように、内側のループの変数がインクリメントされ、 その後外側のループの変数がインクリメントされている。

インクリメントしている部分はb++の箇所だ。

それでは、なぜこの箇所でaのループが一回しか回っていないのにもかかわらず、b++が10回も実行されるのだろうか...?

ここで、b < 9 || (b = -1, a++)をもう一度見てみる。これはfor文の加算式ではあるけれど、もっと重要な点がある。それは、a++b < 9の場合は実行されないという点だ。

つまり、このfor文は変数aについてだけのループではない。bが9より小さい場合はbのループを回し、そうでない場合にaのループを回す役目があるのだった。

(b = -1, a++)を式(x), b++を式(y)として、 logの結果にコメントをつけてみると、

0 0  // b == -1 < 9なので式(x)は実行されない。式(y)のみ実行でb == 0になる
0 1  // b == 0 < 9なので式(x)は実行されない。式(y)のみ実行でb == 1になる
0 2  // 上記と同様...
0 3  // 上記と同様...
0 4  // 上記と同様...
0 5  // 上記と同様...
0 6  // 上記と同様...
0 7  // 上記と同様...
0 8  // 上記と同様...
0 9  // 上記と同様...
1 0  // b == 9 < 9ではないので式(x)が実行。aがインクリメントされ1, bが-1になる。さらに式(y)が実行されb == 0になる。
1 1
1 2
.
.
.

ということだとわかる。ひとつひとつ処理を追ってみて、ようやく仕組みを理解できた。

コードゴルフでは、forの([初期化式]; [条件式]; [加算式])の部分で、式で可能なあらゆることをするようなので、そのあたりを注意して本のほうを読み進めていきたい。

AMP対応のためのnpmモジュール作った

www.npmjs.com

ampは全てのcssを外部ファイルではなくhtmlに埋め込まなければならないので、直書きしたくない場合は、 なんらかの手段でhtmlにcssを持ってくる必要がある。

github.com

が良さそうだったが、ampタグには対応していなかったので、PRを出した。だが、よく見るとこのリポジトリはPR放置されるかんじのやつだったので、 amp対応したやつを別に公開しておいた。

使い方

例えば以下のように,

index-amp.html

<html>
  <head>
    <style amp-custom href="./yo-amp.css"></style>
  <body>
    <h1 class="hey">
        Hey!
    </h1>
  </body>
</html>

yo-amp.css

body {
  background-color: cyan;
}

.hey {
  color: red;
}

というようなファイルがあったとき、

yarn add html-inline-amp
./node_modules/html-inline-amp/bin/cmd.js -i index-amp.html -o ./_index-amp.html -b ./

すると、

<html>
  <head>
    <style amp-custom>body {
  background-color: cyan;
}

.hey {
  color: red;
}</style>
  <body>
    <h1 class="hey">
        Hey!
    </h1>
  </body>
</html>

というように、cssがamp-customタグに埋め込まれたhtmlファイルが出力される。

webpackとか使うまでもないときに便利かもしれない。

トヨタ生産方式読んだ

トヨタ生産方式読んだ。サブタイトルに『脱規模の経営をめざして』と書いてあるが、読了後に脱規模なんて単語本文にあったか?という気分になった。目次にもその文言がなく、謎。

内容は二つで、『ジャスト・イン・タイム』と『自働化』が生産の肝であるだという話だった。ジャスト・イン・タイムのほうは、「大量生産だと工程毎に無駄(在庫)が出る」-> 「無駄がでないように必要な分だけ必要なタイミングで作る」ということで、それを実現する方法がカンバン。カンバンを使うと、後工程は前工程に必要な部品を必要な時に要求し、それをもらうことができる。 アジャイルサムライで言うと、WIP(仕掛中のタスク)は4つまでで、イテレーションのない開発をカンバン方式として紹介しているが、これは結局、タスクをどこかで溜めてしまうと、後回しになったり、結局リリースされなかったりすることを防ぐためなのだろう。そこが在庫とのアナロジーになっている。

自働化については「ポカヨケ」とかの仕組みと一緒に説明されていて、機械・ライン・チームは、故障すると自動で止まる。変な部品を後工程に流したりして、後で人手で直す、みたいなことを防ぐためだ。そのために、そもそも人が、ミスをしないように機械やラインを設計したりもする。これについてはCIの考え方が対応する気がする。タスクを回していくなかで、常に高品質でバグのないプロダクトを保つため、こまめにテストし、デプロイする。

本を読んで、脱規模という単語自体は見当たらないが、そのような考え自体はいたるところで示唆される。大量生産できない市場環境の中で、いかに無駄を省いて(真の)生産性を上げるかについて繰り返し語られるからだ。微視的な効率が、巨視的なレベルでの効率を築いていくことに対する、こだわりが伝わってくる。

GitHubのエクステンションサービスでZenHubというものがあって、これがあるとGitHubのissueをカンバンっぽくすることができたり、バーンダウンチャートを見れたりする。これを見るだけでアジャイルしてる感があるので満足度があるのだけれど、何も考えずこれだけ使ってもただ雰囲気だけアジャイルっぽいことをしてるだけなのでたぶん意味がなかった。ただ、今回トヨタ生産方式を読んで思想的なものを学ぶことができたので、今後はよりアジャイルっぽい状態でアジャイルできると思う。

トヨタ生産方式――脱規模の経営をめざして

トヨタ生産方式――脱規模の経営をめざして

Ubuntu16.04でgolangのechoを使う

まとめ

Ubuntu16.04 LTSはデフォルトでインストールされるgolangのバージョンが1.6のため、最新のechoを実行することができないので、golangのバージョンを上げる必要がある。

事象

echoがgolang1.7から入ったcontextパッケージに依存しているため、インストールに失敗する。

対処

# apt-getのリポジトリ更新
sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt-get update
sudo apt-get install golang-go # -> 1.8が入る
go get -u github.com/labstack/echo

以上です。

Ubuntu16.04でgolangの開発環境Goglandのインストール

インストーラーの入手

https://www.jetbrains.com/go/download/#section=linux

JetBrainsのサイトからGoglandをダウンロードします。2017年6月時点では、EAP 9, 171.4694.35が入手できました。

インストー

tarで固められたファイルが手に入るので、解凍してください。Ubuntu16.04の場合、ダブルクリックでArchive Managerが起動しますので、Extractを実行して解凍してください。

その後、terminalを立ち上げ、解凍したディレクトリに入ってから、gogland.shを実行します。

cd {YourLikeDir}/cd Gogland-171.4694.35/bin/
./gogland.sh

その後、GUIの画面が立ち上がります。今回は初めてのインストールでしたので、Do not import settingsを選択しました。

f:id:soy-curd:20170610205622p:plain

これでインストールは完了です。

golangの設定

golangをインストールしていない場合は、まずそこから始めましょう。

sudo apt-get install golang

# bashにgopathの設定
mkdir ~/{YourLikeDir}/go
echo "export GOPATH=$HOME/Project/go" >> ~/.bashrc
echo "export PATH=$GOPATH/bin:$PATH" >> ~/.bashrc
source ~/.bashrc

これで設定は完了です。

Goglandを使ってみる

File > New > Projectから、新規プロジェクトを作成します。 その後、Projectファイルを右クリックして、New > GoFileでgolangのソースファイルを作成します。

f:id:soy-curd:20170610213320p:plain

そして、Configure GOPATHから、GoglandにもGOPATHの設定を行います。

次に、Run > Edit configuretionsから、実行環境の設定を行います。 左上の+を押し、Go Applicationを選択してください。その後、Fileに先ほど作ったファイルを設定します。

f:id:soy-curd:20170610213045p:plain

あとは、Runを押して下のコンソールに実行結果が表示されたらOKです。

みんなのGo言語[現場で使える実践テクニック]

みんなのGo言語[現場で使える実践テクニック]

0からwindows10にPython3.6環境を構築する方法(2017/6版)

mac OSXやlinuxにはデフォルトでPythonがインストールされていますが、windowsにはインストールされていません。 今回はPythonを初めて使うwindowsユーザーがお試しですぐ触れるよう、 windowsで0からPython3.6の環境を構築する方法をまとめてみました。

環境

1. Anacondaのインストー

いきなり、判断が難しいところなのですが、windows 10ではAnacondaを用いてPythonをインストールするのが 最も手軽だという結論に至りました。

Anacondaは数値解析や科学計算のライブラリを含んだ形で配布されているPython環境なのですが、 非常に手軽にPythonを実行することができます。(環境変数の設定さえ必要ありません)

また、windowsにおいてハマるポイントとして、C言語のライブラリを含んだパッケージの導入があるかと思われます。 numpy、matplotlibなどを特にハマらずにインストールするためには、Anacondaの導入が手っ取り早いです。 (Django等を使ってwebサーバを建てたい、という方には関係ないですが)

https://www.continuum.io/downloads

リンク先にPython3.6のインストーラーがありますので、そこからダウンロードしてください。 f:id:soy-curd:20170603230920p:plain

ダウンロードが終わったら、インストーラーを実行してください。 何個か選択肢がありますが、 特にこだわりがなければ、すべてNextを押せば問題ありません。

f:id:soy-curd:20170603231146p:plain

2. Pythonの実行

Anacondaのインストールに成功したら、すぐにPythonを使うことができます。 おそらくスタートメニューには、以下のようなものがインストールされているはずです。

f:id:soy-curd:20170603231855p:plain

この中からAnaconda Promptを選んで、起動してください。

すると、以下のようにプロンプトが立ち上がるはずです。

f:id:soy-curd:20170603232350p:plain

あとはプロンプト内でpythonと入力してください。Pythonが立ち上がります。

それでは、試しになにか実行してみましょう。

f:id:soy-curd:20170604000230p:plain

Pythonが無事に動いたことが確認できました。

3. ライブラリを利用する

今回はAnacondaを利用してPythonをインストールしたので、そのままの状態で、すでにたくさんのライブラリを使うことができます。

どのようなライブラリがインストールされているかは、pip freezeというコマンドで確認することができます。

試しにこの中に入っているmatplotlibという作図ライブラリを使用してみましょう。

まずは先ほどと同じように、pythonを起動してください。 そして、

import matplotlib.pyplot as plt
import random
xs = range(100)
ys = [random.randint(0, x) for x in xs]
plt.plot(xs, ys)
plt.show()

のように、実行してみてください。すると、

f:id:soy-curd:20170603234058p:plain

上記のような画像が表示されたかと思います。このように、Pythonを使うことでグラフの描画も簡単に行うことができます。

4. おわりに

以上、windowsで0からPythonの環境を構築する方法を示しました。 このように、Pythonは非常に簡単に始めることができますので、 windowsユーザーの方も、ぜひ一度最近はやりのPythonを触ってみてください。

みんなのPython 第4版

みんなのPython 第4版

実践力を身につける Pythonの教科書

実践力を身につける Pythonの教科書

『入門ビットコインプログラミング〜Pythonによるビットコインの売買〜』をpdf販売します

第二十四回文学フリマ東京で頒布した『入門ビットコインプログラミング〜Pythonによるビットコインの売買〜』を、pdf形式で販売します。内容としては、直近で本ブログに上げた内容 + ブレイクアウト手法によるプログラミング法についての内容を追加しました。Pythonで記述されているので、Pythonを始めたばかりの方の練習になるかもしれません。興味が有る方は、購入してみてください。

(現状、ビットコイン支払いのみ可能です。coincheck payment では日本円にして¥250円くらいになるように、システム側で調整されています。)

(Monappyにも対応しました。0.3monaで販売しています)

f:id:soy-curd:20170514105320p:plain

f:id:soy-curd:20170514105541p:plain

ビットコインで支払う

↑ここから購入可能です。

Monappyで購入

↑Monappyのアカウントをお持ちの方はこちらから。

簡単安心!ビットコイン取引所 coincheck

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin

ビットコインの入手は、ここ(coincheck)やzaifbitflyerが有名です。