MS Project ガントチャート IDが全部表示されない

当社は、小規模から大規模の案件全てMS Projectにて、プロジェクトの管理をしています。

タスクの追加、リソースの割り当てを一通り行った後、一部タスクを新たに他の新規のリソースに割り当てたところ、ガントチャートで一部のIDが表示されなくなってしまった。タスクのフィルターはすべて選択になっているにも関わらず。

m2

ただし、ガントチャート(進捗管理)ではすべてのIDが出て表示される。

m3

1時間ぐらい悩み、タスクのフィルターで、”すべてのフィルターをクリアー”を
実行したら表示された。
フィルターの何か変はゴミが残ってたのかも。今更ですが、今後は、”すべてのフィルターをクリアー”をすると覚えておこう。

m34png

 

 

Nexus5x,6P のカメラ reverse landscapに対応

Nexus5x及び6Pで、QRコード読み取り,3D 行先コンパス ARでカメラ画像が、180度回転表示するバグを修正しました。

Nexus 5Xのイメージセンサーは設計上の部品配置の都合で、他のAndroid端末と異なり逆(reverse landscape)に取り付けられているとのことで、rotationが未設定のアプリはpreviewが反転するようになった。
http://qiita.com/tomoima525/items/f59d345ea40c36244f9b

当アプリも180度回転表示してしまいました。

元々は、
camera.setDisplayOrientation(90)
で90度回転させて縦表示するようにしていたのですが、
Nexus5xだと、
camera.setDisplayOrientation(90 + 180)
にしないとだめで、

camera2 APIを利用すれば全自動ですが、
最終、以下のコードを追加して対応致しました。

    int numCameras = Camera.getNumberOfCameras();
    int cameraID;
    int back_camera_flg = 0;

    int index = 0;
    Camera.CameraInfo cameraInfo;
    int result = 0;

    while (index < numCameras) {
      cameraInfo = new Camera.CameraInfo();
      Camera.getCameraInfo(index, cameraInfo);
      if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT && back_camera_flg == 0){
        result = (cameraInfo.orientation) % 360;
        result = (360 - result) % 360;
        Log.w(TAG,"----- CAMERA INFO FRONT " + result );
      }
      if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
        back_camera_flg = 1;
        result = (cameraInfo.orientation + 360) % 360;
        Log.w(TAG,"----- CAMERA INFO BACK " + result );
        break;
      }
      index++;
    }
     //camera.setDisplayOrientation(90);
    camera.setDisplayOrientation(result);
    //
    camera.setParameters(parameters);
  }

PHP 4G 大容量のファイルアップロード: enable_post_data_reading

PHPで大容量のダウンロードはサーバ側でfreadで数Kバイト単位で送出すればいいだけですが、アップロードは、そうはいかず、enable_post_data_readingをoff設定にして、自力でpostデータをパースし、データ部を数Kバイト単位で読むしかないのです。実装しました。
(1Gのファイルのダウンロード、アップロードは、オンメモリーで処理すると、
例えば同時接続10でアップロードすると10Gにもなって破綻します。)

[設定]

プログラムはアップロード専用フォルダーにして、
.htaccess

php_flag enable_post_data_reading Off

・enable_post_data_reading Offにすると、$_POST,$_FILEは使えません。$_GET,$SESSIONは有効。
・ini_set()ではenable_post_data_readingは設定できません。

test.html

<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link rel="stylesheet" href="/css/jquery-ui.css" type="text/css" />
<script type="text/javascript" src="/js/jquery.min.js"></script>
<title></title>
</head>

<SCRIPT Language="Javascript1.2">
<!--

$(function() {
  $('input[type=file]').change(function() {
        file1 = document.getElementById("userfile1").files[0];
        file2 = document.getElementById("userfile2").files[0];
        file3 = document.getElementById("userfile3").files[0];

        if(typeof file1 === "undefined"){
                document.sedesupload.up_size1.value = "0\t";
        }else{
                document.sedesupload.up_size1.value = file1.size + "\t" + file1.name;
        }

        if(typeof file2 === "undefined"){
                document.sedesupload.up_size2.value = "0\t";
        }else{
                document.sedesupload.up_size2.value = file2.size + "\t" + file2.name;
        }

        if(typeof file3 === "undefined"){
                document.sedesupload.up_size3.value = "0\t";
        }else{
                document.sedesupload.up_size3.value = file3.size + "\t" + file3.name;
        }

  });
});

-->
</SCRIPT>

<body>
<br>
<h1>TEST</h1>

<form enctype="multipart/form-data" name="sedesupload" action="binupload-multi.php" method="POST">
<input type="hidden" name="trkno" value="DD00008">
<input type="hidden" name="user" value="T">

<input type="hidden" name="up_size1" id="up_size1" value="0">
<input type="hidden" name="up_size2" id="up_size2" value="0">
<input type="hidden" name="up_size3" id="up_size3" value="0">

No1: <input name="userfile1" id="userfile1" type="file" /><br>
No2: <input name="userfile2" id="userfile2" type="file" /><br>
No3: <input name="userfile3" id="userfile3" type="file" /><br>

<br>
<input type="submit" value="ファイルを送信"/>
</form>
</html>

・最大3ファイルを選択
・POSTデータに3ファイルのファイルサイズ、ファイル名を同時にセット。ファイルサイズをサーバ側に知らせないと、受け側のプログラムが面倒な処理になるので、入れてます。

binupload-multi.php

<?php
# php 5.4 or higher
#.htaccess php_flag enable_post_data_reading Off
#
#print_r($_SESSION);    // is
#print_r($_REQUEST);    // is
#print_r($_GET);        // is
#print_r($_POST);       // null

//-- config base -----------------
ini_set("max_execution_time",180 * 3);
$base_dir = "/home/temp";
$READ_BUF_SIZE = 8192;
//-------------------------------

$handle_in = fopen("php://input", "rb");
if (FALSE === $handle_in) {
    exit("Failed to open stream to URL");
}

$header_sec = 0;

$contents = "";
$multi_part ="";
$multi_part_now = "";

while (!feof($handle_in)) {
        // ------------------------------------
        // STEP 0: first GET multi part strings
        // ------------------------------------
        if($header_sec == 0){
                //get multipart string
                $multi_part = str_replace("\r\n", '', fgets($handle_in));
                $header_sec = 1; //Next Content
                if(strlen($multi_part) == 0){
                        print "multi_part_len 0 error \r\n";
                        exit;
                }
                print "[". $multi_part . "]<br><br>";

                continue;
        }

        // ------------------------------------
        // STEP 2: next GET multi part strings & check
        // ------------------------------------
        if($header_sec == 2){
                $multi_part_now = str_replace("\r\n", '', fgets($handle_in));

                if($multi_part_now === $multi_part){
                        $header_sec = 1;
                        continue;
                }else{
                        // Last part check
                        if($multi_part_now == $multi_part . "--"){
                                print "sucess\r\n";
                        }else{
                                print "sequence error step 2\r\n";
                        }
                        break;
                }
        }

        // --------------------------------------------------
        // STEP 1: GET Content-Disposition (post name & data)
        // --------------------------------------------------
        if($header_sec == 1){
                $line = str_replace("\r\n", '', fgets($handle_in));
                $sbuf = explode('filename="',$line);
                if(count($sbuf) == 1){
                        //parameter
                        $pbuf = explode('name="',$sbuf[0]);
                        $pname = mb_substr($pbuf[1], 0, -1);

                        fgets($handle_in); //null line;
                        $pdata = str_replace("\r\n", '', fgets($handle_in));
                        print "NAME=[".$pname . "] DATA=[" . $pdata . "]<br>";

                        if($pname === "up_size1"){
                                $upbuf = explode("\t",$pdata);
                                $upfile_size[0] = $upbuf[0];
                                $upfile_name[0] = $upbuf[1];
                        }elseif($pname === "up_size2"){
                                $upbuf = explode("\t",$pdata);
                                $upfile_size[1] = $upbuf[0];
                                $upfile_name[1] = $upbuf[1];
                        }elseif($pname === "up_size3"){
                                $upbuf = explode("\t",$pdata);
                                $upfile_size[2] = $upbuf[0];
                                $upfile_name[2] = $upbuf[1];
                        }
                        $header_sec = 2;
                        continue;

                }else{
                        //file parameter
                        $filename = mb_substr($sbuf[1], 0, -1);

                        fgets($handle_in); //skip Content-Type:;
                        fgets($handle_in); //skip null line;
                        print "FLENMAE=[".$filename . "]<br>";

                        if($filename == ""){
                                fgets($handle_in); //skip null line;
                                $header_sec = 2;
                                continue;
                        }else{
                                for($i = 0 ; $i < 3 ; $i++){
                                        if($filename === $upfile_name[$i]){
                                                $filesize = $upfile_size[$i];
                                                $handle_out = fopen($base_dir . "/" . $filename, "w+b");
                                                $header_sec = 3;
                                                break;
                                        }
                                }
                        }
                }
        }

        // --------------------------------------------------
        // STEP 3: GET file binary contests
        // --------------------------------------------------
        if($header_sec == 3){
                if($filesize < $READ_BUF_SIZE){
                        $contents = fread($handle_in, $filesize);
                        fwrite($handle_out,$contents);
                }else{
                        $readsize = 0;
                        while (!feof($handle_in)) {
                                $contents = fread($handle_in, $READ_BUF_SIZE);

                                $readsize += $READ_BUF_SIZE;
                                fwrite($handle_out,$contents);

                                if(($readsize) + $READ_BUF_SIZE >= $filesize){
                                        $contents = fread($handle_in, $filesize - $readsize);
                                        fwrite($handle_out,$contents);
                                        break;
                                }
                                //usleep(1000);
                        }

                }
                fgets($handle_in); //null line;
                $header_sec = 2;
                fclose($handle_out);
        }
}
fclose($handle_in);

?>

・max_execution_timeは、540秒(9分)
・マルチパートを区切りに、POSTデータをパース
・ファイルの場合は、ファイルサイズを基に8192バイト単位で受信しファイルに書き込み。

※テストコードなのでコードレビューはしておりません。
プログラム中に固定化(3ファイル前提)されているところもありますので利用される方はご注意を。日本語ファイル名等はそれなりの処理をして下さい。

112

113

合計9.5G アップロードできました。
この時、httpdのCPU使用率は50%でした。
※usleep(1000) 1msecのsleepを入れるとCPU使用率は13%になります。当然アップロード時間も増加しますので、max_execution_timeは要調整。

httpd CPU使用率
———————-
50% なし
34% usleep(100)
28% usleep(300)
13% usleep(1000) 1msec
———————–

まあ、昔のperlのcgi時代は全て自分でPOSTデータはパースしてたので、
全然違和感はないですが、今は全部やってくれるので知らない内に
オンメモリーで処理されていること忘れがちあるいはそもそも、そんな考えも
しないという新人の技術者も多いかと思いますのでご注意を。

Windows 10 / bootcamp いつ頃からか、USB内のプログラムが実行できない。

いつ頃からか、USB内のプログラムが実行できない。

「指定されたデバイス、パスまたはファイルにアクセスできません。アクセス許可がない可能性があります。」
とダイアログが出て実行できません。

特に不自由はなかったのですが、USB内のパスワード付アクセスプログラムを実行する必要があって
実行できないとフォルダーが開けないので調査。

ネットで検索してもアクセス権限を見直すとかしか出て来ず><

DOS窓から実行すると、ただ「拒否されました」と一言。
こちらの文言の方が迷いがなくすぐ推測がつきました。UAC制御関連なのだと。
で、たどり着いたのが↓の画面

ac1

gpedit.mscを起動
「コンピュータの構成」
「管理用テンプレート」
「システム」
「リムーバブル記憶域へのアクセス」
「リムーバブルディスク:実行アクセス権の拒否」
“有効”になってました。(もしかして覚えていませんが自分で最初に有効にしたのかもしれません。。)

これを未構成に変更してOK。

 

QRコード読み取り バージョンアップしました。 ズームイン、ズームアウト 1.3.0

QRコード読み取り バージョンアップしました。

・カメラのズーム機能を実装しました。

15m先のバーコードが読めるというバーコードリーダを見て、それならということで、ズームイン、ズームアウトを実行しました。
ポスターに近寄らなくても、ズームインでQRコードが読み取れます。
(android 2.3.3の旧機種でも動作します!)

https://play.google.com/store/apps/details?id=jp.co.seiwa.zxing.client.android

※ついでに、開発ツールをEclipseからAndroid Stadio 2.1.2に移行しました。

B_2016-06-12-12-08-48
<ズームイン↓>
B_2016-06-12-12-08-56

【活動報告】講義に行ってきました

久しぶりの投稿になります。(ネタができたので)
大寒波のため、体調管理にはお気を付け下さい。

先日とある大学で講義のお願いがありましたので、
1コマ分、講義を行ってきました。

テーマは
[仕事について、学生時代について、就職活動について]・・・などなど。

学生の方々はなかなか熱心で、
就職活動を控えているということもあり、就職活動についての話では、
特に興味深く聞いて下さりました。

世間では売り手市場などと謳われてますが、
学生の方々にとっては、初めての就職活動を経験するわけなので、
良い意味で、学生の方々の緊張感を感じることが出来ました。

もちろん、講義の中で弊社の紹介も行ってまいりましたので、
またこうゆう機会があれば、弊社を知ってもらうため、どんどんアピールしていきます。

講義風景

インターンシップ報告

星和テクノロジーに、10/1~10/30までインターンシップで、HALの学生さん2名を受け入れて、本日無事 成果発表となり修了致しました。指導・受講ともにご苦労様でした。

システム開発を行うにあたって、開発計画~概要・詳細設計、レビュー、リリース、プレゼンを経験して頂きました。

【WEBアプリケーション:phpによる数独作成】
DSC_0060

【Redmineプラグイン開発 redmaine_issue_history_tabs(機能拡張)】
DSC_0062

※当社は、Redmineにて、プロジェクト管理、タスク管理、進捗管理、情報共有を行っています。
今回、改修頂いた機能を実際使って行きます。

【Asai’s memo】PCセットアップ編(入力履歴の削除)

夏風邪が流行っております。
皆様、体調にはお気を付け下さいね。

最新、PCのセットアップを行う機会が増えました。

第三者にPCを利用してもらうときに、
セットアップ時に入力していた情報が消えないまま勝手に保存されていた。なんてことがあります。
削除方法をメモとして記載しておきますので参考になればと。

入力した履歴を消す設定(windows7)

①スタートメニューより[コントロールパネル]を開く。
②デスクトップのカスタマイズをクリックする。
 20150630_1
③タスクバーと[スタート]メニューをクリックする。
 20150630_2
④[スタート]メニュータブを選択し、プライバシー欄の最近開いたプログラムを[スタート]メニューに保存し表示する(P)のチェックを外す。
 20150630_3
④適用ボタンを押して完了。

上記を行うと、勝手に保存されるスタートメニューで入力した情報を削除してくれますよー。

【WebPerformer】明細に行挿入機能②

拡張で使用する JavaScriptのコードなどは、製品サポートの対象外となるので、充分注意して下さい。

さっそく行挿入機能(オリジナル)ソースコードを記載します。
実際の動作としては、行挿入のボタン押下以下の行を1行下にずらす処理を行っています。
理由としては、[+]ボタンのID名称はマニュアルに記載されておらず、今後のバージョンアップ等々で変更される可能性が有る為です。
行追加の動きは見送り、下にずらす形で今回は補います。

function Insert_Rows(){

	//ボタンが押下された行数を取得。
	var currentIndex = disp.get__SRC_EVENT_ROWS();

	//空行挿入用に変数にセットしておく。
	var empty_rows = currentIndex;

	//全行カウント
	var all = disp.get_TEST1_count();
	var SURYO	= [];
	var TANI	= [];
	var TANKA	= [];
	var KINGAKU	= [];
	//行のステータス
	var STATUS	= [];

	//最終行をカレント行とし、空行挿入が行えるかをチェックする。
	disp.setCur_index(all-1);

			//押下行より配列へ値をセット
			for( i = currentIndex; i &lt; all; i++ ){
				//カレント行の指定
				disp.setCur_index(i);
				//添字の初期化
				var ln = i;

				//ボタン押下行の値を変数にセットしておく。※次下行にセットする。
				SURYO[ln]	= disp.get_SURYO();
				TANI[ln]	= disp.get_TANI();
				TANKA[ln]	= disp.get_TANKA();
				KINGAKU[ln]	= disp.get_KINGAKU();

				//行のステータス
				STATUS[ln]	= disp.get__Status_TEST1();
			}

			//行に値をセット
			for( i = currentIndex; i &lt; all; i++ ){

				//カレント行の指定
				disp.setCur_index(i);

				//添字の初期化
				var ln = i;
				if( i == empty_rows ){

					//挿入行を空白にする。(挿入されたかのような動作にしている。)
					disp.set_SURYO(String(&quot;&quot;));
					disp.set_TANI(String(&quot;&quot;));
					disp.set_TANKA(String(&quot;&quot;));
					disp.set_KINGAKU(String(&quot;&quot;));

					//行のステータス
					disp.set__Status_TEST1(&quot;INSERT&quot;);
				}
				else{

					//挿入行以外は値を画面にセット。
					disp.set_SURYO(String(SURYO[ln-1]));
					disp.set_TANI(String(TANI[ln-1]));
					disp.set_TANKA(String(TANKA[ln-1]));
					disp.set_KINGAKU(String(KINGAKU[ln-1]));

					//行のステータス
					disp.set__Status_TEST1(String(STATUS[ln-1]));
				}
			}
		}
	return true;
   }

基本的なコードですので、エラーチェック等々は必要です。
例えば、最終行の項目に入力値が無い状態の場合のみ行挿入を行う場合、最終行をカレント行とし、入力チェックを入れる必要があります。

//最終行をカレント行
disp.setCur_index(all-1);
if(入力チェック){
       正常処理
}
else{ 
       alert(&quot;最終行に行追加が必要&quot;);
}

ではこの辺で・・・。