20210111のMacに関する記事は12件です。

備忘録:Anaconda起動してPythonの仮想環境入ってMongoDBにローカル接続

※備忘録

開発中アプリに移動

terminalにてcdとかでディレクトリ内に入る。

Anacondaを起動

base(現在の場所)から、仮想環境(私の場合は作成した名前がpy3_aaaa)へ移動する為、下記を入力

$ (base) lancai@oja % source activate py3_aaaa #py3_aaa:作成した仮想環境名

↓今回の開発環境がAPIなので
uvicorn prog:app --reload --host 0.0.0.0 --port 8100
progapiに置き換えたもの(下記)を入力

$ (base) lancai@oja % uvicorn api:app --reload --host 0.0.0.0 --port 8000

これで接続完了となる!

MongoDBにローカル接続できない時に確認すること

開発中のアプリディレクトリ..>src>db>connect.py内に、
設定したusernamepasswordが記述されているか確認。なければ追記する。

python
from pymongo import MongoClient

# DB接続
def get_connect():
    # mongoDBローカル接続
    client = MongoClient("mongodb://(※ここにusername):(ここにpassword)@localhost:27017/")
    # 使用DB (DBを指定)
    db = client.(※ここにDB名が入る
    return db

terminalにて下記コマンド入力

terminal
$ uvicorn api:app --reload --host 0.0.0.0 --port 8000

【補足】MongoDBに設定したusernameなどの情報を確認する方法

①terminalにて開発中アプリのdocker-composer.ymlファイルが置いてある場所へ移動

②↓terminalにてcat”で参照する。

terminal
$ cat docker-compose.yml

③↓environment:部分に記載してある^^

terminal
    environment:
      MONGODB_USERNAME: *****
      MONGODB_PASSWORD: *****
      MONGODB_HOSTNAME: *****db
      # VIRTUAL_HOST: ""
      # LETSENCRYPT_HOST: ""
      # LETSENCRYPT_EMAIL: "*********@gmail.com"

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

備忘録:【Docker】起動&終了方法

備忘録φ(..)メモメモ

【起動方法】

アプリ起動

スクリーンショット 2021-01-11 21.20.54.png

Dockerの置いてる場所で下記を入力

※私の場合”dev”というディレクトリ内に入って入力

terminal
lancai@oja dev % docker-compose up -d

↓下記のように返ってきたらOK

terminal
Creating network "proxy-net" with driver "bridge"
Creating rootp-db ... done

↓RUNNINGとなっていたらOK

スクリーンショット 2021-01-11 21.24.21.png

終了方法

Dockerの置いてる場所で下記を入力

※私の場合”dev”というディレクトリ内に入って入力

terminal
$ lancai@oja dev % docker-compose down

↓下記のように返ってきたらOK

terminal
Stopping ※DBの名前 ... done
Removing ※DBの名前 ... done
Removing network proxy-net
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Visual Studio Code ( VS Code ) で jupyter notebook 環境を構築 Mac版

Visual Studio Code ( VS Code ) で jupyter notebook 環境を構築 Mac版

目的

Python開発環境の作業メモとして記載。
ANACONDAのライセンスが変わり、当面は問題無いのですが、ANACONDAを使わないPythonのローカル開発環境へ移行してみました。
jupyter notebookは Visual Studio Code ( VS Code ) とそのJupyter Extension for Visual Studio Code (Jupyter 拡張)を使うことにしてみました。
手順は簡単ですが使い方のメモとしても記載しておくことにしました。
Pythonの開発環境としては、pyenvとpyenv-virtualenvを利用しています。(別記事)

Mac環境

OS : Mac OS Big Sur(11.1)
Xcode : App Storeではインストールしていない

Visual Studio Code ( VS Code ) をインストール

Visual Studio Codeサイトからダウンロードし、インストール
スクリーンショット 2021-01-11 18.52.53.png

Visual Studio Code Insidersをインストール

Visual Studio Codeサイト Insidersからダウンロードし、インストール!

スクリーンショット 2021-01-11 18.57.09.png

起動すると警告が出ますが「開く」
スクリーンショット 2021-01-11 19.00.43.png

Jupyter Extension for Visual Studio Code (Jupyter 拡張)をインストール

https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter

Jupyter Extension for Visual Studio Codeサイト Insidersからダウンロードし、インストール!

スクリーンショット 2021-01-11 19.05.52.png

Visual Studio Code.appを開くようにポップアップが出ます
スクリーンショット 2021-01-11 0.07.17.png

Visual Studio Code が起動し、そのウインドウ内でJupyterが開かれます
スクリーンショット 2021-01-11 0.07.53.png

インストール を押します
スクリーンショット 2021-01-11 19.17.45.png

使い方

Visual Studio Code を起動します

全てのコマンドを表示 commandキー+shiftキー+pキー を押します

jupyter: Create New Blank Jupyter Notebook を選びます

スクリーンショット 2021-01-11 19.22.27.png

インストールが必要なものがあれば、ポップアップ表示されますので、インストールしてください

Visual Studio Code 内にJupyter Notebookが起動します
スクリーンショット 2021-01-11 19.26.28.png

右上に利用しているPython環境が表示されており、こちらをクリックすると、実行するPython環境を切り替えることができます
スクリーンショット 2021-01-11 19.29.13.png

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

ANACONDAやめました MacにPython開発環境構築 pyenvとpyenv-virtualenvのインストール

ANACONDAやめました MacにPython開発環境構築 pyenvとpyenv-virtualenvのインストール

目的

Python開発環境の作業メモとして記載。
ANACONDAのライセンスが変わり、当面は問題無いのですが、ANACONDAを使わないPythonのローカル開発環境へ移行してみました。
Pythonの開発環境としては、pyenvとpyenv-virtualenvを利用、pythonのバージョンが切替可能とする方法を選択しました。
pyenvとpyenv-virtualenvのインストールは、楽なのでhomebrewを使います。

Mac環境

OS : Mac OS Big Sur(11.1)
Xcode : App Storeではインストールしていない

インストール

homebrewのアップデート

taguchi@MasamacAir ~ % brew update
Updated 2 taps (homebrew/core and homebrew/cask).
==> New Formulae
acl2                       grpcui                     ocaml-zarith
act                        gtkmm4                     oci-cli
aerc                       guile@2                    odin
aida-header                gulp-cli                   oha
airshare                   h2spec                     omake

省略

iphoney                                  yandexradio
java                                     yourkit-java-profiler
jeromelebel-mongohub                     zoom-in
jing                                     zoomus-outlook-plugin
kekadefaultapp

pyenvのインストール

taguchi@MasamacAir ~ % brew install pyenv
Error: 
  homebrew-core is a shallow clone.
  homebrew-cask is a shallow clone.

省略

==> readline
readline is keg-only, which means it was not symlinked into /usr/local,
because macOS provides BSD libedit.

For compilers to find readline you may need to set:
  export LDFLAGS="-L/usr/local/opt/readline/lib"
  export CPPFLAGS="-I/usr/local/opt/readline/include"

For pkg-config to find readline you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/readline/lib/pkgconfig"

pyenv-virtualenvのインストール

taguchi@MasamacAir ~ % brew install pyenv-virtualenv

Error: Your CLT does not support macOS 11.
It is either outdated or was modified.
Please update your CLT or delete it if no updates are available.
Update them from Software Update in System Preferences or run:
  softwareupdate --all --install --force

If that doesn't show you an update run:
  sudo rm -rf /Library/Developer/CommandLineTools
  sudo xcode-select --install

Alternatively, manually download them from:
  https://developer.apple.com/download/more/.

Error: An exception occurred within a child process:
  SystemExit: exit

pyenv-virtualenvをインストールしようとしたが、エラーになった、対応

taguchi@MasamacAir ~ % softwareupdate --all --install --force

  sudo rm -rf /Library/Developer/CommandLineTools
  sudo xcode-select --install

taguchi@MasamacAir ~ % sudo rm -rf /Library/Developer/CommandLineTools
Password:
taguchi@MasamacAir ~ % sudo xcode-select --install

省略

リトライ pyenv-virtualenvをインストール

taguchi@MasamacAir ~ % brew install pyenv-virtualenv
Error: 
  homebrew-core is a shallow clone.
  homebrew-cask is a shallow clone.
To `brew update`, first run:

省略

==> ./install.sh
==> Caveats
To enable auto-activation add to your profile:
  if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi
==> Summary
?  /usr/local/Cellar/pyenv-virtualenv/1.1.5: 22 files, 65.6KB, built in 5 seconds

pyenvの設定

taguchi@MasamacAir ~ % echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> ~/.zprofile
taguchi@MasamacAir ~ % echo 'export PATH="${PYENV_ROOT}/bin:$PATH"' >> ~/.zprofile
taguchi@MasamacAir ~ % echo 'eval "$(pyenv init -)"' >> ~/.zprofile 
taguchi@MasamacAir ~ % echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zprofile 

pyenv環境設定

使えるバージョンを確認

taguchi@MasamacAir ~ % pyenv install --list      
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4.0

省略

Python 3.9.1 と 2.7.18 をインストール

Python 3.9.1

taguchi@MasamacAir ~ % pyenv install 3.9.1  
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.9.1.tar.xz...
-> https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tar.xz
Installing Python-3.9.1...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.9.1 to /Users/taguchi/.pyenv/versions/3.9.1

Python 2.7.18

taguchi@MasamacAir ~ % pyenv install 2.7.18 
python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-2.7.18.tar.xz...
-> https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz
Installing Python-2.7.18...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-2.7.18 to /Users/taguchi/.pyenv/versions/2.7.18

Pythonのバージョン切替方法

開発用のディレクトリ毎に利用するPythonのバージョンを変える(localコマンド)

使い方

cd <開発用ディレクトリ>
pyenv local <この開発用ディレクトリで利用するPythonのバージョン>

実行例
デフォルトはPython 2.7.16 だが 開発ディレクトリpy2で利用するPythonのバージョンを 2.7.18 に変更する

taguchi@MasamacAir ~ % cd ~/test/py2
taguchi@MasamacAir py2 % python --version
Python 2.7.16
taguchi@MasamacAir py2 % pyenv local 2.7.18
taguchi@MasamacAir py2 % python --version
Python 2.7.18

python --version の表示が変わらないとき
1)よくある 他のディレクトリに移動してから再度戻る、ログアウトしてログインし直してから再度確認してみてください
2).zprofileや/etc/paths でパス/usr/local/binが/usr/binより優先されているかを確認してください

システム全体で利用するPythonのバージョンを変える(globalコマンド)

pyenv global <システム全体で利用するPythonのバージョン>

実行例
デフォルトはPython 2.7.16 だが システム全体で利用するPythonのバージョンを 3.9.1 に変更する

taguchi@MasamacAir ~ % python --version
Python 2.7.16
taguchi@MasamacAir ~ % pyenv global 3.9.1
taguchi@MasamacAir ~ % python --version
Python 3.9.1

pyenv-virtualenv環境設定

pyenv-virtualenvを使うと、開発環境が分けられます。
ライブラリ等が異なるなどの際に便利です。
私は、色々試したい場合にはpyenv-virtualenv、開発環境の構成が複雑な場合や開発環境を共有する場合はDocker(ローカルPCやクラウド上)やVirtualBox(ローカルPC)と使い分けています。

使い方

pyenv virtualenv <利用するPythonのバージョン> <Python開発環境の名前、自分でわかるように付ける>

実行例
Pythonのバージョン 2.7.18 の開発環境 GANtest1 を作る、開発ディレクトリは ~/test/GANtest1

taguchi@MasamacAir ~ % mkdir ~/test/GANtest1
taguchi@MasamacAir ~ % cd ~/test/GANtest1
taguchi@MasamacAir GANtest1 % pyenv virtualenv 2.7.18 GANtest1
taguchi@MasamacAir GANtest1 % pyenv local GANtest1
taguchi@MasamacAir GANtest1 % python --version
Python 2.7.18

作成した開発環境が不要になったら、以下で消すことができます
使い方

pyenv uninstall <Python開発環境の名前>

実行例

taguchi@MasamacAir ~ % pyenv uninstall GANtest1
taguchi@MasamacAir ~ % rm -r ~/test/GANtest1
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mac上でPython+OpenCVを利用した動画処理

Mac上のOpenCVで動画処理のプログラムを作成する際に、いくつかハマった点があったので、その備忘録です。

初めに

作成したプログラムは、入力した動画の、1フレームごとの画像に対して任意の画像処理を行い、処理後の画像を再び動画として保存するもの。動画処理の流れは、以下のようになっている。

  1. ローカルに保存されている動画を読み込む
  2. 1フレームずつ画像処理
  3. 動画ファイルとして書き込み

実行環境

  • macOS Catalina(ver 10.15.3)
  • python 3.8

opencv-pythonのインストールは、以下コマンドで行う。

pip install opencv-python

ソースコードの全体像

作成したソースコードの全体像は以下の通り。動画に対する処理は、67行目のprocessed_frame = cv2.flip(frame, -1)にある、上下左右の反転を行うもの。こちらのプログラムを実行することで、入力した動画を上下左右反転させた動画を作成できる。

上下左右の反転処理を、任意の画像処理に置き換えることで、Pythonで様々な動画処理ができるようになる。

./main.py
import os
import cv2
import argparse


class MovieIter(object):
    """
    動画のIterator
    """

    def __init__(self, moviefile, inter_method=cv2.INTER_AREA):
        if os.path.isfile(moviefile):  # mp4ファイルが存在するとき
            print("[Loading]\tLoading Movie")
            self.org = cv2.VideoCapture(moviefile)

        self.framecnt = 0
        self.inter_method = inter_method

    def __iter__(self):
        return self

    def __next__(self):
        self.end_flg, self.frame = self.org.read()
        if not self.end_flg:  # 動画の最後に到達したらループを終了する
            raise StopIteration()
        self.framecnt += 1
        return self.frame

    def __del__(self):
        self.org.release()

    def get_size(self) -> (int, int):
        """動画の解像度を返す

        Returns:
            (int, int): (w, h)
        """
        return (
            int(self.org.get(cv2.CAP_PROP_FRAME_WIDTH)),
            int(self.org.get(cv2.CAP_PROP_FRAME_HEIGHT)),
        )

    def get_fps(self) -> float:
        """動画のFpsを返す

        Returns:
            float: fps
        """
        return self.org.get(cv2.CAP_PROP_FPS)


def main(movie_path, save_path):
    # 入力する動画を定義
    input_movie = MovieIter(movie_path)
    input_moveie_size = input_movie.get_size()

    # 出力する動画ファイルの定義
    fourcc = cv2.VideoWriter_fourcc(*"mp4v")
    output_movie = cv2.VideoWriter(
        os.path.join(save_path, "output.mp4"),  # 保存するパス
        fourcc,  # コ-ディック
        input_movie.get_fps(),  # 動画のfps
        input_moveie_size,  # 動画の解像度
    )

    for frame in input_movie:
        processed_frame = cv2.flip(frame, -1)  # 上下左右反転

        # 動画の解像度が異なると保存できないので確認する
        assert processed_frame.shape[:2][::-1] == input_moveie_size
        output_movie.write(processed_frame)

    # リリースして動画を保存
    output_movie.release()


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="動画を処理するプウログラム")

    parser.add_argument("movie_path", help="処理を行う動画のURL")
    parser.add_argument("--save_path", default="results", help="生成した画像を保存するディレクトリのパス")

    args = parser.parse_args()
    main(args.movie_path, args.save_path)

実行時のコマンドは以下の通り。処理に成功すると、${処理する動画のパス}の上下左右が反転した動画が作成され、--save_pathに指定したフォルダに保存される。

python main.py ${処理する動画のパス} --save_path ${処理後の動画を保存するパス}

ハマったところ

動画に書き込む画像サイズの指定

ハマりポイントの1つ目は、ソースコード57行目のcv2.VideoWriter()に指定する画像のサイズと、71行目のoutput_movie.write(processed_frame)で書き込む画像のサイズが異なると、動画の書き出しに失敗する点である。

~~~省略~~~~
    output_movie = cv2.VideoWriter(
        os.path.join(save_path, "output.mp4"),  # 保存するパス
        fourcc,  # コ-ディック
        input_movie.get_fps(),  # 動画のfps
        input_moveie_size,  # 動画の解像度  ← ココ!
    )
~~~省略~~~~

一般的にopencvの画像サイズは、(height, width, chnnel)の順で定義されている。しかし一方でcv2.VideoWriter()で指定する画像のサイズは(width, height)の順で定義する必要がある。なので、普段のノリで「画像サイズは(height, width)の順だね〜」と思って指定すると、定義時と書き込み時の画像サイズの違いにより、動画の書き出しに失敗する現象が発生する。

しかも困ることに、上記のような、サイズの違いによる動画の書き出しに失敗する現象が起きても、opencvはエラーやワーニングを返してこない。それにより、「プログラムは正常なのに、なぜ保存できないんだろう..」と無駄に時間を浪費してしまい、画像サイズの指定ミスに気づくのにかなり時間がかかってしまった。

解決策として、以下のようにassertで確認する処理を入れておいた。

~~~省略~~~~
        # 動画の解像度が異なると保存できないので確認する
        assert processed_frame.shape[:2][::-1] == input_moveie_size
~~~省略~~~~

グレースケールの動画を作成する場合

作成する動画の形式がグレースケールの場合は、cv2.VideoWriter()の5つ目の引数に、0を指定する必要がある。これも指定し忘れると、上記の件と同様に、エラー・ワーニングなしで、ただ動画の書き出しに失敗する現象が起きる。

~~~省略~~~~
    output_movie = cv2.VideoWriter(
        os.path.join(save_path, "output.mp4"),  # 保存するパス
        fourcc,  # コ-ディック
        input_movie.get_fps(),  # 動画のfps
        input_moveie_size,  # 動画の解像度  ← ココ!
        0 # ← ココ!
    )
~~~省略~~~~

動画のコーデックの指定

2つ目は、ソースコード58行目の動画のコーデック形式に、実行環境に応じた対応している形式を指定する必要がある点である。

~~~省略~~~~
    # 出力する動画ファイルの定義
    fourcc = cv2.VideoWriter_fourcc(*"mp4v") # ← ココ!
~~~省略~~~~

「opencv python 動画」などで検索して上位に出てくる記事だと、cv2.VideoWriter_fourcc(*'XVID')と指定されていることが多く、筆者もそれに倣ってそのまま.avi形式で保存を試したが、うまく書き出しが行われなかった。バージョンによっては、MacOS上で.avi形式で保存することもできるようだが、mp4形式で保存をするのが最も安定すると思われる。

Mac上での各形式の動作状況が、有志により以下のリンクにまとめられている。プログラムを書く前に、自分の使いたい形式がMac上でうまく動作するかを確認した方が良い。
- OpenCV Video Writer on Mac OS X · GitHub

終わりに

形式違いやサイズ違いで保存に失敗してるなら、ワーニングくらい出して欲しいですね...

参考

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

MacでNASや外付けドライブを使用せずにTimeMachineを設定する

Macには「TimeMachine」というバックアップ機能が標準搭載されている。
Windowsでいうところの「ファイルの履歴」機能と同様。
基本的にはこの機能はNASや外付けHDDなど外部デバイスにバックアップをとることを想定しているっぽいが、昨今のリモートワークの状況もあり、ネットワークや外部デバイスに接続しない状況で使う場合でもMac単体でTimeMachineを使用する設定をメモしておく。
OSはmacOS 11.1 big sur。
(注)Macのディスク上にバックアップをとるので最低でもバックアップ容量と同程度以上の空きが必要。

1. パーテーションを分割する。

Macのディスクのパーテーションをディスクユーティリティを使用して分割する。
ディスクユーティリティはアプリケーション>ユーティリティにある。
ディスクユーティリティを起動するとMacのディスクの管理画面が表示される。

ここでパーテーション作成へ進む。
image003.jpg

ボリュームを追加ボタンとパーテーションを作成ボタンが表示されるのでパーテーション作成ボタンを押す。
image004.jpg

デバイスとパーテーションの情報が表示される。
+ボタンでパーテーションを追加する。
パーテーションの名前とサイズを設定して適用すればパーテーション作成は完了。
image005.jpg

2. TimeMachineを設定する。

バックアップ用パーテーションを用意したらあとは普通にTimeMachineを設定する。
TimeMachineはシステム環境設定から設定できる。
バックアップを自動生成にチェックを入れてディスクを選択ボタンからバックアップ用パーテーションを指定。
TimeMachineをメニューバーに表示にチェックを入れておけばメニューバーからTimeMachineに入ってファイルの復旧もできる。
image006.jpg

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

【徹底検証】Outlook for Macのバックアップ及び復元

メーラーはMicrosoft365のOutlook for Macを利用しています。筆者はWindows時代からOutlookをメーラーとして利用してきました。ところが、Mac版のOutlookに乗り換えて気付いたことはメールの仕分けルールや受信拒否リストなどをインポート・エクスポートする機能が搭載されていない1:scream:ことです。これでは苦労して仕分けルールなどを作っても、いざという時に環境を復元できなくなってしまいます。そこで本記事ではMac版Outlookにおける各種データのバックアップ方法を検証し、別途用意したmacOSのVM上でバックアップデータから復旧出来るかの検証も行いたいと思います。

検証環境

  • macOS 11.1 Big Sur
  • Microsoft Outlook for Mac 16.44

データの格納先の探索

参考より、以下のPathにOutlook関連のファイルが格納されていることが分かりました。
/Users/$USER/Library/Group\ Containers/UBF8T346G9.Office/Outlook/Outlook\ 15\ Profiles/Main\ Profile/Data/

実際に覗いてみる

lsコマンドでディレクトリ内を覗いてみます。

$ ls /Users/$USER/Library/Group\ Containers/UBF8T346G9.Office/Outlook/Outlook\ 15\ Profiles/Main\ Profile/Data/
BlockLocks.sqlite      Contacts               Message Attachments    Outlook.sqlite-shm     RecordLocks.sqlite-shm Signatures
BlockLocks.sqlite-shm  Folders                Message Sources        Outlook.sqlite-wal     RecordLocks.sqlite-wal UIDs
BlockLocks.sqlite-wal  Mail Accounts          Messages               Recent Addresses       Rules
Categories             Main                   Outlook.sqlite         RecordLocks.sqlite     Saved Searches

バックアップの作成

tarコマンドでアーカイブファイルを作成し、Outlookの各種ファイルをバックアップします。作成したtarファイルを外付けHDなどに移動させます。

cd /Users/$USER/Library/Group\ Containers/UBF8T346G9.Office/Outlook/Outlook\ 15\ Profiles/Main\ Profile/
tar cvzf backup.tgz Data

バックアップの復元

tarファイルを展開してOutlookの環境が復元できるか試みます。実験のためにMacのVMをFusionで作成し、実験しました。結果は以下の様になりました。

  • 復元が成功した内容

    • メール(署名付きのメールも復元可)2
    • メールフォルダ
    • 仕分けルール
    • 署名
  • 復元出来なかった内容

    • 受信拒否リスト
    • 並べ替えルール
  • 復元を試みていない内容

    • 予定表
    • アドレス帳
    • タスク

まとめ

今回Outlook for Macのバックアップ方法について検討しました。一部復元出来なかったものも有りますが、再度作成するのが大変な仕分けルールや作り直しが面倒な署名については復元が出来ました。メールについてもフォルダ分けした状態で復元出来たのでもしもの時の復旧が楽になりそうです。但し、受信拒否リストなど一部復元出来なかったものは今後も調査を続けたいと思います。

Reference


  1. Windwos版では仕分けルールや受信拒否リストは操作画面からインポート及びエクスポート出来ますが、Mac版にはそういった昨日は2020年12月現在搭載されていません。 

  2. 署名付きのメールをインポート/エクスポート機能で復元した場合は、文字化けなどが発生し正しく復元出来ない場合が有ります。 

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

Apache 設定後、PHPが動作しない時の対処法

PHPが動作しなくなった時の解決方法をメモで記載しました。

環境

macOS Catalina
Apache 2.4.43 (Unix)
PHP バージョン7.2

背景

macにデフォルトであるApacheを停止し、
Homebrew で新たに Apache httpd をインストールして環境を構築したかった。

Apache の設定ファイルをいぢった後、PHPのバージョンを確認したら以下のエラー文で怒られました。

$ php -v 

dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib

下記URLの記事を参考にして、コマンドを実行しても解決しなかったので別の方法を試しました。

参考記事

Calling `brew switch` is disabled! Use `brew link` @-versioned formulae instead.

解決方法

先ずは Homebrewに悪いところがないか お医者さんに見てもらう。

$ brew doctor

そうすると以下の文章が表示されました。

Some installed formulae are deprecated or disabled. 
・・・
php@7.2

インストールしたformulae(パッケージ)が非推奨もしくは無効らしい。
私の場合、php@7.2 を下記コマンドでアンインストール。

$ brew uninstall php@7.2

インストールするPHPを検索

$ brew search php

そしてインストール

$ brew install php@7.2

インストールしたらパスを通し、紐付ける。

$ export PATH="/usr/local/opt/php@7.2/bin:$PATH
$ brew link php72

意図したバージョンが表示されるか確認

$ php -v

Apache を再起動

$ sudo apachectl restart

ターミナルを再起動すると、動きました。

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

TimeMachineからのデータ移行・復元がエラーになった場合のデータ救済方法

Mac miniが故障?したのでバックアップ→復旧したかった

  • Mac mini (2018)から出力していたLGのモニタがブラックアウトを繰返していた。
  • LGモニタ以外(我が家にあったのはナナオのモニタ)でも発生した。
  • ブラックアウトは常に繰返すわけではなく長時間使用しているとたまに発生、一度発生すると何度か短時間に発生。
  • ケーブルもHDMIやThunderbolt3のケーブルを家にあったものから新品購入したものまで試してみたけど直らず。
  • Appleのサポートチャットで修理という流れになった。
  • 今回はその修理時に行ったTimeMachineへのバックアップ、TimeMachineからの復元でトラブルが発生したのでそれをまとめたいと思う。

TimeMachineのバックアップ先として使用したストレージ

  • Drobo5N(https://www.drobo-jp.com/products/pdr5n.html)
    • 購入して4年くらいほぼ放置していた(試しに使った程度)
    • 改めて今回セットアップしてストレージとして利用可能であることを確認
  • 修理に出す前にDrobo5Nをバックアップ先としてTimeMachineを設定。
    • バックアップ容量はおよそ1TB(990GBくらいだった)
    • 初回バックアップ時は20時間かかった
    • 夕方バックアップ開始、一晩放置して翌日の昼間に終わっていることを確認してシャットダウン
    • 回収に来たクロネコヤマトにMac miniを裸で渡して回収完了。修理を待つ。

Mac mini帰還後のトラブル

  • 中1日で無事に戻ってきたMac miniだが、ロジックボードが交換されたので、当然オンボードになっているSSDも交換された。つまりデータはなくなりました。
  • BigSurがクリーンインストールされている状態。からの復旧
  • BigSur初回起動時に表示されるデータ移行の画面でTimeMachineから復元するを選択して進めるも、エラー発生。
  • どうにもできなくなったので、復元は諦めて一旦初回起動時のウィザード的なのを終わらせる
  • データ移行アシスタンスを起動して復元を試みるも、Drobo5Nがリストに出てこない
  • smb://Drobo5N/sharefolder を入力してバックアップされた時点データの閲覧まではできた
  • 移行するデータの種別はすべて選択した状態でデータ移行を開始
  • これは何度か行ったが、何度やっても移行するデータのカウント中に止まってしまって実際にコピーが始まらない
  • たまに始まるときもあるが途中でエラー、もしくは完了じゃないのに完了ステータスになってしまいデータ移行が不完全。
  • 直接TimeMachineのバックアップデータ(*.sparsebundle)をマウントしてTimeMachineから見てみた
    • 現在しかデータがなく、過去に遡れない。
    • マウントしたデータを直接見てみると、 2021-01-08-140145.inprogress というフォルダだけが見えていて他に何もない。
      • .inprogressフォルダはTimeMachineで何かエラーが起きて中断したりしたときに生成されるもののようで、基本消すことができない。(消せばいいという記事がいくつか出てきたが。)
      • .inprogressフォルダはTimeMachineが正常に動作すれば解消されるので一度バックアップ先をきれいにしてから再度バックアップするといいです、という記事を見かけたが、今回そんなことは物理的に不可能(バックアップ元はもうない)なので.inprogressフォルダをどうにかする方法は諦める
  • mountコマンドでマウントしているストレージを改めてみてみると、TimeMachineとしてマウントしたsparsebundleと共有フォルダとしてマウントしたTimeMachineのフォルダが /Volumesの下に存在していた。
    • 何度かmountとunmountを繰り返していたので気が付かなかったが、/Volumes/.timemachine/UUID的なフォルダがマウントされていた
  • .timemachineフォルダの下に実際にバックアップを取得した時のデータがあったので必要なものをここから手動コピーしてサルベージ完了した。

まとめ

  • TimeMachineのバックアップを初めて行うときはちゃんと復元できるか試しておこう。
    • 今回は時間がなかったので確認までできなかったが時間ある人は絶対にやっておいたほうがいい。
  • 仮に復元でコケてもバックアップされたデータが消えていることはないので落ち着いて探せばデータは見つかる。
    • 今回の.timemachineフォルダが/Volumesにマウントされていたのが何がトリガーだったのかはまだ追えていないが、同じトラブルに見舞われてしまった人の参考になれば幸い。
  • Macが修理されて戻ってくる場合、新品でない場合でも中身が別物になっていて、厳密には同一機体ではなくなっていることがある(?)ので注意しておこう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mac miniでmountコマンドが見つからない(mount: command not found)

sudo mount -uw /を実行したら、sudo: mount: command not foundって出た。

環境

  • M1 Mac mini
  • Big Sur 11.1

対応

/sbinを見るとmountが存在したので、.zshrcに以下の変更をした。

PATH=/bin:/usr/bin:/usr/local/bin:${PATH}
↓に変更
PATH=/bin:/usr/bin:/usr/local/bin:/sbin:${PATH}

雑談

うーん、この辺の知識の乏しさを感じる。。。
こんなのはlinuxの学習でどうにかなるのだろうか。

参考記事:https://www.reddit.com/r/MacOSBeta/comments/dg0mst/command_not_found_mount_since_update_to_catalina/

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

Webサイトに使う画像のサイズ変換+容量圧縮を1クリックでやる

はてなブログやWordPressなどでユーザのために読みやすいWebサイトを作るためには、使用する画像の横幅を720pxにする必要があります。また、重くならないためには画像の容量圧縮も必須ですよね。

今回はそんな画像のサイズ変換+容量圧縮を1クリック(正確にはダブルクリックですがw)でやるシェルスクリプトを作成しました。複数の画像でも1回シェルを動かすだけで一気にサイズ変換+容量圧縮が可能です。

容量圧縮は画像の拡張子を「.jpeg」に変えることで行います。多くの画像は拡張子を.jpegに変えるだけでかなり容量が小さくなるのです。

普段からブログなどで画像を投稿する機会がある方には、かなり時間の節約になるはず!これからシェルの内容と使い方を解説をしていくので、ぜひ読んでみてください。

目次

1.画像サイズ変換・容量圧縮シェルの内容
2.使うための準備

1. 画像サイズ変換・容量圧縮シェルの概要

まず、Webサイトで使いたい画像をデスクトップに作成した「画像リサイズ」というフォルダに入れます。
画像リサイズフォルダ.jpg
今回はUnslashというフリー画像のサイトから適当に2枚の画像をダウンロードしてきました。シェルを使う前の状態で画像の容量はそれぞれ2.9MB、1.2MBです。

シェル使用前の状態の画像を以下に貼っておきます。

2.9MB画像
2.9MB画像.jpg
1.2MB画像
1.2MB画像.jpg
そして画像サイズ変換・容量圧縮シェルをダブルクリックして実行したあとの画像が以下です。

元2.9MB画像
元2.9MB画像.jpg
元1.2MB画像
元1.2MB画像.jpg
どうでしょうか、画質はシェル使用前後でそれほど大差ないですよね。ですが、画像の容量は2.9MB→40KB、1.2MB→47KBと大幅圧縮されています!画像の横幅もちゃんと720pxに調整されていますね。

ちなみにシェルを実行すると、画像リサイズフォルダに入っている画像を更新日が古いものから順に「1,2,3...」とリネームしていきます。
シェル実行後画像リサイズフォルダ.jpg
内容が細かい画像の場合は、圧縮によって画質が落ちて見づらくなることがあります。画像リサイズフォルダに入っていた元画像はシェル実行と同時に削除されてしまうので、バックアップをとっておくことをおすすめします。

シェルの内容がわかったところで、ここからこのシェルを使うための準備について解説していきます。一度やってしまえば、あとは画像リサイズフォルダに画像を入れる→シェルをダブルクリック、これだけで画像のリサイズと容量圧縮が一瞬でできるようになりますよ!

2. 使うための準備

画像サイズ変換・容量圧縮シェルを使える環境について解説していきます。

①シェルスクリプトが実行可能な環境

私のPCがMacなので、Macでしか動作を確認していません。

②ImageMagicのインストール

ImageMagicとは、シェルで画像のサイズ変換などを行えるようにするソフトです。ターミナルから以下のコマンドでインストールしてきましょう。

ターミナル
brew install imagemagick

brewコマンドが使えない方は、まずこちらのサイトを参考に、Homebrewをインストールしてください。HomebrewとはMacでよく使われているパッケージ管理ソフトです。

③画像サイズ変換・容量圧縮シェルの作成

好きなテキストエディタを開き、以下のシェルをコピペします。

resizeConvert.command
#!/bin/bash

files="{画像リサイズフォルダのパス}/*"
savePath="{画像リサイズフォルダのパス}/"
fileNo=1
kakuchoshi=.jpg

#圧縮する画像が置いてあるフォルダへ移動
cd {画像リサイズフォルダのパス}/

#画像ファイル名に半角スペースが含まれるとうまくいかない
#なので半角スペースを_に置き換える
find . -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;

#フォルダの中身を全てリサイズ→jpeg変換
for filepath in $files; do
    mogrify -resize 720x720 $filepath
    convert $filepath $savePath$fileNo$kakuchoshi
    rm $filepath    #圧縮前の画像は削除
    fileNo=$((fileNo+1))
done

#圧縮した画像が入っているフォルダを開く
open {画像リサイズフォルダのパス}

#処理終了
exit 0

ファイル名を「resizeConvert.command」として保存してください。拡張子を.commandとすることで、そのファイルをダブルクリックするだけでシェルが実行できるようになります。

デスクトップなど、好きな場所に「画像リサイズ」という名前のフォルダを作成します。その後、作成したフォルダのパスをコピーしてresizeConvert.commandファイルの中の{画像リサイズフォルダのパス}と記載してある部分を全て置換してください。

これで準備完了です。あとはサイズ変換・容量圧縮をしたい画像を画像リサイズフォルダに入れて、resizeConvert.commandファイルをダブルクリックするだけで画像のサイズ変換・容量圧縮ができます。

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

Mac VisualStudioCode ターミナル系ショートカットまとめ

目的

  • 便利そうなVisualStudioCode(以後、VScode)のターミナル系のショートカットをまとめる

ショートカット

  • ターミナルではそこまで複雑な作業はしないためよく使うものだけまとめておく
動作 キー
ターミナルを開く 「shift」 + 「control」 + 「@」
ターミナルウインドウを分割する 「shift」 + 「control」 + 「5」
ターミナルウインドウの幅を変える 「control」 + 「command」 + 「↑」もしくは「↓」
分割したターミナルウインドウの幅を変える 「control」 + 「command」 + 「←」もしくは「→」
分割したターミナルウインドウ間でアクティブなウインドウを切り替える 「option」 + 「command」 + 「←」もしくは「→」
ターミナルタブを切り替える こちらの方法を使って設定→VisualStudioCode ターミナルタブを切り替えるショートカットを設定する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む