この日記は https://yapud.hatenablog.com/ に引っ越し中
2019-06-01
_ [Software] vtigerCRM ベースの F-RevoCRM で困ったときは
オープンソースCRM で vtigarCRM というのがありますが、これをものすごくいいかんじに日本語化してある F-RevoCRM というのがあります。ただ画面表示のメッセージを日本語に翻訳してあるだけじゃなくて日本文化的にローカライズしてあります。
たとえば住所の表記順は都道府県から順に書くとか。名前の前に「Mr」とか不要なので隠すとか、違和感なく使える感じになっています。
ただし中身は vtigarCRM なので、細かくカスタマイズしたいな…ってなると vtigarCRM の作法がそのまま使えます。
カスタマイズの小技とか調べるときも vtigarCRM で検索すると良いです。
2019-06-03
_ [Software] vtigercrm で "Illegal escape sequence 'u'" エラーが出たときは
vtigercrm 6.x や F-RevoCRM でデータ作って保存しようとしたらいきなり "Illegal escape sequence 'u'" エラーが出てそれ以降表示しても保存しても何度もエラーが出てきて本当に邪魔。というとき。
同梱されている Zend Framework のライブラリが古いからこうなってる。チョチョイと書き換えて対応しよう。
include\Zend\Json\Decoder.php
を開いて、以下の行を見つける
$this->_source = $source;
$this->_sourcelength = strlen($source);
コレを以下のように書き換える。
$this->_source = self::decodeunicodestring($source);
$this->_sourcelength = strlen($this->_source);
同ファイルの最下部に、decodeunicodestring と _utf162utf8 関数を用意する。この関数は、以下リンク先に添付の Decode.zip 内 Decode.php にある関数のコードをそのままコピペすれば良い。
i18n issue with Zend Framework (#42) | Issues | vtiger / vtigercrm | Vtiger
以上で完了。エラー出なくなってホッ。
2019-06-05
_ [いろいろ] WOWOWメンバーズオンデマンド、Amazon FireTV Stick で見れるように
Amazon FireTV Stick 使ってますか。めっちゃ安価なのにTVに刺すだけでTVが魔法の映像見まくりデバイスになっちまいます。
先月から、WOWOWメンバーズオンデマンドが、Amazon FireTV Stick で見れるようになりました。ますますテレビの前から動けなくなります。
WOWOW加入してると多量のライブラリ中からオンデマンドで再生できるサービスが使えます。そのオンデマンド再生サービスが FireTV Stick にも対応しました。 FireTV Stick 用のアプリが出たのですよ。
インストールするとこんな感じで画面上に出てきます。
WOWOWメンバースオンデマンドを開くと、今放送中のヤツも見れますし(これは普通にテレビで見れば良いと思う)オンデマンド用に準備された多量の映像の中から好きなのを再生できます。
見たいのばっかりで時間が全く足りない。
2019-06-07
_ [クルマ] SUBARU と TOYOTA と一緒に EV
トヨタとSUBARU、EV専用プラットフォームおよびSUVモデルのEVを共同開発することに合意
グローバル展開のEV | コーポレート | グローバルニュースルーム | トヨタ自動車株式会社 公式企業サイト
SUBARU 6月6日発表の情報によると。
両社の技術を持ち寄り、中・大型乗用車向けEV専用プラットフォームを共同開発。トヨタの電動化技術と、SUBARUのAWD技術を活用。このプラットフォームでCセグメントSUVを共同開発、両社のブランドで販売。
両社ブランドで発売ということは 86 と BRZ みたいなことになるんかな。どこまで踏み込んで共同でやるんだろ。
TOYOTA 6月7日発表の情報によると。
ミディアムSUVについては、SUBARUと共同で企画・開発を行い、コンパクト車をスズキ、ダイハツ工業と共同企画、とのこと。コンパクトについては企画は一緒にやるけど開発は各社でお願いって事かな。
TOYOTAとSUBARU共同で企画開発するのはミディアムSUVとのこと。っていうとフォレスターくらいのヤツ?
EV専用のプラットフォームとモーターやパワーコントロールユニットなどの専用EVユニットを共同企画。企画は一緒にやるのね。開発はそれぞれが得意なところをやるのかな。どっちがどの部分を開発するんだろ。
そして出来上がったユニットを出来上がったプラットフォームに載せて双方の会社から出すと。今後の情報が出てくるのが楽しみ~
2019-06-09
_ [いろいろ] 自分の運動結果が数字になるとゲームのキャラみたいな気持ちになれる
走ったり歩いたりしていますか。
最近のスマートフォンはとても優秀で、各社何らかのヘルスケアアプリが入っています。こいつがスマートフォンの持ち主の動きをトラッキングしてくれます。
さらにスマートウォッチと連携させると、心拍数などを取り込んでくれたりもします。こうなってくるととても楽しくなってくる。
画面例です。今話題の HUAWEI P20lite と HUAWEI Band2 をリンクさせてちょっとジョギングとかしてみた場合。
走り始めるときに、ヘルスケアアプリを起動し、ランニングスタートボタンを押します。あとはカバンにしまっておきましてGO。
1. GPSで走ったルートを記録。スマートフォンにはGPSがありますから、スマートウォッチ側にGPSがなくても走ったルートを記録してくれます。GPS入りの高いスマートウォッチ買わなくていいですよ。
2. 1kmごとのペースを表示してくれます。だいたい同じペースで走れてたかなと振り返りができます。
3. 心拍数や歩幅や足の運びのリズムも記録してくれます。もうちょっと速くしようとか遅くしようとかの参考になります。心拍数も、あまり上げずに有酸素や脂肪燃焼にしようとか、ガッツリ筋肉追い込もうとか、自分のパラメータを見ながら動きを調整できます。
4. 今回の走りは全体的にどんなもんだったかというサマリも表示できます。
自分の状態が記録されて見返すことができるというのがめっちゃゲームっぽくないですか。このときこういうパラメータだったからもうちょっと動きを変えようとか次の動きを計画できるじゃないですか。
ただ走るだけだと全くモチベーションわかないですが、こうやって数字が見えると、自分の状態が見えると、なんか楽しくなってきます。
走ってる間スマートフォンは手に持っておくと邪魔なので、ジョギング用の小さなポーチに入れておくと良いかと思います。
2019-06-11
_ [Software] vtigercrm や f-revocrm で新しいモジュールを作る
vtigercrm 6.x や f-revocrm 6.x で、新しいモジュールを作りたい場合。
まずは空っぽの最低限の機能を備えただけのモジュールを作ります。
インストールしてあるディレクトリに移動し、console.php
を実行すると、処理内容についてのプロンプトが出ます。
$ php vtlib/tools/console.php
Choose the options below:
1. Create New Module.
2. Create New Layout.
3. Create New Language Pack.
4. Create Test Language Pack.
5. Import Module.
6. Update Module.
7. Remove Module.
Enter your choice:
新しいモジュールを作りたいので 1 を選んでいきましょう。
Enter your choice: 1
>>> MODULE <<<
Enter module name: sampleModule
Entity field (Name): name
Creating ...DONE.
Enter module name でモジュール名を指定します。これはアルファベットにしておきます。今回は sampleModule。
エンティティフィールド(入力必須?)のところにはフィールドをとりあえず一つ準備します。今回は name とします。キーは別でもっているっぽいので、これはプライマリキーではないようです。
ここまでの処理で、モジュールが作成され、管理画面のモジュール一覧に載り、基本的な php ファイルが配置されます。
あとは好きなだけフィールドを足していきましょう。
他のモジュールと関連付けるには、vtlib を使ったちょっとしたコードを書いてあげればいけます。
たとえば、いま作ったばかりの sampleModule → Contacts(顧客担当者)の関連付けをしたい場合は以下のような感じです。
<?php
$Vtiger_Utils_Log = true;
include_once('vtlib/Vtiger/Module.php');
$moduleInstance = Vtiger_Module::getInstance('sampleModule');
$contactsModule = Vtiger_Module::getInstance('Contacts');
$relationLabel = 'Contacts';
$moduleInstance->setRelatedList(
$contactsModule, $relationLabel, Array('ADD','SELECT')
);
?>
逆向きの関連付けの場合は、モジュール名の指定を逆にすればいけるでしょう。
vtlib 呼ぶコード書くときは、最初に $Vtiger_Utils_Log = true;
と入れておくと、何の処理をしたか出力してくれるので確認に便利です。
2019-06-13
_ [Software] vtigercrm や f-revocrm で、モジュール間で関連するエントリの表示について
モジュール間の関連は uitype = 10 のフィールドを作り、setRelatedModules() でモジュール間の関連を付ければよい。
vtigercrm から fork してる? coreBOS のドキュメントがとても参考になる。
How to add related lists to a module [coreBOS]
フィールドを通じたモジュール間の関連付け
例えば新規作成モジュールと顧客担当者モジュールのデータを関連付けたければ、setRelatedModules('Contacts') を実行すればよい。
以下リンク先の Set Related Module の項がそれにあたる。
これで関連付けが定義され、新規作成モジュールの画面内に顧客担当者を選択するフィールドが生成される。
実際にどのデータとどのデータが紐づけられているか…という情報はテーブル vtiger_crmentityrel に格納されている。
vtiger_crmentity に格納される際に付与される crmid を使用し、新規作成モジュールの crmid = xxxxx と 顧客担当者モジュールの crmid = yyyyy が関連しますよ、といったデータが格納される。
表示時には vtiger_crmentityrel に格納されている関連付け情報を使い、関連モジュールタブの一覧画面で表示される。
ここまでが一般的な流れ。
一括インポートしたデータでのモジュール間の関連付け
ところが困ったことに、インポート機能でデータを一括インポートした際は vtiger_crmentityrel に関連付けの情報が格納されない。データ移行などの時に大変困る。
関連付けテーブル vtiger_crmentityrel の中を見ていると、顧客担当者と顧客や顧客と案件の関連付け情報が入っていない。vtiger_crmentityrel に入っていないのに関連付け表示ができている。
これは各モジュール内で、関連付け表示用の関数が別途用意されているからである。
各モジュールは CRMEntity というクラスを持つ。
CRMEntity クラスは共通の modules/Vtiger/CRMEntity.php で実装されていて、モジュールを新規作成した場合すべて modules/Vtiger/CRMEntity.php が使われる。
ただし初期から本体に付属して用意されているモジュール類は、モジュール本体の PHP 内で個別に実装されているものがある。共通部品として用意されている関数群は本体付属モジュール内では使われず各モジュール個別実装されているものがある。
新規作成モジュールは初期値では共通部品を使うため、関連データを表示する関数として標準で準備されている get_related_list() を使う。get_related_list() 関数は vtiger_crmentityrel テーブルに情報がある前提で動作するので今回の場合(インポートをした場合)困る。
よって vtiger_crmentityrel に依存しない get_related_list() のようなふるまいをする関数を作ればよい。
たとえば modules/Contscts/Contacts.php の中を見れば get_opportunities() など関連させたいモジュールの数だけ関数が用意してある。これをコピペしてそれらしい関数名に変更し、SQLをちょチョイと書き換えてやればOKである。
作成した関数を呼び出すには、setRelatedList するときの最後の引数に関数名をセットすればよい。関連付けの処理を書くのがめんどくさい!というばあいは DB の中身を直接操作すればよい。vtiger_relatedlists テーブル内のカラム name に、関連モジュールを呼び出すときに使われる関数名があるので、そこを書き換えればよい。
2019-06-15
_ [Software] vtigercrm や f-revocrm でインポート時の連番付与がおかしい
vtigercrm や f-revocrm で連番付与をするフィールドを準備しており、番号を 00001、00002、00003 といったようにゼロ埋めで定義をしている場合。画面からGUIで操作しデータを作成する分には順調にゼロ埋めで連番が付与されるのだが、一括インポートをした際はゼロ埋めが取れてしまう。とても悲しい。
これはちょっとイケてないのだけど、GUIから入力する場合は連番付与処理に data/CRMEntity.php ファイルの setModuleSeqNumber() 関数を通過するのでゼロ埋めの件は問題ないが、インポートする場合は別の連番付与 updateMissingSeqNumber() 関数を通過するのでこのような問題が起きる。せっかく関数作ってあるのだからそっちを呼んでよ…。
つくりを変えるのは大変なのでちゃっちゃっとパッチを当てる方向で対処する。
updateMissingSeqNumber() 関数の while ($recordinfo = $adb->fetch_array($records)) ブロックの中身を setModuleSeqNumber() 関数の同等の場所と同等の内容にしてしまえばOK。
例えば coreBOS の updateMissingSeqNumber() 関数はここがFIXされており参考になると思う → corebos/CRMEntity.php at master · tsolucio/corebos · GitHub
これで、一括インポート時も無事通常処理と同様の連番が付与される。安心である。
2019-06-17
_ [Software] vtigercrm や f-revocrm で連番をリセットしたい
vtigercrm や f-revocrm で連番の設定は「他の設定」メニュー内「レコード番号のカスタマイズ」画面で実施する。
こちらで設定した内容は、プレフィクス+連番 で テーブル vtiger_modentity_num に情報が格納される。
そして一度振った連番より小さな番号を画面上から振りなおすことはできない。プレフィクスを変更すれば再度1番から振ることが可能。
一括インポートのやり直しなど同じプレフィクスのままで再度1番から振り直したいときはDBを操作する。
vtiger_modentity_num テーブル内の該当のデータを書き換えればよい。
2019-06-19
_ [Software] Splunk REST API 接続の確認
Splunk への REST API 接続の確認については、curl コマンドを使って確認できる。
各種手法が以下リンク先にあるのでこれを参考にする。
Use cURL to manage HTTP Event Collector tokens, events, and services
認証が ID/PASS なのか Token なのかで書き方は少し違うけれども両方サンプルがあるのでその通りにやればよい。
トークン使うやり方、Splunk 側の設定としては、設定 → データ入力 → HTTPイベントコレクタ → グローバル設定 でトークンを有効にする。
そして接続用にトークンを発行する。設定 → データ入力 → HTTPイベントコレクタ → 新規トークン でトークンを発行する。このトークンでアクセスする先のインデックスも指定しておく。
出来上がったトークンを使って試しに Splunk へイベントを送ってみよう。
以下コマンド例。 Authorization: Splunk の後ろの文字列は、前の手順で発行したトークンに置き換えればよい。
curl -k "https://mysplunkserver.example.com:8088/services/collector" \
-H "Authorization: Splunk CF179AE4-3C99-45F5-A7CC-3284AA91CF67" \
-d '{"event": "Hello, world!", "sourcetype": "manual"}'
応答が 403 なら認証が通ってない。権限があるかトークンが間違ってないか確認しよう。
応答が 400 ならデータフォーマットが変なことが多いので見直そう。ほかに Splunk 側のトークン発行した時の設定で インデクサー確認を有効化 を チェックなし にすれば通ることもある。
うまく通るようになったらどんどんデータを放り込もう。データは蓄えれば蓄えるほど楽しくなる。
2019-06-21
_ [Software] python で Requests の通信内容を確認したい
python のとっても使いやすいHTTPライブラリ Requests というのがあります。これを使ってるときの通信内容を確認したい。
たとえば REST API 操作するようなコード書いてて、どうにも 400 Bad Request が返ってきて意味が分からない…なんてときに。
この↓回答内容がめちゃ参考になるしそのままコピペでOK。
送信した内容、返ってきた内容、両方見れる。通信内容の何がマズいのかわからないとき、これで追いかけやすくなる。
時々、デバッグ内容を出さずに「おかしいんですよ、うまくいかないんですよ」って助けを求めてくる人いるんですけど、何にも情報なければこっちもわかりません。取れる情報は全部取って!おかしそうなところを絞り込んで!そこに絞り込んだ理由も明確にして!
2019-06-23
_ [Hardware] Bluetoothイヤホン 【改善版】Anker SoundBuds Slim + P20lite
ジョギングのお供にヘッドホンが欲しくなり、Bluetooth 接続のヘッドホンを一つ買ってみようと。そう思い検索して勢いで買ってみました。
Anker(アンカー)社の 【改善版】Anker SoundBuds Slim です。型番は A3410011 。
箱はこんな感じ。
箱の裏面はこんな感じ。
Bluetooth 接続のヘッドホンは初めてですので音質は…どうなんでしょう。接続先は HUAWEI P20lite。
比べちゃいかんでしょうけど、ステレオミニプラグで繋がる有線ヘッドホンとは全然違います。圧縮されてるねえ(高音の伸びが全然足りない・色々省略されて痩せてる・解像感が物足りない)、でもわりと頑張ってるねえ、という感じの音です。しかし価格を考えると、3,000円未満ということを考えるとかなり良いのではないかと思います。
2,000円くらいの有線ヘッドホンでめっちゃショボイ音のもあったりするので、無線機構やバッテリなどを搭載し防水を実現した上でこの音なら大変コスパは高いと言えるかと思います。
対応しているプロコトルは SBC と AAC です。aptX は対応してません。aptX に対応してればもっと豊かな音になるんだろうか。
環境音がざわざわしてる通勤電車で聞く分には全然困りません(元々環境音に情報が削がれるんで)。満員の通勤電車で各位から多種多様の電波が飛び散ってる状況でも音は途切れません。これは安定している。
ジョギングするときは振動でケーブルが右側(リモコンがある側)に引っ張られて左耳側が外れやすくなってしまいますので、左側ケーブルに付属の留め具を付けシャツの衿などに留めると安定して良いかと思います。
走りながら音を聞くと、振動で耳穴に突っ込んでる部分がどうしても緩んでしまいます。そうすると低音がスカスカになってショボイ感がどうしても出てしまいます。
走りながらなのでメロディとリズムと特徴的な旋律がそこそこ聴ければ良いかなというくらいですのでこんなもんで良いでしょう。
耳穴にピッタリフィットして外れないくらいにグイグイ押し込むときっと低音回りの音も安定するんでしょうけど、外音が全く聞こえないのもちょっと怖いです。
ランニング用のアプリで計測しながら走ってるとヘッドホンから今何キロ走って直近の1km区間は何分だった、と1キロごとにしゃべってくれるので状況把握しながら走れて便利感高いです。いいねー、とてもいいねー。
2019-06-25
_ [Hardware] Bluetoothイヤホン 【改善版】Anker SoundBuds Slim + P20lite (2)
Bluetoothイヤホン 【改善版】Anker SoundBuds Slim + P20lite (2019-06-23) の続き
P20lite(Android 9化済み) 接続時の表示
開発者メニューで Bluetooth の現状を表示したところ。
P20lite は Android 9 ベースの EMUI 9.1 ですので結構カスタマイズされています。そのため条件は他の Android 9 機と合わせられません。「Bluetooth A2DP ハードウェアオフロードの無効化」は表示すらされてませんが、たぶん無効化する設定で固定になってるのだと思います。その方が繋がる率が高いので。
そして自宅で、スマホ本体と SoundBuds Slim をスグ側に置いて聞くと結構いい音で聞こえます。電波の帯域に(品質に)余裕があればかなりいい音ですね。
人混みであるとか、スマホと SoundBuds Slim の距離が遠いとかの電波状況に贅沢言えない環境になると音質落ちますね。走りながら背中の鞄にスマホ入れておくと、スマホが背中側になることもあり、電波状況が悪くなるので音質落ちるのも仕方無しと。
Android One S1 に繋いだらどうなるの
おまけ Android One S1(Android 9化済み) に Anker SoundBuds Slim を接続時の、開発者メニューで状況表示したところ。
Android One S1 の制限でしょうか。「Bluetooth A2DP ハードウェアオフロードの無効化」=「True」が固定で変更できません。オーディオストリーミングの演算は本体CPU側でやってから送出すると。そしてコーデックはSBC固定です。本体CPUの性能なのか何なのかSBC固定です。明らかにワンランク下の音です。ラジオ聞いてるみたいな。
※追記:ペアリングを何度かやり直したら、コーデックはSBCのままですけど全然問題なしの良い音になりました。P20lite と同じような感じです。
2019-06-27
_ [Android] 有機ELとアンチグレアフィルム
キラキラテカテカの光沢画面が苦手なのでスマートフォンにはスグにアンチグレアフィルムを貼るのです。反射はなくなるし手触りはさらさらになるし最高ですよね。もちろん google pixel 3 にもアンチグレアフィルムを貼りました。ラスタバナナの反射防止フィルムです。
ところがコレがかなり残念なことになってしまったのでそいつを紹介いたします。
■比較
左が pixel3、右が p20lite です。どちらもラスタバナナの反射防止すなわちアンチグレア加工のフィルムを貼っています。遠くから見ると色味が違うだけみたいな感じです。
近寄ってみましょう。わかりやすくするため、白背景の部分、真ん中を等倍切り出しです。おいー!
左側が pixel 3 とアンチグレアフィルムです。わかります?これは高ISO撮影によるカラーノイズじゃないですよ?JPEG圧縮によるブロックノイズでもないですよ?普通にこう見えるのです。通常使用時において常にチラチラとカラーノイズが見え続ける苦しみを味わえます。
しかも写真にしたところで失われてしまうのですがこのノイズがまた高輝度で。ギラギラとしたカラーノイズです。目が苦しい。
スキマから有機ELのパターンが見えますでしょうか。かなり高精細です。この高輝度高精細がアダになってアンチグレアフィルムの乱反射がヒーローショーの必殺技レベルに増幅されて目に攻撃をしてきます。
■サイズ感
サイズ感も見てみましょう。
ラスタバナナの反射防止フィルム、p20lite用のフィルムは…液晶よりも髪の毛一本分くらい大きいのでギリ液晶をカバーできます。
今度は pixel3 用のフィルム…液晶よりも横幅 1mm くらい狭くて液晶をカバーできません。ヨドバシの貼り付けサービスで貼ってもらったんですけど、いくら貼るひとの腕が良くても、サイズが合ってないとなー。まじかー。
WEB検索してみると、iPhone X 以降の有機ELディスプレイモデルを使用しているアンチグレアフィルム愛用者の方々も同様の事象でガッカリされている模様。
有機EL対応のアンチグレアフィルムは発売されていないものでしょうか。
ミヤビックスのものとかPDA工房のものの評価がよさそうなので挑戦するしかない。
■手触り
手触りはサイコーです。さらっさら~
■追記
2019-06-29
_ [Android] Android機のデバッグするなら Android Device Monitor
Android 機の吐くログ見たいですよね。Android 機のデバッグするなら Android Device Monitor です。
Android の sdk-tools に含まれています。
Android Studio 全体をインストールしてもいいですし、sdk-tools だけをインストールしてもいいです。
Download Android Studio and SDK tools
さてここからはWindowsの場合で書きますが、インストールしたら %USERPROFILE%\AppData\Local\Android\sdk\tools\monitor.bat
を起動しましょ。
起動には時間がかかります。しばらく待ってこんな画面が出てくりゃあOK
スクリーンショットも撮れるし、ログも見れるし、めっちゃ便利です。
2019-06-30
_ [Software] tDiary の記述スタイルを GFM に変更した
tDiary の記述スタイルを GFM に変更してみた。GFM というのは Github Flavored Markdown のことで、まあだいたい Markdown である。 しばらくは手探りである。
GitHub - tdiary/tdiary-style-gfm: GFM style for tDiary
導入するにあたって依存するライブラリの中に idn-ruby がある。こいつが素直にインストールできなかった。エラーが出るのだ。
ERROR: could not find idn library!
今回 CentOS7 環境に入れたのだが、この環境の場合 libidn と libidn-devel パッケージが必要である。
自分のサーバであれば yum なり apt なりでパッケージをインストールすれば良いのだが、今回の場合ユーザーディレクトリを借りているだけでOSには手を出せないのでユーザディレクトリに必要なファイルを展開することにした。
適当にディレクトリを掘って rpm の中のファイルを放り込む。 そして tDiary のディレクトリで以下のようなコマンドを実行する。
bundle exec gem install idn-ruby -- --with-idn-lib=/home/myname/libidn/lib64 --with-idn-include=/home/myname/libidn/include
無事ビルドできて GFM スタイルを使用開始することができた。
前 | 2019年 6月 |
次 | ||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |