忍者ブログ
RoboCup Junior Japan Rescue Kanto OB

             2005~2013
[1]  [2]  [3]  [4]  [5]  [6
RadiumProduction へようこそ!

このブログは巷で老害 of 老害認定されてしまったロボカップJrに関わって11++年目となる老害のブログです。

”世界中の人々の中の2人か3人くらいに有益な記事”を目標に記事投稿を行っているブログです。

故に内容に特に意味はありません。若干プログラミングやロボット関係に偏ってますが当方にわかです。


ブログでは、たまに過去の負の遺産についても紹介しています。これらは黒歴史が含まれている可能性があるのでお気を付けください。


最近大正義メイリオに屈服したので、ブログの方も本文の書体をメイリオに変更しました。


あと、このブログは普通に読むと、どうも「酔う」らしいので読むときは酔い止め推奨です。


また、DropBoxを始めてみたいという方は此方のリンクから行っていただくと、500MBサービスされるらしいです。

(^・ω・)ノ RadiumProduction at curonet


昨年に引き続き、今年もMaker Faire Tokyo 2017 行ってきました。

英語っぽいですけど仏語だそうです。
英語だと"メーカーの自由"とかいう権利主張みたいな単語になりますね(´・ω・`)

因みにFaireは仏語で作るって意味らしいんですが、他動詞なんで”メーカーは東京を作る”って意味になるようです(´・ω・`)どっちにしろ意味不明


諸般の事情で殆ど写真が撮れなかったので個々の紹介は割愛しますが、

今回も面白い展示が多々会って非常に魅力的な1日となりました。

また、去年ほど展示側に知り合いが多くなかったのでそういう意味で非常に新鮮でした。


といっても何も内容がないのブログだと最近は閲覧者にブチ切れられる傾向にあるみたいなので、

今日一番衝撃的だったブースについての紹介をします。

といってもこれ、展示側のブースじゃなくてスポンサー側のブースになります。

それがこちら。


タミヤから来週発売される新しい工作キットです。

コンピューターを使わないプログラミング・・・といういかにもありがちなアレです。

ありがちなアレなので最初スルーしていたのですがよく読んでみると、

プログラミングのアプローチがとんでもなかったんです。


それがこちら。


これって・・・・俗に言うパンチカードでは・・・?

一周回って新しすぎやしません?

機械的にカムを読んでそれを直接下のギアボックスのステアリングに反映させるんだとか。


しかも驚くことにこの機体・カムの読み取り部分、ちょっと広すぎるように見えますが、

なんとここ、らずぱいやArduinoを格納するための場所らしく、

この辺の基板がすっぽり収まるように出来ています。
写真見る限り治具もしっかりあるみたい。


しかも上に空間があるのでドライバ等の外部回路も入れられたりできるので拡張性もよし。
カムプログラミングという最大構成要素を失いますが。。。


子供がこれ買って、後で本物のプログラミングやりたいってなった時に非常に便利なのではないでしょうか。


タミヤのキットって個人的に当たりハズレが激しいイメージが有るんですけど、

今回のこれはもうパケ買い待ったなしの大当たり案件になるのではないでしょうか・・・

実際MFTの場で先行販売されたのですが、即完売とのことで、相当な人気だったそうです。



という、久しぶりの当たりキットの予感です(´・ω・`)
ぺーじ→http://www.tamiya.com/japan/products/70227/index.htm

という訳で今日の記事はこのへんで。最後にメンテナンス中の足なしタチコマちゃんをパシャリ


(^・ω・)ノ curonet at RadiumProduction
OB引退したので何も知らされてなかったのですが、今年のRCJ世界大会は名古屋で開催されたそうですね。

産技のチームは出てたのかな。そこら辺も詳しくは知りませんが、

参加された方、スタッフに参加された方、ひとまずお疲れ様です。



唯一こちらでいただいている情報としては、

サッカーの方で長岡高専のINPUTが個人、スーパーチームともに優勝されたということで、おめでとうございます。
これはもうりゅなさんの奢りでみんなで焼肉ですね(´・ω・`)

昨年も長岡サッカーは世界大会で優勝しており、もう世界大会優勝常連校といったところでしょうかね。
これはもうりゅなさんの奢りでみんなで焼肉ですね(´・ω・`)


産技は最近新しくできたブリッジリーグに出場しているとのことですが、どうなったんだろう。
これはもうりゅなさんの奢りでみんなで焼肉ですね(´・ω・`)

怪しげな人が怪しげなツイートをしているのは確認しましたけど。
これはもうりゅなさんの奢りでみんなで焼肉ですね(´・ω・`)


またスタッフ参加やら遊びに行った関係者も数多くいたようで、ちょっとした同窓会みたいになっていたとか
これはもうりゅなさんの奢りでみんなで焼肉ですね(´・ω・`)


お金と時間に余裕があれば言って見たかったですけど、今回は見送り。
これはもうりゅなさんの奢りでみんなで焼肉ですね(´・ω・`)

日本での世界大会は大阪以来でしたが、ちゃんと無事終われたようで何よりです。
これはもうりゅなさんの奢りでみんなで焼肉ですね(´・ω・`)




最後になりましたが世界大会に参加された各位、本当にお疲れ様です。
これはもうりゅなさんの奢りでみんなで焼肉ですね(´・ω・`)


後、世界大会に行ったからと言ってレポートの期限が伸びたりテストの点数が増えたりはしないので
これはもうりゅなさんの奢りでみんなで焼肉ですね(´・ω・`)


皆さん日常生活には十分注意するようにしてください。また、就職に有利にもなりません。
これはもうりゅなさんの奢りでみんなで焼肉ですね(´・ω・`)


では今日はこの辺で。世界大会に就活を殺された先輩を見て育った人からの忠告でした。(遅
これはもうりゅなさんの奢りでみんなで焼肉ですね(´・ω・`)


(^・ω・)ノ curonet at RadiumProduction
本来ならPythonそのものの入門記事を予定していたのですが、

最近利用したライブラリがかな~り難解だったので、

再度使うときに忘れないようにするための備忘録を作っておくことにしました。



今回はJuliusというライブラリについてです。

これはいわゆる音声認識ライブラリでして、

某大学と某大学が研究で開発した基本無償提供のオープンソースライブラリです。

公式ページ

特徴としては、
・オースンソースであること
・マルチプラットフォームであること
・単語辞書を用いたシステムであること
・日本語のライブラリであること(英語版はあるけど公式は有償)改変した無償版を配布している方はおられました。
・認識におけるパラメータ調整が行えること(長くなるのでここではスルー
・なんかAPIがあるっぽい(試してないデス。

という具合。単語辞書ありきのシステムなので単語辞書を作らないと動いてくれません。

ネットの前評判では認識制度は上々、商用制限もないので使えると超便利という評価でした。



ただ、大学なので当然ですが、割とアカデミックな要素が強く、ぶっちゃけ使うだけでもとても難しいです。


正直ブログを調べてみると、使えた!という記事よりも使えなかった!という記事の方が目立つ程度には難しいです。

そのためネットでは情報が錯綜しています。

バージョンによっても挙動が違うとか違わないとかいう噂があるのでご注意を

また、Read meや、こちらから編集するファイルの文字コードが悉くshift-JISとなっているらしく、

Linuxユーザーの方がブチギレていました(笑)僕含め



とまぁ、前置きはこのぐらいにして本編をば。

今回は文法の解析をしてほしかったのでgrramar-kitを利用します。

まずは記事掲載時の最新版grammar-kit-4.3.1をDL、解凍します。.

起動についてはまぁ色々方法はありますが、とりあえず今回はbin/win32まで降りてみます。

cmdで
julius -C ../../testmic.jconf
と打つと起動します。エディタで開いてjconfはパス遡ればわかりますがただのconfigです。

ここで辞書ファイルの方を指定しています。初期状態ではfruitを参照しているのがわかると思います。

当該のフォルダを開いてみるとfruit.dfa fruit.term fruit.dict の3つのファイルがあると思います。

これがいわゆる辞書になります。ここに登録されている単語、文法で認識を行っています。


今micで起動していますので、マイク入力が使えるはずです。

"(りんご|蜜柑|ぶどう)([0-9]+個)? を? 下さい"  とマイクに向かってしゃべると

### Recognition: 2nd pass (RL heuristic best-first) STAT: 
00 _default: 20 generated, 20 pushed, 7 nodes popped in 190 
sentence1: <s> ぶどう を ください </s> 
wseq1: 7 0 3 4 8 
phseq1: silB | b u d o u | o | k u d a s a i | silE 
cmscore1: 1.000 0.362 0.999 0.654 1.000 
score1: -6065.491699
と、このような感じで認識してくれます。正規表現は果たしてこれであっているのか・・・?

と、まぁ動かすだけならここまでです。Win環境下だとここまでは順調でした。





ところが問題がここから。

このJuliusは辞書にある単語しか認識しないので辞書を自分で作らないと単語認識してくれません。

五十音全てを持つ辞書は標準で用意されていますが、それを使うと認識率は当然落ちるので、

ちゃんとした認識を行うのであれば、自分で辞書を生成できるようにしないといけません。


ですが、Juliusはこの辞書ファイルの生成が大変厄介です。

このあたりの内容はJuliusbook含め、公式情報だけだと解決が不可能になるので

Google先生のお力を借りることになりました。


まず辞書ファイルはfruit.dfa fruit.term fruit.dict の3つのファイルです。

これらはfuit.voca及びfruit.grammarより生成されています。

で、ここの生成に必要なファイルがmkdfa.plというファイルになります。



plです。perlです。perl環境がないと動かないんですこの子。

更にこのmkdfaを動かすにはmkfaとdfa_minimizeが必要になります。

これらは全てJuliusの実行ファイルと同じフォルダ内にあります。



で、perlということだったので、Windowsでの初手は当然cygwinです。ですが。。。

そのままではcygwinでは起動することができません。tmpフォルダの生成に失敗するので

手動でusrtmpdirを設定しないとなりません。

設定しても動かないという例は多々確認して、それに対する解決策も色々ネットにはありましたが、

正直原因となりうる項目が多すぎて自分がどのパターンなのか探すのも面倒になるのでお勧めできません。


じゃあLinuxはどうかというと、linuxではmkdfa内で呼び出されるmkfaが動きません。

自分は試していないのですが、

mkfaを動かすためのライブラリはいくつか標準でインストールされていないものがあるようなので

mkfaを単体起動して調べてみる必要があるそうです。


Windows内にPerlが入っていれば割と問題なく動くようです。が、自分の環境には入っておらず。
それでもなんか$thisdirの取得ができないらしいので、何か別の方法で実行ファイルの絶対パスを入れる必要があるっぽいです

と、いう訳で。もういろいろ難しくて面倒だったので

Pythonで書き直しました(´・ω・`)
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (c) 1991-2011 Kawahara Lab., Kyoto University
# Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
# Copyright (c) 2005-2011 Julius project team, Nagoya Institute of Technology
#
# Generated automatically from mkdfa.pl.in by configure. 
#
# Julius for python convert by radiumproduction
# Copyright (c) 2007-2017 RadiumProduction

import os
import sys
import re
import subprocess

## setup
# tmpdir
usrtmpdir = "";		# specify if any

args = sys.argv
argc = len(sys.argv)

# mkfa executable location
thisdir =  os.getcwd()
mkfabin = thisdir+"/mkfa.exe"

# dfa_minimize executable location
minimizebin = thisdir+"/dfa_minimize.exe";
# find tmpdir
tmpdirs = [usrtmpdir, os.environ.get('TMP'), os.environ.get('TEMP'), "/tmp", "/var/tmp", "/WINDOWS/Temp", "/WINNT/Temp"]

def usage():
    print "mkdfa.pl --- DFA compiler"+os.linesep
    print "usage: "+__file__+" [-n] prefix"+os.linesep
    print "\t-n ... keep current dict, not generate"+os.linesep
    exit()

tmpdir=""
for tmp in tmpdirs:
    t = tmpdirs.pop(0)
    if (t == ""):
        continue
    if (os.path.isdir(t) and os.access(t,os.W_OK)) :
        tmpdir = t
        break   

if (tmpdir == ""):
    sys.stderr.write("Please set working directory in \$usrtmpdir at "+__file__+os.linesep)
    exit(1)

#############################################################

if (argc < 2 or args[1] == "-h"):
    usage()

make_dict = 1;
make_term = 1;

CRLF = 0;

gramprefix = "";
for arg in args:
    if (arg == "-t"):
        make_term = 1
    elif (arg == "-n"):
        make_dict = 0
    else:
        gramprefix = arg
    

if (gramprefix == ""):
    usage()

gramfile = gramprefix+".grammar"
vocafile = gramprefix+".voca"
dfafile  = gramprefix+".dfa"
dictfile = gramprefix+".dict"
termfile = gramprefix+".term"
tmpprefix = tmpdir+"\g"+str(os.getpid())
tmpvocafile = tmpprefix+".voca"
rgramfile = tmpprefix+".grammar"

# generate reverse grammar file
try:
    gram=open(gramfile,'r')
    rgram=open(rgramfile,'wb')
    n=0
    for row in gram:
        row=row.rstrip('\r\n')
#       row=re.sub(r"\r+$","",row)
        row=re.sub("#.*","",row)
        if not(re.match("^[ \t]*$",row)==None):
            continue
        spdata=row.split(":")
        spword=spdata[1].split(" ")
        spword.reverse()
        rgram.write(spdata[0]+":"+" ".join(spword)+os.linesep)
        n+=1
    gram.close()
    rgram.close()
except:
    sys.stderr.write("cannot open "+gramfile+" or "+rgramfile+os.linesep)
    exit(1)

print gramfile+" has "+str(n)+" rules"+os.linesep

# make temporary voca for mkfa (include only category info)
if (not(os.access(vocafile,os.R_OK) )):
    sys.stderr.write("cannot open voca file "+vocafile)
    exit(1)

try:
    voca=open(vocafile,'r')
    tmpvoca=open(tmpvocafile,'w')
    if(make_term==1):
        gterm=open(termfile,'wb')
    n1=0
    n2=0
    termid=0
    for row in voca:
        row=row.rstrip('\r\n')
#       row=re.sub(r"\r+$","",row)
        row=re.sub("#.*","",row)
        if not(re.match("^[ \t]*$",row)==None):
            continue
        mt_data=re.match("^%[ \t]*([A-Za-z0-9_]*)",row)
        if not(mt_data==None):
            tmpvoca.write("#"+mt_data.group(1)+os.linesep)
            if make_term==1:
                gterm.write(str(termid)+"\t"+mt_data.group(1)+os.linesep)
                termid+=1
            n1+=1
        else:
            n2+=1
    voca.close()
    tmpvoca.close()
    if make_term==1:
        gterm.close()
    print vocafile+"    has "+str(n1)+" categories and "+str(n2)+" words"+os.linesep
except:
    sys.stderr.write("cannot open "+vocafile+" or "+tmpvocafile+os.linesep)
    exit(1)

print "---"+os.linesep

# call mkfa and make .dfa
status=0;
if not(os.access(minimizebin,os.X_OK)):
    # no minimization
    print "Warning: dfa_minimize not found in the same place as mkdfa.pl"+os.linesep
    print "Warning: no minimization performed"+os.linesep
    if tmpprefix.find("cygdrive")!=-1 :
        status = subprocess.check_call(mkfabin+" -e1 -fg `cygpath -w "+rgramfile+"` -fv `cygpath -w "+tmpvocafile+"` -fo `cygpath -w "+dfafile+"` -fh `cygpath -w "+tmpprefix+".h`",shell=True)
    else :
        status = subprocess.check_call(mkfabin+" -e1 -fg "+rgramfile+" -fv "+tmpvocafile+" -fo "+dfafile+" -fh "+tmpprefix+".h",shell=True) 
else :
    # minimize DFA after generation
    if tmpprefix.find("cygdrive")!=-1 :
       status = subprocess.check_call(mkfabin+" -e1 -fg `cygpath -w "+rgramfile+"` -fv `cygpath -w "+tmpvocafile+"` -fo `cygpath -w "+dfafile+".tmp` -fh `cygpath -w "+tmpprefix+".h`",shell=True)
    else :
       status = subprocess.check_call(mkfabin+" -e1 -fg "+rgramfile+" -fv "+tmpvocafile+" -fo "+dfafile+".tmp -fh "+tmpprefix+".h",shell=True)
    subprocess.check_call(minimizebin+" "+dfafile+".tmp -o "+dfafile,shell=True)
    os.remove(dfafile+".tmp")
os.remove(rgramfile)
os.remove(tmpvocafile)
os.remove(tmpprefix+".h")
print "---"+os.linesep
if (status != 0) :
    # error
    print "no .dfa or .dict file generated"+os.linesep
    exit()

# convert .voca -> .dict
# terminal number should be ordered by voca at mkfa output
if make_dict == 1 :
    nowid = -1
    try:
        voca=open(vocafile,'r')
        dictf=open(dictfile,'wb')
        for row in voca:
            row=row.rstrip('\r\n')
#            row=re.sub(r"\r+$","",row)
            row=re.sub("#.*","",row)
            if not(re.match("^[ \t]*$",row)==None):
                continue
            if not(re.match("^%",row)==None):
                nowid+=1
                continue
            else:
                a=row.split()
                name=a.pop(0)
                dictf.write(str(nowid)+"\t["+name+"]\t"+" ".join(a)+"\r\n")#+os.linesep)
        voca.close()
        dictf.close()
    except:
        sys.stderr.write("cannot open "+vocafile+"or"+dictfile+os.linesep)
        exit(1)

gene = dfafile
if make_term == 1:
    gene += termfile
if (make_dict == 1) :
    gene += dictfile
print "generated: "+gene+os.linesep

はい。解決です。訳あって、もともとここの変換プログラムはexe形式にしたかったんですよ。

ただ、なんかperlってexeに書き出すとアホみたいに重くなるって聞いたので、はい。
HelloWorldだけでで3M持ってかれるって聞いたんですけどマジです?




でもここで終わりではないんです。

mkdfaにおいて変換元となる、vocaファイルとgrammarファイルですが、

grammarファイルは文法ファイルということで、こちらで手書きで文法を定義していくものです。
○○をください、とか、○○教えて、とか認識するフレーズを定義します。


しかし、vocaファイルは単語とそれに対する読みを音素列で定義してあるファイルです。

Juliusにおける音素列はこちらのサイトにあるようなのですが、如何せんこれを見ながら打つのはアホらしい。。。



ということでJuliusにはyomi2voca.plというプログラムがありまして、

これを使って単語とそのひらがな読みの羅列でできたyomiファイルからvocaファイルを生成することができます。




でも、これもperlだったので

Pythonで書き(ry
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Julius for python convert by radiumproduction
# Copyright (c) 2007-2017 RadiumProduction

import sys
import os
import re

args = sys.argv


error=0
lineno=0


yomi = open(os.path.dirname(os.path.abspath(__file__))+"/"+args[1]+".yomi", 'r')
voca = open(os.path.dirname(os.path.abspath(__file__))+"/"+args[1]+".voca", 'w')

for line in yomi:
	if re.match(u"^%",line):
		voca.write(line)#+"\n")
		continue;
	
	word=line.split()
	word[1]=word[1].rstrip(os.linesep)

	word[1]=word[1].replace("う゛ぁ","b a ")



-------------------------------(省略)--------------------------------------


	word[1]=word[1].replace("を","o ")


	word[1]=re.sub(r"^ ","",word[1])
	word[1]=re.sub(r":+",":",word[1])
	word[1]=re.sub(r" :",":",word[1])

	lineno+=1
	if re.match(r"^[a-zA-Z:]+$",word[1]):
		if error==0:
			error=1
			print "Error: (they were also printed to stdout)"+"\n"
		print "line "+str(lineno)+":"+word[0]+"\t"+word[1]+"\n"
	voca.write(word[0]+"\t"+word[1]+"\n")
if len(args)==3:
	if args[2]=="-n":
		voca.write(r"% NOISE"+"\n")
		voca.write(r""+"\tsp"+"\n")
voca.write(r"% NS_B"+"\n")
voca.write(r"<s>"+"\tsilB"+"\n")
voca.write(r"% NS_E"+"\n")
voca.write(r"</s>"+"\tsilE"+"\n")

yomi.close()
voca.close()

こっちは単純にperlのs/gによる置換をreplaceで置換しただけです。perlの文字列処理パないわ
元ファイルからコピペ→置換でOKです

後はNS_BとNS_Eを自動で書きだす機能と-nのオプションでsp(休符)を書き出す機能を追加しました。
※NS_BとNS_Eはnoise_beginとnoise_endの略みたいです。文法の最初と最後にいるみたい。

spを入れる場合はgrammarの方でspを使わないとmkdfaでエラーを吐くのでご注意を。




という訳で作ったファイルで辞書を生成してみます。今回、prefixはtestで行います。

辞書ファイルは全て同じprefixじゃないと正しく認識されないのでご注意ください。

test.yomi
% NAME
ココア	 ここあ
チノ ちの
リゼ りぜ
千夜 ちや
シャロ しゃろ
% CHAN
ちゃん ちゃん
% CUTE
かわいい かわいい
もふもふ もふもふ

test.grammar
S       :  NS_B NAME_S CUTE NS_E
NAME_S 	:  NAME CHAN
NAME_S 	:  NAME

cmd入力
python yomi2voca test
python mkdfa test


これで最後に
generated: test.dfatest.termtest.dict
となっていれば成功です。因みに僕はpyinstallerを使っているのでexeにしてから実行しています。

文字コードは公式ではWinodowsはUTF-8、それ以外はEUCという風に指定されていますが、

先述したように、配布されているサンプルは何故か全てshift-jisです。

という訳で、どうやらshift-jisでも動くようです。

因みにwindowsのメモ帳はUTFで保存すると先頭に意味不明な文字が付加されるので、

辞書ファイルはメモ帳では作らないでください(´・ω・`)



3ファイルが生成されたらそれを、今回はとりあえずgrammar-kit直下に置きます。ちゃんとフォルダ作ろう?

生成されない場合は余分な改行とか、grammarファイルの文法ミスとかです。
入力仕様は本家様に合わせているので、変なもの入れると失敗するのはご愛敬です。


んでもって同一階層のtestmic.jconfを開いて
-gram test
-C hmm_ptm.jconf
-input mic -demo
と変更。

あとはさっきと同じようにJuliusを起動すれば・・・

pass1_best: <s> ココア かわいい </s>
pass1_best_wordseq: 3 0 2 4
pass1_best_phonemeseq: silB | k o k o a | k a w a i i | silE
pass1_best_score: -4262.506348
### Recognition: 2nd pass (RL heuristic best-first)
STAT: 00 _default: 10 generated, 10 pushed, 5 nodes popped in 142
sentence1: <s> ココア かわいい </s>
wseq1: 3 0 2 4
phseq1: silB | k o k o a | k a w a i i | silE
cmscore1: 1.000 0.941 1.000 1.000
score1: -4261.156738

pass1_best: <s> チノ ちゃん もふもふ </s>
pass1_best_wordseq: 3 0 1 2 4
pass1_best_phonemeseq: silB | ch i n o | ch a N | m o f u m o f u | silE
pass1_best_score: -4179.256836
### Recognition: 2nd pass (RL heuristic best-first)
STAT: 00 _default: 15 generated, 15 pushed, 6 nodes popped in 139
sentence1: <s> チノ ちゃん もふもふ </s>
と、まぁこんな感じでリアルタイムでの音声認識が可能です。
文法はwordseqから判断できますね(´・ω・`)

Windowsで文字化けする場合は
chcp 65001
で文字コードをUTFに変えてしまいましょう。



で、記事の本題はここから。

まだpythonを使ってJuliusを動かしてないですからね。





プログラムに組み込む方法としては、JuliuslibとかいうAPIもあるようですが、

今回は簡潔に行きたかったのでsocketを用いた方法で行きます。あっちは情報が少なすぎる



まずはJuliusをモジュールモードで起動します。
julius -C ../../testmic.jconf -module
jconfで変更は可能ですが、Juliusは標準で10500番を使っているようなので、今回はそれで設定します。

クライアントのプログラムは此方。

標準出力してからファイルにも出力しています。贅沢ですね(´・ω・`)/
#!/usr/bin/python
# -*- coding: utf-8 -*-

import socket

port = 10500
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("localhost", port))

f=open("reading_data.txt",'wb')
while(1):
	data=client.recv(1024)
	print data 
	f.write(data)
これ以上記事を伸ばしたくないので、出力結果は割愛しますが

それぞれ別個で動かすと、なんかクライアントの方にリアルタイムでデータがぶっこまれます。

出力形式はxmlっぽいタグ付きの何かです。正規表現か何かで抜き出すといいんじゃないかな。これ正式名称あるのかな





というわけで今回の記事は5000兆年ぶりくらいに真面目なライブラリ備忘録でした。

やる気になったら1日かからずに全部終わったっていうか、この記事書く時間のほうが長かったくらいなので

plファイルで悩んでいる方はpythonやrubyで書き直すことをオススメします。


(^・ω・)ノ curonet at RadiumProduction
過去の流れをぶった切って流行に乗っかることもたまには大事だと思います。
先週末は各地で様々な大会およびイベントが開催されており、

皆様がおのおの行くべきところで活躍されたかと思います。

大変お疲れさまでした。


今年も長岡高専からRCJS世界大会出場チームが出たようで、おめでとうございます。
産技の結果?まだ聞いてないよ?


また、産技荒川で行われたロボットグランプリの大道芸部門において、

静岡大学ロボットファクトリーが準優勝したという報告も頂きました。こちらも合わせてオメデトウゴザイマス


結果に関しては人それぞれといったところでしょうが、

続けるにしても続けないにしても、あとから思い返して良い思い出になっていれば幸いです。



今回の記事はリアルタイム投稿、あまり他に書くこともないのでこの辺で。

あ、因みに来週は関西にいます。

(^・ω・)ノ curonet at RadiumProduction
がんばれ中津川組。

ところで中津川ってことはお土産は何かな?(´・ω・`)

(^・ω・)ノ curonet at RadiumProduction
春です。 

モウハルデス。


今日の記事はあれです。それです。


これです。 

やるやる詐欺をして結局やっていないようにみせかけて、実は既にリリース中のアプリケーションについてです。 

事前の予告(と言っても1年近く前の話ですが・・・)通り、Twitterツールアプリケーションとなっています。 
Twitterをやっていない方は今すぐこちらから新規アカウント登録をして、ロボカッパーの方は@OkadaTechnologyをフォローしましょう。 
アプリケーションのURLはこちら。現在殆ど機能していませんが、一応github上でも公開してます。 
で、これは何をするツールかという話になるのですが、

これは現状、いわゆるTwitterクライアントと言われるものではありません。 
時間があればそうなる可能性も否めないですが。。。 


つまりどういうことかといいますと、このツールではツイートを見ることも、することも、できません。




じゃあ何するの?ということですが、答えはアプリケーションの名前にあります。

アプリケーションBirthは"Birth is an Immediate Retweet Tool with a Heart."の頭文字です。 


名前の通り、この子はリツイートツールです。

こちらが指定したフレーズを含むツイートを自動でリツイートするツールアプリケーションです。 
ついでに設定次第でハートも投げられます。 


使用方法については、まず初回起動でピンの認証を行います。これについては他のピン認証と大差ありません。

初回起動時に開く認証画面の下にピンの入力欄があるので、

表示されたピンをここに入力して右のボタンを押します。これでアカウントの認証が完了します。




基本的な画面と機能の説明は以下のようになります。 
①リツイートするアカウントの選択(複数可)
②アカウントの追加
③単語群の有効/無効の切り替え
④リツイートしたい単語群に含む単語の記入欄
⑤単語の有効/無効の切り替え
⑥単語郡内の単語の削除
⑦単語群に単語を追加
⑧リツイートの際にハートも一緒に送信する
⑨単語群の追加
⑩新規作成
⑪開く
⑫保存
⑬リツイート開始
⑭各種設定

赤枠で囲まれているような、横一列が単語群です。


ボタン⑬でリツイートを実行すると、単語群内の全ての単語が含まれるツイートがリツイートされます。

単語群が複数有効に設定されている場合はどれかの単語群が上記条件を満たしていればリツイートします。


ツイートの抽出先はデフォルトでは最初に登録したアカウントのタイムラインです。

このあたりは設定から変更できます。

設定については見たらわかるような気がするので省略です。

日本語とか英語とかフランス語とか対応しています。あと色とか変わります。5パターンです。

というのが本日の記事です。アプリケーションのリリースはなんと2016年の12月4日!もう3カ月以上経ってる!!!

アプリケーションの完成に至っては、なんと2016年の9月です!!!もう半年放置されてる!!!!

フラットデザイン(爆死)のままリリースされているので、UIは時間があったらきっと変えます(どうせ数年後)


以上、忘れ去られたアプリケーションリリースの伏線回収記事でした。

因みにこの記事を書いてるのは、2017年の1月です。
書いた記事当日に更新してるブログじゃないからね!自動投稿完了する前になんかの理由でアプリ公開終了になってないことを祈るしかないよ!


---ついしん---
毎年近くなると聞かれるので、今年は聞かれる前に答えておきます。 
今年のRCJジャパンも行きません。 
ちなみに3/25は有明、3/26は産技高専にいますいない。

 
って言うか無理でしょ。あれは。宿少ないんだからまじめにやってくれる方が優先して行くべきです。 

(^・ω・)ノ curonet at RadiumProduction

3/23
iとrがSwapしている脆弱性が報告されました。報告ありがとうございました(´・ω・`)
新年あけましておめでとうございます。

どうやらこの新年の挨拶は7日まで使っていいとしている宗教と15日までという宗教があるそうです。

どちらにしろ早いことにはこしたことはないですね。皆様はもう新年の挨拶は済まされましたでしょうか。


とうとう当ブログも5周年、6年目を迎える運びとなりました。
確認したら6周年で7年目だった(´・ω・`)

今年も生きてる限りだらだら記事を書いていこうと考えている所存でありますので、

本年も何卒よろしくお願いいたします。


と、ここで、昨年の新年の挨拶を振り返ってみましょう。



・・・・。


本年もよろしくお願い致します(´・ω・`)

いや、アプリリリースとかしてるんだよ!?ここに書いてないだけで・・・・

(^・ω・)ノ curonet at RadiumProduction



死んでません。死んでませんよ。

9月、10月は(今も)色々忙しかったので一切更新していませんでした。が、ブログは生きています。


本日のネタは先日、某SNSから流れてきた話。
2016年8月は現時点で通算9回ビックサイトに行きました。2日に1回は行っている計算です。

これはいつのビックサイトかというと今から約10日ほど前。8月6~7日の話です。
数日前ですが、20万アクセスだそうです。いいのかこのブログそんな伸びて。


直近ですが、先週の土日にとMFTを見学させていただきました。

詳細については後ほど更新したいと思いますマルナゲ


あとは・・・C#の記事?ネタはたくさんあるんだよ?pythonも。

気がついたら時が過ぎてるの。ボク悪くない。


今後暇ができた時に唐突に垂れ流していこうと思いますのでよろしくお願い致します。
実はC#はだいぶ書けるようになっている今日このごろ


短い記事ですが最後に。日頃のアクセスありがとうございます。

殆ど更新されていませんがこれからもよろしくお願い致します。

(^・ω・)ノ curonet at RadiumProduction
日曜日は朝から渋谷OIOI待機列に並んでました。

去る7月10日、大田区総合体育館で行われたNHK学生ロボコンを観戦してきました。
今週末は全国各地にある産技高専の巡礼を行いました。

今回は2日目、荒川キャンパスに向かいました。
今週末は全国各地にある産技高専の巡礼を行いました。

今回は1日目、品川キャンパスに向かいました。
どのタイミングで記事を出すか悩みましたが、長岡組が出発したようなのでこのタイミングになりました。


そろそろライプツィヒでロボカップの世界大会が開催されるようですね。

残念ながら今回は産技高専品川からの出場チームはありませんでしたが、
出てたら4年連続14年目の世界大会出場になるのか・・・文章に起こすとなんか強そう(´・ω・`)


香川高専から2チーム、長岡高専から1チームがサッカーオープンで出場されるとのことです。ガンバッテクダサイ


ここ数年で高専からの参加チームもだいぶ増えてきていますね。サッカーなんか上位は殆ど高専みたい。


現役のレスキュー選手には知り合いが殆どいないので、状況が(ルールも)全くわかりませんが、

同じような現象が起きているのでしょうか?



まぁそれはともかくとして。

今回は追加枠に関しては数もタイミングも結構ギリギリまで動き続けていたようで、

準備等も十分ではない、万全ではない状態のチームも多くいるかと思います。
※過去に大会前日にジャパン出場決定芸キメた人の発言です。


チームによって問題も目的も様々でしょうけど、後に大きく残る後悔だけはしないよう頑張ってください。
あと学校の金使って参加したチームは成果残せなかった時の言い訳を考(ry


後の原動力になるような後悔ならともかく、トラウマの如く引きずるような物を負うと後が非常に面倒です。

特に大きな大会では後者が起こりやすいです(´・ω・`)なにせ奴らは予想してないところからやってくる・・・


簡単に言うと深く考えずに楽しんできてください。言葉で殴りあうのは審判ミーティングだけで十分です。


というだけの記事です。以上です(´・ω・`)


@長岡各位、りゅなんとかさんをドイツにそのまま置いてきて頂けると個人的に助かります。

(^・ω・)ノ curonet at RadiumProduction
急遽、文化放送の某番組を録音する必要が出てしまいました。

当初はメインPCであるwin機を使って・・・と色々考えたのですが、

調べた限り、時間設定で自動起動→録音してくれて、文化放送をカバーしてくれるとなると厳しそう・・・。
※青い方の円盤の記事になります。

たまたま、青色円盤の再生が可能なソフトを頂いたので、円盤再生機を買ってみることにしました。
これでようやく積み円盤たちが再生できる・・・!
卯月がやってきました。今日もいい天気になりそうです。


年度が新しくなったということで、こちらでも新しい企画がいくつか動き始めています。

その中のひとつとして、またひとつアプリケーションの開発を始めました。

今後はGUIアプリケーションとなります。運が良ければこちらで公開することになるかもしれませんね。

ヒントとしては・・・某SNS関係?いくつ作ってるかわかりませんが、またこの方向なんじゃないかな。


ということでひとつ。今年度もよろしくお願いします。

いきなり重度の風邪を引いたらしく花粉症との連撃クリティカルを食らって凄く辛いです(´・ω・`)





















あ、今年は1行だけ嘘です。

(^・ω・)ノ RadiumProduction at curonet

選手及びスタッフの皆さんお疲れ様です。

僕が大学の学位証明書を探しているうちにどうやら大会の方終了していたようです。


今年もこの季節がやって来ました。

ロボカップジュニアのジャパンオープンが愛知工業大学で開催されます!!!

選手の皆さんドイツに向けて頑張ってください!

スタッフの皆さん長い3日間になりますが、怪我や病気、緊急搬送等されることのない程度に頑張ってください!


RRCの皆さん!ドイツ土産よろしくね!!!!


ボクは今回は行きません!!!


では。

(^・ω・)ノ curonet at RadiumProduction
まずは皆さん。この画像をご覧ください。

あ、らずぱい3については技適番号が入りましたが本物かどうか確認できないとのこと

どっちにしろRSでは売り切れてるので暫くは手に入りませんね(´・ω・`)

忙しい中ですが、急遽32GのUSB2.0メモリが1個必要になったのでしょうがなく秋葉原に行きました。
RSにRaspberry pi 3Bについての情報が上がっていました。フラゲ?

一応URLはこちらから
http://jp.rs-online.com/web/p/processor-microcontroller-development-kits/8968660/
カレンダー
08 2017/09 10
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
最新CM
[09/25 ONE RoboCuper]
[11/19 big]
[11/11 お馬さん]
[08/08 うまごやぐらし!]
[04/20 匿名(にさせてw]
かうんた
らじぷろ目次
らじぷろ検索機
プロフィール
HN:
Luz
年齢:
23
性別:
男性
誕生日:
1994/02/15
職業:
大学生
趣味:
ラボ畜
自己紹介:
初めまして。Luzと申します。
某大学の情報学科に入りました。のんびりと生活を送るのが今年の夢です。
めーる
radiumproduction☆yahoo.co.jp
※☆を@に変更して下さい。
バーコード

PR

忍者ブログ 2007-2017,Powered by Radium-Luz-Lα+-Rescatar in RadiumProduction [PR]


Related Posts Plugin for WordPress, Blogger...