xcodeproj を CONFLICT しづらくする mergepbx

Xcode を使って開発していると、.xcodeproj が、論理的には CONFLICT していないのに Xcodeのバージョンアップ等で激しく CONFLICT することがある。 mergepbx を使うと、理不尽に CONFLICT されるケースをある程度解消してくれる。複数人で開発している時は入れておいて助かることが多い。

1年くらい使ってるけど、特に問題が起きたことはないです :-)

Read More

WKWebViewでnetworkActivityIndicatorVisibleを表示

(追記) iOS10 になって色々変わっていたので、書き直した。

networkActivityIndicatorVisible (iPhoneの上部のステータスバーで読込中にぐるぐるさせるやつ) を表示する方法。UIWebView は、html,js,css,画像などの区別がつかなくて結構たいへんだったけど、そういうの気にせずだいぶ楽に実装できる。

Read More

MacでIEの確認をリモートで行う

IEの確認で、Azure の RemoteIE というのが知らないうちに出てた。これだと、手元に virtual machines のイメージを置いておかなくて良いので、ディスク容量の節約になる。 登録すれば無料で使えるようだが、inactive な時間が10分続くか、 active な状態でも60分経過すると切断される制限がある。短時間の確認なら問題無さそうだが、長時間の確認は繋ぎ直す必要がありそう。 まずは、RemoteIE で Register for access して、自分の Region を選ぶ。日本なら East Asia が良い。 Mac で使う場合は、Microsoft Remote Desktop アプリを App Store からダウンロードして、Azure RemoteApp というところをクリックすると、ログイン画面になるので、ログインする。 すると、InternetExplorer(email: iewebeco@microsoft.com) という Invitations があるので、チェックを入れると自動的に起動する。いきなり IE の画面が開いているので検証できる。

Read More

kswapd0 プロセスが CPU を食ってた

Load average が高いので、top でプロセスを見たら kswapd0 というプロセスが CPU を使いまくってた。 メモリがスワップアウトしたときに、ディスクに書き込んだりするプロセスらしいけれど、貧弱なサーバだとその処理が重くて Load average が上がってサーバが遅くなって…のループでつらそうだった。 vm.drop_caches の値を変えることで、メモリ内にあるキャッシュを削除して、このプロセスがやるべきことをなくしてあげれば CPU は解放されるようだ。 例えば、ページキャッシュだけ解放するときは、下記のようにする。sync をして、強制的にキャッシュの内容をディスクに書き込んだ後に実行します。 sudo sync sudo /sbin/sysctl -w vm.drop_caches=1 数字は、下記の中から適切なものを選ぶ必要がある。 [0] 初期値 [1] ページキャッシュ解放 [2] dentry、inode 解放 [3] ページキャッシュ、dentry、inode 解放 — Linux におけるメモリの解放 なお、0 を指定するとエラーになって設定が出来ないのだが、よく分かっていない。 $ sudo /sbin/sysctl -w vm.drop_caches=0 sysctl: setting key "vm.drop_caches": Invalid argument vm.drop_caches = 0

Read More

Ubuntuを14.10->15.10へアップデート

Ubuntuを14.10->15.10へアップデートした。 sudo vi /etc/update-manager/release-upgrades として、Prompt=ltsとなっているところを、Prompt=normalに変更する。 [DEFAULT] Prompt=normal その後、下記コマンドを実行すればアップグレードが対話形式で始まるので、表示されるメッセージを見ながら進めればよい。 sudo do-release-upgrade

Read More

AWS API Gateway で ifconfig API を作ってみる

サーバが自分自身のグローバルIPアドレスを調べるとき面倒なことがよくあるので、API Gateway を使って ifconfig のようなことをする。単純に、リクエストしてきたIPアドレスを返すだけ。(こういうサービスは他にもあるけど、レスポンスが遅めだったり、信用できるか分からなかったりするので、自分で作るのが安全そう) curl https://ip.ecp.plus としたら自分のIPアドレスが返るというのがゴール。ブラウザで見ても同じ。ちなみに↑はもう動いているのでご自由にお使いください。 最初、API Gateway -> Lambda として、Lambda に IPアドレスを渡して、Lambda はそれを返して、API Gateway はレスポンスをそのままスルーする。というのをやったが、実は Lambda なしで出来たようだ。 はじめ Lambda を使ったバージョンをやったので、両方書く。 API Gateway の設定 Create Method URLは短くしたいので、ドメイン直下をGETしたときに返したい。 / に対して Create Method で GET を指定する。 Method Request は認証などしないのでそのまま。 / - GET - Method Execution API Gateway にアクセスしてきた IP アドレスは、下記のようにして取れる。 { "ipaddress" : "$context.identity.sourceIp" } のだが、API Gateway のデフォルトで割り振られる URL は非常に長く、自分のドメインで使いたい。Custom Domain Names を使うためには、TLS の証明書が必要なのだが、お手軽さが無いのでやめた。既に動いている Caddy でリクエストを転送することにした。 ただ、そうするとリクエスト元のIPアドレスが Caddy が動いているサーバの IPアドレスになってしまうため、ヘッダーの X-Forwarded-For を見ることにする。ここの先頭に、オリジナルのIPアドレスが入ってる。

Read More

Let's Encrypt を Caddy で簡単に使う

Caddy という web server がデフォルトTLSというポリシーで、Let’s Encrypt を簡単に設定出来て、証明書の自動更新をしてくれるようだったので使ってみた。Let’s Encrypt は無料でTLS証明書使えるサービスです。 VultrのVPSを使ってみたら、DocumentsにCaddyのインストールについて載ってたので知りました。Vultr の Tokyo リージョン良さそうですね。 Caddy のインストール https://caddyserver.com/download から、ダウンロードするとバイナリが落ちてくるので、それを実行するだけです。バイナリ生成時に、Select Features として、追加機能を入れる事ができます。 Caddy の設定 /path/to/caddy.conf hoge.example.com { tls hoge@example.com } 最小構成だと、ドメインに対して自分のメールアドレスを設定したら動くみたいです。ecpplus.net のドメインだと動いたけれど、 ecp.plus のドメインだと動かなかった。あまり調べていないけれど、Let’s Encrypt 側で何かやる必要がありそう。 Caddy の起動 80, 443 ポートをListenするので、setcap しておくか、sudo での実行が必要です。 sudo setcap cap_net_bind_service=+ep /path/to/caddy /path/to/caddy --conf /path/to/caddy.conf -agree=true -agree は、Agree to Let’s Encrypt Subscriber Agreement で、-emailは Default Let’s Encrypt account email address とのことです。 これで、 https://hoge.example.com としてサーバが立ち上がります。http でアクセスしても自動的に https に遷移します。

Read More

Heroku で exiftool を使う

Railsが動いているサーバで exiftool を使った時のメモ。buildpacks を使う。 erhhung/heroku-buildpack-exiftool を使った。 heroku buildpacks:add heroku/ruby heroku buildpacks:add https://github.com/erhhung/heroku-buildpack-exiftool.git このあと git push heroku master 等でデプロイすると、exiftool がインストールされて PATH が設定され、exiftool とすれば使えるようになる。 buildpacks を設定しないと、デフォルトで ruby などの buildpacks が裏で使われているようで、追加する分だけ指定してしまうと、元々動いていた ruby 等が動かなくなってしまうので注意が必要だった。

Read More

Load Average をワンライナーで取るコマンド

uptime コマンドから、load averages の直近1分の値をワンライナーで取る。uptime コマンド(CentOS7で実行)は、load average: の後に過去1分間、5分間、15分間のロードアベレージが出る。 Linux の出力例 $ uptime 12:53:16 up 3:26, 1 user, load average: 0.00, 0.03, 0.61 OSX の出力例 $ uptime 23:11 up 11:10, 1 users, load averages: 1.85 1.70 2.15 awk の $1 を、$2,$3とすると過去5分、15分の値になる。OSXでuptimeすると、load average: (最後のsがない) のと、数字がLinuxはカンマ付きでOSXはカンマなしなので、下記のような正規表現で差異を吸収する。 uptime | sed -E 's/.*load averages?:(.*)/\1/' | awk '{print $1}' | sed -e 's/,//'

Read More

AWSCognitoで認証情報の自動取得が動くようになってた

今まで iOS版の Cognito 使ってたのだが、60分経ったら credential が無効になって認証エラーになってしまうという問題があった。開発者は何もしなくても裏で勝手に refresh される、と書いてあったけど実際はされていなかったように見えたが(そういう報告をフォーラムに上げてる人も何人かいた)、直ってようやく気軽に使えそうな感じがする。 AWS Cognito の iOS SDK が 2.3.5 になって、修正された模様。 iOS版は、AWS MobileHub でテンプレートを作って試してみるのが手っ取り早かった。一番良いと思うのが、Cognito で認証してるときのid的なものをIAM側で変数として埋め込めるので、それと AWS APIGateway の URL をマッピングさせると、REST API と相性が良すぎる。 APIGateway は、Swagger で書いてインポートすると良い感じだが、完全に Swagger のフォーマットだけで出来るのかはよくわからない。APIGateway 側からエクスポートするとき、APIGateway 用の拡張情報込みのエクスポートというのが出来るので、それを使えば良いのかもしれない。 APIGateway のバックエンドに S3, DynamoDB, Lambda を使ってみたところ、ec2 (Rails)でやってた処理を大部分移すことが出来た。APIGateway を挟んでおけば、複雑なことをやりたくなったら、URL単位で処理を Rails に持ってくればよいのだが、Rails外にある様々な処理についてのテストをどのように書くかというのが悩みである。

Read More