2019年11月29日金曜日

最近気になるOSS3つ(vlang, vulcain, omi) - 2019/11/29


vlang

V言語。高速コンパイル、理解容易性に主軸を置いた新しいプログラミング言語。強くgoの影響を受けている。
2019/11時点ではまだバグが多く標準ライブラリも未実装が多い。
ただ、既存言語に比べて優位性があるのは確かで、今後注目。

vulcain

Web-APIのための新しい通信プロトコル。HTTP2の仕様をフル活用し、いくつかの仕様を追加することで、GraphQLのようなラウンドトリップ回数の低減を実現しつつHTTP2の仕組みに則った通信ができる仕組み。
HTTP2の仕組みに乗ることで、既存のキャッシュシステムや開発ツールを有効に活用できる。また、クエリ言語にGraphQLを使うこともでき、作者は完全にGraphQLの代替として使えると主張している。

omi

Tencentが開発するフロントエンドフレームワーク。
既存のフロントエンドフレームワークと大きく異なるのは、WebComponentsを前提とした仕組みとなっていること。出力はカスタムコンポーネントとなる。このため、既存のフロントエンドフレームワークと混在させたり、マイクロフロントエンドを実現するといったことが容易。
toolchain(webpack,babel)なしでもそれなりに見やすい書き方ができる。もちろんJSXは使えなくなるが。




2019年5月28日火曜日

e-Govは可能な限り使わずにHR-Techサービスを使うべきという結論

とにかくひどいe-Gov

何度か社会保険関係の申請などでe-Govを使ったことがある。官公庁系の公式電子申請サービスは軒並みユーザインタフェースが壊滅的で分かりにくいものであるが、e-Govは群を抜く。最悪の中の最悪のユーザーインタフェースを誇っていた。不可思議なウェブサービスとデスクトップクライアントとの融合。使い物にならないメッセージ機構。直し方が分からないエラーメッセージ。e-TaxやeLTAXとは比にならない使いにくさである。
ソフトウェアエンジニアであり数あるウェブサービスを使っている自分ですら全く理解できないのだ。こんなものを一体だれが使いこなせるというのか。唯一の救いは電話サポートが親切だということだ。e-Govを使うなら電話サポートを使い倒すくらいのつもりでなくてはならない。いずれにしろとてつもないストレスを抱えることにはなるが。

HR-Techサービスを使ってみたら最高だった

e-Govは外部サービスのためにAPIを提供しているため、これを利用して電子申請が行えるサービスがいくつも存在している。これらはe-Govとは比べ物にならない素晴らしいユーザインタフェースと付加機能を有している。基本的に有料ではあるがそれほど高価ではないし絶対にこちらを使ったほうがよい。試したのはOffice StationとSmartHRというサービスだ。

Office Station

Office Stationは約100の帳票の電子申請に対応しており利用頻度の高い帳票はほとんど網羅している。保険関係成立届やなど事業所単位で一度しか使わないような帳票も電子申請が可能で立ち上げたばかりの会社で使うのに最適だと感じた。ユーザインタフェースはやや古く部分的に分かりにくく感じる部分もあった。 しっかりとマニュアルを読めばいいのだがなんとなくで使おうとすると少しハマる部分がある。また、10人まで900円という格安料金体系で、大抵のケースで後述のSmartHRよりも安い。

SmartHR

この手のサービスで一番目立っているのがSmartHRではないだろうか。最近は広告などもよく見かける。対応帳票の数はOffice Stationと比べると心許ないが、利用頻度高いものはだいたい電子申請可能のようだ。際立つのは分かりやすくモダンなユーザインタフェースだ。利用登録後にスマホゲームなどにありがちなチュートリアルなどがしっかりと整備されており「分かりやすさ」にしっかりと時間を使っている。


少人数の会社の税務・手続きを簡単にするためのサービスまとめ


 会社設立

税務・確定申告

給与計算

社会保険・労務管理

  • OfficeStation
    電子申請に対応している帳票が多く、電子申請を最大限に活用したい場合に便利。
  • SmartHR
    UIが親切で使いやすい。

官公庁系の電子申請サービス

官公庁が作成しているサービスなので当然多くの手続きが電子申請で行えるが、UIが本当にひどいのでできるだけ別の会社が提供している有料サービスを利用することを推奨する。特にe-govは最悪レベルの作りになっているため、どうしてもという場合以外はSmartHRやOfficeStationを活用すべし。
  • e-Tax
    国税の電子申告・納税に対応する電子申請サービス。法人税の申告などに利用。
  • eLTAX
    地方税に関する電子申請サービス。給与支払い報告書など年末調整などに利用。
  • e-Gov
    各種行政機関への電子申請サービス。社会保険・労務関連の申請などに利用。

2016年4月2日土曜日

cordovaでwkwebview-engine-localhost を入れるとbuildに失敗する問題の対処

XCodeでビルドしてみると重複するシンボルがあるというリンカーエラーになっていた。

GCDWebServer.frameworkがリンクされているにも関わらず何故か.mと.hも別に組み込まれているために起きていた。
GCDWebServer.frameworkをリンク対象から外すことで問題が解消した。

cordova buildからだと下記のようなエラーでよくわからない。
基本的にビルドに失敗した場合はXCodeでビルドし直すとトラブルシューティングしやすいかもしれない。

Error code 65 for command: xcodebuild with args:

2016年3月8日火曜日

Imagemagickを使ってアルファ値付き(アンチエイリアス )のアイコン画像の色を置換する

フリーのアイコンなどをネイティブアプリで使う場合に色を変えたくなることがある。
そこで、ImageMagickを使って画像の色を一括置換したい。。
方法を検索してみると、コマンドを載せているブログがいくつかヒットするが、アルファ値を使ったアンチエイリアスが効いたアイコンをうまく扱える方法は見つけられない。

そこで仕方ないので作ったのがこちら。

gist: https://gist.github.com/dotneet/3f2a69924bce60209d0b

やっていること:
1.アルファ値を切り出しておく
2.置換後の色で塗りつぶした画像を用意する
3.切り出しておいたアルファ値を再度適用する

仕組み的に画像はアルファ値を除き単色で構成されているが条件になる。

Google Material Designのアイコンやいくつかのアイコンに対してはうまく機能した。

2016年3月3日木曜日

"Configuration with name 'default' not found"への対応

あるプロジェクトをgit cloneしてきてgradleを実行すると
"Configuration with name 'default' not found"
というエラーが発生して進まなくなった。

原因: サブモジュールがなかった

このエラーはbuild.gradleでサブプロジェクトが指定されているがサブプロジェクトのファイルが存在しない場合に発生するよう。

なので、サブプロジェクトをgitのサブモジュールとしているプロジェクトでは git submodule init, git submodule update をかけておかないとこのエラーがでる。

2016年2月17日水曜日

Dockerは現時点(1.9)では複数のネットワークインタフェースをうまく扱うことができない

どうやら、Dockerはデフォルトのネットワークインタフェース間でしか通信を行うことができないらしい。
例えば、eth0とeth1と2つのネットワークインタフェースを持つような構成になっている場合に、コンテナはeth1との通信が一切できない。

このブログに理由と解決方法が載っていた。

http://williamsbdev.com/posts/docker-connection-marking/

パケットがdocker0を通る前にパケットにfwmarkという印を付けることでちゃんとルーティングされるようにするらしい。
ちょっときもい。


2016年2月15日月曜日

Android端末からHTTPSに繋ぐとセキュリティエラーになる問題の対処

まれにAndroid端末に対応していないSSL証明書もあるらしいが、おそらくほとんどは中間証明書のインストールをミスっているだけだと思う。

SSL証明書の公開鍵証明書には証明書本体だけでなく中間証明書を追加すること。
中間証明書は公開鍵証明書の発行元が登録完了後にメールに添付してくるか、発行元サイトなどで公開されている。

サーバーの設定

秘密鍵

自分で作成した秘密鍵を設定

こんな感じになる:

-----BEGIN RSA PRIVATE KEY-----
~
-----END RSA PRIVATE KEY-----

公開鍵証明書

送られてきた証明書と中間証明書を結合したファイル。

こんな感じになる:

-----BEGIN CERTIFICATE-----
~公開鍵証明書
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
~中間証明書
-----END CERTIFICATE-----


2016年2月9日火曜日

クラウド時代のプログラマについて考えたみた。

クラウド時代のプログラマについて考えたみた。


オンデマンドインスタンス型プログラマ


オンデマンドインスタンス型のプログラマは時間単位の報酬で作業を受ける。
プログラマに作業依頼にするには、ウェブコンソールから「インスタンスの作成」を行う。
ここで様々な種類のプログラマから作業内容にあったインスタンスタイプを選ぶことができる。
インスタンスタイプについては後述する。

スポットインスタンス型のプログラマ


プログラマはもしも定時にあがることができたなら家で少しだけ作業ができる。
強調しておくが、”もしも” 定時にあがれたらだ。
この空いた時間帯に副業として作業を依頼する分には少しだけ安く作業を請け負うことができる。


リザーブドインスタンス


もしプログラマに長期的に作業をしてもらいたい場合は、リザーブドインスタンスがお得だ。
あらかじめ年間に一定以上の作業を依頼する約束をすることで、安く作業を請け負ってもらうことができる。
ただし、もし約束しただけの作業を依頼できなかった場合でも、同等の報酬は払わなければならない。

インスタンスタイプ


プログラマにもタイプが存在し、作業に応じて向き不向きがある。
このため、クライアント様においては、作業内容に応じて適切なプログラマのインスタンスタイプを選ぶことが重要だ。

m4インスタンス

m4インスタンスは汎用的に使えるプログラマインスタンスタイプだ。特にこれに対して強いというものはないが
大抵のことをそれなりな感じにこなしてくれる。
どのインスタンスタイプを選べば分からない場合はとりあえずこれを選んでおけばいい。

c4インスタンス

とにかく特定の作業を早くこなしてもらいたい場合はこのインスタンスを使う。
ただし、このインスタンスタイプのプログラマはたくさんのことを覚えたり、たくさんのことを同時に行うのは苦手だ。

r3インスタンス

c4とは反対に、色んなことを同時にさせたり、記憶力の良いプログラマを所望する場合はこのインスタンスだ。

まとめ

冗談はさておき、実際もっと短いスパンで色んな仕事をこなすというのも面白いきはする。

2015年7月19日日曜日

MacでJavaの起動が遅い原因はアンチウイルスソフトだった

MacでJavaの起動がすごく遅いことに気づいた。
Javaのアプリケーションが重いのではなく、JavaのJVMそのものの起動が遅い。
java -version するだけでも10秒ほどかかった。

原因はアンチウイルスソフトだった。
リアルタイム保護機能が効いており、JVMを起動時にチェックしていたようだ。
私の場合はFortiClientというアンチウイルスソフトを使っていたが、これのリアルタイム保護を無効にすることでちゃんと1〜2秒で起動してくれるようになった。

2015年7月11日土曜日

ChromeのPush APIで「This site has been update in the background」という通知が表示される原因

「This site has been update in the background」はPUSH通知が来たが表示するメッセージがなかった場合に表示されるデフォルトのメッセージだ。
pushイベント内で showNotification() が確実に実行されるようにすることで、このメッセージを回避できるようになる。

evt.waitUntil() に渡すPromise内でshowNotification()することになるが、ちゃんと各箇所でPromiseをreturnしているか確認する必要がある。

私はfetch()のPromiseをリターンしていなかったためにこのメッセージ表示されており相当な時間ハマってしまった。

2015年4月26日日曜日

Amazon SESのTXTレコード設定、Value-Domain版

Amazon SESではドメインの認証をすることで、そのドメインからのメール送信ができるようになる。
ドメインの認証をするにはSESに指定された値をDNSのTXTレコードに設定する必要がある。

下記のように設定しなさい、と指示されるがValue-Domainの管理画面から設定する場合はどうするのか?
Name: _amazonses.example.com
Type: TXT
Value: <認証コード>

結論。

TXT _amazonses.example.com <認証コード>

で、認証が通りました。

SPFの設定だと v=~~ ~all とか書式があるから、なにかそういう書式が必要なのかと思って迷いました。
DNSは苦手です。

さくらのメールを使おうとしたら「550 5.7.1 Command rejected」と言われてメールを送信できなかった。vultrのせいだった。

さくらのメールボックスを借りてPEAR::Mailでメールを送信しようとしたところ、メールが送信できず困った。
PEAR::MailはMail::factoryの第2引数に渡すパラメーターで 'debug' => true を設定することでSMTPのやりとりを出力してくれる。
これでやりとりを見てみると Authentication OK という文字が見えることから、認証は成功しているようだが、そのあとすぐに「550 5.7.1 Command rejected」というメッセージがでて接続が切れていた。
なんとも不可解な動作にずっと悩んでいたが、どうもvultrというクラウドを使っていたことが原因のようだった。

こちらのブログを見つけられなかったらずっと悩んでいたかもしれない。感謝。

Vultrからメールが送れないのでSendGridを使う

このブログのリンク先の公式サイトにて、下記のメッセージを確認。
Do you allow outbound SMTP?
Outbound SMTP is blocked by default. To lift this restriction, you must contact our support team and fill out an authorization form.
しかし認証までうまくいくのは何故なのか謎すぎる。接続もできない状態であればすぐ気づいたのだけど。。。

解決策としては、やはりクラウドサービスを利用することにした。AWSは使い慣れているのでAWSのSESを使うことにした。EC2以外から使う場合は無料枠がないようなのでちょっと微妙だけれどほとんどメールなんて飛ばないだろうからいいやという判断。


2015年4月24日金曜日

Androidでリンクを強制的にChromeで開く方法

リンクを強制的にChromeで開く方法を30分くらい探しまわったところやっとこさStackOverflowで見つけた。

http://stackoverflow.com/questions/29250152/what-is-the-intent-to-launch-any-website-link-in-google-chrome

とても助かります。。。

フォーマット:
<a href="intent://<URL>#Intent;scheme=http;package=com.android.chrome;end">

実例:
<a href="intent://stackoverflow.com/questions/29250152/what-is-the-intent-to-launch-any-website-link-in-google-chrome#Intent;scheme=http;package=com.android.chrome;end">テスト</a>


強制的にChromeで開くのではなく、ユーザーにURLを開く方法を選択させる方法。
<a href="intent://stackoverflow.com/questions/29250152/what-is-the-intent-to-launch-any-website-link-in-google-chrome#Intent;scheme=http;action=android.intent.action.VIEW;end;">テスト</a>

Chromeでしか動かないWebアプリに飛ばす場合なんかに使いたいですね。
ちゃんと理解すると色々応用が効きそうです。


2015年4月22日水曜日

Docker を利用した Web アプリケーションのデプロイ(私の場合)

先日、「クックパッド開発者ブログ」で「Docker を利用した Web アプリケーションのデプロイ」という記事があがっていた。
僕の関わっているプロダクトでもDockerを採用していて、ほとんどデプロイの仕方が同じだった。

私の構成

クックパッドさんと異なる点としては
・Nginxもコンテナとして起動している
・UnixソケットではなくコンテナのIPを直接してアプリケーション・サーバーと繋げている
というところ。

あと環境変数の共有とかはいまのところ必要性を感じていないのでやっていない。

うちのNginxの設定はちょっとトリッキーかもしれない。
設定ファイルはerbテンプレートから出力する。変数は環境変数として持っておく。

Nginxの向き先を新しいアプリケーション・サーバーに向けるスクリプトはこんな感じだ。

# switch.sh
export WEBAPP_HOST=${1}
erb /docker/etc/nginx.conf.erb > /etc/nginx/nginx.conf
/etc/init.d/nginx reload

そしてこれがNginxの設定ファイルのテンプレートの一部

/docker/etc/nginx.conf.erb
location / {
  proxy_pass http://<%= ENV['WEBAPP_HOST'] %>/;
}

Nginxに限らず多くの設定ファイルがerbテンプレートを使用している。
基本的に設定の変数には環境変数を使っていきたいと考えたが、多くの設定ファイルは環境変数を参照するといったことはできない。sedなどでは対応しにくいパターンもある。なのでなるべく柔軟に対応できるようにテンプレートシステムを使うことにした。erbにこだわりがあるわけではなくphpでもよかったと思う。
最初に導入したのがruby製であるfluentdの設定ファイルを作成していたときなので自然と?erbになってしまっただけだ。

実際のオペレーション方法

基本的なオペレーションはAnsibleで包んでいる。

だから新しいAPIサーバーをデプロイするには下記のようなコマンドを実行するだけでいい。(versionはコンテナ名のSuffixになる)

ansible-playbook -i hosts/production playbooks/api-server-start.yml -e "version=1"
ansible-playbook -i hosts/production playbooks/reverse-proxy-switch.yml -e "version=1"

ansible-playbookを実行するWebフロントエンドも開発済みで開発環境では既にAnsibleのコマンドを叩く必要もないところまで自動化できている。

課題

Dockerによるデプロイ体制は整ってきたが、気になっているのが修正の反映をするのにかかる時間だ。
ソースを修正して環境に反映するのには下記の手順が必要になる。

  1. ソースを修正する
  2. Dockerイメージをビルドする
  3. docker pushする
  4. docker pullする
  5. イメージを起動する
  6. リバースプロキシの向き先を変える

たった1行のコード修正であろうと 2~4 の手順にどうしても時間がかかってしまう。
git pullするだけで反映が終わるような仕組みも用意すべきか否か悩んでいる最中だ。



2015年4月21日火曜日

Materialize - マテリアルデザインのためのCSSフレームワーク


Materialize
http://materializecss.com/

Bootstrapに飽きてきたので別の何かを探していて行き着いたのがMaterializeだった。
マテリアルデザイン用のCSSフレームワークだとGoogleが作っているPolymerがあるけどシングルページアプリケーションが前提の設計になってて使いにくい。
さらにBootstrapみたいなグリッドシステムがないのでグリッドシステムが欲しい場合は別途導入する必要がある。
Materializeはシングルページではないウェブアプリケーションでも使えてグリッドシステムも備えている。
Material UIという競合フレームワークがあるけどReactベースなので単純に適用できない。

2015年4月7日火曜日

2015年2月28日土曜日

[CentOS7]Systemd環境でsshd設定(sshd_config)を反映するにはsystemctl reloadを使う

CentOS7環境でsshd_configを編集しsshdを再起動したが、sshd_configが反映されないくて困った。
どうもSystemd環境で systemctl restart sshd としても設定が反映されないようだ。
systemctl reload sshd とすることで設定が反映されたことを確認できた。

これ、多くの人がハマるだろうなぁ。。。

2015年2月27日金曜日

Sakura CloudのCentOS7.0におけるディスク拡張(parted/gdiskによるGPTディスク拡張)

CentOS7ではfdiskによるディスク拡張ができない

CentOS6.5のときは下記の記事通りにすればディスク拡張することができた。
http://knowledge.sakura.ad.jp/tech/925/

しかし、CentOS7.0でディスクを作成した場合、記事通りにfdiskを使ったディスクをすることができない。
ディスクパーティションがMBRからGPTという仕組みに変わっているためだ。

partedとgdiskを使う

GPTのディスクのパーティションを行うにはpartedとgdiskというツールが使えます。
さくらの記事のfdiskによる作業の変わりに以下の作業を行うことでディスク拡張ができました。

partedによる使用可能セクターの変更


                                                        
[root]#parted /dev/vdb
GNU Parted 3.1
Using /dev/vdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print                                                            
Error: The backup GPT table is not at the end of the disk, as it should be.  This might mean that another operating system believes the disk is smaller.  Fix, by moving the backup to the end (and
removing the old backup)?
Fix/Ignore/Cancel?                                                        
Fix/Ignore/Cancel? Fix                                                    
Warning: Not all of the space available to /dev/vdb appears to be used, you can fix the GPT to use all of the space (an extra 83886080 blocks) or continue with the current setting? 
Fix/Ignore? Fix                                                           
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 64.4GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: pmbr_boot

Number  Start   End     Size    File system     Name              Flags
 1      1049kB  2097kB  1049kB                  Linux filesystem  bios_grub
 2      2097kB  4301MB  4299MB  linux-swap(v1)  Linux swap
 3      4301MB  21.5GB  17.2GB  ext4            Linux filesystem

(parted) q                


gdiskによるパーティションの再作成



[root]#gdisk /dev/vdb                                                                                                                                                                      
GPT fdisk (gdisk) version 0.8.6

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): p
Disk /dev/vdb: 125829120 sectors, 60.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 30A18C9A-0775-4F3C-A870-92BF1D93F0C1
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 125829086
Partitions will be aligned on 2048-sector boundaries
Total free space is 83888094 sectors (40.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            4095   1024.0 KiB  EF02  Linux filesystem
   2            4096         8400895   4.0 GiB     8200  Linux swap
   3         8400896        41943006   16.0 GiB    8300  Linux filesystem

Command (? for help): d ^H
Partition number (1-3): 3

Command (? for help): n
Partition number (3-128, default 3): 
First sector (34-125829086, default = 8400896) or {+-}size{KMGTP}: 
Last sector (8400896-125829086, default = 125829086) or {+-}size{KMGTP}: 
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): p
Disk /dev/vdb: 125829120 sectors, 60.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 30A18C9A-0775-4F3C-A870-92BF1D93F0C1
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 125829086
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            4095   1024.0 KiB  EF02  Linux filesystem
   2            4096         8400895   4.0 GiB     8200  Linux swap
   3         8400896       125829086   56.0 GiB    8300  Linux filesystem

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/vdb.
The operation has completed successfully.


その他

e2fsckでブロックのカウントが違うと言われましたがFixにしたら問題なく動きました。
原因がよくわからないので怖いですが。


[root@]# e2fsck -f /dev/vdb3
e2fsck 1.42.9 (28-Dec-2013)
/dev/vdb3: recovering journal
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong (3587294, counted=3587642).
Fix? yes
Free inodes count wrong (996737, counted=996734).
Fix? yes

/dev/vdb3: ***** FILE SYSTEM WAS MODIFIED *****
/dev/vdb3: 51842/1048576 files (0.1% non-contiguous), 605121/4192763 blocks

2015年1月4日日曜日

AS3「サポートされていないサンプリングレート」のもう一つの原因

AS3でmp3を埋め込み(embded)で使用すると正しいサンプリングレートであるにも関わらずコンパイル時に「サポートされていないサンプリングレート 」と表示され、コンパイルが成功しないことがある。

「サポートされていないサンプリングレート (32000Hz)」

のように現在のサンプリングレートらしきものが表示される場合や、

「~をトランスコードできません。」

のように原因が表示されない場合もある。

単純にサポート外のフォーマットになっている場合がほとんどであろうが、正しいフォーマットであるにも関わらずこれらのメッセージが表示されることがある。
それは、MP3のメタ情報などに日本語などのマルチバイト文字を含む場合だ。(含んでいても問題無い場合もある)

信じられないことに、AS3のコンパイラはMP3のメタ情報にマルチバイト文字がある場合に正しく処理できないのである。

信じられないことに!