Node.js 3 分デベロップ

うにょーん(ワイルドカード的挨拶)。りひにーです。
今日は Node.js 3 分デベロップと題して、Matrix protocol 的なやつのバージョンを返すやつを Node.js で作ってみようと思います。

yarn で必要なモジュールをいんすとろーるする

yarn で必要なモジュールないしはパッケージをいんすとろーる*1します。

% yarn add express body-parser

簡単ですね!

必要なやつを require する

今度はいんすとろーるしたやつを require します。

const express    = require( 'express' );
const bodyParser = require( 'body-parser' );

express()

express() してなんらかのオブジェクトをとってきます。
なんらかのオブジェクトは app という const な変数にとっておきましょう。 後で使います。
なんで const かというと、活きがいいので危険だからです。(とっても安全です)

const app        = express();

body-parser の設定をしちゃう

body-parser の設定をしちゃいます。
先程とっておいた活きのいい app を使います。
気になる人は水中メガネかなんかをしておいた方が良いですよ!
水が跳ねますからね!(跳ねない)

// body-parser の設定をするよ!するよ!
app.use( bodyParser.urlencoded( { extended: true } ) );
app.use( bodyParser.json() );

ここら辺でポート番号を考えておく

ここら辺で一休みしてポート番号を考えておきます。
とりあえず、3000 にしておきましょう。
キリがいいし、なんだか新しい感じがするからです。(バイアス)

// ここら辺でポート番号を宣言しておく。
const port       = process.env.PORT || 3000;

バージョンを返すやつを定義する

お待ちかね今日のメインディッシュ、バージョンを返すやつを定義します。
よくこことにらめっこしましょう。

// GET /${domain}:${port}/_matrix/client/versions
app.get( '/_matrix/client/versions', (request, response) => {
    response.json( {
        versions: 'r0.0.1'
    } );
} );

鯖を起動する

バージョンを返すやつを定義したので、鯖を起動します。

// ルートを定義したので、鯖を起動するよ!!
app.listen( port );

console.log( 'listen on port: %d', port );

ここまでを app.js という名前で保存しておきましょう。

テストってみる

それでは、テストってみましょう。
今まで書いたコードが上手く書かれていれば、うまい具合にバージョンが返ってくるはずです。
それにはこんな風に打ちます:

% node ./app.js

そして、別のターミナルエミュレーターを起動し、以下のように打ちます:

% curl -XGET http://localhost:3000/_matrix/client/versions

どうですか?
バージョンが返ってきましたか?

(๑´ڡ`๑) おしまい

*1:インストール

すべてのピアノが破壊不能なわけではありません

(*゚∀゚) 破壊不能タグが付いているピアノだけが破壊不能です

╰( ´◔ ω ◔ `)╯ 破壊不能タグってなんだよ………

そうそう、 matrix.org っていうサイトがあって、それはつまりルーム型のチャットシステム仕様とかが書いてあるサイトなんだけど、 API がオープンなので matrix protocol を話すサイトだったら、行けるしルームを作れるんだよね*1

これでオールドスクール*2なチャットを作ってみたら良いんじゃないかみたいなことを思った。

(*゚∀゚) 思っただけ!

*1:全然わからない。俺たちは英語を雰囲気で読んでいるのでぜんぜん違う可能性が大いにある

*2:古風な、または昔風、昔ながらの

おやすみ

ʕ•͡ω•ʔ あれだ。今日はアドベントカレンダーはお休みなんだ。

ʕ•͡ω•ʔ うん、「また」なんだ。すまない。

ʕ•͡ω•ʔ 仏の顔もっていうしね、謝って許してもらおうとも思っていない。

ʕ•͡ω•ʔ でも、一連の流れを見た時、君は、きっと言葉では言い表せない「懐かしさ」みたいなものを感じてくれたと思う。

ʕ•͡ω•ʔ 殺伐とした世の中でそーいう気持ちを忘れないでほしい。そう思ってこの記事を書いたんだ。

ʕ•͡ω•ʔ じゃあ、おしまいだ。

╰( ´◔ ω ◔ `)╯ またな!

(*゚∀゚) これ、前もやんなかった?

╰( ´◔ ω ◔ `)╯ 知らんな!

pipenv すごいなってなった話

みなさん、アバラチア!!!(挨拶)
この記事は Syrup Lang Advent Calender 第 3 日目の記事である可能性が微量に存在すると思う。

pip でインストールしたパッケージが一括で更新できなくてつらいなってなってたところに pipenv っていうのがあるっていうのを知ったのでやってみようかと思った。

pipenv をインストールする

まずは pipenv をインストール。

% pip install pipenv

pipenv の使い方 (すごく簡単なやつ)

Python のプロジェクトっぽい py-hogepiyocd する。

% cd ~/workspace/py-hogepiyo

これは名前ではわからないけど、flask を使うプロジェクトなので flaskpipenv でインストールする:

% pipenv install flask

すると PipfilePipfile.lock というファイルができるので、pipenv shell を使ってなんかそれっぽい環境で実行する。(雑な説明)

% ls
Pipfile  Pipfile.lock  __pycache__  index.py  run  run.bat  templates
% pipenv shell
(py-hogepiyo-XXXXXXX) % 

なんかそうすると、グローバルで flask がインストールされてなくても動かせるとか。 (まだやってない)

なんか pipenv update とかもできるそうで、良いの見つけたなと言う感じですね。
ということで、おしまい。

参考

Google Colab をやってみた

みなさん、おはこんばんにちございます。
Syrup Lang Advent Calender 第 2 日目の記事だと思います。

はじめに

Google Colab を使って Kaggle のタイタニックのコンペ用の Python スクリプトを書きたいなと思ったんですが、Google Colab の使い方を書いていく記事になってしまっていると思います。

まずは ゲームで使う train.csvtest.csv をアップロードします。

以下のコードを書いて、実行してみましょう。
わかりやすくするために、ここでは同じコードを 2 つのコードセルに別々に書いてtrain.csvtest.csv をアップロードします。
アップロードするには、コードセルに下記のようなコードを書いて、「コードを実行」ボタンを押します。
すると、アップロード用のウィジェットが表示されるのでアップロードしたいファイルをアップロードします。

from google.colab import files

uploaded = files.upload()

f:id:noqisofon:20181202091938p:plain

わかりやすくするために、ここでは同じコードを 2 つのコードセルに別々に書いてtrain.csv と test.csv をアップロードします。

f:id:noqisofon:20181202092346p:plain

iPython Notebook で書いたものを Markdown にしているので、単体で実行可能なスクリプトにするために、import を書いていてウザさがあるかもしれませんが、我慢してください。 *1

データの確認

これで train.csvtest.csv の 2 つのファイルがアップロードされました。
この 2 つのファイルを pandas で読み込んで、確認してみましょう。

import pandas

train = pandas.read_csv( 'train.csv' )

train.head()

f:id:noqisofon:20181202093007p:plain

import pandas

test = pandas.read_csv( 'test.csv' )

test.head()

f:id:noqisofon:20181202093324p:plain

データの穴埋め

Age に穴があるので、それを埋めます。 (何故わかったのかは省略する) 穴は NaN で表されますが、その部分に Age の中央値を入れることにします。

とりあえず、Age の中央値を確認してみましょう:

import pandas

train = pandas.read_csv( 'train.csv' )

train['Age'].median()

f:id:noqisofon:20181202093903p:plain

28.0 と出ました。
Age の NaN の部分には 28.0 が入るようです。

import pandas

train = pandas.read_csv( 'train.csv' )

train['Age']      = train['Age'].fillna( train['Age'].median() )

train[[ 'Name', 'Age']].query( 'Age == 28.0' )

f:id:noqisofon:20181202094906p:plain

そーいうわけで、Embarked にも NaN があるので、一番多いと思われる(多分) S (サウサンプトン)を入れることにしました。

import pandas

train             = pandas.read_csv( 'train.csv' )

train['Embarked'] = train['Embarked'].fillna( 'S' )

train[[ 'Name', 'Embarked']].query( 'Embarked == "S"' )

f:id:noqisofon:20181202100028p:plain

Sex は文字列を数値に変換します。 male は 0 に、female は 1 に変換します。

import pandas

train             = pandas.read_csv( 'train.csv' )

train['Sex']      = train['Sex'].replace( 'male'  , 0 )
train['Sex']      = train['Sex'].replace( 'female', 1 )

train.head()

f:id:noqisofon:20181202100723p:plain

まとめ

  • Anaconda を入れなくても、Google Colab がある。
  • Google Colab 上でもファイルをアップロードできる。
  • Google Drive から Google Colab というアプリを追加するとノートが消えないかもしれない?
  • こまめに保存しておくと吉。

*1:後で別にそんなことをする必要は無かったことがわかったが、とりあえずそのままにしておく

face のフォントを変更する方法

list-faces-display で face の名前を知る

私の場合は markdown-mode の face だったので、なんかそれっぽい:

  • markdown-code-face
  • markdown-inline-code-face
  • markdown-pre-face

を変更すればいいと見当を付けた。

変更する

set-face-attribute.emacs とか init.el に書く。

(set-face-attribute 'markdown-code-face nil 
                    ;; フォントファミリー名
                    :family "Ricty" 
                    ;; フォントの高さ(px の 10 倍)
                    :height 100)

おしまい。

ゔぇは Vue.js のゔぇ

へろーわーるど

var app = new Vue( {
    el: '#app',
    data: {
        message: 'V is for Vue.js'
    }
} );
<div id="app">
  {{ message }}
</div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script src="./index.js"></script>

これを書いてるときに、markdown-mode のコードのフォントがおかしかったので修正していた。

標準入力に入力が詰まってるかどうかを調べるには eof を使えばいいらしい

よく、標準入力を使って:

% ps ax | grep hoge

とかやるけど、Perl6 ではどーやるんだろーと思ったので、IO::Handle を調べていたら、 &eof を使えばいいっぽいということがわかったので、すくりぷよ書いてみた:

#!/usr/bin/perl6
# -*- mode: perl6; -*-
# .. file:: sink
use v6;

sub MAIN() {
    unless $*IN.eof {
        say $*IN.slurp.chomp;
    }

}

名前はてけとー。
標準入力が詰まってない場合は何もしないので、何かを入力すると何かする。
こんな風に使う:

% echo Hello, World! | ./sink
Hello, World!