マルチスレッド
いつもながらPythonのことを。
limitlessled用のプログラムをPythonで組んだ(ここらへんのくだり)のですが、微妙に使いづらくあまり使っていません。というのもタイマーで何分後にオフみたいな設定をtime.sleep()で実装しているので、実際sleepしている間他の操作を受け付けなくなるんですよね。自分だけしか使わないのでそれでもいいのですが、できれば他の操作を受け付けるとかキャンセルボタンでタイマーをキャンセルするとかできると便利だな−と思ってました。
マルチスレッド機能が使えれば待ち時間も他の操作を受け付けることができるなと思い出して色々調べていたのですが、なかなか理解できません……
プログラム自体はPyQtを使っているのでQThreadを使おうかと思ってみても、日本語のチュートリアルが少ない…… そもそもPythonを始めたきっかけのマイナビニュースのサイトを見るとthreadingライブラリを使っているので、こっちを使ってみるべきなんですかね。
イマイチPyQtにもなれていないので、更に新しいことをやろうとするとつまづきが多くて戸惑ってしまいますね。
久しぶりに書いた割になんの進歩もしていないのですが、こんな感じですかね。
あと全然関係ないですが、raspberry pi 3を買おうと思ってます。一応Airでもfedoraが使えるようにはしてあるんですが、Linux専用機があったほうがLinuxは使うなと思いまして。しかも電子工作みたいなこともできるらしく、ちょっとしたロボットとか作ってみたいなーと思ってます。そこまで行くのにどんだけ勉強せなならんのかという感じですが。official starter kitがほしいんですよね−。薄型の有線キーボードなかなか売ってないので…あと統一感があっていいなと思います。rs onlineで買おうと思ったら個人相手にやってないそうなので、海外でもcana kitの方で買いますかね。
ではではこのへんで。
いつもながら適当なことをつらつらと
新年明けたのに何も書かないのもなあと思ったので書いてみます。
プログラミングの継承について
去年の暮れにあるプログラムを3つほどPythonで書いてたんですが、3つとも初っ端の書き出しの部分が同じ処理をしているんですよね。まあ、コピペすればいいだけの話なんですが、見栄えがよろしくないというのと保守性が悪い(だれかにソースコードを見てもらう必要がないので、これに関しては気にしてはないのですが)ということからどうにかならんかなと思ってました。そこで継承したらいいんじゃね?と思いつきまして、実際書いてみたら、まープログラムの見通しがよくなりましたね。今まで、継承って何のためにあんのかな―とか、GUIプログラミングしないなら使わんかとか思ってましたが、使ってみるといいもんですね。必要性を感じていなければ理解できない、と昔から自分は思っているんですが、まさにその通りだなと思いました。これからも継承使っていきたいですね。そこまで同じ処理をさせるプログラムを組むことがあるかどうかは疑問ですが。
C/C++のコンパイルについて
今までCの文法とかはそこそこ学んできていたんですが、コンパイルとかは最低限のことしかしてきませんでした。まあ、コンパイルできればいいかみたいなことですね。ただ、Cのソースコードを実行するにもいくつか方法があるようです。
以下に書くのはあくまで自分の理解です。はっきり言ってあまり調べこんだ内容ではないので正確ではないと思います。
ただのコンパイル
一番主流というか、簡単というか、これがそのままコンパイルって感じですかね。ソースコードをオブジェクトファイルにします、的な。ファイルが分割されているとそれぞれコンパイルされた後、ファイル同士を結合するリンクという作業が行われるようです。ビルド
IDEを使ってコンパイルすること。IDEの中ではプロジェクトという単位でプログラムを管理しているようで、プロジェクトの中に幾つもの分割されたファイルがあるというイメージですね。ビルドはそのすべてのファイルのコンパイルとリンクを行うことをいうようです。ただのコンパイルとの違いは、ただのコンパイルは各ファイルを手動でコンパイルして、リンクして、としなければなりませんが、ビルドはIDEが全部やってくれるので、簡単です。RUNボタン押すだけで、全てやってくれるという感じでしょうか。メイク
調べてみるとどうも廃れつつある技術のようですが、概要としてはコンパイラにmakefileというレシピみたいなものを渡して、自動的にコンパイルとリンクをしてもらうという感じですかね。ただのコンパイルとの違いは、ただのコンパイルは分割ファイルをそれぞれコンパイルして、最後にリンクしなければならないのですが、メイクはmakefile内の指定したファイルをすべて勝手にコンパイル・リンクしてくれるというイメージです。まあ、ビルドと似たようなもんなのかな、と思います。ビルドと似たようなものだし、makefileを書く必要があるので、メイクの方が手間のかかる印象を受けます。IDEが登場して、しかもパソコンの性能もUPしているので、あまりメイク自体は使われなくなりつつあるのかと勝手に推理してます。
まあ、だいたい3種類くらいあるようですね。と言ってもビルドもメイクもコンパイルを内包しているんですが。ソースコードをコンパイルして、リンクする、という流れはすべて同じかと思われます。それをすべて手動でやるのか、ちょっと楽するのか、だいぶ楽するのかの違いなのかなあと素人考えでは思ってます。
あと試してみたのですが、gccのコンパイルはいくつかの.cファイルを一気にコンパイルすると勝手にリンクまでやってくれるようで、
gcc -o foo ./*.c
とやってやると、カレントディレクトリ内のすべての.cファイルをコンパイル・リンクしてfooという実行ファイルを作ってくれます。(たぶん)これができるならメイクいらなくね?とは思うのですが、素人にはわからない違いがあるんでしょうか。
あとわりと最近知ったのですが、上の例でいうとfooという実行ファイルをダブルクリックすると起動してくれるんですね。初めて知りました。ターミナルから起動しなくていいから便利です。
ってな感じで、新年早々長々と文章を書いてみました。久しぶりすぎて文章かけないですね。ってか久しぶりじゃなくても文章って書けなくなってますね。本読まないとだめですね。ってな感じで、またいずれ。
mac mini late 2012 メモリ増設
mac mini late 2012を2年前ぐらいにヤフオクで落札してそれ以降メディアサーバー的に使っているのですが、落札当初にSSD換装をしてからと言うもの全く内部を開けていじるようなことはしてきませんでした。まあ、端的にいうとメモリの増設をしていなかったというだけの話なんですが。
実際4GBしかなくともわりと快適に動いてきてくれましたし、意外とメモリって安くならんなとか思っていたら完璧に増設することを忘れてました。2日前くらいになんとなく思い立ってアマゾンを見てみると8GBの2枚セットのメモリが1万を切っていたので、メモリ増設するか―と思い立ちまして、今日換装しました。
で、写真付きで作業を解説しようかと思ったのですが、めんどくさいのでやめました。
実際増設した後の感想をば
まあ、元からSSD換装はしていたからなのか、そんなに体感できるほど速度が速くなったとは思えないです。ただ、iTunesの終了は気持ち速くなった気がしますね。とくにメモリを消費するような作業をするためにPCでもないので、こんなもんかなとは思います。実際アクティビティモニタでメモリの消費量を見たところ、2GBしか使ってないようだったので16GBもいらんかったなと思いました。増設後にエラーもなく起動できたのはわりとありがたかったですね。速度に関してはこれから使っていくうちに実感できるのかもしれないですね。
参考と購入したメモリ:
購入したのは以下の低電圧ではなく、標準を購入しました。
プログラミングのことを書くよりぜんぜん筆が進まないのは、なんでなんでしょうね。たまにはガジェット的なことも書きますよということで。
それでは
はてな記法からマークダウンへ
マークダウンに慣れたいと思ったので、はてブをマークダウン形式で書くことにしました。
とはいえそこまでマークダウンが書けるようになっているわけ
- でも
- ない
- ので
調べながら
練習
していきたいと思います。
といいつつさらっと なんかはかじったりもしてるので、数式書くのは
楽になる
かもです。
よみにくくて申し訳ないです。遊んでみました。 それではまたいずれ
scipyでピーク検出
タイトルの通りですが、新しい関数とその使い方について書きます。
やることはscipyでのピーク検出です。単純にピークと呼んでいますが、離散的なデータから極大極小を見つける関数のようです。
関数は以下のようにインポートします。
from scipy.signal import argrelmax x = np.array([2, 1, 2, 3, 2, 0, 1, 0]) print(argrelmax(x)) >>> (array([3, 6]), )
基本的に必要な引数はデータだけなので、適当なnp.arrayを与えてやると、ピーク位置のインデックスを返してきます。
という使い方は以下にかいてありました。
参考:
org-technology.com
ここからは使ってみての考察なのですが、scipyのドキュメントを読むと、任意のパラメーターが幾つかあります。
scipy.signal.argrelmax — SciPy v0.17.0 Reference Guide
このうちorderのところを指定してやると、どの幅でピークを見つけるかということを指定できるのだと思います。
このようなグラフ(先日取ったラマン分光のデータです)があったとき、デフォルト設定だとピークは
以上のように検出されます。大量ですね。
しかし、求めているピーク自体は1460あたりのシャープなピークです。
これはorderがデフォルト設定(order = 1)だと、x軸の狭い幅の増減を検出してしまうためいろんなピークを検出しているのだと思います。
つまり
np.array([0, 1, 2, 1, 5, 1, 3, 2, 1])
という配列の場合order = 1 だとindex = 2, 4, 6が検出されますが、order = 3とするとindex = 4のみが検出されます。
先のグラフの例でいうと、order = 100とすると以下のようなグラフになりました。
これで一応やりたいことがpythonでできるようになりました。