たつをの ChangeLog

554 件 見つかりました。

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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 [ 次へ ]

オゾボット(ozobot)を使ったプログラミング学習コース「CODEPOWER KIDS」のモニターをしています。

ozobot

オゾボット(ozobot)は小さいロボット。
タイヤ二つと下向きの光学センサーがあり、黒い線にそって進みます。
赤、緑、青、黒の組み合わせパターンで命令を与えることもできます。

オゾボットが黒い線を移動しながら途中に書かれた4色の命令パターンを読み込んで実行。
つまりは、紙とペンだけでプログラミング(ロボット制御)ができるってことなのです。

開封してなんの準備もなくすぐに使えるという、この手軽さはすごい!
電源入れて線の上を走らすだけですから。
(もちろんUSBケーブル経由での充電はしましたが)

また、Scratch 風にプログラムを書いて動かすこともできます。
タブレットなどで作ったプログラムはオゾボットの光学センサー経由で転送する仕組み(未体験)。
ケーブルや bluetooth とかだと何かしらのトラブルが懸念されるけど、このデータ転送方式ならシンプルで安心です。
データ量が少ないならこれでいいよなあ。


§

週末に、とらちゃん(小5息子)と「CODEPOWER KIDS」のワークブックを見ながら初体験。
動画での説明をみて、ワークブックに黒い線を描いたり、命令パターンシールを貼ったり、命令パターンを手書きしたり。
内容は小学校高学年には簡単ですが、実際に命令通りに動くのを見て楽しんでいました。



導入としては良い感じ。
これなら本格的なプログラミングまで進めそうです。

ozobot ozobot ozobot

「CODEPOWER KIDS」では、この先 Scratch 風プログラミングなどに進み、最終的に JavaScript 言語の導入まで行くみたい。
ここらへんはプログラマーである私としても非常に気になるところなのですが、先走らずに子供と一緒に進めながらレポートして行きたいと思います。

ということで、しばらくの間、ときどき ozobot 関連記事をアップしていきますのでよろしくお願いします。

§

なお、「CODEPOWER KIDS」では命令シールが付いてきたのですが、オゾボット単体で購入すると付いてないそうです。こういう命令ごとのパターンシール。

ozobot

手書きもいいけど、シールがあれば楽です。で、ちょうどそのシールのプレゼントキャンペーンをやっているので興味のある方はぜひ。

【プレゼントキャンペーン】
6/16まで #オゾボット をお持ちの方限定でプレゼントキャンペーンをおこなっています!アンケートに答えるだけでOzocodeシールをプレゼント!シールがあれば貼るだけでプログラミングが学べちゃいます。詳細は特設ページで確認してください。
(https://twitter.com/ozobotjp/status/1394520371781685249)

個人的にはいろんな命令のシールよりも、全部白(命令パターン部分が空っぽ)で自分で色だけ塗るタイプのシールだけがたくさん欲しいです。

ozobot

この白いやつだけがたくさんあるのが欲しい!

CSV ファイルで、テキストのカラムにカンマが入っているんだけど、そのカラムがダブルクォート文字で囲まれていないときの対処法について。

ときどきそういうデータがあるのです。
適当なその場しのぎスクリプトで CSV 出力した結果とか。
で、それをなんとかして使わないといけない場面もあるのです。
怒ってないです。

例えば、全部で10カラムのCSV。
第4カラムにテキスト。

0,2,0,こんにちは,50,0,0,0,0,0
1,1,1,さようなら,0,0,0,0,0,0

CSV だからカンマ区切りなんだけど、テキストにカンマが含まれてる場合あり。
しかもダブルクォートで囲まれていない。
区切りのカンマと区別つかなくて困る。

理想:
1,1,0,"ああ,いい,ううう。",21,0,0,0,0,0
0,2,0,"あれれれ,",50,0,0,0,0,0

現実:
1,1,0,ああ,いい,ううう。,21,0,0,0,0,0
0,2,0,あれれれ,,50,0,0,0,0,0

こういうときは、前から3カラム(=4-1)、後ろから6カラム(=10-4)を除いた残りすべてを一つのテキストとする作戦で。

1,1,0,ああ,いい,ううう。,21,0,0,0,0,0

↓ カンマで分割してリストにする

1 1 0 ああ いい ううう。 21 0 0 0 0 0

↓ 前と後ろのカラムを取る

[1 1 0] ああ いい ううう。 [21 0 0 0 0 0]

↓

ああ いい ううう。

↓ 残りをカンマで繋ぎ直し、ダブルクォートで囲む

"ああ,いい,ううう。"

↓ さっき取った、前と後ろのカラムと合わせて最終的な CSV にする

1,1,0,"ああ,いい,ううう。",21,0,0,0,0,0

Perl


Perl で書くとこんな感じ。
my $IX = 4; # 4番目のカラムがカンマ入りテキスト
my $N = 10; # 全部で10カラム
while (<>) {
    chomp; # 末尾の改行削除
    my @F = split(",", $_, -1); # 読み込んだ CSV 行をカンマで切ってリストへ
    my @pre = @F[0..($IX-2)]; # 前から IX-1 個分のカラム
    my @post = @F[$#F-($N-$IX-1)..$#F]; # 後ろから N-IX 個分のカラム
    my $text = join(",", @F[($IX-1)..($#F-($N-$IX))]); # カンマ入りテキスト
    print join(",", @pre, "\"$text\"", @post)."\n"; # CSV に戻す
}

splice 関数を使ったバージョン。
my $IX = 4; # 4番目のカラムがカンマ入りテキスト
my $N = 4; # 全部で10カラム
while (<>) {
    chomp; # 末尾の改行削除
    my @F = split(",", $_, -1); # 読み込んだ CSV 行をカンマで切ってリストへ
    my @ts = join(",", splice(@F, $IX-1, (@F-$N) + 1)); # テキスト部分の抜き出し
    splice(@F, $IX-1, 0, qq(").join(",", @ts).qq(")); # ""をつけて戻す
    print join(",", @F)."\n"; # CSV に戻す
}

Perl の split 関数の第3引数の "-1" についてはこちらを参照。

Python


Python で書くとこんな感じ。
右側から分割してくれる rsplit 関数がこの用途に便利。
ID = 4
N = 10
with open('sample.csv') as f:
    for line in f.read().splitlines():
        pre = line.split(",", ID - 1)
        post = pre[-1].rsplit(",", N - ID)
        l = pre[:-1]
        l.append('"' + post[0] + '"')
        l.extend(post[1:])
        print(",".join(l))

1,1,0,ああ,いい,ううう。,21,0,0,0,0,0

↓ 最初の split で前から4分割(3箇所で切断)

1 / 1 / 0 / ああ,いい,ううう。,21,0,0,0,0,0

↓ 一番右の塊を次の rsplit で後ろから7分割(6箇所で切断)。

ああ,いい,ううう。 / 21 / 0 / 0 / 0 / 0 / 0

↓

1 / 1 / 0 / ああ,いい,ううう。 / 21 / 0 / 0 / 0 / 0 / 0

↓

1,1,0,"ああ,いい,ううう。",21,0,0,0,0,0

おわりに


カンマ入りテキストカラムが複数ある場合はちょっと難しい。めんどくさいのであきらめましょう。桁区切りカンマ入りの数値がクォート無しで複数カラムあるとかも。

あと、上のスクリプトではテキストにダブルクォートが含まれててエスケープされてない場合は考慮してません。join で "\t" を使って TSV にしとくのが良いかと。テキストに "\t" がない前提で。

自分用のプログラミングメモ。

### ファイルが存在&最終更新日時がXX秒以内=>なにもしない
if [ -e $fn ] && [ $((`date +%s` - $(stat -f %Sm -t %s $fn))) -le 7200 ]; then
    echo DoNothing $fn
    continue
fi
# 何かする(更新処理など)
echo DoSomething $fn
# 例: $dir/create_or_update_file.sh $fn


### ファイルが存在&最終更新日が今日=>なにもしない
if [ -e $fn ] && [ `date +%Y%m%d` -eq `stat -f %Sm -t %Y%m%d $fn` ]; then
    echo DoNothing $fn
    continue
fi
# 何かする(更新処理など)
echo DoSomething $fn
# 例: $dir/create_or_update_file.sh $fn


# [memo] st_mtime にファイルの最終更新時をセットする方法2つ
# 1.  eval $(stat -s $fn)
# 2.  st_mtime=$(stat -f %Sm -t %s $fn)

# [memo] 現在時刻 (Unixtime) の取得
# ut=$(date +%s)
# ut=`date +%s`

プログラミングメモ。

サーバ (linux) のタイムゾーンが UTC なんだけど、JST 前提の既存スクリプトをちゃんと動かしたい。
タイムゾーンを変更すればいいだけなんだけど、世の中いろいろな事情があるかもしれないので、その場しのぎの「その他」の対応方法。

date


シェルスクリプト内の date コマンドでは TZ=JST-9 をつけておく。
実行時のタイムスタンプをファイル名に使う処理とか。

ymdh=`date +%Y%m%d%H`
do.sh > $dir/log/$ymdh.tsv
↓
ymdh=`TZ=JST-9 date +%Y%m%d%H`
do.sh > $dir/log/$ymdh.tsv

または、スクリプトの頭に環境変数 TZ を設定しておけばあとは OK。

export TZ=JST-9
ymdh=`date +%Y%m%d%H`
do.sh > $dir/log/$ymdh.tsv

crontab


crontab で一日一回 0 時に動かす処理について。

JST の 0 時に動かすためには、9時間前の 15 時に設定する。
なるべくさけたいな、これは……。

crontab:
0 0 * * * /home/yto/cron/cron-daily.sh
↓
0 15 * * * /home/yto/cron/cron-daily.sh

こちらは、1時間ごとに呼ぶスクリプトの中で 0 時のときだけ動かすことにより「一日一回」を実現する作戦。

crontab:
0 * * * * /home/yto/cron/cron-hourly.sh
cron-hourly.sh:
#!/usr/bin/zsh
export TZ=JST-9
ymdh=`date +%Y%m%d%H`
hour=`date +%H`
if [ $hour = 00 ]; then
  # 一日一回、0時にやる処理
  # ...
  # ...
fi

おわりに


念のため書いておきますが、可能であるならば素直にサーバのタイムゾーンを変更するのがベストです。
以上。

関連記事


自分用メモ。

JavaScript でクリップボードにコピーするやつ。
関数 (script タグ) を書かずに onclick に無理やり押し込む作戦。




<div>
<textarea>あいうえお</textarea>
<br>
<button
 onclick='this.parentNode.getElementsByTagName("textarea")[0].select();
 document.execCommand("copy");'
>コピー</button>
</div>

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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 [ 次へ ]

たつをの ChangeLog
Powered by chalow