bussorenre Laboratory

bussorenre Laboratory

kotlin を始める

最近、Android 界隈でKotlin という言語が流行ってるらしい。というくらいには老害になってきたのであるが、とにかくkotlin を始める。

Android で正式に採用されたらしい。という情報だけだったら多分さわりもしなかったんだけど、どうやらこいつは、JVM 上で動くだけでなく、js, native コードにコンパイルしてくれるらしい。それ凄くない???

開発元はJetBrains. Intelli J Idea とか作ってるすごい所。 ということで、今回はkotlin はIntelliJ Idea で触ることにした。

多分すごい爆速でコード書けそうめう。

公式 : https://kotlinlang.org/ OSS : https://github.com/JetBrains/kotlin

kotlin はネイティブコードを生成できる(らしい)が、kotlinを動作させるには、JVM環境が必要。最新版は 1.2 @ 2017/12/20時点

じゃぁ、取り急ぎハローワールドから。 jvm で実行する、js で実行する、ネイティブで実行する、 の3つを実装する。(多分コードは変わらないと思うけど)

kotlin ファイルの拡張子は、kt。小室哲哉かよって思った私はもう老害。飛行機の速度かよって思ったやつはメーデー

fun main(args: Array<String>) {
    println("Hello Kotolin!!")
}

func でもfunction でもなく、fun なのか。これはちょっと嫌だなー。と正直に思った。func か、せめてfn にしてほしい感ある。 そんな事はどうでもよく。

ここで、まず見るべきは、クラス定義がない。これは一体何クラスに属するメソッドなんだ??

kotlin が吐いた生成物を見ると、Appkt.class(App.kt という名前で生成した)になっていた。なるほど。

kotlin native を使う

参考:https://github.com/JetBrains/kotlin-native

書いてあるとおりにする。

最終的には、こんな感じのコマンドを叩いて、CとかGo みたいな実行可能ファイルが生成される。 kotlinc hello.kt -o hello -opt

うーーん、kotlin でネイティブかけるのはすごい。 私個人はネイティブ原理主義者なので、ネイティブに変換できるだけで株は大上がりですね…。

Gem を作る

今更ながらRuby について真剣にやり直そうと思う。理由はまぁ色々有るのだけど。。。どうもRuby は苦手だ。

さて、gem を作る。今までとりあえずgem install していたけど、gem ってそもそもどうなっているんだろうか??

bundle gem gemname

これで雛形を生成することが出来る。おそらくデフォルトのままで問題ないと思う。生成されるgem のファイル構成は以下のようになっている。

├── CODE_OF_CONDUCT.md
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── bin
│   ├── console
│   └── setup
├── lib
│   ├── testgem
│   │   └── version.rb
│   └── testgem.rb
├── spec
│   ├── spec_helper.rb
│   └── testgem_spec.rb
└── testgem.gemspec

4 directories, 12 files

testgem と言うのは私が書いた名前なので、各自の環境で変えていただきたい。ruby でrequire が呼ばれた時、このlig/testgem.rb が呼ばれる。また、このgem を呼び出すにはどうしたら良いのか。

このディレクトリとは別に、'callgem'というディレクトリを作成し、Gemfile を作成する。ローカルのgem を呼び出す時は、path属性を指定してあげる。具体的には以下のようになる。

gem 'testgem', :path => '../testgem'

さて、これでbundle install しようとするとエラーが起こる。どうやらspec ファイルがまだvalid じゃない(テストが通ってない)と言われるので、コレをアレコレ書く所から始めようと思う。

早速gemspec ファイルを開けるよく見ると中にToDo という文字列が見つかるので、そのへんを適当に改良する。以下のようになった。

# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'testgem/version'

Gem::Specification.new do |spec|
  spec.name          = "testgem"
  spec.version       = Testgem::VERSION
  spec.authors       = ["bussorenre laboratory"]
  spec.email         = ["mailaddress@bussorenre.com"]

  spec.summary       = %q{おためしで作ったgem}
  spec.description   = %q{こんなんでいいのか}
  spec.homepage      = "http://localhost:3000"
  spec.license       = "MIT"

  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
  # to allow pushing to a single host or delete this section to allow pushing to any host.
  if spec.respond_to?(:metadata)
    spec.metadata['allowed_push_host'] = "'http://mygemserver.com'"
  else
    raise "RubyGems 2.0 or newer is required to protect against " \
      "public gem pushes."
  end

  spec.files         = `git ls-files -z`.split("\x0").reject do |f|
    f.match(%r{^(test|spec|features)/})
  end
  spec.bindir        = "exe"
  spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
  spec.require_paths = ["lib"]

  # ココに依存しているgem を追加する
  spec.add_development_dependency "bundler", "~> 1.14"
  spec.add_development_dependency "rake", "~> 10.0"
  spec.add_development_dependency "rspec", "~> 3.0"
end

本当にToDO のところを書き換えただけです。

さて、肝心のこのgem ですが、ping というメソッドを実装し、呼び出されたらpong と返す。たったそれだけのgemを作成します。

まずspec

require "spec_helper"

RSpec.describe Testgem do
  it "has a version number" do
    expect(Testgem::VERSION).not_to be nil
  end

  it "response pong if ping" do
    expect(Testgem.Ping).to eq('pong')
  end
end

実装

module Testgem
  def self.Ping
    'pong'
  end
end

これで、rspec が通った! というわけで、さっき作ったcallgem から呼び出してみる。

まずはbundle install する。すると問題なくbundle install 出来たので、コードを書く。

require 'testgem'

puts Testgem.Ping

これをbundle exec ruby main.rb で実行すると、無事pong と表示される。

結論

gem が出来た。所謂有名所のgem も基本はこういう原理になっているはずなので、コードリーディング等に役立てていきたい。

当事者になってわかったこと

ネガキャンするつもりはないんだけど、

確かに、自分が住んでるマンションでAirbnb されると嫌だなって思った。

今はまだ問題が表面化してないけど、いずれ表面化するんだろう。

一度失った心は二度と治らない話

事故で足とか腕とかを失うと、しばらく立てば新しく腕が生えてくる。なんて事はない。一度失った四肢は二度と復帰しない。

心もそうで、一度、致命的な損傷を受けると、一生治らない。 例えば虐待とか。いじめとか。DVとか。ネグレクトとか。

例えば足のない人は見たら分かる。ああ、この人、足無いんだなって。 でも、心の一部が欠けた人を見分けることは難しい。

周囲への理解を求める事は簡単だが、協力を得るのはほぼ不可能です。 あらゆる手段を使って、欠けた心を埋めないと、社会的に生きていけない。

精神科に行って薬をもらったり、パチスロやタバコに依存したり、恋人に依存したり。 あまり良くないことかもしれない。でも、生きていくためには仕方がないのです。

今日は4月5日。

社会人になったばかりで、前後左右よくわからないけど、とにかく頑張ろう!って意気込んでいる新人は多いと思います。

大いに頑張って欲しい。大いに活躍してほしい。

でも、絶対に心身を壊してはいけない。

一度壊した心や体は二度と元に戻らない。 これだけは忘れないでほしい。

壊れる前に必ず手を打つこと。 程よく頑張ってね〜

サーバーを可視化しよう!その1. cacti

@bussorenre です。

この記事ではcacti にトライした時のメモを残していきます。OS はCent OS 6.6 です。実際に試した環境はsakura VPS 2G プランのインスタンス上です。

また、「私の勝手な主観」が入る事が多いので、「そこは違うで」って指摘していただけるとすごい助かります。

cacti 概要

依存するソフトウェア - Apache web server... データを確認するのに使用 - MySQL...

# rootユーザーに切り替え。
su -

# root ユーザーに切り替わった後
yum install -y cacti mysql-server

# cacti が利用するユーザー、MySQL DB などを準備してあげる。
mysql -u root -p

mysql> CREATE DATABASE cacti;
Query OK, 1 row affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON cacti.* TO cacti@localhost IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql>bye;

# cacti にdbの設定を記述 (emacs でも)
vi /etc/cacti/db.php
$database_type = "mysql"; //使用するデータベース種別. MYSQL以外も使えるっぽい。
$database_default = "cacti"; 
$database_hostname = "localhost"; 
$database_username = "cacti"; // データベース接続に使用するユーザー名
$database_password = "password"; // データベース接続に使用するパスワード
$database_port = "3306"; // データベース接続に使用するポート番号
$database_ssl = false;
:wq

# 初期データベースの作成(0.8.8b はcacti のバージョン。)
mysql -u cacti -p cacti < /usr/share/doc/cacti-0.8.8b/cacti.sql

# cacti をapache から確認出来るように設定をいじる(特にいじることがなかった\(^o^)/)
vi /etc/httpd/conf.d/cacti.conf
:wq

# crond で定期実行
vi /etc/cron.d/cacti (# 行頭コメントを外して有効化)
*/5 * * * * cacti /usr/bin/php /usr/share/cacti/poller.php > /dev/null 2>&1

:wq

service crond restart

ここまでできたらhttp://localhost/cacti/install/ にアクセスして初期設定を行う。

個人的に感じたこと * 何度も見たことのある憧れの画面で感動\(^o^)/ * 監視用のマシンを1代別途用意して、そこにmySQL を用意して監視するという選択肢は考えたけど、それならsensu のほうが今どきでよさ気かもしれへんって思った。

参考にした記事 * モニタリングツール「Cacti」でのリソース監視 - さくらのナレッジ

サーバーの状態を可視化しよう!その0. 概要

こんばんは。夏!暑い!けどオフィス寒い!社畜なんてやってる場合じゃねええ!@bussorenre です。

さて、仕事で使うサーバーも趣味(minecraft)で使うサーバーも、「もっと楽に状態管理したいなー」って思ったので、例によって今回自分用に記事を書き残します。勉強中なので「これ違うで」「こんなんもあるで」みたいな事があれば共有していただけると幸いです。

現状の選択肢

らしいというのは、詳しい方の一言コメントです。

Graphite

今度書く

Cacti

今日書く

Munin

今度書く

Sensu

今度書く