langs: ja ja ru ja ja en en cs fr ja ja ja ja ja ja cs ja ja ja ja ja ja pt ja en ja ja ja ja ja ja ja en en en ja en en ja ja ja ja ja ja ja ja en en ja ja ja zh en ja en en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja pt ja en nl ja de ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja en ja de ja ja ja ja ja ja ja es ja ja ja ja ja ja ja ja ja ja ja ja en en en en ja en en en pt it ja ja ja en ja ja en en ja la ja ja ja zh ja ja en ja en ja ja ja ja ja ja ja en en en nl

text:
posted with sticky on 2015.11.13
2.TwitterかInstagramに「#TodoistEditorsChoice」のハッシュタグをつけて写真を投稿。
3.締め切りは2015年11月20日金曜日の深夜12時。
4.当選した人にはTwitterやInstagramを通じて連絡があるそう。
こんな感じでつぶやいてみよう。
Todoistで明日こそがんばる!/Googleプレイのエディターズ・チョイス記念!Nexus 6Pキャンペーン中。詳細はTodoist公式→https://t.co/BeBlVt2jCl #TodoistEditorsChoice pic.twitter.com/g7TVwXpsAZ
— たくろーど (@tkroad) 2015, 11月 12
詳細はTodoist Japan公式ブログ→https://blog.todoist.com/ja/2015/11/07/todoisteditorschoice/
当選者数などの詳しい情報は公式ブログでは明らかにされてはいませんが、Googleの最新AndroidスマホNexus6Pをゲットできる(かもしれない)イベントなので、Todoistユーザーのみんな奮って参加してみましょう!
ちなみに携帯電話はiPhoneユーザーのぼくですが、家ではNexus7でもTodoistはごりごり活用中。
AndroidのTodoistアプリも非常に軽快でサクサク動いて使いやすい。
ぜひぜひ最新のAndroid端末Nexus6Pをゲットして、Todoistを使い倒したいところですね!
タスク管理は人によって様々なやり方があると思いますが、Todoistの利便性はなんといってもデバイスを選ばない汎用性。
出先で思いついたタスクをササッとiPhoneやAndroidスマホで登録。
オフィスのWindowsでも自宅のMacでも、ブラウザから確認できるのでOS間でもカンタン同期。
タスクは一箇所だけで管理すると「モレや忘れ」が生じるものですが、どのデバイスからでも全てのタスクにアクセスできるのは非常に快適です。
無料で使えて便利なタスク管理アプリ、Todoist。
たくろーど(@tkroad)でした。(・w<)
いろんなデバイスでToDoを一元管理するならTodoistが便利だね。使い方とおすすめポイントを3つ紹介
Todoistで繰り返し設定をしておくとはかどるタスクおすすめ4つと、繰り返し予定の指定方法
Googleカレンダーの複数アカウントをTodoistに連携する方法。IFTTTアカウントを使いわけよう
Todoist: Todoリスト | タスク管理
posted with sticky on 2015.11.13
Message コメントをキャンセル
メールアドレスが公開されることはありません。 * が付いている欄は必須項目です
新しいコメントをメールで通知
新しい投稿をメールで受け取る
「Todoist 10」にアップデートでiPhoneでのタスク管理入力がますます簡単便利になったよ
いろんなデバイスでToDoを一元管理できるサービスTodoistが大のお気に入りなのです
Googleカレンダーの複数アカウントをTodoistに連携する方法。IFTTTアカウントを使いわけよう
Googleカレンダーの「予定」を「自分専用」や「家族共有」、「社内チーム共有」などで区
TodoistとEvernoteの相性が抜群すぎ!タスク管理アプリとしての活用方法3つを紹介
タスク管理ツールとしてPCでもスマホでもデバイスを選ばずシームレスに同期し
Todoistで繰り返し設定をしておくとはかどるタスクおすすめ4つと、繰り返し予定の指定方法
ToDo管理にはいろんなデバイスでサクサク同期できるTodoistがお気に入りです。 仕事
iPhoneでTodoistをもっと使いやすく!Textwellアクションからタスクを登録
スマホやPCなど、いろいろなデバイスで同期できるタスク管理ツール「Todoi
Todoistの完了タスクをIFTTTを使ってEvernoteに自動的に記録する方法
いろいろなデバイス間でタスク管理を一元管理できるTodoistが便利です。 そして、Tod
いろんなデバイスでToDoを一元管理するならTodoistが便利だね。使い方とおすすめポイントを3つ紹介
ToDoやタスク管理をするアプリはたくさんあるのですが、iPhoneやAndroid、Win
Todoistは無料アカウントでもプレミアム一カ月お試しアップグレードができるよ。すんごく便利な機能を2つご紹介
デバイス間でサクサク同期してくれるタスク管理ツールTodoist。 無料アカウン
液晶ディスプレイ画面が割れたiPhoneを中古で買ってAppleサポートで修理して使ってみるといくらでできるのか試してみる
画面の割れたiPhoneをAppleサポートで修理して使ってみる【後編】修理品が3日で届いた。早っ!
青森の元気野菜の販売始めました。全国発送やってます!
晴ればれ農園@たくろーど
iPhoneとかガジェットとかラーメンが好物な、たくろーど(@tkroad)が書くライフログブログです。もっと詳しく
@tkroadさんをフォロー
千円で買える!無印良品のシャチハタ(ネームスタンプ)が安いしオシャレで実用的でおすすめ 601ビュー | 2015/01/11 に投稿された
PS3をテレビのリモコンで操作する方法。toruneとかnasne、Netflixが捗るよ 575ビュー | 2016/02/21 に投稿された
PS3経由でAmazonプライムビデオをテレビの大画面で見る方法 502ビュー | 2016/02/14 に投稿された
【バカウマ】めんつゆだけで簡単にできる半熟トロトロ煮卵が常備食としてのクオリティ高すぎ 412ビュー | 2014/12/22 に投稿された
【農家直伝レシピ】世界一おいしい行者にんにくの食べ方 389ビュー | 2014/05/06 に投稿された
電気こたつの2穴コードはだいたい互換性があるから交換できるって知ってた? 386ビュー | 2015/12/08 に投稿された
多機能ペン「ステッドラーアバンギャルド」にジェットストリームのリフィルが使える 273ビュー | 2015/01/04 に投稿された
テレビでYouTube見るためにPS3をiPhoneで操作したら検索とか快適すぎて便利この上ない 247ビュー | 2014/02/28 に投稿された
インターネットが繋がらないときの対処方法。モデムやルーターの設定の前にLANケーブルを確認してみよう 218ビュー | 2015/10/30 に投稿された
MacBookのバッテリー残量があるのに電源が勝手に落ちてしまうときはSMCリセットを試してみよう 184ビュー | 2016/02/11 に投稿された
Android (14)
Evernote (41)
iPhone (140)
PC/Webサービス (56)
Dropbox (4)
OneDrive (3)
Todoist (9)
WordPress (15)
Amazon Android Chorome Dropbox Evernote FastEver flickr Food Google ios iPhone iTunes JETSTREAM Mac mouse nasne Nexus PC PC/Webサービス Pocket ScanSnap Skitch STINGER Todoist WordPress YouTube zaim アイコン アプリ カメラ グッズ ゲーム タスク管理 バックアップ ブログ ライフログ ラーメン ラーメン,Food 同期 手帳 畑の野菜 節約 習慣 辞書 青森
アーカイブ 月を選択 2017年10月  (1) 2017年9月  (3) 2016年11月  (2) 2016年10月  (1) 2016年6月  (1) 2016年4月  (4) 2016年3月  (6) 2016年2月  (10) 2016年1月  (11) 2015年12月  (7) 2015年11月  (7) 2015年10月  (1) 2015年9月  (10) 2015年8月  (7) 2015年7月  (4) 2015年6月  (9) 2015年5月  (4) 2015年4月  (7) 2015年3月  (10) 2015年2月  (16) 2015年1月  (12) 2014年12月  (12) 2014年11月  (11) 2014年10月  (14) 2014年9月  (16) 2014年8月  (19) 2014年7月  (16) 2014年6月  (15) 2014年5月  (21) 2014年4月  (22) 2014年3月  (19) 2014年2月  (23) 2014年1月  (21) 2013年12月  (13) 2013年11月  (6) 2013年10月  (2)
Todoistユーザー必見!Nexus 6Pプレゼントキャンペーンに参加しよう!11月20日まで!
仕事も人生も!自分の思考・行動をハックして毎日を快適に!
WordPress-Theme STINGER3
Copyright© 自分ハック!@たくろーど ,2013-2017 All Rights Reserved.


document_lang: ja

langs: ja ja ja ja ja ja ja ja nl en ja ja ja ja zh ja ja ja ja ja ja ja ja nl en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en

text:
この条件に関しては国税庁の特例欄に掲載されていますので確認しておくといいでしょう。
損失が出た場合もその年の確定申告に限らず以後3年間に繰り越して控除することが可能です。家の売買で動く金額は高額になるためかなりの減額を期待することができます。これを利用しないのは損になってしまうので損失が出たときも活用しましょう。
家を売る際にはさまざまなケースがあるため、どう当て嵌まるか分からないケースも出てきます。この場合は実際に売買を依頼する不動産業者にアドバイスをもらいましょう。
2017年11月24日2017年12月6日 管理人 未分類
家は人生で一番高い買い物ですが、一方で家族がなくなり住んでいた家を手放す等の理由で家を売るときも出てくるでしょう。家を買う時も簡単ではないように家を売るときも決して簡単ではありません。買うときと同じく不動産業者と相談、買い手がいる場合は買い手とも相談していく必要があります。
しかし本当に重要なのは家を売るときではなく、家を売った後の対応です。家を売ったらそれで終わりというわけではなく売ったことによってやらなければいけないことが出てきます。そのため売る前に売った後は何をしなくてはいけないのか理解しておく必要があります。見方を変えると理解せずに家を売る行為をしてはいけないといえるのです。
売ることになった家が住んでいたところであった場合は当然新しい住居を探すことになります。売った時点で住めなくなるため新しい住居がないと住むところがなくなってしまうのです。しかしこれに関しては家がなくなるという直接的な変化があるためやるべきこととして忘れることはないでしょう。問題は家探しではなく別のところにあります。
やるべき、考えるべきことの一つとして挙げられるのが税金の問題です。家を売ると売却した分の利益を得るためその分の確定申告をしなければいけません。しかし税金に関しては単に売却した利益を考えるだけではないのです。もう一つはローンと保険に関しての話であり、ローンはケースにもよりますが保険は家を持っていた以上、必ず考える必要があります。やるべきことを理解してトラブルが起きないように立ち回りましょう。
税金について考える 39ビュー
家を売る時にやること 33ビュー
ローンと保険 28ビュー
Proudly powered by WordPress | Theme: Ixion by Automattic.


langs: ja ja ja ja ja zh ja ja ja ja ja ja ja ja ja ja ja ja ja zh ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja zh ja ja ja ja ja ja ja ja en

text:
1)周囲の人(家族や職場など)が同じように咳をしている時:ウイルスや細菌による感染症(気管支炎など)が考えられます。
2)感冒などの際にこれまでも咳が長くことが繰り返しあった時:喘息や咳喘息が考えられます。
3)痰が多い時:喘息や気管支炎などでも痰はありますが、量が多くて長く続く時には副鼻腔炎で多く見られます(寝ている時に鼻水が喉の後ろに落ちてくる『後鼻漏』という症状が特徴的です)。
4)“ヒューヒュー、ゼイゼイ”などの症状を伴う時:気管支が狭くなった時にみられる症状で、気管支炎の場合もありますが喘息を強く疑う症状です。
5)咳がよく出る時間は?:夜間や明け方に多い時は喘息や咳喘息、アトピー咳嗽などで多い傾向にあります。
6)胸やけや胃液の逆流などがある時:逆流性食道炎などでみられます。
4.外来で行う検査は?
咳が続く場合には一般に次のような検査が必要です。
1)胸部レントゲン検査:肺癌や肺結核、間質性肺炎などの疾患を見落とさないようにするのに必要です。
2)血液検査:炎症の程度のチェック(CRPや白血球数)や微生物に対しての抗体検査(マイコプラズマ、肺炎クラミジア、百日咳など)が行われます。そして喘息や咳喘息、アトピー咳嗽などが疑われる時にはアレルギーのチェックも行います。
3)喀痰検査:喘息、咳喘息、アトピー性咳嗽の時に見られる好酸球の有無、結核菌や気管支に感染する細菌の培養検査、そして喫煙家の場合には細胞診(癌細胞の有無)などが行われます。
4)その他:喘息を疑う時には『気道可逆性試験』と言って、気管支拡張薬を吸入してもらいその前後で呼吸機能検査を行って気管支の状態を判断します。
それぞれの疾患に合わせた治療を行います。
喘息に関しては別項をご覧ください。
咳が長引く場合には市販の咳止めを漫然と服用するのではなく、必ず内科、特に呼吸器内科を受診してみて下さい。
鎌田クリニック 南平台
Copyright © 2014 医療法人社団友愛会 鎌田クリニック/鎌田クリニック南平台 All Rights Reserved.


langs: ja ja ja ja ja ja ja ja en es ja ja ja ja ja ja ja ja ja ja ja en ja en ja ja ja ja ja ja ja tr en zh en ja ja es ja en ja ja en ja en ja en ja en ja en ja en ja en ja ja en ja en en ja en tr en ja en ja en ja ja en en en ja en zh en ja en en en ja en ja en ja en ja en vo de en ja en ja en ja en ja en es ja ja ja en ja ja en ja ja ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja es ja ja ja

text:
2017年11月20日
1ヶ月東南アジアを旅して分かった海外旅行出発前にインストール必須なアプリ8選
1 海外で本当に必要なアプリ
2 Googleマップ
8 インストールしたけど登録でつまづいたアプリ
海外で本当に必要なアプリ
備えあれば憂いなし。こんにちはkazumarioです。
今回は海外旅行で役立つアプリを紹介したいと思います。僕は出発前でなく出発してからあれやこれやとインストールしたのですが気がつきました、「出発する前にインストールした方が良い」ことに。
多分探せば旅で使える便利そうなアプリって山ほど出てくると思うのですが、今回は実際に使ったアプリだけ紹介します。
あと今回のアプリは旅先でスマホが使える前提のアプリです。海外でお得にスマホを使用する方法はこちらの記事を読んでください。
僕今まで日本でもiPhoneにデフォルトで入っているマップを使っていて日本で使用する場合はそれで別に問題なかったので海外でも前半はそれを使っていたんですが、
ある日タイのドミトリーで日本語を少し話せる中国人の方にバスターミナルまでの行き方を聞いてた時に、僕のマップを見せたら「僕それ使えない」って言って自分のgoogleマップを見せてくれたのがキッカケで僕もインストールしました。
たまにバス停がずれたりしてることはあるものの、目的地までどのバスにor電車に乗れば良いかまで出てくるGoogleマップを手に入れた瞬間は「何かかが一気に変わりました」
これもGoogleマップに次いで良く使いました。どうしても聞き取れない時やどうしても伝わらないことの連続だったので、そう言う時はGoogle翻訳を使えばだいたい大丈夫です。
さすがに日常会話とかドミトリーで少し話す程度の時は使いませんでしたが、宿や空港などで相手が何を言っているか分からない時はキーボードに打ってもらいました。
プーケットからマレーシアに行く時にチケットは持っているのに飛行機に乗れない雰囲気が流れていたのですが、何をしゃべっているか?なんで乗れないのか?が全く分からなかった時のgoogle翻訳使用例
タクシー配車サービスのUberもインストールしておくと便利なアプリです。迎えに来るのはタクシードライバーではなく普通の一般人のドライバーですが、普通のタクシーより料金が安く行き先も最初に決めて料金も最初に表示されるので安心なのと、行き先を伝えることがないので現地の言葉が分からなくても利用しやすいのがポイントです。
クレジットカードを登録しておけば料金も直接支払うことがないので、タクシーの交渉制が多い国ではかなり重宝します。
ただ国によってはUberが良く普及している国とGrabが良く普及している国が違ったりするので、Uberタクシーの数が少ないこともあります。Grabタクシーも合わせてインストールしといた方が良いです。
インドネシアでは1回タクシーと出会えないことがありました。
宿の予約はほぼagodaでしていました。最初はアプリではなくウェブサイトの方を使用していたのですが使用頻度を考えてアプリを途中でインストールしました。Agodaは前日や当日探すと平気で40%割引とかがあるので宿を安く探せます。
民泊だけでなく普通にゲストハウスやコンドミニアム貸切なども多くあるのでこちらもAgodaと合わせて使用しました。
バスや飛行機とその待ち時間がとても多いので電波がないオフラインでも時間を有効活用できる読書がオススメです。タブレットを持って行くのも良いですが荷物が増えるのでスマホにアプリを入れるだけで十分読めます。
本は普通に購入すると一冊1500円ほどしますが意外とすぐ読み終わってしまいます。飛行機の待ち時間やフライト時間は普通に長いので月額980円のKindle Unlimited(読み放題)に登録しておけば、
ビジネス書なんかも読めるし疲れた時は無理せず雑誌や漫画など本も読めるので確実にこっちの方が良いです。
インストールしたけど登録でつまづいたアプリ
obikeは自転車のシェアアプリでマレーシアやシンガポールの街にはたくさんあります。僕は自転車が好きなので乗りたかったのですが、登録に電話番号の承認が必要でSIMカードを変えていたので電話番号がなく現地での登録ができなかったので、出発前に「Obike」「Grab」は日本にいる間にインストールして登録まで済ました方が良いです。
以上僕が実際に使用したアプリです。その他にも観光スポットに関する質問や、旅に関する質問。モバイルWiFiを使わず海外で1万円以上安くスマホを使用できるsimカードの購入方法や設定方法など。
LINE@で気軽に質問お待ちしています!
こちらの記事の内容を含んだ動画になっています。
最新情報をチェックしよう!
2017年11月16日
東南アジア(タイ、マレーシア、シンガポール、インドネシア)の治安と簡単な防犯対策3個
2017年11月18日
革命のファンファーレのamazonレビューが散々な件。何個かピックアップ
年齢は21歳ですがすでに4回退職して現在はMy Life user(無職)です。10月より1ヶ月間東南アジア(タイ、マレーシア、シンガポール、インドネシア、)を旅してきました。


langs: ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja en ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja ja en ja en ja en ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja ja en en ja ja ja ja ja ja ja ja ja ja ja ja ja zh ja ja ja ja ja ja ja ja ja en ja ja ja ja ja zh ja ja zh ja ja ja ja zh

text:
これ、なぜなんでしょうか…。
ショップのスタンスも「携帯ショップとは待たせて当たり前の場所」と思っているかのように、当然のように何時間も何時間も客を座らせておくよね~。
機種変でなくてもカバーや充電器などのアクセサリー類を購入したいだけなのに待たされる。
品物も陳列棚にあってレジも空いていて立っているだけのスタッフと思しき人もいるのに、ひとまず番号札を取らされて「本日のご用件は」と聞かれて「これが買いたいだけです」と言っても「順番にお呼びします」と言われて長々と待たされる。
だから、できることなら近寄りたくない場所。
そんなこんな色々と面倒な機種変更だけど、ちょっとでも億劫なことを取り払って、なるべくストレスなく機種変がしてみたい!と思って、携帯ショップでの待ち時間問題をカットしてみることにしました。
オンラインショップ機種変でストレスフリー
まず、どの機種にしたらいいのかわからない、プランもスタッフさんに色々聞いてから決めたいという人はオンラインではなくてショップに出向いてください。
何にしたいか決まっているor決められるという人は各キャリアのオンラインショップを見ると現行機種もしくは発売が決定している新機種の予約からオンライン機種変更の手続きやプランの決定ができると思います。
ここで、新機種の発売が決定しているタイミングだと、もしかしたら現行機種の値段が下がっていたりキャッシュバックキャンペーンなどが打たれていたりするのでお得かもしれないですね。
私が使うandroidは毎年夏と冬に新機種が出ているので、その発表がされる5月や11月頃にキャンペーンが打たれることが多いです。
たまっているポイントも店舗での手続きのときと同じように使うこともできます。
欲しい機種をポチッとしてプラン内容に関することなどの入力事項を少しこなすだけで、もう2日後には新機種が届きました。
なんてストレスフリー(*´w`*)
プランも自分でゆっくり検討して決められる(ショップだとよくわからないまま使用量に適していないプランをすすめられたり)
不必要なオプションに入れられることもない(ショップだと初回だけ入る必要があると言って半ば強引に付けられたり)
長々とした説明を全部聞く必要がない(おそらく店側には説明義務があるため口頭で長い長い説明をしてくる)
事務手数料がかからない(ショップで手続きするといくらか掛かります)
なによりも待ち時間がない(手元に届くのに数日かかるけど店でただ座って待たされる時間はかからない)
こんなにいいことだらけならもっと早くそうしたかったわ~_(:3」∠)_
みんなそうしてたんだろうか。そうならそうと教えてよ~。お得は共有しよう←(笑)
届くまでの数日を使ってバックアップなどの移行準備をしておいて、手元に届いたらパソコンから切り替え手続きをしたら、あとは新しいスマホで発信テストをして同期やらデータのインポートをして使いやすいようにセッティングしていく作業をするだけです。
新旧の切り替え手続きとかデータの移し替えがわからないという場合は、機種変手続きはオンラインで済ませて受け取りをショップにしておけば、受け取りのときに切り替えやデータの移し替えをショップでやってもらうということもできるようなので、手続きの時間だけでも省きたいという人もオンラインは使えると思います。
「プランとかよくわからんわー、機種とかよくわからんわー、携帯ショップの待ち時間好きだわー」な人はショップを利用して、「自分で出来るもん!」な人はオンラインで済ませるようにすれば、どちらの立場の人も待ち時間が減ってwin winになるのでは(*’w’*)
ちなみに今回、キャンペーンで1万円キャッシュバック+届いていたクーポンを利用して5千円キャッシュバックで合計15,000円のキャッシュバックに、通常2~3千円かかる事務手数料もオンラインにしたことで浮いたので、結構お得に機種変更が出来たのではないかと満足しております( *´艸`)
オンライン, スマホ, 機種変更 ポッテ
ペーパードライバー教習に通った主婦のその後
暑いです(;´Д`) ジメジメとした重い暑さで気力が削られるぅ~。。。 少し前に関西の方で地震がありましたが、まだ余震があったり...
ペーパードライバー主婦、ペーパー教習に通う
ついに、ついにーーー(; ・`д・´) 重い腰を上げるときがきましたという感じです。 私のペーパードライバー歴 私、高校卒...
30代主婦が観る、ドキュメンタリー映画『人生フルーツ』
2017年に公開された映画『人生フルーツ』を知っていますか? 映画公開当時に90歳と87歳という、あるご夫婦の暮らしぶりに密着したドキ...
美味しい珈琲を淹れて飲みましょ
どーも(*'w'*) 先日、コーヒー豆ショップに行ってきました。 そのショップに行くのは初めてだったので、好みの味を伝え...
最近買ってよかったもの『No-Showソックスハンガー』
GWに突入しました(^-^) 我が家は連休の前半は私ひとりでお留守番なので、自由だーーーー!! 夕飯の支度を気にせず過ごせるって...
いつの間にやら6月も半ばになっておりましたか。 例年より少し遅くなりましたが、今年も梅仕事をしました。 6月に入る頃になるとスー...
最近買ってよかったもの『オイルスクリーン』
今回は主婦っぽい内容で書いてみようかと(^-^) 主婦の味方『オイルスクリーン』 もはや今更感がありますが、これを少し前に購入し...
ヨーグルトメーカーで作るR-1風ヨーグルトで満足
ヨーグルトメーカーをゲット 何年か前にカタログギフトでヨーグルトメーカーを選びました。 今はあらゆる発酵食品が作れるような物もた...
愛用の一品~キッチンスポンジ~
我が家は食洗機がない。 夫婦二人分だけだし、それも二人分の洗い物が出るのは夕飯後だけで、昼間は自分一人が使った分だけなのでチャチャッ...
GW2018のおもひで
生き生きして魅力的な人の共通点を考察する主婦
コメントをどうぞ コメントをキャンセル
メールアドレスが公開されることはありません。 * が付いている欄は必須項目です
上に表示された文字を入力してください。
このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。
このブログは、30代後半のありふれた主婦が趣味の追求や新しい知識にトライし、その成長過程を記録する雑記ブログです。


langs: ja ja ja ja ja ja ja ja en ja ja ja ja en ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja fi en

text:
2015 年 8 月 7 日(金) 『進撃の巨人』17 巻限定版として、関西弁版が、書籍化して本屋さんに並びました。
2015 年 3 月、15 巻と 16 巻の間のプロモーションとして、進撃の巨人 完成弁版を LINE マンガや Amazon Kindle などの電子版として無料配信しました。
広告業界からは、「アホなことやっとるなー」と、冷ややかな目を向けられていたことでしょう。
しかし、このプロモーション、めっちゃ結果出てまんねん。
こちら、AdGang による、担当編集の川窪慎太郎さんのインタビュー
—実際に、売り上げにも繋がりましたか?
既刊の売り上げが対前月比 250%(150% 増)となりました。
AdGang 文中にもあるように、このプロモーションは、15 巻と 16 巻の端境期の盛り上げ施策です。
具体的に何か、ネタがあるのではなく、盛り上げるネタを考えるところから、編集部、宣伝部の方々と何度も打ち合わせを重ねながら、企画に仕上げていきました。
手法を決めるまえにやったことは、MISSION の整理です。
『進撃の巨人』は 4200 万部を売り上げる大ヒットコミックではありますが、コミックの売上はやや停滞気味であった。
そこで、さらなる新規読者層開拓のため、以下のふたつのターゲット層に向けた PR を展開が必要でした。
タイトルは認知しているが未読
途中で読まなくなった離脱者
未読者層がまだ手に取らない要因としては、「なんだか怖そう」「グロいんじゃないの?」といった先入観による食わず嫌いが考えられました。
作品は魅力的で、どんな形でも1巻をまずは読んでもらえれば新規読者の獲得につながるはず..。
そこで、まずは未読者層に親近感をもってもらうため、コミック1巻のセリフのみを関西弁に翻訳。
特設サイトで無料公開しました。
さらにタッチポイントを拡げるため、各主要電子書籍サイトを通じても無料配信。
LINEまんがでは読んだ人にキャラクターのスタンプをプレゼントしました。
単純に関西弁に翻訳するだけではなく、関西人だけが分かるローカルネタを随所に盛り込み自分事化。
ツッコミ要素をあえて多く盛り込むことで、SNS によるシェア・二次創作などの拡がりを狙いました。
2,000,000 ダウンロード
関連 Tweet は、130,000 件
めざましテレビなど情報番組でも話題に..。
既刊 1 巻~ 15 巻の売上が 250% 向上
そして、そんな、熱い読者の皆さんの反応にお応えする形として、編集部が、書籍化を断行してくれました。これは、作り手としても、一人のファンとしても嬉しい限りです。
このプロモーションが海外アワードで評価される事は絶対にないし、国内の ACC などのアワードですら見向きもされない可能性が高いです。
しかし、デジタルのクリエーターと、出版社の編集部が、広告 PR を考えれば、これだけのコンテンツを生み出す事もできます。
メディアの力を最初から使うのではなく、ユーザーや読者と共に、作品の世界観を楽しみ、そして、その盛り上がりを、メディアに取り上げてもらうという手法です。
コンテンツの世界は奥が深く、我々のようなクソ広告クリエーターが、手をつけると、作品の繊細な世界を壊してしまう恐れもあり簡単には手を出せない世界です。
しかし、作品への愛を持って、作者や編集者の皆さんと対話をすることで、新しいコンテンツを世に送り出せることもあります。


langs: ja en ja ja ja ja ja ru ja ja ja ja ja ja ja ja

text:
司会・渡辺寛尚さん(日本司会芸能協会 常任理事)。 何があっても頼りになります大ベテランの名司会。今年も楽しい司会でステージを盛り上げてくださいました。原田先生と寛尚さんをwith B にして、ブルゾンめぐみも登場しました。
素晴らしい照明と音響でステージを支えてくださいましたASC allstagecompany の皆様。 そして会場としてお世話になりましたブランニュー北上の皆様。 当日スタッフとして支えてくださいました応援団の皆さん。 皆々様、本当にありがとうございました〜〜╰(*´︶`*)╯♡
お陰様で無事、大盛況に終えることが出来、記念の「カンパイ・・・いい夜に!!」になりました。 手作りの応援グッズなどを用意して来てくれたファンの皆さんもいて、会場が凄い盛り上がりでした。 今年もたくさんの皆様に応援いただき、支えていただき感謝いっぱいです。


langs: ja ja ja en ja ja ja ja ja ja en ja ja ja ja ja en ja ja en ja ja ja ja ja ja ja ja ja ja ja ja en

text:
8月29日(日)  曇り
天気がいいのにイモ掘りお休み。畑のまくら部分を掘るのだけど、今日一日でも乾かしたいので。イモ掘りが始まってるのに日曜日休めるなんてうれしい。昨日疲れたので、明日からの本格的なイモ掘りに向けて今日はちょっとでものんびりしたいところ。とはいえ家にいたらいたで、掃除など家のことが山ほどあるのだけど。お父さんは安全靴が欲しいからと子どもたち連れて旭川へ買い物に行ってきた。
写真は春菊の花。かわいい花が咲いていたのでめずらしく飾ってみました。
8月28日(土)  晴れ
男爵を掘り始めました。まずは畑の端、まくらと言われる部分を掘ります。端に植えたまくらを掘らないと、ハーベスターがUターン出来ないので、本線が掘れません。石はさほど多くはないようなのですが、雨が多かったからか、土の塊が多くて本当に疲れました。反対側のまくらはしけっていて、まだ掘れません。明日一日乾かして、月曜日に掘れるかな・・・明日はゆっくり休みたい。
8月27日(金)  晴れ
今日もいい天気。北あかりの種芋の端掘りから始めて、男爵と北あかりと種芋全部掘り終わりました。ハーベスターも順調に動いてました。種芋が植わっていた畑は比較的石の少ない畑なのでイモの形もきれいでした。今年の長雨にも負けず、意外とキレイでした。雨の日は種芋選りという仕事があります。その為にも、まずは種芋を掘ります。明日からは本格的に男爵を掘ります。お天気が続きますように・・・
8月26日(木)  曇りのち晴れ
昨日の雨のせいで、朝からイモ掘り出来ず。お父さんは振り出しに戻った水出しをして、私たちはビートの草取り。3時頃からようやく端掘りをしました。まずは種芋を掘るので、そこの男爵の端掘り。大きなポテトハーベスターが畑の端で方向転換出来るように、まずはデガーという機械で掘って手拾いです。ハーベスターが普及する前は、全部こうして腰をかがめて手拾いだったそうです。腰にくる作業。昔やったことがあるおばあちゃん世代には出来ても、私たちのような経験のない世代にはなかなか出来ない作業です。明日もいい天気なので、イモ掘りです。
8月25日(水)  曇りのち雨
昨日降った雨のせいで、朝からはイモ掘り出来ず。ビートの草取りをして少し畑の乾くのを待っていたのだけど、昼から再び雨。通り雨のようなのだけど、かなり強い雨でビートの草取りも出来なくなってしまった。2時間以上強い調子で降ったので、明日もイモ掘りムリだなぁ・・・出鼻をくじかれた感じ。
8月24日(火)  曇り時々雨
今日は雨。時々さーっと降ってくる程度で、量はさほどではなかった。道内では記録的豪雨になったところもあるほどだったから、この程度で済んで良かった。イモ掘りに向けてアレコレ倉庫の片づけなどをしていました。 明日から掘れるかな・・・
8月23日(月)  曇りのち雨
今日はビートの明渠さらいと草取り。もうすぐイモ掘りも始まります。アレコレとやれることもやらないといけない。日中は時折ポツポツくるだけだった雨も、夜には本格的に降ってきました。ここのところいい天気が続いたのでいいお湿り程度でおさまってくれるといいけど。
8月22日(日)  曇り
まぶの里祭り2日目。昨日は子供会と少年団の出店両方だったけど、今日は少年団の方だけ。少年団では、ゲームとパフェ、クレープを出してましたが、結構売れてました。ゲームも人が途切れることなく盛り上がってましたし、パフェやクレープはそろそろ店じまいの支度を始めたいころには完売。仕入れの量がちょうどよくて感心しました。トラクター綱引きという競技がお祭りの中にあり、女性10名で1チーム作って欲しいということであちこち声をかけて参加。今年は例年のコースと違い、どうしても引っ張れないほどの傾斜もなく、なんと3位に入賞!賞金一万円もゲットで皆で千円ずつ山分けしました。最後のお楽しみ抽選も珍しく3つも当たりました。子供たちもいろいろと楽しんでいた様子。いつものひと気のない白滝と違ってずいぶんと賑やかな二日間でした。でも疲れた〜。
8月21日(土)  曇り
午前中、小学生水泳大会があった。まだ大して泳げないハヤトも参加。水中ジャンケンや10メートル(プールの横)や25メートルなどいろいろと参加。ケンももちろん参加。参加者が少ないので、集まったメンバーでリレーなど、エントリー以外にも参加していた。今日は曇りだったけどなかなか暑い一日。プールはビニールハウスのような作りになっているので、サウナ状態。水に入ってる子どもたちはいいけど、プールサイドにいる大人は皆汗で泳いだようにびっしょりでした。二人ともメダルがもらえて喜んでました。
午後からは白滝のお祭り。年に一度の大きなお祭りです。私も子供会や少年団のお手伝いがありました。お天気ももったので夜の花火も仮装盆踊りも盛り上がってました。


langs: ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja en ja en ja ja ja en ja en ja ja en ja en ja en ja ja en ja en ja en ja en ja en ja en ja en ja ja ja en ja en ja en ja en ja en ja ja en ja en ja en ja ja en ja ja en ja en ja en ja en ja en ja en ja ja en ja ja en en ja en ja en ja en ja en en ja en en ja en ja ja ja ja ja ja es en ja ja en ja ja ja ja en ja ja ja ja en ja mn ru ja ja ja ja ja ja ja ja ja ru ja ja ja ja ja ja ja ja ja es ja ja ja ja

text:
これって、単純に「音楽で心を豊かに…」という以前に、人と関わっていくために必要な能力を鍛えている習い事なんだなと改めて感じています。
世の中を生き抜くには「話をちゃんと聞ける子になってほしい」と感じる親心ですが、冒頭でリストアップした
・集中してちゃんと話をきく。
・話している人の顔を見て聞く。
・きちんと返事をする。
最終的に全部クリアできる子になってほしいなら、私はこれらを一度に全てを教えてたところで、ただ時間がかかるだけ…と思っています。
足し算、引き算、掛け算、割り算をまとめて教えるようなもので、一度に全部教えてもどれも曖昧になる…というイメージでしょうか。
それなら今回のような場合は、まず第一歩として「相手が話していることをどんどん自分の中に取り込める様にする」事からスタートさせるといいですね。
明らかに自由な行動をして、話が聞けていない事がとても分かりやすい子もいますが、実は、一見大人しくしているけど「頭の中で違う事を考えていて話を聞いているわけではない」子も沢山います。
そして、私は後者の方が気を張っています。
自分の子は色々と細かく見えてしまいますが、世の中に完璧な子どもなんているはずもなく、実はただできていない形が違うだけだったりします。
そして、私はそんな子ども達へ向けて、レッスン中に心がけていることがあります。
ピアノに座ったら「とりあえず弾き出す子」には、ある程度自由に弾かせて欲を満たしてあげています。そしてタイミングを取ってから次の行動を促したり、簡単な質問を投げかけたりします。
因みにこの質問とは、ピアノに関するものだけでなく、その子が普段、沢山の時間を過ごす「こども園」や「おうちでの生活」についての質問もしています。
自分の事を聞かれるのは嬉しいし、自信を持ってすぐに答えてくれるので、現在の行動を簡単に中断してくれます。
それから、私が話している途中で「気持ちが他へ行き、自由に弾き出してしまう子」には、まずはそのまま話し続けます。そしてこれもある程度は欲を満たしてから、「今何て言ったか聞こえた?」と問いかけています。
実は私はこれを魔法の質問だと思っていて、この質問を言っただけで子ども達は頭をフル回転して必死に考えてくれます(笑)
なぜならば、その子が、私がなんて言ったのか「分かる」と答えたら、その後、話の内容を復唱しなければならず、
「分からない」と答えても、その原因は自分の行動にあるということが浮き彫りになるからです。
私は毎回のレッスンでこれを繰り返しているだけなのですが、始めは自由に弾きだしてしまっていても、途中で気づいてピタッとやめたり(これがたまらなくかわいい♪)、
弾きたくても私の話が終わるまではじっとこちらを伺い、終わった瞬間に音を出し始めたり(笑)…と、
だんだん行動が変わり、話が聞ける子になっています。
一見大人しくしているけど「頭の中で違う事を考えていて、話を聞いているわけではない子」については、適度なタイミングでこちらから「今のわかる?」と声をかけ、後の流れは他のタイプのお子さんと同じです(^^)
集中すべき場面で自由な行動をとるという原因は、子ども自身が人事(ひとごと)だと思ってしまっていること。自分にはあまり関係ない、聞いてなくても困らない、と思っているのです。
でもその話について、後で自分が答えなければならないと分かってくると、よく聞いてくれるようになるのです。
当たり前ではありますが、話が聞けるとそれに答えることができるので、レッスンがとてもスムーズに展開し始めます。
ここまで来れたら次のステップは「話している人の顔を見て聞く」にレベルアップが良いかなと思っています。
今回のお話は、私がお子さんの初期のレッスン時によく使うテですが、ご家庭の色々な場面でも応用できるかなと思います♬
最後までお読みいただきありがとうございました(^^)
\こちらの記事はいかがですか?/
■ 音楽教室の始めどきについて、私の見解はこうです^^
■ 我が子はリズムにのれるかな?
■ 発表会のメッセージカード
ありがとうございました ^ ^
ゆきえせんせいの音楽教室では
『音楽で心を育て 生きる力を育む』
日々子ども達と関わっています
よろしければ LINE公式アカウント を
フォローしてみてくださいね。
情報発信しております ^ ^
□■□■□■□■□■□■□■□
ゆきえせんせいの音楽教室より
【 特別プレゼント♪ 】
体験レッスン無料(通常500円)キャンペーン!
◎プレゼントの受け取り方法
LINEで「ゆきえせんせいの音楽教室」と
▼友だち追加はこちらから
(個別ご相談も可能です)
ゆきえせんせいの音楽教室/公式LINE
□■□■□■□■□■□■□■□
ゆきえせんせいの音楽教室ってどんなところ?
ゆきえせんせいの音楽教室/ホームページ
お問い合わせフォームへ
▼LINEでのお問い合わせ
※体験レッスン無料キャンペーンはLINE限定で実施中です
tagPlaceholderカテゴリ: 教室の様子, 生徒さんのこと, おうちの方ができること, 2020年05月, ゆきえせんせいのつぶやき


langs: ja ja ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja en en ja

text: 二次会もしくは三次会ともなれば既に心地良く酔っ払っているので、尚且つイケメンが側で面倒を見てくれるのなら何も言うことは無い至福の時間を過ごす事ができるしょう。


langs: ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja es de ja ja ja ja en ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja en ja en ja ja ja es ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en de ja ja de ja de ja de ja de ja de ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en de ja ja de ja de ja de ja de ja de

text:
Twitter Facebook はてブ Google+ Pocket LINE
ヴァームというと、Qちゃん(※)のCMが浮かぶのは僕だけだろうか?
(※)シドニーオリンピックの女子マラソンで金メダルを取った高橋尚子選手の愛称
VAAMシリーズは3つのタイプに別れていて、僕がダイエットをする社会人向けにオススメするのは最後の「ヴァームダイエット」
ヴァーム(僕は「ノーマルヴァーム」って呼んでる)
こちらが一般的なアスリート向けの「ヴァーム」。僕は「ノーマルヴァーム」って呼んでる。
ダイエット目的に飲むのもOKで、僕は、ヴァームダイエットが売り切れの時は渋々こっちを飲んでいる。
ちなみに、1本当たり200ml含まれていて栄養成分は次の通り。
エネルギー:50キロカロリー、タンパク質:2.9g、炭水化物9.7g
こちらは、超ハードなスポーツを行うスーパーアスリート用。
ノーマルヴァームの栄養成分に加えて、脂肪燃焼に効果的と言われるコエンザイムQ10 とL- カルニチンが含まれている。
但し、何時間の運動するようなスーパーアスリート向けであって、我々サラリーマンのダイエット用に作られているものではない。
パッケージの色を見るといかにも高級感があって効果がありそうだけど、これまで1回も飲んだことは無い。ちなみに、1本当たり200ml含まれていて栄養成分は次の通り。
エネルギー:54キロカロリー、タンパク質:3g、炭水化物10.4g
こちらは唯一スポーツアスリート向けではなく、ダイエットをする人向けに開発されているのが特徴。僕がダイエットをするサラリーマンに一番オススメしたいのがコレ。なんと砂糖不使用!
そして、ダイエット向けを謳っているようにカロリーと炭水化物は上の2つの商品の半分程度に抑えられている。
30分程度のランニングで消費されるエネルギーが300キロカロリーであることを考えると、こういう脂肪燃焼をサポートするドリンクも摂取カロリーが少ない方が良いに決まっている。
エネルギー:26キロカロリー、タンパク質:3g、炭水化物5.6g
ヴァーム(VAAM)が脂肪燃焼につながるメカニズム
ヴァーム(VAAM)シリーズはスズメバチの生態研究から生まれた
VAAMシリーズはスズメバチの生態研究から生まれたドリンク。
もともとスズメバチのスタミナは驚異的と言われていて、なんと、あの小さな体で1日に100kmもの距離を飛び回ると言われている。
その為、昔からスズメバチの驚異的なスタミナは研究者にとって格好の題材となっていた。
そして研究の結果、スズメバチの驚異的なスタミナの秘訣は17種類のアミノ酸にあるとの結論が出された。
すなわち、スズメバチはこの17種のアミノ酸によって脂肪の燃焼効率を高めることで、長い距離を飛び回ることができるということである。
そして、この17種類のアミノ酸を科学的に再現したものが「Vespa Amino Acid Mixture(スズメバチアミノ酸混合物)」。この頭文字を取ると「V.A.A.M」。つまり「ヴァーム」である。
VAAMシリーズの歴史は古く、最初の商品は1995年に発売開始とかなりの長期ブランドである
ぶっちゃけ、ロングセラー商品は信用できると考えている僕は短絡的な思考だろうか。
ヴァームはが販売されたのは1995年。実は発売してから20年以上経過している超ロングセラー商品。
ちなみに、ヴァームダイエットは意外と最近の商品。ヴァームダイエットが発売されたのは2014年。なんとなく、ダイエットブームの歴史を感じる。
サラリーマン向けのダイエットヴァームの効果的な飲み方
ランニングをする20分~30分前にヴァームダイエットを飲むと走る頃に効果が出てきてオススメ
ランニング前の20分~30分前に飲むのが効果的と言われている。そもそもこのドリンクは飲んだだけで痩せられる魔法の商品ではない。
ダイエットヴァームは飲むことで脂肪の燃焼が効率的に行われるという脂肪燃焼サポートドリンク。従って、運動前に飲まなければ意味がない。
更に飲んでから体に吸収され効果が出るまでの時間を考えると、運動の20分~30分前に飲むのがオススメという結論になる。
ちなみにVAAMの公式サイトにも「運動前の使用をお勧めする」旨の記載がある。
ランニング前は空腹の状態を保つことで、より脂肪が燃焼しやすくする
これは、ダイエットヴァームを飲んだからというわけではないが、ダイエット目的であれば、空腹の状態の方がその効果は高まる。
なぜなら、人が体を動かすためのエネルギー源は糖質と脂肪の2種類に別れている。人が運動を始めるとまずは糖質を優先使用する。
しかし、糖質は体に蓄えておける量が少ないため、運動後20分程度経過すると脂肪の消費割合が次第に増加していく。つまり、人が運動するとエネルギーは糖質⇒脂肪の順番で使われていく。
ここで、お腹が一杯の状態で走ろうとすると胃の中のものが吸収されるに従い、血液中に糖質が供給されてしまうため、中々体が脂肪の消費に移れなくなる。つまり、脂肪の燃焼効率が悪くなってしまうのだ。
だから、ダイエット目的であれば空腹の状態で運動するのが最も効果的だと言われている。
なぜかヴァームダイエットはコンビニで売られていないので購入するなら通販でまとめて購入がオススメ
VAAMは有名な明治が製造・販売しているにも関わらず、ヴァームダイエットを含めて全てのヴァームシリーズについてコンビニの店頭には並んでいない。これは未だに不思議でしょうがない。昨今のダイエットブームを考慮すると、コンビニで販売すれば十分売れるはずなのに・・・
ちなみに、昔からスポーツアスリートを主な対象にしていただけのことはあって、トレーニングジムにはほぼ必ずVAAM商品が置いてある。
ちなみに、ヴァームダイエットを購入するなら、通販での大量購入がおすすめです。事実、トレーニングジムより安価に入手できるしね。
ヴァームダイエット ピンクグレープフルーツ風味 200ml×6本
posted with カエレバ
明治 2016-02-22
Twitter Facebook はてブ Google+ Pocket LINE
salary-dietをフォローする
salary-diet
中年サラリーマンのダイエット日記
糖質制限ダイエット&筋トレ始めて3ヶ月経過!明らかに体が変わった
リバウンド後に筋トレとダイエットを本格的に始めて3ヶ月が経過した。①糖質制限ダイエットに②無酸素運動の筋トレ(シックスパッド)、③有酸素運動のランニングを組み合わせるのがダイエットにも健康にも一番だと確信している。
1ヶ月間のランニングと筋トレの成果!腹筋が割れ始めた(写真付)
文化系人間である自分がまさか腹筋が割れるところまでたったの一ヶ月で持っていけるとは思わなかった。食生活に気をつければ、1週間あたり3時間の運動で十分に腹筋を割ることができると分かった。この記事では腹筋を割るための糖質制限やランニング・筋トレ方法について紹介したいと思う。
ランニングは1時間程度が仕事にもダイエットにも一番効果的
僕の経験上1回あたりのランニング時間は1時間程度が仕事のパフォーマンス向上にも集中力回復にも一番効果があると感じている。なぜ、1時間程度がベストと考えるのか、僕の経験から理由を紹介したいと思う。 僕がダイエットの観点から1時間のランニング...
姿勢を良くするために加圧シャツを購入したが効果があった
加圧シャツ(加圧Tシャツ)の着ているだけで腹筋が割れるという効果は実感できなかった。ただ、加圧シャツの姿勢を改善する機能は評価したい。Bondsの加圧シャツは風通しも良く、適度な保温効果も感じられる。ワイシャツの下に来ても普通のインナーと変わらないので姿勢を矯正するために着るのが良いと思う。
ダイエット目的でランニングするなら最低限知っておくべき走り方
ランニングはダイエット目的で脂肪を燃焼させるなら一番効率が良い「有酸素運動」である。しかし、肥満体型かつ筋肉が衰えている人がランニングをダイエットの中心にする場合は様々な注意事項が存在する。そこで、ダイエット目的でランニングする人に向けて最低限知っておいた方が良いことを紹介する。
ダイエット目的でランニング始めるならランニングタイツは必須である
ダイエット目的でランニングを始めた方はランニングタイツに何の意味があるのかわからない方も多いのではないだろうか。事実、僕もランニングタイツは女性用とか防寒用に使うのだと思ってた。 しかし、実際にはランニングタイツには防寒に留まらず怪我...
ランニング前の水分補給はとても大事だと思い知った
会社で「コイツやべぇ」と思われるための小手先テクニック入門編
コメントをどうぞ コメントをキャンセル
メールアドレスが公開されることはありません。 * が付いている欄は必須項目です
仕事のストレスで激太りした管理人が糖質制限ダイエットと肉体改造に挑戦するサイトです。管理人のダイエット法は下の記事に纏まっています。
【写真有】糖質制限で1ヶ月6kg、最終的に15kg痩せる方法
私が糖質制限ダイエットに取り組んで痩せることに成功した時の体験記です。飲むだけで痩せる系の怪しいサプリメントでは痩せられませんでしたが、ダイエットの王道である①食事制限(糖質制限)と②運動・筋トレに取り組んだら一気に痩せました。
salary-diet.com
シックスパッドは効果なし?筋肉痛はもちろん、マジで腹筋が割れる
2017.10.292019.02.25
腹筋の筋トレは腹筋ローラー(アブローラー)を使うとマジで効果的
2017.10.032019.02.25
デスクワーク中心の社会人が1日に消費するカロリーは?
2017.08.262019.05.01
毎日、腕立て伏せでプッシュアップバーを使うとマジできつい
2017.09.232019.02.25
シックスパッドで腕の筋肉を鍛える。パンプアップする程の強さだった
2017.11.282019.02.17
中年サラリーマンのダイエット日記
© 2019 中年サラリーマンのダイエット日記.
食べ物&サプリメント編
仕事のストレスで激太りした管理人が糖質制限ダイエットと肉体改造に挑戦するサイトです。管理人のダイエット法は下の記事に纏まっています。
【写真有】糖質制限で1ヶ月6kg、最終的に15kg痩せる方法
私が糖質制限ダイエットに取り組んで痩せることに成功した時の体験記です。飲むだけで痩せる系の怪しいサプリメントでは痩せられませんでしたが、ダイエットの王道である①食事制限(糖質制限)と②運動・筋トレに取り組んだら一気に痩せました。


langs: ja en en ja ja ja en ja ja ja ja ja ja ja ja en en en es en ja en en en en en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en en ja ja ja ja ja ja ja en ja ja ja ja ja zh ja ja ja

text:
早川:これは、すごいですよね、鳥越俊太郎さんとか、川島隆太さんとか。この辺は、どういうコンセプトでやっているのかなって、ちょっと聞きたいんですけど。
長谷川:僕は、自分が一番楽しんでいるんです。多分、早川くんも、そうだと思うんですけど。この番組を利用して、いろんな方にインタビューできるっていうのは、とてもありがたいですね。
早川:やっぱり、そこに深い意味があると思うんですよ。当たり前ですけど、自分だけのためにやっていたら、そんなにたくさんの人に聴かれないでしょう。その辺、リスナーの方からのフィードバックを受けたり、HASEさんなりに、会いたい人に会ったり、布教活動をしながら、それこそ、人の心を救っているっていうふうに僕は感じているんですけど。その辺は、どう考えますか。
長谷川:僕は、宗教を超えて、いろんな方にお会いしているんですね。底辺に流れているのは「いのち」ということなんです。そういったことに関係する方々に、インタビューしています。経済や政界といった所には、あえて行きません。お坊さんとして、命に関わることで悩んだり苦しんだりするときに、「こういう考え方で乗り越えてきた」みたいなお話を、たくさんの方にお聞きしています。僕も勉強になるし、リスナーの方にも、とてもいいだろうという思いで、やっています。
早川:いい意味ですが、HASEさん自身が、本気で聞いているじゃないですか。
長谷川:本気ですよ。本気でないと伝わらない。
早川:やっぱり、本気で聞いていると、本気で答えてくれるから、そこから出たエッセンスが刺さるというか、いい言葉が出てきますよね。
長谷川:そうですね。皆さん、喜んで出てくださっていますね。
数あるゲストの中でも南嶺老師の回は必聴
早川:今までに100回以上やってきて、いろんな方が出てくださったと思うんですけど、その中で、「これから聞こう」という人におすすめの回はありますか? HASEさんの中で、「この方のインタビューの回をまず聞いてもらいたい」とか、「こういう気付きがあるよ」っていうのがあれば。せっかくだから、皆さんにお知らせいただきたいんですけど。
長谷川:選べないですかね。皆さん、素晴らしいです。強いて言うなら、6月の円覚寺管長の横田南嶺老師は、聞いたほうがいいと思います。普通、僕なんか会えない人ですから。
早川:そうなんですか。
長谷川:一つの宗派の大本山の管長様ですから。
早川:すみません、全然知らなくて。
長谷川:はい。それも、宗派が違うので。
早川:それ、普通じゃ、あり得ないことなんですね。
長谷川:あり得ないです。
早川:そこで、なんか一つ、ヒントはありますか。
長谷川:僕たち、お坊さんは、意外と本来の意味での「出家」ではないんですよ。うちも、先祖が僧侶でそれを代々継いでいるわけですよね。南嶺老師は生まれることと死ぬことに、小学3年生で悩まれたそうです。小学校3年生ですよ!
早川:それはすごいですね。
長谷川:ちょっとあり得ないでしょう。そこで悩んで苦しんで、仏の道に来られたわけですね。そこで、公案っていう問答と、座禅によって救われた。そういうお話です。
「子どもたちに自分の背中を見せたい」という願いをこめて
早川:なるほど、それは聴いてみたいですね。そもそも、HASEさんが番組を始めようと思った理由を、まずシンプルに聞きたいんですけど。
長谷川:先ほど言いましたように、僕のお寺で講演会をやるときには、最大300人とか400人で集めて、お話をしているんですね。でも、こういったpodcastという便利な媒体が出てきたことによって、数万人、数十万人の方に聞いていただける。これは、すごいことですよ! つまり、僕がラジオ番組持っているのと同じことなので、私が伝えたいことをそのまま伝えることが可能です。それが伝えられるっていうのは、とても素晴らしい世の中になったなと思って、これを使わない手はないなっていうふうに、最初に思いました。
もう一つ、これは、あんまり人には言わないことなんですけど、僕はバツイチで、実際、自分の子どもとは一緒にいないわけですけど、本当は、日々、子どもたちに自分の背中を見せたいんですよ。でも、それができないので、子どもたちに聞いてもらったらいいなって思って、やっているとこもあります。それと、これが、あと数年残るっていうことですよね?
早川:いや、もっと残りますよ、この世がある限り。
長谷川:この世がある限り残るっていうことは、例えば、僕が亡くなった後も、これは残るっていうことですよね?
長谷川:僧侶が亡くなることを私たちは「遷化(せんげ)」といいます。意味は亡くなったあともあの世からみなさまを導くそんな存在になりますよ。ということ。これが正にこの番組なのです。これは、素晴らしいですね。
早川:ちょっとジーンときましたけれど、でも、確かにそうですね。
徳のシャワーを時間、場所をこえて届ける
早川:実際、やってみて、いい意味で意外だったことでもいいですし、よかったことっていうのは、何か挙げてもらえますか? いろいろあると思うんですけど。
長谷川:よかったことは、本を読んだり、CDを聴いたりしても、分からないことってありますよね。実際にお会いして、その方にいただく気というか、徳というのがあって、この数年で、自分で言うのも変なんですけど、すごく成長した気がするんですね。気って、高いところから低いところしか流れないじゃないですか、川のように滝のように。そういった方にシャワーを浴びている感じが、僕はするんですよ。
早川:はい、すごく分かりやすいですね。
長谷川:だから、最近テレビに呼ばれたりするんじゃないかなって思って。
早川:そうですよね。直接かは分かんないですけども、番組をやっている途中で、テレビにも出てっていうことで、やっぱり、何か流れが来ているというのを僕も感じます。やっぱりステージが変わった感じはしますよね。
長谷川:付き合っているかたがたが変わってきたっていうか、ありがたいことに声を掛けられるようになりました。僕も、「声掛けられたら断らない」っていうことを信条にしているので、全部「イエス」ってトライするんです。全てが修行だと思っているので。
早川:そんな中で、多分、その波動というか波長が、皆さんにも伝わっていると思います。実際にリアル出会っているのと近い形での対話、肉声を世の中に届けているってことですよね。
ポッドキャストを始めるときに大事な2つのこと
長谷川:そうですね。皆さん、お忙しいから、実際会ったり、講演会に行ったりするって、もう地理的にも時間的にも難しいじゃないですか。それを、いつでもどこでも誰でも聞けるっていうのは、すごいですね。
早川:そうですね。もう一つ聞きたいのが、今ポッドキャストを配信したいっていう人が結構増えてきています。そこで、HASEさんが考える、ポッドキャストに向いてそうな人を教えていただけますか。タイプでも、職種でもいいんですけど、何かキーワードあればいただきたいのですけど。
長谷川:一つは、一回始めたら、やめないってことでしょうね。やめてしまう番組が結構多いと思うんですけど、これは、すごくもったいないと思うんですね。一回始めたら、やめない、あとは、分野ごとに特殊性をもって、あるクオリティーを超えてることですよね。じゃないと、多分、聴いているかたがたが飽きてしまうと思うんですよね。
早川:そして、ネタも尽きそうですよね、あるクオリティーを超えてないと。
早川:仮に、仕組み的にずっと続くようでも、やっぱり本人が続かないですよね、聴いている方もそうですし。
正師を求めることで教えが毛穴から染みこんでいく
早川:最後になるんですけど、今後、「こんなことを番組として、トライしてみたい」とか、抽象的なことでもいいですけど、何かありますか。トライじゃなくてもいいですよ。このまま突っ走って、どんどん世界に発信して、いろんな人に会っていきたい、でもいいですし。
長谷川:そうですね、あんまり考えたことなかったな。とにかく、いろんな考え方、いろんな生き方、素晴らしい人生を送っているかたがたに、お話を聞きたいというのは、僕自身がありますね。お坊さんで大事なことに、正師を求めるっていうことがあるんですよ。
長谷川:正師。正しい師ですね。よく皆さんが、メンターとかいわれる。僕らが正師というんですが、それは、道元禅師さんも、とても大事にしているんですね。正師というのは、自分より能力のある人です。そういったかたがたにお会いすることによって、教えが、毛穴から入るっていわれるんですよ。
長谷川:つまり、そういった方を、僕は。お坊さんのことを、雲水っていうじゃないですか。
長谷川:これ、「雲のごとく水のごとく」ってことなんですね。雲って、どんどん形、変えていくでしょう。水も、四角い器に入れば四角、丸い器に入れば丸になります。だから、その師匠に合わせていくってことなんですよ。そういった方に、どんどんどんどん会うことによって、先ほども言いましたけど、僕が成長するんですね。それを、皆さんに聞いていただきたいっていうのは、あります。
早川:僕も、また、聞いてみたいと思います。ということで、きょうは、『HASEの金曜は聴きこみ寺』、パーソナリティーのHASEさんに、お話伺いました。HASEさん、ありがとうございました。
長谷川:はい、ありがとうございました。今後ともどうぞよろしくお願いいたします。(合掌)
ポッドキャストの配信にご興味を持っていただいた方はメディアプロデュースのページの一番下にあるフォームからご登録ください。
今後、ポッドキャストに関するイベントなど、開催する場合にご連絡させていただきます。
kiqtas2017-01-25T14:18:47+00:002016/10/26|Podcast活用|
Previous Next
【お知らせ】「ポッドキャストブランディング講座」リリース!
【新サービス開始のお知らせ】LIFE INTERVIEW
【お知らせ】会う力養成講座「音声コース」リリース!
クロスメディア『INTERVIEW』配信スタートしました
ブログとニュースレターが一つになりました
アーカイブ 月を選択 2022年5月  (1) 2022年2月  (2) 2021年10月  (1) 2021年2月  (1) 2020年12月  (1) 2020年11月  (1) 2020年8月  (1) 2020年4月  (4) 2020年3月  (2) 2020年2月  (1) 2019年11月  (1) 2019年10月  (3) 2019年9月  (1) 2019年8月  (1) 2019年6月  (2) 2019年5月  (2) 2019年4月  (4) 2018年11月  (1) 2018年7月  (1) 2018年6月  (1) 2017年6月  (2) 2017年5月  (3) 2017年3月  (2) 2017年1月  (5) 2016年12月  (9) 2016年11月  (7) 2016年10月  (4) 2016年9月  (5) 2016年8月  (1) 2016年7月  (3) 2016年6月  (4) 2016年5月  (1) 2016年4月  (3)


langs: ja id ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja ja ja en en

text:
東急ハンズ渋谷店の売り場にて「ダニ捕りロボ・ダニ捕りマット」の実演販売を行いました♪
前回の東急ハンズ渋谷店では「ダニ捕りロボ」が総合売上第1位、東急ハンズ池袋店でも目玉商品が完売と大好評だったので、今回もお客様にご満足していただけるようにご案内いたしました!!
売り場に来られた方の中には海外からのお客様も多く、ダニ捕りロボをまとめ買い(10個以上)された方もいらっしゃいました!
また、とあるお客様は近くの店舗に商品がないため、わざわざ1時間以上もかけて東急ハンズ渋谷店に足を運んだと聞いてびっくりしました。
実演をしていくと、この様な素敵なお客様との出会いがあります。 そこに居合わせた時が、とても嬉しくなる時であり、実演をしてて良かったなと思う時でもあります。


langs: ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja it ko ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja it ko ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ru ja ja ja ja zh ja ja zh ja ja zh ja ja ja ja ja ja ja ja ja ja ja zh ja ja ja ja ja zh ja ja ja ja ja ja ja ja ja en

text:
「いついつまでにコレを決めてくださいって僕たちがやるべきことを上手にスケジューリングしてくれるんですね。だから気持ちに余裕を持って準備したり、進めることができたんですよ。僕らの無理な要望にも真摯に答えようとしてくれてるのが分かるんですよね。確かに構造上無理なこともたくさんありました。でも『この八正さんの担当者が言うならきっとダメなんだな』ってきちんと納得して諦められた。こんなに疑り深い僕が信頼してまかせようと思えた(笑)。これは大きかったですね」とご主人。
こうして仕上がったT様邸は、そこにいるだけでご夫婦の家への愛情が伝わってくるほど、とにかく居心地がよいのです。「窓はできるだけ多くしてもらいました」という1階南側のLDKには1日明るい日差しが入り、窓から気持ちよい風が抜けていきます。玄関を東側にしたのもできるだけ南側をフリーにしたかったからだそうです。使い勝手のよさそうなオープンスタイルのキッチンに、驚くほどたっぷりの床下収納を備えた和室スペース。あまりに居心地がよいのは、デザインだけに偏らない、地に足の着いた、暮らしに根ざした実用の美があるからだと改めて感じさせられる空間なのです。
「もともと家にいるのが好きなんですけど、ますます家大好きになっちゃって(笑)」という奥様の言葉にも、なるほどと大きくうなずいてしまいます。
▲「開けられるところはとにかく窓をつけた」というリビング部分。一日自然光で過ごせるという明るさの秘密です
▲奥様がこだわったのがこちらの和室。畳の下はすべて収納スペース。来客用の布団から防災用のストックなどもスッキリ収納
ほぼ想像していた通りの仕上り。上出来です!
こだわりのリビングイン階段を上がると、ご夫婦の寝室とバスルームなどプライベートな空間がゆったりと続きます。2階のバスルームも最初は『水まわりが2階というのがどうだろう…』と思ってたんですけど寝室も近いし、これは意外と良かったですね」と奥様。
そして2階には、何よりご主人の夢がギッシリと詰まった自慢の書斎も!ご主人は出版のお仕事をされているというだけあって、天井まで渡した作り付けの本棚に文字通り所狭しと本が並びます。ゆるやかな勾配天井に、トップライトの天窓からは自然光が差し込み、その様子はまるで屋根裏の図書館さながら。「ここだけは僕が本当に好きにさせてもらった部屋なんです」というご主人も、話しながらつい笑顔がこぼれてしまうほど、時間を忘れて大好きな読書に没頭できる大好きなスペースなのだとか。
また2階には、寝室のほかにもうひとつ6畳間がありましたが、そこは物置のようで、ふだんは使っていない様子です。しかしこの「オーナー訪問記」の取材の半年後その理由が判明しました。T様邸にご長男が誕生したのです。「将来的な子供部屋として、一部屋作ったのです。一軒家を買って、その家でもっと生活を楽しむようになったので、赤ちゃんが我が家にやってきたのかもしれませんね。これも八正さんのおかげというのは褒め過ぎかもしれませんが」とご主人は笑います。
あちこちと見せていただきながら、お話を伺っていると、お2人とも心からご満足いただいている様子。でもここは一つ思い切って聞いてみます、実際に住んでみて不満はないですか?
「それが思ったよりなかったんです。自分たちの要望をしっかり伝えて、応えていただいたからかな。玄関のライトのスイッチをもう少し手前にすればよかったとか、細かなところは反省もありました。でもほぼ100%理想の家づくりができたと思いますね」厳しいご主人からお墨付きもいただき、スタッフは喜びもひとしお。
ゆったりと気持ちよい時間の流れる夫婦の家。暮らしへの悦びがあふれるステキなT様邸でした。
▲ご主人のこだわりいっぱいの隠れ家書斎。デスク前の小窓をのぞけば、豊かな緑が読書で疲れた目を癒してくれます
▲白で統一された洗面スペースからは、サービスバルコニーへもつながり明るさも開放感も十分
Vol.36  NEW
>リビング・ダイニング
>構造・床暖房・断熱材
Copyright (c) Hassho-Kensetsu Co.,Ltd. All rights Reserved.


langs: ja ja id ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja ja en en ja ja en en ja ja en en ja ja en en ja ja en en ja ja en en ja ja en en ja ja en en ja ja en en ja ja en en ja ja en en ja ja en en ja ja en ja ja uk ja ja ja ja ja ja ja uk zh uk ja ja uk uk uk ja uk ja ja ja

text:
壊されたり、傷つけられたりしたくない家財を運んでいただくときには料金を出す段階で詳しく伝え、追加料金が変動するのか聞いてみる事も忘れてはいけません。
詳細を見積りの段階で話してみると、初期の引っ越し料金には同様でも合計になると、料金に変わってくることがあるかもしれません。
詳細までよく確認し、一番良い東近江市の引越し業者に選び抜きたいものですね。
お得な引越社探すには、やはり、一括見積りサイトが良いのです。
最大50パーセント安くなるなどのお得な料金の優遇が存在します。
おススメの一括見積もりサイトをご紹介しています。
東近江市 引っ越し業者 | おすすめはココ
引越し価格ガイド  http://a-hikkoshi.com/
HOME’S 引越し  http://homes.co.jp/
ズバット引越し比較  http://www.zba.jp/
引越し予約までするなら
引越し侍 http://hikkoshizamurai.jp/
東近江市 引っ越し業者 | 一括比較において
東近江市の新たな移住先に引っ越しをこれから初めてする場合引っ越しの相場がいくらかなど、予想がつきませんよね。
初めて引っ越しする人は最初に引っ越し業者に見積り金額をもらう事が先決です。
引っ越し業者に見積り金額を出しておくということは引っ越しにかかる金額を安く済ませる為に、絶対条件、しないといけない事です。
引っ越しをする場合、自分だけで引っ越しする人はあまり見られないと思いますから、引っ越し屋にそれならば、とにもかくにも見積りを提示してもらって転居時の平均的な費用を頭に入れておきましょう。
引越しの値段を見積もってもらう時は必ず複数社に見積もりを取るようにしてもらいましょう。
なぜなら、特定の会社だけでは、比較をする事ができず、平均的な住み替えの費用は分からないからです。
見積りを出してみると、分かってきますが、引っ越し料金は会社により違っているのです。
東近江市だと、もしかすると、かなり違う業者があったりもします。
安価でできる引っ越し屋を調べる為、2,3社どころではなく、ありとあらゆる会社で料金の見積もりを出してもらう人もいっぱいいます。
東近江市でできるだけ、安い引っ越し代で済ませるのなら、絶対に見積もりを確認しておいて、十分に調べて見つけましょう。
安い費用でできる引っ越し会社を見つけるコツは、直感で予約をしてしまうようなことはせず、よく比較することが重要な事です。
引っ越しの日がいつか決まった時点で、早急に引っ越し業者に見積り金額を出してもらい比較をするのがいいですよ。
比較してすごくコストダウンになる場合も良くあります。
出来る限り節約をして納得のいく移住を実現しましょう。比較を怠らなければ費用を抑えて引っ越しをできます。
Copyright (C) 2016 引っ越し業者 滋賀 | 業者比較サービスで費用を抑えるAll Rights Reserved.


langs: ja ja ja fr ja ja ja ja en ja ja ja ja ja ja ja en ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja en ja en ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja fr en

text:
・自分が好きな情報だけを収集している状態(インターネット、YouTubeなどで自分が好きな情報や自分にとって都合が良い情報だけを集めている)
・特定の情報に偏っている、あるいは特定の個人・思想に偏っている、場合によっては洗脳されている状態
第3段階(心が開いている状態)
・自分にとって好ましい情報だけでなく、考え方が偏らないように必要な情報を集めている状態(該当分野の古典も含めて広く書籍・情報にあたる、自分と反対意見の人の著書を読む、普段会わない人と会う 等)
・もしくは、時間的制約などでこれらが出来ない場合には自分が得ている情報に偏りがあることを客観的に把握し認めている状態
第4段階(自己を確立している状態)
・集めた情報から自分の意見や考え方を論理立てて構築し、他人の意見も柔軟に受け入れつつ、原則は自分の意見に従うことができる状態
・得た情報に対して、前提条件などを考えて、前提条件が変わった場合の結果等について考察できる状態や得た情報の精度や起こる確率などを定量化できる状態
第5段階(自己を超越している状態)
・自分の価値観が確立されていると同時に、直観が研ぎ澄まされて、意思決定が正しく柔軟に行えるようになっている状態
・自己実現に向けて進んでいくだけでなく、他者への貢献といった自己超越に向かっている状態
■知的態度の2段階と3段階に横たわる溝とは?
知的態度の第1段階と第2段階は、気付かない間に他人の考えに支配されてしまっている状態で、第3段階~第5段階は自分の頭で考えられている状態です。自分の頭で考えているようで、実は第1段階と第2段階にいて他人の考えに染められている人が意外と多いと感じています。
なぜなら、第1段階と第2段階に留まっていることは短期的には楽で心地が良く、第2段階から第3段階へ移行するには大きな溝が横たわっているからです。つまり、第3段階へ移行するには、自分の考えが偏らないように能動的に情報を集める必要があり、それなりに大変だからです。
しかし、幅広いトピックの本を読むことなどは、手間を惜しまなければ誰でもできることです。そして、一度、第3段階以降の習慣を身につけてしまいますと、見方や考え方に広がりを持てますので更にバランスよく情報を収集したいと思うようになります。つまり、まず、外の情報対して出来るだけ心を開いて接し、幅広い情報に基づいて、自分の考え方を構築しようとする態度が重要なのではないでしょうか。


langs: ja ja id ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja zh ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja

text:
まず頭に浮かぶのは押上(スカイツリー前)近辺のリサイクルショップではないでしょうか?
以前は少し入りにくい雰囲気もありましたが、ここ数年、大手のリサイクルショップが増えてきたのも手伝って、リサイクルショップ=「入りずらい」といったイメージもかなり払拭されました。
押上(スカイツリー前)近辺にもリサイクルショップがあれば持ち込むのもありではないでしょうか?
ですが、リサイクルショップよりももっとお得にレコードを処分する方法があるんです
昔は入りずらいなどの印象が強かったのですが、最近ではお客さんも多く非常に入り易くなったのも影響しているのでしょう。
そのリサイクルショップにレコードを持ち込むのが押上(スカイツリー前)で損をしないレコードの処分の仕方なんです。
押上(スカイツリー前)のリサイクルショップより高値でしかも簡単にレコード買取を処分する方法がるんです。
それがレコードの出張・宅配買取サービスです。
出張・宅配のレコード買取サービスならわざわざ押上(スカイツリー前)近辺のリサイクルショップに行かなくてもレコードを簡単に、お得に処分することができるのです。
押上(スカイツリー前)近辺のリサイクルショップでレコードを買取してもらうよりも、簡単というのは誰でも簡単にわかると思いますが、なぜ宅配・出張サービスのほうがお得なのでしょうか?
レコードはアーティストや曲によって買取金額が違うケースがあり、リサイクルショップでは知識が少ないために価値のあるレコードも正当な評価をしてもらえないこともしばしば。
宅配、出張買取サービスなら専門知識を持ったスタッフがしっかり査定してくれるので安心。
A宅配キットで手間なし!
宅配なって梱包が面倒と思われるかもしれませんが、そんな心配は無用!
依頼すれば宅配キットを自宅まで送ってくれるので、そこにレコードを入れて送り返すだけ。
数が多ければ出張で買取もしてくれます。
梱包が面倒な人や数がとにかく多い人、押上(スカイツリー前)近辺にリサイクルショップがないという人には出張買取がおすすめ
お勧めの宅配レコード買取店【鎌倉レコード買取センター】
では、実際に宅配や出張でレコードを買取しても売らうにはどうすればいいのでしょうか?
インターネットで探すと数多くのレコード買取サイトが見つかります。
中々初めての人にはどこがお得化は判断がつかないと思います。
そこでお勧めのレコード宅配買取サービスは【鎌倉レコード買取センター】です。
【鎌倉レコード買取センター】は当然ですが、公式サイトからの申し込みや電話での申込みでも宅配キットをすぐに送ってくれますし、数が多ければ出張買取もしてくれます。
また、スタッフも知識が豊富なのでリサイクルショップでほとんど金額がつかなかったレコードも高値が付いたなんてことも!
電話で問い合わせると、応対も親切なので安心してレコードの買取をお願いできるはずです。
押上(スカイツリー前)近辺でレコードの買取で悩んでいる人は是非一度【鎌倉レコード買取センター】に一度相談してみることをお勧めします。
このページの先頭へ戻る
Copyright (C) 2018 押上(スカイツリー前)でレコードを高値買取All Rights Reserved.


langs: ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja uk zh ja ja ja ja uk ja ja ja zh ja ja uk uk uk uk uk uk ja uk ja ja ja ja zh uk ja ja ja ja zh uk uk ja uk ja ja ja ja ja ja ja uk uk de uk ja ja ja uk ja ja ja uk ja uk ja ja ja zh uk ja ja uk ja ja ja de uk ja ja zh ja ja zh ja ja uk zh ja uk uk ja zh ja ja ja uk ja ja ja ja ja ja ja uk ja uk ja ja ja uk ja zh uk ja uk ja ja ja ja ja ja uk uk ja uk uk zh uk ja zh uk uk uk zh ja zh ja ja ja ja ja zh zh ja zh ja uk ja uk ja ja uk uk uk ja zh ja uk ja ja zh ja ja ja ja ja ja zh uk ja ja ja uk ja uk ja ja ja ja uk ja ja uk zh uk ja ja ja

text:
大切にしている家財を運んでもらう際は、見積りの段階で詳細に説明し、費用が変わってしまうのかも確認するのも必要です。
具体的に話していくと、初期の基本料金が同じであっても、合計金額と金額とは高くなる事も多々あります。
細かい所もチェックして、一番お得な上砂川町の引越し業者を選びをしたいですよね。
優良な引っ越し屋を見つけ出すのに今では必須の一括見積りなのです。
最大50パーセントの割引特典など魅力的なサービスもあるのです。
おススメの一括見積もりサイトをご紹介しています。
上砂川町 引っ越し見積もり | 一括見積もりサイトランキング
引越し価格ガイド  http://a-hikkoshi.com/
HOME’S 引越し  http://homes.co.jp/
ズバット引越し比較  http://www.zba.jp/
引っ越しの予約までするなら
引越し侍 http://hikkoshizamurai.jp/
上砂川町 引っ越し見積もり | 費用見積もりにおいて
上砂川町の移住先に引っ越しをこれから初めてする場合引っ越し代なのかは、全然予想がつきませんよね。
そんな人は、ひとまず引っ越し業者に料金を見積もって取る事です。
引っ越し会社に予算の計算を見てもらうのは、引っ越し料金を安くするのに絶対条件、確実にやるべきことです。
住み替えを際に、業者を頼まずに利用しないというケースはほとんどいないと考えられますから引っ越し屋に頼むのであるならば、まずはまず見積りを提案してもらい引っ越しにかかるおおよそのコストを頭に入れておきましょう。
引越しの値段を確認する場合には、必ず複数社に見積もりを取るようにしてもらいましょう。
なぜなら、特定の会社だけでは、比較をする事ができず、引っ越しにかかる費用が分からないからです。
見積もりを出して確認すると見えてくると思いますが、引っ越し会社の料金はそれぞれなかなかどうして差があります。
上砂川町だと、例えば、差のある会社もあることがよくあります。
安価でできる引っ越し屋を比べてみる為に、1つや2つの業者だけじゃなく、たくさんの会社から見積もりを依頼をする人も少なくありません。
上砂川町でできるだけ、安い引っ越し料金で済ませたいのであれば何よりも引っ越し代の目安をしっかり出して、よく調べてみましょう。
お得な引っ越し屋を見つけるコツは直感で予約をする事はせず、良く見て、比べる事がポイントです。
住み替えの日付がいつか確定したら、早いうちに引っ越し業者に見積りをもらい、コストの比較をしてみましょう。
比較して大きく安い料金でなる事も期待できます。
最低限の節約をしてとっても安い価格で引越しをできるといいですよね。いろいろと比較すると、お得な料金で新居に引っ越しできます。
Copyright c 2016 引っ越し見積もり 北海道 | 業者比較サービスで安くすませる All Rights Reserved.


langs: ja ja ja ja ja ja ja ja ja ja ja ja ja ko ja ja en ko ja en ja ja ja zh ja ja ja ja ja zh ja ko ja ja ja ja ja zh ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja zh ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en

text:
3. 貞洞劇場(정동극장)
無料で日本の住所を取得して 海外から好きなサイトでショッピング
http://www.chongdong.com/chongdong_japanese/index.asp
회사소개 / 쿠폰・광고문의 RSS Sitemap
国内・海外旅行情報が満載!業界最多のユートラベルノートは、国内・海外ホテル、国内・海外ツアー予約や国内・海外旅行情報が詰まったブログ、クチコミ情報、動画や写真の登録も簡単に出来る国内・海外旅行情報サイト!国内・海外ホテルへの検索、韓国オプショナルツアーの検索もオンラインで今すぐ予約可能!
Wi-Fiルーターレンタル
한국어 | 日本語 | 简体中文 | 繁體中文 | English
Copyright (C) 国内・海外旅行情報 ユートラベルノート, Inc, All Rights Reserved.


langs: ja ja zh ja ja zh ja ja ja ja ja ja zh ja ja zh ja ja ja ja ja ja ja ja ja ja zh ja ja ja ja ja ja ja ja ja zh ja ja ja ja ja ja ja ja ja zh ja ja zh ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja zh ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja zh ja zh ja ja ja ja ja ja ja ja ja ja ja ja zh ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja zh

text:
クローゼットやカラーボックス、ソファー、冷蔵庫など家庭内で使うために購入して、時間が経てば不要になってるものが出てきてます。
こういった大型のものなら、自治体で指定された大きさを超えてしまうと、粗大ゴミとして処分しないといけなくなります。
しかし、その中では回収できないものもありますし、京都市南区東寺周辺で指定された場所まで運ぶのも大変です。
そこで、東寺周辺の不用品回収業者なら苦労もせず、便利に回収できます。
皆さんの中にダイエットのため、もっとかっこいい身体を作るためなどの理由で購入して使わずにそのまま放置してる器具はありませんか?
場所はとるだけとるし、しかもトレーニング器具はどう処分すべきかよく分かりませんよね。
京都府京都市南区の不用品回収業者の中にはそういった悩みを抱えてる方のために、トレーニング器具の回収も行ってるところがあります。
皿洗いで落として割れてしまったり、色の変質になったりで使えなくなった食器があると思います。
しかし、燃えないゴミとして処分したくても危ないから困りますよね。
京都市南区の東寺周辺の不用品回収業者によっては異なりますが、食器の回収もしてくれる場合があります。
食器1枚なら難しいですが、他の不用品など処分したいものがあれば一緒に回収してくれますので東寺周辺で回収してくれる業者を探してみるのもいいでしょう。
趣味でスキーやスノーボード、釣りなどで使う品物を回収してもらうこともできます。
さらに水槽や自転車まで回収できます。
こういったものを回収したい場合は、京都府の不用品回収業者の中でこれらを扱う業者に依頼しましょう。
子供用のベビーシートや学習机などのものは子供の成長によって不要になります。
それらをまとめておいて一緒に回収してもらうこともできます。
また、京都府京都市南区の東寺周辺の不用品回収業者の中では自動車の買取・回収を行うところもあります。
そして、引っ越しや大掃除の際に出てくるゴミまで回収してくれます。
京都府の不用品回収業者って生活の中で不要になったものの全般を回収してくれるんですね。
京都府京都市南区東寺周辺の不用品回収業者ってこんなことまでしてくれるの?
不用品がたくさんあって、一刻でも早く処分して場所を広くしたいという方はすくなくはないでしょう。
日常生活で当たり前のように不用品がたくさん出てきます。
ここでは京都市南区の不用品業者ってこんなことまでしてくれるの?と思うちょっと特殊な状況をいくつか紹介します。
引越しのときはできるだけ荷物を減らした方が引っ越しの費用も抑えることができます。
そのために、最近では引っ越す前に出てきた不用品を処分したいという方が多くなっています。
東寺周辺の引越し業者を利用して一緒に不用品の回収を行うところもありますが、業者に頼まず、自分で運ぶとしたら不用品の処分は大変ですよね。
その時は京都府京都市南区の不用品回収業者を利用すれば楽に引っ越すことができます。
ゴミ屋敷ってなに?部屋中ゴミだらけってこと?って初めて聞いた方はそう思うかも知れません。
ゴミ屋敷とは本当に必要なものなのか、これってゴミになるのかはっきり分からないものが家の中に溢れているような状態をそう呼びます。
一刻も早くゴミ屋敷を片付けたい、きれいにして改造して住みたいなど考えてる方にぴったりなのが、不用品回収業者です。
東寺周辺の不用品回収業者はゴミ屋敷も対応するところが多く、ゴミの種類の分別もきちんとしてくれるます。
また、業者によっては買取もしてくれるところがあるので、より適切に不用品の処分ができます。
亡くなった親族が住んでいた家にそのまま残っている物をどう片づけて処分すればいいのかよくわからなくて困ってはいませんか?
京都市南区の東寺周辺の不用品回収業者の中では遺品整理もしてくれる業者があります。
思い出が残っているものは遺品として残しておいて、どうしてもいらないものは不用品回収業者に処分してもらいましょう。
また、処分してもらうものの中には、まだまだ使えるものもありますので、買取をして回収料金を削減できます。
ここでひとつ気をつけるべきは、京都府で遺品整理の実績が多い不用品回収業者を選びましょう。
京都府京都市南区東寺周辺の不用品回収業者の選び方
回収してほしい不用品の量や個数、自分の状況に合わせて最適な業者が異なることを上記をみてご理解できたと思います。
状況にあう業者をいくつかリストにまとめてみました。
▼ こんな方なら京都府京都市南区東寺周辺の不用品回収業者に!
破損、キズ、よごれ、臭いがある
不用品回収と買取を一緒にしたい
▼ こんな方なら京都府京都市南区東寺周辺のリサイクルショップに!
雑貨や服などの小物が多い
ブランド品や骨董品など高級なものがある
ショップに持ち込みできる
ギターやピアノなどの楽器がある
▼ こんな方なら京都府京都市南区東寺周辺の引っ越し業者に!
引っ越し当日まで家電や家具を使いたい
回収してほしい不用品が家電や家具のみ
状況に合わせて京都府の京都市南区東寺周辺の業者を選んだら、できれば複数のところに見積りを出してもらいましょう。
多くの業者は無料見積りを出してくれるので、3社ぐらいに頼んでどの業者が買取の査定金額が高いのか、不用品回収の費用はいくらなのかなど比較して選んでください。
京都府京都市南区東寺周辺の不用品業者のこれだけは注意!
京都府京都市南区の東寺周辺の不用品回収業者はほとんどのものは全て回収してくれるし、買取もできますが、できないものもあります。
ガスボンベやガス缶など中身がそのままの危険要素があるものは回収できません。
しかし、中身を捨てるか、使い終わって中身がなければ回収してくれる業者もあります。
処分したい不用品がある場合は、まずそれらの回収を行っている東寺周辺の複数の不用品回収業者に問い合わせをして一番安く回収してもらえる業者を選びましょう。
また、京都府の不用品回収業者は数多くありますが、その中には悪徳業者も存在します。
初めて京都市南区の東寺周辺の業者を利用する方なら騙されやすいので、行政認定の許可をもっているかを必ず確認しましょう。
◆ 不用品回収 (家庭用)
一般廃棄物 収集運搬許可
◆ 不用品回収 (事業用)
産業廃棄物 収集運搬業許可
事業系一般廃棄物 収集運搬業許可
これらの許可を持っている東寺周辺の業者はホームページなどにきちっと記載されています。
もしも記載されてなかったら悪徳業者の可能性が高いのでなるべく避けましょう。
また、24時間ネットで申込できるところが増えていますが、できれば電話にてお問合せしてみましょう。
電話対応はしっかりできているのか、口調はどんな感じなのか、欲しがるニーズに対してちゃんと答えるのかなどを確認してください。
最後に、見るからにあやしいところは利用しないように方がいいでしょう。
特に「不用品回収無料」には気を付けるべきです。
「無料」という言葉につい頼んでしまいたい気持ちになるのもわかりますが、悪徳業者の一番多い手口であり、案の定いろんなトラブルに巻き込まれることになりかねます。
しっかり気を付けて選んで福岡県で安心して不用品回収と買取を一緒に行ってみましょう。
不用品で悩んでいた全国のユーザーが不用品の回収・買い取りを業者に頼んだ結果、感じたことをレビューしています。
愛媛県:S.T(24)
通販でソファーのサイズを間違って買ってしまい、新しく購入しました。間違って買ったものを処分するために不用品回収業者にお願いしました。初めての利用だったので、回収だけしてくれればいいと思ってたのですが、受付の方が全然使ってないきれいな状態だったら買取もできますよといってビックリしました。回収当日に買取でお金をもらい、回収金額を少し安くしてもらえたのでまた、何かあったら利用したいです。
青森県:K.T(42)
古い布団を処分したくて探してる途中、あるブログでおすすめされていたのでこの不用品回収業者にお願いしました。まさか布団も回収してくれるとは思わなかったです。不用品回収業者って色々回収したり、買取したりするんですね!布団一式だけだったのにもかかわらず、対応も素晴らしくて利用甲斐がありました。
福岡県:H.I(51)
転勤先で3年間の勤務を終えて地元に戻るため片づけをしていたら、意外と不用品が結構出てきました。この業者にベッドや家電製品などは買取して他の不用品は回収をお願いしました。不用品回収業者だから買取の金額はあんまり高くないのではと疑いもありましたけど、ちゃんとした査定で納得できる金額でした。もし、また利用することになったらぜひこの業者を利用したいです。
不用品回収・買い取り業者ランキング
不用品回収・買い取りを得意とする業者の中でも特に人気がある業者をランキング形式で発表します!
宅配買取するならエコファ!エコファなら家電から車迄様々な不用品を宅配で買い取ってくれます。手間がかからずお金を手に入れる事ができるためめんどくさがりな方におすすめです!
エコファ宅配買取公式へ行く
オールサポートは、大阪・兵庫を中心とした不用品回収買取業者です。良い口コミが多く、初めて不用品回収業者を利用する人にとって安心して利用出来る業者になります。
オールサポート公式へ行く
全国各地の不用品回収買取業者のエコクリーンは、様々な物を回収買取出来ます。ゴミ屋敷の片付けもおまかせ出来ますよ。まずはメールで無料お問い合わせしてみて下さい。


langs: ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja uk uk ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja uk ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja ja ja ja uk ja ja ja ja ja ja ja ja ja ja ja zh ja ja en

text:
可能であれば、充分に距離をとりながら、蜂の巣を観察しましょう。巣がある場所・大きさや蜂の種類がわかると、危険度や対処の参考になります。蜂の種類については、蜂の巣の特徴からも推測することができます。
こういった情報は専門業者や役所に相談する際に必要になりますので、可能な範囲で確認しておきましょう。
⇒こんなところに蜂の巣が!
蜂の巣を確認したら、営巣場所に応じて必要な対応をとらなければなりません。というのも、蜂の巣ができたことで発生する危険性については、原則として、蜂の巣がある土地の所有者に責任があるからです。理不尽に感じるかもしれませんが、法律上は土地・建物の管理責任の範囲だと考えられています。自分の土地内に蜂の巣ができ、放置しておいたために、通行人などが蜂に刺されて被害を負った場合、その責任を問われる可能性があります。
いずれにせよ住人自身にとっても危険ですから、自宅の敷地内・自分が所有する土地内に蜂の巣ができた場合は、自身でなんらかの対応をしなければなりませんし、自分の土地でない場所については、それぞれの持ち主・管理者や地域の役所などに蜂の巣があることを伝えましょう。
自宅にできた蜂の巣を自力で駆除する方法もありますが、やはり危険なので、できれば専門業者に依頼するのをオススメします。自力で駆除する場合にも、必ず役所や専門業者に相談しましょう。
役所によっては、行政のサービスとして何らかのサポートを受けられる場合があります。駆除業者の紹介や、自力で駆除する場合の道具類の貸し出しのほか、駆除業者を利用した場合の費用の補助や、対応に関するアドバイスなど地域によって様々です。
駆除業者に駆除を依頼する場合
駆除を依頼する場合は、当然のことながら信用できる業者を選ばなければなりません。
業者によって駆除にかかる費用も大きく異なることがありますので、役所が業者を紹介した場合であっても、複数の業者を比べてみることをオススメします。
また、開業届を出さずに営業をしている業者も実際にありますので、駆除後のトラブルを防ぐためにもしっかりと選びましょう。
大津市(旧大津市、志賀町)・草津市・守山市・栗東市・野洲市(旧中主町、野洲町)・甲賀市(旧水口町、土山町、甲賀町、甲南町、信楽町)・湖南市(旧石部町、甲西町)・東近江市(旧八日市市、永源寺町、五個荘町、愛東町、湖東町、能登川町、蒲生町)・近江八幡市(旧近江八幡市、安土町)・日野町・竜王町・彦根市・愛荘町(旧秦荘町、愛知川町)・豊郷町・甲良町・多賀町・米原市(旧山東町、伊吹町、米原町、近江町)・長浜市(旧長浜市、浅井町、びわ町、虎姫町、湖北町、高月町、木之本町、余呉町、西浅井町)・高島市(旧マキノ町、今津町、朽木村、安曇川町、高島町、新旭町)
京都市(左京区、北区、上京区、中京区、右京区、東山区、下京区、南区、西京区、山科区、伏見区)・宇治市・宇治田原町・向日市・長岡京市・大山崎町・久御山町・八幡市・城陽市・井出町・京田辺市・和束町


langs: ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en es ja en

text:
リモートセンサーノード構築用 CPU ボード(XBee-ZB + ATmega328P)
今回の記事では、東京コスモス電機より販売されているワイヤレスモジュール TWE-Lite をリモートから操作する例を紹介したいと思います。TWE-Lite は XBee と同じように簡単にワイヤレス機能を利用することができ、無線モジュールのファームウエアをユーザーが書き換えて外付けマイコン無しでセンサーノードを作成することができます。今回の記事では、ファームウエアはデフォルトでロードされている “超簡単!TWE標準アプリ” を使用しています。
リモートに設置したTWE-Lite デバイスをWebAPI から簡単に操作できるようにします。また、専用のWeb アプリを作成して、スマートフォンや PC のWebブラウザから GUI を使用して簡単に操作できるようにします。
今回使用する TWE-Lite デバイスはブレッドボードなどで簡単に使用できるように、TWE-Lite DIP タイプを3つ使用しています。1つを PC(Windows) に接続する親機として使用して、残りの2つを子機として使用します。
親機用 TWE-Lite DIP デバイスには、PC と仮想COM ポートでアクセスできるように USBシリアルアダプタ(秋月電子 “FT232RL USBシリアル変換モジュールキット”)を接続しています。このシリアルアダプタを使用する代わりに、USBに直接接続できる ToCoStick やTWE-Lite R を利用してももちろん構いません。
親機をPCに接続した様子です。ブレッドボード上にUSBシリアルアダプタと TWE-Lite DIP を配置しています。後の項で説明する TWE-Lite デバイスの初期設定やファームウエアの書き換えにも使用できるように、リセットボタンとプログラムボタンも接続しています。このときブレッドボードを使用しているとTWE-Lite DIP の入れ替えが簡単にできます。
TWE-Lite の電源は USB シリアルアダプタから出力される 3.3V を使用しています。上記の回路は TWE-Lite のホームページに公開されている、 “TWE-Lite のファームウエア書き込み方法” に関するマニュアルを参考にしました。
子機#1にはI2C の試験用に 24LC256 EEPROM とTMP102 温度センサを I2C バスに接続しています。I2C バスはブレッドボード上に接続した4.7Kの抵抗でプルアップしています。子機の電源は AC アダプタから 3.3V を供給して動作させています。
ここで必ずファームウエアのバージョンを確認してください。上記の場合には v1.7.1 になっています。最新バージョンの v1.6.6. または v.1.7.1 よりも古いバージョンの場合にはファームエアの更新が必要です。購入した直後のデバイスには古いファームウエアが格納されている場合がありますので必ず確認するようにしてください。
ファームエアを更新する場合には、プログラムボタン(オレンジのタクトスイッチ)を押しながらリセットボタン(白のタクトスイッチ)を押して、その後プログラムボタンを離すことでプログラムモードに入ります。TWE-Lite のホームページから書き込みソフトとファームエアファイルをダウンロードして書き込みを行います。詳しい手順はTWE-Lite のホームページを参考にしてください。
最新バージョンのファームウエアを使用していることを確認したら、設定画面で Application ID(PAN ID)を任意の値に設定します。ここでは 0x00aabbcc に設定しています。Application ID の値は親機と子機全てに同じ値を設定します。次に Option Bits を 0×00000012 に設定します。この設定を行うと親機側のADC変化検出と定期送信を停止することができます。
今回のアプリケーションの様に子機側の I/O を個々にリモート操作する場合には必ずこの設定を行います。この設定を行わないと(デフォルト設定値のままだと)親機側の デジタル入力や A/D 値が子機側のデジタル出力や PWM 出力値に自動的に反映されて、うまくリモート操作することがきませんので注意してください。
親機の設定が終了したら、ブレッドボード上の TWE-Lite DIP を入れ替えて子機#1 の設定を行います。設定値は以下のようになります。
親機と同様に Application IDを 0x00aabbcc に設定しています。子機では Device ID を設定してそれぞれの子機を個別に操作できるようにします。ここでは 0×01 に設定しています。
また、Option Bits は 0×00000002に設定して定期送信を停止していますが、デフォルトの 0×00000000 のままでも構いません。どちらの値に設定しても、デジタル入力が変化した時や A/D 変換値が一定以上変化した場合には、自動的に親機側にイベントが送信されます。このイベント情報によってサーバー側が現在の子機のデジタル入力値とA/D 変換値がどのようになっているかをその都度、子機側に問い合わせなくても把握することができます。
子機#1 の設定が終了したら、TWE-Lite デバイスを子機#2 に入れ替えて同様の設定をしてください。このとき、Device ID の設定値のみを変更して 0×02 にして後の設定値は子機#1 と同じにします。
●PC(DeviceServer)に親機を接続
親機を PC に接続した後、子機側の電源も入れて通信可能な状態にします。次に、PC 側にインストールした DeviceServer の “サーバー設定” プログラムを起動して、親機を接続しているシリアルポート(仮想 COMポート)を新規のシリアルデバイスとして登録します。
登録する、シリアルデバイスの設定は上記のようになります。COM ポート名は親機のシリアルアダプタ(FT232RL) で作成された仮想COM ポートを指定します。ボーレートは TWE-Lite DIP のデフォルト値 115200 を指定します。デバイスタイプには “TWE” を指定します。この指定によって DeviceServer ではこのシリアルポートに対して以下の機能が有効になります。
COM ポートから入力されたアスキー形式の TWE-Lite パケットを受信した時に、自動的にイベントハンドラ (SERIAL_TWE.lua) が起動されてパケット内容を解析します。また、DeviceServer に作成したユーザースクリプトやイベントハンドラ中から twe_print() ライブラリ関数を使用して、アスキー形式のパケット送信や、リクエスト・リプライタイプのコマンドの送受信を行うことが可能になります。
デフォルトで動作している ”超簡単!TWE標準アプリ” ファームウエアを独自に拡張して新しいコマンドを作成した場合でも、同様のアスキー形式にしておくことで、新しいコマンドを簡単に DeviceServer から利用することができます。
シリアルデバイス登録後の “サーバー設定” プログラムのデバイス一覧は以下のようになります。
この設定画面では複数の親機を同時に登録することもできます。別々のPAN(Application ID) で管理されている子機グループ間の操作も簡単に行うこともできます。
“次へ” ボタンを押して”サーバー設定” プログラムの操作を完了させると、自動的にDeviceServer が再起動した後 TWE-Lite デバイスを使用することができるようになります。
●WebAPI からTWE-Lite 子機を操作する
最初の使用例として リモートの TWE-Lite 子機#1 のデジタル出力ピンを操作してみます。Web API を使用して /command/json/script のURL にアクセスします。
URL パラメータ “name” で指定する Lua スクリプトファイルは “TWE/DO_PIN_SET” でスクリプトの説明は後述します。”com” パラメータには親機が接続されている COM ポート名を指定します。”id” , “pin”, “value” パラメータには操作対象の子機の Device ID, DO ピン番号、出力する値を指定します。この例では子機#1 のDO#3 を Low に設定しています。
Web API で実行する “TWE/DO_PIN_SET”  Lua スクリプトファイルは以下の様に記述されています。
file_id = "TWE/DO_PIN_SET" --[[ ●機能概要 TWEワイヤレスデバイス子機の指定したデジタルピンの値を設定する ●リクエストパラメータ --------------------------------------------------------------------------------- キー値 値 値の例 --------------------------------------------------------------------------------- com TWEワイヤレスデバイス親機が接続された COM ポート名 またはタイトル名 "COM4" id 取得対象のTWEワイヤレスデバイス子機の論理IDを10進数の文字列で 指定する "1","120" pin DO#番号(1 から 4 までの整数) "4" value pin に指定したI/Oポートに設定する値(0 または 1) "1" TWEワイヤレスデバイスの場合には "1" で Low出力, "0" で High出力になります ●リターンパラメータ --------------------------------------------------------------------------------- キー値 値 値の例 --------------------------------------------------------------------------------- ]] ------------------------- -- パラメータチェック ------------------------- if not (g_params["com"] and g_params["id"] and g_params["pin"] and g_params["value"]) then log_msg("parameter error",file_id) error() end local stat,com = serial_find_device(g_params["com"]) if not stat then log_msg("COM port not found",file_id) error() end local pin = tonumber(g_params["pin"]) - 1 if (pin   3) then log_msg("invalid DO# number",file_id) error() end ---------------------------------------------------------------------- -- 0x80 コマンド送信 ---------------------------------------------------------------------- local mask = bit_tohex(bit_lshift(1,pin),2) local io = "00" if g_params["value"] == "1" then io = mask end local command_str = ":" .. bit_tohex(tonumber(g_params["id"]),2) .. "8001" .. io .. mask .. "FFFFFFFFFFFFFFFFX" for cnt = 1,2,1 do -- 確実に操作するために同一コマンドを2回送信する if not twe_print(com,command_str) then error() end wait_time(10) end
URL で指定された複数のパラメータは、Lua スクリプト実行時に g_params[] 連想配列に格納されています。
最初に必要なパラメータが指定されているかを調べた後、command_str 文字変数に TWE-Lite のアスキー形式で送信する文字列データを格納していきます。その後、twe_print() ライブラリ関数を使用して、DeviceServer に登録したシリアルポートからデータパケットが送信されます。データパケットを受信した親機では 0×80 コマンドが実行されてリモート側の子機#1 の DO#3 が変更されます。
次の動作例では、子機のデジタル入力と A/D 変換値を Web API から取得します。
デジタル出力の時と同様に、DeviceServer で公開されている WebAPI コマンドパス /command/json/script にアクセスます。 “name” パラメータには “TWE/AD_DI_GET” を指定して子機のデジタル入力ポートと A/D 変換値を取得します。スクリプトの実行結果は、JSON 形式で返りますのでこの内容がブラウザ画面に表示されています。
Web アプリや、外部のアプリケーションサーバーから同様の URL にアクセスするだけで、リモートに設置している子機の状態を簡単に取得することができることになります。
TWE/AD_DI_GET Lua スクリプトファイルは以下の様に記述されています。
file_id = "TWE/AD_DI_GET" --[[ ●機能概要 TWEワイヤレスデバイス子機のA/D値, DI 値を取得する ●リクエストパラメータ --------------------------------------------------------------------------------- キー値 値 値の例 --------------------------------------------------------------------------------- com TWEワイヤレスデバイス親機が接続された COM ポート名 またはタイトル名 "COM4" id 取得対象のTWEワイヤレスデバイス子機の論理IDを10進数の文字列で 指定する "1" ●リターンパラメータ --------------------------------------------------------------------------------- キー値 値 値の例 --------------------------------------------------------------------------------- AD1 TWEワイヤレスデバイス子機 AD1 の値 "0" AD2 TWEワイヤレスデバイス子機 AD2 の値 "-1" AD3 TWEワイヤレスデバイス子機 AD3 の値 "1980" AD4 TWEワイヤレスデバイス子機 AD4 の値 "500" DI1 TWEワイヤレスデバイス子機 DI1 の値 "1" DI2 TWEワイヤレスデバイス子機 DI2 の値 "1" DI3 TWEワイヤレスデバイス子機 DI3 の値 "1" DI4 TWEワイヤレスデバイス子機 DI4 の値 "1" STATUS スクリプト実行が正常に終了した場合には "OK"、 エラー発生時には"ERROR" が設定される "OK" ]] ------------------------- -- パラメータチェック ------------------------- if not (g_params["com"] and g_params["id"]) then log_msg("parameter error",file_id) error() end local stat,com = serial_find_device(g_params["com"]) if not stat then log_msg("COM port not found",file_id) error() end ---------------------------------------------------------------------- -- 子機の最新のデバイス情報をグローバル共有変数から取得 ---------------------------------------------------------------------- local key = "TWE_" .. com .. "_" .. g_params["id"] local val stat,val = get_shared_data(key) if (not stat) or (val == "") then if not script_result(g_taskid,"STATUS","ERROR") then error() end return end local tbl= csv_to_tbl(val) if tbl[3] and tbl[4] and tbl[5] and tbl[6] and tbl[7] and tbl[8] and tbl[9] and tbl[10] then if not script_result(g_taskid,"DI1",tbl[3]) then error() end if not script_result(g_taskid,"DI2",tbl[4]) then error() end if not script_result(g_taskid,"DI3",tbl[5]) then error() end if not script_result(g_taskid,"DI4",tbl[6]) then error() end if not script_result(g_taskid,"AD1",tbl[7]) then error() end if not script_result(g_taskid,"AD2",tbl[8]) then error() end if not script_result(g_taskid,"AD3",tbl[9]) then error() end if not script_result(g_taskid,"AD4",tbl[10]) then error() end if not script_result(g_taskid,"STATUS","OK") then error() end else if not script_result(g_taskid,"STATUS","ERROR") then error() end end
このスクリプトではTWE-Lite 子機を操作するために、親機に対してコマンドパケットを送信していない点に注意してください。
TWE-Lite 子機はデジタル入力値やA/D 変換値を、定期的にまたは変化したときに親機に対してイベントデータを送信しています。DeviceServer では親機で受信したイベントデータをイベントハンドラで処理して、子機ごとの最新の I/O 値をグローバル共有データに保存しています。
このスクリプトではそのグローバル共有データの値を利用して子機のデジタル入力とA/D 変換値を返しています。親機がイベントパケットデータを受信したときに、DeviceServer 側で実行するイベントハンドラ(SERIAL_TWE) については後の項で説明します。
続いて子機の I2C バスを WebAPI で操作する例を紹介したいと思います。最初に子機で I2C データを書き込み用スクリプト(TWE/I2C_WRITE) をご覧ください。
file_id = "TWE/I2C_WRITE" --[[ ●機能概要 TWEワイヤレスデバイス子機の I2C バスに接続したスレーブデバイスにデータを書き込む ●リクエストパラメータ --------------------------------------------------------------------------------- キー値 値 値の例 --------------------------------------------------------------------------------- com TWEワイヤレスデバイス親機が接続された COM ポート名 またはタイトル名 "COM4" id 取得対象のTWEワイヤレスデバイス子機の論理IDを10進数の文字列で 指定する "1" slave_addr I2C スレーブデバイスアドレス(16進数2桁) "50" data スレーブデバイスに書き込むデータ(16進数)列 "0A0B0C" 最大31バイトまで ●リターンパラメータ --------------------------------------------------------------------------------- キー値 値 値の例 --------------------------------------------------------------------------------- ]] ------------------------- -- パラメータチェック ------------------------- if not (g_params["com"] and g_params["id"] and g_params["slave_addr"] and g_params["data"]) then log_msg("parameter error",file_id) error() end local stat,com = serial_find_device(g_params["com"]) if not stat then log_msg("COM port not found",file_id) error() end local data_len = math.floor(string.len(g_params["data"]) / 2) if data_len   1 then command_str = command_str .. string.sub(g_params["data"],1,2) .. bit_tohex(data_len - 1,2) .. string.sub(g_params["data"],3,-1) .. "X" end stat,rdata = twe_print(com,command_str,"89") ---------------------------------------------------------------------- -- 排他制御終了 ---------------------------------------------------------------------- cstat = critical_section_leave(handle) if not cstat then log_msg("critical_section_leave() failed",file_id) error() end if not stat then log_msg("twe_print() failed",file_id) error() end if string.sub(rdata,10,11) ~= "01" then -- TWE レスポンスフレームで SUCCESS 以外を受信した log_msg("twe remote operation failed",file_id) error() end
このスクリプトでは TWE-Lite のファームウエアで用意されている、子機の I2C バスを操作するためのコマンドパケット(0×88) を送信しています。twe_print() ライブラリでリクエストパケットを送信するときに、リプライパケット(0×89) を受信するまで内部で待機するようにパラメータを指定しています。リプライパケットには I2C 操作が正常に完了したかどうかを示すステータスが格納されていますので、これを確認しています。
またI2Cバス操作のコマンドの様に、リクエストパケット送信とその結果をリプライパケットで受信するようなタイプのコマンドを処理する場合には、クライアント(Web APIを利用しているプログラム)側から同時にリクエストが発生した場合に備える必要があります。Lua スクリプト中に排他処理を記述して、Web API を使用する側からは同時使用しても問題が発生しないようになっています。
次は子機のI2C データを読み込むためのスクリプト(TWE/I2C_READ)で、以下の様になっています。
file_id = "TWE/I2C_READ" --[[ ●機能概要 TWEワイヤレスデバイス子機の I2C バスに接続したスレーブデバイスから 指定バイト数分のデータ読み込みを行う ●リクエストパラメータ --------------------------------------------------------------------------------- キー値 値 値の例 --------------------------------------------------------------------------------- com TWEワイヤレスデバイス親機が接続された COM ポート名 またはタイトル名 "COM4" id 取得対象のTWEワイヤレスデバイス子機の論理IDを10進数の文字列で 指定する "1" slave_addr I2C スレーブデバイスアドレス(16進数2桁) "50" count データ読み込みバイト数(32 以下の10進整数) "32" ●リターンパラメータ --------------------------------------------------------------------------------- キー値 値 値の例 --------------------------------------------------------------------------------- I2C_DATA スレーブデバイスから読み込んだデータ(16進数)列 最大32 バイト(64文字)まで "0A0B0C ]] ------------------------- -- パラメータチェック ------------------------- if not (g_params["com"] and g_params["id"] and g_params["slave_addr"] and g_params["count"]) then log_msg("parameter error",file_id) error() end local stat,com = serial_find_device(g_params["com"]) if not stat then log_msg("COM port not found",file_id) error() end ---------------------------------------------------------------------- -- 排他制御開始 -- 同じ TWE親デバイスに対して、QUERY コマンドが複数同時実行される場合に備えています。 ---------------------------------------------------------------------- local cstat,handle = critical_section_enter("TWEQuery" .. com,5000); if not cstat then log_msg("critical_section_enter() failed",file_id) error() end ------------------------------------------------------------------------------------------------ -- リクエストフレーム送信とリプライ受信 ------------------------------------------------------------------------------------------------ local command_str = ":" .. bit_tohex(tonumber(g_params["id"]),2) .. "880102" .. bit_tohex(tonumber("0x" .. g_params["slave_addr"]),2) .. "00" .. bit_tohex(tonumber(g_params["count"]),2) .. "X" stat,rdata = twe_print(com,command_str,"89") ---------------------------------------------------------------------- -- 排他制御終了 ---------------------------------------------------------------------- cstat = critical_section_leave(handle) if not cstat then log_msg("critical_section_leave() failed",file_id) error() end if not stat then log_msg("twe_print() failed",file_id) error() end if string.sub(rdata,10,11) ~= "01" then -- TWE レスポンスフレームで SUCCESS 以外を受信した log_msg("twe remote operation failed",file_id) error() end --------------------------------------------------------------- -- リターンパラメータ設定 --------------------------------------------------------------- if not script_result(g_taskid,"I2C_DATA",string.sub(rdata,14,-3)) then error() end
殆ど、I2C_WRITE スクリプトの内容と同じですが、リプライパケットで受信したバイトデータをスクリプトリターンパラメータで返す部分が追加されています。
前述の I2C_WRITE と I2C_READ スクリプトを組み合わせて、I2C データの書き込みと読み込みをする I2C_WRITE_READ スクリプトも作成してあります。内容は以下になります。
file_id = "TWE/I2C_WRITE_READ" --[[ ●機能概要 TWEワイヤレスデバイス子機の I2C バスに接続したスレーブデバイスにデータを書き込んだ後、 指定バイト数分のデータ読み込みを行う ●リクエストパラメータ --------------------------------------------------------------------------------- キー値 値 値の例 --------------------------------------------------------------------------------- com TWEワイヤレスデバイス親機が接続された COM ポート名 またはタイトル名 "COM4" id 取得対象のTWEワイヤレスデバイス子機の論理IDを10進数の文字列で 指定する "1" slave_addr I2C スレーブデバイスアドレス(16進数2桁) "50" count データ読み込みバイト数(32 以下の10進整数) "32" data スレーブデバイスに書き込むデータ(16進数)列 "0A0B0C" 最大31バイトまで ●リターンパラメータ --------------------------------------------------------------------------------- キー値 値 値の例 --------------------------------------------------------------------------------- I2C_DATA スレーブで倍しから読み込んだデータ(16進数)列 最大32 バイトまで "0A0B0C ]] ------------------------- -- パラメータチェック ------------------------- if not (g_params["com"] and g_params["id"] and g_params["slave_addr"] and g_params["data"] and g_params["count"]) then log_msg("parameter error",file_id) error() end ------------------------- -- I2C write操作 ------------------------- local param = {} param["com"] = g_params["com"] param["id"] = g_params["id"] param["slave_addr"] = g_params["slave_addr"] param["data"] = g_params["data"] local stat,result = script_exec2("TWE/I2C_WRITE",param) if not stat then error() end ------------------------- -- I2C read操作 ------------------------- param["count"] = g_params["count"] local stat,result = script_exec2("TWE/I2C_READ",param) if not stat then error() end script_result(g_taskid,"I2C_DATA",result["I2C_DATA"])
このスクリプトは、最初に I2C 書き込みトランザクションを実行した後、読み込みトランザクションを実行します。読み込んだデータ列をスクリプトパラメータで返します。内容は、単に前述の2つのスクリプトを順番にコールしているだけです。
この I2C_WRITE_READ スクリプトを使用して、TWE-Lite 子機#1 に接続した 24LC256 EEPROM のデータをリードしてみます。接続の様子は前の項で紹介した子機の写真を参考にしてください。
“slave_addr” パラメータには 24LC256 のI2Cスレーブアドレス0×50 を指定しています。”data” パラメータに “0000″ を指定してEEPROM デバイス内のアドレスポインタを示す 0×00, 0×00 の2バイトを書き込みます。その後、”count” パラメータで指定した32バイト分のデータを JSON フォーマットで取得しています。
次の動作例は、同じ子機のI2C バスに搭載されている TMP102 温度センサの値を取得してみます。I2Cバス操作と温度計算を以下のスクリプト(TWE/DEVICE/TMP102_READ)で実行します。
file_id = "TWE/DEVICE/TMP102_READ" --[[ ●機能概要 I2C バスに接続した温度センサー(TMP102) の値を取得する ●リクエストパラメータ --------------------------------------------------------------------------------- キー値 値 値の例 --------------------------------------------------------------------------------- com TWEワイヤレスデバイス親機が接続された COM ポート名 またはタイトル名 "COM4" id 取得対象のTWEワイヤレスデバイス子機の論理IDを10進数の文字列で 指定する "1" ●リターンパラメータ --------------------------------------------------------------------------------- キー値 値 値の例 --------------------------------------------------------------------------------- temperature センサーから取得した摂氏温度 "12.5" "-25.0" ]] local slave_addr = "48" ------------------------- -- パラメータチェック ------------------------- if not (g_params["com"] and g_params["id"]) then log_msg("parameter error",file_id) error() end ---------------------------------------- -- 12 bit 幅の2の補数を符号付整数に変換 ---------------------------------------- function calc_2comp(val) if(bit_and(val,0x800) ~= 0) then return -1 * (bit_and(bit_not(val),0xfff) + 1) else return val end end ----------------------------------------------------------------------- -- TMP102温度レジスタの値を取得する -- pointer register 0x00 をセットした後、2 バイトのレジスタ値を取得する ----------------------------------------------------------------------- local param = {} param["com"] = g_params["com"] param["id"] = g_params["id"] param["slave_addr"] = slave_addr param["data"] = "00" param["count"] = "2" local stat,result = script_exec2("TWE/I2C_WRITE_READ",param) if not stat then error() end --------------------------------------- -- 温度レジスタ値から摂氏温度を計算する --------------------------------------- local reg = {} reg = hex_to_tbl(result["I2C_DATA"]) local temp_int = bit_lshift(reg[1],4) + bit_rshift(reg[2],4) local temperature = 0.0625 * calc_2comp(temp_int) script_result(g_taskid,"temperature",string.format("%3.1f",temperature))
このスクリプト中からは、先ほど紹介した I2C_WRITE_READ スクリプトをコールして子機#1 のI2C バスを操作して温度レジスタ値をリードしています。その後摂氏温度を計算してリターンパラメータに返しています。このスクリプトを Web API から実行したときの様子が以下になります。
JSON で返されたデータ内の “temperature” 部分が子機#1で計測された現在の温度になります。
ここで紹介した以外にも子機の PWM を操作するためのスクリプトやデジタル出力と PWM の全チャンネルを同時に更新するためのスクリプト、親機に接続されている全子機のID リスト取得などのスクリプトが予め用意されています。これらのスクリプトファイルは DeviceServer インストール時に “C:\Program Files (x86)\AllBlueSystem\Scripts\TWE” フォルダに格納されていますので Web API から直ぐに使用することができます。
Lua スクリプトはテキストファイル(UTF-8) ですので、簡単にコピーしたり独自のコマンド処理用に改造することができます。
●TWE-Lite 親機からパケットを受信したときの動作
TWE-Lite 子機からは、定期的に現在のステータスは送信されていたり、子機のA/D 変換値やデジタル入力の変化を検出した時にはイベントデータが親機に対して送信されます。
イベントデータを受信すると親機からはアスキー形式のパケットデータが送信されます。DeviceServer では親機から送信されるこのようなパケットデータを処理するためのスクリプト(SERIAL_TWE)が予め設定されています。スクリプトの内容は以下の様になっています。
file_id = "SERIAL_TWE" --[[ SERIAL_TWE スクリプト起動時に渡される追加パラメータ --------------------------------------------------------------------------------- キー値 値 値の例 --------------------------------------------------------------------------------- COMPort イベントを送信したシリアルデバイスの COMポート名 "COM10" Title イベントを送信したシリアルデバイスのタイトル名 "TWE-Lite PAN#1" タイトルが設定されていない場合にはこのパラメータは 設定されません TWE_DATA COM ポートから入力されたアスキー形式のデータパケット全体を格納しています。 値の例 タイプ(1) ":01890902010A010203040405060708092F" タイプ(2) "::rc=80000000:lq=84:ct=0001:ed=81002A1E:id=1:ba=3320:a1=0009:a2=0009:p0=001:p1=000" タイプ(3) ";116;00000000;054;001;1002ecd;3330;0007;0042;0007;0007;S;" タイプ(4) "!INF TOCOS TWELITE DIP APP V1-00-2, SID=0x81000038, LID=0x78" タイプ(5) "*** Samp_Monitor (Parent) 1.03-3 *** Title = TWE-Zero" 文字列は、下記の何れかのデータで終端されたものです。 ヌル文字(0x00),CR(0x0D),LF(0x0A),CR-LF(0x0D,0x0A) TWE_DATA パラメータには、終端文字を含まない文字列部分が格納されています TWE_DATAを解析してこのスクリプト中で作成されるテーブルと文字列変数 --------------------------------------------------------------------------------- テーブルまたは文字列変数名 説明 値の例 --------------------------------------------------------------------------------- byte_arr TWE_DATA が ":" 1文字から始まっている場合に、16進数文字列部分を １バイト毎に数値に変換して配列に格納したものが入る 上記 TWE_DATA データ例タイプ(1)を参照 byte_arr[1] = 0x01 byte_arr[2] = 0x89 byte_arr[3] = 0x09 .. key_val TWE_DATA が "::" 2文字から始まっている場合に、続く ":" 文字毎にカラムを 分けて "<key>=<val>" で記述された部分を連想配列に格納したものが入る。 上記 TWE_DATA データ例タイプ(2)を参照 key_val["rc"] = "80000000" key_val["lq"] = "84" key_val["ct"] = "0001" key_val["ed"] = "81002A1E" .. tag_arr TWE_DATA が ";" 1文字から始まっている場合に、続く ";" 文字毎にカラムを 分けたものを文字列形式で配列に格納したものが入る。 上記 TWE_DATA データ例タイプ(3)を参照 tag_arr[1] = "116" tag_arr[2] = "00000000" tag_arr[3] = "054" tag_arr[4] = "001" .. comment TWE_DATA が ":"または ";" 文字以外から始まっている場合に、 データパケット全体の文字列を格納したものが入る 上記 TWE_DATA データ例タイプ(4),(5)を参照 COMMENT = "!INF TOCOS TWELITE DIP APP V1-00-2, SID=0x81000038, LID=0x78" TWE_DATAを解析してこのスクリプト中で作成されるグローバル共有変数と共有文字列リスト --------------------------------------------------------------------------------- グローバル共有変数名 説明 または、共有文字列リストChannel名 --------------------------------------------------------------------------------- TWE_<COMPort>_<ChildID> TWE_DATA が ":" 1文字から始まっていて、かつコマンド種別を示すバイト値が 0x81(状態通知)の場合に、メッセージ内容を解析した値がカンマ区切りで グローバル共有変数に格納される。この変数の値は常に最後のイベント発生時 の内容で更新されます。 <COMPort>は、イベントを送信したシリアルデバイスの COMポート名になります <ChildID>は、メッセージ中の送信元論理デバイスIDを10進数にしたものになります 変数の内容に設定されるカンマ区切りの文字列は下記のフォーマットになります。 <LQI>,<Batt>,<DI1>,<DI2>,<DI3>,<DI4>,<AD1>,<AD2>,<AD3>,<AD4> <LQI> にはLQI値フィールドの値を10進数に変換したものが入ります <Batt> には電源電圧[mV]フィールドの値を10進数に変換したものが入ります <DI1>..<DI4> にはDI の状態ビットが Lowの場合に1, High の場合に 0 が入ります <AD1>..<AD4> にはAD変換値の値を10進数に変換したものが入ります TWE_<COMPort>_CHILD_LIST (共有文字列リストChannel名) TWE_DATA が ":" 1文字から始まっているパケットデータを受信したときの <ChildID> 部分を文字列リストに保存します。文字列リストにはメッセージ中の 送信元論理デバイスIDを10進数表現にしたものを重複なく保存しています。 ]] local str = "" for key,val in pairs(g_params) do str = str .. key .. " = " .. val .. " " end log_msg(str,file_id) ------------------------------------------------------------ -- g_params["TWE_DATA"] データパケット文字列をデコードする ------------------------------------------------------------ local data = g_params["TWE_DATA"] local byte_arr,key_val,tag_arr,comment if string.match(data,"^::") then -- タイプ(2) key_val = key_val_to_tbl(string.sub(data,3,-1)) elseif string.match(data,"^:%x") then -- タイプ(1) byte_arr = hex_to_tbl(string.sub(data,2,-1)) local id = tostring(byte_arr[1]) if not add_shared_strlist("TWE_" .. g_params["COMPort"] .. "_CHILD_LIST",id,true) then error() end -- 子機のIDリストを更新 if byte_arr[2] == 0x81 then -- 状態通知の場合には共有変数に現在のセンサ値を保存 local di1,di2,di3,di4,ad1,ad2,ad3,ad4 if bit_and(byte_arr[17],0x01) ~= 0 then di1 = "1" else di1 = "0" end if bit_and(byte_arr[17],0x02) ~= 0 then di2 = "1" else di2 = "0" end if bit_and(byte_arr[17],0x04) ~= 0 then di3 = "1" else di3 = "0" end if bit_and(byte_arr[17],0x08) ~= 0 then di4 = "1" else di4 = "0" end if byte_arr[19] == 0xFF then ad1 = "-1" else ad1 = tostring((byte_arr[19]*4 + bit_and(byte_arr[23],0x03))*4) end if byte_arr[20] == 0xFF then ad2 = "-1" else ad2 = tostring((byte_arr[20]*4 + bit_and(bit_rshift(byte_arr[23],2),0x03))*4) end if byte_arr[21] == 0xFF then ad3 = "-1" else ad3 = tostring((byte_arr[21]*4 + bit_and(bit_rshift(byte_arr[23],4),0x03))*4) end if byte_arr[22] == 0xFF then ad4 = "-1" else ad4 = tostring((byte_arr[22]*4 + bit_and(bit_rshift(byte_arr[23],6),0x03))*4) end local val = tostring(byte_arr[5]) .. "," .. tostring(byte_arr[14]*256 + byte_arr[15]) .. "," .. di1 .. "," .. di2 .. "," .. di3 .. "," .. di4 .. "," .. ad1 .. "," .. ad2 .. "," .. ad3 .. "," .. ad4 if not set_shared_data("TWE_" .. g_params["COMPort"] .. "_" .. id,val) then error() end -- リレーサーバーに最新データの配信を依頼する場合には下記のコメントを取り除く script_exec("RELAY_SERVER_UPLINK","COM,TYPE,NodeID,LQI,Batt,DI1,DI2,DI3,DI4,AD1,AD2,AD3,AD4",g_params["COMPort"] .. ",TWE_UPDATE," .. id .. "," .. val) end elseif string.match(data,"^;") then -- タイプ(3) tag_arr = ssv_to_tbl(string.sub(data,2,-2)) else -- タイプ(4),(5) comment = data end ----------------------------------- -- デコード後のデータをログに出力 ----------------------------------- --[[ local line = "" if key_val then for key,val in pairs(key_val) do line = line .. "[" .. key .."]" .. val .. " " end end if byte_arr then for key,val in ipairs(byte_arr) do line = line .. "0x" .. bit_tohex(val,2) .. " " end end if tag_arr then for key,val in ipairs(tag_arr) do line = line .. "[" .. tostring(key) .. "]" .. val .. " " end end if comment then line = comment end log_msg("decoded: " .. line,file_id) ]]
このスクリプトでは TWE-Lite のファームエア (TWE-Zeroアプリ)で使用されている全てのアスキー形式のパケットを解析して、DeviceServer で処理しやすい形に変換しています。
他のイベントハンドラやユーザースクリプトから TWE-Lite のイベントデータを利用し易い様に、グローバル共有変数に子機毎の最新のI/O 値などをカンマ区切りのデータで保持しています。そのほかにも親機のCOM ポート毎に、全ての子機のID リストを作成しています。
これらの詳しいデータ構造は上記スクリプトのコメントを参照してください。ユーザーが独自のファームエアを TWE-Lite に搭載した場合でも、TWE-Zero アプリで使用しているアスキー形式のフォーマットに合わせておくと、このイベントハンドラで自動的に内容が解析されるようになります。
もちろん独自のフォーマットでデータを送信することもできます。この場合にはこのイベントハンドラにフォーマットを解析するためのスクリプトを追加して対応してください。
●Webアプリを作成する
ここからはWebアプリの作成例を紹介します。Webブラウザ上に表示したチェックボックスやスライダー を使用して子機をリモートコントロールできます。HTML5 アプリで作成していますのでPC の Webブラウザはもちろんのこと、iOS や Android デバイスからも実行することができます。
この Webアプリではフレームワークとして jQuery と jQuery-mobile を使用しています。もちろん、これら以外のフレームワークを利用して独自のWeb アプリを自由に作成することができます。Web アプリ中からは、前の項で紹介したWeb API をコールして TWE-Lite デバイスを操作しています。
ここで紹介するWeb アプリは、DeviceServer インストール時に”C:\Program Files (x86)\AllBlueSystem\WebRoot\web_api_sample\twe_control” フォルダに格納されていますので直ぐに使用することができます。Webアプリを起動させるときは、Webブラウザで “http:// /web_api_sample/twe_control/index.html” にアクセスしてください。
最初にログイン画面が表示されます。DeviceServer に登録したユーザーアカウントでログインします。このとき、ユーザーアカウントに設定したアプリケーション許可フラグに “WebLogin” を付与して Web API 経由でログイン可能にしておいてください。
ログインに成功すると、COM ポートの選択画面が表示されます。ここで、操作したいTWE-Lite の子機が所属している親機の COM ポートを選択します。ここで表示しているCOM デバイスリストにはシリアルデバイスタイプとして “TWE” を選択しているものだけが表示されます。
上記の画面で表示されている親機のポート(TWE#1) は1つだけですが、複数の親機を DeviceServer で同時に管理してすることもできます。このようにすると、それぞれの親機に属している TWE-Lite デバイスの Application ID を分けて、別々の PAN に属している TWE-Lite デバイスを Web アプリから操作することができます。
次にノード(子機の Device ID)選択画面が表示されます。子機から送信されてきたイベントデータパケットの情報から作成した最新のノードリスト(子機の Device ID リスト)を表示しています。
子機のノードを選択すると I/O 画面が表示されます。
デジタル入力と A/D 変換値は最後に親機で受信したイベントデータを元に表示されます。この部分は表示のみで操作することはできません。スクロールダウンすると、デジタル出力と PWM 出力を操作する画面が現れます。
チェックボックスを操作すると、子機の指定したデジタル出力ポートの値を High または Low に設定できます。”全てのDO#を更新” ボタンはデジタル出力ポートの全ピンの値を現在のチェックボックスの状態に合わせて全て更新することができます。
このボタンは TWE-Lite のファームウエアの制限から現在の出力ポートの値が取得できないため、最初にこのボタンを押してチェックボックスの状態と子機のデジタル出力の値を一致させるときに使用します。この部分については後の”考察”の項でも説明しています。
子機のPWM 出力は、スライダーを操作することで簡単に設定することができます。
別の子機を操作したくなった場合にはブラウザの “戻る” ボタンを使用してノード選択画面やポート選択画面に移動して選択するデバイスを変更できます。
下記にこの Webアプリで使用している HTML ファイルを載せます。HTMLファイルではWebアプリの GUI やダイアログの定義のみを行っています。
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>TWE Control</title> <link rel="stylesheet" href="libs/css/themes/default/jquery.mobile-1.4.5.min.css" /> <script src="libs/js/jquery.js"></script> <script src="libs/js/jquery.mobile-1.4.5.js"></script> <script src="libs/js/socket.io.js"></script> <script src="libs/device_server/webapi.js"></script> </head> <body> <div data-role="page" id="login"> <div data-role="header" data-position="inline"> <h3>ユーザー認証</h3> </div> <div role="main" class="ui-content"> <label for="login_name">Name</label> <input id="login_name" value="" type="text" data-clear-btn="true"/> <label for="login_password">Password</label> <input id="login_password" value="" type="password" data-clear-btn="true"/> <div><h3>&nbsp</h3></div> <div class="ui-grid-b"> <div class="ui-block-b"> <a class="ui-btn ui-btn-inline ui-icon-check ui-btn-icon-left " id="login_btn" >Login</a> </div> </div> </div> <div data-role="footer"> <h3>ABS-9000 DeviceServer</h3> </div> </div> <div data-role="page" id="select_device"> <div data-role="header" data-position="inline"> <h3>ポート選択</h3> <a data-icon="home" id="logout_btn" href="#logout_caution" data-rel="dialog" data-transition="pop">Logout</a> </div> <ul data-role="listview" id="device_list" data-inset="true"></ul> <div data-role="footer"> <h3>ABS-9000 DeviceServer</h3> </div> </div> <div data-role="page" id="select_node" data-theme="a"> <div data-role="header" data-position="inline"> <a data-icon="back" id="select_node_prev_btn">戻る</a> <h3>ノード選択</h3> <a data-icon="home" id="logout_btn" href="#logout_caution" data-rel="dialog" data-transition="pop">Logout</a> </div> <ul data-role="listview" id="node_list" data-inset="true"></ul> <div data-role="footer"> <h3>ABS-9000 DeviceServer</h3> </div> </div> <div data-role="page" id="twe_control"> <div data-role="header" data-position="inline"> <a data-icon="refresh" id="reloadBtn">Reload</a> <h3 id="main_title">TWE Control</h3> <a data-icon="home" id="logout_btn" href="#logout_caution" data-rel="dialog" data-transition="pop">Logout</a> </div> <div role="main" class="ui-content"> <div data-role="fieldcontain"> <fieldset data-role="controlgroup" data-type="vertical"> <input name="checkbox1" id="checkbox1" type="checkbox" class="di_pin" pin="1" disabled="disabled"/> <label for="checkbox1">DI#1</label> <input name="checkbox2" id="checkbox2" type="checkbox" class="di_pin" pin="2" disabled="disabled"/> <label for="checkbox2">DI#2</label> <input name="checkbox3" id="checkbox3" type="checkbox" class="di_pin" pin="3" disabled="disabled"/> <label for="checkbox3">DI#3</label> <input name="checkbox4" id="checkbox4" type="checkbox" class="di_pin" pin="4" disabled="disabled"/> <label for="checkbox4">DI#4</label> </fieldset> </div> </div> <div role="main" class="ui-content"> <fieldset data-role="controlgroup" data-type="vertical"> <div data-role="fieldcontain"> <label for="slider-1">AD#1</label> <input type="range" name="slider-1" id="slider-1" style="width : 58px;" value="-1" min="-1" max="1024" data-highlight="true" disabled="disabled"/> </div> <div data-role="fieldcontain"> <label for="slider-2">AD#2</label> <input type="range" name="slider-2" id="slider-2" style="width : 58px;" value="-1" min="-1" max="1024" data-highlight="true" disabled="disabled"/> </div> <div data-role="fieldcontain"> <label for="slider-3">AD#3</label> <input type="range" name="slider-3" id="slider-3" style="width : 58px;" value="-1" min="-1" max="1024" data-highlight="true" disabled="disabled"/> </div> <div data-role="fieldcontain"> <label for="slider-4">AD#4</label> <input type="range" name="slider-4" id="slider-4" style="width : 58px;" value="-1" min="-1" max="1024" data-highlight="true" disabled="disabled"/> </div> </fieldset> </div> <div role="main" class="ui-content"> <fieldset data-role="controlgroup" data-type="vertical"> <a class="ui-btn ui-btn-inline ui-icon-gear ui-btn-icon-left ui-mini" id="do_all_btn" >全ての DO# 更新</a> </fieldset> <fieldset data-role="controlgroup" data-type="vertical"> <div data-role="fieldcontain"> <input name="checkbox5" id="checkbox5" type="checkbox" class="do_pin" pin="1"/> <label for="checkbox5">DO#1</label> <input name="checkbox6" id="checkbox6" type="checkbox" class="do_pin" pin="2"/> <label for="checkbox6">DO#2</label> <input name="checkbox7" id="checkbox7" type="checkbox" class="do_pin" pin="3"/> <label for="checkbox7">DO#3</label> <input name="checkbox8" id="checkbox8" type="checkbox" class="do_pin" pin="4"/> <label for="checkbox8">DO#4</label> </div> </fieldset> </div> <div role="main" class="ui-content"> <fieldset data-role="controlgroup" data-type="vertical"> <a class="ui-btn ui-btn-inline ui-icon-gear ui-btn-icon-left ui-mini" id="pwm_all_btn" >全ての PWM# 更新</a> <div class="ui-field-contain"> <label for="slider-5">PWM#1</label> <input type="range" name="slider-5" id="slider-5" style="width : 58px;" value="0" min="0" max="1024" class="pwm_pin" pin="1" data-highlight="true"/> </div> <div data-role="fieldcontain"> <label for="slider-6">PWM#2</label> <input type="range" name="slider-6" id="slider-6" style="width : 58px;" value="0" min="0" max="1024" class="pwm_pin" pin="2" data-highlight="true"/> </div> <div data-role="fieldcontain"> <label for="slider-7">PWM#3</label> <input type="range" name="slider-7" id="slider-7" style="width : 58px;" value="0" min="0" max="1024" class="pwm_pin" pin="3" data-highlight="true"/> </div> <div data-role="fieldcontain"> <label for="slider-8">PWM#4</label> <input type="range" name="slider-8" id="slider-8" style="width : 58px;" value="0" min="0" max="1024" class="pwm_pin" pin="4" data-highlight="true"/> </div> </fieldset> </div> <div data-role="footer"> <h3>ABS-9000 DeviceServer</h3> </div> </div> <div data-role="page" id="login_error_dialog"> <div data-role="header" data-theme="b"> <h1>*LOGIN ERR*</h1> </div> <div role="main" class="ui-content"> <h2>ログインに失敗しました</h2> <p>ユーザー名またはパスワードが間違っています。システムのログイン制限により失敗している場合があります</p> <p> <a href="#login" data-rel="back" class="ui-btn ui-shadow ui-btn-a ui-icon-check ui-btn-icon-left">戻る</a> </p> </div> </div> <div data-role="page" id="logout_caution"> <div data-role="header" data-theme="b"> <h1>*WARNING*</h1> </div> <div role="main" class="ui-content"> <h2>ログアウトしますか?</h2> <p>ログアウト操作を行う場合には "OK" を押してください。"キャンセル" で元の画面に戻ります</p> <p><a data-rel="back" class="ui-btn ui-btn-inline ui-shadow ui-btn-a ui-icon-back ui-btn-icon-left">キャンセル</a> <a id="logout_ok_btn" class="ui-btn ui-btn-inline ui-shadow ui-btn-a ui-icon-check ui-btn-icon-left">OK</a></p> </div> </div> <div data-role="page" id="error_quit_dialog"> <div data-role="header" data-theme="b"> <h1>*USER ERR*</h1> </div> <div role="main" class="ui-content"> <h2>セッションが無効です</h2> <p>サーバー処理中にエラーが発生しました。現在のセッションが無効になっている場合があります。再ログイン操作を行ってください</p> <p><a data-role="button" id="server_error_ok_btn" class="ui-btn ui-shadow ui-btn-a ui-icon-check ui-btn-icon-left">OK</a></p> </div> </div> <div data-role="page" id="error_back_dialog"> <div data-role="header" data-theme="b"> <h1>*SERVER ERR*</h1> </div> <div role="main" class="ui-content"> <h3>サーバー側でエラーが発生しました</h3> <p>サーバー処理中にエラーが発生しました。スクリプト実行中にエラーが発生した可能性がありますのでサーバー側のログを確認して下さい</p> <p><a data-role="button" data-rel="back" class="ui-btn ui-shadow ui-btn-a ui-icon-check ui-btn-icon-left">OK</a></p> </div> </div> <script src="main.js"></script> </body> </html>
Web アプリケーションのロジック部分は、下記のmain.js(JavaScript) で作成しています。このスクリプト中から、先に説明した Web API をコールすることで、TWE-Lite 子機を操作しています。
////////////////////////////////////// // common function ////////////////////////////////////// // スクリプト実行結果ステータスのみをチェック function script_exec_callback(data){ if (data.Result != "Success"){ if(data.ErrorText.match(/CertifyUpdateSession failed/i)) { $("#login_password").val(""); $("body").pagecontainer("change","#error_quit_dialog", { transition: "pop",role:"dialog" }); } else { $("body").pagecontainer("change","#error_back_dialog", { transition: "pop",role:"dialog" }); } } } // UI コンポーネントの xml 属性値を検索取得 function getAttrVal(node,name){ var val = ""; var attr = node.attributes; for (var i=0; i<attr.length; i++){ if (attr[i].nodeName == name){ val = attr[i].nodeValue; } } return val; } ////////////////////////////////////// // twe_control page ////////////////////////////////////// // IO 値の配列を受け取って GUI表示に反映させる // data パラメータ例 // {"DI1":"1","DI2":"0","DI3":"0","DI4":"0","AD1":"-1","AD2":"-1","AD3":"4","AD4":"248"} function apply_ui(data){ var flag; flag = ( data.DI1 == "0"); // TWE DIは負論理だが、チェック状態の時に High出力とみなす $("#checkbox1").prop("checked",flag).checkboxradio("refresh"); flag = ( data.DI2 == "0"); $("#checkbox2").prop("checked",flag).checkboxradio("refresh"); flag = ( data.DI3 == "0"); $("#checkbox3").prop("checked",flag).checkboxradio("refresh"); flag = ( data.DI4 == "0"); $("#checkbox4").prop("checked",flag).checkboxradio("refresh"); if ($("#slider-1").val() != data.AD1) $("#slider-1").val(data.AD1).slider("refresh"); if ($("#slider-2").val() != data.AD2) $("#slider-2").val(data.AD2).slider("refresh"); if ($("#slider-3").val() != data.AD3) $("#slider-3").val(data.AD3).slider("refresh"); if ($("#slider-4").val() != data.AD4) $("#slider-4").val(data.AD4).slider("refresh"); } // TWE/AD_DI_GETスクリプト実行結果のイベントハンドラ。 function io_get_handler(data){ if (data.Result != "Success"){ if(data.ErrorText.match(/CertifyUpdateSession failed/i)) { $("#login_password").val(""); $.mobile.changePage( "#error_quit_dialog", {transition: "pop",role:"dialog"}); } else { $.mobile.changePage( "#error_back_dialog", {transition: "pop",role:"dialog"}); } return; } apply_ui(data.ResultParams); } // デバイスから最新の I/O 値を取得する function load_device_io(){ var params = {}; params["com"] = serial_comport; params["id"] = node_id; script_exec("TWE/AD_DI_GET",params,"io_get_handler"); } // スライダーを操作して PWM#<n> ピンの値が更新された $("body").on("slidestop",".pwm_pin",function(event, ui){ var params = {}; var attrVal = getAttrVal(this,"pin"); if (attrVal != ""){ params["com"] = serial_comport; params["id"] = node_id; params["pin"] = attrVal; params["value"] = event.target.value; script_exec("TWE/PWM_SET",params,"script_exec_callback"); } }); // チェックボックスを操作して DO#<n> ピンの値が更新された $("body").on("change",".do_pin",function(event, ui){ var params = {}; var attrVal = getAttrVal(this,"pin"); if (attrVal != ""){ params["com"] = serial_comport; params["id"] = node_id; params["pin"] = attrVal; // TWE DOは負論理だが、チェック状態の時に High出力にする if (this.checked){ params["value"] = "0"; } else { params["value"] = "1"; } script_exec("TWE/DO_PIN_SET",params,"script_exec_callback"); } }); // 全ての PWM# 更新ボタンを押した $("#pwm_all_btn").on( "click",function(event, ui){ var params = {}; var pwm_val = $("#slider-5").val(); pwm_val = pwm_val + "," + $("#slider-6").val(); pwm_val = pwm_val + "," + $("#slider-7").val(); pwm_val = pwm_val + "," + $("#slider-8").val(); params["com"] = serial_comport; params["id"] = node_id; params["value"] = pwm_val; script_exec("TWE/PWM_ALL_SET",params,"script_exec_callback"); }); // 全ての DO# 更新ボタンを押した $("#do_all_btn").on( "click",function(event, ui){ var params = {}; var flag = 0; if (! $("#checkbox5").is(':checked')){ flag = flag | 0x01; } if (! $("#checkbox6").is(':checked')){ flag = flag | 0x02; } if (! $("#checkbox7").is(':checked')){ flag = flag | 0x04; } if (! $("#checkbox8").is(':checked')){ flag = flag | 0x08; } params["com"] = serial_comport; params["id"] = node_id; params["value"] = flag.toString(16); script_exec("TWE/DO_PUT",params,"script_exec_callback"); }); // ページが表示された $(document).on("pageshow","#twe_control",function(event){ load_device_io(); }); // リロードボタンが操作された $("#reloadBtn").on( "click",function(event, ui){ load_device_io(); }); ////////////////////////////////////// // select_node page ////////////////////////////////////// // アプリで選択した TWEデバイス NodeID var node_id = "" // TWE(子)ノードリストを取得する function list_node_device(){ var params = {}; params["noquote"] = "1"; params["com"] = serial_comport; script_exec("TWE/LIST_JSON",params,"list_node_handler"); } // ノードデバイスが選択されたらデバイス操作画面に移動する $(document).on( "click",".node_select", function(event, ui){ var params = {}; var attrVal = getAttrVal(this,"device"); if (attrVal != ""){ node_id = attrVal; // TWEデバイス操作画面に移動する $( "#main_title" ).text(serial_comport + " Node#" + node_id); $("body").pagecontainer("change","#twe_control", { transition: "none" }); } }); // TWE/LIST_JSON スクリプト実行結果のイベントハンドラ。 function list_node_handler(data){ if (data.Result != "Success"){ if(data.ErrorText.match(/CertifyUpdateSession failed/i)) { $("body").pagecontainer("change","#error_quit_dialog", { transition: "pop",role:"dialog" }); } else { $("body").pagecontainer("change","#error_back_dialog", { transition: "pop",role:"dialog" }); } return; } // リストビューに ノード番号を表示する $("#node_list li").remove(); for(i in data.ResultParams.DeviceList){ $('<li data-theme="a"><a data-transition="none" device="' + data.ResultParams.DeviceList[i].ID + '" class="node_select">' + "TWE Node#" + data.ResultParams.DeviceList[i].ID + '</a></li>').appendTo($('#node_list')); } $("#node_list").listview("refresh"); } // ページが表示された $(document).on("pageshow","#select_node",function(event){ list_node_device(); }); // ノード選択画面の Prevボタンが操作された $("#select_node_prev_btn").on( "click",function(event, ui){ $("body").pagecontainer("change","#select_device", { transition: "none" }); }); ////////////////////////////////////// // select_device page ////////////////////////////////////// // アプリで選択したシリアルデバイスの COM ポート名またはタイトル名 var serial_comport = "" // シリアルデバイスリストを取得する function list_serial_device(){ var params = {}; params["type"] = "TWE"; params["noquote"] = "1"; script_exec("SERIAL_DEVICE_LIST",params,"list_serial_handler"); } // SERIAL_DEVICE_LIST スクリプト実行結果のイベントハンドラ。 function list_serial_handler(data){ if (data.Result != "Success"){ if(data.ErrorText.match(/CertifyUpdateSession failed/i)) { $("body").pagecontainer("change","#error_quit_dialog", { transition: "pop",role:"dialog" }); } else { $("body").pagecontainer("change","#error_back_dialog", { transition: "pop",role:"dialog" }); } return; } // リストビューに シリアルデバイス名を表示する $("#device_list li").remove(); for(i in data.ResultParams.DeviceList){ $('<li data-theme="a"><a data-transition="none" device="' + data.ResultParams.DeviceList[i].COM + '" class="dev_select">' + data.ResultParams.DeviceList[i].Title + '</a></li>').appendTo($('#device_list')); } $("#device_list").listview("refresh"); } // シリアルデバイスが選択されたらノード選択画面に移動する $(document).on('click', '.dev_select', function () { var params = {}; var attrVal = getAttrVal(this,"device"); if (attrVal != ""){ serial_comport = attrVal; $("body").pagecontainer("change","#select_node", { transition: "none" }); } }); // ページが表示された $(document).on("pageshow","#select_device",function(event){ list_serial_device(); }); ////////////////////////////////////// // login page ////////////////////////////////////// // サーバー側のログイン処理が成功したときにメイン画面に移動する function login_callback(data){ if (data.Result == "Success"){ session_token = data.SessionToken; $("body").pagecontainer("change","#select_device", { transition: "none" }); } else { $("body").pagecontainer("change","#login_error_dialog", { transition: "pop",role:"dialog" }); } } // サーバー側のログアウト処理が完了したらログイン画面に戻る function logout_callback(data){ session_token = ""; $("#login_password").val(""); $("body").pagecontainer("change","#login", { transition: "pop" }); } // ログインボタンを押した $( "#login_btn" ).on( "click", function(event, ui){ var user = $("#login_name").val(); var pass = $("#login_password").val(); login(user,pass,"login_callback"); }); // ログアウトボタンを押した $( "#logout_ok_btn" ).on( "click", function(event, ui){ logout("logout_callback"); }); // サーバーエラーのダイアログから復帰する場合はログイン画面に戻る $( "#server_error_ok_btn" ).on( "click", function(event, ui){ session_token = ""; $("body").pagecontainer("change","#login", { transition: "pop" }); }); // ログインページが表示された $(document).on("pageshow","#login",function(event){ // セッショントークンが指定されている場合にはユーザー認証を省略する if (session_token != ""){ $("body").pagecontainer("change","#select_device", { transition: "pop" }); } }); //////////////////////////////////////////////////////////////// // (オプション機能) // // デバイスの I/O 状態が変更された場合に最新のI/O データが配信されるように、 // WebSocket(socket.io) でリレーサーバーに接続する // この機能を使用する場合には、サーバー側でデバイスからのイベントデータを // ブラウザに配信する node.js + socket.io で作成されたリレーサーバーを // 実行して下さい。(node relay_server.jsで実行できます) // // //var socket = io.connect('/',{ port:9090}); var socket = io.connect(':9090'); // リレーサーバーから 'broadcast' タグの付いたメッセージを受信した socket.on('broadcast', function (data) { // 配信されてきたJSON データを取得 var obj = $.parseJSON(data["message"]); // Webアプリで自動更新の対象となるイベントデータを含んでいた場合には、 // 最新のイベントデータで GUI の状態を更新する if((session_token != "") && (obj.COM == serial_comport) && (obj.NodeID == node_id) && (obj.TYPE == "TWE_UPDATE")){ apply_ui(obj); } });
●リアルタイム更新用のリレーサーバーを node.js で作成する
Web アプリを使用するとリモート側の デジタル出力 や PWM をリアルタイムに更新することができますが、デジタル入力と A/D 変換値は “Reload” ボタンを押さないと最新の情報に更新できないのは困ります。
ここでは、WebSocket を利用して子機側でデジタル入力や A/D 変換値が変化したときに、自動的に最新の値に Web アプリの GUI を更新させたいと思います。
この項で紹介する方法は以前の記事で紹介した内容と同じ node.js を使用してリレーサーバーを外部に作成する方法を採っています。リレーサーバーの仕組みや node.js のセットアップ方法については此方の(記事1,記事2) を参照してください。
親機からは、子機側で発生した I/O 変化時のイベントデータがシリアルに出力されていますので、このタイミングでイベントデータを WebSocket に配信します。先に紹介したイベントハンドラ (SERIAL_TWE) 中の
-- リレーサーバーに最新データの配信を依頼する場合には下記のコメントを取り除く script_exec("RELAY_SERVER_UPLINK","COM,TYPE,NodeID,LQI,Batt,DI1,DI2,DI3,DI4,AD1,AD2,AD3,AD4",g_params["COMPort"] .. ",TWE_UPDATE," .. id .. "," .. val)
の部分で RELAY_SERVER_UPLINK Lua スクリプトに最新のイベントデータを渡しています。このスクリプトは以下の様になっています。
file_id = "RELAY_SERVER_UPLINK" --[[ ●機能概要 リレーサーバーに配信用のデータをアップロードする ●スクリプト中の変数に初期設定が必要な項目 --------------------------------------------------------------------------------- 変数名 値 値の例 --------------------------------------------------------------------------------- host リレーサーバーが動作している PC のホスト名 "localhost" リレーサーバーは node.js プログラムで起動された relay_server.js ファイルで実行されます。 port リレーサーバーのポート番号 9080 ●リクエストパラメータ --------------------------------------------------------------------------------- キー値 値 値の例 ---------------------------------------------------------------------------------     "AD0" "-1" .. ..     リレーサーバーで配信するメッセージ中に格納するデータ値を任意の数だけ指定できる。 このスクリプトを起動する時に指定した全てのパラメータ(キー値と値)はそのまま リレーサーバーに渡されて、その後 WebSocketで接続している全てのクライアントに配信される。 ●リターンパラメータ --------------------------------------------------------------------------------- キー値 値 値の例 --------------------------------------------------------------------------------- ●備考 スクリプト中で実行している tcp_send_recv_data() 関数は、相手側のサーバーがダウン しているときにネットワークエラー検出までに時間がかかることが想定されます。 このとき、イベントハンドラなど別スレッドで同時にこのスクリプトを続けて起動すると、 スクリプトプールの未使用エントリ数がなくなり、システム全体の動作に影響する可能性 があります。これを防ぐために、スクリプトプールの未使用エントリ数が一定以下になっ た場合には、このスクリプトの実行をすぐに中止させるようにしています 中止させるためのフラグは abort_key のキー名で設定されたグローバル共有変数を使用 しています。一度このフラグが設定されるとこのスクリプトは直ぐに終了して、ログに *ABORT* が記録されるようになります。再びこのスクリプトを実行可能にするためには、 DeviceServerを再起動させるか abort_key に設定されたグローバル共有変数を削除して ください。このとき PERIODIC_TIMER.lua 中に dec_shared_data() 関数を使用すると 簡単に一定期間後にグローバル共有変数を削除することができます。このスクリプトでは 中止フラグの値に "60" を設定していますので、下記のスクリプトをPERIODIC_TIMER.lua 中 に記述すると、60分後に中止フラグが自動的に削除されます。 dec_shared_data("$ABORT_RELAY_SERVER_UPLINK") ●変更履歴 2014/11/8 初版作成 ABS-9000 DeviceServer copyright(c) All Blue System ]] local host = "localhost" local port = 9080 ----------------------------------------------------------------------------------------------------- -- リレーサーバー接続が失敗する場合にスクリプトプールの逼迫を防ぐため、スクリプト実行中止の判断をする ----------------------------------------------------------------------------------------------------- local abort_key = "$ABORT_" .. file_id local stat, val = get_shared_data(abort_key) if val ~= "" then log_msg("*ABORT*",file_id) return end if script_free_count() < 5 then if not set_shared_data(abort_key,"60") then error() end log_msg("*ABORT SET*",file_id) return end ----------------------------------------------------------------------------------- -- スクリプトパラメータで渡されたキーと値を JSON 文字列に変換する ----------------------------------------------------------------------------------- local json_str = '{' local first = true for key,val in pairs(g_params) do if first then first = false else json_str = json_str .. "," end json_str = json_str .. string.format('"%s":"%s"',key,val) end json_str = json_str .. '}' ------------------------------------------ -- リレーサーバーにメッセージを送信する ------------------------------------------ log_msg(json_str,file_id) local nstat,rdata = tcp_send_recv_data(host,port,json_str,2,2)
スクリプトパラメータで渡されてきた子機の最新の デジタル入力値、A/D 変換値などを node.js で作成するリレーサーバーにTCP/IP ソケット通信で送信します。送信データは相手側で利用しやすいように予め JSON フォーマットに加工しています。
node.js で作成するリレーサーバー本体(relay_server.js)は以下になります。
////////////////////////////////////////////////////////////////////////////////////// // // RelayServer All Blue System // // このプログラムではソケット通信(TCP)で受信した文字列データを // WebSocket(socket.io)に接続している全てのクライアントにブロードキャスト配信します。 // // プログラムを起動するときは、予め node.js プログラムをインストールしておきます。 // その後、node.js で提供されているパッケージ管理プログラム npm を使用して // socket.io モジュールをインストールします。 // // >npm install socket.io // // 環境変数 NODE_PATH を node.js をインストールしたフォルダにある node_modules フォルダ名に設定します。 // デフォルトでは NODE_PATH = C:\Program Files\nodejs\node_modules になります。 // // コマンドプロンプトから node コマンドにスクリプトファイル名をパラメータに指定して RelayServerを起動します。 // // >node relay_server.js // // uplink ポートにメッセージを送信するための DeviceServer側スクリプトは // C:\Program Files (x86)\AllBlueSystem\Scripts\RELAY_SERVER_UPLINK.lua に // 格納されています。 // // downlinkポートからメッセージを受信してWebアプリケーションからブラウザに配信するための // サンプルは、C:\Program Files (x86)\AllBlueSystem\WebRoot\web_api_sample\twe_control // フォルダ中の main.js ファイルを参照してください。 // ////////////////////////////////////////////////////////////////////////////////////// // RelayServer から複数の Webブラウザへデータを配信するためのポート // 最初にWeb ブラウザ側から WebSocket(socket.io) を使用してコネクションが張られる。 // コネクションが確立した後ブラウザ側は RelayServer から送信される // ブロードキャストメッセージを受信する。 var downlink_port = 9090; // 予め socket.io を npm を使用してインストールしておくこと var downlink = require('socket.io').listen(downlink_port); //downlink.configure(function(){ // downlink.set('log level', 1); // socket.io の debug ログを抑止 //}); // DeviceServer からWeb ブラウザに配信するためのデータを受け付けるためのポート // 通常のソケットサーバー(net)経由で JSON 文字列で記述された配信用データを受信する // 文字列の終端は \n で判断して、受信後に短い ACK 文字列をDeviceServer 側に送信する。 // この ACK 文字列は、DeviceServer側 API tcd_send_recv_data()が、通信が完了したことを判断する // ために使用している。 var uplink_port = 9080; var net = require('net'); var relay_server = net.createServer(function (uplink_stream) { var buffer = ""; var msg = ""; uplink_stream.setEncoding("utf8"); uplink_stream.on("data", function (data) { // 配信用データをDeviceServer から受信する if ( data.indexOf('\n') < 0) { buffer += data; } else { // 配信用データ末尾の空白文字を除去 msg = buffer + data.substring(0, data.indexOf('\n') ); msg.replace(/\s+$/g, ""); // trim right // DeviceServer に受信完了を知らせる uplink_stream.write("OK\n"); // sendback an ack uplink_stream.end(); // WebSocketで接続中の全ブラウザに対して配信データを送信する downlink.sockets.emit('broadcast',{ message: msg }); console.log('broadcast:' + msg); } }); }); // 配信用 RelayServer起動 relay_server.listen(uplink_port);
子機からのイベントデータを受信受信するための uplink ポートをTCPソケットサーバーで作成しています。また、Web アプリ側に WebSocket で配信するための downlink ポートを socket.io ライブラリを使用して作成しています。
ここで使用している node.js のインストール方法と、socket.io モジュールの設置方法に関しては此方(記事1,記事2) を参照して下さい。
早速 node.js を使用してリレーサーバーを起動します。
リレーサーバーを記述した JavaScript ファイル(relay_server.js) を node コマンドで起動しています。
リレーサーバーが起動している状態で Web アプリを動作させると、自動的に WebSocket で配信されるメッセージをリレーサーバーから受信するようになります。
子機側のデジタル入力やA/D 値を変化させると、リレーサーバー側には以下の様にログメッセージが表示され、最新のI/O 値がブロードキャストされると同時に、Web アプリ側のデジタル入力のチェックボックスと A/D スライダーの値がリアルタイムに変化するようになります。
Web ソケットで配信された JSON データは Web アプリ(main.js) 内の後半部分に記述したイベントハンドラ部分で受信されて、GUI の更新を行っています。
また、リレーサーバーに子機のイベントデータを送信するためのスクリプト(RELAY_SERVER_UPLINK) の最初の部分で、ソケット通信エラーが発生する場合に備えて、DeviceServer のスクリプトプールの残りを常にチェックするようにしています。
これによって node.js で作成されたリレーサーバーがダウンした場合などに、DeviceServer 側のリソースが一時的に不足するのを防止しています。詳しくは前述の(RELAY_SERVER_UPLINK)スクリプト中のコメントをご覧ください。下記のログ画面は子機からのイベントを受信中にリレーサーバーを強制的に停止させたときの様子です。
ソケット通信を行っている tcp_send_recv_data()関数がエラーを検出するまでの間に、イベントデータが次々に到着している状態です。このとき、マルチスレッドで起動しているイベントハンドラがスクリプトプールの残りが少なくなってきているのを検出して、abort フラグを共有変数に設定しています(*ABORT SET* のログ部分)。
abort フラグが設定されると、それ以降はイベントハンドラは直ぐに終了するようになり、スクリプトプールの逼迫を防いでシステム全体の動作に影響が及ばないようにしています。
TWE-Lite でデフォルトで動作しているファームウエアでは、現在の子機のデジタル出力と PWM 設定値を取得するための方法がありません。このため、Web アプリを操作するときに”望まない出力操作” を行う必要がでてきます。
また、デジタル出力や PWM 設定値を変更した場合にもイベントは送信されませんので、リレーサーバーを使用しても、複数の Web アプリの画面のデジタル出力や PWM スライダーの設定を同期させて最新の状態にすることができません。
サーバー側で擬似的に子機を操作したときのタイミングでイベントデータを出力することもできますが、DeviceServer に接続した親機を経由しないで操作された場合にはやはり検出することができません。
これらを解決するためには、既存のファームエアを一部改造して以下の機能を追加するのが望ましいと思います。
(1) デジタル出力とPWM 設定値を取得するためのコマンドとレスポンスパケットを追加
(2) デジタル出力とPWM 設定変更時に新規のイベントデータを作成するか、または既存のイベントデータ中にこれらの最新の状態を含めるようにする
幸いファームウエアのソースと開発環境は TWE-Lite のホームページで公開されていますので、追加するのも出来そうな気がします?
Web アプリを操作した時の動画を載せましたのでご覧ください。(音量注意)
ここで紹介した DeviceServer の機能は、ABS-9000 DeviceServer インストールキットをダウンロードして、直ぐに使用することができます。Web API で使用したスクリプトファイルや Webアプリのソースファイルも全て格納されていますので是非お試しください。デモライセンスが添付されていますので直ちに使用可能です。
WebSocket を使用した双方向通信リアルタイムアプリの作成
エッジデバイスのLEDマトリックスに情報表示、Raspberry Pi + ScrollpHATHD