20200331のMacに関する記事は7件です。

iTerm2のカラースキームを時間帯によって自動的に変えよう

ずっと同じカラースキームでターミナルの画面を見ていると飽きるし、日中はライトテーマ・夕方はダークテーマにして気分をリフレッシュしたいと思いませんか? ですが、毎日いちいち手動で朝晩にテーマを切り替えるのは面倒なのでPythonにやらせます。

Python API

2019年7月にリリースされたiTerm2バージョン3.3.0からPython APIが提供されるようになりました(それ以前はAppleScriptというAPIがあったらしい?)。pip install iterm2 すればiTerm2外部からもAPIを叩けます。

APIを使用するには Preferences > General > Magic にある Enable Python API にチェックを入れます。
Screen Shot 2020-03-31 at 20.42.58.png

自前のスクリプトを用意したい場合、Scripts > Manage > New Python Script を選ぶとガイドが出てきて雛形を作ってくれます。
作成したPythonのコードは ~/Library/Application Support/iTerm2/Scripts に保存するようになっていますが、アプリ立ち上げ時に自動で読み込ませたい場合は上記のScripts傘下にAutoLaunchフォルダを作り、そこに保管します。

実はカラースキームの自動切り替えスクリプトはフルスクラッチする必要がなく、公式の Example Scripts にほぼ完成形が用意してあります。

元のサンプルコードだとカラースキームの切り替え時にiTerm2が起動している必要があったので、アプリ起動時にも現在の時刻を参考に切り替えてくれるよう変更してあります。以下のコードを~/Library/Application Support/iTerm2/Scripts/AutoLaunch/change_color.pyとして保存してください。

change_color.py
#!/usr/bin/env python3.7

import asyncio
import datetime
import iterm2

# Clock time to change colors.
LIGHT_TIME = (7, 0)
DARK_TIME = (17, 0)

# Color presets to use
LIGHT_PRESET_NAME = "material"
DARK_PRESET_NAME = "onedark"

# Profiles to update
PROFILES = ["Default"]

def get_datetime(t, time):
    return datetime.datetime(t.year, t.month, t.day, time[0], time[1])

def datetime_after(t, time):
    today = get_datetime(t, time)
    if today > t:
        return today
    # Same time tomorrow
    return today + datetime.timedelta(1)


def next_deadline_after(t):
    light_deadline = datetime_after(t, LIGHT_TIME)
    dark_deadline = datetime_after(t, DARK_TIME)
    if light_deadline < dark_deadline:
        return (LIGHT_PRESET_NAME, light_deadline)
    return (DARK_PRESET_NAME, dark_deadline)


def get_duration():
    now = datetime.datetime.now()
    preset_name, deadline = next_deadline_after(now)
    duration = (deadline - now).seconds
    print("Sleep for {} seconds until {}".format(duration, deadline))
    return duration, preset_name


async def set_colors(connection, preset_name):
    print("Change to preset {}".format(preset_name))
    preset = await iterm2.ColorPreset.async_get(connection, preset_name)
    for partial in (await iterm2.PartialProfile.async_query(connection)):
        if partial.name in PROFILES:
            await partial.async_set_color_preset(preset)


async def main(connection):
    now = datetime.datetime.now()
    begin = get_datetime(now, LIGHT_TIME)
    end = get_datetime(now, DARK_TIME)
    if (now > begin and now < end):
        await set_colors(connection, LIGHT_PRESET_NAME)
    else:
        await set_colors(connection, DARK_PRESET_NAME)
    while True:
        duration, preset_name = get_duration()
        await asyncio.sleep(duration)
        await set_colors(connection, preset_name)
        await asyncio.sleep(1)


iterm2.run_forever(main)

最初に定義した5つの定数

  • LIGHT_TIME=(7, 0) : ライトテーマに切り替える時間(HH, MM)
  • DARK_TIME=(16, 0) : ダークテーマに切り替える時間(HH, MM)
  • LIGHT_PRESET_NAME="..." : ライトテーマ名(デフォルトテーマはLight Background
  • DARK_PRESET_NAME="..." : ダークテーマ名(デフォルトテーマはDark Background
  • PROFILES=["..."] : テーマを変更させるプロファイル名(複数選択可)

は好みに合わせて変更してください。プロファイル名は自分の作ってあるプロファイル一覧から、テーマのプリセット名は右下の Color Presets... メニューから選びます。
Screen Shot 2020-03-31 at 21.26.20.png

ちなみに print(...) の標準出力や、存在しないプリセット名を指定してしまったときなどのエラーは Scripts > Manage > Console に吐き出されます。Screen Shot 2020-03-31 at 22.28.30-1.png

退屈なことPythonにやらせるのサイコ〜〜〜〜〜〜

参考

iTerm2 にステータスバーが付いた

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

計算サーバのデータのバックアップに関するメモ

この記事は

ドライブやホストを跨いでバックアップする際の作業メモです。手元のどこかに書いているとそのメモの在りかが分からなくなってしまうのでここに書いています。
状況としては、普段SSH越しに利用している計算サーバ上のデータを、LAN内に置いているNASにバックアップする必要がありました(下の図)。
私個人の環境に合わせて書いているので、必要なところだけ掻い摘んで使ってください。なお、作業はMacのTerminalで行っています。

LAN.png

作業

1. リモートホストのファイルシステムをマウント

sshfsを予めインストールしておく。Linuxならapt-getなどで入るし、Macはbrew caskでインストール可能。
また、マウント用に、適当なディレクトリ(以下ではmountpoint)を作成しておく。

$> sshfs username@REMOTEHOST: ~/mountpoint

もし、リモートホストのホームディレクトリ(フロントサーバで初めに着地する場所)とは別のファイルシステムに置かれているファイルをsshfs越しに見る必要がある場合は、そこに予めシンボリックリンクを貼っておく。
sshfsはそのままではシンボリックリンクを読めないので、その場合は、-o follow_symlinksをsshfsのオプションとして渡す。

# ssh接続によるリモートホストでの作業
$> ln -s /ANOTHER_DRIVE/path $HOME/link_to_another_filesystem
# 手元での作業
$> sshfs username@REMOTEHOST: ~/mountpoint -o follow_symlinks
$> cd ~/mountpoint/link_to_another_filesystem # -o follow_symlinksを渡さない場合、これが失敗する

2. バックアップ先のマウント

必要に応じて追加します。

NASのマウント

LinuxだとcifsというツールをインストールしたらNASをマウントできるようなのだが、どうも書き込みができない。
Macだと新たに何かをインストールする必要はなく、terminalに元から入っているmountコマンドでマウント可能。上記のsshfsと同様に、マウント用のディレクトリを作っておく(以下ではmountpoint2)。

mount -t smbfs //username@NAS_NAME/path ~/mountpoint2

3. rsync

3.1 同期するファイルを確認する

rsyncのオプションとしてnを渡すとdry-runとなり、実際の作業はせずバックアップするファイルをリストするだけで終了する。これで、対象となるファイルを確認する。
--exclude="*.bin"などで、バイナリなどバックアップから除外するファイルを指定する。

注意する点として、コピー元のディレクトリの指定時に、src_dir_name/のようにセパレータ(/)をつけた場合、コピー先のディレクトリ内(直下)に、src_dir_nameの子ディレクトリが作られる。
一方、src_dir_nameのようにセパレータを付けない場合は、コピー先のディレクトリ直下に同名のディレクトリ(ここでいうと、src_dir_name)が作られ、その下に子ディレクトリが作られる。

rsync -avn ~/mountpoint/src_dir_name ~/mountpoint2/dst_dir_name --exclude="*.bin" 

3.2 実行

上記で確認して問題なければ、nのオプションを外して実行する。

rsync -av ~/mountpoint/src_dir_name ~/mountpoint2/dst_dir_name --exclude="*.bin" 

終わりに

何か知見が増えたらここにも追加します。

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

macでmysqlクライアント使うときの注意

Catalina で mysql クライント使おうと思った時に設定したことのメモ

インストール

$ brew install mysql

my.cnf

homebrewでインストールした場合、my.cnf の場所は /usr/local/etc/my.cnf っぽい。

/etc/my.cnf とかにはないので注意。

/usr/local/etc/my.cnf
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1

初期値はこんな感じ。

日本語使うなら下記の記述を追記

[mysql]
default-character-set = utf8

リモートサーバー接続するときの注意

ポートフォワーディングでリモートサーバーのDBに接続しようとした際に、下記のようなErrorが表示された。

$ mysql -h 127.0.0.1
ERROR 2026 (HY000): SSL connection error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small

SSL接続を強制されてなければ、--ssl-mode=DISABLED をつければOK。

$ mysql --ssl-mode=DISABLED -h 127.0.0.1

接続先のサーバー古すぎるからかも。

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

Xcodeのアプリケーション名を変更する際は半角スペースはNG

Xcodeのアプリケーション名を変更するとき、半角スペースを入れていたらドハマリしたよ、というお話です。

そもそもなんのために名前を変更?

業務でXcodeを利用していますが、いくつかのiOSアプリの保守を行っていて、そのうちの一つが古いバージョンのXcodeにしか対応していない(Swiftのバージョンが古い)ことなどが有り、Xcodeについて、最新版と古いものと、2種類をインストールしていました。
このとき、バージョンごとに使い分けができるように、 Xcode.app を、 Xcode 11.3.1.appXcode 10.2.0.app のように、バージョン番号を付与することで区別していました。

何が起きた?

いい加減、古い環境のアプリをアップデートする必要が出てきたため、プロジェクト内で利用している cocoapods 経由でインストールしている外部ライブラリについても更新しようと、久しぶりに Podfile を編集し pod update を実行したところ、エラーとなりました。

この辺り、ちょっと記録を残していなかったので曖昧なところなのですが、そもそもはおそらくVPNのネットワーク周り(プロキシの設定など)の問題でTerminalから外部にアクセスできなくなっていたのが問題だったっぽいんですが、エラー解消のため一度環境をきれいにしようと、 gemを使って cocoapods 自体をインストールし直したりしているうちに、ローカルのRuby関連のなにかのパスが見つからない、といった感じのエラーメッセージが出るようになり、 cocoapods 自体をインストールできない、といった感じでどんどんドツボにハマってしまいました…

結論

で、結果として、最終的に判明した原因は、タイトルの通り、 Xcode 11.3.1.app としていた名前が問題で、これを Xcode_11.3.1.app のように変更してやることで、gem関連のコマンドなどもスムーズに通るようになりました。
ターミナル上でパスを指定するときは、たいていは途中に半角スペースがあっても、 \ を自動的に保管してくれたりするので思いの外原因に気づくのに時間がかかってしまいました。

めったにいないとは思いますが、同じことでお困りの方の参考になれば幸いです。

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

Mac Laravel 7 Authを用いたユーザ登録 ログイン ログアウトなどの機能を作成する

目的

  • Laravel6以降のバージョンのアプリでAuthを用いたログイン系の機能を付与する方法をまとめる。

ちょっとした知識

  • Authの機能はLaravel6以降だとデフォルトで用意されなくなった。
  • Laravel6以降でAuthの機能を使用したい場合は本作業を実施する必要がある。

実施環境

  • ハードウェア環境(下記の二つの環境で確認)
項目 情報 備考
OS macOS Catalina(10.15.3)
ハードウェア MacBook Air (11-inch ,2012)
プロセッサ 1.7 GHz デュアルコアIntel Core i5
メモリ 8 GB 1600 MHz DDR3
グラフィックス Intel HD Graphics 4000 1536 MB
項目 情報
OS macOS Catalina(10.15.3)
ハードウェア MacBook Pro (16-inch ,2019)
プロセッサ 2.6 GHz 6コアIntel Core i7
メモリ 16 GB 2667 MHz DDR4
グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.3 Homwbrewを用いて導入
Laravel バージョン 7.0.8 commposerを用いて導入
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入

前提条件

  • お使いのMacにNode.jsがインストールされていること。
  • ローカル開発環境でサーバを起動してブラウザから確認できるLaravel6以上のアプリがあること。
  • デフォルトのusersテーブル作成のマイグレーションファイルのマイグレートが完了していること。

実施方法概要

  1. laravel/uiのインストール
  2. Authのファイル取得
  3. フロントエンド側でのモジュール組み込み
  4. 確認

実施方法詳細

  1. laravel/uiのインストール

    1. アプリ名ディレクトリで下記コマンドを実行する。(環境にもよるが若干時間がかかる)

      $ composer require laravel/ui
      
  2. Authのファイル取得

    1. アプリ名ディレクトリで下記コマンドを実行する。

      $ php artisan ui vue --auth
      
  3. フロントエンド側でのモジュール組み込み

    1. アプリ名ディレクトリで下記コマンドを実行する。

      $ npm install && npm run dev
      
  4. 確認

    1. ローカルサーバを起動して下記のリンクにアクセスして下記の様に表示されることを確認する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

卒論Texの書き方

環境構築

VSCodeで書いていく
ここに詳しいやり方は載っている
https://qiita.com/Gandats/items/d7718f12d71e688f3573

.latexmkrcの設定後に

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

VisualStudioCodeにおけるデバッグコンソールへの出力設定

vscodeにてJavaのデバッグ環境を作ろうとしたところ、実行結果をデバッグコンソールに表示させられず、かなりつまづいたので書いておきます。

デバッグ環境を構築&デバッグ

まずは適当なサイトを参考にしながらJDKや拡張機能をインストール。そして、テストのためにJavaのファイルを作り、デバッグコンソールに文字列を表示するだけの簡単なコードを記述してみました。
alt
参考にしていたサイトでは、この段階でデバッグを開始したら実行結果がデバッグコンソールに表示されていましたがここで問題発生。なぜかデバッグコンソールに「hello world」の文字列が表示されないのです。
JDKをインストールし直しても、拡張機能を入れ直しても、ファイルを作り直しても、一向に表示されない…
alt

解決方法

どんなワードで検索しても解決策が見つからず、萎えてしまい一ヶ月が経過したとき、ふと「そういえばデバッグコンソールへの出力設定とかって無いのか?」と思いつきました。
早速、設定の検索窓に「DebugConsole」と入力してみると
alt
それらしき雰囲気の設定項目が見つかった。
英語でよくわからないのでGoogle先生に聞くと

Javaプログラムを起動するための指定されたコンソール。特定のデバッグセッション用にコンソールをカスタマイズする場合は、launch.jsonのコンソール設定を変更してください。

とのこと、いまいち訳がわかりにくいが恐らく「プログラムの実行結果を表示する場所を変えたいのなら、この設定を変更してください」という感じの意味合いだと思われる。
ということで、デフォルトとして選択されていた integratedTerminal から internalConsole へと設定を変更。そして試しにデバッグをしてみると…
alt
しっかりデバッグコンソールに実行結果が表示されました。どうやらデフォルトの設定で、実行結果の出力先がターミナルになっていたようです。

終わりに

皆さんもvscodeなどで何かつまづいたら、まずはソフト自体の設定にそれらしき項目がないか探してみましょう。今回のように意外と簡単な設定ミスかもしれません。

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