【Apple製品の購入/修理/売却に】アクティベーションロックでトラブルにならないためのTips

こんにちは!インゲージの水谷です。

今回はデザイナー/エンジニアに限らず、MacbookやiPhoneなどのApple製品をお使いのみなさまに向けたTipsとなります。

というのも、つい最近Macのアクティベーションロックによるトラブルを体験したので、みなさまもぜひ注意して欲しいと思い記事にしました。

遭遇したトラブルについて

2021年年末のある日、いつも通りに出社し、業務を行うためにPCを開き電源ボタンを押す。

しかし電源がつかない...

前日まで問題なく動いていたなのに、何をしても起動しない...

仕方なく修理のために修理業者(Apple正規サービスプロバイダ)に持ち込んだのですが、ここでApple製品あるあるのトラブル「アクティベーションロック」にぶち当たりました。

私はその場でAppleIDにログインし、端末の連携を解除しました...が、アクティベーションロックが解除されませんでした。

原因はなんだったのか?

結論から言えば、私と前任者ともにMacを探すについての認識を勘違いしていたということになります。

私の使用していたPCは、前任者が元々使用していたものでした。

前任者も私も、AppleIDから連携端末を解除すれば「Macを探す」から外れるだろうと思っていたのですが、実は「Macを探す」はiCloudの方で管理されているということが発覚しました。(昔は連携端末解除でよかった記憶があります)

上記添付画像のように、修理に出したPCとの連携は解除しておりましたが、iCloudは全く触っていませんでした。

店員さんのレクチャーにより、iPhoneにある「探す」アプリを開くと表示されるデバイスから該当の端末を削除すればOKで、これで無事PCを修理に出すことができました。

トラブルにならないための対策

自分のPCを修理や売却で手放す場合は、iCloudとAppleIDの両方から連携を解除しましょう。

法人なのであれば、退社時のマニュアルに必ず記載しておくことがオススメです!

初歩的なことかもしれませんが、これまで長年Macを使っている私自身も知らなかったので、後々のトラブル回避のために皆様もお気をつけください!

Githubのworkflowファイルを整理しました

こんにちは、もうすぐ玉ねぎの収穫が楽しみなHarashoです。(自宅の近くで畑を借りて家庭菜園しています♪)

今回の記事ですが、タイトルの通りGithub Actionのworkflowファイルを整理したお話しです。

修正前

以下のような構成でした。

  • workflows/
    • deploy.yml
      • 本番環境へのCI/CD
    • deploy_stg.yml
      • ステージング環境へのCI/CD
    • test.yml
      • 本番、ステージング以外のブランチへのCI

deploy.yml

name: deploy

on:
  release:
    types: [released]

jobs:
  test:
    # CI共通の内容

  deploy:
    needs: test
    # 本番向けCD

deploy_stg.yml

name: deploy_stg

on:
  push:
    branches:
      - staging

jobs:
  test:
    # CI共通の内容

  deploy_stg:
    needs: test
    # ステージング向けCD

test.yml

name: Test

on:
  push:
    branches-ignore:
      - master
      - staging

jobs:
  test:
    # CI共通の内容

各ファイルに定義しているtestジョブをまず共通化したいと思い調べていたところ、Reusing workflowsを使うと実現出来そうなので試してみました。

まず、testジョブを定義するファイルを新規作成します。

_test_job.yml

name: Test Job

on:
  workflow_call:

jobs:
  test:
    # CI共通の内容

呼び元は以下のようにします。 test.yml

name: Test

on:
  push:
    branches-ignore:
      - master
      - staging

jobs:
  test:
    uses: ./.github/workflows/_test_job.yml

同様の編集をdeploy.yml、deploy_stg.ymlにも行います。

testジョブが共通化できたので、今度はdeploydeploy_stgジョブの共通化を図ります。 これらはtestジョブと違って内容が完全には一致していないので、差分がある箇所(情報)を共通化するファイルに渡します。

_deploy_job.yml

name: Deploy Job

on:
  workflow_call:
    inputs:
      deploy_target:
        description: デプロイ対象
        type: string
        required: true

    secrets:
      secret_xxx:
        required: true

jobs:
  deploy:
    # 受け取った情報を以下のように使う
    # ${{ inputs.deploy_target }}  ${{ secrets.secret_xxx }}

呼び元は以下のようにします。

deploy.yml

name: deploy
on:
  release:
    types: [released]

jobs:
  test:
    uses: ./.github/workflows/_test_job.yml

  deploy:
    needs: test
    uses: ./.github/workflows/_deploy_job.yml
    with:
      deploy_target: production
    secrets:
      secret_xxx: xxx

修正後

  • workflows/
    • deploy.yml
    • deploy_stg.yml
    • test.yml
    • _deploy_job.yml ← 追加
    • _test_job.yml  ← 追加

deploy.yml

name: deploy

on:
  release:
    types: [released]

jobs:
  test:
    uses: ./.github/workflows/_test_job.yml

  deploy:
    needs: test
    uses: ./.github/workflows/_deploy_job.yml
    with:
      deploy_target: production
    secrets:
      secret_xxx: xxx

deploy_stg.yml

name: deploy_stg

on:
  push:
    branches:
      - staging

jobs:
  test:
    uses: ./.github/workflows/_test_job.yml

  deploy:
    needs: test
    uses: ./.github/workflows/_deploy_job.yml
    with:
      deploy_target: staging
    secrets:
      secret_xxx: xxx

test.yml

name: Test

on:
  push:
    branches-ignore:
      - master
      - staging

jobs:
  test:
    uses: ./.github/workflows/_test_job.yml

_deploy_job.yml

name: Deploy Job

on:
  workflow_call:
    inputs:
      deploy_target:
        description: デプロイ対象
        type: string
        required: true

    secrets:
      secret_xxx:
        required: true

jobs:
  deploy:
    # 受け取った情報を以下のように使う
    # ${{ inputs.deploy_target }}  ${{ secrets.secret_xxx }}

_test_job.yml

name: Test Job

on:
  workflow_call:

jobs:
  test:
    # CI共通の内容

重複したコードが減ることは気持ちがいいですね^^

インゲージではエンジニアを募集しています!
ご興味あればぜひご覧くださいませ! ingage.co.jp

enumを使ってみる

こんにちは!oda@エンジニア1年目です!

業務では、今まで使っていなかったメソッドなど、様々なコードに触れる機会があります。

今回は、その中でもRuby on Railsのenumについて、整理してみたいと思います。

(以下、Rails 7.0.2.3を使用しています。)

はじめに

enumとは、属性で使う値を名前で参照できるようにする仕組みのことです。

これだけでは、非常にわかりにくいので、以下のコードを実行しながら、確認してみます。

事前準備

まずはFoodsテーブルを作成します。

bin/rails g model Foods name:string category:integer


models/food.rbを以下のように編集して、categoryにenumを設定します。

この時、以下のようにenumを配列で定義すると、:meatには0が、:vegetableには1が、:fruitには2が定義されます。

class Food < ApplicationRecord
  enum :category, [
    :meat,
    :vegetable,
    :fruit
  ]
end


次に、サンプルデータを作成します。

Food.create(name: "牛肉", category: :meat)
Food.create(name: "鶏肉", category: :meat)
Food.create(name: "トマト", category: :vegetable)
Food.create(name: "にんじん", category: :vegetable)
Food.create(name: "玉ねぎ", category: :vegetable)
Food.create(name: "りんご", category: :fruit)
Food.create(name: "みかん", category: :fruit)
Food.create(name: "バナナ", category: :fruit)
Food.create(name: "ぶどう", category: :fruit)
Food.create(name: "")

enumの動作を確認

まずは、DBを確認してみます。categoryには、数値でデータが保存されています。

id  |   name   | category 
----+----------+----------
  1 | 牛肉     |        0
  2 | 鶏肉     |        0
  3 | トマト     |        1
  4 | にんじん   |        1
  5 | 玉ねぎ    |        1
  6 | りんご     |        2
  7 | みかん    |        2
  8 | バナナ    |        2
  9 | ぶどう     |       2
 10 | 鯖       |


以下のように、categoryを呼び出してみると、定義した名前が返ってきます。

なお、鯖のようにcategoryが登録されていない場合は、nilが返ってきます。

food1 = Food.find(1)
food1.name # => "牛肉"
food1.category # => "meat"

food10 = Food.find(10)
food10.name # => "鯖"
food10.category # => nil


また、enumで定義した名前には、自動的にscopeが定義されるため、以下のように呼び出すことが可能です。

scopeとは、モデルに対して実行したいクエリを設定する仕組みです。

なお、notを付けて呼び出した場合、categoryがnilのものは呼び出されないので、注意が必要です。

foods_vegetable = Food.vegetable
foods_vegetable.all
# =>
[#<Food:0x00007f8803e4b758 id: 3, name: "トマト", category: "vegetable">,
 #<Food:0x00007f8803e4b690 id: 4, name: "にんじん", category: "vegetable">,
 #<Food:0x00007f8803e4b5c8 id: 5, name: "玉ねぎ", category: "vegetable">]

foods_not_vegetable = Food.not_vegetable
foods_not_vegetable.all
# =>
[#<Food:0x00007f8803e08ca0 id: 1, name: "牛肉", category: "meat">,                    
 #<Food:0x00007f8803e08bd8 id: 2, name: "鶏肉", category: "meat">,                    
 #<Food:0x00007f8803e08b10 id: 6, name: "りんご", category: "fruit">,                 
 #<Food:0x00007f8803e08a48 id: 7, name: "みかん", category: "fruit">,                 
 #<Food:0x00007f8803e08980 id: 8, name: "バナナ", category: "fruit">,                 
 #<Food:0x00007f8803e088b8 id: 9, name: "ぶどう", category: "fruit">]


さて、それではenumで設定されていないデータを登録しようとするとどうなるのでしょうか。

以下のとおり、エラーが発生し、登録はできません。

Food.create(name: '枝豆', category: :bean)
# => `assert_valid_value': 'bean' is not a valid category (ArgumentError)


DBはそのままで、次のようにenumを追加するとどのようになるでしょうか。

class Food < ApplicationRecord
  enum :category, [
    :meat,
    :fish, # ←ここに追加
    :vegetable,
    :fruit
  ]
end

試しに、トマトを見てみます。

tomato = Food.find(3) 
# => #<Food:0x00007fd188546ad0 id: 3, name: "トマト", category: "fish">

トマトのcategoryがfishに変わってしまいました。

このように、配列の途中に追加すると、enumの採番が変わってしまうので、追加する場合は、最後にする必要があります。

なお、上記のenumは次のようにハッシュを使って、明示的に定義することもできます。

class Food < ApplicationRecord
  enum :category, {
        meat: 0,
        vegetable: 1,
        fruit: 2
    }
end

ハッシュと使うと、次のように連番でない値を設定することもできます。

class Food < ApplicationRecord
  enum :category, {
        meat: 0,
        vegetable: 1,
        fruit: 2,
        others: 9
    }
end

今回は以上となります。

ご覧いただき、ありがとうございました!

iOS のショートカットで普段の操作を効率化!

こんにちは、ryohei515 です。

開発部では週に1回社内で勉強会を行っており、最近の勉強会では我が家をスマートホーム化した話をしました。
その話もまたどこかで書ければいいなと思っていますが、その過程でショートカットという iOS 標準の App を駆使する機会がありました。
ショートカット自体はスマートホームに限らず使える便利な App なので、今回こちらの使い方等紹介します。

ショートカットとは

App 上での操作を簡単に呼び出すための機能で、よく同じ操作をする場合に特におすすめです。
ショートカット ユーザガイド - Apple サポート (日本)

アラームの登録や音量の調整といった iOS 標準の操作が多数登録されており、サードパーティの App でもショートカットに対応されている場合もあります。
(例えば LINE では宛先を設定して、メッセージの送信や電話の発信ができます)

そして、この操作は複数組み合わせて設定することもできるのが強みです。
スマートホーム化では操作のための App が複数分かれていたのですが、ショートカットを使うことでワンタップでまとめて操作できるようになりました。
また作成したショートカットは、siri から呼び出すことも可能です。

ショートカットの作り方

とはいえ実際にどんなことができるのかイメージがつきにくいと思うので、今回は家にいる奥さんに何時に帰れるかを連絡するショートカットを作ってみたいと思います。(我が家では重宝してます!)

続きを読む

JavaScript, TypeScript の演算子の一覧とその名前

こんにちは。 @ishiyu です。

javascript や typescript を触っていると、たまにこの演算子は意味は何と思うことないですか?
私はこういうことがよく起こります。このときググって調べるんですが、演算子で直接調べても出てこずイライラすることが多いので今回は備忘録的に演算子とその名前の一覧を紹介します。

私がよく調べるものは、最初に挙げました。

また、使い方や意味については、参考リンクを読んでください。

石田がよく調べる演算子

Javascript

??

Null 合体演算子 (nullish coalescing operator)

?.

オプショナルチェーン演算子 (optional chaining operator)

>>>

ビット符号なし右シフト演算子 (unsigned right shift operator)

[a, b] = [1, 2] とか {a, b} = {a:1, b:2}

分割代入

TypeScript

!

非nullアサーション演算子(non-null assertion operator)

JavaScript

インクリメントとデクリメント

A++

後置型インクリメント演算子

A--

後置型デクリメント演算子

++A

前置型インクリメント演算子

--A

前置型デクリメント演算子

単項演算子

+

単項正値演算子 (addition operator)

-

減算演算子 (subtraction operator)

/

除算演算子 (division operator)

*

乗算演算子 (multiplication operator)

%

剰余演算子 (remainder operator)

**

べき乗演算子 (exponentiation operator)

等値演算子

==

等値演算子 (equality operator)

!=

不等値演算子 (inequality operator)

===

同値演算子 (strict equality operator)

!==

非同値演算子 (strict inequality operator)

ビットシフト演算子

<<

ビット左シフト演算子 (left shift operator)

>>

ビット右シフト演算子 (right shift operator)

>>>

ビット符号なし右シフト演算子 (unsigned right shift operator)

バイナリー論理演算子

&&

論理積 (AND)

||

論理和 (OR)

??

Null 合体演算子 (nullish coalescing operator)

オプショナルチェーン演算子

?.

オプショナルチェーン演算子 (optional chaining operator)

代入演算子

[a, b] = [1, 2] とか {a, b} = {a:1, b:2}

分割代入

TypeScript

!

非nullアサーション演算子(non-null assertion operator)

まとめ

いやはや、JavaScript なのか TypeScript なのか判断がつかないですね。
(結構、混同して書いている記事も多かったです)

インゲージではエンジニアを募集しています。 詳細は以下のページからお願いします!

https://ingage.co.jp/recruit/

Slack から「PRレビューお願いします」を抹殺する

どうも、@shutooike です。

今回は

"GitHub でレビュワーに設定して、Slack で「@reviewer PR#1 のレビューお願いします!」と連絡する"

というめんどくさい運用の Slack 側のメッセージを抹殺できる GitHub の機能 「Scheduled reminders」 を紹介します。

抹殺方法

設定画面

「Scheduled reminders」は設定した時間に自分 or チームがレビュワーにアサインされているPRのリストを Slack に通知してくれる GitHub の機能です。

この機能には「Enable real-time alerts」という設定があり、オンにすると GitHub のイベントをリアルタイムで Slack に通知できます。

僕は以下イベント

  • 自分がレビュワーに設定された時
  • チームがレビュワーに設定された時
  • 自分のPRが approved か changes requested された時
  • 自分のPRにコメントがついた時
  • 自分の参加しているスレッドにコメントがついた時
  • コメントでメンションされた時
  • 自分のPRがマージされた時

の通知が来るように設定したことで

  • 「PRレビューお願いします」
  • 「レビューしました。修正お願いします」
  • 「コメント返してます」
  • 「レビューの修正しました。再度レビューお願いします。」

Slack で行われていた上記のようなメッセージを抹殺することができました。

(詳しい設定方法は GitHub のドキュメント をご参照ください。)

おわりに

現在「PRレビューの待ち時間」がチームの課題としてあり、施策を練っているときにこの機能を見つけました。*1

Slack の GitHub アプリでは個人向けに通知をカスタマイズ出来ず、無理なのかーと諦めていましたが、GitHub 側にあったんですね。無知、恐ろしい...

【宣伝】 インゲージでは弊社のバリューでもある「成功も失敗も共有」できるエンジニアを募集してます!

詳しくは下記リンクまで!

ingage.co.jp

ではまた!

*1:「PRレビューの待ち時間」の話はまたどこかでできたらなと思います。

docker compose cpコマンドでホスト・コンテナ間のファイルコピーする

どうも、にしむらです。

docker-composeにはコンテナとのファイルコピーをするコマンドが無いので、 docker cpコマンドを使っていたのですが docker compose にはコピーコマンドcpがありました。

docker compose cp リファレンス

動作確認環境

  • Mac OS 11.6.5

  • Docker Desktop 4.8.1

コンテナからホストへのコピー

# docker compose cp [OPTIONS] SERVICE:SRC_PATH DEST_PATH

# appコンテナの /app/log/development.log をホストのカレントにコピーする
docker compose cp app:/app/log/developoment.log . 

# appコンテナの /app/log/development.log をホストのカレントの/tmp/log/にコピーする
docker compose cp app:/app/log/ ./tmp/log/

ホストからコンテナへのコピー

# docker compose cp [OPTIONS] SRC_PATH SERVICE:DEST_PATH

# カレントtmp/test.sqlをdbコンテナのルートディレクトリへコピーする
docker compose cp ./tmp/test.sql db:/

# カレントtmp/sql/をdbコンテナのルートディレクトリへコピーする
docker compsoe cp ./tmp/sql/ db:/sql/

コンテナのユーザー権限によってはパーミッションエラーになる場合があります。その場合はroot権限でコンテナに入って権限を変更する必要があります。

docker compose exec app -u root bash

インゲージではエンジニアを募集しています!

ingage.co.jp