yupaがエンジニアになるまでを記録するブログ

FjordBootCamp (フィヨルドブートキャンプ ) で学んだことや、趣味のVRに関するメモを記録していきます

Mac mini (Late 2012)でソフトウェアアップデートしようとすると"PKInstallErrorDomainエラー106"が発生してアップデートできない時の対処法

Macのソフトウェアアップデートでこうなったときの対処法。

環境

対処法

根本的な対処法ではないけど・・・orz

f:id:yu8as:20181214034542p:plain OSアップデートのエラーかと思ったら一緒にアップデートしようとしてたGarageBandのアップデートでのエラーだった。 この画面の詳しい情報...をクリックしてGrageBandのアップデートのチェックを外すとOSアップデートは無事成功した。

尚、OSアップデート完了後再度GarageBandのアップデートを試してみたがやはり失敗する。

参考

(PKInstallErrorDomain error 106.) (106) - Apple Community

RubyのFile::Stat#modeで返ってくる数字について

instance method File::Stat#mode (Ruby 2.5.0)は6桁の整数を返してくれて、下3桁はファイルのパーミッションを表しているが、100や120, 40となっている頭2~3桁は何やねんということで調べてみた結果。

この3桁の数字はファイルタイプを表している。Michael Kerrisk - man7.orginode(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標準のsedBSD版のものらしく、-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のnpmmacOSHomebrew等がある。

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 パッケージ名 : 指定したパッケージに対し依存しているパッケージ一覧 f:id:yu8as:20180921204137p:plain

例えば、vimに対する関係として提案となっているvim-docはまだインストールされていないことがわかる。(インストール済みのパッケージリストを表示するコマンドはdpkg -lf:id:yu8as:20180921204925p:plain

実際にパッケージをインストールするまでの流れ

ファイルの検索をしてくれるlocateをインストールするまでを例としてまとめていく。

まずはapt update

apt update
aptのインストールはローカルに保存されているパッケージリストをもとに行われるため、最初にこのリストを最新のものに更新する必要がある。そのコマンドがupdate
参考 : apt-get updateは何を行っているのか調べてみた〜パッケージインデックスファイルとは何か〜 - 君は心理学者なのか?

目的のパッケージを探す

# apt list locate
listは完全一致。部分一致で検索したい場合はsearchを使う。

パッケージの詳細を確認

# apt show locate
で指定したパッケージの詳細が確認できる

f:id:yu8as:20180921192658p:plain

パッケージのインストール

# apt install locate
結果、 f:id:yu8as:20180921195525p:plain updatedbしてlocateが使えるようになった。 f:id:yu8as:20180921193927p:plain

パッケージの更新

インストールしているすべてのパッケージを更新したい場合は、以下のコマンドを実行する。 

# apt update 
# apt upgrade

apt updateにより、前述の通りローカルのパッケージリストが最新のものに更新される。
次にupgradeを実行すると、まずパッケージリストの各パッケージのバージョンと実際にインストールされているパッケージのバージョンを比較し、もしパッケージリストのバージョンに新しいものがあれば実際のパッケージをアップグレードする、という流れとなる。

full-upgradeはパッケージの削除が伴う更新を行う際に実行する。公式曰く、

apt full-upgrade は Debian 不安定版 リリースを日常的に使い、毎日開発進化を追いかけているユーザが使うコマンドです。  
6.2. aptitude、apt-get、apt コマンド

APTはすごい牛パワーを持ってるらしい

f:id:yu8as:20180921205541p:plain

試しにapt mooしたらAPTのすごい牛パワーを感じることができた(?)

参考

Flickr APIで画像検索して検索結果の画像をダウンロードするシェルスクリプト

UNIXコマンドとかシェルスクリプトとか正規表現の勉強がてら標題のスクリプトを書いた。

主な仕様

  • 1つの引数を受け取る : ""で囲まれた検索文字列
  • 検索結果の上位10件の画像をlargeサイズでダウンロードしてimageディレクトリに保存する

環境

  • macOS High Sierra 10.13.6
  • ターミナル(bash)にて実行
  • MacにインストールされていないコマンドはHomebrewでインストールした🍺(nkfなど)

Flickr APIについて

API キーの取得

使用するにはAPIキーの取得が必要。

The App Garden on Flickr にアクセスして"Request an API Key"をクリック f:id:yu8as:20180919201212p:plain

Non-commercial(非営利)の方を選択 f:id:yu8as:20180919201540p:plain

アプリの名前と説明を入力し規約に同意したらチェックを入れてsubmit f:id:yu8as:20180919211551p:plain

するとkeyとsecretを取得できる。今回はpublicな画像を検索するので使うのはkeyのみ。 f:id:yu8as:20180919202552p:plain

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

APIキーは環境変数から読み込み

解説

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 = %`
#レスポンスの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     
.......

f:id:yu8as:20180919211332g:plain
いい感じの工場夜景の画像が10件ダウンロードされた!!

参考

iPhoneが突然膨らんできた件

f:id:yu8as:20180917181541j:plain

冷たくなった僕のiPhone6の様子です。

何が起きたか

  • ある日iPhone6のカバーが少し浮いてきた
  • 日を増すごとにカバーの浮き具合が大きくなっていく。1日のスパンで差がわかるレベル
  • バッテリの持ちも異常に悪くなる
  • ついには再起動を繰り返すようになりまともに使用できない状態に

バッテリの膨張ですねこれ。

何故こうなったのか(推測)

自動車のダッシュボードに設置してナビとして使用していた

ダッシュボードに設置したスマホスタンドに固定してカーオーディオのUSBに接続して充電しなから使用していたので、高温下に晒される時間が長かった。

正規品ではないバッテリを使用していた

iPhoneを水没させてしまって何故か充電ができなくなった際、修理を非正規店に出してしまった。結果、正規品ではないバッテリに交換されてしまった。店員さんいわく、交換したバッテリの寿命は半年らしい。明らかに交換後半年以上使用していた。

反省点

  • 修理はApple正規店に出す!!
  • 自動車のナビとして使用する際はスマホスタンドの位置を工夫して日光が当たらない場所ににiPhoneを設置する!!

iPhone8に替えた

丁度iPhone Xsが発表されてiPhone8が安くなったタイミングで購入できた。めちゃくちゃサクサク動くしTouch IDのロック解除早いし Apple pay便利だし今の所満足。3D Touchもクセになる。