ダメでしょ!

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

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

DELL サーバ系の Alert! Cover Was Previously removed. エラー

サーバにエラーが!!

今日はLinuxサーバを準備しようと思い、転がっているサーバを適当に選定して、HDDやらメモリやらを載っけて準備していました。
いざ準備ができたんで、起動してみると、見慣れないエラーが。

Alert! FRONT_FAN failure...
Alert! Cover Was Previously removed.

一つ目はすぐにわかりますよね。
サーバを開いてみてみると、たしかにCPUファンが回っていません。
ということで、別のサーバからCPUファンを取り出して、交換。
もう一つは何だ??

カバーが開けられたことをチェックするセキュリティ機能

調べたところ、カバーが開けられたことを検知していて、大丈夫かを確認してきているセキュリティ機能のようです。
実際、HDDやメモリの交換、更にはファンの交換で何度もカバーを取り外しているので、表示されておかしくなかったというわけ。

ということで、問題ないのでこれを解除する方法ですが。

  1. [F2]→BIOS画面が表示される
  2. [System Security…]→Enterキー押下
  3. [Chassis Intrusion…Disabled]→「→」キーを押下し、[Enabled]に変更し、Enterキー押下
  4. ESCキー押下→[Save Changes and Exit]を選択し、Enterキーを押下

これで次に再起動した際、表示されなくなっていればOKです。
親切機能なんだろうけど、知らないと対処できませんね。。。

require する際の指定文字列が大文字/小文字で挙動が変わる? → Macの大文字小文字区別の問題でした

ローカル環境で問題なく実行されたコードが別の環境でうまく動作しない

私の開発環境はMacなのですが、そこで以下のように記載したコードを作成しました。

require 'CSV'

自分のローカル環境での単体テストが問題なく終了したため、Linuxの実行環境で上記のコードを含んだアプリケーションを動作させようとしたのですが、

LoadError: cannot load such file -- CSV
from /usr/local/src/rbenv/versions/2.2.2/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require'

となり、エラーが発生しました。

問題は、MacLinuxで大文字小文字の判断が異なること

MacWindows と同じく、ファイル名やフォルダ名の大文字個別を区別しません。(デフォルトの設定では)
Linux は大文字小文字を区別します。
その違いで発生していたエラーでした。

MacUnix ベースだから、という勘違い

MacUnix をベースにしている、という認識があって、そこから勝手にLinux と同じように動作するだろうと思いこんでいました。。

ということで

require 'csv'

に修正して問題は解決しました。

rails_admin と devise を導入したプロジェクトで、root_path と rails_admin_path が異なる場合のログアウト遷移先設定方法

前提

rails_admin
devise

困っていたこと

一般向けサイトと管理サイトを作成し、管理サイトのみ devise でログイン処理を作成しました。
プロジェクト自体の root_path は一般向けサイトを指定したのですが、そうすると、管理サイトからログアウトした際に root_path に遷移してしまい、非常に不便でした。

対応方法

結論から言うと、application_controller.rb にメソッドを追加しました。

  def after_sign_out_path_for(resource)
    rails_admin_path
  end

これでログアウトしたら rails_admin_path に遷移するようにできます。

github.com

rails_admin 側に設定が存在するだろうと考えて調べていたため、devise 側だということに気づくのに時間がかかってしまった。。。