ホーム ブログ ページ 26

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にもかなりの時間を割かなければいけないでしょうし、どれだけ時間が掛かるか正直分かりません。
でも、正常に動くプラグインに関しては本当に数コマンドで新しい機能が使えるようになって、とても使い易いなー、とも思いました。

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

jQuery.ajaxでRailsのコントローラを叩く

0

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

ajaxを利用することで、jQuery側からRailsのコントローラへアクセス出来たので備忘録を兼ねて記載しようと思います。

gemの導入

railsでjQueryを扱えるように、gemを導入します。

(デフォルトで入ってる場合もあるみたいです。)

# Gemfile
gem 'jquery-rails'

Controllerの用意

# tests_controller.rb

def index
end

#ユーザの一覧をjson形式で返すアクション
def ajax_test
  @user = User.all
  render json: @user
end

ページ表示用のindexアクションと、ajax通信用のajax_testアクションを定義したControllerを用意します。

対応するルーティングの追加

ajaxでアクセス出来るように、ルーティングを追加します。

# config/routes.rb
Rails.application.routes.draw do
  resources :users
  resources :tests
  get 'ajax_test', to: 'tests#ajax_test'
end

Viewの用意

# index.html.erb

<% content_for :head do %>
  <%= javascript_include_tag 'ajax_test', 'data-turbolinks-track' => true %>
<% end %>

<h1>ajaxテストページ</h1>

<%= link_to 'jsonを表示する', ajax_test_path, {id: "ajax_test", remote: true} %>

<table id="user"></table>

indexアクションでrenderするviewファイルを用意します。

今回は、リンクをクリックしたらajax通信が始まるようにしました。

(remote: trueを追加することで、rails側がajax通信をしてくれるようになります。)

coffeescriptの用意

ajaxでアクセスするためのcoffeescriptを用意します。

リンクをクリックしたら、動作するように指定しました。

また、ajax通信が成功したら、返却されたjson形式のデータをtableタグの内部に追加するようにしています。

# ajax_test.js.coffee

$ ->
  $("#ajax_test").click ->
    $.ajax
      url: '/ajax_test'
      type: 'get'  #get,postの指定
      dataType: 'json' #レスポンスのデータタイプ指定
      async: true #非同期通信フラグ
    .done (response) ->
      #処理が成功した時の処理
      $("#user").append("<tr><th>名前</th><th>年齢</th></tr>")
      for i in [0..response.length]
        $("#user").append("<tr><td>" + response[i].name + "</td><td>" + response[i].age + "</td></tr>")
    .fail (response) ->
      #処理が失敗した時の処理
      alert 'fail'

# 生成されるjavascript

(function() {
  $(function() {
    return $("#ajax_test").click(function() {
      return $.ajax({
        url: '/ajax_test',
        type: 'get',
        dataType: 'json',
        async: true
      }).done(function(response) {
        var i, j, ref, results;
        $("#user").append("<tr><th>名前</th><th>年齢</th></tr>");
        results = [];
        for (i = j = 0, ref = response.length; 0 <= ref ? j <= ref : j >= ref; i = 0 <= ref ? ++j : --j) {
          results.push($("#user").append("<tr><td>" + response[i].name + "</td><td>" + response[i].age + "</td></tr>"));
        }
        return results;
      }).fail(function(response) {
        return alert('fail');
      });
    });
  });

}).call(this);

実際に動作させてみる

railsを起動して、期待通りに動作するか確かめました。

enter image description here
enter image description here
上記の「jsonを表示する」リンクをクリックすることで、無事テーブル内にjsonの中身を表示することが出来ました。

まとめ

jquery側からControllerへ、ajaxを利用すればアクセス出来ることが分かりました。

まだ単純なアクセスと表示でしか利用出来ていないので、もっと他に便利なことが出来ないか模索してみたいと思います。

壁貫通バグ!?現実世界の不思議な仕様

0

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

今回は現実世界のバグのようなものについてご紹介します。

はじめに

ゲームをプレイしていると、たまに出会うことがあるバグ。その中の一つに、本来通り抜けられない壁を越えてしまえるバグなんてものがあります。
私にも、四天王の最後のフロアで柱になみのりを…なんてバグで遊んでいた記憶があります。
ゲーム制作側としては、バグなんてあってはならないものですが、ゲームをプレイする側で考えると、見つけられるとちょっと楽しくなりませんか?
今回の記事は、ゲームではなく、現実世界で、壁抜けバグのような現象があるようなので、それを紹介したいと思います。

ミクロな世界

今回紹介する現象は、非常に小さいミクロな世界で確認されている現象なので、まずはミクロな世界について少しお話します。(逆にこの記事では私たちが普段見ている世界をマクロな世界と呼びます。)
物体を、その構成要素に分けていくと、最終的には非常に小さい粒子にたどり着きます。
例えば、水は化学式でH2Oと書かれますが、これを分けていくと次のようになります。
水 ⇒ 水分子 ⇒ 酸素原子、水素原子 ⇒ 陽子、中性子、電子
この陽子、中性子、電子のような非常に小さい粒たちが今回紹介する現象の主役になります。
ちなみに、どれぐらい小さいかという有名なたとえとして、
ピンポン球の原子とピンポン球の大きさの比は、ピンポン球と地球の大きさの比と同じぐらいだそうです。
enter image description here

トンネル効果

名前の通り、壁を通り抜けそうな名前ですが、今回の現象の名前が「トンネル効果」です。
ミクロな粒子たちは、常に動き回っているため、「どこにある」という表現ではなく、「どこらへんにいそう」という表現をします。
つまり、場所がきっちり決まるのではなく、場所を存在確率で表現します。「ここにいます!」というのではなく、「この辺に良くいます!」といった言い方でしょうか。
ミクロな粒子について、粒子を壁ぶつけることを考えると、壁の向こう側の存在確率が0にならないことがあります。
つまり、壁の向こう側にも粒子が存在できてしまうのです。これをトンネル効果と呼びます。
私たちが見ているマクロな世界では、壁がどんなに薄くても、物体が壁の向こうに行くことはまず考えられません。
しかし、上述のように、マクロな世界は、ミクロな世界の粒子が多数集まって構成されており、そしてミクロな粒子一つ一つには壁を超える可能性を持っています。つまり、非常に低い確率ではありますが、マクロな世界でも壁を超える可能性があるということになります。

※ちなみに、この「トンネル効果」はすでに半導体や顕微鏡などに応用されている現象です。
顕微鏡に応用されている例を紹介しますと、トンネル効果を応用した顕微鏡は「走査型トンネル顕微鏡」と呼ばれ、細い金属針を物体表面に近づけて、トンネル効果で電流が流れてくるときの電流の強さによって、物体表面の原子レベルの凹凸まで判断できる超高精度な顕微鏡です。
enter image description here

人間が壁をすり抜ける確率概算

ネットを調べてみても、現実世界のトンネル効果について言及している記事があまりなかったので、ここでは私が適当な数字を当てはめて計算してみようと思います。
調べたところ、人間の体重の65%程度は酸素原子の重さのようなので、簡単のため人間が100%酸素で構成されていると考えます。
ここでは酸素原子一粒が壁を越えられる確率を10%とします。(酸素原子はすでに陽子、中性子、電子の集合体なので、実際にはもっと低いはずです。)
酸素原子Oの原子量は16なので、6*1023 個集まると16グラムになります。
体重64キロの人間を考えると、体重が酸素の原子量の4000倍なので、4000×6×1023 個=2.4×1027 個、酸素原子が集まっていることになります。
後は、これらが通り抜ける確率50%を一斉に引ければいいので、
0.1の2.4×1027 乗を計算すれば良いということになります。
これを直接電卓に入れるとエラーになって答えが出ないので、概算します。
2.4×1027 ≒1027 として、0.11027なので、0.の後ろに0が1027 個続くぐらい小さな確率です。
では、どのぐらいの確率なのか行動に移してみましょう。
仮に、宇宙が始まってから今日まで1秒に一回ずつ壁にぶつかり続けるとしましょう。宇宙を約140億年とすれば、1年は3*107 秒なので140億年では4.2*1017 回壁にぶつかれます。
すると、すり抜けられる確率は、4.2*1017 / 1027 ≒1/1010 ⇒100億分の1ということで、このペースだと100億分の1程度ということになります。
つまり、1秒間に100億回かべにぶつかりつづければ、宇宙が始まってから現在までに1回ぐらい壁抜けが出来るかもしれませんね。

終わりに

いかがでしょうか。自分の概算ではありますが、宇宙始まってから毎秒100億回かべにぶつかってくれるデバッカーがいないと気づけないバグなんて大変なことですね。
これがバグなのか仕様なのかは創り手のみぞ知るということで、この世界にはまだまだ不思議な仕様が眠っていそうでわくわくします。

カフェインはどうやって目覚まし効果を発揮するのか

0

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

はじめに

1年間に世界で消費されるカフェインの量は10万トンに及び、カフェインのほとんどはコーヒーやお茶から摂取されています。

眠気覚ましにコーヒー、栄養ドリンクを飲む人の多くは、コーヒーなどに含まれる「カフェイン」の効果を狙っているわけですが、一体カフェインはどのようにして目覚まし効果を発揮しているのか?
飲み過ぎるとどうなるのか?
調べてみました。

カフェインによる体の影響

カフェインを摂ると、注意深くなり、集中力が増し、幸せで精力的になれます。
睡眠不足の状態でも効果を発揮しますが、心拍数と血圧を上げて、不安な気分にもなります。

カフェインは人間の体内では神経システムを刺激する効果をもたらし、
眠気の鍵となる物質の働きを妨害することでカフェインは眠気を覚まします。

ちなみにカフェインは摂取してから、効果があらわれるまでには約30分かかり、その効果は約5時間-7時間ほど続きます。

また、カフェインを長期間摂取することはパーキンソン病やアルツハイマー病や特定の癌などの病気に罹患するリスクを下げる効果や、体の脂肪を燃やす機能を助けることがあることも分かっています。

カフェインは良い事だけじゃない

カフェインは眠気を解消したり、病気のリスクを下げたり、はたまた脂肪燃焼もしてくれる大変ありがたいものですが、
体にとって良い効果ばかりではありません。

カフェイン接種により集中力が高まると同時に、心拍数は多くなり血圧は上昇します。
また、利尿作用や下痢や不眠をもたらしたりします。
カフェインを日常的に摂ると、脳はその状態に適応してきます。

そこで、眠気を覚まそうと、さらにカフェインの摂取量を増やすという行動につながります。

カフェインの摂取を急に止めると、頭痛や倦怠感、落ち込んだ気分を生じさせます。
そしてしばらくすると体からカフェインが抜けて体はリセットされるので、
昔のようにカフェインの目覚まし効果が復活することになります。

まとめ

体質的な相性や、当日の体調によっても体への影響が変わりますので、上手にカフェインを摂取して付き合っていくのが良い
何でも程よいくらいがちょうどいい

セオリーを知る ~プランニング編~

0

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

前回はプレイヤー視点でのセオリーの重要性を説明した。 今回はそのセオリーを踏まえて新しくゲームを作るのは どうするかを考える。

セオリーを守る

 前回に引き続き、対戦カードゲームを例に考えていく。
 前回は「いかに盤面にモンスターを残して相手に攻撃を通すか」というのが基本であることを説明したが、もし「相手プレイヤーに直接ダメージを与えるカードをたくさん入れるのが強い」場合どうだろうか。これは対戦カードゲームの醍醐味である「プレイヤー同士の駆け引き」を放棄し、壁とやっているのと大差ない状態になることが目に見えるだろう。
 このような「当然そうあるべき暗黙の了解」を守ることは土台として必要となる。

新しいセオリーを生み出す

 セオリーを守るだけではユーザーからは当然見向きもされない。他のゲームをやるのと変わらないからだ。
 例えば「同じカードが手札にある場合、1枚捨てることで残っている同じカードのコストを減らせる。これは対戦中3回行える。」というルールがあったとしよう。このとき、「できるだけ同じカードを入れる」「あまりやりすぎると手札のリソースが無くなってジリ貧になる」といった要素が加わる。そのうち、強いプレイヤーが「現環境ではどうするのがベストか」というセオリーを生み出すだろう。
 そう、セオリーはそのときのカードやゲームのルールに応じて刻々と変化するし、ユーザーが見出すこともあるのだ。

セオリーを破る

 最後にセオリーを正しく破ることの重大さを知っておこう。
 デジタルカードゲームが台頭してきたとき、リアルのカードゲームと決定的で絶対的な差に驚いたことがある。遠くにいる誰とでもいつでも対戦できるとかそんなことではなく、リアルのカードゲームでは非現実的な要素だ。それは「トークンカードの生成」「ランダム実行」というデジタルならではのものである。
 「2種類のモンスターの能力を合わせたカードを作る」「存在するあらゆるカードからランダムなカードを発動する」なんてことはデジタルでないとまず不可能と言える。これは「デッキに投入したカードだけで戦う」というセオリーを「デッキ外から追加されるカードも織り込んで戦う」にする進化を対戦カードゲームに与えた。もちろん広い意味では「デッキに投入したカードだけで戦う」は維持されている。

まとめ

 セオリーや暗黙の了解といったものは言語化されづらく、どこまでが当てはまるかは人によって異なるだろう。今まで挙げた中にもセオリーという言葉で示されるべきではないものも含まれているかもしれない。
 しかしここまでで伝えたかったのは「一般的な共通認識は非常に重要である」という一点に尽きる。ここを疎かにすると手痛いダメージを受けることになるだろう。

APIを叩いてslackから発言を取ってくる

0

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

目次

  • 概要
  • Slack API
  • トークンに関して
  • コード

概要

パワーメタルやシンフォニックメタルが最近のお気に入りです。
新卒はslackにDorubyのネタになりそうなアイデアの種を雑に書き込むチャンネルを作ってます。
が、slackの無料版では10000メッセージまでしか見られないので、今月の記事を書こうとしたら過去のネタが消えているという悲しい出来事がありました。
もう悲しい思いはしたくないのでslackの投稿を定期的に保存しておこう。というのがこの記事のテーマです。

Slack APIを叩く

Slackのチャンネル履歴のAPIのドキュメントです。
https://api.slack.com/methods/channels.history
一番簡単に使うには、TokenとチャンネルIDだけパラメーターで与えてやるといいです。
チャンネルIDは
https://api.slack.com/methods/channels.list/test
から取ってきてもいいし、チャンネルリストAPIを叩いてもいいです。
https://api.slack.com/methods/channels.list

トークンに関して

ここまではとても簡単なのですが、Slackのトークン関連で詰まりまくりました。
SlackのAPIトークンには2種類あって、
1. レガシートークン
2. レガシートークンじゃない方の普通のトークン
です。
レガシートークンは
https://api.slack.com/custom-integrations/legacy-tokens
から取得できますが、これではchannels.history APIは取得できないので、後述する普通のトークンを取得してください。
ちなみに、channnels.list APIは普通に叩けるので、ここで理解ができなくて詰まりました。
レガシートークンじゃない方の普通のトークンの取得
https://api.slack.com/apps
ここからAppを作成すると普通のトークンが取得できます。
Add features and functionality -> Permissions -> Select Permission Scopes からchannels:historyを選択します。
そうすると、channels.historyが選択できるようになります。

コード

# python3.6
import requests
import json
url = "https://slack.com/api/channels.history"
token = "{YOUR TOKEN}"
channel_id = "{YOUR CHANNEL ID}"
def main():
    payload = {
        "token": token,
        "channel": channel_id
        }
    response = requests.get(url, params=payload)

    json_data = response.json()
    messages = json_data["messages"]
    for i in messages:
        print(i["text"])
if __name__ == '__main__':
    main()

これを実行すると

xonsh
gitkraken
Progressive Web Apps
スクレイピング RSS
ARCore
Pyro
tse
スマートスピーカー
Prophet
Python Exception
Superset
Android Architecture Component
Headless Chrome
ラズパイ NFC
LiveData
Flux
Quantum CSS
IRKit
Hue
Puppeteer

みたいなメッセージがとれます。
コードは簡単すぎて何も書くことが無いんですが、pythonの通信ライブラリはrequestsが好きです。

無駄に見えて無駄じゃないalias

0

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

こんにちは、幾田です。

今回は「無駄に見えて無駄じゃないalias」と題して、私が趣味で登録しているbashのaliasをご紹介します。
やってることは無駄ですが、シェルスクリプトのお勉強になるので無駄じゃありません。

1. :q

私はテキストエディタにvimを使ってます。
間違えてvimの終了コマンド:qをbashで打ってしまうことがあります。

# ~/.bashrc

alias :q='echo ここvimじゃないよ:p'
q.gif

忙しい時に見るとだいぶ腹がたちます。
aliasに記号:が使えることがわかりましたね。

2. lll(小文字のL)

llのaliasを登録している人は多いのではないでしょうか。
同じ文字2文字だし、ls -lの略でllってわかりやすいですよね。

でも、勢い余ってlllと打ってしまうことがあります。
連打してしまってもある程度大丈夫なようにaliasを設定しましょう。

# ~/.bashrc

# llコマンドのaliasを設定します
alias ll='ls -l'

# ベースとなる文字列を宣言
l_length="ll"

# for文を使って10回繰り返す
for i in `seq 10`
do
  # 文字列の末尾に一つlを追加していく
  l_length=$l_length"l"

  # 文字列に対してlsのaliasを設定
  # `echo $l_length` の実行結果をaliasに渡す
  alias `echo $l_length`='ls -l'
done
ls.gif

これで最大llllllllllll連続12文字まで登録できました。
何が嬉しいのかわかりませんが、aliasに登録するコマンドに変数を使う方法がわかりました。

3. 眠い

業務中眠いなあと思ってbashに眠いと打ちます。

$ 眠い
-bash: 眠い: command not found

そんなコマンドはないので怒られます。
怒られるなら「仕事しろ」と叱咤激励してもらいたいものですね。
というか怒られるよりもこの眠さを誰かにわかってほしい。
この睡魔を同意してもらえるようにaliasを設定します。

# ~/.bashrc

# ランダムに同意の言葉を返す関数 sympathize_randomly
function sympathize_randomly () {
  # 「眠い」に返す言葉の配列 replies を宣言
  declare -a replies=(
    "私も"
    "俺も"
    "僕もです"
    "仕事しろ"
    "わかるぅ〜"
  )

  # ランダムな数字を配列の要素の個数で割った余りを計算
  random_number=$[1] $RANDOM % ${#replies[@]} 

  # 配列からランダムな要素を出力
  echo ${replies[$random_number]}
}

# sympathize_randomly 関数を使ってaliasを設定
alias 眠い='sympathize_randomly'
sleepのコピー3.gif

aliasに日本語も設定できるんですね。
関数の宣言の仕方や、配列の要素数の取得方法などいろんなことが学べました。

alias 設定時に気をつけること

aliasの設定で気をつけるべきは既に存在するコマンドを登録してしまわないことです。
また、aliasが便利だからって何でもかんでも設定していると、どれが何かわからなくなってしまうこともあるかもしれません。
破壊的なコマンドを簡単なaliasに設定するのもよくないです。

まとめ

やっていることは大変無駄でしたが、bashの知識はいつかどこかで役に立ちそうです。

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

References

References
1 $RANDOM % ${#replies[@]}

最近人気な記事