TTerseでのリストとハッシュの扱い

環境

リスト(配列)

# サーバ側
my $list_hoge = ['mon', 'tue'];

# テンプレート側
[% list_hoge.0 %] # mon が表示される

ハッシュ

# サーバ側
my $hash_hoge = { mon => 1, tue => 1 };

# テンプレート側
[% hash_hoge.mon %] # 1 が表示される

テンプレート側で呼び出す際、キーに変数を使いたい場合

# サーバ側
my $hash_hoge = {'1' => 'mon', '2' => 'tue' };

# テンプレート側
[% SET key = 1 %]

[% hash_hoge.$key %] # mon が表示される

公開鍵によるSSH接続〜異なるユーザーで直接ログインする方法

前提

頻繁に行う機会が無くて忘れがち&苦手意識があるので備忘録として残しておく。

環境

  • ローカル:Mac
  • リモート:AWS(CentOS)
    • SSH接続時のユーザー名は「centos」だが、接続後は「hchuno」に変身して作業している

やりたいこと

  • ローカルから直接「hchuno」ユーザーとしてSSH接続したい

作業手順

ローカル

公開鍵と秘密鍵の作成
$ cd ~/.ssh

$ ssh-keygen -t rsa -b 4096 -f id_rsa_hchuno
SSHログイン
  • 上記で生成した鍵は使わず、centosユーザーでのSSHログイン(これまでのログイン方法)を行う
$ ssh -i [KEY_NAME] centos@HOST_NAME

リモート

hchunoに変身
$ sudo su - hchuno
公開鍵の設定
$ vi ~/.ssh/authorized_keys

ローカルで作成した公開鍵の中身を貼り付けて保存

#公開鍵の中身をクリップボードにコピーする方法
$ cat id_rsa_hchuno.pub | pbcopy
SSH関連ファイルの権限を変更
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys
SSH設定ファイルの確認と変更
$ sudo vi /etc/ssh/sshd_config

以下のコメントアウトを外す

#RSAAuthentication   yes
#PubkeyAuthentication   yes
#AuthorizedKeysFile   .ssh/authorized_keys
デーモンをリスタート
$ sudo /etc/init.d/sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

ローカル

新しい鍵でのSSHログイン
  • hchunoユーザーで接続できることを確認する
$ ssh -i ~/.ssh/id_rsa_hchuno hchuno@HOST_NAME

サーバサイドエンジニアからiOSエンジニアに転身する案

発端

事あるごとにエンジニアのキャリアパスについて悩んではいるのだが、iOSアプリ開発エンジニアに転身するのはアリかもしれない…

今は(というよりキャリアのほとんどが)サーバサイドエンジニアなのだが、さすがにサーバサイド開発に飽きてきたこともあり違う道を歩んでみたいなーと漠然と考えていたら、上記に思い至った次第。
(仕事でPerl書いててもモチベーションが上がらない)

第一の分岐

  • 企画系(非エンジニア)
    • やってみたことはあるが、人間関係が面倒で性格的に向いてないなと痛感。そもそも「めちゃくちゃコレが作りたい!」という熱い想いも無いし…
  • マネジメント(プロジェクトリーダー含む)
    • エンジニアマネージャ的なこともやってみて、それなりにヤリガイは感じたもののコレも性格的に向いてないことを痛感し、そこからやらなくなった
  • スペシャリスト
    • 上記の理由からコチラを選ばざるを得ない

第二の分岐

  • サーバサイド開発を極める
    • 「極める」がどういう状態かわからないが、おそらくコストとリターンが見合わなくなりそう。
    • 「飽きた」問題
      • JavaPHPScalaPerl等で実装してきたが、どれも大差ない(それぞれ特徴はあるものの「Scalaが断トツで優れている」「PHPは圧倒的に駄目」等の極端な差は無い)
        • 実装するものは(多少の違いはあるものの)ほぼ同じ
  • インフラ方面に手を広げる
    • AWS全盛期なのでAWSに詳しくなる必要があるが、個人でできることは限られるし(しかもお金がかかる)、高負荷のかかる現場に居たこともあるが割と「札束で殴る」方式でどうにかなってしまったので、あまり魅力を感じない
  • Webフロントエンド
    • JavaScriptは面白いと思うが、デザインをガッツリやらない限りそんなに変わらない気がする…
    • 「Web」の需要があまり無いような…
  • スマホアプリ開発に手を伸ばす
    • 開発環境が整ってきて、お金をかけなくても学習可能
    • サーバサイドエンジニアとしてAPI開発に携わったこと等が強みになる

第三の分岐

  • Androidアプリ
    • カオス過ぎて嫌だ(昔のガラケー対応サイト開発に似た状況…いやもっとヒドイかも)
  • iOSアプリ
    • Apple厨とまではいかないがApple製品は割と好きだし、最近Swiftが主流になってきているので良いタイミングな気がする
    • 少なくとも日本に住んでいる限りiPhoneが衰退するとは考えにくいし、将来性は悪くなさそう
    • 申請してリジェクト食らったりしてるのを見てると面倒そうな印象はあるが…

結論

…ということで少しXCode等を触ってみて「Hello world」ぐらいは試してみることにした。
そして「全然合わない」と思ったらソコで終了。
(特に失うものも無いし誰にも迷惑をかけないし、コレぐらい気楽で良いかと)

AirPods Pro購入

特別定額給付金10万円が支給されたこともあり、遂にAirPods Proに手を出した。
MacBook Pro等でも使いたいので、コレを期にOSをCatalinaにすることに。

f:id:hchuno:20200607000854j:plain
AirPods Pro外箱

f:id:hchuno:20200607000930j:plain
AirPods Proケースとケーブル

f:id:hchuno:20200607001045j:plain
AirPods Pro本体

iPhoneとの接続はびっくりするぐらい簡単で速かったが、他の機器に接続を切り替えたい時はそこまでシームレスじゃないなーという印象。
ノイズキャンセリングや音質はまずまず…
ただ、お値段が税込み3万円程度というのを考えると、もうチョットこの辺りは頑張ってほしいところ…

mapを使って配列をハッシュに変換する


# 以下のようなハッシュの配列(@hoge_list)があるとする
[
         {
            'hoge_key' => 'hash1',
            'hoge_id' => 2,
            'hoge_name' => "hogehoge",
          },
          {
            'hoge_key' => 'hash2',
            'hoge_id' => 3,
            'hoge_name' => "gehogeho",
          },
];

# mapを使ってハッシュのハッシュに変換
 my $hoge_hoge = +{ map { $_->{hoge_id} => $_ } @$hoge_list };
# もしくは以下
 my %hoge_hoge = map { $_->{hoge_id} => $_ } @$hoge_list;

# キー順にソートしたい場合はリストにする
 my @hoge_hoge = map { $_->{hoge_id} => $_ } @$hoge_list;

#変換結果($hoge_hoge)
$VAR1 = {
          '2' => {
                     'hoge_key' => 'hash1',
                     'hoge_id' => 2,
            'hoge_name' => "hogehoge",
                   },
          '3' => {
                     'hoge_key' => 'hash2',
                     'hoge_id' => 3,
            'hoge_name' => "gehogeho",
                   },

        };

Scalaハマりポイント2019

JavaのgetResource()だと「ファイルの」パスしか取得できない

  • この書き方で取得したpathでは、ScalaのtoDirectory()でディレクトリ扱いしてくれない
def resourcesDir :String = {
  val dirPath = getClass.getClassLoader.getResource("resources").toString
}

resourcesDir.toDirectory.exists // ⇒false
  • こう書けば解決
def resourcesDir :String = {
  val file:File = new File(getClass.getClassLoader.getResource("resources").getFile)
  file.getAbsolutePath
}

resourcesDir.toDirectory.exists // ⇒true