2022-03-23

gitでレポートな感じ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

 gitを運用していて、だれがどれくらい変更したんだろうとか調べたくなってみました。

とりあえず以下のようなことができるかなという感じです。


誰が何回commitしたか?

git shortlog --summary -n


特定の人が何行変更したか?

find app spec -type f | xargs -n1 git --no-pager blame -f -w|grep xxx| wc -l

上記では、app、spec配下のファイルをxxxさんが変更した行数を取得している感じです。


2020-08-10

CentOS6でActiveRecord::ConnectionNotEstablished: No connection pool with 'primary' found.というエラーが出たとき。

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

 CentOS6の環境でrailsのrspecの全件試験をしたときに、試験の後半で

「ActiveRecord::ConnectionNotEstablished:No connection pool with 'primary' found.」

というエラーが連発して発生することがありました。

エラーが発生したテストケースを個別に実行するとエラーがでない感じです。

どうも調べていたらCentOS6のulimitの上限がありそうな気配でした。

以下参考です。

CentOS6のプロセス数の上限

こちらを参考に

/etc/security/limits.d/90-nproc.conf

の内容を

*          soft    nproc     1024

から

*          soft    nproc     2048

へ変更したら無事にエラーが消えました。


2020-02-23

八朔にはムッキーちゃんがおすすめ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
冬は八朔がおいしいですね。
でも皮や房を向くのがめんどくさいですね。

そこでおすすめムッキーちゃん。
前から気になってはいましたが、amazonの配送料を無料にするために買ってみました。

思った以上にラクチンでよいです。おススメです。


2019-07-19

mysqlでソートしたデータをヘッダーつきcsvに保存する方法

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
mysqlでorder byでソートしたデータをヘッダーつきのcsvファイルとして保存する方法です。

以下のようなsqlを実行する感じです。

select 'head1','head2','head3'
union
select * from (
select col1,col2,col3 from tbl
order by col1
) as tmp
INTO OUTFILE '/tmp/sort_data.csv'
FIELDS TERMINATED BY ',';

これで

head1,head2,head3
1,bbb,ccc
2,aaa,bbb
3,ccc,aaa

みたいなcsvファイルが出力されます。

ポイントは、
・ヘッダーは、unionの前に記載
・ソートするsql文を、select * from (    ) as tmp で囲う
です。

以下を参考にしました。
https://stackoverflow.com/questions/3175312/select-union-and-order-by-in-mysql-how-to

2019-05-06

一つのDBを複数のrailsアプリから利用する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsにAPIや管理画面やバッチツールなど、いろいろ機能が盛り込まれて大きくなってきて、それぞれの機能を分離したくなってきてみました。
この段階では、
app
という一つのリポジトリがある感じです。

分離自体は、役割が結構ちゃんとわかれていたので、それほど大変ではありませんでした。
この段階では、
app_api
app_admin
app_batch
のような三つのリポジトリがある感じです。

三つに別れましたが、共通のDBを利用する必要があって、分離されたアプリそれぞれにmigrationがあって、それをなんか変わったときに人手で同期させていたのですが、それぞれ独自にカラム追加したりして、だんだん見通しが悪くなってきて、ちょっと面倒になってきました。

dbを独立したリポジトリにしてよい感じで使えないかなぁと調べていたら、
というのがあることを知りました。
Ridgepoleでは、migrationのように変更を積み重ねるのではなく、最終的なテーブル定義を保持していて、dbとテーブル定義の差分を見て、dbを変更していく感じです。
dbの状態の見通しがよくなりそうだし、定義ファイルを独立したリポジトリで管理して、それぞれのリポジトリのsubmoduleとして取り込むとよさげかなと思ってみました。

というわけで、そのような環境を構築してみます。

以下を参考にしています。
https://re-engines.com/2017/05/03/370/#rails_migrateRidgepole-2

まずはGemfileに
gem 'ridgepole'
を追加して
bundle install
します。これでRidgepoleが利用できるようになります。

現在のdb定義からRidgepole用の定義ファイルを生成します。
bundle exec ridgepole -c config/database.yml -E development --split --export -o db/schemas/Schemafile

これで
db/schemas/
以下に定義ファイルが作成されます。

試しに定義ファイルの適用コマンドを試します。
bundle exec ridgepole -c config/database.yml -E development --apply -f db/schemas/Schemafile
当然、変更はありません。
念のため、test環境にも試します。
bundle exec ridgepole -c config/database.yml -E test --apply -f db/schemas/Schemafile
こちらも変更はありません。

ここまでくれば、migrationは不要になるので思い切って削除します。
rm -r db/migrate

あと、rspecのテストのために以下の変更もしたほうがよいようです。
spec/rails_helper.rb
の中の
ActiveRecord::Migration.maintain_test_schema!
の部分をコメントアウトします。
以下のような感じです。

#begin
#  ActiveRecord::Migration.maintain_test_schema!
#rescue ActiveRecord::PendingMigrationError => e
#  puts e.to_s.strip
#  exit 1
#end

とりあえず、ここでmigrationからRidgepoleに切り替えた感じになります。
Ridgepoleをより便利に使えるようにします。
以下を参考にしています。
https://qiita.com/ToqTock/items/c185a38fd4e2011ddd64

まずmigrationファイルを生成されないようにします。Myappの部分は環境にあわせて変えてください。
config/initializers/generator.rb



Ridgepoleのコマンドが長いのでdb:migrateのようにdb:applyみたいな感じを使えるようにします。
lib/tasks/ridgepole_tasks.rake



ここからdbの部分を以下のような感じで独自のリポジトリにします。
cp -pr db ~/app_db
cd ~/app_db
git init
git add *
git commit
git remote add origin app_db用リポジトリ
git push -u origin master
これで
app_api
app_admin
app_batch
app_db
の4つのリポジトリができましたが、この段階では、app_dbと同じ内容が個別にapp_apiなどにある感じです。

app_apiなどの各アプリのdbディレクトリgitのsubmoduleを利用してapp_dbのリポジトリを見るようにします。
git submoduleに関しては、以下が参考になりました。
https://qiita.com/sotarok/items/0d525e568a6088f6f6bb

cd ~/app_api
この中のdbディレクトリを削除してしまいます。
rm -r db
ここで以下のコマンドを実行してapp_dbをsubmoduleにしてdbに結び付けます。
git submodule add app_db用リポジトリ db
これでリポジトリは、以下のような感じになりました。
app_api(dbフォルダはapp_db)
app_admin(dbフォルダはapp_db)
app_batch(dbフォルダはapp_db)
app_db

これでそれぞれのアプリでdbに変更したものは、app_dbを介して、それぞれに配布できるようになりました。


2019-01-16

centos7でproxyを利用してgithubにssh接続する方法

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
sshで直接githubに接続できない環境でproxy経由で接続する方法です。

.ssh/config
に以下のような記載をすればOKです。

-----------------------
Host github.com
  HostName ssh.github.com
  Port 443
  ProxyCommand /usr/bin/ncat --proxy <server>:<port> --proxy-type http %h %p
-----------------------

これで
ssh -T git@github.com
で接続できることを確認したらgitも利用できるはずです。

以下を参考にさせていただきました。
https://qiita.com/n_slender/items/30db800aad7eb193c07e
https://qiita.com/vvisteria/items/bd748406671faae228cb

2018-10-14

redmineのパスワード管理のpluginであるVaultを入れてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
redmineでプロジェクト管理していて、特定のサイトとかのパスワードをメンバーで利用する必要があって、なにかよいパスワード管理方法がないかなぁと思って探したところ、
Vault
というredmineのpluginを見つけたのでインストールして使ってみました。

インストール方法は、以下のような感じです。

まずは、redmineのpluginのディレクトリに移動してください。
cd redmine/plugins/

Vaultを取得します。
git clone https://github.com/noshutdown-ru/vault

インストールを実行します。
cd ..
bundle install --without development test
bundle exec rake redmine:plugins:migrate RAILS_ENV=production

ちょっと設定をいじります。
config/initializers/assets.rb
に、以下を追加します。
--------------------------
Rails.application.config.assets.precompile += %w( zeroclipboard.js )
--------------------------

これはいらないかもですが。。。
chown apache:apache keys

ここまできたら、webサーバを再起動します。

redmineにVaultが認識されているはずなので、設定をします。
redmineの「管理」「プラグイン」「Vault plugin 設定」「Vault settings」で以下の変更を行います。
Encryption keyに適当な文字列を16文字で設定して「適用」をクリックします。
(なんか16文字でないとエラーがでました。)
また、ちょっと気になったのは、redmineをサブフォルダで運用している場合に、
※The requested URL /vault_settings was not found on this server.
という感じのエラーが出てしまいますが、正しく保存されている模様なので気にしないことにします。


Vaultは、プロジェクトごとにパスワード管理をするようなので、
利用する場合は、各プロジェクトで
「設定」「モジュール」
にKeysが出てくるのでVaultを利用する場合にはチェックします。

これでプロジェクトで利用するパスワードは、ここで管理できます。ただ、プロジェクトまたがりで使うものを、共有して管理はできないようなので、プロジェクトまたがりで使うものがある場合は、専用のプロジェクトを用意するのがよいかもしれません。
また、Vaultは、パスワード毎に見れる人を設定できる気配です。

ちょっと、こちらをしばらく使ってみようかなぁと思ってみました。

以下のサイトを参考にさせていただきました。
俺的備忘録 〜なんかいろいろ〜 Redmineのパスワード管理プラグイン「Valut」を使ってみる

2017-12-28

raspberry pi zero wとダイソーのリモートシャッターとrubyで遊ぶ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
raspberry pi zero wを買ったのは、bluetooth機器とつないで、ちょっと遊んでみたいなぁと思っていたことも一つの理由だったりします。

お手軽に遊ぶ材料として、ダイソーで売っているリモートシャッターがよさげかと思ってみました。以下と同じもののようです。



これを利用した例を以下のサイトを紹介していたので、参考にさせてもらいました。
https://qiita.com/vimyum/items/8b7548ca8cf45383c5b0

こちらでは、bluebuttonというツールを利用しているのですが、ソースは以下にあります。
https://github.com/kinnalru/bluebutton

こちらのソースを見て、ちょっと遊んでみました。
こちらでは、二つのボタンを特に区別してなくて、押したことと長押しを検出していたので、ボタンを識別できるよう改造してみました。

上のIOSボタンは、押すとVolumeUpが送られてきているようです。
下のandoridボタンは、押すとEnterが来て、さらにVolumeUpが送られてきてるようです。

これで識別できそうなので、改造したのは以下のものになります。
rootで実行する必要があります。
これは、二つのボタンとそれぞれの長押しを検出して、さらにLINEに特定のメッセージを送るようにしてみました。


とりあえずIoTな気分を感じてみました。


2017-12-26

raspberry pi zero wを買ったのでusb接続でセットアップした

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

raspberry pi zero wを買いました。本当は単体で買いたかったのですが、なかなか単体で買えないのと、手ごろな手持ちのSDカードがなかったのと、電源もほどよいのが、ちょうどなかったので、ちょっと割高かなと思いましたが、セットで購入しました。

セットアップはusbでwindowsと接続して行うことができました。
手順は、
https://qiita.com/marron-akanishi/items/2ce4ae07c71dc8358093

https://qiita.com/gpsnmeajp/items/126fadd3e47cdd4a6c00
を見ればよさげです。
無線の設定の部分はraspi-configで設定したぐらいの違いしかないです。

途中でsshでraspberrypi.localと指定して接続するのですが、
うちにはすでに旧型のraspberry piがいて、
すでにraspberrypi.localを使っていたので、旧のほうにつながってしまいます。
新しいの方のを最初から名前を変える方法を探したのですが、
ちょっと見つからなかったので、最初に使っているraspberry piの電源を落として
raspberrypi.localで新しい方につながるようにしました。

その後、以下を参考に名前を変えました。
https://www.1ft-seabass.jp/memo/2015/04/21/raspberry-pi-hostname-memo/
名前を変える際は、無線LAN接続できるようにして、
無線でIPでも接続できるようになったのを確認してから変えたほうが良いです。
最初、上記を参考にせず間で名前を変えて、
無線設定も適当に確認しただけでやったら失敗して、
接続できなくなって最初からやりなおしになったりしたので、ご注意を。

2017-11-03

Rubyで暗号化した文字列をJavaScriptで復号化してみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Qiitaにある
JavaScriptで暗号化した文字列をRubyで復号化してみた
という記事の逆をやってみたいと思ってみました。

JavaScript側では、CryptJSを使ってRuby側で暗号されたものを
var text = CryptoJS.AES.decrypt(data, "pass").toString(CryptoJS.enc.Utf8);
で複合化をできるようにRuby側で暗号化したいと思います。
Ruby側で暗号化された値が上記のdataに入る感じです。

Ruby側は以下のような感じです。


これを使ってruby側で
enc_data = encrypt(”hogehoge”,"pass")
としてできた、enc_dataの内容をJavascript側のdataに入れてやれば、hogehogeと戻せる感じでした。