白旗製作所

ブログデータのバックアップ

知らなかったので一応メモ。

FC2のブログのバックアップは、
管理画面左下の、ツール→データバックアップからできます。

ただ、画像までのリンクとかはそのままなので、
引越サービスとか使わないと、そのまま移すだけでは画像が
表示されない感じになります。
スポンサーサイト
  1. 2015/11/15(日) 11:57:42|
  2. ブログパーツ
  3. | トラックバック:0
  4. | コメント:0

WICED SenseのUSB電源での動作

Wiced Senseは、ボタン電池動作しますが、
待機中はLEDの、Bluetooth接続中はセンサの消費電力が大きく、
電池があまり持ちません。

デバッグ中はなるべく電池よりもUSBから電源をとって動作させましょう。
以下の方法で、USB電源動作することができます。

①WICED Senseのボタン電池のフタを外しておき、
 ボタン電池を指で挿入して押さえます。

②赤LEDが光り始め動作を開始したら、
 USBケーブルを接続します。

③ボタン電池を離しても動作し続けます。

注意:
 USB電源で動作させると、Bluetooth接続に失敗しやすかったり、
 動作が不安定になる場合があります。

参考:
WICED SENSE Kit BLOG

  1. 2015/11/14(土) 22:03:29|
  2. WICED Sense
  3. | トラックバック:0
  4. | コメント:0

WICED Senseのファーム開発環境構築と書き込み

Broadcomが、WICED Senseという無線センサ開発キットを出しています。
https://www.switch-science.com/catalog/1925
https://store.macnica.co.jp/products/broadcom_bcm9wiced_sense

Broadcom自体は無線チップメーカで、チップを使った開発キットの位置づけです。
ただ、これ単体でもいろいろ遊べそうなので、購入してみました。

WICED Sense自体のファームウエアの開発と、
WICED Senseのデータを受信して利用するアプリの開発をする必要がありますが、
今回はファームの開発環境構築です。

参考:WICED Senseのファームウェアを変更してみる

①IDEとSDKのダウンロード・インストール
まずBroadcom communityに登録します。
Broadcom community
ここからSDKやリファレンスガイドなどをダウンロードすることができます。

次にSDKをダウンロードします。
WICED Bluetooth→Download SDKで
WICED-Smart-SDK-2.2.1-IDE-Installer
と書かれたリンクからインストーラをダウンロードします。
WICED Sense IDE Download2

ダウンロードしたらインストールに移りますが、
このIDEのインストーラが少し曲者で、JREがJava7でないと動作しないようです。
Java8にアップデートしてしまい、Java7がない場合、
Oracleのアーカイブからダウンロードしてインストールすることになります。
Javaアーカイブ
これでインストールできるようになります。

②プロジェクトの準備
開発の手順は、Broadcom communityの以下の記事が詳しいです。
WICED SENSE Kit BLOG
ちなみにこれ以外にも以下のコンテンツがあります。
WICED Sense Table of Contents

WICED Senseの電池を抜いて、USBケーブルでPCに接続します。
IDEのインストール時に、Silicon LabのUSB-UARTドライバもインストールされたはずですので、
自動的にドライバがインストールされて使用できるようになります。
念のため、デバイスマネージャーで確認しておきます。

次に、IDEを起動します。画面はほぼeclipseです。
左側のProject Explorerの中の、
WICED-Smart-SDK→Apps→wiced_sense
が、販売されているWICED Senseのデフォルトのファームウエアです。
これを修正して使います。

wiced_senseのフォルダをコピー・貼り付けして名前を変更します。
今回は「wiced_sense_changed」とします。
フォルダ内のwiced_sense.cがメインのファイルなので、
この辺りを見て適宜修正します。

③書き込みと動作確認
IDE右側にMake Targetの中にSDKの他のプロジェクトのBuild→書き込みのターゲットが用意されています。
以下のフォーマットで名前を作ってターゲットを用意すると、Buildと書き込みができます。
 プロジェクト名-チップ名 コマンド名
例:wiced_sense_changed-BCM920737TAG_Q32 download

他のターゲットをコピー・貼り付けしてEdit→Target nameを例の様に記載して、
Targetをダブルクリックすると、ConsoleにBuild結果と書き込み結果が表示されます。

USBケーブルを接続した直後であれば、以下の様なメッセージがでて書き込み成功し、
プログラムが走り出します。
 Detecting device...
 Device found
 
 Downloading application...
 Download complete

 Application running

デバイスが接続されていなかったり、アプリケーションがすでに走っていたりすると、
 Detecting device...
 No BCM20737 detected
というメッセージが出て、書き込みが失敗します。
この場合は、デバイスを接続しなおしたり、リセットしたりを試す必要があります。

④Appendix リカバリの方法
WICED Senseリカバリの方法を書きます。
まず、カバーを外して基板を出します。
以下の矢印の箇所にドライバーを突っ込んで、赤いカバーを外します。
DSC_3860_2.png

表に見えた基板の赤四角部分がブートボタンです。
DSC_3858_2.png
ココでプラスネジが2つあるのでそれも外します。

DSC_3857_2.png
赤四角の部分がリセットボタンです。

USBケーブルに接続し、
(a)リセットボタンを押しながらブートボタンを押す
(b)リセットボタン→ブートボタンの順に離す
とこれでリカバリの準備ができます。

SDKのMake Targetに「WICED_SENSE-BCM920737TAG_Q32 recover UART=COMXX」
という名前のTargetを作り、実行すると、EEPROMに初期のプログラムが書き込まれ、リカバリできます。
(COM番号はデバイスマネージャーのポートにあるUSB to UART BridgeのEnhanced COM Portの番号です。)

  1. 2015/11/14(土) 17:43:38|
  2. WICED Sense
  3. | トラックバック:0
  4. | コメント:0

[Python]Anaconda3+spyder環境でpandasのエラーが生じてIPythonに括弧が入力できない。

タイトルのとおりです。

長時間Spyderを開いていると、たまにIPython上に以下のメッセージがでて、
括弧"("とかの記号を入力しようとすると、エラーメッセージで潰されて実行できなくなります。

C:\Anaconda3\lib\site-packages\pandas\core\format.py:2037: RuntimeWarning: invalid value encountered in greater has_large_values = (abs_vals > 1e8).any()
C:\Anaconda3\lib\site-packages\pandas\core\format.py:2038: RuntimeWarning: invalid value encountered in less has_small_values = ((abs_vals < 10 ** (-self.digits+1)) &
C:\Anaconda3\lib\site-packages\pandas\core\format.py:2039: RuntimeWarning: invalid value encountered in greater (abs_vals > 0)).any()

ググるとgithubにQAがあったのですが、
どうやらpandasのバグのようです。
解決策は以下の2つが示されてます。
・pandasを最新版にする
 conda remove pandas
 conda install pandas
・pandasのオプションでfloatのフォーマットを変更する
 pd.set_option('display.float_format', lambda x:'%f' %x)

https://github.com/pydata/pandas/issues/9950

毎回spyder再起動やらオプション変更するのも面倒ですし、
とっとと最新版にしてしまいましょう。


  1. 2015/11/07(土) 16:16:32|
  2. Python
  3. | トラックバック:0
  4. | コメント:0

Vivaldiのマウスジェスチャーカスタマイズ

[2016/06/25追記]
本記事はVivaldi 1.1以前を対象とした、マウスジェスチャカスタマイズ方法に関する記事です。
6/2にリリースされたVivaldi 1.2以降は、UIからマウスジェスチャがカスタマイズ出来るようになりました。
以下の記事を参考にしてください。
ブラウザVivaldi、バージョンアップしてマウスジェスチャーも簡単登録(http://ascii.jp/elem/000/001/172/1172224/)


ウェブブラウザOperaの元CEOのJon Tetzchner氏が立ち上げた
新たなWebブラウザ「Vivaldi」のベータ版が公開されました。
http://www.vivaldi.com/
http://jp.techcrunch.com/2015/11/03/20151102vivaldi-in-beta/

以前プレビュー版を使ってみたのですが、まだ機能性が十分ではなく
継続利用はしていませんでした。特にマウスジェスチャがカスタマイズできず、
新OperaやChromeと同じデフォルトのジェスチャしか使用できませんでした。

ところが、ベータ版は少し面倒ですがカスタマイズが出来るとのことで、
トライしてみましたので、方法を記載しておきます。
正確な方法はVivaldi community のトピック
tutorial: how to customize your own mouse geastures?
に英語で記載があります。


編集対象はdefaultSettings-bundle.jsというファイルです。
Windowsであれば、以下のフォルダにあると思います。
C:\Users\ユーザー名\AppData\Local\Vivaldi\Application\1.0.303.52\resources\vivaldi
コピーするなどしてバックアップをとっておきます。

[2016/03/20追記]
Vivaldi (1.0.403.24 (Beta 3) )が公開されました。こちらでは、bundle.jsを編集する必要があります。
場所は、C:\Users\ユーザー名\AppData\Local\Vivaldi\Application\1.0.403.24\resources\vivaldiです。


ファイルをテキストエディタで開き、以下のキーワードを見つけます。

 COMMAND_CLOSE_TAB:(タブを閉じる)
 COMMAND_NEW_TAB:(新しいタブ)
 COMMAND_NEW_BACKGROUND_TAB:(新しいバックグラウンドのタブ)
 COMMAND_PAGE_BACK:(履歴を戻る)
 COMMAND_PAGE_FORWARD:(履歴を進む)
 COMMAND_PAGE_REFRESH:(ページの更新)
 COMMAND_TAB_REOPEN_RECENTLY_CLOSED:(閉じたタブを開きなおす)

これらキーワードのあとの{}の中にあるgestures:["6"]とかの数字を変更すると
ジェスチャがカスタマイズできます。

数字とジェスチャの対応は以下です。
 0:右
 2:下
 4:左
 6:上
右→上というジェスチャなら"06"と書けばOK。

編集してVivaldiを再起動すれば、ジェスチャが変更されています。
例として私の編集したジェスチャを以下に記載します。
[旧]
 COMMAND_NEW_TAB:{shortcut:["meta+t"],gestures:["2"],
 COMMAND_CLOSE_TAB:{shortcut:["meta+w"],gestures:["20"],
 COMMAND_NEW_BACKGROUND_TAB:{gestures:["26"],showInQC:!0}
 COMMAND_TAB_REOPEN_RECENTLY_CLOSED:{shortcut:["meta+z","shift+meta+t"],gestures:["60"],showInQC:!0},
[新]
 COMMAND_NEW_TAB:{shortcut:["meta+t"],gestures:["6"],
 COMMAND_CLOSE_TAB:{shortcut:["meta+w"],gestures:["2"],
 COMMAND_NEW_BACKGROUND_TAB:{gestures:["60"],showInQC:!0}
 COMMAND_TAB_REOPEN_RECENTLY_CLOSED:{shortcut:["meta+z","shift+meta+t"],gestures:["26"],showInQC:!0},


上に記載したキーワードはデフォルトのジェスチャですが、
他にもキーボードショートカットが割り当てられているものなら
ジェスチャを指定できます。

例えば、ブックマークバーを表示するショートカットはデフォルトで以下ですが、
COMMAND_SHOW_BOOKMARK_BAR:{shortcut:["ctrl+shift+b"],showInQC:!0}
下のように書くことで、「上左」の"64"をジェスチャに追加できます。
COMMAND_SHOW_BOOKMARK_BAR:{shortcut:["ctrl+shift+b"],gestures:["64"],showInQC:!0}

少しわかりづらいですが、この方法でかなり自由度高く
マウスジェスチャーをカスタマイズできます。

個人的には、正直この点だけでVivaldiを使う理由になるので、
もう少しわかりやすいインターフェースを用意しておいて欲しいところです。



  1. 2015/11/03(火) 23:40:00|
  2. Vivaldi
  3. | トラックバック:0
  4. | コメント:0

Pythonの基本操作

忘備録的に書いておきます。
ちょっと雑多すぎるので、今度整理します。

環境:Anaconda + Spyder (Python3.4)
import pandas as pd
from pandas import Series, DataFrame
import numpy as np

【数列をつくる】
In [52]: np.arange(3)
Out[52]: array([0, 1, 2])

In [53]: np.arange(10,100,9)
Out[55]: array([10, 19, 28, 37, 46, 55, 64, 73, 82, 91])

In [65]: [x for x in range(10,100,9)]
Out[95]: [10, 19, 28, 37, 46, 55, 64, 73, 82, 91]

In [100]: np.ones(4)
Out[100]: array([ 1., 1., 1., 1.])

In [101]: np.ones([3,4])
Out[101]:
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])

【乱数行列の生成】
In [63]: np.random.rand(3,3)*3
Out[63]:
array([[ 2.1996651 , 0.29671819, 2.15422178],
[ 0.28882665, 0.61283333, 0.38610587],
[ 2.64869479, 1.76624717, 2.03628832]])

【配列の長さ】
len()で求められる。size()に相当するものは無い様なので、
len(a[0])とかするしか無い。

In [74]: b = np.random.rand(3,5)
In [75]: len(b[0])
Out[75]: 5
In [76]: len(b)
Out[76]: 3

【平均・標準偏差・相関係数】
np.average(data)
np.std(data)
data.corr()

【重回帰分析】
予測したいデータをyに、説明変数をxに入れる。
interceptをTrueにすると切片ありで予測する。

model = pd.ols(x=xdata, y=ydata, intercept=True)
print(model) #結果表示
print(model.y_fitted) #説明変数から予測したデータ

【エクセルファイルの読み込み】
book = 'sample.xlsx'
sheet = 'sheet1'
xlsx = pd.ExcelFile(book)
data = xlsx.parse(sheet)

【csvファイルの読み込み】
filename = 'sample.csv'
data = pd.read_csv(filename, skiprows=0, encoding='SHIFT-JIS')

【csvファイルへの書き込み】
data.to_csv(filename)

●pandas.DataFrame関係
【列名を一部変更】
data.columns.values[2]='名前'

【NaNの行を削除】
nonandata = data.dropna()

【Pandas DataFrameの行インデックスと列名の取得】
index = data.index
columns = data.columns

【インデックスの振り直し】
data.reset_index(drop=True)

【インデックスの重複を排除】
In [116]: data
Out[116]:
0 1 2 3
0 1 1 1 1
1 1 1 1 1
2 1 1 1 1
0 0 0 0 0

In [119]: data[~data.index.duplicated()]
Out[119]:
0 1 2 3
0 1 1 1 1
1 1 1 1 1
2 1 1 1 1

【インデックスでソート】
In [127]: data
Out[127]:
0 1 2 3
0 1 1 1 1
2 1 1 1 1
3 1 1 1 1
1 0 0 0 0

In [128]: data.sort_index()
Out[128]:
0 1 2 3
0 1 1 1 1
1 0 0 0 0
2 1 1 1 1
3 1 1 1 1

【行列の転置】
data2 = data.T


【行・列を指定した参照】
In [105]: sample['data1'] #列名を指定
Out[105]: 50
In [106]: sample[['data1','data2']] #列名を複数指定する場合はlistを代入
Out[106]: 50
In [107]: sample.ix[1,2]
Out[107]: 50

【条件指定した参照】
data.query('data1==42')


data['column1'!=10]
data[data['data1']==42]]


【行列の連結】
pd.concat()で行います。
axis=1をつけると左右方向、付けないと上下方向です。
In [106]: base = pd.DataFrame(np.ones([3,4]) )

In [107]: right = pd.DataFrame(np.zeros([3,2]))

In [108]: bottom = pd.DataFrame(np.zeros([1,4]))

In [109]: pd.concat([base, bottom])
Out[109]:
0 1 2 3
0 1 1 1 1
1 1 1 1 1
2 1 1 1 1
0 0 0 0 0

In [110]: pd.concat([base, right], axis=1)
Out[110]:
0 1 2 3 0 1
0 1 1 1 1 0 0
1 1 1 1 1 0 0
2 1 1 1 1 0 0

【データが含まれているか調べる】
#文字列が含まれているか
data.str. contains('test')
#数字が含まれているか
1 in data.values

●時系列関係
【文字列と時刻(datetime)の相互変換】
In [132]: import datetime
In [134]: today = datetime.datetime.strptime('2015/11/02 10:11:12','%Y/%m/%d %H:%M:%S')
In [134]: today = pd.to_datetime('2015/11/02 10:11:12', format='%Y/%m/%d %H:%M:%S')
In [135]: today.strftime('%Y-%m-%d %H%M%S')
Out[135]: '2015-11-02 101112'

【時刻列の作成】
date_range()関数を用います。freqは日:D, 時間:H, 分:T, 秒:S, などが使えます。
In [182]: pd.date_range('2014-12-02 14:00:00',periods=17,freq='10S')

In [183]: Out[182]:
DatetimeIndex(['2014-12-02 14:00:00', '2014-12-02 14:00:10',
'2014-12-02 14:00:20', '2014-12-02 14:00:30',
'2014-12-02 14:00:40', '2014-12-02 14:00:50',
'2014-12-02 14:01:00', '2014-12-02 14:01:10',
'2014-12-02 14:01:20', '2014-12-02 14:01:30',
'2014-12-02 14:01:40', '2014-12-02 14:01:50',
'2014-12-02 14:02:00', '2014-12-02 14:02:10',
'2014-12-02 14:02:20', '2014-12-02 14:02:30',
'2014-12-02 14:02:40'],
dtype='datetime64[ns]', freq='10S', tz=None)


【時刻の加減算】
In [142]: today
Out[142]: datetime.datetime(2015, 11, 2, 10, 11, 12)

In [140]: delta = datetime.timedelta(days=365, seconds=22, minutes=4, hours=1, weeks=0)
In [141]: today-delta
Out[141]: datetime.datetime(2014, 11, 2, 9, 6, 50)


In [151]: today
Out[151]: datetime.datetime(2015, 11, 2, 10, 11, 12)
In [152]: today+pd.DateOffset(year=2015, month=9, day=8)
Out[152]: Timestamp('2015-09-08 10:11:12')

【リサンプル】
#データ抽出
data.resample('5s', how='mean')
data.resample('10T', how='sum')
#データ補完
data2=data.resample('1s' ,fill_method='ffill')
#時系列でない場合の補完
data.apply(pd.Series.interpolate)

【移動平均】
rolling_mean()関数で行います。windowパラメータが移動の窓サイズです。
data = pd.rolling_mean(data, window=31)

【時刻を指定したデータの抽出】
In [166]: data
Out[166]:
data1 data2
2014-12-02 14:00:00 56 5
2014-12-02 14:00:10 50 11
2014-12-02 14:00:13 47 14
2014-12-02 14:00:14 46 15
2014-12-02 14:00:18 42 19
2014-12-02 14:00:23 37 24
2014-12-02 14:00:27 33 28
2014-12-02 14:00:30 30 31
2014-12-02 14:00:36 24 37
2014-12-02 14:00:37 23 38
2014-12-02 14:00:41 19 42
2014-12-02 14:00:46 14 47
2014-12-02 14:00:49 11 50
2014-12-02 14:00:53 7 54
2014-12-02 14:00:58 2 59
2014-12-02 23:59:59 1 60
2014-12-03 14:52:29 0 100

In [167]: temp = data[data.index>=pd.to_datetime('2014-12-02 14:00:14')] #14時0分14秒以降を抽出
In [168]: newdata = temp[temp.index<=pd.to_datetime('2014-12-02 14:00:46')] #14時0分46秒以前を抽出

In [169]: newdata
Out[169]:
data1 data2
2014-12-02 14:00:14 46 15
2014-12-02 14:00:18 42 19
2014-12-02 14:00:23 37 24
2014-12-02 14:00:27 33 28
2014-12-02 14:00:30 30 31
2014-12-02 14:00:36 24 37
2014-12-02 14:00:37 23 38
2014-12-02 14:00:41 19 42
2014-12-02 14:00:46 14 47


●グラフ描画
import matplotlib.pyplot as plt

【データ描画】
plt.plot()でデータ描画する。デフォルトは折れ線グラフで、'o'などで線やマーカーの仕様を指定する。
figsizeはグラフサイズで、デフォルトは(6,4)くらい。

fig=plt.figure(figsize=(10,4))
fig.subplots_adjust(bottom=0.3) #グラフの下部を上に上げる
ax=fig.add_subplot(111) #1×1の範囲のうち1つ目にグラフ描画するの意
plt.plot(data, 'o' )
plt.grid(True)
plt.ylabel('length[m]') #縦軸の名前
plt.ylim([15,45]) #縦軸の上下限指定
plt.xtics(np.arrange(10), horizonallabel, rotation=90) #横軸の補助線位置とラベル指定。rotationでラベルを回転する
plt.yticks(np.arrange(-10,10,1)) #縦軸の補助線の位置とラベル指定
plt.show()

エラーバーグラフはplt.errorbar()
plt.errorbar(horizonalaxis, average, yerr=standard, fmt='o')

凡例はlegend()でつける。locを指定することで位置を変更できる。
plt.legend(loc='upper right')
もしどうしても凡例が邪魔な場合、以下のようにして凡例を図の外に追いやることも出来る。
plt.legend(bbox_to_anchor=(1.3,1))
#凡例の消し方がわからん。
 誰かおしえてください。

デフォルトのフォントだとグラフの文字に日本語が使えないので
IPAexフォントを落としてきてインストールし以下を実行する。
import matplotlib as mpl
mpl.rcParams['font.family']='IPAexGothic'


【グラフ保存】
savefig()関数で保存する。拡張子によって保存形式を判定。
texとかで埋め込む時に使用するepsでも保存可能。
ベクターデータであるemfも保存できるが、
Microsoft Officeで読み込むと文字が消えたりする。
pngでdpiを上げて保存し後で解像度落とすのが使い勝手が良い。

plt.savefig('sample.png', dpi=300)


●フォルダやファイル操作
import shutil
import os

【フォルダの中身の一覧表示】
folder = '\\test\\'
files = os.listdir(folder)

【ファイル・フォルダの削除】
os.remove(folder+files[0])

【ファイルコピー】
folder2 = '\\test2\\'
shutil.copyfile(folder+files[1], folder2+files[1])

【拡張子】
splitextで拡張子とそれ以外を分ける。
In [201]: os.path.splitext(filename)[1]
Out[201]: '.csv'
  1. 2015/11/03(火) 02:05:34|
  2. Python
  3. | トラックバック:0
  4. | コメント:0

Python開発環境(Anaconda3+spyder)の操作の小技

忘備録的に書いておきます。
環境:Anaconda2.3.0 + Spyder2.3.5.2 (Python 3.4.3)

【インストール】
https://www.continuum.io/downloads
からインストーラをダウンロードしてインストール。
スタート→すべてのプログラム→anaconda→spyderで起動

【タブ補完】
IPythonウインドウで途中まで書いてタブを押すと保管してくれる。
モジュールの場合ドット'.'まで打ってからタブを押すとメソッドも表示可。

【オブジェクトの情報】
変数やオブジェクトの後に'?'をつけると
その情報を見れる。関数でも可。
関数の場合'??'で関数の中身も見れる。

【部分実行】
エディタでF9を押すと、いまカーソルがある行だけ実行する。
テキスト選択すると選択部分だけ実行。
F5を押すとその.pyファイルを保存して実行してくれる。

【変数のクリア】
Variable explorerに、今まで定義した変数が一覧表示される。
%resetと入力すると
Once deleted, variables cannot be recovered. Proceed (y/[n])? y
と聞かれて、yを押すと変数がクリアされる。

【時刻計測】
%timeit コマンド
と入力すると、コマンドの実行時間を測定できる。
pyファイルの実行時間なら、
%timeit runfile('temp.py')
と入力すれば良い。

【コマンド履歴の保存】
%logstartと入力すると、
ipython_log.pyに今までの入力コマンド履歴が保存・記録されるようになる。



  1. 2015/11/03(火) 01:17:18|
  2. Python
  3. | トラックバック:0
  4. | コメント:0

ソースコードをブログに埋め込む

今まで、ブログにソースを書くときは、
体裁だけ整えてそのまま貼っていたのですが、
GitHubのGistというサービスを使うと、
ブログパーツとして埋め込めるそうです。

真ん中の大きいウインドウにソースを貼って、
その上にソースのファイル名を書きます。
右上でインデント種類を選んで「Create public gist」を選択すると、
コードが保存されます。

その後、右側のEmbed URLをコピーしてブログのhtmlに貼り付けると

こんな感じでコードが埋め込まれます。便利。

でもこれいつまで保存してくれてるんだろうってふと思ってしまいました。
サービス終了した瞬間に見れなくなりますよね。
でもよく考えればFC2ブログがサービス終了しても一緒かw
まあ潰れることが無い様祈りましょう。
  1. 2015/11/02(月) 22:51:00|
  2. ブログパーツ
  3. | トラックバック:0
  4. | コメント:0