Mac mini (Late 2012)でソフトウェアアップデートしようとすると"PKInstallErrorDomainエラー106"が発生してアップデートできない時の対処法
勘弁してほしい pic.twitter.com/HWMSttYNMS
— yupa (@yupa_eg) 2018年12月13日
Macのソフトウェアアップデートでこうなったときの対処法。
環境
対処法
根本的な対処法ではないけど・・・orz
OSアップデートのエラーかと思ったら一緒にアップデートしようとしてたGarageBandのアップデートでのエラーだった。 この画面の詳しい情報...をクリックしてGrageBandのアップデートのチェックを外すとOSアップデートは無事成功した。
尚、OSアップデート完了後再度GarageBandのアップデートを試してみたがやはり失敗する。
参考
RubyのFile::Stat#modeで返ってくる数字について
instance method File::Stat#mode (Ruby 2.5.0)は6桁の整数を返してくれて、下3桁はファイルのパーミッションを表しているが、100や120, 40となっている頭2~3桁は何やねんということで調べてみた結果。
この3桁の数字はファイルタイプを表している。Michael Kerrisk - man7.orgのinode(7) - Linux manual pageに書いてあった。ついでに$ls -l
で先頭に表示されるファイルタイプの英字1文字への対応も記した。(man lsで参照できる)
S_IFSOCK 0140000 socket # s S_IFLNK 0120000 symbolic link # l S_IFREG 0100000 regular file # - S_IFBLK 0060000 block device # b S_IFDIR 0040000 directory # d S_IFCHR 0020000 character device # c S_IFIFO 0010000 FIFO # p
ちなみにこんなこと調べなくてもinstance method File::Stat#ftype (Ruby 2.5.0)がファイルタイプを文字列で返してくれるので便利。
参考 : <sys/stat.h>
sedである文字列が含まれる行を指定したファイルの内容に置き換える方法
$ cat source.txt hoge fuga piyo $ cat replace.txt sekisaba aji hotate
例えば、source.txt
で"fuga"が含まれる行をreplace.txt
の内容で置き換えて上書きしたい場合、こうする。
$ gsed -i -e "/fuga/r replace.txt" -e "/fuga/d" source.txt
結果
$ cat source.txt hoge sekisaba aji hotate piyo
コマンドとオプションの解説
-i
オプション : 編集結果を入力ファイルに上書きする-e
オプション : 実行するコマンドにスクリプトを追加するr
コマンド : ファイルを読み込むd
コマンド : パターンに一致する行を削除
ちなみにMac標準のsed
はBSD版のものらしく、-i
オプションの挙動が異なるので上記の結果を得る場合はgnu-sedで実行する必要がある。
$brew install gnu-sed
でインストール可能。
参考 : sed, a stream editor
正規表現チートシート
JavaScript 第5版 11章 正規表現パターンマッチング を基に自分なりに表を作ってみたらいい感じにまとまったのでチートシートとして残しておく。
文字クラス
そのクラスに含まれる任意の1文字にマッチする。
正規表現 | 意味 |
---|---|
[...] | 角括弧内の任意の1文字。[a-z] のようにハイフンを使うと文字の範囲を指定できる。 |
[^...] | 角括弧内の任意の1文字以外の文字。 |
. | 改行以外の任意の文字 |
\w | 任意の単語文字。[a-zA-Z0-9]と同じ。 |
\W | ASCII文字での単語以外の文字。[^a-zA-Z0-9]と同じ |
\s | 任意のUnicode空白文字 |
\S | Unicode空白文字以外の文字 |
\d | 任意の数字。[0-9]と同じ。 |
\D | 数字以外の文字。[^0-9]と同じ。 |
繰り返し
正規表現 | 意味 |
---|---|
{n,m} | 直前の項目をn~m回繰り返す。 |
{n, } | 直前の項目をn回以上繰り返す。 |
{n} | 直前の項目をn回だけ繰り返す。 |
? | 直前の項目を0または1回だけ繰り返す。 |
+ | 直前の項目を1回以上繰り返す。 |
* | 直前の項目を0回以上繰り返す。 |
選択・グループ化・参照
正規表現 | 意味 |
---|---|
| | 選択。この記号の前後どちらかに一致する。 |
(...) | グループ化。複数の項目を一つにまとめる。後に\n でグループに一致する文字を参照できる。 |
\n | グループ番号nで指定された部分表現に一致した文字列に一致する。番号は、左から数えて何番目の() かで表す。 |
アンカー
文字列内の特定の位置を表すもの 。
正規表現 | 意味 |
---|---|
\b | 単語境界 行頭や単語間の空白の前後にマッチする。\w と\W の境界。ただし文字クラス内での\b はバックスペース文字に一致する。 |
$ | 行末 |
^ | 行頭 |
(?=p) | 肯定先読み。パターンp にマッチした直前の位置を表す。 |
(?!=p) | 否定先読み。パターンp にマッチした直前の位置以外のすべての位置を表す。 |
(?<=p) | 肯定後読み。パターンp にマッチした直後の位置を表す。 |
(?<!p) | 肯定後読み。パターンp にマッチした直後の位置以外のすべての位置を表す。 |
DebianのAPTについて
FjordBootCampプラクティスのお題記事。DebianのAPTについて簡単にまとめていく。
APTとは?
Debian用に開発されたパッケージ管理システム
APT - Wikipedia
Advanced Package Toolの略。APTというパッケージを管理するプロジェクトが有り、そのプロジェクトが提供するコマンドラインベースフロントエンドがapt。 このaptでパッケージのインストール、削除、更新等の管理ができる。
パッケージ管理システムとは?
そもそも、Linuxではソフトウェアのことをパッケージと呼ぶ。パッケージ管理システムは、パッケージのインストール、アンインストールのほか、パッケージ同士やライブラリ間の依存関係の解決も行うシステムである。
Debian以外のパッケージ管理システムの例として、Node.jsのnpmやmacOSのHomebrew等がある。
apt/apt-get/aptitudeの違い
apt-get
APTプロジェクトで開発された最初のコマンドラインツール
apt
同じくAPTプロジェクトで開発されたもう一つのコマンドラインツール。apt-getが持つ設計上の欠陥を克服しており、aptを使用することが最も推奨されている
6.2. aptitude、apt-get、apt コマンド
aptitude
ビジュアルモードが備えられている対話型パッケージ管理プログラム。(Debian 9.1にはデフォルトでインストールされていなかった。)
パッケージ同士の関係について
APTでは、コンパイル済みパッケージの関係を4つの関係性で表す
- 依存 : パッケージを導入するのに欠かすことのできないパッケージ
- 推奨 : 無くてもよいが、プログラムの機能を利用するために通常は導入するパッケージ
- 提案 : 無くてもよいが、導入することによってプログラムの機能を向上させるパッケージ
- 衝突 : パッケージを導入することで、同一の機能を有するなどの理由で削除されるパッケージ
これら依存関係を確認するには、以下コマンドを実行。
apt-cache depends パッケージ名
: 指定したパッケージが依存してるパッケージ一覧apt-cache rdepends パッケージ名
: 指定したパッケージに対し依存しているパッケージ一覧
例えば、vimに対する関係として提案となっているvim-docはまだインストールされていないことがわかる。(インストール済みのパッケージリストを表示するコマンドはdpkg -l
)
実際にパッケージをインストールするまでの流れ
ファイルの検索をしてくれるlocateをインストールするまでを例としてまとめていく。
まずはapt update
apt update
aptのインストールはローカルに保存されているパッケージリストをもとに行われるため、最初にこのリストを最新のものに更新する必要がある。そのコマンドがupdate
。
参考 : apt-get updateは何を行っているのか調べてみた〜パッケージインデックスファイルとは何か〜 - 君は心理学者なのか?
目的のパッケージを探す
# apt list locate
list
は完全一致。部分一致で検索したい場合はsearch
を使う。
パッケージの詳細を確認
# apt show locate
で指定したパッケージの詳細が確認できる
パッケージのインストール
# apt install locate
結果、
updatedbしてlocateが使えるようになった。
パッケージの更新
インストールしているすべてのパッケージを更新したい場合は、以下のコマンドを実行する。
# apt update # apt upgrade
apt update
により、前述の通りローカルのパッケージリストが最新のものに更新される。
次にupgrade
を実行すると、まずパッケージリストの各パッケージのバージョンと実際にインストールされているパッケージのバージョンを比較し、もしパッケージリストのバージョンに新しいものがあれば実際のパッケージをアップグレードする、という流れとなる。
※full-upgrade
はパッケージの削除が伴う更新を行う際に実行する。公式曰く、
apt full-upgrade は Debian 不安定版 リリースを日常的に使い、毎日開発進化を追いかけているユーザが使うコマンドです。
6.2. aptitude、apt-get、apt コマンド
APTはすごい牛パワーを持ってるらしい
試しにapt moo
したらAPTのすごい牛パワーを感じることができた(?)
参考
Flickr APIで画像検索して検索結果の画像をダウンロードするシェルスクリプト
UNIXコマンドとかシェルスクリプトとか正規表現の勉強がてら標題のスクリプトを書いた。
主な仕様
- 1つの引数を受け取る : ""で囲まれた検索文字列
- 検索結果の上位10件の画像をlargeサイズでダウンロードしてimageディレクトリに保存する
環境
Flickr APIについて
API キーの取得
使用するにはAPIキーの取得が必要。
The App Garden on Flickr にアクセスして"Request an API Key"をクリック
Non-commercial(非営利)の方を選択
アプリの名前と説明を入力し規約に同意したらチェックを入れてsubmit
するとkeyとsecretを取得できる。今回はpublicな画像を検索するので使うのはkeyのみ。
APIで画像検索してみる
Flickr Services: Flickr API: flickr.photos.searchを参考に以下のようにURLを組み立てる
https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=取得したAPIキー&format=rest&text=検索キーワード&extras=url_l
最後のextras=url_l
は検索結果にlサイズの画像のリンクを含めるように指定している。
試しに、検索ワード"工場夜景"で検索してみると・・・
<rsp stat="ok"> <photos page="1" pages="54" perpage="100" total="5376"> <photo id="44608553832" owner="124733612@N05" secret="8347c94989" server="1876" farm="2" title="[HDR]夜のタンク" ispublic="1" isfriend="0" isfamily="0" url_l="https://farm2.staticflickr.com/1876/44608553832_8347c94989_b.jpg" height_l="681" width_l="1024"/> <photo id="43856049064" owner="125446885@N04" secret="a3ea615f37" server="1848" farm="2" title="片貝花火" ispublic="1" isfriend="0" isfamily="0" url_l="https://farm2.staticflickr.com/1848/43856049064_a3ea615f37_b.jpg" height_l="683" width_l="1024"/> <photo id="44485653892" owner="124733612@N05" secret="bcb27f8077" server="1872" farm="2" title="新日鐵住金君津製鐵所の夜景" ispublic="1" isfriend="0" isfamily="0" url_l="https://farm2.staticflickr.com/1872/44485653892_bcb27f8077_b.jpg" height_l="681" width_l="1024"/> <photo id="44499188271" owner="143665393@N04" secret="bc0d8ed0ce" server="1881" farm="2" title="Inaba port line, Yokkaichi, Japan" ispublic="1" isfriend="0" isfamily="0" url_l="https://farm2.staticflickr.com/1881/44499188271_bc0d8ed0ce_b.jpg" height_l="1024" width_l="683"/> ...
検索結果の上位100件のリストがxmlで返ってくる。
値には画像の直リンが含まれているのでこのURLのみのリストに整形してwgetに渡して画像をダウンロードするというスクリプトを組む。
コード
2018.9.21 : 一時ファイルをmktempで作成されるファイルに変更した
#!/bin/sh if [ -z $1 ]; then echo "検索キーワードを入れてください" echo "以下に例を示します" echo "\$ ${0} \"GT-R R35\"" exit fi keyword=$1 # 文字列をエンコード=を%に置換 keyword=`echo $keyword | nkf -wMQ | tr = %` # 一時ファイルを作成↲ res=`mktemp`↲ list_url=`mktemp` #レスポンスを一時ファイルへ curl "https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=${FLICKR_API_KEY}&format=rest&text=${keyword}&extras=url_l" > $res #レスポンスのstatusを取得 status=`cat $res | grep "<rsp stat=" | sed -e 's/<rsp stat="//g' -e 's/">//g'` if [ $status != "ok" ]; then echo "画像リストを取得できませんでした" exit fi ## レスポンスのxmlから画像urlのみを切り取って最初の10行を一時ファイルに保存 cat $res | grep "url_l" | sed -e 's/^.*url_l="//g' -e 's/".*$//g' | head > $list_url ## /imageディレクトリがなければ作成 [ ! -e image ] && mkdir image ## wgetでimageディレクトリ内に画像ダウンロード wget -T 30 -t 1 -i list_url.txt -P image rm $res rm $list_url
解説
if [ -z $1 ]; then
-z
: 文字列比較演算子 文字列の長さが0であれば真$1
: シェルスクリプト実行時に与えられた引数。1つめは$1
、2つ目は$2
というようにインクリメントされていく;
: 1行に複数のコマンドを書く際に区切りとなる文字
[
もコマンドのひとつなので前後に空白が必要
echo "\$ ${0} \"GT-R R35\""
${0}
:$0
は実行時のコマンド名が設定される変数。文字列中なので{}で囲っている
# 文字列をエンコード=を%に置換 keyword=`echo $keyword | nkf -wMQ | tr = %`
nkf -wMQ
: MIME quotedに変換しUTF-8で出力tr = %
: "="を"%"に置換
#レスポンスのstatusを取得 status=`cat res.txt | grep "<rsp stat=" | sed -e 's/<rsp stat="//g' -e 's/">//g'`
sed -e 's/<rsp stat="//g' -e 's/">//g'
: ''のダブルクォーテーション前後を空文字に置換しstatの値を取り出している
## レスポンスのxmlから画像urlのみを切り取って最初の10行を一時ファイルに保存 cat res.txt | grep "url_l" | sed -e 's/^.*url_l="//g' -e 's/".*$//g' | head > list_url.txt
s/^.*url_l="//g
: 行の先頭からurl_l="
までを空文字に置換s/".*$//g
: 最初の"
から行末までを空文字に置換 (URLの切り取り、もっといい方法がある気がする・・・)
## /imageディレクトリがなければ作成 [ ! -e image ] && mkdir image
!
: 否定-e image
: imageファイル(ディレクトリ)が有れば真
## wgetでimageディレクトリ内に画像ダウンロード wget -T 30 -t 1 -i list_url.txt -P image
-T 30
: タイム・アウトするまでの秒数。今回は30秒-t 1
: リトライする回数。今回は1回-i list_url.txt
: URLをファイルから読み込み-P image
: ファイルをダウンロードするディレクトリを指定
実行結果
検索ワードは"工場夜景"
$ ./flickrsearch.sh "工場夜景" % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 26802 100 26802 0 0 37967 0 --:--:-- --:--:-- --:--:-- 37963 --2018-09-19 21:07:25-- https://farm2.staticflickr.com/1844/29805641047_779f870a25_b.jpg farm2.staticflickr.com (farm2.staticflickr.com) をDNSに問いあわせています... 74.6.47.80 farm2.staticflickr.com (farm2.staticflickr.com)|74.6.47.80|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 461874 (451K) [image/jpeg] `image/29805641047_779f870a25_b.jpg' に保存中 29805641047_779f870a25_b.jpg 100%[=================================================>] 451.05K 443KB/s 時間 1.0s .......
いい感じの工場夜景の画像が10件ダウンロードされた!!
参考
iPhoneが突然膨らんできた件
冷たくなった僕のiPhone6の様子です。
何が起きたか
- ある日iPhone6のカバーが少し浮いてきた
- 日を増すごとにカバーの浮き具合が大きくなっていく。1日のスパンで差がわかるレベル
- バッテリの持ちも異常に悪くなる
- ついには再起動を繰り返すようになりまともに使用できない状態に
バッテリの膨張ですねこれ。
何故こうなったのか(推測)
自動車のダッシュボードに設置してナビとして使用していた
ダッシュボードに設置したスマホスタンドに固定してカーオーディオのUSBに接続して充電しなから使用していたので、高温下に晒される時間が長かった。
正規品ではないバッテリを使用していた
iPhoneを水没させてしまって何故か充電ができなくなった際、修理を非正規店に出してしまった。結果、正規品ではないバッテリに交換されてしまった。店員さんいわく、交換したバッテリの寿命は半年らしい。明らかに交換後半年以上使用していた。
反省点
iPhone8に替えた
丁度iPhone Xsが発表されてiPhone8が安くなったタイミングで購入できた。めちゃくちゃサクサク動くしTouch IDのロック解除早いし Apple pay便利だし今の所満足。3D Touchもクセになる。