2011|08|
2013|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|05|06|07|08|09|10|11|12|
2016|01|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|

2017-09-23 パソコン→SSH→ラズパイから、テレビ画面が変化したのを見て、次女が驚いていました。 [長年日記]

(昨日の続きです)

(Continuation from yesterday)

>sudo apt-get install lirc

Add the following to the last line of /boot/config.txt

>ls -l /dev/lirc0

で、デバイスファイルを確認

Check the device file

>sudo /etc/init.d/lirc stop

>mode2 -d /dev/lirc0

を押下して、リモコンを赤外線リモコンモジュールに向けて何かボタンを押してみると、色々表示されます。

Press and pointing the remote control towards the infrared remote control module and try pressing something, it will be displayed variously.

ここから学習ファイルの作成しました。

I made the learning file from here.

>irrecord -n -d /dev/lirc0 lircd.conf

(操作は、省略)

(Operation is omitted)

This is the file that I made.

Here is a hard copy.

バファローDVRーW1V2/1.0T HDDレコーダーのリモコンが壊れた人は、このデータを使って下さい。

The person who Buffalo DVR - W1V2 / 1.0T Person broke, can use this data.

Here is /etc/lirc/hardware.conf after change

学習が正常に取り込めたかどうかは、このコマンドで確認できます

You can use this command, if this learning was successfully works.

>irw

で、irsendが上手く動かないので(という事実と報告、多数)、以下の2つの画面を上げて、動作を確認する。

So, since irsend does not work well (facts and reports, many), make the following two screens and check the operation.

と、

and

-----

あとね、"reboot"では、なんかデバイスリセットできないみたいですよ。

Also, it seems that you can not reset the device somewhere in "reboot".

私の場合、ネットワークのリセットもできないので、電源切った後で、SDカードの差し入れもしました。

Since I can not reset the network in my case, I also re-inserted the SD card after turning off the power.

ハードウェア系は、色々トラブル多いですよ。

Hardware system has many troubles.

-----

パソコン→SSH→ラズパイから、テレビ画面が変化したのを見て、次女が驚いていました。

From the PC → SSH → Razpai, the second daughter was surprised to see the TV screen changed.


2017-09-22 で、あわてて、ラズパイで、学習リモコンを作ることにしました。 [長年日記]

以前、バファローDVRーW1V2/1.0T HDDレコーダーのリモコンが壊れ、代用品を注文したことがあるのですが、今度も壊れかけたら ―― 「リモコン発売終了」 P

reviously, when the remote controller(RC) of Buffalo DVR - W1V2 / 1.0T HDD recorder broke, I ordered a substitute RC. This time the RC also broke again but - "The RC "Remote release finished"

真っ青になりました。

I looked pale.

で、あわてて、ラズパイで、学習リモコンを作ることにしました。

So, in haste, I decided to make a learning RC with "Raspverry PI".

久々に、秋葉原の「秋月電子通商」に行ってきましたが、―― 最近、秋葉原は、輪をかけて「気持ち悪く」なっています。

I went to "akizukidenshi company" in Akihabara for a long time. Recently, Akihabara has become "uncomfortable" more and more.

『私は、秋葉原に部品を買いに来ただけです』と記入された、そういうシャツ売っていないかな。

I wonder if someone try to make a shirt, printed "I have just come to buy electric-parts in Akihabara"

メイドさん。お願いですから、私の歩く方向を塞がないで下さい。

Hi, Maid-san . Please do not close my walking direction.

-----

●欲しい赤外線リモコン受信モジュール"GP1UXC41QS"を1つ ―― だけど、5個セット(250円)だったし

- I wanted one infrared remote control reception module "GP1UXC41QS" - but it was a set of 5 pieces (250 yen) (残り4個)

●欲しい赤外線LED "OSI5LA5113A"は1つ ―― だけど、10個セット(100円)だったし

- I wanted one infrared LED "OSI5LA5113A" - but it was a set of 10 pieces (100 yen) (残り9個)

●欲しいトランジスタ "2SC1815Y"は1つ ―― だけど、10個セット(80円)だったし

- I want one transistor "2SC1815Y" - but it was a set of 10 pieces (80 yen) (残り9個)

●欲しい抵抗1/4W 100Ω、10KΩ は1個づつ ―― だけど、100個セット(100円だし)だったし(残り99個)

- I wanted one 1/4 W 100 Ω, one 10 K Ω - but it was 100 set (100 yen)

誰か、1個づつ1セット部品欲しい人いたら差し上げますので、切手代として100円玉を、私に送付して下さい。

If someone wants one set parts one by one, I will give it, so please send me a 100 yen coin as stamp fee.

-----

This is the circuit diagram.

This is the circuit picture.

(続く)

(To be continued)


2017-08-23 Androidとパソコンを繼ぐ方法 [長年日記]

MTPモードにする方法

USBを差す→ステータスバーを下向きにドラッグ →USBに関する通知パネルが表示される→ MTPを選ぶ


2017-08-17 泉小さん還暦をお祝いする会 進行スケジュール案 [長年日記]


2017-08-10 Windowsでexeの実行時間をざっくり測りたい [長年日記]

echo %time% & hogehoge.exe > nul & echo %time%


2017-08-09 windowsでunix系の/dev/nullみたいなことをしたい [長年日記]

hogehoge.exe > nul


2017-08-08 シミュレーションプログラム「バーチャル株式会社 エバタ 」 [長年日記]

/*
  gcc -g hiseiki.cpp -o hiseiki
*/
 
/*
  まず「基本形」 普通の会社を想定する 
  
  景気の波がある
 
  非正規雇用はいつでも解雇できる。
  正規雇用は解雇できない。
 
  必要な労働力は人数で換算できる。
  景気の波は
 
  景気循環には、3~4年周期の「キチンの波」、約10年周期の「ジュグラーの波」、20~30年周期の「クズネッツの波」、約50年周期の「コンドラチェフの波」の四種類があるとされ、それぞれ、在庫投資、設備投資、建設投資、技術革新が原因とされてきた。しかし、これらの周期性の計測や、因果関係に確定的な根拠があるわけではない。現在のところ確実に観測できるのは約4年周期の波だけで、しかも設備投資がそれを主導するように同調的に変動している。周期問題の分析は今後の課題に残されている。
 
  今回は、約10年周期の「ジュグラーの波」を採用する。
 
  企業の寿命は考えない。雇用期間は20歳から60歳までの40年
 
  一人の人間が生み出す利益は、年齢とともに単調的に増加する(長期雇用のメリット)
  一人の人間の人件費も年齢と共に単調的に増加する
  
  年齢に応じて100人いるとすると4000人
  提供労働力は、年齢に応じて増えていく(給料も増えるが、能力はそれを超えると考える)
  需要労働力は、変動する
 
  需要労働力に対して、提供労働力が大きいと、損害になる 1200円→2400円 2倍
  需要労働力に対して、提供労働力が小さいと、(競争に負けるので)、やはり損害になる
  需要労働力と、提供労働力が一致していることが望ましい
 
  正規社員 1.25 → 2.50  (http://www.mhlw.go.jp/file/06-Seisakujouhou-11650000-Shokugyouanteikyokuhakenyukiroudoutaisakubu/0000120286.pdf)
  非正規社員 1.00 のまま
 
  その金が支払われるのは、その能力がある(あるいは教育に投資をしていると仮定する)
 
  正規社員は退職せず、非正規社員は問答無用で解雇できるものとする
 
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h> 
 
 
 
typedef struct person{
  int age;  // 20歳~60歳 のいずれか
  int position;  // 1:正規社員 0:非正規社員
  double productivity;  // 生産力 正規社員の場合 
 
  ///////////
  struct person *prev;  /* 前の構造体を示すポインタ */
  struct person *next;  /* 次の構造体を示すポインタ */ 
 
} PERSON;
 
 
typedef struct company{
  int payroll;
  double productivity;  // 会社としての生産力の合計   
} COMPANY;
 
 
PERSON *p_first_person, *p_last_person;   //社員リスト(あえてグローバルで保持)
 
// 社員用リストの先頭と終端を作成するルーチン
/*
  リストの先頭と終端をはグローバルでも良いのであるが、
  一応、メインルーチンの方で、陽に定義できるように、
  ここでは、返り値としている
*/
 
double min(double a, double b){
    if (b > a) 
        return a;
    else 
        return b;
};
 
double juglar_cycles(int year)
{
  // 10年で変動するsin周期
  // ベースとするのは2017年とする(単なる仮説)
  
  int x = (year -7) % 10;
  double y = sin( (double)x /10.0 * 2 * 3.141592654);
 
  return y;
}
  
 
 
 
void init_person_list(PERSON **p_first_person, PERSON **p_last_person)
{
  PERSON *p_top_person = (PERSON *)malloc(sizeof(PERSON));
  if(p_top_person == NULL) {
    printf("メモリが確保できません\n");
    exit(EXIT_FAILURE);
  }
  memset(p_top_person, 0, sizeof(PERSON)); // ゼロクリア
 
 
  PERSON *p_tail_person = (PERSON *)malloc(sizeof(PERSON));
  if(p_tail_person == NULL) {
    printf("メモリが確保できません\n");
    exit(EXIT_FAILURE);
  }
  memset(p_tail_person, 0, sizeof(PERSON)); // ゼロクリア
 
  *p_first_person = p_top_person;
  *p_last_person = p_tail_person;
 
  (*p_first_person)->prev = NULL;
  (*p_last_person)->next = NULL;
  (*p_first_person)->next = (*p_last_person);
  (*p_last_person)->prev = (*p_first_person);
 
  return;
}
 
// 社員オブジェクトを生成して、社員用リストに追加するルーチン
void add_person(PERSON *p_ref_person)
{
 
  PERSON *new_p_person = (PERSON *)malloc(sizeof(PERSON));
  if(new_p_person == NULL) {
    printf("メモリが確保できません\n");
    exit(EXIT_FAILURE);
  }
  memset(new_p_person, 0, sizeof(PERSON)); // ゼロクリア
  memcpy(new_p_person, p_ref_person, sizeof(PERSON)); // 引数の動的メモリの内容コピー
 
  // personの追加属性記述ここから
 
 
 
  // personの追加属性記述ここまで
 
  PERSON *p_person = p_last_person->prev;
 
  p_person->next = new_p_person;
  new_p_person->prev = p_person;
 
  p_last_person->prev = new_p_person;
  new_p_person->next = p_last_person;
 
  return;
}
 
void delete_person(PERSON *p_person)  
{
  // ポインタを貼り替えて
  p_person->prev->next = p_person->next;
  p_person->next->prev = p_person->prev;
  
  // そのメモリを解放する
  free(p_person);
 
  return;
 
}
 
 
int main()
{
  
  // 社員格納用リストの作成
  init_person_list(&p_first_person, &p_last_person); 
  
  //20歳から59歳までの正規社員、各世代100人づつ、合計4000人を作成する
  
  /////// PERSONを作成する ///////
  for (int age = 20; age < 60; age ++){
    for (int i = 0; i < 100; i++){
      
      PERSON person;
      
      person.age = age;
      person.position = 1;  // 1:正規社員 0:非正規社員
      person.productivity = 1.25 + (2.50 -1.25) / 40.0 * ((double)age -20.0); //20歳 1.25 60歳 2.50まで線形変化
      
      add_person(&person);
    }
  }
  /////// PERSONを作成する ///////  
  
  
  COMPANY company;
  
  company.payroll = 0; // 従業員数ゼロリセット
  company.productivity = 0.0; // 生産力ゼロリセット
  
  double sum_profit = 0;
  
  for ( int year = 2017; year < 2040; year++){
    
    //// 年齢を1歳加算し、定年
    // ===== PERSON ループを回す========
    PERSON* p_person = p_first_person->next;  
    while (p_person != p_last_person){
      
      p_person->age += 1;
      p_person->productivity = 1.25 + (2.50 -1.25) / 40.0 * ((double)(p_person->age) -20.0); //20歳 1.25 60歳 2.50まで線形変化
      
      if (p_person->age >= 60){ // 60歳になったら定年
        delete_person(p_person);
      }
      
      p_person = p_person->next;
    }
    // ===== PERSON ループを回す(ここまで)========
    
    //// 100人の20歳の新入社員を入社する
    for (int i = 0; i < 100; i++){
      /////// PERSONを作成する ///////
      PERSON person;
      
      person.age = 20;
      person.position = 1;  // 1:正規社員 0:非正規社員
      person.productivity = 1.25 + (2.50 -1.25) / 40.0 * ((double)person.age -20.0); //20歳 1.25 60歳 2.50まで線形変化
      
      add_person(&person);
    }
 
    /////////// ここから生産力算出ループ
 
    company.productivity = 0; // 生産力ゼロリセット
    company.payroll = 0 ; // 従業員数ゼロリセット
 
    // ===== PERSON ループを回す========
    p_person = p_first_person->next;
    while (p_person != p_last_person){
      
      company.payroll += 1 ; // 従業員数一人加算
      company.productivity += p_person->productivity; // 生産力加算
      
      p_person = p_person->next;
    }
    // ===== PERSON ループを回す(ここまで)========
    
    //printf("company.payroll = %d\n",company.payroll); // company.payroll = 4000
    //printf("company.productivity = %f\n",company.productivity); // company.productivity = 7437.500000
    
    double potential = juglar_cycles(year) * 1500.0 + 7500.0; // 景気ライン
    double border = 7000.0; // 利益のボーダー
    
    double profit = min(company.productivity, potential) - border;
    sum_profit += profit; 
    
    //printf("year = %d company.productivity = %f potential = %f profit = %f sum_profit=%f\n",year,company.productivity, potential, profit,sum_profit);
    printf("%d,%f,%f,%f,%f\n",year,company.productivity, potential, profit,sum_profit);
    
  } //  for ( int year = 2017; year < 2040; year++){
  
  return 0;
}
 
 

2017-08-07 「ローカルディスクをスキャンして修復しますか?」を非表示にする方法 [長年日記]

1.[スタート]をクリック。

2.[スタート]すぐ上の検索窓に『msconfig』と入力し、[Enter]キーを押す。

3.「システム構成」ウィンドウが表示されたら、[サービス]タブをクリック。

4. "Shell Hardware Detection"のチェックを外す


2017-07-03 「上司の帰宅が遅れると、部下の帰宅も遅れる」の仮説検証プログラム [長年日記]

/*
  g++ -g seat4.cpp -o seat4
*/
 
/*
  「上司の帰宅が遅れると、部下の帰宅も遅れる」の仮説検証プログラム
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
// 共通関数
double max(double a){
  return a;
}
 
double max(double a, double b){
  if (a > b) 
    return a;
  else 
    return b;
};
 
double max(double a, double b, double c ){
  return max(max(a,b), max(b,c)); 
};
 
double max(double a, double b, double c, double d ){
  return max(max(a,b,c), d); 
};
 
double min(double a){
  return a;
}
 
double min(double a, double b){
  if (b > a) 
    return a;
  else 
    return b;
};
 
double min(double a, double b, double c ){
  return min(min(a,b), min(b,c)); 
};
 
double min(double a, double b, double c, double d ){
  return min(min(a,b,c), d); 
};
 
 
// ファジィ表現
typedef enum scale {LESSLESS, LESS, ZERO, MORE, MOREMORE} SCALE;
 
// 前件部メンバーシップ関数(山3つ)クラス
class condition_MF3
{
private:
  double center;
  double width;
  SCALE express;
  
public:
  condition_MF3(double _center, double _witdth, SCALE _express){
    center = _center;
    width = _witdth;
    express = _express;
    
    // 使用できないファジィ表現を使った場合は止める        
    if ((express == LESSLESS) || (express == MOREMORE)){
      printf("wrong expression used \n");
      exit(0);
    }
    
  };
  double func(double _x);
};
 
double condition_MF3::func(double _x)
{
  // x,yは、メンバーシップ関数上の座標を示す
  double x = _x;
  double y = 0.0; // yの値は、必ず0以上1以下になる
  
  if (express == LESS){
    if (x <= center - width){
      y = 1.0;
    }
    else if (x <= center){
      y = - 1.0 / width * (x - center);
    }
    else{
      y = 0.0;
    }
  }
  else if (express == ZERO){
    if (x <= center - width){
      y = 0.0;
    }
    else if (x <= center){
      y = 1.0 / width * (x - center) + 1.0;
    }
    else if (x <= center + width){
      y = -1.0 / width * (x - center) + 1.0;
    }
    else{
      y = 0.0;
    }
  }
  else if (express == MORE){
    if (x <= center){
      y = 0.0;
    }
    else if (x <= center + width){
      y = 1.0 / width * (x - center);
    }
    else{
      y = 1.0;
    }
  }
  else {
    printf("wrong expression\n");
    exit(1);
  }
  
  return y;
};
 
// 前件部メンバーシップ関数(山5つ)クラス
class condition_MF5
{
private:
  double center;
  double width;
  SCALE express;
  
public:
  condition_MF5(double _center, double _witdth, SCALE _express){
    center = _center;
    width = _witdth;
    express = _express;
  };
  double func(double _x);
};
 
 
double condition_MF5::func(double _x)
{
  // x,yは、メンバーシップ関数上の座標を示す
  double x = _x;
  double y = 0.0; // yの値は、必ず0以上1以下になる
  
  if (express == LESSLESS){
    if (x <= center - 2.0 * width){
      y = 1.0;
    }
    else if (x <= center - width){
      y = - 1.0 / width * (x - (center - 2.0 * width)) + 1.0;
    }
    else{
      y = 0.0;
    }
  }
  else if (express == LESS){
    if (x <= center - 2.0 * width){
      y = 0.0;
    }
    else if (x <= center - width){
      y = 1.0 / width * (x - (center - width)) + 1.0;
    }
    else if (x <= center){
      y = -1.0 / width * (x - (center - width)) + 1.0; 
    }
    else{
      y = 0.0;
    }
  }
  else if (express == ZERO){
    if (x <= center - width){
      y = 0.0;
    }
    else if (x <= center){
      y = 1.0 / width * (x - center) + 1.0;
    }
    else if (x <= center + width){
      y = -1.0 / width * (x - center) + 1.0;
    }
    else{
      y = 0.0;
    }
  }
  else if (express == MORE){
    if (x <= center){
      y = 0.0;
    }
    else if (x <= center + width){
      y = 1.0 / width * (x - (center + width)) + 1.0;
    }
    else if (x <= center + 2.0 * width){
      y = -1.0 / width * (x - (center + width)) + 1.0; 
    }
    else{
      y = 0.0;
    }
  }
  else if (express == MOREMORE){
    if (x <= center + width){
      y = 0.0;
    }
    else if (x <= center + 2.0 * width){
      y = 1.0 / width * (x - (center + 2.0 * width)) + 1.0;
    }
    else{
      y = 1.0;
    }
  }
  
  return y;
};
 
// 後件部メンバーシップ関数(山3つ)クラス  
class action_MF3
{
private:
  double center;
  double width;
  SCALE express;
  
  double x;
  double y;
  
public:
  action_MF3(double _center, double _witdth, SCALE _express){
    
    y = 0.0; // yの値は、必ず0以上1以下になる
    
    center = _center;
    width = _witdth;
    express = _express;
    
    if (express == LESS){
      x = center - width;
    }
    else if (express == ZERO){
      x = center;
    }
    else if (express == MORE){
      x = center + width;
    }
    else{
      printf("wrong scale expression\n");
      exit(0);
    }
  };
 
  // Y座標の値を最大値で更新する  
  void func_Max(double b){
    y = max(b, y);
  };
  
  // Y座標の値をリセット(y=0)する
  void func_Reset(){
    y = 0.0;
  };
  
  // X座標を返す
  double func_X(void){
    return x;
  };
  
  // (最大値で更新された、最後の)Y座標を返す
  double func_Y(){
    return y;
  };
 
};
 
// 後件部メンバーシップ関数(山5つ)クラス  
class action_MF5
{
private:
  double center;
  double width;
  SCALE express;
  
  double x;
  double y;
  
public:
  action_MF5(double _center, double _witdth, SCALE _express){
    y = 0.0; // yの値は、必ず0以上1以下になる
    
    center = _center;
    width = _witdth;
    express = _express;
    
    if (express == LESSLESS){
      x = center - 2.0 * width;
    }
    else if (express == LESS){
      x = center - width;
    }
    else if (express == ZERO){
      x = center;
    }
    else if (express == MORE){
      x = center + width;
    }
    else if (express == MOREMORE){
      x = center + 2.0 * width;
    }
    else{
      printf("wrong scale expression\n");
      exit(-1); // 強制終了
    }
  };
  
  // Y座標の値を最大値で更新する  
  void func_Max(double b){
    y = max(b, y);
  };
  
  // Y座標の値をリセット(y=0)する
  void func_Reset(){
    y = 0.0;
  };
  
  // X座標を返す
  double func_X(void){
    return x;
  };
  
  // (最大値で更新された、最後の)Y座標を返す
  double func_Y(){
    return y;
  };
  
};
 
typedef enum post{
  HEAD = 1,  // 部長
  CHIEF = 2, // 課長
  STAFF = 3  // 平社員
} POST;
 
typedef struct person{
  int absences;  // 0:帰宅、 1:残業
  char name[10];
  int section;
  int number;
  POST post;
  double p_x;
  double p_y;
  double expected_return_time;  // 17.5(17:30)から、21.0(21:00)までの時間)
  double going_home_ratio;
} PERSON;
 
const int SECTION = 6;
const int MEMBER = 8;
const int ALL_PERSON_COUNTER = 49; // 6つの課、それぞれ8人と部長
 
PERSON person[] = {
 
  {1,"部長",-1,-1, HEAD,   0.0,             0.0},
 
  {1,"社員", 0, 0, STAFF,  3.5 + 0.0 + 0.0, -4.4 + 0.0 + 0.0},
  {1,"社員", 0, 1, STAFF,  3.5 + 0.0 + 1.2, -4.4 + 0.0 + 0.0},
  {1,"社員", 0, 2, STAFF,  3.5 + 0.0 + 2.4, -4.4 + 0.0 + 0.0},
  {1,"社員", 0, 3, STAFF,  3.5 + 0.0 + 3.6, -4.4 + 0.0 + 0.0},
  {1,"課長", 0, 4, CHIEF,  3.5 + 0.0 + 0.0, -4.4 + 0.0 + 2.0},
  {1,"社員", 0, 5, STAFF,  3.5 + 0.0 + 1.2, -4.4 + 0.0 + 2.0},
  {1,"社員", 0, 6, STAFF,  3.5 + 0.0 + 2.4, -4.4 + 0.0 + 2.0},
  {1,"社員", 0, 7, STAFF,  3.5 + 0.0 + 3.6, -4.4 + 0.0 + 2.0},
 
  {1,"社員", 1, 0, STAFF,  3.5 + 4.8 + 0.0, -4.4 + 0.0 + 0.0},
  {1,"社員", 1, 1, STAFF,  3.5 + 4.8 + 1.2, -4.4 + 0.0 + 0.0},
  {1,"社員", 1, 2, STAFF,  3.5 + 4.8 + 2.4, -4.4 + 0.0 + 0.0},
  {1,"課長", 1, 3, CHIEF,  3.5 + 4.8 + 3.6, -4.4 + 0.0 + 0.0},
  {1,"社員", 1, 4, STAFF,  3.5 + 4.8 + 0.0, -4.4 + 0.0 + 2.0},
  {1,"社員", 1, 5, STAFF,  3.5 + 4.8 + 1.2, -4.4 + 0.0 + 2.0},
  {1,"社員", 1, 6, STAFF,  3.5 + 4.8 + 2.4, -4.4 + 0.0 + 2.0},
  {1,"社員", 1, 7, STAFF,  3.5 + 4.8 + 3.6, -4.4 + 0.0 + 2.0},
 
  {1,"社員", 2, 0, STAFF,  3.5 + 0.0 + 0.0, -4.4 + 3.4 + 0.0},
  {1,"社員", 2, 1, STAFF,  3.5 + 0.0 + 1.2, -4.4 + 3.4 + 0.0},
  {1,"課長", 2, 2, CHIEF,  3.5 + 0.0 + 2.4, -4.4 + 3.4 + 0.0},
  {1,"社員", 2, 3, STAFF,  3.5 + 0.0 + 3.6, -4.4 + 3.4 + 0.0},
  {1,"社員", 2, 4, STAFF,  3.5 + 0.0 + 0.0, -4.4 + 3.4 + 2.0},
  {1,"社員", 2, 5, STAFF,  3.5 + 0.0 + 1.2, -4.4 + 3.4 + 2.0},
  {1,"社員", 2, 6, STAFF,  3.5 + 0.0 + 2.4, -4.4 + 3.4 + 2.0},
  {1,"社員", 2, 7, STAFF,  3.5 + 0.0 + 3.6, -4.4 + 3.4 + 2.0},
 
  {1,"社員", 3, 0, STAFF,  3.5 + 4.8 + 0.0, -4.4 + 3.4 + 0.0},
  {1,"社員", 3, 1, STAFF,  3.5 + 4.8 + 1.2, -4.4 + 3.4 + 0.0},
  {1,"社員", 3, 2, STAFF,  3.5 + 4.8 + 2.4, -4.4 + 3.4 + 0.0},
  {1,"社員", 3, 3, STAFF,  3.5 + 4.8 + 3.6, -4.4 + 3.4 + 0.0},
  {1,"社員", 3, 4, STAFF,  3.5 + 4.8 + 0.0, -4.4 + 3.4 + 2.0},
  {1,"社員", 3, 5, STAFF,  3.5 + 4.8 + 1.2, -4.4 + 3.4 + 2.0},
  {1,"課長", 3, 6, CHIEF,  3.5 + 4.8 + 2.4, -4.4 + 3.4 + 2.0},
  {1,"社員", 3, 7, STAFF,  3.5 + 4.8 + 3.6, -4.4 + 3.4 + 2.0},
 
  {1,"課長", 4, 0, CHIEF,  3.5 + 0.0 + 0.0, -4.4 + 6.8 + 0.0},
  {1,"社員", 4, 1, STAFF,  3.5 + 0.0 + 1.2, -4.4 + 6.8 + 0.0},
  {1,"社員", 4, 2, STAFF,  3.5 + 0.0 + 2.4, -4.4 + 6.8 + 0.0},
  {1,"社員", 4, 3, STAFF,  3.5 + 0.0 + 3.6, -4.4 + 6.8 + 0.0},
  {1,"社員", 4, 4, STAFF,  3.5 + 0.0 + 0.0, -4.4 + 6.8 + 2.0},
  {1,"社員", 4, 5, STAFF,  3.5 + 0.0 + 1.2, -4.4 + 6.8 + 2.0},
  {1,"社員", 4, 6, STAFF,  3.5 + 0.0 + 2.4, -4.4 + 6.8 + 2.0},
  {1,"社員", 4, 7, STAFF,  3.5 + 0.0 + 3.6, -4.4 + 6.8 + 2.0},
 
  {1,"社員", 5, 0, STAFF,  3.5 + 4.8 + 0.0, -4.4 + 6.8 + 0.0},
  {1,"社員", 5, 1, STAFF,  3.5 + 4.8 + 1.2, -4.4 + 6.8 + 0.0},
  {1,"社員", 5, 2, STAFF,  3.5 + 4.8 + 2.4, -4.4 + 6.8 + 0.0},
  {1,"社員", 5, 3, STAFF,  3.5 + 4.8 + 3.6, -4.4 + 6.8 + 0.0},
  {1,"課長", 5, 4, CHIEF,  3.5 + 4.8 + 0.0, -4.4 + 6.8 + 2.0},
  {1,"社員", 5, 5, STAFF,  3.5 + 4.8 + 1.2, -4.4 + 6.8 + 2.0},
  {1,"社員", 5, 6, STAFF,  3.5 + 4.8 + 2.4, -4.4 + 6.8 + 2.0},
  {1,"社員", 5, 7, STAFF,  3.5 + 4.8 + 3.6, -4.4 + 6.8 + 2.0},
};
 
double distance(PERSON* person1, PERSON* person2)
{
  double d = 0.0;
  
  d  = pow((person1->p_x - person2->p_x),2.0);
  d += pow((person1->p_y - person2->p_y),2.0);
  d = sqrt(d);
 
  if ((person1->absences == 0) || (person2->absences == 0) )
    d = 99999.9; // どちらかが不在であれば、非常に大きい距離になる
 
  return d;
}
 
int main()
{
  PERSON* cheif[SECTION+1]; 
 
  // 初期状態 (最初は個人の帰宅時間は、乱数で設定)
  for (int i = 0; i < ALL_PERSON_COUNTER; i++){
    // 各個人の帰宅時間を設定
    person[i].expected_return_time = 17.5 + (21.0 -17.5) * rand()/ (1.0 + RAND_MAX);
    //person[i].expected_return_time = 18.5;
 
    // 各課の課長を選定(後で探すのが面倒なので)
    if (person[i].post == CHIEF){
      cheif[person[i].section] = &person[i];
    }
  }
 
  person[0].expected_return_time = 22.0;
 
  /*
  for (int i = 0; i < ALL_PERSON_COUNTER; i++){
    printf("%d, expected_return_time = %f\n",i, person[i].expected_return_time);
    printf("%d, expected_return_time = %d\n",i, person[i].absences);
  }
  */
 
  // 残業時間
  condition_MF3 OverTime_Short(1.0, 1.0, LESS); // 1時間
  condition_MF3 OverTime_Middle(1.0, 1.0, ZERO); // 2時間
  condition_MF3 OverTime_Long(1.0, 1.0, MORE); // 3時間
 
  // 部長からの距離
  condition_MF5 DistanceFrom_HEAD_NearNear(5.0, 5.0, LESSLESS); // 5メートル
  condition_MF5 DistanceFrom_HEAD_Near(5.0, 5.0, LESS); // 10メートル
  condition_MF5 DistanceFrom_HEAD_Middle(5.0, 5.0, ZERO); // 15メートル
  condition_MF5 DistanceFrom_HEAD_Far(5.0, 5.0, MORE); // 20メートル
  condition_MF5 DistanceFrom_HEAD_FarFar(5.0, 5.0, MOREMORE); // 25メートル
 
  // 課長からの距離
  condition_MF5 DistanceFrom_CHIEF_NearNear(1.0, 1.0, LESSLESS); // 1メートル
  condition_MF5 DistanceFrom_CHIEF_Near(1.0, 1.0, LESS); // 2メートル
  condition_MF5 DistanceFrom_CHIEF_Middle(1.0, 1.0, ZERO); // 3メートル
  condition_MF5 DistanceFrom_CHIEF_Far(1.0, 1.0, MORE); // 4メートル
  condition_MF5 DistanceFrom_CHIEF_FarFar(1.0, 1.0, MOREMORE); // 5メートル
 
  // 残っている課の人数
  condition_MF3 Staying_COUNT_Less(2, 2, LESS); // 2人
  condition_MF3 Staying_COUNT_Middle(2, 2, ZERO); // 4人
  condition_MF3 Staying_COUNT_Many(2, 2, MORE); // 6人
 
  // 帰宅度数
  action_MF3 GoingHome_Hard(0.5, 0.5, LESS);// 帰宅度数 0.0 → 帰宅できない
  action_MF3 GoingHome_Middle(0.5, 0.5, ZERO);// 帰宅度数 0.5 → 迷う
  action_MF3 GoingHome_Easy(0.5, 0.5, MORE);// 帰宅度数 1.0 → 帰宅できる
 
  double present_time =17.5;
 
  while (present_time < 24.0){
    present_time += 0.1; // 一番後ろで加算すると忘れそうなので
    //  printf("present_time = %f\n",  present_time);
 
    // 部の中の課の全体状況の把握
 
    if (person[0].expected_return_time < present_time){  // 部長は特別あつかい
      person[0].absences = 0;
    }
 
    int staying_count[SECTION] ={}; // 各課(Section)で残っている人数を格納(最初はゼロリセット)
    
    int staying_all = 0;
 
    for (int i = 0; i < ALL_PERSON_COUNTER; i++){
      if (person[i].absences == 1){
        staying_count[person[i].section] += 1;  // (Section)に一人追加
        staying_all += 1;
      }
    }
 
    printf("%f,%d,%d,%d,%d,%d,%d,%d\n", 
           present_time, 
           staying_count[0],
           staying_count[1],
           staying_count[2],
           staying_count[3],
           staying_count[4],
           staying_count[5],
           staying_all);
    
    for (int i = 1; i < ALL_PERSON_COUNTER; i++){ // person[0]の部長は神様→誰からも影響を受けない(とする)
 
#if 1
      if (person[i].absences == 0) // 帰った人間はどーでも良い
        continue;
 
      if (person[i].expected_return_time > present_time) // 仕事中は帰らない
        continue;
#endif
 
      if (person[i].post == STAFF){ // (ヒラ)社員の場合の付加条件
        /*
          ルール3
          課長が残っている場合、課長から1.5m以内のメンバは、帰宅度数0.0
          課長から3.0m以内のメンバは、帰宅度数0.5
          課長から4.5m以内のメンバは、帰宅度数0.7
        */
        
        double dis = distance(cheif[person[i].section], &person[i]);
 
        ///////////////
        double r11 = min(DistanceFrom_CHIEF_NearNear.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r11);
 
        double r12 = min(DistanceFrom_CHIEF_Near.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r12);
 
        double r13 = min(DistanceFrom_CHIEF_Middle.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r13);
 
        double r14 = min(DistanceFrom_CHIEF_Far.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Middle.func_Max(r14);
 
        double r15 = min(DistanceFrom_CHIEF_FarFar.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r15);
        ///////////////
 
        ///////////////
        double r21 = min(DistanceFrom_CHIEF_NearNear.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r21);
 
        double r22 = min(DistanceFrom_CHIEF_Near.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r22);
 
        double r23 = min(DistanceFrom_CHIEF_Middle.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Middle.func_Max(r23);
 
        double r24 = min(DistanceFrom_CHIEF_Far.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r24);
 
        double r25 = min(DistanceFrom_HEAD_FarFar.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r25);
        ///////////////
 
        ///////////////
        double r31 = min(DistanceFrom_CHIEF_NearNear.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r31);
 
        double r32 = min(DistanceFrom_CHIEF_Near.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Middle.func_Max(r32);
 
        double r33 = min(DistanceFrom_CHIEF_Middle.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r33);
 
        double r34 = min(DistanceFrom_CHIEF_Far.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r34);
 
        double r35 = min(DistanceFrom_CHIEF_FarFar.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r34);
        ///////////////
      }
 
 
      if (person[i].post == CHIEF){ // 課長の場合の付加条件
        /*
          ルール2
          部長が残っている場合、部長から5m以内の課長は、帰宅度数0.0
          5m~10m以内の課長は、帰宅度数0.5
          10m以上の課長は、帰宅度数1.0
        */
        
        double dis = distance(&person[0], &person[i]);
        
        ///////////////
        double r11 = min(DistanceFrom_HEAD_NearNear.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r11);
 
        double r12 = min(DistanceFrom_HEAD_Near.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r12);
 
        double r13 = min(DistanceFrom_HEAD_Middle.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r13);
 
        double r14 = min(DistanceFrom_HEAD_Far.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Middle.func_Max(r14);
 
        double r15 = min(DistanceFrom_HEAD_FarFar.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r15);
        ///////////////
 
        ///////////////
        double r21 = min(DistanceFrom_HEAD_NearNear.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r21);
 
        double r22 = min(DistanceFrom_HEAD_Near.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r22);
 
        double r23 = min(DistanceFrom_HEAD_Middle.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Middle.func_Max(r23);
 
        double r24 = min(DistanceFrom_HEAD_Far.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r24);
 
        double r25 = min(DistanceFrom_HEAD_FarFar.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r25);
        ///////////////
 
        ///////////////
        double r31 = min(DistanceFrom_HEAD_NearNear.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r31);
 
        double r32 = min(DistanceFrom_HEAD_Near.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Middle.func_Max(r32);
 
        double r33 = min(DistanceFrom_HEAD_Middle.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r33);
 
        double r34 = min(DistanceFrom_HEAD_Far.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r34);
 
        double r35 = min(DistanceFrom_HEAD_FarFar.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r34);
        ///////////////
      }
      
 
#if 0     
      /*
        ルール4
        同じ課のメンバのの人数が、6人以上残っている場合は、帰宅度数0.3
                              4人残っている場合は、帰宅度数0.6
                              2人以下の場合は、帰宅度数1.0
      */
 
      int num = staying_count[person[i].section];
      double r41 = min(Staying_COUNT_Less.func((double)num));
      GoingHome_Easy.func_Max(r41);
      
      double r42 = min(Staying_COUNT_Middle.func((double)num));
      GoingHome_Middle.func_Max(r42);
      
      double r43 = min(Staying_COUNT_Many.func((double)num));
      GoingHome_Hard.func_Max(r43);
 
#endif
 
      /*
        ルールに振れない場合は、min-max重心法の分母がゼロになり、
        ゼロ割が発生する場合がある為、それを回避する
      */
      double denominator =  // 分母
        GoingHome_Easy.func_Y() + 
        GoingHome_Middle.func_Y() +
        GoingHome_Hard.func_Y();
 
      double numerator =  // 分子   
        GoingHome_Easy.func_X() * GoingHome_Easy.func_Y() + 
        GoingHome_Middle.func_X() * GoingHome_Middle.func_Y() +
        GoingHome_Hard.func_X() * GoingHome_Hard.func_Y();
 
      // 推論結果 (分母がゼロの場合は、推論結果は前回と同値とする)
      if ( denominator != 0.0){
        person[i].going_home_ratio =  numerator / denominator ;
 
        /*
        if ((present_time >= 18.5) && (present_time < 18.52)){
          printf("%d: person[i].going_home_ratio=%f\n",i, person[i].going_home_ratio);
        }
        */
 
      }      
 
      if (person[i].going_home_ratio > 0.75){
        person[i].absences = 0;  // 0:帰宅、 1:残業        
      }
 
      // 後件部メンバーシップ関数のリセット(ループさせる時は必ずリセットする)
      GoingHome_Easy.func_Reset();
      GoingHome_Middle.func_Reset();
      GoingHome_Hard.func_Reset();
    }
  }
 
  /*
  for (int i = 0; i < ALL_PERSON_COUNTER; i++){
    printf("%d, absences = %d\n",i, person[i].absences);
  }
  */
  
  return 0;
}
 

2017-07-02 特許出願の審査経緯を見たい時の手続 [長年日記]

(Step.2) 自分の名前を入れて「検索」をクリックする

(Step.3) 「一覧表示」をクリックする

(Step.4) ターゲットの特許出願をクリックする

(Step.5) 「経過情報」をクリックする

(Step.6) 「審査書類情報」をクリックする

(Step.7) 参照可能書類リストから、ターゲットのもの(例:"2016/02/23 :拒絶理由通知書")をクリックする

例えば、「意見書」とか「拒絶理由通知書」とか「手続補正書」とかを読める

(もちろん、「みなし取り下げ」になっている出願については、何も出ていこない)

以上