信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

LIST OF ARTICLES

記事一覧

  • テクログ

    cURL

    cURLは、さまざまなプラットフォームで使用可能ですが、私はPHP以外での使用経験が無いため、PHPでのcURL使用のみについて書いていきます。 使用方法としては別のシステムとのインターフェースに使ったり、 file_get_contentsが使用できない環境で代わりに使用したりなどといった形で使用してきました。 という事でそれに沿って説明していきます。   cURLは以下の4つのコマンドのみで実行できます。 ・curl_init ・curl_setopt ・curl_exec ・curl_close curl_initで初期化して curl_setoptでオプションにより動作を設定し、 curl_execで実行して、 curl_closeで終了という流れです。 以下はfile_get_contents的に使用する場合の例になります。 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://core-tech.jp/"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $contents = curl_exec($ch); curl_close($ch); $contentsにhttps://core-tech.jp/のページソースが入ってきます。 レンタルサーバーなどfile_get_contentsが使用できない環境で代用できるかも。  さらにはログインが必要なページの取得も可能です。 もちろん、IDとパスワードがわかっているページが限定です。 Basic認証 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://core-tech.jp/target.html"); // 実際にはありません curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERPWD, "$id:$pass"); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); $contents= curl_exec($ch); curl_close($ch);   cookie認証 これは少し面倒で2回呼ばないといけなくて、 最初にログインページからcookie情報をtmpというファイルに保存し、 次にcookie情報を引き継いで取得したいページから取ってくるといった感じになります。 $fp = fopen("tmp", "w"); $params = array('id' => 'id', 'pass' => 'pass'); $ch = curl_init();  curl_setopt($ch, CURLOPT_URL, "https://core-tech.jp/login.html"); // 実際にはありません curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);  curl_setopt($ch, CURLOPT_POST, TRUE);  curl_setopt($ch, CURLOPT_POSTFIELDS, $params);  curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie"); curl_setopt($ch, CURLOPT_WRITEHEADER, $fp);  $output = curl_exec($ch);  curl_close($ch);  fclose($fp); $ch = curl_init();  curl_setopt($ch, CURLOPT_URL, "https://core-tech.jp/target.html"); // 実際にはありません curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_COOKIEFILE, "tmp"); $results[$pageid] = curl_exec($ch); curl_close($ch);   インターフェースとして使用する場合 通信相手にもよりますが、POSTで値を渡して結果を得るという流れの例になります。 今回はpostでdata1とdata2を渡すと結果が得られるという仕様だとします。 $post = "data1=".urlencode("data1")."&data2;=".urlencode("data2"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://core-tech.jp/target.html"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); $contents= curl_exec($ch); curl_close($ch);   オプションについては以下のサイトに資料があります http://php.net/manual/ja/function.curl-setopt.php ちなみに全ての例で使用しているCURLOPT_RETURNTRANSFERについては 「結果を文字列で返す」という設定になります。 それ以外のオプションも多数あるので使用するケースによって使い分けしてください。   複数のサイトに対して一括取得する場合はcurl_multi_initを使用します。 // 対象サイト $url_list = array("https://core-tech.jp/", ); // マルチハンドルの用意 $mh = curl_multi_init(); // cURLハンドルの用意と、マルチハンドルへの登録 $ch_list = array(); foreach( $url_list as $url ) {  $ch_list[$url] = curl_init($url);  curl_setopt($ch_list[$url], CURLOPT_RETURNTRANSFER, TRUE);  curl_multi_add_handle($mh, $ch_list[$url]); } // 一括で通信実行、全て終わるのを待つ $running = null; do {  curl_multi_exec($mh, $running); } while ( $running ); // 実行結果の取得 foreach( $url_list as $url ) {  // ステータスとコンテンツ内容の取得  $results[$url] = curl_getinfo($ch_list[$url]);  $results[$url]["content"] = curl_multi_getcontent($ch_list[$url]);  // Curlハンドルの後始末  curl_multi_remove_handle($mh, $ch_list[$url]);  curl_close($ch_list[$url]); } // マルチハンドルの後始末 curl_multi_close($mh); これは取得するサイトの数が多すぎると取得自体ができなかったり、 動作が安定しませんでした。 やり方が悪かったのかな? と、この辺りが私が知っているcURLの全てになります。
  • テクログ

    jQueryとJavaScript4

    前回では、入力した文字を精査して、 数字3桁が入力されていれば終了していました。 今回はそこから先の処理を考えたいと思います。 処理の内容としましては、 ・入力した文字を別の要素に表示 ・ランダムで3桁の数字を生成 ・入力した文字を配列化 ・ランダム数字と入力文字の比較 になります。 【履歴】 function testMethod(Number) { // 入力値を配列化 ArrNumber = Number.split(''); for(i=0; i<3; i++) { // ランダム数字の配列に入力文字がある場合 if($.inArray(ArrNumber[i], ArrAnswer) != -1) { } } // 履歴に追加 $('#history').append(Number+''); // 入力値をリセット $('#number').val(''); } function testMethod2() { ArrAnswer = new Array(); for(i=0; i<3; i++) { // 0~9の数字を生成して、文字に変換 ArrAnswer[i] = Math.floor(Math.random()*10)+""; // 同じ数字を使用している場合、再設定 if(ArrAnswer[i] == ArrAnswer[i-1] || ArrAnswer[i] == ArrAnswer[i-2]) { i--; } } } $(function(){ // ランダムで3桁の数字を生成 testMethod2(); $('#number').keypress(function(e) { // 省略 }).keyup(function(e) { // 省略 // 下記追加 testMethod(Number); }); }); 「入力した文字を別の要素に表示」は、 jQueryのappend()メソッドを使用してします。 指定したセレクタの末尾に引数で指定した文字列を追加します。 $("セレクタ").append("文字列"); 「ランダムで3桁の数字を生成」は、 JavaScriptでMath.random()とMath.floor()メソッドを使用しています。 Math.random()は、0.0以上1.0未満の乱数を生成します。 Math.floor()は、小数点以下の値を切り捨てます。 0~9までの数字を生成する場合は、 Math.floor(Math.random()*10); 「入力した文字を配列化」は、 JavaScriptでsplit()メソッドを使用しています。 今回は区切り文字を「''」として、桁ごとに配列に入れています。 文字列.split("区切り文字"); 「ランダム数字と入力文字の比較」は、 jQueryのinArray()メソッドを使用しています。 配列に値があれば、その位置を返し、 配列に値がなければ、「-1」を返します。 $.inArray(比較する値, 比較する配列) 次回は、ゲームのHTMLとJavascriptを記載します。 では、また来月お会いしましょう。。。
  • テクログ

    ソフトウェアテストについて

    こんにちわ、本日はシステムのテスト手法につきましてわかる範囲で書いていきたいと思います。 システムのテストを全くやったことないよっていう人はSE/プログラマの方の中にほとんどいらっしゃらないかと思います。 例えば業務システムの場合、テスト専門部門(品質保証部門)を用意している企業も珍しくはありませんが、どんな作り手の方でも最低限の単体テスト(UT)くらいは実施しますよね。 今回はその際のテストについてです。 システムのテストは大きく2つの分類に分けられます。 ・ブラックボックステスト ・ホワイトボックステスト の2種類です。 違いは以下の通り。 ブラックボックステスト…システムの外部に着目して仕様通りかどうかのテストを行う ホワイトボックステスト…システムの内部構造に着目してテストを行う 例えば、ここに 『身長を入力したら 165cm未満で低め/165以上180以下で標準/それ以上は高め を結果として表示してくれる PHPプログラムがあったとします。処理としては、非常に簡素ですが以下とします。 index.html 身長: calc.php コードに関しては特に説明する必要もないくらいですね。 入力された結果をcalc.phpに渡してその判断結果をprintするだけです。 さて、まずは上記のプログラムに対してテストを行う場合に、ブラックボックステストで行う場合のテストケースを考えてみましょう。 仕様は上に書いたとおりです。 ブラックボックステストを漏れが少なく行う為の有効な手法の1つとして、同値分割と限界値分析(境界値分析)という手法があります。 ◆同値分割とは 入力を同じように扱えるグループに値を分けたものを同値クラスと呼び、それぞれの代表的な値を用いてテストを行う。 有効な同値クラスを、有効同値クラス、無効(エラー)となる同値クラスを無効同値クラスと呼ぶ。(ソフトウェアテストwikiより) →要約すると『同じように扱えるグループの代表的な値を入れる』って事です。 上記の例では、 164cm以下なら『低め』が返るグループ 165~179cmなら『標準』が返るグループ 180cm以上なら『高め』が返るグループ 同値分割を使用してのテストは、各グループの代表値を使用してテストケースを作成します。 上記はすべて有効同値クラスと言われるものですね。 例えば、上記テストケースを作成するとしたら以下のような感じでしょうか? 身長の入力:期待される結果 100       :低めが表示されること 170       :標準が表示されること 190       :高めが表示されること 同値クラスは、あくまでその地域の代表となる値なので特にどの数値がいいとかいうのはないので、上記は各クラスから適当に抜き出した値です。 有効同値クラスのテストは上の例のようなもので問題ありません。 逆に無効同値クラスを考えたときに、例えば負の値が入力された場合を考えます。 すると身長でマイナスというのは本来存在しないが(厳密にいうと極端に低い値も存在しないとは思いますが)、入力では入れることができるマイナスの数値のケースが上記プログラムでは抜けている事に気づく事ができます。 現状のプログラムではマイナスが入力された時にも『低め』が表示されるので、身長の事なんだからマイナスの場合はエラーを表示させる必要があるかもという発想に至ることができます。 実際のプログラムでは、このような異常ケースを考えていない事が致命的な不具合につながることがあります。 エラーケースを考えて仕様に『身長がマイナスの場合は正しい値を入力してくださいと表示する』という仕様が追加されたら、 無効同値クラスのテストケースは下記のものを追加でしょうか。 身長の入力:期待される結果 -5        :正しい値を入力してくださいと表示されること。 さらに無効同値クラスを考えるときに、例えば数値以外の入力があった場合を考えたとします。 先ほどのエラー処理をいれたソースはこのようなコードであったとすると… 入力値に数字以外の日本語を入れると、なぜか結果は『低め』になります。 理由はintval()の関数の仕様が数値変換失敗時は 0を返すという理由です。 ですので、全角や数値以外の場合は変換失敗として0が返されるので}elseif($shincho < 165)に該当してしまって低めと間違った結果を表示してしまいます。 この場合は数値以外をJSで入力できなくしてあげたり、php側で数値かどうかのチェックを入れて数値以外ならエラーを出力するなどの対策を考える必要があります。 上記のように、無効同値クラスを考えただけでも2つの想定外になる要素を排除する事ができます。 同値分割は、グループわけをして代表的な値を入力して正しく期待結果が返る事を確認するテストになります。 テスト作成時には、異なる結果が得られる分岐がある場合はこの同値分割を意識する必要があります。 ちと長くなりましたが…本日はもう1つだけ。 限界値分析に関してです。 ◆限界値分析とは 入力を同じように扱えるグループに値を分け、その境界となる値を用いてテストを行う。プログラムのエラーは分岐の境界で発生する場合が多いため、限界値分析に基づいたテストを行うことで、同値分割に基づいたテストよりも多くの欠陥を発見することができる。(ソフトウェアテストwikiより) →要約すると『同じように扱えるグループの境目の値をテストする』って事です。 文書見ただけでもわかりますが、異なる結果を出力する境目になりますので、上記例を使って限界値テストを実施する場合は 身長の入力:期待される結果 -1:正しい値を入力してくださいが表示される事 0:低めが表示されること 164:低めが表示されること 165:標準が表示されること 179:標準が表示されること 180:高めが表示されること このような項目になりますね。 -1~0の間(エラーから低め)、164~165の間(低めから標準)、179~180(標準から高め) の間で1つの数値上昇に対して結果が変わるので、そこをテストします。 境界値テストを実施することで、165未満の判定が }elseif($shincho < 165){が正しいところを }elseif($shincho <= 165){となっていた場合には、165で『低め』が誤って表示されるのでバグを発見することができます。 境界近くの値は上のif分の記述ミス等のようなバグが発生しやすいです。 実際、ni-yoが所属しているチームでつい最近も境界線の値の判断ミスでバグが発生しました。 ブラックボックステストを作成時に同値分割/限界値分析を意識するだけで、何も意識していない状態よりはかなり品質は変わってきます。 長くなりましたので、ホワイトボックスはまた後日にでも! では( ´ ▽ ` )ノ
  • テクログ

    新しい技術

    こんにちは。ぬまっちです。今日実は28歳の誕生日を迎えました!!!今回は非常に有名なUnityについて。新しい技術を学ぶ必要があると思い、技術ブログに掲載致します。UnityはWii、Xbox360、PlayStation 3、Mac、Windowsなどゲームを楽しむ機器向けから、Webブラウザで遊ぶゲーム、あるいはiPhone/iPod Touch/iPad、Android向けのバージョンも存在します。目標Unityでアングリーバード的な簡易ゲーム実装 まずUnityをローカル環境にインストールしてください。■プロジェクト名TestBlockFile→New Projectフォルダー構成■共通部品の配置に関してはInspectorのTransformにてPositonのX,Y,Zの数値を変更してください。CubeGameObject→Create Other→CubePlayerGameObject→Create Other→SphereCube PlayerともにComponent→Physics→Ragidbodyにて物体の重さを設定してください。Projectフォルダー構成Scriptフォルダ以下にjsを埋め込みます。Scriptで右クリック→Create→JavascriptPlayerController,Triggerという名前のjsファイルを作成します。 PlayerController.jsvar player : GameObject;var shootPowerX : float = 400.0;var shootPowerY : float = 400.0;function Update () {    if ( Input.GetButtonDown("Fire1") ) {        player.rigidbody.AddForce(shootPowerX, shootPowerY, 0);    }}Trigger.jsfunction OnGUI () {    if ( GUI.Button(Rect(10, 10, 50, 50), "Reset") ) {        Application.LoadLevel("TestBlock");    }} jsが完成したらProjectのjsファイルをHierarchyの同名ファイルにドラッグしつなぎます。Point light物体に照明をともします。GameObject→Create Other→PointLight以上ができましたら再生ボタンを押します。 TestBlock ダウンロードファイルを置いておきます。  
  • テクログ

    PHPの小技

    プログラマー:「ディレクター♪ 言われていたサイト出来上がりましたよ♪」ディレクター:「あれ?予定より早くない?」プログラマー:「こういうサイトは慣れてきましたからね。ささっと作れちゃいました。」ディレクター:「ありがとう。ちょっと確認してみるよ。」・・・・ディレクター:「ねぇ・・・超遅いんだけど・・・。作り直してくれないと納品出来ないから・・・」プログラマー:「アタヽ(´Д`ヽ ミ ノ´Д`)ノフタ」 いくつものサイトをPHPで作成していると、こんな事が起こる事があります。ついつい慣れだったりパッと思いついた方法でコードを書いていってしまうと陥る罠ですね。という事で、納期間際に、アタヽ(´Д`ヽ ミ ノ´Д`)ノフタ しない為の小技を発見したのでメモ書き程度にご紹介いたします。1、 require_onceは激重2、preg_replaceよりもstr_replace()の方が速い。 しかし!!!!    str_replaceよりもstrtr()の方が4倍も速い!3、$row[id]よりも$row["id"]の方が7倍速い!4、for文の中で($i=0; $i < count($array); $i)のように、count()関数を使うと、毎回count()が呼ばれるので遅くなる。5、staticメソッドが使えるなら使った方が良い。速度は4倍に!!!こんな事に注意をして作っておくと・・・・・・・・ディレクター:「確認したよ!軽いし良いね。さくっと納品しちゃうよ。ありがとう。」プログラマー:「(^^ゞ」こんな感じで幸せになれますよ♪小さい事かもしれませんが、塵も積もれば何とかです。小技を有効活用しちゃいましょう。※追記2012/10/31の記事をもう少し詳しく書いてみたのですが、若干違う部分があるな~・・・ どっちが正解なんだろうか・・・・
  • テクログ

    知っていたら便利。Photoshopの色々

    こんにちは。 今日は以外に知らないPhotoshopの機能について話したいと思います。   毎日のように使ってるPhotoshopですが、便利ですよね! の中で、これ知ってたらより便利に!というのをを紹介します。   ①レイヤー複製「~のコピー」をつけない方法   レイヤー複製すると「~のコピー」ってなるんですが、いつの間にかどんどん増えていきますね。 それが以外と気になる時があったり、作業を他人に引き継ぐ時とか、、、、知っていたら便利かと思います。   普通レイヤー複製するとこうなります。   それを、、、「レイヤー」パネルのオプションを開き、パネルオプションをクリック 『コピーしたレイヤーとグループに「コピー」を追加』のチェックを外します。   そうしたら、、、レイヤーを複製してもレイヤー名に「~コピー」が付かなくなります。   この設定はcs5からできるらしいです。   ②長方形ツールを使う時、端がぼけないようにする方法    長方形ツールで四角(丸角長方形なども)を書く時に端がぼけてしまい、でか~く拡大して調整した~って経験ありませんか? 昔の私はよくありましたが。。。。;   ぼけた場合↓ きれいに書けた場合↓ これは、角丸長方形オプションで「ピクセルにスナップ」にチェックをつけることできれいに書くことができます。 簡単でしょ? 以上便利なPhotoshopの色々でした。 それではまた。