don-bra.co

さいきんはphpとたわむれてます

bluetooth deviceアドレスをMac OS Xで調べる方法

方法

りんごマーク > このMacについて

システムレポート

ハードウェア > Bluetooth のアドレスにあります。

ちなみにペアリング済みのデバイスのBDアドレスもここから見れました。

きっかけ

湿気もすごいので、bluetoothを制御するプログラムを書きたいなーと思いました。
bluetooth deviceアドレス (BDアドレス)が必要な事がわかったので、Macでの確認方法を検索してみても全然ヒットしませんでした。。。

なぜだろうと思うと、MACアドレスのせいなんですね。
Wi-FiMACアドレスの確認方法を説明している記事ばかりでした。
ちがうよ!!Mac違いだよ!

wifiMACアドレスはシステム環境設定のネットワークから見れます。

同じところにbluetoothのタブもありますが、bluetoothではBDアドレス(=bluetoothMACアドレスに相当)は表示されていません。
ここにあったらわかりやすいのになあ・・・
Mac OS XでBDアドレスを確認したい人がすぐにこの記事を見つけられますように!

形態素解析のOSXアプリ shirakabaをつくりました

つくったもの

mac向け形態素解析アプリを作りました。名前はshirakabaです。

f:id:asayamakk:20160523155011p:plain

[shirakabaのダウンロード]
https://www.dropbox.com/s/1sah7lsedoen9kt/shirakaba.app.zip?dl=0

ソースはこちらです。
https://github.com/asayamakk/shirakaba

AppleのDeveloper IDを取得していないため、初回起動時は設定によっては起動できない旨が表示されます。

もとになったもの

jsの形態素解析ライブラリといえばkuromoji.jsがとても有名かと思います。
今回はkuromoji.jsのデモをmacアプリに移植してみました。

[ブラウザで自然言語処理 - JavaScript形態素解析器kuromoji.jsを作った]
http://stp-the-wld.blogspot.jp/2015/01/javascriptkuromojijs.html

kuromoji.jsがあれば本当に簡単に言語処理に入門できます。

ちなみにkuromoji(黒文字)とは和菓子を切ったりする道具という意味もあるらしいです。
[kuromoji公式サイト]
https://www.atilika.com/ja/products/kuromoji.html

Kuromojiはどういう意味ですか?
いい質問ですね!文字通りだと「黒い」と「文字」ということになりますが、実は別の意味もあります。
「黒文字」というものは茶道でよく見られますが、和菓子をお盆から懐紙へ移動したり、食べやすい大きさに切ったりするための道具です。
– 基本的に入力処理のツールということです。;)

とってもおしゃれだなあと思ったので、黒文字(楊枝)よりも切ったり持ったりしやすいお箸のイメージでshirakabaにしました。白樺はメジャーな割り箸(元禄橋)の素材です。

使い方と機能説明

使い方はとてもシンプルです。
解析したいテキストをテキストエリアに入力すると、解析結果が下のテーブルに表示されます。
解析結果をダウンロードしたい場合は [Export as CSV] からダウンロードできます。

TODO: やり残したこと

今後追加したい機能としては

  • tsv/csv形式の選択
  • 解析結果の表示項目の切り替え
  • 辞書追加(難しそう・・)

をゆっくりできればなあと思っています。

機能面以外では

  • windowsの対応・配布
  • アプリアイコンの作成
  • READMEの追加

もやってしまいたいです。というかREADMEは必須ですね。。

あとはインストールから配布までの記事を余裕があれば書こうと思います。
v1.1.0のメニューのハマりポイントだけ、Qiitaに書いてみました。
[Electron v1.1.0でMenuの実装をするお話]
http://qiita.com/asayamak/items/00194a9d4ac2a8a5f8cb

おわりに

そもそも何故こんなものを作ったのかというお話です。

以前に非プログラマの研究のお手伝いで、ある語句の出てくる回数をカウントしたいという依頼を受けました。
そのときはまだWeb茶まめ もありませんでした。 (論文公開が2015年なので恐らく)

結果をExcelでいじいじしたいとのことだったので、csvで出せるやつがいいなーと思って探すと
winchaが見つかったのですが、手持ちのwin8では動作せず、mac版もないため結局ruby + nattoでcsvを吐き出して渡していました。

お手軽にcsvなどの形式でダウンロードできるアプリがあったら便利だろうなーと思って早一年。 Electronに触れたときにぴったりだと思い制作しました。
(あとで調べたらweb茶まめを発見して(˚ ˃̣̣̥ω˂̣̣̥ )ってなりましたがw)

プログラミングできる人もできない人も楽しく自然言語処理・分析が出来るようになればとっても幸いです。

JSON.parse()したときにSyntaxErrorが出るときの対処法

javascriptでモヤモヤしたお話です。

JSON.parse()でSyntaxError

とあるweb APIの戻り値がjsonだったので、これを取得しようとしていました。エンドポイントにGETリクエストしてJSON.parse()するとなぜかエラー。
何度parseしてもSyntaxError: Unexpected end of inputが出続けます。

色々と試行錯誤していると、どうやらjavascriptJSON.parse()はかなり厳密な文字列でないと受け付けてくれないようです。

はまりがちなparse不可の文字列

今回parseに失敗していた原因は\バックスラッシュでした。
バックスラッシュや特殊な文字列(ダブルクォートなど)をparseしたいときは\\\"のようにエスケープする必要があります。

あと文字列のクォートが''シングルクォートでもエラー SyntaxError: JSON Parse error: Single quotes (') are not allowed in JSON が発生します。なんてナイーブな子なんだろう。。

var str = "{'id': 123}"
JSON.parse(str) // Exception: SyntaxError: JSON Parse error: Single quotes (') are not allowed in JSON

jsさんがお怒りです。

evalでも落とし穴

受け取り側でごにょごにょするのも、大層なアプリではないのでevalを使おうと思ったところ、evalでもエラーに。。 evalでJSONをparseしたいときはparseする文字列を()でくくるのが定番らしいです。

var str = '{"id": 123}'
var json = eval("(" + str + ")")

ただ、今回はこれでもダメでした。。
返ってきたエラーはSyntaxError: Unexpected token ILLEGALでした。 むむむと思ってまず調べてみると、parseできない改行コードが含まれていることが原因でした。

php-tips.com

これは事前にreplaceするのがいいようです。

data.replace(/\u2028|\u2029/g, '');

jsでJSONのパースをする際はハマりやすいのでご注意ください。

参考サイト

JSON | JavaScript プログラミング解説

d.hatena.ne.jp

arshavin0909.hateblo.jp

qiita.com

はてなブログでソースコードの背景色をCSSで変更する方法&サンプル

技術っぽいブログを書いていますが、何かが足りない・・・どこか素人っぽい・・・
そうだ!ソースコードの背景が白いからだ!!

はてなブログの便利なところはいっぱいあるのですが、
デフォルトでソースコードをハイライトしてくれるところは特にナイスですね。
こだわりがなければ最初のデザインもかわいいですし。

記法も3種類ありますが、エンジニアならMarkdown!と思ってMarkdown記法で書いています。
ソースコードを貼り付けたいときは

``` go

package main
import "fmt"

fmt.Println("go言語だよ")

```

と書けば

package main  
import "fmt"  

fmt.Println("go言語だよ")

シンタックスハイライトが有効になります。快適!

ただコードの背景が黒い方が玄人っぽくてかっこいい目に優しく見やすいので、変更してみました。
ググったら大体方法が出てくるのも、はてブの便利なところ。

orangain.hatenablog.com

こちらの記事を参考にCSSを追加しました。

スマホから見るとなぜか元のCSSのままですが、スマホからがっつりコードを見ることもないかなあと思い諦めました。

元の記事だとrubyでの文字列の""結構派手な赤になってしまい変に目立つので緑に変更しました。

puts "Hello World!"

ということでPCからだと少し見やすくなったかもしれません!
目指せ強いプログラマ

sshでログアウトしたあともコマンドを実行し続けたいときのnohupとscreen

長時間かかるコマンドを打ち逃げしたい(sshログイン時)

raspberry piやlinuxサーバなどにsshログインしているときに、この作業時間かかるんだよなーっていうコマンドを打つことありますよね。
丁度いま僕はラズパイにrubyをインストールしようとしていました。結構コンパイルに時間がかかるようで、たぶん1時間くらいかかります。 CPUがあんまり強くないですからね。。

nohup <command> & との出会い

とりあえずインストールだけバックグラウンドで走らせておいて、ホストPC(mac)はログアウトして別のことしたいなあと思っていました。 調べてみると nohup <command> & を使えばうまくいくとのことでした。

試してみたところなぜかログアウトするとプロセスが終了しているようでした。どうしたものか。

困ったときのstack overflowと思い、初めて質問してみました。

stackoverflow.com

するとscreenコマンドつかったらいいよ、とのお声をいただきました。

screenコマンド便利!

screenの使い方についてはこちらの記事がとてもまとまっていました。 まとまりすぎて、僕からは何も付け足せることがないレベルです。。

qiita.com

ほぼ引用になってしまいますが、自分用にも使い方などまとめます。

screenは仮想端末を起動して、その仮想端末上で処理を実行できるコマンドです。 何が便利かというと、ネットワークが不安定な環境だったり、僕のようにLinuxサーバにコマンド打ち逃げしたいときにとっても役立ってくれます。
仮想端末なのでsshからログアウトする or ネットワークが切断されても、アタッチ(=screenで作った仮想端末に接続すること)すれば作業を続行することができます。

screenのインストール

ラズパイには screen がインストールされていないため、 apt-get でインストールする必要があります。

といっても sudo apt-get install screen するだけです。

macだとデフォルトでインストールされているみたいですね。

screenの用語・コマンド・使い方

  • セッション:
    • 仮想端末。screenを打つたびに増える
  • ウインドウ:
    • セッション内での仮想的なウインドウ。1つのセッションに複数作ることができる。
  • アタッチ/デタッチ:
    • セッションに接続/切断すること。切断してもセッションは生きています。

screenコマンドの要点 - Qiita の記事よりほぼ引用です。

はじめに覚えるコマンドはそんなに多くありません!

screen            # => 新しいセッションを作成
screen -ls        # => セッション一覧を表示
screen -r <pid>   # => pidを指定してアタッチ
screen -r         # => 空きセッションが1つならこれでもOK

くらいで大丈夫です。とっても簡単ですね!

セッション・ウインドウの操作は ctrl + aを押してからいくつかのキーで操作できます。

ctrl + a => d    # セッションからデタッチ

ctrl + a => c    # ウインドウの新規作成
ctrl + a => k    # ウインドウを閉じる(ウインドウが一つのときはセッションを削除)
ctrl + a => p, n # ウインドウの移動(前と次へ)

ctrl + a のあとのキーはctrlを押したままでも操作できます。 ctrl + a => ctrl + dでデタッチのような感じです。

もっと詳しくscreenの操作を知りたい方は

qiita.com

の記事を見ることをオススメします!!

nohupについて

nohupで実行したコマンドがラズパイでは死んでしまう理由がわかっていないのがモヤモヤですね。 これに関しては別途調べてみたいと思いますー

今日はscreenっていう便利コマンドを手に入れた感動を書き残しておきました。

Homebrewでインストールしたmysqlがmysql: command not foundのときの解決策

goでmysqlを使おうとしていて別のところでハマりました。
mysqlを起動してテーブルを確認しようとするとcommand not foundに。。

以下に解決策を示しておきます。

/usr/local/share/man/man8の権限書き換え

結論からいうと

sudo chown -R <username> /usr/local
brew link mysql

で直りました。

環境は下記です。

解決までの道のり

mysqlをインストールしているはずなのに、mysqlをターミナルで打つと
mysql: command not found
が表示されて、困っていました。

brew listしてみてもしっかりmysqlは含まれています。
とりあえずbrew updateしてみたり、mysqlの再インストールしてみたけれども全く効果がありませんでした。

こんなときは便利コマンドのbrew doctorを打ってみるとそれらしき情報が

Warning: Some directories in /usr/local/share/man aren't writable.
This can happen if you "sudo make install" software that isn't managed
by Homebrew. If a brew tries to add locale information to one of these
directories, then the install will fail during the link step.

You should probably `sudo chown -R $(whoami)` them:
    /usr/local/share/man/man8

Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
    mysql

しっかりwarning出ていますね。ということで /usr/local の権限を書き換えることに。

ここで一番上のコマンドを打ちました。

sudo chown -R <username> /usr/local/share
brew link mysql

あと記事を書くときにterminalのログを見直してみると
mysqlの再インストール時にがっつりErrorが出ていました。。
ちゃんとメッセージは読みましょうということです。。

brew doctor さんがしっかりしていて助かりました。

Go言語でメソッド定義 & Go Tour のExercise (Stringers)

構造体型にメソッドを定義する方法

type Vertex struct {
    X, Y float64
}

func (v Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
    v := Vertex{3, 4}
    fmt.Println(v.Abs())
}

funcのうしろにレシーバと型を宣言します。レシーバはメソッドを呼ぶときの、呼ばれたメソッドのオブジェクトです。(めっちゃわかりにくいですね)
上のサンプルだと v.Abs()したときのvがレシーバです。

class Human
  def initialize(name)
    @name = name
  end

  def say_name
    puts "I am " + self.name
  end
end

h = Human.new("tanaka")
h.say_name  // "I am tanaka"

rubyですが、この例だとsay_nameしたときのオブジェクト(= h)がレシーバです。

rubyでは上のように def ~ endメソッドが定義できるのですが、goではどこでもいいから

type Human struct {
  name string
}

func (h Human) say_name() {
  fmt.Println("I am", h.name)
}

func main() {
    s := Human{ name: "suzuki" }
    s.say_name()
}

のように書くとHumanにsay_nameメソッドが追加できます。

ということで、毎度のGo TourのExcersiseをやってみました。

A Tour of Go

IPAddr 型を実装してみましょう IPアドレスをドットで4つに区切った( dotted quad )表現で出力するため、 fmt.Stringer インタフェースを実装してください。
例えば、 IPAddr{1, 2, 3, 4} は、 "1.2.3.4" として出力するようにします。

package main

import "fmt"

type IPAddr [4]byte

func (addr IPAddr) String() string {
  var str string
  for i := 0; i < len(addr); i++ {
    str += ( fmt.Sprint(addr[i]) + "." )
  }
  return string(str[:len(str) - 1])
}

func main() {
  addrs := map[string]IPAddr{
    "loopback":  {127, 0, 0, 1},
    "googleDNS": {8, 8, 8, 8},
  }
  for n, a := range addrs {
    fmt.Printf("%v: %v\n", n, a)
  }
}

rangeを使えばlen(addr)しなくてもいけるみたいなので、rangeの方もかいてみました。

for _, v := range addr {
  str += ( fmt.Sprint(v) + "." )
}

こちらの方が少しだけすっきりかけますね。
_で捨ててるのもgoっぽい?

最後の文字を取り除くためには、今回は全角文字が含まれないのでそのまま

str[:len(str) - 1]

で大丈夫です。

文字列のスライスはマルチバイト文字列だとruneっていうのを使わないといけないようです。  

str := "モーニング娘。"

をスライスしていときはruneを使います。 こちらの記事と逆引きgolangを参考にしました!

qiita.com

逆引きGolang (文字列)

package main

import "fmt"

func main() {
  str := "モーニング娘。"
  strRune := []rune(str)
  fmt.Println(string(strRune[:len(strRune) - 1]))  // "モーニング娘"
}

そろそろgo tourも終わりそうです!!