Rails のルーティングに使用する id を別の内容に変更する方法
通常、edit 等に使用する URI に設定される id を、別のキー等で置き換えたい場合があります。
$ be rake routes Prefix Verb URI Pattern password_resets POST /password_resets(.:format) password_resets#create new_password_reset GET /password_resets/new(.:format) password_resets#new edit_password_reset GET /password_resets/:id/edit(.:format) password_resets#edit password_reset PATCH /password_resets/:id(.:format) password_resets#update PUT /password_resets/:id(.:format) password_resets#update
この id を code に置き換えたい場合、.\config\routes.rb
に以下のようにparam: code
を設定することで、置き換えることができます。
resources :password_resets, param: :employee_code, only: [:new, :create, :edit, :update]
上記のようにすることで、ルーティング情報は以下のようになります。
$ be rake routes Prefix Verb URI Pattern Controller#Action password_resets POST /password_resets(.:format) password_resets#create new_password_reset GET /password_resets/new(.:format) password_resets#new edit_password_reset GET /password_resets/:code/edit(.:format) password_resets#edit password_reset PATCH /password_resets/:code(.:format) password_resets#update PUT /password_resets/:code(.:format) password_resets#update
id とは別のキーを主キーのような形で使う際に重宝します。
Perl でパスワードZipを求められた際の対応方法
前提
Perl は初めて触りました。
対応を求められたサーバの環境は古いです。
$ perl -v This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
QBK (急にボールが来たので)
他にヘルプできそうな人間がいなかったということで、触ったことのない Perl のソースコード修正を求められました。
内容は、Webフォームに添付されたデータをメールで送信するシステムの添付ファイルをパスワードZipで圧縮すること。
Perl 触ったこともないので、極力他に影響を与えたくない一心で対応しました。
調べてみると、Perl の標準モジュールに「Archive::Zip」というものがあるのですが、これはパスワードZipに対応していませんでした。。。
どうしようかなー、と悩んだのですが、Perl からコマンドが呼び出せるらしいので、コマンドでパスワードZipを作成し、それを添付することにしました。
ということで対応したコードが以下。
#----------------------------------------------------------- # パスワードzip生成 # 引数: ファイル名 # 備考: $cf{upldir} には、ファイルの保管場所ディレクトリパスが入っている #----------------------------------------------------------- sub zip { my $ZIP_CMD = "/usr/bin/zip"; my $ZIP_PASSWD = "************"; my ($origin_name) = @_; my $zip_name = "$origin_name.zip"; my $cmd = "$ZIP_CMD -jP $ZIP_PASSWD $cf{upldir}/$zip_name $cf{upldir}/$origin_name"; # パスワードzipの生成コマンド system($cmd); # コマンドの実行 }
で、これをメール送信処理中の添付ファイルをセットする前に
&zip($fname); # $fname には対象となるファイル名が格納されている
と呼び出して、生成したファイルを添付することで対応しました。
今回はパスワード自体をランダム化する必要が無いという要件だったので、ソースコード内にパスワードを埋め込んでいますが、あまりよろしくないという認識はあります。
また、system関数は便利な半面、セキュリティリスクになりそうなので、使い所を見極めて使う必要がありますね。
ActiveRecord に対する scope は条件に一致するレコードが存在しない場合 .all の結果を返却する
scope を利用していたところ、思わぬところでハマってしまいました。。 指定の条件で検索を行い、返却された結果が nil かどうかで条件分岐させようと思っていたのですが、scope を利用すると常に nil ではなく、.all の結果が返却されてきます。
scope :search_with_user, -> (user_id) { where('user_id = ?', user_id) }
よくよく調べて見たところ、 scope はメソッドチェーンを実現するために、nil を返すことはなく、.all を返すんだとか。
要は scope の利用方法に関する認識不足だったのですが、他の人も同じような勘違いをする可能性もあるかも、と思ったのでブログに残しておきます。
Sqaleがサービス終了するとのことです
PaaSとして柔軟に利用していたGMOペパボのサービスであるSqaleですが、終了するとのこと。
【サービス終了のお知らせ】 | Sqale Information
安価であったため、結構使い勝手がよく、ちょこちょこ利用させてもらっていたんですが、rubyのバージョンアップに追従してなかったんで心配していたのですが。。。 代替サービスとしてはHerokuが推奨されています。
Herokuはドル建ての請求になるだろうから、それが経理からいやがられるんだよな。。
iBatis で LIKE 文を使うときの注意点
はじめに…SQLインジェクション発生!
現在対応中の案件で、なぜか iBtais の利用が指定されている案件があるのですが、ここでSQLインジェクションを発生させてしまったので、自戒として記載します。
iBatis の動的パラメータ受け渡し
iBtaisには # と \$ が用意されていますが、# で囲まれたパラメータはエスケープされ、\$ で囲まれたパラメータはそのまま出力されます。
で、LIKE分を記述する際は、%を渡したかったので、
WHERE column1 LIKE $%value%$
と記述していたのですが、そうしたところ、'
などを検索文字として渡した際にエラーが発生しました。
つまり、SQLインジェクションが発生してしまったわけです。
対応策
で、どうしたかというと、
WHERE column1 LIKE CONCAT('%', #value#, '%')
という風に、文字列連結を行うことで対応しました。
一部RDBではCONCAT
に対応していないみたいですが、MySQL、Oracle、MSSQL等は問題なく動作するようです。
PostgreSQLはちょっとだけ微妙。
%
を含んだ検索がうまくいかないようです。
実害はないようですが。
コード整形のために積極的に利用したい拡張機能 CodeMaid
Visual Studio でのコーディング時の悩み
C# での開発を行っていると、Visual Studio がいろいろな機能を持っていてデフォルトでもかなり使いやすいと感じています。(atom での開発と比較して)
しかしながら、atom のパッケージで実現できていた機能で、Visual Studio ではデフォルトではできないこともそれなりにあります。
そのうちの一つがコードの整形でした。
Visual Studio には拡張機能がある
しかし、Visual Studio にも、atom のパッケージと同じように、機能を組込むことができます。
それが「拡張機能」です。
(その他、Nugetもありますが)
この拡張機能のひとつとして、コード整形の 「CodeMaid」というものがあります。
CodeMaid - Visual Studio Marketplace
CodeMaid のインストール方法
インストールは非常に簡単です。
Visual Studio の [ツール]→[拡張機能と更新プログラム]を選択し、「CodeMaid」を検索します。
すると、CodeMaidが表示されますので、[インストール]ボタンからインストールするだけです。
CodeMaid の機能
- Code Cleaning
- Code Digging
- Code Reorganizing
- Comment Formatting
- Joining
- Finding
- Sorting
- Collapsing
- Progressing
- Configuring
- Switching
- Toggling
色々ありますが、コード整形を自動で行ってくれる機能と、それ以外の付帯機能と考えていいと思います。
CodeMaid の使い方
Visual Studio のコードエディタ上で右クリックすると、[CodeMaid]が追加されています。
その中の [Cleanup Active Document] を選択することで、開いているソースコードの整形が行われます。
具体的な整形内容ですが、
- Remove unused using statements (不要な using の削除)
- Sort using statements (using の並び替え)
- Add unspecified access modifiers (アクセス修飾子の追加)
- Remove empty regions (空の region の削除)
- Add blank line padding (空行の追加)
- Remove blank lines next to braces (中括弧の次の空行を削除)
- Run Visual Studio formatting (Visual Studio のフォーマット)
- Remove consecutive blank lines (連続した空行の削除)
- Remove end of line whitespace (スペースのトリム)
- Update endregion tags (endregion タグの更新)
となっています。
具体的にどうなるのかは、公式ページがわかりやすいです。(英語ですが、わからなくても画面キャプチャだけでわかります。)
http://www.codemaid.net/documentation/#cleaning
何故使うか
これを使うことで、一定のルールが自動で施されるようになり、コードの可読性が上がります。
また、チーム開発でのソースコードレビューで些末な指摘から開放されます。
もちろん、CodeMaid はあくまでアシスト役として、静的コード解析・ソースコードレビューと組み合わせることが必要だとは思いますが、自動的に修正できることはこういったツールに任せて、人間はもっと根本的なコーディングに時間を使ったほうが、生産性の向上に寄与します。
このような補助をうまく使うことで、楽しくコーディングしたいものです。
Zabbix3.0系における、各種OS毎の Zabbix-agent のインストール方法 (CentOS6系・CentOS7系・Ubuntu系・Windows系)
Zabbix3.0系は安定版
上記のサイトを見ていただければわかるのですが、Zabbix3.0系はフルサポートの期限が2019/2、リミテッドサポートが2021/2となっており、現状の最新安定版となっています。
Zabbix社は1年半ごとにLTS(長期サポート: Long Term Support)をリリースする方針で、次の安定版は2017/8前後ということになります。
つまり、Zabbix3.0系は今導入すべきバージョンだと言えます。
Zabbix-Agent のインストール方法を探すと、Zabbix3.2系が多い
なので、Zabbix3.0系を導入しようと思ってネットを検索すると、Zabbix-Agentに関して、思いの外Zabbix3.2系のインストール方法が多く、すぐにZabbix3.0系のインストール方法が見つかりませんでした。
また、あるOS向けのインストール方法は見つかるのですが、まとまった情報がなく、OS毎に見つけるのに苦労しました。
Zabbix-Agent インストール方法
前置きが長くなりましたが、せっかく各種OSでインストールしたので、インストール方法をまとめてみました。
(とはいえ、自分が何らか利用しているOSのみですが)
CentOS6系
# リポジトリの追加 sudo yum -y install http://repo.zabbix.com/zabbix/3.0/rhel/6/x86_64/zabbix-release-3.0-1.el6.noarch.rpm # エージェントのインストール sudo yum -y install zabbix-agent # エージェントのコンフィグファイル変更 sudo vi /etc/zabbix/zabbix_agentd.conf Server={Zabbix Server のIPアドレス} ServerActive={Zabbix Server のIPアドレス} Hostname={Zabbix-agentを導入したサーバのホスト名} # プロセス起動 sudo service zabbix-agent start # 自動起動に登録 sudo chkconfig zabbix-agent on # ファイアウォールへのポート10050 許可設定 sudo vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 10050 -j ACCEPT # ファイアウォールの再起動 sudo service iptables restart # リポジトリの無効化 sudo sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/zabbix.repo
CentOS7系
# リポジトリの追加 sudo yum -y install http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm # エージェントのインストール sudo yum -y install zabbix-agent # エージェントのコンフィグファイル変更 sudo vi /etc/zabbix/zabbix_agentd.conf Server=192.168.2.219 ServerActive=192.168.2.219 Hostname={自分のホスト名} # プロセス起動 sudo systemctl start zabbix-agent # 自動起動に登録 sudo systemctl enable zabbix-agent # ファイアウォールへのポート10050 許可設定 sudo firewall-cmd --add-port=10050/tcp --permanent # ファイアウォールの再起動 sudo systemctl restart firewalld # リポジトリの無効化 sudo sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/zabbix.repo
Ubuntu系 (UbuntuとLinux mintで確認)
# リポジトリの追加 wget http://repo.zabbix.com/zabbix/3.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.0-1+trusty_all.deb sudo dpkg -i zabbix-release_3.0-1+trusty_all.deb sudo apt-get update # エージェントのインストール sudo apt-get install zabbix-agent # エージェントのコンフィグファイル変更 sudo vi /etc/zabbix/zabbix_agentd.conf Server=192.168.2.219 ServerActive=192.168.2.219 Hostname={自分のホスト名} # プロセス起動 sudo service zabbix-agent start # Ubuntu系はCentOSで言うchkconfigに当たる機能がデフォルトで入っていないため、導入していなければ導入する sudo apt-get install sysv-rc-conf #入っていない場合のみ # 自動起動に登録 sudo sysv-rc-conf zabbix-agent on # (iptablesを利用している場合のみ) ファイアウォールへのポート10050 許可設定 sudo vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 10050 -j ACCEPT # (iptablesを利用している場合のみ) ファイアウォールの再起動 sudo service iptables restart
Windows系
【参考】
2 Zabbix Windowsエージェントのインストール [Zabbix Documentation 2.2]
http://www.zabbix.com/jp/download.php
上記サイトのコンパイル済みZabbixエージェントから、Zabbix 3.0 LTS 3.0.0 Windows(全バージョン)をダウンロードする
対象のWindowsサーバに配置し、解凍する
解凍したフォルダを開き、「bin」→「win64」を選択
「zabbix_agentd.exe」「zabbix_get.exe」「zabbix_sender.exe」を「C:\Program Files\」に「zabbix_agent」フォルダを作成して配置 ※フォルダの場所・名前は任意
解凍したフォルダの「conf」の「zabbix_agentd.win.conf」を「zabbix_agentd.conf」にリネームし、「zabbix_agent」フォルダへ保存
「zabbix_agentd.conf」を以下のように編集し、保存する ※フォルダの場所と名前は設定したものに変更
LogFile=c:\Program Files\zabbix_agent\zabbix_agentd.log Server=192.168.2.219 ServerActive=192.168.2.219:10051 ###Hostname=Windows host HostnameItem=system.hostname HostMetadata=Windows
※ この内容は一度のみ実施すればいい
Zabbixサーバで「設定 → アクション → 自動登録」 でエージェントの自動登録を作成
アクションの実行条件:ホストメタデータに含まれる Windows
アクションの実行内容:ホストを追加
ホストグループに追加:Windows
テンプレートとリンク:Template OS Windows
コマンドプロンプトを管理者で起動した上で下記を実施し、インストールする
C:>cd C:\Program Files\zabbix_agent C:\Program Files\zabbix_agent>zabbix_agentd.exe -i -c zabbix_agentd.conf
※以下のように表示されればインストール完了
zabbix_agentd.exe [29588]: service [Zabbix Agent] installed successfully zabbix_agentd.exe [29588]: event source [Zabbix Agent] installed successfully
zabbix_agentのスタート
C:\Program Files\zabbix_agent>zabbix_agentd.exe -s -c zabbix_agentd.conf
※以下のように表示されれば起動成功
zabbix_agentd.exe [29352]: service [Zabbix Agent] started successfully
「Windowsファイアウォール」→「詳細設定」→「受信の規制」から、右側のペインの「新しい規則」でポート10050を追加
zabbixサーバ側で追加されていることを確認
最後に
自分の認識では、UbuntuはDebian系だったのですが、Zabbixのパッケージを確認すると、Debian系は別のパッケージが用意されています。
http://www.zabbix.com/jp/download
http://repo.zabbix.com/zabbix/3.0/
Debianは利用していないため、今回のインストール方法のまとめには載せていません。
そっちの情報を期待して閲覧してくれた人がいたら、ごめんなさい。