まゆこのましんラーニング♡#02
こんにちは!ITソリューション事業部のまゆこです。 早くも二回目です。 そもそもマシンラーニングって何でしょう? ググってみましたが、うーん、イマイチ分かんないです>< まゆこ「GO☆さん教えて下さーい( ;∀;)」 GO☆「む〜ん、つまり我々が無意識に行っているパターン認識をだねぇ〜・・・」 まゆこ「はい?分かんないので、自分で調べます( ;∀;)」 ふむふむ、私が参考にするサイトを見ると・・・ http://www.apps-gcp.com/predictionapi-introduction-1/ このサイトでは、3カ国で書かれた文章を分析させて、コンピューターに言語当てをさせる実験をしています。 スゴイ!なんか未来を予想する、夢のようなツールなんですね!とにかく実践してみましょう。 1.まず、解析させるデータを用意します。 情報はできるだけ多い方がいいみたいなんですが、今回のサンプルデータは400件程度です。 ↓サンプルデータです。 https://cloud.google.com/prediction/docs/language_id.txt これは英語、フランス語、スペイン語が書かれた文章データで、 [言語名],[各言語で書かれた文章] といったレイアウトでできています。 ファイル作成で気をつけることをまとめると・・・ ・最初の列には”答え”を書く。サンプルでいうと、”英語”とか”フランス語”とか”スペイン語”です。 ・次の列からは”答え”を導くための情報を書く。複数列あってもいいみたいです。 ・列はカンマで区切る。 ・ヘッダは不要。 以上です。 2.次に、ファイルをGoogleストレージにアップします。 ここからGoogle Developers Consoleというサイトで作業をします。 https://console.developers.google.com/ まゆこ「なんですかこれ?」 GO☆「Google環境で開発する際に使う開発者向けのツールだよ。まぁ使ってみないとわかんないと思うよ!」 会社用のアカウントでログインし、プロジェクトを作成して、「Prediction API」と「Google Cloud Storage」をオンにしました。 そしてバケットを作成してアップロードします。 何をしているかよく分からないまま進んでいますが・・・ 無事アップロードできました。アップロードはあっという間でした。 3.そして、解析開始です。 ここから「Prediction API」を使用します。 「Prediction API」がブラウザから使えるサイトに行きます。 https://developers.google.com/apis-explorer/?&_ga=1.100999174.668741449.1412325898#p/prediction/v1.6/ これは「APIs Explorer」と言って、ブラウザ上でGoogleの各種APIを簡単に試すことができます。 GO☆「ここに並んでいるのがPrediction APIで、これを使って解析するんだよ。とにかく使ってみよう!」...まゆこのましんラーニング♡#01
株式会社ISAO入社1年目のまゆこです。 ITソリューション事業部(通称ISD)という部署で事務の仕事をしております。 最近やっとデスクワークに慣れてきました(^^)/ ISDってどんな仕事をしているかというと、アプリやらインフラやらを開発していて・・・ 正直よくわかりません(/_;)頭から煙が出そうです。 そんな私に最近上司が 「おい!まゆこ、お前マシンラーニングやれよ!」と言ってきました。 まゆこ「マシンラーニングって何ですか?」 上司「よくしらねーけど、最近流行ってるらしーから、誰かやっとかねーとダメっしょw」 まゆこ「・・・」(そんなこと言われましても(‘o’)) そこで、同じ部署のGO☆さんに協力をお願いしました。 まゆこ「GO☆さーん!!( ;∀;)」 ☆★↑↑GO☆さんのYoutube公開中!☆★ GO☆さんはうちのエンジニアで、きっとなんでも知っているはずです。 GO☆さん「まゆちゃん、このサイトを参考にするといいよ」 http://www.apps-gcp.com/predictionapi-introduction-1/ まゆこ「へ~、意外とカンタンなんですね!これなら私にもできるかも!!!」 とゆうわけで、まゆこはマシンラーニングに挑戦しまーす♡ ※本記事は、『株式会社ISAO ITソリューション事業部』監修のもとに製作しております。...スマートウォッチとMBassを連携したアプリの未来は明るい
スマートウォッチアプリについて スマートフォンほどではないですが、世界的にスマートウォッチの普及率は急激に上がりつつあります。Apple Watchを例にすると1年間、3,600万台が売れたそうです。 http://japan.cnet.com/news/business/35064877/ また、AppleとGoogleの中心としてスマートウォッチアプリ開発のプラットフォームが用意されていますのでアプリも簡単に作れます。わざわざスマートフォンをポケットから出さなくてもスマートウォッチでユーザーの要求を満たす時代はすぐ近くまで来ています。 ということでスマートウォッチ(Apple Watch)とMBass(Parse)連携したアプリを作ってみることにしました。 Parseについてはこちら アプリを作ってみよう スマートウォッチから打刻をするアプリをいかに簡単につくれるのか紹介したいと思います。IOS開発経験者を対象に説明しますが、初心者でもすぐ理解できるレベルですのでぜひ最後までよんでみてください。 開発環境 Xcode 6.4 IOS 8.4 Swift プロジェクト作成 IOS用の新しいプロジェクト(Single View Application)を作成する。 Xcode > File > New > Targetを選択 WatchKit App を追加 画面仕様 Check Inボタンをクリックした時に画面1のインタフェースが呼ばれるようになっています。WatchKit Extentionフォルダ配下にCheckInControllerファイルを作成し、画面1に紐付けます。 ※Check Outも同様 CheckInControllerを実装 WatchKitフレームワークをインポート。 WKInterfaceControllerクラスを継承します。 CheckInControllerが呼ばれた時に最初に実行されるwillActivateメソッドを実装します。 現在の時刻を取得。 ここがポイント! 処理内容を親アプリ(IPhone)に伝えます。 import WatchKit // <1> import Foundation class CheckInController: WKInterfaceController { // <2> @IBOutlet weak var message: WKInterfaceLabel!...Apple Watchの使用感レビュー
Apple Watchを約1ヶ月間使ってみました。 これまでのウェアラブルデバイス使用歴はライフログ系 (UP by Jawbone) なので、 全く違ったデバイスという印象で触れることになりました。 (UP by Jawboneは充電時以外、常時身に付けていたせいか、故障してしまいました…) 既に色々情報が出回っていますが、あえて書きます! デバイス概要 小さい割に多機能です。(その分、バッテリーとトレードオフになりますよね…) Apple Watchには以下の機能が搭載されています。 タッチディスプレイ スワイプ ドラッグ タップ 強めにタップ 感圧タッチ(Force touch)による操作はどうにも慣れませんでした。 デジタルクラウン/ホームボタン 回すとスクロール/押すと選択。デジタルクラウン(時計でいうところの竜頭)という古いようで新しいインターフェースで、ユーザに新たな体験を与えるあたりはAppleらしさでしょうか。 サイドボタン 友達の表示/非表示 スピーカー マイク 心拍計センサー あまり期待していませんでしたが、自身の血圧範囲内の値が計測されいました。 加速度センサー 活動量の計測など。時計を見るときの腕をひねる動作でディスプレイが点灯する仕様に感動しました。 画面構成 基本的な画面構成は主に4種類 (+各アプリ画面) ↓ざっくりな構成 [2] ↕ [1]↔[3] ↕ [4] [1] 文字盤 基本的には腕時計なので。 文字盤はプリインストールのものからしか選択できません。文字盤表示時に"強めにタップ"すると変更できます。 (最初、気付かなくてアタフタしました。) 文字盤の種類によっては天気やタイマーを追加表示できます。 [2] ホーム画面 iPhoneアプリの内、Apple Watch対応のアプリがインストールされます。 iPhoneアプリ (iOS8以上) にプリインストールされている「Apple Watch」アプリから設定変更可能です。 [3] 友達の表示 最大12人まで登録できる(らしいです)。iOS8から利用できる「Appスイッチャーに連絡先を表示」機能を利用している方には便利かもしれません。 (利用していないので、推測です…) [4] グランス (Gance) ウィジェット(OS X で言うところのダッシュボード)のような感じで、アプリを起動しなくても情報が見れます。 標準機能とプリインストールアプリ 電話 iPhoneへの着信をApple Watchで通話可能だが、Apple Watch内蔵スピーカーで相手の声が聞こえて焦りました。 欧米スタイルである「Bluetoothヘッドセットでの通話」に抵抗がなければ、便利に使えそうです。 アクティビティ 円を使ったグラフィカルな見せ方が特徴的です。 1時間、座りっぱなしなど動きが少ないと、毎時50分頃に、立って運動することを促してくれます。 基本、座って仕事をする場合、いい気分転換の目安になります。 ミュージック ずばりリモコンアプリです。 再生・停止・曲送り・音量の調整はイヤホン付属のリモコンのほうが直接的で使いやすいです。 楽曲変更もできるのですが、曲数が多いと小さい画面で探すのも大変で…結局iPhone使ってました。 カメラ iPhoneカメラのサブディスプレイ&シャッター。 片手にiPhone、もう片手にApple Watchでプレビュー確認するなら需要ありそうです。 スクリーンキャプチャ ホームボタンとサイドボタンの同時押しで撮れます。 タイマー ポモロードタイマーとしての使えば捗ります。 サードパーティ製アプリ サードパーティ製のアプリはApple Watch対応のiPhoneアプリをiPhone側にインストールすることで使用できます。 いろいろ使ってみたが、まだまだ荒削り感じです。一部抜粋してご紹介します。...AngularUI Calendar (FullCalendar) dayClick not work expectedly on iOS
bowerで入れた angularUI Calendar 1.0.0, FullCalendar 2.1.1での話です。 Angular WEBアプリでカレンダーを使いたいというニーズを完璧なまでに満たす AngularUI Calendar http://angular-ui.github.io/ui-calendar/ ですが、月(month)表示から日セルクリックで日(agendaDay)表示に切り替えようとしてdayClickを使用した場合、なぜかiPhoneではうまく動作しません。 正確にいえば、タップではなく一秒ほど長押しするか、軽く日セルをドラッグしようとするとdayClickが呼ばれます。 なんでどぅあぁぁぁーーーー! と3日ほど頭を悩ませた結果、なんとか対処できたのでおすそ分けします。 ちなみにAngularUI CalendarはFullCalendarのラッパーなので、FullCalendarで同じような問題に悩んでいる方にも効くはず….です。 原因 dragイベントの扱いの違いに起因しています。 dayClickはclickイベントで呼ばれていません。dragの終了を検知して呼ばれています。 iOS上のSafari(というかwebkit?)以外では、タップして指を離した瞬間に drag開始、drag終了のイベントが発生するのですが、iOSではdragするか、しばしタップし続けないとdrag終了イベントが発生しないためのようです。 どうにもならんのでタップイベントでdayClickを呼ぶようFullCalendar.jsを修正しました。 4038行目付近 coordMap: null, // a GridCoordMap that converts pixel values to datetimes cellDuration: null, // a cell's duration. subclasses must assign this ASAP isTouch : false, // separate touch and scroll....mysql5.6レプリケーションでold_passwordが拒否される
こんにちは。小宮です。 同僚の湯尾さんから教えてもらった情報を貼っておきます。 【mysql5.6レプリケーション仕様が変わった話】 某環境で mysql5.5でフルdumpしたSQLを5.6に流し込む作業を行い、その後差分データを5.5→5.6にレプリケーションしようとしたところ レプリケーションが出来なかったという症状がありました。 その後、mysql5.6の設定見直しのためstop slaveしてmysqlをrestartしレプリケーション貼り直しと試みましたが 今度は5.6環境同士でもレプリケーションが貼れなくなりました。 原因はmysql5.6からsecure_authの仕様が変更されたためクライアント([mysql]以下の記述)設定で skip-secure-auth が設定されていても レプリケーションIOの時点でold_password(16桁パスワード)が拒否されるためレプリケーション自体開始できないとのことです。 ステータス(show slave status\G)では下記の様になります。 ------------------------------- ・・・ Slave_IO_Running: Connecting Slave_SQL_Running: Yes ・・・ Last_IO_Errno: 2049 Last_IO_Error: error connecting to master 'repl@172.17.xx.xx:3306' - retry-time: 60 retries: 1 Last_SQL_Errno: 0 Last_SQL_Error: ・・・ ------------------------------- 解決策として、お客様の許可を得て、mysql5.5、5.6環境の両方に新たにセキュアなレプリケーション用アカウントを作成して、それでレプリケーション貼りました。 セキュア(old_passwordではない)なパスの作り方は下記の通り。 ------------------------------- set session old_passwords = 0; GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *....zabbixのグラフで日本語が文字化けを直す
おはようございます。インフラ宮下です。 zabbixのグラフ設定は標準では日本語が表示されません。 ※アイテム名に日本語を使っている場合です。 動作環境はこんな感じです。 OS:CentOS release 6.5 (Final) バージョン:zabbix-server-2.2.3 「監視データ」→「グラフ」で作成したグラフを見てみると下記のように日本語の部分が□になってしまいます。 これはアイテムに日本語を使っていて画像変換時にフォントがないのが原因です。 まずはフォントがおかれている場所を確認します。 # ls /usr/share/zabbix/fonts/ graphfont.ttf 次にOSに搭載されているフォントを確認します。 $ ls /usr/share/fonts/ dejavu ipa-gothic ipa-mincho ipa-pgothic ipa-pmincho vlgothic IPAを使います。ただシンボリックリンクを張るだけでOKです。 特にzabbix-serverの再起動も必要ないです。 # ln -s /usr/share/fonts/ipa-pgothic/ipagp.ttf /usr/share/zabbix/fonts/ipagp.ttf # vi /usr/share/zabbix/include/defines.inc.php (変更箇所) 7 39c39 < define('ZBX_GRAPH_FONT_NAME', 'ipagp'); // font file name --- > define('ZBX_GRAPH_FONT_NAME', 'graphfont'); // font file name 86c86 < define('ZBX_FONT_NAME', 'ipagp'); --- > define('ZBX_FONT_NAME', 'graphfont'); このようにグラフもきちんと日本語表示されました。...Chef-Soloから卒業、chefのlocalmodeをつかってみた
こんにちは。小宮です。 事の経緯 お急ぎの場合は飛ばして大丈夫です。 Chef-Soloがdeprecated(非推奨)とかで開発元からchef-zero(localmode)をつかうよう周知されたのが半年くらい前でしょうか。 当時はどうしたらええんやと色々比較してみたりしたあげく時が経ってとうとう検証することに。 数年で入れ替わるのではなく長く続くことが前提だとコストをかけても技術的負債を残したくない事情があるケースもあるようで。 個人的には正直コストをかけて移行するかどうかは微妙なところで、soloがすぐ無くなるみたいな話ではない気がしてます。 世の中的にはcookpadさんからitamaeとか出てたりAnsibleが流行ったりなど。 Ansibleはnot_ifに相当する機能を持たせようとするとドライランできなくなるみたいなのが致命的らしいと聞いたけど、 そもそもYAMLに書きなおすコストがあり得ないので試してないです。 itamaeも気になってたんですがroleとenvironmentをattributeになおす手間がありそうでした。 roleもenvironment数もそれなりの規模で配列attributeを優先順位で意図的にdeepmergeしたり初期化するようなことをしてるし その修正はだいぶヘビーな気が。あとdata_bags機能がないのも超困る。他に移行するにはchefの沼にだいぶつかりこんでいたようです。。 あとChef-Serverはコミュニティ版はHA機能がNGだときいたりしました。 現実的にはlocalmodeだろうということでそんな感じでいつもどおり右往左往で検証してみましたので備忘録です。 chefって情報は結構あるんだけどモヒカンの人(技術レベルの高すぎる人)ばっかりなため初心者がどこで惑うか想像つかないのか肝心なところが分かりづらくて 結局念入りにヘルプを眺めたりググりまくって試しまくるなどというのが多いような。。 使い方も多くてそれぞれの環境が違って色々まざると発狂ちょっとこんがらがりやすいかもしれません。 後日、分かりやすい素敵なチャートをみかけたので追記しておきます。 あなたに合ったChefはどれ? 〜 おすすめ構成確認チャート #getchef - クリエーションライン株式会社 普及と発展には分かりやすさというのはとても重要かなと思います。こんな感じのやってみた記事が多少それに寄与するといいなーと思います。 参考情報 まあ色々みてみたんで参考情報からご紹介いたしましょう。パターン分けておきます。 Chef-Zeroの仕組みとか機能とかの話は別途ググっていただくと分かりやすいと思うんですが、、 インメモリChef-Serverとローカルモードの違いがありまして、私がやりたいのはローカルモードのほうです。 インメモリChef-Serverとして使う場合は Chef-Zeroを起動してcookbookとroleとenvironmentとdata_bagsのデータなんかをknifeコマンドで登録しておく必要があるようです。 インメモリなので、Chef-Zeroを停止すると登録したデータは消えます。 なので手間を考えるとChef-Serverへの移行を見据えて1次的にとかchef-shellでとれる情報をみたい時に使うという用途になるのかなーと思いました。 ブラウザからアクセスすると登録したjson情報などが見えるのはまあ便利と言えば便利かもしれないけどgitでみればいいやんというレベルだったかなあ。 ローカルモードとして使う場合は、コマンド実行時だけChef-Zeroが内部的に起動してレシピ適用終わったら落ちるようで、 knife.rbに書いといたChef-Repoのパスを勝手に見てくれて余計な手間はなさそうでした。 ・Chef-ZeroをインメモリChef-Serverとして動かしたいタイプ Amazon Linuxで簡易Chef Server(chef-zero)を動かしてみた | Developers.IO CentOSにchef-zeroのインストール - clavierの日記 chef-zero を構築して knife-xenserver と連携してみた一部始終 - ようへいの日々精進 XP Ruby - knife zero bootstrap で リモートに chef がインストールできない - Qiita 軽量簡易Chef Server「chef-zero」を使ってみよう #opschef_ja « CREATIONLINE, INC....gitlabの導入方法のメモ
こんにちは。小宮です。先輩から要望されていそうな気がしたのでgitlab導入時のメモです。。 やたらめったら長いし手順が複雑でこのとおりやって再現できるかはお使いの環境に依存する可能性があり保障できかねます。 この手順で再現した環境はOSはCentOS6.5でした。 postgresを許容できるのであれば自動的に入れられるオムニバス版があるのでそちらをお使いいただくのがよろしいかと。 個人的にpostgresの運用の知見が心もとなかったのと、RDSに逃げられなくなるのがアレだったのでmysqlで頑張りました。 自分で自動化する時は、passengerとgitlab:setup時の対話処理をなんとか自動化するオプションを付けるとこがキモかと思いました。 この手順自体は部分的にchefがでてきますがほぼ手動です。自動化オプションは最後のほうにちょろっと書いときます。 1.このへんからmysqlをなんとかして入れとく $ wget http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/MySQL-5.6.17-1.linux_glibc2.5.x86_64.rpm-bundle.tar -P site-cookbooks/mysqld/files/default/usr/local/src/ 2.rbenv等でrubyをなんとかして入れておく (chefでなにもせずにやるとchefgemに寄るので注意がひつよう) rubyのバージョンが低いとGemfileのシンタックスチェックでエラー出てmysql2とかが入らないことも。 3.Gitのインストール # yum -y install libcurl-devel libxslt-devel libxml2-devel expat-devel gettext openssl-devel zlib-devel Installed: libcurl-devel.x86_64 0:7.19.7-37.el6_4 libxml2-devel.x86_64 0:2.7.6-14.el6 libxslt-devel.x86_64 0:1.1.26-2.el6_3.1 Dependency Installed: libgcrypt-devel.x86_64 0:1.4.5-11.el6_4 libgpg-error-devel.x86_64 0:1.7-4.el6 # su - chef;cd infra-chef-repo/ $ knife cookbook create git -o site-cookbooks $ knife cookbook create redis -o site-cookbooks $ vi site-cookbooks/git/recipes/default....GulpでCSS/JavaScriptコンパイル環境を構築する ─ CentOS編
従来、WEBフロントエンドの主要アセットであるCSSとJavaScriptはソースレベルでなかなか管理しづらく、すぐにカオスな領域に突入して保守しづらくなっていました。そのカオスな領域にあるCSSやJavaScriptをソースレベルでもっと保守管理しやすいように生み出されたのがGruntやGulpというコンパイルビルドの仕組みです。今の世の流れ的に、フロントエンド開発ではSCSS(SASS、LESS等)、CoffeeScriptなどでCSSやJavaScriptのコーディングを効率化しつつ、同時にソースの保守管理をし易くするという開発手法がデフォルトになってきました。 実際にLESSで変数を使ったCSSスタイリングや、コード量が劇的に少ないCoffeeScriptでJavaScriptを書いてみると、圧倒的なコード生産性の高さに、もはや今までのベタなフロントエンドコーディング手法は改めざるを得ないという境地になります。 ──と云うことで、早速CSS/JavaScriptのコンパイルビルドを行う環境をサービス提供用のCentOSサーバに作ってみようかと思います(ローカル開発環境としてのWindowsマシンへの導入はこちらの記事を参照)。 ちなみに、Gulpは「ガルプ」と読みます。私は最初「グループ」とか読んでました…(笑) Node.js のインストール まずはGulpはnode.jsのモジュールなので、node.jsをインストールしないことには始まりません。そんな訳で、node.jsをインストールするのですが、まずはnode.jsやライブラリのバージョン管理モジュールであるnvmからインストールしていきます。 下記のように、nvmをGitHubからクローンして同梱のシェルでインストールします。 $ git clone git://github.com/creationix/nvm.git ~/.nvm $ . ~/.nvm/nvm.sh 次に、node.jsをインストールするのですが、その前に現在のnode.jsの安定バージョンを Node.jsの公式サイト を確認しましょう。TOPページの真ん中あたりに「Current Version: v0.12.2」というように記載されているので、そのバージョンをインストールするのが無難です(2015年4月7日時点のNode.jsの安定バージョンは0.12.2でした)。 インストールバージョンが決定したら、nvmでインストールします。 $ nvm install v0.12.2 $ node -v v0.12.2 バージョン確認してインストールバージョンが表示されればOKです。 最後に、自分のコンソール環境でnode.jsが利用できるように .bashrc に以下の記述を追記しておきます。 $ vim .bashrc $ cat .bashrc # .bashrc # Source global definitions if [ -f /etc/bashrc ]; then ....GulpでCSS/JavaScriptコンパイル環境を構築する ─ Windows編
いまさら感が強いんですが、世の流れ的に、フロントエンド開発ではSCSS(SASS、LESS等)、CoffeeScriptなどでCSSやJavaScriptのコーディングを効率化しつつ、同時にソースの保守管理をし易くするという開発手法がデフォルトになってきました。私はその辺の技術の取り込みがおっくうで、ついついCSSやJavaScriptを素でコーディングしてしまったりしていたのですが、最近やっている Ruby on Rails の開発でCoffeeScriptでJavaScript書いてみて、圧倒的なコード生産性の高さに、もはや今までのベタなフロントエンドコーディング手法は改めざるを得ないという境地に達しました(いやはや、ようやくですねぇ…)。 ──と云うことで、早速CSS/JavaScriptのコンパイルビルドを行う環境を業務マシンであるWindowsマシンに作ってみようかと思います(WEBサービス側のCentOS(Linux)環境への導入はこちらの記事を参照)。 なお、なぜビルドツールをGruntではなくGulpにしたかというと、今どきのトレンドはGulpの方かなぁ…という漠然な理由だったりするんですが、まぁ、Gruntより設定ファイルが記述しやすく、複数リソースの設定があっても設定が煩雑化しないというメリットもあるからです。 Node.js のインストール まずはGulpはnode.jsのモジュールなので、node.jsをインストールしないことには始まりません。そんな訳で、node.jsをインストールします。 インストールは簡単で、Node.jsの公式サイトからインストーラーをダウンロードするだけです。私の業務用マシンは「Windows7(64bit版)」だったので、node-v0.12.0-x64.msi というファイルが対象になります(2015年3月4日時点のNode.jsのバージョンは0.12.0です)。 インストーラがダウンロードできたら、早速起動させます。いくつか対話が発生しますが、特に注意しないといけないようなインストール設定はありません。 イントールが完了したら、コマンドプロンプト(もしくは、パワーシェル)から、Node.jsのバージョンを確認してみます。 > node -v v0.12.0 ついでにバンドルでインストールされているnpmのバージョンも確認してみます。 > npm -v 2.5.1 これでNode.jsのインストールは完了です。 Gulp のインストール 次にGulpをグローバルにインストールします。 > npm install -g gulp > glup -v [**:**:**] CLI version 3.8.11 これでインストール完了です。もしインストールに失敗するようなら、 > npm install -g gulp --mscs_version=2012 ──とオプションを付けてみると上手くいくかもしれません。 次に、ローカルにインストールします。 ローカルにインストールするにあたっては、npmの初期化を行う必要があります。まず任意にgulpを実行したいディレクトリを作成します。この記事では、C:\npm\node_modules\gulp というディレクトリを新たに作成しています。...運用的グラフを診る(DNS編)
おはようございます。インフラ宮下です。 ビックデータ時代様々なデータやグラフがあふれかえってます。 そんなグラフに関するお話です。 はじめに インフラ運用で使う実際のグラフを使って、どのような事が起きていてどんな対処が必要になるのかを見ていきたいと思います。 使うグラフ muninでbindのクエリ統計をとったグラフです。 OSはCentOS release 5.9になります。 問題点 グラフの色はクエリタイプ毎に分類されているのですが、AM8時前までで一番多いのはANYレコードです。 これは「DNS AMP攻撃」が行われた形跡です。 ISPにおけるDoS/DDoS攻撃の検知・対策技術 DNS Amp攻撃の解説と、踏み台にされないためのBIND DNSの設定 対応策 今回は意図的に対策していないBindを利用している為、攻撃にさらされてしまいました。 DNS AMP攻撃がひどいのが、勝手にトラフィックを使って他人を攻撃してしまっているので本人に悪気が無くても加害者になってしまいます。 対策は既に出回っていますが、bindバージョンアップして再帰的問い合わせを実施しないか、クエリを受け付けるNWを制限するというのが一般的です。 あとはCentOS6系であればiptablesで特定ドメインのクエリを止める事が出来ます。 (出来るのはCentOS6以上) NSサーバへのANY? . な連続リクエスト対応 DNSアタックとiptablesフィルタ 実際のANYリクエストで多いのは「isc.org」だと思います。どちらかと言うと長期間にわたってじんわりと来る感じ。 その他では「uspsoig.gov」や「defcon.org」「doleta.gov」が最近良く目にします。 先程のiptablesでブロックする方法は、 DNS Amplification Attacks Observer など情報は出回っていますのでサービスに影響が出ない範囲で実施してみてください。 注意しなければいけない点としては、qmailがメール送受信時の名前解決にANYレコードを引いてくるので何でもかんでもANYははじいてしまうとメール障害となってしまいます。 qmailとDNSSEC <a http://mediakisslab.net/doku.php?id=linux:qmail:memo" target="_blank">DNSSEC対応 さいごに 昔は自前でDNSサーバをたてて、そのまま放置して今も稼働しているなんて言うケースはどこでもあると思います。 (むしろ外部サービスとかで使われているDNSはきちんと担当の方がいて健全に運用している気がします) グレイな環境で手が出ないオープンリゾルバなDNSは怖いですな。 (昔はメールの不正中継の方が花形だったのに…)...chefのruby_blockを用いて環境変数を再読み込み
こんにちは。小宮です。 chefでいろいろ自動化していくうちに、途中で変更された値というか変数を使いたい場合が出てくるのかなと思います。 1回目は上手くいかないけど2回目は上手くいくというような冪等にならない怪現象を解決したいと思う時がそのうちきます。 そんなとき、、 ohaiで値がとれる場合はそれを使いなければohaiのプラグインを自作するか、 ruby_blockを書いたり、notifiesで:immediatelyとかつけて呼び出すって感じの対応が必要になったりします。。 何言ってっかわかんねえ!と思うかたは以下のリンク先にchefの実行順序に関して書かれているので見てみるといい気がします。 Chefのレシピは上から下に実行されるという誤解 | Engine Yard Blog JP これだけだと不親切かもしれないので以下ご参考まで。 template "/etc/profile.d/rbenv.sh" do not_if "grep rbenv /etc/profile.d/rbenv.sh" source "rbenv.sh.erb" action :create notifies :create, "ruby_block[initialize_rbenv]", :immediately end ruby_block "initialize_rbenv" do block do ENV['RBENV_ROOT'] = node[:rbenv][:root] ENV['PATH'] = "#{node[:rbenv][:root]}/bin:#{node[:rbenv][:root]}/shims:#{node[:ruby_build][:bin_path]}:#{ENV['PATH']}" end action :nothing end 少し解説しますと、 chefではレシピ中での改変を前提とした処理はくふうがひつようで、 rubyで書かれた処理はconvergeの手前で行われてしまってその時点では途中の改変を認識できないようです。(だから2回目に成功する) ruby_blockリソースはconvergeのタイミングと同じ時に動くようです。 特定のリソースの処理が行われるときだけ実行したい場合にはそのリソースのnotifiesにはタイミングを指定できます。(:immediatelyとか:delayedとかあるらしい) この場合、ruby_blockリソースのactionにはnothingを指定しておき、templateリソースでprofileの設定を置いて:immediatelyをnotifiesに指定することで ただちに変数の再読み込みが実行される、という話になります。(レシピを分けてる場合にnotifiesつかうと-oで個別実行しにくくはなりそう。)...AWSのSecurityGroup関連の調査・更新CLIメモ
こんにちは。小宮です。 今回ご紹介するのはpiculetでgroupファイルでルール更新というのではありません。 ちょっと整理とか削除とかしたいけど手でポチぽちするには量が多いしオペミスが心配だし手間だし早く帰りたいので どれに紐づいてるのか一括で調べたい一括更新したいといった時にforループとCLIでなんとかする方法です。 SecurityGroupの上限緩和申請の際にSGの書き方的に通信パフォーマンスがアレで引っ掛かった時等にこんなような作業が必要に。 あんまり使いこなせてるほうでもないのですが、一応載せておきます。ご利用は自己責任でお願いします。 みなさま似たようなことしててもっと洗練されたやり方をご存知の方も沢山いそうです。 弊社だと稲田さんほか協力部隊の方々がもっと詳しそうな気がします。マサカリ歓迎いたします。 稲田さんに聞いたらもっとoutputはtextにしてjoinを使いこなせと言っていたのでそのうち何か書いてくれると思います。 SecurityGroupのidから紐づくインスタンス情報を得る これは既存の情報を得るだけで更新しないので気軽に実行できると思います。 まずリストを作る(消したいSGをいれる) vi listfile sg-xxxxxxxx,SG_hoge_dev1 sg-yyyyyyyy,SG_fuga_dev2 ... list=listfile profile=xxxx リストを読み込んでdescribe-instancesを実行 for i in `cat $list|grep -v elb` do groupid=`echo $i |awk -F, '{print $1}'` groupname=`echo $i |awk -F, '{print $2}'` echo $i aws ec2 describe-instances --profile ${profile} --filters Name=instance.group-id,Values=$groupid --output text \ --query 'Reservations[]....