フォト
無料ブログはココログ

プログラミング

2020年11月15日 (日)

テキストプログラミング <大人の先入観で決めてはならない>

「テキストプログラミングは小学生には難しいは大人の思い込み」松田孝氏 ReseMom.biz (2020/10/29)

★重要なことは、大人の先入観で決めてはならないということ。誰にとっても、ビジュアルプログラミングよりテキストプログラミングが良いわけではない。

松田孝氏は、

 大人は、テキストプログラミングは小学生には難しいと考えがちだ。しかし、松田氏はこれは大人の思い込みだという。松田氏の経験から、子どもたちは「テキストプログラミングはかっこいい」といい、ビジュアルとテキストを選ばせると「テキストをやりたい」という子どもが多いのだという。「子どもたちは、実はゲームを通してキーボード操作に慣れている。文字の入力に慣れていないのは、トレーニングしていないから。最初はキーボード入力できなくても、子ども同士の学び合いで身に付けていくのです。もうひとつ、3年生からはローマ字を習い、英語活動が始まります」と説明し、「そういう意味からも、テキストプログラミングはこれからの時代にマッチしていると思います」とする。

とおっしゃる。そのとおりだと思う。昔のマイコン少年はテキストプログラミングしか選択肢がなかったが、ちゃんとプログラミングしていた。

 Scratchなどビジュアルプログラミング言語でプログラムを書くときに、ちょっと凝った構造にすると構造がわかりにくくなる。

 例えば、↓はネコが矢印キーで動く方向を変えるプログラムだ。がデフォルトの大きさの場合は下が切れるのでスクロールしなければ全体が見えない。

Blockeditor1

全体が見えるまで縮小する機能(マイナスの虫眼鏡)はある。しかし、当然小さくなる。

Blockeditor2

これより複雑な構造をプログラムを書いているのを見ると感心する。「うまく動かないんです」と相談を受けたときに、肩越しに画面を見ただけで構造を理解するのは大変だったりする。

 Scratchで書いた立派なゲームが公開されているが、コードを見るとすごく不雑で構造が分かりにくい。自分がこの量のコードを書くなら、とてもブロックエディタでは書く気になれない。

 昔のエディタは25行とか40行だった。関数や手続きなど一まとまりの処理は1画面に収まるように書けと言われていた。条件分岐や繰返しなどの構造が画面跨ぎになってスクロールしなければ処理の全体が見えないコードは格段にバグが増える。

 そう考えると、ビジュアルプログラミングでブロックエディタを使う場合は簡単なサンプルくらいのシンプルなプログラムを書くくらいがちょうど良くて、プログラミングに興味を持った人には、テキストプログラミングを教えた方が良いと思う。

★重要なのは、ビジュアルプログラミングよりテキストプログラミングが良いわけではないということ。

 人それぞれに向いたプログラミング環境があるのだ。さらに、プログラミングより、絵と絵を動かすことに興味がある子には、複雑なコードを書いていてもScratchが良いのだ。 大人の先入観で決めてはならないのだと思う。


最近の投稿】【プログラミング】【2019の投稿】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2020年10月27日 (火)

Scratchの疑問

 Scratchのサンプルをみていると、疑問に感じることがある。

疑問1:「ずっと」ブロック

 とりあえず「ずっと」ブロックを使ってその中で処理を行っているサンプルをよく見かける。疑問は、なぜ、ずっとブロックの中で終わるのか? である。
例えば↓のようなサンプルだ。

Forever

このプログラムの意図は「スプライトが端に触れたら止まる」であろう。そうであれば、繰り返し処理は「ずっと」ではなく「<>まで繰り返す」が適当だろう。

While

そういえば、「ずっと」繰り返すの意味や、「ずっと」と「<>まで繰り返す」の違いを説明しない。

Forevervsuntil

「ずっと」ブロックの意味を説明しないから、学習者がサンプルを改造するときに、よく間違う。学習者に子供が多いからといってもちゃんと説明すべきだと思う。

 NHK for Schoolの「Whyプログラミング」では、スクラッチを始めよう。(04:54あたり)で「ずっと」ブロックを説明している。

疑問2:イベントドリブン

 Scratchはイベントドリブンで書けるようになっている。
ところが、↓のようなサンプルを見かける。

Forever2

「ずっと」ブロックの中で押されている↑↓→キーで条件分岐している例だ。
どうしても条件分岐を使いたいなら、わからなくもないが、キー押下はイベントが用意されているので↓のように書くとスッキリする。

Evantdriven


Scratchの「全てを止める」ブロックは、イベントの発生まで止めないので、↑の例では、スプライトが端に触れると移動は止まるが、↑↓→キーで向きは変わる。ちょっとハマってしまった。


最近の投稿
最近の投稿】【プログラミング】【2019の投稿】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2020年10月14日 (水)

ルビィのぼうけん

ルビィのぼうけん リンダ・リウカス作 鳥居雪訳

Photo_20201010213401

 この絵本は、新しいことを覚えるのが好きな女の子、ルビィ(Ruby)、変わり者と呼ばれているペンギンたち、孤独が好きな雪豹(Snow Reopard)、ときどきオジャマ虫を育てている狐、カップケーキを作っているロボット、ニシキヘビがペットのジャンゴが登場する。

 IT業界にいる人は思わずニヤリとしてしまう。 そうそう、仕事で旅行にでかけているルビィのお父さんの写真は、まつもとさんに似ている。 もし、主人公がパールちゃんだったら、おばさんだから、物語が変わってしまう。

 この絵本は、リンダ・リウカス氏は子どもたちが「プログラマー的思考」ができるようになるために書いたようだけど、文科省がはじめた「プログラミング教育」の「プログラミング的思考」で参考にされているようだ。

 この本の「プログラマー的思考」にある要素のうち、「プログラミング的思考」で扱いにくい要素があるようだ。
「データ構造」「抽象化」「関数(一般化)」「デバッグ」が扱いにくく、「シーケンス」「小さく分ける(分解)」「ループ(繰り返し)」「アルゴリズム」は扱いやすいようだ。

 大人向けの部分に書いてある、「れんしゅう1」から「れんしゅう22」までのすべての要素を継続的に教えると「プログラマー的思考」ができるようになるのだけど、一部それも単発では「プログラマー的思考」は無理だと思ってしまう。

閑話休題

 大人向けの解説に↓こんなのがある。

Algorisms

 最近モヤモヤしていたことだ。

 プログラミング教育でよく使われる、code.orgの古典的な迷路(angry birds)アルゴロジックはアルゴリズムを題材にしたものだ。 これらサイトでは正解すると少ないステップ数があることが示される。

 それはそれで良いのだけれど...少ないステップ数のアルゴリズムの方が良いアルゴリズムと教える人がいる。

2s

↑これより、↓これの方が良いのだと。

1s

「ルビィのぼうけん」の解説にあるように

異なったアル ゴリズムは、それぞれの用途によって使い分けるものです。

なのだ。

 一般的には、簡潔なアルゴリズムの方が最適であることは多い。しかし、プログラムを高速化するときに、ループを展開して順次処理にするのは常道だから、簡潔なアルゴリズムがいつも最適とは限らない。

 状況や場面によって最適のアルゴリズムは異なるから、状況や場面に合わせて選択しなければならない。 だから、複数のアルゴリズムを考えられる、頭の柔らかさ、発想の柔軟さがとても×2重要だ。

 教える人は、迷路の問題のアルゴリズムを教えるときに、「最小ステップが最適だ。」ではなく、「少ないステップにするにはどうしたらよいか?」という問いかけが必要なのだと思う。


最近の投稿
最近の投稿】【最近の書籍・雑誌】【プログラミング】【2019の投稿】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2020年9月15日 (火)

micro:bit <BLEが乗った低価格マイコンボード>

ずいぶん前に買ったmicro:bitを出してきた。

Microbit_set

micro:bitは英BBCが作った教育用マイコンボードで、英国では2015年に11歳と12歳の小学生全員に無料で配布したらしい。

マイコンボードとしては、(https://tech.microbit.org/hardware/)

  • CPU:nRF51822 Cortex-M0 ROM:256kB RAM:16kB Clock:16MHz Bluetooth4.1内蔵
  • DAPLink:MKL26Z128VFM4 Cortex-M0+
  • IO:5x5LED, SWx2, SPI, I2C, GPIOx18(LED,SW,SPI,I2C排他使用)
  • Sensor: 3軸加速度センサー、地磁気センサー、温度センサー(on chip), 明るさセンサー(LED使用?)

マイコンボードとして見ると盛りだくさんで、¥2,000はお買い得かもしれない。


Microbit_rea


Microbit_front

プログラミング環境はOnlineで提供されている。(https://makecode.microbit.org/)
教育向けを謳っているだけあって、ブロック型ビジュアル・プログラミング環境が公開されている。
困らないくらいブロックは揃っているが、文字でプログラミングしたいと言う人向けにjavascriptでもプログラムが書ける。

micro:bitの最初のプログラムは、Lチカでなくハートマークを点滅させるらしい。

Microbitidem

これくらいなら、ブロックエディタで書けるけど、ちょっと大きくなるとブロックエディタでは見通しが悪くなる。

ダウンロードのリンクをクリックすると、HEXファイルがダウンロードされる。micro:bitにはDAPLinkが乗っているので、ダウンロードされたHEXファイルを"MICROBIT"という名前のドライブにコピーすることで、micro:bitに書きまれる。

左にシミュレータがあるので、micro:bitを書き換える前に動作を見ることができる。

ところで、このIDEはHEXファイルを読み込むと、プログラムを編集することができる。HEXファイルはバイナリデータなのになぜプログラムを復元することができるのか不思議だ。 HEXファイルの中にプログラムが書いてあるのかと思い覗いてみたが見当たらない。

調べてみると、micro:bitはMicroPythonで動いていて、IDEでダウンロードされるHEXファイルには、MicroPythonインタプリタのバイナリとMicroPythonのスクリプト(中間言語?)が入っているらしい。IDEはHEXファイルを読んでMicroPythonのスクリプト部分を読み出しているようだ。

関数も使えて、再帰呼び出しもできるようなので、5Queenをやってみた。深くなるとスタックが足りなくなるようだ。

blutooth LEがオンチップで乗っているので、micro:bitのセンサーの値をスマホやPCに送って処理させたり、スマホやPCからmicro:bitを制御したり、micro:bit同士でメッセージが送受信できる。


最近の投稿】【最近のCPUボード】【最近のプログラミング】【2017の投稿】【2016の投稿】【2015の投稿

2020年8月18日 (火)

なぜ大学生はプログラミングが上達しないのか <技術者としての観点>

なぜ大学生はプログラミングが上達しないのか Qiita (2020/08/11)

 現役大学生による、大学生がプログラミング上達しない理由について考察した投稿。

実際、私の友人を何人か思い浮かべてみてもほとんどの人が簡単な計算程度のプログラムしか書けないと思います。

しかし、ほとんどの学生がエンジニア志望なのです。

らしい。

まず、

 日本人は技術に携わる人を技術者と一括りにするけれど、欧米では、エンジニア、テクノロジスト、テクニシャンに区別しているそうだ。 エンジニア、テクノロジスト、テクニシャンで求められる知識と技能のレベルは異なる。

 どのレベルを想定しているのだろうか? ひょっとして、プログラミング・スキルではなく、プログラミング言語でのコーディング・スキルを習得しようとしているのではないだろうか。

 職業プログラマーの多くはテクニシャンだ。職業プログラマーになるならコーディング・スキルは必須だろう。そして、コーディング・スキルを習得するなら、専門学校のような技能習得を目的にした教育機関のほうが良い。20時間程度でコーディング・スキルを習得するのは極めて難しい。

プログラミングの目的

 プログラミングの目的はコンピュータを使って問題を解決することだ。そして、問題を解決する手法としてコーディングがある。

 プログラミング講義のゴールは、プログラミングで問題を解決できるようになることだろう。 だから、正解があってそれを教えてもらうものでもなく、記憶するものでもない。

 プログラミングで解決できる課題は、身の回りのそこら中にある。ICTの発展で、「こうだったらいいのにな~」という妄想(課題)も解決できることが多くなってきた。

上達しない原因

 筆者は、上達しない要因として、

  1. 講義時間が少ない
  2. アウトプットの時間が少ない
  3. テストは筆記試験が多い
  4. 大学は研究をする場所
  5. アルゴリズムの勉強が多い
  6. 日常に活かせる機会が少ない(地方学生)
  7. 課題に追われて自習の時間がない
  8. 学んでいる内容が何に活きるのかがわからない
  9. コードのレビューをしてくれる人が少ない
  10. 受け身の学生が多い

を挙げ、「10.受け身の学生が多い」ことが最大の要因と結論付けている。

 しかし、深刻かつ重大な問題は「8.学んでいる内容が何に活きるのかがわからない」と思っていることではないだろうか。

 学んでいる内容が何に活きるのかがわからないのは、生活の中に課題が見付けられないのかもしれない。 その姿勢は技術職として致命的だ。

 1週間寝ないで作業したら解決しそうな課題が見当たらないとか、その解決方法が人海戦術しか思いつかないなら、技術者は不要なのだ。

経験では

 今から40年前に20歳を過ぎてから独学でプログラミングを始めた。 プログラミング・スキルは、60年生きてきて、最も役立ったスキルだ。自転車に乗れることより役に立つかもしれない。プログラミング・スキルを習得したら、1週間寝ないで作業しなければできないような作業が1日できるようになる。

 プログラムの学習を始めた頃は無線関係の仕事をしていたのでITとは関係がなかった。当時、プログラミングで最初に解決した課題は、3次混変調積が発生する組み合わせの検索だった。周波数A,B,Cが2A-B=Cとなる関係にある場合に、AとBの周波数の受信レベルが大きくなると、受信機内部で周波数Cが発生するので、この3波の組み合わせは使わないようにしなければならない。 使用している周波数が多い場合はこの組み合わせを調べるために多くの計算が必要になる。

 つまり、計算自体は四則演算だが計算量が多い問題だ。候補がn個の場合、計算量は単純化すると nP(n-3)で、候補nの3乗くらいで増えるから、人力で計算できる候補は限られる。その結果、予想外の混信が発生するのである。

 このプログラムを作って夜通し回したら、作業量は1/10以下になって、10倍以上の候補まで検索できるようになった。

 プログラムは簡単な計算程度のプログラムである。そして、職業プログラマでなくても、プログラミングで問題が解決できるのである。

重要なことは、

 プログラミングで解決できる問題を見つけることだ。そのために、プログラミングを学ばなければならない。


最近の投稿】【プログラミング】【2019の投稿】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2019年2月 8日 (金)

プログラミング教育

 60年足らずの人生だけど、最も獲得してよかったと思う能力はプログラミング能力だと思う。

 技術系の仕事ではプログラミング能力は必須だ。 しかし、職場の研修やOJTで、教育やトレーニングしようとするとなかなか難しい。

 職場でのプログラミング教育の問題は

  • プログラミング能力獲得の目的があいまい
    誰もが職業プログラマになるわけではないから、手段としてのプログラミングを教えるべき。
  • 講師がプログラミング能力獲得方法を形式知化していない
    プログラミング能力を持っていても、その能力の獲得方法を形式知化していない者は他人に教えられない。 

ことだと書いた。(プログラミングの講義(2019/02/01))

 この問題は、これから始まる小学校で始まるプログラミング教育でも言えることかもしれない。

 唐突だけど、

 プログラミングの技能を車の運転に例えるなら、多くの人は問題を解決するための手段として運転技能を獲得している。 問題解決とは、目的地に移動するためや荷物を運ぶためとか趣味としてのドライブとか。

 もちろん、バス・タクシーの運転手、トラックの運転手、F1ドライバーなどの職業ドライバーになろうとすると一定レベル以上の運転技能が必要なことは言うまでもない。 職業ドライバーには、安全に運転する、操縦しにくい車を運転する、速く運転する技能が求められる。

 それらと比べて、普通の人は最低限の運転技能があればことが足りるということ。

 普通の人にとって重要なのは、どこに行くのか、なぜ行くのかだ。 そして、車で移動することが合理的であれば運転する。 当然、徒歩や列車で移動することが合理的なら車は運転しない。

 プログラミングに置き換えると、必要のないコーディングはやらない。アプリケーションソフトで問題が解決できるならアプリケーションソフトを使う。 Excelのような汎用ソフトを使うことが合理的ならば汎用ソフトを使えばよい。

 重要なことは、

 どの問題をプログラムで解決するのかを分析すること。 解決手段(既製アプリ、アプリ作成)を考えること。 そして、プログラミングが必要であればアルゴリズムを考えることだ。

 注意しなければならないことは、

 趣味で車を運転する人がいるように、趣味でプログラミングしている人がいる。
プログラミングすること自体が目的の人だ。 このような人に、教えてもらうときには注意した方が良い。 プログラミングは手段ではなく目的だからなぜプログラミングが必要かは教えてくれない。

 さらに重要なことは

 それと、何か聞いてみて、ちゃんと言葉で説明できない人は、人に教えることができないと思って間違いない。 プログラミング言語は曖昧さを排除した言語だ。 母語で明確に説明できない人は抜けのないアルゴリズムを考えられないし、正確なコーディングができないと思って間違いない。


最近の投稿】【最近のプログラミング】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2019年2月 1日 (金)

プログラミングの講義 <言語仕様とIDEの使い方ではない>

 ★ 言語仕様の解説と開発環境(IDE)の使い方と例題を体験するだけで良いのか?

 プログラミングの講義を頼まれた若い人が集まって実習をどうするか話していた。
聞くとはなしに聞いているとなかなかまとまらないようだ。割り当てられた短い時間で、プログラミングができない人をプログラミングができるようにすることはかなり難しい。

 話している人たちは職業プログラマーではない。
もっぱら作業を自動化、効率化するためにプログラムを作っている人たちだ。

 講義する相手も職業プログラマーではない。
作業を自動化効率化する手段として、プログラミング能力を獲得したい人だ。

〇教えることを言葉や図表にして説明できるのか?

 「君達はどうやってプログラミングができるようになったの?」と聞いてみた。
Hello wordを教えてもらったあと、課題を与えらえてクラスメイトと一緒に試行錯誤して覚えたらしい。

 なるほどスパルタだ。

 おそらく、体系だって教えてもらったのではなく、試行錯誤の中から学んだのだろう。
試行錯誤して学ぶことは重要だ。しかし、試行錯誤の結果は暗黙知になることが多い。
そして、暗黙知を伝えることは難しい。

 技能を伝えようとすると、言葉や図表で表すことができる形式知にする必要がある。
彼らが教えてもらった教師も、プログラミング能力の獲得方法が形式知化できていないから、言語仕様だけ教えて、後は課題を与えることしかできなかったのだろう。

 教えてもらっていないことは、教えることができないのだ。

 自分がプログラミングできるようになった過程を、言葉にして説明するか文書にしてみると良いとアドバイスした。

★ 暗黙知は形式知化しなければ伝えることはできない

〇 問題解決手段としてのプログラミング

 ソフトウェア開発が主業務ではない人がプログラミングするときの手順は

  1. 問題を分析
  2. プログラムで解決する問題の明確化
  3. アルゴリズムの決定
  4. コーディング
  5. テスト(不合格なら前に)
  6. 評価

だ。 業務でプログラムを作っていない人や、1人でプログラミングしている人は、上記のステップを意識していないことが多い。

 分業しようとするとステップ間で、決定事項を誤りなく伝えなければならないから、それぞれのステップでアウトプットを明文化することが必要で、そのために、共通のフォーマットや図表が必要になる。

 要件定義書とかプログラム仕様書は分業する上では重要で必ずアウトプットする必要がある。 しかし、1人でプログラミングする場合には途中のステップでアウトプットするのは面倒だし、このステップを意識していないことも多い。

 良く言えばアジャイル型開発だが、そもそも、それぞれのステップが渾然一体となっているので分離することができないだけとも言える。

 プログラムは作れるけど、特定の言語や特定の開発環境にこだわる人はたいていこのタイプだ。 このタイプの人は、プログラミングの過程を形式知化できないので、人に教えることができない。

 プログラミングの講義と言いながら教えていることが、開発環境の使い方だったりする。 さすがにこれだけでは役に立たないので例題を与える。 具体的な質問をすると具体的に教えてくれるが、抽象化していないので応用が効かない。

 つまり、教えられる人はいつまでたってもプログラミングできるようにならない。

 そういえば、彼の案件も言語が指定(C#)されている時点で怪しい。C#とVisualStudioの使い方を教えてお茶を濁そうとしているのか?
 言語仕様と開発環境は誰かが形式知化しているから人に教えることができる。 そのほかの部分が形式知化できていないので他所に振ったのか?

★ プログラミングを教える人は暗黙知を形式知化すること

〇 教えることは、言語仕様や開発環境の使い方なのか

 言語仕様を教えたらプログラミングができるようになると思っている人が残念ながらまだいる。コーディングとプログラミングを混同しているのだ。だから、プログラミングの講義の内容が言語仕様と開発環境の説明になったりする。

 職業プログラマーでもなく仕様をプログラミング言語で記述するコーダでもなく、欲しい能力は、問題を解決する手法としてのプログラミング技能という人は多いだろう。

 つまり、すべての人に職業プログラマが必要とする知識・能力が必要ではなく、与えられたり発見した問題を分析して、問題を解決するアルゴリズムを考えて、場合によってはプログラミング言語を使用してソフトウェアを作ることが求められている。

 だから、多くの人にとって、言語仕様やIDEの使い方はプログラミングの極々一部の些細なことで大したことではない。

★ 「プログラミング教育=言語仕様、IDEの使用方法の説明」ではない!

 もちろん講師が用意した例題を解いてみることでもない


最近の投稿】【最近のプログラミング】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2019年1月12日 (土)

awk <古くて新しいLL>

 awkを使い始めて30年。jgawk.exeをDOSで使ったのが最初だ。

 その後UNIXを使うようになった。 UNIXは設定ファイルもログもテキストファイルだからgrepやcat,cut,sort,head,wcなんかで作業するのだが、ちょっと複雑な作業はawkやperlなどのスクリプト言語(LL)を使うことになる。

 今時は何でもExcelに読み込んで処理できる。 昔は数Gbyteのログはオンメモリで処理できないから逐次処理するしかなかった。逐次処理はOneLinerが使えるかどうかで作業効率がずいぶん違う。
例えば、「httpdのaccesslogから特定の日の05:10:00~06:10:50の間のステータスコード500のアクセス元を取り出す」作業はgrep,cut,wcを使うとできるけどawkを使うと100倍簡単だ。

 当時いつでも使えるようにしていたスクリプトは

  • radiusの認証ログから特定ユーザのlogin/logoutを抜き出すスクリプト
  • UNIXタイムで記録されたsquidのログをローカルタイムに変換するスクリプト

 radiusのlogは1レコードが複数行なのでgrepでは難しい。
UNIXタイムで記録されたsquidのlogは見ただけでは日時が分からないので、サーバーのログを見るたためには必須だった。

 当時perlやgawkは全てのUNIXにインストールされているわけではなかったし、manも満足にインストールされていないことが多かったのでawkを使っていた。

awkはどのUNIXにも必ず入っているしmanも使えた。

 gawkはあるかどうか分からないから拡張機能は使わないようにしていた。 というか「プログラミング言語 awk」で勉強したので拡張機能を知らなかったりする。だから、空白でもなく記号でもない文字を表す正規表現は"\w"でもなく"[[:alnum:]_]"でもなく"[_0-9a-zA-Z]"を使っている。

Awk

 最近はUNIX=LINUXになったのawkはgawk(gnu awk)だawkもあるけどgawkへのlinkになってる。
だから互換性はあまり気にしなくても良いのかもしれない。

 プログラミングしているとアスキーコード表が欲しいときがある。そんな時に使える1liner。これまで一番多く使っている。

↓DOS/Windows

>gawk "{for(i=32;i<128;i++)printf(\"%c %02x\",i,i)}"

↓UNIX

$ awk '{for(i=32;i<128;i++)printf("%c %02x",i,i)}'

↓Enterを押すと表示される。

  20 ! 21 " 22 # 23 $ 24 % 25 & 26 ' 27 ( 28 ) 29 * 2a + 2b , 2c - 2d . 2e / 2f
0 30 1 31 2 32 3 33 4 34 5 35 6 36 7 37 8 38 9 39 : 3a ; 3b < 3c = 3d > 3e ? 3f
@ 40 A 41 B 42 C 43 D 44 E 45 F 46 G 47 H 48 I 49 J 4a K 4b L 4c M 4d N 4e O 4f
P 50 Q 51 R 52 S 53 T 54 U 55 V 56 W 57 X 58 Y 59 Z 5a [ 5b \ 5c ] 5d ^ 5e _ 5f
` 60 a 61 b 62 c 63 d 64 e 65 f 66 g 67 h 68 i 69 j 6a k 6b l 6c m 6d n 6e o 6f
p 70 q 71 r 72 s 73 t 74 u 75 v 76 w 77 x 78 y 79 z 7a { 7b | 7c } 7d ~ 7e  7f

 ところで、いまさらだけど、gawkは3.10からscketが使えるようになっていたらしい。

BEGIN {
  host = $1;
  path = "/" $2;
  http = "/inet/tcp/0/" host "/80"
  print "GET " path " HTTP/1.0\nHost: " host "\n" |& http; 
  while(0<(http |& getline)) print;
  close(http);
}

↑こんな感じで
HTTPクライアントが書ける。 (当然だけどレンダリングはできない。)


最近の投稿】【最近のプログラミング】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2019年1月 6日 (日)

cocologタイトル一覧作成awkスクリプト

 cocologにはバックナンバーのタイトル一覧機能が無い。
バックナンバーは日別、週別、月別、カテゴリー別に表示することができるけど、記事のタイトル一覧を表示させる機能が無い。

 しかたないので、毎年1年分のタイトル一覧を作成して投稿している。
さすがにタイトル一覧を手作業で作る気にはならないのでawkを使って自動的に作成している。

 ところが、毎年書いているような気がする。
スクリプト言語(LL)は気合を入れて書くもんじゃないといつも適当に書いているので、1年後に使おうとするとどうやって使うのか思い出せなかったりする。

 ということで、忘れないように今年使ったawkのスクリプトを書いておく。

 post2index.awkは1年分の記事から記事のタイトルとリンク先とカテゴリを取り出して、一覧にするスクリプトだ。

 使うのは gawkとnkf32/iconvなど。
gawkのインストール方法はくぐるとたくさん見つかる。
nkf32/iconvはあれば便利なければ UTF8toUTF16.batを使う。

〇手順

  1. バックナンバー保存
    まず、bknumディレクトリを作って、そこにcocologからバクナンバーを1月づつhtmlファイルに保存する。
    bknum \
             +bn1.html
           :
             +bn12.html
     
  2. 文字コードを変換する
    cocologの文字コードはutf-8なのでSJISに変換する。
    • cmd.exeを使うなら
      こんなバッチファイルを作って
      UTF8toUTF16.bat bknum\*.html bk_sjis.html
    • nkf32.exeを使うなら
      nkf32 -W8 bknum\*.html > bk_sjis.html
    • iconvを使うなら
      iconv -f UTF-8 -t SJIS bknum\*.html > bk_sjis.html
    • awkでもできるけどね
       
  3. 一覧に表示するカテゴリを指定する
    日付とタイトルの間にカテゴリが入るようになっている。
    ここに表示させるカテゴリはpost2index.awkを開いて

    LCATEGORY="日記・コラム・つぶやき 日 書籍・雑誌 書 映画・テレビ TV 趣味 趣 ペット ぺ"

    の行を編集する。
    表示させたいcocolog上カテゴリと表示させる文字をスペースで区切って並べる。 
  4. 一覧を作る
        gawk -f post2index.awk bk_sjis.html > index.html
  5. coclogの記事作成の[htmlの編集]タブにindex.htmlを張り付ける。
〇スクリプト
post2index.awk
#
# make index from cocolog  entry
# Dec. 2018 / Yoshi
#
# usage: gawk -f post2index.awk bknum\*.html > index.html
#
BEGIN {
    #------ ここを書き換える -----------
    YEAR        = 2018;
    LCATEGORY   = "日記・コラム・つぶやき 日 書籍・雑誌 本 映画・テレビ 映 趣味 趣 ペット ぺ"; 
    NCATEGORY   = 5;
    #-----------------------------------
    FALSE       = 0;
    TRUE        = !FALSE;
    FCATEGORY   = FALSE;
    nf = split(LCATEGORY, a);
    for (i=1; i<=nf; i+=2) {
        CATEGORY[++j,"category"]    = a[i];
        CATEGORY[j  ,"mark"]        = a[i+1];
    }
    CATEGORY[0] = j;
    year        = "";
    month       = "";
    day         = "";
    url         = "";
    title       = "";
    category    = "";
}

#
# get category url
FCATEGORY {
    FCATEGORY = FALSE;
    for (i=1; i<=CATEGORY[0]; i++) {
        if ($0 ~ CATEGORY[i, "category"]) {
            sub(/^[ \t]+/, "");
            CATEGORY[i, "url"] = $0;
        }
    }
    next;
}

/<li class=\"module-list-item\">/ { #"
    FCATEGORY = FALSE;
    next;
}

#
# stor itme list
function stor_link() {
    link[date, "url"]       = url;
    link[date, "title"]     = title;
    link[date, "category"]  = category;
    url         = "";
    title       = "";
    date        = "";
    category    = "";
}

#
# Date
/<h2 class=\"date-header\">[0-9]+年[0-9]+月 ?[0-9]+日/ { #"
    if (match($0, /[0-9]+年[0-9]+月 ?[0-9]+日/)) {
        s = substr($0, RSTART, RLENGTH);
        nf = split(s, a, /[年月日]/);
        year    = a[1];
        month   = a[2];
        day     = a[3];
    }
    date = sprintf("%04d/%02d/%02d", year, month, day);
    if (DEBUG) printf("date=%s\n", date);
}

#
# Category
/<span class=\"post-footers\">/ {    #"
    j = 0;
    for (i=1; i<=CATEGORY[0]; i++) {
        if ($0 ~ CATEGORY[i, "category"]) {
            category = category (j?",":"") CATEGORY[i, "mark"];
            j++;
        }
    }
    if (!FTWITTER) stor_link();
    if (DEBUG) printf("category=|%s|\n", category);
}

#
# make title list
#
END {
    printf("<p>%dの投稿一覧\n", YEAR);
    printf("</p>\n<p>凡例:");   
    for (i=1; i<=CATEGORY[0]; i++) {
        printf("&nbsp;%s:%s&nbsp;", CATEGORY[i, "mark"], CATEGORY[i, "url"])
    }
    for (m=1; m<=12; m++) {
        printf("</p>\n");
        printf("<p>--%04d/%02d--<br>\n", YEAR, m);
        for (d=1; d<=31; d++) {
            date = sprintf("%04d/%02d/%02d", YEAR, m, d)
            if (link[date, "url"]) {
                printf("<a target=\"_blank\" ");
                printf("href=\"%s\">",          link[date, "url"]);
                printf("(%s)",                  date);
                s = sprintf("%-" NCATEGORY "s", link[date, "category"]);
                gsub(/ /, "_", s);
                sub(/_+/, "<span style=\"color: #FFFFFF;\">&</span>",s);
                printf("[<tt>%s</tt>]&nbsp;",   s);
                printf("%s</a><br>\n",          link[date, "title"]);
            }
        }
    }
}

〇UTF-8→SJIS変換バッチファイル
 (http://scripting.cocolog-nifty.com/blog/2017/09/utf-8jis-2668.htmlを参考にしました)

UTF8toUTF16.bat
start /min /wait cmd /c chcp.com 65001 ^& ^( set /p x=""^<nul ^& cmd /u /c type %1 ^) ^>%2
start /min /wait cmd /c chcp.com 932 ^& cmd /c type %2 ^>%3


最近の投稿】【最近のプログラミング】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2018年9月21日 (金)

Bus pirate(4) <スクリプトを動かしてみる>

相も変わらず Bus Pirateで遊んでいる。

 BusPirateには組み込みscript(BASICのサブセット)がある。
terminalインタフェースではデバイスからのレスポンスを待つのは難しいが、scriptを使うとできるようになる。

 以前に買ったLED&KEYを制御してみた。

 このモジュールのLEDコントローラにはTM1638が使われている。インタフェースは、クロック(CLK)に同期したシリアル通信で、データ(DIO)は双方向だ。デバイの選択はSTBをLにする。

 英語版のデータシートは(https://www.mikrocontroller.net/attachment/332035/TM1638_V1.3_EN.pdf)にある。

 BusPirateの raw 2-wireで制御してみる。

 接続はこんな感じ↓

BusPirate
LED&KEYMOSI---DIOCLK---CLKAUX---STB5V-+-VCCVPU-+ 
GND---GND

 ビットオーダーには注意が必要だ。SPIやI2CはMSBから送るMSB-firstだがTM1368はLSBから送るLSB-firstだから、"L"コマンドでビットオーダーを切り替えなくてはならない。

 ↓実行結果

HiZ>m 6 1 1 ← raw 2-wire R2W (spd hiz)=( 0 1 )
Ready
2WIRE>WPLc ← PowerON,PullUP,LSBfirst,ctrlAUX Power supplies ON
Pull-up resistors ON
LSB set: LEAST sig bit first ← "L"command a/A/@ controls AUX pin ← "c"command 2WIRE>v
Pinstates:
1.(BR)  2.(RD)  3.(OR)  4.(YW)  5.(GN)  6.(BL)  7.(PU)  8.(GR)  9.(WT)  0.(Blk)
GND     3.3V    5.0V    ADC     VPU     AUX     SCL     SDA     -       -
P       P       P       I       I       I       O       I       I       I
GND     3.29V   5.02V   0.00V   5.02V   H       L       H       H       H
2WIRE>a 0x40 A ← DataCommand: WriteRegister,AutoIncremet AUX LOW
WRITE: 0x40
AUX HIGH
2WIRE>a 0xC0 ← AUX←L、AddressCommand: 00h AUX LOW
WRITE: 0xC0
2WIRE>  0x76,0x00, 0x79,0x00, 0x38,0x00, 0x38,0x00 ← "HELL" WRITE: 0x76
WRITE: 0x00
WRITE: 0x79
WRITE: 0x00
WRITE: 0x38
WRITE: 0x00
WRITE: 0x38
WRITE: 0x00
2WIRE>  0x3F,0x00, 0x40,0x01, 0x40,0x01, 0x40,0x01 ← "O---"
WRITE: 0x3F
WRITE: 0x00
WRITE: 0x40
WRITE: 0x01
WRITE: 0x40
WRITE: 0x01
WRITE: 0x40
WRITE: 0x01
2WIRE>A ← AUX←H AUX HIGH
2WIRE>a 0x8A A ← DisplayControl: DispON AUX LOW
WRITE: 0x8A
AUX HIGH
2WIRE>

BP-HELLO

 表示を動かそうとするとコマンドを何回も入力しなければならないので、scriptで動かしてみる。

 BusPireteのscriptはBASICのサブセットなので制限がある。

  • 数値は10進数だけ。16進数は使えない
     "="コマンドで10進、16進、2進の変換ができるので、10進数にする。
  • 変数への代入はLETを使う
     ×A=10、〇LET A=10
  • "DATA"、"READ"コマンドはあるけど"RESTOR"コマンドが無い
  • AUXピンが制御できない
     "AUXPIN 0"でAUXピンが制御できるはずだが、CSしか制御できない(BUG?)
  • "SEND"コマンドのビットオーダーは常にMSB-First
     ターミナルコマンド"L"を引き継がない。

 AUXピンが制御できないのは致命的だ。 仕方がないので、ターミナルコマンドでDataCommand(40h)、DispContorl(88h)を送っておいて、表示データをscriptで送ってみる。

 ↓ターミナルで送るコマンド

m 6 1 1 ← raw 2-wire
WPLc ← PowerON,PullUP,LSBfirst,ctrlAUX
a 0x40 A ← DataCommand: WriteRegister,AutoIncremet
a 0xC0 ← AUX←L、 AddressCommand: 00h

 scriptを例えば"hello.bas"というファイル名で保存しておいて、ターミナル・ソフトのファイル送信機能でBusPirateに送ると簡単。 BusPirateが処理する時間を確保するために行当たり500msの時間待ちしている。

 scriptはこんな感じ↓

hello.bas
10 FOR I=1 TO 100
20   GOSUB 1000
30   DELAY 100
40 NEXT I
50 END
999  REM Disp HELLO
1000 IF I<50 THEN SEND 0
1010 IF I<50 THEN SEND 128   
1020 SEND 110
1030 SEND 0
1040 SEND 158
1050 SEND 0
1060 SEND 28
1070 SEND 0
1080 SEND 28
1090 SEND 0
1100 SEND 252
1110 SEND 0
1120 SEND 0
1130 SEND 128
1140 SEND 0
1150 SEND 128
1160 IF I<50 THEN SEND 0
1170 IF I<50 THEN SEND 128
1180 RETURN

↑SENDコマンドで送る数値はビットオーダーを変えてある。 例えば1020行の SEND 110は、表示したいパターンは01110110(76h)なので、01110110b→01101110b→6Eh→110を送る。

 scriptでLSBから1bitづつ送るようにすれば、いちいち変えなくてよいのだがどちらも面倒。

↓動いているところ。

Bphello_1

ダウンロード BP-HELLO.mp4 (1110.6K)

↑途中でメッセージが移動する方向が変わる。

 待てよ、AUXではなくCSを使えばいいじゃないかと気が付いた。

###

この記事に書いた制限(BUG?)は↓のFirmware固有のものかもしれない。

HiZ>i
Bus Pirate v3b
Firmware v5.10 (r559)  Bootloader v4.4
DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8)
http://dangerousprototypes.com
CFG1:0xF9DF CFG2:0x3F7F

最新のFirmwareにアップデートしてみるか



最近の投稿】【最近のCPUボード】【2017の投稿】【2016の投稿】【2015の投稿

2020年12月
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          

最近のトラックバック