ホーム ブログ ページ 38

Deviseを使用したパスワードのみによる認証

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Railsに認証機能を実装するgem「Devise」を使用して、パスワードのみで認証させる方法。

今回やりたかったのは、Rails で用いる認証機能 gem のDeviseを用いてパスワードのみで認証させるといったケースです。

Deviseの導入に関しましてはネットに様々記載がありますので今回は割愛させてもらいます。

認証ユーザー用のModelを作成

  • 認証ユーザー用のModel名は任意
  • 今回は、Userとする
    app/models/user.rb
    • confirmableを追加

ソース記述例

class User < ActiveRecord::Basedevice
  :database_authenticatable,  :rememberable,  :authentication_keys[];
  ### 以下省略 ###  
end

Deviceの認証が通常メールアドレスとパスワード認証がデフォルトですので
authentication_keys[]の記述がメールアドレスを使わないという意味になるようです。

上記の記載によりDeviceの認証時にパスワードのみで認証が可能となります。

余談ですがDeviseでメールアドレス以外のカラムをログイン認証に利用する場合は
例えばユーザー名(usernameカラム)で認証を行いたい場合は以下を追加すると良いようです。
authentication_keys => [ :username]

プログラミングで挫折した人に!日本語で書けるプログラミング言語3選

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

プログラミングを始めたい、でも参考書を読んでも全く意味がわからない。そんな人向けに、初心者でもわかりやすい日本語で記述できるプログラミング言語をご紹介します。

春からSE始めました。しかし参考書を開いても、意味の解らない言葉ばかり……
そんな私に救世主が。

日本語で記述できるプログラミング言語があるんです。

これならカタカナ・英語アレルギーの人でもなんとかなりそうですね。早速3つ、ご紹介します。

■なでしこ

なでしこ
起動時に現れるなでしこのデモページ

起動するとまず、「なでしこのはじめに」という画面が現れ、なでしこの解説やどんなものが作れるのかの例などが実際に見られます。なでしこを使って作られたゲームで遊ぶこともでき、イメージをつかみやすいですね。

nade

プログラムを記述するエディタのデザインも、なでしこ色(?)で統一されていて可愛らしいです。さっそくなでしこのマニュアルに従ってプログラムを書いてみます。
クジラが「こんにちは」と言う。
こう書いて実行ボタンを押すだけで、クジラの絵が出てきて「こんにちは」と言ってくれました。楽しい!

■プロデル

プロデル
プロデルのデザイナ
デザイナ(プログラムを書いたり設定したりする画面)が見やすい!
ファイルサイズが小さいので、実行が早いのも魅力の一つです。

■ 言霊

言霊

文系の学生がプログラミングに対して拒絶感を持たないよう開発されたとのこと。Javaの仮想環境で動くので、Macユーザーも使えるのが嬉しいですね。

■まとめ

3つの言語に触ってみて、私の個人的な感触としてはなでしこが一番初心者に優しく使いやすいと感じました。(記事の文章量にもそれが如実に表れていますね。)
プログラミングに慣れてきたら、プロデルや言霊の方が使いやすいと感じるのかもしれません。それぞれの嗜好や開発環境の違いによって、自分にあった日本語プログラミング言語を選んでみてください!

carrierwaveとfogでRiak CSへの画像アップロードを実装する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Amazon S3互換のストレージサーバーRiak CSに、Railsの画面からファイルをアップロードする機能を実装します。

Riak CSについて

Riak CSは、 Basho Technologies, Inc. がオープンソースで開発しているAmason S3互換のストレージサーバーです。Railsアプリケーションでは、carrierwavefog-awsという二つのGemを使うと、ファイルのアップロード処理を簡単に実装することができます。

APIが互換なので、Railsから見るとAmazon S3とほとんど同じです。

確認画面について

日本の業務系アプリでは、編集画面から保存するとき「確認画面」をはさむように要求されることが多いです。これはRailsのレールから外れてしまうため、特に画像系のファイルアップロードがからむと非常に面倒です。

しかし、carrierwaveでは《キャッシュ》というアップロードされたファイルを一時的なディレクトリに保存する機能があるので、確認画面のプレビューに画像を表示させることができます。

複数サーバー環境

複数のアプリケーションサーバーで負荷分散している場合、アップロードするファイルを共通のストレージに保存する必要があります。

carrierwaveの標準の機能では、アップロードされたファイルをサーバーのディスクに直接保存するため、そのままでは使えません。

fogという各種クラウドサービスに対応するGemを使えば、carrierwaveと連携してアップロードされたファイルをクラウドに保存することができます。

fog-awsはAmazon S3やプロトコル互換のネットワークストレージに対応するGemです。

今回はこのfog-awsを使用して、Riak CSにファイルをアップロードします。

環境

Riak CSの環境として、IDCFクラウドのオブジェクトストレージというサービスを利用させていただきました。

Railsで作成したサンプルアプリケーションは、下記のような構成になっています。

  • Ruby 2.3.1
  • Rails 5.0.0
  • carrierwave HEAD版
  • fog-aws 0.10.0

2016年7月の執筆時点のcarrierwaveでは、《キャッシュ》の一時保存先にfogのストレージを指定する機能がまだ正式リリースされていないため、GitHubのHEAD版を使用します。

実装

完成したソースコードを https://github.com/kkismd/cloud-sample に公開しています。
以下、ポイントとなる箇所を抜粋しながら説明します。

アプリケーションの概要

Userというモデルが、名前(name), メールアドレス(email) という属性のほかに、avatarという名前で画像ファイルを持ち、画面からアップロードすることができる、という機能を実装しました。
carrierwaveを使う場合、カラムとしてファイル名を表す文字列のカラムを用意します。

create_table :users do |t|
  t.string :name
  t.string :email
  t.string :avatar

  t.timestamps
end

Gemfile

前述のライブラリをGemfileに記述します。以下は抜粋です。

ruby '~> 2.3.1'
gem 'rails', '~> 5.0.0'
gem 'carrierwave',
  github: 'carrierwaveuploader/carrierwave',
  ref: 'b31f7ce006bade550be0ad946d0b993b799358e3'
gem 'fog-aws'

イニシャライザ

config/initializers/carrierwave.rbというファイルを作成してcarrierwaveとfog-awsの設定を記述します。

CarrierWave.configure do |config|
  config.fog_provider = 'fog/aws'
  config.fog_credentials = {
    provider: 'AWS',
    aws_signature_version: 2,  # ☆1
    aws_access_key_id: ENV['fog_api_key'],
    aws_secret_access_key: ENV['fog_api_secret'],
    region: ENV['fog_region'],
    host: ENV['fog_host'],
  }
  config.cache_storage = :fog # ☆2
  config.cache_dir = 'tmp/image-cache'
  config.fog_directory = ENV['fog_directory']
  config.asset_host = ENV['fog_asset_host']
end

個別に設定しなければならない値は、環境変数(ENV)から読み取るようにしています。
今回は環境変数の割り当てにfigaro というGemを使っています。

注意しなければならないポイントとして、Riak CSではファイルアップロード時に送信する電子署名のバージョンがAmazonのものより古いため、コメント ☆1 の設定を入れなければファイルをアップロードしようとしても失敗します。この事象はエラーメッセージが分かりにくくて特定に時間がかかってしまいました。

また前述の通り、《キャッシュ》の保存先をRiak CSに設定する ☆2 は、執筆時点でのcarrierwaveリリース版ではまだサポートされていません。

アップローダー

carrierwaveではまず app/uploadersディレクトリに「アップローダー」と呼ばれるクラスを定義します。ジェネレータが用意されているのでそれを利用します。

% rails generate uploader Avatar

生成したあと、保存先をfogに設定します。

class AvatarUploader < CarrierWave::Uploader::Base
  storage :fog

モデル

つぎに、UserモデルにAvatarUploaderを《マウント》します。

class User < ApplicationRecord
  mount_uploader :avatar, AvatarUploader

コントローラ

scaffoldでusersテーブルのCRUDを実装したあと、新規作成と保存について確認画面を追加します。
ここでは名前を create_confirmupdate_confirm としました。
コントローラにメソッドを記述し、routesファイルに定義を追加しました。

  resources :users do
    collection do
      post :confirm_create
    end
    member do
      patch :confirm_update
    end
  end

ビュー

確認画面でアップロードした画像をプレビューすることができますが、保存画面にデータを持ち回るために hidden フィールドにデータを保持します。

   <div class="field">
    <%= image_tag @user.avatar_url if @user.avatar? %>
    <%= f.hidden_field :avatar_cache %>
   </div>

ここでイメージタグで表示される画像は、Riak CSのキャッシュ用に設定したディレクトリに保存されています。このファイルはモデルがDBに保存するタイミングで実際の保存用ディレクトリにアップロードし直され、自動的に削除されます。

まとめ

carrierwavefog-awsを使うことにより、Amazon S3だけでなく互換性のあるストレージシステムに対しても簡単にファイルをアップロードする機能を実装することができます。

ただし、使用されているソフトウェアによって若干の差異があるため、実際に動かして確認する必要があります。

キーボードだけで生きて行く

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

なぜキーボードに操作を集約させるのか

 今回は作業を出来る限りキーボードだけで完結させるためのtipsについて紹介していく。まず、その前に自分が何故キーボードで操作したがるのかを説明しておきたい。

手元/視線の移動が少ない
 マウスを使う場合、どうしても手が大きく移動する。おまけにデュアルモニターで画面が広いとカーソルがしばしば迷子になる。マウスを使う度に画面上からカーソルを探すゲームを強要されるのは面倒だ。マウス探しやカーソル探しで視線が大きく移動すると注意が途切れ、時間も微妙にかかる。

マウス操作自体が面倒
 そもそもマウスでカーソルを移動させて特定地点まで運びクリックするという作業自体が面倒で遅い。マウスによるUIは誰でも直感的に扱えるが最速ではない。最速といえばキーボード。少なくとも人体に直接接続できる入力デバイスが開発されるまでは。

全体的な話

 次に汎用的な話について少し。キーボードに操作を集約させる上で自分が気にする点がいくつかある。

1.ホームポジションから離れない
 方向キーはこの理由でキーバインドにあまり使わない。確かに直感的だが、方向キーを使おうとするとホームポジションから右手が大きく移動するので割り当てたくない。

2.同じような操作は同じキーバインドで
 例えばタブを前後に移動するような操作は同じキーバインドを割り当てる。アプリによって操作が変わるのは誤操作しやすいし、そもそも覚えていられない。

3.アプリケーションごとのキーバインド設定(mac)
 アプリケーション自体でショートカットキーの設定をサポートしていない場合がある。そういった場合には「システム環境設定」>「キーボード」>「ショートカット」>「アプリケーション」で追加出来る。例えば自分はChrome、Skypeなど使用頻度の高いアプリに対してタブ移動をControl+W/Qで登録している。

Webブラウザを操作する

 特に頻繁に使うのにキーボードで操作しにくいのがWebブラウザ。ここではブラウザ操作をキーボードで操作するプラグインとして「vimium」を紹介する。名前の通り、みんなが大好きなvimのキーバインドで操作ができる。対応ブラウザはchrome/firefox。
http://vimium.github.io/

 これによってWebブラウザを利用する上で必要な操作の9割ぐらいはキーボードで行うことが出来る。数十の機能があるが主だったものを数点だけ挙げれば以下の通り。

  • 画面のスクロール
  • タブを移動・作成・閉じる
  • リンクを開く
  • ページ内検索
  • ブックマーク検索

これを使う上で覚えるべきキーバインドはそれほど多くないため、百歩譲って何らかの理由で不幸なことにvimに馴染みがない人もvimiumは十分に使える。

 特に便利なのが「リンクを開く」「ブックマーク検索」といったブラウザが元々サポートしていない機能。この辺の機能を押さえておくだけでもブラウザ操作のほとんどをキーボードで行うことが出来るはず。

まとめ

 日常的に業務で使うものと言えば、コンソールとSkypeとWebブラウザ、メールクライアントの四点ぐらい。今回の記事でその四点はキーボードで操作がほぼ完結するようになるはず。他に使う必要があるExcelなどもショートカットキーを多用することでマウスの必要性をかなり小さく出来る。もはやマウスは机の上で置物となるだろう。

 ところで職場用のマウスにKensingtonのExpert Mouseを買いました。ボールをコロコロして操作するの楽しいのでお勧めです。みんな買おう。╭( ・ㅂ・)و

vimでMarkdownに数式を組込んでプレビューさせる

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Markdownの編集中にリアルタイムにプレビューしてくれると非常に便利である。

vimでMarkdownを編集する場合には、previmを利用すると、browser上でほぼリアルタイムにプレビューしてくれる(marked.jsを利用しているらしい)。

さて、本記事では、Markdownで書いている文章に、数式を綺麗に表示させる方法について記載する。

数式を綺麗に表示させるために「MathJax」を利用する。

previmでMathJaxに対応したMarkdownを利用するためには、previmのpluginの下記を変更すればよい。

変更点1

「preview/index.html」に以下を挿入する。

    <script type="text/x-mathjax-config">
      MathJax.Hub.Config({
        CommonHTML: { matchFontHeight: false }
      });
    </script>
    <script async src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_CHTML">
    </script>

変更点2

「preview/js/previm.js」に1行挿入する。

    if (needReload && (typeof getContent === 'function') && (typeof getFileType === 'function')) {
      var beforePageYOffset = _win.pageYOffset;
      _doc.getElementById('preview').innerHTML = transform(getFileType(), getContent());

      mermaid.init();
      Array.prototype.forEach.call(_doc.querySelectorAll('pre code'), hljs.highlightBlock);
      autoScroll('body', beforePageYOffset);
      style_header();

      // ↓の1行を挿入する。
      MathJax.Hub.Typeset(document.getElementById("preview"));
    }

数式の書き方

MathJaxを利用しているのでMathJaxの記法(TeXの記法に準拠しているらしい)で記述できる。

以下に記述の例を示す。

複数行数式の例

\\[
  E = mc^2
\\]

本記事の冒頭の画像は、この例の記述で表示される数式(のキャプチャ)である。

インライン数式の例

計算式「\\( \alpha \times \beta \\)」で表される。

テキストベースの資料作成で使えるツールについて

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

序論

今更書き出すほどのものでもないが、テキストベースで文書を作成すると以下の利点がある。

  • 差分管理ツールが充実している(git, mercurial, …)
  • マウスの使用を最小限に抑えることができる

そこで、設計書をテキストベースで管理できないかを検討し、以下の構成で試したので簡単にまとめる。

  • 文章:Markdown
  • 図:PlantUML
  • ファイル管理:GitLab

PlantUMLについて

PlantUMLは、テキストベースでUMLが記載できるjava製のツールである。
図の出力に、graphvizを利用している。

例えば、以下の図を記載できる(下記に挙げたものは、全てではない)。

  • シーケンス図
  • ユースケース図
  • クラス図
  • アクティビティ図
  • コンポーネント図
  • 状態遷移図

また、UMLだけではなく、作図のための要素も用意されている。

使用したツール

Markdown

markdownの編集ツールは、vimを利用した。
vimのpluginのprevimを利用すると、browser上でほぼリアルタイムにプレビューしてくれる。

vimに拘りがなければ、atomや、haroopadも良いと思う。

PlantUML

Atomの下記pluginを利用して、編集時に図をリアルタイムにプレビューできるようになる。

  • language-plantuml
  • plantumlntuml-viewer

※但し、事前にplantumlを利用できる環境を準備しておく必要があるので注意。

なお、本記事の先頭の画像は、Atom上でPlantUMLをプレビューしている様子を表示している。

GitLab

GitLabにブラウザでアクセスすると、リポジトリ管理下のmarkdown形式のファイルを整形した状態で表示してくれる。
このため、ブラウザで整形された文書を確認することができる。

また、以下のような書式で同一ファイル内へのリンクだけではなく、
別ファイルへのリンクもできるためページ遷移も容易にできる。

  [ページ内リンク](#link)
  [別ファイルへのリンク](hogehoge.md)

振り返り

良かった点

  • マウス操作が、ほぼ不要になった。Atomを利用しないならターミナル上だけで操作を完結できる。
  • Officeソフトのような重たくて編集しづらいソフトから解放されVimだけで資料作成が完結できたことによりストレスから解放された。
  • 修正点をGitLab上で「明確」に確認できる。
  • 修正の反映もgitでpushすればよいだけなので非常に楽だった。
  • 指摘された点を修正した後、GitLabにpushしたことを通知すれば、メンバーはブラウザをリロードするか又は対象のURLにアクセスするだけで最新の仕様書を読むことができる。

悪かった点

  • GitLab上での「表」の表現力が低いため、大きな表を作成すると見辛い。
    • セル内の文字の配置がセンタリングしかできない(左寄せ、右寄せの指定ができない)。
    • 表のセル内で明示的な改行ができない。
    • 表の横幅を指定できない。
    • 表の外枠の横幅が決まっているため、横に長い表を作成すると、デザインがものすごく微妙になる。

悪かった点は、上述したように、文章の表現力の低さ、特に「表」に関する表現力の低さが目立つ。
これが改善されれば、ほぼ言うことはない。

まとめ

特に、修正した内容を確認してもらうときの速度が、かなり早くなったのが印象的だった。

Officeソフトで設計書を作成していると、修正された設計書を確認する人は、設計書が置かれたファイルサーバからローカルに持って来た後にファイルを開かなければならない。
Officeソフトは総じて動作が遅いため一々時間がかかる。

この作業は非常に面倒くさい。

しかし、今回の方式では、GitLab上でプレビューできるため、修正箇所のページのURLを渡せば、修正箇所を即座に確認することができる。既に該当個所のページを参照している場合には、ブラウザをリロードしてもらうだけでよい。

簡単な修正であれば、設計書に対する指摘があったときから修正後の設計書の確認完了まで1分以内に抑えることも可能だ。

スピード感を持った開発を目指すなら、良いアプローチの一つになると思う。

Fog を利用した IDCF オブジェクトストレージ へのアップロード・ダウンロード

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Railsで画像アップロード等を行うにはCarrierWaveを使用するのが便利であるが、これは特定のモデルに紐づくファイルをアップロードする事が基本的な使用方法である。 それに対して、ただ単純に(特定のモデルに紐付かない)ファイルをIDCFオブジェクトストレージへアップロードしたりIDCFオブジェクトストレージからダウンロードしたりするという用途においては、 Gem「fog」を利用すれば簡単に実装できるようになる。

Gemfile

gem 'fog'

アップロード方法

file_uploader = Fog::Storage.new(
  provider:               'AWS', # IDCFでもAWSと記述
  path_style:             true,
  host:                   'ds.jp-east.idcfcloud.com',
  port:                   443,
  scheme:                 'https',
  aws_access_key_id:      'XXX', # アクセスキー
  aws_secret_access_key:  ENV['SECRET_IDCF_SECRET_KEY'],
  region:                 'ap-northeast-1', # 東京
  aws_signature_version:  2
)

file_uploader.put_object(
  'XXX', # バケット名
  '/tmp/xxx/xxx.xxx', # ファイルのフルパス
 'XXX' # ファイル内容(パラメータで受け取る場合は、そのままparams[:xxx]等)
)

ダウンロード方法

file_uploader = ... # アップロード方法と同内容なので省略

File.open(file_full_path, 'w') do |f|
  f.write file_uploader.get_object(
    'XXX', # バケット名
    '/tmp/xxx/xxx.xxx' # ファイルのフルパス
  ).data[:body]
end

3分リファクタリング Rails.root編

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

log/ や public/など RAILS_ROOT 以下のファイルへの扱うとき、File や FileUtil などのクラスを使わずシンプルに記述できます。

BEFORE

Logger.new(File.join(Rails.root, "log", "production.log"))

AFTER

Logger.new(Rails.root.join("log", "production.log"))

POINT

Rails.rootが返すオブジェクトはPathnameなので、FileFileUtilでできることのほとんどをメソッドとして持っています。
File.joinなどを改めて呼ぶ必要はありません。

REFERENCE

http://ruby-doc.org/stdlib-2.4.3/libdoc/pathname/rdoc/Pathname.html

VERSIONS

Ruby MRI 2.3.1
Rails gem 'rails', '5.0.0'

CarrierWave を使用した IDCF オブジェクトストレージ保存

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Railsに画像等のファイルをアップロードする機能を実装するgem「CarrierWave」を使用して、ファイルをIDCFのオブジェクトストレージへ保存する方法。

アップローダの編集

「rails g uploader XXX」 にて生成されるアップローダ(app/uploaders/XXX_uploader.rb)を、以下の様に編集する。

class XXXUploader < CarrierWave::Uploader::Base
  storage :fog # オブジェクトストレージに保存する場合は :fog を指定
  ### 以下省略 ###
end

初期化設定

下記の様な設定ファイルを作成し、config/initializers/carrierwave.rb 等として保存。

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider:              'AWS', # IDCFでもAWSと記述
    path_style:            true,
    host:                  'ds.jp-east.idcfcloud.com',
    port:                  443,
    scheme:                'https',
    aws_access_key_id:     'XXX', # アクセスキーを記述
    aws_secret_access_key: ENV['SECRET_IDCF_SECRET_KEY'], # シークレットキー
    region:                'ap-northeast-1', # 東京
    aws_signature_version: 2
  }
  config.cache_storage = :fog # 一時ファイルもオブジェクトストレージに保存する場合(LB使用時は必須)
  config.fog_directory = 'XXX' # バケット名を記述

  config.asset_host = 'ds.jp-east.idcfcloud.com' # CDNを使用しない場合
  config.asset_host = 'https://XXX.cdn.jp.idcfcloud.com/' # CDNを使用する場合
end

Rails.cacheでキャッシュ処理してみた

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

よく閲覧されるページで何度もDBを読み込むのは、負荷がかかったりしていいとは言えません。 なのでキャッシュ処理を使用して、DBアクセスを減らしサクサク動けるようにしたいです。 そこでRailsでは容易にキャッシュ処理ができるのでやってみました。

class BlogController < BaseController
  before_action :load_paper, :load_picture, only: [:show]
  # キャッシュの保有期間を設定
  CACHE_EXPIRE_TIME = 1.day.freeze

  def show
    ・・・・・
  end

  private

  def load_paper
    # Rails.cache.readで読み込む
    @papers = Rails.cache.read(cache_key(:paper))
    # なかったらRails.cache.writeで書き込む
    unless @papers
      @papers = Paper.all
      Rails.cache.write(cache_key(:paper), @papers, expires_in: CACHE_EXPIRE_TIME)
    end
  end

  def load_picture
    @pictures = Rails.cache.read(cache_key(:picture))
    unless @pictures
      @pictures = Picture.all
      Rails.cache.write(cache_key(:picture))
    end
  end

  # keyが被らないようにする
  def cache_key(type = nil)
    [
      self.class.name.underscore,
      type
    ].join('')
  end
end

メソッド化などをしなければキャッシュ処理は3~4行追加するだけでできるので非常に便利です。

またRails.cache.fetchを使用するとさらに短くなります。
fetchはキャッシュがあったらそのまま返し、なかったらキャッシュを生成して返すという処理が行われます。

  def load_paper
    @papers = Rails.cache.fetch(cache_key(:paper), expires_in: CACHE_EXPIRE_TIME) do
      Paper.all
    end
  end

翻訳されてないですが、RailsGuidesで詳しく載っているのでこちらを見るのもいいかもしれないです。

[rails] Jpmobileを使用する際の注意点 Edit

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

スマフォでPC表示させているときの条件に注意。

Jpmobileの概要

RailsでPCサイトと共にスマフォサイトを作成する場合に便利なGemとして、JpmobileというGemがあります。

このGemを使うことで、アクセス端末に応じてviewを切り替えることができます。

すなわち、Jpmobileを使用することで、PCからアクセスされた場合にはPC用のviewを表示させ、スマフォからアクセスされた場合にはスマフォ用のviewを表示させることを、Webサイトの開発者が意識することなく実装できます。

また、スマフォからのアクセスかどうかを「request.smart_phone?」のように判定することができるようになります。

ここで、スマフォでアクセスした場合であっても、PC用のviewを表示したいユーザーがいることを考慮して、「PCサイトを表示する」のようなリンクを用意することがあると思います。

この場合には、「disable_mobile_view!」メソッドをコールすることで、PCサイトを表示させることができます。

※恐らく、このようなリンクがクリックされたことを、cookieやsessionに保存し、ページ遷移した後であっても、PCサイトを表示するように実装されるかと思います。

問題点

スマフォからのアクセスに対してPCサイトを表示させている状態であっても、request.smart_phone?の結果は「true」になります。

すなわち、viewが絡む部分(*1)に関して「request.smart_phone?」で条件判定をすると、意図しない動作になる可能性があります。

(*1) controllerでインスタンス変数に値を設定する場合等も含む。

例えば、

  • PCの場合 → 12個のレコードをインスタンス変数に設定
  • スマフォの場合 → 8個のレコードをインスタンス変数に設定

とすべき場合、本来であれば、

  • PCアクセス(PC用の表示) → 12個のレコードがインスタンス変数に設定される
  • SPアクセスでスマフォ用のを表示 → 8個のレコードがインスタンス変数に設定される
  • SPアクセスでPC用の表示 → 12個のレコードがインスタンス変数に設定される

となって欲しいところです。

しかしながら、controllerで、

def index
  count = request.smart_phone? ? 8 : 12
  @records = TestTable.where(...).limit(count)
end

のように、「request.smart_phone?」を使用してしまうと以下のようになってしまいます。

  • PCアクセス(PC用の表示) → 12個のレコードがインスタンス変数に設定される
  • SPアクセスでスマフォ用のを表示 → 8個のレコードがインスタンス変数に設定される
  • SPアクセスでPC用の表示 → 8個のレコードがインスタンス変数に設定される(←12個になっていない!!)

■ 対策

このため、viewに絡む部分に関しては、

  • 判定1:アクセス端末によって切り替えるのか?
  • 判定2:PC用のviewとスマフォ用のviewのどちらを表示しているかによって切り替えるのか?

を常に意識しないと思わぬバグに繋ります。

先程の例では、判定2でやらなければいけません(判定方法は、どちらのviewを表示しているかの情報が保存されたcookieやsessionを参照して判定することになると思われます)。

なお、判定1が必要になる例としては「SPアクセスでPC用の表示をしているときに、スマフォ用のviewに戻すためのリンクを表示する場合(PCでアクセスして来た人に対してスマフォ用のviewを表示することは通常ない。スマフォのときにのみ有効。但し、この例の場合には、PC用のviewを表示している場合にのみ表示させる必要有り)」が挙げられます。

enumで数値型カラムを作る際に、テストデータを作る時に注意すること

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Railsの4.1でenumが使えるようになりました。

一般的には文字列型のカラムを用意して

class User < ActiveRecord::Base
  enum status: { :awake, :sleep, :dead }
end

と書いて

user = User.new(status: :awake)
user.awake? # => true

という使い方をしますが、使うカラムを数値型にすることで

class User < ActiveRecord::Base
  enum status: { awake: 1, sleep: 2, dead: 99 }
end

とすると

user = User.new(status: 1)
user.awake? # => true

とかできるようになります。業務アプリで定数処理しているところが捗りますね。

さて、これのテストを書くときにfactorygirlでモデルを作ろうとして、

FacrotyGirl.define do
  factory :user do
    status 1
  end
end

と書いたら

 Failure/Error: user = build(:user)

 ArgumentError:
  '1' is not a valid status

とエラーが出てしまいました。困る…。
こういう場合、

FacrotyGirl.define do
  factory :user do
    status :awake
  end
end

と名前のほうをfactoryに書けばいいです。

Macで自動作成される隠しファイルを削除

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Macだと勝手に隠しファイルが自動作成される場合がある。

「._.hogehoge」みたいな感じのファイル名。

見付ける度に、適当にfindしてrmするコマンドを実行していたりするが、
たまにvimで編集中に、現在のディレクトリ以下の
上記ファイルを全て削除したくなることがあるので、
vim scriptの勉強がてらscriptを作成してみた。

function! s:DeleteFilelist(list)
    let target = a:list

    let num = len(target)
    if 0 == num
        echo "No target file"
        return
    endif

    echo "The deleted file is shown."
    let j = 0
    while j < num
        echo target[j]
        let j = j + 1
    endwhile
    let yn = input("OK? (y or n) -> ")
    echo "\n"

    if "y" == yn
        let j = 0
        while j < len(target)
            call delete(target[j])
            let j = j + 1
        endwhile
        echo "Deleted!!"
        return
    endif
    echo "Canceled."
endfunction

function! s:DeleteMacAutoMakeFiles()
    let target = []
    let globout = glob("**/._*") . "\n"
    while globout != ''
        " Process one file at a time
        let name = strpart(globout, 0, stridx(globout, "\n"))

        " Remove the extracted file name
        let globout = strpart(globout, stridx(globout, "\n") + 1)

        if name == ''
            continue
        endif

        call add(target, name)
    endwhile

    call s:DeleteFilelist(target)
endfunction

command! -nargs=0 DeleteMacAutoMakeFiles :call s:DeleteMacAutoMakeFiles()

vim scriptでやるなよ、って気もするが…。

[scala] [vim] vimでplayの開発環境を構築する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

本記事の対象者

  • Railsの開発をvimでやっている。
  • vimのpluginとして、unite-railsを使っている。
  • Play(Scala)でもRailsと同じように開発したい人向け。

ちなみに、unite-railsは、vimのuniteというプラグイン向けのプラグイン。

よって、本記事は、vimのuniteを使っている人向け。

やりたい事

Playのプロジェクト配下のファイルを開いているときには、プロジェクト配下のソースの選択をuniteインターフェースで使いたい。

対応の概要

  • 項目1:Play用のuniteインターフェースを作成する。
  • 項目2:Playのプロジェクト配下のファイルを開いているときには、ファイルタイプに「play」が含まれるようにする。
  • 項目3:ファイルタイプに「play」が含まれているときに、play用のunite-pluginのキーバインドを有効にする。

【項目1】Play用のuniteインターフェースを作成する。

unite-railsを参考にunite-playを作成する。

参考までに、私が作成したunite-playの中は以下のようになっている。

% tree unite-play
unite-play/
├── README
├── autoload
│   └── unite
│       ├── kinds
│       │   └── bundled_gem.vim
│       └── sources
│           ├── play
│           │   ├── collector
│           │   │   ├── config.vim
│           │   │   ├── controller.vim
│           │   │   ├── javascript.vim
│           │   │   ├── model.vim
│           │   │   ├── root.vim
│           │   │   ├── route.vim
│           │   │   ├── stylesheet.vim
│           │   │   ├── test.vim
│           │   │   └── view.vim
│           │   └── helper.vim
│           └── play.vim
└── doc
    └── unite-play.txt

7 directories, 14 files

普通の開発者であれば、unite-railsの各ファイルの中身を参照すれば、簡単にplay用に修正できるはず。

プロジェクトのルートディレクトリ配下のファイルを全て一覧かするものを追加している(root.vim)。root.vimの中身はこれ↓。

function! unite#sources#play#collector#root#candidates(source)
  let target = a:source.source__play_root
  return unite#sources#play#helper#gather_candidates_file(target)
endfunction

controller.vimの中身はこれ↓。

function! unite#sources#play#collector#controller#candidates(source)
  let target = a:source.source__play_root . '/app/controllers'
  return unite#sources#play#helper#gather_candidates_file(target)
endfunction

ここまで見れば、どういう感じで修正さればよいかは分かるはず。

正しく修正することで、例えば、

  :Unite play/controller

でapp/models配下のファイル一覧を表示させたりできる。

後は、上記コマンドを適当なキーにバインドすればOK。

【項目2】Playのプロジェクト配下のファイルを開いているときには、ファイルタイプに「play」が含まれるようにする。

projectlocal」というvimのpluginを導入する(開発元のブログはこちら)。

「.vimrc」に以下の設定を追加する。

  let g:projectlocal#projectfile = get(g:, 'projectlocal#projectfile', '.projectfile')

そして、Playのプロジェクトのルートディレクトリに以下のファイルを置く。

% cat .projectfile
play

この例では、「.projectfile」が置かれているディレクトリ配下のファイルを開くとファイルタイプに「play」が含まれるようになる。

【項目3】ファイルタイプに「play」が含まれているときに、play用のunite-pluginのキーバインドを有効にする。

「.vimrc」に以下のような設定を追加する。

function! UnitePlaySetting()
    nnoremap <buffer><c-w><c-r>co :<c-u>Unite play/controller<cr>
    nnoremap <buffer><c-w><c-r>tp :<c-u>Unite play/root<cr>
endfunction

aug HogeAutoCmd
    au FileType *play* call UnitePlaySetting()
aug END

【おまけ】scalaのファイルを編集しているときには、ファイルタイプに「scala」が含まれるようにする。

vim-scalaというvimプラグインを導入する。

上記設定を全ておえ、当該プラグインが有効になれば、Playプロジェクト配下のscalaのファイルを開くと、ファイルタイプが「project.scala.play」となる。

無事に、scalaとplayのファイルタイプが含まれている。

【Rails / gem nested_form】nested_formへsortableの導入【jquery-ui/sortable

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

accepts_nested_attributes_for用のフォームをサポートしてくれる「nested_form」にドラッグ&ドロップで並び順を変更できる「jquery-ui/sortable」を導入する方法を記述します。

事前準備

1.Gemfileに追記
$ vim Gemfile

gem 'jquery-rails'
gem 'jquery-ui-rails'
gem 'nested_form'

2.モデルにaccepts_nested_attributes_forを追記
例としてBlog-< Entryな関連でEntryが並び順に使用するカラム(position)を所持

$ vim app/models/blog.rb

has_many :entries
accepts_nested_attributes_for :entries, allow_destroy: true

$ vim app/models/entry.rb

belongs_to :blog

3.コントローラにpositionパラメータを取得できるように追記
$ vim app/controllers/blogs_controller.rb

def blog_params
  params.require(:blog).permit(
    ....,
    entries_attributes: [
      ...,
      :position
    ]
  )
end

viewでの記述

$ vim app/views/blogs/_form.slim

= nested_form_for(@blog, url: ...) do |f|
  ....
    table#entries.table.table-striped.table-sortable
      = f.fields_for :entries, wrapper: false
    br
    .pull-right.
      = f.link_to_add '追加', :entries, data: { target: '#entries' }, class: 'btn btn-default'

$ vim app/views/blogs/_entry_fields.slim

tr.fields.form-group
  td ...
  ...
  td
    .pull-right
      = f.link_to_remove '削除', class: 'btn btn-danger'

  = f.hidden_field :position, class: :position

js.coffeeでの記述

$ vim app/assets/javascripts/blog.js.coffee

$ ->
  ...
  # 並び替え
  $('.table-sortable').sortable
    axis: 'y',
    items: '.fields',
    update: (e, ui) ->
      # ドラッグ&ドロップしたら各entryのhidden_fieldに現在の位置を入れる
      $('.position').each ->
        $(this).val($('.position').index($(this)) + 1)

以上でフォームをsubmitした時にドラッグ&ドロップで変更したpositionパラメータが取得できる様になります。

[rails] FactoryGirlを使用する際の注意点

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

rspecで思うように動かないケースがあってハマる可能性有り。

今回の問題を抽象的に表現すると

FactoryGirlを用いてインスタンスを生成するときにおいて、以下の条件を全て満たす場合には、生成されたインスタンスに意図した値が設定されない場合があります。

  • 条件1:所定のattributeに対して値を設定する方法が「複数」存在する。
  • 条件2:当該attributeに対して、上記「複数の方法のうち少なくとも2つ以上の方法」で値を設定する。

多分、上記表現では、抽象的すぎて意味不明だと思われるため、以下に具体例を示します。

事象の具体例

ケース1

store = FactoryGirl.create(:store)
p store.store_category
=> 1

ケース2

store = FactoryGirl.create(:store, store_category: 2)
p store.store_category
=> 1

2にならない!!

参考

以下の場合には、当然、値を代入できます。

store = FactoryGirl.create(:store)
store.store_category = 2
p store.store_category
=> 2

前提

  • 前提1:Storeテーブルには、store_category(カテゴリ名)というattributeが存在する。
  • 前提2:Storeクラスには、以下のようなメソッドが定義されている。
class Store < ActiveRecord::Base
           :

  # カテゴリ名でカテゴリコードに値を代入
  def store_category_name=(category_name)
    store_category = convert(category_name)
  end

  # カテゴリ名をカテゴリコードに変換
  def convert(name)
           :
  end

           :
end
  • 前提3:FactoryGirlを用いて、以下のように定義されている。
FactoryGirl.define do
  factory :store do
    store_category_name 'Japanese Restaurant'
  end
end

※「Japanese Restaurant」は、カテゴリコードに変換すると「1」

「今回の問題を抽象的に表現すると」との対応関係

上記条件1でいうところの、

「所定のattribute」は「Storeテーブルのstore_category」であり、

「所定のattributeに対して値を設定する方法」として、

  • 方法1:store.store_category = 1
  • 方法2:store.store_category_name=’Japanese Restaurant’

の2つがある。

どうすれば代入できるか

ケース3

store = FactoryGirl.create(:store, store_category_name: 'French Restaurant')
p store.store_category
=> 2

※「French Restaurant」は、カテゴリコードに変換すると「2」

原因

FactoryGirlのGemの中身を確認した訳ではありませんので、表面的な事象に基づいた話になります。

恐らくFactoryGirlの内部で、上記各ケースが以下のようになっていると推定されます。

・ケース1:「store = FactoryGirl.create(:store)」

Store.new(store_category_name: 'Japanese Restaurant')

・ケース2:「store = FactoryGirl.create(:store, store_category: 2)」

Store.new(store_category: 2, store_category_name: 'Japanese Restaurant')

・ケース3:「store = FactoryGirl.create(:store, store_category_name: ‘French Restaurant’)」

Store.new(store_category_name: 'French Restaurant')

そして、Storeのinitializeの中で、渡されたHashの順番にattributeを更新していき、

ケース2では、

代入1回目:最初にstore_categoryに2が入る
代入2回目:その後にstore_category_nameにJapanese Restaurantが渡されて、store_categoryに1が入る

となっているのだと思います。

「今回の問題を抽象的に表現すると」との対応関係

このように、ケース2では、代入1回目と代入2回目で異なる方法(「複数の方法のうち少なくとも2つ以上の方法」)で、値を設定していることから条件2を満たすことになり、意図した値が設定されていません。

ケース1, 3では、1つの方法でのみ値を設定しているため、条件2を満たすことなく、意図通りの値が設定されます。

対策

今のところ、各ソースコードの確認や実際にテストする際に値が意図したものに設定されているか等を確認しながら気を付けるくらいしか思い付きません。

こういう問題があるということを頭の片隅に入れておけば、問題が生じたときのデバッグが早くなると思います。

参考

selectable_attrというgemを使うと、所定のattributeに値を設定するために複数のメソッドが追加されます。

selectable_attrの対象としたattributeに対してFactoryGirlを使って値を初期化する場合には気をつけましょう。

最後に

rspecを記載したときには、各オブジェクトの値が意図したものになっているかを、しっかりと確認しましょう。

そうしないと意味の無いテストを行ってしまっている可能性があります。

Vimでメモ

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

序論

サーバ作業をしたり、リモートから接続したりすることを考えると、メモは、CUIで開ける形式で残しておくとイザというときに役に立つ。

私が愛用しているのは、howm(Hitori Otegaru Wiki Modoki)というパーソナルで使うWikiのようなメモ環境。

howmについて

howmには、以下の特徴がある。

  • 特徴1:メモの作成時に、今日の日付及び現在の時間がファイル名に指定される。
  • 特徴2:所定のディレクトリ配下を再帰的に全文検索することができる。

howmは、元々、Emacsのpluginとして公開されていたが、vimでもpluginを作成してくれた方がいる。

私も最初は、EmacsやMeadowでhowmを使用していたが、段々vimで全てを完結するようになり、howmもvimのpluginのものに置きかえるようになった。

使用しているpluginは、QFixHowmである。

QFixとは、vimの検索機能のquickfixのことだと思われる。

設定などは、上記サイトを確認して頂ければよいが、私は、カスタマイズしてちょっとだけ異なる使い方をしている。

カスタマイズ

それは、所定のディレクトリを用途に応じて切り替えて使っている点である。

これは、以下の用途でディレクトリを分けたいときに便利である。

  • 所謂メモのディレクトリ
  • 日報用のディレクトリ

日報には、比較的同じような内容の記録が残ることが多い。
例えば、複数日にわたるタスクや、定例作業などである。

このため、全文検索をするときに、日報が検索対象になってしまうと本当に欲しいメモに辿り着けないことがしばしば出て来て困った経験から、通常は日報を検索対象にしないようにすることにした。

以下にQFixHowmにおけるディレクトリ切り替えの設定を記す。

  • 通常のメモに切り替える場合は、Prefixキーの後に「,1」を押下する。
  • 日報用メモに切り替える場合は、Prefixキーの後に「,2」を押下する。

なお、最後に「QFixHowmEnvMain()」をコールすることで、vim起動時に通常のメモが選択されるようにしている。

exe "nnoremap <silent> " . QFixHowm_Key . ",1 :call QFixHowmEnvMain()<cr>"
exe "nnoremap <silent> " . QFixHowm_Key . ",2 :call QFixHowmEnvDailyReport()<cr>"

function! QFixHowmEnvMain()
    let g:howm_dir            = '~/memo'
    let g:howm_filename     = '%Y/%m/%Y-%m-%d-%H%M%S.howm'

    " 設定関数呼び出し
    silent! call QFixHowmSetup()
    echo g:howm_dir
endfunction

function! QFixHowmEnvDailyReport()
    let g:howm_dir            = '~/daily_report'
    let g:howm_filename     = '%Y/%m/%Y-%m-%d_daily_report.howm'

    " 設定関数呼び出し
    silent! call QFixHowmSetup()
    echo g:howm_dir
endfunction

silent! call QFixHowmEnvMain()

リニューアルをしたDoRubyの3つの目的

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

お久しぶりです。何年ぶりの投稿になるでしょうか。。。 さて、Rubyエンジニアによる技術情報配信を目的に運営しておりました「DoRuby」ですが、老朽化や内部SEO対策などが薄れなど諸々の課題をクリアするため社内有志を募ってリニューアルいたしました。

Rubyの技術情報配信を目的にしておりましたが、途中からRubyだけではなくJava、PHP、Apache、JMeter、GAなどコンテンツの枠を広げて運営してまいりました。2008年くらいから公開し、紆余曲折あり運営を続けてまいりましたが、諸々の課題をクリアするためにリニューアルを行いました。

「DoRuby」は新しく以下の3つの目的を持ち、生まれ変わりました。

●「DoRuby」の新しい3つの目的

  1. 記事を役立ててもらい、社会に貢献すること
  2. アピリッツ社員が自身が保有するノウハウを自由に発信できるようにすること
  3. 社員にも一般利用者にもアピリッツという会社をもっと知ってもらうこと

今後もRubyをはじめとした技術情報やマーケティング関連情報など枠を広げて情報を発信できればと考えておりますので、どうぞよろしくお願いいたします。

WEBrickのURI長上限を拡張する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

WEBrickのURI長上限を拡張する

WEBrickで扱うことが出来るURI長の上限は2048バイトに制限されています。

上限を超えた場合は

Request-URI Too Large
WEBrick::HTTPStatus::RequestURITooLarge

というようなエラーメッセージが表示されます。

しかし、ローカルで開発している場合に、どうしてもその上限を緩和したくなる場合があると思います。

そんな場合はWEBrickのソースコードに記載されている制限値を直接変更することで、好きな値に変更することができます。

rbenvを利用してruby 2.3.1をインストールしている場合、

~/.rbenv/versions/2.3.1/lib/ruby/2.3.0/webrick/httprequest.rb の 415行目に記載されている

MAX_URI_LENGTH = 2083 # :notoc:

の数値を変更します。

Apacheのrestartやgraceful、stopなどの違い

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

apachectlのrestartやgraceful、
httpdのrestartやgraceful、
/etc/init.d/httpdのrestart…、
それぞれの微妙な違いをまとめました。

apachectl graceful
httpd -k graceful※どちらも同じ。
apachectl gracefulを実行すると、内部でhttpd -k gracefulが呼ばれる(後述)
子プロセスは現在のリクエストを処理した後、終了する。親プロセスは設定ファイルを再読み込みし、ログファイルを開き直す。子プロセスが徐々になくなり、替わりに新しい子プロセスが起動する。【注意点】
設定ファイルに誤りがあったり等で親プロセスが再起動せず終了した場合、 子プロセスが放置されたりする場合がある(→再起動時に問題となる可能性がある)
ので、再起動前にhttpd -tで構文チェックをした方がよい。
apachectl restart
httpd -k restart※どちらも同じ。
apachectl restartを実行すると、内部でhttpd -k restartが呼ばれる(後述)
子プロセスを即座にkill。親プロセスは終了しない。親プロセスは設定ファイルを再読み込みし、ログファイルを開き直す。その後新しい子プロセスを起動。→ログを見るとHUPシグナルが渡されたことが確認できます。
/etc/init.d/httpd restart※httpd -k restartとは別もの。
起動スクリプト内で定義されたstop→startが実行される。
子プロセスを即座にkillし、全て終了後、親プロセスも終了。(stop)その後起動。(start)→ログを見るとTERMシグナルが渡されたことが確認できます。※Apacheのインストールディレクトリがデフォルトと違う場合は、
/etc/init.d/httpd 内でhttpd実行ファイルの場所を修正する必要があります。

「apachectl restart」と「httpd -k restart」は同じ

apachectlに特定の引数を渡すと、内部で「httpd -k 引数」が実行されます。

特定の引数とは、
start | stop | restart | graceful | graceful-stop
です。

# less apachectl
-------------
  ・
  ・
case $ARGV in
start|stop|restart|graceful|graceful-stop)
    $HTTPD -k $ARGV
    ERROR=$?
    ;;
startssl|sslstart|start-SSL)
    echo The startssl option is no longer supported.
    echo Please edit httpd.conf to include the SSL configuration settings
    echo and then use "apachectl start".
    ERROR=2
    ;;
configtest)
    $HTTPD -t
    ERROR=$?
    ;;
status)
    $LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } '
    ;;
fullstatus)
    $LYNX $STATUSURL
    ;;
*)
    $HTTPD $ARGV
    ERROR=$?
esac

exit $ERROR
-------------

これらの引数が渡された場合は、 httpdにそのまま引数が渡され
挙動は上記表のとおりとなります。

また、「apachectl restart」と「apachectl -k restart」も同じです。

「httpd -k restart」と「/etc/init.d/httpd restart」は別もの

どちらもhttpdを再起動しますが、処理プロセス(手続き)が異なるため挙動も異なります。

「httpd -k restart」は、httpdバイナリ(実行ファイル)内の処理によって、
「/etc/init.d/httpd restart」は、/etc/init.d/httpd(起動スクリプト)内の処理によって
再起動されます。

それぞれの処理内でkillの仕方が違う(渡されるシグナルが違う)ようで、

httpd -k restartSIGHUP
/etc/init.d/httpd restartSIGTERM
/etc/init.d/httpd reloadSIGHUP

となっているようです。

/etc/init.d/httpd は、httpd実行ファイルを起動するためのスクリプトファイルです。
手動インストール等でインストール場所が異なる場合は/etc/init.d/httpdを編集して
httpd実行ファイルの場所を修正する必要があります。

詳細は公式のドキュメントに記載されています。
https://httpd.apache.org/docs/2.2/ja/stopping.html

CentOSサーバ構築〜初期設定〜

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

rickNo41です。 サーバを構築する時にする初期に設定した方がいいことを少し紹介します。

環境

CentOS7
※以下設定は全てrootで実施

時刻設定

yum install -y chrony
systemctl start chronyd.service
// しばらくすると時刻が正しくなります。

コマンド履歴保存期間変更・日時付与・vim

vim /etc/bashrc
—–
// 一番下に追加
export HISTSIZE=100000
export HISTTIMEFORMAT=’%Y-%m-%d %T ‘;
export EDITOR=/usr/bin/vim
—–
source ./bashrc
// 日時が表示されている
// 日付設定前のコマンドの日時は全て日付設定時になる
history

sar監視間隔変更

vim /etc/cron.d/sysstat
—–
// 変更
#*/10 * * * * root /usr/lib64/sa/sa1 1 1
* * * * * root /usr/lib64/sa/sa1 1 1
—–

sar監視保持日数変更

vim /etc/sysconfig/sysstat
—–
// 変更
#HISTORY=28
HISTORY=30
—–

SElinuxm無効化(変更後再起動必用)

vim /etc/sysconfig/selinux
—–
// 変更
#SELINUX=enforcing
SELINUX=disabled
—–
// Disabledでok
getenforce

最近人気な記事