20200520のMacに関する記事は8件です。

【Mac】pip install のエラーの解決策 【Python】

pythonエンジニアで初心者の自分が困ってて解決したことをシェアします。

pip install のエラー

pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.

Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/pip/

などのエラーが出た時の対処法

根本的な原因が全く分からないので、とりあえずエラー文章やsslとは、など初めて見る単語を調べてました。解決策自体はいろいろあるみたいです。

-環境-
macOS 10.14.6
python 3.6.6
venv(仮想環境)

原因

おそらくpip/pythonが古いopenssl(1.0.2s)を参照しているのではありませんか? 情報を見る限り、質問者の方のopensslは最新版になっているので参照エラーが起きているように思います

下記でsslが使えるかチェックします。

py
import ssl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/[username]/.pyenv/versions/3.7.0/lib/python3.7/ssl.py", line 98, in <module>
    import _ssl             # if we can't import it, let the error propagate
ImportError: dlopen(/Users/[username]/.pyenv/versions/3.7.0/lib/python3.7/lib-dynload/_ssl.cpython-37m-darwin.so, 2): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /Users/LO/.pyenv/versions/3.7.0/lib/python3.7/lib-dynload/_ssl.cpython-37m-darwin.so
  Reason: image not found

エラーが出たので

結論

sh
$ brew switch openssl 1.0.2s

pip install でSSL関連のエラーが出たらこれを読め!!!
これだけです。
sslが切り替わってなかったんですね。
解決してみると原因はシンプルで分かりやすかったです。


自分なりに解釈してるところが、あるかもしれませんが助けになれば幸いです。

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

pip install のエラーの解決策 【Python】【Mac】

pythonエンジニアで初心者の自分が困ってて解決したことをシェアします。

pip install のエラー

pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.

Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/pip/

などのエラーが出た時の対処法

根本的な原因が全く分からないので、とりあえずエラー文章やsslとは、など初めて見る単語を調べてました。解決策自体はいろいろあるみたいです。

-環境-
macOS 10.14.6
python 3.6.6
venv(仮想環境)

原因

おそらくpip/pythonが古いopenssl(1.0.2s)を参照しているのではありませんか? 情報を見る限り、質問者の方のopensslは最新版になっているので参照エラーが起きているように思います

下記でsslが使えるかチェックします。

py
import ssl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/[username]/.pyenv/versions/3.7.0/lib/python3.7/ssl.py", line 98, in <module>
    import _ssl             # if we can't import it, let the error propagate
ImportError: dlopen(/Users/[username]/.pyenv/versions/3.7.0/lib/python3.7/lib-dynload/_ssl.cpython-37m-darwin.so, 2): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /Users/LO/.pyenv/versions/3.7.0/lib/python3.7/lib-dynload/_ssl.cpython-37m-darwin.so
  Reason: image not found

エラーが出たので

結論

sh
$ brew switch openssl 1.0.2s

pip install でSSL関連のエラーが出たらこれを読め!!!
これだけです。
sslが切り替わってなかったんですね。
解決してみると原因はシンプルで分かりやすかったです。


自分なりに解釈してるところが、あるかもしれませんが助けになれば幸いです。

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

Touch Barにタスク管理ツールのタスクを自動表示させる【PHP×GoogleCalendarAPI】

最近MacBookAir13インチを卒業し、MacBookPro16インチを購入したのですが、こいつはすごいですね。

TouchBarとかいう近未来的なディスプレイ(壮大なおもちゃ)がついています。

ここにスクリプトを書いて何か面白いことしたい(有効活用したい)と誰しも一度は思うのではないでしょうか。

私はこの記事以前に「YouTubeの登録者数と再生数を表示させたい!」と以前考え実装したのですが、

IMG_7235 (1).JPG

これだけでは満足できず、今度は

今現在時刻のタスクを表示させたい!!と考えました。

本記事のゴール

タスク管理ツールに予定を入れたら、あとはTouchBarに自動で現在時刻のタスクが出てくる

完成像

こんな感じになりました。

スクリーンショット 2020-05-20 17.36.32.png

IMG_7252.JPG

高度な生産性はシングルタスクができるかにかかっています。

マルチタスクになって何も為せない日々が続いていませんか?

タスクを1つだけ表示させることで、目の前の作業に集中できるのです。

仕様紹介

今回タスク管理ツールには、APIが充実しているGoogleカレンダーを採用しました。

基本的な流れ

  • まずはGoogleカレンダーにタスク登録
  • 次にGoogleCalendarAPIに登録し、PHPでイベント取得
  • Better Touch Toolでphpコマンドで発火

という手順を踏みます。

前提条件、環境

OS:macOS Catalina
バージョン:PHP 7.3.12
Composer1.9.0
Better Touch Tool導入済

①下準備

まずはGoogleCalendarAPI及びサービスアカウントとの紐付け、権限周りを以下の記事で行ってください。

Google Calendar API と PHP で 予定の取得と追加をしてみるよ(準備編)

ついでにまだカレンダーで予定作ってない方は予定を組んでおいてください。

②Composerで必要なものをインストール

A PHP client library for accessing Google APIs
https://github.com/googleapis/google-api-php-client

githubより.zip形式でダウンロードしインストールもできますが、今回はcomposerでインストールします。
composerない方はgithubよりダウンロードもOKですが、composer便利なのでこの機会に導入しましょう。

Composerをインストールしてみた

cdコマンドで作業ディレクトリに移動したのちに(今回はcalendarディレクトリとしました。どこに作成してもいいです。)
composerコマンドを実行します。

$ composer require google/apiclient:^2.0

いろいろなファイルが作成され以下のようなディレクトリになります。

calendar/
 ├ comoser.json(composerで自動作成される)
 ├ composer.lock(自動作成)
 ├ Googleサービスアカウント秘密鍵.json(下準備時にDLしてるはず)
 ├ vendor/
 │   └ outoload.php他(自動作成)
 └ calendar.php(今回の処理書く作業ファイル、まだ空でいい)

サービスアカウント作成時にできた秘密鍵のjsonをここに移動させ、calendar.phpは空でいいので作成しておいてください。

スクリーンショット 2020-05-20 17.58.34.png
スクリーンショット 2020-05-20 17.58.42.png

③PHPでデータ取得、表示

先ほど作成したcalendar.phpに記述します。

<?php

// composerでインストールしたライブラリを読み込む
require_once __DIR__ . '/vendor/autoload.php';

// サービスアカウント作成時にダウンロードしたjsonファイル
$aimJsonPath = __DIR__ . '/あなたの秘密鍵.json';

// サービスオブジェクトを作成
$client = new Google_Client();

// アプリケーション名
$client->setApplicationName('Touch Bar Display ToDos');

// 予定を取得するだけなので、Google_Service_Calendar::CALENDAR_READONLY
$client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);

// ユーザーアカウントのjsonを指定
$client->setAuthConfig($aimJsonPath);

// サービスオブジェクトの用意
$service = new Google_Service_Calendar($client);

// カレンダーIDは後述
$calendarId = 'xxxxxxxxxxxxxxxxx';
// 開始日時
$start = date('c');
// 終了日時(1分後)
$end = date('c', strtotime("+1 minute"));
// 取得時の詳細設定 $startから1分後を$endとすることで、取得範囲を現在時刻のようにしている
$option = [
  'timeMin' => $start,
  'timeMax' => $end,
  'singleEvents' => 'true'
];
// データの取得
$response = $service->events->listEvents($calendarId, $option);
$events = $response->getItems();

$results = [];
if (!empty($events)) {
  foreach ($events as $event) {

    $start = new DateTime($event->start->dateTime);
    $end = new DateTime($event->end->dateTime);
    $results = [
      'start' => $start->format('H:i'),
      'end' => $end->format('H:i'),
      'title' => (string) $event->summary
    ];
  }
  echo $results['start'] . "〜";
  echo $results['end'] . "\n";
  echo $results['title'];
} else {
//カレンダーにタスクがない場合のメッセージ。自由に改変してください。
  echo 'no task';
}

optionはリファレンス参照してみてください。

Google Calendar API REST Reference

カレンダーIDはどこから?

カレンダー左の「設定と共有」から

スクリーンショット 2020-05-20 17.19.36.png

スクリーンショット 2020-05-20 17.26.08.png

「カレンダーの統合」を見つければIDがわかります。

Better Touch Toolはechoしたものをretutnして表示できる

最後に取得した値をechoしているのは、Better Touch Toolが取得できるようにするためです。

④Better Touch Toolから発火させる

まずはBetter Touch Toolを開き、以下の画面のように追加します。

スクリーンショット 2020-05-20 17.49.04.png
そしたら右側にこのような画面が出てきます。

スクリーンショット 2020-05-20 17.53.57.png

ここからphpファイルを実行していきます。

手順としては

①cdコマンドでphp実行ファイルが入っているディレクトリまで移動して、
②phpコマンドを叩きphpファイルを実行する

でいけます。

デスクトップにディレクトリを作られられた方はこんなコードになるかなと(return do shell scriptは必ず必要になります)

return do shell script "cd /Users/ここは人によって違う名前/Desktop/calendar/ ; php calendar.php"

スクリーンショット 2020-05-20 18.20.34.png

その後スクリプトを実行を押し、画像のようにスクリプト結果にタスクが出力されたら、完了になります。

同時に各スクリプトの実行タイミングがデフォルトでは5secondsとなっており、これではすぐにAPIアクセス制限がかかるので、300secondsあたりに変更しておきます(ただ数分タスク更新がズレるので値はお好みで)

これにてtouch Barに表示されているはずです。

このままだと文字サイズが大きいのでptをいじり調整。

スクリーンショット 2020-05-20 20.44.08.png

IMG_7252.JPG

表示できたら、脱マルチタスクへの第一歩だ

おまけ
スクリーンショット 2020-05-21 20.11.40.png

IMG_7260.JPG

タスクがない場合はelse部分のメッセージが表示されます。

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

MacBookのTouch BarにGoogleカレンダーの現在時間のタスクを表示させる【GoogleCalendarAPI】

最近MacBookAir13インチを卒業し、MacBookPro16インチを購入したのですが、こいつはすごいですね。

TouchBarとかいう近未来的なディスプレイ(壮大なおもちゃ)がついています。

ここにスクリプトを書いて何か面白いことしたい(有効活用したい)と誰しも一度は思うのではないでしょうか。

私はこの記事以前に「YouTubeの登録者数と再生数を表示させたい!」と以前考え実装したのですが、

IMG_7235 (1).JPG

これだけでは満足できず、今度は

今現在時刻のタスクを表示させたい!!と考えました。ごく自然な欲求かと思います。

本記事のゴール

タスク管理ツールに予定を入れたら、あとはTouchBarに自動で現在時刻のタスクが出てくる

完成像

こんな感じになりました。

スクリーンショット 2020-05-20 17.36.32.png

IMG_7252.JPG

高度な生産性はシングルタスクができるかにかかっています。

マルチタスクになって何も為せない日々が続いていませんか?

タスクを1つだけ表示させることで、目の前の作業に集中できるのです。

仕様紹介

今回タスク管理ツールには、APIが充実しているGoogleカレンダーを採用しました。

基本的な流れ

  • まずはGoogleカレンダーにタスク登録
  • 次にGoogleCalendarAPIに登録し、PHPでイベント取得
  • Better Touch Toolでphpコマンドで発火

という手順を踏みます。

前提条件、環境

OS:macOS Catalina
バージョン:PHP 7.3.12
Composer1.9.0
Better Touch Tool導入済

①下準備

まずはGoogleCalendarAPI及びサービスアカウントとの紐付け、権限周りを以下の記事で行ってください。

Google Calendar API と PHP で 予定の取得と追加をしてみるよ(準備編)

ついでにまだカレンダーで予定作ってない方は予定を組んでおいてください。

②Composerで必要なものをインストール

A PHP client library for accessing Google APIs
https://github.com/googleapis/google-api-php-client

githubより.zip形式でダウンロードしインストールもできますが、今回はcomposerでインストールします。
composerない方はgithubよりダウンロードもOKですが、composer便利なのでこの機会に導入しましょう。

Composerをインストールしてみた

cdコマンドで作業ディレクトリに移動したのちに(今回はcalendarディレクトリとしました。どこに作成してもいいです。)

$ composer require google/apiclient:^2.0

いろいろなファイルが作成され以下のようなディレクトリになります。

calendar/
 ├ comoser.json(composerで自動作成される)
 ├ composer.lock(自動作成)
 ├ Googleサービスアカウント秘密鍵.json(下準備時にDLしてるはず)
 ├ vendor/
 │   └ outoload.php他(自動作成)
 └ calemdar.php(今回の処理書く作業ファイル、まだ空でいい)

サービスアカウント作成時にできた秘密鍵のjsonをここに移動させ、calendar.phpは空でいいので作成しておいてください。

スクリーンショット 2020-05-20 17.58.34.png
スクリーンショット 2020-05-20 17.58.42.png

③PHPでデータ取得、表示

先ほど作成したcalendar.phpに記述します。

<?php

// composerでインストールしたライブラリを読み込む
require_once __DIR__ . '/vendor/autoload.php';

// サービスアカウント作成時にダウンロードしたjsonファイル
$aimJsonPath = __DIR__ . '/あなたの秘密鍵.json';

// サービスオブジェクトを作成
$client = new Google_Client();

// アプリケーション名
$client->setApplicationName('Touch Bar Display ToDos');

// 予定を取得するだけなので、Google_Service_Calendar::CALENDAR_READONLY
$client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);

// ユーザーアカウントのjsonを指定
$client->setAuthConfig($aimJsonPath);

// サービスオブジェクトの用意
$service = new Google_Service_Calendar($client);

// カレンダーIDは後述
$calendarId = 'xxxxxxxxxxxxxxxxx';
// 開始日時
$start = date('c');
// 終了日時(1分後)
$end = date('c', strtotime("+1 minute"));
// 取得時の詳細設定 $startから1分後を$endとすることで、取得範囲を現在時刻のようにしている
$option = [
  'timeMin' => $start,
  'timeMax' => $end,
  'singleEvents' => 'true'
];
// データの取得
$response = $service->events->listEvents($calendarId, $option);
$events = $response->getItems();

$results = [];
if (!empty($events)) {
  foreach ($events as $event) {

    $start = new DateTime($event->start->dateTime);
    $end = new DateTime($event->end->dateTime);
    $results = [
      'start' => $start->format('H:i'),
      'end' => $end->format('H:i'),
      'title' => (string) $event->summary
    ];
  }
}
echo $results['start'] . "〜";
echo $results['end'] . "\n";
echo $results['title'];;

optionはリファレンス参照してみてください。

Google Calendar API REST Reference

カレンダーIDはどこから?

カレンダー左の「設定と共有」から

スクリーンショット 2020-05-20 17.19.36.png

スクリーンショット 2020-05-20 17.26.08.png

「カレンダーの統合」を見つければIDがわかります。

Better Touch Toolはechoしたものをretutnして表示できる

最後に取得した値をechoしているのは、Better Touch Toolが取得できるようにするためです。

④Better Touch Toolから発火させる

まずはBetter Touch Toolを開き、以下の画面のように追加します。

スクリーンショット 2020-05-20 17.49.04.png
そしたら右側にこのような画面が出てきます。

スクリーンショット 2020-05-20 17.53.57.png

ここからphpファイルを実行していきます。

手順としては

①cdコマンドでphp実行ファイルが入っているディレクトリまで移動して、
②phpコマンドを叩きphpファイルを実行する

でいけます。

デスクトップにディレクトリを作られられた方はこんなコードになるかなと(return do shell scriptは必ず必要になります)

return do shell script "cd /Users/ここは人によって違う名前/Desktop/calendar/ ; php calendar.php"

スクリーンショット 2020-05-20 18.20.34.png

その後スクリプトを実行を押し、画像のようにスクリプト結果にタスクが出力されたら、完了になります。

同時に各スクリプトの実行タイミングがデフォルトでは5secondsとなっており、これではすぐにAPIアクセス制限がかかるので、300secondsあたりに変更しておきます(ただ数分タスク更新がズレるので値はお好みで)

これにてtouch Barに表示されているはずです。

このままだと文字サイズが大きいのでptをいじり調整。

スクリーンショット 2020-05-20 20.44.08.png

IMG_7252.JPG

表示できたら、脱マルチタスクへの第一歩だ

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

Web会議ミュートショートカットキー問題を解消

この記事はMac OS X向けです.

Web会議ショートカットキー問題

ウェブ会議で,音声のミュートやビデオのオンオフを切り替えたいとき,いちいちマウスを持って画面上のアイコンをクリックしていたら,会話が途切れ途切れになってしまいます.

そこで,迅速に切り替えるためにショートカットキーで切り替える事を考えます.ただ,ここでWeb会議アプリショートカットキー問題にぶち当たります.

例えば,MS TeamsとZoomでは以下のようにミュート・ビデオオンオフのショートカットキーが異なります.

  • ミュート切り替え
    • Teams: Command + Shift + M
    • Zoom: Command + Shift + A
  • ビデオ切り替え
    • Teams: Command + Shift + O
    • Zoom: Command + Shift + V

いちいち憶えてられません.ホントクソです.

解決策

Teamsでも,Zoomでも,同じ直ぐに押せる簡単な方法でミュート・ビデオのオンオフを切り替えれるようにします.
具体的には,以下の2つを実現します.

  • ミュートオンオフ切り替え: 右シフト2回押し
  • ビデオオンオフ切り替え: 左シフト2回押し

Hammerspoonを使って実現

Hammerspoonのインストール方法は割愛します.

まず,少し長いコードになるので,init.luaを直接編集せず,ファイルを分けるために,以下を追記.

~/.hammerspoon/init.lua
local mute = require('mute')

以下の様なmute.luaを作成.

~/.hammerspoon/mute.lua
-- 右shift2回押しでミュートの解除・左shift 2回押しでビデオのオンオフ切り替え
-- 
firstShift = false
secondShift = false
local function cancelShift()
    firstShift = false
    secondShift = false
end

local function toggleMuteVideoZoom(event)
    local c = event:getKeyCode()
    local f = event:getFlags()
    if event:getType() == hs.eventtap.event.types.flagsChanged then
        if f['shift'] then
            if c == 60 then -- 右シフト 60
                if firstShift then
                    secondShift = true
                end
                firstShift = true
                hs.timer.doAfter(0.5, function()
                    cancelShift()
                end)
                if firstShift and secondShift then
                    cancelShift()
                    hs.eventtap.keyStroke({"cmd", "shift"}, "A")
                end
            elseif c == 56 then -- 左シフト 56 
                if firstShift then
                    secondShift = true
                end
                firstShift = true
                hs.timer.doAfter(0.5, function()
                    cancelShift()
                end)
                if firstShift and secondShift then
                    cancelShift()
                    hs.eventtap.keyStroke({"cmd", "shift"}, "V")
                end
            else
                cancelShift()
            end
        end
    end
end
toggleMuteVideoZoomEvent = hs.eventtap.new({hs.eventtap.event.types.flagsChanged}, toggleMuteVideoZoom)

local function toggleMuteVideoTeams(event)
    local c = event:getKeyCode()
    local f = event:getFlags()
    if event:getType() == hs.eventtap.event.types.flagsChanged then
        if f['shift'] then
            if c == 60 then -- 右シフト 60
                if firstShift then
                    secondShift = true
                end
                firstShift = true
                hs.timer.doAfter(0.5, function()
                    cancelShift()
                end)
                if firstShift and secondShift then
                    cancelShift()
                    hs.eventtap.keyStroke({"cmd", "shift"}, "M")
                end
            elseif c == 56 then -- 左シフト 56
                if firstShift then
                    secondShift = true
                end
                firstShift = true
                hs.timer.doAfter(0.5, function()
                    cancelShift()
                end)
                if firstShift and secondShift then
                    cancelShift()
                    hs.eventtap.keyStroke({"cmd", "shift"}, "O")
                end
            else
                cancelShift()
            end
        end
    end
end
toggleMuteVideoTeamsEvent = hs.eventtap.new({hs.eventtap.event.types.flagsChanged}, toggleMuteVideoTeams)


hs.window.filter.new('zoom.us')
  :subscribe(hs.window.filter.windowFocused, function() toggleMuteVideoZoomEvent:start() end)
  :subscribe(hs.window.filter.windowUnfocused, function() toggleMuteVideoZoomEvent:stop() end)

hs.window.filter.new('Microsoft Teams')
  :subscribe(hs.window.filter.windowFocused, function() toggleMuteVideoTeamsEvent:start() end)
  :subscribe(hs.window.filter.windowUnfocused, function() toggleMuteVideoTeamsEvent:stop() end)

参考にしたページ

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

PHP初心者がMacでLaravelに挑む

(試験的に勉強兼ねて英語で書いてみた)

Goal

  • To learn from the environment setup to the fundamental usage
  • To create a To-do app with Laravel

Environment setup

0. Development environment

Mac OS Catalina 10.15.4
MacBook Air (13-inch, Mid 2013)

1. Downloading & Installing

1.1. Choosing the version

Laravel 7 (the latest version as of May 2020)
PHP 7.3.11 (Laravel 7 requires above 7.2.5)

1.2. Installing composer

Composer
laravel1.png

Access the above website and click Download

laravel2.png

Execute these four lines on this webpage like:

$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"

They mean that in order:

・ Download the installer to the current directory
・ Verify the installer SHA-384
・ Run the installer
・ Remove the installer

Move Composer

$ mv composer.phar /usr/local/bin/composer

Check if it succeeded

$ composer -V
Composer version 1.10.6 2020-05-06 10:28:10

1.3. Installing Laravel

Create a project called sample, or what else you like.

$ composer create-project --prefer-dist laravel/laravel sample

1.4. Starting a server

Move into the directory you made and start a server.

$ cd sample
$ php artisan serve

Try to access your local server: http://localhost:8000 on a web browser!
laravel3.png

Congratulations!!

Creating a ToDo app

Now I start to create a ToDo app known as that is simple and easy to develop for even a beginner.
I referred to this website:
Laravelの知識ゼロから基本をマスターするチュートリアル | Awesome Blog

References

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

Mac mini 2007 にOSを入れなおす

目標

  • Mac mini 2007 にUbuntuを入れたい

状況整理

  • Mac mini 2007
  • Boot Camp で windows7 が入っている
  • 通常起動時は windows7 で起動する
  • いろいろやってみたが現状ではMacOSXには戻れなさそう

段取り

  • まずは(Windowsを消し去り)MacOSXを入れる(クリーンインストール)
  • MacOSXが入った状態でUbuntuをクリーンインストール

用意するもの

  • Macに付属しているMacOSXのインストールディスク
  • Ubuntuバージョン16.04 LTS 32bit版を焼いたDVD1
  • 有線のキーボードとマウス

やったこと

  1. [失敗]MacOSXのインストールディスクを入れalt(option)キーCを押して起動
  2. ↑からディスクを認識しなかったことが判明
  3. PRAMリセットを実行
    • 再起動する
    • 起動音をしたあたりでoptioncommandPRを長押しする
    • 2回目の起動音がしたら↑のキーを離す
  4. リベンジ:MacOSXのインストールディスクを入れalt(option)キーCを押して起動 2
  5. インストール手順に沿ってインストールする3
    • 自分の場合はパーティションがWindowsに全振りしていたのでMacに全振りし直す
  6. MacMiniにrEFItをインストールする 4
    • 公式サイトからrEFIt 0.14 (6.5M Mac disk image)を落としてきてインストールする
  7. 用意したUbuntuのインストールディスクを入れalt(option)キーを押して起動
  8. インストール手順に沿ってインストールする
  9. 喜ぶ

雑記

  • ここのインストールするまでに約4日かかったため記事に起こした
  • 特異な状況からのインストールだが誰かの参考になることを祈る
  • 記憶を辿りにやったので多少違う部分もあるかもなので試した人はコメントくれると嬉しいです
  • 終わりだよ~(●・▽・●)

  1. 最新版の18.xのLTSを試したがDVDを認識しなかったためこのバージョンにした(別の要因もあるかも) 

  2. どっちかを押してやった記憶があるのですが、どっちだったか忘れた 

  3. エンプレス構文みたい  

  4. 公式サイト曰くrEFItは誰もメンテしてないからメンテしてるrEFIndを使おうねと言われているがとりあえず動いたのでこれで行った  

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

Macで google test をお試し利用する

目的

Macで google test をお試し利用した際の備忘録です。

google test

環境

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.6
BuildVersion:   17G4015

準備

cmakeのインストール

brew install cmake

googletestをクローン

git clone https://github.com/google/googletest.git

ビルド用ディレクトリを作成して移動

mkdir build
cd build

cmakeを実行

ln -s /usr/local/bin/gcc-9 /usr/local/bin/gcc
ln -s /usr/local/bin/g++-9 /usr/local/bin/g++
cmake -DCMAKE_C_COMPILER=/usr/local/bin/gcc -DCMAKE_CXX_COMPILER=/usr/local/bin/g++ .. # Macの場合はgcc,g++パス指定が必要

makeを実行

make
...
[100%] Built target gtest_main

mock,gtest,libをパスへコピー

sudo cp -r ../googlemock/include/gmock /usr/local/include/.
sudo cp -r ../googletest/include/gtest /usr/local/include/.
sudo cp lib/*.a /usr/local/lib/

テスト実行

test.cpp
#include <gtest/gtest.h>

TEST(TestCaseName, TestName){
  EXPECT_EQ(1, 1);
}

コンパイル

g++ test.cpp -pthread -lgtest_main -lgtest

実行ファイル(a.out)を実行

$ ./a.out 
Running main() from /Users/seigo/Desktop/python/gtest/googletest/googletest/src/gtest_main.cc
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from TestCaseName
[ RUN      ] TestCaseName.TestName
[       OK ] TestCaseName.TestName (0 ms)
[----------] 1 test from TestCaseName (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (1 ms total)
[  PASSED  ] 1 test.

テスト結果を出力する際は、実行時に --gtest_output を付与する。

$ ./a.out --gtest_output=xml:./result.xml
result.xml
<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="1" failures="0" disabled="0" errors="0" time="0.001" timestamp="2020-05-19T23:56:22" name="AllTests">
  <testsuite name="TestCaseName" tests="1" failures="0" disabled="0" errors="0" time="0" timestamp="2020-05-19T23:56:22">
    <testcase name="TestName" status="run" result="completed" time="0" timestamp="2020-05-19T23:56:22" classname="TestCaseName" />
  </testsuite>
</testsuites>

json形式も指定可能

$ ./a.out --gtest_output=json:./result.json
result.json
{
  "tests": 1,
  "failures": 0,
  "disabled": 0,
  "errors": 0,
  "timestamp": "2020-05-19T23:58:37Z",
  "time": "0s",
  "name": "AllTests",
  "testsuites": [
    {
      "name": "TestCaseName",
      "tests": 1,
      "failures": 0,
      "disabled": 0,
      "errors": 0,
      "timestamp": "2020-05-19T23:58:37Z",
      "time": "0s",
      "testsuite": [
        {
          "name": "TestName",
          "status": "RUN",
          "result": "COMPLETED",
          "timestamp": "2020-05-19T23:58:37Z",
          "time": "0s",
          "classname": "TestCaseName"
        }
      ]
    }
  ]
}

gtest-port.h:1814:40: error: 'override' keyword is a C++11 extension [-Werror,-Wc++11-extensions]

以下の記事を見つけて解決

(続) Google Testを導入してみた
Google TestはC++11をベースに実装されている様です。故に、macOSデフォルトのgccやg++(試した環境ではVer4.2)ではビルドエラーが発生し、ビルドすることが出来ません。(∵ C++11で導入された新しい構文等に対応していないため)

gcc,g++のバージョンを更新する

$ brew install gcc
$ ln -s /usr/local/bin/gcc-9 /usr/local/bin/gcc
$ ln -s /usr/local/bin/g++-9 /usr/local/bin/g++
~/.bash_profileに以下を記載し、有効化します。
$ echo "export PATH=$PATH:/usr/local/bin" >> ~/.bash_profile
$ . ~/.bash_profile

MacOSの場合は、cmake時にgcc/g++パスを指定する必要がある

cmake -DCMAKE_C_COMPILER=/usr/local/bin/gcc -DCMAKE_CXX_COMPILER=/usr/local/bin/g++ ..

cmake実行後、makeするとエラーが解決できていた。

参考

googletest
Google Testを導入してみた
Google Testの使い方
(続) Google Testを導入してみた
Jenkinsでgoogle testの結果表示
Using gtest in jenkins

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