goo blog サービス終了のお知らせ 

もんく [とある南端港街の住人になった人]

スペインかポルトガルの港町に住みたい
日本→インドネシア→台湾→マレーシア→日本
since Oct. 2004

明日から在宅勤務ですが

2020-10-21 23:42:54 | マレーシアでニャー2020
会社は製造業でこれ以上製造関係は止めないと思ってたから在宅勤務にはならないと思ってたら、なった。

間接社員の10%だけが1日4時間だけ出勤して良いらしい。それで、どんな人が出勤しなきゃいけないかと言うと、もちろん製造に直接関わる人、出荷に関わる人など。それ以外は会社のサーバーなどに繋がっている人って事なわけだ。

今日の午後にそのミーティングがあって、政府発表も彼らの準備も相当に遅いが、社内はもっともっともっと遅かった。まあ、わかってた事だけど。何かと言うと、予想通り、政府発表を受けてその解釈はこうで、出勤者リストはこんな原案みたいなのは完全に用意して無かった。記入表すら作ってなかった。それでそろそろ決めないとと言う時にはもう事務員の帰宅時刻。

そこからパソコン持って帰らせるとかVPNの設定はどうするとか....おせ〜んだよ。(別に不満じゃない。言ってみただけ。)

それにしても紙の記入表見ないとできない仕事の人はどうするんだろう?スキャンして送れば良いと思うが、誰がそんな事するんだろう?順番に出勤する者がやれば良いのか?まあ、それはどうにかするんだろけど、そもそも何かに記入するってところから紙を止めておけばそのずっと先まで自動化は簡単なのだが... (と言っても仕方ないので..)


(話の方向を変える)
こう言う状況の中にいて見ていると、事務処理のような仕事はべったり直接書類を処理する人数でやるのが良いようにするけれど、半分位の仕事量にして後の半分はその仕事自体を変えるように目標を設定して実際にもそうしていかないといけないと思う。事務所の机でその向こう側にいる事務員のパソコン画面を見ていると、毎回同じようにエクセルを広げては手作業で記入してたりそれを印刷したり、その元が紙だったりしていて、遅いし仕事にムラがありすぎる。ほとんど定型的な仕事しかしないのにアウトルック開いてメールをノロノロと書いて送ってたりする。CCで入ってくるメールを見ても、1つの件に関して6往復ものメールがやり取りされる。中身は受信しましたから入ってちょっと変更ありの了解の詳細問い合わせのと、それで最初に受け取ってから完了まで半日以上もザラ。

そう言うのを減らす事に半分の労力を使ってしまってもまだオツリが来る。そのために半日費やしても、それ以後もう永久に6往復が無いのなら元は十分にとれる。

と言うわけで、せめて超簡単なNode-RED位家にいる時にやってみると良いのだが...誰もしないと思う。

万一、リモートワークになるならデスクトップPC持ち帰ろ

2020-10-20 22:25:19 | マレーシアでニャー2020
もうご存知の方も多いと思いますが、マレーシアのここスランゴール州は明後日の10月22日から行動制限が厳しくなるそうです。基本的にはリモートで家で仕事できる人はせよと言う事だそうで、きっと明日に規制強化業種リストが発表されるでしょう。

自分のところは製造業なのでもしかしたら出勤OK業種になるかも。まあ、どちらでも構いません。

これまでもリモートでやってる人はいたかと思いますが、さらに激増するのかなとも思います。ただ、車内ネットワークに依存する仕事の仕方ってどれほど普及してるのか?全然わかりません。FBなんかで時々前の同僚とかが話題にしているのはまだエクセルだったりするのでそれほどでもないかも。ならばGoogleのサービスでも使えば足りる気もします。逆にその方が便利だったりして。

うちの会社でもVPN立ち上げたとか言ってるけど、ラップトップでやってたりしない人が多いのでデスクトップPC持って帰るのか?それとたぶんクラックされる会社多くなるだろうなあ。弱いセキュリティ、何かあった時に検出できるか?、リモートでできない事のために駆けつける者がいるか?、いろいろ思うとこの期間、悪意ある人にとっては稼ぎ時だなあ。やっぱりGoogleとメールとかでやり過ごす方が現実的には安心な気がする。

もし家にいろとなったらデスクトップPC持って帰ろう。

TinyQueryプロジェクトその7

2020-10-19 21:36:54 | マレーシアでニャー2020
データベース書き込みのバグがまだあったのでちょっと修正した。

後はデータベース操作のためのインターフェース。


まだ繋がっていない(global変数を使うので内部的には繋がっている部分が多い)が手で触る範囲のフローはこう言う感じ。


あまり複雑な事はしないので一度の操作できるカラムは3つと時間に関するカラムが1つだけに絞ってある。それらに条件式を設定してまとめてデータベースからSQLで取り出す事になる。できる事はその結果の保存と可視化のみ。実作業ではそれで十分だろう。

XXXが死んだ時、私は声をあげなかった、私は彼の家族じゃなかったから

2020-10-19 18:22:15 | マレーシアでニャー2020
昨日はほぼ1日家で寝ていた。休日位は外食のために少し外に出るのが通例なのだけれども今はきっとそう言う時期じゃないと思う。もちろんコロナの事だ。

最悪自分一人で死んでしまうのは仕方ないが、こんな人間ただ1人が感染しただけでも周囲への影響が大きい。近所はまあ、それほど付き合いが深くないので家にいれば接触はしないが、会社は感染が出るといつ感染したかがわからないので一時的には閉鎖になるだろう。検査が行われて他に感染者がいないか確認されるだろう。そして建物が消毒される。その間生産はできないわけで経済的影響は少なくない。

仮に誰か他の者が感染していればその家族も感染しているだろうし、最悪の場合、誰かが死ぬかもしれない。死なないにしてもその人が立ち回る先、勤務先とかお店なども影響を受ける。そんなの当たり前であえて今更言うほどの事でもないが。


工場で発生したちょっとした事故程度なら「これは、これこれ、こう言う事で発生してしまいました。直接と間接の原因はこうで、これからはこうして再発を防ぎます」とやって具体的に反省すればだいたい済むし、そんな事は簡単だ。要は自分の問題として反省して自分で決めて動けば良い。誰かに批判されてもそれは受けておけば良い。

でも、人が死んだらどうなんだろう?マレーシアでは運転しているとたまに人が死んでいるのを見るし、それよりかなり頻繁に犬や猫が轢かれて死んでいる。大きさは違うが人間だって死ねばああなる。ただの肉の塊に。戦争みたいな事をしなくても人は死ぬ。でもほとんどの場合、誰かが死んでも自分にはほとんど影響が無い。工場で外国人作業員が1人死んでも入れ替えができる。すぐに普通の日常に戻る。特に何も感じる必要はない。

ナチスが最初共産主義者を攻撃したとき、私は声をあげなかった 私は共産主義者ではなかったから
社会民主主義者が牢獄に入れられたとき、私は声をあげなかった 私は社会民主主義者ではなかったから
彼らが労働組合員たちを攻撃したとき、私は声をあげなかった 私は労働組合員ではなかったから
そして、彼らが私を攻撃したとき 私のために声をあげる者は、誰一人残っていなかった

ちょっと大袈裟な気がするが、要はこんな感覚はいつでも誰にでもある。

誰かが死んで平気で生きていかれるとしたら、「それは仕方ない事だった、自分には全く関わりの無い事でそれが起きて自分にできる事は何も無かった」と言う事だろう。戦争のような場合、自分で止められた可能性を考える人もケースも稀だろう。いろいろなレベルでブレークダウンして考えてみて、いったいどこまでが可能なケースなんだろうか?

ごく並の人間として、コロナはある程度それが可能そうに思える。体温チェックや誰かと大勢で集まらない、そして自分の小さな楽しみのためだけに無駄に出かけないとか。工場だとどうか?それもいくつかの点で可能かと考える。気付いているのに言わないで自分の仕事じゃないとも言えるし、それを責める者はいないだろうが。

今さら聞けないNode-REDって何?

2020-10-17 21:39:23 | マレーシアでニャー2020
Node-REDが何かと言う質問を受けましたので簡単に書いて置きます。

<長いので最も簡単な説明>
今さらプログラミング等やりたくないけど、すぐに結果だけ欲しいと言う虫の良い考えの持主向け万能ツール。

<まともな説明>
それぞれに機能を持つノードと言うパーツを数珠のように繋げてプログラミングができる物です。つまりは文字をずらずら書かずにプログラムが作れます。

同じようなのでよく子供に与えるブロックを組むタイプのものがありますが、それと似ている大人版です。機能的にもちょっと大人な感じで、その分難しいのではなくて「気が利いて」います。

GUIでできるとは言え、中ではNode.jsと言うWebサーバ等で普通に使われているjavascriptと言う言語の実行環境がバックアップしているので子供騙し的な物ではありません。

実際にNode-REDはIBM他のクラウドサービスに取り入れられているし、日本でも日立やNECがユーザーに使用を推奨していて、つまり彼らのサービスと繋げてユーザーが自分自身が便利になるように使ってくださいと言う事だと思います。

<メタ説明>
なぜNode-REDかと言いますと、データ(書類に入っていたり機械やセンサーが送ってきたり人間が作ったりした情報)を何とかしたいと思った時にエクセル等でやるのが普通ですが、エクセルのような手作業はデータの量が少し多くなるだけで実際には紙でやるのとあまり変わりません。面倒だし間違いが多くなる。

でも、今からプログラミングを勉強するとなるとハードルが高いです。自分の大学時代よりは格段に良くなったとは言え、実際の仕事をしながらとなると使えるようになるまでに時間がかかります。Node-REDはそれすらも不要で、ちょっとだけ操作を覚えればすぐに作ってすぐに結果を出せるものです。だからプログラマー用のツールじゃなくて普通の人用と言えます。

多分多くの人がエクセルを使うのに数日間スクールに通った事があると思うのですが、エクセルでもその程度の時間で覚えなければなりませんし、たった今でも日経さんはエクセルの使い方のコツなんてのを配信しています。そんなエクセルを経験している人にとってNode-REDは同程度のものかと思います。めちゃくちゃ簡単とは言いませんが、エクセル使う人ならすぐにできます。

これは勉強するしないの問題じゃなくて知ってるか知らないかのレベルです。

と言うわけで、パソコンにMS office入ってる人ならすぐにインストールして使い始めるべきです。

<何ができるか>
と言っても何ができるかイメージがわかないと思うのでそれも説明します。

「想像できる事なら何でもできる」で良いと思います。
エクセルで作られたフォームにフォーマットを崩さずに自動記入。依頼書から注文書を自動で作成するような事。その際に別に用意された顧客リストや物品リストをこれも自動参照するような事。

たくさんのデータを自動集計する。いちいち大きなスプレッドシートを開かずに簡易入力フォームを作って自動追記させる。ついでに自動計算もさせる。

月末の報告書を作成する代わりにデータを自動集計し自動でグラフにして、LAN内Webサーバーを立てて公開する。→それでそもそも集計作業とか報告書作成や配信と言う無駄な作業を止めてしまう。

英語で来たメールを自動翻訳して読めるようにする。大切なファイルを誰かが改変したのを自動検知してアラートのメールを送る。ファイルを定期的に自動バックアップする。社内LANで簡易チャットを作る。何かあったら自分のパソコンを自動停止させる。社内のデータベースから必要なデータを自動で取り出して加工する。

受信した写真をAIで認識させて何かを判断しそれに応じた連絡や処置をすると言うのもできます。どこかにセンサーを仕掛けて送ってきた信号でアラートを出したり記録したり、そしてグラフ表示もします。

I oT分野でも利用は多いです。IoTはプログラミングが目的じゃないので。データを受けたり送ったり貯めたりグラフで示したりがとても簡単。しかも寝ている間にもできるのが便利。例えば振動センサーをモーターに貼っておいてずっと値を送らせてそれをNode-REDで受けたり送受信の為のサーバーにする事ができます。これをして何が良いかと言うと、今までやってきた定期点検が軽減される可能性があります。重要でないところは定期点検のインターバルを長くして異常発生の予兆まで待っても良い事にする。データを集めて必要な定期点検のインターバルを決め直すと言うような事が可能になります。

などなど、考えればいくらでもできる事はあります。

スキルの習得は全く簡単ですが、何ができるか、何をしたいかを既存の自分のスキルや習慣を超えて想像する事が一番困難だと思います。

<もう少し踏み込んで>
上記の事が簡単にできるけれど他のプログラミング言語を知らないとそれがどれだけありがたいかのスケールが無いので、ありがたさの度合いがわからないでしょう。

例えば、習得が楽なpythonで上の報告書を止めて常時公開をやろうとします。一応できます。が、これはPythonだけでは成立しません。ライブラリがあるので楽ですが、そこにはPythonとは別の知識が必要です。またWebサーバー自体は別のソフトを使わないといけません。それもけっこう面倒です。LAN内程度であればNode-REDは標準操作の延長上で全部できます。かかる時間が全く違います。ゼロからやって2〜3日対1時間以内です。

もちろん商用のように完璧に美しいWebサイトはできませんが、結果を得るには十分なものになります。

最後に、先日出版した本が思いの外読まれているので注目度は高いようです。


(マレーシアの自動車税払ってきた。)

トレーニングの結果は記録して評価しないと

2020-10-16 22:26:12 | マレーシアでニャー2020
三択クイズ、今朝ちょっと改良し細かいチューニングと誤動作しないように調整してとりあえずリリース版作成。


三択を四択にできないなど拡張性を犠牲にしてフローを見た時のわかりやすさを重視。まあ、許してもらおう。
(欲しい人は言ってくれればフローとマニュアルは差し上げます。)

トレーニングみたいな事は相手が人間なのでなかなか効果測定が難しい。教習所などでやっているけれども、あのようにだいたいでも客観的で基準に沿った結果が数値などで出ないといい加減になりがち。だいたい「やった」で提供する方自分の義務を果たしたにしてしまう。

これが特にマレーシアはそう。マレーシアの場合は学校教育もそうなっているらしく、先生は言う事だけ言ってあとは勝手に「わかれ」「覚えろ」だとか。コッチはやる事やったから出来るようになっるかどうかは学生の責任。なのでその学生が大人になると同じ事をする。これは実に便利なやり方で、提供側が実はちゃんとわかってなくてもどうせ相手はわかりっこない、いや、わかりっこないような提供のし方で乗り切ることができてしまう。

それとトレーニングのターゲットを「作業員」にしてしまうと作業員よりちょっとだけ上のポジションは自分が対象じゃないからとそこに入る事がない。だって下の地位の人間より自分がわからなかったら...みたいなのが彼らには相当な恐怖だから。でも外国人労働者って言ってもカレッジレベルもいれば、パキスタンなどは総じてレベルがマレーシアより高いから一緒にやると絶対負ける。

まあ、それはそうと、このクイズ式、ゲームみたいで遊びのようだけど、ちゃんと点数が出てやり方によっては同じ基準で評価ができる良さがある。問題のコンテンツは上げていかないといけないが、とりあえずは記録して数値で評価出来る点はやっていかないといけない事なのだ。前に自分が現場やってた時はスキルマップと言うのを作っていて、出来るようになったところにポイントを与えて一覧にしていた。今はきっと何もやってない。

Node-REDで三択式クイズを作る

2020-10-15 22:54:59 | マレーシアでニャー2020
TinyQueryはまだ完成していないがデータベースに書き込むところまではできた。そして可視化とソーティングできるようにするためのインターフェイスだけ試作してみた。あまり高度な事は望まず、エクセルより楽と言うのを目指す。






そしてこの下のは突如現れた別プロジェクトで、三択式クイズ風のトレーニングシステム。





やってる事は大した事じゃない。用意された問題から無作為に取り出してきて表示し、使う人はクイズに答える式で勉強できる。こうすると今まで100回やっても効果が全然無かった集合教育式よりは少しマシになるかも。それと今は集合教育hqやりにくい。個別の方が隙間時間が活用できるし理解度も上がる。こちらもまだ多少の改善が必要。

ユーザーインターフェイス含めて1日でここまでできるんだからNode-REDはやっぱり凄い。

明日からのCMCO、幸運を祈ります

2020-10-13 22:26:48 | マレーシアでニャー2020
明日からまたコロナの関係で移動制限が厳しくなる。仕方ない。全国で600人ほど、この州でも60〜70人の新規感染者が出ている。それだけじゃなくて市中感染が出ていて経路を追えない状況とか言われている。と言う事は、前回完全に家に閉じこもっていた時期よりももっと酷いと言う事になる。逆に規制は緩めだが。

昨日は工場のパネルクリニックのスタッフが感染と言うニュースだったが、それはどうやら情報が遅かったらしく今日は既にクリニックは開いたそうだ。夜勤で誰か怪我したりするとそこに連れて行くから感染確定前に誰かが行っていたらちょっと危険だった。上手くタイミングが外れてくれてよかった。が、昨日そのニュースが入ったけれど、昨夜きっとスタッフは夜勤の者達に伝えてなかったんじゃないかと言う疑いがある。実際はどうだったんだろう?まあ、何かあって困れば連絡あるだろうけど。


明日からの規制強化を受けて今日ミーティングがあったが、誰か感染したらきっと工場全体閉鎖1週間だろう。多分何をどうやっても無駄だろう。このコロナは無症状場合があるから。でも、一緒の部屋に住む作業員が全部隔離になったらとか、いろいろ考えておくのは必要には違いない。と言っても、当事者であるマネージャー、彼はその工場の事をどうにかしなきゃいけない当事者であると同時に自分の家族を守る当事者だと思うのだが、どうもダメな気がする。作業員が感染してもこれは良く無い事だけれど完全に管理はできないから仕方ない事もある。でも、自分の家族はとばっちりだよな。彼は家族を本当に守れるのか?そっちの方が心配だ。それと人事のオヤジも。

他人の家族の心配なんかしても仕切れないが、あれで大丈夫と思ってるんだろうか?だって聞かれる前にこうやってるとか用意してるとか言う立場なのにこの土壇場で言われてから全て始まるなんて。それにミーティングの時に平気でマスク外して大声で話してるし。この前のミーティングでも何人かマスクから鼻の穴が見えてるのがいて、そう言う人に限って現場の作業員多数と接する人だったり。自分の家族とか心配しないのかなあ?一人暮らしで感染してどうやって生きて行くつもりなんだろう?とか。

幸運を祈るしかない。

デジタルトランスフォーメーションの末路

2020-10-12 13:44:04 | マレーシアでニャー2020
毎月人事から全従業員のリストが送られてくる。

ファイル形式はエクセルだ。そこには従業員番号、入社日通勤の手段等の月が変わっても変わらない情報がまずあって、その左の方には先月の出勤日、残業時間、休憩の情報などが記されている。それが何と、手入力だ。そう大きな会社でもないが全員の人数は10人や20人じゃない。

つまりファイルに記されているのはその不変の情報+月毎の情報だけ。

そこにある人が言った。「有給の残日数の欄を追加できない?」おお、それは良いね、欲しいね。あれば便利だね、と言いたいし、実際にあるべきだろう。

が.... いやいや、ちょっと待ってよ。その情報は今記入されてる情報とはちょっと質が違うよね。前の設定情報を参照して前月までの情報と併せて計算して...なんだよ。言うのは簡単、でもね、今の状態からやるとなったら結構大変だろう。しかもこれやってる人のスキルレベル考えてしまうとね。

これ、誰かが賛成して、そして何も言わないと人事のマネージャーのオヤジ、人事のスタッフに「やりなさい」と言うだろう。実際にどれだけの追加作業が発生するかなんて何も考えないで。別に自分はその事務員さんに同情するとかそう言う気持ちは全く無いが、そりゃ大変過ぎると思うし、そこで間接の工数激増させてどうする?とも思う。


で、通訳に助けてあげたら?と返信したが、やっぱり彼もマレーシア人なんだな。あるソフトウェア使えば良いよ的な事言って終わりにしてる。そのソフトウェアが人事のやりたい事に合うかと言うと、うーん、半分だろうな。でも移行するのにかかる初期労力もものすごく大変だろう。実質、やめておくべきだろう。


デジタルトランスフォーメーションとか言われるけど、実際にはいろいろ問題があると思う。こう言う事もその1つで、まず決定する立場の人が仕事の要件をよく理解していない。見る人が有給の残日数を知りたいと言うのをまず知ってないでやってる。だいたいにしてエクセル配信して実際にそれが必要なのは誰なんだ?何のために?

そしてそれにかかる労力が妥当なのかどうかも。エクセル手打ちでやる価値はどこに?要件満たしてないままにそれを年単位で続けている。ファイルは電子化していても作業は紙からの転写とかエクセルのコピーと改変とか、そしてその間違い検出ができて修正にかかる工数とか。

さらには、それってもともと人間がすべき仕事なの?と言うのもある。パソコン使ってるから電子化してて効率が良いって事はこの際全く無いわけで、ペンの代わりにキーボードってどうよ?それでこれを今後どうするべきかってのも具体的に考えられない決定者だとほとんど無理だろう。

いずれにせよ、少しの勉強は誰にも必要だなぁ。

モンティ・ホール問題をNode-REDで実証

2020-10-11 23:43:55 | マレーシアでニャー2020
モンティ・ホール問題、説明されてもちょっと信じられません。
https://gigazine.net/news/20201009-monty-hall-problem/#group=nogroup&photo=0

なので実際にやってみようと思った。と言っても実際にドアを用意するのは面倒なのでプログラミングでやってみます。皆さん、Node-REDを用意してください。そしてこれを↓読み込んでください。スタートを押すと1万回、自動でやります。1万回のうち何回が最後にドアを変更した方が良かったか、何回が変更無しの方が良かったかが数字で出ます。是非、お試しください。

[{"id":"388e724e.f3cb5e","type":"tab","label":"Monty Hall","disabled":false,"info":""},{"id":"805522d7.af724","type":"function","z":"388e724e.f3cb5e","name":"Random","func":"var max = 3;\nvar min = 1;\nvar Values = [];\n\nfor (i = 0; i < 10000; ++i){\n var a = Math.floor( Math.random() * (max + 1 - min) ) + min ;\n Values.push(a);\n}\n\nmsg = {payload: Values};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":280,"y":100,"wires":[["6547b2ee.354a2c"]]},{"id":"6547b2ee.354a2c","type":"function","z":"388e724e.f3cb5e","name":"Count","func":"var Values = msg.payload;\nvar TotalCount = Values.length;\n\nvar counts = {};\n\nfor(var i=0; i< TotalCount; i++)\n{\n var key = Values[i];\n counts[key] = (counts[key])? counts[key] + 1 : 1 ;\n\n}\n\nmsg = {payload: counts};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":430,"y":100,"wires":[["75a4330c.03ea1c"]]},{"id":"b36701a2.47dc8","type":"inject","z":"388e724e.f3cb5e","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"Start","payloadType":"str","x":130,"y":100,"wires":[["805522d7.af724"]]},{"id":"75a4330c.03ea1c","type":"debug","z":"388e724e.f3cb5e","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":590,"y":100,"wires":[]},{"id":"5ef6b30a.3af14c","type":"comment","z":"388e724e.f3cb5e","name":"Random reliavility check","info":"","x":140,"y":60,"wires":[]},{"id":"d3b44fb0.25774","type":"comment","z":"388e724e.f3cb5e","name":"Monty trial","info":"","x":80,"y":180,"wires":[]},{"id":"44260c13.a8a1a4","type":"inject","z":"388e724e.f3cb5e","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"Start","payloadType":"str","x":130,"y":240,"wires":[["8fd00a64.6948a8"]]},{"id":"a83bdc88.121dc","type":"function","z":"388e724e.f3cb5e","name":"Set CORRECT ANSWER","func":"// set option\nvar option = global.get("option");\n\nvar max = global.get("max");\nvar min = global.get("min");\n\nvar correct = Math.floor( Math.random() * (max + 1 - min) ) + min ;\n\nvar record = {"correct":correct};\nmsg = {payload: record};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":510,"y":240,"wires":[["c64d0cd6.ca2ca"]]},{"id":"cb12be4e.531f3","type":"function","z":"388e724e.f3cb5e","name":"Count","func":"var result = global.get("result");\nvar TotalCount = result.length;\nvar history = global.get("history");\n\nvar counts = {};\n\nfor(var i=0; i< TotalCount; i++)\n{\n var key = result[i];\n counts[key] = (counts[key])? counts[key] + 1 : 1 ;\n\n}\n\nmsg = {payload: counts, result: result, history: history};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":370,"y":600,"wires":[["dd032b7c.77ecf8"]]},{"id":"dd032b7c.77ecf8","type":"debug","z":"388e724e.f3cb5e","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":590,"y":600,"wires":[]},{"id":"8fd00a64.6948a8","type":"function","z":"388e724e.f3cb5e","name":"Set Initial","func":"// times to try\nglobal.set("times", 10000);\nglobal.set("counter", 1);\n\n// option\nglobal.set("option", [1,2,3]);\n\n// collect Win or Lose\nglobal.set("result", []);\n\n// history record\nglobal.set("history", []);\n\n// for Random\nglobal.set("max", 3);\nglobal.set("min", 1);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":280,"y":240,"wires":[["a83bdc88.121dc"]]},{"id":"c64d0cd6.ca2ca","type":"function","z":"388e724e.f3cb5e","name":"Player 1st SELECT","func":"var record = msg.payload;\n\nvar max = global.get("max");\nvar min = global.get("min");\n\nvar player1st = Math.floor( Math.random() * (max + 1 - min) ) + min ;\n\nrecord["player1st"] = player1st;\nmsg = {payload: record};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":490,"y":320,"wires":[["983d6749.846b28"]]},{"id":"983d6749.846b28","type":"function","z":"388e724e.f3cb5e","name":"Monty OPEN a door","func":"var record = msg.payload;\n\nvar max = global.get("max");\nvar min = global.get("min");\n\nvar player1st = record["player1st"];\nvar correct = record["correct"];\n\nvar MontySelect = 0;\nwhile (MontySelect == player1st || MontySelect == correct || MontySelect === 0){\n MontySelect = Math.floor( Math.random() * (max + 1 - min) ) + min ;\n}\n\nrecord["MontySelect"] = MontySelect;\nmsg = {payload: record};\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":500,"y":400,"wires":[["502632aa.72538c"]]},{"id":"502632aa.72538c","type":"function","z":"388e724e.f3cb5e","name":"Player 2nd select","func":"var record = msg.payload;\nvar option = global.get("option");\nvar result = global.get("result");\nvar counter = global.get("counter");\nvar times = global.get("times");\nvar hist = global.get("history");\nmsg.option=option;\nmsg.result=result;\nmsg.counter=counter;\nmsg.times=times;\nmsg.hist=hist;\n\nvar selected = [record["player1st"], record["MontySelect"]];\n\noptionRemain = option.filter((v, i, a)=>\n v !== selected[0] && v !== selected[1]\n);\nrecord[\"remain\"] = optionRemain[0];\n\n// Result at 2nd selection\n// Chang-Win = C, NoChange-Win = N \nif (optionRemain[0] == record[\"correct\"]){\n result.push(\"Ch-Win\");\n record[\"result\"] = \"Ch-Win\";\n}else{\n result.push(\"NoCh-Win\");\n record[\"result\"] = \"NoCh-Win\";\n}\n\nhist.push(record);\nglobal.set(\"history\", hist);\n\nif (counter >= times){\n msg.loop = \"stop\"\n}else{\n global.set(\"counter\", ++counter);\n msg.loop = \"loop\"\n}\n\nmsg.payload = \"\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":490,"y":480,"wires":[["537ce392.85eacc"]]},{"id":"537ce392.85eacc","type":"switch","z":"388e724e.f3cb5e","name":"","property":"loop","propertyType":"msg","rules":[{"t":"eq","v":"loop","vt":"str"},{"t":"eq","v":"stop","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":230,"y":580,"wires":[["a83bdc88.121dc"],["cb12be4e.531f3"]]}]

読み込むとこんな感じになります。

見積書から垣間見えるあの会社の仕事ぶり

2020-10-10 23:00:00 | マレーシアでニャー2020
自動車保険の期限が来月に迫ってきていたので次の1年の見積が来ていた。そして今日、振り込みも完了。

この保険屋さん、日系なのだが、どう言う仕事してるんだろうと思う事あり。代理店さんじゃなくて保険会社の方の事。何かと言うと、見積書の書いてある用語と契約書に書いてある用語が同じ事を指すにも関わらず違っている。そして、契約書と見積書は書いてある事はほぼ同じなのに書式がずいぶんと違うので対応するポイントがわかりにくい。

この会社、日本ではどうしているんだろう?マレーシアだけがそうなっているのだろうか?

マレーシア的に考えれば見積を作成する部署と契約書を作成する部署が違っていて担当者が違う。だからそれぞれ好き勝手に書式を作ってタイピングしていると想像できる。マレーシアではよくある事で、今の職場でも似たような事は常時起きている。1つの書式を複数人で使っても良いが、ガンとして他人の書式は使わない、少しの変更すらしないで全く別に作ってわけわからなくしているのがほとんど。それでも各々が仕事の効率を良くできるかと思えば全くそうでもなくてエクセルにいちいち手打ちでやっていたりする。計算は電卓とか。

保険の契約書や見積書なんて前年契約書に今年の車の評価額変更だけみたいなものなので人間がやらなくても自動でできそうなものだ。本契約書の一部にこれは見積ですと書いて支払い期限でも書いてあればそれで済む。なのにわざわざ文言も書式も全く違えて読む方を混乱させるとは、なんて暇な会社なんだろう?と思ってしまう。何かこちらにわからない重大な理由でもあるのか?



ところで、この前もそんな事を書いたけれど、Node-REDの本がずいぶんと読まれている。技術系の本は立ち上がりはちょぼちょぼで息が長いのだけれど、Node-REDは立ち上がりが良いらしい。Node-REDの注目度が高いのか?それともダウンロードで買えるライバルがいないからか?でもまあ、習得から実用まで2〜3日で良いプログラミングなんて他にそうそうあるものじゃないし、だからと言って他の言語に全く劣る事もないのだからやってみるべきだと思う。本にはエクセルを扱ったりメール送信とか普通に事務仕事でやりたそうな事を入れたから数百円は無駄じゃ無いはず。そして説明だけじゃなくフローは全部コピペでそのまま使えるようにしてある。

TinyQueryプロジェクトその6

2020-10-09 21:57:25 | マレーシアでニャー2020
TnyQueryは頓挫しかけたと思ったところから復活。昨日言ったようにかなり設計を変更した。見比べてみるとわかるが、枝を極少にした。これによって時間待ちを減らして動作はかなり速くなった。

動作上の大きな変化は読み込んだファイルのデータの順序が最後まで守られるようになった事。JSONを使うと順位は守られないが、その原因はmakeJSONの後のsplitだとわかったがそこでは対策が不可能と判明したのでプレビュー直前に修正できるようにした。また、ファイル読み込み等で発生してしまうデータ列の最後の付く改行コードは文字列のブランクをゼロに解釈してしまうのでこれも丁寧に取り除く処置をしている。数値と文字列の数のカウントもブランクを含まないでカウントするようにしている。また、プレビューの表示段数も設定できるようにした。あまり多い場合はスクロールが発生するしどうせどんなデータが入っているかわかれば十分だから減らせるようにした。



フローは可能な限りfunctionを使わないように他のノードでできる事はそれでやる事にしているのでけっこう長い。functionを使わなければならない場面はループがある場合だ。誰かがループを標準ノードでやっていたのを見たことがあるが単純なものならできそうだけれどどうなのか?Forループのノードがあると嬉しいが。



これが多めのデータ数で表示したプレビュー。
下は少ないデータでやったもの。同じように処理できているのがわかる。表示セルが小さいが、これはポインタでドラッグすれば広げて見る事ができるから心配はない。



フローの下に斜めの線が走っているが、それはデータベース方面へ。そちらは今後に追加する。

他人の死の可能性にリアリティはありますか?

2020-10-08 22:54:41 | マレーシアでニャー2020
TinyQueryはほぼ8割は書き換えてしまったのでかなり別物になってきている。完成にはまだ時間がかかりそうだ。

昨日のヒープメモリーの問題は読み込んだファイルの中の情報を処理の為に一度分割して、それを再度元に戻そうとしたために発生していた事が判明。なのでそう言う処理は諦めた。



この間の事故の件でミーティングがあった。どうせ大した事はないと思っていたが予想通りだ。

と言うのは、発生させた部署は「大した事ない」にしたいし、周囲は「自分の事じゃない」からだ。今回はラッキーで人が怪我したり死んだりはしなかった。が、ちょっと状況が違ったら1人位は死んでいたと思う。そんな中でまだ自ら再発防止に向けて動こうとはしないと言う事だ。

こう言う事が起きる前にも逃避経路の問題も設備へのアクセスも毎日見ていれば問題があるのはわかるし、他人に指摘されてもいたのに何もしていなかった。そして今回も、その事故直前に現場管理の者がそこを通り、見て、作業員に話しかけてもいるが、その目の前の状況を見てさえも作業の危険さと間違いを正さずにいた。しかもそのやり方はずっと以前に何回も指摘していてよもや忘れたとは言えないレベルであるにも関わらずそうなっている。

そして今回の対策案の中では「作業員にトレーニング」のようなボヤけた事を言って終わりにしようとしている。トレーニングするとしても、その危険を目にしながら通り過ぎ者がやる事になるだろう。全ては作業員に被さってくる。

人が死ぬと言うリアリティはなかなか持つ事ができない。できないと言うよりは誰もそんなものは感じたくはない。できれば遠ざけていたい。自分の親兄弟が不慮の死を遂げる事でもあれば否応なく感じざるを得ないが、職場の他人でありしかも今回はラッキーにも逃げられた。もし以前あったように人事が正しい靴を支給しなかったり、濡れた床で足を滑らせた、逃避口のドアを開けるのに手間取ったりしたら、死んでいた可能性は大きい。

にも関わらず、まだ「作業員のせい」であり、自分らは指示していないとか、前からずっとそうやっていたとか、使い方を忘れているなどと言う嘘を言い続けて遠ざける。もし一歩間違って死んでいても、そうして嘘をついて一生を生きるのか?それを放置すると言うのか?生き続ける事に何の呵責も無いのか?

事故が新人のせいであれば管理は要らない

2020-10-07 22:04:22 | マレーシアでニャー2020
javascript heap out of memoryと言うのが出た。

ノードのメモリ使用量が決まっていてそれを超えると出るらしい。物理メモリ不足ではないとか。やってるといろいろあるものだ。Node-REDだとコマンドラインで変更するのはどうするかわからないので明日、環境変数で変更してみる。

ところでフローはもう全面書き換えにした。全面と言っても構成を変えるだけだけれど。特にタイミングの問題が上手く行くように。あまり進んでない。



昨日免許証書き換えで休んでる間この前の事故のレポートがメールで来てた。

レポートの出来は......うーむ、イマイチかな?


まあ、仕方ないが、いつものように新人がとか、前からやってた通りとか、そして対策はトレーニングとか。まあ、それじゃ無理だな。百歩譲ってトレーニングするとして、どうやるんだろう?教習所みたいにトレーニングの時間をノートにでもつける?効果測定とかする?誰が?どのレベルで?それやってる人間がトレーニングで合格した人間かどうかどうやってわかるようにする?しかも、本業の作業でもないのにそんな事にどれだけ労力を使う?

新人と言う言葉は便利だけれど、それをやってしまった本人にだけ押し付けると言うのは「自分のせいじゃないいよ」宣言にしか見えなくて、ある意味卑怯だ。その人がそうやってしまう原因がその人にしかないのであれば、管理など要らないわけで、今回の事もそれが発生する直前に現場の管理者がそこを通って見ている。それなのに「私は指示してません、私は知りませんでした」とは言えないだろう。

まあ、明日のミーティングが楽しみではある。

「たった2日でプログラミングができるわけがない!」と思ってる?

2020-10-06 23:13:56 | マレーシアでニャー2020
運転免許の書き換えに行ってきた。
前に行った事が何度かあるシャーアラムのJPJに行った。けっこう空いてた。全部で40分ほどで済んだ。パスポートの期限まで4年間の免許になった。

前に書き換えてから5年経った。
前の書き換えは強盗に入られて免許証ごと持って行かれたからだった。あの時つぶあんときなこはまだ生まれて1年経ってなかったからもう5歳半を超えた。あれからこの家に引っ越して来たのだからこの家に住んだのも約5年だ。5年と言うと、今まで住んだ中で(親のところは除く)一番長い。

ヘェ〜って感じだ。



ところで、先月は本からの収入はひと頃の1/3に低迷していたが、今後はこの前のNode-REDの本からが少し増えてきていて嬉しい。そしてちょっと驚いている。Node-RED自体が今はまだニッチな市場のはずで、そしてそれをデスクトップで使うと言うのもさらにニッチだ。このNode-REDの本のおかしいのは、これまでどの本もダウンロードして1冊づつ買うよりも読み放題で読まれるのが多く、だいたい70%かもっとが読み放題だったけれど、このNode-REDに関しては1冊づつダウンロードされている。なぜなんだろう?

まあ、それは読まれる方それぞれなので良いのだけど、Node-REDは良いので本を読むかどうかは別として一度はやってみる事をお勧めする。どうせほとんどの人がプログラマーになんかならないわけだし、でも結果は欲しい。そして学習2日程度で十分できるのだから学習としてはコストパフォーマンスが最高だ。