ホーム ブログ ページ 24

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分とかにしましょう。
そして、なるべく他の遊びや外で遊ぶ癖をつけさして感受性豊かな子に育ててほしいなと思います。

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

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

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

第8回「必勝?!筆者独自の就活術」

0

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

第8回「必勝?!筆者独自の就活術」について話していきたいと思います。

みなさん!遅めですが、あけましておめでとうございます!Lionです。
前回の記事いかがだったでしょうか?
筆者から見た「 今年はやりそうなゲームはVRゲームじゃないか!?」というのが少しでも伝わりましたら、嬉しいです!
さて、本日は「必勝?!筆者独自の就活術」について話させていただきます。
※あくまで筆者の考え方なので、参考程度でお願いします

個別の会社説明会に赴こう!

大型の就活イベントに参加するより、個別の会社説明会に行く方が、よりその会社の細かい情報を手に入れることができます。
その理由が以下の3点です。

①長時間、その会社についての説明を聞くことができる

②説明会後に、個別で社員さんと話ができる

③顔を覚えてもらえるチャンスがある

というところでお勧めします。
筆者も会社が行っている個別の説明会ばっかりいっていました。
そのため、より自分の知りたい部分を細かく聞くことができるので非常に勉強になりました。
また、分からないところを後でじっくり聞くこともできるのもメリットですね!

また、大型の就活イベントとかですが、「自分がまだ何を仕事にしたいのかわからない」「どんな仕事があるんだろう?」など、まったく定まってないくらいなら、今後の就活の何かしらのきっかけにはなるかもしれませんね。

自分だけの面接方法を編み出しメンタルを強くしろ!

これは、結構難易度が高いです。たぶんですが、就活を頑張っている学生さんは「学校の機関の面接対応講座」とかに参加しているのではないでしょうか?
もちろん、全然OKです。むしろ行ってるだけとても偉いと思います。
しかし、それだけでは面接というのは受かりません。
ではどうすればいいか?それは簡単です。
実際に会社を受けまくるのです。特に本命の会社がもう見定めている方は、それまでにたくさんの会社を受けるとなお良いでしょう。
では、自分だけの面接方法とは?という部分ですが、面接講座などは基本的なことを教えてくれますよね?受け答えの仕方や礼儀など。そこに自分をアピールする部分を組み込むのです。
面接官はプロです。そのため、学校などで対策した程度のテンプレ解答などしても何も評価してくれません。
そのため、自分の得意なことや自分の面白い部分を全面的に相手に伝えるのです。自分はこんなに面白い人間だぞー!優秀な人間だぞー!とアピールをしまくるのです。特に自信満々にドヤ顔でやるくらいがちょうどいいです。
この度胸を習得するためには、当たって砕けろ!精神で沢山会社を受けてみるといいです。
ちなみに筆者はこのような感じのフローを繰り返していました。

①会社の面接を受けに行く
②面接後に質問された内容と自分が解答した内容をを瞬時にメモ
③そこから自分らしさが足りていたかどうか採点する
④友人に面接官をしてもらって練習
⑤次の会社へ

となります。
ちなみに学校機関の面接対応講座とかは1回も使ったことがありません(笑)
実体験することが、成長につながるので恐れずチャレンジしてみてください!

会社説明会の履歴書提出時に差をつけろ!

これは、大きく効果があります。
やることは簡単です。離席書提出時に別資料で「自分のアピール資料を1枚添えるだけ」です。
これだけです。自分はこれで、色々な会社ですぐに次の日に面接の予定が入りまくりました。

例えばで話しますが、ゲーム会社に入りたいのでしたら、「過去に自分が作ったことがあるゲームの実績」を一枚添えるだけで印象が大きく変わります。履歴書にも書いてるかもしれませんが、もっとわかりやすく具体的に伝えれる資料があると、「お!この子はやる気があるな!」と一目おいてもらえることが多いです。

このように会社が提出してください!っていうだけのもの以外で「自分の良さを最大限アピールした資料」なども添えると良い印象をもらえるでしょう。

ここまで話してみて

いかがだったでしょうか?筆者のやり方が少しでも就活の参考になったら幸いです。
さて次回は「第9回 就活の時にやっちゃいけない3つの事柄」をお話しします。
まぁ…恥ずかしいですが皆様の何かしらのためになるなら喜んで書きます!
では、就活生の諸君!絶対インフルエンザにならないようにきちんとした生活をおくって就活頑張ってください(/・ω・)/

VPNに触れてみる〜その2〜

0

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

VPNとは何ぞ、から実際につなげてみるまで。今回はVPN接続のうち、CUIのVPNクライアントを利用したお話。

はじめに

1回目の記事ではVPNの伝送方式について、2回目の記事ではIPSec/L2TPとWindowsでのVPNクライアントの利用方法を紹介しました。
今回はWindows以外でのVPNクライアントの利用方法について紹介します。

準備

・WindowsのVPNクライアントの時と同じくユーザ名、対応するパスワード、サーバ情報(アドレスとポート番号)、及び各種VPNで指定された設定
makeを実行できる環境設定(Makefileが用意されているので、このファイルからmakeコマンドでvpnclient及びvpncmdのバイナリファイルを生成する必要があります)
・TUN/TAPのインストール
・VPNクライアントのダウンロード(リンクはこちら)
本記事では(Ver 4.20, Build 9608, rtm)を利用しています。

またVPNサーバを介して、IPのグループが違うネットワークへ接続する場合(VPNサーバと接続先のIPがサブネットマスク部分で異なる場合)は、サブネットマスクやDNS、ドメインに注意が必要です。

・接続先のIPアドレス(接続先が同じIPアドレス群であれば、xxx.xxx.xxx.0/24等でも可)
・DNSサーバ(ホスト名解決を行う必要がある場合、上記に加えて必要。ドメイン名がある場合、そちらも合わせて必要になります。)

1.VPNクライアントを展開し、任意の場所におきます。ターミナルでそのフォルダへ移動後、makeを実行します。
make実行時にライセンス等の規約について確認されますが、問題なければすべて1を入力して実行を続けます。

$ make

実行結果
--------------------------------------------------------------------

SoftEther VPN Client (Ver 4.20, Build 9608, Intel x64 / AMD64) for Mac OS X Install Utility
Copyright (c) SoftEther Project at University of Tsukuba, Japan. All Rights Reserved.

--------------------------------------------------------------------


Do you want to read the License Agreement for this software ?

 1. Yes
 2. No

Please choose one of above number: 

〜省略〜
正常処理された場合に表示される
--------------------------------------------------------------------
The preparation of SoftEther VPN Client is completed !


*** How to switch the display language of the SoftEther VPN Client Service ***
SoftEther VPN Client supports the following languages:
  - Japanese
  - English
  - Simplified Chinese

You can choose your prefered language of SoftEther VPN Client at any time.
To switch the current language, open and edit the 'lang.config' file.


*** How to start the SoftEther VPN Client Service ***

Please execute './vpnclient start' to run the SoftEther VPN Client Background Service.
And please execute './vpncmd' to run the SoftEther VPN Command-Line Utility to configure SoftEther VPN Client.
Of course, you can use the VPN Server Manager GUI Application for Windows on the other Windows PC in order to configure the SoftEther VPN Client remotely.
--------------------------------------------------------------------

2.vpnclientとvpncmdが作成できたら、以下のコマンドで実行します。

$ sudo ./vpnclient start

実行結果
The SoftEther VPN Client service has been started.

3.以下のコマンドと作業を行い、CUIの管理画面に入ります。
./vpncmdを実行し、「1 – 3 を選択」で2を選択→「接続先のホスト名またはIPアドレス」では、入力せずエンターでokです。(localhostへ接続します)
ここで3を選択した場合はVPNが十分動作できるかどうか検査することができます。事前に確認しておきましょう。

$ ./vpncmd
vpncmd コマンド - SoftEther VPN コマンドライン管理ユーティリティ
SoftEther VPN コマンドライン管理ユーティリティ (vpncmd コマンド)
Version 4.20 Build 9608   (Japanese)
Compiled 2016/04/17 21:59:35 by yagi at pc30
Copyright (c) SoftEther VPN Project. All Rights Reserved.

vpncmd プログラムを使って以下のことができます。

1. VPN Server または VPN Bridge の管理
2. VPN Client の管理
3. VPN Tools コマンドの使用 (証明書作成や通信速度測定)

1 - 3 を選択: 2

接続先の VPN Client が動作しているコンピュータの IP アドレスまたはホスト名を指定してください。
何も入力せずに Enter を押すと、localhost (このコンピュータ) に接続します。
接続先のホスト名または IP アドレス: 

VPN Client "localhost" に接続しました。

VPN Client>

これでVPNクライアントの管理ができるようになります。
設定を中断するためにとCtrl+Cを押すと脱出してしまうため、実行に注意しましょう。また脱出コマンドはexitになります。

4.仮想NICを作成します。Windowsの時もそうでしたが、仮想NICがないと接続できません。
以下のコマンドを入力し、指示に従って作成します。

VPN Client>NicCreate
NicCreate コマンド - 新規仮想 LAN カードの作成
仮想 LAN カードの名前: VPN    

コマンドは正常に終了しました。

作成後、NicListでMacアドレスを確認しておいてください。(後で確認の意味で利用します)

5.接続用のアカウント情報を作成します。ユーザ名や接続先のアドレスを聞かれるので順次入力します。

VPN Client>AccountCreate
AccountCreate コマンド - 新しい接続設定の作成

# この名前は接続時に利用します
接続設定の名前: VPNniTsunagitai

接続先 VPN Server のホスト名とポート番号: xxx.xxx.xxx.xxx:443(対象サーバのIP)

接続先仮想 HUB 名: VPN

接続するユーザー名: exampleVPNAccount

使用する仮想 LAN カード名: VPN

コマンドは正常に終了しました。

6.パスワードを入力し、接続します。間違えて入力した場合ですが、Ctrl+hで削除できます。(deleteのみで削除しようとしてもできません。またShift+deleteでも削除可能です。)ただし、矢印キーは利用できません。

> AccountPasswordSet {AccountCreateで入力した接続名}
接続名を省略した場合は、AccountPasswordSet 実行後に聞かれます。

実行例
VPN Client>AccountPasswordSet
AccountPasswordSet コマンド - 接続設定のユーザー認証の種類をパスワード認証に設定
接続設定の名前: VPNniTsunagitai # コマンド入力時に接続設定名を引数に記述している場合は表示されません

パスワードを入力してください。キャンセルするには Ctrl+D キーを押してください。

パスワード: **************
確認入力  : **************


standard または radius の指定: standard

コマンドは正常に終了しました。
パスワード設定後
VPN Client>AccountConnect
AccountConnect コマンド - 接続設定を使用して VPN Server へ接続を開始
接続設定の名前: VPNniTsunagitai

コマンドは正常に終了しました。

切断時
VPN Client>AccountDisConnect
AccountDisconnect コマンド - 接続中の接続設定の切断
接続設定の名前: VPNniTsunagitai

コマンドは正常に終了しました。

さて、この6の手順ですが、接続実行またはvpncmdを終了するたびに入力したパスワードが削除されます。一方で、何らかの原因で自動的に再接続を行う場合は再度聞かれることはありませんが、仕様として存在しているようなので覚えておきましょう。

7.次の状態になっていれば接続成功です。

VPN Client>AccountList
AccountList コマンド - 接続設定一覧の取得
項目               |値
-------------------+--------------------------------------
接続設定名         |VPN
状態               |接続完了
接続先 VPN サーバー|xxx.xxx.xxx.xxx:443 (直接 TCP/IP 接続)
仮想 HUB 名        |VPN
仮想 LAN カード名  |VPN
コマンドは正常に終了しました。

これで接続までできました!

IP設定

ここからはvpncmdの外の作業になります。

1.以下のコマンドを入力し、前手順1で確認したMacアドレスがあるかどうか確認します。(通常tun/tapに付与されます)

$ ifconfig

2.IPが割り振られていない(inetの行がない)ので、DHCPで取得します。できないものに関しては自力で設定することになります。
割り振り先は、他に利用していなければtap0になっていると思います。tap0でない場合は自身の環境に合わせて読み替えてください。

$ sudo ipconfig set tap0 DHCP
実行後
$ ifconfig
で確認(付与されるまでに時間がかかる場合があります)
169.254〜のような場合は取得できていません

これでIPが取得できれば、ひとまず完了です。

ルーティング設定

さて、上記の手順を行っても接続できないことが多いことと思います。ここからはルーティングの設定になります。

$ netstat -nr

実行結果(一部削除等をして省略しています)
Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
# 自身のネットワークのdefault
default            xxx.xxx.xxx.1      UGSc          174        0     en4
# VPNサーバのdefault
default            yyy.yyy.yyy.1    UGScI          16        0    tap0
yyy.yyy.yyy/24     link#              UCS             1        0    tap0
# VPNサーバから割り当てられたIPアドレス
yyy.yyy.yyy.yyy/32 link#              UCS             2        0    tap0
yyy.yyy.yyy.1/32 link#              UCS             2        0    tap0
yyy.yyy.yyy.1    link#              UHLWIir        17        0    tap0

defaultが2つに増えていますが動作します。削除すると逆に動作しなくなるため注意してください。一方で、削除しないといけないケースもあるらしいですが、自分の環境では削除すると動作しませんでした。
どうしても削除する場合は、VPNクライアントで設定した接続先のIPを登録しておくと良いようです。しばらく接続失敗や切断された旨のログが出ますが時間経過で解消されるとのこと。(自身の環境では延々切断ログが流れてうまく行く気配がありませんでした。)

1.ルーティングの設定を行います。
接続先のIPアドレスと、対応するデフォルトゲートウェイをルーティングに追加します。

$ sudo route add {接続先のIPアドレス、あるいは一部省略したもの} {接続先のデフォルトゲートウェイ}

実行例
$ sudo route add zzz.zzz.zzz.0/24 yyy.yyy.yyy.1
$ sudo route add zzz.zzz.zzz.zzz/32 yyy.yyy.yyy.1
zzz.zzz.zzz.zzzは接続したいサーバのIP
yyy.yyy.yyy.1は割り当てられたVPNサーバのデフォルトゲートウェイ

IPアドレスで作業するのであればこの時点で完了です。

2.ホスト名解決する場合はDNSサーバもルーティングに加えます。
その上でネットワークの設定から、普段利用しているネットワークのDNSサーバ設定に対応するIPとドメインを追加します。この際、優先度を上げるため一番上に持ってきておきます。

hostConfig Image

これでホスト名を用いての接続が行えるようになります。(設定してすぐの時はホスト名が使えないことがありますが、そのうちつながります。)DNSサーバに問い合わせられるかはnslookupコマンドで確認しておきましょう。
ちなみに、VPNクライアントを停止する(接続を完全に切断する)と入力したルーティングが削除されますので注意してください。(削除されるのは、この例ではtap0に関連するルーティングです。)

余談

Windowsでは接続した際に、接続先のネットワークに依存するため、接続先から外部のネットワークへの接続を制限している場合は、外部への通信を伴う操作ができなくなります。一方でMacで実行した時は、今回の設定方法ではVPN側と外向けの2つのネットワークを保持したままになるため、接続中であっても外部webのブラウザ閲覧等行うことができました。

最後に

Windowsのクライアントだと自動でネットワークごと調整してくれる一方で、CUI側は自力で設定しないといけないため、すぐに利用できない上に何が抜けているのかわからない点で苦労しました。ルーティング設定にしても何を書けばいいのか、最初分からなかったのですが、その辺の知識を持っている方であればおおよそ推測はつくのでしょうね…。
提供元も「Linuxのサポート」にて『非常に詳しい知識をお持ちの方のみが』と書かれているため、基本的にWindows以外での接続はお断りの印象を受けました。(個人で利用する分にはWindows所持者が多いはずなので十分だと思います。)

知っている人であればあまり難しくないのでしょうが、知らない人にとっては接続までが大変な印象を受けました。


関連:
softether VPNのダウンロード
VPNに触れてみる〜その0〜
VPNに触れてみる〜その1〜

【Googleデータポータル最新情報】表やグラフのソートが便利に!

0

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

Googleデータポータル使ってますか?Googleが日々更新しているので、以前悩んだことも今は解決しているかも!1月のアップデートでは、表・グラフのソート仕様が変更されました。 実は、表・グラフに含めていない指標でもソートが可能なんです!今回はその方法をお教えします。

この記事でまとめられていること

こんにちは。株式会社アピリッツでアナリストをしているssekiです。
業務でGoogleデータポータルを多用していますが、
日々更新されているGoogleデータポータル、いつの間にか新機能がついている!なんてことも。
今回はそのうちの1つ。表・グラフをさらに使いやすくするための新機能をご紹介します。
例えば、こんなことありませんか?
「データとしては必要ないけど、ソートのためにグラフ内にいれとかなきゃ・・・。」
enter image description here

表内の美味しさ順、という項目はソートに用いるものの表示したくないとします。
その場合、エクセルなら非表示にすればいいですが、Googleデータポータルでは非表示にできませんよね・・・。

ですが、今回追加された新機能によりGoogleデータポータルでも表・グラフ以外のデータを用いたソートが可能になりました! (記事投稿時は英語版のヘルプにしか載ってませんでした。)
かなりニッチな新機能ですが、その使い方をご紹介いたします。

Case1:表内にない指標でソートしたい場合

まず、表でのソートについて考えてみます。
ページごとにセッションと直帰率を調べ、直帰数の降順に並べたいとするとGoogleデータポータルでは次のような表になります。
enter image description here
※本記事の画像はGoogleのデモアカウントデータを用いています。

従来のGoogleデータポータルでは、直帰数の指標が邪魔だなぁと感じている場合でも、
表で用いていないディメンションや指標を使ってソートすることができませんでした。
しかし、新機能によってそれが可能になっています。

enter image description here

表をクリックすると、右側のメニュー下に並べ替えの項目がありますね。
中身を見ると、データソースに含まれるすべての指標が選択できるようになっていることがわかります。
(以前は表内に含まれているディメンションと指標のみ表示されました)

enter image description here

表内に「直帰数」をわざわざ入れなくとも、ソートに利用することができるので、
下図のように少しコンパクトな表にすることができます。
用途がそれほど多いかはさておき、より柔軟な表作成ができるようになってますね!

enter image description here

ちなみに、ディメンションは表内のものしか使えません。
表やグラフで表示されているディメンション以外でソートする、というのがよく考えると意味不明ですから当然と言えば当然ですが。

Case2:グラフ内にない指標でソートしたい場合

グラフにおいても、先ほどと同じ方法でグラフ外指標でのソートが可能です。
Case1で扱ったデータを複合グラフにした図がこちらになります。
enter image description here
具体的な方法は同じなので割愛させていただきますが、いくつかのグラフではソート機能自体が使えないことに注意が必要です。
ソート機能が使えるグラフ

  • 棒グラフ
  • 複合グラフ
  • 円グラフ
  • 散布図
  • 面グラフ

ソート機能が使えないグラフ

  • 期間(折れ線)グラフ
  • 地図
  • スコアカード
  • ブレットグラフ
  • フィルタ

ソート機能は使えるが、表以外のソートはできないグラフ

  • ピボットテーブル

地図やスコアカードのようにそもそもソートが不要なグラフではソート機能が使えません。
また、ピボットテーブルに関しては現時点で対象外ですが、今後仕様変更によって使えるようになるかもしれませんね。

まとめ:この機能はどんな人におすすめか

必要なデータだけがまとまっている表・グラフを作成することで、意思決定や伝達がスムーズになります。
そのためにGoogleデータポータルの代わりにエクセルを使っている、という方も多いのではないでしょうか。
この機会にぜひGoogleデータポータルでのレポート作成をはじめてみてはいかがでしょうか。

今回は細かな一部分の新機能でしたが、痒いところに手が届くアップデートにこれからも期待ですね!

VPNに触れてみる〜その1〜

0

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

VPNとは何ぞ、から実際につなげてみるまで。今回はVPN接続のうち、提供されているGUIでの接続や、Macに搭載されている機能を利用してのお話。

はじめに

前回はVPNに関連した通信方式について触れましたが、今回は実際にVPNに接続するお話。使用するVPNとして、softether社が無料で提供しているsoftetherVPNを紹介します。
VPNサーバの構築については触れませんのでご了承を。
また、ネットワークの設計によっては追加で必要な作業もありますが、詳細には取り上げません。(ファイアウォール、追加のルータ側でのポート設定が占めると思います。)

VPN接続手順

前提

VPNサーバに登録されているユーザ名等、接続するための情報が必要です。
本ページではパスワード入力で接続する方式で紹介します。

IPSec/L2TPで接続

・IPSec/L2TP:暗号化通信をネットワーク層で行う方式。IPSecはIKEプロトコルを使用しているため、事前共有鍵が必要。

OS: Mac OS X EI Capitan (v10.11.6)
Macではネットワークの設定でVPN接続が選択できるため、それを利用します。

ログインするためには、ログインするユーザ名、対応するユーザのパスワード(その他の認証方式で行う場合はその情報)、サーバアドレス、及びIPSec/L2TP通信を行うための鍵が必要です。すべてVPNサーバ側にあるため、自身で構築する場合はメモしておくか、サーバ管理者に問い合わせる必要があります。

1.[システム環境設定]から[ネットワーク]画面を開き、サービスの追加を行います。

enter image description here

2.[認証設定]をクリックし、パスワード等を入力します。
ここはVPNサーバ側の設定により選択するものが違いますが、今回はパスワード認証で行います。
共有シークレットに入力する鍵はVPNサーバ側のIPSec/L2TPの設定に記載されているので、鍵情報を受け取ってない場合はそれを確認するよう問い合わせてください。

enter image description here

3.入力が終わったら[OK]を押し、サーバアドレスとアカウント名(ユーザ名)を入力します。
VPNサーバのIPを確認する際、設定によってはVPNサーバが割り当てているIPになっていることがありますので、接続の際はIPアドレスが正しいか確認しておきましょう。
(画像内IPアドレス、およびアカウント名は一例)

enter image description here

4.必要な入力が終わったら接続し、以下の画面が出ていれば成功です。割り振られているIPはVPNでのIPです。(割り振るIPの範囲はVPNサーバ側で設定できます)

enter image description here

接続失敗する場合は入力した情報を確認しましょう。またNATやファイアウォール等を通じて接続する場合はVPNサーバ側に設定が追加で必要ですので、管理している方に確認してください。
必要な設定はこちらの「NATが存在する場合の注意事項」に紹介されています。
さて上記接続方式ですが、Windows10にも搭載されているようです。[ネットワークとインターネット]から左側に[VPN]の項目があるので、そちらから設定できます。(ユーザ名とパスワードは接続時に要求されます)

GUI VPNクライアントを利用して接続(Windows)

Windows用のため、それ以外では基本利用できません。一応Wineを利用してGUIを利用できることは確認していますが、何か抜けているのか仮想LANカードが作成できませんでした。
ただCUI VPNクライアントで作成したものは反映できましたので、そちらで作ってから接続を試す方法もあります。いずれもダウンロードはこちらから。

1.仮想LANカードを作成します。作成していない状態で[新しい接続設定の作成]をダブルクリックすると警告画面が出て作るように促されるので、そちらから作成して構いません。

2.ログインに必要な情報を入力します。(接続設定名は任意。その他入力が必要な情報は仮で埋めています。ユーザー認証は接続時に聞かれますので空白でも。)
IPSecのときと比較して、ポート番号を要求されていますのでご注意ください。(ポート番号は一例。開いているポートはサーバ側で確認・設定できます)

enter image description here

3.入力が終わったら、作成した接続設定をダブルクリックします。
ユーザー名とパスワードを聞かれたら、空白であれば入力しましょう。
接続ができたら「状態」が「接続完了」に変化します。

おわりに

今回はすでにあるものでの接続、およびGUIのVPNクライアントでの接続方法について紹介しました。
次回はCUI VPNクライアントを利用した接続方法について予定しています。
IPSecでつなげるなら別に…という気がしますが、それを許可しない/接続できない場合はどうしても使わなければならなくなるため紹介します。


関連:
VPN Server 側での L2TP/IPsec 機能の有効化方法
softether VPNのダウンロード
VPNに触れてみる〜その0〜
VPNに触れてみる〜その2〜

windows10にてsambaのファイルサーバーにアクセスできなくなった件について

0

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

ローカルPC内に構築しているCentOSのサーバーにて使用しているSambaファイルサーバーにアクセスできなくなったので、原因と対処法をご紹介します。

こんにちは。アピリッツの本多です。

今年に入ってから発生したのですが、自前で構築していたCentOS上で動いているSambaのファイルサーバーにアクセスしようとするとエラーが出るようになりました。
原因と、行った対処法をご紹介いたします。

エラーの内容

ファイルサーバーにアクセスしようとするとネットワークエラーとなり、以下のようなエラーメッセージが表示されるようになりました。
enter image description here

エラーコードは以下の場合もあるようです。

エラー コード:0x80004005
エラーを特定できません

原因

最近windows updateを行ったのですが、その際に以下の内容が適用されました。

2018 年 1 月 4 日 — KB4056892 (OS ビルド 16299.192)

そしてこのupdateには以下の内容が含まれています。

Windows SMB Server、Windows Subsystem for Linux、Windows カーネル、Windows Datacenter Networking、Windows Graphics、Microsoft Edge、Internet Explorer、および Microsoft Scripting Engine のセキュリティ更新プログラム。

おそらく上記の内容が適用されたことで、サーバー メッセージ ブロック バージョン 1 (SMBv1) ネットワーク プロトコルが無効化されてしまったのだろうと考えられます。

対処法

SMBv1がだめなら、SMBv2にすれば良い。
答えはシンプルでした。ということで、sambaの設定に以下を追加し、アプリの再起動を行う事で、無事接続出来るようになりました。

vi /etc/samba/smb.conf
 [global] 
min protocol = SMB2 ←追加 
max protocol = SMB2 ←追加

OSはCentOS 6.9で、sambaのバージョンは3.6.23-45.el6_9です。

根本原因について

そもそも、何故SMBv1は無効化されてしまったのか。
ランサムウェア WannaCrypt 攻撃に関するお客様ガイダンス
昨年、SMBv1の脆弱性を利用したランサムウェアが登場し、話題になりました。

enter image description here

この件に関する脆弱性は修正したアップデートが配信済みと上記の記事にありますが、同時に

「攻撃手法はさらに進化する可能性もあります。追加の多層防御対策が追加の保護を提供する場合もあります。」

とも書かれており、マイクロソフトはこれを機にSMBv1の利用そのものを終了させたのだろうと思います。

あとがき

先週までアクセス出来ていたファイルサーバーに急に繋がらなくなり、焦ったわけですが、無事解決できてホッとしています。
もしかすると、似たような症状に見舞われている方もいらっしゃるかもしれないと思い、今回の記事を投稿させていただきました。
これが何かの助けになれば幸いです。

Virtualboxを使用しAndroid 7.1をパソコンで動かす

0

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

PCで動作するAndroid-x86を使用して、Windows上にテスト用のAndroid仮想マシンを作成する手順です。 アプリなど実機と動作が異なったり、動かない場合もありますが、テスト用には使用できるかと思います。

実施環境

  • Windows 10
  • Virtualbox 5.2.4
  • Android-x86 64bit 7.1 RC2

ダウンロード

今回は、まだ7.1の安定版がリリースされていないので、RC2を使用します。
Android-x86から、android-x86_64-7.1-rc2.isoをダウンロードします。

仮想マシンの作成

ここからVirtualboxの仮想マシンを作成していきます。

仮想マシンの作成
名前は適当に、タイプはLinuxにしてバージョンはOther Linux (64-bit)にした。
メモリーサイズは、2048MBに増やした。

仮想ハードディスクの作成
ファイルサイズを、64GBに増やした。
作成ボタンを押す。

ストレージの選択
仮想マシンを選び設定を押す。
ストレージの光学ドライブに、先ほどダウンロードしたisoイメージファイルを設定する。
その他、お好みで設定を変える。
仮想マシンを起動します。

インストール

ブート画面
仮想マシンが起動したら、Installationを選択。

パーティション選択1
Create/Modify partitionsを選択し、パーティション作成していきます。

GPT
GPT使用しないので、Noを選択。

パーティション作成1
Newを選択し新規作成。

パーティション作成2
Primaryを選択。

パーティション作成3
全領域使用するので、そのままエンター。

パーティション作成4
Bootableにする。

パーティション作成5
Writeを選択。

パーティション作成6
yesと入力し、パーティション作成中しばし待つ。

パーティション作成7
Quitでパーティション作成画面から抜ける。

パーティション選択2
OKを選択して、先ほど作成したパーティションにインストールします。

ファイルシステム選択
ext4を選択。

フォーマット確認
Yesを選択し、フォーマット中しばし待つ。

GRUB
Yesを選択して、GRUBをインストールします。

システムファイル読み書き選択
どちらでもいいが、今回は実機に近いNoを選択した。

強制排出
マウントしたisoイメージを強制排出した。

インストール成功
Rebootを選択して、再起動します。

起動後の設定など

Android起動
Virtualboxのメニューから入力、マウス統合を外します。
画面の指示通り進めます。

メイン画面
完了
お好みで、Google日本語入力などを入れましょう。

ACPIシャットダウン
終了時は、VirtualboxのメニューからACPIシャットダウンで行います。

終了時選択
電源を切るを選択し終了します。

解像度を変更する方法

Virtualboxを使用しているAndroidの解像度を変更します。
debug mode
起動後、デバッグモードを選択します。

enter image description here
# mount -o remount,rw /mnt
# vi /mnt/grub/menu.lst

上記コマンドを入力して、ファイルを編集します。
kernelの行の最後に、vga=ask を追加します。
別のメニューとして項目を作りたい場合は、既存の行を参考にして追加してもよいでしょう。

解像度選択画面
再起動を、先ほど作成したメニューを選び、解像度選択画面に入ります。
リストの中から、好みの解像度を選択してください。

おわりに

WindowsPCでAndroid
開発環境を入れずにアプリの動作確認を行いたい場合などに、利用してみてはいかがでしょうか。
また、Android-x86はPCにも導入できるので試してみるのもいいかもしれません。

関連記事など

脆弱性診断サービスなど

弊社、アピリッツではセキュリティ診断サービスを行っております。
下記リンクから内容の確認と、問い合わせが可能です。

http://appirits.com/service/security.html

第7回「来年に流行りそうなゲームは何か?」

0

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

第7回「来年に流行りそうなゲームは何か?」について話していきたいと思います。

今年も後わずか!こんにちは、Lionです。
前回の記事いかがだったでしょうか?
本場のゲームプランナーが「どういう業務を行っているのか?」というのが少しでも伝わりましたら、嬉しいです!
さて、本日は「第7回 来年に流行りそうなゲームは何か?」について話させていただきます。

VRコンテンツのゲームが流行る?

私的にはVRゲームが今後流行ってくると思います。
Oculus RiftやVIVEなどの一般の人でもVRゲームを開発できるようなキットや一般家庭でVRを手軽に楽しめるPSVRなどが去年くらいから世間的に浸透しつつあります。
自分もVRゲームを開発(趣味で)しているのですが、ここ1~2年でVRゲームのクオリティは大幅に上がってきていると思います。
その中でも、自分が遊んでみて特に面白かったものをいくつか紹介いたします。

THE PLAYROOM VR

1人でも家族みんなでも楽しめるVRパーティーゲームです。
このゲームはVRヘッドセットを装着した人だけでなく、周りのみんなもテレビモニターのゲーム画面を見ながら一緒にゲームを楽しむことができるためPSVRが1個でも遊べるという利点があります。

対戦はもちろん協力プレイもあり、直感的な操作が可能なゲームばかりのため、小さい子供からお年寄りまで幅広く遊べます。
また、PSVRを装着していないプレイヤーの声が装着している人の手助けとなるゲームもあるので、みんなでワイワイ遊ぶのにはもってこいのゲームだと思います。

特にTHE PLAYROOM VRのMONSTER ESCAPEというゲームが面白いですね!
VRヘッドセットを装着したプレイヤーは、巨大モンスターとなって街をどんどん破壊していきコントローラーを持ったプレイヤーたちはヒーローとなってモンスターから逃げたり戦ったりします。
VRヘッドセットにはモンスターの視点による景色が映し出されるというのが戦略のカギになります。
enter image description here
        ©2017 Sony Interactive Entertainment Inc. All Rights Reserved.
                [sonyの公式サイトより引用]

MATIOKART VR ARCADE GP

こちらは東京都新宿区歌舞伎町1-29-1にある超現実エンターテインメントEXPO 「VR ZONE SHINJUKU」で遊ぶことのできるVRマリオカートのゲームになります。
このゲームの面白いところは、カーレース中に取得するアイテムを自分の手で取らなければいけないというのとそのアイテムを使う時に自分の手で使わなければならないところです
   enter image description here
       ©Nintendo Licensed by Nintendo、©BANDAI NAMCO Entertainment Inc.
             [超現実エンターテインメントEXPOより引用]
このように手にコントローラーを付けて、ゲーム内のアイテムを自らの手で取得します。
ゲーム内だと、以下のような感じ見えますね
       enter image description here
      ©Nintendo Licensed by Nintendo、©BANDAI NAMCO Entertainment Inc.
            [超現実エンターテインメントEXPOより引用]
ミドリこうらを持ってますね。これを相手に向かって投げるのがすごく楽しいです。
ただ、運転をしながらアイテムを投げるというのはなかなか難しかったですね(/・ω・)/
※ちなみにアイテムにハンマーがあるのですが、相手に近寄ってあてるのは結構難易度が高いです。
現状いままでやったVRゲームで一番楽しかったのはマリオカートVRだったので、興味ある方はぜひ遊びに行ってみてください!

ホラー実体験室 脱出病棟Ω

これは今まで自分がやってきたホラーVRで一番怖かったゲームになります。
病院の中を車いすで仲間と共に移動して、脱出するというゲームなのです。あまりにも表現がリアルすぎて、初めはコントローラーを操作するのもためらってしまいました。
       enter image description here
             ©BANDAI NAMCO Entertainment Inc.
           [超現実エンターテインメントEXPOより引用]

VRゲームは、ホラーとの相性はバツグンというのを象徴したかのように怖いです。
※ちなみに女性の大半は泣いているのを目にしました…

基本的に難しい操作はないです。その分、没入感が半端ない作り込まれた世界に集中することができます。
もし、興味ある方は超現実エンターテインメントEXPO 「VR ZONE SHINJUKU」にあるので遊びに行ってみてください。

ここまで話してみて

どうだったでしょうか?実はVRゲームって結構身近で遊べるようになってきたのが分かりますね!
また、人気のゲームタイトルのVRゲームも少しづつですが出始めていますし、VR専用のゲームセンターもできてきました。
私的には、来年からVRゲームが一気に流行りだすと思っています。
もしかしたら、私の好きなゼルダの伝説のVRゲームも出るかもしれませんね!
※というか出てほしい…自分でマスターソードを台座から抜きたいw

さて、次回は「第8回 必勝?!筆者独自の就活術」を話していきたいと思います。
今年ももうわずか(´・ω・`)みなさんもよいお年をお迎えください(/・ω・)/

EC2再起動でステータスチェック失敗した状態からリカバリした方法

0

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

EC2再起動でステータスチェック失敗した状態からリカバリした方法

EC2の再起動を実施した所、予想外のトラブルが発生し、なんとかリカバリした時の話。

何が起こったか

AWSのEC2でメンテナンスの為インスタンス再起動が予定された為、事前に手動再起動を実施。
(通常であれば難なく起動し、イベントから当該の予定が消えるはず。)
しかし、イベントから予定は消え、ステータスはrunningになったものの、インスタンスのステータスチェックに失敗。
よって、当該インスタンスにSSHもできなくなった。

試した事1 (失敗)

インスタンスの「再起動」ではなく「停止」&「起動」をしてみた。

結果

相変わらずインスタンスのステータスチェックに失敗

試した事2 (失敗)

当該インスタンスのAMIを取得し、そのAMIから起動を試みた。

結果

AMIから起動してもやはりインスタンスのステータスチェックに失敗

試した事3 (失敗)

AWSのトラブルシューティングに20分以上待つと解消するかもしれない、とあったので、
暫く待ってみた。

結果

1時間待っても解消せず。

試した事4 (成功)

当該インスタンスは、2台構成で冗長化してあるサーバの片方であった為、
もう片方のAMIを取得し、そのAMIから起動してみた。

結果

問題なく起動できた。

この段階での問題点

不運な事に、冗長構成のプログラムとは別に、(起動不能となった)当該インスタンスだけに設定してあったプログラムがあり、
そのプログラムが実行できない状態になった。

試した事5 (成功)

AMIより起動した新規EC2に、起動不能となったEC2のEBSをアタッチしてみた。

結果

問題なくアタッチできた。

あとは、マウントの設定と、いくつかプログラムの設定を実施し、なんとか平常状態にする事ができた。

MySQL の auto_increment をリセットする

0

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

MySQL の主キーとかに auto_increment 属性を付けておくと連番の ID を自動生成してくれるので便利です。

データ挿入時に id を指定せずデータ挿入すればよくなり、ユニークな ID が自動で割り当てられます。

> insert into names( name ) values( 'ヤマダ' );
> insert into names( name ) values( 'スズキ' );
> insert into names( name ) values( 'サトウ' );
> select * from names;
+----+------+
| id | name |
+----+------+
|  1 |ヤマダ|
|  2 |スズキ|
|  3 |サトウ|
     :
+----+------+

便利な auto_increment 属性ですが、コントロールする必要が出た場合に少しコツが必要になります。

3レコード目が誤って登録した事に気づいて、削除をした場合に
次にデータを挿入するとauto_increment はリセットされずに id = 4 として 3 件目のデータが挿入されます。

> select * from names;
+----+------+
| id | name |
+----+------+
|  1 |ヤマダ|
|  2 |スズキ|
|  4 |タナカ|
     :
+----+------+

これでも問題無いと考えるのであれば特に気にする必要ないですが、連番ではなくなってしまうので、
auto_increment を自分の意図でリセットしたくなる場合があります。

その場合は、以下のコマンドを実行します

alter table names auto_increment = 3;

auto_increment 属性値を強制的に「3」に変更しましたので、この状態からデータ挿入すると
次に入るレコードの ID は 「3」 になります:

> select * from names;
+----+------+
| id | name |
+----+------+
|  1 |ヤマダ|
|  2 |スズキ|
|  3 |タナカ|
     :
+----+------+

まとめ

基本的には自分のローカル環境でしか行わない作業ですね。
特に気にならなければ行わない処理なので、連番に出来る方法もあるんだなー
程度に覚えておけば良さそうです。

手軽な運動で運動不足を解消

0

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

最近運動不足なのをひしひしと感じているので、手軽に出来る運動は無いか調べてまとめてみました。
以下のサイトを主に参考にしています。

公益財団法人 健康・体力づくり事業財団

ウォーキング

一日につき一万歩歩くと、生活習慣病の予防に良いとのことです。
一万歩というのがどれくらいの距離なのかイメージがつきにくかったので、計算してみました。
歩幅の目安については、明確な値は出てこなかったのですが、タニタのからだカルテというページを参考に計算してみます
タニタ からだカルテ

歩幅の目安(諸説有り):身長 × 0.45
・男性,平均身長の場合
 171(cm) × 0.45 × 10,000(歩) = 7.695 (km)
・女性,平均身長の場合
 158(cm) × 0.45 × 10,000(歩) = 7.11 (km)

大体一日あたり7km〜7.5kmくらい歩くと良いみたいです。
分散して歩いても良いようなので、階段の昇り降り等を増やして少しでも多く歩くよう心がけると良いかもしれません。
効果的な歩き方のフォームなども掲載されているので、興味の有る方は一度参考ページを御覧ください。

ストレッチ

簡単なストレッチでも、運動不足の身体には効果的だそうです。

肩のストレッチ

準備運動で行う、片方の腕をもう片方の腕で引き寄せる運動です。
10秒間、2セットずつ行うことが推奨されています。
enter image description here

伸び

息を吐きながら、思い切り伸びを10回ほどするのも良いそうです。
これならデスクでも簡単に出来ます。
enter image description here
イラストだと手を組んで伸びをしていますが、握りこぶしを作って伸びたほうがよりストレッチには良いとのことです。

比較的やりやすそうな2つを取り上げました。他にもストレッチ方法は紹介されていますが、簡単なものでも健康に良いときいて驚きました。

ランニング

以前手頃な運動について調べていた時に、ランニングについて良く目にしたので合わせて紹介したいと思います。

手頃なスポーツをしてみる

同じく財団のページには書いてありませんが、手頃なスポーツをしてみるのも運動不足や気分転換に良いそうです。

お金や時間はかかってしまいますが、スポーツジムを利用してみるのも一つの手かもしれません。

明治神宮球場には、バッティングセンターもあるので、そういったところで手軽に楽しんでみるのも良いですね。
Doruby内で紹介している記事もあるので、是非御覧ください。

やきうのすすめ

まとめ

公益財団法人 健康・体力づくり事業財団のページを参考に、いくつか簡単な運動について紹介しました。
こういった簡単なものから取り組んで、運動不足を解消していきたいと思います。

Redmine3.4.3にredmine_backlogsを入れた時の備忘録

0

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

新しいバージョンと古いプラグインはキノコとタケノコくらいに相容れない

 Redmine3.4.3にプロジェクト管理ツールであるBacklogのRedmine用である、redmine_backlogsを入れてみたのですが、その時に色々と詰まったので書き残しておきます。

動かせるようになるまでの過程

1

まず、普通にredmine_backlogsをRedmineのプラグインとしてgitから落としてきて、

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

を行ったらエラーが発生した。
そこから色々手を加えたりして、頑張ったりしたけれど簡単な解決があった。
Redmine3.2にredmine_backlogsを入れた人のブログがあったので、それを参考に。
・ソースは本ブランチのものではなく、origin/feature/redmine3 のものを使用。
・nokogiriとcapybaraをGemfileからコメントアウトする。
でok。後はマイグレーションして再起動すれば反映される。

2

次に、チケットを作成しようとした時に、
plugins/redmine_backlogs/lib/backlogs_hooks.rb

return unless project.module_enabled?('backlogs')

で、projectがnilだと怒られてエラー発生。
try当て込んだら取り敢えず動いた。

return unless project.try(:module_enabled?, 'backlogs')

そこから詳しく調べると、
app/views/issues/new.html.erbで呼ばれていて、それは要するにチケットを作成しようとした時(issues/newが呼ばれた時)の、app/controllers/issues_controller.rbのnewメソッド
に問題がある。
それからprojectを入れているのは、newのbefore_actionの中でのbuild_new_issue_from_paramsメソッドの

@issue.project = @project

それから、@projectを入れているのは、app/controllers/application_controller.rbのfind_optional_projectの、

@project = Project.find(params[:project_id]) unless params[:project_id].blank?

要するに、パラメータにproject_idが入っていない場合、@projectが空っぽのまま処理が進んでエラーが起きる、という事。
ただ、どうしてここのproject_idが空っぽなのか? 存在していないプロジェクトに対してチケットを作成しようとした? そもそもトップ画面からのメニューで既にproject_idが入っていなかったからエラーが起きただろうけど、他の部分は動かせていたのは何故……?
エラー箇所を元に戻してみてもう一度エラーを起こしてみようと思いましたが、その時にはまた何故か正常に動くようになっていて、原因は闇の中に消えてしまいました……。
ログも削除済みでした……。

3

redmine_backlogs/lib/backlogs_setup.rb:234行目でエラー。

def settings
  SettingProxy.instance.to_h
end

これだと、文字列=>値のハッシュが作成されるが、これを参照している箇所ではキーを文字列ではなくシンボルで参照しているので、そのように変更する。
with_indifferent_accessメソッドを使うか、手作業で変えるかはお好みで。

4

それから、javascript関連でもエラー。このredmine_backlogsを動かす為に一緒に導入したa_common_libというプラグインにてエラー発生。
plugins/a_common_libs/assets/javascripts/a_common_lib.js:25にてbuildFilterRowが定義されていないと怒られる。
えーっと、これはどこのものだ……? と調べた結果、redmine本体のpublic/javascripts/application.jsに存在している事が判明。どういう理由か分からないけれど、このファイルがプラグイン以下で読み込まれていないんだな……。
色々と調べてみると、
app/application_helper.rbのjavascript_include_tagsで、pluginに入っているjavascriptファイルは全て取ってきているらしいけれど、public以下のソースを取ってきている様子はどうも見当たらない。
前のバージョンでは、public以下のソースを取ってきていたんだろうか……と思う。
で、取り敢えずbuildFilterRow、 それからenableValuesの部分をコピペしてa_common_lib.jsに移植する。それが一番外部に影響が少ないだろうし……。
……動いた!
取り敢えず、これで特に問題はなくなりました。

+A

後、他のプラグインを入れた時にそのbacklog関連でエラーが発生したりしましたが、取り敢えず、backlog関連のデータが入っているものを無視するようにすれば、問題はなくなりました。

Redmineを触ってみての感想

Railsに触れ始めてもう8ヶ月ほどが経ちましたが、それでもいきなり全く知らないコードを読んでの修正はとても大変でした。
エラーが起こればコードを追いかけてひたすら原因部分を見つけ出し、応急処置をするように直してを繰り返し……。これ以外のプラグインも入れたりもして、エラーがそれぞれで起きたりもして、それぞれ直す事もしましたが、このredmine_backlogsが一番手間が掛かりました。
本格的に直そうと思ったら、Redmineにもかなりの時間を割かなければいけないでしょうし、どれだけ時間が掛かるか正直分かりません。
でも、正常に動くプラグインに関しては本当に数コマンドで新しい機能が使えるようになって、とても使い易いなー、とも思いました。

……疲れた。太ってきたけど甘いものが欲しい。

最近人気な記事