みなさんこんにちわ、こんばんわ

SAIです。

 

お盆休みですね。

SAIもお盆休みに突入しました。

 

画像認識をするということで、

実績のある方法をトレースすることで試してみたいと思います。

 

色々参考になりそうなサイトを眺めていたのですが、

どうも動かしている言語がPythonという言語のサンプルが多そうです。

 

検出方法に関してはOpenCVが多そうですね。

 

とりあえず、

Python これは、SAIの知らない言語です。

 

 

実装するにあたりPythonという言語を

SAIが理解できなければ、話になりません。

 

 

まずは、PythonをSAIが理解できるか?

この判断が必要そうです。

 

SAIが知っているのは、

1990年代のBASIC(手続き型)

 PC98やベーシックマスターで使ってましたね。

2000年代のC言語(手続き型)およびC++言語(オブジェクト指向 )

      、そしてJava(オブジェクト指向 )

 これらは仕事として使っていましたので、それなりに知識はあります。

 

そのほか、おまけ程度に、CAPLとかマニアックなのもいくつか知っていますが、

この程度。

 

最近?の言語(C#とかRuby)とかはよく知りません。

 

調べてみると、Pythonは(オブジェクト指向 )型の言語だそうですね。

 

理解には苦しまなさそうな気がします!

 

 

Pythonの勉強によさそうなサイトを探していると、

Python Japan (www.python.jp)というサイトを見つけました。

ゼロからのPython入門講座 - python.jp

 

このサイト、公式化と思いきや、

 

>Pythonの公式サイトではなく、Pythonを開発する Python Software Foundation とも無関係です。

 

とのことで、個人のサイトのようですが、

とても良い教科書で助かりました。

(手続き型言語としての教科書です。)

 

C/C++言語との決定的な違いは、以下のような気がしてきました。

 

C言語の構文やサブルーチンは{}でくくることで判断し、

インデントに関してはプログラマのセンスに任されている。

------------------------------------------------

if((a==b) && (a>0))

{

// a=b and a>0 の時の処理 ---- 同一インデントで書いてもいい

printf("a=b and a>0");

}else if(a<b)

   // a<bの時の処理 ---- インデントをした方が見やすい

   printf("a<b");

{

}else{ printf("a>=b"); } // a>bの時の処理 1行に無理やり書いてもいい

 

------------------------------------------------

Pythonは、

構文やサブルーチンはインデントの階層により行う。

 -> インデントが超重要!な言語といえそう。

===============================================

if a=b and a>0 :  

    print("a=b")    a=bの時の処理 ---- インデントを1層増やさないとエラー

elif a<b:  

   printf("a<b")

else :

   printf("a>=b"):

# ifと同じインデントの処理が書かれた、elseの終了

 ===============================================

 

どうやら、

ネストでインデントをしっかりすれば、コードが見やすくなる

という思想で作られた言語のようですね。

 

また、PythonはC言語のようにメモリ管理をしなくてよく、

初心者でも扱いやすい言語ともいえそうです。

 

ぶっちゃけ、変数は作ったら作りっぱなしでよい言語

といえるでしょう。

 ⇒組み込みには向いてなさそうだなぁ・・・

 

SAIはこの考え方嫌いですね。

特に、メモリ枯渇にうるさい組み込み系では問題になるんだよね。

(だから、Android 1.6くらいの初期にJavaを使いたくなくなった)

 

 

そしてもうひとつ。

SAIの知っている言語のうち、

BASICはともかく、他の言語は{}が主体の言語です。

 

SAIにとっては読みにくい(汗)

 

とはいえ、基本的なチュートリアルをやってみたところ、

全く理解できない訳ではなさそうです。

 

 

概念を覚える、遊びで使う分には問題ないでしょう。

 

 

ということで、

3時間くらい?かかりましたが基本学習しました。

 

後は、実践で覚えようと思います。

 

続く。

 

晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ

雑談

組み込み系って、メモリを大切にしないと、メモリ枯渇でNewに失敗して

適切な処理をしていないと、最悪リセットするんですよね。

 

C++で携帯電話を作っていた時、

プロジェクトが大きいため、

機能によっては割と初心者的なエンジニアや、PCソフト上がりのエンジニアも

参画していたんですよね。

 

メモリの仕組みを理解しきれていないためか、

newとdeleteを繰り返したことによりメモリの断片化が発生

⇒挙句、メモリ領域としては空き領域が沢山あるはずなのに、

 連続領域としてメモリが取れないなんてことが発生して

 リセットするというパターンを何度か見てきました。

 

Javaはメモリを管理しない代わりに、

メモリが足りなくなるとガベージコレクションが走りますね。

ただ、故意的にガベージコレクションを動作させないと、

パフォーマンスを必要としているタイミングで走ってしまう危険性もあるんですよね。

 

そして、参照なのか実態なのかよくわからない状態で、

必要なメモリをコピーと間違えて破壊する初心者が現れる訳です。

 

SAIが携帯電話開発者として働いていたころは、

携帯電話というものは、緊急時に電話が掛けられなければ、命に係わる。

フリーズなんてありえない!

ということで、堅牢に作りなさいと言う風潮でした。


そんなわけで、SAIは組み込みの仕事でJavaを使いたくない

というか、アドレスがわからないので、メモリを破壊されたときに

解析が超面倒なんですよね。

特に、自動変数が壊されると、アドレスが不明なので解析なんて最悪です。

 

Javaはお遊び専用言語と解釈した理由がそこにあります。

 

今のスマフォは平気でフリーズやアプリ再起動しますね。

スマフォは、携帯電話ではなくモバイルPCという認識なのですかね。

 

若いPCを触ったことがある世代が増えたことで

そういうもんだという認識が広がってくれたのかもしれません。

 

そういう時代なら、

Javaで開発してもいいかな。。

 

晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ

 

SAIでした。