読者です 読者をやめる 読者になる 読者になる

spring of life

技術、ときどき日常のブログ(予定)

.tar.gz の作成(圧縮)

Ruby

ruby で圧縮処理しようと思ったんだが、あんまり記事がなかったので自分でメモ

唯一(と言ってもいいくらい無かった)見つかったのが↓の記事

d.hatena.ne.jp

まぁでもこれもけっこう古い記事で、今は gem の名前が変わってるっぽい。

今は minitar という gem と、あと minitar-cli っていうのも一緒にインストールする(bundle installしたらメッセージが出てくる)

# Gemfile

gem 'minitar'
gem 'minitar-cli'

で、使い方はだいたい↑の記事といっしょで、Archive::Tar::MinitarのとこをMinitarに直すくらいかな。

require 'zlib'
require 'archive/tar/minitar'

Zlib::GzipWriter.open('foo.tar.gz', Zlib::BEST_COMPRESSION) do |gz|
  out = Minitar::Output.new(gz)
  Dir['/path/to/dir/*'].each do |file|
    Minitar::pack_file(file, out)
  end
  out.close
end

NFS を使ったマウント

前にこっちでCIFSを使ってWindowsサーバーのフォルダをマウントする方法を書いたけど、今度はNFSを使って別のLinuxのサーバーのディレクトリをマウントする機会があったから方法をメモ

ちなみに、OSは

  • サーバー側: CentOS 6.6
  • クライアント側: CentOS 7.2

です

マウントするディレクトリがある側(サーバー側)の設定
  • nfs-utils をインストール
    • サービスを起動する時は、rpcbind→(nfs, nfslock)の順番でないとエラーになる
# yum install nfs-utils
# service rpcbind start
# service nfs start
# service nfslock start
  • /etx/exportsにマウントするディレクトリの設定を書く
    • 書き方とかはこちらを参考に
    • exportfs -aで更新しておくことも忘れずに
  • iptables を使っている人は111, 875, 2049番ポートを開けておく
# /etc/sysconfig/iptables

...
-A INPUT -p tcp -m tcp --dport 111 -j ACCEPT
-A INPUT -p udp -m udp --dport 111 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 875 -j ACCEPT
-A INPUT -p udp -m udp --dport 875 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT
-A INPUT -p udp -m udp --dport 2049 -j ACCEPT
...
別サーバーのディレクトリをマウントする側(クライアント側)の設定
# yum install nfs-utils
  • マウント実行(123.456.789.012にある/home/nfs_test/mnt/nfs_testにマウントする場合)
# mount -t nfs 123.456.789.012:/home/nfs_test /mnt/nfs_test
  • mountコマンド実行してmount.nfs: access denied by server while mounting ...とか出た場合はサーバー側のiptablesの設定がうまくいってないかも

emacs の json-mode の設定

しばらく書いてなかった。。。

ネタがなかったというとウソだがけっこう細かいリファクタみたいなことをいろいろしてた。

まぁ今回書くのも細かいけどw



chef のコードを書いてると json を書くことが多くて、 emacsjson の設定を変えたのでメモ

  1. まず json-mode をインストール
    • M-x package-install [ret] json-mode [ret]
  2. .emacs.el か何かの設定ファイルにインデント設定を記載
    • 自分は2スペースが好みなので↓のような設定
(add-hook 'js-mode-hook
          (lambda ()
            (make-local-variable 'js-indent-level)
            (setq js-indent-level 2)))

chef で jenkins 環境構築

jenkins chef

jenkins の環境構築を chef でできないかな〜といろいろ調べてある程度できたのでメモ

jenkins のインストール

remote_file node[:jenkins][:rpm_path] do
  source node[:jenkins][:rpm_url]
  owner 'root'
  group 'root'
  mode 0755
  not_if { File.exists?(node[:jenkins][:rpm_path]) }
end

package 'jenkins' do
  source node[:jenkins][:rpm_path]
  not_if 'rpm -q jenkins'
end

アカウント作成

  • ここからが少し面倒だった。。。
  • jenkins には WebAPI とか CLI があるみたいで、今回は CLI を使った
  • chef の中でコマンド実行することでアカウントを作成
  • まず、jenkins-cli.jar をダウンロード( http://localhost:8080/jnlpJars/jenkins-cli.jar にアクセス)
  • groovy を使ってアカウントを作成
    • groovy = とすることで標準入力を受け付けれる
  • 最初は管理者しかいないので、ユーザー名とパスワードは管理者のものを使用
    • パスワードは/var/lib/jenkins/secrets/initialAdminPasswordに書かれている
    • --passwordオプションもあるが、インストール前だともちろんファイルはなく、chef でインストールから始める場合にファイルがなくエラーになるのでファイルを指定するようにしておく
remote_file node[:jenkins][:cli_path] do
  source node[:jenkins][:cli_url]
  owner 'root'
  group 'root'
  mode 0755
  not_if { File.exists?(node[:jenkins][:cli_path]) }
end

execute 'create account' do
  command <<-"EOF"
echo 'jenkins.model.Jenkins.instance.securityRealm.createAccount("<id>", "<password>")' |
java -jar #{node[:jenkins][:cli_path]} -s #{node[:jenkins][:host]} groovy = --username=admin --password-file=</path/to/password-file>
  EOF
  user 'root'
end

プラグインインストール

  • これも CLI を使ってインストール
  • install-pluginというコマンドを使う
execute 'install plugin' do
  command <<-"EOF"
java -jar #{node[:jenkins][:cli_path]} -s #{node[:jenkins][:host]} install-plugin <プラグイン名(git とか)> --username=<ユーザー名> --password=<パスワード>
  EOF
  user 'root'
end

ジョブ作成

  • これは1度config.xmlを作っとかないと無理。。。
  • 自分の場合は既に手作業で作った jenkins があったので、/var/lib/jenkins/jobs/<ジョブ名>/config.xmlをコピーして chef のリポジトリの中に入れておくことにした
    • まぁこうしとけば、あとは別のサーバーで作る時は自動で作れるので一応便利、かな。。。
execute 'create job' do
  command <<-EOF
cat /path/to/config.xml |
java -jar #{node[:jenkins][:cli_path]} -s #{node[:jenkins][:host]} create-job <ジョブ名> --username=<ユーザー名> --password=<パスワード>
  EOF
  user 'root'
end

とりあえず今回はここまで自動化した!

おまけ

  • jenkins でパスワードなしで sudo 権限を使いたい場合は/etc/sudoers.d以下に↓みたいな設定ファイルを追加しておく
jenkins        ALL=(ALL)        NOPASSWD: ALL

CSV ライブラリを使ってみた

Ruby

Ruby には標準で CSV を扱うための CSV ライブラリがあって、使うことがあったのでメモ

CSV の読み込み

  • 基本的にはCSV.readCSV.table
    • CSV.readは1行を配列として読み込む
    • CSV.tableは全体がオブジェクトになる
CSV.read
require 'csv'
csv = CSV.read(<csvファイルへのパス>)
  • 基本的には全て文字列として読み込まれる
  • convertersオプションを指定することで、日時や数値として読み込める
CSV.read('hoge.csv', :converters => :numeric) # 整数・小数は<code>Integer</code>, <code>Float</code>型に変換される
CSV.read('hoge.csv', :converters => :date_time) # 日時は<code>DateTime</code>型に変換される
CSV.read('hoge.csv', :converters => :all) # 日時、整数・小数は<code>DateTime</code>, <code>Integer</code>, <code>Float</code>型に変換される
  • 他にもいくつか用意されてるっぽい
CSV.table
require 'csv'
csv = CSV.table(<csvファイルへのパス>)
  • こちらもconvertersオプションを指定可能
    • デフォルトで何か指定されてるっぽい?
  • CSV::Tableクラスのインスタンスが生成される
CSV.table('hoge.csv') #=> #<CSV::Table mode:col_or_row row_count:xxx>
  • こっちも配列みたいな感じでeachとかを使える
csv = CSV.table('hoge.csv')
csv.each do |row|
  puts row[:hoge] # 各値にはシンボルでアクセス
end

CSV の書き込み

  • CSV.openを使う
require 'csv'
...
CSV.open('fuga.csv', 'w') do |csv|
  ...
end

または

require 'csv'
...
csv = CSV.open('fuga.csv', 'w')
csv.puts ['hoge', 'fuga']
csv.close

samba で windows のフォルダをマウント

samba

明けましておめでとうございますm(_ _)m

今年もぼちぼち書いていきますかね〜

更新頻度はどうなるか分からないけど、継続したいね


で、今年1発目は samba のことをちょっとだけ。というか忘れそうなのでメモ程度のことを。

まずやりたいことは、Windows Server 2012 R2 に作った共有フォルダを Linux(CentOS) でマウント で、Windows Server と Linux の環境構築 & 設定は↓に

Window Server 2012 R2 の設定
  1. 共有フォルダを作成
    • フォルダは任意の名前・場所で作成してOK
  2. 共有フォルダのアクセス制御の設定
    1. エクスプローラーから作成したフォルダの場所まで移動してプロパティを表示
    2. 共有タブを開く
    3. ネットワークのファイルとフォルダーの共有のところに「設定されていません」と表示されていると思うので「共有」ボタンを押す
    4. 共有する相手を選択して「共有」ボタンを押すとネットワークワークパスが表示される
      • 必要であれば事前にユーザーを作っておく
      • ユーザーは「スタート」→「管理ツール」→「コンピューターの管理」→「ローカルユーザーとグループ」→「ユーザー」で右クリック→「新しいユーザー」から作成
    5. 「詳細な共有」ボタンを押して共有名などを設定(既に入力されているかも)
    6. (2016/01/06 追記)書き込み権限を追加する
      • 「詳細な共有」のところで、「アクセス許可」ボタンを押して共有で使うユーザーを追加する
      • 必要に応じて「フルコントロール」、「変更」、「読み取り」にチェックを入れる(読み取りだけだとファイルに書き込んだり、ファイルを削除できない)
Linux の設定
  1. samba-client, cifs-utils パッケージをインストール(yum -y install samba-client cifs-utils
  2. コマンド、または/etc/fstabに設定を書いてマウント
    • Windows Server の方で設定した「共有する相手」のユーザー名とパスワードを指定する
    • ユーザー名とパスワードは別ファイルに書いておいても良い

コマンドの場合

  • ユーザー名、パスワードを直接指定
# mount.cifs -o username=<ユーザー名>,password=<パスワード> //<Windows Server の IP アドレス>/<共有名> <マウントされるディレクトリ>
  • ユーザー名、パスワードをファイルに記載
/etc/smb.cred (ファイルのパスは任意)
username=<ユーザー名>
password=<パスワード>
----
# mount.cifs -o credentials=/etc/smb.cred //<Windows Server の IP アドレス>/<共有名> <マウントされるディレクトリ>

/etc/fstabに記載する場合

//<Windows Server の IP アドレス>/<共有名> <マウントされるディレクトリ> cifs <オプション> 0 2
  • <オプション>はコマンドの方で o オプションの後に付けた文字列

Base64エンコード

Java Android

最近平日も開発作業とかしたりしてて、書くことが溜まってきてて大変 笑

ちょっと寝るの遅くしたんだよね〜

昔から寝てる時間てなんかもったいないな〜とか思うタイプの人間で、できるだけ寝たくないんだが、仕事し始めてからは寝坊が恐いので寝る時間を早くしてた。

けど、やっぱ寝すぎだな!ってなって遅くした

でも寝ないのはダメだとは思うな〜寝た後の頭の整理されてる感はすごいからね



本題入りますか〜今日は久しぶりにJava

家計簿のアプリで、アプリ認証入れた時の対応

Android とかのアプリで WebAPI 使って収支情報をサーバー側に登録する時に、Authorization ヘッダーで認証するようにしたんだが、その時にIDとキーをエンコードしたので、その方法をメモ

Java 1.8

1.8 だと標準で入ってるので、以下のように(1.8 未満の場合は。。。)

import java.util.Base64;
...
String credential = Base64.getEncoder().encodeToString((application_id + ":" + application_key).getBytes());
Android

AndroidJava だけどっていうのはおいといてー

ちょっと使い方違うけど、ちゃんと用意されてるっぽい

import android.util.Base64;
...
byte[] credential = Base64.encode((application_id + ":" + application_key).getBytes(), Base64.DEFAULT);
String credential = new String(credential, "UTF-8");