uokadaの見逃し三振は嫌いです

ここで述べられていることは私の個人的な意見に基づくものであり、私が所属する組織には一切の関係はありません。

rpm作成のためのfpm入門

仕事でrpmパッケージを作る必要があったので久しぶりにこの辺を真面目に調べてます。

以前調べたときに、fpm使って楽できるって話をちらっと聞いたので今回のエントリーではfpmでhadoopのtar.gzからrpmを作ってみることにします。

github.com
Home · jordansissel/fpm Wiki

fpmのインストール

今回はHadooprpmを作るのがゴールなのでfpmを使うための最小限ぐらいのパッケージをインストールします。

$ sudo yum install ruby-devel gcc make rpm-build
$ sudo gem install fpm --no-ri --no-rdoc

インストールに苦労するものはないと思います。

Hadoopのソース取得

とりあえず、今回はここから取得してきましょう。
Index of /dist/hadoop/core/hadoop-2.7.3

$ wget http://www.apache.org/dist/hadoop/core/hadoop-2.7.3/hadoop-2.7.3.tar.gz
--2016-11-22 01:03:38--  http://www.apache.org/dist/hadoop/core/hadoop-2.7.3/hadoop-2.7.3.tar.gz
www.apache.org (www.apache.org) をDNSに問いあわせています... 2a01:4f8:130:2192::2, 88.198.26.2, 140.211.11.105
www.apache.org (www.apache.org)|2a01:4f8:130:2192::2|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 214092195 (204M) [application/x-gzip]
`hadoop-2.7.3.tar.gz' に保存中

100%[=========================================================================================================================>] 214,092,195 2.87MB/s 時間 74s

2016-11-22 01:04:53 (2.76 MB/s) - `hadoop-2.7.3.tar.gz' へ保存完了 [214092195/214092195]

fpmでrpm

今回のエントリーで使ってるバージョンは1.6.3です。

$ fpm -v
1.6.3

まずは、一番簡単な方法でrpmを作ってみます。 -sと-tオプションを渡してコマンドを実行します。

$ fpm -s tar -t rpm hadoop-2.7.3.tar.gz
Created package {:path=>"hadoop-2-1.0-1.x86_64.rpm"}

パッケージ・バージョンが少し辺ですがこれだけでもrpmを作ることに成功しました。


バージョンが変なので-vオプションを渡してさらに-nオプションも渡してみます。

$ fpm -s tar -t rpm --prefix /opt/myapp -v 2.7.3 -n apache-hadoop hadoop-2.7.3.tar.gz
Created package {:path=>"apache-hadoop-2.7.3-1.x86_64.rpm"}

バージョンの後ろにまだ1という数字がありますがこれはバージョンとは直接関係ないものです。
ここを変更するには --iteration で変更することが可能です。


さらに、 --prefix オプションを渡すことでパッケージをインストールするデフォルトのディレクトリを指定することも可能です。

$ fpm -s tar -t rpm --prefix /opt/myapp -v 2.7.3 -n apache-hadoop \
hadoop-2.7.3.tar.gz

今回は一番最後に実行したprefixオプションをつけて出来上がったパッケージが意図したとおりにインストールされるか確認して終わりにします。

$ sudo rpm -Uvh apache-hadoop-2.7.3-1.x86_64.rpm
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:apache-hadoop-2.7.3-1            ################################# [100%]

$ sudo rpm -qa apache-hadoop
apache-hadoop-2.7.3-1.x86_64

$ sudo rpm -ql apache-hadoop | head
/opt/myapp/hadoop-2.7.3/LICENSE.txt
/opt/myapp/hadoop-2.7.3/NOTICE.txt
/opt/myapp/hadoop-2.7.3/README.txt
/opt/myapp/hadoop-2.7.3/bin/container-executor
/opt/myapp/hadoop-2.7.3/bin/hadoop
/opt/myapp/hadoop-2.7.3/bin/hadoop.cmd

ちゃんと、/opt/myapp 以下に配置されてますね。
fpmを使うことでspecファイルを書かなくてもrpmが作れる方法の紹介でした。

追記

インストールしなくてもrpmコマンドだけで確認出来るみたいですね。

$ rpm -qpi apache-hadoop-2.7.3-100.noarch.rpm 
$ rpm -qpl apache-hadoop-2.7.3-100.noarch.rpm  |head

参考リンク

nginxアドベントカレンダーのネタ探し

qiita.com

夏頃にh2cとかやってたのでそこを掘り下げればネタは出てくるだろうけどアドベントカレンダーのネタとして見劣りしないだろうか。

過去のやつみても空きがあるしギリギリ申し込みでも参加できそうなので目処がついたら参加にしよう。

nginx Advent Calendar 2015 - Qiita
nginx Advent Calendar 2014 - Qiita

nginxのrpmのビルドをDockerでやってみた。

yuokada/nginx-build-docker: build nginx rpm on Docker
nginxのsrc rpmを取得してrpmbuildするだけのDockerfileを書いてみた。
Docker知ってたら1時間ちょいぐらいあれば出来ると思うのでビルド手段としてはオススメかな。

今回はビルド環境にCentos7を選択し、nginxのバージョンはここにあるものから最新のものを選んできた。

Write Dockerfile

ビルドに必要なもの以外にもいくつかパッケージが入ってるがデバッグ用にvimとか入ってると後々役立ちます。
それに、rpmビルド用コンテナなのでサイズもレイヤーもあまり気にしてません。

RUN yum update  -y
RUN yum install -y epel-release; \
    yum install -y autoconf automake libtool wget; \
    yum install -y git make vim less; \
    yum install -y gcc gcc-c++ pkgconfig pcre-devel tcl-devel expat-devel openssl-devel; \
    yum install -y perl-devel perl-ExtUtils-Embed GeoIP-devel libxslt-devel gd-devel; \
    yum install -y rpm-build ;\
    yum clean all

あとは後は作業用のディレクトリを作ってrpmをビルドするだけです。詳細はDockerfileをみて下さい。
今回は取ってきたSRPMをそのままビルドしているのでDockerfileも20行で收まっています。

How to build

Dockerfileが用意できたらあとはdocker buildでコンテナを作って生成されたrpmを取り出すだけです。
最初のビルドはキャッシュにのってないのもあって10~15分ぐらいかかるのでコーヒーでも入れながら待ちましょう。

$ docker build -t ngx .
$ docker run -d --name ngx-tmp -t ngx
$ docker cp  ngx-tmp:/root/rpmbuild/RPMS/  target

docker cpで生成されたrpmファイルを取り出します。取り出したものは別途動作検証なりをしましょう。
rpmの検証etcが終わったらあとはコンテナを停止・削除します。

$ docker stop ngx-tmp; docker rm ngx-tmp

たったこれだけでrpmが出来てしまいました。
ビルドオプションとか変えたい場合はいったんspecファイルを取り出してパッチを当てるなどをする必要があるかと思いますが、それはまた別の機会に。

Debug

メモ代わり。

$ docker run -d -v `pwd`/target:/root/rpmbuild/RPMS --name ngx-build -t ngx
$ docker run --rm -i --name ngx-tmp -t ngx /bin/bash

Docker Hub

yuokada/nginx-build-docker - Docker Hub
一応、Docker Hubにも登録してみた。

Link

pdbでデバッグするやつの補足

racchai.hatenablog.com

初心者向けのpdbの紹介記事を見かけたのでバット読んだけど、 このやり方も書いて欲しいなと思ってこのエントリを書いてみた。

#!/usr/bin/env python

import sys

def log(args):
    print args

def main(args):
    log(args)

#import pdb;pdb.set_trace()
main(sys.argv)

import pdb している行をコメントアウトしたスクリプトを用意しました。

% python2.7 -mpdb sample.py
> /private/tmp/sample.py(3)<module>()
-> import sys
(Pdb) b 12  # <= 12行目のmain()にブレイクポイントをセットします。
Breakpoint 1 at /private/tmp/sample.py:12
(Pdb) c     # <= ブレイクポイントまでスクリプトを実行します。
> /private/tmp/sample.py(12)<module>()
-> main(sys.argv)
(Pdb) l
  7
  8    def main(args):
  9        log(args)
 10
 11    #import pdb;pdb.set_trace()
 12 B->   main(sys.argv)

スクリプトの起動時に -m pdb で渡すメリットとしてはスクリプトを編集する必要がないところです。
本番環境などで改変が禁止されているスクリプトをどうしてもデバッグしたいときにはこの方法が有効です。

お粗末な内容ですが補足でした。

Intel Edisonをイジってみた

正月前後にIoTに興味をもってずっとものを買わずに来たんだが3月末に思い切ってIntel Edisonを買ってみた。

このブログを参考に秋葉原のマルツ電気と秋月電子にいってものを揃えたのが3月。
今日やっとOSアップデートとwi-fiの設定を完了したw

ついでに mraa ってライブラリを動かしたいと思ってこのブログとgithubリポジトリを見つつ設定を入れた。

% echo "src mraa-upm http://iotdk.intel.com/repos/3.0/intelgalactic/opkg/i586" > /etc/opkg/mraa-upm.conf
% opkg update
% opkg install mraa

サンプルコードを動かしてみる。 opkgで入ってるバージョンと同じものが表示されてるので正常に動いてそう。

% opkg list mraa
mraa - 0.10.1 - mraa built using CMake

%  cat sample.js
var m  = require('mraa');
console.log("MARR Version: " + m.getVersion());

% node sample.js
MARR Version: v0.10.1

ずっと時間が取れずにサボってたのでGWに本格的に開発出来るように今から予習を進めていく次第です。

Intel EdisonではじめるIoTプロトタイピング

Intel EdisonではじめるIoTプロトタイピング

自分は正月ぐらいにこの本を買ってペラペラめくって読んでます。
Amazonのレビューにもある通り本の内容はすでに古くなってきているのでこの1冊ですべて解決出来るわけではないけど、 何を買ってくればいいかなどおおまかな流れをつかむのにはこの本を読んでおくのがいいと思う。

それ以外はクラスメソッドのブログを読んで解決していくのがいいかと思う。

たまゆら 汐入卒業式~ちひろちゃん、ともちゃん卒業おめでとう、なので~に行ってきた

「卒業式」詳細情報 | たまゆら〜卒業写真〜

①汐入卒業式~ちひろちゃん、ともちゃん卒業おめでとう、なので~
日時: 2016年4月10 日 18:00開場 19:00開演 21:00終了(予定)
場所: 横須賀芸術劇場
料金: 6,480円[税込]

関東ではラストの大きなイベントだったのでこの1年間たまゆらを追っかけてきた自分としてはやっぱり行きたいなと思い行ってきました。

グッズの物販はそんなにほしいもの無かったけどイラスト集は買って良かったと思ってる。
たまゆらのほとんどのイラストが掲載されててこれはたまゆらファンなら買い一択な一品です。

イベント本編はいつもの劇団たまゆらのミニコントで始まり、
寿美菜子"画伯"が書いた作品に声をあてる無茶振りだったりサトジュン監督が扮する誰かに告白するゲームだったりと会場は終始爆笑の連続でした。

最後の卒業証書授与式では東山さんの涙が特に印象的で裏にこんなエピソードあったのかって
たくさんの気づきがありました。

「寂しければ寂しいほどそれだけ楽しかった」たまゆらの最後はこの一言に尽きると思います。 この1年間ちゃんとたまゆらを追っかけてきてどのイベントも笑いあり爆笑ありの少し涙ありでどれもいい思い出ばかりでとても満足させてもらいました。

4/24に竹原でやる最後のイベントは行けないが東京の空から見守りたいと思います。

我流togetterまとめ作成方法

最近、業務でtogetterまとめを作る機会が何度かあったので 自分なりのまとめ作成方法をメモ代わりに公開しておく。

まず、ヤフーのリアルタイム検索からハッシュタグで検索してtweetを拾ってくる。
リアルタイム検索

リアルタイム検索を使うのは特に理由はなかったはずだけど、スパムっぽいツィートが弾かれてるからだった気もする。

Firefox + Firebugでコンソールを使って下のスニペットを実行してtweetのURL一覧を取得。

$("#TSm p.lt").each(function(){
  var link = $(this).children("a")[1];
  var h = link.href;
  var twURL = decodeURIComponent(h.split("*")[2])
  console.log(twURL);
});

2016/06/05 追記

twitterからぶっこ抜きするにはこんなコードでOK
もうちょっとキレイな書き方あるはずだけどとりあえずこれで。

var elements = $("a.tweet-timestamp");
var n = elements.length;
for(var i = 0 ; i < n; i++){ 
  var link = $("a.tweet-timestamp")[i].getAttribute("href");
  link = "https://twitter.com" + link;
  console.log(link);
}

2016/09/26 追記

いつの間にかフォーマット変えられてたのでちょっと変更してURLの一部を抜き出す形式に変更。

$("#TSm p.lt").each(function(){
  var link = $(this).children("a")[1];
  var h = link.href;
  var RU = h.split("/")[9].slice(3);
  // var rawURL = decodeURIComponent(RU.replace('-', '=').replace('_', "/").replace(".", "+"));
  var rawURL = RU;
  rawURL = rawURL.replace(/\-/g, '=');
  rawURL = rawURL.replace("_", '/');
  rawURL = rawURL.replace(".", '+');  
  // console.log(decodeURIComponent(rawURL));
  console.log(window.atob(decodeURIComponent(rawURL)));
});

2018/01/06 追記

twitterの方が取れなくなっていたのでちょっと修正。

var x = "";
$$(".tweet-timestamp").forEach(
  function(el, i){
    x += el.href + "<br/>\n";
    console.error(el.href);
});
document.write(x);

querySelectorAll() を使うコードに変更。

次に、togetterのまとめ作成画面から画像のY字っぽいボタンをクリック。

f:id:uokada:20160328024142p:plain

クリックして出てきたフォームに先ほど取得したURL一覧を入力して完了。 f:id:uokada:20160328024144p:plain

あとは、時間順に並べて重複、RTを削っ荒いまとめの完成。
余裕があればここからデコレーションしたり、ハッシュタグがついてないけど関係ありそうなまとめを拾ってきて完成。

デコレーションはRTが多いtweetは優先的に赤字で大きくしたいと思っているのだが今のtogetterのUIだと難しいので、 今後の課題かなと思ってる。