月別アーカイブ: 2017年6月

RPMを個別にダウンロードし、yumのローカルリポジトリを構築する

前提

以下の環境で動作確認

要素 バージョン
CentOS 6.9
yum 3.2.29
createrepo 0.9.9

目的

インターネットに接続できない環境でRPMパッケージをインストールするために、事前にインターネットに接続できる環境でyumリポジトリを構築する。リポジトリはDVDなどの外部メディアを用いてインターネットに接続できない環境内に配置することを想定する。

リポジトリで管理するパッケージのダウンロード

今回は動作確認用としてnginxのRPMパッケージを含んだローカルリポジトリを構築する。

まずはリポジトリになるディレクトリを作成

$ mkdir /root/MyRepo

次にRPMパッケージをダウンロードする。
yum installコマンドでは、–downloadonlyオプションを付与することで、パッケージのインストールは行わずにダウンロードのみを行うことができる。–downloaddirオプションでダウンロード先ディレクトリを指定できるので、今回は/root/MyRepoを指定する。

$ yum install -y --downloadonly --downloaddir=/root/MyRepo nginx

MyRepoディレクトリを見ると、依存パッケージも含めてnginxのパッケージがダウンロードできていることがわかる

$ ls /root/MyRepo/
nginx-1.10.2-1.el6.x86_64.rpm                 nginx-mod-http-image-filter-1.10.2-1.el6.x86_64.rpm  nginx-mod-mail-1.10.2-1.el6.x86_64.rpm
nginx-all-modules-1.10.2-1.el6.noarch.rpm     nginx-mod-http-perl-1.10.2-1.el6.x86_64.rpm          nginx-mod-stream-1.10.2-1.el6.x86_64.rpm
nginx-mod-http-geoip-1.10.2-1.el6.x86_64.rpm  nginx-mod-http-xslt-filter-1.10.2-1.el6.x86_64.rpm

ローカルリポジトリの構築

yumリポジトリの構築には、createrepoというツールを使う。こちらはyumでインストールできるので普通にインストール。

$ yum install -y createrepo

インストールできていることを確認

$ createrepo --version
createrepo 0.9.9

MyRepoディレクトリ内に、yumリポジトリを構築

$ createrepo /root/MyRepo/
Spawning worker 0 with 8 pkgs
Workers Finished
Gathering worker results

Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

MyRepoディレクトリ内にrepodataというディレクトリが作成されていれば成功

$ ls /root/MyRepo/repodata/
692561d7eb657f2cc6bd22928db903b26b6b24e4f220d3d69f80bb10b2b8490f-primary.xml.gz
8ff28a60f7a205ef1d69a193e7560f72ce26f2877788a7e61e429cead8b2115f-primary.sqlite.bz2
9e33288bed1a69b3f0161cee7a3fb456f424f371eb04265bbe0e8934cff4b17a-filelists.sqlite.bz2
a83bc7ec7e90bef8452061c3e3987f4fa45343450ba466f13266b4bfe3025965-filelists.xml.gz
d2387c0a071800a022eef83703840761a0294e6dc09e91b9ce02f9a45f1688de-other.xml.gz
fa70a39d2111e3440f54c2deddcf5df9c6014295f7ddcf648baf1bffd9bd468d-other.sqlite.bz2
repomd.xml

リポジトリへの参照を追加

前項でローカルリポジトリを作成したが、そこにリポジトリがあることをyumに教えて上げる必要がある。
yumが参照するリポジトリ一覧は、/etc/yum.repos.d/にある

$ ls /etc/yum.repos.d/
CentOS-Base.repo       CentOS-Vault.repo      docker-main.repo   mysql-community-source.repo  remi-php70.repo  remi.repo
CentOS-Debuginfo.repo  CentOS-fasttrack.repo  epel-testing.repo  mysql-community.repo         remi-php71.repo
CentOS-Media.repo      centalt.repo           epel.repo          remi-php54.repo              remi-safe.repo

ここに今回作成したMyRepoの情報を追加する

$ vim /etc/yum.repos.d/MyRepo.repo

エディタで以下のようにリポジトリの設定を記述
nameはリポジトリ名を適当に、baseurlには構築したリポジトリのパスを、gpgcheckは、署名なしで利用できることを示す0を設定する。

[MyRepo]
name=MyRepo
baseurl=file:///root/MyRepo
gpgcheck=0

yumコマンドでリポジトリが認識されていることを確認。ダウンロードしたnginxも認識されていることがわかる

$ yum list all | grep MyRepo
GeoIP.x86_64                              1.6.5-1.el6                  @MyRepo
GeoIP-GeoLite-data.noarch                 2017.01-1.el6                @MyRepo
GeoIP-GeoLite-data-extra.noarch           2017.01-1.el6                @MyRepo
gd.x86_64                                 2.0.35-11.el6                @MyRepo
geoipupdate.x86_64                        2.2.1-2.el6                  @MyRepo
nginx-filesystem.noarch                   1.10.2-1.el6                 @MyRepo
nginx.x86_64                              1.10.2-1.el6                 MyRepo
nginx-all-modules.noarch                  1.10.2-1.el6                 MyRepo
nginx-mod-http-geoip.x86_64               1.10.2-1.el6                 MyRepo
nginx-mod-http-image-filter.x86_64        1.10.2-1.el6                 MyRepo
nginx-mod-http-perl.x86_64                1.10.2-1.el6                 MyRepo
nginx-mod-http-xslt-filter.x86_64         1.10.2-1.el6                 MyRepo
nginx-mod-mail.x86_64                     1.10.2-1.el6                 MyRepo
nginx-mod-stream.x86_64                   1.10.2-1.el6                 MyRepo

ローカルリポジトリを用いたインストール

最後に、構築したローカルリポジトリを用いて、nginxのインストールを行う。

nginxがまだインストールされていないことを確認

$ which nginx
/usr/bin/which: no nginx in (/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)

MyRepoリポジトリを用いてnginxをインストール
通常通りinstallコマンドを使うが、–disablerepoで一度全てのリポジトリを無効にし、–enablerepoでMyRepoのみを有効にすることで、確実にMyRepoリポジトリからnginxをインストールする

$ yum install -y --disablerepo=\* --enablerepo=MyRepo nginx
(中略)
インストール:
  nginx.x86_64 0:1.10.2-1.el6

依存性関連をインストールしました:
  nginx-all-modules.noarch 0:1.10.2-1.el6        nginx-mod-http-geoip.x86_64 0:1.10.2-1.el6            nginx-mod-http-image-filter.x86_64 0:1.10.2-1.el6
  nginx-mod-http-perl.x86_64 0:1.10.2-1.el6      nginx-mod-http-xslt-filter.x86_64 0:1.10.2-1.el6      nginx-mod-mail.x86_64 0:1.10.2-1.el6
  nginx-mod-stream.x86_64 0:1.10.2-1.el6

完了しました!

nginxをインストールできたことを確認

$ which nginx
/usr/sbin/nginx
$ nginx -v
nginx version: nginx/1.10.2

参考

[Ruby] nilの可能性があるオブジェクトでメソッド呼び出しを安全に行う

例えば文字列に対してlengthメソッドを呼び出すと、その文字数を取得できる

irb(main):001:0> a = 'sasaki'
=> "sasaki"
irb(main):002:0> a.length
=> 6

一方、aがnilだった場合はlengthメソッドが存在しないので例外が発生する

irb(main):001:0> a = nil
=> nil
irb(main):002:0> a.length
NoMethodError: undefined method `length' for nil:NilClass
	from (irb):2
	from /root/.rbenv/versions/2.3.1/bin/irb:11:in `<main>'

しかし、変数名の末尾に&をつけることで、対象がnilだった場合メソッド呼び出しを行わずにnilを戻すようにできる

irb(main):001:0> a = nil
=> nil
irb(main):002:0> a&.length
=> nil

nilチェックが不要になるのでコードをスマートに書けるようになる

[Ruby] Backlogの作業時間の記録を半自動化する

前提

以下の環境で開発、動作確認

要素 バージョン
debian 8.6
ruby 2.2.2
gem 2.4.5
bundle 1.13.4
backlog_kit 0.15.0

リポジトリ
https://github.com/Sa2Knight/BacklogTimeKeeper

以下の続きのようなもの
[Ruby] BacklogをCUIで操作してみる

概要

BacklogAPIを用いて、コマンド実行のみで課題の作業時間を記録するCUIツールを作ったので紹介。

以下のように、コマンドで課題キーを指定して課題を開始。課題が完了したら再度コマンドを実行すると、作業時間を計算して、課題の作業時間を更新してくれる。それだけ。

目新しい技術要素もないが、ブログネタが無くなってきたので

10:08:39$ bruby Main.rb -s DEVS-1
プログラムを書く (DEV-1)を開始しました
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13:14:08$ bruby Main.rb -e
プログラムを書く (DEV-1)を終了し、作業時間を3.09時間追加しました

BacklogAPIの準備

BacklogAPIは、特別な申請なしにすぐに利用を開始することができる。BacklogAPIを利用したいBacklogにログインし、個人設定→API設定に移動すると、以下の画面になるので、適当に名前を付けてAPIを発行する。APIキーは後ほど必要になるので控えておく。

ツールの導入

リポジトリからソースコードを取得

GithubからCloneする。

$ git clone git@github.com:Sa2Knight/BacklogTimeKeeper.git
Cloning into 'BacklogTimeKeeper'...
remote: Counting objects: 48, done.
remote: Compressing objects: 100% (33/33), done.
remote: Total 48 (delta 23), reused 37 (delta 12), pack-reused 0
Receiving objects: 100% (48/48), 7.10 KiB | 0 bytes/s, done.
Resolving deltas: 100% (23/23), done.
$ cd BacklogTimeKeeper/

必要なライブラリをインストール

サードパーティ製のbacklog_kitを利用するので、bundleでインストールする。

$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies...
Installing concurrent-ruby 1.0.5
Installing i18n 0.8.4
Installing minitest 5.10.2
Installing thread_safe 0.3.6
Installing multipart-post 2.0.0
Using bundler 1.13.4
Installing tzinfo 1.2.3
Installing faraday 0.10.1
Installing activesupport 5.1.1
Installing faraday_middleware 0.10.1
Installing backlog_kit 0.15.0
Bundle complete! 1 Gemfile dependency, 11 gems now installed.
Bundled gems are installed into ./vendor/bundle.

環境変数を設定

本ツールでは、BacklogのスペースID及びAPIキーを環境変数から参照する仕様になっているので、以下のようにエクスポートしておく。エクスポートする値は各々の環境にあわせたものにする。

$ export BACKLOG_SPACE="hoge"
$ export BACKLOGAPI="ghaiogapigipeghpghapghpheapiwthpiat"

使い方

課題の作業を開始する

Main.rbを-sオプションを付与して、対象の課題キーを指定して実行する。bundle execは必須だが、面倒なのでaliasつけたりするとマシになる。

$ bundle exec ruby Main.rb -s DEV-1
プログラムを書く(DEV-1)を開始しました

課題を開始すると、同ディレクトリにworkというファイルが作成されるが、これは対象の課題キーとその開始時間を記録しているだけのJSONファイルなので特に気にしなくて良い

$ cat work
{"key":"DEV-1","datetime":"2017-06-06 20:44:05 +0900"}

課題の作業を終了する

開始から数時間たったことにして、課題を終了する。終了時はMain.rbを-eオプションを付与して実行するだけで良い。前述のworkファイルで対象の課題キーが管理されているので、ここでは課題キーを指定する必要がない。

$ bundle exec ruby Main.rb -e
プログラムを書く(DEV-1)を終了し、作業時間を1.71時間追加しました

課題を確認すると1.71時間設定されているのがわかる

また、既に作業時間が記録されている課題に対して同様に作業開始→作業終了のコマンドを実行すると、以下のように作業時間を追加する形で更新される

使いみち

まだたったコレだけしかできないが、個人的には既に以下のような実用性がある

  • 課題の作業時間を自分で時刻見て計算する必要がなくなる
  • 億劫だった作業時間記録作業がむしろ楽しみになった
  • 本ツールで課題を開始するとその課題にだけしっかりと集中できるようになった気がする(複数課題並行できないのはむしろメリット)

今後

多分以下のように発展されられる気がする

  • 本日の作業時間の集計機能(どの課題にどのぐらい時間を使ったか)
  • 作業中の課題をチャットワークで通知(名前欄に動的に記入したり?)
  • 課題のステータス変更との組み合わせ(課題終了時に、ステータスを「完了」にするとか)

とにかくBacklogAPIとチャットワークAPIのマッシュアップが夢広がる。