サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大谷翔平
garapon.hatenablog.com
mod_proxy_wstunnelでwebsoketをリバースプロキシしようとしてもどうしても400になるんですよ。 単体でやるとできたりするんだけど、nodejsと組み合わせるとことごとく動かない!!! 調べるといろいろがんばってうまくできたと言う事例もあるのですが、 2時間ぐらいがんばってみたのですがそれにあわせてやってもどうも出来ない。 というわけでnginxインストールしてみたらすげーさらっとできた。 $ sudo apt-get install -y nginxでインストールして、 以下のような設定ファイルを食わせるだけ。 server { listen 80; server_name localhost; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x
もう何度目なのかわかりませんがAPIブームが来ています。 APIを提供する側として考えたときにはずすことができないのがAPIマネジメント製品。 APIGatewayとかAPIManagementとか、いろんな呼び方で呼ばれますが、やりたいことはAPI の作成、配布、保守、監視、保護を簡単にというもの。 簡単に言うと ・既存サービスにRESTFulエンドポイントを簡単に作成もしくはプロトコル変換してくれて ・作成したAPIをカタログしてDeveloperに公開し ・そとからのアクセスについてはセキュリティをしっかり保護して ・アクセスログや課金情報とかも管理して ・アクセスが増えたらいい感じでスケールする というようなことをするツールが必要だということです。 主力商品を整理すると私が把握しているのは以下7つ。()は提供企業です。 apigee edge/Google edge(Google)
なんか色々バズワード化してますよね。 言葉が色々あって不明瞭なので少し整理してみましょう。 定義の狭さから掲題とは逆順で説明していきます。 REST API これは文字通り、RESTアーキテクチャに従って作られたAPIのことです。 RESTはアーキテクチャのため、RESTの考え方にしたがって作られているWebAPIを「RESTful API」と呼称します。 RESTが何かという話は garapon.hatenablog.com Web API HTTP通信などのWeb技術を用いて構築されたAPI(サービスインタフェース)が「WebAPI」と呼ばれます。 そのため、「RSETful API」もWebAPIの1つで「SOAP」やgoogle社の「gRPC」、facebook社の「graphAPI」などもWebAPIに含まれます。 オープンAPI 先にカタカタの「オープンAPI」を説明します。
ファイルが切り替わるタイプのログとかps -efの結果を定期的に関ししたい時とかwatchがすごく便利。 watch -d 'ps -ef | grep gara' とか書いとくだけで秒間隔でコマンドの実行結果を確認できる。 って言いたいんだけどお客さんの環境とか、なんやかんやによってはwatchがインストールされて無い事が有る。 そんな時は自分で似たようなものをつくればよい。ワンライナーで while true; do date; ps -ef |grep gara; sleep 1; clear; done; でいける。画面を消したくなければ while true; do date; ps -ef |grep gara; sleep 1; done; 出力はこんな感じ ubuntu /home/gara% while true; do date; ps -ef |grep gara;
かおかおかおーかおかおかーおーかおかおかおー by たくみ ということで顔検出してみる。 Opencvインストール http://opencv.org/downloads.html からDLした3.1を適当に解凍。以後の例では「C:\tool\opencv-3.1.0」に解凍したとしてすすめます。 3系と2系でAPIが結構変わっているので古いサンプルを動かしたい人は2系のほうがいいかもしれませんが、私は最新版で行きます。 Javaから使う準備 Javaから呼び出すには2つ作業が必要です 1、「C:\tool\opencv-3.1.0\build\java\opencv-310.jar」をクラスパスに通す 2、「C:\tool\opencv-3.1.0\build\java\x64\opencv_java310.dll」にパスを通す 2はめんどくさいので、手抜きするなら該当のDLLをプロジ
想定環境はこんな感じ Windows7 64bit Selenium 2.53.0 Proxy 127.0.0.1:28080 各Driverはpj/driver/以下に保存 FireFox FireFoxはDriverの個別DLは不要。 FirefoxProfile profile = new FirefoxProfile(); profile.setPreference("network.proxy.type", 1); profile.setPreference("network.proxy.http", "127.0.0.1"); profile.setPreference("network.proxy.http_port", 28080); WebDriver driver = new FirefoxDriver(profile); driver.get("http://loca
Push通知はスマホでは当たり前の機能になって来ましたね。 それにともなってスマホじゃないサービスでもPush通知したいんじゃ!みたいな相談を受けることも多くなりました。 そこでそれっぽく見せる代替技術とかについて整理してみます。 現在通知系の仕組みは大きく3つあります。 Web Notification 単一のブラウザ内で通知を行う Web Push 単一のブラウザに対しWebサーバからPush通知を行う ネイティブPush スマートホンに対しWebサーバからPush通知を行う それぞれ詳しく説明していきます。 Web Notification 単一のブラウザ内で通知を行う方式 W3Cのページ:https://www.w3.org/TR/notifications/ 2013年ぐらいからあり、Firefox 22、Chrome26 以後であれば動く。Safariも動くようだが試していない
PJが終わったらやることといえば「振り返り」ですね。 アジャイルレトロスペクティブズを参考にちょっと新しい要素を取り入れて振り返りをして見ました。 今回新しく取り入れたのは タイムライン カラードット あとはいつものKPTで振り返りました。 タイムライン 模造紙にラインを1本引いてそこのPJの開始から終了までの日付をざくっと書きます んで、あとはみんなで付箋にその時にあった出来事を書き出して貼り付けていきます。 仕事の内容からプライベート、身近であった出来事など思い出せることをなんでもいいから書いていきます。 んで、ある程度書き出されたらみんなで全体を眺めながらわいわいしゃべりましょう。 そしてここでカラードットの登場です。 カラードット 単なるシールです。出来れば2種類の色があるといいですが今回は1種類しか確保できませんでした。 これをタイムライン上の出来事の上に張っていきます。 1種類
マルチスレッドについていろいろ考えてる機会が多かったのでちょっとまとめてみた。 Singletonのdouble-checked lockingはアンチパターンだという話 double-checked lockingとSingletonパターン ネットでも各所に書かれているけれど、メジャーな書き方なのでみんないつの間にか使ってしまっていることが多い。*1被害に会う可能性が非常に低いので対策はほぼ必要ないけど知っておいて損はない。 double-checked lockingとはどんなソースかというと public static Singleton getInstance(){ if (instance == null){ synchronized(Singleton.class) { //1 if (instance == null) //2 instance = new Singleto
前回Bitcoinのインストールまで終わったので起動させていきましょう。 bitcoinには2つのテストモードがあるらしい。 Testnet テストようの仮想ネット。価値がないのでいろいろ失敗したりしても大丈夫。 バーチャルFXみたいなものか Regtest Mode 自分しか参加できない仮想ネットワークを作ってその中でテストします。 仕組みを学ぶなためにRegtest Modeから始めることにします。 以下のチュートリアルに従いながらやっていきます。 Developer Examples - Bitcoin RegTestModeの起動と初期採掘 まずRegTestModeでデーモンを起動します $ /usr/local/bin/bitcoind -regtest -daemon Bitcoin server startingそうしたら最初の101個のBlockを作ります。 bitcoi
「who am i」と「whoami」の違いが良くわかっていなかった。 「who am i」 現在ログインしているユーザーの情報を表示する。 つまり、suしても変わらない。 「whoami」 シェルを実行しているユーザーのidに対応するユーザー名を表示。 つまり、suしたりすると変わる。 ubuntu /home/gara% who am i gara pts/0 2008-06-20 11:36 (192.168.0.1) ubuntu /home/gara% whoami gara ubuntu /home/gara% su - Password: root@ubuntu:~# who am i gara pts/0 Jun 20 11:36 (192.168.0.1) root@ubuntu:~# whoami root root@ubuntu:~# なるほど
findで/から検索するとPermission deniedが沢山でてうざい。 今までじゃまだな〜と思っていたんだけどふとエラー出力消せばいいだけじゃんって気づ いた。 気づかないことっておおいな、 ちなみにこんな感じ find / -name garapon 2>/dev/nullcshならこんなかんじか (find / -name garapon -print >/dev/tty ) >& /dev/null
ふとした制約に対応する為、テーブルにカラムを沢山作るという逃げ手を検討した際に カラムって何個までもてるんだっけ?という疑問が生まれたので調べてみた。 MYSQL(InnoDB 形式) http://dev.mysql.com/doc/refman/4.1/ja/innodb-restrictions.html 1 つのテーブルに作成できるカラムは 1,000個 までである。 DB2 http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0000927.htm 4K ページ・サイズの場合、最大 500 列。列のバイト・カウントは 4 005 を超えてはなりません。 8K ページ・サイズの場合、最大 1 012 列。列のバイト・カウントは 8 101 を超え
synchronizedブロックに使用されている変数が書き換わる場合それはスレッドセーフではありません。(まあ当然です) 例えばこれはNG class TargetDate { private static String staticCal = "書き換えられるかな?"; public void set(String s){ staticCal = s; } public void echo(){ synchronized (staticCal) { for (int i = 1; i <= 100; i++) { System.out.println(i + "回目 [" + staticCal + "]"); } } } } setメソッド内でstaticCalの値を変更しているときにシンクロしていないのでEchoの呼び出し側スレッドが影響を受けてしまいます。 Echoメソッドとしては
tail -f した結果をsed,awkしてるとバッファリングされてしまい、ぬるぬる感がなくなっていやですよね。 これは各プロセスがバッファするためなので、バッファしないように指定してあげましょう。 各コマンドのノーバッファの設定は以下の通り。 awk {fflush()} grep --line-buffered sed --unbuffered なのでこんなかんじで快適。 tail -f app.log | grep --line-buffered Grapon | sed --unbuffered -e "s/hoge/hage/" | awk -f '{print $2}{fflush()}'
GNU Tailって複数ファイル指定できるんだね。。知りませんでした。 でもここに書いてあったこのやり方の方が便利だ! % tail -f file1.log | sed 's/^/file1.log:/' & tail -f file2.log | sed 's/^/file2.log:/' file1.log: ...(file1.log の追加行)... file2.log: ...(file2.log の追加行)... file1.log: ...(file1.log の追加行)... UNIXの部屋 コマンド検索:tail (*BSD/Linux) 今度からこれ使おう
データメンテ等でそのキーに紐づくデータがあるか無いか確認したいことがあります。こんな時にどんなSQLで確認したらいいかについて考えてみました。 検証環境 OS WINXP CPU PEN4 MEM 2G DB Oracle10g (10.2.0.1) 検証用TBL STR1 CHAR(8) *ユニークインデックス有り STR2 VARCAHR(120) データ件数 120件 ?全テーブルのCOUNT(*)をチェックする SELECT 'データは存在しません' FROM(SELECT COUNT(*) AS CNT FROM TEST WHERE STR1 = 'GARA' ) V1, (SELECT COUNT(*) AS CNT FROM TEST WHERE STR1 = 'GARA' ) V2 WHERE V1.CNT = 0 AND V2.CNT = 0 ?COUNT(*)の結果を
仕事でScheduleBoardを使っているのだがこれが社内からしか見れず不便。 手帳で管理していると「スケジュールボードに予定いれてくださいよ〜」と言われるしかといってScheduleBoardに入れると家から見れず 休みたい時に「もしかしたら明日大事な会議があったような・・」と気になっていたのもこれで解決! 予定が確認できれば気軽に休めるのでプライベートが満喫できます。 これで僕もリア充の仲間入り♪ やっていることはスケジュールボードからデータをCSV形式で抜き出して、 以前作ったGoogleCalenderUtilを使って更新する。 未来データの削除 一旦未来データを削除する。 期間を指定しなければならないので現在時刻から2099年までを指定して取得。 スケジュールボードからのデータの抜き出し こんなコマンドを打ってあげると月単位でデータをCSVに出力してくれる。 なのでこれをJav
自働化を検討していると手順の途中でExcelMacroを起動したくなることがあります。 そんなときはこんな感じでVBScriptからComオブジェクト経由で呼び出してあげる ExcelMacroKicker.vbs Set objArgs = Wscript.Arguments runXLmacro objArgs(0), objArgs(1) Function runXLmacro(BookName, MacroName) Dim XL Set XL = CreateObject("Excel.Application") XL.Visible = False XL.Workbooks.Open BookName XL.Run MacroName XL.ActiveWorkbook.Close False XL.Quit Set XL = Nothing End Function
ちょいとわかりずらいエラーメッセージで困惑したのでメモ。 OpenHelperの中にCreate文を書いていると思うですが、このCreate文がSQL的に不正だっ た場合は以下の様なエラーになる。 ファイルがリードオンリーになっているのかとおもって色々調べちゃったよ、、、 Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-onlydatabase from version 0 to 1:/data/data/jp.co.gara.android.iaccount/databases/I_ACCOUNT at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:170) at jp.co.
Finalなフィールドはリフレクションを使っても書き換えられませんよね。 強引に書き換えようとしてもIllegalAccessExceptionなりになってしまい書き換えられません。 基本となるフィールドが final の場合、メソッドは IllegalAccessException をスローします。 http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/reflect/Field.html#set%28java.lang.Object,%20java.lang.Object%29 でもなぜかシリアライズしてデシリアライズすると書き換えられる。 これはなんでじゃ?ってことでjava.io.ObjectInputStream調べてみるとsun.misc.Unsafeを使用しているのがわかる。 このクラスを眺めていると
秀丸の時に使えた右クリックしてGrepをサクラエディタでもやりたいな〜と考えていたらやりかた見つけた。 単にレジストリいじっちゃうだけなんだけど。 1. HKEY_CLASSES_ROOT\Folder\shell 以下に新規のキーを作成する。 2. 新規に作成したキーの値に「コンテキストメニューに表示したい文字列」を設定する。 3. 新規に作成したキー以下に command というキーを作成する。 4. 作成した command の値にエディタに応じて以下を設定する。 秀丸エディタの場合 "C:\Program Files\Hidemaru\Hidemaru.exe" /d"%1" /g サクラエディタの場合 "C:\Program Files\sakura\sakura.exe" -GREPMODE -GREPDLG -GFOLDER="%1" -GOPT="S" フォルダを右クリック
「C:\Program Files」とか「C:\Documents and Settings」とか空白が有るとなにかと不便。そこで回避策を2つほど 「"」で囲む cd "c:\Program Files\test" MS-DOS8.3形式で短縮する cd c:\PROGRA~1\test 一般的に「"」で囲むのが一般的ですがこれだとたまに使えないことがあります。それはstartコマンド等が「"」で囲ってあるとパスではなく文字列として認識してしまうためです。 例:以下のスタート処理は動きません。「"c:\Program Files\test\test.exe"」という名前のコマンドスクリプトが起動してしまいます。 start "c:\Program Files\test\test.exe"そんな時はMS-DOS短縮を使いましょう。短縮後の名前は「dir /x」コマンドで確認で
LANG=ja_JP.UTF-8を設定にしているのにこんなエラーが出ることがあります。 svn: Can't convert string from 'UTF-8' to native encoding: それはLC_ALL=が設定されていない為。 % locale locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_MESSAGES to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory LANG=ja_JP.UTF-8 LC_CTYPE="ja_JP.UTF-8" LC_NUM
先日の「略語重要 - 自分の仕事を憎むには人生は余りにも短い」のエントリにuid:rin51からNetBSDだと違うよっていう指摘をもらったので自分の持ってるマシンとかオンラインマニュアルで詳しく調べてみた。 アドレスが書いてあるのはオンラインマニュアル。書いてないのは実機のmanコマンドの結果です。 HPUX11(http://docs.hp.com/ja/B2355-90851/ps.1.html) 0 存在しない S 休眠状態 W 待ち状態 R 動作中 I 途中 Z 終了 T 停止 X 成長 AIX O Nonexistent R Running S Sleeping W Swapped Z Canceled T Stopped Solaris10(http://docs.sun.com/app/docs/doc/819-1210/6n3j74jru?l=ja&a=view) O プ
t_wadaさんがつぶやいていたEclEmmaが結構便利。 レガシーコード改善のデモで使ったテストカバレッジプラグインはこれです URL #tddbc 2010-07-11 12:52:44 via web いいところ Junitを実行するのと全く同じ設定で実行できる(Non-invasive) 軽く軽快に実施できる(Fast develop/test cycle) Junit実行後すぐにEclipse上にハイライトしてくれる。(Rich coverage analysis) 赤と緑でハイライトしてくれるので視覚的にとても分かりやすい パッケージ/クラス/メソッド単位でカバレッジを出してくれる * Fast develop/test cycle: Launches from within the workbench like JUnit test runs can directly be
正規表現便利ですよね。 検索などでは正規表現拡張をしているものが多くありますがファンクションで使えるものが無かったので作ってみた。 使い方は簡単でファンクションを読み込ませたBookで セルに「=matchRegExp(A3,"^a+b.do")」みたいに書くだけ こんな感じにセルから正規表現でデータを抽出出来る。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー これでかゆいところに手が届く。 '------------------------------------------------ '正規表現抽出 'IN: cell: 検査対象セル(範囲を指定した場合#VALUE!を返却) 'IN: strPattern: 正規表現パターン 'IN: ignoreCase: 大文字小文字指定(省略化。デフォルトFALSE) 'OUT: マッチした文字列(マッチしない場合#VALUE
「%~dp0」ってどうしてカレントディレクトリとれるんだろって思っていたらこんなのみつけた。 実行ファイルと同一のホルダに設定ファイルなどを置くことって多いですよね。作業ホルダにしたいこともあります。そうすると、起動したバッチファイルが置かれているホルダが取得したい訳ですよね。 %0 には、起動されたバッチファイルのフルパスが格納されていますから、これのドライブ名と、ファイル名を除くパスの部分を取り出せばいいですよね。 ズバリ、このように展開するように指定しているのです。~ (チルダ) を付けて ~d でドライブ名に展開せよっていうこと。~p でファイル名を除くパスの部分に展開せよっていうこと。合わせて ~dp でドライブ名とファイル名を除くパスの部分に展開せよってことなんだ。0 の意味は解かるよね。 簡単に取り出せる記述だから、%~dp0 はよく使うし、ひょっとしたら細かい説明をしている
結構使っている割にFHS(Filesystem Hierarchy Standard)について良く知らなかったので調べていたらエンタープライズ: - 第14回:FHSによるディレクトリの規格化がとても分かりやすくて感動した。 自分なりにまとめ。 起動時に必須のディレクトリ /bin (コマンド群) /boot (起動時に必要となるファイル群) /dev (デバイスファイル) /etc (システム環境設定ファイル群) /lib (共有ライブラリ群) /mnt (マウント先) /opt (ソフトウエアパッケージ群) /root (RootユーザーのHome) /sbin (システム管理者が利用するコマンド群) /tmp (一時領域) /usrが必須でないのが意外だった。 起動時に無くて良いディレクトリ /home (ユーザーのHome) /usr (さまざまなファイルを格納するところ) だから
次のページ
このページを最初にブックマークしてみませんか?
『自分の仕事を憎むには人生は余りにも短い』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く