ホーム ブログ ページ 25

Slackで便利な機能3つ

0

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

たまごです。 みなさんslack使ってますか。 今日は、個人的にslackで僕が便利だと思っている機能のご紹介です。

ユーザグループ

https://get.slack.help/hc/ja/articles/212906697-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B

全体周知をするためにhereやchannelを使う機会があると思いますが、それだと通知スコープが広すぎるケースがあります。複数チームで同チャンネルを使っていて、特定チームにのみ周知したい場合などです。

そういう場合、ユーザグループの作成が便利です。

これは、メールでいうメーリングリストのようなもので、ユーザグループ宛てにメンションを投げると、そのユーザグループに登録されているユーザにだけ通知がとぶというとても便利なものです。

here乱舞ですと、常に通知ランプが灯って、かえってチャンネル確認が滞ったりするものです。宛先範囲を適切に設定することで、必要十分な範囲に発言を届け、必要十分なメッセージのみチェックすることができます。

スレッド

https://get.slack.help/hc/ja/articles/115000769927-%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B

そして、やはり便利なのがスレッド機能です。

大人数のチャンネルが早いのでなかなか追いづらいですが、スレッドなら話題ごとに集約してくれるので、チャンネルの流れをゆるやかにすることができ、チェックしやすくなります。

なお、無闇にAlso send to #channel-nameでチャンネル全体に返信させるのはあまり好きなやり方ではありません。スレッドの意義が薄れるからです。それなら、スレッド内で対象ユーザ向けにメンションを飛ばした方がスムーズだと思います。

リマインダー

他、強力なリマインダー機能があって、労働時間帯が違うメンバーに出社後にメンションしたい場合などに便利なのですが、リマインダー文法が日本人にとって直管的ではなく、あまり使いこなせていません。

塗りにひと手間加えてイラストの印象を華やかにする【後編】

0

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

引き続き短時間でイラストの印象を華やかにする方法についてまとめました。

はじめに

nocoです。
前回にも引き続き、時間をかけて塗り込まないでもひと手間でイラストを華やかに見せる方法についてご紹介します。
時短と手抜きは紙一重だなと思うのですが、ポジティブな方に捉えていただけましたら幸いです。

効果や背景を入れてイラストを華やかに見せる

模様やテクスチャを入れる

enter image description here
enter image description here
模様やテクスチャを入れるとデザイン的に見せられたり、塗りの密度が高くなることでベースがシンプルな塗りでも見応えが出ます。
オーバーレイや乗算などでサッと乗せるだけで全体の印象が大きく変わるため、つい色々試したくなってしまいます。
過剰な合成は元のイラストの良さを奪ってしまうので、全体ではなく部分的にかけるなど工夫すると良いかもしれません。
 

グロー効果をかける

enter image description here
アニメの仕上げやイラストのテクニックとしてよく使われる効果です。
明るい色の部分を発光させることでふんわりと優しい印象になります。
シンプルな効果ですが、肌に透明感が生まれ人物が活き活きするように感じられます。
 

背景を追加する

enter image description here
塗りとは少し離れますが、元のイラストには一切手を加えず簡単な模様の背景を追加しました。
イラストの全体的な色調の補色にあたる色を入れると失敗しづらく感じます。
キャラクターだけでなく、他の要素でも簡単に印象を華やかにすることができます。

おわりに

前後編合わせて全6パターンご紹介させていただきましたが、いかがだったでしょうか。
どれも5分足らずでできる内容なので、サッとイラストの見栄えを良くしたいときぜひ試してみてください。

塗りにひと手間加えてイラストの印象を華やかにする【前編】

0

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

短時間でイラストの印象を華やかにする方法についてまとめました。

はじめに

nocoです。
たくさんの時間を使ってひとつのイラストを描きたいと思っても時間は限られたものであり、いつもそうできるわけではありません。
そんな時、サッと描いたらくがきでも見栄えよく見せられないかと横着なことを考えたりもします。
なので今回は時間をかけて塗り込まないでもひと手間でイラストを華やかに(それっぽく?)見せるやり方についてご紹介します。

影や光の色に手を入れて華やかに見せる

enter image description here
アニメ塗りの女の子を用意しました。
ベースカラーはそれぞれベタ塗り、影色もグレー統一のシンプルなものです。
こちらのイラストの塗りにひと手間加えて、それぞれの印象の違いを見ていきましょう。
 

ベースカラーに合わせて影色を鮮やかにする

enter image description here
影色に彩度が高めの色を選ぶことで、ぱっと視認できる色数が増え華やかになります。
ベースカラーによって異なる3色を配置しています。
ベースカラーと影色の色相が離れすぎているとちぐはぐな印象になりやすいため、同系色を選ぶと元の印象を壊しません。
 

光と影の部分にオーバーレイのグラデーションを入れる

enter image description here
光部分に黄色、影部分に茶色のグラデーションをオーバーレイでざっくりとかけました。
塗りの一部にグラデーションが入るだけでイラストに空気感と透明感が生まれます。
イラスト全体の色調に合わせたオーバーレイの色を選んであげましょう。
光には明るめの色、影には暗めの色のグラデーションを入れると印象がまとまりやすいです。
 

影に思いきりビビッドカラーを乗せる

enter image description here
影色をビビッドカラーにすると一気にポップなイメージになります。
影色に合わせてベースカラーも色相を青系に振って爽やかなイメージに調整しました。
ビビッドカラーの主張がうるさすぎる場合は影の範囲を整理するとすっきりします。

おわりに

着彩においてありふれたテクニックかもしれませんが、ひとつひとつ分解していくとかなり量が多いことに気が付きました。
次回も引き続きひと手間のパターンをご紹介したいと思います。

Windows SubSystem for Linuxの導入の仕方

0

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


Windows SubSystem for Linuxの導入について調べました

はじめに

私は業務でmacOSを使っているのですが、プライベートではwindowsを使っています。ふとした瞬間にコマンドラインからいろいろしたい時にwindowsだとLinuxのコマンドが叩けなかったりします。
結構不便に感じていまして、どうにかしてLinuxコマンドが使えないか調べてみました。
するとWindowsがLinuxを仮想化して立てられるようになっていたのでそれを使ってLinuxコマンドを使える環境を構築してみました。

Windows SubSystem for Linux とは?

windows10のAnniversary Updateで追加された機能の一つで、WindowsでLinuxが使えるようになるという機能の事です。
Windows上にLinuxをおいて、それを動かせるようにするもので、これを入れることでLinuxのコマンドなどを使えるようになります。

導入方法

機能の有効化

スタートボタンから「アプリと機能」をクリックして、アプリと機能のウィンドウを開きます。次に右上にある関連設定の所にあるプログラムと機能をクリックしてください。では右の欄にあるwindowsの昨日の有効化または無効化をクリックします。そこでプログラム機能ウィンドウが出てきますので、そこで「Windows Subsystem for Linux」を探してチェックボックスにチェックを入れて「OK」を押してくださいこれでインストールが始まりますので少し待ちましょう。インストールが終わると再起動を求められるので再起動してください。

ストアからのインストール

次にストアからWSLをインストールします。Microsoft StoreからUbuntuを探してきて「入手」ボタンを押します。インストールが始まるので、インストールが終わったらスタート画面にUbuntuがあると思うので、それを起動します。起動するとユーザ設定を求められるので設定してやります。プロンプトに従っていれば間違えはしないと思います。

ここまででLinuxコマンドを使えるようになりました。これでWindowsでもLinuxのコマンドが使えるようになりました。

まとめ

WindowsでLinuxコマンド使いたい時はWSLを入れましょう。

日常生活にSlackを取り入れよう!

0

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

ビジネス向けチャットツールSlackは、仕事だけでなく日常生活にも使うことが出来ます。 今回はリマインダー機能について書いていきます。

リマインダー機能

/remindと入力してエンターを押してみましょう。するとヘルプが現れます。

enter image description here

試しに、以下のように入力してみましょう。
/remind me to 爪切り at 7PM today
enter image description here
リマインド成功です!これによりその日の午後7時にSlackから通知が飛んできて、爪切りをしなければならないことを思い出せます。

meのところを@hogeとしたり、#channelとすることで特定の人、チャンネルにリマインドすることが出来ます。

基本的には、/remind (人物・チャンネル) to (タスク) (いつ)という書き方です。

『いつ』の部分に関しては、everydayで毎日を指定したり、every Fridayで毎週金曜日を指定したり、at 9AM every Fridayで毎週金曜日の午前9時を指定したりできます。

enter image description here

要するに、atのあとに時間を、そのあとに曜日や毎日といった指定ができます。

ちなみに私の環境では、atを省いてevery Fridayとだけリマインド登録すると、自動的に午前9時に設定されました。

また、登録したタスクは/remind listで確認が出来ます。

Slackのリマインダー機能は、本来はおそらくミーティングなどの予定をリマインドするために使うのが正しいと思われますが、私は前回の記事で紹介したTrelloを使うまでもないタスクについては、Slackでリマインドするようにしています。

おまけ

/shrugと入力して送信してみましょう。
enter image description here

【Rails】プレビュー機能等作成の際によくつかう小技

0

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

プレビュー機能って結構考慮する部分が多くて面倒だったりします。のでそこで自分がよく使っていることを紹介します。

よくあるプレビュー機能の作り方

ボタンにパラメーターをつけてアクション内のif文で分けたりする
app/views/products/edit.slim

= form_for @product do |f|
・
・
・
  = f.submit '保存', name: :submit, value: :save
  = button_tag 'プレビュー', name: :submit, value: :preview, formtarget: :_blank

app/controllers/products_controller.rb

def create
  if params[:submit] == 'preview'
    render 'show'
  else
    @product.save
.
.
.
end

def update
  if params[:submit] == 'preview'
.
.
.
end

煩雑すぎる!!
のでアクションを分けましょう。
でもformの向き先は1つなので通常では分けられないです。
が、そこでjavascriptの登場です。

おすすめなプレビュー機能の作り方

app/controllers/products_controller.rb

def preview
.
.
.
end

app/views/products/edit.slim

= form_for @product, html: { id: :product_form } do |f|



= f.submit '保存'
= link_to 'プレビュー', 'javascript:void(0)', id: :preview_button, data: { request_url: preview_product_path(@product)}

app/assets/javascripts/products.coffee
“`
$main_form = $(‘#product_form’)
$preview_button = $(‘#preview_button’)

$preview_button.click ->
original_action = $main_form.attr(‘action’)
$main_form.attr(‘action’, $(this).data(‘request-url’))
$main_form.attr(‘target’, ‘_blank’)
$method = $main_form.find(“input[name=’_method’]”)
$main_form.find(“input[name=’_method’]”).remove()
$main_form.submit()
$main_form.append($method)
$main_form.attr(‘action’, original_action)
$main_form.removeAttr(‘target’)
“`
ボタンを押したときにformの向き先を変えて仕舞えばいいのです!
変えた後は元に戻すのを忘れずに。
この方法はプレビュ−機能以外にも応用できるのでぜひ使ってみてください

Unityのエディタ拡張の話

0

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

Unityのエディタ拡張で自分で作った最高のウィンドウを使いたい話です。

最高のUnity生活を送っていますか?

自分が書いた記事ではないのですが、
【Unity】メニュー項目を増やして君だけの最強のUnityを作ろう!
この記事を読んでしばらくたったことですし、そろそろUnityにより複雑なことをやらせたくなってきた頃ではないでしょうか。
そう…GUIウィンドウを開いてもう少し細かいことをやらせてみたいですね!しましょう。

ということで簡単なチェックボックスとボタンのあるウィンドウを出してみたいと思います。

自分でウィンドウを作ってみよう

ざっくり必要なことは以下のとおりです。

  1. EditorWindow を継承したクラスを作る
  2. 追加したMenuItemで呼び出される関数ではウィンドウを出す処理を書く
  3. OnGUIという関数内でウィンドウができたときのレイアウトをつくる

EditorWindow を継承したクラスを作る

EditorWindow はカスタムしたエディタウィンドウを作るとき親にするクラスです。

https://docs.unity3d.com/jp/540/ScriptReference/EditorWindow.html

継承しましょう!

using UnityEditor;

public class MyCustomEditorWindow : EditorWindow {
}

継承しました。

追加したMenuItemでウィンドウを出す

using UnityEditor;

public class MyCustomEditorWindow : EditorWindow {
    [MenuItem("Edit/OpebMyCustomEditorWindow")]
    public static void Open() {
        GetWindow<MyCustomEditorWindow>(true);
    }
}

MenuItemへの追加の仕方は別の型が書いた記事を参考にしていただくとして、
これでメニューのEdit以下に Open MyCustomEditorWindow という項目が追加され、Openという関数が呼び出されるようになります。

Openの中では
解説が少しややこしいですが、GetWindow でウィンドウが出せます。
一つ目の引数をtrueにすると、今作っているウィンドウが別のウィンドウで出てくるようになります。

さて、ここまでできれば今作っている画面が出るようになっているはずです(まだ中身のない空のウィンドウですが)。

空のウィンドウ

OnGUIを定義してウィンドウのレイアウトをつくる

このエディタにGUI要素を配置していきます。

チェックボックスを置くのは簡単で、UnityEditor GUILayoutのToggleを使います。
以下の例ではcheckBoxIsOn という変数にToggleのオンオフが入っています。

using UnityEditor 
public class MyCustomEditorWindow : EditorWindow {
    // ...

    bool checkboxIsOn = true;

    public void OnGUI(){
        checkboxIsOn = GUILayout.Toggle(checkboxIsOn, "チェックボックスです");
    }
}
チェックボックスのあるウィンドウ

最後にボタンを置いてみましょう。

using UnityEditor 
public class MyCustomEditorWindow : EditorWindow {
    // ...

    public void OnGUI(){
        checkboxIsOn = GUILayout.Toggle(checkboxIsOn, "チェックボックスです");

        if (GUILayout.Button("ボタンの文字")) {
            // ボタンを押したときに呼び出される処理
            Debug.Log(checkboxIsOn);
        }
    }
}

これで押すとToggleの状態を出してくれるようになりました。

完成品1
完成品2

まとめ

GUILayoutには他にも様々なGUI要素があり、項目もさらに増やすことができます。
ぜひ試してみて最高のUnity生活を送ってください!

HelperとJSで文字数カウント機能を作る

0

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

Ruby on Rails でフォームなんかを作る際、テキスト入力部分に「文字数カウント機能」を付けたいと思うことが多々あります。 テキストエリアの右下とかに「0/30」とか付いてて、テキストエリアに入力するとリアルタイムにカウントしてくれるアレです。 JavaScriptで作れるのですが、テキストエリアがたくさんあるフォーム画面などで、 「こっちのフォームは300文字までだけど、その下のフォームは500文字まで入力できる」 などがあると、いちいち作っていると結構ごちゃごちゃしてきてしまいます。 この文字数カウント生成処理を、railsのhelperに全部入れると、けっこう分かりやすかったのでメモがわりの覚え書きです。

設置する文字数カウントの概要
* 「xx(現在の入力文字数) / xx(最大入力文字数)」の形で表示
* 入力文字数が最大文字数を超えた時、入力文字数の色を赤くする
* 各フォームで最大文字数の値はそれぞれ違う


まずviewを見てみます。
例えば「title」「text」という二つのカラムを持つColumnというモデルについて、
それぞれの値を入力するためのフォームを必要最低限の物だけ設置してみます。

<%= form_for(@column, url: url_path) do |f| %>
  <%= f.label :title %>
  <%= f.text_field :title %>
  <%= f.label :text %>
  <%= f.text_area :text %>
<% end %>

これだとラベルとそれぞれのテキスト入力エリアしかありません。
文字数カウントを設置したい・・ので、helperに作ってもらうことにしましょう。

def countable_field(model_name, model, attribute, maxlength)
    sanitized_model_name = model_name.gsub(/\]\[|[^-a-zA-Z0-9:.]/, '_').sub(/_$/, '')
    content_tag(:div, class: 'text_count') do
      len = model.send(attribute).to_s.length
      style = 'color: red;' if len > maxlength
      concat content_tag(:span, len, id: "#{sanitized_model_name}_#{attribute}_len", style: style)
      concat ' / '
      concat content_tag(:span, maxlength, id: "#{sanitized_model_name}_#{attribute}_max")
    end
  end

ちょっとごちゃごちゃしていますが、
countable_field という関数に「モデル名」「モデルインスタンス」「カラム名」「最大長」を渡すと、HTMLソースを作ってくれるようになりました。
現在の入力文字数部分は「モデルカラム_len」、最大文字数部分は「モデルカラム_max」のidが付くように統一してます。
form_forで出来る入力フォームのidにそれぞれ「len」「max」が付く形です。JSで使います。
初期値がある場合を想定して、テキストエリアの内容が既に最大文字数超えていた場合は、赤くするようにしています。

そして、JSで文字数カウント機能を作っておきます。
CoffeeScriptで作ってみたのが以下です。

$ ->
  $('.countable').on 'click keyup blur change paste input onload', ->
    countLength($(this))

countLength = ($field) ->
  len = $field.val().length
  $("##{$field.attr('id')}_len").html(len)
  countMax = Number($("#" + ($field.attr('id')) + "_max").html())
  countDown = countMax - len
  if countDown < 0
    $("##{$field.attr('id')}_len").css
      color: ‘red’
  else
    $("##{$field.attr('id')}_len").css
      color: 'black’

やっていることは「.countable」というクラスが付いたテキスト入力エリアに変更があったら、
「id : モデルカラム_len」のHTMLの中身に入力された文字数の数値を入れて、
「id : モデル
カラム_max」のHTMLの中身の数値より大きければ、文字色を赤くしています。

あとはビューでcountable_fieldを呼び出してあげればいい・・・のですが。

引数が面倒くさい

渡さなければならないのは「モデル名」「モデルインスタンス」「カラム名」「最大長」。
わりといろいろ渡してあげなければいけません。ちょっと面倒です。出来れば二つぐらいに減らしたい。

form_forの中で使いたいので、ActionView::Helpers::FormBuilderのサブクラスを作ってみましょう。

module ActionView
  module Helpers
    class FormBuilder
      def countable_field(method, maxlength)
        @template.countable_field(@object_name, @object, method, maxlength)
      end
    end
  end
end

先程つくったcountable_fieldメソッドを呼ぶだけの関数ですが、引数として渡すのは「カラム名」「最大文字長」だけになりました。
これをviewに仕込むとこんな感じになります。

<%= form_for(@column, url: url_path) do |f| %>
  <%= f.label :title %>
  <%= f.text_field :title, class: 'countable' %>
  <%= f.countable_field(:title, 100)%>
  <%= f.label :text %>
  <%= f.text_area :text, class: 'countable' %>
  <%= f.countable_field(:text, 500)%>
<% end %>

viewに足したのは各入力エリアにcountableクラスを追加したのと、countable_fieldを設置しただけですが、これで文字数をカウントしてくれます。
ActionView::Helpers::FormBuilderのサブクラスを作ることの利点としては、引数を減らすことに加え、
他のモデルについても「カラム名」「最大文字長」だけを渡せば流用できます。

また、form_forで出来る入力フォームのidをもとにjsが補足するので、
nested_formなどの動的にフォームが増えたりするものでも、揃えるようにすれば対応が出来ました。

ServiceWorkerを使う

0

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

Service Workerは、ブラウザ上でWebページを表示していない時にでも実行できるスクリプトです。 GoogleのPWA(Progressive Web Apps)の実装に不可欠な技術ですが、ブラウザでスマホアプリのようなPush通知を実装したWeb Push機能に必須の機能です。 今回は簡単にServiceWorkerを試してみます。

ServiceWorkerが使えるか確認してみる

対応しているブラウザ: Chrome、Firefox、Opera
対応しているOS: Windows、macOS、Android

現段階では、WindowsのIEやEdge、iOSの全てのブラウザで使うことができません。
日本のシェアを考えるとiOS非対応なのはとてもネック・・・

ちなみに、対応しているブラウザかを調べるには、
navigator.serviceWorker
が定義されているかを確認します。

さて、ブラウザの開発ツールのコンソールから次のコマンドを実行してみます。

対応しているブラウザ(Chrome)だと
enter image description here

ServiceWorkerContainerというオブジェクトを返します。
このオブジェクトはサービスワーカの登録・解除・状態の取得などの機能を提供しています。

対応していないブラウザ(Safari)だと
enter image description here

undefinedが返ってしまいました。ダメだこりゃ。

ServiceWorkerを使うまでの準備

必要なもの

  • ServiceWorkerのJavaScriptスクリプト
  • インストールするためのJavaScriptコードを含んだHTMLページ
  • SSLまたはlocalhostでアクセス可能なWebサーバ

ServiceWorkerの実体

単なるJavaScriptスクリプトですが、
決められたイベントのうち扱いたいものを追加するだけ、というシンプルなものです。

対応している主なイベントは

  • install
  • activate
  • fetch
  • message
  • push

今回は、GlobalFetch.fetch メソッドが呼ばれたときに、コンソールにメッセージを出すというプログラムです。

self.addEventListener("fetch", function(event) {
   console.log("fetchメソッドが呼ばれたよ!");
});

今回はこのファイルを serviceworker.js という名前で保存します。

ServiceWorkerをインストールする

次に、ServiceWorkerをコントロールしたいサイトでインストールします。

ServiceWorkerContainerregister()メソッドを使います。

navigator.serviceWorker.register("serviceworker.js").then(function(registration) {
  console.log("登録されたよ!");
});

これを含んだHTMLファイル(index.html)を置いて、localhostにサーバをたてて試してみましょう。

簡単なwebサーバならば nodejsで動作する node-web-server が便利です。

インストールは

npm install -g node-web-server

で、起動はHTMLのおいてあるディレクトリで

nws

そして起動します。

http://localhost:8080/

enter image description here

無事インストールが完了しました。

ServiceWorkerがインストールされているかは、開発者ツールでも確認できます。

Firefoxの場合は、 ツール>ウェブ開発>Service Worker または about:debugging#workers
Chromeの場合は、 chrome://serviceworker-internals/

enter image description here

ServiceWorkerにイベントを処理してもらう

fetch リクエストのハンドラをかいたので、実際にfetchを呼び出してみます。

navigator.serviceWorker.register("serviceworker.js").then(function(registration) {
  console.log("登録されたよ!");
  fetch("sample.txt");
});

sample.txtは適当に作成してください。

enter image description here

ServiceWorkerが処理していますね。

Unityで作る2Dテクスチャ組込編

0

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

Unityの中に2Dイラストを取り込みプレハブを作るまでのアレソレ

こんにちはtokinです。
Unityでは3Dだけでなく2Dゲームも簡単に作れます。しかしイラストは描けてもどのようにUnityに組み込んだらいいのでしょうか。そんなわけで今回は描いたイラストをUnityに入れ簡単なアニメーションをつけるところまでを分けて行いたいと思います。

①テクスチャを作る

enter image description here

②組み込み

enter image description here
enter image description here
enter image description here

最後に

基本的な構造はここまでですが、プレハブはコンポーネントをつけることで更に複雑な設定ができるようになります。当たり判定をつけたりSEをつけたり、また次の記事でお話しするアニメーションをつけたりなどUnityでは様々な設定をつけることが可能です。必要な要素を付け足していき、よりゲームらしいゲームを制作していきましょう。

次の記事「Unityで作る‼︎2Dアニメーション編

macのbashスクリプト上で文字列のcamelizeやunderscoreをしようとしたらperlに頼るのが楽だったこと

0

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

ruby on rails ではコントローラ名やそこで扱われるモデル名やインスタンス変数名の変換を行いたいときなど、文字列にcamelizeメソッドやunderscoreメソッドがある。 同様のことシェルスクリプト上で行おうとして探してみたところ、macのbash上ではperlを呼び出すのが楽だった。

bashでcamelizeやunderscore

rails上での String#camelize, String#underscore の例

str = 'happy_birthday_to_you!'
Str = str.camelize
 => "HappyBirthdayToYou!"
Str.underscore
 => "happy_birthday_to_you!" 
  • 環境 ruby 2.5.0 rails 5.0.6

bashでやってみる

まずはcamelize

sedを使うとできるらしい

str=happy_birthday_to_you!
echo $str | sed -re "s/(^|_)(.)/\U\2/g"
HappyBirthdayToYou!

sedで正規表現を使うことでできる。(redhat, debian)

ところがmac(Darwin)のsedではエラーになる。

str=happy_birthday_to_you!
echo $str | sed -re "s/(^|_)(.)/\U\2/g"
sed: illegal option -- r
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]

perlを使えばmacでも動く

str=happy_birthday_to_you!
echo $str | perl -pe ‘s/(|)./uc($&)/ge;s///g’

つづいてunderscore

sed使用版

Str=HappyBirthdayToYou!
echo $Str | sed -r -e 's/^([A-Z])/\L\1\E/' -e 's/([A-Z])/_\L\1\E/g'
happy_birthday_to_you!

macだとやはり同じsedのエラー

perl使用版

Str=HappyBirthdayToYou!
echo $Str | perl -pe 's/(^[A-Z])/lc($&)/ge;s/([A-Z])/_$&/g;s/([A-Z])/lc($&)/ge'
happy_birthday_to_you!

できたこととする。

macのbashスクリプト上で文字列のcamelizeやunderscoreをしようとしたらperlに頼るのが楽だったこと

0

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

ruby on rails ではコントローラ名やそこで扱われるモデル名やインスタンス変数名の変換を行いたいときなど、文字列にcamelizeメソッドやunderscoreメソッドがある。 同様のことシェルスクリプト上で行おうとして探してみたところ、macのbash上ではperlを呼び出すのが楽だった。

bashでcamelizeやunderscore

rails上での String#camelize, String#underscore の例

str = 'happy_birthday_to_you!'
Str = str.camelize
 => "HappyBirthdayToYou!"
Str.underscore
 => "happy_birthday_to_you!" 
  • 環境 ruby 2.5.0 rails 5.0.6

bashでやってみる

まずはcamelize

sedを使うとできるらしい

str=happy_birthday_to_you!
echo $str | sed -re "s/(^|_)(.)/\U\2/g"
HappyBirthdayToYou!

sedで正規表現を使うことでできる。(redhat, debian)

ところがmac(Darwin)のsedではエラーになる。

str=happy_birthday_to_you!
echo $str | sed -re "s/(^|_)(.)/\U\2/g"
sed: illegal option -- r
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]

perlを使えばmacでも動く

str=happy_birthday_to_you!
echo $str | perl -pe ‘s/(|)./uc($&)/ge;s///g’

つづいてunderscore

sed使用版

Str=HappyBirthdayToYou!
echo $Str | sed -r -e 's/^([A-Z])/\L\1\E/' -e 's/([A-Z])/_\L\1\E/g'
happy_birthday_to_you!

macだとやはり同じsedのエラー

perl使用版

Str=HappyBirthdayToYou!
echo $Str | perl -pe 's/(^[A-Z])/lc($&)/ge;s/([A-Z])/_$&/g;s/([A-Z])/lc($&)/ge'
happy_birthday_to_you!

できたこととする。

確率について考える ~期待値と実際の確率~

0

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

多くの人の身近になったガチャやドロップという存在。 それらを支配する確率について今回は考えてみる。 ※現実の福引のような引ける回数に限りがあるものはここでは考えない。

期待値について

 「1%の確率で最高レアが当たるガチャを500回引けば5枚引けそうだ」
というのが期待値である。誰でも頭では分かっているように、その期待値通りの引きになるとは限らない。1枚も引けない人もいれば、20枚引ける人もいるだろう。それでは一体どれだけの確率で最高レアが引けるのだろうか。

実際に引ける確率

 下のグラフは、最高レアが出る確率がpのとき、最高レアが1度でも引ける確率Xがいくつであるかを示している。青色の折れ線の「期待値1」とは、「p×引いた回数x=1」、つまり期待値が1となる回数分ガチャを引くことである。
enter image description here
 グラフを見れば分かる通り、pが小さいほど「1度でも引ける確率」は収束していき、期待値1では約63%、期待値2では約86.5%、期待値3では約95%となる。なんということか、期待値1になるだけガチャを引いても37%の人は引けないのである。

ガチャの天井

 ガチャでときどき見かけるのが「〇〇〇連引いたら好きなもの1つ選んでいいよ」という天井システムである。このグラフに当てはめてみれば、「救済」なのか「天井前提」なのか、透けて見えてくるかもしれない。逆に作り手側なら、考える指標の1つとして役立つグラフになるだろう。

Unityで作る‼︎2Dアニメーション編

0

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

Unityの中に取り込んだプレハブにアニメーションをつけるアレソレ

 こんにちはtokinです。
前回作った部屋の窓の外で雪が降っているようにしたいので、雪の結晶が落ちていくアニメーションを付けていきます。
前回の記事はこちら「Unityで作る‼︎2Dテクスチャ組込編

下準備

 アニメーションをつけるためにも設定するための下準備が必要です。まずモーションをつけたいプレハブのスプライトデータにAddComponentからAnimatorを付けます。次にAssetsの下にアニメーションを入れるフォルダを作成し、その中に右クリック→AnimationとAnimatorControllerを作成します。AnimatorContorollerはAnimationを動かすリモコンのようなものでAnimatorはそれをプレハブに繋げる為の組み込み口となります。
enter image description here

 次にAnimatorウィンドウを開いた状態でAnimatorを選択すると中にAnimationを組み込むことができます。ドラッグしてAnimationを繋げるとEntryからオレンジの矢印が飛び出し組み込んだAnimationをさす状態になります。アニメーションは絶え間なく再生し続けてほしいため、組み込んだAnimationを選択しInspectorに表示されるループ部分にチェックを入れましょう。
enter image description here

 ここまでの工程が完了したらヒエラルキーにあるプレハブのAnimatorの中に先ほどのAnimatorContorollerをドロップして組み込みます。これでこの組み込んだスプライトデータのアニメーションを設定することができます。
enter image description here

アニメーションを作る

さて、早速アニメーションをつけていきましょう。
 Animatorを組み込んだデータを選択した状態でAnimationウィンドウを開きましょう。ここで先ほど組み込んだAnimationデータを設定することができます。しかしこの状態ではまだ何も設定することができません。まずAddPropertyを開きます。ここでアニメーションを設定する項目を増やすことができます。
enter image description here

上下に動かす

 試しに雪が上から下に落ちるように設定します。
まず枠部分を図のように設定します。上の枠はフレーム数でアニメーションの尺を表します。アニメーションをゆっくり再生したいときは少々多めに取るなどして徐々に調整していきましょう。Sampleは1コマ何フレームかを設定できます。試しにフレーム数を150に設定しこの中にアニメーションキーを打っていきます。赤いラインを打ちたい箇所に持っていき先ほど増やした項目「Position」のY座標を記入してエンターを押すとキーが打たれます。どんなキーを打てばいいか迷ったときは、スプライトデータのPositionのXYZの文字上を長押ししながらドラッグすると値ごとスプライトデータも動くので動かしながら理想の位置を探していきましょう。
上下に動かすためにはPositionのY座標を変動させることが必要です。0フレーム目のキーを(X-0.25,Y2.97,Z-1)に、150フレーム目のキーを(X-0.25,Y-0.94,Z-1)にします。雪は夜の壁と親子関係にあるため、Z-1で夜の壁より手前に表示されるようになります。これで夜の壁をバックに上から下へ滑らかに落ちていきます。
enter image description here

回転させる

次は雪の結晶を回転させます。回転させるときはAddPropertyからRocationを追加します。
そしてRocationのZ値に0~360の値をくわえキーを打ちます。0フレーム目に(Z0)、150フレーム目に(Z360)を打つとちょうど綺麗に一回転するようになります。途中でZ値の値をずらしたキーを打てば回転に変化をつける事もできます。
enter image description here

横に動かす

最後に雪の結晶を蛇行しながら落とすようにします。先ほどの一直線に落ちていくように設定したキーの間にXを変更させたキーを入れていきます。キーを打ちたいフレームに赤いラインを持って行った状態でスプライトデータの場所を移動させるとそのままアニメーションのPosition部分にも記入されます。
アニメーションは下のCurveからも設定でき、動きの強弱にこだわりたい場合などはこちらの調整もおすすめです。これでアニメーションの完成です。
enter image description here

終わりに

SpriteStudioなど動画作成ソフトで作ったアニメーションを取り込む事も可能ですがUnityで作るとPosition,Scaleの他にカラーなど幅広く調整することができます。Unityでもぜひアニメーション制作を試してみてください。

RailsでOracle~ 導入と文字列の扱いについて

0

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

Ruby on RailsからOracleデータベースを利用する際のtipsについて紹介します

設定について

ActiveRecordでOracleを扱うには
activerecord-oracle_enhanced-adapter
というgemを使います

Gemfileには下記のように記述します

gem 'activerecord-oracle_enhanced-adapter'

config/database.ymlのアダプタの項目に下記のように指定します

default: &default
  adapter: oracle_enhanced

デフォルトではプライマリキーのシーケンスが10000から始まる(!)ようになっているので、他のDBアダプタと同じように1から始まるように変更します (参照: adapter-settings

config/initializers/oracle.rb

ActiveSupport.on_load(:active_record) do
  ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.class_eval do
    self.default_sequence_start_value = "1 NOCACHE INCREMENT BY 1"
  end
end

文字列の扱いについて

空文字列を検索しづらい件

Rails側でマイグレーション時に string と指定したカラムは、OracleではVARCHAR2型として定義されます。

Oracleに詳しい方には常識ですが、このVARCHAR2型のカラムには
「長さがゼロの文字列(空文字列)はNULLとみなされる」
という他のRDBMSと違う大きな落とし穴があります。

そのため、WHERE条件にVARCHAR2型のカラムを含める場合、カラムの値が ” の行を検索したいとき

SELECT * FROM tbl1 WHERE col1 = '';

こういうSQLを投げると、 WHERE col1 = NULL と解釈されてヒットしません。
Rails側のコードでいうと

str = ""
Tbl.where(col: str)

これがだめで、 str が ” ならば必ず nil に置き換える必要があります。

pry(main)> str = ""
=> ""
pry(main)> Customer.where(name: str).count
   (0.6ms)  SELECT COUNT(*) FROM "CUSTOMERS" WHERE "CUSTOMERS"."NAME" = :a1  [["name", ""]]
=> 0
pry(main)> Customer.where(name: str.presence || nil).count
   (0.7ms)  SELECT COUNT(*) FROM "CUSTOMERS" WHERE "CUSTOMERS"."NAME" IS NULL
=> 1

カラムがVARCHAR2の場合は ” を nil に置き換えてクエリを投げる、くらいのことはアダプタ側でやってほしいですね。

CLOB型のWHERE検索が難しい

Rails側でマイグレーション時に text と指定したカラムは、OracleではCLOB型として定義されます。

SQLレベルではCLOB型の値とVARCHAR2型の値には互換性がなく、暗黙のキャストが行われないという他のRDBMSとは異なる不便な特徴があります。

シングルクオートを使った文字列リテラルはOracleのSQL構文においてVARCHAR2型の値となるため、CLOB型のカラムをWHERE条件に指定しようとすると、SQLエラーになります。

pry(main)> Customer.where(memo: 'hoge').to_a
  Customer Load (2.0ms)  SELECT "CUSTOMERS".* FROM "CUSTOMERS" WHERE "CUSTOMERS"."MEMO" = :a1  [["memo", #<OCI8::CLOB:0x00558008772008>]]
ActiveRecord::StatementInvalid: OCIError: ORA-00932: データ型が一致しません: -が予想されましたがCLOBです。: SELECT "CUSTOMERS".* FROM "CUSTOMERS" WHERE "CUSTOMERS"."MEMO" = :a1

試行錯誤の末、こういう式で通るようになりましたが、当然ながらインデックスは効きません。

pry(main)> Customer.where('DBMS_LOB.SUBSTR(memo,1000,1) = ?', 'hoge').to_a
  Customer Load (5.5ms)  SELECT "CUSTOMERS".* FROM "CUSTOMERS" WHERE (dbms_lob.substr(memo, 1000, 1) = 'hoge')
=> [#<Customer:0x0055800a7de210 (後略

まとめ

RailsからOracleデータベースを利用する場合、文字列の扱いなど他のRDBMSにはない特殊な特性を把握して、注意しながらコーディングしていく必要があります。
「こう書けば普通に動くだろう」という予断を置かず、実際にこまめに実験して想定通りの結果が得られることを確認しながら進めていきましょう。

次回はOracle Textを使った日本語全文検索など、高度なトピックについて触れていく予定です。

日本語URLをデコードすると空白文字の扱いに困った

0

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

こんにちは。いくたです。

以前、ブログなどの更新情報をキャッチしてtwitterやslackに投稿するボットを作ったのですが、ひとつ問題が生じました。
それは空白文字を含むURLのデコード問題です。

エンコードとデコード、どっちがどっちだっけ?

よく、どっちがどっちか分からなくなるのでおさらいです。

こんにちは。いくたです。
 ↓ エンコード
%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%82%E3%81%84%E3%81%8F%E3%81%9F%E3%81%A7%E3%81%99%E3%80%82
 ↓ デコード
こんにちは。いくたです。

空白文字を含むURLをデコードすると…

日本語URLはそのページの内容が推察できるので好きなのですが、エンコードされていると長い暗号のような見た目になってしまいます。そのため日本語URLが含まれそうな場合には、デコードの処理を積極的にしています。
しかし、空白文字を含むURLをデコードすると少々問題があるようです。

例えば、Dorubyのこの記事のURL(https://doruby.jp/users/kurokawa/entries/番外編 「子供がスマホを持つことについて」)は全角スペース” ”を含むため、日本語のURLにデコードしたしたものをそのままslackに投稿すると…

before.png

このように、スペースのところでURLが途切れてしまっています。このままリンクをクリックすると存在しないページhttps://doruby.jp/users/kurokawa/entries/番外編に飛んでしてしまいます。

自作のボットではRubyのURIモジュールからdecode_www_form_componentメソッドを使ってデコードしています。詳しいメソッドの使い方はリファレンスを参考にしてください。

2.4.1 :001 > require 'uri'
 => true
2.4.1 :002 > URI.decode_www_form_component("%E3%80%80")
 => " "

全角スペースだけをエンコードされた文字に変換

decode_www_form_componentメソッドを使ってデコードするときに全角スペースだけはデコード対象から除外するようにすれば、今回の問題は発生しません。しかし、除外するいい方法が見つからなかったので、デコードした後で全角スペース” ”だけをエンコードされた文字%E3%80%80に置き換えました。
(だいぶ力技なのでもっとスマートな方法があれば教えていただきたいです…)

require 'uri'

url = "https://doruby.jp/users/kurokawa/entries/%E7%95%AA%E5%A4%96%E7%B7%A8%E3%80%80%E3%80%8C%E5%AD%90%E4%BE%9B%E3%81%8C%E3%82%B9%E3%83%9E%E3%83%9B%E3%82%92%E6%8C%81%E3%81%A4%E3%81%93%E3%81%A8%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%80%8D"
decode_url = URI.decode_www_form_component(url)
# => "https://doruby.jp/users/kurokawa/entries/番外編 「子供がスマホを持つことについて」"
safe_url = decode_url.gsub(/ /,"%E3%80%80")
# => "https://doruby.jp/users/kurokawa/entries/番外編%E3%80%80「子供がスマホを持つことについて」"

これで全角スペースのみエンコードされたURLを投稿することができ、正しいリンクで投稿することができました。
https://doruby.jp/users/kurokawa/entries/番外編%E3%80%80「子供がスマホを持つことについて」

after.png

半角スペースとタブ文字もエンコード文字に変換

デコードしたURLが途中で途切れてしまう現象は半角スペース” “やタブ文字”\t”でも現れます。それぞれエンコード文字に置き換えるメソッドを作りました。

require 'uri'

# 全角スペース/半角スペース/タブ文字をエンコード文字に置き換え
def gsub_space(url)
  url.gsub(/ /,"%E3%80%80").gsub(/ /,"%20").gsub(/\t/,"%09")
end

url = "https://doruby.jp/users/yamana/entries/%09-Photoshop%E3%81%AE%E4%BE%BF%E5%88%A9%E6%A9%9F%E8%83%BD%E2%91%A1"
decode_url = URI.decode_www_form_component(url)
# => "https://doruby.jp/users/yamana/entries/\t-Photoshopの便利機能②"
safe_url = gsub_space(decode_url)
# => "https://doruby.jp/users/yamana/entries/%09-Photoshopの便利機能②"
tab.png

一部分だけエンコードされたURLについて

ブラウザによっては一部分だけエンコードされたURLを受け付けないかもしれません。chromeとsafariでは受け付けてくれたので、最近のブラウザなら問題なく処理してくれそうではあります。

そもそも「一部分だけエンコードされたURL is ちょっと気持ち悪い」という意見もあるようです。うーん…確かにちょっと気になるかも…
時間のあるときにslackのIncoming Webhooksの仕様を読み込んでタイトルのテキストリンクとして投稿する方針に転換してもいいかもしれません。

まとめ

今回のような問題があるのでURLをエンコード/デコードをする際は空白文字に気を遣う必要がありそうです。

それでは、今日はこの辺で。
読んでいただき、ありがとうございました。

火を出す能力について考える

0

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

今回はファンタジー等でよく出てくる、火を扱う能力について考えてみたいと思います。

火を出す能力の特徴

 ファンタジー等で扱われている、火を出す能力の大まかな特徴は、
・体や体の一部から、または魔法などで火を発生させる
⇒自分が火になるわけではない(※火になる能力もありますね)
・水に弱い(消される、能力が発動しない)
ということになります。

火って何?

 そもそも火とは何か考えます。火は一言でいうと、物が酸素と激しく反応している現象です。詳細には、可燃物が光や熱を放出しながら、急激な酸化反応(酸素と結びつく反応)を起こす現象です。
 可燃物が燃え続ける条件について調べてみますと、
①燃料が燃えるのに十分な温度
②酸素
③次に燃える燃料
の3つが必要であることが分かりました。

火を出すには…

 水によって火が消されてしまう理由は、「水によって急激に熱が奪われることで、燃えるための温度に届かなくなってしまうこと」が原因です。
 物が一度燃え始めると、燃えることによって放出された熱で、次の燃えるために必要な温度に達し、連続して燃え続けられます。つまり、
十分な温度になる→燃える→発熱する→次のものが燃える→…
といったサイクルを繰り返して燃え続けています。
 従って、水に弱い能力者は熱を出すこと自体はできていないことが分かります。
 よって、水弱点の火の能力者が行っていることは、
①燃料を用意し、何らかの方法で発火させる
②燃料を供給し続ける
の2点であることが分かります。

人が火を出すための燃料

 次は人が出せる燃料について考察していきます。私が燃やすと聞いてすぐ思い浮かんだのは「体脂肪」です。調べてみましたところ、体脂肪が持っている特徴は
・体脂肪⇒水2割+脂肪8割
・脂肪1kg=7200kcal
・引火点は約400度程度
cal(カロリー)は1calで1gの水を約1度上昇させる熱の単位ですので、脂肪1kgでは、『0度の水72リットルを100度まで上昇させる熱量』となります。脂肪とはすさまじい熱量を秘めていますね。また、引火点の温度ですが、ライターの火花などは1000度にも達するそうなので、これらを使って引火させれば大丈夫そうです。

人が出せる火のパワーは?

 上記の試算は脂肪1kg当たりの話でした。では、一般的な人ではどのぐらいのパワーになるのでしょうか。「体重60kg、体脂肪率20%」の人の場合、体脂肪の2割は水でしたので、単純な脂肪の量は、
脂肪:60kg×20%×80%=9.6kg
これを全部熱に変換できた場合、実に最大700リットルもの水を沸騰させることが出来る、ということになります。
 あとは、脂肪を自在に体外へ放出&引火させることが出来れば、火使いの仲間入りです。普段はにっくき体脂肪ですが、自在に操れたら強力な能力者に成れそうですね。

おまけ①:水を出す能力について

 火の天敵として君臨する水を出す能力についても考えてみましょう。
 体内の水を利用して放出する場合について考察します。人は体重と比べて2%の重さの水を失うだけで、ひどく喉の渇きを覚えるそうです。さらに、体重の10%以上の水を失うと危険な状態で、死に至る場合もあるそうです。従って、人が放出できるギリギリの水分量が約体重の10%程度となります。
 つまり、体重60kgの人が出せる水は6kg=6リットルということになります。2%程度である、1.2リットル以下までであれば、比較的安全に利用できそうです。脱水症状には十分注意して使用してください。

enter image description here

火と水が戦ったら
前述のとおり、
火:最大700リットルまで沸騰させられるパワー
水:最大6リットル程度の放出
となり、人間同士が戦う上では火の能力の方が圧倒的に強そうですね。

おまけ②:ほかの火の出し方

 人が放出している可燃性のものと言えば、「屁」ではないでしょうか。調べてみましたところ、人が1日に出している屁は、体積にしておよそ1リットル程度であり、そのうち90%は空気中から取り込んだ、酸素や窒素等の気体のようです。
 仮に、残りの1割が全て可燃性ガスの「メタンガス」であるとしましょう。メタンガスは都市ガス等で日常的に用いられているガスの主成分であり、屁にも含まれているようです。
・メタンガスの熱量:9000kcal/m3
・1リットル:0.001m3
人間が出すメタンガス:0.1リットル⇒0.0001m3 ⇒ 900cal
ということで、コップ半杯程度の水100gの温度を9度上昇させることが出来る程度の熱量になります。これで戦うのは厳しそうですね。

終わりに

 今回は現実の人が火を扱う能力者になれる可能性について考えてみました。私はすでに燃料は十分蓄えているので、後は脂肪を自在に操る能力を身につけたいものです。
※放火は犯罪です。火の取り扱いには十分注意してください。

Photoshopの便利機能②

0

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

はじめに

こんにちは。
前回に引き続きPhotoshopの便利機能をご紹介します。

素早く選択範囲を切り取り・複製する方法

作業データの一部を切り取りたい時、編集からコピーペーストするよりもサクッとできす。
なげなわツールで切り取りたい部分を選択>右クリック>選択範囲をカットしたレイヤー
を選択すると素材の位置はそのまま新レイヤーに移動することができます。

enter image description here

同様の作業から選択範囲をコピー選択すると同じ内容を複製できます。

・目的のレイヤーを一発で探す方法

多くのレイヤーを使用しているとどれがどのレイヤーか分からなくなることがありませんか?
いちいちレイヤーデータから目的のものを探すのも作業効率が悪くなります。

enter image description here

例えば並んでいる素材の一番奥のレイヤーを探すには、作業画面中の目的の素材にカーソルをあてたまま“Vキーを押した後、Altを押して右クリック”
をするとクリックした素材のレイヤーが選択されます。

簡単に素材の色変更する方法

マスク機能を使い素材の一部分だけ色彩変更したい場合などに使えます。
クイック選択ツールで変更したい部分を選択します。
レイヤータブの下にある丸い絵の“塗りつぶしまたは調整レイヤーの新規作成”を
クリックし色相・彩度にします。

enter image description here
enter image description here

そうすると、バーが表示されレイヤーにマスクがかかります。
変えたい色相にバーを動かし調整することができます。

enter image description here
enter image description here
enter image description here

最後に

現場作業をしていると知らなかった機能や裏技など得られる機会が多く
一つ覚えておくと役に立つ機能がたくさんあります。
最適な環境で作業効率をあげていきましょう。

【tmux】1つで複数のターミナルを操作する

0

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

tmuxの基本的な操作方法について簡単にまとめました。

地元では見たことない大雪にワクワクしていたものの、想像を超える寒さで最近朝が辛いBe82Mです。
業務で使用した際に調べたり使ったりしたものを、備忘録としてまとめようと思います。
 

tmuxとは?

ターミナルマルチプレクサ、つまり画面1つで複数のターミナルを操作することができます。
1つの端末で画面分割することもできれば、タブを作成することもできます。
 

事前知識

使うにあたって必要な予備知識です。

  • session tmuxの接続先を指します。
  • window 名前の通りウインドウです。タブと同じような扱いになります。
  • pane 1つのウインドウ内にある分割領域を指します。  

起動する

インストールはbrew等で出来ます。
環境に合わせてインストールを行ってください。
インストールが終わったら、tmux new -s [session名]でセッション作成、起動ができます。
以前に作成したセッションに接続する場合はtmux a -t [session名]と叩けば再接続が可能です。
 

基本的なコマンド

tmuxのコマンドを使うときのバインドキーはデフォルト設定の場合control-bです。
バインドキーをカスタマイズすることも可能ですが、それは後に記述します。
(以下コマンドの説明ではバインドキーを[bind]と表記します。)
ウインドウ、ペイン、セッション各々の操作方法に分けて説明します。

  • window
    ウインドウを追加すると、ウインドウ名と数字が割り当てられ、ターミナル下部に表示されます。
    [bind] + c 新しいウインドウを作成する
    [bind] + & 現在のウインドウを破棄する
    [bind] + n 次のウインドウに移動する
    [bind] + p 前のウインドウに移動する
    [bind] + [数字] 指定した数字のウインドウに移動する
    [bind] + , 現在のウインドウの名前を変更する
     
  • pane
    ペインを追加すると、現在のウインドウが分割され、1画面で複数のターミナルを操作できます。
    [bind] + % ペインを左右に分割する
    [bind] + ” ペインを上下に分割する
    [bind] + x 現在のペインを削除する
    [bind] + o ペインを移動する
    [bind] + ! 現在のペインをウインドウ化する
     
  • session
    起動時のコマンドは先ほど説明しましたが、以外のコマンドは以下の通りです。
    [bind] + d 現在のセッションからデタッチする
    [bind] + $ 現在のセッションの名前を変更する
     
    tmux ls セッション一覧を表示する
    tmux kill-session セッションを削除する
    tmux kill-session -t [session名] 現在のセッションを削除する
    tmux kill-server セッションを全て削除する
    tmux rename -t [旧session名] [新session名] セッションを削除する
     

カスタマイズ

tmux専用の設定ファイル~/.tmux.confを書き換えます。
set -g prefix C-a バインドキーをcontrol-aに変更する
unbind C-b control-b(デフォルト)を解除する
他にも色々設定できるようですが、これくらいしか使ったことないので割愛します。
 

最後に

正直、業務で必要になったときに初めて使ったので、かえってやり辛かったです。
次使用するときにはコマンドをちゃんと記憶しておきたいです。

ActiveSupport::Cache::StoreとMarshalの話

0

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

RailsGuideではどんな情報でもキャッシュに保存できると豪語してますが誤りです。何でもはキャッシュできないわよ、Marshal.dumpできるobjectだけ。

はじめに

お久しぶりです、くろすです。
突然ですが、皆さんは日常生活で

「あ〜〜この情報キャッシュしておきたい〜〜〜」

と思ったことはありませんか?

私はあります。
ライブ中のセトリ順なんか脳内メモリにキャッシュしといて打ち上げ中に引っ張り出したいです。
だいたい書き込みに失敗して、他の人がメモ帳という名の外部記憶媒体に記録したものが検索に引っかかるまで待ってます。

この待ち時間って無駄ですし、その間にも話をしたいわけです。
そんな時にはこのモジュール

ActiveSupport::Cache::Store

Railsでアプリケーション層のキャッシングを考える場合は一考の余地があります。
RailsGuideの低レベルキャッシュ の部分で説明されている Rails.cacheの正体です。
もう少し詳しくいうなら ActiveSupport::Cache::Store を継承した MemoryCacheStore やFileCacheStore 等が正体になります。
キャッシュの詳しいパフォーマンスなんかは RailsGuideキャッシュストアの項 や 少し古いですが、 Railsキャッシュの完全ガイド記事 が参考になります。

MemoryStoreなら各プロセス単位、FileStoreなら各ホスト単位、 redis-storeや readthis などを使用するなら中央集権的にredisでキャッシュすることも可能で高速化の幅が広がります。

どんな情報でもキャッシュできるわけではない

そもそもRubyを使った際のオブジェクトのコピーには浅深があります。
コピーについての詳しい話は先達の記事がありますので こちら
ここで紹介されている Marshal.dump ですが、リファレンスにある通り名前のついていないClass/Moduleオブジェクトなど数種類のオブジェクトは書き出せません。
普段はあまり意識しなくても問題ないでしょうが、私はRedisにProcのインスタンスを保存しようとした際にハマりました。
というのも、上で紹介したActiveSupport::Cache::Storeは書き込みの際にオブジェクトをマーシャルデータで書き出してるんですね。
ということはRails.cacheでキャッシュできるオブジェクトというのはその実、Marshalモジュールでマーシャルデータを作成することができるオブジェクト、つまりディープコピーできるオブジェクトということなのですね。

実際、キャッシュストアに実データを投入する部分のソースを見てもその通りだとわかります。

CacheStoreを使う際の注意点

ActiveSupport::Cache::Storeはオブジェクトをキャッシュするという点に気をつけなければなりません。
例えばActiveRecordなんかは賢いので、実データが必要になるまでクエリを吐きません。
以下のように、思った通りキャッシュされなくて結果クエリの数は減らず高速化には繋がらない、みたいなこともあります。

players = Player.where(id: 1..100);
players.class
# => Player::ActiveRecord_Relation
memory_store = ActiveSupport::Cache::MemoryStore.new;
memory_store.write('players', players)
# => true
players2 = memory_store.read('players');
players2.class
# => Player::ActiveRecord_Relation
players2.map(&:name) # ここで初めてクエリが飛ぶ

終わりに

redisに値をキャッシュする場合なんかは、コードから剥き出しのredisを触りに行かなくても、RedisStoreやReadthisStoreを使いキャッシュとして触った方が、キャッシュ先を手軽に変更できる等のメリットがあります。
直にredisを触る場合と比べての速度の問題は未検証ですが、個人的には#fetchexpires_inの使い勝手がいいのでキャッシュストアを使いたいです。

番外編 「子供がスマホを持つことについて」

0

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

番外編 「子供がスマホを持つことについて」について話していきたいと思います。

みなさんこんにちは、Lionです!今日は番外編と題して「子供がスマホを持つことについて」話していきたいと思います。
実は、私自身が子供にスマホを持たせるのは良くないと思っています。特に小学生以下に持たせているのは度し難いですね。
その理由を書いていきたいと思います。

善悪がきちんと理解できていない子供に渡すべからず

もうこれに限りますね。スマホってすぐ簡単に色々な情報を入手できるんですよね。いい情報ならいいんですが使い方を間違えれば、悪い情報もたくさん出てきます。
例えば、今流行りのYoutubeがいい例ですね。面白くて良い動画がたくさんある反面、子供に悪影響を及ぼすような動画もたくさんあります。
それを善悪が区別できない子供に見せると「自分も真似してみよう!」と取り返しのつかないことが多くなります。
自分が傷つくこともあれば、他人を傷つけることもあるかもしれません。そのため、善悪がきちんと分けれない子に持たすのはやめるべきかなと思います。

スマホ育児はやめましょう

最近、このスマホ育児という言葉を耳にすることも多いのではないでしょうか?
家事で面倒を見る時間がないからスマホを渡しておとなしくさせておくといった育児方法です。
賛否両論あると思いますが、「私的には良くない」と思っております。理由としては

①小さい子の目が悪くなる
成長途中の子供にスマホ画面を見せ続けることは、視力低下につながるためお勧めできません。

②コミュニケーション能力が落ちる
親としゃべるようなしぐさをせず、黙々とスマホを弄って育った子供はコミュニケーション能力が低下する傾向があります。
子供は黙ってスマホを弄るので親子での会話が極端に減ります。

③運動不足になる
スマホを弄って遊んでいると、身体能力が著しく低下したり体力が減少するといった悪影響が心配されますね。
日中は一緒に散歩したりするだけでもいいので、運動をさせないと夜に中々眠くならずに睡眠不足になり成長促進の妨げになります。

④興味の幅が広くならない
テレビとは違い、スマホは自分のほしい情報を好きなときに得ることができます。なので、好きな情報ばかりを調べ、それで遊んでしまうと他の興味にたいする好奇心が低下します。
これにより、コミュニケーションのきっかけも少なくなってきます。

ここまで話してみて

いかがだったでしょうか?子供にスマホを持たせるのは楽な反面、子供に悪影響が及んでいる場合があります。
なので、「スマホを渡すな!」とまでは言いませんが、せめて一日30分とかにしましょう。
そして、なるべく他の遊びや外で遊ぶ癖をつけさして感受性豊かな子に育ててほしいなと思います。

ちなみに私の父親は、私がデジタル機器(ゲーム機やパソコンなど)で遊んでいるのを好まなかったので、キャッチボールや散歩、沢山の知らない面白い場所に連れて行ってくれたりなどしてくれました。
今に思えば感謝しかありません。

今育児に奮闘している方々、せめて一緒にパズルしたり外でおにごっこしたりなどしてもっと子供とコミュニケーションをとってもらえると嬉しいです。

では!また違う記事で会いましょう(≧◇≦)ノシ

最近人気な記事