お腹.ヘッタ。

関数型とかセキュリティとか勉強したい。進捗つらぽよ

MPU-6050よお前のDMPは何様だ(1)

こんにちは。エントリ書いてます。
MPU-6050についてずっと調べてました。

MPU-6050の概要。すごい安くて高性能な6軸ジャイロ加速度センサ。 InvenSense 製のI2C接続のジャイロ・加速度センサICです。 DMP (Digital Motion Processor) という機能を使うことで、補正済みのデータを簡単に利用できるのが特徴。ただしこれがひどい後述する。
アマゾンで買う時は日本在庫指定すると早く来るゾ。某林檎の会社の携帯端末に入ってる三軸加速度センサーと同系とも言われてるらしい(リーク情報重ねると)とあとはググって。

まず備忘録。
MPU-6050 6-axis accelerometer/gyroscope | I2C Device Library
ここからライブラリ持って行ってください。じゃないと動きません。もう一度言います。動かないんです。
何でうごかないかというと動かない方のライブラリは作ったときのarduinoバージョンが古くて型の名前が違うだとかそういうのでダメなのです。(詳しく知りたい方は古〜いライブラリを使ってみてね⭐️)
InvenSense のジャイロ・加速度センサ MPU-6050 を使うとか古くなってるから体験できる。(mainの部分は参考にするといい)



あとはやるだけペチペチ。

github.com


やっつけMPU6050(角度と生データ表示する)を置いておいたんでライブラリincludeして遊んでください。コメント振ってるんで読みやすいと思います

後で第二弾愚痴書きます()

Arduinoでのスレッドのお話。(pt.h)

こんにちわ。備忘録も兼ねてArudinoのスレッドのお話です。

別々のスピードでステッピングモーターの動作をやらせたいってことがあって、それ故Arudino上でスレッドを立ててみました。

github.com


以上今回のやっつけソースです。

そもそもArudinoにはスレッドの機構は存在はしないのですが、組み込み機器の考えの中にはRTOS(リアルタイムオペレーションシステム)を使うスレッドの組み込み機器とRTOSを使わない(ポーリング型(いわゆるイベント駆動型)プログラミング)の組み込み機器があります。その後者を簡単にするために"protothreads"というライブラリがあります。
protothreads
要参照。

要は今回のはprotothreadsをarudino向けにラップしたやつの紹介ということになります。



さてここからがこのエントリの本題で備忘録です(遠い目)

pt.hのinclude

Arduino Playground - TutorialList
から
build hardware and write code for it: protothread, a powerfull library
へ行って
Google Code Archive - Long-term storage for Google Code Project Hosting.
pt.hをダウンロードしてください。

その際includeすると

#include <lc-addrlabels.h>
#include <lc-switch.h>
#include <lc.h>
#include <pt-sem.h>
#include <pt.h>

ってでてくるので
削って

#include <pt.h>

に変えてコードを書く。やるだけ。




さてこいつの困ったのは意外に日本語情報あまり多くないんですね。。。
そしてぶっちゃけ二番煎じなんでオレオレメモ書きリファレンスも残しておきたいと思います。

(オレオレ)リファレンス

struct pt {
  lc_t lc;
};

構造体型pt。それだけ

PT_INIT(pt);
/*実態は
#define PT_INIT(pt)   LC_INIT((pt)->lc)
ってなっておりlc.hでincludeされている"LC_INIT(lc)"でその使用するスコープ変数の状態を初期化している
*/

Protothread を初期化する。

 PT_THREAD(name_args);
/*実態は
#define PT_THREAD(name_args) char name_args

名前を引数として呼ぶって感じですね。
*/

protothread (ちなみにCで記述されてる)の宣言部分らしい。

PT_BEGIN(pt)
/*実体は
#define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc)
"LC_RESUME(lc)"はlc.hで記述されてて意味どおりスレッドの再開をするってこと。つまるところスレッドの開始ということになる。
*/

protothread の開始の宣言。

PT_END(pt)
/*実体は
#define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \
                   PT_INIT(pt); return PT_ENDED; }
"LC_END(lc);"はlc.hで記述されててそのスコープでの使用の終了をマークしてる関数。
*/

Protothread の終了を宣言。

PT_END(pt)
/*実体は
#define PT_WAIT_UNTIL(pt, condition)	        
  do {						
    LC_SET((pt)->lc);				
    if(!(condition)) {				
      return PT_WAITING;			
    }						
  } while(0)
" LC_SET(lc);"はlc.hで記述されててそのスコープでの使用を設定する関数。正確に言うとその状態に保存をかける関数。
*/

protothread の宣言したスコープのスレッドで止まる。つまり機能的にはwait関数。

PT_EXIT(pt)
/*実体は
#define PT_EXIT(pt)				
  do {						
    PT_INIT(pt);				
    return PT_EXITED;			
  } while(0)
*/

protothread の宣言したスコープを終了させる。

PT_SCHEDULE(f)
/*実体は
#define PT_SCHEDULE(f) ((f) < PT_EXITED)
*/

protothreadをスケジュールをするために使うぽい。具体的にはprotothread が終了した場合0を返す。

PT_YIELD(pt)	
/*実体は
#define PT_YIELD(pt)				
  do {						
    PT_YIELD_FLAG = 0;				
    LC_SET((pt)->lc);				
    if(PT_YIELD_FLAG == 0) {			
      return PT_YIELDED;			
    }						
  } while(0)
*/

このprotothread(スレッド)が終わるまで待つ。
片方でデータ通信しててそのデータをもう一つのスレッドで仕事したい時に使うとでも言えばイメージがつく。

PT_YIELD_UNTIL(pt, cond)
/*実体は
#define PT_YIELD_UNTIL(pt, cond)		
  do {						
    PT_YIELD_FLAG = 0;				
    LC_SET((pt)->lc);				
    if((PT_YIELD_FLAG == 0) || !(cond)) {	
      return PT_YIELDED;			
    }						
  } while(0)
*/

このprotothread(スレッド)の指定した条件が true に評価されるまで待つ。

以上おまけでした。間違えがあったら教えてくれると助かります。

今年の抱負とか

こんにちは。竹です。最近忙しくて(本当かよ)更新できなくてすいません。

今年一年始まるので抱負とかを書き綴ろうと思います。(遅い)

せっかくなので再度自己紹介から。

自己紹介

私は某工業高等学校の2年生です。高校では情報系の部活をしていて私の代では、(一応)部長をしています。
得意なことは寝ること。好きな言語はswifthaskell、時々C#。(書けるといってない)最近は深層学習やCTF、計算論理。暗号も興味あるけど暗号はまだ手を出せてない。プログラミング寄りなこと以外にも古典制御、現代制御などの機械制御にも興味があります。

今年一年の抱負・やりたいこと

  • 大学受験受かる:8月下旬までに自己推薦書を出すそして秋に面接の入試。嗚呼。評定が足りない。工業で今現在4.0無いので人権無い。
  • 大会入賞:キーワードは”倒立振子”、”CTF”、”枝狩り”、”UI/UX”。
  • 技術向上:いい加減アルゴリズム力つけたい。CTF精進。デザパタ覚えたい。リーダブルコード読もうな(他の読んででスタックに溜まってる)
  • 人間力の向上:去年の年末は改めて自分の惨めさやいろいろなものを考えさせられました。ありがとう。
  • コミュニティ作る。:私の身近な人々で中高生カンファもどきでもしたいなって思うこの頃。先輩や知り合いがいいネタ持ってるんで吐かせたい。

締め

今年一年より一層精進(自戒)

サイバー甲子園・セキュリティミニキャンプ東北(一日だけの一般)に行ってきた

11/7サイバー甲子園と11/14セキュリティミニキャンプ東北に行ってきました。(まとめて書くの許して><)

サイバー甲子園

大会内容的には仕事してないので(まさかの解いたと思ったら既に解かれてて事実上仕事してない(いやたとえ解いたと言っても貢献全然できてない量))私の相方氏@st98を全力で参照プッシュします。相方氏足引っ張ってごめんね

せっかくなんでその日のお話を時系列で並べていきます
時系列で箇条書きでみてね

ヅ駅に到着
  • 風邪気味。一人で心細い。
  • をるふ姉さんの生バイオリン演奏で癒される。復活。
  • 相方氏の目の前ですっ転ぶ。
  • 相方氏と少しダラダラ( ご飯食べたかったけど時間が残り10分で断念)
  • 集合するとみんなプロ層で怖い。
大会へ行く

今年出来た建物でやるらしい。入り口にモニメントがあるのだがそれがCOACH社ので謎の圧倒感。
周りの見ると高専生やばい。

大会スタート



やばいやばいしかいってなかった

終わり

  • 相方氏プロ👏(弟子入りしました)
  • scryptosやばい
  • (完)
  • 結果としては3位でした。

懇談会
  • ご飯おいしい(昼食い損ねた人の感想)
  • やっぱりみんなプロ。
  • bijoチームが姫状態。
  • 名刺交換フェーズ。YES!人見知り!NOT!コミュ症
  • ふるつきさんを拝んだ
  • ふるかわさんとお会いして受賞聞いてU22での悔しさ再燃。あとバイナリアン名刺かっこいい
  • イケメン高専生(元)面白い。
  • 緑林檎さんイケメン(?)
  • ハローワールド入門の坂井さんと名刺交換嬉しい(ほくほく)
  • etc.....
帰る
  • 泊まらないの私だけで悲しみに暮れる。
  • 終電あと二本で来るとこだった。危ない危ない
  • 爆睡

こんな感じでした。ただただお疲れ様でした。1月インターカレッジあるので頑張ります。精進します。^^;

つづいて

セキュリティミニキャンプ東北

主にここ最近の事例紹介でした。キニグレン氏はディフェンス側と言っていたけど攻めるがわもプロだろうなと思いつつメモメモ。
サメ使ってバタバタ。開始前に会場のネットワーク監視をしてたらしく、たぶん角田さんのネットワーク監視のとこに自分の名前入ってると思うとアセアセ。

  • 『IoT社会のセキュリティ』IPA セキュリティセンター 主任 中野 学氏

IPAすごいなぁという感じでした。
そのうち家電・家具インジェクションとかあるんじゃないかなとか思ってた。

  • 『サイバーセキュリティと警察~初代サイバー捜査官が見てきたモノ~』宮城県警察本部生活安全部生活環境課 宮城県警察サイバー犯罪対策室 サイバー犯罪捜査第二係長 津志田 浩孝氏 

ホワイトハッカーなりたい✨(厳しい世界)

  • 『作り込まれやすい脆弱性』セキュリティ・キャンプ講師 山下 勇太氏、篠原 崇宏氏

IPAすごいなぁという感じでした。(2回目)
よく届け出にXSSが多いというけどそのとおりですよね状態。DOM構造脆すぎぃィ。

  • 終わり

名刺交換フェイズ。YES!人見知り!NOT!コミュ症(n回目)
いろんなチューターさんと交換。宮城にもこんなに勉強会あるんですね。。。ほへぇという状態でした。ライトニングトークもうちょい聞きたい。
なぜ専門応募忘れたんだろうというのが一貫して心残り。
きゃれっとさんとお会いしてホクホク。
ここでもscryptosか。。。怖い><ってなってた。

こんな感じで圧倒的に勉強になった2週間でした。誰か勉強会誘ってください><

Haskell(再)入門1回目基本構文。

どうも。2回目の記事でございます。

今回はHaskellの基本構文を勉強していこうと思います。

1:出力について(IOモナドじゃないよ。ただのPuts的な奴)

やはり入門といえば。。。!
基本のHelloWorldからですよね!でも仕事で使ってみたいから気持ちを込めてHelloWork!にします。

>main = putStrLn "HelloWork"

これ一行で完成です。
これを*.hsで保存してGHCあたりでコンパイルかけて実行しましょう。
どうでしょう?できました??

さてここから留意すべきこととして
・大文字と小文字は区別される。
・文字列は"" で囲んでリテラルにします。
・mainは他のプログラミング言語のmainと同じ。

関数 putStrLn は,文字列&改行で出力する関数です。
改行が不要であれば putStr 関数を使用します。
なお文字列以外を扱う場合はprint 関数を扱います。

main = print

さてしかしここで分けて書く

main = putStrLn "Hello";putStrLn "Work"

というのはできないのです。なので

main = do putStrLn "Hello";putStrLn "Work"

doをつけてあげます。

見づらいのでインデントをつけましょう!

ここでも2つ選択肢があります。
1

main = do {putStrLn "Hello";putStrLn "Work"}

2

main = do putStrLn "Hello"
     putStrLn "Work"

と言った感じのCのように扱えるスコープのカッコ{}とセミコロン;を用いる方法と改行を揃えて記述できます。

この時のルールとして、
1の方はキーワード where, let, of のあとに{}を置きます。
2の方はdo, where, let, of の後に現れる最初の式が揃える頭になります。ですので今回はputStrLnでそろえています。

2.変数/値
変数名 = 定義
で行います。

n = 10
main = print n

なお変数は束縛され、常に定数です。Haskellの参照透過性のために再代入はできません(破壊的代入ぼそぼそ)
そして型推論で型名定義がいらないのが嬉しい。

値の表現をリテラルと言います。よく聞くのは文字、文字列リテラルだと思います。表現方法なのでどの言語も例外なくあるはずです。
ある程度のものを挙げますので触ってみましょう


やり方

Prelude>(ここに打つ)

・数値リテラル:そのまま数字打つだけ。ex.0,50
・文字リテラル:文字を ’(ここに文字を入れる)’(シングルクオート・引用符)で囲んでつかう。ex.'A','i'
・文字列リテラル:"(ここに文字を入れる)"(ダブルクオート・二重引用符)で囲むだけ。ex."taketaroλ"
さてつぎは扱える型を見てみましょう。


なお真偽値リテラルは存在しなく、True/Falseは値コンストラクタというものになっています。


3.型(前編)

すべての基本。型です。型を知れば値を制せれます。
Haskellぽい堅苦しく(?)型付けな言い方をすればデータがどこの集合に属するかというものです。

なおHaskellの型名は基本初め大文字です。ex.Int,Double....

関数や変数に型を明示的に指定するときは::(コロン2つ)で指定します。

GHCiでは:t(コロンt)で型を確認できます。
やり方

Prelude>:t(ここに打つ)

これは関数にも演算子にも言えることで&&(論理積)やnot(関数)でも試してみましょう。

おや。。。?数字や文字で(明示的以外に)やったら型以外も出てくるって?そうです、気が付きましたか。。。
IFやったことがないのならば、0や”Hello”でもいいのでやりましょう。
そうすると

"Hello"::[Char]
0::Num a=>a

とか出ると思います。

さて。

[ ]
=>

という不思議なものが出てきました。


まずひとつ目はリスト型で多相型といいます。
仲間としては、タプルやEitherなど。
具体的に言うとC++のテンプレートのようないわゆる型ジェネリックと言われているもののように柔軟に扱えれるタイプのことです。


=>は型クラスに使われるものです。(型クラス:ある型がなんかの性質を持つインターフェース。インスタンス型てきな)
=>コイツ自体は型クラス間制約といいます。これはこの型クラスでのインスタンスを作ってそれを例えば”takeはNumのインスタンスである”と言い切るために使います。
逆に言えばこれがなくてはインスタンスが作れない大切なやつです。



次は2回目中編です(まさかの後編じゃない)。最後にやった、
多相型(リストなどを)キーワードに説明していこうと思います。



Ps:テストで更新遅れました><💦

Haskell(再)入門0回目イントロダクション(環境構築)。

どうもこんにちは。結局セキュリティ記事じゃありません。Haskell(再)入門記事です。

全体で20回ぐらいに続けたいと思います。(こんな備忘録ブログだから誰も読まないだろうなぁ読んでる人いるのかなぁ。。。モチベ出すためにだれかつっこみとかコメください。。。。)
なおおそらく後半は明らかに間違えているとこなど、知らないから勉強のために書いてるなど付け焼刃感が出ると思います。

今年度中には書き終えたいですね。。。。

今回はイントロダクション。つまり僭越ながら0回目として始めましょう。大丈夫。配列だって0からだ。問題ない。
(うん。。。。?luaはから1だけど?なんのことだか。。。)


さてさて、まずは前書きとしてHaskellってなに?というところからいきましょう。

Haskellとはwikiの言葉を借りると

Haskell高階関数や静的多相型付け、定義可能な演算子、例外処理といった多くの言語で採用されている現代的な機能に加え、パターンマッチングやカリー化、リスト内包表記、ガードといった多くの特徴的な機能を持っている。また、遅延評価や再帰的な関数や代数的データ型もサポートしているほか、独自の概念として圏論のアイデアを利用し参照透過性を壊すことなく副作用のある操作(例えば 代入、入出力、配列など)を実現するモナドを含む。このような機能の組み合わせにより、手続き型プログラミング言語では記述が複雑になるような処理がしばしば簡潔になるばかりではなく、必要に応じて手続き型プログラミングを利用できる。

だそうです。

さて高階関数?静的多相?カリー化?美味しいの?となる方がほとんどでしょう。参照透過?ファッ!?圏論
もう入門としては敷居が高いですね。
記事書く私でさえ圏についてはよく知りません。


一応さっきの言葉の解説として
高階関数:
関数を引数にしたり、関数を戻り値としたりすること。
いわゆるクロージャなどですね。
ちなみに関数がファーストクラス(第1級)である関数型(HaskellやML)やSwift,JavaScriptといったプログラミング言語で実装されます。

静的多相型付け:
オブジェクト志向などポリモーフィズムという言葉で多くの方は聞いたことがあるのではないでしょうか。それのことです。
平たく言うと型システムの性質を表す言葉で、複数の型に属することを許すという性質を指します。
多様性という言葉が多く使われますね。ちなみに対義語はモノモーフィズム、単態性だそうです。

カリー化:
高階関数と一緒に覚えましょう。「複数の引数をとる関数を1変数関数に置き換えることをカリー化!。」
(つまり関数の引数を減らすことですね。)
参照透過:
 簡単にいうと必ず同じ結果になる完全性。ちなみにこれが理由でHaskellでは変数に再代入ができません。これを純粋関数型言語と呼んだりします。

圏論:
説明できないんで
東大 理学部情報科学科/大学院情報理工学系研究科|情報科学科NAVIgation
を読んで(面目無い)。Haskellモナドの根底にあるもの。



さて本題の環境を作るところから始めましょう。



HaskellコンパイラとしてはGHC(Glasgow Haskell Compiler)とHugsが有名です。
エディタのプラグインはどこのでも(atomとかVimとか)、どんな環境でも(OSを選ばない)つくれます。
簡単にやる方法はネット上にいっぱいあるので私の好きな環境を載せたいと思います。
状態としてはSublimeHaskellです。

1: Haskell Platform(処理系)をいれる。
Download Haskell Platform

2:SublimeText入れる
http://www.sublimetext.com/

3:SublimeTextの日本語化などパッケージコントロールをいれる
MacOSX - MacでSublime Text 3のインストールと日本語化メモ - Qiita

4:SublimeREPLをインストール
”Package Conreol:Install Package”を選択します

 SublimeREPLを選択します。
[Preferences]->[Package Settings]->[SublimeREPL]->[Settings - Default] の

>"default_extend_env": {},

に PASSをいれる。ここにはGHCi.があるディレクトリを指定。

5.FluentREPLのインストール
 Haskellソースを書いた後つかうもので、保存と同時にghciにロードするプラグインFluentREPLをインストールします。
 こいつはどうやらF#とかClojureにも対応してるとか。
 インストール方法は
https://github.com/zaneli/FluentREPL

英語だけどグーグル翻訳でみれば大丈夫でしょう。

6: 動作をみる
コードを書いたら保存。そうするとGHCがつかえるでしょう。

こんな感じでIDEができちゃいます。
記事に間違いがあれば連絡ください。
今回はここまで。次は実際にコードを書いていきますお楽しみに。

参考にすべきサイトmomocus.hatenablog.com
Setup Sublime Text as Haskell IDE