yaourt は衰退しました

yaourt が死んでしまっていた*1ので、trizen をインストールした。

Perl 製であり、pacman と同じ様なコマンドラインオプションを持ってるっぽいのでいんすとーるをキメた。

あと、Antergos が死んでしまった話もする…?

参考

*1:全然 Linux マシンを動かしていないのがバレバレである

空気ねこにもおおよそ分かるにんげんは牛ではないことを RSpec で証明してみた

ネットミームをコードで表現してみるかもしれないシリーズ。

まあ、にんげん(Human)と牛(Cow)の抽象クラス Animal を定義する:

# lib/animal.rb
class Animal
end

中身は何も無いけど、そのうち実装されるっしょ。ヘーキヘーキ。
ここら辺で Animal クラス必要ないなって思ったけど、まあいいか。
ああ、次は牛とにんげんだ…。

# lib/cow.rb
require_relative 'animal'

class Cow < Animal
end

次はにんげん。

# lib/human.rb
require_relative 'animal'

class Human < Animal
end

何も中身ないけど、ヘーキヘーキ。
ということで、スペックファイルを書いてみよう。

describe Human do

  it 'にんげんは牛ではない' do
    # TODO: ここでにんげんは牛ではないことをしょーめーする
  end

end

ここで describe のブロックの中で Humandescribed_class って書けるらしい。
さて、にんげんは牛ではないことを調べるにはどうすればいいだろう?
とぼけるのも疲れてきたので、長年温めてきた常識を働かせてみると、明らかに HumanCow は別のものだ。

つまり:

if Human != Cow then
  puts 'にんげんは牛じゃないよ!'
else
  puts 'ふえぇぇ………、にんげんは牛だったようです………'
end

ってやって、「にんげんは牛じゃないよ!」って表示されればいいわけだ。そうだよね?
こーいうのを RSpec でかっこよく書きたい。 RSpec ではテストする主体?を except() に渡す。それで、 .to ってやって…… 同じかどうか調べるには equal() に調べたい値を渡す。

except( described_class ).to equal( Cow )

いいぞ!
described_class の替わりに Human って書いても良い。

except( Human ).to equal( Cow )

いいね!
でもちょっと待って。
こうすると、HumanCow は同じかどうか調べることになってしまう!
どうしよう?!

.to の替わりに .to_not を使うことで、式の否定版にすることができる。
じゃあ、こんな感じかな?

except( described_class ).to_not equal( Cow )

うまくいった!
it の中に移してみよう:

describe Human do

  it 'にんげんは牛ではない' do
    except( described_class ).to_not equal( Cow )
  end

end

おしまい。

完成したのが こっちにあるので、てきとーに答え合わせしてみてね。

空気ねこにもたぶん分かる RSpec

空気ねこはエレメンタルの青パーマネントで飛行を持ってると思われる。
消費マナは多分 (2)(B) でパワー/タフネスは 2/3 か 3/2 だと思われる。

この記事は RSpec のドキュメントを読んで学んだことを自分用にまとめたものなので、他の人にはあんまり役には立たないかもしれないかもしれないかもしれない。
ということで、RSpec のインストールの仕方を最初に書いておくと思ったが、参考にしたかもしれないリンクを最初に置いておく。

参考にしたかもしれないリンク

RSpec のインストールの仕方

私は開発用というか、書き捨てプロジェクトを ~/workspace に置いているんだけれども、そこに RSpec 使うようのフォルダ rb-hello-rspec を作成することにする。

% cd ~/workspace
% mkdir ./rb-hello-rspec
% cd ./rb-hello-rspec

すごくどうでもいいと思うんだけれども、rbrubyhello-rspecRSpec こんにちはの意味を込めてなんか学ぶ用のフォルダにはそんな風につけている。

% emacsclient ./Gemfile

そんで Gemfile になんか書く:

source 'https://rubygems.org'

gem 'rspec'

Gemfile のことはここでは端折るけども、次は bundle install する。

% bundle install

うまくいくと、Gemfile.lock ができる。

% ls
Gemfile  Gemfile.lock

うまくいっていると、rspec できるので、 rspec --init する。

% rspec --init

そーすると、こげん感じになる:

% ls -AR
.:
.rspec  Gemfile  Gemfile.lock  spec/

./spec:
spec_helper.rb

スペックファイル((RSpec におけるテストケースとかテストスクリプト的なファイル))は ./spec/ の中に書くことになる(多分)。

スペックファイルを書く

ということでスペックファイルを書いてみる。

% emacs-client ./spec/be_spec.rb

be matchers の例を見ながら書いてみた:

describe 'be_truthy matcher' do

  it 'be_truthy matcher' do
    expect( true ).to be_truthy
    expect( 7 ).to be_truthy
    expect( 'foo' ).to be_truthy

    expect( nil ).not_to be_truthy
    expect( false ).not_to be_truthy
  end

end

テストるには rspec って打つとよさげ。

% rspec
.

Finished in 0.05764 seconds (files took 3.99 seconds to load)
1 example, 0 failures

続く!

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)

おしまい。