[{"content":"","date":"2026/07/01","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"2026/07/01","externalUrl":null,"permalink":"/categories/%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B/","section":"Categories","summary":"","title":"お知らせ","type":"categories"},{"content":"当ブログ（ビットログ）を、CMSである「WordPress」から、SSG（静的サイトジェネレータ）「Hugo」を用いた静的サイトへリニューアルしました。\n今回リニューアルに至った経緯は、次の2点です。\nWordPressのメンテナンスに手間がかかる 記事投稿をMarkdown形式で行いたい SSGで静的サイト化すればこの2点が解決できることは、数年前から分かっていました。しかし残念ながら、当社の開発案件でSSGを使う機会がこれまでなく、導入を保留していました。\nその状況を一変させたのが、LLMの存在です。\nいちエンジニアとして「LLMに頼りきってしまうのは、自分たちの存在意義を否定することになるのではないか」という葛藤もありました。しかし今回のように、やりたいことが明確なケースでは事情が違います。積極的にLLMを利用してバイブコーディングを行うことで、短時間で形にできる。これは大きなメリットです。サイトリニューアルはこれまで試行錯誤しながら時間をかけて行っていましたが、今回LLMを利用してみた結果、「道具としてLLMを使わない手はない」と、改めて実感しました。\n……と、ちょっとお固い感じで、いかにもLLMに書かせたような文章になってしまいましたが。\n安心してください、（人間が）書いてますよ。\nそんなわけで今後は、IT技術に限らず、ざっくばらんな話題も交えながら情報発信していきたいと思っています。今後のビットログにご期待ください。\n","date":"2026/07/01","externalUrl":null,"permalink":"/posts/oh/202606301355/","section":"Posts","summary":"当ブログ（ビットログ）を、CMSである「WordPress」から、SSG（静的サイトジェネレータ）「Hugo」を用いた静的サイトへリニューアルしました。\n","title":"ブログ、リニューアルしました。","type":"posts"},{"content":"社内サーバルームにて突如爆音を轟かせたSystem x3100 M5。なにごとかとマシンを確認するとSystemエラーLEDが点灯しているではないか。\nマニュアルを確認したところシステムボードでエラー箇所のLEDが点灯するらしい。フタを開けて確認するとなにやら光っている。\n目がショボショボするので拡大。\nBATT_ERR。どうやら電池切れのようだ。\nマニュアルには部品番号33F8354もしくは同等の電池と交換とあるが要はCR2032のリチウムイオン電池であれば良い。\n電池交換後にBIOSの時刻設定を行って爆音が収まったので本日の業務は終了です :-D\n","date":"2026/05/11","externalUrl":null,"permalink":"/posts/youtan/5489/","section":"Posts","summary":"社内サーバルームにて突如爆音を轟かせたSystem x3100 M5。なにごとかとマシンを確認するとSystemエラーLEDが点灯しているではないか。\n","title":"System x3100 M5のリチウム電池交換","type":"posts"},{"content":"","date":"2026/05/11","externalUrl":null,"permalink":"/categories/%E6%8A%80%E8%A1%93/","section":"Categories","summary":"","title":"技術","type":"categories"},{"content":" Free5GCで上記の構成をsmfcfg.yamlのlinksに記述する場合、通常は以下のように共通入り口にgNB1,gNB2を記述する必要があるかと思います。\nlinks: # 共通入口 - A: gNB1 B: I-UPF1 - A: gNB2 B: I-UPF1 # 分岐ルート - A: I-UPF1 B: I-UPF2 - A: I-UPF2 B: PSA-UPF1 - A: I-UPF1 B: I-UPF3 - A: I-UPF3 B: PSA-UPF2 ところが、この記述でfree5GCを起動してUEを接続するとgNB1の経路しかDNに繋がらず、gNB2の経路はDNまで繋がりませんでした。\n試しに共通入口をgNB1のみにしたところ、gNB1、gNB2の経路が共にDNまで繋がりました！（バグなのか？）\nlinks: # 共通入口 - A: gNB1 B: I-UPF1 # 分岐ルート - A: I-UPF1 B: I-UPF2 - A: I-UPF2 B: PSA-UPF1 - A: I-UPF1 B: I-UPF3 - A: I-UPF3 B: PSA-UPF2 ","date":"2026/04/28","externalUrl":null,"permalink":"/posts/youtan/5482/","section":"Posts","summary":"Free5GCで上記の構成をsmfcfg.yamlのlinksに記述する場合、通常は以下のように共通入り口にgNB1,gNB2を記述する必要があるかと思います。","title":"Free5GC v3.3.0での複数経路設定","type":"posts"},{"content":"OSM (Open Source MANO)の 公式サイト では、コマンド\n$ wget https://osm-download.etsi.org/ftp/osm-16.0-sixteen/install_osm.sh $ chmod +x install_osm.sh $ ./install_osm.sh を打つだけでインストールできると書いてありますが、インストールスクリプトに書かれているバージョンが古く使用可能でないパッケージ等がある理由で途中で失敗してしまいます。2026年1月にOSM v16のインストールに成功した際の設定について書きます。\n環境 # インストールした環境 OSM公式の推奨環境 OS Ubuntu 22.04 LTS (Jammy Jellyfish) Ubuntu 22.04 LTS (Jammy Jellyfish) RAM 16GB 16GB CPU数 4 4 ディスク 128GB 80GB NIC ネット接続ありx1 ネット接続なしx1 ネット接続ありx1 インストール # インストールスクリプトを実行する前に設定を書き換えます。\n1. インストールスクリプトと設定ファイル等のダウンロード # 公式サイトの3行のコマンドのうち、2行をそのまま実行します。 $ wget https://osm-download.etsi.org/ftp/osm-16.0-sixteen/install_osm.sh $ chmod +x install_osm.sh install_osm.sh の最終行をコメントアウトします。これはインストールスクリプトと設定ファイル等をダウンロードして実行はしないための措置です。 @@ -176,4 +176,4 @@ add_repo \u0026#34;deb [arch=amd64] $REPOSITORY_BASE/$RELEASE $REPOSITORY devops\u0026#34; sudo DEBIAN_FRONTEND=noninteractive apt-get -qy update sudo DEBIAN_FRONTEND=noninteractive apt-get -y install osm-devops - $DEVOPS_PATH/installers/full_install_osm.sh -R $RELEASE -r $REPOSITORY -u $REPOSITORY_BASE -D $DEVOPS_PATH -t $DOCKER_TAG \u0026#34;$@\u0026#34; + #$DEVOPS_PATH/installers/full_install_osm.sh -R $RELEASE -r $REPOSITORY -u $REPOSITORY_BASE -D $DEVOPS_PATH -t $DOCKER_TAG \u0026#34;$@\u0026#34; install_osm.sh を実行します。（ -y を付けると、先に進めてよいか聞かれる箇所で自動ではいと答えてくれます。ただし、スクリプト中の sudo apt install でディスクスペースを使用してよいか聞かれるときなどは自動で答えてくれません。） $ ./install_osm.sh 2. インストールスクリプトと設定ファイルの書き換え # ※書き換え内容は2026年1月に動いた一例であり、これ以外の設定で動く場合も、時期や環境などによってはこの設定でも動かない場合があると思われます。\n書き換えるファイルは全て /usr/share/osm-devops/installers/ の中にあります。\n2.1. インストールスクリプト( /usr/share/osm-devops/installers/ 直下) # install_k3s_cluster.sh @@ -17,5 +17,5 @@ # K3s releases: https://github.com/k3s-io/k3s/releases/ -K8S_VERSION=\u0026#34;v1.29.3+k3s1\u0026#34; +K8S_VERSION=\u0026#34;v1.32.11+k3s1\u0026#34; # configure registry @@ -84,5 +84,5 @@ echo \u0026#34;Waiting for pods to be ready\u0026#34; local time_for_readiness=20 # seconds ready - local time_for_failure=100 # seconds broken + local time_for_failure=200 # seconds broken # Equivalent number of samples K3s自体は1.29でも入りますが、後の方のチェックで失敗します。また、ポッドの起動が時間がかかるため、待ち時間を延ばします。\ninstall_mongodb.sh @@ -29,5 +29,5 @@ helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update - helm upgrade mongodb-k8s bitnami/mongodb -n ${OSM_NAMESPACE} --create-namespace --install -f ${OSM_HELM_WORK_DIR}/mongodb-values.yaml --version ${MONGODB_HELM_VERSION} --timeout 10m || FATAL_TRACK mongodb \u0026#34;Failed installing mongodb helm chart\u0026#34; + helm upgrade mongodb-k8s bitnami/mongodb -n ${OSM_NAMESPACE} --create-namespace --install -f ${OSM_HELM_WORK_DIR}/mongodb-values.yaml --version ${MONGODB_HELM_VERSION} --timeout 10m --set image.repository=bitnamilegacy/mongodb || FATAL_TRACK mongodb \u0026#34;Failed installing mongodb helm chart\u0026#34; [ -z \u0026#34;${DEBUG_INSTALL}\u0026#34; ] || DEBUG end of function } bitnamiにはこのファイルの上の方で設定されているMongoDB 6.0.5が既にないため、代わりに6.0.5がまだあるbitnamilegacyを参照するように変更します。\ninstall_ngsa.sh @@ -35,5 +35,5 @@ helm repo add apache-airflow https://airflow.apache.org helm repo update - helm upgrade airflow apache-airflow/airflow -n ${OSM_NAMESPACE} --create-namespace --install -f ${OSM_HELM_WORK_DIR}/airflow-values.yaml --version ${AIRFLOW_HELM_VERSION} --timeout 10m || FATAL_TRACK ngsa \u0026#34;Failed installing airflow helm chart\u0026#34; + helm upgrade airflow apache-airflow/airflow -n ${OSM_NAMESPACE} --create-namespace --install -f ${OSM_HELM_WORK_DIR}/airflow-values.yaml --version ${AIRFLOW_HELM_VERSION} --timeout 20m || FATAL_TRACK ngsa \u0026#34;Failed installing airflow helm chart\u0026#34; [ -z \u0026#34;${DEBUG_INSTALL}\u0026#34; ] || DEBUG end of function } こちらもポッドの起動に時間がかかるため、待ち時間を延長します。\n2.2. 設定ファイル(フォルダ /usr/share/osm-devops/installers/helm と /usr/share/osm-devops/installers/mgmt-cluster 内) # helm/osm/values.yaml @@ -198,4 +198,7 @@ kafka: + image: + repository: bitnamilegacy/kafka + tag: 4.0.0-debian-12-r10 enabled: true listeners: @@ -203,5 +206,25 @@ protocol: \u0026#34;PLAINTEXT\u0026#34; fullnameOverride: \u0026#34;kafka\u0026#34; - # replicaCount: 1 + replicaCount: 3 + listeners: + client: + protocol: \u0026#34;PLAINTEXT\u0026#34; + controller: + protocol: \u0026#34;PLAINTEXT\u0026#34; + interbroker: + protocol: \u0026#34;PLAINTEXT\u0026#34; + controller: + containerPort: 9093 + livenessProbe: + enabled: true + initialDelaySeconds: 300 + periodSeconds: 10 + failureThreshold: 15 + readinessProbe: + enabled: true + initialDelaySeconds: 60 + periodSeconds: 10 + failureThreshold: 10 + terminationGracePeriodSeconds: 60 keystone: @@ -252,6 +275,13 @@ enabled: true image: + repository: bitnamilegacy/mysql tag: \u0026#34;8.1-debian-11\u0026#34; fullnameOverride: \u0026#34;mysql\u0026#34; + primary: + startupProbe: + enabled: true + initialDelaySeconds: 90 + periodSeconds: 10 + failureThreshold: 100 nbi: こちらもkafkaとmysqlがbitnamiから取れないため、参照先を変更します。また、ポッドの起動に時間がかかるため、タイムアウトして失敗しないよう時間制限を緩めます。また、なぜかkafkaのpodたちが通信に失敗することがあるので、ポートを指定します。\nhelm/values/airflow-values.yaml @@ -48,2 +48,7 @@ persistence: size: 8Gi + +postgresql: + image: + repository: bitnamilegacy/postgresql + tag: 15 同様にairflowが依存するpostgresqlについて参照先を変更します。\nmgmt-cluster/gitea/values-standalone-ingress-ssh2222.yaml @@ -435,4 +435,7 @@ ## @param memcached.service.port Port for Memcached memcached: + image: + repository: bitnamilegacy/memcached + tag: 1.6.10 enabled: true service: @@ -448,4 +451,7 @@ ## @param postgresql.persistence.size PVC Storage Request for PostgreSQL volume postgresql: + image: + repository: bitnamilegacy/postgresql + tag: 15 enabled: true global: giteaが依存するmemcachedとpostgresqlについて参照先を変更します。\n3. インストール実行 # install_osm.sh の最終行のコメントアウトを解除します。 install_osm.sh @@ -176,4 +176,4 @@ add_repo \u0026#34;deb [arch=amd64] $REPOSITORY_BASE/$RELEASE $REPOSITORY devops\u0026#34; sudo DEBIAN_FRONTEND=noninteractive apt-get -qy update sudo DEBIAN_FRONTEND=noninteractive apt-get -y install osm-devops - #$DEVOPS_PATH/installers/full_install_osm.sh -R $RELEASE -r $REPOSITORY -u $REPOSITORY_BASE -D $DEVOPS_PATH -t $DOCKER_TAG \u0026#34;$@\u0026#34; + $DEVOPS_PATH/installers/full_install_osm.sh -R $RELEASE -r $REPOSITORY -u $REPOSITORY_BASE -D $DEVOPS_PATH -t $DOCKER_TAG \u0026#34;$@\u0026#34; install_osm.sh を実行します。（ -y を付けると、先に進めてよいか聞かれる箇所で自動ではいと答えてくれます。ただし、スクリプト中の sudo apt install でディスクスペースを使用してよいか聞かれるときなどは自動で答えてくれません。） $ ./install_osm.sh -y インストールが完了するまでに少なくとも30分ほどはかかります。画面には進捗状況が表示されます。 補足 # インストールに失敗した場合、再度インストールする前に失敗したインストールの残骸を削除する必要があります。その際、osmがインストールの序盤で生成する /usr/local/bin/k3s-killall.sh や /usr/local/bin/k3s-uninstall.sh があるため、それを実行するとよいです。また、 /etc/kubernetes/、 /var/lib/etcd/、 $HOME/.kube/、 /etc/cni/net.d も削除しておくとよいです。 bitnamilegacyにもあまり古すぎるファイルはないようで、今回ではたとえばpostgresqlとkafkaはデフォルトで指定されるバージョンが見つからなかったので、bitnamilegacyにあるバージョンに差し替えました。bitnamilegacyでどのバージョンがあるかについては、 https://hub.docker.com の各レポジトリのtagsを参照するとよいです。例えば、mongodbであれば、　https://hub.docker.com/r/bitnamilegacy/postgresql/tags を見ると、どのバージョンがあるかがわかります。 bitnamilegacyのパッケージは基本的にサポートが切れているので、プロダクション環境では使わない方がいいらしいです。 タイミングの問題で同期がうまくいかずにインストールが失敗することもあり、その場合には全く同じ設定でもう一度インストールするとうまくいくことがあります。 ","date":"2026/03/31","externalUrl":null,"permalink":"/posts/kot/5467/","section":"Posts","summary":"OSM (Open Source MANO)の 公式サイト では、コマンド\n$ wget https://osm-download.etsi.org/ftp/osm-16.0-sixteen/install_osm.sh $ chmod +x install_osm.sh $ ./install_osm.sh を打つだけでインストールできると書いてありますが、インストールスクリプトに書かれているバージョンが古く使用可能でないパッケージ等がある理由で途中で失敗してしまいます。2026年1月にOSM v16のインストールに成功した際の設定について書きます。\n環境 # インストールした環境 OSM公式の推奨環境 OS Ubuntu 22.04 LTS (Jammy Jellyfish) Ubuntu 22.04 LTS (Jammy Jellyfish) RAM 16GB 16GB CPU数 4 4 ディスク 128GB 80GB NIC ネット接続ありx1 ネット接続なしx1 ネット接続ありx1 インストール # インストールスクリプトを実行する前に設定を書き換えます。\n","title":"OSM (Open Source MANO) v16 インストール","type":"posts"},{"content":"","date":"2025/08/20","externalUrl":null,"permalink":"/categories/%E3%81%94%E6%8C%A8%E6%8B%B6/","section":"Categories","summary":"","title":"ご挨拶","type":"categories"},{"content":"残暑厳しき折、皆様には益々ご清祥のこととお喜び申し上げます。 本日、株式会社ビットマイスターは創立18周年を迎えることができました。ここまで歩みを続けてこられましたのは、ひとえに皆様から賜りました温かいご支援とご信頼のおかげであり、心より厚く御礼申し上げます。\n第18期は、拡大を続ける通信関連研究の支援が大きな柱となりました。 Beyond5Gに向けた各種検証用アプリケーションの開発や、サイバーフィジカルシステムにおけるワイヤレスエミュレータ環境の構築、陸上から宇宙に至るまでをシームレスに結ぶ通信オーケストレーターの開発、「サイバネティック・アバター」基盤研究における信頼性向上ネットワークシステムの構築など、これまで培ってきた知見をさらに発展させる取り組みが進みました。いずれも高度な技術支援を必要とする案件であり、私たちにとって大きな成長の機会となっております。\n教育・学術分野におきましても、大学向けの科学教育・教育工学分野でのシステム改修・保守サポートを継続するほか、学術クラウドファンディングサイト「academist」を運営する アカデミスト様の研究支援プログラムへの協賛、研究プロジェクトのIT化や運営支援など、多様な形で研究者の活動を支えてまいりました。研究者を取り巻く環境はますます高度化し、限られた資源の中で迅速かつ質の高い成果が求められる時代を迎えております。そうした状況にあっても研究者の皆さまが本来の探究に集中できるよう、通信・教育・防災といった多彩なプロジェクトで培った経験と、OSS（オープンソースソフトウェア）の活用を組み合わせ、研究開発の立ち上げから環境構築、成果の可視化や社会発信に至るまで、一貫した支援をお届けしています。\n一方で、弊社の研究支援サービスに関心を寄せてくださる新規のお客様からのご相談も増加しておりますが、リソースの制約からすべてのご依頼に十分対応できない場面も生じております。今後は事業のさらなる効率化を図るとともに、新規採用や外部パートナーとの協力体制を強化し、一つでも多くのニーズにお応えできるよう、創意工夫を重ねてまいります。\n私たちの使命は、ソフトウェア技術を最大限に活用し、多様な研究開発を支援しながら、皆様と共に次世代の技術を築き上げていくことです。これからも誠実かつ柔軟な姿勢で、研究者の挑戦と社会の期待に応えてまいりたいと存じます。\n今後とも変わらぬご支援とご指導を賜りますよう、心からお願い申し上げます。\n令和7年8月20日 株式会社ビットマイスター 代表取締役　笠原 勉\n","date":"2025/08/20","externalUrl":null,"permalink":"/posts/kasa/5458/","section":"Posts","summary":"残暑厳しき折、皆様には益々ご清祥のこととお喜び申し上げます。 本日、株式会社ビットマイスターは創立18周年を迎えることができました。ここまで歩みを続けてこられましたのは、ひとえに皆様から賜りました温かいご支援とご信頼のおかげであり、心より厚く御礼申し上げます。\n第18期は、拡大を続ける通信関連研究の支援が大きな柱となりました。 Beyond5Gに向けた各種検証用アプリケーションの開発や、サイバーフィジカルシステムにおけるワイヤレスエミュレータ環境の構築、陸上から宇宙に至るまでをシームレスに結ぶ通信オーケストレーターの開発、「サイバネティック・アバター」基盤研究における信頼性向上ネットワークシステムの構築など、これまで培ってきた知見をさらに発展させる取り組みが進みました。いずれも高度な技術支援を必要とする案件であり、私たちにとって大きな成長の機会となっております。\n教育・学術分野におきましても、大学向けの科学教育・教育工学分野でのシステム改修・保守サポートを継続するほか、学術クラウドファンディングサイト「academist」を運営する アカデミスト様の研究支援プログラムへの協賛、研究プロジェクトのIT化や運営支援など、多様な形で研究者の活動を支えてまいりました。研究者を取り巻く環境はますます高度化し、限られた資源の中で迅速かつ質の高い成果が求められる時代を迎えております。そうした状況にあっても研究者の皆さまが本来の探究に集中できるよう、通信・教育・防災といった多彩なプロジェクトで培った経験と、OSS（オープンソースソフトウェア）の活用を組み合わせ、研究開発の立ち上げから環境構築、成果の可視化や社会発信に至るまで、一貫した支援をお届けしています。\n一方で、弊社の研究支援サービスに関心を寄せてくださる新規のお客様からのご相談も増加しておりますが、リソースの制約からすべてのご依頼に十分対応できない場面も生じております。今後は事業のさらなる効率化を図るとともに、新規採用や外部パートナーとの協力体制を強化し、一つでも多くのニーズにお応えできるよう、創意工夫を重ねてまいります。\n私たちの使命は、ソフトウェア技術を最大限に活用し、多様な研究開発を支援しながら、皆様と共に次世代の技術を築き上げていくことです。これからも誠実かつ柔軟な姿勢で、研究者の挑戦と社会の期待に応えてまいりたいと存じます。\n今後とも変わらぬご支援とご指導を賜りますよう、心からお願い申し上げます。\n令和7年8月20日 株式会社ビットマイスター 代表取締役　笠原 勉\n","title":"創立18周年のご挨拶","type":"posts"},{"content":"残暑厳しき折、皆様にはお変わりなくお過ごしのことと存じます。\n本日、株式会社ビットマイスターは創立17周年を迎えることができました。これもひとえに、皆様のご支援とご愛顧の賜物と、心より感謝申し上げます。\n第17期は、数年来携わらせていただいている研究プロジェクトの他、新たな次世代分野への支援も開始しました。複数の人が遠隔操作する多数のアバターとロボットを組み合わせた、大規模で複雑なタスクを実行するためのサイバネティック・アバターの基盤研究向けの信頼性向上ネットワークシステム構築、無人自動運転を目指した最新MaaS研究向けV2X技術開発、ともに新規のエンドユーザ様向けの支援となりました。\nBeyond5G向けの要素技術の各種検証用アプリケーションの開発、サイバーフィジカルシステムでのワイヤレスエミュレータの環境構築、陸上から宇宙に至る全ての領域をシームレスに繋ぐ通信システムのオーケストレーター開発、ならびにシミュレーション用ソフトウェアの提供等の通信関連研究の継続支援におきましては、おかげさまで拡大傾向にあります。\n主に大学様に向けた科学教育・教育工学分野の支援においては、過去に提供したシステムの保守サポートに加え、教育ツール関連の新規開発を行いました。弊社が開発協力した学習アプリケーションを利用した研究が学会で賞を獲得したとの報告をいただくこともあり、研究推進の一助となれたことを嬉しく存じます。\nまた、埼玉大学様と地元企業様との産学官連携活動をきっかけに開発したデジタルサイネージ型防災情報提供システム『 ソナエージ』は、次の展開に向けた活動を続けて来ました。災害情報などの危機管理情報を便利に取り扱うための、準天頂衛星みちびきが送信する災危通報メッセージのデコーダー「 azarashi」を開発し公開しています。\n弊社が提供している「研究開発ITサービス」は、研究活動をソフトウェア技術でサポートすることですが、昨今は、単に研究用のソフトウェアの提供にとどまらず、研究開発環境の構築方法や、研究成果をステークフォルダーに分かりやすく説明するアウトリーチ用のデモンストレーション手法等を、研究の初期委段階からアイデア含めて相談いただくことも増えてきました。創業時より積み重ねてきた研究支援ノウハウを効果的にご利用いただけるように、第18期におきましても社員一同、より一層精進してまいりますので、今後とも変わらぬご愛顧を賜りますようお願い申し上げます。\n厳しい暑さが続きますが、皆様どうぞご自愛ください。\n令和6年8月20日 株式会社ビットマイスター 代表取締役　笠原 勉\n","date":"2024/08/20","externalUrl":null,"permalink":"/posts/kasa/5437/","section":"Posts","summary":"残暑厳しき折、皆様にはお変わりなくお過ごしのことと存じます。\n本日、株式会社ビットマイスターは創立17周年を迎えることができました。これもひとえに、皆様のご支援とご愛顧の賜物と、心より感謝申し上げます。\n第17期は、数年来携わらせていただいている研究プロジェクトの他、新たな次世代分野への支援も開始しました。複数の人が遠隔操作する多数のアバターとロボットを組み合わせた、大規模で複雑なタスクを実行するためのサイバネティック・アバターの基盤研究向けの信頼性向上ネットワークシステム構築、無人自動運転を目指した最新MaaS研究向けV2X技術開発、ともに新規のエンドユーザ様向けの支援となりました。\nBeyond5G向けの要素技術の各種検証用アプリケーションの開発、サイバーフィジカルシステムでのワイヤレスエミュレータの環境構築、陸上から宇宙に至る全ての領域をシームレスに繋ぐ通信システムのオーケストレーター開発、ならびにシミュレーション用ソフトウェアの提供等の通信関連研究の継続支援におきましては、おかげさまで拡大傾向にあります。\n主に大学様に向けた科学教育・教育工学分野の支援においては、過去に提供したシステムの保守サポートに加え、教育ツール関連の新規開発を行いました。弊社が開発協力した学習アプリケーションを利用した研究が学会で賞を獲得したとの報告をいただくこともあり、研究推進の一助となれたことを嬉しく存じます。\nまた、埼玉大学様と地元企業様との産学官連携活動をきっかけに開発したデジタルサイネージ型防災情報提供システム『 ソナエージ』は、次の展開に向けた活動を続けて来ました。災害情報などの危機管理情報を便利に取り扱うための、準天頂衛星みちびきが送信する災危通報メッセージのデコーダー「 azarashi」を開発し公開しています。\n弊社が提供している「研究開発ITサービス」は、研究活動をソフトウェア技術でサポートすることですが、昨今は、単に研究用のソフトウェアの提供にとどまらず、研究開発環境の構築方法や、研究成果をステークフォルダーに分かりやすく説明するアウトリーチ用のデモンストレーション手法等を、研究の初期委段階からアイデア含めて相談いただくことも増えてきました。創業時より積み重ねてきた研究支援ノウハウを効果的にご利用いただけるように、第18期におきましても社員一同、より一層精進してまいりますので、今後とも変わらぬご愛顧を賜りますようお願い申し上げます。\n厳しい暑さが続きますが、皆様どうぞご自愛ください。\n令和6年8月20日 株式会社ビットマイスター 代表取締役　笠原 勉\n","title":"創立17周年のご挨拶","type":"posts"},{"content":"きょうは Common Alert Message Format (CAMF) について所感を書きます。準天頂衛星みちびきの災害・危機管理通報サービス(DCR)というのがありまして、その拡張(DCX)のメッセージフォーマットがCAMFです。\nみちびきからはすでにCAMFのDCXメッセージが降ってきていて、欧州連合のGalileoの早期警報システム(EWS)もこの共通メッセージフォーマットが使われることになっています。なので、CAMFのデコーダーを実装すればGalileoのEWSも簡単にサポートできるはずです。こういうのは作る側からすると非常にありがたいですね。とはいえ、既存の気象庁の防災気象情報に基づいたDCRのメッセージフォーマットもわかりやすくよくできていました。CAMFはやろうとしてることが壮大な分、少し仕様が複雑です。\n仕様の解説は仕様書を見てもらえばいいので、DCR/DCXデコーダーazarashiを実装していて感じたことを書きます。\nJ-AlertとL-Alertに対応\nDCXではJ-AlertとL-Alertが降ってきます。もうひとつ、municipality-transmitted information [tentative name]というのもDCXで降ってくるのですが、まだ実運用はされていない？のかな？J-AlertとL-Alertは執筆時点でもう降ってきます。CAMFはJ-AlertとL-Alertのみをターゲットに作られているわけではないので、どこから提供された情報かによって判別します。総務省消防庁からの情報ならJ-Alert、マルチメディア振興センターならL-Alertといった具合です。ちなみにazarashiはメッセージタイプを判別して返すクラスを分けています。 https://github.com/nbtk/azarashi/tree/main?tab=readme-ov-file#dcx-message-types\n日本国外からの情報\nEUと共通フォーマットなだけあって、はじめからメッセージには国を示すフィールドがあり、また国ごととの情報提供元が指定できます。現時点の仕様書ではオーストラリア、フィジー、タイの関係機関のコードが規定されています。 https://github.com/nbtk/azarashi/blob/main/azarashi/qzss_dcr_lib/definition/qzss_dcx_camf_a3_provider_identifier.py\n災害・危機種別\nこれも様々なものに対応しています。Undefined flying objectなんていうのもあります。定義としては不明な飛行物体というだけで、必ずしも宇宙から飛来した謎の飛行物体を指すわけではないです。なお、仕様書上ではすべて英語表記です。日本で使うときには日本語訳が必要でしょう。でも、こういう災害情報は言葉選びが難しいんですよね。現時点では降ってくるメッセージの災害・危機種別を格納するA4フィールドは0(未設定)のことが多いです。改善を期待して待ちましょう。 https://github.com/nbtk/azarashi/blob/main/azarashi/qzss_dcr_lib/definition/qzss_dcx_camf_a4_hazard_category_and_type.py\n市区町村名のローマ字表記\nこれはCAMFは関係無いですが、他のフィールドが英語で市区町村名だけ日本語なのは気持ち悪かったのでローマ字表記のテーブルを作りました。市区町村のローマ字表記って官公庁によってバラバラなんですね。これを御殿場問題と勝手に呼んでいて「Gote n baなのかGote m baなのか」は絶対にこれという決まりは無いんですよ。つまりこの例ではmb、mp、mmルールを適応するかどうかは個別の判断に委ねられます。元をたどれば日本語のひらがなの「ん」の発音はたくさんの種類があるのに文字が一つだけというのが問題ではあります。しかもですね、たとえば日本橋は「Niho m bashiにはならない、Niho n-HashiだからNiho n bashiだ」のような非常に複雑な問題を内包しています。 https://github.com/nbtk/azarashi/blob/main/azarashi/qzss_dcr_lib/definition/qzss_dcx_camf_ex1_target_area_code.py\n実装するときの注意点\n従来のDCXのメッセージフォーマットと違って、CAMFはひとつのフォーマットのメッセージですべての災害・機器情報を表現するので、どのフィールドを使がつかわれるかの分岐がいくつかあります。たとえば地図上に描画したいときは、どんな情報が入ってくるかを判別して実装する必要があるでしょう。仕様書を読みましょう。 https://qzss.go.jp/en/technical/ps-is-qzss/ps-is-qzss.html\nとにもかくにも、インターネットがつながらなくてもJ-AlertやL-Alertが降ってくるのは、訴求力があっていいです。CAMFは今後に期待が持てる柔軟なフォーマットでした。\n","date":"2024/06/28","externalUrl":null,"permalink":"/posts/bit/5395/","section":"Posts","summary":"きょうは Common Alert Message Format (CAMF) について所感を書きます。準天頂衛星みちびきの災害・危機管理通報サービス(DCR)というのがありまして、その拡張(DCX)のメッセージフォーマットがCAMFです。","title":"Common Alert Message Format","type":"posts"},{"content":"ようやくできました。みちびきの災害・危機管理通報サービス(災危通報、DCR)にJ-AlertとL-Alertが追加されると聞いて、「2つ追加されるだけでしょ？かんたんかんたん」と思っていたら全然違いました。DCRのデコーダーをもう一度作るような手間がかかりました。\nhttps://pypi.org/project/azarashi/\nJ-Alert、L-AlertはDCXというDCRとは異なるメッセージで配信され、CAMFというメッセージフォーマットを使っています。日本の災害・危機管理通報だけをターゲットにしたメッセージフォーマットではなく、様々な災害が定義されており、EUのGALILEOと共通で用いられることが想定されているようです。これはまた別の記事で書きます。\nさて、azarashiはDCXをCAMFで定義されているビットフィールドに従ってこのように文字列化します。\n\u0026gt;\u0026gt;\u0026gt; import azarashi \u0026gt;\u0026gt;\u0026gt; msg = \u0026#39;$QZQSM,55,53B0604DE19524CDA305B2C1E355B57800000CCC000000000000001022A8188*7E\u0026#39; # l-alert \u0026gt;\u0026gt;\u0026gt; report = azarashi.decode(msg, \u0026#39;nmea\u0026#39;) \u0026gt;\u0026gt;\u0026gt; print(report) ### DCX Message - L-Alert ### A1 - Message type: Alert A2 - Country/region name: Japan A3 - Provider identifier: Foundation for MultiMedia Communications A4 - Hazard category and type: MET - Rainfall A4 - Hazard definition: Rainfall greater than or equal to 50 mm in past 24 hours. Note: Precise threshold is according to each local standard. A5 - Severity: Severe - Significant threat to life or property A6A7 - Hazard onset: 2024-06-23 13:00:00 A8 - Hazard duration: 6H \u0026lt;= Duration \u0026lt; 12H A11 - Guidance to react: Keep away from Water area. A11 - Guidance to react (ja): 離れろ。水場。 A12 - Ellipse centre latitude: 35.688 A13 - Ellipse centre longitude: 139.691 A14 - Ellipse semi - major axis: 10.933 A15 - Ellipse semi - minor axis: 5.979 A16 - Ellipse azimuth: 45.0 A17 - Specific settings: B1 - Improved Resolution of Main Ellipse C1 - Refined latitude of centre of main ellipse: 35.688 C2 - Refined longitude of centre of main ellipse: 139.691 C3 - Refined length of semi major axis: 10.933 C4 - Refined length of semi minor axis: 5.979 どのフィールドになんの情報が入るかはドキュメントを読んでみてください。メッセージによって使われるフィールドがかわるので、これまでのDCRと違ってちゃんと仕様を確認しないとDCXは使えないと思います。 https://qzss.go.jp/technical/download/ps-is-qzss.html https://www.gsc-europa.eu/sites/default/files/sites/all/files/EWSS-CAMF_v1.0.pdf\n実際に使うことになったときはたとえばA4フィールドの災害に関する情報は日本語に翻訳する必要がありそうですね。A4が0のメッセージが降ってくることもあるので、それも考慮して実装しましょう。 ちなみに、執筆時点で実際に降ってくるL-Alertのメッセージを見ているとA12~A16の位置情報は設定されておらず、そのときはEX1フィールドに市区町村コードが設定されます。\n\u0026gt;\u0026gt;\u0026gt; from pprint import pprint \u0026gt;\u0026gt;\u0026gt; pprint(report.get_params(), sort_dicts=False) レポートクラスの中身もDCRと全く違います。\n{\u0026#39;sentence\u0026#39;: \u0026#39;$QZQSM,55,53B0604DE19524CDA305B2C1E355B57800000CCC000000000000001022A8188*7E\u0026#39;, \u0026#39;timestamp\u0026#39;: datetime.datetime(2024, 6, 21, 15, 9, 5, 433111), \u0026#39;message\u0026#39;: b\u0026#39;S\\xb0`M\\xe1\\x95$\\xcd\\xa3\\x05\\xb2\\xc1\\xe3U\\xb5x\\x00\\x00\\x0c\\xcc\u0026#39; b\u0026#39;\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x10\u0026#34;\\xa8\\x18\\x80\u0026#39;, \u0026#39;nmea\u0026#39;: \u0026#39;$QZQSM,55,53B0604DE19524CDA305B2C1E355B57800000CCC000000000000001022A8188*7E\u0026#39;, \u0026#39;message_header\u0026#39;: \u0026#39;$QZQSM\u0026#39;, \u0026#39;satellite_id\u0026#39;: 55, \u0026#39;satellite_prn\u0026#39;: 183, \u0026#39;raw\u0026#39;: b\u0026#39;M\\xe1\\x95$\\xcd\\xa3\\x05\\xb2\\xc1\\xe3U\\xb5x\\x00\\x00\\x0c\\xcc\\x00\\x00\\x00\u0026#39; b\u0026#39;\\x00\\x00\\x00\\x00\\x10\u0026#39;, \u0026#39;preamble\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;message_type\u0026#39;: \u0026#39;DCX\u0026#39;, \u0026#39;camf\u0026#39;: \u0026lt;azarashi.qzss_dcr_lib.decoder.qzss_dcx_decoder.QzssDcxDecoder.decode.\u0026lt;locals\u0026gt;.CAMF object at 0x1023af6a0\u0026gt;, \u0026#39;ignore_a12_to_a16\u0026#39;: False, \u0026#39;ignore_a17_to_a18\u0026#39;: False, \u0026#39;ignore_ex1\u0026#39;: True, \u0026#39;ignore_ex2_to_ex7\u0026#39;: True, \u0026#39;ignore_ex8_to_ex9\u0026#39;: True, \u0026#39;satellite_designation_mask_type\u0026#39;: \u0026#39;MT44 is for Japan or for use outside Japan\u0026#39;, \u0026#39;satellite_designation_mask\u0026#39;: [\u0026#39;For Japan\u0026#39;, \u0026#39;For Japan\u0026#39;, \u0026#39;For Japan\u0026#39;, \u0026#39;For Japan\u0026#39;, \u0026#39;For Japan\u0026#39;, \u0026#39;For use outside Japan\u0026#39;, \u0026#39;For use outside Japan\u0026#39;, \u0026#39;For Japan\u0026#39;, \u0026#39;For Japan\u0026#39;], \u0026#39;dcx_message_type\u0026#39;: \u0026#39;L-Alert\u0026#39;, \u0026#39;a1_message_type\u0026#39;: \u0026#39;Alert\u0026#39;, \u0026#39;a2_country_region_name\u0026#39;: \u0026#39;Japan\u0026#39;, \u0026#39;a3_provider_identifier\u0026#39;: \u0026#39;Foundation for MultiMedia Communications\u0026#39;, \u0026#39;a4_hazard_category\u0026#39;: \u0026#39;MET\u0026#39;, \u0026#39;a4_hazard_type\u0026#39;: \u0026#39;Rainfall\u0026#39;, \u0026#39;a4_hazard_definition\u0026#39;: \u0026#39;Rainfall greater than or equal to 50 mm in past 24 \u0026#39; \u0026#39;hours. Note: Precise threshold is according to each \u0026#39; \u0026#39;local standard.\u0026#39;, \u0026#39;a5_severity\u0026#39;: \u0026#39;Severe - Significant threat to life or property\u0026#39;, \u0026#39;a6_hazard_onset_week\u0026#39;: \u0026#39;Current\u0026#39;, \u0026#39;a7_hazard_onset_time_of_week\u0026#39;: \u0026#39;SUNDAY - 01:00 PM\u0026#39;, \u0026#39;a6a7_hazard_onset_datetime\u0026#39;: datetime.datetime(2024, 6, 23, 13, 0), \u0026#39;a8_hazard_duration\u0026#39;: \u0026#39;6H \u0026lt;= Duration \u0026lt; 12H\u0026#39;, \u0026#39;a9_selection_of_library\u0026#39;: \u0026#39;Country/region guidance library\u0026#39;, \u0026#39;a10_library_version\u0026#39;: \u0026#39;#1\u0026#39;, \u0026#39;a11_japanese_library\u0026#39;: \u0026#39;Keep away from Water area.\u0026#39;, \u0026#39;a11_japanese_library_ja\u0026#39;: \u0026#39;離れろ。水場。\u0026#39;, \u0026#39;a12_ellipse_centre_latitude\u0026#39;: 35.6882581826505, \u0026#39;a13_ellipse_centre_longitude\u0026#39;: 139.69085457500137, \u0026#39;a14_ellipse_semi_major_axis\u0026#39;: 10.932758602420911, \u0026#39;a15_ellipse_semi_minor_axis\u0026#39;: 5.978542029422428, \u0026#39;a16_ellipse_azimuth\u0026#39;: 45.0, \u0026#39;a17_main_subject_for_specific_settings\u0026#39;: \u0026#39;B1 - Improved Resolution of Main \u0026#39; \u0026#39;Ellipse\u0026#39;, \u0026#39;c1_refined_latitude_of_centre_of_main_ellipse\u0026#39;: 35.6882581826505, \u0026#39;c2_refined_longitude_of_centre_of_main_ellipse\u0026#39;: 139.69085457500137, \u0026#39;c3_refined_length_of_semi_major_axis\u0026#39;: 10.932758602420911, \u0026#39;c4_refined_length_of_semi_minor_axis\u0026#39;: 5.978542029422428, \u0026#39;dcx_version\u0026#39;: 1} これまでのDCRをハンドリングするコードにDCXのレポートクラスを流し込むと想定しているメンバ変数が存在せずエラーになると思います。azarashi.decode_stream()メソッドにはignore_dcxオプションがあるので、DCXを流してよければFalseを設定してください。 後方互換性のためデフォルトではDCXは無視されます。\n「自分で作ったライブラリを使うんじゃい」という方はreport.camfにビットフィールドの値が入っています。\n\u0026gt;\u0026gt;\u0026gt; print(report.camf.get_params()) {\u0026#39;sdmt\u0026#39;: 0, \u0026#39;sdm\u0026#39;: 96, \u0026#39;a1\u0026#39;: 1, \u0026#39;a2\u0026#39;: 111, \u0026#39;a3\u0026#39;: 1, \u0026#39;a4\u0026#39;: 74, \u0026#39;a5\u0026#39;: 2, \u0026#39;a6\u0026#39;: 0, \u0026#39;a7\u0026#39;: 9421, \u0026#39;a8\u0026#39;: 2, \u0026#39;a9\u0026#39;: 1, \u0026#39;a10\u0026#39;: 0, \u0026#39;a11\u0026#39;: 773, \u0026#39;a12\u0026#39;: 45761, \u0026#39;a13\u0026#39;: 116395, \u0026#39;a14\u0026#39;: 13, \u0026#39;a15\u0026#39;: 11, \u0026#39;a16\u0026#39;: 48, \u0026#39;a17\u0026#39;: 0, \u0026#39;a18\u0026#39;: 0, \u0026#39;ex1\u0026#39;: 13104, \u0026#39;ex2\u0026#39;: 0, \u0026#39;ex3\u0026#39;: 0, \u0026#39;ex4\u0026#39;: 0, \u0026#39;ex5\u0026#39;: 0, \u0026#39;ex6\u0026#39;: 0, \u0026#39;ex7\u0026#39;: 0, \u0026#39;ex8\u0026#39;: 0, \u0026#39;ex9\u0026#39;: 7376896189632872448, \u0026#39;ex10\u0026#39;: 0, \u0026#39;vn\u0026#39;: 1, \u0026#39;c1\u0026#39;: 0, \u0026#39;c2\u0026#39;: 0, \u0026#39;c3\u0026#39;: 0, \u0026#39;c4\u0026#39;: 0} GitHubのレポジトリに星をくださった方、本当にありがとうございます。azarashiの半分はあなたの星でできています。 星を押さずに使っている方、いますぐ星を押すのです。星を押さないと開発が止まりますよ。星が足りません。星をもっとください。\nでは、よいハックを。\n","date":"2024/06/27","externalUrl":null,"permalink":"/posts/bit/5376/","section":"Posts","summary":"ようやくできました。みちびきの災害・危機管理通報サービス(災危通報、DCR)にJ-AlertとL-Alertが追加されると聞いて、「2つ追加されるだけでしょ？かんたんかんたん」と思っていたら全然違いました。DCRのデコーダーをもう一度作るような手間がかかりました。","title":"Azarashi supported DCX","type":"posts"},{"content":"Momonga はBルートサービスを利用してスマートメーターと通信するPythonモジュールです。今日はその使い方を説明します。\n0. 電力会社にBルートの申請 兎にも角にも、まずBルートのIDとパスワードを入手してください。東京電力では自宅のスマートメーターならWebからピッピやるだけでできました。\n1. Wi-SUNモジュールBP35C2を調達する ラトックシステムのUSBドングルがAmazonで売ってます。USBドングルである必要は特にないのでUARTを使うタイプでもよいでしょう。\n2. Raspberry Pi OS をインストールしたRPiにドングルを挿す Raspberry Piじゃなくてもシリアル通信できればなんでもいいです。Windowsは試してないけど動くかもしれません。もし動かなかったら参考までに教えて下さい。\n3. Momongaをインストールする\n$ pip install momonga ここで、シリアルデバイスが/dev/ttyUSB0とかにマウントされてると思うのですが、このデバイスファイルへの読書権限と、PythonモジュールであるMomongaがどのユーザーのためにインストールされているのかに留意してください。つまりユーザーにデバイスファイルへの読書権限がなく、sudoでpythonを実行しようとしたとき、Momongaもsudoでインストールしておく必要があったりします。しかし、sudoで環境を汚すのは些か憚られるので、venvを使うのがよいかもしれません。あるいはDockerを使います。\n4. UDPペイロードをASCIIフォーマットで出力する設定 Momongaを使用するためには事前にWi-SUNモジュールにシリアル接続しWOPT 01\\rコマンドを実行してUDPパケットのペイロードをASCIIフォーマットで出力するように設定してください。注意: WOPTコマンドは実行回数に制限がありますので初回のみ実行してください。設定は保存されます。\n5. 瞬間電力測定値を表示してみる はじめは裏でなにが起きてるのかわからないとおもうので、ログをすべて表示しながら動かしてみるのがいいでしょう。rbidとpwdにはBルートのIDとパスワードを入れてください。デバイスファイルへのパスは環境によって違いますので適宜書き換えましょう。\nimport momonga import time import logging log_fmt = logging.Formatter(\u0026#39;%(asctime)s | %(levelname)s | %(name)s - %(message)s\u0026#39;) log_hnd = logging.StreamHandler() log_hnd.setFormatter(log_fmt) momonga.logger.addHandler(log_hnd) momonga.logger.setLevel(logging.DEBUG) momonga.session_manager_logger.addHandler(log_hnd) momonga.session_manager_logger.setLevel(logging.DEBUG) momonga.sk_wrapper_logger.addHandler(log_hnd) momonga.sk_wrapper_logger.setLevel(logging.DEBUG) rbid = \u0026#39;SET A ROUTE B ID\u0026#39; pwd = \u0026#39;SET A ROUTE B PASSWORD\u0026#39; dev = \u0026#39;/dev/ttyUSB0\u0026#39; # in a case of RaspberryPi OS with momonga.Momonga(rbid, pwd, dev) as mo: while True: res = mo.get_instantaneous_power() print(\u0026#39;%0.1fW\u0026#39; % res) time.sleep(60) アクティブスキャンが失敗してMomongaSkScanFailureが送出されることがあります。これは使っていれば必発です。さらに実用するにあたってはPANAセッションの確立に失敗したときにMomongaSkJoinFailure、再送するも応答が返らないときにMomongaNeedToReopenが送出されます。これらをハンドリングし、適宜再接続してください。たとえばこんなふうに。\nwhile True: try: with momonga.Momonga(rbid, pwd, dev) as mo: while True: res = mo.get_instantaneous_power() print(\u0026#39;%0.1fW\u0026#39; % res) time.sleep(60) except (momonga.MomongaSkScanFailure, momonga.MomongaSkJoinFailure, momonga.MomongaNeedToReopen) as e: print(\u0026#39;%s: %s\u0026#39; % (type(e).__name__, e), file=sys.stderr) continue 6. それをこうしてこう で、Momongaで収集したデータをInfluxDBに突っ込んでそれをGrafanaでこうして可視化してこう。ね、簡単でしょ？ 簡単じゃないと思った方、わたくしどもがお作りします。ぜひご用命ください。\n","date":"2024/05/07","externalUrl":null,"permalink":"/posts/bit/5342/","section":"Posts","summary":"Momonga はBルートサービスを利用してスマートメーターと通信するPythonモジュールです。今日はその使い方を説明します。","title":"How to Use Momonga","type":"posts"},{"content":"Bルートのライブラリないかなーと思ってググったけど、なかったんです。なのでプロのプログラマがプロのクオリティで作りました。Bルートでスマートメーターと通信するライブラリ、モモンガです！\nnbtk/momonga MomongaはBルートサービスを利用してスマートメーターと通信するPythonモジュールです Python 19 3 ターゲットデバイスはROHM社製Wi-SUNモジュールBP35C2を搭載したラトックシステムRS-WSUHA-Pです。USBドングルじゃなくてもBP35C2なら使えるはずです。\n使い方はレポジトリの README.md を読んでください。\n","date":"2024/05/07","externalUrl":null,"permalink":"/posts/bit/5329/","section":"Posts","summary":"Bルートのライブラリないかなーと思ってググったけど、なかったんです。なのでプロのプログラマがプロのクオリティで作りました。Bルートでスマートメーターと通信するライブラリ、モモンガです！\nnbtk/momonga MomongaはBルートサービスを利用してスマートメーターと通信するPythonモジュールです ","title":"Bルートのライブラリを作った","type":"posts"},{"content":"残暑厳しい折、皆様方におかれましては、ますますのご健勝をお祈り申し上げます。\nさて、私たち株式会社ビットマイスターは、お陰様で創立16周年を迎えることとなりました。これまでのご支援に、深く感謝の意を表し、心より御礼申し上げます。\n第16期において、第5世代移動通信システム（5G）を超える次世代通信技術、Beyond5G向けの要素技術の検証用アプリケーションの開発をはじめ、仮想空間での無線システム模擬を行うワイヤレスエミュレータの環境構築、陸上から宇宙に至る全ての領域をシームレスに繋ぐスペースICTシステムのオーケストレーター開発、ならびにシミュレーション用ソフトウェアの提供等、通信分野の研究開発支援を多岐にわたって行いました。\n科学教育・教育工学分野では、学習支援システムの高度化事業にも複数取り組みました。\nまた、学術系クラウドファンディングサイト「academist」の運営元であるアカデミスト様の研究支援プログラムへの協賛、学術研究プロジェクトのIT化、保守運営等も含め、研究者の科学活動の支援を継続しております。\n弊社は、研究活動をソフトウェア技術でサポートする「研究開発ITサービス」を特化して提供し、いまで言うところの研究開発DXを早くから推進して参りました。近年、既存の顧客様からの紹介や、過去の実績を通じての新規のお客様からの問い合わせも増えてきてました。\n私たちの役目は、ソフトウェア技術を活用し、多様な研究開発活動をサポートし、皆様と共に次世代の技術を築き上げていくことです。\n今後とも、変わらぬご支持とご鞭撻を賜りますよう、心からお願い申し上げます。\n令和５年８月２０日 株式会社ビットマイスター 代表取締役　笠原 勉\n","date":"2023/08/20","externalUrl":null,"permalink":"/posts/kasa/5325/","section":"Posts","summary":"残暑厳しい折、皆様方におかれましては、ますますのご健勝をお祈り申し上げます。\nさて、私たち株式会社ビットマイスターは、お陰様で創立16周年を迎えることとなりました。これまでのご支援に、深く感謝の意を表し、心より御礼申し上げます。\n第16期において、第5世代移動通信システム（5G）を超える次世代通信技術、Beyond5G向けの要素技術の検証用アプリケーションの開発をはじめ、仮想空間での無線システム模擬を行うワイヤレスエミュレータの環境構築、陸上から宇宙に至る全ての領域をシームレスに繋ぐスペースICTシステムのオーケストレーター開発、ならびにシミュレーション用ソフトウェアの提供等、通信分野の研究開発支援を多岐にわたって行いました。\n科学教育・教育工学分野では、学習支援システムの高度化事業にも複数取り組みました。\nまた、学術系クラウドファンディングサイト「academist」の運営元であるアカデミスト様の研究支援プログラムへの協賛、学術研究プロジェクトのIT化、保守運営等も含め、研究者の科学活動の支援を継続しております。\n弊社は、研究活動をソフトウェア技術でサポートする「研究開発ITサービス」を特化して提供し、いまで言うところの研究開発DXを早くから推進して参りました。近年、既存の顧客様からの紹介や、過去の実績を通じての新規のお客様からの問い合わせも増えてきてました。\n私たちの役目は、ソフトウェア技術を活用し、多様な研究開発活動をサポートし、皆様と共に次世代の技術を築き上げていくことです。\n今後とも、変わらぬご支持とご鞭撻を賜りますよう、心からお願い申し上げます。\n令和５年８月２０日 株式会社ビットマイスター 代表取締役　笠原 勉\n","title":"創立16周年のご挨拶","type":"posts"},{"content":"みちびき災危通報デコーダー azarashi の 最新バージョンをリリース しました。より寛容に信号を解釈するように変更を行いました。使っている方はアップデートしてみてください。まだ使ってない方はぜひGNSSモジュールと組み合わせてDIYしてみてください。\nP.S. GitHub のレポジトリ に星をください。星に飢えています。とはいえ、こんなニッチなコードにも関わらず、既に10個も星をいただきました。ありがとうございます。星をくれたあなたのためにメンテナンスします。\nnbtk/azarashi QZSS DCR Decoder Python 43 4 ","date":"2023/06/23","externalUrl":null,"permalink":"/posts/bit/5314/","section":"Posts","summary":"みちびき災危通報デコーダー azarashi の 最新バージョンをリリース しました。より寛容に信号を解釈するように変更を行いました。使っている方はアップデートしてみてください。まだ使ってない方はぜひGNSSモジュールと組み合わせてDIYしてみてください。\nP.S. GitHub のレポジトリ に星をください。星に飢えています。とはいえ、こんなニッチなコードにも関わらず、既に10個も星をいただきました。ありがとうございます。星をくれたあなたのためにメンテナンスします。\nnbtk/azarashi QZSS DCR Decoder ","title":"Azarashi v0.7.4 リリース","type":"posts"},{"content":"きょうは Linux カーネルがユーザーランドプロセスにスケジューリングしないCPUを確保しておく方法についてです。これによってコンテナやVMに割り当てるためのCPUが、ホストOSのユーザランドプロセスに使われてしまうことを回避できます。\n使うディストリビューションは Ubuntu 22.04 ですが、機能自体はカーネルに依存するので他のディストリビューションでも参考になるはずです。\nそれではまず、カーネルのブートパラメーターを設定します。 isolcpus とそのパラメーターとして cpu のリストをわたします。ここでは、 0-23 のコアのうち、 8-23 を分離します。\n$ sudo vi /etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT=\u0026#34;quiet splash isolcpus=8-23\u0026#34; そうしたら grub の設定を更新して再起動します。\n$ sudo update-grub $ sudo reboot 簡単ですね。では試してみましょう。 mpstat コマンドでコアごとの使用率をモニターします。入ってなかったらインストールしてください。\n$ sudo apt install sysstat $ mpstat -P ALL 1 そして別のターミナルから stress コマンドで 24 プロセスのストレッサーを起動します。\n$ stress -c 24 CPU ID 8 から 23 は使用されていません。目的は達せられていますね。ただし、使い方によっては分離した CPU の特に sys 時間が消費されることがあります。試しに stress-ng コマンドで負荷をかけてみましょう。\n$ stress-ng --class cpu --seq 0 分離した CPU もカーネルスペースからは使用されることがあるので、それは頭の片隅に入れて置く必要があります。\nでは、こんどは反対に分離した CPU を使ってみましょう。 taskset コマンドでプロセスに CPU を割り当てます。\n$ taskset -c 15,16 stress -c 2 あれ、 2 つの CPU が使われると思いきや、 1 つしか使われませんね。どうやら使われるスケジューラによってこういう動作になるらしく、ためしてないけど VM ならたぶん起きないと思われます。コンテナは環境によっては起きそうな気もするので確認しましょう。ディストリビューションのカーネルチューニングによってもこの挙動は変わるはずです。明示的にスケジューラを指定してやると、 2 つの CPU が使われるようになりました。\nsudo chrt -r 1 taskset -c 15,16 stress -c 2 そのほかの関連パラメータはこちら。調べるときの参考まで。\nnohz_full=8-23 rcu_nocbs=8-23 irqaffinity=0 https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html\n","date":"2023/06/14","externalUrl":null,"permalink":"/posts/bit/5288/","section":"Posts","summary":"きょうは Linux カーネルがユーザーランドプロセスにスケジューリングしないCPUを確保しておく方法についてです。これによってコンテナやVMに割り当てるためのCPUが、ホストOSのユーザランドプロセスに使われてしまうことを回避できます。","title":"CPU Isolation","type":"posts"},{"content":"なぜ IPv6 かというと、RTPのNAT超えを考えなくてよくなるから。\nはなっから重大なハマりポイントなんだけど、ファームウェアを更新しないと IPv6 を一切しゃべってくれなかった。GUI で選択できるのに、もうなにやってもだめ。検証環境は 1.0.41.2 だから、それより古かったらとりあえずファームウェアをアップデートしよう。\nなお、スクリーンキャプチャのうち、プライベートな項目はマスキングしてある。 いちおう BASIC SETTINGS と ADVANCED SETTINGS の画面キャプチャをのせておくけど、これはとくになにも関係ないと思う。もしだめだったら設定突合してみればいいかな。とくにTipsはない。FXS PORT に進もう。 まず Primary SIP Server のアドレスは [] でかこうんだ。かっこだけにね。これが最初の魔法だ。そうしないとコロンが内部でポート番号のデリミタと間違って解釈されたりすることがある。 つぎに Preferred Vocoder (in listed order) だけど、これはぜんぶ PCMU にする。いろいろ試したけどなぜかこれじゃないと失敗する。 あとは SLIC Setting とか Caller ID Scheme とか Ring Tones をいじくった。スクリーンキャプチャを参考にしてほしい。\nまったく通信しなかったり、片方の音しか聞こえなかったり、果たして通話できたときは奇跡かと思った。\n","date":"2023/05/25","externalUrl":null,"permalink":"/posts/bit/5270/","section":"Posts","summary":"なぜ IPv6 かというと、RTPのNAT超えを考えなくてよくなるから。","title":"Grandstream HT801 をつかって IPv6 で Asterisk に接続する","type":"posts"},{"content":"環境\nu-blox M10S \u0026lt;UART, PPS-GPIO\u0026gt; Raspberry Pi 4B + Ubuntu 22.04 + chrony (NTP) この Raspberry Pi HAT GR-M10-RP は UART が結線されている。PPS は引き出してあるが結線されていないので PPS と GPIO18 を接続する。とりあえずクリップで接続しているだけで、決して推奨しているわけではない。電源を切って接続すること。 いろいろインストールする。\n$ sudo apt update $ sudo apt install gpsd gpsd-tools pps-tools chrony PPS-GPIO モジュールを読み込む設定。\n$ sudo vi /etc/modules pps-gpio UART を有効にして、PPS-GPIO モジュールを紐付ける設定。\n$ sudo vi /boot/firmware/config.txt [all] ... # Enable the UART port enable_uart=1 # Associate GPS 1PPS with the GPIO18 dtoverlay=pps-gpio,gpiopin=18 再起動する。\n$ sudo reboot PPS デバイスが生えて信号が取れてくるか確認。\n$ sudo ppstest /dev/pps0 trying PPS source \u0026#34;/dev/pps0\u0026#34; found PPS source \u0026#34;/dev/pps0\u0026#34; ok, found 1 source(s), now start fetching data... source 0 - assert 1680849684.999999591, sequence: 10165 - clear 0.000000000, sequence: 0 source 0 - assert 1680849685.999998084, sequence: 10166 - clear 0.000000000, sequence: 0 source 0 - assert 1680849687.000001170, sequence: 10167 - clear 0.000000000, sequence: 0 source 0 - assert 1680849687.999997829, sequence: 10168 - clear 0.000000000, sequence: 0 NMEA がワラワラ取れていることを確認。\n$ gpsmon -n /dev/ttS0 gpsd を設定。\n$ sudo vi /etc/default/gpsd DEVICES=\u0026#34;/dev/ttyS0 /dev/pps0\u0026#34; GPSD_OPTIONS=\u0026#34;-n\u0026#34; USBAUTO=\u0026#34;false\u0026#34; gpsd を再起動。\n$ sudo systemctl restart gpsd.service デバイスを指定せず NMEA が取れていることを確認。\n$ gpsmon -n chrony を設定。\n$ sudo vi /etc/chrony/chrony.conf pool ntp.ubuntu.com iburst maxsources 4 pool ntp.nict.jp iburst maxsources 4 refclock PPS /dev/pps0 lock NMEA refid GPS chrony を再起動。\n$ sudo systemctl restart chrony.service $ chronyc sources -v .-- Source mode \u0026#39;^\u0026#39; = server, \u0026#39;=\u0026#39; = peer, \u0026#39;#\u0026#39; = local clock. / .- Source state \u0026#39;*\u0026#39; = current best, \u0026#39;+\u0026#39; = combined, \u0026#39;-\u0026#39; = not combined, | / \u0026#39;x\u0026#39; = may be in error, \u0026#39;~\u0026#39; = too variable, \u0026#39;?\u0026#39; = unusable. || .- xxxx [ yyyy ] +/- zzzz || Reachability register (octal) -. | xxxx = adjusted offset, || Log2(Polling interval) --. | | yyyy = measured offset, || \\ | | zzzz = estimated error. || | | \\ MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== #* GPS 0 4 77 14 +291ns[ +637ns] +/- 243ns ^- prod-ntp-3.ntp4.ps5.cano\u0026gt; 2 6 37 27 -1629us[-1629us] +/- 125ms ^- prod-ntp-3.ntp4.ps5.cano\u0026gt; 2 6 37 26 -5502us[-5502us] +/- 131ms ^- alphyn.canonical.com 2 6 37 27 +1522us[+1522us] +/- 133ms ^- prod-ntp-4.ntp4.ps5.cano\u0026gt; 2 6 37 27 -4972us[-4972us] +/- 126ms ^- ntp-a2.nict.go.jp 1 6 37 28 +1090us[+1090us] +/- 5824us ^- 2001:ce8:78::2 1 6 37 29 +589us[ +589us] +/- 10ms ^- ntp-a3.nict.go.jp 1 6 37 29 -2611us[-2611us] +/- 5687us ^- ntp-a2.nict.go.jp 1 6 37 28 -166us[ -166us] +/- 3466us 同期してなかったら数分待つと同期する。\n参考にしたページのリンク\nhttps://chrony.tuxfamily.org/doc/4.3/chrony.conf.html https://qiita.com/yamakenjp/items/e69eeabdefd9cc960610 https://www.popnja.com/entry/2021/10/04/181652 ","date":"2023/04/07","externalUrl":null,"permalink":"/posts/bit/5238/","section":"Posts","summary":"環境\nu-blox M10S \u003cUART, PPS-GPIO\u003e Raspberry Pi 4B + Ubuntu 22.04 + chrony (NTP)","title":"RPi4, Ubuntu22.04, GPS, 1PPS, chrony","type":"posts"},{"content":"みちびき災危通報デコーダーをアップデートしました。\n災危通報(緊急地震速報)のデコード結果に仮定震源要素フラグを追加した\n気象庁が仮定震源要素として緊急地震速報を発表した場合に、\u0026ldquo;De is 10: 深さ10km\u0026rdquo;、\u0026ldquo;Ma is 10: マグニチュード0.1\u0026quot;の固定値が設定されるため。\n\u0026gt;\u0026gt; report = azarashi.decode(\u0026#39;C6AF89A82000032400005040050AC5E2C000000003DFF8001C00001193CC610\u0026#39;) \u0026gt;\u0026gt; print(report.assumptive) True 災危通報(震源)のデコード結果のepが0であっても正常系として扱い、Exceptionを吐かなくした\n北西太平洋津波情報として発報された震源の震央地名は空で、epは0になる。この条件の定義を追加した。\n\u0026gt;\u0026gt; 0 : \u0026#34;未設定(北西太平洋津波情報)\u0026#34;, https://github.com/nbtk/azarashi/releases/tag/v0.6.8\n","date":"2022/11/14","externalUrl":null,"permalink":"/posts/bit/5225/","section":"Posts","summary":"みちびき災危通報デコーダーをアップデートしました。","title":"Azarashi v0.6.8 リリースノート","type":"posts"},{"content":"Wake On LANの設定のメモ。netplanが入っているUbuntu前提だけど、ほかのディストリビューションでも参考になるかもしれない。\nUEFIとかBIOSの設定で、\u0026ldquo;Wake On LAN\u0026quot;とか\u0026quot;WOL\u0026quot;とか\u0026quot;Power On By PCI-E\u0026quot;みたいな設定を見つけてEnableにする。そしたら保存して終了する。設定がなくてもデフォルト有効の可能性があるのでまだ諦めない。 つぎにOSを起動してethtoolで設定状況を確認する。引数のYOUR_IFACE_NAMEはたとえばenp6s0とか。 $ sudo ethtool YOUR_IFACE_NAME | grep Wake-on Supports Wake-on: pumbag Wake-on: d \u0026ldquo;Wake-on\u0026quot;は g でないといけない。こんなふうにethtoolで設定できるが、 再起動すると設定が消えたりする のでちょっと試したいとき以外これはやらなくてよい。\n$ ethtool -s interface wol g 永続化のために、netplanの設定でWOLを有効にしたい物理デバイスの項目に\u0026quot;wakeonlan: true\u0026quot;を追記しておく。\n$ sudo vi /etc/netplan/NN-YOUR-NETPLAN.yaml network: version: 2 ethernets: YOUR_IFACE: ~~~ wakeonlan: true ~~~ netplanの設定を適用して、ethtoolでWOLが有効化されたか確認する。ssh越しに設定を間違うとアクセスできなくなるので注意。\n$ sudo netplan apply $ sudo ethtool YOUR_IFACE_NAME | grep Wake-on Supports Wake-on: pumbag Wake-on: g あとは実際にwakeonlanコマンドとかで起動できるか試してみる。シャットダウンする前にMACアドレスを確認しておくこと。\n$ sudo apt install wakeonlan $ wakeonlan AA:BB:CC.... netplanのドキュメントはここ。 https://netplan.io/reference\nnetplan以外の永続化方法はここ。 https://wiki.archlinux.org/title/Wake-on-LAN#Make_it_persistent\n","date":"2022/11/14","externalUrl":null,"permalink":"/posts/bit/5217/","section":"Posts","summary":"Wake On LANの設定のメモ。netplanが入っているUbuntu前提だけど、ほかのディストリビューションでも参考になるかもしれない。","title":"WOL Configuration on Linux","type":"posts"},{"content":"zipコマンドでWordファイルとかExcelファイルとかと、他のいくつかのファイルを圧縮しようと思ったら、なぜかWordファイルがぶっ壊れて開けなくなって変な汗出てるみなさん、ようこそいらっしゃいました。まずは深呼吸して落ち着きましょう。\nこれからあなたがやってしまったことをズバリ当てましょう。たとえばreport.wordとtable.xlsxファイルをzipで固めてarchive.zipにしようと思っていたとして、こんなふうに指定しましたね？\n% zip report.docx table.xlsx archive.zip zip warning: name not matched: archive.zip adding: table.xlsx (deflated 29%) すると、Wordファイルを開こうとしてもこんなエラーメッセージや、\nこんなメッセージがでて、\nWordファイルが開けなくなりましたね。（エラーメッセージは日本語かもしれません）\n原因はzipコマンドに指定する引数の順番が意図と異なり、report.docxというzipファイルにtable.xlsxとarchive.zipを入れろという意味になっていたからです。正しいzipコマンドの使い方は別途ググってもらうとして、まずは直し方を。macでの話ですが、Linuxでも同じことが言えると思います。\nなにが起こっているかというと、実はWordのdocxファイルはzipファイルで、そのzipファイルにtable.xlsxが取り込まれた状態になっています。重要なことなので強調しておきます。 Wordのdocxファイルの実態はzipファイルです。では、開けなくなってしまったreport.docxの中身をzipinfoコマンドで覗いてみましょう。\n% zipinfo report.docx Archive: report.docx Zip file size: 18339 bytes, number of entries: 12 -rw---- 4.5 fat 1312 b- defS 80-Jan-01 00:00 [Content_Types].xml -rw---- 4.5 fat 590 b- defS 80-Jan-01 00:00 _rels/.rels -rw---- 4.5 fat 817 b- defS 80-Jan-01 00:00 word/_rels/document.xml.rels -rw---- 4.5 fat 2924 b- defS 80-Jan-01 00:00 word/document.xml -rw---- 4.5 fat 8393 b- defS 80-Jan-01 00:00 word/theme/theme1.xml -rw---- 4.5 fat 3192 b- defS 80-Jan-01 00:00 word/settings.xml -rw---- 4.5 fat 755 b- defS 80-Jan-01 00:00 docProps/core.xml -rw---- 4.5 fat 2272 b- defS 80-Jan-01 00:00 word/fontTable.xml -rw---- 4.5 fat 894 b- defS 80-Jan-01 00:00 word/webSettings.xml -rw---- 4.5 fat 29453 b- defS 80-Jan-01 00:00 word/styles.xml -rw---- 4.5 fat 709 b- defS 80-Jan-01 00:00 docProps/app.xml -rw-r--r-- 3.0 unx 8345 bx defN 22-Oct-18 08:50 table.xlsx 12 files, 59656 bytes uncompressed, 15103 bytes compressed: 74.7% report.docxの中にtable.xlsxファイルが取り込まれているのがわかります。この取り込まれたファイルを削除してやりましょう。zipコマンドの-dオプションでtable.xlsxファイルをアーカイブから取り除きます。なお、この操作を間違うといよいよ完全にWordファイルを壊してしまうので、事前にコピーを取っておくことをおすすめします。\n% zip -d report.docx table.xlsx deleting: table.xlsx これで開けるようになったはずです。それではよい午後を。\n","date":"2022/10/18","externalUrl":null,"permalink":"/posts/bit/5198/","section":"Posts","summary":"zipコマンドでWordファイルとかExcelファイルとかと、他のいくつかのファイルを圧縮しようと思ったら、なぜかWordファイルがぶっ壊れて開けなくなって変な汗出てるみなさん、ようこそいらっしゃいました。まずは深呼吸して落ち着きましょう。","title":"ZIPコマンドでWordファイルが開けなくなった","type":"posts"},{"content":"残暑の候、皆様におかれましては益々ご壮健のこととお慶び申し上げます。 平素は、格別のお引き立てをいただき、厚く御礼お申し上げます。\n本日8月20日をもちまして、株式会社ビットマイスターは創立15周年を迎えることができました。これもひとえに皆様のご支援の賜物と心より感謝いたします。\n第15期は、実用化されつつある第5世代移動通信システム（5G）の高度化に向けた研究開発依頼を数多くいただきました。分析・計測用アプリケーションや可視化システムの開発、オーケストレーションツールの提供、シミュレーションソフトウェアを利用した検証支援、新規通信プロトコルの調査等、支援内容は多岐に渡ります。 近年、地上の無線通信であるBeyond 5Gの研究に加えて、衛星通信等を利用した、陸上、海洋、空域から、宇宙に至る全ての領域をシームレスにつなぐスペースICT向けの研究が新たな展開を見せていることから、今後に向け衛星通信関連分野の開発支援へ力をいれていきます。\nまた、こうした工学系の情報通信分野にとどまらず、科学教育・教育工学分野へのサービス実績も増えてきました。 15期においては文部科学省による「デジタルを活用した大学・高専教育高度化プラン」事業のうち教育手法の開発向けの「 学修到達度測定WEBテスト」開発に携わったほか、教育DX関連のシステム支援サービスを提供しました。 16期に向け教育ツール関連の新たな相談を既にいくつかいただいています。\nさらに、埼玉大学様と地元企業様との産学官連携活動をきっかけに開発したデジタルサイネージ型防災情報提供システム『 ソナエージ』は、改良を重ね、協力企業様とともに主に地方自治体への設置を進めています。\nそして、日本サイエンスコミュニケーション協会等の科学推進団体の運営保守、大学研究室のアウトリーチサポート、学術研究プロジェクトのIT化支援を通じた、科学活動を支援する事業も長期に渡り継続しています。また日本初の学術系クラウドファンディングサイト「academist」を運営されているアカデミスト様が実施している 若手研究者向け研究支援プログラム への協力を通じて若手の研究者を直接応援するような活動も行いました。\n最先端の研究成果を世に展開する”ことを目的として、研究活動をソフトウェア技術でサポートするべく「研究開発サービス」会社を立ち上げてから15年がたちました。 弊社が提供するサービスにより、最先端の研究成果が世に展開”され、その成果が科学技術の発展に少しでも貢献できるように、社員一同、引き続き技術とサービスの向上に努めてまいります。\n今後ともお引き立ての程よろしくお願いいたします。\n令和４年８月２０日 株式会社ビットマイスター 代表取締役　笠原 勉\n","date":"2022/08/20","externalUrl":null,"permalink":"/posts/kasa/5168/","section":"Posts","summary":"残暑の候、皆様におかれましては益々ご壮健のこととお慶び申し上げます。 平素は、格別のお引き立てをいただき、厚く御礼お申し上げます。\n本日8月20日をもちまして、株式会社ビットマイスターは創立15周年を迎えることができました。これもひとえに皆様のご支援の賜物と心より感謝いたします。\n第15期は、実用化されつつある第5世代移動通信システム（5G）の高度化に向けた研究開発依頼を数多くいただきました。分析・計測用アプリケーションや可視化システムの開発、オーケストレーションツールの提供、シミュレーションソフトウェアを利用した検証支援、新規通信プロトコルの調査等、支援内容は多岐に渡ります。 近年、地上の無線通信であるBeyond 5Gの研究に加えて、衛星通信等を利用した、陸上、海洋、空域から、宇宙に至る全ての領域をシームレスにつなぐスペースICT向けの研究が新たな展開を見せていることから、今後に向け衛星通信関連分野の開発支援へ力をいれていきます。\nまた、こうした工学系の情報通信分野にとどまらず、科学教育・教育工学分野へのサービス実績も増えてきました。 15期においては文部科学省による「デジタルを活用した大学・高専教育高度化プラン」事業のうち教育手法の開発向けの「 学修到達度測定WEBテスト」開発に携わったほか、教育DX関連のシステム支援サービスを提供しました。 16期に向け教育ツール関連の新たな相談を既にいくつかいただいています。\nさらに、埼玉大学様と地元企業様との産学官連携活動をきっかけに開発したデジタルサイネージ型防災情報提供システム『 ソナエージ』は、改良を重ね、協力企業様とともに主に地方自治体への設置を進めています。\nそして、日本サイエンスコミュニケーション協会等の科学推進団体の運営保守、大学研究室のアウトリーチサポート、学術研究プロジェクトのIT化支援を通じた、科学活動を支援する事業も長期に渡り継続しています。また日本初の学術系クラウドファンディングサイト「academist」を運営されているアカデミスト様が実施している 若手研究者向け研究支援プログラム への協力を通じて若手の研究者を直接応援するような活動も行いました。\n最先端の研究成果を世に展開する”ことを目的として、研究活動をソフトウェア技術でサポートするべく「研究開発サービス」会社を立ち上げてから15年がたちました。 弊社が提供するサービスにより、最先端の研究成果が世に展開”され、その成果が科学技術の発展に少しでも貢献できるように、社員一同、引き続き技術とサービスの向上に努めてまいります。\n今後ともお引き立ての程よろしくお願いいたします。\n令和４年８月２０日 株式会社ビットマイスター 代表取締役　笠原 勉\n","title":"創立15周年のご挨拶と御礼","type":"posts"},{"content":"準天頂衛星みちびきには災害・危機管理通報サービスというものがあり、GNSSモジュールで気象や地震などの様々な災害に関する情報を受信することができます。きょうはその衛星からの信号をデコードするPythonスクリプトを書いたので紹介します。デコーダのなまえはAzarashiです。\nnbtk/azarashi QZSS DCR Decoder Python 43 4 使い方はGitHubに書いたのでそれを見ながら使ってもらえば大丈夫です。いろんな応用があると思います。たとえば緊急地震速報を受信したらスマートリモコンと組み合わせてライトを点けるとか。\nということで、このブログには受信に必要な機器を簡単にまとめておきます。\nGNSSモジュール\nSony Spresense お手頃価格で災害・危機管理通報を受信できるのですが、イマイチ安定して受信できず、別のアンテナを取り付けるには工作が必要なのが難点です。このためだけに買うのはあまりおすすめできません。\nu-blox F9P Qwiic ZED-F9P搭載 GPS-RTK-SMAモジュール ANN-MB-00 2周波対応GPSアンテナ\nこの組み合わせは安定してます。見通しのよい南向きの窓際に置いておけばしっかり受信しています。ただZED-F9Pのモジュールが高いです。u-bloxのもうちょっと安いやつでもいけると思うのですが、まだ試してません。試した方はご一報ください。\nもしサンプル機器をご提供いただける会社さんがありましたらウェルカムです。よろしくおねがいします。\nWindows PC u-bloxのGNSSモジュールを使う場合には設定ツールu-centerを使うために必要です。Spresenseを使う場合にはArduino IDEが必要ですがそれは必ずしもWindowsである必要がありません。\nRaspberry Pi Azarashiを動かすデバイスは、Pythonが動けばPCでも何でもいいのですが、お手軽にIoTを始めるならRaspberry Piはよい選択肢です。AzarashiはRaspberry Pi4で開発しましたので、動作実績はバッチリです。 使用例を直接教えてもらえなくてもいいので（いや、直接おしえてもらえてもうれしいんですが）、ネットに上げてもらえるとうれしいです。なにも反応がないとアップデートされなくなる可能性があります。使ったらぜひ発信よろしくおねがいします。\nHappy Hacking!\n","date":"2022/06/27","externalUrl":null,"permalink":"/posts/bit/5109/","section":"Posts","summary":"準天頂衛星みちびきには災害・危機管理通報サービスというものがあり、GNSSモジュールで気象や地震などの様々な災害に関する情報を受信することができます。きょうはその衛星からの信号をデコードするPythonスクリプトを書いたので紹介します。デコーダのなまえはAzarashiです。","title":"QZSS 災害・危機管理通報サービスのデコーダを作った","type":"posts"},{"content":"拝啓\n処暑の候、皆様におかれましては益々ご健勝のこととお慶び申し上げます。\n本日8月20日をもちまして、株式会社ビットマイスターは創立14周年を迎えることができました。これもひとえに皆様のご支援の賜物と心より感謝いたします。\n第14期は、COVID-19の影響により展示会等の成果発表イベントが軒並み中止となったことに加え、主要顧客である研究機関様が行う大規模な屋外実験も規模縮小に見舞われたことから、弊社が提供する研究開発支援サービスも少なからず影響を受けました。\n関連した支援サービスのソフトウェア開発は減少しましたが、空いたリソースを自社プロダクトである「デジタルサイネージ型防災情報提供システム」の機能向上に割り当てたり、通常時は業務の合間に習得していた業務関連のトレンド技術や、新しい開発言語・開発環境ノウハウに関して、まとまった時間を使った学びの機会を全社的に設けるなど、将来の案件に向けた活動を積極的に実施しました。\nまた感染対策としてリモート開発環境を整備し、全社員フルリモートでの業務継続を実現しております。\n依然として先行き不透明な状況ではありますが、今春以降、大学様をはじめとしてリピータのお客様からの相談が再び増えて参りました。\n第15期は、従来の研究開発支援サービスを確実に提供するとともに、習得した知識を活かし、改めて“新たな技術領域への挑戦”、“新たな顧客の開拓”、“新たなサービス形態の創造”に取り組んでまいります。お客様の事業がより良い方向に向かうために弊社の提供するソフトウェアが少しでもお役にたてるよう、社員一同、引き続き技術とサービスの向上に努めてまいります。\n今後ともお引き立てのほどよろしくお願いいたします。\n敬具\n令和３年８月２０日 株式会社ビットマイスター 代表取締役　笠原 勉\n","date":"2021/08/20","externalUrl":null,"permalink":"/posts/kasa/5105/","section":"Posts","summary":"拝啓\n処暑の候、皆様におかれましては益々ご健勝のこととお慶び申し上げます。\n本日8月20日をもちまして、株式会社ビットマイスターは創立14周年を迎えることができました。これもひとえに皆様のご支援の賜物と心より感謝いたします。\n第14期は、COVID-19の影響により展示会等の成果発表イベントが軒並み中止となったことに加え、主要顧客である研究機関様が行う大規模な屋外実験も規模縮小に見舞われたことから、弊社が提供する研究開発支援サービスも少なからず影響を受けました。\n関連した支援サービスのソフトウェア開発は減少しましたが、空いたリソースを自社プロダクトである「デジタルサイネージ型防災情報提供システム」の機能向上に割り当てたり、通常時は業務の合間に習得していた業務関連のトレンド技術や、新しい開発言語・開発環境ノウハウに関して、まとまった時間を使った学びの機会を全社的に設けるなど、将来の案件に向けた活動を積極的に実施しました。\nまた感染対策としてリモート開発環境を整備し、全社員フルリモートでの業務継続を実現しております。\n依然として先行き不透明な状況ではありますが、今春以降、大学様をはじめとしてリピータのお客様からの相談が再び増えて参りました。\n第15期は、従来の研究開発支援サービスを確実に提供するとともに、習得した知識を活かし、改めて“新たな技術領域への挑戦”、“新たな顧客の開拓”、“新たなサービス形態の創造”に取り組んでまいります。お客様の事業がより良い方向に向かうために弊社の提供するソフトウェアが少しでもお役にたてるよう、社員一同、引き続き技術とサービスの向上に努めてまいります。\n今後ともお引き立てのほどよろしくお願いいたします。\n敬具\n令和３年８月２０日 株式会社ビットマイスター 代表取締役　笠原 勉\n","title":"創立14周年のご挨拶","type":"posts"},{"content":"緊急警報放送 は災害時にラジオなどの受信装置を自動起動するための信号です。このブログに辿り着いている時点で、そんなことは知ってるわいって感じですかね。でも一応書いておかないことには記事として成立しないので書きます。\nEWSは災害時にラジオやテレビ放送で聞くことがある、あの不穏なピロピロ音です。全く一般には普及していませんが、あれにはデジタル信号が含まれていて、それを検知すると自動起動する機能があるラジオなどがあります。どうやっているかというと、デジタル信号の0と1をそれぞれ640Hzと1024Hzの音に置き換えて表現します。これを変調といい、とくに0と1のデジタル信号を2つの周波数の変化に置き換える方式をBFSK(Binary Frequency Shift Keying, 二値周波数偏移変調)といいます。この切替を1秒間に64回行うので変調レートは64Bd(ボー)で、1回の変調で1ビットを送りますから転送レートは64bpsです。\nさて、アルゴリズムについてですが、音声周波数の変化をどうやってを0と1に戻すのかというと、たとえば640Hzの波は言い換えれば1/640秒に1周期の波なので、振幅軸上の特定のポイントを通過する時間間隔を測定して1/640秒と一致すれば640Hzの波だと判断できるわけです。ちなみに64Bdなので1変調の1/64秒あたりの640Hzなら10周期、1024Hzなら16周期です(取りこぼしもあるので、何回この周期を検知したら信号とみなすかは調整が必要です)。さいごに640Hzを検出したら0、1024Hzを検出したら1に置き換えればデジタル信号になります。\nソースはこちら。\nnbtk/EWSDemodulator 緊急警報放送復調器 Python 1 0 Raspberry Pi 4とUSBオーディオアダプタで動作確認しました。 ","date":"2021/07/07","externalUrl":null,"permalink":"/posts/bit/5096/","section":"Posts","summary":"緊急警報放送 は災害時にラジオなどの受信装置を自動起動するための信号です。このブログに辿り着いている時点で、そんなことは知ってるわいって感じですかね。でも一応書いておかないことには記事として成立しないので書きます。\nEWSは災害時にラジオやテレビ放送で聞くことがある、あの不穏なピロピロ音です。全く一般には普及していませんが、あれにはデジタル信号が含まれていて、それを検知すると自動起動する機能があるラジオなどがあります。どうやっているかというと、デジタル信号の0と1をそれぞれ640Hzと1024Hzの音に置き換えて表現します。これを変調といい、とくに0と1のデジタル信号を2つの周波数の変化に置き換える方式をBFSK(Binary Frequency Shift Keying, 二値周波数偏移変調)といいます。この切替を1秒間に64回行うので変調レートは64Bd(ボー)で、1回の変調で1ビットを送りますから転送レートは64bpsです。\nさて、アルゴリズムについてですが、音声周波数の変化をどうやってを0と1に戻すのかというと、たとえば640Hzの波は言い換えれば1/640秒に1周期の波なので、振幅軸上の特定のポイントを通過する時間間隔を測定して1/640秒と一致すれば640Hzの波だと判断できるわけです。ちなみに64Bdなので1変調の1/64秒あたりの640Hzなら10周期、1024Hzなら16周期です(取りこぼしもあるので、何回この周期を検知したら信号とみなすかは調整が必要です)。さいごに640Hzを検出したら0、1024Hzを検出したら1に置き換えればデジタル信号になります。\nソースはこちら。\nnbtk/EWSDemodulator 緊急警報放送復調器 ","title":"緊急警報放送を復調する","type":"posts"},{"content":" はじめに # 従来、LinuxでMPTCPを利用する場合「 Linux Kernel MultiPath TCP project」が公開しているLinuxカーネルを使う必要がありましたが、アップストリームのLinuxカーネル 5.6以降でMPTCPが利用可能になりました。\n現在、MPTCPの仕様は「 RFC6824」で規定された\u0026quot;MPTCP v0\u0026quot;と「 RFC8684」で規定された\u0026quot;MPTCP v1\u0026quot;の2つのバージョンが存在します。従来版は\u0026quot;MPTCP v0\u0026quot;にのみ、アップストリーム版は\u0026quot;MPTCP v1\u0026quot;のみに対応しており、\u0026ldquo;MPTCP v1\u0026quot;は後方互換性を持たないので、現時点では従来版とアップストリーム版でMPTCP通信を行うことができません。\n従来版および\u0026quot;MPTCP v0\u0026quot;については、本ブログでも過去に以下の投稿しています。\n「 Multipath TCP(MPTCP)」 「 MPTCPのパケットを眺めてみる(その1)」 「 MPTCPのパケットを眺めてみる(その2)」 今回は、Ubuntuでアップストリーム版を使った複数サブフローでのMPTCP通信を試してみました。\n参考サイト # 今回、参考にしたサイトは次の通りです。\n「 Linux MPTCP Upstream Project」 「 Using Upstream MPTCP Linux Systems」 「 Multipath TCP on Red Hat Enterprise Linux 8.3: From 0 to 1 subflows」 「 CHAPTER 25. GETTING STARTED WITH MULTIPATH TCP」 環境構築 # VirtualBoxを使って、以下のような構成を作成しました。\n\u0026ldquo;Client\u0026quot;と\u0026quot;Server\u0026quot;はアップストリーム版のMPTCP対応カーネルを導入した新規VMを作成 \u0026ldquo;Router\u0026quot;はMPTCP未対応カーネルの既設VMを利用 \u0026ldquo;Client\u0026quot;は複数サブフローを試したいのでネットワークインタフェースを2つ用意\n新規VM作成 # OSインストール # 今回は次の理由から「Ubuntu Server 21.04 (Hirsute Hippo) Daily Build」としました。\n複数サブフローでの同時送信はLinuxカーネル 5.10以降 後述の「SystemTap」にカーネルデバッグ情報が必要\n注意点として、カーネルデバッグ情報のインストールに7GB程度とられるのでVMの仮想ハードディスク容量をデフォルトの10GBから最低でも15GBに変更しておく必要があります。\nカーネル更新 # インストール完了時点でLinuxカーネルは5.8であり、MPTCP通信自体は可能ですが複数サブフローで送信を行うには5.10以降に更新する必要があります。\n「 /etc/apt/sources.list」に以下を追記します。\ndeb http://archive.ubuntu.com/ubuntu hirsute-proposed main restricted universe multiverse カーネルを5.10に更新します。\n$ sudo apt update $ sudo apt install linux-headers-5.10.0-14-generic linux-image-5.10.0-14-generic $ sudo reboot $ uname -a Linux mps 5.10.0-14-generic #15-Ubuntu SMP Fri Jan 29 15:10:03 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux $ cat /proc/sys/net/mptcp/enabled 1 なお、デフォルトでMPTCPは有効になっています。\nSystemTap導入 # このままMPTCP通信を試すこともできるのですが、アップストリーム版でMPTCP通信を行うには、従来版と違い次のようにソケット生成時に「 IPPROTO_MPTCP」を指定する必要があります。\nfd = socket(AF_INET, SOCK_STREAM, IPPROTO_MPTCP); 今回はRedhatの記事を参考に「 SystemTap」を使った既存アプリをMPTCP通信に対応させてみます。\nSystemtapの実行にカーネルデバッグ情報が必要なのでインストールします。\n$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C8CAB6595FDFF622 $ codename=$(lsb_release -c | awk \u0026#39;{print $2}\u0026#39;) $ sudo tee /etc/apt/sources.list.d/ddebs.list \u0026lt;\u0026lt; EOF deb http://ddebs.ubuntu.com/ ${codename} main restricted universe multiverse deb http://ddebs.ubuntu.com/ ${codename}-security main restricted universe multiverse deb http://ddebs.ubuntu.com/ ${codename}-updates main restricted universe multiverse deb http://ddebs.ubuntu.com/ ${codename}-proposed main restricted universe multiverse EOF $ sudo apt-get update $ sudo apt-get install linux-image-$(uname -r)-dbgsym Systemtapインストール\n$ sudo apt install build-essential $ sudo apt install systemtap Systemtap実行時にgccが使われるのでbuild-essentialを入れてます。\nスクリプト「mptcp.stap」を作成\n#! /usr/bin/env stap %{ #include \u0026lt;linux/in.h\u0026gt; #include \u0026lt;linux/ip.h\u0026gt; %} function mptcpify () %{ if (CONTEXT-\u0026gt;kregs-\u0026gt;si == SOCK_STREAM \u0026amp;\u0026amp; (CONTEXT-\u0026gt;kregs-\u0026gt;dx == IPPROTO_TCP || CONTEXT-\u0026gt;kregs-\u0026gt;dx == 0)) { CONTEXT-\u0026gt;kregs-\u0026gt;dx = IPPROTO_MPTCP; STAP_RETVALUE = 1; } else { STAP_RETVALUE = 0; } %} probe kernel.function(\u0026#34;__sys_socket\u0026#34;) { if (mptcpify() == 1) { printf(\u0026#34;command %16s mptcpified\\n\u0026#34;, execname()); } } 本スクリプトを実行することで、socket()コール時に IPPROTO_TCP を IPPROTO_MPTCP に入れ替えます。 tcpdump更新 # 必須ではありませんが、OSインストールで含まれる「 tcpdump」はMPTCP v1に未対応なので対応している最新版に更新します。\n最新版ソースをビルドしてインストール\n$ sudo apt install libpcap-dev $ wget https://www.tcpdump.org/release/tcpdump-4.99.0.tar.gz $ tar xf tcpdump-4.99.0.tar.gz $ cd tcpdump-4.99.0/ $ ./configure $ make $ sudo make install $ sudo tcpdump --version tcpdump version 4.99.0 libpcap version 1.9.1 (with TPACKET_V3) 通信アプリインストール # Redhatの記事に倣い「ncat」、そして複数サブフロー送信の確認用に「iperf」を導入します。\n$ sudo apt install ncat iperf ここまででMPTCP通信に必要な一式をVMに導入できました。このVMイメージをクローンして\u0026quot;Client\u0026quot;と\u0026quot;Server\u0026quot;とします。\n動作確認 # さて、それでは”Client\u0026quot;と\u0026quot;Server\u0026quot;で通信させてみましょう。\n単一サブフロー # まずはRedhatの記事の手順に従って、単一サブフローを試してみます。\nServer # 予めSystemTapで「mptcp.stap」を実行しておきます。\n$ sudo stap -vg mptcp.stap Pass 1: parsed user script and 480 library scripts using 115216virt/101484res/7724shr/93660data kb, in 300usr/10sys/314real ms. Pass 2: analyzed script: 1 probe, 2 functions, 1 embed, 0 globals using 185872virt/172964res/8824shr/164316data kb, in 1300usr/100sys/1388real ms. Pass 3: using cached /root/.systemtap/cache/7e/stap_7e56f03f2ab5129c2608bd38944e60b3_1608.c Pass 4: using cached /root/.systemtap/cache/7e/stap_7e56f03f2ab5129c2608bd38944e60b3_1608.ko Pass 5: starting run. 次にncatをサーバとして起動します。\n$ ncat -4lk 4321 SystemTapを実行したコンソール上に以下の出力が追加されます。\ncommand ncat mptcpified Client # Server同様に予めSystemTapで「mptcp.stap」を実行しておきます。\n$ sudo stap -vg mptcp.stap Pass 1: parsed user script and 480 library scripts using 115220virt/101760res/8000shr/93664data kb, in 290usr/20sys/313real ms. Pass 2: analyzed script: 1 probe, 2 functions, 1 embed, 0 globals using 185876virt/173188res/9052shr/164320data kb, in 1270usr/90sys/1359real ms. Pass 3: using cached /root/.systemtap/cache/7e/stap_7e56f03f2ab5129c2608bd38944e60b3_1608.c Pass 4: using cached /root/.systemtap/cache/7e/stap_7e56f03f2ab5129c2608bd38944e60b3_1608.ko Pass 5: starting run. 実際にMPTCP通信しているかの確認用にtcpdumpを実行します。\n$ sudo tcpdump -i any port 4321 -n -nn tcpdump: data link type LINUX_SLL2 tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes 次にncatをクライアントとして起動します。\n$ ncat 192.168.30.20 4321 SystemTapを実行したコンソール上に以下の出力が追加されます。\ncommand ncat mptcpified tcpdumpを実行したコンソール上にmptcpオプション付のパケットが出力されます。\n06:17:53.978527 enp0s3 Out IP 192.168.10.20.35644 \u0026gt; 192.168.30.20.4321: Flags [S], seq 804167068, win 64240, options [mss 1460,sackOK,TS val 1521023865 ecr 0,nop,wscale 7,mptcp capable v1], length 0 06:17:53.979072 enp0s3 In IP 192.168.30.20.4321 \u0026gt; 192.168.10.20.35644: Flags [S.], seq 2369976460, ack 804167069, win 65160, options [mss 1460,sackOK,TS val 251220121 ecr 1521023865,nop,wscale 7,mptcp capable v1 {0x7948c13f4e14a250}], length 0 06:17:53.979103 enp0s3 Out IP 192.168.10.20.35644 \u0026gt; 192.168.30.20.4321: Flags [.], ack 1, win 502, options [nop,nop,TS val 1521023865 ecr 251220121,mptcp capable v1 {0xcc3b1bc6232e7271,0x7948c13f4e14a250}], length 0 これで単一サブフローでMPTCP通信ができることが確認できました。\n複数サブフロー # いよいよ、複数サブフロー（ネットワークインタフェース）を同時に使って”Client\u0026quot;と\u0026quot;Server\u0026quot;で通信させてみます。\nServer # 予めSystemTapで「mptcp.stap」を実行しておきます。\n許容するサブフロー数を設定します。\n$ sudo ip mptcp limits set subflow 2 $ sudo ip mptcp limits show add_addr_accepted 0 subflows 2 iperfをサーバとして起動します。\n$ iperf -s SystemTapを実行したコンソール上に以下の出力が追加されます。\ncommand iperf mptcpified Client # 予めSystemTapで「mptcp.stap」を実行しておきます。\nそれぞれのネットワークインタフェース指定でtcpdumpを実行します。\nenp0s3\n$ sudo tcpdump -i enp0s3 dst port 5001 -n -nn tcpdump: data link type LINUX_SLL2 tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes enp0s8\n$ sudo tcpdump -i enp0s8 dst port 5001 -n -nn | more tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on enp0s8, link-type EN10MB (Ethernet), snapshot length 262144 bytes サブフローの設定をします。\n今回試した時のClientの経路設定は次のとおりです。\n$ ip route default via 192.168.10.1 dev enp0s3 proto static metric 100 default via 192.168.20.1 dev enp0s8 proto static metric 200 192.168.10.0/24 dev enp0s3 proto kernel scope link src 192.168.10.20 192.168.20.0/24 dev enp0s8 proto kernel scope link src 192.168.20.20 enp0s3のデフォルトゲートウェイ設定の優先度が高いので、先程は何も設定しなくてもenp0s3がMPTCP通信に使われていました。\nenp0s8(192.168.20.20)をサブフローとして使うように設定します。\n$ sudo ip mptcp limits set subflow 2 $ sudo ip mptcp limits show add_addr_accepted 0 subflows 2 $ sudo ip mptcp endpoint add 192.168.20.20 subflow $ sudo ip mptcp endpoint show 192.168.20.20 id 1 subflow 複数サブフローからパケットが送信されるようにポリシールーティングを設定します。\n$ sudo ip rule add from 192.168.10.20 table 1 $ sudo ip route add 192.168.10.0/24 dev enp0s3 scope link table 1 $ sudo ip route add default via 192.168.10.1 dev enp0s3 table 1 $ sudo ip rule add from 192.168.20.20 table 2 $ sudo ip route add 192.168.20.0/24 dev enp0s8 scope link table 2 $ sudo ip route add default via 192.168.20.1 dev enp0s8 table 2 $ ip route show table 1 default via 192.168.10.1 dev enp0s3 192.168.10.0/24 dev enp0s3 scope link $ ip route show table 2 default via 192.168.20.1 dev enp0s8 192.168.20.0/24 dev enp0s8 scope link この設定を行わない場合は、送信元が192.168.20.20のパケットもenp0s3から送信されます。\n公式wikiでさりげなく書いてあるのですが、割と見落としがちですね。 Configure the routing rules to use multiple subflows from multiple interfaces: Configure Routing\niperfをクライアントとして起動します。\n$ iperf -c 192.168.30.20 SystemTapを実行したコンソール上に以下の出力が追加されます。\ncommand iperf mptcpified tcpdumpを実行したそれぞれのネットワークインタフェースからmptcpオプション付のパケットが出力されるのが確認できます。\nおわりに # いくつかハマりポイントがありましたが、なんとかUbuntuで複数サブフローを使ったMPTCP通信を行うことができました。みなさんもぜひこれを機会にMPTCPを試してみてはいかがでしょうか。\n","date":"2021/02/08","externalUrl":null,"permalink":"/posts/oh/5040/","section":"Posts","summary":"従来、LinuxでMPTCPを利用する場合「 Linux Kernel MultiPath TCP project」が公開しているLinuxカーネルを使う必要がありましたが、アップストリームのLinuxカーネル 5.6以降でMPTCPが利用可能になりました。\n今回は、Ubuntuでアップストリーム版を使った複数サブフローでのMPTCP通信を試してみました。\n","title":"アップストリーム版のMPTCPを試してみた","type":"posts"},{"content":"残暑の候、皆様におかれましては益々ご健勝のこととお喜び申し上げます。\n本日8月20日をもちまして、株式会社ビットマイスターは創立13周年を迎えることができました。これもひとえに皆様のご支援の賜物と心より感謝いたします。\n第13期は、従来からの次世代情報通信関連の研究プロジェクトに加え、AI研究の評価検証システムや教育研究向けタブレットアプリケーションの開発の他、様々な分野の研究開発の支援を実施してまいりました。あわせて民間企業様からは、RPA（Robotic Process Automation ）導入支援を始めビジネスアプリケーションの技術調査・検証の依頼をいただいております。\n研究者支援事業につきましては、サイエンスコミュニケーション活動団体のコミュニティ支援、大学研究室のシステム保守、学術系クラウドファンディング事業者様と協業した新若手研究者支援、地元大学のオフィシャルスポンサー等々の事業を通じて、直接・間接的に研究者の方を応援させていただきました。\nまた、地域貢献の一環として埼玉大学様と埼玉県内企業様と産学官連携にて取り組んでいる防災関連の研究会では、「デジタルサイネージ型防災情報提供システム」が実運用の段階に入りました。今後、地元の公共施設を中心に設置を進めることで、地域防災の一助になれればと存じます。\n第14期は、COVID-19の影響により多くの業界が甚大なダメージを受けている中での出発となりますが、お客様の事業がより良い方向に向かうために弊社の提供するソフトウェアが少しでもお役にたてるよう、社員一同、引き続き技術とサービスの向上に努めてまいります。\n今後とも、より一層のご指導、ご鞭撻、ご協力を賜りますよう、宜しくお願い申し上げます。\n敬具\n令和2年8月20日 株式会社ビットマイスター 代表取締役　笠原 勉\n","date":"2020/08/20","externalUrl":null,"permalink":"/posts/kasa/5027/","section":"Posts","summary":"残暑の候、皆様におかれましては益々ご健勝のこととお喜び申し上げます。\n本日8月20日をもちまして、株式会社ビットマイスターは創立13周年を迎えることができました。これもひとえに皆様のご支援の賜物と心より感謝いたします。\n第13期は、従来からの次世代情報通信関連の研究プロジェクトに加え、AI研究の評価検証システムや教育研究向けタブレットアプリケーションの開発の他、様々な分野の研究開発の支援を実施してまいりました。あわせて民間企業様からは、RPA（Robotic Process Automation ）導入支援を始めビジネスアプリケーションの技術調査・検証の依頼をいただいております。\n研究者支援事業につきましては、サイエンスコミュニケーション活動団体のコミュニティ支援、大学研究室のシステム保守、学術系クラウドファンディング事業者様と協業した新若手研究者支援、地元大学のオフィシャルスポンサー等々の事業を通じて、直接・間接的に研究者の方を応援させていただきました。\nまた、地域貢献の一環として埼玉大学様と埼玉県内企業様と産学官連携にて取り組んでいる防災関連の研究会では、「デジタルサイネージ型防災情報提供システム」が実運用の段階に入りました。今後、地元の公共施設を中心に設置を進めることで、地域防災の一助になれればと存じます。\n第14期は、COVID-19の影響により多くの業界が甚大なダメージを受けている中での出発となりますが、お客様の事業がより良い方向に向かうために弊社の提供するソフトウェアが少しでもお役にたてるよう、社員一同、引き続き技術とサービスの向上に努めてまいります。\n今後とも、より一層のご指導、ご鞭撻、ご協力を賜りますよう、宜しくお願い申し上げます。\n敬具\n令和2年8月20日 株式会社ビットマイスター 代表取締役　笠原 勉\n","title":"創立13周年のご挨拶","type":"posts"},{"content":"謹賀新年\n旧年中は格別のご厚情を賜り、誠にありがとうございました。 お客様、業務パートナーのみなさま、社員を支えてくれたご家族、お世話になった関係者の方々に深く感謝申し上げます。\n昨年は、次世代の通信規格である5G（第5世代移動通信システム）関連研究プロジェクトの可視化システムを利用した研究発表支援、革新的ネットワークプロジェクトの実験構築・制御自動化に資するソフトウェアの提供、広域防災ネットワークを支えるLPWA(Low Power, Wide Area)研究システムの実証実験へのツール開発等、情報通信関連の研究機関様の研究支援を主に実施してまいりました。 また、BtoB企業様からも多数お声がけいただき、新規サービス向け技術調査や、RPA（Robotic Process Automation ）の導入支援を行いました。\n本年も引き続き、これまで培ってきた研究開発支援ノウハウやソフトウェア技術を、大学・研究機関だけでなく、一般企業様に向けた、PoC支援、技術調査等のサービスにも積極的に展開していきたいと存じます。\n研究コミュニティ支援事業に関しては、従来のコミュニケーションサポート支援に加えて、学術系クラウドファンディング事業者様を通じた新たな研究者支援サービスを始めました、今後も他の学術支援企業様と協業ネットワークを構築し、研究者を様々な面で応援できるような事業を推進していく予定です。\n本年も、研究開発サービスの提供を通じて科学技術の発展と普及に寄与し、お客様の事業の振興に貢献できるように、社員一同、技術に磨きをかけていく所存です。\nよりいっそうのご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n皆々様にとりまして、新しい年がより幸の多き年となりますようお祈り申し上げ、新年のご挨拶とさせていただきます。\n令和2年1月 株式会社ビットマイスター 代表取締役　笠原 勉\n","date":"2019/12/31","externalUrl":null,"permalink":"/posts/kasa/4985/","section":"Posts","summary":"謹賀新年\n旧年中は格別のご厚情を賜り、誠にありがとうございました。 お客様、業務パートナーのみなさま、社員を支えてくれたご家族、お世話になった関係者の方々に深く感謝申し上げます。\n昨年は、次世代の通信規格である5G（第5世代移動通信システム）関連研究プロジェクトの可視化システムを利用した研究発表支援、革新的ネットワークプロジェクトの実験構築・制御自動化に資するソフトウェアの提供、広域防災ネットワークを支えるLPWA(Low Power, Wide Area)研究システムの実証実験へのツール開発等、情報通信関連の研究機関様の研究支援を主に実施してまいりました。 また、BtoB企業様からも多数お声がけいただき、新規サービス向け技術調査や、RPA（Robotic Process Automation ）の導入支援を行いました。\n本年も引き続き、これまで培ってきた研究開発支援ノウハウやソフトウェア技術を、大学・研究機関だけでなく、一般企業様に向けた、PoC支援、技術調査等のサービスにも積極的に展開していきたいと存じます。\n研究コミュニティ支援事業に関しては、従来のコミュニケーションサポート支援に加えて、学術系クラウドファンディング事業者様を通じた新たな研究者支援サービスを始めました、今後も他の学術支援企業様と協業ネットワークを構築し、研究者を様々な面で応援できるような事業を推進していく予定です。\n本年も、研究開発サービスの提供を通じて科学技術の発展と普及に寄与し、お客様の事業の振興に貢献できるように、社員一同、技術に磨きをかけていく所存です。\nよりいっそうのご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n皆々様にとりまして、新しい年がより幸の多き年となりますようお祈り申し上げ、新年のご挨拶とさせていただきます。\n令和2年1月 株式会社ビットマイスター 代表取締役　笠原 勉\n","title":"新年のご挨拶","type":"posts"},{"content":" 牧歌的なテンポで結果を表示するTracerouteをのどかに見つめてる時代は今終わった # 既存のTracerouteの設計は、途中で応答が返らないルータがあると、頑なに順番を守ってタイムアウトまで待つ。そんな必要はない。送るだけ送って、結果をまとめて集計すれば瞬時に終わる。ただしこれには問題があって、経由するルータ数がわからないとき、多めにプローブ・パケットを送信する必要があるのでプローブ・パケットの無駄打ちが発生する。\nそれでも投機的にプローブ・パケットを送信する理由 # 障害対応のとき\n数十パケットの無駄より、プローブに数分掛かったほうがよっぽど無駄。 モニタリングのとき\n経路を一定間隔でモニタリングするような用途では、ホップ数を記憶すれば無駄なプローブ・パケットを送信せずに済む。 言い訳は以上。\n実際に作ってみた # nbtk/tsubame Python Quick Traceroute Python 2 0 インストール # インストール不要。モジュールとしてインポートするだけ。\n使い方 # 権限\nスーパーユーザー権限が必要。または、PythonバイナリにCAP_NET_RAWケイパビリティを設定する。\nプログラミング・インタフェース\nfrom traceroute import traceroute host = \u0026#39;example.com\u0026#39; tr = traceroute() results = tr.probe(host, hop_limit=8, count=1, timeout=1.0, ident=None) host\n対象ホスト名の文字列またはIPアドレスの文字列\nhop_limit\n最大ホップ数。1から64までの整数。到達できる最小の値を設定するべき。\ncount\n各ホップへのプローブ回数。1から4までの整数。\nident\n並列実行のための識別子。長さ2のバイトアレイ。デフォルトまたはNoneの場合はPIDが使われる。\n結果の構造 # 入れ子構造\n[ [ first_probe, second_probe, ..., nth_probe ], # hop 1 [ first_probe, second_probe, ..., nth_probe ], # hop 2 ... [ first_probe, second_probe, ..., nth_probe ], # hop n ] 各結果アイテム: 応答を得られたとき\n(from_addr, delay_sec, is_target) アイテム例\n(\u0026#39;192.168.1.1\u0026#39;, 0.0011992454528808594, False) 得られなかったとき\nNone コード例 # モジュールの メインブロック に簡単なtracerouteコードがあり、このようなコマンドとして実効できる。\n$ sudo ./traceroute.py example.com traceroute to example.com (93.184.216.34), 32 hops max 1 192.168.1.1 1.146 ms 1.374 ms 1.616 ms 2 * * * 3 * * * 4 * * * 5 * * * 6 111.87.3.234 118.376 ms 118.503 ms 119.928 ms 7 62.115.180.213 123.618 ms 123.894 ms 125.392 ms 8 62.115.155.89 120.319 ms 121.756 ms 122.066 ms 9 152.195.85.133 121.776 ms 123.551 ms 123.544 ms 10 93.184.216.34 127.130 ms 127.199 ms 129.053 ms ","date":"2019/08/27","externalUrl":null,"permalink":"/posts/bit/4867/","section":"Posts","summary":"牧歌的なテンポで結果を表示するTracerouteをのどかに見つめてる時代は今終わった","title":"超高速Tracerouteを実装した","type":"posts"},{"content":"Tracerouteの仕組みについて解説してるページは数あれど、障害箇所特定のノウハウはあまり見かけないので、今回は「Tracerouteは有用だけど、これを知らないと結果が読めないぞ」という話を。\nいちおう仕組みの解説 # Tracerouteにはそれ専用のプロトコルがあるわけではく、IPのパケット転送制限の仕様をうまく応用することで実現する。IPヘッダにはTTL(Time To Live、IPv6では hop-limit)フィールドがある。この本来の役割は誤ったルーティングによるパケットループを防ぐことで、ルータは転送するパケットの TTLフィールドの値をデクリメントし、0の場合は転送せず送信元に対して ICMP - Time Exceeded (期限切れ)を返す。つまりIPパケットは送信時にTTLフィールドに設定した値と同じ数のルータを経由できる。TTLの初期値は環境によって異なるが、64とか128とか、通信相手に到達するために適当な値が設定されている。\nこれを逆手に取って、 TTLを1からインクリメントしながらパケットを送信すれば、送信経路上のルータたちから ICMP - Time Exceeded が返ってくる。そのICMPパケットの送信元IPアドレスを見れば送信経路上のルータがわかるという仕組み。\n知るべきこと1: プローブ・パケットの使い分け # 送信するプローブ・パケット(調査パケット)は、UDPパケット、TCP SYN パケット、ICMP - Echo Request パケットが使われる。\nUDP | TCP SYN パケット # よいところ # ルータが port-based routing をしている場合、 その経路で通信するサービスのポートを送信パケットに設定すれば、実際の送信経路がわかる。ただし、Tracerouteの実装によっては試行回数ごとにポート番号をインクリメントするので、特定ポートをプローブしたいときは試行回数を1回にする。\nわるいところ # 経路上のファイヤウォールでパケットが暗黙に破棄されることが多々あり、一見して障害と区別がつかない。\nまた、TracerouteはUDPパケットが宛先にパケットが到達したとき、 ICMP - Port Unreachable パケットが返ることを期待しているが、プローブ・パケットの宛先ポートが実際に使用されていると ICMP - Port Unreachable パケットが返らないので、結果は宛先に到達していないように見える。(TCPの場合、リッスンされていなければ RST、リッスンされていれば SYN ACK が返ってくるので、宛先に到達したことが判別できる。)\nICMP - Echo Request パケット # よいところ # pingコマンドと同じプロトコルなので、 ファイヤウォールで遮断されていることが比較的少ない。\n宛先まで到達できれば、 ICMP - Echo Reply が返ってくる\nわるいところ # ルータが port-based routing をしている場合、ICMP - Echo Request と実際に調査したいパケットの経路が異なることがある。\nTracerouteでは問題ないのに、アプリケーションの UDP | TCP パケットが届かないという現象が起こりうる。\nICMPパケットに対するICMPパケットは返さないルータがまれにある。（ICMPパケットの無限ピンポンを防ぐため、ICMPエラーパケットを対するICMPパケットを返さない決まりだが、ICMP - Echo Request に対しては ICMP - Time Exceeded を返す実装がほとんど。)\n知るべきこと2: 受信経路の障害はわからない # パケットの送信経路と受信経路が同じとは全く限らない。むしろ違うものと思ったほうがよい。Tracerouteから見て受信経路で起きている障害は、その箇所を特定できない。 Tracerouteの結果の見かけ上の障害箇所は、実は問題がなく、当該箇所からパケットが返る経路上で発生している障害の可能性がある。障害でなくとも、経路途中のルータから先がTracerouteできなくなる現象は受信経路でICMPパケットが捨てられている可能性もある。もし受信経路が知りたいときは対向からTracerouteするしか思いつかないが、その対向と通信できないからTracerouteしている場合が多く、もはやなすすべなし。\nTracerouteについて完全に理解したので、次回はPythonで実装する :)\n","date":"2019/08/26","externalUrl":null,"permalink":"/posts/bit/4833/","section":"Posts","summary":"Tracerouteの仕組みについて解説してるページは数あれど、障害箇所特定のノウハウはあまり見かけないので、今回は「Tracerouteは有用だけど、これを知らないと結果が読めないぞ」という話を。","title":"Tracerouteについて知っておくべきこと","type":"posts"},{"content":"拝啓\n残暑の候、皆様におかれましては益々ご壮健のこととお慶び申し上げます。\n平素は、格別のお引き立てをいただき、厚く御礼お申し上げます。\n本日8月20日をもちまして、株式会社ビットマイスターは創立12周年を迎えることができました。これもひとえに皆様のご支援の賜物と心より感謝いたします。\n第12期は、商用開始を控えた第5世代移動通信システム（5G）向けを始めとした多種多様な通信規格の研究プロジェクトの実証実験支援を多く行いました。効果的な研究発表までを見据えた統合デモンストレーションシステムの構築に加え、よりサービスに近い実験環境を模擬するために、移動通信設備や自動ロボットといったハードウェアの制御にも取り組みました。\n第13期は、引き続き通信関連の研究開発を請け負うとともに、これまで培ってきた研究開発支援ノウハウを、大学・研究機関だけでなく、一般企業様に向けた、PoC支援、技術調査等のサービスにも積極的に展開していきたいと存じます。\n地域貢献の一環として埼玉大学様と埼玉県内企業様と産学官連携にて取り組んでいる防災関連のシステム開発は、試作したデジタルサイネージ型防災情報提供システムが埼玉りそな銀行様の実店舗での実証実験を経て、今後、改善を重ねながら実運用フェーズへ移行します。\nまた、研究コミュニティ支援事業に関しては、他の学術支援企業様と協業ネットワークを構築し、研究者を様々な面で応援できるような事業を推進していく予定です。\n今後とも、より一層のご指導、ご鞭撻、ご協力を賜りますよう、宜しくお願い申し上げます。\n敬具\n令和元年8月20日\n株式会社ビットマイスター\n代表取締役　笠原 勉\n","date":"2019/08/20","externalUrl":null,"permalink":"/posts/kasa/4827/","section":"Posts","summary":"拝啓\n残暑の候、皆様におかれましては益々ご壮健のこととお慶び申し上げます。\n平素は、格別のお引き立てをいただき、厚く御礼お申し上げます。\n本日8月20日をもちまして、株式会社ビットマイスターは創立12周年を迎えることができました。これもひとえに皆様のご支援の賜物と心より感謝いたします。\n第12期は、商用開始を控えた第5世代移動通信システム（5G）向けを始めとした多種多様な通信規格の研究プロジェクトの実証実験支援を多く行いました。効果的な研究発表までを見据えた統合デモンストレーションシステムの構築に加え、よりサービスに近い実験環境を模擬するために、移動通信設備や自動ロボットといったハードウェアの制御にも取り組みました。\n第13期は、引き続き通信関連の研究開発を請け負うとともに、これまで培ってきた研究開発支援ノウハウを、大学・研究機関だけでなく、一般企業様に向けた、PoC支援、技術調査等のサービスにも積極的に展開していきたいと存じます。\n地域貢献の一環として埼玉大学様と埼玉県内企業様と産学官連携にて取り組んでいる防災関連のシステム開発は、試作したデジタルサイネージ型防災情報提供システムが埼玉りそな銀行様の実店舗での実証実験を経て、今後、改善を重ねながら実運用フェーズへ移行します。\nまた、研究コミュニティ支援事業に関しては、他の学術支援企業様と協業ネットワークを構築し、研究者を様々な面で応援できるような事業を推進していく予定です。\n今後とも、より一層のご指導、ご鞭撻、ご協力を賜りますよう、宜しくお願い申し上げます。\n敬具\n令和元年8月20日\n株式会社ビットマイスター\n代表取締役　笠原 勉\n","title":"創立12周年のご挨拶","type":"posts"},{"content":"生成されるクラスインスタンスを常に一つにするシングルトンパターンを Python で実装します。\nPython は Java みたいに \u0026ldquo;private static\u0026rdquo; みたいな修飾ができないし、どこで初期化すればいいのかもちょっと考える必要があります。\nまずダメなパターンから。\nclass Sandwich: singleton = Sandwich() # これは NameError: name \u0026#39;Sandwich\u0026#39; is not defined で失敗する。 Python ではこのスコープでインスタンスを生成しようとすると「クラスが定義されていない」として失敗します。\nでは init() メソッドはでしょうか。このアイデアもダメです。なぜなら init() メソッドの引数に渡される self はインスタンスですよね。 init() メソッドがコールされた時点で、既にインスタンスが作られてしまっています。複数回呼ばれたら複数のインスタンスが生成されることになって、シングルトンになりません。\nそこで new() メソッドです。 init() メソッドより前に呼ばれ、インスタンスを生成して返すのが new() メソッドです。単にインスタンスを生成して返すだけの場合はこんな感じです。\nclass Sandwich: def __new__(cls, *args, **kwargs): # 親クラスの __new__() にインスタンスを作ってもらい、そのまま返す return super(Sandwich, cls).__new__(cls) つまり new() メソッドが返すインスタンスを一つだけにすれば、シングルトンパターンを実装できます。それがこちら。\n# Singleton import threading class Sandwich: __singleton = None __new_lock = threading.Lock() # 変数名に \u0026#34;__\u0026#34; (アンダースコアを２つ) をつけるとプライベート変数になる def __new__(cls, *args, **kwargs): cls.__new_lock.acquire() # ロック取得 if cls.__singleton == None: cls.__singleton = super(Sandwich, cls).__new__(cls) cls.__new_lock.release() # ロック開放 return cls.__singleton クラス変数にはじめて生成したインスタンスを代入しておいて、それを使いまわします。マルチスレッドでインスタンスが複数作られないように「既存インスタンスのチェック」と「インスタンスの生成」に再入されないように排他制御しています。ただ、２回目以降は再入されてても問題ないので、無駄な排他制御になってしまいます。以下のように、例えばインポート時に必ず1回だけインスタンスを作っておいて、あとはロックフリーでもいいでしょう。\n# Singleton\u0026#39; class Sandwich: __singleton = None def __new__(cls, *args, **kwargs): if cls.__singleton == None: cls.__singleton = super(Sandwich, cls).__new__(cls) return cls.__singleton Sandwich() # クラス定義の直下に書いて、インスタンスを作るために必ず呼ぶ 最後に、本当にシングルトンになっているか確認するコードを貼っておきます。\n\u0026gt;\u0026gt;\u0026gt; class Sandwich: ... __singleton = None ... __spam = None ... def __new__(cls, *args, **kwargs): ... if cls.__singleton == None: ... cls.__singleton = super(Sandwich, cls).__new__(cls) ... return cls.__singleton ... def set_spam(self, spam=None): ... self.__spam = spam ... def get_spam(self): ... return self.__spam ... \u0026gt;\u0026gt;\u0026gt; Sandwich() \u0026lt;__main__.Sandwich object at 0x76ad5630\u0026gt; \u0026gt;\u0026gt;\u0026gt; sw1 = Sandwich() \u0026gt;\u0026gt;\u0026gt; sw2 = Sandwich() \u0026gt;\u0026gt;\u0026gt; sw1 \u0026lt;__main__.Sandwich object at 0x76ad5630\u0026gt; \u0026gt;\u0026gt;\u0026gt; sw2 \u0026lt;__main__.Sandwich object at 0x76ad5630\u0026gt; \u0026gt;\u0026gt;\u0026gt; sw2.set_spam(\u0026#39;spam spam spam\u0026#39;) \u0026gt;\u0026gt;\u0026gt; sw1.get_spam() \u0026#39;spam spam spam\u0026#39; うえの sw1 と sw2 は同じものだということがわかります。\n","date":"2019/06/03","externalUrl":null,"permalink":"/posts/bit/4806/","section":"Posts","summary":"生成されるクラスインスタンスを常に一つにするシングルトンパターンを Python で実装します。\nPython は Java みたいに “private static” みたいな修飾ができないし、どこで初期化すればいいのかもちょっと考える必要があります。\n","title":"Python でシングルトンパターンを実装する","type":"posts"},{"content":"謹賀新年\n旧年中は格別のご厚情を賜り、誠にありがとうございました。 お客様、業務パートナーのみなさま、社員のご家族、お世話になったすべての関係者の方々に深く感謝申し上げます。\n「研究開発支援サービス」の提供も１０年を超えました。リピート率の向上に伴いお客様の要求も年々高くなっております。理論検証のための分析・計測用アプリケーション制作やシミュレーションソフトウェア開発だけに留まらず、研究発表を始めアウトリーチ活動までも見据えた効果的なデモンストレーションシステムの提案までをトータルで期待されることが多くなりました。 さらに研究プロジェクトの大型化、関係者の増加により、弊社メンバが全体調整的な役割を担うことも増えました。技術面に加えてプロジェクトマネジメント面での支援を強く求められていると感じております。 本年もより多くの要望に応えられるように社員一同、知識と技に磨きをかけていく所存です。\n併せて、受託開発で培った技術は、自社プロダクトにより社会に展開していきます。 今年度もさいたま市のイノベーション技術創出支援事業に採択された研究開発を埼玉大学様と県内企業様と共同で実施しています。昨年度実施した自社プロダクトであるミュージアム向け展示解説アプリ「muBe」を活用したアプリ版の発展形として、今回はサイネージを利用した避難誘導システムを開発しました。今後は実証実験を重ね、実店舗への設置を目指します。\n加えて、創業来続けてきた各種研究コミュニティ支援事業から一歩進めて、若手の研究者を直接応援していくような事業を他の支援企業様と協業して取り組んで行く予定です。\nこうした新しい施策を通じて研究開発支援サービスをより充実したものにしていけたらと存じます。\nより一層のご指導、ご鞭撻を賜りますよう、本年もよろしくお願い申し上げます。\n皆々様にとりまして、新しい年がより幸の多き年となりますようお祈り申し上げ、新年のご挨拶とさせていただきます。\n株式会社ビットマイスター 代表取締役　笠原勉\n","date":"2018/12/31","externalUrl":null,"permalink":"/posts/kasa/4696/","section":"Posts","summary":"謹賀新年\n旧年中は格別のご厚情を賜り、誠にありがとうございました。 お客様、業務パートナーのみなさま、社員のご家族、お世話になったすべての関係者の方々に深く感謝申し上げます。\n「研究開発支援サービス」の提供も１０年を超えました。リピート率の向上に伴いお客様の要求も年々高くなっております。理論検証のための分析・計測用アプリケーション制作やシミュレーションソフトウェア開発だけに留まらず、研究発表を始めアウトリーチ活動までも見据えた効果的なデモンストレーションシステムの提案までをトータルで期待されることが多くなりました。 さらに研究プロジェクトの大型化、関係者の増加により、弊社メンバが全体調整的な役割を担うことも増えました。技術面に加えてプロジェクトマネジメント面での支援を強く求められていると感じております。 本年もより多くの要望に応えられるように社員一同、知識と技に磨きをかけていく所存です。\n併せて、受託開発で培った技術は、自社プロダクトにより社会に展開していきます。 今年度もさいたま市のイノベーション技術創出支援事業に採択された研究開発を埼玉大学様と県内企業様と共同で実施しています。昨年度実施した自社プロダクトであるミュージアム向け展示解説アプリ「muBe」を活用したアプリ版の発展形として、今回はサイネージを利用した避難誘導システムを開発しました。今後は実証実験を重ね、実店舗への設置を目指します。\n加えて、創業来続けてきた各種研究コミュニティ支援事業から一歩進めて、若手の研究者を直接応援していくような事業を他の支援企業様と協業して取り組んで行く予定です。\nこうした新しい施策を通じて研究開発支援サービスをより充実したものにしていけたらと存じます。\nより一層のご指導、ご鞭撻を賜りますよう、本年もよろしくお願い申し上げます。\n皆々様にとりまして、新しい年がより幸の多き年となりますようお祈り申し上げ、新年のご挨拶とさせていただきます。\n株式会社ビットマイスター 代表取締役　笠原勉\n","title":"新年のご挨拶","type":"posts"},{"content":"Javascript のハッシュマップはドット・ノーテーション ( dot notation )でアイテムにアクセスできますよね。でも Python の辞書ではそれができません。できたら便利だなーと考えていたらひらめいたので、 dict クラスを継承した dict2 クラスを作りました。\nclass dict2(dict): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.__dict__ = self コンストラクタ init() をオーバーライドして self.dict に self を代入する行を加えました。 ただそれだけです。\ndict はオブジェクトの書き込み可能なアトリビュートを格納するために使用される辞書またはその他のマッピングオブジェクトです。 self はまさに dict を継承したマッピングオブジェクトなので、アトリビュートを格納する dict に self を代入すれば、ドット・ノーテーションでアトリビュートとして辞書のアイテムにアクセスできるようになるってわけです。\nピンとこなくても、とりあえず動作を見てみましょう。\nまず IPython を起動したら、上の dict2 クラスのコードをコピペします。必ずしも IPython である必要はありませんが、解説に便利なので使います。\n$ ipython Python 3.5.2 In [1]: # ここにコピペして[Enter] こんな感じで、 Javascript のようにアトリビュートにキー名を書くとバリューが返ります。\nIn [2]: d2 = dict2({\u0026#39;abc\u0026#39;: 123}) In [3]: d2.abc Out[3]: 123 In [4]: d2.update({\u0026#39;abc\u0026#39;: 456}) In [5]: d2.abc Out[5]: 456 ネストすればチェインもできます。\nIn [6]: d2.update({\u0026#39;ijk\u0026#39;: dict2({\u0026#39;xyz\u0026#39;: 789})}) In [7]: d2 Out[7]: {\u0026#39;abc\u0026#39;: 456, \u0026#39;ijk\u0026#39;: {\u0026#39;xyz\u0026#39;: 789}} In [8]: d2.ijk.xyz Out[8]: 789 さらに、ドット・ノーテーションで辞書のアイテムを追加することもできます。\nIn [9]: d2.uvw = \u0026#39;foobar\u0026#39; In [10]: d2[\u0026#39;uvw\u0026#39;] Out[10]: \u0026#39;foobar\u0026#39; もちろん、ドット・ノーテーションで辞書のアイテムを更新できます。\nIn [11]: d2.abc = 321 In [12]: d2[\u0026#39;abc\u0026#39;] Out[12]: 321 万能すぎる…\nなんだろう、このダクトテープとか結束バンドを使った修理に似た感覚は。\n注意点としては、キーに予約語とか演算子の記号とか数値リテラルとか変数名に使えない文字列が入ると、辞書のキーとしては問題ないですが、ドット・ノーテーションだとシンタックスエラーになります。あと、すでにあるアトリビュート名とキーが衝突すると上書きされるので気をつけましょう。そういう諸々をエラーにしたいときは、 init() に加えて setitem() とか update() とかもオーバーライドしてバリデーションすればいいんじゃないですかね。他にも副作用があるかもしれません。\n","date":"2018/11/29","externalUrl":null,"permalink":"/posts/bit/4658/","section":"Posts","summary":"Javascript のハッシュマップはドット・ノーテーション ( dot notation )でアイテムにアクセスできますよね。でも Python の辞書ではそれができません。できたら便利だなーと考えていたらひらめいたので、 dict クラスを継承した dict2 クラスを作りました。","title":"Pythonの辞書に dot notation でアクセスする","type":"posts"},{"content":"拝啓\n処暑の候、皆様におかれましては益々ご健勝のこととお慶び申し上げます。\n本日8月20日をもちまして、株式会社ビットマイスターは創立11周年を迎えることができました。これもひとえに皆様のご支援の賜物と心より感謝いたします。\n第11期は、大手の研究機関に加え、東北から九州まで多くの大学の研究室からの研究開発サービスへのお問合せをいただきました。また民間企業様におかれましても新規プロジェクト立上げの際のIT支援等の相談を複数承りました。いずれもチャレンジングな内容でしたが、ご要望に応じて一つ一つオーダーメイドで開発させていただきました。ご提供したソフトウェアや調査レポートがお客様の事業のお役にたてたなら幸いです。\n第12期も引き続き 研究開発ITサービス を提供してまいります。 研究や企画の構想をより具体化するためのプロトタイプ製作、OSS（オープンソースソフトウェア）の有効性調査・改善、検証用アプリケーション開発、試験環境構築、実験データの提供、そしてデモンストレーション用の可視化システムまで、一貫して研究開発を支援する弊社ならではのサービスをひとつでも多くお客様へお届けするとにより、科学技術の発展と普及に寄与していければと存じます。\nまた、埼玉大学様と埼玉県内企業様、ならびに自治体様と取り組んでいる産学官連携による防災関連の研究開発は、昨年度にさいたま市盆栽美術館様のご協力によって実施した、 ミュージアム向け展示解説アプリ「muBe」を活用した避難誘導システムの実証実験 が評価され、今年度もさいたま市のイノベーション技術創出支援事業に採択されました。 今回は、より発展した形として埼玉県内企業様と共同で防災機器を開発し、実証実験に臨みます。\n今後とも、より一層のご指導、ご鞭撻、ご協力を賜りますよう、宜しくお願い申し上げます。\n敬具\n平成30年8月20日 株式会社ビットマイスター 代表取締役　笠原 勉\n","date":"2018/08/20","externalUrl":null,"permalink":"/posts/kasa/4617/","section":"Posts","summary":"拝啓\n処暑の候、皆様におかれましては益々ご健勝のこととお慶び申し上げます。\n本日8月20日をもちまして、株式会社ビットマイスターは創立11周年を迎えることができました。これもひとえに皆様のご支援の賜物と心より感謝いたします。\n第11期は、大手の研究機関に加え、東北から九州まで多くの大学の研究室からの研究開発サービスへのお問合せをいただきました。また民間企業様におかれましても新規プロジェクト立上げの際のIT支援等の相談を複数承りました。いずれもチャレンジングな内容でしたが、ご要望に応じて一つ一つオーダーメイドで開発させていただきました。ご提供したソフトウェアや調査レポートがお客様の事業のお役にたてたなら幸いです。\n第12期も引き続き 研究開発ITサービス を提供してまいります。 研究や企画の構想をより具体化するためのプロトタイプ製作、OSS（オープンソースソフトウェア）の有効性調査・改善、検証用アプリケーション開発、試験環境構築、実験データの提供、そしてデモンストレーション用の可視化システムまで、一貫して研究開発を支援する弊社ならではのサービスをひとつでも多くお客様へお届けするとにより、科学技術の発展と普及に寄与していければと存じます。\nまた、埼玉大学様と埼玉県内企業様、ならびに自治体様と取り組んでいる産学官連携による防災関連の研究開発は、昨年度にさいたま市盆栽美術館様のご協力によって実施した、 ミュージアム向け展示解説アプリ「muBe」を活用した避難誘導システムの実証実験 が評価され、今年度もさいたま市のイノベーション技術創出支援事業に採択されました。 今回は、より発展した形として埼玉県内企業様と共同で防災機器を開発し、実証実験に臨みます。\n今後とも、より一層のご指導、ご鞭撻、ご協力を賜りますよう、宜しくお願い申し上げます。\n敬具\n平成30年8月20日 株式会社ビットマイスター 代表取締役　笠原 勉\n","title":"創立11周年のご挨拶","type":"posts"},{"content":"ns-3 とはオープンソースの離散事象ネットワークシミュレータです。ns-3を使ってLTE通信のシミュレーションを行っていた時、TCPを使うとスループットが出ない現象がありました。その原因と解決方法について書いていきます。\n要約 # 本記事の要約は以下の通りです。\nLTEモジュールのサンプルスクリプトを動かす スループットの表示機能を追加する サンプルスクリプトを改造してUDPからTCPに変更したところスループットが出なくなる RLCレイヤの送信バッファが溢れ、パケットがドロップして、輻輳制御が働いていたことが原因 ns-3について # 本記事で扱うns-3のバージョンは現在の最新版であるns-3.28です。ns-3のインストール方法につきましては Getting Started — Tutorial または ns-3.26で始めるネットワークシミュレーション を参照ください。\nns-3に付属しているLTEモジュールのドキュメントは以下の通りです。\nLTE Module Design Documentation LTE Module User Dodumentation LTEモジュールのサンプルスクリプト # まず、LTEの通信を行うサンプルスクリプトを動かしてみます。サンプルスクリプトのトラフィックは以下のようになっています (EPCは省略しています)。\n矢印はトラフィックを表しています。各トラフィックは100ミリ秒おきにUDPパケットを1個送信しています。また、各eNBとUEのペアの距離は0です。\nそれではサンプルスクリプトを./scratch/にコピーして動かしてみます。\n$ cd ~/ns-allinone-3.28/ns-3.28 $ cp ./src/lte/examples/lena-simple-epc.cc ./scratch/lte-example.cc $ ./waf --run lte-example eNBとUEの無線区間に関するログファイルがいくつかファイル出力されていますが、スループットは表示されません。\n以降では、./scratch/lte-example.ccに手を加えていきます。\nスループットの表示 # lte-example.cc(以降、スクリプト)にコードを追加して、スループットを表示します。スループットの表示にはいくつか方法がありますが、今回はns-3のモジュールの Flow Monitor を使います。\nまずはFlow Monitorをインクルードします。\n#include \u0026#34;ns3/flow-monitor-helper.h\u0026#34; #include \u0026#34;ns3/flow-monitor-module.h\u0026#34; スクリプト内のSimulator::Stop(Seconds(simTime));の前に以下のコードを追加します。\nFlowMonitorHelper flowmon; Ptr\u0026lt;FlowMonitor\u0026gt; monitor = flowmon.InstallAll (); Simulator::Stop(Seconds(simTime)); Simulator::Run();の後に以下のコードを追加します。\nSimulator::Run(); // Print per flow statistics monitor-\u0026gt;CheckForLostPackets (); Ptr\u0026lt;Ipv4FlowClassifier\u0026gt; classifier = DynamicCast\u0026lt;Ipv4FlowClassifier\u0026gt; (flowmon.GetClassifier ()); FlowMonitor::FlowStatsContainer stats = monitor-\u0026gt;GetFlowStats (); for (std::map\u0026lt;FlowId, FlowMonitor::FlowStats\u0026gt;::const_iterator i = stats.begin (); i != stats.end (); ++i) { Ipv4FlowClassifier::FiveTuple t = classifier-\u0026gt;FindFlow (i-\u0026gt;first); std::cout \u0026lt;\u0026lt; \u0026#34;Flow \u0026#34; \u0026lt;\u0026lt; i-\u0026gt;first \u0026lt;\u0026lt; \u0026#34; (\u0026#34; \u0026lt;\u0026lt; t.sourceAddress \u0026lt;\u0026lt; \u0026#34; -\u0026gt; \u0026#34; \u0026lt;\u0026lt; t.destinationAddress \u0026lt;\u0026lt; \u0026#34;)\\n\u0026#34;; std::cout \u0026lt;\u0026lt; \u0026#34; Tx Packets: \u0026#34; \u0026lt;\u0026lt; i-\u0026gt;second.txPackets \u0026lt;\u0026lt; \u0026#34;\\n\u0026#34;; std::cout \u0026lt;\u0026lt; \u0026#34; Tx Bytes: \u0026#34; \u0026lt;\u0026lt; i-\u0026gt;second.txBytes \u0026lt;\u0026lt; \u0026#34;\\n\u0026#34;; std::cout \u0026lt;\u0026lt; \u0026#34; TxOffered: \u0026#34; \u0026lt;\u0026lt; i-\u0026gt;second.txBytes * 8.0 / (simTime) / 1000 / 1000 \u0026lt;\u0026lt; \u0026#34; Mbps\\n\u0026#34;; std::cout \u0026lt;\u0026lt; \u0026#34; Rx Packets: \u0026#34; \u0026lt;\u0026lt; i-\u0026gt;second.rxPackets \u0026lt;\u0026lt; \u0026#34;\\n\u0026#34;; std::cout \u0026lt;\u0026lt; \u0026#34; Rx Bytes: \u0026#34; \u0026lt;\u0026lt; i-\u0026gt;second.rxBytes \u0026lt;\u0026lt; \u0026#34;\\n\u0026#34;; std::cout \u0026lt;\u0026lt; \u0026#34; Throughput: \u0026#34; \u0026lt;\u0026lt; i-\u0026gt;second.rxBytes * 8.0 / (simTime) / 1000 / 1000 \u0026lt;\u0026lt; \u0026#34; Mbps\\n\u0026#34;; } 動かしてみます。\n$ ./waf --run lte-example --- (省略) --- Flow 1 (1.0.0.2 -\u0026gt; 7.0.0.2) Tx Packets: 11 Tx Bytes: 11572 TxOffered: 0.08416 Mbps Rx Packets: 10 Rx Bytes: 10520 Throughput: 0.0765091 Mbps --- (省略) --- Flow 6 (7.0.0.3 -\u0026gt; 1.0.0.2) Tx Packets: 11 Tx Bytes: 11572 TxOffered: 0.08416 Mbps Rx Packets: 10 Rx Bytes: 10520 Throughput: 0.0765091 Mbps 1.0.0.2はRemoteHostです。7.0.0.2、7.0.0.3はそれぞれUE1とUE2です。ここでは省略していますが、実際の出力では、3つのトラフィックを持つUEが2つがあることが確認できます。Flow MonitorはIPレイヤを監視して、送受信パケット数を取得しています。各ノードが100ミリ秒おきに1パケットを送信していて、シミュレーションの実行時間が1.1秒なので、11パケット送信しています。受信パケット数が10の理由は、クライアントとサーバの起動時間が同時のため、サーバが1個目のパケットを取りこぼしているからです。\n以下のようにしてクライアントの起動時間を遅らせると、受信パケット数が11になります。\nserverApps.Start (Seconds (0.01)); clientApps.Start (Seconds (0.03)); TCPアプリケーション # トラフィック種別とトポロジを変更してみます。サンプルスクリプトでは100ミリ秒おきに1個のUDPパケットを送信していました。これを変更して、送信側の送信バッファがいっぱいになるまでTCPパケットを送信し続け、バッファに空きが出たら送信を再開するようにします。ns-3のモジュールのBulkSendApplicationを使います。\nまた、トラフィックの見やすさのために、eNBとUEの数を1つに減らし、RetoteHostからUEへの一方向のトラフィックにします。図に示すと以下のようになります。eNBとUEの距離は0になります。\neNBとUEの個数を1つにします。\nuint16_t numberOfNodes = 1; トラフィックの設定を変更します。スクリプト中の\u0026quot;// Install and start applications on UEs and remote host\u0026quot;から\u0026quot;serverApps.Start (Seconds (0.01));\u0026ldquo;の間を以下のように変更します。\n// Install and start applications on UEs and remote host uint16_t dlPort = 1234; ApplicationContainer clientApps; ApplicationContainer serverApps; for (uint32_t u = 0; u \u0026lt; ueNodes.GetN (); ++u) { PacketSinkHelper dlPacketSinkHelper (\u0026#34;ns3::TcpSocketFactory\u0026#34;, InetSocketAddress (Ipv4Address::GetAny (), dlPort)); serverApps.Add (dlPacketSinkHelper.Install (ueNodes.Get(u))); BulkSendHelper dlClient (\u0026#34;ns3::TcpSocketFactory\u0026#34;, InetSocketAddress (ueIpIface.GetAddress (u), dlPort)); clientApps.Add (dlClient.Install (remoteHost)); } serverApps.Start (Seconds (0.01)); サーバとクライアントの起動が同時になると、SYNパケットが通らずに通信が行われないので、起動時間をずらします。\nserverApps.Start (Seconds (0.01)); clientApps.Start (Seconds (0.1)); スクリプトを実行します。シミュレーション時間は5.1秒に設定しています。\n$ ./waf --run \u0026#34;lte-example simTime=5.1\u0026#34; Flow 1 (1.0.0.2 -\u0026gt; 7.0.0.2) Tx Packets: 1632 Tx Bytes: 958548 TxOffered: 1.5036 Mbps Rx Packets: 1613 Rx Bytes: 947376 Throughput: 1.48608 Mbps Flow 2 (7.0.0.2 -\u0026gt; 1.0.0.2) Tx Packets: 871 Tx Bytes: 46320 TxOffered: 0.0726588 Mbps Rx Packets: 864 Rx Bytes: 45956 Throughput: 0.0720878 Mbps ※ 1.0.0.2から7.0.0.2への通信がRemoteHostからUEへのアプリケーションによる通信で、逆方向の通信はAckになります。\nLTEモジュールのリソースブロック(RB)のデフォルト値は25になっているため、最大18Mbps程度のスループットが期待できますが、出力結果を見ると出ていません。\n原因は以下の2点です。\nRLCレイヤの送信バッファの溢れ RemoteHostとEPC間のディレイ RLCレイヤの送信バッファサイズを変更します。\u0026rdquo;// Command line arguments\u0026quot;の直前に以下のコードを追加します。\nConfig::SetDefault(\u0026#34;ns3::LteRlcUm::MaxTxBufferSize\u0026#34;, UintegerValue(1024 * 1024)); // Command line arguments RemoteHostとEPC間のディレイを変更します。\np2ph.SetChannelAttribute (\u0026#34;Delay\u0026#34;, TimeValue (Seconds (0.001))); スクリプトを実行します。\n$ ./waf --run \u0026#34;simple-epc --simTime=5.1\u0026#34; Flow 1 (1.0.0.2 -\u0026gt; 7.0.0.2) Tx Packets: 18923 Tx Bytes: 10688960 TxOffered: 16.767 Mbps Rx Packets: 18687 Rx Bytes: 10555856 Throughput: 16.5582 Mbps Flow 2 (7.0.0.2 -\u0026gt; 1.0.0.2) Tx Packets: 9344 Tx Bytes: 485892 TxOffered: 0.762184 Mbps Rx Packets: 9334 Rx Bytes: 485372 Throughput: 0.761368 Mbps スループットが出るようになりました。\n最後に、帯域幅を変更してみます。ここではRB数を25から100に変更します。帯域幅でいうと5MHzから20MHzになります。RB数が100の場合、最大72Mbps程度のスループットが期待されます。\n以下のようにコードを追加します。\nConfig::SetDefault(\u0026#34;ns3::LteEnbNetDevice::UlBandwidth\u0026#34;, UintegerValue(100)); Config::SetDefault(\u0026#34;ns3::LteEnbNetDevice::DlBandwidth\u0026#34;, UintegerValue(100)); Config::SetDefault(\u0026#34;ns3::LteRlcUm::MaxTxBufferSize\u0026#34;, UintegerValue(1024 * 1024)); スクリプトを実行します。\n$ ./waf --run \u0026#34;simple-epc --simTime=5.1\u0026#34; Flow 1 (1.0.0.2 -\u0026gt; 7.0.0.2) Tx Packets: 79477 Tx Bytes: 44841416 TxOffered: 70.3395 Mbps Rx Packets: 79305 Rx Bytes: 44744408 Throughput: 70.1873 Mbps Flow 2 (7.0.0.2 -\u0026gt; 1.0.0.2) Tx Packets: 39653 Tx Bytes: 2061960 TxOffered: 3.23445 Mbps Rx Packets: 39611 Rx Bytes: 2059776 Throughput: 3.23102 Mbps 70Mbps程度の速度が出ていることが確認できます。\nLTEでは、1つのUEが1つのeNBを独占する形、かつ通信品質が良好の場合、およそ70Mbps出ることがわかります。\nおわりに # LTEのシミュレーションでTCPのスループットが出ない現象について紹介しました。期待した数値が出ないときには、LTE固有のレイヤでのバッファ溢れや、ノード間の遅延が原因であったりします。LTEモジュールの解析には各レイヤを注意深く見る必要があります。\n","date":"2018/04/24","externalUrl":null,"permalink":"/posts/kaoru/4595/","section":"Posts","summary":"ns-3 とはオープンソースの離散事象ネットワークシミュレータです。ns-3を使ってLTE通信のシミュレーションを行っていた時、TCPを使うとスループットが出ない現象がありました。その原因と解決方法について書いていきます。","title":"ns-3を使ったLTE通信のシミュレーション","type":"posts"},{"content":"これまで も話してきたとおり、スレッド間でオブジェクトを共有することはハイコストなので、可能な限りオブジェクトを共有しない設計にすることが性能においても品質においても重要です。しかし、どうしてもオブジェクトを共有したい場合は、昨今の処理系にはそれを保証する機能が用意されているのでそれを使って安全を担保します。\nCではvolatile修飾子をこの用途に使ってはいけません。なんの効果も得られないか、特定の環境下で効果があったとしてもそれは移植性がないコードで、より複雑なバグを埋め込むことになります。\nCでの第一選択肢はPOSIXスレッド(pthreads)のMUTEXです。ただし、MUTEXは他のスレッドからの割り込みに対しては安全ですが、非同期シグナル安全ではありませんので、これも同時に考慮して設計する必要があります。\nそれではスレッド間で共有する変数のカウントアップをMUTEXで排他制御したコードに、timeコマンドを噛ませて実行してみましょう。\n#include \u0026lt;stdio.h\u0026gt; #include \u0026lt;pthread.h\u0026gt; struct params { int *i; pthread_mutex_t *mut; }; void *func(void *arg) { int j; struct params *prm = (struct params *) arg; for (j = 0; j \u0026lt; 1000000; j++) { pthread_mutex_lock(prm-\u0026gt;mut); (*(int *)prm-\u0026gt;i)++; // counts up pthread_mutex_unlock(prm-\u0026gt;mut); } return NULL; } int main() { int n = 0, x = 0; pthread_t th[10]; pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; struct params prm = {\u0026amp;x, \u0026amp;mut}; for (n = 0; n \u0026lt; 10; n++) pthread_create(\u0026amp;th[n], NULL, func, \u0026amp;prm); for (n = 0; n \u0026lt; 10; n++) pthread_join(th[n], NULL); printf(\u0026#34;%d\\n\u0026#34;, x); return 0; } このとき、主とする処理が単なる数値演算のようなOSの機能を必要としないものにも関わらず、やたらとシステムCPU時間を消費している場合には、排他制御のオーバーヘッドが大きいことを疑ってみてください。プロファイラにかけて重い処理を探ってみるのもよいですが、timeコマンドの出力するCPU時間は取得が簡単でとても参考になります。\n$ gcc mutex_test.c -lpthread -Wall $ time ./a.out 10000000 real\t0m2.117s user\t0m1.272s sys\t0m14.747s このようにMUTEXでは役不足な処理の場合、排他制御の実現にOSが介在する上位のAPIではなく、メモリバリアを抽象化した下位のAPIを使う選択肢もあります。C11では Atomic operations library の定義が stdatomic.h に記述されています。\nではこのライブラリを使ってカウントアップ処理を保護するMUTEXを外し、インクリメントをatomic_fetch_add()に置き換えてみましょう。\n#include \u0026lt;stdio.h\u0026gt; #include \u0026lt;pthread.h\u0026gt; #include \u0026lt;stdatomic.h\u0026gt; void *func(void *i) { int j; for (j = 0; j \u0026lt; 1000000; j++) atomic_fetch_add((int *)i, 1); // counts up. return NULL; } int main() { int n = 0, x = 0; pthread_t th[10]; for (n = 0; n \u0026lt; 10; n++) pthread_create(\u0026amp;th[n], NULL, func, \u0026amp;x); for (n = 0; n \u0026lt; 10; n++) pthread_join(th[n], NULL); printf(\u0026#34;%d\\n\u0026#34;, x); return 0; } これを実行すると、\n$ time ./a.out 10000000 real\t0m0.252s user\t0m1.776s sys\t0m0.000s システムCPU時間を消費していないことがわかります。この例ではMUTEXよりも高速です。あるいは、_Atomic修飾子です。\n#include \u0026lt;stdio.h\u0026gt; #include \u0026lt;stdatomic.h\u0026gt; #include \u0026lt;pthread.h\u0026gt; _Atomic int i = ATOMIC_VAR_INIT(0); void *func() { int j; for (j = 0; j \u0026lt; 1000000; j++) i++; return NULL; } int main() { int n = 0; pthread_t th[10]; for (n = 0; n \u0026lt; 10; n++) pthread_create(\u0026amp;th[n], NULL, func, NULL); for (n = 0; n \u0026lt; 10; n++) pthread_join(th[n], NULL); printf(\u0026#34;%d\\n\u0026#34;, i); return 0; } $ time ./a.out 10000000 real\t0m1.292s user\t0m9.514s sys\t0m0.000s こちらもシステムCPU時間が消費されていません。つまりこれらは、OSが提供する機能ではなく、アプリケーションの機械語レベルで非同期スレッド安全な処理にコンパイルされています。\nでは最後に、完全にシングルで書いたものを実行してみます。\n#include \u0026lt;stdio.h\u0026gt; int main() { int i = 0, j = 0; for (; j \u0026lt; 10000000; j++) i++; printf(\u0026#34;%d\\n\u0026#34;, i); return 0; } $ time ./a.out 10000000 real\t0m0.028s user\t0m0.028s sys\t0m0.000s これまでで最速の処理時間です。シングルの場合、非同期スレッド安全のために保証しなくてはならない、次に上げる事柄を一切考慮する必要がありません。\n不可分性 クリティカルセクションに割り込ませないか、割り込まれても問題がないことの保証。\n可視性 あるスレッドが行った操作の結果が、他のスレッドからも観測できることの保証。例えばコンパイラがある処理をレジスタ上で完結するように最適化してしまったり、CPUキャッシュの中で完結してメモリに書き込まれていなかったりすると、他のスレッドからはその値を参照できない場合がある。\n逐次性 あるスレッドが行った処理の順序が、他のスレッドでも同じ順序で観測できることの保証。例えばコンパイラが不要と判断した処理を省略してしまったり、CPUのアウトオブオーダー実行によって命令の実行順序が入れ替わってしまうと、期待する条件が成立しない場合がある。\nこれらを考慮する必要が無い場合、極端に言えばコンパイラは最適化によってただ「10000000」と標準出力に書き込むバイナリを生成しても許されるわけで、実際そのような最適化が行われます。\n一貫性のある設計のためには、なにを保証し、なにを保証しないのかを明確にしておくべきです。ときとして、これらの設計と実装はとても複雑になり、シングルで作ったほうがよい場合があります。そのことに早い段階で気づくための作業が設計フェーズです。\n","date":"2018/04/09","externalUrl":null,"permalink":"/posts/bit/4561/","section":"Posts","summary":"これまでも話してきたとおり、スレッド間でオブジェクトを共有することはハイコストなので、可能な限りオブジェクトを共有しない設計にすることが性能においても品質においても重要です。しかし、どうしてもオブジェクトを共有したい場合は、昨今の処理系にはそれを保証する機能が用意されているのでそれを使って安全を担保します。","title":"スレッド間でカウンタを共有する（再び）","type":"posts"},{"content":"前回の記事 に引き続いて、マルチスレッドプログラムの性能についてです。前回は「コンテキストスイッチングや排他制御のオーバヘッドに見合う処理でなければ並列化は逆効果」ということがわかりました。今回はmutexのロック獲得と開放について簡単な実験します。\n使うプログラム\u0026quot;mutex_test.c\u0026quot;はC言語で書かれたマルチスレッドプログラムで、起動すると10個のスレッドを起こし、それぞれのスレッドが共有変数を100万回カウントアップします。クリティカルセクションは当然短いに越したことはないという安直な考えで、カウントアップ毎にロックの獲得と開放を行っています。\n#include \u0026lt;stdio.h\u0026gt; #include \u0026lt;pthread.h\u0026gt; struct params { int *i; pthread_mutex_t *mut; }; void *func(void *arg) { int j; struct params *prm = (struct params *) arg; for (j = 0; j \u0026lt; 1000000; j++) { pthread_mutex_lock(prm-\u0026gt;mut); (*(int *)prm-\u0026gt;i)++; // counts up pthread_mutex_unlock(prm-\u0026gt;mut); } return NULL; } int main() { int n = 0, x = 0; pthread_t th[10]; pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; struct params prm = {\u0026amp;x, \u0026amp;mut}; for (n = 0; n \u0026lt; 10; n++) pthread_create(\u0026amp;th[n], NULL, func, \u0026amp;prm); for (n = 0; n \u0026lt; 10; n++) pthread_join(th[n], NULL); printf(\u0026#34;%d\\n\u0026#34;, x); return 0; } このコードをコンパイルし、timeコマンドを噛ませて実行すると、\n$ gcc mutex_test.c -lpthread -Wall $ time ./a.out 10000000 real\t0m2.117s user\t0m1.272s sys\t0m14.747s 1000万回のカウントアップに16秒ものCPU時間を消費してしまいます。さて、ここまでは前回と同じです。\n確かに、ロック獲得のための待ち時間を少なくするためにはクリティカルセクションは短いほうがよいです。しかし、過激にクリティカルセクションを分断して何度もロックの獲得と開放を繰り返すのは誤りです。クリティカルセクション内の処理時間と排他制御自体に関わる処理時間を天秤にかける必要があります。このコードでは1000万回のカウントアップのために、10個のスレッドがそれぞれ100万回もロックを奪い合っているわけです。\nそんなことをするくらいなら、10個のスレッドがはじめに1回だけロックを獲得して、100万回のカウントアップした後にロックを開放するほうがよほど効率的です。そのようにコードを書き換えて、\nvoid *func(void *arg) { int j; struct params *prm = (struct params *) arg; pthread_mutex_lock(prm-\u0026gt;mut); for (j = 0; j \u0026lt; 1000000; j++) { // pthread_mutex_lock(prm-\u0026gt;mut); (*(int *)prm-\u0026gt;i)++; // counts up // pthread_mutex_unlock(prm-\u0026gt;mut); } pthread_mutex_unlock(prm-\u0026gt;mut); return NULL; } 実行すると、\n$ gcc mutex_test.c -lpthread -Wall $ time ./a.out 10000000 real\t0m0.031s user\t0m0.031s sys\t0m0.000s 0.031秒。500倍高速になりました。クリティカルセクションは短い方がよいですが、短くするために分断すると排他制御のコストが増加することは頭に入れておきましょう。\n次回 は、インクリメントだけならmutexほどリッチな排他制御は必要ないよねというお話です。\n","date":"2018/04/05","externalUrl":null,"permalink":"/posts/bit/4548/","section":"Posts","summary":"前回の記事に引き続いて、マルチスレッドプログラムの性能についてです。前回は「コンテキストスイッチングや排他制御のオーバヘッドに見合う処理でなければ並列化は逆効果」ということがわかりました。今回はmutexのロック獲得と開放について簡単な実験します。","title":"誤った並列化による性能劣化（その２）","type":"posts"},{"content":"前回の記事 で「複数のスレッドが共有する変数をインクリメントするときには排他制御が必要」という話をしました。その結果、正しい値を得ることには成功したものの、性能が著しく落ちるという知見を得ました。今回は性能が出ないマルチスレッドプログラムに対して割り当てるCPU数をあえて制限してみます。\n使うプログラム\u0026quot;mutex_test.c\u0026quot;はC言語で書かれたマルチスレッドプログラムで、起動すると10個のスレッドを起こし、それぞれのスレッドが共有変数を100万回カウントアップします。カウントアップするクリティカルセクションには複数のスレッドが同時に侵入することがないようmutexで保護しています。\n#include \u0026lt;stdio.h\u0026gt; #include \u0026lt;pthread.h\u0026gt; struct params { int *i; pthread_mutex_t *mut; }; void *func(void *arg) { int j; struct params *prm = (struct params *) arg; for (j = 0; j \u0026lt; 1000000; j++) { pthread_mutex_lock(prm-\u0026gt;mut); (*(int *)prm-\u0026gt;i)++; // counts up pthread_mutex_unlock(prm-\u0026gt;mut); } return NULL; } int main() { int n = 0, x = 0; pthread_t th[10]; pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; struct params prm = {\u0026amp;x, \u0026amp;mut}; for (n = 0; n \u0026lt; 10; n++) pthread_create(\u0026amp;th[n], NULL, func, \u0026amp;prm); for (n = 0; n \u0026lt; 10; n++) pthread_join(th[n], NULL); printf(\u0026#34;%d\\n\u0026#34;, x); return 0; } このソースをコンパイルしてから、timeコマンドを噛ませて実行すると、\n$ gcc mutex_test.c -lpthread -Wall $ time ./a.out 10000000 real\t0m2.117s user\t0m1.272s sys\t0m14.747s こんな結果が返ります。1000万回のカウントアップにユーザCPU時間1.3秒とシステムCPU時間14.7秒の合計で、16秒ものCPU時間を消費しています。使っているマシンのCPUは Intel Xeon E31230 で動作周波数3.20GHz、4コア8スレッドなので、単純計算すると約2000億クロックサイクル(16秒3.20GHz4コア)を消費しています。つまり整数型の値を1回インクリメントするにあたって2万クロックサイクルという極めてハイコストな処理が発生しているわけです。毎回均一に2万クロックサイクルを消費するわけではないので平均にあまり意味はありませんが、感覚的にエクスペンシブです。\n見方を変えてみましょう。インクリメント自体にそんなコストがかかるわけがありません。コンテキストスイッチングやスレッド安全確保のための排他制御のオーバヘッドがいかに大きいということです。このオーバヘッドに見合うだけの処理をしなければ、並列化によって性能が落ちます。\nでは試しに、tasksetコマンドを使ってこのプログラムが使用できるCPU数を変えて傾向を見てみます。まず全てのCPUを使った場合、\n$ time taskset -c 0,1,2,3,4,5,6,7 ./a.out 10000000 real\t0m2.143s user\t0m1.340s sys\t0m14.888s 16秒。これはなにも制限していないことと変わらないので、結果も同程度です。次に、CPU数を4つに制限した場合、\n$ time taskset -c 0,1,2,3 ./a.out 10000000 real\t0m0.978s user\t0m0.912s sys\t0m2.778s 4秒。CPU時間の消費が大幅に減りました。では次に、CPU数を1つに制限した場合、\n$ time taskset -c 0 ./a.out 10000000 real\t0m0.213s user\t0m0.209s sys\t0m0.004s 0.213秒。おわかりいただけたでしょうか。75倍高速になりました。同じプログラムなので無駄に10スレッドが起動してコンテキストスイッチングが発生しますし、各スレッドがロック獲得のための待ち行列に並ぶ可能性もありますが、CPU間での処理移譲の可能性を排除しただけでこれだけ処理が効率化します。\n頑張って並列化プログラミングしてみたものの、実は1つのCPUを割り当てたほうが速いなんていう設計では目も当てられません。ボトルネックを見極めましょう。あるいはもし誰かが作った重たいプロセスに、1つのCPUのみを割り当ててみると、すてきな結果を得られるかもしれません。\n次回 は、今回はmutexのロック獲得と開放について簡単な実験します。\n","date":"2018/04/04","externalUrl":null,"permalink":"/posts/bit/4525/","section":"Posts","summary":"前回の記事で「複数のスレッドが共有する変数をインクリメントするときには排他制御が必要」という話をしました。その結果、正しい値を得ることには成功したものの、性能が著しく落ちるという知見を得ました。今回は性能が出ないマルチスレッドプログラムに対して割り当てるCPU数をあえて制限してみます。","title":"誤った並列化による性能劣化（その１）","type":"posts"},{"content":"C言語では、複数のスレッドが共有する変数を単純にインクリメントすると期待通りの結果になりません。あるいは簡単なテストでうまく動いたとしても、高負荷になるとおかしな結果を返します。この手のバグは再現条件を揃えること自体が難しいので、はじめから安全なコードを書けるように挙動を知っておくことが大事です。\nまずうまくいかないサンプルコードがこちら。10個のスレッドを起こして、それぞれのスレッドが共有変数をナイーブに100万回カウントアップします。\n#include \u0026lt;stdio.h\u0026gt; #include \u0026lt;pthread.h\u0026gt; void *func(void *i) { int j; for (j = 0; j \u0026lt; 1000000; j++) (*(int *)i)++; // \u0026lt;- counts up return NULL; } int main() { int n = 0, x = 0; pthread_t th[10]; for (n = 0; n \u0026lt; 10; n++) pthread_create(\u0026amp;th[n], NULL, func, \u0026amp;x); for (n = 0; n \u0026lt; 10; n++) pthread_join(th[n], NULL); printf(\u0026#34;%d\\n\u0026#34;, x); return 0; } すると、こんな結果が返ります。（あとで性能についても考えるので、timeコマンドを噛ませます。）\n$ time ./a.out 2871703 real\t0m0.037s user\t0m0.207s sys\t0m0.000s 期待する結果1000万(10スレッド*100万回カウントアップ)に比べて、出力された値は遥かに少ないです。インクリメントはCでは1行で済むのでアトミック（不可分）な処理に思いがちですが、Read-Modify-Writeという3つの処理に分けて実行されるのが普通です。\nメモリからレジスタに読み込み レジスタに入れた値に対して命令された演算を行う 結果の入ったレジスタの値をメモリに書き込む という流れの処理です。こんな感じ。\nread a \u0026gt;------+ | * modify a write a| \u0026lt;------+ read b \u0026gt;------+ | * modify b write b| \u0026lt;------+ この流れに則って処理されていれば問題ないのですが、メモリアクセスは非常に時間がかかるハイコストな操作なので、マルチスレッドだと次のようなレースコンディション(競合状態)が頻発します。たとえば、クロスオーバー。\nread a \u0026gt;------+ | | * modify a read b | \u0026gt;-----------+ | | | | write a| * modify b \u0026lt;------- | | write b | \u0026lt;-----------+ あるいは、オーバーラップ。\nread a \u0026gt;-----------+ | read b * modify a \u0026gt;------+ | | | * modify b | | write b| | \u0026lt;------- | | read c | \u0026gt;------+ | | | * modify c | | write c| | \u0026lt;------- | | write a | \u0026lt;-----------+ このように処理が割り込まれると、インクリメントに失敗します。対処としてたまに見かける誤った例は、共有される変数の宣言にvolatile修飾子を付けるというものです。\n#include \u0026lt;stdio.h\u0026gt; #include \u0026lt;pthread.h\u0026gt; volatile int i = 0; void *func() { int j; for (j = 0; j \u0026lt; 1000000; j++) i++; return NULL; } int main() { int n = 0; pthread_t th[10]; for (n = 0; n \u0026lt; 10; n++) pthread_create(\u0026amp;th[n], NULL, func, NULL); for (n = 0; n \u0026lt; 10; n++) pthread_join(th[n], NULL); printf(\u0026#34;%d\\n\u0026#34;, i); return 0; } C言語ではvolatile修飾子の役割はコンパイラの最適化を抑止することです。たとえば、メモリマップトI/Oのような唐突に特定のアドレスへ書き込みを行うようなコードをコンパイラが不要とみなして勝手に消してしまうことを抑止するような用途に使います。修飾された変数への処理がスレッド安全になるわけではありません。むしろアプリケーション・プログラミングではほとんどなにも保証してくれないと思ったほうがいいです。ばっちり割り込まれます。 (POS03-C. volatile を同期用プリミティブとして使用しない)\n$ time ./a.out 2546514 real\t0m0.040s user\t0m0.225s sys\t0m0.000s 解決として一般的な方法はmutex(MUTual EXclusion)を使って複数のスレッドが同時にクリティカルセクションへ入ることを防ぐというものです。\n#include \u0026lt;stdio.h\u0026gt; #include \u0026lt;stdatomic.h\u0026gt; #include \u0026lt;pthread.h\u0026gt; struct params { int *i; pthread_mutex_t *mut; }; void *func(void *arg) { int j; struct params *prm = (struct params *) arg; for (j = 0; j \u0026lt; 1000000; j++) { pthread_mutex_lock(prm-\u0026gt;mut); (*(int *)prm-\u0026gt;i)++; pthread_mutex_unlock(prm-\u0026gt;mut); } return NULL; } int main() { int n = 0, x = 0; pthread_t th[10]; pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; struct params prm = {\u0026amp;x, \u0026amp;mut}; for (n = 0; n \u0026lt; 10; n++) pthread_create(\u0026amp;th[n], NULL, func, \u0026amp;prm); for (n = 0; n \u0026lt; 10; n++) pthread_join(th[n], NULL); printf(\u0026#34;%d\\n\u0026#34;, x); return 0; } これで期待通りの結果を得られます。\n$ time ./a.out 10000000 real\t0m2.117s user\t0m1.272s sys\t0m14.747s 問題は、mutexは非常にコストがかかるということです。1000万回のインクリメントに実時間で2秒以上かかり、CPU時間では16秒もかかっています。\n次回 はこの性能劣化について考えてみます。\n","date":"2018/04/03","externalUrl":null,"permalink":"/posts/bit/4496/","section":"Posts","summary":"C言語では、複数のスレッドが共有する変数を単純にインクリメントすると期待通りの結果になりません。あるいは簡単なテストでうまく動いたとしても、高負荷になるとおかしな結果を返します。この手のバグは再現条件を揃えること自体が難しいので、はじめから安全なコードを書けるように挙動を知っておくことが大事です。","title":"スレッド間でカウンタを共有する","type":"posts"},{"content":" さいたま市大宮盆栽美術館と埼玉大学の留学生に協力いただき、ミュージアム向け展示解説アプリ「 muBe」を利用した災害対応防災情報システムの実証実験を行いました。\n本実証実験では、外国人の方が展示鑑賞中に災害に遭遇したと想定し、手持ちのスマートフォンの展示ガイドアプリから災害情報を受け取り避難に至るまでの一連の流れを、実際の美術館を使って検証しました。\n本災害対応防災情報システムは、スマートフォンとBLE技術を使った避難誘導システムです。 災害時にインターネットがつながらない時でも最低限の災害情報を受け取れるようになっています。 また、多言語化により、訪日外国人の方が観光施設を訪問した際にも、状況（観賞時・災害発生時・避難時）に応じて最適な情報をスマートフォンで受け取り、安全に避難できることを目指しています。\n当日参加された留学生からはアプリについて様々なコメントを、また、館の関係者の方からは緊急時の情報発信の方法について貴重な意見をいただくことができました。 実験の結果を次の開発に活かしていきたいと思います。\n参加された埼玉大学留学生のみなさま、盆栽美術館の方々、ご協力いただきありがとうございました。そして本システムを共同で研究している埼玉大学産学官連携協議会防災ビジネス研究会の関係者の皆様、お疲れさまでした。\nなお、展示解説アプリ『 muBe』は2018年3月まで盆栽美術館にて引き続き利用可能(※1)です。\nアプリの利用可能ゾーンは 屋外の写真撮影コーナー となります。\n盆栽美術館では3月14日（水）まで、春季特別展「 シリーズ・現代の盆栽家 竹山浩 ｰ自然を巡る、雑木の匠」が開催中です。また3月16日（金）からは企画展「 春の花もの盆栽展」が始まります。\n春の盆栽を鑑賞がてら、是非『 muBe』もお試しください。\n(※1)予告なくサービスを停止することがあります。\n","date":"2018/02/25","externalUrl":null,"permalink":"/posts/kasa/4462/","section":"Posts","summary":" さいたま市大宮盆栽美術館と埼玉大学の留学生に協力いただき、ミュージアム向け展示解説アプリ「 muBe」を利用した災害対応防災情報システムの実証実験を行いました。\n","title":"盆栽美術館で埼玉大学留学生と実証実験","type":"posts"},{"content":"謹賀新年\n旧年中は格別のご厚情を賜り、誠にありがとうございました。 おかげ様をもちまして8月には創業10周年という節目を迎えることができました。 お客様、業務パートナーのみなさま、社員のご家族、お世話になった全ての関係者に深く感謝いたします。\n当社が提供する「研究開発支援サービス」は、情報通信技術研究の試作ソフトウェア開発をベースに、新規アルゴリズム検証、実験用アプリケーション提供、研究成果のアウトリーチ支援、研究コミュニティのWeb運営、学術研究プロジェクトのIT化支援まで、研究者の皆様の研究活動を幅広くサポートして参りました。\n本年も継続・新規合わせて多くの研究プロジェクトに携わらせていただく予定です。\nこのところは民間企業の業務部門からも相談を受ける機会が増えて参りました。導入予定の技術の先行調査やOSS（オープンソースソフトウェア）の事前検証等が多いです。研究の構想段階から社会実装までを見越してオーダーメイドでソフトウェアを組み上げていく中で積み上げてきた各種ノウハウが民間企業のビジネス創出の一助となれれば幸いです。\nまた、県内企業様と一緒に取り組んでいる埼玉大学様との産学官連携プロジェクトの一部がさいたま市のイノベーション技術創出支援事業に採択されました。昨年来、弊社が提供している ミュージアム向け展示解説アプリ「muBe」 を地域防災にも役立てるべく本年2月より県内の実際の施設を使って導入検証を進めて参ります。\n中期計画に掲げている、“新たな技術領域への挑戦”、“新たな顧客の開拓”、“新たなサービス形態の創造”を一歩一歩進めております。\n一方で、多数のご依頼により、サービス提供までのお時間をいただくことが増えてきています。 本年は、事業のより一層の効率化を図ると共に、新規採用やパートナーとの協力体制を強化し、一つでも多くのご依頼に応えられるように創意工夫をしていきたいと存じます。\n本年も引き続き、お引き立てとご愛顧のほどよろしくお願いし申し上げます。\n平成30年1月 株式会社ビットマイスター 代表取締役　笠原 勉\n","date":"2017/12/31","externalUrl":null,"permalink":"/posts/kasa/4458/","section":"Posts","summary":"謹賀新年\n旧年中は格別のご厚情を賜り、誠にありがとうございました。 おかげ様をもちまして8月には創業10周年という節目を迎えることができました。 お客様、業務パートナーのみなさま、社員のご家族、お世話になった全ての関係者に深く感謝いたします。\n当社が提供する「研究開発支援サービス」は、情報通信技術研究の試作ソフトウェア開発をベースに、新規アルゴリズム検証、実験用アプリケーション提供、研究成果のアウトリーチ支援、研究コミュニティのWeb運営、学術研究プロジェクトのIT化支援まで、研究者の皆様の研究活動を幅広くサポートして参りました。\n本年も継続・新規合わせて多くの研究プロジェクトに携わらせていただく予定です。\nこのところは民間企業の業務部門からも相談を受ける機会が増えて参りました。導入予定の技術の先行調査やOSS（オープンソースソフトウェア）の事前検証等が多いです。研究の構想段階から社会実装までを見越してオーダーメイドでソフトウェアを組み上げていく中で積み上げてきた各種ノウハウが民間企業のビジネス創出の一助となれれば幸いです。\nまた、県内企業様と一緒に取り組んでいる埼玉大学様との産学官連携プロジェクトの一部がさいたま市のイノベーション技術創出支援事業に採択されました。昨年来、弊社が提供している ミュージアム向け展示解説アプリ「muBe」 を地域防災にも役立てるべく本年2月より県内の実際の施設を使って導入検証を進めて参ります。\n中期計画に掲げている、“新たな技術領域への挑戦”、“新たな顧客の開拓”、“新たなサービス形態の創造”を一歩一歩進めております。\n一方で、多数のご依頼により、サービス提供までのお時間をいただくことが増えてきています。 本年は、事業のより一層の効率化を図ると共に、新規採用やパートナーとの協力体制を強化し、一つでも多くのご依頼に応えられるように創意工夫をしていきたいと存じます。\n本年も引き続き、お引き立てとご愛顧のほどよろしくお願いし申し上げます。\n平成30年1月 株式会社ビットマイスター 代表取締役　笠原 勉\n","title":"新年のご挨拶","type":"posts"},{"content":" 納涼の候、皆様におかれましてはますますご壮健のこととお慶び申し上げます。\n本日８月２０日をもちまして、株式会社ビットマイスターは創業１０周年を迎えることができました。 これもひとえに皆様のご支援、ご厚情の賜物と存じます。 顧客の皆様、業務パートナーの方々、社員のご家族、そして創業時お世話になったインキュベーションオフィス、起業支援機関、金融機関等、すべての関係者の方々に深く深く感謝申し上げます。\n２００７年の今日、‟最先端の研究成果を世に展開する”ことを目的として、研究活動をソフトウェア技術でサポートするべく「研究開発サービス」会社を立ち上げました。 工学系の情報通信研究の試作ソフトウェア開発の提供から始め、分析・計測用アプリケーションやシミュレーションソフトウェア開発、実証用Webシステム構築、検証用携帯端末・IoT装置の製造、そして研究発表時に必要となるデモンストレーションシステムの提案と、試行錯誤しながら徐々に受託する範囲を拡げてまいりました。 最近では、研究の構想段階から声をかけていただく機会も多くなり、新規アルゴリズム検証、OSS（オープンソースソフトウェア）の調査解析、導入予定技術の先行調査、研究成果の社会実装方法の検討等にも協力させていただいています。 さらに、各種研究コミュニティの運営保守、大学研究室のアウトリーチサポート、学術研究プロジェクトのIT化支援を通じ、研究環境を中長期的に支援する事業も行っています。\nまたサービス内容の拡充に伴い、提供先、対象分野も拡がりました。 国や大学等の公的研究機関に加えて、民間企業の研究所、新規開発を行うような部署からの相談も増えてきました。そして、対象分野においても、工学系の情報通信分野にとどまらず、情報学、物理学、計算科学、天文学、地球惑星科学、化学、科学教育・教育工学、博物館学等々、幅広い研究領域に携わらせていただいています。\nこの１０年で弊社が関わった研究プロジェクトは１００を超えます。提供した試作ソフトウェアや検証データは、研究者の方々の研究に使用され、その一部は論文となり、世界中の学会にて発表されています。また情報通信分野においては、国際的な標準化団体の標準規格文書への反映に寄与したものあります。近年では、改良を加えられたソフトウェアが災害現場や国際的なイベント会場で実際に使われる事例もでてきました。 弊社が提供してきたサービスによって‟最先端の研究成果が世に展開”され、その成果が科学技術の発展に少しでも貢献できたなら幸いです。\n１１年目となる今期は、積み上げてきたノウハウを大切にしつつ、“新たな技術領域への挑戦”、“新たな顧客の開拓”、“新たなサービス形態の創造”に取り組んでまいります。 主力の研究用ソフトウェアの受託開発にとどまらず、現在進行中の産学官連携のスキームを活用した協同開発に主体的に携わっていく他、自社内プロジェクトとして進めてきたサイエンスコミュニケーションに関わる研究や、一般向けスマートフォンアプリケーションプロダクトを社外に見える形で提供できるようにしていきたいと存じます。 今後ともお引き立てのほどよろしくお願いいたします。\n平成２９年８月２０日 株式会社ビットマイスター 代表取締役　笠原 勉\n","date":"2017/08/20","externalUrl":null,"permalink":"/posts/kasa/4399/","section":"Posts","summary":" 納涼の候、皆様におかれましてはますますご壮健のこととお慶び申し上げます。\n本日８月２０日をもちまして、株式会社ビットマイスターは創業１０周年を迎えることができました。 これもひとえに皆様のご支援、ご厚情の賜物と存じます。 顧客の皆様、業務パートナーの方々、社員のご家族、そして創業時お世話になったインキュベーションオフィス、起業支援機関、金融機関等、すべての関係者の方々に深く深く感謝申し上げます。\n２００７年の今日、‟最先端の研究成果を世に展開する”ことを目的として、研究活動をソフトウェア技術でサポートするべく「研究開発サービス」会社を立ち上げました。 工学系の情報通信研究の試作ソフトウェア開発の提供から始め、分析・計測用アプリケーションやシミュレーションソフトウェア開発、実証用Webシステム構築、検証用携帯端末・IoT装置の製造、そして研究発表時に必要となるデモンストレーションシステムの提案と、試行錯誤しながら徐々に受託する範囲を拡げてまいりました。 最近では、研究の構想段階から声をかけていただく機会も多くなり、新規アルゴリズム検証、OSS（オープンソースソフトウェア）の調査解析、導入予定技術の先行調査、研究成果の社会実装方法の検討等にも協力させていただいています。 さらに、各種研究コミュニティの運営保守、大学研究室のアウトリーチサポート、学術研究プロジェクトのIT化支援を通じ、研究環境を中長期的に支援する事業も行っています。\nまたサービス内容の拡充に伴い、提供先、対象分野も拡がりました。 国や大学等の公的研究機関に加えて、民間企業の研究所、新規開発を行うような部署からの相談も増えてきました。そして、対象分野においても、工学系の情報通信分野にとどまらず、情報学、物理学、計算科学、天文学、地球惑星科学、化学、科学教育・教育工学、博物館学等々、幅広い研究領域に携わらせていただいています。\nこの１０年で弊社が関わった研究プロジェクトは１００を超えます。提供した試作ソフトウェアや検証データは、研究者の方々の研究に使用され、その一部は論文となり、世界中の学会にて発表されています。また情報通信分野においては、国際的な標準化団体の標準規格文書への反映に寄与したものあります。近年では、改良を加えられたソフトウェアが災害現場や国際的なイベント会場で実際に使われる事例もでてきました。 弊社が提供してきたサービスによって‟最先端の研究成果が世に展開”され、その成果が科学技術の発展に少しでも貢献できたなら幸いです。\n１１年目となる今期は、積み上げてきたノウハウを大切にしつつ、“新たな技術領域への挑戦”、“新たな顧客の開拓”、“新たなサービス形態の創造”に取り組んでまいります。 主力の研究用ソフトウェアの受託開発にとどまらず、現在進行中の産学官連携のスキームを活用した協同開発に主体的に携わっていく他、自社内プロジェクトとして進めてきたサイエンスコミュニケーションに関わる研究や、一般向けスマートフォンアプリケーションプロダクトを社外に見える形で提供できるようにしていきたいと存じます。 今後ともお引き立てのほどよろしくお願いいたします。\n平成２９年８月２０日 株式会社ビットマイスター 代表取締役　笠原 勉\n","title":"創業１０周年の挨拶と御礼","type":"posts"},{"content":"Linuxのqdisc(Queueing DISCipline:キューイング規則)でデフォルトで使用されるpfifi_fastを調べていたら、IPv4ヘッダのTOSフィールドに設定されている値によって挙動が変わるという仕様でした。そこでTOSの値を変えながら、色々と測定してみました。\npfifo_fast # pfifo_fastは、以下のリンク先にもある通り、FIFOで3つのバンドを持ちます(バンド0、バンド1、バンド2)。各バンドにはFIFOが適用されますが、バンド0に待ちパケットがあるとバンド1は処理されず、バンド1に待ちパケットがあるとバンド2は処理されないという仕様のようです。\nシンプルな、クラスレスのキューイング規則\nカーネルは各パケットのIPv4ヘッダのTOSフィールドを参照し、「最小遅延」パケットをバンド0に入れるみたいです。 他のフィールドの意味は、以下のリンク先の内容が参考になります。\nレイヤ3スイッチのさまざまな機能\n他にも、「最大スループット」はバンド2へ、「最大信頼性」はバンド1へ、何もなければバンド1へといった規則があります。\nでは、実際のパケットのTOSの値を変えた場合、Linuxではどのような挙動を示すのでしょうか。それを確認するため、いくつかの条件で測定して結果を見てみようというのが今回の目的です。\niperf3 # iperf3はネットワークにTCPやUDPのトラフィックを流し、パフォーマンスを測定できるアプリケーションです。また、素晴らしいことに、\u0026quot;-S n\u0026quot;というオプションを使用すると、nとしてTOSの値が設定できます。よって今回は、iperf3を使いました。\nhttps://iperf.fr/iperf-download.php\n測定環境 # 1GbEで接続されたクライアントとサーバ上で、iperf3をポートを変えつつ2プロセス起動させ、それぞれ1GbpsのUDPトラフィックをサーバに投げさせました。片方のプロセスはTOSの値は変えずにデフォルトのまま。もう片方のプロセスのTOSの値を、変更なし、最小遅延、最大スループット、最大信頼性に変えてみました。\n2プロセスの実行開始はできる限り同じにしたかったのですが、測定の主目的ではないため、多少の誤差(\u0026lt;1sec)は大目にみてください。実行開始は、TOSを変えないプロセスを実行した後、TOSを変えるプロセスを実行しました。\n結果 # 変更なし # 変えない側のプロセス # $ sudo iperf3 -c 192.168.1.173 -u -b 1G -p 5201 Connecting to host 192.168.1.173, port 5201 [ 4] local 192.168.1.120 port 45708 connected to 192.168.1.173 port 5201 [ ID] Interval Transfer Bandwidth Total Datagrams [ 4] 0.00-1.00 sec 99.3 MBytes 833 Mbits/sec 12715 [ 4] 1.00-2.00 sec 56.7 MBytes 476 Mbits/sec 7257 [ 4] 2.00-3.00 sec 56.6 MBytes 475 Mbits/sec 7251 [ 4] 3.00-4.00 sec 56.6 MBytes 475 Mbits/sec 7251 [ 4] 4.00-5.00 sec 56.7 MBytes 475 Mbits/sec 7253 [ 4] 5.00-6.00 sec 56.6 MBytes 475 Mbits/sec 7250 [ 4] 6.00-7.00 sec 56.7 MBytes 475 Mbits/sec 7254 [ 4] 7.00-8.00 sec 56.6 MBytes 475 Mbits/sec 7251 [ 4] 8.00-9.00 sec 56.6 MBytes 475 Mbits/sec 7249 [ 4] 9.00-10.00 sec 56.6 MBytes 475 Mbits/sec 7249 - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams [ 4] 0.00-10.00 sec 609 MBytes 511 Mbits/sec 0.018 ms 1226/77977 (1.6%) [ 4] Sent 77977 datagrams 変える側のプロセス(変更なし条件なので変えない) # $ sudo iperf3 -c 192.168.1.173 -u -b 1G -p 5202 Connecting to host 192.168.1.173, port 5202 [ 4] local 192.168.1.120 port 59428 connected to 192.168.1.173 port 5202 [ ID] Interval Transfer Bandwidth Total Datagrams [ 4] 0.00-1.00 sec 51.0 MBytes 428 Mbits/sec 6533 [ 4] 1.00-2.00 sec 56.7 MBytes 476 Mbits/sec 7257 [ 4] 2.00-3.00 sec 56.7 MBytes 476 Mbits/sec 7256 [ 4] 3.00-4.00 sec 56.7 MBytes 475 Mbits/sec 7253 [ 4] 4.00-5.00 sec 56.7 MBytes 476 Mbits/sec 7258 [ 4] 5.00-6.00 sec 56.7 MBytes 475 Mbits/sec 7255 [ 4] 6.00-7.00 sec 56.7 MBytes 476 Mbits/sec 7256 [ 4] 7.00-8.00 sec 56.7 MBytes 476 Mbits/sec 7259 [ 4] 8.00-9.00 sec 56.7 MBytes 476 Mbits/sec 7261 [ 4] 9.00-10.00 sec 105 MBytes 880 Mbits/sec 13429 - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams [ 4] 0.00-10.00 sec 610 MBytes 511 Mbits/sec 0.125 ms 806/78016 (1%) [ 4] Sent 78016 datagrams 競合状態になった場合、同じくらいの送信量になりました。\n最小遅延 # 変えない側のプロセス # $ sudo iperf3 -c 192.168.1.173 -u -b 1G -p 5201 Connecting to host 192.168.1.173, port 5201 [ 4] local 192.168.1.120 port 59717 connected to 192.168.1.173 port 5201 [ ID] Interval Transfer Bandwidth Total Datagrams [ 4] 0.00-1.00 sec 79.5 MBytes 667 Mbits/sec 10176 [ 4] 1.00-2.00 sec 30.2 MBytes 253 Mbits/sec 3860 [ 4] 2.00-3.00 sec 30.2 MBytes 253 Mbits/sec 3863 [ 4] 3.00-4.00 sec 30.2 MBytes 253 Mbits/sec 3864 [ 4] 4.00-5.00 sec 33.6 MBytes 282 Mbits/sec 4307 [ 4] 5.00-6.00 sec 34.5 MBytes 289 Mbits/sec 4415 [ 4] 6.00-7.00 sec 34.0 MBytes 285 Mbits/sec 4352 [ 4] 7.00-8.00 sec 32.6 MBytes 273 Mbits/sec 4172 [ 4] 8.00-9.00 sec 31.7 MBytes 266 Mbits/sec 4061 [ 4] 9.00-10.00 sec 31.4 MBytes 263 Mbits/sec 4017 - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams [ 4] 0.00-10.00 sec 368 MBytes 309 Mbits/sec 0.101 ms 1229/47087 (2.6%) [ 4] Sent 47087 datagrams 変える側のプロセス # $ sudo iperf3 -c 192.168.1.173 -u -b 1G -p 5202 -S 16 Connecting to host 192.168.1.173, port 5202 [ 4] local 192.168.1.120 port 53699 connected to 192.168.1.173 port 5202 [ ID] Interval Transfer Bandwidth Total Datagrams [ 4] 0.00-1.00 sec 74.9 MBytes 628 Mbits/sec 9586 [ 4] 1.00-2.00 sec 83.2 MBytes 698 Mbits/sec 10646 [ 4] 2.00-3.00 sec 83.2 MBytes 698 Mbits/sec 10645 [ 4] 3.00-4.00 sec 81.6 MBytes 685 Mbits/sec 10448 [ 4] 4.00-5.00 sec 78.3 MBytes 657 Mbits/sec 10027 [ 4] 5.00-6.00 sec 79.3 MBytes 665 Mbits/sec 10151 [ 4] 6.00-7.00 sec 80.0 MBytes 671 Mbits/sec 10243 [ 4] 7.00-8.00 sec 81.4 MBytes 683 Mbits/sec 10420 [ 4] 8.00-9.00 sec 81.9 MBytes 687 Mbits/sec 10482 [ 4] 9.00-10.00 sec 102 MBytes 853 Mbits/sec 13013 - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams [ 4] 0.00-10.00 sec 825 MBytes 692 Mbits/sec 0.127 ms 0/105658 (0%) [ 4] Sent 105658 datagrams 最小遅延を設定したプロセスの方で、多くのデータが送信されるという結果になりました。 もっと偏るのではないかと予想していたのですが、変えない側のプロセスでもある程度のデータが送信されました。\n最大スループット # 変えない側のプロセス # $ sudo iperf3 -c 192.168.1.173 -u -b 1G -p 5201 Connecting to host 192.168.1.173, port 5201 [ 4] local 192.168.1.120 port 38351 connected to 192.168.1.173 port 5201 [ ID] Interval Transfer Bandwidth Total Datagrams [ 4] 0.00-1.00 sec 90.6 MBytes 760 Mbits/sec 11596 [ 4] 1.00-2.00 sec 83.2 MBytes 698 Mbits/sec 10648 [ 4] 2.00-3.00 sec 80.6 MBytes 676 Mbits/sec 10314 [ 4] 3.00-4.00 sec 79.6 MBytes 668 Mbits/sec 10189 [ 4] 4.00-5.00 sec 81.4 MBytes 682 Mbits/sec 10413 [ 4] 5.00-6.00 sec 82.2 MBytes 690 Mbits/sec 10528 [ 4] 6.00-7.00 sec 83.2 MBytes 698 Mbits/sec 10648 [ 4] 7.00-8.00 sec 83.2 MBytes 698 Mbits/sec 10648 [ 4] 8.00-9.00 sec 83.2 MBytes 698 Mbits/sec 10649 [ 4] 9.00-10.00 sec 83.2 MBytes 698 Mbits/sec 10648 - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams [ 4] 0.00-10.00 sec 830 MBytes 697 Mbits/sec 0.003 ms 1233/106279 (1.2%) [ 4] Sent 106279 datagrams 変える側のプロセス # $ sudo iperf3 -c 192.168.1.173 -u -b 1G -p 5202 -S 8 Connecting to host 192.168.1.173, port 5202 [ 4] local 192.168.1.120 port 48346 connected to 192.168.1.173 port 5202 [ ID] Interval Transfer Bandwidth Total Datagrams [ 4] 0.00-1.00 sec 27.2 MBytes 228 Mbits/sec 3483 [ 4] 1.00-2.00 sec 30.3 MBytes 254 Mbits/sec 3874 [ 4] 2.00-3.00 sec 35.3 MBytes 296 Mbits/sec 4523 [ 4] 3.00-4.00 sec 32.0 MBytes 268 Mbits/sec 4095 [ 4] 4.00-5.00 sec 32.0 MBytes 268 Mbits/sec 4094 [ 4] 5.00-6.00 sec 30.2 MBytes 253 Mbits/sec 3860 [ 4] 6.00-7.00 sec 30.2 MBytes 253 Mbits/sec 3860 [ 4] 7.00-8.00 sec 30.1 MBytes 253 Mbits/sec 3859 [ 4] 8.00-9.00 sec 30.1 MBytes 253 Mbits/sec 3859 [ 4] 9.00-10.00 sec 73.4 MBytes 616 Mbits/sec 9396 - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams [ 4] 0.00-10.00 sec 351 MBytes 294 Mbits/sec 0.132 ms 811/44900 (1.8%) [ 4] Sent 44900 datagrams 最大スループットのパケットは、バンド2に入れられるため、先程と逆の結果になりました。\n最大信頼性 # 変えない側のプロセス # $ sudo iperf3 -c 192.168.1.173 -u -b 1G -p 5201 Connecting to host 192.168.1.173, port 5201 [ 4] local 192.168.1.120 port 48531 connected to 192.168.1.173 port 5201 [ ID] Interval Transfer Bandwidth Total Datagrams [ 4] 0.00-1.00 sec 92.6 MBytes 776 Mbits/sec 11849 [ 4] 1.00-2.00 sec 56.7 MBytes 476 Mbits/sec 7263 [ 4] 2.00-3.00 sec 56.7 MBytes 476 Mbits/sec 7263 [ 4] 3.00-4.00 sec 56.7 MBytes 476 Mbits/sec 7256 [ 4] 4.00-5.00 sec 56.7 MBytes 476 Mbits/sec 7260 [ 4] 5.00-6.00 sec 56.8 MBytes 476 Mbits/sec 7265 [ 4] 6.00-7.00 sec 56.7 MBytes 476 Mbits/sec 7260 [ 4] 7.00-8.00 sec 56.7 MBytes 476 Mbits/sec 7258 [ 4] 8.00-9.00 sec 56.8 MBytes 476 Mbits/sec 7268 [ 4] 9.00-10.00 sec 56.7 MBytes 476 Mbits/sec 7257 - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams [ 4] 0.00-10.00 sec 603 MBytes 506 Mbits/sec 0.073 ms 1231/77198 (1.6%) [ 4] Sent 77198 datagrams 変える側のプロセス # $ sudo iperf3 -c 192.168.1.173 -u -b 1G -p 5202 -S 4 Connecting to host 192.168.1.173, port 5202 [ 4] local 192.168.1.120 port 53602 connected to 192.168.1.173 port 5202 [ ID] Interval Transfer Bandwidth Total Datagrams [ 4] 0.00-1.00 sec 51.0 MBytes 428 Mbits/sec 6529 [ 4] 1.00-2.00 sec 56.6 MBytes 475 Mbits/sec 7243 [ 4] 2.00-3.00 sec 56.6 MBytes 475 Mbits/sec 7250 [ 4] 3.00-4.00 sec 56.6 MBytes 475 Mbits/sec 7247 [ 4] 4.00-5.00 sec 56.6 MBytes 475 Mbits/sec 7246 [ 4] 5.00-6.00 sec 56.6 MBytes 475 Mbits/sec 7247 [ 4] 6.00-7.00 sec 56.6 MBytes 475 Mbits/sec 7250 [ 4] 7.00-8.00 sec 56.6 MBytes 475 Mbits/sec 7241 [ 4] 8.00-9.00 sec 56.6 MBytes 475 Mbits/sec 7246 [ 4] 9.00-10.00 sec 98.1 MBytes 823 Mbits/sec 12562 - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams [ 4] 0.00-10.00 sec 602 MBytes 505 Mbits/sec 0.121 ms 0/77060 (0%) [ 4] Sent 77060 datagrams 変更なしの条件と同様、どちらのプロセスでも同じくらいの送信量になりました。\nまとめ # Linuxのpfifo_fastを使用している場合、パケットのTOSの値を変えることで、パケットのキューイング先のバンドが変わり、バンドが小さい程、優先して送信されることが確認できました。\n裏で大量のデータが送信されている環境で、システムの重要なデータを送る際などに最小遅延を設定しておくと、届きやすくなる可能性があります。\n以上。\n","date":"2017/05/22","externalUrl":null,"permalink":"/posts/shiro/4365/","section":"Posts","summary":"Linuxのqdisc(Queueing DISCipline:キューイング規則)でデフォルトで使用されるpfifi_fastを調べていたら、IPv4ヘッダのTOSフィールドに設定されている値によって挙動が変わるという仕様でした。そこでTOSの値を変えながら、色々と測定してみました。","title":"Linuxにおけるpfifo_fastのTOSによる挙動","type":"posts"},{"content":"前回は、実際に送信されるMPTCPのMP_CAPABLEのパケットを眺めてみました。 今回は、ADD_ADDR、DSS、DSS FIN、MP_JOINのフォーマットと実際のパケットを見比べてみます。 MPTCPのオプションは、前回の内容を参考にしてください。\nADD_ADDR # ADD_ADDRは、使用可能なアドレスがある場合、そのアドレスの情報を対向ノードに知らせる際に使用されます。\nフォーマット # 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +---------------+---------------+-------+-------+---------------+ | Kind | Length |Subtype| IPVer | Address ID | +---------------+---------------+-------+-------+---------------+ | Address (IPv4 - 4 octets / IPv6 - 16 octets) | +-------------------------------+-------------------------------+ | Port (2 octets, optional) | +-------------------------------+ Figure 12: Add Address (ADD_ADDR) Option IPVerは、IPv4の場合は4、IPv6の場合は6が入ります。Portはポート番号を示し、これが含まれるかどうかはLengthから推測します。\nADD_ADDRパケット # 16:02:40.957874 IP (tos 0x0, ttl 64, id 23374, offset 0, flags [DF], proto TCP (6), length 68) 192.168.101.2.51080 \u0026gt; 192.168.109.2.5001: Flags [.], cksum 0x538c (incorrect -\u0026gt; 0x3225), seq 1, ack 1, win 229, options [nop,nop,TS val 1091645 ecr 1094284,mptcp add-addr id 2 192.168.105.2,mptcp dss ack 3821824259], length 0 0x0000: 0004 0001 0006 a036 9fa1 459f 0000 0800 0x0010: 4500 0044 5b4e 4000 4006 8c10 c0a8 6502 0x0020: c0a8 6d02 c788 1389 2fc6 f375 5007 007f 0x0030: c010 00e5 538c 0000 0101 080a 0010 a83d 0x0040: 0010 b28c 1e08 3402 c0a8 6902 1e08 2001 0x0050: e3cc 6903 TCPヘッダのデータオフセットが0xcなので、オプション領域を含むTCPヘッダの長さは、48バイトです。 最後の16バイト目からの8バイトがADD_ADDRの領域です。 0x1eがMPTCPオプション、0x08が長さで8バイト、Subtypeが3、IPVerが4、Address IDが2で、Addressが\u0026quot;c0a8 6902\u0026quot;で192.168.105.2です。\nこのパケットのTCPヘッダの長さは48バイトで、あと12バイトのデータを含むことができます。今回はIPv4アドレスだったのでサイズは4バイトでしたが、IPv6アドレスの場合は16バイトです。IPv6アドレスを通知する場合、TCPヘッダの最大長である60バイトが使われます。\nDSS # DSSは、MPTCPのデータのACKとシーケンス番号の情報を対向ノードに知らせるために使用されます。\nフォーマット # 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +---------------+---------------+-------+----------------------+ | Kind | Length |Subtype| (reserved) |F|m|M|a|A| +---------------+---------------+-------+----------------------+ | Data ACK (4 or 8 octets, depending on flags) | +--------------------------------------------------------------+ | Data sequence number (4 or 8 octets, depending on flags) | +--------------------------------------------------------------+ | Subflow Sequence Number (4 octets) | +-------------------------------+------------------------------+ | Data-Level Length (2 octets) | Checksum (2 octets) | +-------------------------------+------------------------------+ Figure 9: Data Sequence Signal (DSS) Option FはDATA_FINで、設定されている場合は送信者からの最後のデータが含まれていることを表します。 mはDSNが8オクテットかどうかを示し、設定されていない場合は4オクテットです。 MはDSN、SSN、DLL、Checksumがあるかどうかを示します。 aはData ACKが8オクテットかどうかを示し、設定されていない場合は4オクテットです。 AはData ACKが存在するかどうかを示します。\nDSSパケット # 16:02:40.958028 IP (tos 0x0, ttl 64, id 23378, offset 0, flags [DF], proto TCP (6), length 1500) 192.168.101.2.51080 \u0026gt; 192.168.109.2.5001: Flags [.], seq 25:1453, ack 1, win 229, options [nop,nop,TS val 1091645 ecr 1094284,mptcp dss ack 3821824259 seq 3197154524 subseq 25 len 1428 csum 0xb2ba], length 1428 0x0000: 0004 0001 0006 a036 9fa1 459f 0000 0800 0x0010: 4500 05dc 5b52 4000 4006 8674 c0a8 6502 0x0020: c0a8 6d02 c788 1389 2fc6 f38d 5007 007f 0x0030: d010 00e5 2ec7 0000 0101 080a 0010 a83d 0x0040: 0010 b28c 1e14 2005 e3cc 6903 be90 b4dc 0x0050: 0000 0019 0594 b2ba 0000 0000 0000 0001 0x0060: 0000 1389 0000 0000 0000 0000 ffff fe0c 0x0070: 3435 3637 3839 3031 3233 3435 3637 3839 0x0080: 3031 3233 3435 TCPヘッダのデータオフセットが0xdなので、オプション領域を含むTCPヘッダの長さは、52バイトです。 0x45バイト目からの20バイトがDSSの領域です。 フラグの領域は0x05なので、2進数では00101となり、MフラグとAフラグが設定されています。Aフラグが設定されているのでData ACKが存在し、またMフラグが設定されているので、DSN、SSN、DLL、Checksumが存在します。\nDSSのフォーマットに従って解釈すると、\u0026ldquo;0xe3cc6903\u0026quot;がData ACK、\u0026ldquo;0xbe90b4dc\u0026quot;がDSN、\u0026ldquo;0x00000019\u0026quot;がSSN、\u0026ldquo;0x0594\u0026quot;がDLL、\u0026ldquo;0xb2ba\u0026quot;がChecksumです。\nDSS FINパケット # ついでにDSSでFINフラグが設定されているパケットを見てみます。\n16:02:46.265276 IP (tos 0x0, ttl 63, id 25527, offset 0, flags [DF], proto TCP (6), length 72) 192.168.109.2.5001 \u0026gt; 192.168.106.2.48361: Flags [.], cksum 0x9d24 (correct), seq 1, ack 6224317, win 5805, options [nop,nop,TS val 1095613 ecr 1092968,mptcp dss fin ack 3221927133 seq 3821824259 subseq 0 len 1 csum 0x2d3a], length 0 0x0000: 0000 0001 0006 00a2 89f3 73c5 abdf 0800 0x0010: 4500 0048 63b7 4000 3f06 7fa3 c0a8 6d02 0x0020: c0a8 6a02 1389 bce9 4781 e03d 466e 497e 0x0030: d010 16ad 9d24 0000 0101 080a 0010 b7bd 0x0040: 0010 ad68 1e14 2015 c00a b4dd e3cc 6903 0x0050: 0000 0000 0001 2d3a TCPヘッダのデータオフセットが0xdなので、オプション領域を含むTCPヘッダの長さは、52バイトです。 先程と同様に、0x45バイト目からの20バイトがDSSの領域です。 フラグの領域は0x15なので、2進数では10101となり、Fフラグが設定されています。このパケットでMPTCPレベルでのFINが送られていることが分かります。\nMP_JOIN # MP_JOINオプションは、MPTCPの2本目以降のコネクションを確立する際に送受信されるSYN、SYN+ACK、ACKに付きます。2本目以降には第4のACKが送られますが、このパケットにはMP_JOINオプションは付きません。\nSYN+MP_JOINのフォーマット # 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +---------------+---------------+-------+-----+-+---------------+ | Kind | Length = 12 |Subtype| |B| Address ID | +---------------+---------------+-------+-----+-+---------------+ | Receiver\u0026#39;s Token (32 bits) | +---------------------------------------------------------------+ | Sender\u0026#39;s Random Number (32 bits) | +---------------------------------------------------------------+ Figure 5: Join Connection (MP_JOIN) Option (for Initial SYN) Bフラグは、このコネクションがバックアップ回線かどうかを示します。 Address IDはADD_ADDRで通知されたアドレスIDです。 TokenはMPTCPのコネクションを特定するために使用され、ランダム値はリプレイ攻撃を防ぐために使用されます。\n1本目のコネクションのAddress IDは通知されないので、暗黙的に0になります。\nSYN+MP_JOINのパケット # 16:02:40.979297 IP (tos 0x0, ttl 64, id 63400, offset 0, flags [DF], proto TCP (6), length 72) 192.168.105.2.43992 \u0026gt; 192.168.109.2.5001: Flags [S], cksum 0x5790 (incorrect -\u0026gt; 0xbfda), seq 3268763626, win 29200, options [mss 1460,sackOK,TS val 1091650 ecr 0,nop,wscale 7,mptcp join id 2 token 0x60804130 nonce 0x4341f13e], length 0 0x0000: 0004 0001 0006 a036 9fa1 459d 0000 0800 0x0010: 4500 0048 f7a8 4000 4006 ebb1 c0a8 6902 0x0020: c0a8 6d02 abd8 1389 c2d5 5fea 0000 0000 0x0030: d002 7210 5790 0000 0204 05b4 0402 080a 0x0040: 0010 a842 0000 0000 0103 0307 1e0c 1002 0x0050: 6080 4130 4341 f13e TCPヘッダのデータオフセットが0xdなので、オプション領域を含むTCPヘッダの長さは、52バイトです。 最後の12バイトがMP_JOINの領域です。 Bフラグは設定されておらず、Address IDが2、Tokenが\u0026quot;0x60804130\u0026rdquo;、ランダム値が\u0026quot;0x4341f13e\u0026quot;であることが分かります。\nSYN+ACK+MP_JOINのフォーマット # 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +---------------+---------------+-------+-----+-+---------------+ | Kind | Length = 16 |Subtype| |B| Address ID | +---------------+---------------+-------+-----+-+---------------+ | | | Sender\u0026#39;s Truncated HMAC (64 bits) | | | +---------------------------------------------------------------+ | Sender\u0026#39;s Random Number (32 bits) | +---------------------------------------------------------------+ Figure 6: Join Connection (MP_JOIN) Option (for Responding SYN/ACK) MP_JOINを含むSYNパケットを受け取った側は、SYN+ACK+MP_JOINパケットを返します。Tokenを知らなかったり、追加のコネクションの作成を拒否する場合はRSTパケットが飛びます。\nSYN+ACK+MP_JOINのパケット # 16:02:40.979591 IP (tos 0x0, ttl 63, id 45808, offset 0, flags [DF], proto TCP (6), length 76) 192.168.109.2.5001 \u0026gt; 192.168.105.2.43992: Flags [S.], cksum 0x3008 (correct), seq 2014172733, ack 3268763627, win 28560, options [mss 1460,sackOK,TS val 1094291 ecr 1091650,nop,wscale 7,mptcp join id 3 hmac 0x2ccfecb525bed145 nonce 0x4bb9fb37], length 0 0x0000: 0000 0001 0006 00a2 89f3 73c4 0000 0800 0x0010: 4500 004c b2f0 4000 3f06 3166 c0a8 6d02 0x0020: c0a8 6902 1389 abd8 780d d63d c2d5 5feb 0x0030: e012 6f90 3008 0000 0204 05b4 0402 080a 0x0040: 0010 b293 0010 a842 0103 0307 1e10 1003 0x0050: 2ccf ecb5 25be d145 4bb9 fb37 TCPヘッダのデータオフセットが0xeなので、オプション領域を含むTCPヘッダの長さは、56バイトです。 最後の16バイトがMP_JOINの領域です。 Bフラグは設定されておらず、Address IDが3、切り詰められたHMACが\u0026quot;0x2ccfecb525bed145\u0026rdquo;、ランダム値が\u0026quot;0x4bb9fb37\u0026quot;であることが分かります。\nACK+MP_JOINのフォーマット # 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +---------------+---------------+-------+-----------------------+ | Kind | Length = 24 |Subtype| (reserved) | +---------------+---------------+-------+-----------------------+ | | | | | Sender\u0026#39;s HMAC (160 bits) | | | | | +---------------------------------------------------------------+ Figure 7: Join Connection (MP_JOIN) Option (for Third ACK) 切り詰められていないHMACが送信されます。このパケットを送ったSocketはPRE_ESTABLISHED状態となり、第4のACKを待ちます。第4のACKが届くとESTABLISHED状態になりますが、それまではこのSocketではデータは送信されません。\nACK+MP_JOINのパケット # 16:02:40.979668 IP (tos 0x0, ttl 64, id 63401, offset 0, flags [DF], proto TCP (6), length 76) 192.168.105.2.43992 \u0026gt; 192.168.109.2.5001: Flags [.], cksum 0x5794 (incorrect -\u0026gt; 0xa02d), seq 1, ack 1, win 685, options [nop,nop,TS val 1091650 ecr 1094291,mptcp join hmac 0xf2e30d4fb4e4f4cc4562c61e59d9ce7a544c30f1], length 0 0x0000: 0004 0001 0006 a036 9fa1 459d 0000 0800 0x0010: 4500 004c f7a9 4000 4006 ebac c0a8 6902 0x0020: c0a8 6d02 abd8 1389 c2d5 5feb 780d d63e 0x0030: e010 02ad 5794 0000 0101 080a 0010 a842 0x0040: 0010 b293 1e18 1000 f2e3 0d4f b4e4 f4cc 0x0050: 4562 c61e 59d9 ce7a 544c 30f1 TCPヘッダのデータオフセットが0xeなので、オプション領域を含むTCPヘッダの長さは、56バイトです。 最後の24バイトがMP_JOINの領域です。 切り詰められていないHMACは、\u0026ldquo;0xf2e30d4fb4e4f4cc4562c61e59d9ce7a544c30f1\u0026quot;であることが分かります。\nまとめ # 前回と今回で、RFCで定義されているパケットフォーマットと実際のMPTCPのオプションが付いたパケットを見比べてきました。 他のTCPのオプションも含まれる状態での40バイトという長さの制約の中で、どうにかして新しい機能を実現させようとする強い意気込みが見て取れます。\nRFC 6824 は現在策定中の仕様なので、変更される可能性もありますが、既存のL2 Switchなどの機器に変更を加えることなく、新しい機能を追加しようという試みは非常に素晴らしいと思います。\n対向ノードがMPTCPに対応していない場合は通常のTCPで通信できますので、ちょっとでも興味のある方は是非是非MPTCPを試してみてください。\n","date":"2017/05/15","externalUrl":null,"permalink":"/posts/shiro/4358/","section":"Posts","summary":"前回は、実際に送信されるMPTCPのMP_CAPABLEのパケットを眺めてみました。\n今回は、ADD_ADDR、DSS、DSS FIN、MP_JOINのフォーマットと実際のパケットを見比べてみます。\nMPTCPのオプションは、前回の内容を参考にしてください。","title":"MPTCPのパケットを眺めてみる(その2)","type":"posts"},{"content":"前回は、 RFC 6824 で定義されているMPTCPについて紹介しました。 今回は、TCPのオプション領域でやり取りされるMPTCPのシグナリングパケットを簡単に説明し、RFCで定義されているオプションのフォーマットとMPTCPのMP_CAPABLEが付いた実際のパケットを見比べてみようと思います。\nTCPのオプション種別 # IANA によって割り当てられたTCPのオプション種別の番号は、30(0x1e)です。RFC 6824にも以下のように記載されています。\n+------+--------+-----------------------+-----------+ | Kind | Length | Meaning | Reference | +------+--------+-----------------------+-----------+ | 30 | N | Multipath TCP (MPTCP) | RFC 6824 | +------+--------+-----------------------+-----------+ Table 1: TCP Option Kind Numbers TCPヘッダに含まれるデータオフセットは4ビットの領域です。そのため、TCPヘッダの最大長は60バイト(15(0xf) * 4byte)になります。TCPヘッダのオプション領域を除く長さは20バイトなので、40バイトの領域が使用可能です。しかし、これにはMPTCP以外のオプション(例えば、SACKなど)も含まれるので、実際にはもっと少なくなります。\nMPTCPのオプションフォーマット # MPTCPのオプションフォーマットは以下の通りです。\n0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +---------------+---------------+-------+-----------------------+ | Kind | Length |Subtype| | +---------------+---------------+-------+ | | Subtype-specific data | | (variable length) | +---------------------------------------------------------------+ Figure 3: MPTCP Option Format 1バイトの種別、1バイトの長さ、4ビットのサブタイプ、サブタイプごとの可変長のデータで構成されています。\nサブタイプ # MPTCPのサブタイプは以下の通りです。\n+-------+--------------+----------------------------+---------------+ | Value | Symbol | Name | Reference | +-------+--------------+----------------------------+---------------+ | 0x0 | MP_CAPABLE | Multipath Capable | Section 3.1 | | 0x1 | MP_JOIN | Join Connection | Section 3.2 | | 0x2 | DSS | Data Sequence Signal (Data | Section 3.3 | | | | ACK and data sequence | | | | | mapping) | | | 0x3 | ADD_ADDR | Add Address | Section 3.4.1 | | 0x4 | REMOVE_ADDR | Remove Address | Section 3.4.2 | | 0x5 | MP_PRIO | Change Subflow Priority | Section 3.3.8 | | 0x6 | MP_FAIL | Fallback | Section 3.6 | | 0x7 | MP_FASTCLOSE | Fast Close | Section 3.5 | +-------+--------------+----------------------------+---------------+ Table 2: MPTCP Option Subtypes 今のところ、8つのサブタイプが定義されています。\nMP_CAPABLE # 1本目のTCPの経路を確立する際に送受信されるSYN、SYN+ACK、ACKにはMP_CAPABLEオプションが付きます。\nフォーマット # MP_CAPABLEのフォーマットは以下の通りです。\n1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +---------------+---------------+-------+-------+---------------+ | Kind | Length |Subtype|Version|A|B|C|D|E|F|G|H| +---------------+---------------+-------+-------+---------------+ | Option Sender\u0026#39;s Key (64 bits) | | | | | +---------------------------------------------------------------+ | Option Receiver\u0026#39;s Key (64 bits) | | (if option Length == 20) | | | +---------------------------------------------------------------+ Figure 4: Multipath Capable (MP_CAPABLE) Option SYN+MP_CAPABLEパケット # 16:02:40.938112 IP (tos 0x0, ttl 64, id 23372, offset 0, flags [DF], proto TCP (6), length 72) 192.168.101.2.51080 \u0026gt; 192.168.109.2.5001: Flags [S], cksum 0x5390 (incorrect -\u0026gt; 0xbf55), seq 801567604, win 29200, options [mss 1460,sackOK,TS val 1091640 ecr 0,nop,wscale 7,mptcp capable csum {0x2bbab124627e8eb8}], length 0 0x0000: 0004 0001 0006 a036 9fa1 459f 0000 0800 0x0010: 4500 0048 5b4c 4000 4006 8c0e c0a8 6502 0x0020: c0a8 6d02 c788 1389 2fc6 f374 0000 0000 0x0030: d002 7210 5390 0000 0204 05b4 0402 080a 0x0040: 0010 a838 0000 0000 0103 0307 1e0c 0081 0x0050: 2bba b124 627e 8eb8 TCPヘッダのデータオフセットが0xdなので、オプション領域を含むTCPヘッダの長さは、52バイトです。 最後の12バイトがMP_CAPABLEの領域です。 0x1eがMPTCPオプション、0x0cが長さで12バイト、Subtypeが0、Versionが0、AフラグとHフラグがセットされています。Aフラグでチェックサムが必要、HフラグでHMAC-SHA1を使うことが示されています。 残る8バイト(\u0026ldquo;2bba b124 627e 8eb8\u0026rdquo;)が送信者の鍵です。\nSYN+ACK+MP_CAPABLEパケット # 16:02:40.957722 IP (tos 0x0, ttl 62, id 0, offset 0, flags [DF], proto TCP (6), length 72) 192.168.109.2.5001 \u0026gt; 192.168.101.2.51080: Flags [S.], cksum 0xfb5d (correct), seq 1342636158, ack 801567605, win 28560, options [mss 1460,sackOK,TS val 1094284 ecr 1091640,nop,wscale 7,mptcp capable csum {0xfea9ec93d4d9d142}], length 0 0x0000: 0000 0001 0006 a036 9fa1 4733 0000 0800 0x0010: 4500 0048 0000 4000 3e06 e95a c0a8 6d02 0x0020: c0a8 6502 1389 c788 5007 007e 2fc6 f375 0x0030: d012 6f90 fb5d 0000 0204 05b4 0402 080a 0x0040: 0010 b28c 0010 a838 0103 0307 1e0c 0081 0x0050: fea9 ec93 d4d9 d142 これもTCPヘッダのデータオフセットが0xdなので、オプション領域を含むTCPヘッダの長さは、52バイトです。 最後の12バイトがMP_CAPABLEの領域です。 先程と同様、AフラグとHフラグが設定され、最後の8バイト(\u0026ldquo;fea9 ec93 d4d9 d142\u0026rdquo;)が送信者の鍵です。\nACK+MP_CAPABLEパケット # 16:02:40.957855 IP (tos 0x0, ttl 64, id 23373, offset 0, flags [DF], proto TCP (6), length 80) 192.168.101.2.51080 \u0026gt; 192.168.109.2.5001: Flags [.], cksum 0x5398 (incorrect -\u0026gt; 0xffc8), seq 1, ack 1, win 229, options [nop,nop,TS val 1091645 ecr 1094284,mptcp capable csum {0x2bbab124627e8eb8,0xfea9ec93d4d9d142},mptcp dss ack 3821824259], length 0 0x0000: 0004 0001 0006 a036 9fa1 459f 0000 0800 0x0010: 4500 0050 5b4d 4000 4006 8c05 c0a8 6502 0x0020: c0a8 6d02 c788 1389 2fc6 f375 5007 007f 0x0030: f010 00e5 5398 0000 0101 080a 0010 a83d 0x0040: 0010 b28c 1e14 0081 2bba b124 627e 8eb8 TCPヘッダのデータオフセットが0xfなので、オプション領域を含むTCPヘッダの長さは、最大の60バイトです。 最後の28バイト目からの20バイトがMP_CAPABLEの領域です。 送信者と受信者の鍵がそれぞれ入っています。\nここまでのパケットのやり取りで、MPTCPで使用される1本目のTCPのコネクションが確立されます。MPTCPがTCPのオプション領域を最大限に利用していることが見て取れます。\n以後、他に使用可能なIPアドレス/インタフェースがある場合、ADD_ADDRオプションやMP_JOINオプションによって2本目以降のTCPのコネクションが確立されますが、それらの内容については、次回見比べてみようと思います。\n","date":"2017/05/08","externalUrl":null,"permalink":"/posts/shiro/4348/","section":"Posts","summary":"前回は、 RFC 6824 で定義されているMPTCPについて紹介しました。 今回は、TCPのオプション領域でやり取りされるMPTCPのシグナリングパケットを簡単に説明し、RFCで定義されているオプションのフォーマットとMPTCPのMP_CAPABLEが付いた実際のパケットを見比べてみようと思います。","title":"MPTCPのパケットを眺めてみる(その1)","type":"posts"},{"content":"Multipath TCP(MPTCP)は、複数のIPアドレス/インタフェースを同時に使用して通信することで、通信のスループットを向上させるという機能です。また、あるIPアドレス/インタフェースが使用できない状態になっても別のIPアドレス/インタフェースを使うことで、通信を継続できるという耐障害性も兼ね備えています。\nそんな夢のようなMPTCPに触れる機会があったので、簡単にご紹介します。\nMPTCPの仕様 # MPTCPは、IETFによって標準化作業が進められていて、RFC 6824で仕様が定められています(現在はErrataがあるので要注意)。\nRFC 6824\n複数のリンクを束ねて使うリンクアグリゲーションという技術は、過去に実装した経験がありますが、この時はユーザランドでの実装でした。\nコグニティブ無線評価システム開発\nMPTCPのLinux実装 # RFC 6824で定義されているMPTCPがLinux Kernelに実装され、そのソースコードがインターネット上で公開されています。 現在(2017年4月)、公開されている安定版は、v0.91です。\nmultipath-tcp.org Github of mptcp\nMPTCPのデモ動画 # multipath-tcp.orgのページでは、MPTCPを使ったデモ動画も公開されています。 デモ動画では、Ethernet、Wi-Fi、3Gの3つのインタフェースがある状態でEthernetやWi-FiのON/OFFを切り替えても通信が継続する様子が紹介されています。\nMPTCPのシグナリング # MPTCPは、従来のTCPのオプション領域を使ってシグナリングの情報をやり取りします。このことで、既に世の中に存在する機器(L2 SwitchやL3 Switch, etc.)に対して機能を追加せずともMPTCPを動作させることができます。 もし、中間の経路に存在する機器によって、MPTCPのオプションが落とされたり、パケットの中身が書き換えられてしまう場合には、従来のTCPに後退して通信を継続することが可能です。\nMPTCPの利便性 # MPTCPは、クライアントとサーバの両者がMPTCP対応のLinux Kernelでありさえすれば、従来のTCPを使用するアプリケーションを変更することなく、そのまま使用することができます。 ユーザランド側のアプリケーションに見えるSocketとMPTCPを構成する複数のSocketを分離してカーネル内で処理することで、ユーザにアプリケーションの変更という手間を掛けさせずに、MPTCPを使うことが可能です。\nMPTCPのBackupモード # MPTCPには、Backupモードという、TCPレベルで通信可能(TCP_LOSS状態でない等)な他のSocketが無い場合に、そのSocketを使用して通信を行うといったモードも検討され、実装されています。 どこぞのSiriがMPTCPのBackupモードを使っていると一時期話題にも挙がりました。\niOSの「Siri」だけが使う特別なTCP by ITPro Multipath TCP を使って iOS 用のバックアップ接続を確立する by Apple\nまとめ # インターネット上のサーバとスマートフォンがMPTCPに対応するようになれば、日々の我々の通信は、気が付かないうちにMPTCPによって行われることになるでしょう。 そうすれば、今よりももっと高精細な映像が閲覧できたり、通信遅延によるフラストレーションが軽減されるかもしれません。\nおまけ # 参考までにMPTCPのSYN＋MP_CAPABLEのパケットを載せておきます。\n16:02:40.938112 IP (tos 0x0, ttl 64, id 23372, offset 0, flags [DF], proto TCP (6), length 72) 192.168.101.2.51080 \u0026gt; 192.168.109.2.5001: Flags [S], cksum 0x5390 (incorrect -\u0026gt; 0xbf55), seq 801567604, win 29200, options [mss 1460,sackOK,TS val 1091640 ecr 0,nop,wscale 7,mptcp capable csum {0x2bbab124627e8eb8}], length 0 0x0000: 0004 0001 0006 a036 9fa1 459f 0000 0800 0x0010: 4500 0048 5b4c 4000 4006 8c0e c0a8 6502 0x0020: c0a8 6d02 c788 1389 2fc6 f374 0000 0000 0x0030: d002 7210 5390 0000 0204 05b4 0402 080a 0x0040: 0010 a838 0000 0000 0103 0307 1e0c 0081 0x0050: 2bba b124 627e 8eb8 ちゃんとTCPヘッダのオプション領域が使われています。 以上。\n","date":"2017/04/27","externalUrl":null,"permalink":"/posts/shiro/4340/","section":"Posts","summary":"Multipath TCP(MPTCP)は、複数のIPアドレス/インタフェースを同時に使用して通信することで、通信のスループットを向上させるという機能です。また、あるIPアドレス/インタフェースが使用できない状態になっても別のIPアドレス/インタフェースを使うことで、通信を継続できるという耐障害性も兼ね備えています。\nそんな夢のようなMPTCPに触れる機会があったので、簡単にご紹介します。\n","title":"Multipath TCP(MPTCP)","type":"posts"},{"content":"最近Go言語でのシステム開発を行うことがあったのですが、ANYアドレスを使ったTCP待受でハマった挙動があったのでメモしておきます。\n今回を確認している環境はLinuxです。WindowsやMac OSは挙動が異なるかもしれません。\n環境 # version OS Ubuntu 16.04.2 LTS Kernel 4.4.0-62-generic Golang go1.8 linux/amd64 サンプル # 今回はHTTPサーバのサンプルです。\npackage main import ( \u0026#34;flag\u0026#34; \u0026#34;fmt\u0026#34; \u0026#34;net\u0026#34; \u0026#34;net/http\u0026#34; ) var proto = flag.String(\u0026#34;proto\u0026#34;, \u0026#34;tcp\u0026#34;, \u0026#34;proto(tcp|tcp4|tcp6)\u0026#34;) var addr = flag.String(\u0026#34;addr\u0026#34;, \u0026#34;0.0.0.0\u0026#34;, \u0026#34;listen addres\u0026#34;) var port = flag.Int(\u0026#34;port\u0026#34;, 9999, \u0026#34;listen port\u0026#34;) func main() { flag.Parse() fmt.Printf(\u0026#34;proto[%s]listen[%s:%d]\\n\u0026#34;, *proto, *addr, *port) tcpAddr, err := net.ResolveTCPAddr(*proto, fmt.Sprintf(\u0026#34;%s:%d\u0026#34;, *addr, *port)) if err != nil { panic(err) } listener, err := net.ListenTCP(*proto, tcpAddr) if err != nil { panic(err) } defer listener.Close() http.HandleFunc(\u0026#34;/\u0026#34;, handler) s := http.Server{} s.Serve(listener) } func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, \u0026#34;Hello, World\u0026#34;) } このソースをビルドして起動します。\n$ ./httptest proto[tcp]listen[0.0.0.0:9999] $ curl http://localhost:9999/ Hello, World ということでHTTP通信自体はなんら問題はないのですが、netstatでlistenソケットを表示すると\n$ netstat -lnt 稼働中のインターネット接続 (サーバのみ) Proto 受信-Q 送信-Q 内部アドレス 外部アドレス 状態 tcp6 0 0 :::9999 :::* LISTEN IPv4マップドアドレス(IPv4射影アドレス)が使われています。\n試しにIPv4とIPv6のループバックアドレスを指定すると以下になります。\nIPv4 # $ ./httptest　-addr 127.0.0.1 proto[tcp]listen[127.0.0.1:9999] $ netstat -lnt 稼働中のインターネット接続 (サーバのみ) Proto 受信-Q 送信-Q 内部アドレス 外部アドレス 状態 tcp 0 0 127.0.0.1:9999 0.0.0.0:* LISTEN IPv6 # $ ./httptest -addr [::1] proto[tcp]listen[[::1]:9999] $ netstat -lnt 稼働中のインターネット接続 (サーバのみ) Proto 受信-Q 送信-Q 内部アドレス 外部アドレス 状態 tcp6 0 0 ::1:9999 :::* LISTEN つまり「net.ListenTCP」に\u0026quot;tcp\u0026quot;を指定した場合、IPアドレスでIPv4かIPv6かを判断しているが、ANYアドレスの場合はIPv6でマップする仕様となっているようです。\n通常これで困るケースはないのですが、今回はTCP接続中のコネクション情報をnetstatではなくprocから直接検索する時にIPv4とIPv6では参照先が異なるために情報が見つからずマッチしないというケースに遭遇しました。 IPv4/proc/net/tcpIPv6/proc/net/tcp6 なお、procを直接参照せずともnetstatコマンドの引数でIPv4限定にした場合でも同じくマッチはしません。\nこれを回避するには「net.ListenTCP」に\u0026quot;tcp4\u0026quot;を指定します。\n$ ./httptest -proto tcp4 proto[tcp4]listen[0.0.0.0:9999] $ netstat -lnt 稼働中のインターネット接続 (サーバのみ) Proto 受信-Q 送信-Q 内部アドレス 外部アドレス 状態 tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN HTTPを使うケースで今回と同様の事で困るケースは殆どないと思いますが、その場合は「http.ListenAndServe」だと\u0026quot;tcp\u0026quot;固定なので上記コードのように「net.TCPListener」を自前で作成するようにすれば解決です。\n","date":"2017/02/27","externalUrl":null,"permalink":"/posts/oh/4312/","section":"Posts","summary":"最近Go言語でのシステム開発を行うことがあったのですが、ANYアドレスを使ったTCP待受でハマった挙動があったのでメモしておきます。","title":"Go言語でTCP待受にANYアドレスを指定した場合の挙動","type":"posts"},{"content":"謹賀新年\n旧年中は一方ならぬご愛顧を賜り誠にありがとうございました。 お客様、パートナーのみなさま、社員のご家族、お世話になった関係者の方々に深く感謝申し上げます。\n昨年は、お客様の研究計画の更新に伴った新たな研究テーマの技術検証業務を多く承りました。いずれも研究の初期段階ということもあり、いただいた要件を極力速いサイクルで検証し結果を提供することで、研究者の方々が今後の方向性を検討しやすいよう尽力いたしました。\nさらに、各種研究コミュニティの運営保守、大学のアウトリーチサポート、学術研究プロジェクトのIT化支援など、検証用試作ソフトウェアサービスに留まらない、研究環境を中長期的に支援していく事業を拡大させました。 おかげ様で、こうした研究活動に特化したサービスに興味を示して下さった新規の研究機関様からお声がけいただくことも増えてまいりました。\nまた、一連の研究支援業務にて培ってきた技術やノウハウを社会に展開するべく、自社アプリケーションサービス開発や、複数分野の産学官連携プロジェクトへの参加を積極的に実施してきました。国立科学博物館と協力して試行している、 ミュージアム向け展示解説アプリ「muBe」 は、今後も改善を重ねて利用館の拡大を図ってまいります。\n本年は7月に創業10年を迎える節目の年となります。 積み上げてきた実績をベースに“新たな技術領域へ挑戦”し、新たな顧客を開拓”して、更なる“新たなサービス形態の創造”していくことで、引き続き科学技術の発展と普及に寄与できればと存じます。\n本年も何卒お引き立てを賜りますようお願い申し上げます。\n平成29年1月 株式会社ビットマイスター 代表取締役　笠原勉\n","date":"2016/12/31","externalUrl":null,"permalink":"/posts/kasa/4304/","section":"Posts","summary":"謹賀新年\n旧年中は一方ならぬご愛顧を賜り誠にありがとうございました。 お客様、パートナーのみなさま、社員のご家族、お世話になった関係者の方々に深く感謝申し上げます。\n昨年は、お客様の研究計画の更新に伴った新たな研究テーマの技術検証業務を多く承りました。いずれも研究の初期段階ということもあり、いただいた要件を極力速いサイクルで検証し結果を提供することで、研究者の方々が今後の方向性を検討しやすいよう尽力いたしました。\nさらに、各種研究コミュニティの運営保守、大学のアウトリーチサポート、学術研究プロジェクトのIT化支援など、検証用試作ソフトウェアサービスに留まらない、研究環境を中長期的に支援していく事業を拡大させました。 おかげ様で、こうした研究活動に特化したサービスに興味を示して下さった新規の研究機関様からお声がけいただくことも増えてまいりました。\nまた、一連の研究支援業務にて培ってきた技術やノウハウを社会に展開するべく、自社アプリケーションサービス開発や、複数分野の産学官連携プロジェクトへの参加を積極的に実施してきました。国立科学博物館と協力して試行している、 ミュージアム向け展示解説アプリ「muBe」 は、今後も改善を重ねて利用館の拡大を図ってまいります。\n本年は7月に創業10年を迎える節目の年となります。 積み上げてきた実績をベースに“新たな技術領域へ挑戦”し、新たな顧客を開拓”して、更なる“新たなサービス形態の創造”していくことで、引き続き科学技術の発展と普及に寄与できればと存じます。\n本年も何卒お引き立てを賜りますようお願い申し上げます。\n平成29年1月 株式会社ビットマイスター 代表取締役　笠原勉\n","title":"新年のご挨拶","type":"posts"},{"content":"拝啓 残暑の候、皆様におかれましては益々ご壮健のこととお慶び申し上げます。 平素は、格別のお引き立てをいただき、厚く御礼お申し上げます。\n本日8月20日をもちまして、株式会社ビットマイスターは創立9周年を迎えることができました。これもひとえに皆様のご支援の賜物と心より感謝いたします。 第9期は、創業来、協力させていただいていた研究プロジェクト多くが中期計画の更新時期となり、新たな研究テーマに取り組み始められたことから、弊社もそれぞれの新規プロジェクトに対応した技術コンサルティング、検証用試作ソフトウェアの提供をしてまいりました。研究の初期段階における雲をつかむようなお話から、求められる要件をひとつひとつソフトウェアに落とし込んでいく過程は面白くもあり難しくもあります。 弊社の提案した方式、提供したソフトウェアが今後の研究に少しでもお役に立てたなら幸いです。\nまた、第8期より掲げてきた3つの中長期目標、“新たな技術領域への挑戦”、“新たな顧客の開拓”、“新たなサービス形態の創造”、の取り組みの一環として、一般向け自社アプリケーションサービスの試行を開始したほか、防災、農業、医療・介護といった複数のテーマ別の産学官連携プロジェクトへ参画し、保有技術の展開と、新規業務ノウハウの吸収に努めてまいりました。 創業10年目という会社にとってひとつの大きな節目を迎えるにあたり、色々試行錯誤した期でもありました。\n第10期は、研究用のソフトウェアの受託開発に加えて、大学研究プロジェクトのIT化サポート、各種研究コミュニティの保守運営、そして博物館を始めとした学習教育機関向けのアプリケーションサービスの提供等、研究開発ITサービスの更なる展開を図ります。引き続き、本サービスの提供を通じて科学技術の発展と普及に寄与していきたいと存じます。\n何卒、より一層のご指導、ご鞭撻、ご協力を賜りますよう、宜しくお願い申し上げます。\n敬具\n平成28年8月20日 株式会社ビットマイスター 代表取締役　笠原 勉\n","date":"2016/08/20","externalUrl":null,"permalink":"/posts/kasa/4201/","section":"Posts","summary":"拝啓 残暑の候、皆様におかれましては益々ご壮健のこととお慶び申し上げます。 平素は、格別のお引き立てをいただき、厚く御礼お申し上げます。\n本日8月20日をもちまして、株式会社ビットマイスターは創立9周年を迎えることができました。これもひとえに皆様のご支援の賜物と心より感謝いたします。 第9期は、創業来、協力させていただいていた研究プロジェクト多くが中期計画の更新時期となり、新たな研究テーマに取り組み始められたことから、弊社もそれぞれの新規プロジェクトに対応した技術コンサルティング、検証用試作ソフトウェアの提供をしてまいりました。研究の初期段階における雲をつかむようなお話から、求められる要件をひとつひとつソフトウェアに落とし込んでいく過程は面白くもあり難しくもあります。 弊社の提案した方式、提供したソフトウェアが今後の研究に少しでもお役に立てたなら幸いです。\nまた、第8期より掲げてきた3つの中長期目標、“新たな技術領域への挑戦”、“新たな顧客の開拓”、“新たなサービス形態の創造”、の取り組みの一環として、一般向け自社アプリケーションサービスの試行を開始したほか、防災、農業、医療・介護といった複数のテーマ別の産学官連携プロジェクトへ参画し、保有技術の展開と、新規業務ノウハウの吸収に努めてまいりました。 創業10年目という会社にとってひとつの大きな節目を迎えるにあたり、色々試行錯誤した期でもありました。\n第10期は、研究用のソフトウェアの受託開発に加えて、大学研究プロジェクトのIT化サポート、各種研究コミュニティの保守運営、そして博物館を始めとした学習教育機関向けのアプリケーションサービスの提供等、研究開発ITサービスの更なる展開を図ります。引き続き、本サービスの提供を通じて科学技術の発展と普及に寄与していきたいと存じます。\n何卒、より一層のご指導、ご鞭撻、ご協力を賜りますよう、宜しくお願い申し上げます。\n敬具\n平成28年8月20日 株式会社ビットマイスター 代表取締役　笠原 勉\n","title":"創立9周年の挨拶","type":"posts"},{"content":"元々は予定していなかったSHA関連ネタですが、折角なので残しておきます。\nSHAの仕様が記述されているお馴染みの FIPS 180-4 には、SHA-512/tというSHA-512をベースに、SHA-512の出力を任意のtビットに切り詰めるハッシュ関数についての記述があります。\nその中にSHA-512/tのIV(初期化ベクトル、initialization vector)の生成方法も記述されていますが、いまいちピンとこなかったので調査を行いました。 その調査の結果を、備忘録代わりに残しておきます。\nこれを読んだあなたは、384を除く任意のtビット(t\u0026lt;512)のハッシュ関数が作れるようになるはずです(例えば、SHA-512/448とか)。\nFIPS 180-4に記述のある初期化ベクトル生成方法は以下のようになっています。 また、SHA-512/224とSHA-512/256という承認されたハッシュアルゴリズムの初期化ベクトルについても記述があります(他のアルゴリズムは必要性が出てきたら明記されるみたいです)。 SHA-512/t IV Generation Functionは、要は、SHA-512の初期化ベクトル8つそれぞれと0xa5a5a5a5a5a5a5a5で排他的論理和を取った値を初期化ベクトルとして持つSHA-512に対して、新しく追加したいtを文字列として含む(例えば、\u0026ldquo;SHA-512/448\u0026rdquo;)文字列のメッセージダイジェスト(512bit)を出力させ、それらを64bitごとに8つに分割し、SHA-512/448の8つの初期化ベクトルとして使用するということが記述されています。\n・・・。\nちょっと何言っているか分かりませんね。\nそれでは順番に見ていきます。\n1．SHA-512の初期化ベクトルとの排他的論理和を得る # SHA-512の8つの初期化ベクトルと0xa5a5a5a5a5a5a5a5との排他的論理和を取って、出力させた結果は以下の通りです。\n$ ./main i=[0], h0=0x6a09e667f3bcc908, xor=0xcfac43c256196cad i=[1], h1=0xbb67ae8584caa73b, xor=0x1ec20b20216f029e i=[2], h2=0x3c6ef372fe94f82b, xor=0x99cb56d75b315d8e i=[3], h3=0xa54ff53a5f1d36f1, xor=0xea509ffab89354 i=[4], h4=0x510e527fade682d1, xor=0xf4abf7da08432774 i=[5], h5=0x9b05688c2b3e6c1f, xor=0x3ea0cd298e9bc9ba i=[6], h6=0x1f83d9abfb41bd6b, xor=0xba267c0e5ee418ce i=[7], h7=0x5be0cd19137e2179, xor=0xfe4568bcb6db84dc 2．排他的論理和の結果を初期化ベクトルとして持つSHA-512の作成 # GitHubから取ってきたopensslのソースコードを変更して、ビルドします。以下ではsha/という作業ディレクトリを作成し、その配下で行っています。\n$ mkdir sha $ cd sha $ git clone https://github.com/openssl/openssl.git $ cd openssl/crypto/sha/ $ vi sha512.c SHA512_Init関数を以下のように変更します。\nint SHA512_Init(SHA512_CTX *c) { /* c-\u0026gt;h[0] = U64(0x6a09e667f3bcc908); c-\u0026gt;h[1] = U64(0xbb67ae8584caa73b); c-\u0026gt;h[2] = U64(0x3c6ef372fe94f82b); c-\u0026gt;h[3] = U64(0xa54ff53a5f1d36f1); c-\u0026gt;h[4] = U64(0x510e527fade682d1); c-\u0026gt;h[5] = U64(0x9b05688c2b3e6c1f); c-\u0026gt;h[6] = U64(0x1f83d9abfb41bd6b); c-\u0026gt;h[7] = U64(0x5be0cd19137e2179); */ c-\u0026gt;h[0] = U64(0xcfac43c256196cad); c-\u0026gt;h[1] = U64(0x1ec20b20216f029e); c-\u0026gt;h[2] = U64(0x99cb56d75b315d8e); c-\u0026gt;h[3] = U64(0xea509ffab89354); c-\u0026gt;h[4] = U64(0xf4abf7da08432774); c-\u0026gt;h[5] = U64(0x3ea0cd298e9bc9ba); c-\u0026gt;h[6] = U64(0xba267c0e5ee418ce); c-\u0026gt;h[7] = U64(0xfe4568bcb6db84dc); c-\u0026gt;Nl = 0; c-\u0026gt;Nh = 0; c-\u0026gt;num = 0; c-\u0026gt;md_len = SHA512_DIGEST_LENGTH; return 1; } ビルドします。(コンパイラや依存ライブラリ等が必要な場合は適宜入れてください。)\n$ cd ../../ $ ./config $ make $ cd .. 3．メッセージダイジェストの出力 # 2で作成したSHA-512に対して、\u0026ldquo;SHA-512/448\u0026quot;という文字列のメッセージダイジェストを出力させるため、以下のようなプログラム(適当ですみません。)を作成します。\n$ vi test.c #include \u0026lt;stdio.h\u0026gt; #include \u0026lt;string.h\u0026gt; #include \u0026lt;openssl/sha.h\u0026gt; int main(int argc, char *argv[]) { unsigned char data[] = \u0026#34;SHA-512/448\u0026#34;; unsigned char digest[SHA512_DIGEST_LENGTH]; unsigned char md[SHA512_DIGEST_LENGTH*2+1]; int i; SHA512((unsigned char*)\u0026amp;data, strlen(data), (unsigned char*)\u0026amp;digest); for (i = 0; i \u0026lt; SHA512_DIGEST_LENGTH; i++) { sprintf(\u0026amp;md[i*2], \u0026#34;%02x\u0026#34;, (unsigned int)digest[i]); } printf(\u0026#34;SHA512 digest: %s\\n\u0026#34;, md); return 0; } 作成したtest.cを、2で作成したスタティックライブラリを使って、コンパイル、リンクします。\n$ gcc -o test -I ./openssl/include/ test.c ./openssl/libcrypto.a 実行します。\n$ ./test SHA512 digest: 8bdbdbb57b33f2bb54b6d1373964ccb9044d2d381ae3eb763d40619ccc846c46190000505524b786ae6afff7d04167eb12bdbffddbf2e23071a770ebff1126ee 出力された、\u0026ldquo;8bdbdbb\u0026hellip;.1126ee\u0026quot;がメッセージダイジェストです。 これを64bitごと(16文字ずつ)に分割し、8つの初期化ベクトルとして使用すれば、SHA-512/tの仕様に合った、SHA-512/448を作成することができます。\n今回適当に例に挙げたSHA-512/448ですが、将来 NIST(アメリカ国立標準技術研究所) がSHA-512/448が必要だと判断した場合、その初期化ベクトルは、以下の内容と一致するはずです。\nH0 = 8bdbdbb57b33f2bb H1 = 54b6d1373964ccb9 H2 = 044d2d381ae3eb76 H3 = 3d40619ccc846c46 H4 = 190000505524b786 H5 = ae6afff7d04167eb H6 = 12bdbffddbf2e230 H7 = 71a770ebff1126ee 念のため、FIPS 180-4に記述されているSHA-512/224とSHA-512/256の値と一致するか確かめておきます。\nSHA-512/224 # $ ./test SHA512 digest: 8c3d37c819544da273e1996689dcd4d61dfab7ae32ff9c82679dd514582f9fcf0f6d2b697bd44da877e36f7304c489423f9d85a86a1d36c81112e6ad91d692a1 64bitごとに8つに分けると、\nH0 = 8c3d37c819544da2 H1 = 73e1996689dcd4d6 H2 = 1dfab7ae32ff9c82 H3 = 679dd514582f9fcf H4 = 0f6d2b697bd44da8 H5 = 77e36f7304c48942 H6 = 3f9d85a86a1d36c8 H7 = 1112e6ad91d692a1 SHA-512/256 # $ ./test SHA512 digest: 22312194fc2bf72c9f555fa3c84c64c22393b86b6f53b151963877195940eabd96283ee2a88effe3be5e1e25538639922b0199fc2c85b8aa0eb72ddc81c52ca2 64bitごとに8つに分けると、\nH0 = 22312194fc2bf72c H1 = 9f555fa3c84c64c2 H2 = 2393b86b6f53b151 H3 = 963877195940eabd H4 = 96283ee2a88effe3 H5 = be5e1e2553863992 H6 = 2b0199fc2c85b8aa H7 = 0eb72ddc81c52ca2 どちらの場合も大文字小文字の違いはあれど、値は完全に一致しているので、SHA-512/t IV Generation Functionの理解は、問題なさそうです。\nあとは、SHA-512のメッセージダイジェストを448bitに切り詰める処理を書けば、SHA-512/tの仕様に準拠するSHA-512/448が作成できます。 この内容を読んでやってみようという気になった人は、是非試してみてください。\n","date":"2016/07/20","externalUrl":null,"permalink":"/posts/shiro/4190/","section":"Posts","summary":"元々は予定していなかったSHA関連ネタですが、折角なので残しておきます。","title":"SHA-512/tのIV(初期化ベクトル)生成方法","type":"posts"},{"content":"前々回はSHA-1、 前回はSHA-256 の仕様と実装について比較したので、今回はSHA-512について比較してみようと思います。\n今回の比較に使用するソースコードは、前回同様、GitHubにあるopensslのソースコードを使用しました。その中の、crypto/sha/sha512.cです。\nopenssl GitHub 念のため、FIPS 180-4のリンクも置いておきます。\nFIPS 180-4 2015/08 SHAの共通点やWordの操作については、 SHA-1編 を参照してください。\nSHA-512の仕様と実装の比較 # 1．ブロックサイズやWordサイズ # SHA-512のブロックサイズは1024bits、Wordサイズは64bitsです。 各ブロックは16個の64bitに分けられて処理されます。\n2．ハッシュの初期値 # FIPS 180-4で記述されているSHA-512の初期値は以下です。 crypto/sha/sha512.cに設定されている値と一致します。\n81 int SHA512_Init(SHA512_CTX *c) 82 { 83 c-\u0026gt;h[0] = U64(0x6a09e667f3bcc908); 84 c-\u0026gt;h[1] = U64(0xbb67ae8584caa73b); 85 c-\u0026gt;h[2] = U64(0x3c6ef372fe94f82b); 86 c-\u0026gt;h[3] = U64(0xa54ff53a5f1d36f1); 87 c-\u0026gt;h[4] = U64(0x510e527fade682d1); 88 c-\u0026gt;h[5] = U64(0x9b05688c2b3e6c1f); 89 c-\u0026gt;h[6] = U64(0x1f83d9abfb41bd6b); 90 c-\u0026gt;h[7] = U64(0x5be0cd19137e2179); 91 92 c-\u0026gt;Nl = 0; 93 c-\u0026gt;Nh = 0; 94 c-\u0026gt;num = 0; 95 c-\u0026gt;md_len = SHA512_DIGEST_LENGTH; 96 return 1; 97 } 3．定数 # FIPS 180-4で記述されているSHA-512の定数は以下です。 80個の64bitの定数を使用します。これらはSHA-384、SHA-512/224、SHA-512/256でも同じ値を使用するようです。\ncrypto/sha/sha512.cでも同じ値が設定されています。\n279 static const SHA_LONG64 K512[80] = { 280 U64(0x428a2f98d728ae22), U64(0x7137449123ef65cd), 281 U64(0xb5c0fbcfec4d3b2f), U64(0xe9b5dba58189dbbc), 282 U64(0x3956c25bf348b538), U64(0x59f111f1b605d019), 283 U64(0x923f82a4af194f9b), U64(0xab1c5ed5da6d8118), 284 U64(0xd807aa98a3030242), U64(0x12835b0145706fbe), 285 U64(0x243185be4ee4b28c), U64(0x550c7dc3d5ffb4e2), 286 U64(0x72be5d74f27b896f), U64(0x80deb1fe3b1696b1), 287 U64(0x9bdc06a725c71235), U64(0xc19bf174cf692694), 288 U64(0xe49b69c19ef14ad2), U64(0xefbe4786384f25e3), 289 U64(0x0fc19dc68b8cd5b5), U64(0x240ca1cc77ac9c65), 290 U64(0x2de92c6f592b0275), U64(0x4a7484aa6ea6e483), 291 U64(0x5cb0a9dcbd41fbd4), U64(0x76f988da831153b5), 292 U64(0x983e5152ee66dfab), U64(0xa831c66d2db43210), 293 U64(0xb00327c898fb213f), U64(0xbf597fc7beef0ee4), 294 U64(0xc6e00bf33da88fc2), U64(0xd5a79147930aa725), 295 U64(0x06ca6351e003826f), U64(0x142929670a0e6e70), 296 U64(0x27b70a8546d22ffc), U64(0x2e1b21385c26c926), 297 U64(0x4d2c6dfc5ac42aed), U64(0x53380d139d95b3df), 298 U64(0x650a73548baf63de), U64(0x766a0abb3c77b2a8), 299 U64(0x81c2c92e47edaee6), U64(0x92722c851482353b), 300 U64(0xa2bfe8a14cf10364), U64(0xa81a664bbc423001), 301 U64(0xc24b8b70d0f89791), U64(0xc76c51a30654be30), 302 U64(0xd192e819d6ef5218), U64(0xd69906245565a910), 303 U64(0xf40e35855771202a), U64(0x106aa07032bbd1b8), 304 U64(0x19a4c116b8d2d0c8), U64(0x1e376c085141ab53), 305 U64(0x2748774cdf8eeb99), U64(0x34b0bcb5e19b48a8), 306 U64(0x391c0cb3c5c95a63), U64(0x4ed8aa4ae3418acb), 307 U64(0x5b9cca4f7763e373), U64(0x682e6ff3d6b2b8a3), 308 U64(0x748f82ee5defb2fc), U64(0x78a5636f43172f60), 309 U64(0x84c87814a1f0ab72), U64(0x8cc702081a6439ec), 310 U64(0x90befffa23631e28), U64(0xa4506cebde82bde9), 311 U64(0xbef9a3f7b2c67915), U64(0xc67178f2e372532b), 312 U64(0xca273eceea26619c), U64(0xd186b8c721c0c207), 313 U64(0xeada7dd6cde0eb1e), U64(0xf57d4f7fee6ed178), 314 U64(0x06f067aa72176fba), U64(0x0a637dc5a2c898a6), 315 U64(0x113f9804bef90dae), U64(0x1b710b35131c471b), 316 U64(0x28db77f523047d84), U64(0x32caab7b40c72493), 317 U64(0x3c9ebe0a15c9bebc), U64(0x431d67c49c100d4c), 318 U64(0x4cc5d4becb3e42b6), U64(0x597f299cfc657e2a), 319 U64(0x5fcb6fab3ad6faec), U64(0x6c44198c4a475817) 320 }; 4．関数 # FIPS 180-4で記述されているSHA-512の関数は以下です。 SHA-256と非常によく似ていますが、SHA-512のWordサイズが64bitだという点には注意が必要です。\ncrypto/sha/sha512.cでは以下のように定義されています。\n404 # ifndef ROTR 405 # define ROTR(x,s) (((x)\u0026gt;\u0026gt;s) | (x)\u0026lt;\u0026lt;(64-s)) 406 # endif 407 # define Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39)) 408 # define Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41)) 409 # define sigma0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)\u0026gt;\u0026gt;7)) 410 # define sigma1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)\u0026gt;\u0026gt;6)) 411 # define Ch(x,y,z) (((x) \u0026amp; (y)) ^ ((~(x)) \u0026amp; (z))) 412 # define Maj(x,y,z) (((x) \u0026amp; (y)) ^ ((x) \u0026amp; (z)) ^ ((y) \u0026amp; (z))) SHA-512の場合は、ROTRに渡す値がFIPS 180-4に記述されている通りに実装されていることが分かります。\n5．メッセージスケジュールの生成 # FIPS 180-4で記述されているSHA-512のメッセージスケジュールの生成方法は以下です。 σ関数の中身やラウンド数が違いますが、形自体はSHA-256の時とよく似ています。\ncrypto/sha/sha512.cでは以下のように定義されています。\n497 for (i = 0; i \u0026lt; 16; i++) { 498 # ifdef B_ENDIAN 499 T1 = X[i] = W[i]; 500 # else 501 T1 = X[i] = PULL64(W[i]); 502 # endif ...(中略)... 515 for (; i \u0026lt; 80; i++) { 516 s0 = X[(i + 1) \u0026amp; 0x0f]; 517 s0 = sigma0(s0); 518 s1 = X[(i + 14) \u0026amp; 0x0f]; 519 s1 = sigma1(s1); 520 521 T1 = X[i \u0026amp; 0xf] += s0 + s1 + X[(i + 9) \u0026amp; 0xf]; SHA-256の時の同じように、iが16まではそのままの値を使用し、16から80までは0xfとマスクを取った位置にある要素からWtを算出しています。その際に使用する要素は、0xfを法として合同な位置にある要素である点には注意が必要です。\n6．ハッシュ値の計算 # FIPS 180-4に記述されている方法は、以下です。 crypto/sha/sha512.cの該当部分は以下です。\n497 for (i = 0; i \u0026lt; 16; i++) { 498 # ifdef B_ENDIAN 499 T1 = X[i] = W[i]; 500 # else 501 T1 = X[i] = PULL64(W[i]); 502 # endif 503 T1 += h + Sigma1(e) + Ch(e, f, g) + K512[i]; 504 T2 = Sigma0(a) + Maj(a, b, c); 505 h = g; 506 g = f; 507 f = e; 508 e = d + T1; 509 d = c; 510 c = b; 511 b = a; 512 a = T1 + T2; 513 } 514 515 for (; i \u0026lt; 80; i++) { 516 s0 = X[(i + 1) \u0026amp; 0x0f]; 517 s0 = sigma0(s0); 518 s1 = X[(i + 14) \u0026amp; 0x0f]; 519 s1 = sigma1(s1); 520 521 T1 = X[i \u0026amp; 0xf] += s0 + s1 + X[(i + 9) \u0026amp; 0xf]; 522 T1 += h + Sigma1(e) + Ch(e, f, g) + K512[i]; 523 T2 = Sigma0(a) + Maj(a, b, c); 524 h = g; 525 g = f; 526 f = e; 527 e = d + T1; 528 d = c; 529 c = b; 530 b = a; 531 a = T1 + T2; 532 } こちらもSHA-256の時と同じように、iが16まで処理と16から80までの処理では、メッセージスケジュールを生成している部分だけが異なりますが、その他は全て同じです。 SHA-512も、FIPS 180-4のアルゴリズムがそのままの形で実装されています。 SHA-256同様、変数のdからe、hからaに移る時に値が変っていくイメージです。\n最後に64bitの8つの変数の値を並べることで、512bitのメッセージダイジェストが得られます。\n以上がSHA-512の仕様とその実装の比較でした。\nこれまでSHA-1、SHA-256、SHA-512の仕様と実装を比較してきて、今まではブラックボックスでしかなかったSHAを詳しく把握することができました。 これらの一連の記事がどなたかの理解の役に立てば幸いです。\n","date":"2016/07/19","externalUrl":null,"permalink":"/posts/shiro/4175/","section":"Posts","summary":"前々回はSHA-1、 前回はSHA-256の仕様と実装について比較したので、今回はSHA-512について比較してみようと思います。","title":"SHAの仕様と実装比較(SHA-512編)","type":"posts"},{"content":"前回、SHA-1の仕様と実装について比較したので、今回はSHA-256について比較してみようと思います。\n今回の比較に使用するソースコードは、GitHubにあるopensslのソースコードを 使用しました。その中の、crypto/sha/sha256.cです。\nopenssl GitHub 念のため、FIPS 180-4のリンクも置いておきます。\nFIPS 180-4 2015/08 SHAの共通点やWordの操作については、 SHA-1編 を参照してください。\nSHA-256の仕様と実装の比較 # 1．ブロックサイズやWordサイズ # SHA-256のブロックサイズは512bits、Wordサイズは32bitsです。 各ブロックは16個の32bitに分けられて処理されます。\n2．ハッシュの初期値 # FIPS 180-4で記述されているSHA-256の初期値は以下です。 crypto/sha/sha256.cに設定されている値と一致します。\n34 int SHA256_Init(SHA256_CTX *c) 35 { 36 memset(c, 0, sizeof(*c)); 37 c-\u0026gt;h[0] = 0x6a09e667UL; 38 c-\u0026gt;h[1] = 0xbb67ae85UL; 39 c-\u0026gt;h[2] = 0x3c6ef372UL; 40 c-\u0026gt;h[3] = 0xa54ff53aUL; 41 c-\u0026gt;h[4] = 0x510e527fUL; 42 c-\u0026gt;h[5] = 0x9b05688cUL; 43 c-\u0026gt;h[6] = 0x1f83d9abUL; 44 c-\u0026gt;h[7] = 0x5be0cd19UL; 45 c-\u0026gt;md_len = SHA256_DIGEST_LENGTH; 46 return 1; 47 } 3．定数 # FIPS 180-4で記述されているSHA-256の定数は以下です。 64個の32bitの定数を使用します。これらはSHA-224でも同じ値を使用するようです。\ncrypto/sha/sha256.cでも同じ値が設定されています。\n134 static const SHA_LONG K256[64] = { 135 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 136 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 137 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL, 138 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL, 139 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, 140 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 141 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 142 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL, 143 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL, 144 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, 145 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 146 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 147 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL, 148 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL, 149 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, 150 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL 151 }; 4．関数 # FIPS 180-4で記述されているSHA-256の関数は以下です。 crypto/sha/sha256.cでは以下のように定義されています。\n153 /* 154 * FIPS specification refers to right rotations, while our ROTATE macro 155 * is left one. This is why you might notice that rotation coefficients 156 * differ from those observed in FIPS document by 32-N... 157 */ 158 # define Sigma0(x) (ROTATE((x),30) ^ ROTATE((x),19) ^ ROTATE((x),10)) 159 # define Sigma1(x) (ROTATE((x),26) ^ ROTATE((x),21) ^ ROTATE((x),7)) 160 # define sigma0(x) (ROTATE((x),25) ^ ROTATE((x),14) ^ ((x)\u0026gt;\u0026gt;3)) 161 # define sigma1(x) (ROTATE((x),15) ^ ROTATE((x),13) ^ ((x)\u0026gt;\u0026gt;10)) 162 163 # define Ch(x,y,z) (((x) \u0026amp; (y)) ^ ((~(x)) \u0026amp; (z))) 164 # define Maj(x,y,z) (((x) \u0026amp; (y)) ^ ((x) \u0026amp; (z)) ^ ((y) \u0026amp; (z))) ROTATEは、crypto/des/des_locl.hで以下のように定義されています。\n90 # if (defined(OPENSSL_SYS_WIN32) \u0026amp;\u0026amp; defined(_MSC_VER)) 91 # define ROTATE(a,n) (_lrotr(a,n)) 92 # elif defined(__ICC) 93 # define ROTATE(a,n) (_rotr(a,n)) 94 # elif defined(__GNUC__) \u0026amp;\u0026amp; __GNUC__\u0026gt;=2 \u0026amp;\u0026amp; !defined(__STRICT_ANSI__) \u0026amp;\u0026amp; !defined(OPENSSL_NO_ASM) \u0026amp;\u0026amp; !defined(OPEN SSL_NO_INLINE_ASM) \u0026amp;\u0026amp; !defined(PEDANTIC) 95 # if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__) 96 # define ROTATE(a,n) ({ register unsigned int ret; \\ 97 asm (\u0026#34;rorl %1,%0\u0026#34; \\ 98 : \u0026#34;=r\u0026#34;(ret) \\ 99 : \u0026#34;I\u0026#34;(n),\u0026#34;0\u0026#34;(a) \\ 100 : \u0026#34;cc\u0026#34;); \\ 101 ret; \\ 102 }) 103 # endif 104 # endif 105 # ifndef ROTATE 106 # define ROTATE(a,n) (((a)\u0026gt;\u0026gt;(n))+((a)\u0026lt;\u0026lt;(32-(n)))) 107 # endif i386やx86_64系ではアセンブリが適用されるみたいですね。 ROTATEで実行する処理は、ROTR^n(X)と同じようです。\nよく見るとcrypto/sha/sha256.cでROTATEに渡す引数の数値が、FIPS 180-4で記述されている値と異なりますが、32bitsのWordサイズでは以下が成立するためです。 5．メッセージスケジュールの生成 # FIPS 180-4で記述されているSHA-256のメッセージスケジュールの生成方法は以下です。 crypto/sha/sha256.cでは以下のように定義されています。\n187 for (i = 0; i \u0026lt; 16; i++) { 188 (void)HOST_c2l(data, l); 189 T1 = X[i] = l; ...(中略)... 202 for (; i \u0026lt; 64; i++) { 203 s0 = X[(i + 1) \u0026amp; 0x0f]; 204 s0 = sigma0(s0); 205 s1 = X[(i + 14) \u0026amp; 0x0f]; 206 s1 = sigma1(s1); 207 208 T1 = X[i \u0026amp; 0xf] += s0 + s1 + X[(i + 9) \u0026amp; 0xf]; iが16まではそのままの値を使用し、16から64まではSHA-1の代替方法と同じように、0xfとマスクを取った位置にある要素からWtを算出しています。その際、0xfを法として合同な位置にある要素を使用する点には注意が必要です。\n6．ハッシュ値の計算 # FIPS 180-4に記述されている方法は、以下です。 crypto/sha/sha256.cの該当部分は以下です。\n187 for (i = 0; i \u0026lt; 16; i++) { 188 (void)HOST_c2l(data, l); 189 T1 = X[i] = l; 190 T1 += h + Sigma1(e) + Ch(e, f, g) + K256[i]; 191 T2 = Sigma0(a) + Maj(a, b, c); 192 h = g; 193 g = f; 194 f = e; 195 e = d + T1; 196 d = c; 197 c = b; 198 b = a; 199 a = T1 + T2; 200 } 201 202 for (; i \u0026lt; 64; i++) { 203 s0 = X[(i + 1) \u0026amp; 0x0f]; 204 s0 = sigma0(s0); 205 s1 = X[(i + 14) \u0026amp; 0x0f]; 206 s1 = sigma1(s1); 207 208 T1 = X[i \u0026amp; 0xf] += s0 + s1 + X[(i + 9) \u0026amp; 0xf]; 209 T1 += h + Sigma1(e) + Ch(e, f, g) + K256[i]; 210 T2 = Sigma0(a) + Maj(a, b, c); 211 h = g; 212 g = f; 213 f = e; 214 e = d + T1; 215 d = c; 216 c = b; 217 b = a; 218 a = T1 + T2; 219 } iが16まで処理と16から64までの処理では、メッセージスケジュールを生成している部分だけが異なりますが、その他は全て同じです。 FIPS 180-4のアルゴリズムがそのままの形で実装されていることが分かります。\n変数のdからe、hからaに移る時に値が変っていくイメージです。\n最後に32bitの8つの変数の値を並べることで、256bitのメッセージダイジェストが得られます。\n以上がSHA-256の仕様とその実装の比較でした。 opensslのSHA-256のソースコードでは、FIPS 180-4の仕様が割とそのまま実装されているという印象を受けました。 次回はSHA-512編です。\n","date":"2016/07/18","externalUrl":null,"permalink":"/posts/shiro/4164/","section":"Posts","summary":"前回、SHA-1の仕様と実装について比較したので、今回はSHA-256について比較してみようと思います。","title":"SHAの仕様と実装比較(SHA-256編)","type":"posts"},{"content":"とあるソースコードを追っていたらsha_init()やsha_transform()をコールしている部分に遭遇し、飛んでみたら謎すぎた(実際は全く謎ではない)ので、SHA(Secure Hash Algorithm)について色々と調べてみました。\nその調査の結果を、備忘録として残しておくための記事です。 長くなることを避けるため、あくまでSHAの仕様とその実装を見比べる程度にします。\n今回はSHA-1編です。\n飛んでみて謎に遭遇したのは、Linux Kernelのソースコードに含まれる lib/sha1.c です。\n謎ですねー\u0026hellip;。 0x67452301とか、0xefcdab89とか。\nというわけで、色々とググっているうちに、SHAの仕様がFIPS 180-2として公開されていることが分かりました(FIPS 180-2は歴史的な目的から残されているようです。)。 新しいバージョンがFIPS 180-4として公開されています。\nFIPS 180-2 2002/08 FIPS 180-4 2015/08 FIPS 180-2(or 4)には、SHA-1だけでなく、SHA-256、SHA-512等々についても記述されています。\nSHAの共通点 # SHA-1、SHA-256、SHA-512等々ありますが、以下の点はSHAのアルゴリズムに共通していると言えそうです。(抽象的過ぎるかもしれませんが)。\nブロックサイズやWordサイズが決まっている ハッシュの初期値がある いくつかの定数がある 使用する関数がある メッセージスケジュールを生成する ハッシュ値を計算する Wordの操作 # Word(SHAに依存する32bitか64bitの1グループ)の操作としては、ビット単位での和、積、排他的論理和、否定、2^w(wは1Wordのビット数)を法とする加算、左右のビットシフトに加え、以下の操作が定義されています。\n2番目と3番目の操作は循環シフトで、Linuxのソースコードではinclude/linux/bitops.hに、以下のように定義されています。\n103 /** 104 * rol32 - rotate a 32-bit value left 105 * @word: value to rotate 106 * @shift: bits to roll 107 */ 108 static inline __u32 rol32(__u32 word, unsigned int shift) 109 { 110 return (word \u0026lt;\u0026lt; shift) | (word \u0026gt;\u0026gt; (32 - shift)); 111 } 112 113 /** 114 * ror32 - rotate a 32-bit value right 115 * @word: value to rotate 116 * @shift: bits to roll 117 */ 118 static inline __u32 ror32(__u32 word, unsigned int shift) 119 { 120 return (word \u0026gt;\u0026gt; shift) | (word \u0026lt;\u0026lt; (32 - shift)); 121 } 122 事前処理 # SHAではハッシュ値を計算する前に、事前処理として対象のメッセージを512か1024(SHAに依存)bitの倍数にパディングし、パディングしたメッセージをN個の512か1024(SHAに依存)bitごとにブロックとして分ける必要があります。 N個に分けられたブロックは、16個の32か64(SHAに依存)bitに分けられて処理されます。 sha_transform()に渡される引数は、この事前処理が終わっている状態です。\nSHA-1の仕様と実装の比較 # それでは前置きが長くなってしまいましたが、SHA-1の仕様とその実装を見比べてみます。\n1．ブロックサイズやWordサイズ # SHA-1のブロックサイズは512bits、Wordサイズは32bitsです。 各ブロックは16個の32bitに分けられて処理されます。\n2．ハッシュの初期値 # FIPS 180-4で記述されているSHA-1の初期値は以下です。 lib/sha1.cのsha_init()で設定されている値と一致します。\n189 /** 190 * sha_init - initialize the vectors for a SHA1 digest 191 * @buf: vector to initialize 192 */ 193 void sha_init(__u32 *buf) 194 { 195 buf[0] = 0x67452301; 196 buf[1] = 0xefcdab89; 197 buf[2] = 0x98badcfe; 198 buf[3] = 0x10325476; 199 buf[4] = 0xc3d2e1f0; 200 } 3．定数 # FIPS 180-4で記述されているSHA-1の定数は以下です。 lib/sha1.cで定義されているマクロに該当する値があります。\n59 #define T_0_15(t, A, B, C, D, E) SHA_ROUND(t, SHA_SRC, (((C^D)\u0026amp;B)^D) , 0x5a827999, A, B, C, D, E ) 60 #define T_16_19(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (((C^D)\u0026amp;B)^D) , 0x5a827999, A, B, C, D, E ) 61 #define T_20_39(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0x6ed9eba1, A, B, C, D, E ) 62 #define T_40_59(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, ((B\u0026amp;C)+(D\u0026amp;(B^C))) , 0x8f1bbcdc, A, B, C, D, E ) 63 #define T_60_79(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0xca62c1d6, A, B, C, D, E ) T_0_15とT_16_19で同じ値が渡されていることが分かります。\n4．関数 # FIPS 180-4で記述されているSHA-1の関数は以下です。 この1番目と3番目の関数に一致しそうな箇所がなく困ったのですが、WikipediaのSHA-1の記述によると、それぞれ代替方法があるようです。 上記のSHA_ROUNDの3番目の引数にしている箇所を確認すると、Linuxの実装では、この0-19ラウンドのalternative 1と40-59ラウンドのalternative 3が採用されているようです。\n5．メッセージスケジュールの生成 # FIPS 180-4では、SHA-1のハッシュ値の計算方法が2種類記述されており、Linuxでは後者の方を採用しているようです。 後者のメッセージスケジュールの生成部分は以下のようになっています。 lib/sha1.cでSHA_ROUNDの2番目の引数に指定されているマクロに該当する処理があります。\n44 /* This \u0026#34;rolls\u0026#34; over the 512-bit array */ 45 #define W(x) (array[(x)\u0026amp;15]) 46 47 /* 48 * Where do we get the source from? The first 16 iterations get it from 49 * the input data, the next mix it from the 512-bit array. 50 */ 51 #define SHA_SRC(t) get_unaligned_be32((__u32 *)data + t) 52 #define SHA_MIX(t) rol32(W(t+13) ^ W(t+8) ^ W(t+2) ^ W(t), 1) 6．ハッシュ値の計算 # FIPS 180-4に記述されている方法は、以下です。 lib/sha1.cでの該当部分は以下です。\n54 #define SHA_ROUND(t, input, fn, constant, A, B, C, D, E) do { \\ 55 __u32 TEMP = input(t); setW(t, TEMP); \\ 56 E += TEMP + rol32(A,5) + (fn) + (constant); \\ 57 B = ror32(B, 2); } while (0) TEMPにメッセージスケジュールWiを入れておくことで、EにはTの値が入ります。 また、ROTL^30(x)はROTR^2(x)と等価です。\nFIPS 180-4では変数の中身を1つずつずらすような処理が入っていますが、Linuxでは引数の順番を変えていくことで代替しているようです。\n92 T_0_15( 0, A, B, C, D, E); 93 T_0_15( 1, E, A, B, C, D); 94 T_0_15( 2, D, E, A, B, C); 95 T_0_15( 3, C, D, E, A, B); 96 T_0_15( 4, B, C, D, E, A); 97 T_0_15( 5, A, B, C, D, E); 98 T_0_15( 6, E, A, B, C, D); 99 T_0_15( 7, D, E, A, B, C); 100 T_0_15( 8, C, D, E, A, B); 101 T_0_15( 9, B, C, D, E, A); 102 T_0_15(10, A, B, C, D, E); 103 T_0_15(11, E, A, B, C, D); 104 T_0_15(12, D, E, A, B, C); 105 T_0_15(13, C, D, E, A, B); 106 T_0_15(14, B, C, D, E, A); 107 T_0_15(15, A, B, C, D, E); 変数のBからC、EからAに移る時に値が変っていくイメージです。\nこのような処理を0-79ラウンドまで行い、32bitのA、B、C、D、Eの5つの変数の値を並べることで、160bitのメッセージダイジェストが得られます。\nなかなか大変ですね。\n以上がSHA-1の仕様とその実装の比較でした。 初見では謎にしか見えなかった内容が、仕様と実装を比較していくうちに理解することができました。 この記事がどなたかの理解の役に立てば幸いです。\nまた、折角、FIPS 180-4を読んだので、SHA-256とSHA-512についても仕様と実装の比較を行う予定です。 次回はSHA-256編です。\n","date":"2016/07/15","externalUrl":null,"permalink":"/posts/shiro/4138/","section":"Posts","summary":"とあるソースコードを追っていたらsha_init()やsha_transform()をコールしている部分に遭遇し、飛んでみたら謎すぎた(実際は全く謎ではない)ので、SHA(Secure Hash Algorithm)について色々と調べてみました。\nその調査の結果を、備忘録として残しておくための記事です。 長くなることを避けるため、あくまでSHAの仕様とその実装を見比べる程度にします。\n今回はSHA-1編です。\n","title":"SHAの仕様と実装比較(SHA-1編)","type":"posts"},{"content":"無線通信をするアプリケーションのテストのために、帯域や遅延といった、ネットワークの状態をシミュレートしたいことがあると思います。 本記事では、Linux上で、ネットワークインタフェースに対する帯域制限と遅延の設定方法を説明します。\n設定にはtcコマンドを使います。 tcコマンドとは、Traffic Controlコマンドのことで、Linux Kernel内の通信を制御します。\n動作環境 # 本記事での動作環境を以下に示します。\nディストリビューション\n$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION=\u0026#34;Ubuntu 14.04.3 LTS\u0026#34; Linux Kernel\n$ uname -sr Linux 3.16.0-30-generic tcコマンド\nUbuntu14.04にデフォルトでインストールされているものを使います。\n設定方法 # 最初にコマンドを示します。各コマンドの解説は後述します。\n帯域制限のみ\n出力帯域を50Mbpsに制限します。\n$ sudo tc qdisc add dev eth0 root handle 1:0 tbf rate 50mbit burst 25kb limit 250kb 遅延のみ\n50msの遅延と10msのジッタを発生させます。ジッタとは、遅延量の揺らぎのことです。\n$ sudo tc qdisc add dev root handle 1:0 netem delay 50ms 10ms distribution normal 帯域制限と遅延\n帯域制限と遅延の両方を設定します。\n$ sudo tc qdisc add dev eth0 root handle 1:0 tbf rate 50mbit burst 25kb limit 250kb $ sudo tc qdisc add dev eth0 parent 1:1 handle 10:1 netem delay 50ms 10ms distribution normal 解説 # 帯域制限 # 以下のコマンドを実行すると、eth0の出力帯域を50Mbpsに制限します。\n$ sudo tc qdisc add dev eth0 root handle 1:0 tbf rate 50mbit burst 25kb limit 250kb 以下から、このコマンドの詳細について説明します。 rate\n帯域を指定します。50Mbpsに設定する場合は50mbitと指定します。 50mbpsと指定すると、50Mbyte/secになります。単位に注意してください。\nburst\nバッファサイズを指定します。tc-tbf(8)のManページによると、\nThe minimum buffer size can be calculated by dividing the rate by HZ.\nとのことなので、以下の式で設定値を計算します。\nburst(byte) = rate(byte) / HZ\nHZはタイマー割り込み周波数です。 HZの値は以下のコマンドで確認できます。\n$ cat /boot/config-\\`uname -r\\` | grep \u0026#39;CONFIG_HZ=\u0026#39; CONFIG_HZ=250 rateが50mbit、HZが250HZの場合、以下のように計算します。 burst = (50 * 10^6 / 8) / 250 = 25 * 10^3\nlimit\nburstと比較して十分に大きな値を設定します。 十分に大きな値を設定することで、帯域制限の方式をシェーピングに設定します。 帯域制限の方式及びシェーピングについては「 ポリシングとシェーピングの概要」を参照してください。\n遅延の設定 # 以下のコマンドを実行すると、eth0に遅延50msとジッタ10msを設定します。\n$ sudo tc qdisc add dev eth0 parent 1:1 handle 10:1 netem delay 50ms 10ms distribution normal 以下から、このコマンドの詳細について説明します。 delay\n遅延を指定します。 1つ目の引数で遅延を指定して、2つ目の引数でジッタを指定します。 例えば、delay 50ms 10msなら、遅延は50ms、ジッタは10msとなります。 その後の、distribution normalで、ジッタの分布を正規分布に指定します。 以下に、distribution normalを指定した場合と、指定しなかった場合の、遅延の確率分布図を示します。\nオプションを指定すると、遅延が正規分布に近い分布になることががわかります。 また、オプションを指定しなかった場合には、遅延が一様分布に近い分布になることがわかります。\nparent\nparent 1:1で、既に設定してある帯域制限の設定と紐づけをします。 詳細は「 クラスフルなキューイング規則」を参照してください。\n設定確認 # tcコマンドで確認 # $ sudo tc qdisc show dev eth0 qdisc tbf 1: root refcnt 2 rate 50000Kbit burst 25Kb lat 36.9ms qdisc netem 10: parent 1:1 limit 1000 delay 50.0ms 10.0ms 遅延の確認 # pingで遅延を確認します。\n$ ping 192.168.1.37 -c 100 PING 192.168.1.37 (192.168.1.37) 56(84) bytes of data. 64 bytes from 192.168.1.37: icmp_seq=1 ttl=64 time=42.3 ms 64 bytes from 192.168.1.37: icmp_seq=2 ttl=64 time=47.9 ms 64 bytes from 192.168.1.37: icmp_seq=3 ttl=64 time=43.2 ms 64 bytes from 192.168.1.37: icmp_seq=4 ttl=64 time=53.5 ms 64 bytes from 192.168.1.37: icmp_seq=5 ttl=64 time=43.6 ms ~~~snip~~~ 64 bytes from 192.168.1.37: icmp_seq=98 ttl=64 time=42.0 ms 64 bytes from 192.168.1.37: icmp_seq=99 ttl=64 time=63.4 ms 64 bytes from 192.168.1.37: icmp_seq=100 ttl=64 time=45.4 ms --- 192.168.1.37 ping statistics --- 100 packets transmitted, 100 received, 0% packet loss, time 99191ms rtt min/avg/max/mdev = 22.033/50.743/73.850/10.505 ms 50msの遅延と10msのジッタが入っていることが確認できます。\n帯域の確認 # iperf3で帯域を確認します。 iperf3とは、IPネットワーク上で帯域を測定するアプリケーションのことです。 クライアント/サーバアプリケーションとして動作します。\nクライアント\n$ iperf3 -c 192.168.1.37 Connecting to host 192.168.1.37, port 5201 [ 4] local 192.168.1.10 port 55652 connected to 192.168.1.37 port 5201 [ ID] Interval Transfer Bandwidth Retr Cwnd [ 4] 0.00-1.00 sec 4.61 MBytes 38.7 Mbits/sec 0 277 KBytes [ 4] 1.00-2.00 sec 5.40 MBytes 45.3 Mbits/sec 2 290 KBytes [ 4] 2.00-3.00 sec 5.56 MBytes 46.6 Mbits/sec 1 300 KBytes [ 4] 3.00-4.00 sec 5.88 MBytes 49.3 Mbits/sec 0 307 KBytes [ 4] 4.00-5.00 sec 5.45 MBytes 45.7 Mbits/sec 1 315 KBytes [ 4] 5.00-6.00 sec 5.75 MBytes 48.2 Mbits/sec 2 322 KBytes [ 4] 6.00-7.00 sec 5.70 MBytes 47.8 Mbits/sec 3 328 KBytes [ 4] 7.00-8.00 sec 5.83 MBytes 48.9 Mbits/sec 1 335 KBytes [ 4] 8.00-9.00 sec 5.78 MBytes 48.5 Mbits/sec 1 344 KBytes [ 4] 9.00-10.00 sec 5.42 MBytes 45.4 Mbits/sec 1 348 KBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Retr [ 4] 0.00-10.00 sec 55.4 MBytes 46.5 Mbits/sec 12 sender [ 4] 0.00-10.00 sec 55.1 MBytes 46.2 Mbits/sec receiver iperf Done. サーバ\n$ iperf3 -s ----------------------------------------------------------- Server listening on 5201 ----------------------------------------------------------- Accepted connection from 192.168.1.10, port 55651 [ 5] local 192.168.1.37 port 5201 connected to 192.168.1.10 port 55652 [ ID] Interval Transfer Bandwidth [ 5] 0.00-1.00 sec 3.76 MBytes 31.6 Mbits/sec [ 5] 1.00-2.00 sec 5.45 MBytes 45.7 Mbits/sec [ 5] 2.00-3.00 sec 5.64 MBytes 47.3 Mbits/sec [ 5] 3.00-4.00 sec 5.71 MBytes 47.9 Mbits/sec [ 5] 4.00-5.00 sec 5.64 MBytes 47.3 Mbits/sec [ 5] 5.00-6.00 sec 5.68 MBytes 47.7 Mbits/sec [ 5] 6.00-7.00 sec 5.74 MBytes 48.2 Mbits/sec [ 5] 7.00-8.00 sec 5.73 MBytes 48.1 Mbits/sec [ 5] 8.00-9.00 sec 5.68 MBytes 47.7 Mbits/sec [ 5] 9.00-10.00 sec 5.65 MBytes 47.4 Mbits/sec [ 5] 10.00-10.06 sec 363 KBytes 53.6 Mbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Retr [ 5] 0.00-10.06 sec 55.4 MBytes 46.2 Mbits/sec 12 sender [ 5] 0.00-10.06 sec 55.1 MBytes 45.9 Mbits/sec receiver 帯域が50Mbit/secに制限されていることが確認できます。\n以上、ネットワークインタフェースに対する帯域制限と遅延の設定方法でした。\n","date":"2016/03/17","externalUrl":null,"permalink":"/posts/kaoru/3930/","section":"Posts","summary":"無線通信をするアプリケーションのテストのために、帯域や遅延といった、ネットワークの状態をシミュレートしたいことがあると思います。\n本記事では、Linux上で、ネットワークインタフェースに対する帯域制限と遅延の設定方法を説明します。","title":"Linux上でネットワークの帯域制限と遅延を設定する","type":"posts"},{"content":"謹賀新年\n旧年中は格別のご厚情を賜り、誠にありがとうございました。 顧客のみなさま、業務パートナーの方々、社員のご家族、お世話になったすべての関係者の方々に深く感謝申し上げます。\n昨年は、継続して協力させていただいてきた研究プロジェクトの多くが研究計画の最終期を迎えたこともあり、研究成果の汎用機器への実装や成果発表用の可視化システム開発といった研究の社会展開に向けた支援を主に実施してまいりました。 並行して、お客様の次の中期計画の実行にあたり2020年前後を見据えた新たな研究テーマに対しての技術相談をいくつか承りました。本年以降これら研究プロジェクトの実現に貢献していければと存じます。\nまた、新たに複数の大学様の教育向け研究プロジェクトのシステムサポートを始めた他、無線通信事業者様にトライアルサービス用のアプリケーションを提供してきました。\n本年も、研究開発サービスの提供を通じて科学技術の発展と普及に寄与し、お客様へより良いサービスを届けられるように、社員一同、技術に一層の磨きをかけていく所存です。\nよりいっそうのご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n皆々様にとりまして、新しい年がより幸の多き年となりますようお祈り申し上げ、新年のご挨拶とさせていただきます。\n平成28年1月1日 株式会社ビットマイスター 代表取締役　笠原勉\n","date":"2015/12/31","externalUrl":null,"permalink":"/posts/kasa/3884/","section":"Posts","summary":"謹賀新年\n旧年中は格別のご厚情を賜り、誠にありがとうございました。 顧客のみなさま、業務パートナーの方々、社員のご家族、お世話になったすべての関係者の方々に深く感謝申し上げます。\n昨年は、継続して協力させていただいてきた研究プロジェクトの多くが研究計画の最終期を迎えたこともあり、研究成果の汎用機器への実装や成果発表用の可視化システム開発といった研究の社会展開に向けた支援を主に実施してまいりました。 並行して、お客様の次の中期計画の実行にあたり2020年前後を見据えた新たな研究テーマに対しての技術相談をいくつか承りました。本年以降これら研究プロジェクトの実現に貢献していければと存じます。\nまた、新たに複数の大学様の教育向け研究プロジェクトのシステムサポートを始めた他、無線通信事業者様にトライアルサービス用のアプリケーションを提供してきました。\n本年も、研究開発サービスの提供を通じて科学技術の発展と普及に寄与し、お客様へより良いサービスを届けられるように、社員一同、技術に一層の磨きをかけていく所存です。\nよりいっそうのご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n皆々様にとりまして、新しい年がより幸の多き年となりますようお祈り申し上げ、新年のご挨拶とさせていただきます。\n平成28年1月1日 株式会社ビットマイスター 代表取締役　笠原勉\n","title":"新年のご挨拶","type":"posts"},{"content":"TCP通信の状態を監視していたところ、スロースタート閾値の初期値が、カーネル内で定義されている初期値と異なっていることがありました。調査したところ、Linuxに実装されているtcp_metricsが原因でした。本記事では、tcp_metricsの無効化方法について説明します。\nLinuxカーネル2.6.6以降のTCP通信にはtcp_metricsという機能があります。tcp_metricsは、スロースタート閾値や輻輳ウィンドウサイズ、RTTといったTCP情報を送信先IPアドレスと関連付け、TCPコネクション終了時にキャッシュします。そして、キャッシュされた送信先IPアドレスへTCPコネクションを開始する時に、キャッシュしたTCP情報をその通信の初期値に設定します。\n送信先IPアドレスのTCP情報をキャッシュすることで輻輳を防ぐことができる機能ですが、例えばiperfなどを使ってスループットを測定する時には、TCP情報の初期値を勝手に書き換えてしまうため、正確な測定の妨げになります。\n以下のコマンドで、tcp_metricsがTCP情報をキャッシュすることを無効にします。\n$ sudo sh -c \u0026#34;echo 1 \u0026gt; /proc/sys/net/ipv4/tcp_no_metrics_save\u0026#34; これだけではtcp_metricsは新たにTCP情報をキャッシュしないだけで、既にキャッシュしているTCP情報は設定されるので、キャッシュを消去します。\n$ sudo ip tcp_metrics flush 確認します。何も表示されなければキャッシュは消去されています。\n$ ip tcp_metrics show tcp_metricsがTCP情報をキャッシュすることで、TCP情報の初期値が書き換えられてしまいます。前のTCPコネクションの影響を受けたくない場合は無効化したほうが良いと思います。\n","date":"2015/12/28","externalUrl":null,"permalink":"/posts/kaoru/3863/","section":"Posts","summary":"TCP通信の状態を監視していたところ、スロースタート閾値の初期値が、カーネル内で定義されている初期値と異なっていることがありました。調査したところ、Linuxに実装されているtcp_metricsが原因でした。本記事では、tcp_metricsの無効化方法について説明します。","title":"LinuxのTCP輻輳ウィンドウサイズやスロースタート閾値のキャッシュを無効化する","type":"posts"},{"content":"拝啓\n避暑の候、皆様におかれましては益々ご健勝のこととお慶び申し上げます。 平素は、格別のご高配を賜りまして厚く御礼申し上げます。\nさて、本日8月20日をもちまして、株式会社ビットマイスターは創立8周年を迎えることができました。 これもひとえに皆様のご支援、ご厚情の賜物と存じます。 顧客の皆様をはじめとして、業務パートナーの方々、社員のご家族、そして、お世話になった全ての関係者の方に深く感謝いたします。\n第8期は、創業来携わってきた新世代のネットワーク分野を中心に多数の研究プロジェクトに協力させていただきました。異種有無線ネットワークの最適化技術検討、ID・ロケータ分離ネットワーク技術の拡張開発、複数の近距離無線を組み合わせた端末間情報伝搬システムの構築、IoT実験用機器開発等、いずれも近い将来、社会を支える大事な通信技術の研究です。こうした研究に弊社の技術が少しでも役立てたなら幸いです。\n一方で、期首に掲げた3つの中長期目標、“新たな技術領域への挑戦”、“新たな顧客の開拓”、“新たなサービス形態の創造”、にも取り組んでまいりました。 新規の公的研究機関や、情報通信系企業の研究部門への横展開を図りつつ、研究開発サービスで培ったノウハウを活用して、大学の教育研究の新たな実証実験に参画しました。 超高齢社会において、QOL（Quality of Life）の向上を目指したさまざまな取り組みが、医療・介護分野で始まっていますが、持続的に心豊かに生きていくためには教育・学習分野のサポートもこれからは必要になってくるとみております。 運用中の博物館の学習研究と併せて、引き続き、教育・学習分野に力をいれていきます。\nこれまで弊社では、企業理念の一つである『最先端の研究成果を世に展開する』ために、研究者のみなさまが考えられた理論を実験用ソフトウェアやデモンストレーションシステムの形にして提供してきました。今後は、研究開発の結果が社会で実際に使えることを具体的に確認する「社会への実装」にも貢献していきたいと考えております。\n将来的には、前述した教育・学習分野に加え、ヘルスケア分野等、超高齢社会に必要とされる分野の課題解決に、弊社の技術を活用していければと存じます。\n今まで以上に新しい技術、異なる分野のノウハウの習得が必要になってきますが、この新たな活動を通して、もう一つの企業理念である、未踏の技術エリアに挑戦できる環境『技術者が持つスキルを最大限に発揮できるステージ作り』につなげていきます。\n今年4月には新しい仲間が増えました。 家族が増えた社員もいます。\n第9期も、研究開発サービスの提供を通じて科学技術の発展と普及に寄与し、お客様へより良いサービスを届けられるように、社員一同、知識と技術に一層の磨きをかけていく所存です。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n敬具\n平成27年8月20日 株式会社ビットマイスター 代表取締役　笠原　勉\n","date":"2015/08/20","externalUrl":null,"permalink":"/posts/kasa/3767/","section":"Posts","summary":"拝啓\n避暑の候、皆様におかれましては益々ご健勝のこととお慶び申し上げます。 平素は、格別のご高配を賜りまして厚く御礼申し上げます。\nさて、本日8月20日をもちまして、株式会社ビットマイスターは創立8周年を迎えることができました。 これもひとえに皆様のご支援、ご厚情の賜物と存じます。 顧客の皆様をはじめとして、業務パートナーの方々、社員のご家族、そして、お世話になった全ての関係者の方に深く感謝いたします。\n第8期は、創業来携わってきた新世代のネットワーク分野を中心に多数の研究プロジェクトに協力させていただきました。異種有無線ネットワークの最適化技術検討、ID・ロケータ分離ネットワーク技術の拡張開発、複数の近距離無線を組み合わせた端末間情報伝搬システムの構築、IoT実験用機器開発等、いずれも近い将来、社会を支える大事な通信技術の研究です。こうした研究に弊社の技術が少しでも役立てたなら幸いです。\n一方で、期首に掲げた3つの中長期目標、“新たな技術領域への挑戦”、“新たな顧客の開拓”、“新たなサービス形態の創造”、にも取り組んでまいりました。 新規の公的研究機関や、情報通信系企業の研究部門への横展開を図りつつ、研究開発サービスで培ったノウハウを活用して、大学の教育研究の新たな実証実験に参画しました。 超高齢社会において、QOL（Quality of Life）の向上を目指したさまざまな取り組みが、医療・介護分野で始まっていますが、持続的に心豊かに生きていくためには教育・学習分野のサポートもこれからは必要になってくるとみております。 運用中の博物館の学習研究と併せて、引き続き、教育・学習分野に力をいれていきます。\nこれまで弊社では、企業理念の一つである『最先端の研究成果を世に展開する』ために、研究者のみなさまが考えられた理論を実験用ソフトウェアやデモンストレーションシステムの形にして提供してきました。今後は、研究開発の結果が社会で実際に使えることを具体的に確認する「社会への実装」にも貢献していきたいと考えております。\n将来的には、前述した教育・学習分野に加え、ヘルスケア分野等、超高齢社会に必要とされる分野の課題解決に、弊社の技術を活用していければと存じます。\n今まで以上に新しい技術、異なる分野のノウハウの習得が必要になってきますが、この新たな活動を通して、もう一つの企業理念である、未踏の技術エリアに挑戦できる環境『技術者が持つスキルを最大限に発揮できるステージ作り』につなげていきます。\n今年4月には新しい仲間が増えました。 家族が増えた社員もいます。\n第9期も、研究開発サービスの提供を通じて科学技術の発展と普及に寄与し、お客様へより良いサービスを届けられるように、社員一同、知識と技術に一層の磨きをかけていく所存です。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n敬具\n平成27年8月20日 株式会社ビットマイスター 代表取締役　笠原　勉\n","title":"創立8周年のご挨拶","type":"posts"},{"content":"C++14では2進数リテラルが規格に加わりました。GCCやClangではCでも使えます。というか、もともとコンパイラの独自拡張機能として実装済みだったものが規格になったみたいです。使い方はこんな感じ。\n#include \u0026lt;stdio.h\u0026gt; int main() { char c = 0b01000001; printf(\u0026#34;0x%X\\n\u0026#34;, c); printf(\u0026#34;%c\\n\u0026#34;, c); return 0; } $ ./a.out 0x41 A んー。これ、なにがうれしいんだろう。あんまり使いどころが思いつきません。それから、printf(3)のフォーマットに2進数が追加されたわけではないので、表示はできません。表示したいときはこんなふうにビットマスクをシフトしながら0と1を出力していけばできます。\n#include \u0026lt;stdio.h\u0026gt; int bin_dump(const void *buf, size_t len) { size_t i; const unsigned char *ptr = buf; unsigned char bit_mask; for (i = 0; i \u0026lt; len; i++) for (bit_mask = 0x80; bit_mask; bit_mask = bit_mask \u0026gt;\u0026gt; 1) if (putchar(ptr[i] \u0026amp; bit_mask ? \u0026#39;1\u0026#39; : \u0026#39;0\u0026#39;) == EOF) return -1; return 0; } int main() { char c = 0x41; int i = -1431655766; printf(\u0026#34;0b\u0026#34;); bin_dump(\u0026amp;c, sizeof(c)); printf(\u0026#34;\\n\u0026#34;); printf(\u0026#34;0b\u0026#34;); bin_dump(\u0026amp;i, sizeof(i)); printf(\u0026#34;\\n\u0026#34;); return 0; } 実行するとこんな結果が出力されます。\n$ ./a.out 0b01000001 0b10101010101010101010101010101010 32bitsの2進数表示、長すぎて使う気しないですね。64bitsではどうなるのか興味がある方は試してみてください。マルチバイト型の場合は、読むときにバイトオーダーを気にする必要があります。せっかくなので、2進数ダンプだけでなく16進数ダンプする関数も作りました。\n#include \u0026lt;stdio.h\u0026gt; static int __dump_buf(const void *buf, size_t len, int (*dump_char)(unsigned char), int bytes_per_line) { size_t i; const unsigned char *ptr = buf; for (i = 0; i \u0026lt; len; i++) { if (!(i % bytes_per_line)) if (printf(\u0026#34;0x%04zx: \u0026#34;, i) \u0026lt; 0) return -1; if (dump_char(ptr[i]) == -1) return -1; if (putchar((i + 1) % bytes_per_line \u0026amp;\u0026amp; i + 1 \u0026lt; len ? \u0026#39; \u0026#39; : \u0026#39;\\n\u0026#39;) == EOF) return -1; } return 0; } int hex_dump_char(unsigned char c) { if (printf(\u0026#34;%02x\u0026#34;, chr) \u0026lt; 0) return -1; return 0; } int bin_dump_char(unsigned char c) { unsigned char bit_mask; for (bit_mask = 0x80; bit_mask; bit_mask = bit_mask \u0026gt;\u0026gt; 1) if (putchar(c \u0026amp; bit_mask ? \u0026#39;1\u0026#39; :\u0026#39;0\u0026#39;) == EOF) return -1; return 0; } int hex_dump(const void *buf, size_t len) { return __dump_buf(buf, len, hex_dump_char, 16); } int bin_dump(const void *buf, size_t len) { return __dump_buf(buf, len, bin_dump_char, 8); } int main() { size_t i; char buf[32]; for (i = 0; i \u0026lt; sizeof(buf); i++) buf[i] = i; if (hex_dump(buf, sizeof(buf)) == -1) return 1; if (bin_dump(buf, sizeof(buf)) == -1) return 1; return 0; } 長さlenのバッファbufに格納されたメモリの16進数ダンプ、2進数ダンプを標準出力に書き込みます。成功すると0、失敗すると-1を返します。なにかのお役に立つならどうぞご自由に。\nexturn int hex_dump(const void *buf, size_t len); exturn int bin_dump(const void *buf, size_t len); /* LICENSE: BSD 2-Clause */\nbit_dump.c\n","date":"2015/06/26","externalUrl":null,"permalink":"/posts/bit/3691/","section":"Posts","summary":"C++14では2進数リテラルが規格に加わりました。GCCやClangではCでも使えます。というか、もともとコンパイラの独自拡張機能として実装済みだったものが規格になったみたいです。使い方はこんな感じ。","title":"2進数リテラルと2進数ダンプ","type":"posts"},{"content":"芝浦工業大学主催の『“プロトタイプ工房”を利用した 「ものづくり人材」育成支援プログラム』に参加してきました。\n2014年11月から2015年2月までの4ヶ月で芝浦工業大学の先生や学生、参加企業の方々と協力して、グループ毎にプロトタイプを作成していくといったプログラムです。\n私が参加したのはM2Mシステム技術を活用したプロトタイプを作成するグループでした。 プロトタイプは話し合いの結果、学生が研究しているものを別のことにも応用できるだろうという結論に至りました。応用するにあたり必要になる機能の検討、設計を技術的な部分は主に学生、アイデア部分を主に企業が出す形で進んでいきました。学生の研究を別分野の企業の方の視点から見ると、面白いアイデアが出てきて参考になりました。 私はというと、、、仕事内容が近いため、どちらかというと学生の視点になってしまい、技術的な部分が気になってしかたありませんでした。 月に1，2回のペースのため、すべてを期間内に終わらすことはできませんでしたが、次回も引き続き行われるそうなので完成はそのときになりそうです。\n学生が論文の準備で忙しい中、物品の選定や購入、資料の作成等精力的に動いてくれたことに感謝しています。\n","date":"2015/03/11","externalUrl":null,"permalink":"/posts/youtan/3548/","section":"Posts","summary":"芝浦工業大学主催の『“プロトタイプ工房”を利用した 「ものづくり人材」育成支援プログラム』に参加してきました。","title":"“プロトタイプ工房”を利用した 「ものづくり人材」育成支援プログラムに参加してきました","type":"posts"},{"content":"","date":"2015/03/11","externalUrl":null,"permalink":"/categories/%E3%81%9D%E3%81%AE%E4%BB%96/","section":"Categories","summary":"","title":"その他","type":"categories"},{"content":"謹賀新年\n旧年中はひとかたならぬお引き立てをあずかり、誠にありがとうございました。\nお客様、業務パートナーのみなさま、社員を支えてくれたご家族、お世話になった関係者の方々に深く感謝申し上げます。\n昨年は、創業来協力させていただいている有無線通信技術研究のプロジェクトに主に関わりながら、研究開発サービスの拡充に向けた事業パートナーとのネットワーク創りや、新規採用を通じた開発体制の増強に取り組んでまいりました。 本年は、強化した体制を活かしつつ、研究者の方のニーズにより幅広く応えられるように、有無線通信技術に加え、計測・分析用の可視化技術の向上にも努めたいと存じます。\nまた、研究開発活動に深く関わる、学習・教育分野および科学技術コミュニケーション関連のコミュニティーのサポートも引き続き実施していきます。\n質・量両面から研究開発分野を支えていければと存じます。\n本年もよりいっそうのご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n皆々様にとりまして、新しい年がより幸の多き年となりますようお祈り申し上げ、新年の挨拶とさせていただきます。\n平成27年　1月 株式会社ビットマイスター 代表取締役　笠原勉\n","date":"2014/12/31","externalUrl":null,"permalink":"/posts/kasa/3535/","section":"Posts","summary":"謹賀新年\n旧年中はひとかたならぬお引き立てをあずかり、誠にありがとうございました。\nお客様、業務パートナーのみなさま、社員を支えてくれたご家族、お世話になった関係者の方々に深く感謝申し上げます。\n昨年は、創業来協力させていただいている有無線通信技術研究のプロジェクトに主に関わりながら、研究開発サービスの拡充に向けた事業パートナーとのネットワーク創りや、新規採用を通じた開発体制の増強に取り組んでまいりました。 本年は、強化した体制を活かしつつ、研究者の方のニーズにより幅広く応えられるように、有無線通信技術に加え、計測・分析用の可視化技術の向上にも努めたいと存じます。\nまた、研究開発活動に深く関わる、学習・教育分野および科学技術コミュニケーション関連のコミュニティーのサポートも引き続き実施していきます。\n質・量両面から研究開発分野を支えていければと存じます。\n本年もよりいっそうのご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n皆々様にとりまして、新しい年がより幸の多き年となりますようお祈り申し上げ、新年の挨拶とさせていただきます。\n平成27年　1月 株式会社ビットマイスター 代表取締役　笠原勉\n","title":"新年のご挨拶","type":"posts"},{"content":"拝啓\n残暑の候、皆様におかれましては益々ご壮健のこととお慶び申し上げます。\n平素は格別のお引き立てを賜り厚くお礼申し上げます。\n本日８月２０日をもちまして、株式会社ビットマイスターは創立７周年を迎えることとなりました。 これもひとえに皆様のご支援、ご厚情の賜物と存じます。\n関係者の皆様に深く感謝を申し上げます。\n第７期は、弊社が得意とする分野の一つである有無線通信制御技術に関連した研究開発プロジェクトに深く関わらせていただきました。 ネットワークの仮想化技術やセンサーネットワーク制御技術分野における新世代のネットワーク研究開発はチャレンジングな要素の多い開発ではありましたが、上位レイヤからコアなレイヤまで幅広く対応できるように蓄積してきたスキルを、開発に上手く活かせたのではないかと存じます。\nまた、当期はインダストリアルデザインや装置開発等のソフトウェア関係以外の企業様とも多く協業させていただきました。 おかげさまで提供可能な研究開発サービスの幅を広げることができました。\n一方、特化した分野における受託開発にリソースを集中させた関係で、先々を見越した事業の展開という面での活動が滞ったことは否めません。\n会社を立ち上げてから7年が経ちました。その間に日本では大きな震災を経験し、政権も変わりました。2020年には東京オリンピックの開催が予定されています。 当時と比べて、研究者の方、研究機関、研究コミュニティへ向けた社会からの要求は大きく変化してきているように感じます。また社内を見渡すと社員も歳を重ねて各々の生活にも変化がみられます。\n起業時に掲げた二つの理念、\n「最先端の研究成果を世に展開する」 「技術者が持つスキルを最大限に発揮できるステージ作り」\nは変わりませんが、それらを実現するための手法や仕組みは状況に合わせて変えて行く必要があります。\n第８期は、改めて中長期的な目線をもち、新たな技術領域への挑戦、新たな顧客の開拓、新たなサービス形態の創造を目指します。\nそのために継続的な技術習得はもちろんのこと、人材採用の強化、パートナー企業様とのネットワーク創りに努め、質・量両面で研究者の方のご要望に応えられる体制にしていきたいと存じます。 何卒、ご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n敬具\n平成２６年８月２０日\n株式会社ビットマイスター\n代表取締役　笠原　勉\n","date":"2014/08/19","externalUrl":null,"permalink":"/posts/kasa/3360/","section":"Posts","summary":"拝啓\n残暑の候、皆様におかれましては益々ご壮健のこととお慶び申し上げます。\n平素は格別のお引き立てを賜り厚くお礼申し上げます。\n本日８月２０日をもちまして、株式会社ビットマイスターは創立７周年を迎えることとなりました。 これもひとえに皆様のご支援、ご厚情の賜物と存じます。\n関係者の皆様に深く感謝を申し上げます。\n第７期は、弊社が得意とする分野の一つである有無線通信制御技術に関連した研究開発プロジェクトに深く関わらせていただきました。 ネットワークの仮想化技術やセンサーネットワーク制御技術分野における新世代のネットワーク研究開発はチャレンジングな要素の多い開発ではありましたが、上位レイヤからコアなレイヤまで幅広く対応できるように蓄積してきたスキルを、開発に上手く活かせたのではないかと存じます。\nまた、当期はインダストリアルデザインや装置開発等のソフトウェア関係以外の企業様とも多く協業させていただきました。 おかげさまで提供可能な研究開発サービスの幅を広げることができました。\n一方、特化した分野における受託開発にリソースを集中させた関係で、先々を見越した事業の展開という面での活動が滞ったことは否めません。\n会社を立ち上げてから7年が経ちました。その間に日本では大きな震災を経験し、政権も変わりました。2020年には東京オリンピックの開催が予定されています。 当時と比べて、研究者の方、研究機関、研究コミュニティへ向けた社会からの要求は大きく変化してきているように感じます。また社内を見渡すと社員も歳を重ねて各々の生活にも変化がみられます。\n起業時に掲げた二つの理念、\n「最先端の研究成果を世に展開する」 「技術者が持つスキルを最大限に発揮できるステージ作り」\nは変わりませんが、それらを実現するための手法や仕組みは状況に合わせて変えて行く必要があります。\n第８期は、改めて中長期的な目線をもち、新たな技術領域への挑戦、新たな顧客の開拓、新たなサービス形態の創造を目指します。\nそのために継続的な技術習得はもちろんのこと、人材採用の強化、パートナー企業様とのネットワーク創りに努め、質・量両面で研究者の方のご要望に応えられる体制にしていきたいと存じます。 何卒、ご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n敬具\n平成２６年８月２０日\n株式会社ビットマイスター\n代表取締役　笠原　勉\n","title":"創立７周年のご挨拶","type":"posts"},{"content":" 謹賀新年\n旧年中は格別のご厚情を賜り、誠にありがとうございました。\n顧客のみなさま、業務パートナーの方々、社員を支えてくれたご家族のみなさま、お世話になった関係者の方々に改めて感謝申し上げます。\n昨年は、研究開発サービスをより充実させるために、提供サービスの拡充と、パートナーとの協業関係創りに力をいれた一年でした。従来から携わってきた新世代ネットワーク研究にて開発中の通信プロトコルに、SDNやセンサーネットワークなどの最新技術を融合させるプロジェクトに取り組むなかで、ますます高くなる研究者の要望に応えるべく、自社メンバーのスキルアップを図りながら、装置開発、デザインといったソフトウェア開発以外の分野も含む幅広い領域のパートナーにも協力をいただき、サービス体制を強化してきました。\nまた、博物館や大学向けに、教育・学習分野の研究用システムの開発もいくつかお手伝いさせていただきました。生身の人間を扱う“学び”の研究を通じて、情報通信の世界とはまた違った難しさを経験し、われわれとしても多くのことを学ばせていただいております。\nそして、研究室向けの統合コミュニティーウェア『 LabCommons』は、東日本大震災関連の調査研究プロジェクトの一つに情報発信ツールとして採用いただきました。本コミュニティーウェアが震災復興の一助になれたなら幸いです。\n『 技術表現研究所』では、研究評価方法の整理をするために、評価の基本論理を改めて学びながら、行政評価や研究評価における評価の設計、分析手法、最新事例等の情報収集を行いました。昨今、科学技術コミュニケーションの分野でも、その活動の評価についての議論を耳にすることが増えました。今後は、研究発表の機会の枠にとらわれず、科学技術を伝える活動に関する評価手法についても調査・研究を行っていきたいと考えております。\n本年は、研究開発サービスを更に充実させるため、引き続きパートナーとのネットワーク創りに力を入れていくとともに、新規採用も視野に入れた自社リソースの拡充も進めて参ります。そして弊社の研究開発サービスを新たな顧客に届けられればと存じます。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\nみなみな様にとって幸多い年になることを社員一同心よりお祈り申し上げ、新年のご挨拶とさせていただきます。\n平成26年1月\n株式会社ビットマイスター\n代表取締役　笠原 勉\n","date":"2013/12/31","externalUrl":null,"permalink":"/posts/kasa/3136/","section":"Posts","summary":" 謹賀新年\n旧年中は格別のご厚情を賜り、誠にありがとうございました。\n顧客のみなさま、業務パートナーの方々、社員を支えてくれたご家族のみなさま、お世話になった関係者の方々に改めて感謝申し上げます。\n昨年は、研究開発サービスをより充実させるために、提供サービスの拡充と、パートナーとの協業関係創りに力をいれた一年でした。従来から携わってきた新世代ネットワーク研究にて開発中の通信プロトコルに、SDNやセンサーネットワークなどの最新技術を融合させるプロジェクトに取り組むなかで、ますます高くなる研究者の要望に応えるべく、自社メンバーのスキルアップを図りながら、装置開発、デザインといったソフトウェア開発以外の分野も含む幅広い領域のパートナーにも協力をいただき、サービス体制を強化してきました。\nまた、博物館や大学向けに、教育・学習分野の研究用システムの開発もいくつかお手伝いさせていただきました。生身の人間を扱う“学び”の研究を通じて、情報通信の世界とはまた違った難しさを経験し、われわれとしても多くのことを学ばせていただいております。\nそして、研究室向けの統合コミュニティーウェア『 LabCommons』は、東日本大震災関連の調査研究プロジェクトの一つに情報発信ツールとして採用いただきました。本コミュニティーウェアが震災復興の一助になれたなら幸いです。\n『 技術表現研究所』では、研究評価方法の整理をするために、評価の基本論理を改めて学びながら、行政評価や研究評価における評価の設計、分析手法、最新事例等の情報収集を行いました。昨今、科学技術コミュニケーションの分野でも、その活動の評価についての議論を耳にすることが増えました。今後は、研究発表の機会の枠にとらわれず、科学技術を伝える活動に関する評価手法についても調査・研究を行っていきたいと考えております。\n本年は、研究開発サービスを更に充実させるため、引き続きパートナーとのネットワーク創りに力を入れていくとともに、新規採用も視野に入れた自社リソースの拡充も進めて参ります。そして弊社の研究開発サービスを新たな顧客に届けられればと存じます。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\nみなみな様にとって幸多い年になることを社員一同心よりお祈り申し上げ、新年のご挨拶とさせていただきます。\n平成26年1月\n株式会社ビットマイスター\n代表取締役　笠原 勉\n","title":"新年のご挨拶","type":"posts"},{"content":"今日はコンパイルの最適化オプションが単純なループと整数演算をどのくらい高速化できるかを見てみます。\nサンプルプログラムをCで書きました。1からコマンド引数に渡した値まで順番に足し合わせるtest.cです。\n#include \u0026lt;stdio.h\u0026gt; #include \u0026lt;stdlib.h\u0026gt; int main(int argc, char *argv[]) { long long unsigned int i=0, j=0, a=atoll(argv[1]); while (i\u0026lt;a) j += ++i; printf(\u0026#34;%llu\\n\u0026#34;, j); return 0; } 環境は Ubuntu 12.04 の gcc version 4.6.3 を使います。\n$ gcc -v ... gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) まずは、普通にコンパイルして実行します。\n$ gcc test.c $ time ./a.out 9876543210 11879564747017720423 real\t0m21.469s user\t0m21.469s sys\t0m0.000s 1から9876543210まで足し合わせるのに21秒かかりました。さて、最適化オプションを試してみましょう。ちなみに -O2 で有効になっているオプションを見るにはこんな感じでコマンドを打ちます。\n$ gcc -c -Q -O2 --help=optimizers | grep enabled -falign-functions [enabled] -falign-jumps [enabled] -falign-labels [enabled] -falign-loops [enabled] -fasynchronous-unwind-tables [enabled] -fbranch-count-reg [enabled] -fcaller-saves [enabled] -fcombine-stack-adjustments [enabled] ... うーん。なんとなく何をしてくれるかわかるのもあれば、よくわからないのもあります。ちゃんと知りたいときはmanを読めばいいんじゃないかな。とりあえず実行速度がどうなるのか知りたいだけなので -O2 を指定して実行してみましょう。\n$ gcc test.c -O2 $ time ./a.out 9876543210 11879564747017720423 real\t0m2.755s user\t0m2.748s sys\t0m0.004s おぉ、速くなった、速くなった。どんな理屈で速くなってるかは謎ですが、ちゃんと9876543210サイクルの計算をしてる気もします。詳しく調べてみると面白そう。せっかくだから Mac OS X Mavericks でもやってみましょう。\n$ gcc test.c -O $ time ./a.out 9876543210 11879564747017720423 real\t0m0.005s user\t0m0.001s sys\t0m0.002s なにこれ速すぎ。 Mavericks の xcode に入ってるコンパイラは、「これって等差数列の和を計算してるんだから、ループなんて必要ないじゃん」てことを解析してるっぽい。このコンパイラのバージョンはを見てみると、\n$ gcc -v ... Apple LLVM version 5.0 (clang-500.2.79) ... これ gcc やない、LLVM clang や。どうやら Mac OS X Mavericks の gcc コマンドの中身は LLVM clang みたいです。 LLVM かしこい。\n","date":"2013/12/04","externalUrl":null,"permalink":"/posts/bit/3072/","section":"Posts","summary":"今日はコンパイルの最適化オプションが単純なループと整数演算をどのくらい高速化できるかを見てみます。","title":"コンパイラの最適化オプション","type":"posts"},{"content":"拝啓　時下ますますご清祥のこととお慶び申し上げます。\n平素は、格別のお引き立てをいただき、厚くお礼申し上げます。\nさて、株式会社ビットマイスターは本日をもって創立６周年を迎えることとなりました。\nこれもひとえに皆様のご支援の賜物と心より感謝しております。\n事務所を移転し装いも新たに出発した第６期は、中長期を見越した新規投資の期と位置づけて、研究開発サービスの拡充と提供先の展開を進めました。\n主力である情報通信分野の研究開発サービスにおいては、新世代の通信プロトコルの研究をサポートするべく、上位からコアなレイヤまで幅広く対応できるようスキルの蓄積に努め、より難易度の高い要求に応えられる体制にいたしました。また、異分野、他機関に向けサービスの展開を図り、教育・学習分野の研究システムをいくつかお手伝いさせていただくことができました。情報通信分野で培ってきた検証用ソフトウェアの実装技術や国際標準化支援のノウハウが、教育・学習分野の研究にもお役に立てたなら幸いです。\n第７期も引き続き、研究計画から成果発表まで、研究開発活動を一気通貫して継続的にサポートするために、従来からの受託による試作ソフトウェア開発に加えて、「定額制の契約形態」や「研究機関向け統合コミュニティーウェア『LabCommons』を活用したウェブサービス」などの提供サービスの拡充を図っていきます。さらにパートナー様のご協力の元、「研究開発サービス企業ネットワークの構築」を進め、質・量両面で研究者の方のご要望に応えられるようにしていきたいと存じます。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n敬具\n平成２５年８月２０日\n株式会社ビットマイスター\n代表取締役　笠原 勉\n","date":"2013/08/20","externalUrl":null,"permalink":"/posts/kasa/3047/","section":"Posts","summary":"拝啓　時下ますますご清祥のこととお慶び申し上げます。\n平素は、格別のお引き立てをいただき、厚くお礼申し上げます。\nさて、株式会社ビットマイスターは本日をもって創立６周年を迎えることとなりました。\nこれもひとえに皆様のご支援の賜物と心より感謝しております。\n事務所を移転し装いも新たに出発した第６期は、中長期を見越した新規投資の期と位置づけて、研究開発サービスの拡充と提供先の展開を進めました。\n主力である情報通信分野の研究開発サービスにおいては、新世代の通信プロトコルの研究をサポートするべく、上位からコアなレイヤまで幅広く対応できるようスキルの蓄積に努め、より難易度の高い要求に応えられる体制にいたしました。また、異分野、他機関に向けサービスの展開を図り、教育・学習分野の研究システムをいくつかお手伝いさせていただくことができました。情報通信分野で培ってきた検証用ソフトウェアの実装技術や国際標準化支援のノウハウが、教育・学習分野の研究にもお役に立てたなら幸いです。\n第７期も引き続き、研究計画から成果発表まで、研究開発活動を一気通貫して継続的にサポートするために、従来からの受託による試作ソフトウェア開発に加えて、「定額制の契約形態」や「研究機関向け統合コミュニティーウェア『LabCommons』を活用したウェブサービス」などの提供サービスの拡充を図っていきます。さらにパートナー様のご協力の元、「研究開発サービス企業ネットワークの構築」を進め、質・量両面で研究者の方のご要望に応えられるようにしていきたいと存じます。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n敬具\n平成２５年８月２０日\n株式会社ビットマイスター\n代表取締役　笠原 勉\n","title":"創立６周年のご挨拶","type":"posts"},{"content":" 旧年中はひとかたならぬお引き立てにあずかり、誠にありがとうございました。\n顧客のみなさま、業務パートナーの方々、社員を支えてくれたご家族のみなさま、お世話になった関係者の方々に深く感謝申し上げます。\n創業5周年を迎えた昨年も、研究開発サービスを大学・研究機関向けに提供して参りました。新世代のネットワークアーキテクチャー、電波資源を効率的に利用するホワイトスペース帯の活用技術、異種有無線環境化での最適ネットワーク選択技術など、情報通信分野における検証用ソフトウェアの実装や国際標準化支援を主に行いました。また、新たに科学教育分野の研究システム開発を手掛けさせていただくことにもなりました。我々が提供したプロトタイプソフトウェアを利用して得られた成果が、研究者のみなさまの研究に少しでも役立てたなら幸いです。\nそして、研究用のプロトタイプソフトウェア開発と並行して、研究コミュニティー活動の支援も継続的に実施してきました。自社プロダクトである研究室向けの統合コミュニティーウェア『 LabCommons』を活用し、複数のサイエンスコミュニケーション関連組織の交流支援を行いました。支援を通じていただいたご意見・ご要望を『 LabCommons』の機能改善に反映させるとともに、積み上げた運営ノウハウを次の活動支援に活かしていければと考えております。\nさらに、研究成果や先端技術社会にわかり易く魅力的に発信するための方法論を探求すべく立ち上げた『 技術表現研究所』では、　技術展示における来場者の閲覧行動の調査研究結果を、 「日本展示学会」にて発表 しました。共同研究者の千葉工業大学の安藤先生にも同研究の成果を 「ヒューマンインタフェース学会」で発表 いただきました。今後も、技術の伝わり方の調査研究を発展させながら、効果的な技術表現の標準的な指標を確立していきたいと存じます。\nこうした取り組みを実行するにあたり、社員一人一人が技術力の向上に努めました。多くの選択肢の中から最適な解決策を提案できるように技術の引き出しを日々増やし続けています。OSSとして公開した開発支援ライブラリー『 BitMeister ASN.1　Library for Java™』においては実務の成果を反映しつつ更新を重ねています。加えて、７月には事務所を移転し、増資も実施しました。お客様に安定したサービスを提供できるよう社内開発環境を整備し、財務基盤の強化も図って参ります。\n本年は、研究開発サービスをより充実させるために、提供サービスの拡充と、パートナーとのネットワーク創りに力を入れていきます。まずは開発中の新たな学術研究支援のＷｅｂサービスを今年前半に提供を始める予定です。また研究計画の初期段階から研究開発システムの運用保守まで一気通貫して継続的にサポートができるように定額制の支援形態も現在検討中です。そして、ソフトウェア業にとどまらず、技術表現に関わるデザインや社会科学の分野の専門家との協業ネットワークを強化し、総合的な研究開発サービスプラットフォームを構築してきます。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\nみなみな様にとって幸多い年になることを社員一同心よりお祈り申し上げ、新年のご挨拶とさせていただきます。\n平成２５年　元旦 株式会社ビットマイスター 代表取締役　笠原 勉\n","date":"2012/12/31","externalUrl":null,"permalink":"/posts/kasa/2803/","section":"Posts","summary":" 旧年中はひとかたならぬお引き立てにあずかり、誠にありがとうございました。\n顧客のみなさま、業務パートナーの方々、社員を支えてくれたご家族のみなさま、お世話になった関係者の方々に深く感謝申し上げます。\n創業5周年を迎えた昨年も、研究開発サービスを大学・研究機関向けに提供して参りました。新世代のネットワークアーキテクチャー、電波資源を効率的に利用するホワイトスペース帯の活用技術、異種有無線環境化での最適ネットワーク選択技術など、情報通信分野における検証用ソフトウェアの実装や国際標準化支援を主に行いました。また、新たに科学教育分野の研究システム開発を手掛けさせていただくことにもなりました。我々が提供したプロトタイプソフトウェアを利用して得られた成果が、研究者のみなさまの研究に少しでも役立てたなら幸いです。\nそして、研究用のプロトタイプソフトウェア開発と並行して、研究コミュニティー活動の支援も継続的に実施してきました。自社プロダクトである研究室向けの統合コミュニティーウェア『 LabCommons』を活用し、複数のサイエンスコミュニケーション関連組織の交流支援を行いました。支援を通じていただいたご意見・ご要望を『 LabCommons』の機能改善に反映させるとともに、積み上げた運営ノウハウを次の活動支援に活かしていければと考えております。\nさらに、研究成果や先端技術社会にわかり易く魅力的に発信するための方法論を探求すべく立ち上げた『 技術表現研究所』では、　技術展示における来場者の閲覧行動の調査研究結果を、 「日本展示学会」にて発表 しました。共同研究者の千葉工業大学の安藤先生にも同研究の成果を 「ヒューマンインタフェース学会」で発表 いただきました。今後も、技術の伝わり方の調査研究を発展させながら、効果的な技術表現の標準的な指標を確立していきたいと存じます。\nこうした取り組みを実行するにあたり、社員一人一人が技術力の向上に努めました。多くの選択肢の中から最適な解決策を提案できるように技術の引き出しを日々増やし続けています。OSSとして公開した開発支援ライブラリー『 BitMeister ASN.1　Library for Java™』においては実務の成果を反映しつつ更新を重ねています。加えて、７月には事務所を移転し、増資も実施しました。お客様に安定したサービスを提供できるよう社内開発環境を整備し、財務基盤の強化も図って参ります。\n本年は、研究開発サービスをより充実させるために、提供サービスの拡充と、パートナーとのネットワーク創りに力を入れていきます。まずは開発中の新たな学術研究支援のＷｅｂサービスを今年前半に提供を始める予定です。また研究計画の初期段階から研究開発システムの運用保守まで一気通貫して継続的にサポートができるように定額制の支援形態も現在検討中です。そして、ソフトウェア業にとどまらず、技術表現に関わるデザインや社会科学の分野の専門家との協業ネットワークを強化し、総合的な研究開発サービスプラットフォームを構築してきます。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\nみなみな様にとって幸多い年になることを社員一同心よりお祈り申し上げ、新年のご挨拶とさせていただきます。\n平成２５年　元旦 株式会社ビットマイスター 代表取締役　笠原 勉\n","title":"新年のご挨拶","type":"posts"},{"content":"拝啓　時下ますますご清祥のこととお慶び申し上げます。\n平素は、格別のご高配を賜りまして厚くお礼申し上げます。\nさて、株式会社ビットマイスターは本日をもって創立５周年を迎えることとなりました。\nこれもひとえに皆様のご支援の賜物と心より感謝しております。\n第５期も、主として研究機関向けに研究開発サービスを提供して参りました。電波資源を効率的に利用するホワイトスペース帯の活用技術や、異種無線環境化での最適ネットワーク選択技術、新世代のネットワーク技術研究など、情報通信分野における研究開発ソフトウェアの実装サポートを行いました。\nまた、社内研究組織として新たに『 技術表現研究所』を立ち上げました。研究開発における成果を、研究者や技術者自身が社会にわかりやすく、かつ魅力的に伝えるための手法と、その伝わり方の評価について調査・研究をするためです。その成果は受託した研究実証システムに反映させるだけでなく、 関連学会での発表 や、 外部機関向けの講座 を通じて積極的に展開して参りました。\n自社サービスとして提供を始めた、統合コミュニティーウェア『 LabCommons』は、おかげ様で、研究室単独の利用から、学術コミュニティー、更には地域の科学教育ネットワークへと活用の幅が拡がってきております。機能追加のご要望も多数いただいており、今後も付加機能を充実させ、より使い勝手の良いサービスにしていきたいと存じます。開発支援ライブリーである『 BitMeister ASN.1　Library for Java™』は、さらなる開発効率向上を目指し日々更新中です。\nこうした取り組みを通じて、弊社の独自サービスに興味を持ったお客様からのお問い合わせも増えて参りました。プロトタイプシステムの開発、新規通信プロトコルの検証、ソフトウェア動作の可視化などの開発には、いずれも広く深い知識が求められます。お客様が期待される要件を一つでも多く形にするべく、社内勉強会の定期的な開催や、社外の科学技術コミュニティーへの積極的な参加などを通して、社員一同、新規技術のキャッチアップに努めています。\nそしてこの度、５周年を期に心機一転、事務所を移転いたしました。 県庁近くの公的機関が集まる静かな緊張感がある場所 です。加えて、増資も実施しております。引き続きお客様に安定したサービスを提供できるよう社内開発環境の充実と、財務基盤の強化を図っていきます。\n第６期は、さらに多くのお客様に弊社サービスをご利用いただき、科学技術の発展と普及に広く寄与していければと存じます。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n最後になりますが、創業来５年間の長きに渡りオフィスサポートとしてご支援くださった アステリVIP の皆様に、改めて深く感謝申し上げます。本当にお世話になりました。\n敬具\n平成２４年８月２０日\n株式会社ビットマイスター\n代表取締役　笠原 勉\n","date":"2012/08/19","externalUrl":null,"permalink":"/posts/kasa/2689/","section":"Posts","summary":"拝啓　時下ますますご清祥のこととお慶び申し上げます。\n平素は、格別のご高配を賜りまして厚くお礼申し上げます。\nさて、株式会社ビットマイスターは本日をもって創立５周年を迎えることとなりました。\nこれもひとえに皆様のご支援の賜物と心より感謝しております。\n第５期も、主として研究機関向けに研究開発サービスを提供して参りました。電波資源を効率的に利用するホワイトスペース帯の活用技術や、異種無線環境化での最適ネットワーク選択技術、新世代のネットワーク技術研究など、情報通信分野における研究開発ソフトウェアの実装サポートを行いました。\nまた、社内研究組織として新たに『 技術表現研究所』を立ち上げました。研究開発における成果を、研究者や技術者自身が社会にわかりやすく、かつ魅力的に伝えるための手法と、その伝わり方の評価について調査・研究をするためです。その成果は受託した研究実証システムに反映させるだけでなく、 関連学会での発表 や、 外部機関向けの講座 を通じて積極的に展開して参りました。\n自社サービスとして提供を始めた、統合コミュニティーウェア『 LabCommons』は、おかげ様で、研究室単独の利用から、学術コミュニティー、更には地域の科学教育ネットワークへと活用の幅が拡がってきております。機能追加のご要望も多数いただいており、今後も付加機能を充実させ、より使い勝手の良いサービスにしていきたいと存じます。開発支援ライブリーである『 BitMeister ASN.1　Library for Java™』は、さらなる開発効率向上を目指し日々更新中です。\nこうした取り組みを通じて、弊社の独自サービスに興味を持ったお客様からのお問い合わせも増えて参りました。プロトタイプシステムの開発、新規通信プロトコルの検証、ソフトウェア動作の可視化などの開発には、いずれも広く深い知識が求められます。お客様が期待される要件を一つでも多く形にするべく、社内勉強会の定期的な開催や、社外の科学技術コミュニティーへの積極的な参加などを通して、社員一同、新規技術のキャッチアップに努めています。\nそしてこの度、５周年を期に心機一転、事務所を移転いたしました。 県庁近くの公的機関が集まる静かな緊張感がある場所 です。加えて、増資も実施しております。引き続きお客様に安定したサービスを提供できるよう社内開発環境の充実と、財務基盤の強化を図っていきます。\n第６期は、さらに多くのお客様に弊社サービスをご利用いただき、科学技術の発展と普及に広く寄与していければと存じます。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n最後になりますが、創業来５年間の長きに渡りオフィスサポートとしてご支援くださった アステリVIP の皆様に、改めて深く感謝申し上げます。本当にお世話になりました。\n敬具\n平成２４年８月２０日\n株式会社ビットマイスター\n代表取締役　笠原 勉\n","title":"創立５周年のご挨拶","type":"posts"},{"content":"LabCommonsのサイト をリニューアルしました。 シンプルで洗練されたデザインに仕上がったのではないかと思います。さらに、独自のモジュールも追加しました。\n1つ目は、 プロフィール一覧表示モジュール です。これはユーザの新規登録時に入力した項目を一覧表示するモジュールです。表示対象項目の選択、表示対象ユーザの選択などを設定できます。 表示対象項目は個人情報管理モジュールのポリシーに従って表示されるので情報漏えいの心配もありません。また、ログインしていない閲覧者にも表示させたい場合に、ゲスト権限で閲覧できるように設定することも可能です。\n2つ目は、 汎用データベースモジュール と連携する汎用データベースピックアップモジュールです。 デモサイト をご覧いただくと分かるかと思いますが、その名の通り汎用データベースに入力されたコンテンツの一部をピックアップして表示するモジュールです。「新着●●件」もしくは、「コンテンツを選択（複数可）」の2通りでピックアップできます。\nピックアップ元のコンテンツ http://labcommons.bitmeister.jp/demo/activity/report/\nピックアップ後のコンテンツ（ページ下部） http://labcommons.bitmeister.jp/demo/\n","date":"2012/07/11","externalUrl":null,"permalink":"/posts/youtan/2677/","section":"Posts","summary":"LabCommonsのサイト をリニューアルしました。 シンプルで洗練されたデザインに仕上がったのではないかと思います。\nさらに、独自のモジュールも追加しました。\n","title":"LabCommonsサイトリニューアル！","type":"posts"},{"content":"Unix系OSのルートディレクトリ直下にある \u0026ldquo;/usr\u0026rdquo; はなんの略なのか。 巷の意見はおおよそこんな感じです。\n「もちろん \u0026ldquo;USeR\u0026rdquo; の略でしょ。」 「あまいな。 \u0026ldquo;User Services and Routines\u0026rdquo; の略だ。」 「その \u0026ldquo;User SR\u0026rdquo; の略だっていうソースはあるの？」\nどうもはっきりしません。そこで調べ始めたら、思いのほか深入りしてしまったので、今回調べたことを書いておきます。\n0. Unixユーザグループの機関誌に載っていた説 # Unixユーザグループの機関誌に \u0026ldquo;User Services and Routines\u0026rdquo; の略だと書いてあったという情報が散見しますが、ここではそれをソースとして認めません。その記事に「XXXのドキュメントに書いてある」とか、「IEEE NNN.N で決まっている」とか書いてあれば一件落着なのですが、原典を見つけることはできませんでした。\n1. Filesystem Hierarchy Standard (FHS) # FHSはUnixライクなシステム(Linuxディストリビューションなど)のファイルシステム階層構造を整理したガイドラインです。FHS v2.3(2004)とv1.0(1994)を確認した限りでは、 \u0026ldquo;User SR\u0026rdquo; など、 \u0026ldquo;USeR\u0026rdquo; 以外の略であることを示唆する記載は見当たりませんでした。\n2. \u0026ldquo;/usr\u0026rdquo; と \u0026ldquo;/home\u0026rdquo; # そもそも、 \u0026ldquo;/usr\u0026rdquo; が \u0026ldquo;USeR\u0026rdquo; の略なら、なぜ \u0026ldquo;/home\u0026rdquo; とか \u0026ldquo;/Users\u0026rdquo; とかが別にあるのかという疑問から、 \u0026ldquo;/usr\u0026rdquo; は何か別の略語なのではという発想が生まれます。 POSIXに \u0026ldquo;/usr\u0026rdquo; の意味に関する記載は見つかりませんでしたが、Homeディレクトリの定義はこうです。\nIEEE Std 1003.1, 2004 Edition\n3.192 Home Directory The directory specified by the HOME environment variable.\nつまり、POSIXでは環境変数HOMEに指定されたディレクトリがHomeディレクトリなんです。 \u0026ldquo;/home/\u0026rdquo; 、 \u0026ldquo;/Users/\u0026rdquo; あるいは \u0026ldquo;/usr/\u0026rdquo; にあってもいいのです。じゃぁ、本当に \u0026ldquo;/usr/\u0026rdquo; 配下にユーザの標準カレントディレクトリを作っていたシステムがあったかというと、それは次節です。\n3. Version 6 Unix (V6, Sixth Edition Unix) # 時代を遡ります。Version 6 Unix はベル研究所が作った、すべてのUnixの先祖です。V6といっても System V より古く、もちろんPOSIXが決められる以前のものです。1975年のV6のマニュアルには以下のようにあります。\nSETTING UP UNIX - Sixth Edition\nNew Users Install new users by editing the password file /etc/passwd (passwd-V). You\u0026rsquo;ll have to make current direc- tories for the new users and change their owners to the new- ly installed name. Login as each user to make sure the password file is correctly edited. For example:\ned /etc/passwd $a joe::10:1::/usr/joe: . w q mkdir /usr/joe chown joe /usr/joe login joe ls -la login root\nThis will make a new login entry for joe. His default current directory is /usr/joe which has been created. The delivered password file has the user ken\nどうやら、古くはユーザの標準カレントディレクトリは \u0026ldquo;/usr/\u0026rdquo; 配下に作るのが普通だったようです。もっとも、当時から \u0026ldquo;/usr/bin\u0026rdquo; や \u0026ldquo;/usr/lib\u0026rdquo; は存在していたので、 \u0026ldquo;User Services and Routines\u0026rdquo; 説も完全には捨て切れませんが、やはりその根拠に乏しい。ユーザの標準カレントディレクトリを格納するから \u0026ldquo;USeR\u0026rdquo; を略して \u0026ldquo;/usr\u0026rdquo; だと考えたほうが自然に思います。 後続のUnix系OSのドキュメントを追っていくと、しばらくは標準カレントディクトリに \u0026ldquo;/usr/\u0026rdquo; を指定していることがわかります。その後、NFSをマウントしてブートする都合上、読み込み専用データを \u0026ldquo;/usr\u0026rdquo; に残し、その他のインディビデュアルなデータを \u0026ldquo;/home\u0026rdquo; に退避したようです。\n4. RT-11のUSR混同説 # 昔から火の無い所に煙は立たぬと申しまして、 \u0026ldquo;User SR\u0026rdquo; 説が生まれたきっかけはなんだったのだろうかと。RT-11のドキュメントにそれと思しき記載を見つけました。RT-11はDEC(Digital Equipment Corporation)のミニコンPDP-11で動作する、DEC純正のリアルタイムOSです。 説明していませんでしたが、前述の V6 Unix もPDP-11で動作するOSです。 1976年のRT-11 V2Cのシステムリファレンスマニュアルには以下のようにあります。\nRT-11 V2C System Reference Manual 1976\n2.3.3 User Service Routine (USR) The User Service Routine provides support for the RT-11 file structure. It loads device handlers, opens files for read or write operations, deletes and renames files, and creates new files. the Command String Interpreter (the use of which is described in Section 2.5) is part of the USR and can be accessed by any program to interpret device and file I/O information.\nRT-11はまったく触ったことがないのですが、どうやらこの \u0026ldquo;User Service Routine\u0026rdquo; はOSが提供するファイルI/O関連機構のようです。推察で申し訳ないのですが、おそらく \u0026ldquo;/usr\u0026rdquo; を \u0026ldquo;User SR\u0026rdquo; だと言い始めた人はRT-11の \u0026ldquo;User Service Routine\u0026rdquo; と混同していたのが原因なのではないでしょうか。\n5. まとめ # Unix系OSの \u0026ldquo;/usr\u0026rdquo; が \u0026ldquo;User SR\u0026rdquo; の略であるという裏付けは見つかりませんでした。それがない限りは、 \u0026ldquo;USeR\u0026rdquo; の略とするのが自然であるというのが今のところの結論です。 今まで「ゆーざー」と読むか「ゆー・えす・あーる」と読むかで迷っていたのですが、これからは「ゆーざー」と読むことにします。\n","date":"2012/01/19","externalUrl":null,"permalink":"/posts/bit/2516/","section":"Posts","summary":"Unix系OSのルートディレクトリ直下にある “/usr” はなんの略なのか。 巷の意見はおおよそこんな感じです。\n「もちろん “USeR” の略でしょ。」 「あまいな。 “User Services and Routines” の略だ。」 「その “User SR” の略だっていうソースはあるの？」\nどうもはっきりしません。そこで調べ始めたら、思いのほか深入りしてしまったので、今回調べたことを書いておきます。\n","title":"/usr は何の略か","type":"posts"},{"content":" 謹賀新年\n旧年中は格別なご高配を賜り、誠にありがとうございました。\n顧客の皆様をはじめとして、業務パートナーの方々、 レンタルオフィスのアステリVIP スタッフの皆様、そして、社員を支えてくれているご家族の皆様、その他、お世話になった全ての関係者の方に深く感謝いたします。\nまた、先の大震災で被災された皆様には心からお見舞いを申し上げるとともに、被災された地域の一日も早い復興を祈願いたします。\n未曾有の災害にさらされた昨年は、情報通信技術の無力さと必要性の双方を強く感じさせられた年でした。 通信がつながることのありがたさ、情報が正確にわかりやすく伝わることの大事さを思い知らされました。\nそんな中、弊社は引き続き研究機関向けの研究開発サービス事業を推進して参りました。周波数の利用効率を向上させる異種無線制御技術や、複雑化するネットワーク運用の負荷を軽減させるためのネットワーク仮想化技術の研究開発を、主に支援させていただきました。こうした支援が、通信をつなげる技術の向上の一助になれたなら幸いです。\nさらに、研究開発サービスの一環として技術をわかり易く魅力的に伝えることを目指して取り組んできた「科学技術コミュニケーション」分野の調査研究に関し、『 技術表現研究所』という研究組織を正式に立ち上げました。今後は本研究所を通じて、研究成果や先端技術を社会にわかりやすく発信するための方法論を探求していきたいと存じます。\nそして、顧客である研究者の皆様の想いを形にする技を一つでも多く手に入れるべく、社員一同、新技術の取り込みにも注力しました。 先端技術調査と試作開発の継続的な実施、定期的な社内勉強会開催によるノウハウ共有、また、新たな知見を得るための社外コミュニティーへも精力的に参加して参りました。その成果の一部は、 弊社ブログ に掲載したほか、 オープンソースプロジェクト や、 外部機関向けの講座 などを通じて公開しております。\n本年は、いままで積み重ねてきた情報通信技術や技術表現のノウハウを、新規顧客に向けても積極的に展開していく予定です。 弊社が最も得意とする分野の一つである有無線通信制御技術は、スマートグリッド分野や次世代エネルギー分野などに適用していきたいと存じます。 技術表現研究所における調査・研究の成果は、弊社サービスに活用するだけではなく、科学技術コミュニケーション分野の伝えるスキルの一つとして関係者が広く利用できるように積極的に公開していきます。\n本年もよりいっそうのご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n皆々様にとりまして、新しい年がより幸の多き年となりますようお祈り申し上げ、新年のご挨拶とさせていただきます。\n平成２４年　元日 株式会社ビットマイスター 代表取締役　笠原勉\n","date":"2011/12/31","externalUrl":null,"permalink":"/posts/kasa/2495/","section":"Posts","summary":" 謹賀新年\n旧年中は格別なご高配を賜り、誠にありがとうございました。\n顧客の皆様をはじめとして、業務パートナーの方々、 レンタルオフィスのアステリVIP スタッフの皆様、そして、社員を支えてくれているご家族の皆様、その他、お世話になった全ての関係者の方に深く感謝いたします。\nまた、先の大震災で被災された皆様には心からお見舞いを申し上げるとともに、被災された地域の一日も早い復興を祈願いたします。\n未曾有の災害にさらされた昨年は、情報通信技術の無力さと必要性の双方を強く感じさせられた年でした。 通信がつながることのありがたさ、情報が正確にわかりやすく伝わることの大事さを思い知らされました。\nそんな中、弊社は引き続き研究機関向けの研究開発サービス事業を推進して参りました。周波数の利用効率を向上させる異種無線制御技術や、複雑化するネットワーク運用の負荷を軽減させるためのネットワーク仮想化技術の研究開発を、主に支援させていただきました。こうした支援が、通信をつなげる技術の向上の一助になれたなら幸いです。\nさらに、研究開発サービスの一環として技術をわかり易く魅力的に伝えることを目指して取り組んできた「科学技術コミュニケーション」分野の調査研究に関し、『 技術表現研究所』という研究組織を正式に立ち上げました。今後は本研究所を通じて、研究成果や先端技術を社会にわかりやすく発信するための方法論を探求していきたいと存じます。\nそして、顧客である研究者の皆様の想いを形にする技を一つでも多く手に入れるべく、社員一同、新技術の取り込みにも注力しました。 先端技術調査と試作開発の継続的な実施、定期的な社内勉強会開催によるノウハウ共有、また、新たな知見を得るための社外コミュニティーへも精力的に参加して参りました。その成果の一部は、 弊社ブログ に掲載したほか、 オープンソースプロジェクト や、 外部機関向けの講座 などを通じて公開しております。\n本年は、いままで積み重ねてきた情報通信技術や技術表現のノウハウを、新規顧客に向けても積極的に展開していく予定です。 弊社が最も得意とする分野の一つである有無線通信制御技術は、スマートグリッド分野や次世代エネルギー分野などに適用していきたいと存じます。 技術表現研究所における調査・研究の成果は、弊社サービスに活用するだけではなく、科学技術コミュニケーション分野の伝えるスキルの一つとして関係者が広く利用できるように積極的に公開していきます。\n本年もよりいっそうのご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n皆々様にとりまして、新しい年がより幸の多き年となりますようお祈り申し上げ、新年のご挨拶とさせていただきます。\n平成２４年　元日 株式会社ビットマイスター 代表取締役　笠原勉\n","title":"新年のご挨拶","type":"posts"},{"content":"拝啓　時下ますますご清祥のこととお喜び申し上げます 平素は格別のお引き立てを賜り厚くお礼申し上げます。 また先般の東日本大震災で被災された皆さまに心よりお見舞い申し上げますとともに 一日も早い復興をお祈り申し上げます\nさて、本日8月20日をもちまして、株式会社ビットマイスターは創立4周年を迎えることができました。 これもひとえに皆様のご支援、ご厚情の賜物と存じます。\n顧客の皆様をはじめ、パートナーの方々、 レンタルオフィスのアステリVIP の皆様、そして、社員のご家族の皆様、その他、お世話になった全ての関係者の方に深く感謝いたします。\n第４期は、研究開発サービス事業の更なる拡充を図るために、スマートフォンやタブレット端末などの新しいデバイス向けの開発技術を始めとして、広く新技術の取り込みに注力いたしました。\nそして、これまで得られた知見を公開し、既存顧客以外からのフィードバックも試みました。統合コミュニティーウェア『 LabCommons』は自社サービスとして、開発支援ライブラリー『 BitMeister ASN.1 Library for Java™』はオープンソースプロジェクトとしてそれぞれ公開いたしました。また、弊社運営サイトを使った技術情報の発信にも努め、公開実験室である『 ビットラボ』にて紹介していたWebAPI『 おはこん番地は！？API』は日経ソフトウエアの「特集 \u0026ldquo;使える\u0026rdquo; Web API 30選」 に掲載されることもありました。さらに、外部の企画コンテストに挑戦し、（独）防災科学技術研究所が主催したコンテストにおいて、アプリ開発部門の優秀賞をいただくことができました。\nまた、研究開発サービスの一環として技術をわかり易く魅力的に伝えることを目指して取り組んできた「科学技術コミュニケーション」分野の調査研究に関しては、『 技術表現研究所』という研究組織を正式に立ち上げました。今後は、本研究所にて外部有識者と連携しながら、効果的な技術表現の調査研究や実証実験を行っていく予定です。\n第5期はこうした一連の取り組みの成果を活用し、幅広いソフトウェア知識と科学技術コミュニケーションスキルを組み合わせた、独自の研究開発サービスをより多くのお客様に提供していく所存です。\n今期も引き続き、科学技術の発展と普及に寄与していきたいと存じます。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n敬具\n平成23年8月20日 株式会社ビットマイスター 代表取締役　笠原勉\n","date":"2011/08/20","externalUrl":null,"permalink":"/posts/kasa/2281/","section":"Posts","summary":"拝啓　時下ますますご清祥のこととお喜び申し上げます 平素は格別のお引き立てを賜り厚くお礼申し上げます。 また先般の東日本大震災で被災された皆さまに心よりお見舞い申し上げますとともに 一日も早い復興をお祈り申し上げます\nさて、本日8月20日をもちまして、株式会社ビットマイスターは創立4周年を迎えることができました。 これもひとえに皆様のご支援、ご厚情の賜物と存じます。\n顧客の皆様をはじめ、パートナーの方々、 レンタルオフィスのアステリVIP の皆様、そして、社員のご家族の皆様、その他、お世話になった全ての関係者の方に深く感謝いたします。\n第４期は、研究開発サービス事業の更なる拡充を図るために、スマートフォンやタブレット端末などの新しいデバイス向けの開発技術を始めとして、広く新技術の取り込みに注力いたしました。\nそして、これまで得られた知見を公開し、既存顧客以外からのフィードバックも試みました。統合コミュニティーウェア『 LabCommons』は自社サービスとして、開発支援ライブラリー『 BitMeister ASN.1 Library for Java™』はオープンソースプロジェクトとしてそれぞれ公開いたしました。また、弊社運営サイトを使った技術情報の発信にも努め、公開実験室である『 ビットラボ』にて紹介していたWebAPI『 おはこん番地は！？API』は日経ソフトウエアの「特集 “使える” Web API 30選」 に掲載されることもありました。さらに、外部の企画コンテストに挑戦し、（独）防災科学技術研究所が主催したコンテストにおいて、アプリ開発部門の優秀賞をいただくことができました。\nまた、研究開発サービスの一環として技術をわかり易く魅力的に伝えることを目指して取り組んできた「科学技術コミュニケーション」分野の調査研究に関しては、『 技術表現研究所』という研究組織を正式に立ち上げました。今後は、本研究所にて外部有識者と連携しながら、効果的な技術表現の調査研究や実証実験を行っていく予定です。\n第5期はこうした一連の取り組みの成果を活用し、幅広いソフトウェア知識と科学技術コミュニケーションスキルを組み合わせた、独自の研究開発サービスをより多くのお客様に提供していく所存です。\n今期も引き続き、科学技術の発展と普及に寄与していきたいと存じます。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n敬具\n平成23年8月20日 株式会社ビットマイスター 代表取締役　笠原勉\n","title":"創立4周年の挨拶","type":"posts"},{"content":" 謹賀新年\n旧年中はひとかたならぬお引き立てにあずかり、誠にありがとうございました。\n顧客の皆様をはじめ、パートナーの方々、 レンタルオフィスのアステリVIP スタッフの皆様、そして、社員を支えてくれているご家族の皆様、その他、お世話になった全ての関係者の方に深く感謝いたします。\n昨年も、 次世代通信規格に関わる試作ソフトウェア開発 を中心として、大学・研究機関向けの研究開発サービス事業を推進して参りました。研究者の方々が生み出した研究成果に、我々の開発したソフトウェア技術が貢献できたことを嬉しく思います。\n”理論を形に”する『 インプリメントサービス』の拡充を図るために、従来のPCベースのLinux開発に加えて、急速に普及が進むスマートフォンやタブレット端末などの新しいデバイス向けの開発ノウハウの蓄積にも努めました。それら成果の一部は、AndroidやiOS向けの通信アプリケーションやユーザインタフェースとして既に実サービスに組み込んでいます。Androidに関しては、 （独）防災科学技術研究所が主催したコンテストのアプリ開発部門において、優秀賞をいただく こともできました。\nまた、”魅せて伝える”『 プロモーションサポート』の一環として、研究室に特化したコミュニティウェア『 LabCommons』をリリースしました。『 LabCommons』は、NetCommonsをベースにしたコンテンツマネージメントシステムです。研究室の情報発信を簡単に行うことができます。さらに、継続して活用していただくための様々な仕掛けを組み込みこんでおり、研究室内の情報共有や外部機関との共同作業にも利用できるプラットフォームとしても利用できます。 6月には内閣府 総合科学技術会議が、一定額以上の公的研究資金を獲得した研究者に国民との科学・技術対話(アウトリーチ活動)を義務づける決定を行うなど、 研究者のアウトリーチ活動の義務化を行う動きが高まってきています。忙しい研究者の方々が限られたリソースの中で効果的に情報発信するために『 LabCommons』が一助になれば幸いです。 なお、本開発には「 東京理科大学の長谷川研究室」のみなさまにモニターの協力をいただいております。ここに改めて感謝申し上げます。\n本年は、情報通信分野で培ったノウハウを活かした独自ソフトウェアをリリースしていく予定です。 また、技術をわかり易くかつ魅力的に伝えることを目指して取り組んできた「科学技術コミュニケーション」という分野に関しては、調査研究のための専門組織を立ち上げる計画です。大学や関連組織と連携しながら、効果的な技術表現の調査研究や実証実験を行っていく予定です。\nこうした取り組みを通じて、高いソフトウェア技術と多様な科学技術コミュニケーションスキルを組み合わせた、他にはないトータルな研究開発サービスを提供していきます。サービスの幅を広げ、かつ提供スピードを上げるためにも、他企業とのアライアンスも積極的に進めていきます。\n本年も引き続き、研究開発サービスの提供を通じて科学技術の発展と普及に寄与し、お客様へより良いサービスを届けられるように、社員一同、知識と技に一層の磨きをかけていく所存です。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n平成２３年元旦\n株式会社ビットマイスター\n代表取締役　笠原勉\n","date":"2010/12/31","externalUrl":null,"permalink":"/posts/kasa/1958/","section":"Posts","summary":" 謹賀新年\n旧年中はひとかたならぬお引き立てにあずかり、誠にありがとうございました。\n顧客の皆様をはじめ、パートナーの方々、 レンタルオフィスのアステリVIP スタッフの皆様、そして、社員を支えてくれているご家族の皆様、その他、お世話になった全ての関係者の方に深く感謝いたします。\n昨年も、 次世代通信規格に関わる試作ソフトウェア開発 を中心として、大学・研究機関向けの研究開発サービス事業を推進して参りました。研究者の方々が生み出した研究成果に、我々の開発したソフトウェア技術が貢献できたことを嬉しく思います。\n”理論を形に”する『 インプリメントサービス』の拡充を図るために、従来のPCベースのLinux開発に加えて、急速に普及が進むスマートフォンやタブレット端末などの新しいデバイス向けの開発ノウハウの蓄積にも努めました。それら成果の一部は、AndroidやiOS向けの通信アプリケーションやユーザインタフェースとして既に実サービスに組み込んでいます。Androidに関しては、 （独）防災科学技術研究所が主催したコンテストのアプリ開発部門において、優秀賞をいただく こともできました。\nまた、”魅せて伝える”『 プロモーションサポート』の一環として、研究室に特化したコミュニティウェア『 LabCommons』をリリースしました。『 LabCommons』は、NetCommonsをベースにしたコンテンツマネージメントシステムです。研究室の情報発信を簡単に行うことができます。さらに、継続して活用していただくための様々な仕掛けを組み込みこんでおり、研究室内の情報共有や外部機関との共同作業にも利用できるプラットフォームとしても利用できます。 6月には内閣府 総合科学技術会議が、一定額以上の公的研究資金を獲得した研究者に国民との科学・技術対話(アウトリーチ活動)を義務づける決定を行うなど、 研究者のアウトリーチ活動の義務化を行う動きが高まってきています。忙しい研究者の方々が限られたリソースの中で効果的に情報発信するために『 LabCommons』が一助になれば幸いです。 なお、本開発には「 東京理科大学の長谷川研究室」のみなさまにモニターの協力をいただいております。ここに改めて感謝申し上げます。\n本年は、情報通信分野で培ったノウハウを活かした独自ソフトウェアをリリースしていく予定です。 また、技術をわかり易くかつ魅力的に伝えることを目指して取り組んできた「科学技術コミュニケーション」という分野に関しては、調査研究のための専門組織を立ち上げる計画です。大学や関連組織と連携しながら、効果的な技術表現の調査研究や実証実験を行っていく予定です。\nこうした取り組みを通じて、高いソフトウェア技術と多様な科学技術コミュニケーションスキルを組み合わせた、他にはないトータルな研究開発サービスを提供していきます。サービスの幅を広げ、かつ提供スピードを上げるためにも、他企業とのアライアンスも積極的に進めていきます。\n本年も引き続き、研究開発サービスの提供を通じて科学技術の発展と普及に寄与し、お客様へより良いサービスを届けられるように、社員一同、知識と技に一層の磨きをかけていく所存です。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n平成２３年元旦\n株式会社ビットマイスター\n代表取締役　笠原勉\n","title":"新年のご挨拶","type":"posts"},{"content":"Javaのアクセス修飾子protectedで少しハマったので、調べた内容をメモしておきます。\n通常、protectedと指定されたフィールドやメソッドは「同一package内と、そのクラスを継承したサブクラス内からアクセスできる」と説明されます。私自身も同様の理解だったのですが、次のようなケースで予想外の挙動となりました。\nクラスBaseとChildが別のpackageに属する場合、\npackage base; public class Base { protected void baseMethod() { System.out.println(\u0026#34;Base method.\u0026#34;); } } package child; import base.Base; public class Child extends Base { public void childMethod(Base base) { base.baseMethod();\t// NG } } Childクラスの中でBaseクラスの引数を受け取ってbaseMethod()を呼び出そうとすると、\u0026ldquo;The method baseMethod() from the type Base is not visible\u0026quot;と怒られてしまうのです。\n実は、Javaのprotected指定の意味は、正確には「同一パッケージ内と、そのクラスを継承したサブクラス内から、 そのサブクラスへの参照を通して アクセスできる」となります。つまり、Childクラスの中から呼ぶことができるbaseMethod()は、あくまでもChildクラス(またはChildクラスのサブクラス)のbaseMethod()であり、Baseクラスのそれではないのです。\n例えば、次のケースではbaseMethod()を呼ぶことができます。\npackage child; import base.Base; public class Child extends Base { public void childMethod(Child child) { this.baseMethod();\t// OK child.baseMethod();\t// OK } } 確かに、親クラスのprotectedフィールドをサブクラスから直接書き換えられると問題があるかもしれませんが、そういうフィールドはprivateにすればよい(というか、そうするべき)し、メソッド呼び出しはポリモーフィズムにすることができるので、これは少々余計な制限であるように思います。\nどうしてもChildクラスの中からBaseクラスの参照を使ってbaseMethod()を呼び出したい場合は、\npackage base; public class Base { protected void baseMethod() { System.out.println(\u0026#34;Base method.\u0026#34;); } protected void invokeBaseMethod(Base base) { base.baseMethod(); } } package child; import base.Base; public class Child extends Base { public void childMethod(Base base) { invokeBaseMethod(base); } } こんなふうにするしか手はなさそうです。\n","date":"2010/12/06","externalUrl":null,"permalink":"/posts/jun/1934/","section":"Posts","summary":"Javaのアクセス修飾子protectedで少しハマったので、調べた内容をメモしておきます。","title":"Javaのprotectedの意味","type":"posts"},{"content":"研究室向けの情報共有・発信をサポートするコミュニティウェア「 LabCommons」をリリースしました。\n機能概要 # グループウェア ゼミなどの作業報告や所属メンバーのスケジュール管理、ファイル共有、Wikiページ作成などを行うことができます。\nSNS・ポータルサイト 共同研究機関との間で掲示板やファイル共有、Wikiページ、チャットなどを利用して情報共有ができます。 また、ポータルサイトを構築し、同種の研究者との交流の場として利用することもできます。\nWebサイト ホームページを構築し、外部に情報を発信することができます。ページの更新も簡単にできるので初心者の方でも安心です。\nLabCommons を作成するきっかけは、研究室で下記のような問題があることを聞き、なんとかできないかと考えたからです。\n研究室の問題点 # 大学の先生は忙しく、外出していることも多いため、先生が捕まらず、質問があまりできない。（学生） 学生の進捗管理などをWordファイル等で行っているが管理が大変。（先生） 研究の経過やツールの使い方等の情報が残っていないため、研究の引継ぎがうまく行かない。（先生、学生） ゼミや学会などのスケジュールの管理が大変。リマインダーメールなどを送りたい。（先生、学生） グループウェアとWebサイトを別のシステムで構築しているため、アカウント管理が2重になっている（先生） LabCommons ではこれらの問題を、グループウェア、SNS・ポータルサイト、Webサイトを一つのシステムで実現することで解決します。 また、最近、公的研究費を獲得した研究者に対してアウトリーチ活動を義務化する動きがあります。 アウトリーチとは、研究成果を一般向けに分かりやすく説明し、理解を得ることです。 学生のうちからWebサイト等でアウトリーチを意識することで、社会に出た時に役立つのではないかと考えています。\n詳細は LabCommons のWebサイトをご覧ください。\nURL: http://labcommons.bitmeister.jp\nお問い合せ # TEL: 048-711-1930\nE-MAIL: labcommons@bitmeister.jp\n担当: 田辺\n","date":"2010/11/22","externalUrl":null,"permalink":"/posts/youtan/1881/","section":"Posts","summary":"研究室向けの情報共有・発信をサポートするコミュニティウェア「LabCommons」をリリースしました。","title":"研究室の情報共有 LabCommons","type":"posts"},{"content":"「 おはこん番地は！？ API」の新機能と、最近話題のHTML5のCanvas要素を使って 3D天球儀 を作ってみました。\n任意の時刻と場所の、太陽と月の位置、月の満ち欠けを3Dで表示します。\nちなみに今年の中秋の名月は9月22日です。 9月22日午後8時の東京の月を見るには ここをクリック してください。\n続きはHTML5の話です。\nHTML5のCanvas要素を使う上で問題になるのが、ブラウザによってサポートしているメソッドとその挙動がかなり違うことです。IE8に至ってはそもそもCanvas要素をサポートしていません。そこで幾つか対処法を調べてみました。\nまずGoogleが作った ExplorerCanvas。 JavaScriptのライブラリでバックエンドにVMLを使い、IEでCanvasを描画します。このライブラリはよく出来ているのですが、テキスト表示などをサポートしていません。\n続いて uuCanvas。 ExplorerCanvasと同様、JavaScriptのライブラリですが、ExplorerCanvasより高機能です。バックエンドにSilverlight、Flash、VMLのどれを使うか選べます。さらに、IE以外のブラウザも非サポートのメソッドを使用できるように拡張してくれます。また、独自のメソッドを使って高速化も可能です。\nどちらがよいかはケースによりけりだと思いますので、両方試し軽量かつ意図したとおりに描画される方を選べば良いと思います。\n","date":"2010/09/09","externalUrl":null,"permalink":"/posts/bit/1834/","section":"Posts","summary":"「 おはこん番地は！？ API」の新機能と、最近話題のHTML5のCanvas要素を使って 3D天球儀 を作ってみました。","title":"おはこん番地は！？ API with HTML5","type":"posts"},{"content":"日の出・日の入り時刻を計算する「 おはこん番地は！？ API」に大幅な機能拡張を行い、Version 2.0 として公開しました。新たに月の出・月の入り時刻、太陽と月の位置、正午月齢、月相を計算する機能が追加されています。\n旧バージョンとの互換性は保持していますので、既に利用中のアプリケーションはそのままご利用いただけるはずです。事前にご連絡頂きましたアプリケーションについては、動作を確認しています。\n簡単に追加機能の意味に触れておきます。\n月の出・月の入り # 普段はあまり気に留めませんが、月の出・月の入り時刻は平均して1日当たり約50分づつ遅れていきます。毎日正確に50分づつ遅れるなら計算は簡単なのですが、30分遅れることもあれば、1時間のこともあります。その関係で、夜に月が出ていることもあれば、昼しか出ていないこともあります。 これからの季節、お月見をするのに月が出ていなかったという失敗を避けるため、月の出・月の入り時刻をあらかじめ調べておくと便利です。\n太陽と月の位置 # ある場所と日時に太陽や月がどの方角でどの高さにあるかを計算できます。例えば、冬に新しい家を選ぶとき、夏の太陽の位置を調べ、日当たりはどうなるかを予想することが出来ます。 あるいは、天文写真の撮影で月が邪魔になるとき、撮影時間の月の位置を調べておくこともできます。\n正午月齢、月相 # 月齢は前回の新月からの経過日数を表します。通常、月齢を数える日の正午から計算した月齢を正午月齢と呼び、その日の月齢とします。よくカレンダーなどに載っています。 一方、月相は月の満ち欠けを表します。0°が新月、90°が上弦、180°が満月、270°が下弦です。月の出・月の入りと同様、お月見に便利です。月齢と月相はほぼ連動しますが、全く同じ値ではありません。\nWikipedia: 月相\nおはこん番地は！？ API の用途はアイデア次第です。 ぜひ色々な使い方を探してみてください。\n","date":"2010/09/01","externalUrl":null,"permalink":"/posts/bit/1815/","section":"Posts","summary":"日の出・日の入り時刻を計算する「 おはこん番地は！？ API」に大幅な機能拡張を行い、Version 2.0 として公開しました。新たに月の出・月の入り時刻、太陽と月の位置、正午月齢、月相を計算する機能が追加されています。\n旧バージョンとの互換性は保持していますので、既に利用中のアプリケーションはそのままご利用いただけるはずです。事前にご連絡頂きましたアプリケーションについては、動作を確認しています。\n","title":"おはこん番地は！？ API Version 2.0","type":"posts"},{"content":" 拝啓、時下益々ご清祥のこととお喜び申し上げます。\n平素はひとかたならぬお引き立てを賜り厚く御礼申し上げます。\nおかげ様で本日8月20日、株式会社ビットマイスターは創立３周年を迎えることができました。\nこれもひとえに皆様のご支援、ご厚情の賜物と存じます。\n顧客の皆様、パートナーの方々、レンタルオフィスのアステリVIPスタッフの皆様、そして、社員を支えてくれているご家族の皆様、その他、ご支援いただいている全ての関係者の方々に深く感謝いたします。\n第３期も、新世代通信規格に関わる試作ソフトウェア開発を中心として、大学・研究機関向けの研究開発サービス事業を推進して参りました。研究者の方々が生み出された研究成果のいくつかに、我々の開発したシステムが貢献できたことを嬉しく思います。 最近では、弊社が最も得意とする技術の一つである無線通信分野の技術について、一般企業様からも、お問い合わせをいただくことが増えてきました。\nまた、研究開発サービスの充実を図るために、”研究成果の魅せる化”の研究も並行して行ってきました。研究成果を発信するにはどのような仕組みが適しているか、どうしたらステークフォルダーに効果的に伝わるかなど、大学の研究者の方々の協力をいただきながら、いくつか実証実験を重ねてきました。 実験結果を元に開発した、大学研究室向けの情報発信・共有システムは、パッケージとして提供できるように準備中です。\n４期は、研究開発サービス事業のさらなる展開を図っていきます。従来の研究開発サービスの受託に加え、産学連携や大学研究室のアウトリーチ支援、学術機関との共同研究にも取り組んでいきます。サービスの幅を広げ、かつ提供スピードを上げるためにも、他企業とのアライアンスも積極的に進めていく予定です。\n今期も引き続き、研究開発サービスの提供を通じて科学技術の発展と普及に寄与し、お客様へより良いサービスを届けられるように、社員一同、知識と技に一層の磨きをかけていく所存です。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n敬具\n平成22年8月20日 株式会社ビットマイスター 代表取締役　笠原勉\n","date":"2010/08/19","externalUrl":null,"permalink":"/posts/kasa/1801/","section":"Posts","summary":" 拝啓、時下益々ご清祥のこととお喜び申し上げます。\n平素はひとかたならぬお引き立てを賜り厚く御礼申し上げます。\nおかげ様で本日8月20日、株式会社ビットマイスターは創立３周年を迎えることができました。\nこれもひとえに皆様のご支援、ご厚情の賜物と存じます。\n顧客の皆様、パートナーの方々、レンタルオフィスのアステリVIPスタッフの皆様、そして、社員を支えてくれているご家族の皆様、その他、ご支援いただいている全ての関係者の方々に深く感謝いたします。\n第３期も、新世代通信規格に関わる試作ソフトウェア開発を中心として、大学・研究機関向けの研究開発サービス事業を推進して参りました。研究者の方々が生み出された研究成果のいくつかに、我々の開発したシステムが貢献できたことを嬉しく思います。 最近では、弊社が最も得意とする技術の一つである無線通信分野の技術について、一般企業様からも、お問い合わせをいただくことが増えてきました。\nまた、研究開発サービスの充実を図るために、”研究成果の魅せる化”の研究も並行して行ってきました。研究成果を発信するにはどのような仕組みが適しているか、どうしたらステークフォルダーに効果的に伝わるかなど、大学の研究者の方々の協力をいただきながら、いくつか実証実験を重ねてきました。 実験結果を元に開発した、大学研究室向けの情報発信・共有システムは、パッケージとして提供できるように準備中です。\n４期は、研究開発サービス事業のさらなる展開を図っていきます。従来の研究開発サービスの受託に加え、産学連携や大学研究室のアウトリーチ支援、学術機関との共同研究にも取り組んでいきます。サービスの幅を広げ、かつ提供スピードを上げるためにも、他企業とのアライアンスも積極的に進めていく予定です。\n今期も引き続き、研究開発サービスの提供を通じて科学技術の発展と普及に寄与し、お客様へより良いサービスを届けられるように、社員一同、知識と技に一層の磨きをかけていく所存です。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n敬具\n平成22年8月20日 株式会社ビットマイスター 代表取締役　笠原勉\n","title":"創立3周年のご挨拶","type":"posts"},{"content":" 謹賀新年\n旧年中はひとかたならぬお引き立てにあずかり、誠にありがとうございました。\nおかげさまで、当社も創立から３度目の新年を迎えることができました。\nこれもひとえに顧客の皆さま、オフィス管理のスタッフの皆さま、業務パートナーの士業の方々、および支援機関、金融機関の方々、そして社員の家族の皆さまのご支援ご厚情の賜物と存じます。\n第２期から３期にあたる旧年は、新世代通信規格に関わる試作開発を中心として、工学系大学・研究機関向けの研究開発サービス事業を拡大して参りました。技術提案や実装支援にとどまらず、展示会や学会等の展示サポートも提供させていただきました。そして、研究開発サービス事業で培ったこうしたノウハウを一般企業様向けにも提供し始めた年でもありました。\nまた、研究開発サービス事業と並行して、当社自らも学術分野のコミュニティー活動に積極的に参加してきました。情報通信分野では電気電子技術の学会であるIEEEの国際標準化グループに加わり、 周波数有効利用に向けたコグニティブ技術のアーキテクチャーポリシーの策定に寄与 することができました。教育情報の研究を進めている日本教育情報学会では実務の経験を元にした オープンソースのライセンスについて発表 する機会をいただきました。\nさらに、技術を判り易くかつ魅力的に伝えることを目指して、”サイエンスコミュニケーション”という分野の調査研究も引き続き取り組んでまいりました。実務の中でのケーススタディに加え、外部機関の関連研修やワークショップ等を受講し、ノウハウの拡充に努めました。春には国立科学博物館認定サイエンスコミュニケータを新たに一名増員し、サイエンスコミュニケーションに関心をもつ会の運営のサポートを通じて有識者との交流も図ってまいりました。\n先の政権交代により実施された行政刷新会議の「事業仕分け」では科学技術分野においても厳しい評決がなされました。もちろん科学と科学技術そのものの重要性が否定されたわけでありません。しかしながら、限られたリソースから研究開発費を確保し適切に活用していくためには、研究開発業務の効率的な推進と、学術会、政界、国民、それぞれの関係者間での相互理解がいままで以上に求められてくるでしょう。こうした要求に応える手段の一つとして、当社のノウハウとネットワークリソースを提供できたらと考えております。\n本年は来る４期にむけ、事業の展開を図ります。従来の研究開発サービスの受託に加え、産学連携や大学研究室のアウトリーチ支援、学術機関との共同研究、および研究開発型企業との共同開発にも積極的に取り組んでいきます。また、「BITシステム相談室」チャネルを通じて、一般企業様に向けてのIT技術の情報提供やサポートも引き続き行ってまいります。\n科学技術の発展と普及に寄与するとともに、お客様へより良いサービスを届けられるように、社員一同、知識と技術にさらに磨きをかけていく所存です。\nよりいっそうのご指導、ご鞭撻を賜りますよう、本年もよろしくお願い申し上げます。\n皆々様にとりまして、新しい年がより幸の多き年となりますようお祈り申し上げ、新年のご挨拶とさせていただきます。\n平成２２年元旦 株式会社ビットマイスター 代表取締役　笠原勉\n","date":"2009/12/31","externalUrl":null,"permalink":"/posts/kasa/1611/","section":"Posts","summary":" 謹賀新年\n旧年中はひとかたならぬお引き立てにあずかり、誠にありがとうございました。\nおかげさまで、当社も創立から３度目の新年を迎えることができました。\nこれもひとえに顧客の皆さま、オフィス管理のスタッフの皆さま、業務パートナーの士業の方々、および支援機関、金融機関の方々、そして社員の家族の皆さまのご支援ご厚情の賜物と存じます。\n第２期から３期にあたる旧年は、新世代通信規格に関わる試作開発を中心として、工学系大学・研究機関向けの研究開発サービス事業を拡大して参りました。技術提案や実装支援にとどまらず、展示会や学会等の展示サポートも提供させていただきました。そして、研究開発サービス事業で培ったこうしたノウハウを一般企業様向けにも提供し始めた年でもありました。\nまた、研究開発サービス事業と並行して、当社自らも学術分野のコミュニティー活動に積極的に参加してきました。情報通信分野では電気電子技術の学会であるIEEEの国際標準化グループに加わり、 周波数有効利用に向けたコグニティブ技術のアーキテクチャーポリシーの策定に寄与 することができました。教育情報の研究を進めている日本教育情報学会では実務の経験を元にした オープンソースのライセンスについて発表 する機会をいただきました。\nさらに、技術を判り易くかつ魅力的に伝えることを目指して、”サイエンスコミュニケーション”という分野の調査研究も引き続き取り組んでまいりました。実務の中でのケーススタディに加え、外部機関の関連研修やワークショップ等を受講し、ノウハウの拡充に努めました。春には国立科学博物館認定サイエンスコミュニケータを新たに一名増員し、サイエンスコミュニケーションに関心をもつ会の運営のサポートを通じて有識者との交流も図ってまいりました。\n先の政権交代により実施された行政刷新会議の「事業仕分け」では科学技術分野においても厳しい評決がなされました。もちろん科学と科学技術そのものの重要性が否定されたわけでありません。しかしながら、限られたリソースから研究開発費を確保し適切に活用していくためには、研究開発業務の効率的な推進と、学術会、政界、国民、それぞれの関係者間での相互理解がいままで以上に求められてくるでしょう。こうした要求に応える手段の一つとして、当社のノウハウとネットワークリソースを提供できたらと考えております。\n本年は来る４期にむけ、事業の展開を図ります。従来の研究開発サービスの受託に加え、産学連携や大学研究室のアウトリーチ支援、学術機関との共同研究、および研究開発型企業との共同開発にも積極的に取り組んでいきます。また、「BITシステム相談室」チャネルを通じて、一般企業様に向けてのIT技術の情報提供やサポートも引き続き行ってまいります。\n科学技術の発展と普及に寄与するとともに、お客様へより良いサービスを届けられるように、社員一同、知識と技術にさらに磨きをかけていく所存です。\nよりいっそうのご指導、ご鞭撻を賜りますよう、本年もよろしくお願い申し上げます。\n皆々様にとりまして、新しい年がより幸の多き年となりますようお祈り申し上げ、新年のご挨拶とさせていただきます。\n平成２２年元旦 株式会社ビットマイスター 代表取締役　笠原勉\n","title":"新年のご挨拶","type":"posts"},{"content":"拝啓、時下益々ご清祥のこととお喜び申し上げます。\n平素はひとかたならぬお引き立てを賜り厚く御礼申し上げます。\nおかげ様で8月20日をもちまして株式会社ビットマイスターは創立２周年を迎えることができました。\nこれもひとえに皆様のご支援、ご厚情の賜物と存じます。\n顧客の皆様をはじめとして、パートナーの士業の方々、インキュベーションオフィスのスタッフの皆様、そして、社員を支えてくれているご家族の皆様、その他、ご支援いただいている全ての関係者の皆様に深く感謝いたします。\n第二期は、新世代通信規格に関わる試作開発を中心として、工学系大学・研究機関向けの研究開発支援サービス事業を拡大して参りました。技術提案や研究理論の実装支援にとどまらず、展示会や学会等の展示サポートも提供させていただきました。\n電気通信分野においては、IEEEの国際標準化活動に参加し、周波数有効利用に向けた コグニティブ技術のアーキテクチャーポリシーの策定に寄与 することができました。\nまた、先端技術を追い求めることだけでなく、その技術を本当に必要としている人たちに届ける一つの手段として”サイエンスコミュニケーション”という分野に着目し、調査研究を行ってきました。\n今年7月に政府より発表されたi-Japan戦略 の中では「国民主役のデジタル安心・活力社会の実現」が謳われています。こうした、デジタルデバイド問題解消、ITリテラシー教育、中小企業へのIT技術導入などを進めるにあたっても、今後ますます必要な分野になってくるものと考えております。\n技術を判り易くかつ魅力的にお伝えすることにより、ソフトウェア技術を利活用していただけるように、11月には一般企業様向けITサービスである「BITシステム相談室」を立ち上げました。\nソフトウェア業界においてはまだ未開拓な分野ではありますが、今後も調査研究進めながらサービス展開していきます。\n今期も研究開発支援サービスの提供を通じて科学技術の発展と普及に寄与するとともに、ソフトウェア技術を必要とされている新たなお客様へもより良いサービスを届けられるように、社員一同、知識と技に一層の磨きをかけていく所存です。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n敬具\n平成21年8月20日\n株式会社ビットマイスター\n代表取締役　笠原勉\n","date":"2009/08/19","externalUrl":null,"permalink":"/posts/kasa/1174/","section":"Posts","summary":"拝啓、時下益々ご清祥のこととお喜び申し上げます。\n平素はひとかたならぬお引き立てを賜り厚く御礼申し上げます。\nおかげ様で8月20日をもちまして株式会社ビットマイスターは創立２周年を迎えることができました。\nこれもひとえに皆様のご支援、ご厚情の賜物と存じます。\n顧客の皆様をはじめとして、パートナーの士業の方々、インキュベーションオフィスのスタッフの皆様、そして、社員を支えてくれているご家族の皆様、その他、ご支援いただいている全ての関係者の皆様に深く感謝いたします。\n第二期は、新世代通信規格に関わる試作開発を中心として、工学系大学・研究機関向けの研究開発支援サービス事業を拡大して参りました。技術提案や研究理論の実装支援にとどまらず、展示会や学会等の展示サポートも提供させていただきました。\n電気通信分野においては、IEEEの国際標準化活動に参加し、周波数有効利用に向けた コグニティブ技術のアーキテクチャーポリシーの策定に寄与 することができました。\nまた、先端技術を追い求めることだけでなく、その技術を本当に必要としている人たちに届ける一つの手段として”サイエンスコミュニケーション”という分野に着目し、調査研究を行ってきました。\n今年7月に政府より発表されたi-Japan戦略 の中では「国民主役のデジタル安心・活力社会の実現」が謳われています。こうした、デジタルデバイド問題解消、ITリテラシー教育、中小企業へのIT技術導入などを進めるにあたっても、今後ますます必要な分野になってくるものと考えております。\n技術を判り易くかつ魅力的にお伝えすることにより、ソフトウェア技術を利活用していただけるように、11月には一般企業様向けITサービスである「BITシステム相談室」を立ち上げました。\nソフトウェア業界においてはまだ未開拓な分野ではありますが、今後も調査研究進めながらサービス展開していきます。\n今期も研究開発支援サービスの提供を通じて科学技術の発展と普及に寄与するとともに、ソフトウェア技術を必要とされている新たなお客様へもより良いサービスを届けられるように、社員一同、知識と技に一層の磨きをかけていく所存です。\n何卒、より一層のご指導、ご鞭撻を賜りますよう、よろしくお願い申し上げます。\n敬具\n平成21年8月20日\n株式会社ビットマイスター\n代表取締役　笠原勉\n","title":"創立2周年のご挨拶","type":"posts"},{"content":"JNIを使ってCなどのnativeプロセスからJavaVMを起動し、さらにそのJavaVMからnativeメソッドをコールバックさせる方法です。Webで調べた際に、意外と情報が見つからなかったのでメモ。\n結論から言ってしまうと、RegisterNativesというJNI関数を使用します。この関数は、jclassとJNINativeMethod構造体の配列を引数に取り、Java側のnativeメソッド宣言とnative側のメソッド本体を動的に結びつけます。\n具体的な使い方は、以下のサンプルコードを参考にしてください。\nまずは、nativeのコールバックメソッドを持つJavaクラスを作成。\npackage jnitest; public class JniTest { // nativeから呼ばれるメソッド public boolean entryMethod() { System.out.println(\u0026#34;Java Method.\u0026#34;); return callbackMethod(); } // JavaVMから呼び出すメソッド private native boolean callbackMethod(); } C(native)側には、Java側に定義したコールバックメソッドに合わせたnativeメソッドを作成し、RegisterNativesメソッドでJavaVMに登録します。\n// JavaVMから呼ばれるメソッド jboolean nativeCallback(JNIEnv* env, jobject obj) { fprintf(stdout, \u0026#34;Native Callback Method.\\n\u0026#34;); return JNI_TRUE; } int main(void) { // JavaVM起動、JNIEnv取得処理(省略) // nativeメソッドを登録 jclass jni_test_class = env-\u0026gt;FindClass(\u0026#34;jnitest/JniTest\u0026#34;); JNINativeMethod native_method = {\u0026#34;callbackMethod\u0026#34;, \u0026#34;()Z\u0026#34;, nativeCallback}; env-\u0026gt;RegisterNatives(jni_test_class, \u0026amp;native_method, 1); 登録を行った後、JavaのentryMethod()を呼び出すと、\n// JniTestオブジェクトを生成 jmethodID init_method = env-\u0026gt;GetMethodID(jni_test_class, \u0026#34;\u0026lt;init\u0026gt;\u0026#34;, \u0026#34;()V\u0026#34;); jobject jni_test_obj = env-\u0026gt;NewObject(jni_test_class, init_method); // entryMethodを呼び出す jmethodID entry_method = env-\u0026gt;GetMethodID(jni_test_class, \u0026#34;entryMethod\u0026#34;, \u0026#34;()Z\u0026#34;); env-\u0026gt;CallBooleanMethod(jni_test_obj, entry_method); JavaVMからnativeCallback()が呼び出され、無事、以下の出力が得られます。 Java Method. Native Callback Method.\n余談ですが、上にも書いたように、ネット検索ではこの方法が見つけられませんでした。なので最初は、コールバック関数のポインタをjint型にキャストしてJavaVMのメソッドに渡しておき、JavaVMからnativeメソッドへの引数としてこのjintを渡して、nativeメソッドで再度jnitを関数ポインタにキャストし直してコールバック関数を呼び出すという方法も試したりしていました。\nいちおう呼び出しは成功していましたが、どうにもトリッキーすぎるので書籍を買ってきて調べたところ、すぐに標準の方法が見つかった次第です。あまりGoogle先生に頼りすぎるのも考え物ですね。\n","date":"2009/07/10","externalUrl":null,"permalink":"/posts/jun/1104/","section":"Posts","summary":"JNIを使ってCなどのnativeプロセスからJavaVMを起動し、さらにそのJavaVMからnativeメソッドをコールバックさせる方法です。Webで調べた際に、意外と情報が見つからなかったのでメモ。","title":"JNIで起動したJavaVMからnativeメソッドをコールバック","type":"posts"},{"content":"2009年5月27日のエントリ、 日の出・日の入りの計算 でお伝えしたプログラムが完成しました。 その名も、 日の出・日の入り時刻計算 Web API おはこん番地は！？ です。 (以降、「 おはこん番地は！？API」と呼びます)\nトップページ からは場所と日付を入力し、「計算！」をクリックするだけで、日本国内の日の出・日の入り時刻を調べることができます。 初日の出の時刻を知りたいときはもちろん、海に沈む夕日をバックにプロポーズするタイミングを調べるときにも大活躍です。\nさらに他の使い方を思いつかれたならば、「 おはこん番地は！？API」から出力されたXMLを使って、自作アプリケーションと連携することも可能です。\nただし、山やビルに地平線を遮られている場合や、山の頂上といった標高の高い場所を検索する場合は、現実の日の出・日の入り時刻と計算結果に大きな誤差が生じますのでご注意ください。\n現在「 おはこん番地は！？API」はXMLを出力する仕様ですが、JSON版やFlashで使うためのcrrosdomain.xmlの設置など、ご要望があれば対応します。\n","date":"2009/06/15","externalUrl":null,"permalink":"/posts/bit/0993/","section":"Posts","summary":"2009年5月27日のエントリ、 日の出・日の入りの計算でお伝えしたプログラムが完成しました。 その名も、 日の出・日の入り時刻計算 Web API おはこん番地は！？ です。","title":"おはこん番地は！？ API","type":"posts"},{"content":"古代より、文明は天文学と共にありました。 なぜかというと、天体の動きを観測することによって歴を作ることができるためです。\n暦があれば、いつ農作物を植えれると効率よく栽培できるのかがわかります。 効率よく農作物を栽培できれば、それが文明の発展に結び付くわけです。\nそして今年は 世界天文年。 ガリレオが初めて望遠鏡の向こうの宇宙を眺めてから400年という記念すべき年です。 とういうわけで、日の出・日の入り時刻を計算するプログラムを作っています。\n実はこの計算は結構複雑です。 地球は太陽の周りを楕円軌道で周っており、月や他の惑星の重力も影響します。 地球の大気の屈折も日の出・日の入り時刻の算出には加味しなくてはいけません。 春分の日 や 秋分の日 が毎年若干ずれるのもこのためです。\nこれらの影響をまともに計算することは非常に大がかりで大変です。 だいいち、精度を追い求めて計算しても、実際の天候などの影響は予測できないのであまり意味がありません。 国立天文台の発表する日の出・日の入り 時刻の精度も±1分ですので、秒単位以上の精度は求めません。\nそこで略式的に、地球から見た太陽の動きを近似する式を用います。 日付と観測地点の緯経度さえわかれば日の出・日の入り時刻を計算できます。\n参考書籍: 長沢工 著　日の出・日の入りの計算\n試しに計算してみた2009年5月27日、埼玉県さいたま市中央区の日の出・日の入り時刻はこちら。\n日の出時刻 4時28分 日の入り時刻 18時49分 ちなみに日の出・日の入り時刻とは、太陽の上縁が地平線に接する時刻を指します。\n","date":"2009/05/27","externalUrl":null,"permalink":"/posts/bit/0862/","section":"Posts","summary":"古代より、文明は天文学と共にありました。 なぜかというと、天体の動きを観測することによって歴を作ることができるためです。\n暦があれば、いつ農作物を植えれると効率よく栽培できるのかがわかります。 効率よく農作物を栽培できれば、それが文明の発展に結び付くわけです。\n","title":"日の出・日の入りの計算","type":"posts"},{"content":" 先週の土曜日、JST 社会技術研究開発センター 主催の\n「 第 2 回シンポジウム「科学技術と社会の相互作用」 」\nに参加してきた。\n科学技術がどのように社会に影響をあたえるのか？ 「なにが将来的に生じるかわからない」 「なにがわかっていないかわからない」 こんな不確実な要素に満ちた今日の社会的課題に科学技術がどう対処できるのか？ 科学的技術論理やELSI※(エルシーと発音するらしい）というキーワードで、生命科学技術、基礎研究、司法、様々な分野の識者が話題提供とともにディスカッションを展開した。\n社会技術研究開発センターのＨＰに当日の内容が掲載された。 ・ シンポジウム概要報告　・ 「社会」のなかの科学技術:不確実性・社会的責任・ELSI\n※ELSI：Ethical, Legal and Social Issues「科学技術が及ぼす倫理的・法的・社会的課題」\n特に興味深かったのが、リブラ法律事務所中村多美子弁護士の話題。\n「不確実な科学的状況における司法判断の問題点」\n結論から逃れない司法の場において、必ずしも100％ではない科学的証拠をもってどのように司法判断を下すのか。その困難さと問題について解説していた。弁護士は勝つために戦っているものであり、協力する科学技術者は必ずしも不利なデータを提出する必要はない。いきおい裁判官は被告・原告双方から提出される資料に対して、「どちらの科学的根拠が正しいか」ではなく、「どちらの科学者が信用できそうか」で判断してしまうとのことである。 （尚、中村弁護士はサイエンスカフェの形式を利用して科学的証拠が絡む模擬裁判を実施している。→ 「科学的証拠って何？ ～模擬裁判を通じて、法廷における科学のありかたを考える」 当日の様子がレポートされているので、どのようなものか是非一読されたい。）\nこのほかにも、「 薬害エイズ事件」や「 原発もんじゅ」のような複雑な問題から、我々エンジニアの身近なところでは「 Winny」、作った人が悪いのか、使った人が悪いのか、1か0かでは判断できない事例についてもいろいろ言及があった。\n結局いまのところは\n「科学技術は絶対ではないから、関係者でコンセンサス取りながら慎重に進める」\nしかない。\nその関係者をつなぐ手段の一つとしてサイエンスコミュニケーションがいま求められている。 \nさらに環境問題のような複雑な事象が絡むものに対しては 「 事前警戒原則」にのっとり、 「不確さが残っていても対応できる」 「同時進行して科学的究明を続ける」 「新知見が出てきたときの責任の分担をきめておく」 社会システムを構築することが肝要なようだ。\nこうした答えのない状況下では、エンジニアも単に最先端の技術を追い求めるだけでなく、自分が携わる技術がどのように社会に影響を及ぼすのか、想像力を働かせていく必要があるだろう。\n会場のポスターセッション横で「科学技術と社会の相互作用」を考える上で役に立ちそうな書籍が紹介されていた。 その中から技術者が比較的読みやすいのではないかと、10冊（★マーク）を勝手に選定。（残りも備忘録代わりに載せておく）\n普段は技術書中心のエンジニアも、GW中に一冊目を通してはいかがだろか。\n★『 トランス・サイエンスの時代―科学技術と社会をつなぐ (NTT出版ライブラリーレゾナント)』\n著：小林 傳司\n出版社：NTT出版株式会社\n★『 科学技術社会論の技法』\n編：藤垣裕子\n出版社：東京大学出版会\n★『 科学の社会化シンドローム (岩波科学ライブラリー)』\n著：石黒武彦\n出版社：岩波書店\n★『 安全と安心の科学 (集英社新書)』\n著：村上陽一郎\n出版社：集英社\n★『 日本近代技術の形成―“伝統”と“近代”のダイナミクス (朝日選書)』\n著：中岡哲郎\n出版社：朝日新聞社\n★『 科学者をめざす君たちへ―科学者の責任ある行動とは』\n編：全米科学アカデミー　訳：池内了\n出版社：（株）化学同人\n★『 未来の私たち―21世紀の科学技術が人の思考と感覚に及ぼす影響』\n著：Susan　Greenfield　訳：伊藤泰男\n出版社：NPO科学技術社会研究所\n★『 責任という原理―科学技術文明のための倫理学の試み』\n著：ハンス・ヨナス　監訳：加藤尚武\n出版社：東信堂\n★『より高度の知識経済化で一層の発展をめざす日本―諸外国への教訓』)\n著：柴田勉\n編：竹内弘高\n出版社：一灯社\n★『 科学技術と知の精神文化―新しい科学技術文明の構築に向けて』\n編：（独）科学技術復興機構社会技術研究開発センター\n出版社：丸善プラネット株式会社\nあとは参考までに。\n『科学の社会史』\n著：広重徹\n出版社：中央公論社\n『 The No-nonsense Guide to Science (No Nonsense Guides)』\n著：Jerome Ravetz\n出版社：NewInternationalist\n『 Knowledge Management Foundations (KMCI Press)』\n著：Steve Fuller\n出版社：Butterworth-Heinemann\n『アメリカの政治と経済』\n著：マイケル・ガフ　監訳：菅原努\n出版社：昭和堂\n『 Science And Citizens: Globalization And The Challenge Of Engagement (Claiming Citizenship)』\n著：Melissa Leach,Lan Scoones \u0026amp; Brian Wynnel[eds.]\n出版社：Zed Books\n『 エコロジーとポストモダンの終焉 (ポストモダン・ブックス)』\n著：ジョージ・マイアソン　訳：野田三貴\n出版社：岩波書店\n『 戦争の科学―古代投石器からハイテク・軍事革命にいたる兵器と戦争の歴史』\n著：アーネスト・ヴォルクマン　訳：茂木健\n出版社：主婦の友社\n『 マネジメント - 基本と原則 [エッセンシャル版]』\n著：P.F.ドラッカー　編訳者：上田 惇生\n出版社：ダイアモンド社\n『 医学生が学んだ生命の不思議 遺伝子の宿題』\n著：駒沢伸泰　監修：仲野徹・森本兼曩\n出版社：PHP研究所\n『 まず石を投げよ』\n著：久坂部羊著\n出版社：朝日新聞出版\n『 生態系サービスと人類の将来―国連ミレニアムエコシステム評価』\n著：Millennium Ecosystem Assessment\n責任翻訳：横浜国立大学21世紀COE翻訳委員会\n出版社：オーム社\n『低炭素社会のビジョンと実現シナリオ『地球環境』Vol.12.No2』\n著：西岡秀三等\n出版社：(社)国際環境研究協会\n『 植物力 人類を救うバイオテクノロジー』\n著：新名惇彦\n出版社：新潮選書\n『 サバルタンは語ることができるか (みすずライブラリー)』\n著：G・C・スピヴァク　訳：上村男\n出版社：みすず書房\n『 近代医学のあけぼの―外科医の世紀』\n著：ユルゲン・トールヴァルド　訳：小川道雄\n出版社：へるす出版\n『 世界の心臓を救った町―フラミンガム研究の55年 (ライフサイエンス選書)』\n著：嶋康晃\n出版社：ライフサイエンス出版株式会社\n『 日本低炭素社会のシナリオ―二酸化炭素70%削減の道筋』\n編：西岡秀三\n出版社：日刊工業新聞 『 水産学シリーズ157 森川海のつながりと河口・沿岸域の生物生産 (水産学シリーズ)』\n著：山下洋・田中克\n出版社：恒星社厚生閣\n『 科学者の将来 (双書科学/技術のゆくえ)』\n著：佐藤文隆\n出版社：岩波書店\n『知っておきたいNPOのこと』\n編集・発行：日本NPOセンター\n『 健康帝国ナチス』\n著：ロバート・N・プロクター　訳：宮崎尊平\n出版社：草思社\n","date":"2009/04/28","externalUrl":null,"permalink":"/posts/kasa/0652/","section":"Posts","summary":"先週の土曜日、JST社会技術研究開発センター主催の第2回シンポジウム「科学技術と社会の相互作用」に参加してきた。","title":"エンジニアも社会とともに","type":"posts"},{"content":"当ブログでも何回か取り上げたサイエンスコミュニケーションの交流コミュニティー\n「 サイエンスコミュニケーションネットワーク横串会(通称横串会)」\n設立に至る経緯，趣旨，実践する活動、意義と課題，今後の展望について、会員100人突破を期に運営委員有志でまとめた報告書が、\n科学コミュニケーション誌『科学技術コミュニケーション』※\nJJSC（Japanese Journal of Science Communication）第5号に、掲載された。\n「サイエンスコミュニケーションネットワーク横串会～組織や地域の垣根を越えたプラットフォームの試み～」\n私は「3.2　インターネットの活用」部分を主に執筆。\n会の運営委員の一人として担当してるネット上でのコミュニケーション促進の場作りについて、いままでの構築概要とその効果を報告した。\nまだまだ活動理念が確立されていないサイエンスコミュニケーション。\n各々領域で個別に活動している100人のサイエンスコミュニケータ（または予備軍）がネット上のちょっとした仕掛けによってつながった。\nたかが100人、されど100人。メンバーの持つ情報やノウハウ共有は新たな創発へとつながる可能性を秘めている。\n各種環境つくりには、当ブログの中の人からもサポートを受けている。 我々が関わる情報通信分野の技術がサイエンスコミュニケーション活動促進の一助けになれば。\n※ 『科学技術コミュニケーション』 は日本初の，科学 技術コミュニケーションに特化した無料で閲覧可能なオンラインジャーナル。\n","date":"2009/03/12","externalUrl":null,"permalink":"/posts/kasa/0565/","section":"Posts","summary":"当ブログでも何回か取り上げたサイエンスコミュニケーションの交流コミュニティー\n「 サイエンスコミュニケーションネットワーク横串会(通称横串会)」\n設立に至る経緯，趣旨，実践する活動、意義と課題，今後の展望について、会員100人突破を期に運営委員有志でまとめた報告書が、\n科学コミュニケーション誌『科学技術コミュニケーション』※\nJJSC（Japanese Journal of Science Communication）第5号に、掲載された。\n","title":"『科学技術コミュニケーション』に横串会の試みが掲載される","type":"posts"},{"content":" 当社 も参画したコグニティブワイヤレスネットワークにおける 基本アーキテクチャの仕様を策定するワーキンググループ 「IEEE P1900.4」 の成果が、 IEEE の標準仕様として承認された。\n本日 独立行政法人情報通信研究機構 よりプレスリリースあり。\n独立行政法人情報通信研究機構（以下「NICT」という。 理事長：宮原 秀夫）は、コグニティブワイヤレスネットワーク*1 の基本アーキテクチャに関する世界初の仕様策定を行う IEEE P1900.4ワーキンググループ*2（以下「P1900.4」という。） において2年間にわたり活動を行い、その仕様策定を完了しました。 本仕様は、周波数を高度に利用する無線システムを定義していく 上で欠かせない、コグニティブ無線技術*3に基づいた 基礎アーキテクチャになるとともに、NICTが中心に検討を進めて いる新世代ネットワークアーキテクチャにおいても、 無線を扱うための基本技術として期待されています。\n詳しくはこちら。↓\nIEEE 1900.4標準仕様の策定が完了\n～ 世界初のコグニティブワイヤレスネットワークに向けた基礎アーキテクチャ ～\n関連エントリー コグニティブ無線動向「電波有効利用シンポジウム2008」聴講記 ","date":"2009/02/26","externalUrl":null,"permalink":"/posts/kasa/0554/","section":"Posts","summary":" 当社 も参画したコグニティブワイヤレスネットワークにおける 基本アーキテクチャの仕様を策定するワーキンググループ 「IEEE P1900.4」 の成果が、 IEEE の標準仕様として承認された。\n本日 独立行政法人情報通信研究機構 よりプレスリリースあり。\n独立行政法人情報通信研究機構（以下「NICT」という。 理事長：宮原 秀夫）は、コグニティブワイヤレスネットワーク*1 の基本アーキテクチャに関する世界初の仕様策定を行う IEEE P1900.4ワーキンググループ*2（以下「P1900.4」という。） において2年間にわたり活動を行い、その仕様策定を完了しました。 本仕様は、周波数を高度に利用する無線システムを定義していく 上で欠かせない、コグニティブ無線技術*3に基づいた 基礎アーキテクチャになるとともに、NICTが中心に検討を進めて いる新世代ネットワークアーキテクチャにおいても、 無線を扱うための基本技術として期待されています。\n詳しくはこちら。↓\nIEEE 1900.4標準仕様の策定が完了\n～ 世界初のコグニティブワイヤレスネットワークに向けた基礎アーキテクチャ ～\n関連エントリー コグニティブ無線動向「電波有効利用シンポジウム2008」聴講記 ","title":"コグニティブ無線動向２「IEEE 1900.4標準仕様の策定が完了」","type":"posts"},{"content":"Java 5.0から導入されたJavaのenumですが、JNIを経由したnativeメソッド内ではどのように扱えばよいのでしょうか？これについては、JNI仕様にも明記されていないようです。必要があったので、ちょっと調べてみました。\nまず、次のようなテストコードを書いて、\npackage test; public class ClassWithEnum { enum Result { OK, NG } public native void method(Result result); } javah -jni でヘッダを出力してみます。\n/* DO NOT EDIT THIS FILE - it is machine generated */ #include \u0026lt;jni.h\u0026gt; /* Header for class test_ClassWithEnum */ #ifndef _Included_test_ClassWithEnum #define _Included_test_ClassWithEnum #ifdef __cplusplus extern \u0026#34;C\u0026#34; { #endif /* * Class: test_ClassWithEnum * Method: method * Signature: (Ltest/ClassWithEnum/Result;)V */ JNIEXPORT void JNICALL Java_test_ClassWithEnum_method (JNIEnv *, jobject, jobject); #ifdef __cplusplus } #endif #endif enumのResultは、nativeメソッドにjobject型で渡されることがわかります。では、このjobjectからenum値を取り出すには、どうすればよいのでしょうか？\n実は、Javaのenumは、コンパイル時に暗黙でjava.lang.Enum型を継承したクラスに変換されています。確認のため、javapでResultクラスをデコンパイルすると、次のような結果が得られます。\nCompiled from \u0026#34;ClassWithEnum.java\u0026#34; final class test.ClassWithEnum$Result extends java.lang.Enum{ public static final test.ClassWithEnum$Result OK; public static final test.ClassWithEnum$Result NG; static {}; public static test.ClassWithEnum$Result[] values(); public static test.ClassWithEnum$Result valueOf(java.lang.String); } ここまで判れば、後は普通のjobjectを扱うのと同様です。引数のResultがOKかどうかを調べる処理は、\nvoid JNICALL Java_test_ClassWithEnum_method(JNIEnv *env, jobject obj, jobject result) { jclass result_class = env-\u0026gt;FindClass(\u0026#34;Ltest/ClassWithEnum$Result;\u0026#34;); jfieldID result_ok_field = env-\u0026gt;GetStaticFieldID(result_class, \u0026#34;OK\u0026#34;, \u0026#34;Ltest/ClassWithEnum$Result;\u0026#34;); jobject result_ok_object = env-\u0026gt;GetStaticObjectField(result_class, result_ok_field); jmethodID equals_method = env-\u0026gt;GetMethodID(result_class, \u0026#34;equals\u0026#34;, \u0026#34;(Ljava/lang/Object;)Z\u0026#34;); if (env-\u0026gt;CallBooleanMethod(result_ok_object, equals_method, result) == JNI_TRUE) { // Result OK } } と書くことができます(エラー処理省略)。同一のclass staticフィールドを参照していても、jobject同士の\u0026quot;==\u0026ldquo;比較ではTRUEにならないようなので、equalsメソッドを使っています。\n(2009.2.14 追記) これらのjobjectは、\u0026ldquo;同一のJava objectへの参照\u0026quot;を持つ別のインスタンスなので、単純な\u0026rdquo;==\u0026ldquo;比較はできません。こういった場合は、わざわざequalsメソッドを取得しなくても、JNI関数のIsSameObject()が使えます。\n戻り値としてResultの値を返すなら、GetStaticObjectFieldで取得したjobjectを返せばOKです。enum値をStringに変換するname()、Stringをenum値に変換するvalueOf()などのメソッドも使えます。\nJNIとしては、enumだからといって特別な処理を行っているわけではなく、通常のjobject型の扱いと同じなので、JNIの仕様には明記していないということなのでしょう。\n","date":"2009/02/12","externalUrl":null,"permalink":"/posts/jun/0523/","section":"Posts","summary":"Java 5.0から導入されたJavaのenumですが、JNIを経由したnativeメソッド内ではどのように扱えばよいのでしょうか？これについては、JNI仕様にも明記されていないようです。必要があったので、ちょっと調べてみました。","title":"JNIでenumを扱う","type":"posts"},{"content":" 先日東京ビックサイトで開催された\n「ファイバーオプティクスEXPO(FOE2010)」 をみてきた。\n目的は同時開催の 「無線アクセスネットワーク2010」 だったのだが、 すぐ隣のブースであるFOE2010の「光配線・施工機材ゾーン」に人だかりが。 きになって覗いてみた。\nやっていたのは 第47回技能五輪全国大会「情報ネットワーク施工」職種 予選会\n光ケーブルの接続施工技術を競っていたようだ。\nシャープペンの芯より細いミクロン単位の光ケーブルを溶かして次々とつないで束ねていく。 様々な道具を使って淡々と工程を進めていくそのテクニックに惹きつけられた。\nすぐ近くでは宅内配線の実演もやっていて、職人の方の会話から、ケーブルの曲げ方や、敷設位置までかなり細かいこだわりがあることを知った。 また、企業ブースでは、光通信を支えるやコネクタや測定機等の装置に加えて、最新型のケーブル溶着装置のデモストレーションもあり、施工措置技術も日々進歩していることも知った。\n先日のエントリー 「コグニティブ無線動向　「電波有効利用シンポジウム2008」聴講記」（ビットログ） で書いたように、通信の世界はものすごい早いペースで発展している。 われわれが深く携わる通信ソフトウェアこそ、そうした通信の発展を支える大事な黒子であるとの考えでいた。 しかしながらその通信ソフトウェアも物理的なインフラなしには動作しない。\nルータやスイッチ、通信デバイスなどの通信装置には普段から触れているものの、バックボーンのインフラ設備がどのように整備されているかまでは意識することはない。\nこうした情報ネットワーク施工技術やそれを使いこなす職人の人たちの技能に支えられて、高速・大容量の情報通信サービスが水道や電気のように利用できるのだと改めて認識した展示会だった。\n","date":"2009/01/24","externalUrl":null,"permalink":"/posts/kasa/0485/","section":"Posts","summary":"先日東京ビックサイトで開催された\n「ファイバーオプティクスEXPO(FOE2010)」 をみてきた。\n目的は同時開催の 「無線アクセスネットワーク2010」 だったのだが、 すぐ隣のブースであるFOE2010の「光配線・施工機材ゾーン」に人だかりが。\n","title":"情報通信を支えるネットワーク施工技術に魅せられた。","type":"posts"},{"content":" 謹賀新年\n新年明けましておめでとうございます。\n旧年中はひとかたならぬ御厚情にあずかり、誠にありがとうございました。\n研究開発支援サービス業 として一昨年の夏に立ち上げたばかりの当社ですが、 おかげ様で昨年一年間で、情報通信研究機構様を始めとした各種研究学術機関様へ当社技術サービスを提供することができました。\nまた、新世代の通信規格の試作開発の研究開発支援と並行して、当社自らも電気電子技術の学会であるIEEEの国際標準化活動に参加してきました。周波数有効利用に向けたコグニティブ技術のアーキテクチャーポリシーの策定を目指す IEEEP1900.4 のドラフト文書には現在当社社名及び当社社員名が掲載されています。\nさらに、先端技術を追い求めるだけでなく、その技術を判り易くかつ魅力的に伝えることも目指して、”サイエンスコミュニケーション”という分野の調査研究を開発と並行して実施してきました。ソフトウェア業界においては未開拓な分野ではありますが、度重なるシステム障害に対するIT不信、デジタルデバイド問題、高まるITリテラシー教育などに対応するべく、今後ますます必要になってくるものと感じております。\n3月に埼玉県より ”いちおし「起」業ブラン大賞”の特別賞 をいただいたことから、各種メディアにも当社の事業が紹介され、一年を通じて実に多種多様な業種の皆様と出会うことができました。 そこで出会った一般企業様からの声に応え、11月には一般企業様向けITサービスである「BITシステム相談室」を立ち上げました。コンセプト展示として地域の商工見本市である 「コラボさいたま2008」へ出展 したところ、多数のお客様よりお問い合わせをいただいております。\n入居させていただいているモッターズマネージメントのスタッフの皆様、業務パートナーの士業の方々及び支援機関、金融機関の方々、そして社員の家族の皆様に支えられて、よき新年を迎えることができました。関係者の皆様には改めて感謝申し上げます。\n本年も研究開発支援サービスの提供を通じて科学技術の発展と普及に寄与するとともに、昨年新たに出会えたお客様へより良いサービスを届けられるように、社員一同、知識と技に磨きをかけていく所存です。\nより一層のご指導、ご鞭撻を賜りますよう、本年もよろしくお願い申し上げます。\n皆々様にとりまして、新しい年がより幸の多き年となりますようお祈り申し上げ、新年のご挨拶とさせていただきます。\n株式会社ビットマイスター 代表取締役　笠原勉\n","date":"2008/12/31","externalUrl":null,"permalink":"/posts/kasa/0433/","section":"Posts","summary":" 謹賀新年\n新年明けましておめでとうございます。\n旧年中はひとかたならぬ御厚情にあずかり、誠にありがとうございました。\n研究開発支援サービス業 として一昨年の夏に立ち上げたばかりの当社ですが、 おかげ様で昨年一年間で、情報通信研究機構様を始めとした各種研究学術機関様へ当社技術サービスを提供することができました。\nまた、新世代の通信規格の試作開発の研究開発支援と並行して、当社自らも電気電子技術の学会であるIEEEの国際標準化活動に参加してきました。周波数有効利用に向けたコグニティブ技術のアーキテクチャーポリシーの策定を目指す IEEEP1900.4 のドラフト文書には現在当社社名及び当社社員名が掲載されています。\nさらに、先端技術を追い求めるだけでなく、その技術を判り易くかつ魅力的に伝えることも目指して、”サイエンスコミュニケーション”という分野の調査研究を開発と並行して実施してきました。ソフトウェア業界においては未開拓な分野ではありますが、度重なるシステム障害に対するIT不信、デジタルデバイド問題、高まるITリテラシー教育などに対応するべく、今後ますます必要になってくるものと感じております。\n3月に埼玉県より ”いちおし「起」業ブラン大賞”の特別賞 をいただいたことから、各種メディアにも当社の事業が紹介され、一年を通じて実に多種多様な業種の皆様と出会うことができました。 そこで出会った一般企業様からの声に応え、11月には一般企業様向けITサービスである「BITシステム相談室」を立ち上げました。コンセプト展示として地域の商工見本市である 「コラボさいたま2008」へ出展 したところ、多数のお客様よりお問い合わせをいただいております。\n入居させていただいているモッターズマネージメントのスタッフの皆様、業務パートナーの士業の方々及び支援機関、金融機関の方々、そして社員の家族の皆様に支えられて、よき新年を迎えることができました。関係者の皆様には改めて感謝申し上げます。\n本年も研究開発支援サービスの提供を通じて科学技術の発展と普及に寄与するとともに、昨年新たに出会えたお客様へより良いサービスを届けられるように、社員一同、知識と技に磨きをかけていく所存です。\nより一層のご指導、ご鞭撻を賜りますよう、本年もよろしくお願い申し上げます。\n皆々様にとりまして、新しい年がより幸の多き年となりますようお祈り申し上げ、新年のご挨拶とさせていただきます。\n株式会社ビットマイスター 代表取締役　笠原勉\n","title":"新年のご挨拶","type":"posts"},{"content":" 12月5日(金）に明治記念館で開催された電波産業会主催の「 電波有効利用シンポジウム2008」に参加してきた。\nテーマは「コグニティブ無線による新たな電波利用システム」\nコグニティブ無線とは、無線端末が周囲の無線状況を自動的に認識・認知し、複数の無線サービスの中から、状況に合わせて最適の無線サービス（方式・チャネル）を選択して、利用できるようにする新しい無線技術。\n来賓の挨拶のあと、識者4名によるコグニティブ無線の最新の技術動向や取組についての講演。\nまずは大阪大学大学院三瓶政一氏よりコグニティブ無線の背景と概要の説明。次に株式会社KDDI研究所竹内和則氏からコグニティブ無線特有の課題と解決のための取組についての最新動向の説明。さらに独立行政法人情報通信研究機構原田博司氏からはコグニティブ無線に関わる標準化動向及びその活動についての概要説明とともに、コグニティブ無線を絡めたビジネスモデルについても言及があった。\n最後に、コグニティブ無線の提唱者である Dr.Joseph Mitola氏の講演があり、遺伝子プログラムや認知言語学といった通信工学とはまた違った課題解決のアプローチをつかった研究内容が発表された。4者とも共通していたことは大きく2点、\n無線環境は不安定かつ不確定であり、技術的課題はまだまだ山積である。 しかしながらできることから要素技術を組み合わせて実現していくことが大切。 と、2015年までくらいに研究開発を終え、実用化に向けたステップへ移行したい旨を説明していた。簡単にトピックを挙げておく。\n背景 # 18か月～24か月の速いペースで新しい通信方式が標準化され、新規に割り当てるための周波数帯の統廃合ペースが追いつかない。 標準化される通信方式のほとんどはブロードバンドであり、統廃合をより難しいものとしている。 公衆無線に適した周波数帯は限られており、今後周波数の枯渇は避けられない、周波数の有効利用技術が必要。 従来のシームレス通信でのハンドオーバーは電波の強弱や位置情報などを元に繋がる無線に切り替える技術である。 「電波の有効活用」に視点をおいた場合、電波の混雑度を指標とした新たな切り替え技術が必要。 技術的課題 # 電波に係る特性（指向性、センシング時間、非免許バンド等々）により無線区間の混雑度を 正確に測ることは困難。 混んでいることは把握できても、空いている状態を証明するのは困難。 「空いている」と「使える」は別物。 免許バンド（キャリア管理）の無線リソース状況は比較的正確に把握可能だが、端末側へ周辺状況を通知する仕組みは必要。 無線状況を把握してから切り替えたのでは遅い、予測して切り替える仕組みが必要。 取組・その他 # 国際標準化については主にIEEE802.22やIEEE1900.xで議論されている。 IEEE1900.xは日本が主導。 コグニティブ無線技術を活用することにより、加入者トラヒックのロードバランスが可能となるためキャリア側にもメリットがある。 この技術課題の難しさ、事象の複雑さを、ステークフォルダー（規制当局、ユーザー等）に技術者として正確に伝える必要がある、そのために認知言語学というアプローチを利用している。 シンポジウム全体を通して # 複数周波数を活用するへトロジニアスネットワークの研究はシームレスやユビキタスといった キーワードで、いつでもどこでもだれとでも繋がるユーザの利便性を追求していた段階から、 電波という社会的公共財の有効活用の研究へシフトしたことを強く感じた。\nなお、当社も端末の認識・認知をネットワーク側からサポートするコグニティブワイヤレスクラウド（通称CWCシステム）技術開発を国の研究機関より受託し、微力ながら本研究開発の一端を担っている。また無線資源利用の最適化を可能にする適切なシステムアーキティクチャーとプロトコルを 定義する国際標準化活動（ IEEE SCC41 1900.4)にも参加している。\n今後も当社のソフトウェア技術を活かして電波の有効利用技術の発展に貢献していきたい。\n","date":"2008/12/08","externalUrl":null,"permalink":"/posts/kasa/0389/","section":"Posts","summary":"12月5日(金）に明治記念館で開催された 電波産業会主催の 「 電波有効利用シンポジウム2008」に参加してきた。","title":"コグニティブ無線動向　「電波有効利用シンポジウム2008」聴講記","type":"posts"},{"content":" 当ブログで以前お伝えした 「サイエンスアゴラ2008」 が終了した。\n科学の祭典「サイエンスアゴラ2008」プログラム公開\n私はサイエンスコミュニケーション交流会である 「横串会」 の企画に参加。\n「横串会」の企画はイベントに訪れた人たちへの交流スペースの提供と、 全国でサイエンス・カフェを開催している団体のポスター発表の支援。 ”サイエンスコミュニケータ同士が実はコミュニケーション出来ていないのでは？” との問題意識から 「横串フィールド」 を企画。 予想以上に出展ブースは盛況。交流を促進する当初の目的はほぼ達成できたと思われる。\n本企画の総括は横串会の方から別途公開予定であるので、ここでは個別に感じたことを述べておく。\n私自身は運営委員として主に展示の仕掛けやWebを使ったコミュニケーションツールの面で参加した。\n会場に足を運べない全国のメンバーへ会場の様子を伝えるWebでの配信サイトを開設したり、 先日出展した商工見本市 「コラボさいたま」 向けに用意したコンテンツや、 展示会サポート向けに検討している展示ツールを持ち込み、（一応実証実験も兼ねて） 情報発信のインフラを整備。\n「サイエンスアゴラ2008」 は科学の祭典を謳い、取り扱う内容は最先端の科学技術でありながら、 展示方法やイベントの配信は結構アナログな方法がとられていた。 （かなり簡単な仕掛けでも）ネットや映像を活用したブースは珍しく、 ブースの活性化にそれなりに役立ったようだ。\n簡易プロモーションビデオ作製 ツールで作った、ポスターにエフェクトかけたスライドショーも人目を引いていたし、 省スペース展示ブース用に作った↑このディスプレーはみんな覗きこんでいった。\nただ、パネルの訴求力が無視できないことも今回改めて認識した。 本ブースでのパネルはもちろん他ブースを見ても、意外にもパネル展示が賑わっていた。\n他のブースは体験や実験ものを除いてはほぼパネル展示が中心だったのだが、 見ていると来場者はひっきりなしにやってきて、かじりつくようにパネルに見入る人も多くみられた。 紙媒体のチラシやパンフもみんな手にしていく。\n学会や展示発表等の学術の場ではまだまだパネルや紙媒体が主流のためか、 もともと科学系の来場者が多いためか、コンテンツが充実しているところは、 パネルだけでも十分人目を集められるようである。\nしかしながらそんなパネル展示も、双方向性という面ではやはり弱い。 A0一枚で説明できる容量は限られている。 ポスターパネルを見て興味を持った人は大抵キョロキョロ周りを見渡し説明員を探す。 イベントの特性として常に説明員が居るとは限らず、せっかく興味をもっても 残念そうに去って行く人を何人も見た。 （これは学会発表や技術発表のブースでもよく見る光景）\nもしこのパネル展示にデジタルの仕組みを安価に組み込んで双方向性を確保できれば 映像をつかった演出とはまた違った、展示会サポートツールになるのではないかと感じた。\n今回の企画を通じて、大学の広報や産学連携推進機関に従事している方や コミュニケーションツールに関して研究されている研究者の方たちとも交流する機会に恵まれた。 当社が取組んでいる 学術展示のプロモーションサポートサービス に関して興味をもって下さり、 色々現場の取組やニーズを聞かせていただいた。 研究成果を発信する立場にある人達にとっては、研究成果を正確に伝えることに加えて、 効果的にアピールすることも近年ますます強く求められていることは確かのようだ。\n","date":"2008/11/30","externalUrl":null,"permalink":"/posts/kasa/0368/","section":"Posts","summary":"当ブログで以前お伝えした 「サイエンスアゴラ2008」 が終了した。\n科学の祭典「サイエンスアゴラ2008」プログラム公開\n私はサイエンスコミュニケーション交流会である 「横串会」 の企画に参加。\n「横串会」の企画はイベントに訪れた人たちへの交流スペースの提供と、 全国でサイエンス・カフェを開催している団体のポスター発表の支援。 ”サイエンスコミュニケータ同士が実はコミュニケーション出来ていないのでは？” との問題意識から 「横串フィールド」 を企画。 予想以上に出展ブースは盛況。交流を促進する当初の目的はほぼ達成できたと思われる。\n本企画の総括は横串会の方から別途公開予定であるので、ここでは個別に感じたことを述べておく。\n","title":"科学の祭典「サイエンスアゴラ2008」で学術展示の考察","type":"posts"},{"content":"経済協力開発機構 (OECD)、経済産業省 (METI)、独立行政法人経済産業研究所 (RIETI)共催で行われたカンファレンス\n「ソフトウェア分野におけるイノベーション」－最新トレンドと産業競争力への示唆－\nに参加してきた。\nここのところ市販製品やインフラ設備等の大規模開発から遠ざかっているため、 ソフトウェア工学やプロジェクト管理手法の最新の情報を得るのが目的。\nプログラム概要はこちら。 http://www.rieti.go.jp/jp/events/08100601/info.html\nネットビジネスの先見性や最先端のテクノロジーマップについて熱く語るよくあるトークセッションとは違い、内外の社会科学の研究者や企業の経営者層及び政府系ソフトウェア支援団体が、経済・政策面から俯瞰したソフトウェア業界の推移とこれからを論じる会だった。\n登壇者の発表で共通するトレンドとしては以下５つくらい。\n１）UbiquitousNetwork + Identification ・”いつでも、どこでも、誰とでも”から”いまだけ、ここだけ、あなただけ”のサービスが 必要とされている。 DoCoMoが最近発表した行動支援型サービスみたいなもの。\n２）製品からサービスへの移行 ・代表的IT企業（MS,Oracle,Siebel)などのプラットフォーム提供企業は、 2000年～2001年を境として製品販売の売上とサービスやメンテの売上 が逆転し、現在はサービス・メンテが80％を占めてきている。 ・最近は製品販売とサービス・メンテを組み合わせた「ハイブリッド型」へ移行してきた。 ・一部のヒット商品やトップシェア企業を除き、純粋なソフトウェア製品企業は姿を消しつつある。 ・また純粋なITサービス企業もまた消えつつある。（製品とサービスの境界がなくなってきた）\n３）プラットフォーム化 ・低価格化、短納期をクリアするために、共通プラットフォームを作って効率化。\n４）標準化 ・いわゆるプロトコルや製品仕様の標準化ではなく、組織体制や開発・販売プロセスの標準化。 関係者間の仕組みを標準化することにより、全体効率をあげる。\n５）グローバル化 ・グローバル標準・国別標準を採用することにより、規模メリットを享受。\nどれも目新しい見解ではないが、現場感覚とはほぼ一致する。 統計データとしても裏付けられた状況であることを改めて認識した。\nその他、随所でプロジェクト管理についての重要性についてふれられていた。 古くて新しい問題であり、まだまだ発展途上。\n日本のJISA(情報サービス産業協会）が発表していた最新の管理指標は、かっちりとした旧来のウオーターフォールモデルに適用するような指標が多かった。\n調査統計・分析は大手企業の開発サンプルが中心となるため、大規模な社会インフラ向けのソフトウェア開発についての考察が多くなるのは理解はできる。 それにしても、いわゆるフォーナイン(99.99%)の信用を求められる重要なインフラを構築するには品質を上流工程で作りこんで、工数をかけて検証していくウオーターフォール手法がやはり一番なのだろうか。\nただ全てのソフトウェア開発にこのやり方を適用していたら、管理工数は膨大となるし、新しいサービスはなかなか生まれてこないと思われる。 管理手法に関して言えば、標準化にとらわれないで、ターゲットに合わせた最適な手法をいかに柔軟に使いこなせるかが、この先より一層重要になってくるであろう。\n丁度、インプレスITが提供する技術情報サイト（ ThinkIT！）でも、本日より一ヶ月間かけて プロジェクト管理術 の特集をやるようだ。 目次を見る限りこちらは現場目線の具体的な手法がメイン。何かよいヒントがみつかかれば。\nなお、今回主催機関の一つである経済産業研究所での研究成果はディスカッションペーパーとしてWEBで公開されている。\nhttp://www.rieti.go.jp/jp/publications/act_dp.html\n技術開発に関してのペーパーもいくつかある。\n技術書からは見えない、業界の大きな潮流を確認するためのツールの一つとして今後使えそう。\n","date":"2008/10/07","externalUrl":null,"permalink":"/posts/kasa/0305/","section":"Posts","summary":"経済協力開発機構 (OECD)、経済産業省 (METI)、独立行政法人経済産業研究所 (RIETI)共催で行われたカンファレンス\n「ソフトウェア分野におけるイノベーション」－最新トレンドと産業競争力への示唆－\nに参加してきた。\nここのところ市販製品やインフラ設備等の大規模開発から遠ざかっているため、 ソフトウェア工学やプロジェクト管理手法の最新の情報を得るのが目的。\nプログラム概要はこちら。 http://www.rieti.go.jp/jp/events/08100601/info.html\n","title":"ソフトウェアの潮流","type":"posts"},{"content":" 『 ソフトウェア技術者の仕事力 ~対話の重要性とその心得』を読んだ。\n電車待ちの空き時間に寄った本屋でたまたま手にした本。 トム・デマルコ や ジョエル・スポルスキ の本のようにソフトウェア工学やプロジェクト管理法を説いた本ではなく、読むのに一時間もかからない軽い本。 しかし、なかなか考えさせられる内容。\n仕事に行き詰まりを感じている勤続10年目の中堅プログラマーと 小料理屋の女将の会話形式で進んでいく。\n最近技術者として行き詰まりを感じている主人公の愚痴に対して女将が\n「技術ってなに？」 「その技術ってだれが使うの？」 「それを自分に向かって使ったことあるの？」\n素人目線で「なぜ？」と執拗に問い詰める。\n副題の「対話の重要性とその心得」にある、”顧客の声に耳を傾け顧客目線で考えなさい” という最終的なメッセージよりもむしろ、普段当たり前だと思っていることが、業界の外からみると あたりまえじゃないということを気づかされるこのやりとりの方が、読んでいて心に突き刺さる。 （結局、最後までそのへんの答えは出ずに終わるのだが・・・）\n初心者よりも慣れた中堅どころが読んだほうが面白いかも。\n","date":"2008/09/10","externalUrl":null,"permalink":"/posts/kasa/0252/","section":"Posts","summary":"『 ソフトウェア技術者の仕事力 ~対話の重要性とその心得 』を読んだ。\n電車待ちの空き時間に寄った本屋でたまたま手にした本。 トム・デマルコ や ジョエル・スポルスキ の本のようにソフトウェア工学やプロジェクト管理法を説いた本ではなく、読むのに一時間もかからない軽い本。 しかし、なかなか考えさせられる内容。\n","title":"技術って何？","type":"posts"},{"content":"東京ビックサイトで開かれた 『サイン＆ディスプレイショー2008』 に行ってきた。 サインやディスプレイの制作・施工向けの資材や素材、加工機器、工作車両などが展示されている、いわゆる広告資機材展である。\n技術展示の方法として何か新しい手法がないかヒントを探ることが参加目的。\n先日行われたInteropでも デジタルサイネージ というキーワードが飛びかい、IT機器を多用した新しい広告手法の可能性を追及していたが、こちらの展示会はどちらかというともう少しアナログというか単純な仕組みを使って人の目を惹く広告手段が中心だった。\nもちろんネットワークを利用した広告コンテンツ配信システムのようなものもあったが、最終的に表現されるメディアはプロジェクター映写であったり、LED照明であったり、紙や布のポスターやエンブレムのようなサインであったり、それ自体はシンプルなものであり、ダイレクトに心に訴える手法が中心だった。\n写真のディスプレイ商品は株式会社グリーンハウスが展示していた、 無機EKパネル・エルミナス という商品。\n薄いぺらぺらの紙みたいなディスプレイにアニメーション表現できる。 レイヤを重ねて点滅させていくだけの単純なものだがなかなか綺麗で動きもある。残念なのは表示プログラムは固定になってしまうこと。 例えばこのエルミナスを使って、電波強度や通信速度の表示をリアルタイムで動的に表示することができれば訴求効果が上がるかも。\nそんなことを色々質問してたら、対応してくれた営業担当者は広告以外での使用は想定してなかったらしくかなり困っていた・・\n工学研究系の技術展示は主にパワーポイントの資料や実験映像をパソコンのディスプレイ（よくて大型ディスプレイ）で表示していることが多い。 学術界内部での展示説明では、研究の詳細を伝えるために装飾に凝らないこうした玄人受けする展示が向いているが、 広く一般に研究成果をアピールしていくには、PCディスプレイから踏み出してもう少しこういった広告メディアで使われる”目を惹く表現方法”も使ってみるのも良いのではないかと思った。\n","date":"2008/08/30","externalUrl":null,"permalink":"/posts/kasa/0240/","section":"Posts","summary":"東京ビックサイトで開かれた 『サイン＆ディスプレイショー2008』 に行ってきた。 サインやディスプレイの制作・施工向けの資材や素材、加工機器、工作車両などが展示されている、いわゆる広告資機材展である。\n技術展示の方法として何か新しい手法がないかヒントを探ることが参加目的。\n","title":"サイン＆ディスプレイ","type":"posts"},{"content":"拝啓、時下益々ご清祥のこととお喜び申し上げます。\n平素はひとかたならぬお引き立てを賜り、厚く御礼申し上げます。\nさて、当社は8月20日をもって創立１周年を迎えることができました。\nこれもひとえに皆様のご支援、ご厚情の賜物と存じます。\n顧客企業の皆様をはじめとして、提携している士業の皆様、ご支援いただいているベンチャーセンターや金融機関の皆様、インキュベーションオフィスのスタッフの皆様、そして、社員と社員を支えてくれているご家族の皆様、その他、ご支援くださった全ての関係者の皆様に深く感謝いたします。\n今後も、お客さまの想いを一つでも多く形にするべく、社員一同、技に磨きをかけていく所存ですので、どうぞご指導ご鞭撻の程、よろしくお願い申し上げます。 まずは略儀ながら、書中をもって創立１周年のご挨拶とさせていただきます。\n敬具\n平成20年8月20日\n株式会社ビットマイスター\n代表取締役　笠原勉\n","date":"2008/08/19","externalUrl":null,"permalink":"/posts/kasa/0159/","section":"Posts","summary":"拝啓、時下益々ご清祥のこととお喜び申し上げます。\n平素はひとかたならぬお引き立てを賜り、厚く御礼申し上げます。\nさて、当社は8月20日をもって創立１周年を迎えることができました。\nこれもひとえに皆様のご支援、ご厚情の賜物と存じます。\n顧客企業の皆様をはじめとして、提携している士業の皆様、ご支援いただいているベンチャーセンターや金融機関の皆様、インキュベーションオフィスのスタッフの皆様、そして、社員と社員を支えてくれているご家族の皆様、その他、ご支援くださった全ての関係者の皆様に深く感謝いたします。\n今後も、お客さまの想いを一つでも多く形にするべく、社員一同、技に磨きをかけていく所存ですので、どうぞご指導ご鞭撻の程、よろしくお願い申し上げます。 まずは略儀ながら、書中をもって創立１周年のご挨拶とさせていただきます。\n敬具\n平成20年8月20日\n株式会社ビットマイスター\n代表取締役　笠原勉\n","title":"創立１周年のご挨拶","type":"posts"},{"content":" サイエンスコミュニケーション に関心をもつ有志達と交流団体を立ち上げた。\n本日より会員の募集を開始。\n随時、活動内容をこのブログでも伝えていきたい。\n以下会員募集開始の告示文。興味のある方は是非。\n★★★横串会では会員を募集します★★★\n私たちはサイエンスコミュニケーションに関わる仲間と気軽な交流がしたい！という思いでサイエンスコミュニケーションネットワーク横串会（通称：横串会）という会を立ち上げました。所属や立場を超えた交流の場づくり・事づくりに取り組んでいきたいと考えています。\n手始めに、サイエンスコミュニケーション関心者の交流ＳＮＳの運用を始めます。サイエンスコミュニケーションの互習や、活動のコラボ仲間探し、カフェのノウハウ共有など、ＳＮＳの活用方法は人それぞれ。日々の雑談や仲間の日記を読むだけでもよい刺激になるかもしれません。\n横断的な交流をベースにした活動も第一弾、第二弾を計画中です。\nなんだか面白そうかもと思った方、横の交流を望む方などなど、サイエンスコミュニケーションに関心のある方は横串会で横断的な交流をしてみませんか。\n横串会についての詳細、入会申込み方法などはウェブサイトをご覧ください。\n【横串会WEB】http://www.yokogushi.sc\n【お問合せ先】横串会事務局　info(at)yokogushi.sc\nサイエンスコミュニケーションネットワーク横串会　運営委員一同\n★★★★★★★★★★★★★★★★★★★\n","date":"2008/08/04","externalUrl":null,"permalink":"/posts/kasa/0069/","section":"Posts","summary":"サイエンスコミュニケーションに関心をもつ有志達と交流団体を立ち上げた。\n本日より会員の募集を開始。\n随時、活動内容をこのブログでも伝えていきたい。\n以下会員募集開始の告示文。興味のある方は是非。\n","title":"サイエンスコミュニケーションネットワーク横串会 発足","type":"posts"},{"content":" 「ビットログ」（以下、「本サービス」という）は、株式会社ビットマイスター（以下、「ビットマイスター」という）が管理・運営・提供するサービスです。\n本規約の内容に同意できない場合は、本サービスをご利用になれません。\n本サービスに関連する著作権は当社に帰属します。\nその他、当サイトに記載されている会社名・製品名・固有のサービス名などは、各社の登録商標または商標です。\n本サービスの一部には、本サービスの利用者（以下「ユーザ」といいます）が情報を投稿し公開する機能が含まれる場合がありますが、以下に示す事項に触れる場合、その情報を削除する場合があります。\n本サービスの運営を妨げるもの 知的財産権を含む財産、信用、名誉、プライバシーを侵害するおそれのある場合 犯罪的行為など法令に違反するおそれのある場合およびそれを助長する場合 公序良俗に反する場合 広告、宣伝等、本サービスの目的と関連しないもの その他、当社が不適当と判断したもの 本サービスは、正確な情報と安定した機能を実現するよう心がけておりますが、その内容を保証するものではありません。本サービスに記載された情報を元に、あるいは本サービスを利用することで（直接的、間接的を問わず）なんらかの損害がユーザおよびユーザが使用する施設設備等に発生した場合でも、当社はその責任を負いかねますので、あらかじめご了承ください。\n本サービスは、予告なく機能変更や一時停止、廃止をする場合があります。\n本サービスに対するリンクは自由ですが、商業目的で利用することは禁止いたします。\n本規約の準拠法は日本法です。本サービスおよび本規約から生じる又は関連する訴訟もしくは訴訟手続きについては、さいたま地方裁判所を第一審専属管轄裁判所とします。\n","date":"2008/08/04","externalUrl":null,"permalink":"/pages/terms_of_use/","section":"","summary":" 「ビットログ」（以下、「本サービス」という）は、株式会社ビットマイスター（以下、「ビットマイスター」という）が管理・運営・提供するサービスです。\n本規約の内容に同意できない場合は、本サービスをご利用になれません。\n本サービスに関連する著作権は当社に帰属します。\nその他、当サイトに記載されている会社名・製品名・固有のサービス名などは、各社の登録商標または商標です。\n本サービスの一部には、本サービスの利用者（以下「ユーザ」といいます）が情報を投稿し公開する機能が含まれる場合がありますが、以下に示す事項に触れる場合、その情報を削除する場合があります。\n本サービスの運営を妨げるもの 知的財産権を含む財産、信用、名誉、プライバシーを侵害するおそれのある場合 犯罪的行為など法令に違反するおそれのある場合およびそれを助長する場合 公序良俗に反する場合 広告、宣伝等、本サービスの目的と関連しないもの その他、当社が不適当と判断したもの 本サービスは、正確な情報と安定した機能を実現するよう心がけておりますが、その内容を保証するものではありません。本サービスに記載された情報を元に、あるいは本サービスを利用することで（直接的、間接的を問わず）なんらかの損害がユーザおよびユーザが使用する施設設備等に発生した場合でも、当社はその責任を負いかねますので、あらかじめご了承ください。\n本サービスは、予告なく機能変更や一時停止、廃止をする場合があります。\n本サービスに対するリンクは自由ですが、商業目的で利用することは禁止いたします。\n本規約の準拠法は日本法です。本サービスおよび本規約から生じる又は関連する訴訟もしくは訴訟手続きについては、さいたま地方裁判所を第一審専属管轄裁判所とします。\n","title":"利用規約","type":"pages"},{"content":"このサイトは、株式会社ビットマイスターの中の人たちが日々考えていること、発見したことなどを想いのままに書き綴るブログです。\n","date":"2008/07/31","externalUrl":null,"permalink":"/pages/about/","section":"","summary":"このサイトは、株式会社ビットマイスターの中の人たちが日々考えていること、発見したことなどを想いのままに書き綴るブログです。\n","title":"About","type":"pages"},{"content":"","externalUrl":null,"permalink":"/pages/","section":"","summary":"","title":"","type":"pages"},{"content":"","externalUrl":null,"permalink":"/all/","section":"ビットログ","summary":"archives","title":"All","type":"page"},{"content":"","externalUrl":null,"permalink":"/archive/","section":"Archives","summary":"","title":"Archives","type":"archive"},{"content":"","externalUrl":null,"permalink":"/posts/bit/","section":"Posts","summary":"","title":"bit","type":"posts"},{"content":"","externalUrl":null,"permalink":"/posts/jun/","section":"Posts","summary":"","title":"jun","type":"posts"},{"content":"","externalUrl":null,"permalink":"/posts/kaoru/","section":"Posts","summary":"","title":"kaoru","type":"posts"},{"content":"","externalUrl":null,"permalink":"/posts/kasa/","section":"Posts","summary":"","title":"kasa","type":"posts"},{"content":"","externalUrl":null,"permalink":"/posts/kokoa/","section":"Posts","summary":"","title":"kokoa","type":"posts"},{"content":"","externalUrl":null,"permalink":"/posts/kot/","section":"Posts","summary":"","title":"kot","type":"posts"},{"content":"","externalUrl":null,"permalink":"/posts/kzk/","section":"Posts","summary":"","title":"kzk","type":"posts"},{"content":"","externalUrl":null,"permalink":"/posts/oh/","section":"Posts","summary":"","title":"oh","type":"posts"},{"content":"","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","externalUrl":null,"permalink":"/posts/sai/","section":"Posts","summary":"","title":"sai","type":"posts"},{"content":"","externalUrl":null,"permalink":"/search/","section":"ビットログ","summary":"Search","title":"Search","type":"page"},{"content":"","externalUrl":null,"permalink":"/posts/shiro/","section":"Posts","summary":"","title":"shiro","type":"posts"},{"content":"","externalUrl":null,"permalink":"/posts/soy/","section":"Posts","summary":"","title":"soy","type":"posts"},{"content":"","externalUrl":null,"permalink":"/posts/youtan/","section":"Posts","summary":"","title":"youtan","type":"posts"},{"content":"このサイトは、株式会社ビットマイスターの中の人たちが日々考えていること、発見したことなどを想いのままに書き綴るブログです。\n","externalUrl":null,"permalink":"/","section":"ビットログ","summary":"このサイトは、株式会社ビットマイスターの中の人たちが日々考えていること、発見したことなどを想いのままに書き綴るブログです。\n","title":"ビットログ","type":"page"}]