ダメでしょ!

プログラミングとか怒られた話とか…

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関数は便利な半面、セキュリティリスクになりそうなので、使い所を見極めて使う必要がありますね。

初めて Perl に触りましたが、デバッグ方法もよくわからないし、辛かった。。。

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が推奨されています。

www.heroku.com

Herokuはドル建ての請求になるだろうから、それが経理からいやがられるんだよな。。

iBatis で LIKE 文を使うときの注意点

はじめに…SQLインジェクション発生!

現在対応中の案件で、なぜか iBtais の利用が指定されている案件があるのですが、ここでSQLインジェクションを発生させてしまったので、自戒として記載します。

iBatis の動的パラメータ受け渡し

iBtaisには # と \$ が用意されていますが、# で囲まれたパラメータはエスケープされ、\$ で囲まれたパラメータはそのまま出力されます。
で、LIKE分を記述する際は、%を渡したかったので、

WHERE column1 LIKE $%value%$ 

と記述していたのですが、そうしたところ、'などを検索文字として渡した際にエラーが発生しました。
つまり、SQLインジェクションが発生してしまったわけです。

対応策

で、どうしたかというと、

WHERE column1 LIKE CONCAT('%', #value#, '%')

という風に、文字列連結を行うことで対応しました。
一部RDBではCONCATに対応していないみたいですが、MySQLOracleMSSQL等は問題なく動作するようです。
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 の機能

  1. Code Cleaning
  2. Code Digging
  3. Code Reorganizing
  4. Comment Formatting
  5. Joining
  6. Finding
  7. Sorting
  8. Collapsing
  9. Progressing
  10. Configuring
  11. Switching
  12. Toggling

色々ありますが、コード整形を自動で行ってくれる機能と、それ以外の付帯機能と考えていいと思います。

CodeMaid の使い方

Visual Studio のコードエディタ上で右クリックすると、[CodeMaid]が追加されています。
その中の [Cleanup Active Document] を選択することで、開いているソースコードの整形が行われます。
具体的な整形内容ですが、

  1. Remove unused using statements (不要な using の削除)
  2. Sort using statements (using の並び替え)
  3. Add unspecified access modifiers (アクセス修飾子の追加)
  4. Remove empty regions (空の region の削除)
  5. Add blank line padding (空行の追加)
  6. Remove blank lines next to braces (中括弧の次の空行を削除)
  7. Run Visual Studio formatting (Visual Studio のフォーマット)
  8. Remove consecutive blank lines (連続した空行の削除)
  9. Remove end of line whitespace (スペースのトリム)
  10. Update endregion tags (endregion タグの更新)

となっています。
具体的にどうなるのかは、公式ページがわかりやすいです。(英語ですが、わからなくても画面キャプチャだけでわかります。)

http://www.codemaid.net/documentation/#cleaning

何故使うか

これを使うことで、一定のルールが自動で施されるようになり、コードの可読性が上がります。
また、チーム開発でのソースコードレビューで些末な指摘から開放されます。
もちろん、CodeMaid はあくまでアシスト役として、静的コード解析・ソースコードレビューと組み合わせることが必要だとは思いますが、自動的に修正できることはこういったツールに任せて、人間はもっと根本的なコーディングに時間を使ったほうが、生産性の向上に寄与します。

このような補助をうまく使うことで、楽しくコーディングしたいものです。

Zabbix3.0系における、各種OS毎の Zabbix-agent のインストール方法 (CentOS6系・CentOS7系・Ubuntu系・Windows系)

Zabbix3.0系は安定版

www.zabbix.com

上記のサイトを見ていただければわかるのですが、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系 (UbuntuLinux 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

【参考】

qiita.com

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サーバ側で追加されていることを確認

最後に

自分の認識では、UbuntuDebian系だったのですが、Zabbixのパッケージを確認すると、Debian系は別のパッケージが用意されています。

http://www.zabbix.com/jp/download

http://repo.zabbix.com/zabbix/3.0/

Debianは利用していないため、今回のインストール方法のまとめには載せていません。
そっちの情報を期待して閲覧してくれた人がいたら、ごめんなさい。