ホーム ブログ ページ 37

Windows でも Mac でもツールを使用せずに元に戻せるファイル分割

0

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

サイズの大きなファイルを分割して共有したい。 けれど、共有する相手にWindowsユーザとMacユーザがいる。 という様な場合、WindowsでもMacでも使用できるファイル分割・結合ツールを使用する方法もあるが、 以下の方法でファイル分割すれば、専用ツールなしで(WindowsやMacの標準で)結合できるようになる。

分割方法 (Mac)

split origin.txt -b 100m -d splitted.txt_

origin.txtの部分は分割したい対象のファイル。
100mの部分は、分割したいファイルの単位。この例では100MBごとのファイルに分割される。
splitted.txt_の部分は、分割後のファイル名。この例では「splitted.txt_00」、「splitted.txt_01」、…という様なファイルが生成される。

結合方法(Windows)

copy /b splitted.txt_* origin.txt

結合方法(Mac)

cat splitted.txt_* > origin.txt

注意

残念ながら分割の方はMacで行うしかない。ただし、Windowsでもbashが使えるツールがあれば、使用できる。

3分リファクタリング SelectableAttr 編

0

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

社内でRails標準のEnumよりも多く使われているSelectableAttrについて。

EXAMPLE

カードのレアリティを 0 〜 5 の整数値で表現します

class Card < ActiveRecord::Base
  include ::SelectableAttr::Base

  selectable_attr :rarity do
     entry 0, :N, 'ノーマル'
     entry 1, :HN, 'ハイノーマル'
     entry 2, :R, 'レア'
     entry 3, :HR, 'ハイレア'
     entry 4, :SR, 'スーパーレア'
     entry 5, :LG, 'レジェンド'
  end
end

BEFORE

レアリティの定数を参照するために、 xxx_id_by_key というクラスメソッドを使っています。

if @card.rarity == Card.rarity_id_by_key(:SR)
  puts "スーパーレアが限界突破!"
  @card.rarity = Card.rarity_id_by_key(:LG)
  @card.save!
end

AFTER

インスタンスメソッドに定義された xxx_key を使えば、値をシンボルで取り出すことができます。

if @card.rarity_key == :SR
  puts "スーパーレアが限界突破!"
  @card.rarity_key = :LG
  @card.save!
end

POINT

rarityというアトリビュートが定義されていると、以下の3つのアクセサが定義されます。

  • #rarity_key rarityの値に応じたシンボルを返す
  • #rarity_key= シンボルを受けて値に変換してrarityに代入する
  • #ratity_name rarityの値に応じた名称を返す

また、クラスメソッドのcreateや、インスタンスメソッドのupdateなどハッシュを引数にとるメソッドもrarity_keyという名前でシンボルを受け付けるようになります。

card = Card.create(rarity_key: :LG)
card.update(rarity_key: :SR)

REFERENCE

https://github.com/akm/selectable_attr

VERSIONS

Ruby MRI 2.1.1
Rails gem 'rails', '4.1.4'
selectable_attr (0.3.17)
selectable_attr_rails (0.3.15)

AWSでバウンスメール対策【AWS総連携】

0

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

こんにちは、2017年初投稿の棚旬です。今回は、メール配信を行っているサービスで重要となってくるバウンスメール(何らかの原因で配信エラーになったメール)対策について記載しようと思います。バウンスメール対策は、AWSが提供しているサービスを使用すると簡単にバウンスメールの処理が可能です。この記事ではAWS周りの設定について記載しています。AWSが提供しているAPIを利用してバウンスとなったメールを取得する方法については別の記事で記載しようと思います。

AWSの各サービスについて

バウンスメール対策を行うにあたり、今回は3つのAWSサービスを使用していきます。各サービスについてはリンク先の説明で確認しましょう。
SES

Amazon SES は、ユーザー自身の E メールアドレスとドメインを使用して E メールを送受信するための、簡単で費用効率の高い方法を提供する E メールプラットフォームです。

Simple Email Service-Amazon Web Services

SNS

Amazon Simple Notification Service (Amazon SNS) は、高速かつ柔軟な完全マネージド型のプッシュ通知サービスです。このサービスを使用すると、個々のメッセージを送信したり、多数の受信者にメッセージをファンアウトしたりできます。Amazon SNS により、簡単かつコスト効率の高い方法で、モバイルデバイスユーザーおよびメール受信者にプッシュ通知を送信したり、他の分散サービスにメッセージを送信したりできます。

Simple Notification Service-Amazon Web Services

SQS

Amazon Simple Queue Service(SQS)は、高速で、信頼性が高く、スケーラビリティに優れ、十分に管理されたメッセージキューサービスです。

Simple Queue Service-Amazon Web Services

はい、では早速設定していきましょう。

SNSの作成

  1. AWSコンソールからSNSを選択(リージョンはバージニア北部)
  2. Create Topicを選択 enter image description here 3.【Topic name】【Display name】を入力 【Display name】は10文字以内の制限があるのと、バウンスを受信した時の宛名になるので分かりやすく判別しやすい名前にしましょう。 enter image description here

SESにアドレスの登録

  1. AWSコンソールからSESを選択(リージョンはバージニア北部)
  2. SES Home からEmail Addressesを選択し、Verify a New Email Addressを選択
  3. Email Address を入力する
  4. 認証メールが届くので確認。SESのアドレス一覧で認証されたアドレスのStatusがverifiedに変わる enter image description here

SNSのサブスクリプション登録

  1. SNSのメニューからTopicsを選択し、topic名を選択
  2. create subscription を選択
  3. 【Protocol】Email【Endpoint】SESに登録したアドレスを入力 【Topic ARN】は作成したSNSの詳細に明記されている値を使用 enter image description here
  4. 認証メールが届くので確認
    enter image description here
    click here to unsubscribeをクリックするとサブスクリプションが解除されてしまうので注意。(コンソールからでも削除可能)SESとSNSの連携
  5. アドレスの詳細からNotificationsのEdit Configurationを選択
    enter image description here
  6. SNS Topic Configuration
    【Bounces】【Complaints】は作成したSNSを選択
    ※BouncesとComplaintsの両方を選択しないと、Email Feedback Forwarding が選択不可となり、通知設定の解除がAPI経由で変更できない
    Email Feedback ForwardingはDisabledを選択

SQSの作成

  1. AWSコンソールからSQSを選択(リージョンは東京)
  2. 新しいキューの作成を選択 enter image description here
  3. 【キュー名】を入力する。キューの属性はデフォルトで良い。
  4. SNSからの受信設定 アクセス許可タブの【アクセス許可の追加】を選択
  5. 作成したキューへのアクセス許可 enter image description here 【効果】許可 【プリンシパル】全員 【アクション】SendMessage 【限定条件】None 【条件】ArnEquals 【キー】aws:SourceArn 【値】作成したSNSのARN値

SNSとSQSの連携(SNSにサブスクリプションの登録)

  1. AWSコンソールからSNSを選択(リージョンはバージニア北部)
  2. 作成したSNSトピック詳細からCreate subscriotionを選択
  3. 【Protocol】Amazon SQS 【Endpoint】作成したSQSのARN値

IAMユーザの作成

  1. AWSコンソールからIAMを選択
  2. メニューのユーザーから【ユーザーを追加】を選択
  3. 【ユーザー名】、【アクセスの種類】はプログラムによるアクセスを選択
  4. 【既存のポリシーを直接アタッチ】を選択(2回目からはアクセス権限を既存ユーザーからコピーで可能)
  5. SQSで検索し、AmazonSQSFullAccessを選択 同様にSESで検索し、AmazonSESFullAccessを選択
  6. .csvのダウンロードを選択 アクセスキーとシークレットアクセスキーを控える

設定確認

設定が終了したのでテストメールを送ってみましょう。
1. SESに登録したメールアドレスを選択し、Send a Test Emailを選択
2. Toにバウンス扱いになるメールアドレス(bounce@simulator.amazonses.com)を入力。Subject、Bodyは任意。
3. Send Test Mailを選択
4. 作成したSQSを選択し詳細をチェック
enter image description here
利用可能なメッセージ(可視)が1になっていたら正しく設定ができています。また、SESに登録したアドレスはSNSにサブスクリプション登録しているので、以下のようなメールも届いているはずです。
enter image description here

バリデーションでコンテキストを活用する

0

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

Railsのバリデーションではコンテキストと呼ばれる情報を使うことができます。
コンテキストはシンボルで表現されます。

コンテキストの種類

レコードをINSERTするときのコンテキストは :create、 UPDATEするときのコンテキストは :update です。

レコードを最初に保存するときと、あとで更新するときで検査する項目や内容を変えたいとき、 :create と :update で区別すればうまく実装できます。

またvalid?などで特に指定しない場合のデフォルトのコンテキストは nil です。

コンテキストを定義する

その他にも、ユーザーが任意のシンボルを使ってコンテキストを指定することができます。

たとえばここで、 :change_password というシンボルを使ってユーザーのパスワード更新というコンテキストを表そうと思います。

saveするときのコンテキストを指定する

user.save(context: :change_password)

バリデーションを実行するときにコンテキストを指定する

user.valid?(:change_password)

コンテキストを活用する

このコンテキストをバリデーション側で受け取るには on: パラメータを使います

validates :password, presense: true, on: :change_password

こうしておくと、savevalid?:change_passwordというコンテキストが指定されたときだけ、このバリデーションがチェックされます。

逆に「このコンテキストでないときだけチェックしたい」という指定をするときは、カスタムバリデーションのメソッドを書いて、その中でコンテキストをチェックすることができます。

validate :check_not_on_password

def check_not_on_password
  # コンテキストが :change_password のときはなにもしない
  return if validation_context == :change_password

  :
  :
end

【Rails】RailsのJavaScriptをクラス分け【JavaScript】

0

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

RailsでJavaScriptを読み込んでいるかと思いますがクラス分けをしていないではないでしょうか。 そんな時の参考になればと思います。

なぜクラス分けした方がいいのか。

アセッツパイプラインでjsやcssを結合して高速化してくれますがjsを一括で読み込んでしまうため、アクションによってjsの機能を切り替える必要があるためです。

機能を切り替えないとどんなことが起こるのか。

products.coffee

$ ->
  $('.name').css('font-size', '10px')

categories.coffee

$ ->
  $('.name').css('font-size', '20px')

この場合には読み込まれた順番によって.nameのフォントサイズが変わってしまいます。

クラス分けの手順

各コントローラ各アクション毎にクラスをnewするようにします。

1. app/views/layouts/application.slim

= javascript_include_tag 'application', 'data-turbolinks-track' => true
      .
      .
      .
body data-controller="#{controller.controller_name}" data-action="#{controller.action_name}"

2. app/assets/javascripts/application.coffee

#= require_tree .

3. app/assets/javascripts/js_loader.coffee

$ ->
  new JsLoader

class JsLoader
  constructor: ->
    @initialize_script_classes()

  initialize_script_classes: ->
    controller_name = $('body').data('controller')
    action_name = $('body').data('action')
    page_name = "#{contoller_name}:#{action_name}"

    switch page_name
      when 'products:index', 'products:show'
        new Product
      when 'categories:new', 'categories:create',  'categories:edit',  'categories:update'
        new Category
      .
      .
      .

4. app/assets/javascripts/products.coffee

class @Product
  constructor: ->
    @initialize_select_box()

  initialize_select_box: ->
    $('select').click ->
      .
      .
      .

これでクラス分け完了。

ついでにCSSも分ける

各コントローラ各アクション毎にstyleを切り替えられるようにします。

1. app/views/layouts/application.slim

= javascript_include_tag 'application', 'data-turbolinks-track' => true
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true
      .
      .
      .
body id="#{controller.controller_name}-#{controller.action_name}" data-controller="#{controller.controller_name}" data-action="#{controller.action_name}"

2. app/assets/stylesheets/application.scss

@import 'products';
@import 'categories';
.
.
.

3. app/assets/stylesheets/products.scss

#products-index {
  p {
    color: red;
  }
}

#products-show {
  p {
    color: blue;
  }
}

Dockerを試してみる(4)

0

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

Dockerを試してみる(3)の続きです。今回はDockerfileを試してみます。 前回はdocker-composeについて試したので、順番逆なんじゃね?って感じがしますが置きになさらず

Image と Container

Dockerfileを使う前にあらためて ImageとContainerについておさらいします。

DockerはOS上で軽量の仮想環境(コンテナ(Container)と呼ばれる)を実行するためのエンジンとエンジンを操作するツールを提供したものです。たとえば docker run コマンドでは、次のコマンドでDBコンテナを起動させることができます。

$ docker run -d -e "MYSQL_ROOT_PASSWORD=password" --name mysql mysql:5.6

起動したコンテナは次のコマンドで確認できます。

$ docker ps 
  CONTAINER ID IMAGE     COMMAND                 CREATED         STATUS         PORTS    NAMES
  f78a4be66ee8 mysql:5.6 "docker-entrypoint.sh"  15 seconds ago Up 14 seconds   3306/tcp  mysql

この出力にIMAGEという列があります。これはコンテナの大本となる、ファイルや起動コマンドを定義したイメージと呼ばれるものです。上の出力だと mysql:5.6というイメージを使用しています。docker runコマンドの引数でも指定していますね。

このイメージは、Docker Hubというレポジトリにあるものを利用しています。mysqlやmemcachedなどのDocker Hubにあるイメージを使う(pullする)だけで十分かと思います。

しかししばらくすると自分のアプリケーションもコンテナにしたい、ということがあると思います。
その場合、Dockerfileを使ってオリジナルのイメージを作成することができます。

Dockerfile

Dockerのイメージを作成する際に必要なルールを定義したファイルです。
ソースファイルをコンパイルするときに使うMakefileに似たようなものです。

例と実行方法

Dockerfileの例は以下のとおり。

FROM ruby23

RUN yum -y  install mysql-community-devel

COPY docker-entrypoint.sh /
RUN chmod 755 /docker-entrypoint.sh

ENV RAILS_ENV production
ENV PATH /usr/local/ruby-2.3.3/bin:/usr/local/bin:/bin:/usr/bin
ENV RAILS_SERVE_STATIC_FILES false

VOLUME /usr/src/app
WORKDIR /usr/src/app

ENTRYPOINT ["/docker-entrypoint.sh"]

EXPOSE 8080
CMD ["bundle", "exec", "unicorn", "-E", "production"]

このファイルをdocker buildコマンドを使ってビルドします。

$ cd /some/directory
$ vi Dockerfile
$ docker build -t myapp .

文法

Goというプログラミング言語をベースにしています。
コマンド名 引数 が1コマンドで行の先頭から実行されます。

コマンド

コマンド名内容
FROM基本となるイメージを作成する
RUNイメージ内でシェルコマンドを実行する。yumなどでアプリケーションをインストールする場合などに使う。
COPYローカルのファイルを、イメージ内にコピーする
ADDローカルのファイルやディレクトリを、イメージ内に追加する
ENV環境変数を定義する
EXPOSE公開するポートを明示する
VOLUMEマウントポイントを指定する
ENTRYPOINTコンテナ起動時に実行するコマンド(CMDの前に実行される)
CMD引数なしでコンテナを起動したときに実行されるコマンド

【Rails】liquid-railsを使ってみました。【Liquid】

0

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


テンプレートの編集機能をに安全に作れるLiquid。 Rails用に使いやすくなったliquid-railsを使ってみたので紹介します。

そもそもLiquidとは何かという事はここでは紹介しませんのでお気をつけください。

使い方

1.Gemfileに追記してbundle install

Gemfile

gem 'liquid'
gem 'liquid-rails'

一応これだけで拡張子が「.liquid」のテンプレートをLiquidとして読んでくれます。

2.Liquid内で使用するモデルのメソッドを設定する

この設定をしないとLiquid内でモデルのメソッドが呼び出せません。
app/models/product.rb

has_many :categories
liquid_methods :name, :price, :categories

3. Liquid内で使いたい変数を設定する

「liquid_assigns」を使用します。下記の設定でコントローラに記述した「@product」等がLiquid内では「product」として呼び出せます。
app/helpers/application_helper.rb

def liquid_assigns
    view_context.assigns.merge(
      params: params,
      hoge: hoge,
      .
      .
      .

    ).stringify_keys
end

4. 「.liquid」の中身の例

構文の詳細は公式を参照してください。

{% for product in products %}
    {% if true %}
      <p>{{ product.name }}</p>
    {% endif %}
{% endfor %}

<p>商品名1</p>
<p>商品名2</p>
<p>商品名3</p>

Filterの使用

Liquid内で変数の加工やタグを作りたい場合があると思います。その場合はフィルターを記述し、読み込みます。liquid-railsでは最初から「javascript_include_tag」等が記述されています。

app/controllers/concerns/liquid_filter_desuyo.rb

module LiquidFilterDesuyo
  def controller
    @context.registers[:controller]
  end

  def view
    @context.registers[:view]
  end

  def page_title(*args)
   I18n.t(controller.controller_name, *args)
  rescue
    nil
  end

  def html_escape(string)
    ERB::Util.html_escape(string)
  end
end

application_controller.rb

before_action :set_liquid_filter
def set_liquid_filter
  Liquid::Template.register_filter LiquidFilterDesuyo
end

Filterの使い方

構文
※引数が無いフィルターは呼び出せません。(たぶん)

{{ 第一引数 | フィルター名:第二引数, 第三引数,....}}

例:

<p>{{ product.name | html_escape }}</p>
<p>{{ product.name | html_escape | simple_format }}</p>

メソッドを繋げることもできます。詳しくは公式へ

実際にエンドユーザにテンプレートを作成してもらう場合にどうするのか?

1.画面からLiquidテキストを入力してもらいviewと同じディレクトリ構造に保存。

RAILS_ROOT/liquid_templates/products/show.liquid

{% for product in products %}
    {% if true %}
      <p>{{ product.name }}</p>
    {% endif %}
{% endfor %}

2.prepend_view_pathを使用し作ったファイルをテンプレートとして呼び出す。

application_controller.rb

before_action :set_view_path
before_action :set_liquid_filter

def set_view_path
  prepend_view_path Rails.root + 'liquid_templates'
end

def set_liquid_filter
  Liquid::Template.register_filter LiquidFilterDesuyo
end

closure-compilerを使用して javascript ファイルを圧縮したときのメモ

0

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

javascript ファイルを納品する場合に パフォーマンスの改善やセキュリティーの向上の為に圧縮を行う必要があった。今回は closure-compiler を使用させて頂いた。 配布する環境によってスクリプト内で利用するASPサーバやアカウントを分けたかったので環境ごとに圧縮ファイルを出力するようにしてみた。

参考:javascriptを圧縮するwebサービス
http://logic.moo.jp/data/archives/513.html

参考:closure-compiler について
https://developers.google.com/closure/compiler/

インストール(bash)

gem install closure-compiler

コア部分の使い方(ruby)

js_src_string = File.read(original_js_file_path_string)
minified_js_string = Closure::Compiler.new.compile(js_src_string)
File.write minified_js_file_path_string, minified_js_string
# js_src に javascript コードを入れると minified_js に圧縮されたコードが代入される。

こういうのをしました。

require 'rubygems'
require 'closure-compiler'

def gen_minified_js(src, config, out_file)
  # jsソースに xxxx_..._token という文字列を記載しておいて置換する。
  config.each do |k, v|
    key = "xxxx_#{k}_token"
    src.gsub!(key, v)
  end
  File.write out_file, src
end

# 環境ごとの置換文字列
envs = {
  staging: {
    protocol: 'https:',
    host: 'staging.example.com',
    service_key: 'staging'
  },
  localdev: {
    protocol: 'http:',
    host: 'my_development_host', # ローカル開発環境用 hostsファイルに開発サーバのIPで登録してください。
    service_key: 'my_development_key' # xxxテーブルのservice_key を変更してください。
  },
  local: {
    protocol: 'http:',
    host: '192.168.xxxx.xxx',
    service_key: 'our_localtest_key' # 開発メンバー共有テスト環境
  },
  appirits: {
    protocol: 'https:',
    host: 'product.example.com',
    service_key: 'product_development_key' # 本番環境 自社アカウント
  }
}

production_env = {
  protocol: 'https:',
  host: 'product.example.com',
  service_key: 'product_product_key' # 本番環境 納品アカウント
}

# 圧縮対象のjsファイル
src = './workspace/deliverables.src.js'
js_src = Closure::Compiler.new.compile(File.open(src, 'r'))

# 本番用でないファイルはまとめて作る 
js_name_base = './workspace/dir_name_token/js/deliverables.test.min.js'


envs.each do |dir, config|
  gen_minified_js(js_src.dup, config, js_name_base.gsub('dir_name_token', dir.to_s))
end

# 本番用はファイル名が違うようにしたので別途実行
gen_minified_js(js_src.dup, production_env, './workspace/products/js/deliverables.min.js')

※ 上記をファイルに保存し ruby に召し上がって頂く。

Rubyのオブジェクトコピーで気をつけること

0

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

Rubyでオブジェクトを複製する際、知らないとハマってしまいそうなポイントをメモ。

その1:=で代入されるのはオブジェクトの参照

=で代入後、破壊的メソッドを使う場合は注意が必要です。

list1 = ['a', 'b', 'c']``
list2 = list1

list1[0] = 'aa'

list1
=> ["aa", "b", "c"]
list2
=> ["aa", "b", "c"]

list1の変更がlist2にも反映されてしまいました。
初学時に混乱しがちなパターンですが、

list2 = list1

は、list2にlist1の参照を代入する、の意なので、
どちらも同じオブジェクトを参照することになります。

object_idを確認すると、同じオブジェクトを参照していることが分かります。

list1.object_id
=> 70343473882920
list2.object_id
=> 70343473882920

破壊的にオブジェクトの内容が変更された場合、
そのオブジェクト見ている他の変数にも変更内容が反映されます。
 
 

その2:dup、cloneは浅いコピー

これを回避するためにはdup、cloneを使います。
が、いくつか注意点があります。

まずはdup、cloneとも別のオブジェクトとして複製されることを確認。

list3 = [{key:'xx'},{key:'yy'},{key:'zz'}]
list4 = list3.dup
list5 = list3.clone

list3.object_id
=> 70343473688700
list4.object_id
=> 70343473670940
list5.object_id
=> 70343473655820

参照しているオブジェクトが違うので、
list3の変更はlist4, list5に影響しません。

list3.reverse!
=> [{:key=>"zz"}, {:key=>"yy"}, {:key=>"xx"}]
list4
=> [{:key=>"xx"}, {:key=>"yy"}, {:key=>"zz"}]
list5
=> [{:key=>"xx"}, {:key=>"yy"}, {:key=>"zz"}]

しかしこうするとどうでしょう。

list3[0][:key]='ZZ'

list3
=> [{:key=>"ZZ"}, {:key=>"yy"}, {:key=>"xx"}]
list4
=> [{:key=>"xx"}, {:key=>"yy"}, {:key=>"ZZ"}]
list5
=> [{:key=>"xx"}, {:key=>"yy"}, {:key=>"ZZ"}]

それぞれ別オブジェクトなのにlist3の変更がlist4, list5にも反映されてしまいました。
 

dup, cloneは、複製するオブジェクト自体は別物になりますが、
それに含まれる参照先はそのままコピーされるため、
その1と同じ事象が発生してしまいます。(参照先のobject_idが同じ)

list3[0].object_id
=> 70343473688720
list4[2].object_id
=> 70343473688720
list5[2].object_id
=> 70343473688720

これは「浅いコピー」といいます。

dupとcloneはほぼ同じですが、以下の点が異なります。

複製するもの


dup
:汚染状態、信頼状態


clone
:汚染状態、信頼状態、凍結状態、特異メソッド


複製できないオブジェクト


true、false、nil、シンボル、数値

■リファレンス
https://docs.ruby-lang.org/ja/latest/class/Object.html#I_CLONE
 
 

その3:Marshalで深いコピー

Marshalを使うとこの問題が解決します。
Marshalはオブジェクトをシリアライズ/デシリアライズするモジュールで、
いったん文字列(ファイル)として保存したものを読み戻すため、
まったく別のオブジェクトとして複製することができます。

Marshal.load(Marshal.dump(obj))


list6 = Marshal.load(Marshal.dump(list3))
list3[1][:key]='YY'

list3
=> [{:key=>"ZZ"}, {:key=>"YY"}, {:key=>"xx"}]
list6
=> [{:key=>"ZZ"}, {:key=>"yy"}, {:key=>"xx"}]

■リファレンス
https://docs.ruby-lang.org/ja/latest/class/Marshal.html

破壊的メソッドを使う際には、
うっかり複製元/先に変更が影響してしまわないよう
注意が必要です。

【Ruby】変数やクラス定義などのスコープ

0

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

制御構文ではスコープを作らない(if, while、forなど)

Rubyではifやwhile、forなどの制御構文ではスコープを作りません。

if true
  hoge = 'abcd'
end
p hoge #=> abcd

for i in 0..5 do
  i += 1
end
p i #=> 6

# if, for内で定義された変数は抜けた後も有効

ブロックはスコープを作る(each, map, timesなど)

each, map, timesなどブロックを引数にとるメソッドでは
ブロック内でスコープが作られます。

[0,1,2].each do |i|
  total ||= 0
  total += i
end
p total
NameError: undefined local variable or method `total' for main:Object
        from (irb):2
        from /home/hoge/.rbenv/versions/2.1.8/bin/irb:11:in `<main>'

ブロック内で定義された変数totalには
外部からアクセスできません。

ブロック外で定義した変数はブロック内でも有効です。

total=10
[0,1,2].each do |i|
  total ||= 0
  total += i
end
p total  #=> 13

 
制御構文もdo~endがあってブロックのように見えますが、
ブロックではないそうです(要調査)
 

module, class, defもスコープを作る

module, class, defもスコープを作りますが、少し違います。
この場合は外部<=>内部のアクセスはどちらもできません。

num=10
def fuga
  num ||= 99
end
p num   #=> 10
p fuga  #=> 99

フラットスコープ

同じクラス/メソッド定義でも、class,defを使うとスコープが作られて、
Class.newやdefine_methodを使うと作られない、などもあります。

▼classで定義した場合は外側で定義したxにアクセスできない

x = 'XX'
class Hoge
  def method_x
    x
  end
end
Hoge.new.method_x
NameError: undefined local variable or method `x' for #<Hoge:0x007fe556dbc200>
        from (irb):4:in `method_x'
        from (irb):7
        from /home/hoge/.rbenv/versions/2.1.8/bin/irb:11:in `<main>'

▼Class.newやdefine_methodを使うと外側の変数にアクセスできる

x = 'XX'
y = 'YY'
Hoge = Class.new() do
  p y  #=> 'YY'
  define_method(:method_x) do
    x
  end
end
Hoge.new.method_x  #=> 'XX'

これをフラットスコープといいます。

 
 
 
「メタプログラミングRuby」に詳しく記載があるので
とてもおすすめです。
スコープについての記載がとても興味深かったので、
もう少し読み解いて理解を深めたいと思います。

【SVN】コミットをミスった、とすぐに気づいた時の戻し方と正しいコミットをするまでです【CUI】

0

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

svnではコミットをなかったことにすることはできません。 コミットする前のリポジトリをローカル持ってきて再度コミットします。 そうすれば履歴は残りますが、リポジトリの最新の状態はミスる前に戻ります。

svnではコミットをなかったことにすることはできません。
なのでコミットする前のリポジトリをローカルに持ってきて再度コミットします。
そうすれば履歴は残りますがリポジトリはミスる前に戻ります。

ローカルのソースはミスった時のリビジョン番号から持ってきます。
それをまたコミットすればいいですね(ミスり方にもよりますが)。

では手順です。

1. リポジトリを最新にします。

svn up

のちにローカルをマージするときのために最新にします。

2. リビジョン番号を確認します。
リポジトリが正しかった時のリビジョン番号を調べます。

svn log

ここではリビジョン番号が100だったとします。

3. 正しかったときのリビジョンにローカルを戻します。

svn merge -r HEAD:100 .

ローカルのファイルが変更されます。
-r HEAD:100でリビジョンを指定しています。HEADはリポジトリで最新のリビジョンを表します。
.はマージ元です。
ローカルのソースが過去のリビジョンに戻りました。

4. 再度コミットします。

svn commit -m “コミットをミスったので過去の状態を再度コミットします。”

これでリポジトリは元に戻りました。
最新のリビジョンが正常だとちょっとほっとしますね。

5. 最後にミスったときのリビジョンからローカルのソースを戻します。

svn merge -r HEAD:ミスったときのリビジョン番号 .

これで、リポジトリとローカルが元に戻りました。

CentOSでのデフォルトゲートウェイの設定方法

0

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

CentOSでのデフォルトゲートウェイの設定方法について手順をまとめます.

0. 環境について

バージョン: CentOS 6.5

1. ルーティングテーブルの確認

routeコマンドを実行して,
Destination項目がdefaultの, Gateway項目で現状のデフォルトゲートウェイを確認する.

[VM:~] $ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
192.168.56.0    *               255.255.255.0   U     0      0        0 eth1
default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0

2. 設定の変更

設定ファイルを編集する

[VM:~] $ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
※ ifcfg-eth0 の部分は対象のNICのものを指定

以下のGATEWAY項目を追加もしくは修正
----
GATEWAY=XXX.XXX.XXX.XXX
----

3. 設定の適用

以下のコマンドで, ネットワークを再起動して設定を適用させる.
このとき, 特に注意することとして, 一時的にネットワークが切断されるため,
フェイルオーバのための監視等を行っている場合,
異常と検知されて, フェイルオーバが発生してしまう可能性がある.
そのため, 事前にフェイルオーバが起こらないようにしておくこと.

[VM:~] $ sudo /etc/rc.d/init.d/network restart

変更後に適用されていることを確認(defaultのGatewayの値が, 設定ファイル内で設定した項目になっていること)

[VM:~] $ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
192.168.56.0    *               255.255.255.0   U     0      0        0 eth1
default         XXX.XXX.XXX.XXX 0.0.0.0         UG    0      0        0 eth0

4. デフォルトゲートウェイを経由して、外部に接続する際のグローバルIPの確認方法

以下のコマンドにより, 接続するグローバルIPを返却してくれるサービスを利用する.

[VM:~] $ curl http://httpbin.org/ip
{
  "origin": "xxx.xxx.xxx.xxx"
}

Thinreportsを使った感触

0

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

Railsのwebアプリケーション上で、PDFを自動作成させたい、ということがあり、 その際に「ThinReports」というツールを使う機会があったので、 このツールの良い所や、使い辛いと思った所をまとめてみました。

利点

1. 専用のエディタが使える

googlechromeにて、専用のエディタアプリが用意されており、
これを使うことでかなり視覚的にPDFのレイアウトを組むことが出来ます。
アプリは、Chromeのwebストアから無料でダウンロードが可能です。

エディタの画面上で矩形や画像、表を配置することが出来るので、
全てソースから作成するより、PDFの出来上がりが想像しやすいです。
また、要素の座標位置も1px単位で確認できるので、微調整も容易です。

enter image description here

矩形は四角と丸、直線のみですが、細かく調整が可能なため、
組み合わせれば、PDF上に簡単なイラストを描くことも可能です。
この辺りはペイントやパワーポイントで使用できる矩形を想像してもらえれば、
操作性が想像しやすいかと思います。


2. 要素の流し込みが簡単

エディタには矩形とは別に、要素の流し込み先となる枠(テキスト・画像)を作成できる機能が組み込まれています。
流し込み先をレイアウトファイル内に作ってしまえば、あとはrails側で要素を投げるだけでPDFに内容を埋め込めます。

enter image description here

また、Thinreports用のgemがあるので、rails側のセットアップも比較的簡単です。
Gemfile内にgem thinreportsを記述してbundle installすれば、事前準備は完了です。
あとは、コントローラなどからレイアウトファイルに値を渡してあげましょう。
enter image description here

上のコードは、先程のレイアウトファイルに要素を渡し、PDFを出力している所です。
Userモデルの情報をpdf化しています。
値の受け渡しは、基本的にvalueで渡せますが、画像の場合はsrcを使って、画像のパスを渡せばOKです。

欠点

1. 流し込む要素が大きいと対応しにくい

一つの流し込み領域に対して、長いテキストなどを入れる場合、
領域からはみ出すぶんに関して、
「その分領域を拡張する」「文字サイズを縮小する」のどちらかを選択しておくことが出来ます。
ただし、拡張されるのはその領域だけなので、すぐ下に別のテキスト等があると、表示がかぶってしまいます。
文字を縮小すればかぶりませんが、縮小した所だけ不自然に文字が小さくなってしまうので、要素の規定文字数が定まっていない場合、あまり向かないかもしれません。


2. フォントが少ない

enter image description here

細かい所ではありますが、エディタで使用できるフォントが少ないです。
日本語のフォントは「明朝体」「ゴシック体」の二つのみです。
このフォントは流し込みをした要素にも適用されるので、
多様にフォントを使用して、デザインの凝ったPDFを作成したい、という場合は別の方法を取った方がいいでしょう。
一応、開発元のロードマップには、カスタムフォント対応が予定されていますが、
更新の頻度が低いようなので、あまり期待せず待つしか無いようです・・・



以上、Thinreportsを使ってみた感触でした。
目的によって向き・不向きがありますが、視覚的にレイアウトが作れて、
結構きれいなPDFが出力できるので、気になった方は一度触ってみるのも良いかもしれません。

MySQLの出力結果をファイルに出力

0

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

業務上、UT、IT等でデータベース値とテストシナリオ期待値を見比べる機会があり、
MySQLクライアントで値を見るのに手間を感じ、MySQLの結果をファイル出力出来ないか調べました。

MySQLの出力結果をファイルにはきだしたいとき

mysql> SELECT * FROM [table] INTO OUTFILE "[file]" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '[クォート文字]';

ただし、この方法で指定するCSVファイルの出力パスは、
DBサーバー側のファイルパスを指しています。
そのため、サーバーとクライアントのホストが異なる場合は、
クライアントホストのファイルパスを探しても、CSVファイルは出力されていません。

CSVファイルに出力するコマンド

MySQLクライアント使わない方法もありました。

mysql -u [ユーザー名] -p -h [DBサーバーホスト名] [DB名] -e "`[実行SQL]`" | sed -e 's/\t/,/g' > [出力CSVファイルパス]

このコマンドで、リモートDBの結果をローカルCSVファイルに出力できます。

Burp Suiteを日本語化する方法

0

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

今まで困難だった、Burp SuiteのメニューとUIの日本語化と、一般的な日本語利用設定をWindows、Mac、Linuxで行います。Burp Suiteは、PortSwigger社が開発を行っているプロキシツールで、脆弱性診断などに使われます。

はじめに

今回Burp SuiteのメニューとUIの日本語化は、Belle(Burp Suite 非公式日本語化ツール)を利用して行います。ツール開発元サイトとその注意事項の確認をお願いします。
Windows、macOS、Kali linuxに導入した、Burp Suiteに対して行っています。Kali Linuxの日本語化については、別投稿を確認してください。

レスポンス内容の文字化け解消

レスポンス内容の文字化けに対応させます。
初期状態ですと、Burp SuiteのProxy機能で表示される、日本語を含むレスポンスの内容が文字化けを起こしています。
「User options Display HTTP Message Display」の「Change font」から日本語表示を可能なフォントに変更してください。
また、Look and feelで、UIの見栄えを変更する事も可能です。

Burp Suite japanese fonts

Burp Suiteの日本語化(Windows)

例は、Windows10へインストーラー版のFree Editionを導入したものです。
インストールされているフォルダ、特に変更していない場合は、
「C:\Program Files\BurpSuiteFree」へ、手順に沿って下記の3ファイルを配置します。

  • javassist.jar
  • belle.jar
  • ja.txt

管理者権限でメモ帳などを起動してインストール先にある、「BurpSuiteFree.vmoptions」を編集します。

Burp Suite windows folder
# Enter one VM parameter per line
# For example, to adjust the maximum memory usage to 512 MB, uncomment the following line:
# -Xmx512m
# To include another file, uncomment the following line:
# -include-options [path to other .vmoption file]
-Xmx12257m
# 以下の行を追記
-javaagent:belle.jar

Burp Suiteの日本語化がされてます。

Burp Suite windows

Burp Suiteの日本語化(macOS)

例は、macOS Sierraへインストーラー版のProfessional Editionを導入したものです。
Finderのメニューから移動アプリケーションを選択してください。
Burp Suiteのappファイルを選択し、control + クリックで「パッケージの内容を表示」を選択してください。
必要な3ファイルをBurp Suiteのjarがあるパス「java/app」に設置します。

Burp Suite Mac app

続いて「vmoptions.txt」を編集します。

Burp Suite Mac app edit

MacでもBurp Suiteの日本語化がされてます。

Burp Suite Mac

Burp Suiteの日本語化(Linux)

例は、Kali Linux(2016.2)のxfceを利用、デフォルトで導入されているBurp Suiteの日本語化を行います。
必要な3ファイルを適当な場所に設置します。(例: /root/.burp/)

メニューから起動する場合のファイルを編集します。

vi /usr/share/applications/kali-burpsuite.desktop

場合によって、編集するファイルは、こちらかも知れません。
「/usr/share/kali-menu/applications/」

Execの行を下記のように変更します。

[Desktop Entry]
Name=burpsuite
Encoding=UTF-8
Exec=sh -c "java -javaagent:/root/.burp/belle.jar -jar /usr/bin/burpsuite"
Icon=kali-burpsuite.png
StartupNotify=false
Terminal=false
Type=Application
Categories=03-webapp-analysis;03-06-web-application-proxies;
X-Kali-Package=burpsuite

Kali LinuxでもBurp Suiteの日本語化がされてます。

Burp Suite Linux

まとめ

各OSで、Burp Suiteの日本語化がある程度可能になりました。
日本語になったことで親しみやすくなると同時に、各項目の意味が直感的に理解できるようになります。
日本語化ツールBelleを作成公開してくださったことに感謝します。

関連記事など

脆弱性診断サービスなど

弊社、アピリッツではセキュリティ診断サービスを行っております。

下記リンクから内容の確認と、問い合わせが可能です。

http://security.appirits.com/

LinuxCentOSキープアライブの設定

0

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

RickNo42です。今更ですが続き
なキープアライブの設定を紹介します。
環境
・CentOS7の環境2台
 Aサーバ:172.18.0.2
 Bサーバ:172.18.0.3
 割のり当たるてるたんい仮想IP:172.18.0.4
・keepalivedの
目的
AサーバかBサーバ何方かに仮想IPを保持してもらい、
通常時はウェブアクセスをAサーバが受けるが、
Aサーバが死亡したらBサーバでのWebアクセスを受けるように変更する
インストールメソッド
http://www.keepalived.org
よのり最新をダウンロード

wget http://www.keepalived.org/software/keepalived-1.2.22.tar.gz
tar xzvfkeepalived-1.2.22.tar.gz
cdキープアライブ-12.22 /
./configure –prefix = “/”
make && make install
設定方法
[Aサーバー]

#爆の

nmcli d

兄弟タイプ
hogeイーサネットコネクタ数連結1

loループバック管理用-

cd / etc / keepalived /
cp keepalived.conf keepalived.conf.org

vim keepalived.conf

global_defs {
notify_email {
hoge@hoge.com
}
notify_email_from hoge@hoge.com
smtp_server localhost
smtp_connect_timeout 30
router_id LVS_DEVEL
}

vrrp_instance VI_1 {
状態マスター
インターフェイスhoge
smtp_alert
virtual_router_id 1
優先度150
advert_int 1
認証{
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.18.0.4
}

}

[Bサーバー]

#爆の

nmcli d

兄弟タイプ
hogeイーサネットコネクタ数連結1

loループバック管理用-

cd / etc / keepalived /
cp keepalived.conf keepalived.conf.org

vim keepalived.conf

global_defs {
notify_email {
hoge@hoge.com
}
notify_email_from hoge@hoge.com
smtp_server localhost
smtp_connect_timeout 30
router_id LVS_DEVEL
}

vrrp_instance VI_1 {
状態バックアップ
インターフェイスhoge
smtp_alert
virtual_router_id 1
優先度100
advert_int 1
認証{
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.18.0.4
}

}

押し
[A、Bサーバー]

/etc/init.d/keepalived start

[A
サーバー] 172.18.0.4を抜くことをする

/ sbin / ip addr show
[B
サーバー] 172.18.0.4を抜ていないことをする

/ sbin / ip addr show
サーバー
[A1]

/etc/init.d/keepalived stop
//172.18.0.4を抜ていないことをする
/ sbin / ip addr show
[B
サーバー] 172.18.0.4

/ sbin / ip addr show
卓は、172.18.0.4にIPをダウンロードされた先のダウンロードがありにちありません設定の完了です。

少し説明

  • global_defs
    マスターが切り替わった時にメールを飛ばす設定です。
  • vrrp_instance VI_1
    IP毎に設定を記載します。
    メールが来る時にこの名前で飛んで来るので、わかり易い名前にしましょう
    -状態MASTERの
    MASTERかBACKUP設定します。
    MASTERにしたい方の優先度を高くしておきましょう
    (わざと優先順位を同じにする場合もあります)
    -インタフェースホーヘ
    設定するNIC名
  • smtp_alert
    メール通知を行う
  • virtual_router_id 1
    同一NW内でユニークな数値を設定
    詳しく覚ええてるいないが、数値に上限があったはずなので、
    自分で管理して1から付けたほうが良い
    -プライオリティ150
    MASTER:150のサーバが死んでBACKUP:100に移動した場合
    MASTERを -advert_int 1 生死同じ目2秒であり、IPがMASTERで行ってます。priority
    がBACKUPするとだと移動しません。

Firefoxのe10sを有効化してみた

0

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

e10sとはElectrolysisの略で、Firefoxのマルチプロセス機能のことです。 安定性の向上、マルチコアプロセッサを活用したパフォーマンスアップやセキュリティの強化等のメリットがあります。 e10sの歴史と有効化方法、その効果についてご紹介します。

e10sの歴史

e10sは影響範囲の大きさから、有効になる条件を厳し目に設け、段階的に対象ユーザを広げていく計画となっています。

Firefox 48 (2016/8/1)

  • アドオンをインストールしている場合は対象外
  • 近々サポート対象外となるOS(Windows XPなど)は対象外

Firefox 49 (2016/9/19)

  • e10sと互換性が確認された少数のアドオンのみを利用している環境が対象

Firefox 50 (2016/11/7)

  • WebExtensionsベースの拡張機能またはホワイトリスト掲載の従来型アドオンがインストールされている環境が対象

Firefox 51 (2017/1/24)(←2017/1/27現在はここ)

  • ホワイトリストの拡大

Firefox 52 (2017/3/7)

  • ホワイトリストの拡大

Firefox 53 (2017/4/18)

  • 完全実施。初期設定においてe10sが有効化される

Firefox 51でかなり条件が緩和され、e10sを有効化できる状況になってきました。

e10s有効化方法

e10sは設定で強制的に有効化することもできますが、動作が不安定になるためあまりオススメできません。
2017/1/27現在、最新バージョンのFirefox 51では大分ホワイトリストのアドオンが増えているため、非対応のアドオンを無効化することで、e10sを有効にする方法をご紹介します。
※以下は、Mac OS X 10.11での方法ですが、Windows等もほぼ同じかと思います。

まず、現在e10sが有効化されているかどうかを確認します。URLバーに以下を入力してください。

about:support

表示されたトラブルシューティング情報の「マルチプロセスウィンドウ」の値を確認し、

  • 「1/1(デフォルトで有効)」となってる場合は有効化されています。
  • 「〜無効」となっている場合は有効化されていません。

無効になっている原因は、インストールしているアドオンがホワイトリストに入っていない可能性が高いです。

その場合「Add-on Compatibility Reporter」を使い、各アドオンの対応状況を確認します。

Add-on Compatibility Reporter – mozzilla

Add-on Compatibility Reporterインストール後、Firefoxのアドオン一覧の各アドオンに以下のメッセージが表示されるようになります。

enter image description here
  • Compatible with mutiprocess.:マルチプロセス対応
  • Not compatible with multiprocess.:マルチプロセス非対応

「マルチプロセス非対応」のアドオンをすべて無効にして再起動すれば、e10sが有効化されます。
※マルチプロセス非対応でもe10sの有効化に影響がないアドオンもあるようです。

e10sの効果

さてe10sが有効化されてみての効果(違い)ですが、

  • about:supportのマルチプロセスウィンドウの値が「有効」になった
  • アクティブモニタのFirefoxのプロセスが2つ(FirefoxとFirefox Web Content)に分かれた
  • トータルでのメモリ使用量は少し増えたが(1.3倍くらい)、レスポンスは明らかに改善している(e10s無効の頃は大体1.2GB超えた辺りから重くなって、再起動で対処してた)
  • 大量のタブを表示しても切り替えが早い
  • マルチプロセス対応になっているアドオンでも正しく動作しないものがある(私の場合、Secure Loginが動かなくなった)

今後、Firefox 53で完全にe10sが有効化されたあとは、contentプロセスの複数化、サンドボックス化を予定しているそうです。
さらなるパフォーマンスアップに期待です。

参考サイト

railsでflotを使って日々の胸のサイズをグラフにしてみた

0

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

巨乳になりたい。 巨乳になりたいので、まずは胸のサイズを毎日計測してグラフ化しようと思いました。(レコーディングダイエット的な。レコーディング巨乳)
グラフ描画用のライブラリは数ありますが、中でも機能的で様々なグラフを描画できるflotを使い、railsでグラフ描画をしてみました。

まずはflotをインストールします。

で、

controllerに

def kyonyu_size
  @kyonyu_size = Size.all
end

(DBには胸のトップサイズ・アンダーサイズが入っています)

viewに

td 
   div (id = "placeholder"
     data-kyonyu-top = "#{@kyonyu_size.top.to_json}"
     data-kyonyu-under = "#{@kyonyu_size.under.to_json}"

app/assets/javascript/admin/kyonyu_sizes.coffee に

class AdminKyonyuSize
  data_object = [
  {
    label: [],
    color: "blue",
    data: [],
    points: { show: true },
    lines: { show: true },
    hoverable: true
  }

  {
    label:[],
    color: "orange",
    data: [],
    points: { show: true },
    lines: { show: true },
    hoverable: true
  }
]

day_label_formatter = (val, axis) -> val + "日"

kyonyu_size: ->
  placeholder = $("#placeholder")
    data_object[0].label = "トップ"
    data_object[1].label = "アンダー"
    data_object[0].data = placeholder.data("kyonyu-size")
    data_object[1].data = placeholder.data("kyonyu-size")

(日毎のトップとアンダーのサイズをグラフにしていきます)

app/assets/stylesheets/admin/kyonyu_size.scss に

.admin_kyonyu_size {
  /* グラフ領域の高さ */
  [id^="placeholder"] {
    height: 300px;
  }
  .center-bold {
    text-align: center;
    color: #000000;
    font-weight: bold;
  }

}

app/assets/javascript/admin/kyonyu_sizes.coffee にオプション追加

options = {
  xaxis: {
    tickSize:1
  }
  yaxis: {
    min: 0,
    minTickSize: 1,
    tickFormatter: (val, axis) -> val + "cm"
  },
  grid: {
    show: true
    backgroundColor: "white",
    hoverable: true,
    autoHighlight: false
  }
}

(グラフにマウスオーバーすると何センチか教えてくれる)

色々と抜け漏れがありそうですがこんな感じです。下はイメージ図。

イメージ図

見事なスイカップになりましたね。どうもありがとうございました。

ブルーライトの影響って?

0

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

ブルーライトの有害性など、実際どこまでがホントなのか調べてみました。

スマートフォンやパソコンから出る青い光「ブルーライト」。
この光が人体にどんな影響を与えるか、いまいち知っているようで知らないので調べてみました。

調べる前のイメージは「なんとなく目が疲れそう」位の認識しか持っていませんでしが、
ブルーライトの浴び過ぎは目の疲れだけではなく、睡眠に影響を与えたり網膜への傷害などが懸念されていることが分かりました。

そもそもブルーライトとは?

ブルーライトとは、波長が380~500nmの領域にある青色光のことです。
ヒトの目で見ることのできる光=可視光線の中でも、もっとも波長が短く、強いエネルギーを持っています。
太陽光や白熱灯にもブルーライトは含まれますが、パソコンやスマートフォンなどのLEDディスプレイやLED照明には、特に多く含まれています。

ブルーライトが人体に与える影響とは?

青い光は散乱しやすいため、ピントを合わせようと目を酷使する為、目に掛かる負荷が大きい。
一生懸命ピントを合わせようとする分、目に余計な負荷がかかり、疲れ目になりやすいと言われています。

夜、寝る前に、パソコンやスマホなどに熱中して、
ブルーライトを目に浴びすぎると、
その事が“不眠症などの睡眠障害”を引き起こす可能性があります。

寝る前にパソコンやスマホなどを使うと、
デジタル機器の液晶画面から出ているブルーライトによって、
「眠くなるホルモン(メラトニン)」の生産量が低下し、
その結果、目がさえてしまう、といった事になる可能性があるためです。

パソコンやスマホなどを使用する事によって、
夜、ブルーライトを目に浴びすぎると、
体内時計(サーカディアンリズム)や自律神経が乱れてしまい、
なかなか寝つけなくなったり、 翌朝、起きるのが辛くなったりしてくる可能性があります。

ブルーライトは悪いことだけなの?

しかし、ブルーライトは人体に悪い影響だけを与えるものではありません。朝にからだが目覚め、夜になると眠くなる周期を「サーカディアンリズム」といいます。
朝にブルーライトを含んだ太陽光を浴びることはそのリズムを整える効果があります。

メラトニンには、睡眠だけでなく抗酸化作用もあり
細胞の新陳代謝や病気の予防にも効果をもつといわれています。

光刺激にはメラトニンだけでなく、様々なホルモン分泌とも関係しており
自律神経系や脳への影響、また長寿遺伝子の生体リズムとの関係も注目されているそうです。

ブルーライトをカットするために

すぐにできる方法では

  • パソコンやスマホなどの液晶画面の色の設定を変える。
  • パソコンやスマホなどの画面から出るブルーライトを専用メガネやフィルムでカットする。
  • 日中はしっかりと太陽光を浴びる。

まとめ

ブルーライトには「有害」と「有益」の両面があるため、
ブルーライトとの付き合い方は

日中、外を歩く時などは 「ブルーライトをカットする眼鏡」を使用しない。
パソコン・スマホなどを長時間、使用する場合には、
「ブルーライトをカットする眼鏡」等を使用して目の疲労を軽減させる。

睡眠の妨げにならない様に夜、寝る直前には、なるべくパソコン・スマホなどを使用しないようする。

以上がブルーライトとの上手い付き合い方だと思われます。

[macOS Sierra] ssh接続時のkeychain/agentへのパスフレーズ保存の挙動が変わった

0

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

macOS Sierraでの ssh接続時のkeychain/agentへのパスフレーズ保存の設定方法とkeychainに保存したパスフレーズの削除方法について

背景

今回開発環境のmacOSのバージョンUPを行ったのですが、
ssh接続の際公開鍵認証のパスフレーズ入力を求めるポップアップダイアログが表示されなくなり
コンソール上に直接パスフレーズを入力する挙動に変わりました。
接続のたびにパスフレーズを入力することになり使い勝手が悪くなるため、解決策を調べてみました。

解決策

これはmacOS Sierraからの仕様変更とのことですが、
$HOME/.ssh/configにて
keychainへの追加とagentへの追加のコントロールができるようです。

私が設定したのは以下

Host *
  UseKeyChain no #keychainには保存しない
  AddKeysToAgent yes #agentには登録する

これで再起動するまでは一度入力したパスフレーズが記憶されます。
セキュリティを考慮しkeychainにはパスフレーズは保存していません。

keychainに保存したパスフレーズの削除

keychainに保存したパスフレーズは以下で削除できるようです。

cd ~/Library/Keychains/<UUID>
sqlite3 keychain-2.db 'delete from genp where agrp="com.apple.ssh.passphrases"'

今回確認した環境

OS: macOS 10.12.2

当然ながら公式情報ではありませんので実施については自己責任でお願いします。

ruby で rsa暗号化した文字列を jsで復号する

0

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

データを暗号化することがいろいろな理由で必要となり試したのでメモします。 暗号方式は rsa を使います。公開鍵で暗号化して秘密鍵で復号します。 ※ 私の試したところだと秘密鍵で暗号化すると復号できませんでした。

環境

ruby は openssl と base64 を使います。
※ require すれば使えるはず。

javascript は jsencrypt.js を使います。
※ https://github.com/travist/jsencrypt

ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
CentOS Linux release 7.1.1503 (Core)

bashでしておくこと

秘密鍵を作ります。
ssh-keygen を使うとデフォルトで
~/.ssh/ ディレクトリに
id_rsa と id_rsa.pub が作成されます。秘密鍵と公開鍵です。
秘密鍵の中身はそのまま使えますが、公開鍵はそのままだと今回の用途では使えないので pem フォーマットにします。
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pem > ~/.ssh/pem
pem の中身を公開鍵として使います。

rubyでの暗号化

# ライブラリの読み込み

require ‘openssl’
require ‘base64’

class Encryptor
attr_accessor :pub, :public_key
def initialize
# pemフォーマットの公開鍵ファイルの内容を取得
self.pub = File.read(ENV[‘HOME’] + ‘/.ssh/pem’)
# 鍵をOpenSSLのオブジェクトにする
self.public_key = OpenSSL::PKey::RSA.new(pub)
end

# 引数 str を暗号化した結果を返す
def enc(str)
# str に与えた文字列を暗号化します。
Base64.encode64(public_key.public_encrypt(str)).delete(“\n”)
end
end

javascriptでの復号

// jquery と jsencrypt.js を読み込んでおく。

crypted = ‘暗号化された文字列’;
pricate_key = ‘id_rsaファイルの中身のテキスト’;
crypt = new JSEncrypt();
crypt.setPrivateKey(private_key);

// decrypted に復号された文字列が代入される
decrypted = crypt.decrypt(crypted);

参考

jsで暗号化しrubyで復号する
http://qiita.com/shigekid/items/60d3387de6a804bc38b9

CryptoJS
https://jsfiddle.net/hibara/qzono8jb/

perlで暗号化し js で復号する。
http://hatyuki.hatenablog.jp/entry/2013/09/04/151142

最近人気な記事