Taka's blog

Techネタなど

Macbook proで内蔵サウンドデバイスが認識されなくなったときの解決法

アブスト

Macbook pro 13-inch(Touch barモデル)で内蔵サウンドデバイス(スピーカー,マイク両方)が突然認識されなくなった.SMCリセットというものを試したら直った.

経緯

使用環境は,Macbook pro 13-inch(Touch barモデル)に,外部ディスプレイでPhilipsの25インチを接続している.
このディスプレイは,USBハブ,Ethernetポート,スピーカー,USB-Cでの電力供給の機能を持っている.
キーボードとEthernetと電源給電を,ディスプレイとの接続であるUSB-C1本に相乗りさせて使っていた.
ある日,スリープ状態のままUSB-Cを抜いて持ち運んだら,復帰時に異常な時間がかかり,サウンドデバイスが認識しなくなった.
ディスプレイをつなげても,サウンドデバイスは内部・外部ともに何も認識しなくなった.

試した対策

  • 再起動
  • NVRAM(PRAM)クリア(起動時option+command+P+R)
  • Apple診断(起動時D)

正解の解決策

SMCリセット(起動時control+shift+option+電源ボタン(TouchIDボタン)10秒→電源投入)

考察

SMCリセットで直った.SMCリセットは,蓋の開閉時の制御も司っているようなので,スリープ状態でいきなりUSB-Cを抜いてしまったときにこのあたりがバグったのではないかと推測される.

作業環境の見直し・整備

先週で一仕事終わってキリがよくなったので,作業環境のメンテナンスをしています.
先延ばしにしていたMacOSのアップデートにはじまり,ドローツールGraphicの購入,メモ管理サービスwri.peのお試しなど.

また,ずっと右画面左下に常駐している(放置している)ポモドーロテクニック用のツールもまた使おうと決意.

いつか,これらを振り返れればいいなと思います.

Jupyter notebookで.py形式でも保存したい(importされる側)

アブスト

Jupyter notebookでクラスを書いて,他のノートブック(.ipynb)からimportしたかった..ipynb形式のままではインポートできないようなので,.pyを出力してインポートすることになるが,Downloadするんじゃなくて同じ階層に生成さえしてくれればよかった.Jupyterのコマンドで解決した.

ノートブックにこのセルを作っておこう

import subprocess
subprocess.run(['jupyter', 'nbconvert', '--to', 'python', 'ファイル名.ipynb'])

何をやってる?

コマンドラインで,

jupyter nbconvert --to python ファイル名.ipynb

を実行してるのと同じです.
これを,ipynb保存時に自動的に実行する方法がネットに色々落ちていますが,
毎回.pyを生成するのは遅いし必要ないと思ってセルで実装しました.

bashでファイルの文字コードを一括変更する

アブスト

Atomではutf-8で開くので,サンプルのソースコードを全部utf-8に変更したかった.
(元の文字コードは不明...)
bashのfor文でnkfを使って処理した.

スクリプト

javaソースコードのsrcフォルダに移動.〜2.javaというファイルをutf-8エンコードで出力する.

for f in *.java ; do nkf -u $f > ${f/.java/2.java} ; done

BitBarにPythonで日本語を表示させる

アブスト

BitBarはMacツールバーに色々表示できて便利なツールですが,pythonで単純に日本語をprintするとエラーが出ます.Pythonの出力エンコーディングを"PYTHONIOENCODING=UTF-8"で変えれば日本語が表示できます.

症状

#!/Users/ME/anaconda/bin/python3
print('テスト')

とやると,

'ascii' codec can't encode characters in position ~~ ordinal not in range(128)

みたいなエラーが出ます.

解決策

Pythonの出力エンコーディングは,自動で最適なものを選んでいる?というような記述もありますが,今回はうまくいっていないようです.なので,自分で出力をUTF-8と指定します.

#!/usr/bin/env PYTHONIOENCODING=UTF-8 /Users/ME/anaconda/bin/python3
print('正しい日本語出力')

Jupyter notebook (IPython notebook)をリモートサーバ,ワークステーションで動かした

アブスト

Pythonでシミュレーションを組んで回すとき,メモリの関係でワークステーションで回す必要があった.普段使ってるJupyter notebookをワークステーション上で走らせ,自分の端末のブラウザから使えたら便利だなと思った.調べてやったらできた.

気をつけること

Jupyter notebookは,IPython以外も使えるように拡張されたものであり,設定ファイルはIPython notebookのものとは異なります.

環境

Anacondaで一式を入れて,Python3.5を使用
自分の端末もワークステーションMacで,同一サブネット内に接続

手順

qiita.com

これを大いに参考にして設定.
インストールはすでに終わっているので,鍵の設定からやりました.
ブラウザを立ち上げない設定は入れず,ポートも49999にしました.

おまけにqtconsoleも接続する

qtconsoleはIPythonのコンソールですが,すでに起動しているカーネルに接続することができます.これが何を意味するかというと,notebookでは決まった形で結果を表示しておいて,途中の変数や配列の一部を見たい時にqtconsoleでチョロっと眺めることができます.Jupyter notebookには選択部分を実行ってのがないので,「すぐ下にセル追加→ちょこっと実行→セル削除」ってやってた部分がなくなり捗ります.

bashで書く

#!/bin/bash
scp ユーザー名@ワークステーション名:/Users/ユーザー名/Library/Jupyter/runtime/kernel* /tmp/qtconsole.json
jupyter qtconsole --existing /tmp/qtconsole.json --ssh ユーザー名@ワークステーション名

実行するときは,上のコマンドをテキストエディタで書いてqtconsole.shとして保存し,ターミナルで

bash qtconsole.sh

とするなど.ファイル名は自由

何をやっているのか

scpでワークステーションからカーネル接続情報のJSONファイルを/tmpにダウンロードします.そしてsshを介して接続するオプションをつけてqtconsoleを起動します.

使用感

どの端末からもJupyter notebookを開ける(iPhoneからも開けることは開ける)ので便利です.端末側はブラウザさえあればいいので環境も汚れません.

PythonのNumpyで複素数の相関係数を計算したかった

アブスト

Python3.5で@演算子による行列計算ができるようになった(y=A@x)

のを機に,Pythonで研究を進めた.

複素数をバリバリに扱う内容で,numpy.corrcoefに複素数を適当に突っ込んだら全く意図しない挙動を示した.

corrcoefが複素数に対応していないのかと思って自力で実装したりしたが,結局Pythonが悪いのではなく,自分が突っ込んだ数列がマズかった.

 

問題の挙動

以下のコードで確認できます.

import numpy as np
s1=np.array([1+1.0j,1+2.0j])
s2=np.array([1+1.0j,1+1.0j])
cor = np.corrcoef(s1,s2)
print(cor) 

 

# [[  1. +0.j  nan+nanj]
#  [ nan+nanj  nan+nanj]]

 

原因

信号のエネルギーが0だと,分散が0になり,結果0除算になってNaNになる.

上記の例ではs2が直流(信号のエネルギーは0)となっている.