20200918のMacに関する記事は6件です。

【Vue.js】 IF文・For文 条件分岐、繰り返し処理

【ゴール】

VueJSでの IF文・For文 条件分岐、繰り返し処理

【環境】

mac catarina 10.156
Vue.js v2.6.12

【実装】

①適当にワークスペース作成
Vue.jsインストール or 埋め込み(重要)

If文 

■「v-if」 / 「v-else」 を使用

index.html
<div id="app">
  <p v-if="ok">OK</p>
  <p v-else>Not OK</p>
</div>
.
.
.
.
<script>
 new Vue ( {
   el: '#app',
   data: {
     ok: true  //ここが、true:OK表示、false: NotOKが表示される
   }
 })
</script>

For文

■「v-for」使用

index.html
<div id="app">
  <ul>
    <li v-for="name in names">{{name}}</li>
  </ul>
</div>
.
.
.
.
<script>
 new Vue ( {
   el: '#app',
   data: {
     names: ['tarou', 'hanako', 'misaki']
   }
 })
</script>

結果

スクリーンショット 2020-09-18 16.39.09.png

【まとめ】

■基本天気な挙動を理解している方だとすぐに理解できる

■If文は「true」「false」を上手く使い分ける

■for文は記述の省略につながるので覚えていて損なし

【オススメ記事】

■ 【node.js】ルーティング設定ホーム画面表示させる。
https://qiita.com/tanaka-yu3/items/1c8859e16070e67d73c0

■ 【Node.js mysql】mysql接続 データを取り出す
https://qiita.com/tanaka-yu3/items/6b007dd96618bb6c844e

■ 【javascript】 テンプレートリテラル とは 一言で。
https://qiita.com/tanaka-yu3/items/9b07bd9fc4126291be28

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Django(Python)をDockerで立ち上げたメモ

はじめに

  • DjangoとDockerの学習
  • Python,Djangoのwebフレームワークを学びたかったが、環境構築が複雑だったため、仮想環境で立ちあげることにした。
  • 基本はDockerの公式通りだが、公式通り書くとエラーがおきるため、一部修正した
  • 公式はDjango × Postgresの構成

環境

  • Docker on Mac

手順(準備と立ち上げ)

  • プロジェクト用のディレクトリを作成し、移動。 ここではlinebotというアプリ名で進める。
MacBook-Air ~ % mkdir jinolinebot
MacBook-Air ~ % cd jinolinebot
MacBook-Air jinolinebot % 
  • Dockerfileを作成し、エディターで開く。
MacBook-Air jinolinebot % touch Dockerfile
  • Dockerfileを編集し、保存。
Dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
  • requirements.txt を作成し、以下のように編集する
MacBook-Air jinolinebot % touch requirements.txt
requirements.txt
Django>=1.8,<2.0
psycopg2
  • docker-compose.ymlを作成し、以下のように編集する
MacBook-Air jinolinebot % touch docker-compose.yml
docker-compose.yml
version: '3'

services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

  • これで3つのファイルが準備が完了したのでアプリを立ち上げる。
MacBook-Air jinolinebot % docker-compose run web django-admin.py startproject アプリ名
Creating network "jinolinebot_default" with the default driver
Building web
Step 1/7 : FROM python:3
 ---> 28a4c88cdbbf
~
Creating jinolinebot_db_1 ... done
Creating jinolinebot_web_run ... done
  • 立ち上がったら、次はデータベースへの接続設定をおこなう さきほどのコマンドで生成された設定ファイルの中を以下のように編集し、保存。
アプリ名/settings.py
~
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
~
MacBook-Air jinolinebot % docker-compose up
~
Starting development server at http://0.0.0.0:8000/
web_1  | Quit the server with CONTROL-C.
  • It worked! Congratulations on your first Django-powered page.と表示されたら成功.

参考文献

https://docs.docker.jp/compose/django.html#id2

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Django(Python)アプリをDockerで環境構築したメモ

はじめに

  • Python,Djangoのwebフレームワークを学びたかったが、環境構築が複雑だったため、仮想環境で立ちあげることにした。
  • 基本はDockerの公式ページ通りだが、公式通り書くとエラーがおきるため、一部修正した
  • 公式はDjango × Postgresの構成

環境

  • Docker on Mac

追記

  • 2020/9/22 コマンドを修正

手順(準備と立ち上げ)

プロジェクト用のディレクトリを作成し、移動。 ここではlinebotというアプリ名で進める。

MacBook-Air ~ % mkdir jinolinebot
MacBook-Air ~ % cd jinolinebot
MacBook-Air jinolinebot % 

Dockerfileを作成し、エディターで開く。

MacBook-Air jinolinebot % touch Dockerfile

Dockerfileを編集し、保存。

Dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

requirements.txt を作成し、以下のように編集する

MacBook-Air jinolinebot % touch requirements.txt
requirements.txt
Django>=1.8,<2.0
psycopg2

docker-compose.ymlを作成し、以下のように編集する

MacBook-Air jinolinebot % touch docker-compose.yml
docker-compose.yml
version: '3'

services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

これで3つのファイルが準備が完了したのでアプリを立ち上げる。

MacBook-Air jinolinebot % docker-compose run web django-admin startproject アプリ名 .
Creating network "jinolinebot_default" with the default driver
Building web
Step 1/7 : FROM python:3
 ---> 28a4c88cdbbf
~
Creating jinolinebot_db_1 ... done
Creating jinolinebot_web_run ... done

立ち上がったら、次はデータベースへの接続設定をおこなう
さきほどのコマンドで生成された設定ファイルの中を以下のように編集し、保存。

アプリ名/settings.py
~
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
~

コンテナを立ち上げ、以下の表示が一番したに表示されたら、http://0.0.0.0:8000/にアクセス

MacBook-Air jinolinebot % docker-compose up
~
Starting development server at http://0.0.0.0:8000/
web_1  | Quit the server with CONTROL-C.

It worked!
Congratulations on your first Django-powered page.と表示されたら成功.

作成したdockerのファイル

https://github.com/yongjugithub/djangodocker

参考文献

https://docs.docker.jp/compose/django.html#id2

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

インストールしてあるのに、ModuleNotFoundError: No module named 'xxx' になるとき

久々にkerasをimportしたらエラー。。。

>>> import keras
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'keras'

なんなら、numpyもだめ

>>> import numpy
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'numpy'

こいつは、環境側ってことで

import sys
import pprint
pprint.pprint(sys.path)

とすると、"/usr/local/lib/python3.8/site-packages"が無い・・・

import sys
sys.path.append("/usr/local/lib/python3.8/site-packages")
import keras

でOK。
xcodeのupdateが原因?!?!?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AppleScript 七つ道具 〜 Mac 上の反復入力は簡単に自動化できる。

イントロダクション

前提

  • この記事は、Mac ユーザー向けです。
  • 使用マシンは、macOS Catalina バージョン 10.15.1 です。

背景/課題

  • PC を使っていると、大量のデータを反復入力せざるを得ない場面はありませんか?
  • たとえば、Web アプリケーションに、エクセルのデータを、今週中に数百件入力しなければならない。。。考えるだけでうんざりします。
  • 腹をくくって、さあやるぞ!と始めても、途中で投げ出したくなること必至ではないでしょうか。
  • 「あ〜〜、もうめんどくさっ!!」と思ったら、良い方法があります。

解決策

  • その課題、AppleScript で解決できます!
  • AppleScript は macOS に同梱されている基本ソフトです。
  • つまりマックユーザーなら誰でも使用可能なアプリです。知名度はあまり高くないかも知れません。(私自身数ヶ月前に知りました。)
  • AppleScript は、アプリの呼び出し、キーボード入力、処理の分岐と繰り返し、などを記述できる言語です。
  • つまり、キーボードからの入力を完全にコード化でき、記述された通りに自動実行させることができるということです。

この文書の内容

  • この文書では、AppleScript の基本操作を「AppleScript 七つ道具」としてご紹介します。
  • また、その「七つ道具」を使って、実際に動くサンプルのスクリプトを作成します。

この文書の目的

  • AppleScript は繰り返しの作業を自動実行するために活用できます!
  • 習得は容易で、基本操作を覚えれば、一通りの操作はできるようになります。
  • このページを参照した方が、これまで手作業でやっていた大量の反復作業 / 繰り返し作業を、AppleScript を使って、より速く、正確に、また快適にできるようになっていただければ嬉しいです。

AppleScript の作成/実行環境を立ち上げる

  • Mac OS にもともと入っているアプリ、スクリプトエディタを立ち上げてください。
    • スクリプトエディタは、AppleScript を記述 / 実行できるアプリです。
    • コードを記述して保存すると、.scp という拡張子のファイルが作成されます。

image.png

  • 立ち上がったら準備完了です!
  • コーディングを始めて行きましょう!

七つ道具を使ったサンプル

  • では実際に「AppleScript 七つ道具」を使って、簡単なアプリケーション間処理を作成して行きましょう。
  • Google グループへのメンバー登録を自動実行する AppleScript を作成します。

  • 処理の流れはこのような感じです。

    • メーリスメンバーのメアドが入ったエクセルを開く
    • メアド、登録ステータス
    • Google グループの登録画面を開く
    • 登録処理を始める
    • エクセルで、登録ステータスをチェックし、未登録であればメンバー登録する
    • 登録したら、エクセルの登録ステータスを更新する
  • 付記: これ自体は単純な処理で実際に使うことはあまりないかも知れません。実際には手で登録した方が早いと思います。ですが、エクセルの内容を Web に入力する型として、色々な処理パターンに応用できると思います。システムへの大量照会、登録/更新もその一例です。

事前準備

  • エクセルファイルを作成し、Google グループに登録するメールアドレスを記載し、開いておきます。
    image.png

  • また、Google グループを作成し、ブラウザ上で、その登録ページを開いておきます。
    image.png

道具① アプリを呼び出す (tell)

  • まずは AppleScript でアプリケーション (以下アプリ) を呼び出してみましょう。
  • アプリを呼び出すとは、そのアプリのウィンドウを最前面に表示させて操作可能にすることです。

コードの説明

  • アプリを呼び出すコードはとても簡単です。
  • tell application "アプリケーション名" to activate
  • これだけです!
  • では実際に AppleScript を自分で書いて実行してみましょう。
  • まず Mac 同梱ソフトであるスクリプトエディタを起動します。
  • スクリプトエディタは、AppleScript を記述して実行させることができるアプリです。

コード実例

  • スクリプトエディタを起動したら、メニューバーから、ファイル、新規を選択します。
  • 以下のようにコードを記述します。
  • tell application "Google Chrome" to activate -- AppleScript Tool 1 tell application "Microsoft Excel" to activate -- AppleScript Tool 1
  • -- 以降はコメントとなります。コードとして扱われません。
  • 複数行をコメントしたい場合は、(* と *) で囲みます。

稼働確認

  • AppleScript 実行前準備として、Microsoft Excel (以下 Excel) と Google Chrome (以下 Chrome) を起動させておきます。
  • スクリプトエディタの実行ボタンを押します。
  • 最初に Chrome、次に Excel の画面がアクティブになったら成功です!
  • 1つ目の道具で、アプリケーションを呼び出すことができるようになりました。

道具② キーボード入力 (でアプリを操作) する (key code)

  • 次に、呼び出したアプリ上で、キーボード入力をさせてみましょう。
  • これができると、アプリ呼び出しと、キーボード入力ができることになり、トラックパッド (マウス) 以外の全てのユーザーインプットをコード (プログラム) で表現できるようになります。
  • そしてコード化された操作は自動実行できます。

コードの説明

  • キーボード入力はこのように記述します。
  • tell application "System Events"
    key code XX   -- (*) XX に数字を入れます。
    end tell

  • Key Code とは Mac キーボードの各ボタンに割り当てられた番号です。こちらのマッピング図が便利です。

  • よく使うものを挙げてみました。

    • タブ key code 48 -- tab
    • リターン key code 36 -- return
    • エスケープ key code 53-- escape
    • スペース key code 49-- tab
    • カーソル移動
    • key code 123 -- left
    • key code 124 -- right
    • key code 125 -- down
    • key code 126 -- up
    • command + ?
      • key code {55, 0} -- command + A, 全て選択
      • key code {55, 1} -- command + S, 保存
      • key code {55, 3} -- command + F, 検索
      • key code {55, 5} -- command + G, 置換
      • key code {55, 6} -- command + Z, 元に戻す
      • key code {55, 7} -- command + X, 切り取り
      • key code {55, 8} -- command + C, コピー
      • key code {55, 9} -- command + V, ペースト
      • key code {55, 13} -- command + W, 画面を閉じる
      • key code {55, 35} -- command + P, プリント
    • その他
      • key code 124 using shift down -- shift + right

コーディング実例

  • 下記のコードは、エクセルのメアドのセルをコピーして、別のセルへペーストするものです。

道具② のサンプルコード


tell application "System Events" -- AppleScript Tool 2
key code {55, 8} -- command + C、メールアドレスをコピー
key code 124 -- right、カーソル移動
key code 124 -- right
key code {55, 9} -- command + V、メルアドレスをペースト
end tell

稼働確認

  • 実行してみましょう!
  • エクセル上のメアドが、別のセルにコピーされたら成功です!

道具③ 画面内の任意の文字列を検索する (clipboard)

  • 次は、Web 画面での入力です。
  • まず、入力したい項目にカーソルを移動する必要があります。
  • ブラウザの検索機能を利用して、Web 画面上の任意の項目に移動する処理を作成します。

コードの説明

  • 具体的な手順はこのようにします。
  • Web ブラウザをアクティブ化し、command + f を押します。
  • 検索画面が表示されるので、そこに検索する値を入力します。
  • その際 AppleScript の clipboard (変数) を使うと便利です。clipboard に値を入れると、OS のクリップボードに値が入ります。

コーディング実例

  • ブラウザに表示された Google グループの "メンバーを追加" ボタンを押下します。

道具③ のサンプルコード

``
tell application "Google Chrome" to activate -- AppleScript Tool 1

tell application "System Events" -- AppleScript Tool 2
-- Web ページで "メンバーを追加" を検索する
set the clipboard to "メンバーを追加" -- AppleScript Tool 3
delay 1
key code {55, 3} -- command + F
delay 1
key code {55, 9} -- command + V, clipboard の値がペーストされる
delay 1
key code 36 -- return
delay 1
key code 53 -- escape
delay 1
key code 49 -- space
-- メンバーを追加する
end tell
``

  • ここで delay というコードが登場しています。
    • delay は AppleScript 実行を一時止める機能です。
    • delay n   (*) n には数字が入ります。
    • 前の処理が完了する前に次の処理を実行しないように調節のため使用します。
    • 最初は各処理の後ろに delay 1 を一律入れておけば良いかと思います。
    • 慣れて来たら delay を減らしたりして "チューニング" すると、処理がより高速になります。

稼働確認

  • Web ページ上で、Google グループの "メンバーを追加" を押下できました。

道具② と 道具③ を合わせます。

  • ここで、道具③ の後に、道具② を追加して、Google グループの処理に、エクセルの処理をつなげます。
  • さらにその後ろに、エクセルから取得したメールアドレスを、Google グループの新規メンバーに登録する操作を追加します。

コーディング実例

  • AppleScript のコードはこのようになります。

道具②+③ のサンプルコード

``

tell application "Google Chrome" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2

-- Web ページで "メンバーを追加" を検索する
set the clipboard to "メンバーを追加" -- AppleScript Tool 3
delay 1
key code {55, 3} -- command + F
delay 1
key code {55, 9} -- command + V,、clipboard の値がペーストされる
delay 1
key code 36 -- return
delay 1
key code 53 -- escape
delay 1
key code 49 -- space、"メンバーを追加" ボタンを押す
delay 1

end tell

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
key code {55, 8} -- command + C、メールアドレスをコピー
delay 1
--key code 124 -- right
--key code 124 -- right
--key code {55, 9} -- command + V
end tell

tell application "Google Chrome" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
-- メンバーを追加する
key code {55, 9} -- command + V、メールアドレスをペースト
delay 1
key code 48 -- tab
key code 48 -- tab
key code 48 -- tab
key code 48 -- tab
key code 48 -- tab
key code 48 -- tab
key code 48 -- tab
key code 48 -- tab
delay 1
key code 49 -- space、"メンバーを追加" ボタンを押す
delay 1
end tell
``

コードの説明

  • 処理の流れはこのようになります。
    • まず、Google クロームを開き、Google グループの "メンバーを追加" ボタンを押下します。
    • 次に、エクセルのメアドをコピーします。
    • 最後に、Google グループの新しいメンバーにメアドをコピーして、新規登録します。

稼働確認

  • エクセルから取得したメールアドレスを、Google グループの新規メンバーに登録することができました。

道具④ 処理を条件分岐させる (if)

  • 条件によって処理を分岐させることができれば、更に便利です。

コードの説明① if

  • AppleScript でも条件分岐が書けます。
  • if 変数 is equal to "値1" then         処理 xxx     else if (the clipboard) is "値2" then         処理 yyy     else end if

コードの説明② clipboard

  • クリップボードにコピーした値を条件にすることもできます。(これが結構使えます)
  • set the clipboard to "xxx" if 変数 is equal to "値1" then         処理 xxx     else if (the clipboard) is "値2" then         処理 yyy     else end if

コードの説明③ display dialog

  • ポップアップ画面を表示させることができます。
  • display dialog "文字列" のように記述すると、その文字列の画面が表示されます。

コーディング実例

  • このコードを適用して、エクセルの列の値を条件にして、処理を変えてみましょう。
  • 以下のコードでは、グループに登録済みであれば処理をスキップし、未登録であればメンバー登録する、という条件分岐にしています。

道具④ のサンプルコード

``
tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2

set the clipboard to "" -- クリップボードの値をクリアする
key code 124 -- right、カーソル移動
delay 1
key code {55, 8} -- command + C、登録済みステータスをコピー
delay 1 -- 必要 (確実にクリップボードにコピーした後に次の処理に入るために必要)

end tell

-- Googleグループに登録済みか確認する
if (the clipboard) is equal to "added" then -- AppleScript Tool 4
display dialog ("このメンバーは登録済みです") -- メッセージ画面を表示する
error number -128 -- 処理を中断する
end if

tell application "Google Chrome" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
-- Web ページで "メンバーを追加" を検索する
set the clipboard to "メンバーを追加" -- AppleScript Tool 3
delay 1
key code {55, 3} -- command + F
delay 1
key code {55, 9} -- command + V、clipboard の値がペーストされる
delay 1
key code 36 -- return
delay 1
key code 53 -- escape
delay 1
key code 49 -- space、"メンバーを追加" ボタンを押す
delay 1

end tell

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2

set the clipboard to "" -- クリップボードの値をクリアする
key code 123 -- left、カーソル移動
delay 1
key code {55, 8} -- command + C、メールアドレスをコピー
delay 1

end tell

tell application "Google Chrome" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
-- メンバーを追加する
key code {55, 9} -- command + V、メールアドレスをペースト
delay 1
key code 48 -- tab
key code 48 -- tab
key code 48 -- tab
key code 48 -- tab
key code 48 -- tab
key code 48 -- tab
key code 48 -- tab
key code 48 -- tab
delay 1
key code 49 -- space、"メンバーを追加" ボタンを押す
delay 1
end tell
``

稼働確認

  • 未登録のメンバーだけが、Google グループにメンバー登録されたと思います。

道具⑤ 処理のまとまりを作る (部品化, ハンドラー) (on - end, my)

  • コードが少し長くなってきましたね。
  • 処理をまとまりごとに整理すると、ぐっと見やすくなります。

コードの説明① on, end

  • on と end で括ると処理のまとまりにできます。これをハンドラーと言います。
  • on xxx(),  end xxx
  • (*) xxx はハンドラーの名前です。任意の名前にすることができます。

コードの説明② my

  • on - end で括ると、括られた部分は実行されなくなります。
  • そのハンドラーを実行させるには、my を使います。
  • my xxx()

コードの説明③ keystroke

  • また今回 keystroke 使ってみたいと思います。
  • keystroke "xxxxx"
  • keystroke を使うと、任意の文字列を入力できます。
    • 固定値だけでなく変数も使える。
    • ただし日本語は入力できないようです。
    • keystroke を使う場合は、キーボード入力を英数入力にしておく必要があります。

コーディング実例

  • ハンドラーにまとめることで、コード内にある各処理の内容と、実行の順番が明確になりました。
  • また、keystroke を使って、Google グループへの登録ステータスを、エクセルに入力するようにしました。

道具⑤ のサンプルコード

``

-- ハンドラーの実行指示、AppleScript Tool 5
my checkAdded() -- メンバーがGoogleグループに登録済みか確認する

-- 登録済みの場合
if (the clipboard) is equal to "added" then -- AppleScript Tool 4
display dialog ("このメンバーは登録済みです") -- メッセージ画面を表示する
return -- 処理を中断する

end if

my pushAddMember() -- "メンバーを追加" の画面を表示させる
my copyMailAddress() -- エクセルのメールアドレスをコピーする
my addMember() -- メールアドレスをペーストし、"メンバーを追加" ボタンを押す
my markRegistered() -- 登録済みを示すために added と追記する

on checkAdded() -- メンバーがGoogleグループに登録済みか確認する

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    set the clipboard to "" -- クリップボードの値をクリアする
    key code 124 -- right、カーソル移動
    delay 1
    key code {55, 8} -- command + C、登録済みステータスをコピー
    delay 1 -- 必要 (確実にクリップボードにコピーした後に次の処理に入るために必要)
end tell

end checkAdded

on pushAddMember() -- "メンバーを追加" の画面を表示させる

tell application "Google Chrome" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    -- Web ページで "メンバーを追加" ボタンを検索する
    set the clipboard to "メンバーを追加" -- AppleScript Tool 3
    delay 1
    key code {55, 3} -- command + F
    delay 1
    key code {55, 9} -- command + V、clipboard の値がペーストされる
    delay 1
    key code 36 -- return
    delay 1
    key code 53 -- escape
    delay 1
    key code 49 -- space、"メンバーを追加" ボタンを押す
    delay 1
end tell

end pushAddMember

on copyMailAddress() -- エクセルのメールアドレスをコピーする

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    set the clipboard to "" -- クリップボードの値をクリアする
    key code 123 -- left、カーソル移動
    delay 1
    key code {55, 8} -- command + C、メールアドレスをコピー
    delay 1
end tell

end copyMailAddress

on addMember() -- メールアドレスをペーストし、"メンバーを追加" ボタンを押す

tell application "Google Chrome" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    -- メンバーを追加する
    key code {55, 9} -- command + V、メールアドレスをペースト
    delay 1
    key code 48 -- tab
    key code 48 -- tab
    key code 48 -- tab
    key code 48 -- tab
    key code 48 -- tab
    key code 48 -- tab
    key code 48 -- tab
    key code 48 -- tab
    delay 1
    key code 49 -- space、"メンバーを追加" ボタンを押す
    delay 1
end tell

end addMember

on markRegistered() -- 登録済みを示すために added と追記する

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    key code 124 -- right、カーソル移動
    delay 1
    keystroke "added" -- Googleグループ登録済みとして added と入力
    delay 1
end tell

end markRegistered
``

稼働確認

  • ハンドラー (on-end, my) を使って、AppleScript のコードを見やすく整理することができました。

道具⑥ 処理を繰り返す (repeat)

  • いよいよコード化された処理を、繰り返して実行させます。
  • これをすると処理をコード化した意味があります!

コードの説明① repeat n times

  • 処理を n 回実行させるコードです。
  • repeat n times repeat end
  • n には数字が入ります。
  • 固定値だけでなく変数も扱えます。
  • 変数の初期化は、set 変数 to 値 のようにします。
  • 変数はハンドラー内で有効です。複数のハンドラーをまたいで使用したい場合は、global 変数として宣言すれば OK です。例 global hensu

コードの説明② repeat while

  • ある条件を満たすまで、処理を繰り返させるコードです。
  • 条件は、ある変数がある値になるまで、という書き方をします。
  • このコード例では、変数としてクリップボードを利用しています。
  • repeat while ((the clipboard) is not "xxx") end repeat

コーディング実例

  • このコードでは、repeat while, clipboard を利用して、エクセルからコピーした値がブランクになるまで処理を繰り返させています。 - また、repeat n times を利用して、8回実行していたタブ押下を一つにまとめています。

道具⑥ のサンプルコード

``
-- ハンドラーの実行指示、AppleScript Tool 5

my copyCell() -- エクセルのメールアドレスをコピーする

repeat while ((the clipboard) is not "") -- AppleScript Tool 6

my checkAdded() -- メンバーがGoogleグループに登録済みか確認する

-- 登録済みでない場合
if (the clipboard) is not equal to "added" then -- AppleScript Tool 4   
    my pushAddMember() -- "メンバーを追加" の画面を表示させる
    my copyMailAddress() -- エクセルのメールアドレスをコピーする
    my addMember() -- メールアドレスをペーストし、"メンバーを追加" ボタンを押す
    my markRegistered() -- 登録済みを示すために added と追記する
end if

my gotoNextMember() -- 次のメンバーの行に移る
my copyCell() -- エクセルのメールアドレスをコピーする

end repeat

on copyCell() -- エクセルのメールアドレスをコピーする

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    key code {55, 8} -- command + C、メールアドレスをコピー
    delay 1
end tell

end copyCell

on checkAdded() -- メンバーがGoogleグループに登録済みか確認する

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2

    set the clipboard to "" -- クリップボードの値をクリアする
    key code 124 -- right、カーソル移動
    delay 1
    key code {55, 8} -- command + C、登録済みステータスをコピー
    delay 1 -- 必要 (確実にクリップボードにコピーした後に次の処理に入るために必要)

end tell

end checkAdded

on pushAddMember() -- "メンバーを追加" の画面を表示させる

tell application "Google Chrome" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    -- Web ページで "メンバーを追加" ボタンを検索する
    set the clipboard to "メンバーを追加" -- AppleScript Tool 3
    delay 1
    key code {55, 3} -- command + F
    delay 1
    key code {55, 9} -- command + V、clipboard の値がペーストされる
    delay 1
    key code 36 -- return
    delay 1
    key code 53 -- escape
    delay 1
    key code 49 -- space、"メンバーを追加" ボタンを押す
    delay 1
end tell

end pushAddMember

on copyMailAddress() -- エクセルのメールアドレスをコピーする

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2

    set the clipboard to "" -- クリップボードの値をクリアする
    key code 123 -- left、カーソル移動
    delay 1
    key code {55, 8} -- command + C、メールアドレスをコピー
    delay 1

end tell

end copyMailAddress

on addMember() -- メールアドレスをペーストし、"メンバーを追加" ボタンを押す

tell application "Google Chrome" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    -- メンバーを追加する
    key code {55, 9} -- command + V、メールアドレスをペースト
    delay 1
    repeat 8 times
        key code 48 -- tab
    end repeat
    delay 1
    key code 49 -- space、"メンバーを追加" ボタンを押す
    delay 1
end tell

end addMember

on markRegistered() -- 登録済みを示すために added と追記する

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    key code 124 -- right、カーソル移動
    delay 1
    keystroke "added" -- Googleグループ登録済みとして added と入力
    delay 1
end tell

end markRegistered

on gotoNextMember() -- 次のメンバーの行に移る

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    key code 125 -- down
    key code 123 -- left
    delay 1
end tell

end gotoNextMember
``

稼働確認

  • エクセルの最終行まで処理を繰り返すことができました。

道具⑦ マックに喋らせる (say)

  • いよいよ七つ目の道具です。最後はマックに喋らせてみましょう。

コードの説明
say "xxxxx"

  • これだけです!
  • 日本語 OK です。かなり流暢な日本語を話します。
  • AppleScript に喋らせると、俄然ロボットらしくなります (笑)。

  • とは言え、喋らせるのは単なるお遊びではなく、実際的な使い道があります

  • それは、処理の要所要所で完了を報告させるということです。

  • AppleScript を使って、大量のデータ処理をさせる時、PC 画面の前でずっと監視する訳にはいきません。それでは自動化した意味がありません。AppleScript 実行中は別の作業をすることになりますが、その場合 AppleScript が「沈黙」していると、処理がうまく行っているのか、途中でエラー終了してしまっているのか判別できません。

  • say は、AppleScript の実行状況を確認するためにとても便利です。

  • 少なくとも repeat のタイミングで処理完了を報告させると良いかと思います。

  • また異常終了した場合も報告させると便利です。

コーディング実例

  • 処理の要所要所で say を入れると良いかと思います。
  • ここでは処理の開始時、メンバー登録時、完了時の3つのタイミングで、マックに喋らせています

道具⑦ のサンプルコード

``
-- ハンドラーの実行指示、AppleScript Tool 5

say "グーグルグループへのメンバー登録を始めます" -- AppleScript Tool 7

my copyCell() -- エクセルのメールアドレスをコピーする

repeat while ((the clipboard) is not "") -- AppleScript Tool 6

my checkAdded() -- メンバーがGoogleグループに登録済みか確認する

if (the clipboard) is equal to "added" then -- AppleScript Tool 4
    say "このメンバーは登録済みです。次のメンバーに進みます" -- 登録済みの場合
else -- 登録済みでない場合
    my pushAddMember() -- "メンバーを追加" の画面を表示させる
    my copyMailAddress() -- エクセルのメールアドレスをコピーする
    my addMember() -- メールアドレスをペーストし、"メンバーを追加" ボタンを押す
    my markRegistered() -- 登録済みを示すために added と追記する
    say "グーグルグループにメンバーを登録しました。次のメンバーに進みます"
end if

my gotoNextMember() -- 次のメンバーの行に移る
my copyCell() -- エクセルのメールアドレスをコピーする

end repeat

say "メンバー登録が完了しました"

on copyCell() -- エクセルのメールアドレスをコピーする

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    key code {55, 8} -- command + C、メールアドレスをコピー
    delay 1
end tell

end copyCell

on checkAdded() -- メンバーがGoogleグループに登録済みか確認する

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    set the clipboard to "" -- クリップボードの値をクリアする
    key code 124 -- right、カーソル移動
    delay 1
    key code {55, 8} -- command + C、登録済みステータスをコピー
    delay 1 -- 必要 (確実にクリップボードにコピーした後に次の処理に入るために必要)
end tell

end checkAdded

on pushAddMember() -- "メンバーを追加" の画面を表示させる

tell application "Google Chrome" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    -- Web ページで "メンバーを追加" ボタンを検索する
    set the clipboard to "メンバーを追加" -- AppleScript Tool 3
    delay 1
    key code {55, 3} -- command + F
    delay 1
    key code {55, 9} -- command + V、clipboard の値がペーストされる
    delay 1
    key code 36 -- return
    delay 1
    key code 53 -- escape
    delay 1
    key code 49 -- space、"メンバーを追加" ボタンを押す
    delay 1
end tell

end pushAddMember

on copyMailAddress() -- エクセルのメールアドレスをコピーする

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    set the clipboard to "" -- クリップボードの値をクリアする
    key code 123 -- left、カーソル移動
    delay 1
    key code {55, 8} -- command + C、メールアドレスをコピー
    delay 1
end tell

end copyMailAddress

on addMember() -- メールアドレスをペーストし、"メンバーを追加" ボタンを押す

tell application "Google Chrome" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    -- メンバーを追加する
    key code {55, 9} -- command + V、メールアドレスをペースト
    delay 1
    repeat 8 times
        key code 48 -- tab
    end repeat
    delay 1
    key code 49 -- space、"メンバーを追加" ボタンを押す
    delay 1
end tell

end addMember

on markRegistered() -- 登録済みを示すために added と追記する

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    key code 124 -- right、カーソル移動
    delay 1
    keystroke "added" -- Googleグループ登録済みとして added と入力
    delay 1
end tell

end markRegistered

on gotoNextMember() -- 次のメンバーの行に移る

tell application "Microsoft Excel" to activate -- AppleScript Tool 1
delay 1

tell application "System Events" -- AppleScript Tool 2
    key code 125 -- down
    key code 123 -- left
    delay 1
end tell

end gotoNextMember
``

稼働確認

  • say によって、AppleScript が今何の処理をしているのかが、よく分かるようになりました。
  • say は変数も扱えますので、大量の件数を処理する場合「xx件中、xx件の登録が完了しました」のように喋らせることもできます。

AppleScript 七つ道具

  • AppleScript 七つ道具 として、
    • tell
    • key code
    • clipboard
    • if
    • on - end
    • repeat
    • say
  • をご紹介しました。
  • これらを活用すれば、Mac 上のほとんどすべてアプリを、自在にコントロールできるようになります。

以上で説明は終わりです。

  • お疲れさまでした。最後まで記事を読んでいただきありがとうございます!
  • 記事を読まれた方が、手作業でやっていた大量の反復作業を、AppleScript を利用することによって、より速く・正確に・快適に実施していただけるようになれば幸いです!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[sed] macOSでもLinuxでもsedを使ってtab文字を置換する

要約

ASCIIコードを用いることで、macOSでもLinuxでも同じ書き方でtab文字を置換できるようになります。

TAB="$(printf '\\\011')"
printf "hoge\tfuga\n" | sed "s/${TAB}/,/g"

sedのOS依存 (BSD sed vs GNU sed)

sedの使用例として、タブ区切りをコンマ区切りにする下記のスクリプトをよく用いていました。

# Linux
$ printf "foo\tbar\n"
foo    bar
$ printf "foo\tbar\n" | sed "s/\t/,/g"
foo,bar

しかし:point_up:の方法ではmacOSではうまく置換できません。

# macOS
$ printf "foo\tbar\n"
foo    bar
$ printf "foo\tbar\n" | sed "s/\t/,/g"
foo    bar # <-変わっていない!

どうやらこの違いはmacOSはBSD sedで、LinuxはGNU sedを使用していることに起因するようです。

BSD sedでタブ文字置換をどうするかついて、過去のQiita記事にございました:bow:

(同じタイトルですが、違う記事です)

しかし上記事の方法は使用状況が限られるため、もう少し汎用性を持ちたいと思っていたところ、次の記事がございました。

上記事では以下のようにASCIIコードを使ってLF(改行)を表現していました。

LF=$(printf '\\\012_')
LF=${LF%_}

echo "hogehoge\nfoo\nbar" | sed 's/\\n/'"$LF"'/g'

この方法はそのままタブ文字に応用できるのでは、と思って検証したところ、無事に動作しました。

# ASCIIコードで水平タブ(HT)は011です
TAB="$(printf '\\\011')" 
printf "hoge\tfuga\n" | sed "s/${TAB}/,/g"

これでmacOSでもLinuxでも、同じ書き方でtab文字を置換できるようになりました。

検証環境

# macOS
- OS: Catalina 10.15.6 19G2021 x86_64
- Kernel: 19.6.0
- Shell: zsh 5.7.1

# Linux
- OS: Linux Mint 20 x86_64
- kernel: 5.4.0-47-generic
- shell: bash 5.0.17
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む