かまたま日記3

プログラミングメイン、たまに日常

xargsとddcpで高速にファイルをコピーする

総量350GBくらいの大量にファイルが入ってるディレクトリをコピーしないといけなくなったので、xargsとddcpを使って頑張ってコピーした時の記録

  • もっと簡単に出来る
  • もっといい方法がある

ご指摘お待ちしております!

#!/bin/bash

SRC_PATH=/foo
DST_PATH=/bar
PARALLELS=$(nproc)

find "${SRC_PATH}" -mindepth 1 -type d -printf "/%P\n" | xargs -P${PARALLELS} -n1 -I {} mkdir -p ${DST_PATH}{}
find "${SRC_PATH}" -type f -printf "/%P\n" | xargs -P${PARALLELS} -n1 -I {} /usr/local/bin/ddcp -s ${SRC_PATH}{} -d ${DST_PATH}{}

解説

  • ddcpはコピー先のディレクトリが無いとエラーになるので、最初のfindコマンドでSRC配下のディレクトリを見つけて先に作ります。
  • xargsの -P オプションでプロセッサの数だけ並列実行します -n1 のオプションで渡ってきた入力を一個ずつ後続のコマンドに渡します、 -I {} オプションで渡ってきた引数を {} で再利用することが出来ます。
  • ddcpは並列処理でcpを実行するので、ddcp自体を並列にする必要は無かったかも.. (要ベンチマーク)

加地さん引退

発表されてからだいぶ経ってますが*1ガンバ大阪ジーコジャパンなどで活躍した加地選手が引退しました。

www.fagiano-okayama.com

引退会見も"500試合にこだわらない"、"半分以上楽しくなかった"など28歳で代表引退した加地さんらしい引き方かなあと思いました。

加地さんとの思い出

2005年くらいの代表戦でみたのが最初だったと思うのですが、ジーコジャパンでもお荷物扱いで2chでも"ペットボトラー"とか言われてたのが、コンフェデくらいからブラジル戦での幻のゴールもあったり、代表でも不可欠な存在になっていったのがハマるきっかけだったと思います。

このブログでも2006のワールドカップくらいまではかなり言及がありますねw シュバインシュタイガーに削られたときは本気で落ち込みましたよ...

加地 の検索結果 - かまたま日記3

2chの加地スレ影響も大きかったと思います。本当の加地さんの人となりは正直わからないのですがw 加地スレで作られたキャラはすごく良かったです。

  • "ロベカルじゃなくてごめんな" 発言
  • 将来は保育士になりたい
  • ペットボトラー, ロベカジ, キングカジなどの愛称
  • 数年に一回のスーパーゴール
  • 謎のアメリカ挑戦
  • などなど

とにかく、20年間お疲れ様でした。まだ38歳なので第二の人生楽しんで下さい!

*1:今日気づいた

最近Pythonでハマったことメモ

2年前くらいに書いたAWS Lambda用のPythonスクリプトを修正することになったんですが、環境構築でひたすらハマったのでメモっておきます。

前提

  • 私はPythonまともに書くのは2年ぶりのPy弱です
  • 実行環境はMac
  • Pythonのバージョンは2.7

問題1: pip installが上手く行かない

何か pip install xxx でインストールしようとすると途中で permission denied エラーが出てインストールできません。 例えば pip install awscli するとこんな感じで /bin/aws に書き込みをしようとしてエラーになります

IOError: [Errno 1] Operation not permitted: '/bin/aws'

原因としては、いつ追加したか覚えてないんですが、setup.cfgというローカル固有の環境設定をするファイルが追加されてたようで(ref)、これに以下のように書かれてたのが原因でした.

[install]
prefix=

Prefix, 自分の環境で言うと /usr/local がこの設定により打ち消されていたようです、ファイルを消すことで解決。

問題2: Dockerのpythonのコンテナ上でライブラリが読み込めない

pip install xxx したあとにxxxを使うスクリプトpython foo.py で実行してもライブラリが読み込めませんでした。 公式の例に書かれてるように --no-cache-dir を付けることで解決。

pip install --no-cache-dir xxx

問題3: バージョン固定が上手く行かない

requirements.txt を使って使うライブラリを指定してたんですが、2年経ってバージョンが上がってたため、最新用に色々修正しました。その後今のバージョンに固定しておこうかと思ったので、こんな感じで書いたんですが、、

foo==1.2.3
bar==4.5.6

この書き方ローカル開発中のIntelliJで上はちゃんと動いてたんですが、CircleCIで使うDockerの python:2.7 イメージ上で pip install -r requirements.txt しても上手く必要なライブラリが全部インストールされませんでした。こちらのQiita記事を参考にして、バージョンは constraints.txt は記述し、 pip install -r requirements.txt -c constraints.txt とすることで解決。

TOEIC 227回 結果

Listening: 360(365), Reading: 385(330), Total: 745(695) *1

苦節2年でのようやく700点超え。ただListeningはちょっと限界感があるので何かブレイクスルーが必要かも。

過去ログ

*1:括弧の中は前回(224回)の得点

gradle-git-release-pluginでGitHubにMaven成果物をリリースする

Mavenの成果物をアップして使えるようにする場合、MavenCentralやJCenterに上げるのが公式ですが、それらに上げられない*1specificなライブラリである、公式レポジトリに上げるのが面倒などの理由でもうちょっと簡単なソリューションが欲しい時があります。

そういう場合、GitHub(GitHub Pages)をMaven repositoryとして使うという方法があります。私も gradle-embulk-plugin など自分のライブラリを kamatama41/maven-repository というレポジトリで公開しており

buildscript {
    repositories {
        jcenter()
        maven { url "http://kamatama41.github.com/maven-repository/repository" }
    }
    dependencies {
        classpath("com.github.kamatama41:gradle-embulk-plugin:0.1.4")
    }
}

と言った記述でインストールすることが出来るようにしています。 このGitHubへのリリース作業を過略化するためのGradle pluginを作りました。

github.com

plugins.gradle.org

どんなプラグインかというと、maven-publish plugingradle-release plugingradle-git-publish pluginを統合したものになります。 release タスクを実行すると、以下のことを実施してくれます。

  • 指定したローカルディレクト*2にartifactをbuildしpublish
  • releaseを実行(Mavenのrelease pluginほぼ同じ挙動、詳細はこちらを参照)
  • release終了後、artifactを指定したGitリポジトリにpush

使用例

build.gradle

gitRelease {
    groupId = "com.example"
    artifactId = "awesome-artifact"
    repoUri = "git@github.com:your_account/your_maven_repository.git"
}

gradle.properties

version=0.1.0-SNAPSHOT

これで、masterブランチ上*3で、gradle releaseタスクを実行すると、以下のアクションが行われます。

  • gradle.properties が更新されて、バージョンが0.1.0になる。
  • github.com/your_account/your_maven_repositorygh-pages ブランチに新しいバージョン awesome-artifact-0.1.0.jar *4がcommitされpushされる
  • レポジトリに 0.1.0 のタグが追加される
  • すべて終了後、 gradle.properties が更新されて、バージョンが0.1.1-SNAPSHOTになる。

結構便利なので、ぜひ使ってみて下さい!

*1:or 上げるまでもない

*2:デフォルトだと${project_root}/build/git-release

*3:じゃないとエラーになる、リリースブランチは指定可能

*4:とその他に生成されるxmlなど

miamでexcludeオプションで除外したいIAMリソースを指定する

miamというAWS IAMリソースをDSLで管理できる素晴らしいツールがあるのですが、このツールの基本動作としてアカウントに紐づく全部のリソースを管理しようとするので、他のツール(例えばTerraformとかCloudFormation)で管理しているものがあった場合、こちらにエクスポートしておかないと削除されてしまいます。

そこで使うのが exclude オプションで、除外したいリソースを正規表現で指定できます。

$ bundle exec miam --apply --exclude 'foo'

しかし、このオプション、一回しか指定できないので、複数のリソースを指定したい場合、一個の exclude オプションに無理やり詰め込む必要がありました。

$ bundle exec miam --apply --exclude '(foo|bar|baz)'

しかし、我々のケースだと除外したいものが多くて複雑になってしまい

(foo-(admin|developer)-(staging|production)|bar-service.+)

こんなな感じになり読みづらいという難点がありました。

そこでPRを送らせてもらいまして、複数 exclude を指定できるようになったバージョン(v0.2.4.beta15)が本日リリースされました。 github.com

今後は以下のような感じで、 exclude を分けることが出来るようになります。

$ bundle exec miam --apply --exclude 'foo' --exclude 'bar' --exclude 'baz'

あと、 target というこれを指定したリソースだけをmiamで管理するというオプションも複数指定できるようになっています。

それでは、楽しいIAM管理ライフを!

2017年振り返り、2018年の抱負

子育て

父親になった&育休を取りました - かまたま日記3

やはりこれが今年一番のトピックですね。生まれてからは完全に子供中心の生活に変わりました。自由な時間も減りましたし子供に移されて体調不良になることも増えました。が、やっぱり子供はかわいいです。

仕事

2016年末~3月くらいまではインフラチームからちょっと離れてReactを書く仕事をやらせてもらってました*1。今まで余り経験出来なかったフロントの技術に触れられたのは良かったです。そこから育休を取って復帰後はインフラチームに戻り、体制変更などがあったりしましたが、今は社内のアプリ基盤をKubernetesに置き換えするプロジェクトを進めてます。

OSS活動

tfenvはお陰様で200スター越えて結構使われてissueもそれなりに来てるのですが、自分は今のバージョンで十分満足してる、bashのツールなので開発の技術的好奇心もあまり上がらない*2ということでモチベが全然上がっていないのが正直なところです..OSSの継続メンテの難しさを感じています。メンテナー募集中!

英語

地道に学習継続中。今は会社でサポートしてくれてるスタディサプリEnglishと、Rebuildfmで話題になってたバイリンガルニュースを毎月200円払ってトランスクリプトを読みながら聞くっていうのをやってます。あとは会社のオフィスに非日本語話者が増えてきたのでランチ行ったり、社内で英語のプレゼンしたり。TOEICは2回受けてどっちも700弱でした。

リトグリ

最高の体験をさせてもらった武道館ライブの後、ちょうど麻珠が卒業したあたりと子供の出産が重なりまして、それ以降はライブ/イベントなどはご無沙汰になってしました。が、今年からはまた参加していこうかなと思います。

イベント参加歴

2018年の抱負

  • 健康第一 (ちゃんと運動して強い体を身につける)
  • エンジニア定年に向けたキャリアの方向性を考える
  • 英語は引き続き、今年こそTOEIC700点超える
  • ゴルフに2回以上行く

過去の振り返り

*1:去年の振り返りにも書きましたが

*2:前述の通り自由な時間も少なくなって余暇の時間は他の技術向上に当てたい