OmniAICreator/Qiita-1.07M huggingface dataset:
Javaフレームワーク比較

#Javaのフレームワーク
Javaのフレームワークといっても様々な物が色々なフレームワークがある。
・Struts
・JSF
・SpringBoot, SpringFramework
・PlayFramework
・Java EE
いったものがあるが今回は有名な物の中からSpringFramework、PlayFrameworkの二つについて比較した。

#SpringBootの特徴
[SpringBoot HomePage](https://projects.spring.io/spring-boot/)
　Javaプラットフォーム向けのアプリケーションフレームワークであるSpring FrameworkをWebアプリケーション開発向けに特化させたものである。Spring Frameworkで必要だったConfigファイルの設定が不要であり、ほとんどの設定を自動化されており、クラスパスの指定なども不要である。

#PlayFrameworkの特徴
[PlayFramework HomePage](https://www.playframework.com)
　JavaとScalaで書かれているオープンソースのWebアプリケーションフレームワークであり、MVCモデルが採用されている。Ruby on RailsやDjangoの影響を大きく受けているため、これらと似た点が数多くある。

#２つを評価・比較
評価基準は下記を参照
[評価基準](https://qiita.com/sangi/private/7c2270fb6607959a49b4)

#SpringBoot
###使用感
 Springでは、通常MVCモデルは実装されていないため、独自性が高い使用感となる。ただし、プラグインである「SpringMVC」を使用することでMVCモデルでの開発することができる。

###拡張性
 Springでは、STSというSpring専用のIDEが存在するが、プラグインの具対数は不明。しかし専用のIDEが存在するため、拡張性は非常に高い。

###日本語資料数
Springの資料数は約130件だったため標準である。

#PlayFramework
###使用感
 PlayFrameworkはMVCモデルを使用しているため、使用感は一般的である。またJavaの言語知識がなくてもプログラム構造が理解できる。
###拡張性
 Playframeworkではプラグインの具対数は出てこなかった。またプラグインの利用方法など記述されていなかったため、フレームワークの拡張性は低い。
###日本語資料数
 Playframeworkの資料数は約105件だったため標準である。

#2つのフレームワークのセキュリティ
![java.png](https://qiita-image-store.s3.amazonaws.com/0/206600/ed797bbe-7410-95ff-6989-de7bc73d63e7.png)
　Javaのフレームワークでは、Playセキュリティレベル2、Springがセキュリティレベル4という結果なった。この結果からPlayはセキュリティ水準が高く、Sprigはセキュリティ水準が低いと言える。SpringはSQLインジェクションがリスクレベルhighで検出された。ユーザ自身で、エスケープ処理で対策する必要がある。
　Playはリスクレベルhighの、脆弱性は検出されなかった。Playはバージョン1.0.1以降のテンプレートでは、自動的にエスケープ処理を行ってくれる仕様となっており、application.confファイルでescapelnTemplates有効にすることで自動エスケープ処理を行ってくれる。そのため、クロスサイトスクリプティングやSQLインジェクションといった脆弱性に強いと言える。自動的に行ってくれる点から開発者が意識しなくてもセキュリティ対策を施してくれるため、Springよりもセキュリティレベルが高い。

#総合比較
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206600/bb507b61-f78e-b97f-d864-7e266a622b91.png)
  今回の評価結果から、フレームワークでとりあえずWebアプリケーションを開発したいのなら「PlayFramework」を薦める。拡張性があまりなく、多機能ではないが、その分Webアプリケーションに特化しており、使用しやすいだろうと考える。
　また、高機能でセキュリティや、ネイティブアプリケーション開発に重点を置いた開発するならSpringBootをおすすめする。SpringBoot以外に様々なプラグインや別のフレームワークが存在する。そのためすべてと互換性を持つため、開発の幅が広い。それらを組み合わせて高機能なアプリケーションを開発したい、言語知識が高い人はSpringBootを薦める。
rbenvでruby最新バージョンを設定する


## まえがき

久々にrubyを使うことになり、最新版を使おうとrbenvのコマンドを叩いたら、2.4.1までしか出てこない。

あれ、最新版って2.5だよね？と思い、インストール方法等を調べた備忘録です。

前提として、

- Homebrew
- rbenv
- ruby-build

はインストール済みです。

※Homebrewのインストールから始める方は[こちらの記事](https://qiita.com/issobero/items/e0443b79da117ed48294)を参照ください。

## 作業スタート

まずはHomebrewをアップデート 

```
brew update
```

次はruby-buildをアップデート

```
brew upgrade ruby-build
```

これでインストール可能なバージョンが更新されました

```
rbenv install -l
# rubyのバージョンがずらっと表示される。2.5.0あるはず
```

2.5.0をインストール


```
rbenv install 2.5.0
```

無事インストールできたか確認

```
rbenv versions
# インストール済みのバージョンが表示される
#  system
#  2.1.0
#  2.1.10
#  2.1.9
#  2.3.1
#  2.3.3
# * 2.4.1
#  2.4.2
# 2.5.0 (set by /Users/katouhiroshi/.rbenv/version)
```

システム全体で使用するバージョンを2.5.0に指定

```
rbenv global 2.5.0
```

きちんと設定されているか確認

```
ruby -v
# ↓のように表示されればOK
# ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin17]

```

これで無事ruby2.5を設定できました。

## 参考

[rbenvをupdateして最新のRubyバージョンをインストール](https://qiita.com/suzuki_koya/items/4f4a7ee8e36b299931b5)
Pythonフレームワークの比較

#Pythonのフレームワーク
　pythonにも他のプログラミング言語と同様に、様々なフレームワークが存在する。

・Bottle
・Django
・Flask
・Tornado
・CherryPY
・Pyramid
・Plone

　Pythonには以上のようなフレームワークが存在するが、初心者向けであるBottleと有名なDjangoを比較した。

#Bottleの特徴
[公式サイト](http://bottl-translate-ja.readthedocs.io/en/latest/)
　PythonのWebフレームワークであり、bottle.pyという1つのファイルで構成されていて、他のライブラリへの依存がないのが特徴。構造が非常にシンプルで初心者にも使いやすいフレームワークとなっている。大規模な開発より、小規模で簡単Webアプリケーション作成に向いているフレームワークである。

#Djangoの特徴
[公式サイト](https://www.djangoproject.com/)
　実用性が高いのが特徴で、Webアプリケーション開発でよく使われる「ユーザ認証」「管理画面」「サイトの案内ページ」「RSSフィード」といった機能が標準で含まれている。開発実績もあり、InstagramやPinterstといったWebアプリの開発にもDjangoが使われている。

#２つを評価・比較
評価基準は下記を参照
[評価基準](https://qiita.com/sangi/private/7c2270fb6607959a49b4)

#Bottle
###使用感
　Bottleでは、MVCモデルを使用していないため、独自にオブジェクト指向型の設計を行う必要がある。そのため他のフレームワークと比べて独自性が高い。

###拡張性
　Bottleはプラグインが約14しか存在しないため拡張性は非常に低い。


###日本語資料数
　Bottleの資料数は約80件と少なく、英語資料の方が多いため日本人が開発を行うにはハードルが少し高い。

#Django
###使用感
　Djangoでは、MVCモデルではなくMTV(Model, Template, View)モデルを採用している。双方類似している部分はあるが、CakePHPが、独自性が高い使用感となる。

###拡張性
　Djangoは約1500 のプラグインが存在し、拡張性が非常に高く幅広い開発を行うことができる。

###日本語資料数
　Djangoの資料数は約500件と非常に多く、日本人でも開発が行いやすい。

#2つのフレームワークのセキュリティ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206600/3e90f885-cd06-c93b-64ae-65f0b325cb9f.png)

　Bottleでは、SQLインジェクションがリスクレベルhighで検出された。コードの自動生成がないため、バインド機構やエスケープ処理などのセキュリティコードもユーザ自身が記述する必要がある。
　Djangoではディレクトリトラバーサルがリスクレベルhighで検出された。使用したバージョンは2.0.1であるが、これよりも古いバージョン（1.4.7や1.5.3）でもディレクトリトラバーサルの脆弱性の報告があった。このことから、フレームワークのバージョンアップだけでは対策としては不十分である可能性がある。対策としては、まず最新のバージョン（バージョン2.0.2  2018年2月現在）へアップデートする。
　他にもフレームワークに頼らない一般的な対策として、ユーザ自身が外部からファイル名を指定できないようにファイル名の固定や、ファイル名を番号に変換し間接指定するように仕様を変更する。ファイル名にディレクトリ名を含まないようにする。ファイル名を英数字に限定し、攻撃で使われる記号文字の影響を受けないようにするなどの対策を施す必要がある。

#総合比較
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206600/6950cd74-890e-1a20-807e-748a1ced107d.png)
　Bottleの導入はDjangoより簡易的に行えるが、拡張性が極端に低い。理由としては、Bottleが提供するプラグイン数は少ないが、独自でプラグインを開発できるため少ないのではないか。またBottleは初心者向けのフレームワークだが、Djangoより有名でないため、プラグインの開発数やプラグインを提供元が少ないと考える。
またプログラム構造ではMVCモデルを使用していないため、大規模プロジェクトには向いていない。ただし、簡易的なアプリケーションを作成する際は、導入が簡易的に行うことができ、処理が速いため言語知識の実践学習に向いていると考える。
　Djangoは日本語資料が非常に多く、日本人でもプログラム開発を快調に進めることが出来る。ただし、MVCモデルではなく、MTVモデルを使用するため、既存の知識だけではフレームワークの使用は難しいDjango専用の知識・技術を深める必要がある。Bottleで言語知識を習熟し、Djangoを使用することで、プログラム開発が快調に進むと考える。
もっと簡単に exports と module.exports の違い

# 1. 使い分け

- `exports` は const だと思った方が良い (常に `exports.hoge = fuga;` の形で使う)
- `module.exports` は自由
- モジュール内で併用しない

これらの条件を守っていれば、どちらを使っても同じ。
class をまるっと入れたいときは `module.exports` になる。

# 2. 仕組み

```js:イメージ
let a = {}; /* module.exports */
let b = a;  /* exports */
// 
b.foo = 'foo';
// 
a = {bar: 'bar'}
// 
return a;
```

- `b` に新しいオブジェクトを入れても反映されない
- `a` に新しいオブジェクトを入れると `b` が無視される
- どちらも新しいオブジェクトを入れなければ両方反映 (でも、統一したほうが見やすい)

参考「[exports と module.exports の違い - Qiita](https://qiita.com/kuboon/items/cb1b532ac8a8959973b2)」
参考「[Node.js : exports と module.exports の違い（解説編） - ぼちぼち日記](http://d.hatena.ne.jp/jovi0608/20111226/1324879536)」

# 3. 循環参照の対策

以下のいずれか。

- `module.exports` の参照を破壊しないで使う
- `exports` を使う ( = 参照を破壊しない)
- `module.exports` の参照を `require()` 前に書き換える
- ソースコードの先頭ではなく使うときに  `require()`
- 「依存性の注入 (Dependency injection)」

参考「[exports と module.exportsの使い分け - Qiita](https://qiita.com/you21979@github/items/775d4f9da7ea033efdbf)」
参考「[webpackなどでCommonJSモジュール循環参照を回避する方法 - Qiita](https://qiita.com/kenshiroh/items/50711990b9380403e138)」
参考「[node.jsにおける循環参照に対処するための3つの方法 - Qiita](https://qiita.com/gologo13/items/b026f7debdd80c08d499)」

# 4. おまけ

`exports` だけでなく `module` も似た感じなので、オブジェクトをまるっと入れるとまずい。
(`module = {exports: {hoge: fuga}};` は意味がない)

```js:require()&nbsp;疑似コード
function require(/* ... */) {
  const module = { exports: {} };
  ((module, exports) => {
    // ... モジュールのコード
  })(module, module.exports);
  return module.exports;
}
```

参考「[exports shortcut - Modules | Node.js v9.6.1 Documentation](https://nodejs.org/docs/latest/api/modules.html#modules_exports_shortcut)」
Jenkins-Slave追加時にAccessDeniedでエラーとなった際の対応メモ

Windowsにスレーブエージェントを追加の際に以下のようなメッセージが表示された場合

\========================================================================
[JenkinsWorkDirectory]$ c:\JenkinsWorkDirectory\jenkins-slave.exe install
WMI.WmiException:AccessDenied
at WMI.WmiRoot.ClassHandler.Invoke(Object proxy, MethodInfo method, Object[] args)
at WMI.Win32ServicesProxy.Create(String, String, String, ServiceType, ErrorControl, StartMode, Boolean, String, String, String[])
at winsw.WrapperService.Run(String[]_args,ServiceDescriptor descriptor)
at winsw.WrapperService.Main(String[]args)

I launch the slave as java web start and when I try to install it from service it doesnt work. 
Tried the same thing on windows 7 and it works without any issue there.
\========================================================================

管理者権限のインストールが必要なため、以下のコマンドで実行する。

\> "C:\Program Files (x86)\Java\jre1.8.0_161\bin\javaws.exe" slave-agent.jnlp
Raspberry Pi > C > ミリ秒待つ処理 > test_delay_180301.c | wait_msec_nsec_180301.cと.h > 3.8kHz (260usec)

```
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
```

組込みCでの移植も考えて、RPi上でC実装をしている。
ナノ秒とミリ秒待つ処理はどのように実装するのか?

### 参考

[指定された時間だけ停止する](http://www.c-lang.net/nanosleep/index.html) @ c-lang.net

情報感謝です。

### code v0.1

上記の情報を参考に、以下を実装してみた。

```test_delay_180301.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MILLI_SEC (1000000)

void wait_millisecond(int wait_msec)
{
	int loop;
	struct timespec req = {0, MILLI_SEC};
	
	for(loop=0; loop < wait_msec; loop++) {
		nanosleep(&req, NULL);
	}
}

void wait_nanosecond(int wait_nsec)
{
	int loop;
	struct timespec req = {0, 1};
	
	for(loop=0; loop < wait_nsec; loop++) {
		nanosleep(&req, NULL);
	}	
}

int main(void)
{	
	printf("start\n");
	wait_nanosecond(10);
	printf("next\n");
	wait_millisecond(3000);
	printf("end\n");
	return 0;
}
```

```txt:run
$ ./test_delay_180301 
start
next
end
```

期待通りの「待ち」処理になっているようだ。

nanosleep()の失敗時(-1が返る)の対応はしていない。


### code > 外部ソース化

以下のように外部ソース化した。

- wait_msec_nsec_180301.h
- wait_msec_nsec_180301.c
- test_delay_180301.c

```wait_msec_nsec_180301.h
#ifndef __WAIT_MSEC_NSEC_180301_H
#define __WAIT_MSEC_NSEC_180301_H

void Wait_millisecond(int wait_msec);
void Wait_nanosecond(int wait_nsec);

#endif
```

```wait_msec_nsec_180301.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/*
 * v0.1 2018/03/01
 *   - add Wait_nanosecond()
 *   - add Wait_millisecond()
 *   - add [MILLI_SEC]
 */

#define MILLI_SEC (1000000)

void Wait_millisecond(int wait_msec)
{
	int loop;
	struct timespec req = {0, MILLI_SEC};
	
	for(loop=0; loop < wait_msec; loop++) {
		nanosleep(&req, NULL);
	}
}

void Wait_nanosecond(int wait_nsec)
{
	int loop;
	struct timespec req = {0, 1};
	
	for(loop=0; loop < wait_nsec; loop++) {
		nanosleep(&req, NULL);
	}	
}
```

```test_delay_180301.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "wait_msec_nsec_180301.h"

int main(void)
{
	printf("start\n");
	Wait_nanosecond(10);
	printf("next\n");
	Wait_millisecond(3000);
	printf("end\n");
	return 0;
}
```

```txt:run
$ gcc wait_msec_nsec_180301.c test_delay_180301.c 
$ ./a.out 
start
next
end
```

### 時間精度

RPiのGPIO26でH,LレベルをWait_millisecond(5)で変化させてみた。
それをオシロスコープで測定 (Tektronix TPS 2024)。

5.6msecの変化となった。

### bug

Wait_nanosecond(50);
実行時にオシロスコープでは4msecの変化となるバグがあるようだ。

Wait_microsecond(5);
を追加し、実行時にオシロスコープでは560usecの変化であった。

### Wait_millisecond()のみ使用可能

Wait_millisecond()のみが使用可能のようだ。

関連: [電子工作 > RPi / GPIO / デジボル > 周波数計測ができない > 100HzはOK, それより速いのがおかしい > time.sleep()後の待ちの蓄積だろうか?](https://qiita.com/7of9/items/d4c2ec34c368569e0882)

> > The Linux kernels tend to have a higher tick rate, where the intervals are generally closer to 1 millisecond.

> 1msec程度までしかだめかもしれない。


### 3.8kHz (260usec)

nanosleep()でtv_nsec=1とした場合の時間は、RPiにて260usecであることがオシロスコープの測定から分かった。
(環境によって変わるかもしれない）。

260usec は 3846Hz = 3.8kHz
クロックで考えると、この半分の1.9kHzとなる。
(クロックのようにH,Lを繰り返した時、最初が260usecで、以降は160usecの間隔になった）。

I2C通信で一般的に使われるのは100kHzや400kHz。
モーダルウィンドウメモ



```javascript
$(function(){

//モーダルウィンドウを出現させるクリックイベント
$("div").click( function(){

  //キーボード操作などにより、オーバーレイが多重起動するのを防止する
  $( this ).blur() ;  //ボタンからフォーカスを外す
  if( $( "#modal-overlay" )[0] ) return false ;   //新しくモーダルウィンドウを起動しない (防止策1)
  //if($("#modal-overlay")[0]) $("#modal-overlay").remove() ;   //現在のモーダルウィンドウを削除して新しく起動する (防止策2)

  $('.over-block').fadeIn( "slow" ) ;

  //オーバーレイを出現させる
  $( "body" ).append( '<div id="modal-overlay"></div>' ) ;
  $( "#modal-overlay" ).fadeIn( "slow" ) ;

  $('#modal-overlay').css({
    'background': 'linear-gradient(transparent 0% ,transparent 100%)'
  });

  //コンテンツをセンタリングする
  centeringModalSyncer() ;

  //コンテンツをフェードインする
  $( "#modal-content" ).fadeIn( "slow" ) ;

  //[#modal-overlay]、または[#modal-close]をクリックしたら…
  $( "#modal-overlay,#modal-close" ).unbind().click( function(){

    //[#modal-content]と[#modal-overlay]をフェードアウトした後に…
    $( "#modal-content,#modal-overlay,#modal-close" ).fadeOut( "slow" , function(){
       $('.over-block').fadeOut( "slow" ) ;
      //[#modal-overlay]を削除する
      $('#modal-overlay').remove() ;

    } ) ;

  } ) ;

} ) ;



//リサイズされたら、センタリングをする関数[centeringModalSyncer()]を実行する
$( window ).resize( centeringModalSyncer ) ;

  //センタリングを実行する関数
  function centeringModalSyncer() {

    //画面(ウィンドウ)の幅、高さを取得
    var w = $( window ).width() ;
    var h = $( window ).height() ;

    // コンテンツ(#modal-content)の幅、高さを取得
    // jQueryのバージョンによっては、引数[{margin:true}]を指定した時、不具合を起こします。
//    var cw = $( "#modal-content" ).outerWidth( {margin:true} );
//    var ch = $( "#modal-content" ).outerHeight( {margin:true} );
var cw = $( "#modal-detail-content,#modal-localCuisine-content" ).outerWidth();
var ch = $( "#modal-detail-content,#modal-localCuisine-content" ).outerHeight();

    //センタリングを実行する
    $( "#modal-detail-content,#modal-localCuisine-content" ).css( {"left": ((w - cw)/2) + "px","top": ((h - ch)/2) + "px"} ) ;

  }

});/*$(function(){*/
/*↑----------モーダル----------↑*/
```
サイネージ、トップからの遷移メモ

サイネージのトップページから遷移する方法
どこかの要素をクリック、もしくはYキーを取得

```javascript

/*↓----------topクリック----------↓*/
$(function(){
    $(".tap-move").click(function() {
      setTimeout(function(){
        window.location.href = 'xxxx.html';
      }, 800);
          //window.location.href = 'xxxx.html';
    });
/*↑----------topクリック----------↑*/


/*↓----------Yキーで遷移----------↓*/
document.onkeydown = pageMove;
function pageMove(){
  if (event.keyCode == 89){  //「Y」が押されたか確認
    setTimeout(function(){
        window.location.href = 'xxxx.html';
      }, 800);
    //window.location.href = 'xxxx.html';
  }
}
/*↑----------Yキーで遷移----------↑*/

});
/*↑----------topからの遷移----------↑*/

```
ふわっとページ遷移メモ

ページ遷移がふわっとする

```javascript


//ページ遷移ふわっと
  $('head').append(
    '<style type="text/css">.is-hide{display:none;}</style>'
  );

  $(window).on("load",function() {
    $('body').fadeIn(800).removeClass("is-hide");
  });

  $(window).on("pageshow",function() {
    if (event.persisted) {
      window.location.reload();
    }
  });

  $(function(){
    $('a.fadelink').on("click",function() {
      var url = $(this).attr('href');
      if (url != '') {
        $('body').fadeOut(800);
        setTimeout(function(){
          location.href = url;
        }, 800);
      }
      return false;
    });
  });

```
複数のリポジトリに同時pushする

### リポジトリの追加

追加したいプロジェクト下で以下を実行

```
git remote add origin url
git remote set-url --add origin another_url
```

### .git/configにsetされているか確認

以下のように追加されていればok!

```
 [remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = url
    url = another_url
```

### 通常通りpushする

```
git push origin master
```
Raspberry Pi > editor > geany > Cの実装に使ってみる

```
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
```

RPiにおいてSublime Textを使おうとしていた。

https://forum.sublimetext.com/t/sublime-text-for-raspberry-pi-3-with-rasbian-os/21066/11
を見ていると

> OdatNurd Jun 2016
Raspberry Pi's (even the 3) run on ARM processors and per this thread (and this response from jps in that thread) , ARM support is not likely.

状況が変わっているかもしれないが、他のエディタとしてgeanyが紹介されている。

以下でインストールができた。

```
$ sudo apt-get install geany
```

- C言語のソースに関して、idleで実装していた時と比べてsyntax highlightingが使える
    - 読みやすくなった
- FunctionsやMacrosのリストも表示され、使いやすいかもしれない
- ショートカットは「Ctrl+Sで保存」など使い慣れたものである
- Compileで.oファイルの生成
- Buildで実行ファイルの生成
- 他のエディタによるファイル編集後、ファイルのリロードは自動で行われない
    - タブでそのファイルを選択時、リロードの確認ダイアログが表示される
- 文字列を選択時のCtrl+cとCtrl+vは一般的な「上書き」になる
    - 一方で、IDLEにおいては「挿入」になる
- ヘッダでインクルードした関数の入力補完機能がある
    - コーディングに便利
PHPでの大容量ファイルの取り扱い（メモ）

# 概要
PHPでのファイルの取り扱い
容量が多き過ぎるとPHPの最大メモリ数の許可をいくら大きくしたところで、メモリが不足してしまう
ポインタを使用すればメモリを気にしなくて済むため、容量があまりに大きいファイルを扱う時用のメモ

# コード
## 先頭からファイルを書き換える
```php
$text = 'Test Message' . PHP_EOL;

$fp = fopen($path, 'r+');
fwrite($fp, $text);
fclose($fp);
```

## 特定の位置を書き換える
```php
$offset = strlen($text);

$fp = fopen($path, 'r+');
fseek($fp, $offset);
fwrite($fp, $text);
fclose($fp);
```

## 特定の位置（後ろ）から書き換える
```php
$offset = (strlen($text) + 1) * (-1);

$fp = fopen($path, 'r+');
fseek($fp, $offset, SEEK_END);
fwrite($fp, $text);
fclose($fp);
```

## 最後のタグを取り除いて書き換える
```php
$tag = '</html>';
$offset = (strlen($tag) + 1) * (-1);

$fp = fopen($path, 'r+');
fseek($fp, $offset, SEEK_END);
fwrite($fp, $text);
fwrite($fp, PHP_EOL . $tag);
fclose($fp);
```
Excel編集Tips(Excelオブジェクト一括選択と削除)

# Excelのオブジェクトを削除
1. F5をクリックする。
2. Alt+S[セル選択(S)]をクリックする。
3. B[オブジェクト(B)]をクリックし、[OK]をクリックする。
4. シート状のオブジェクトが全選択されるので、[Delete]ボタンをクリックして削除する。
PHP(Linux)からPlantUMLを利用すると日本語が空白になる→数値文字参照で解決

# 現象
PlantUML出力画像が以下の状態
・日本語が表示されない
・化けないで出てくる
・表示領域（文字数）のObjectはでてくる
・フォント原因でよくある豆腐文字は出てこない。空間があるだけ
・Windowsではうまくいく

# コードとか
```
proc_openでplantuml.jar -pを起動して
fwrite($pipes[0], $input);標準入力で文字を渡して
標準出力で画像をもらって・・・
```
ってことをやってた

ためしに
環境かも？とおもいターミナルで実行したら（ファイル渡し）
日本語が表示される・・・

# 解決
数値文字参照で渡してあげると日本語が表示できた。
```
$input=mb_convert_encoding($input, 'HTML-ENTITIES', 'UTF-8');
```

たぶんUTF-8標準入力渡しがダメっぽいので数値文字参照で渡してあげる
JupyterLab（β）をjupyterの公式Dockerイメージを使ってサクッと試す

https://qiita.com/some-nyan/items/a4353cde6939e2dce351
を書いたあと、JupyterLabのβリリースがされていることに気づいてしまった。。。

# JupyterLab

Jupyterの進化系、
Jupyterの機能に加えて、ファイルエクスプローラやコンソールも統合され
より統合開発環境として進歩している。

# Jupyterの公式DockerイメージとJupyterLab

https://hub.docker.com/u/jupyter/

用途ごとに `*-notebook` というDockerイメージが公開されています。
`JupyterLab`のイメージないなぁと思ってREADME読んでたら、`base-notebook`
のREADMEにこんな一文が！

> You can launch JupyterLab by setting JUPYTER_ENABLE_LAB:


# やってみた

先日書いた、 `docker-compose.yml` に2行追加

```yaml
version: '2.2'
services:
  jupyter:
    image: jupyter/datascience-notebook
    environment:
      JUPYTER_ENABLE_LAB: 1
    ports:
      - 8888:8888
    volumes:
      - ./:/home/jovyan/work
    command: start-notebook.sh --NotebookApp.token=''
```

すべての `*-notebook` は `base-notebook` から派生しているからいけるはず。。

```
$ docker-compose up
jupyter_1  | Container must be run with group root to update passwd file
jupyter_1  | Executing the command: jupyter lab --NotebookApp.token=
jupyter_1  | [I 00:34:53.528 LabApp] Writing notebook server cookie secret to /home/jovyan/.local/share/jupyter/runtime/notebook_cookie_secret
jupyter_1  | [W 00:34:54.294 LabApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
jupyter_1  | [W 00:34:54.294 LabApp] WARNING: The notebook server is listening on all IP addresses and not using authentication. This is highly insecure and not recommended.
jupyter_1  | [I 00:34:54.325 LabApp] JupyterLab beta preview extension loaded from /opt/conda/lib/python3.6/site-packages/jupyterlab
jupyter_1  | [I 00:34:54.325 LabApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
jupyter_1  | [I 00:34:54.338 LabApp] Serving notebooks from local directory: /home/jovyan
jupyter_1  | [I 00:34:54.339 LabApp] 0 active kernels
jupyter_1  | [I 00:34:54.339 LabApp] The Jupyter Notebook is running at:
jupyter_1  | [I 00:34:54.339 LabApp] http://[all ip addresses on your system]:8888/
jupyter_1  | [I 00:34:54.339 LabApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
```

それっぽいこと言ってる！

# アクセスしてみた

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26693/12a3277e-1849-24bb-30db-1551cd79ec3d.png)

やったね！

## ちなみに

2/28の時点では
`0.31.8` が使われていた。

```bash
jovyan@65fb03dc67e3:~$ pip list | grep lab
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your p
ip.conf under the [list] section) to disable this warning.
jupyterlab (0.31.8)
jupyterlab-launcher (0.10.4)
```
新人プログラマ応援 > 標準からはずれたことをするときは、それが明示されるようにしよう | .bashrcでの明示

```
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
```

### 症状

[Raspberry Pi > GPIO > GPIO26の出力設定(Hレベル)でssh接続が切れる > link: Why are some GPIO pins not available? | Revisionにより使えるポートはさらに変わる](https://qiita.com/7of9/items/1ac840e4544b9e18d3b7)

Raspberry PiのGPIO26をout方向にしたとたんにRaspberry Piがダウンする(モニタ画面が移らなくなる | ssh接続が切れる）。

google検索しても同様の症状は見つからない。

### 犯人は自分

- [line monitor > 付随Tool > shutdownボタン機能 (v0.1)](https://qiita.com/7of9/items/f107e6f5d21cd91273a6)

swio=37(つまりはGPIO26)にIO監視機能を実装し、そのスクリプトshutdownButton.pyを自動実行するようにしていた。
https://github.com/yasokada/python-151205-shutdownButton

GPIO26のdirectionをout方向にしたとたんにその監視機能にひっかかり、shutdownするという状況だった(out方向設定時にLレベルになるため)。

shutdownButton.pyをkill -9した後は、GPIO26のH,L操作は問題ないことを確認した。

### 備考

- 標準からはずれたことをするときは、それが明示されるようにしましょう
- 自分が作ったものであっても、いろいろやっているうちにそれに気づかなくなります

セットアップやコーディングなどにおいて、標準からはずれる方法をするときはある。その時は、「標準からどのようにはずれているか」が明示されるような仕組みを作ることで、原因不明の症状の原因をつかめるようになるかもしれません。

### 対策案 > .bashrcでの明示

上記の症状の場合、shutdownButton.pyが実行されていることが明示されるといい。
.bashrcに以下を追加しておく。

```.bashrc
### 2018/03/01 to notify that my Python scripts are running
echo "================================="
echo "following Python scripts are running"
ps aux | grep python | awk '{print "-",$11,$12}'
```

ssh接続時に以下が表示される。

```bash
$ ssh -C -X -l pi 192.168.7.9
pi@192.168.7.9's password: 

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Aug 28 02:57:07 2017 from 192.168.0.132
=================================
following Python scripts are running
- python ./IPadrDisplay.py
- python ./shutdownButton.py
- python ./logFolderCopier.py
- grep --color=auto
```
電子回路入門 フォトインタラプタ・フォトリフレクタ

#**はじめに**
[書籍](https://www.amazon.co.jp/%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AE%E5%88%B6%E5%BE%A1%E3%82%92%E5%AD%A6%E3%81%B9%E3%82%8B-Raspberry-Pi-%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7-%E7%A6%8F%E7%94%B0/dp/4800711614)に沿って引き続き進めていきます。

#**フォトインタラプタ・フォトリフレクタとは**
物体の検知などによく使用されます。
回路図に違いはありませんが、検知する方法が異なります。

フォトインタラプタの場合は以下のように、LEDとフォトトランジスタ(フォトダイオード等)の間の遮蔽物の有無を検知することができます。
基本的に何でも検知してくれますが、検知したいものが大きくなると、LEDとフォトトランジスタの間が広くなり、発光と受光を別々で設置する必要があったりします。[形PTB-802 透過形光電センサ ](https://www.sensatec.co.jp/products/detail.php?product_id=129)←こんな感じ
![フォトインタラプタ仕組み.png](https://qiita-image-store.s3.amazonaws.com/0/195542/c750118a-c99e-54a0-6558-30c10e3e1612.png)

フォトリフレクタは反射を利用して、前の物体の有無を検知します。
下の図では黒色の物体を検知していますが、**黒色は赤外線を吸収するので、あまり反射しません** (悪い例でした)
逆にその原理を利用してライントレースをしたりします。
![フォトリフレクタ仕組み.png](https://qiita-image-store.s3.amazonaws.com/0/195542/4c5a6828-34cd-6b4b-49c6-f6be2142bd9d.png)

#**使用部品**
- PSoC 5LP
- 抵抗(100~500Ω, 2kΩ)
- [フォトインタラプタ](http://akizukidenshi.com/catalog/g/gP-09668/) ＣＮＺ１０２３
- [フォトリフレクタ](http://akizukidenshi.com/catalog/g/gP-04500/) ＬＢＲ－１２７ＨＬＤ

#**回路図**
ピン配列は以下のようになっています。(詳しくは仕様書)
赤外線LED(アノード、カソード)
フォトトランジスタ(エミッタ、コレクタ)
![フォトピン.png](https://qiita-image-store.s3.amazonaws.com/0/195542/dcc80fa2-90c8-8ba2-e996-a0881774c769.png)
fritzingに同じものが無かったので、それに近いものを図では使用しています。
フォトトランジスタ側につなぐ抵抗は100~500Ω程度で、抵抗値を上げるとセンサーの感度も上がります。(フォトリフレクタには2kΩを使用しました。)
![フォト_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/10f8d7c9-7a41-a921-156d-6ac607875044.png)
![フォト_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/195542/646b8031-616f-ddd2-4c19-52fcf929f59b.png)

#**プログラム**
前回と同様にLEDを…
LEDつけてなかった(´-ω-`)
と、いうわけで結果はコンソール出力します。
PsoC5の設定はTopDesign.cyschにUARTを追加します。
あとはピンを指定するだけで簡単にUSB経由でパソコンにコンソール出力できます。

`Rx_1 P12[6]`
`Tx_1 P12[7]`

あとはTeraTermやRloginを使用してcomポートへ接続するだけ。

フォトインタラプタでは、検知した際にON、通常時はOFFが出力されます。
フォトリフレクタでは、検知した際にOFF、通常時はONが出力されます。

```c
#include "project.h"

int main(void)
{
    CyGlobalIntEnable;
    int sw = 0;
    UART_1_Start(); 
    for(;;)
    {
     if(sw != SW_Read()){
      sw = SW_Read();
      if(sw == 1){
       UART_1_PutString("OFF\n");
      }else{
       UART_1_PutString("ON\n");
      }
     }
    }
}
```

##出力結果
![Rlogin.png](https://qiita-image-store.s3.amazonaws.com/0/195542/3ffa4134-1cf2-8751-2935-1fae710da89d.png)
Elasticsearch 6.2.2 の Cluster Health API についてまとめた 

クラスタの状態を確認する際に以下のようにチェックを行う。

```
$ curl -X GET 'localhost:9200/_cluster/health'
```

その場合、以下のような結果が返ってくる。

```
{
  "cluster_name": "elasticsearch",
  "status": "yellow",
  "timed_out": false,
  "number_of_nodes": 1,
  "number_of_data_nodes": 1,
  "active_primary_shards": 5,
  "active_shards": 5,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 5,
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks": 0,
  "number_of_in_flight_fetch": 0,
  "task_max_waiting_in_queue_millis": 0,
  "active_shards_percent_as_number": 50
}
```

それぞれの項目は以下のようになっている。

### cluster_name
クラスタ名。

### status
* green : 全てのシャードが正常に稼動している
* yellow : プライマリシャードは存在するがレプリカシャードが割り当てられていない。検索は可能。
* red : 少なくとも1つのプライマリシャードが正常ではない。検索結果は不正になる。

### timed_out
ヘルスチェックがタイムアウトしたかどうか。

### number_of_nodes
ノードの数。

### number_of_data_nodes
データノードの数。

### active_primary_shards
クラスタに含まれるプライマリシャードの数。

### active_shards
クラスタに含まれるシャードの数。（レプリカシャードも含む）

### relocating_shards
普段は 0 の場合が多い。ノード間でシャードの移動が発生している場合に値が増加する。（クラスタのバランスが悪かったり、ノードの追加や削除が行われた際など）

### initializing_shards
普段は 0 の場合が多い。新しく作成されているシャードの数。

### unassigned_shards
シャードとしては存在するが、クラスタ内で割り当てられていないシャードの数。レプリカシャードが割り当てられていない場合などに値が増加する。その場合は _cat/shards で確認が必要。

### delayed_unassigned_shards
index.unassigned.node_left.delayed_timeout の設定によって即時復旧を待っているシャードの数。ノードに問題があった場合、マスターはレプリカシャードを昇格させて新たにレプリカシャードを作成しようとするが、ノードが短時間で復旧した場合は復旧したノードのシャードをレプリカにする。

### number_of_pending_tasks
ノード間でシャードの移動が発生している場合やインデックスの作成時の設定変更などで処理待ちになっているクラスタ設定変更の数。

### number_of_in_flight_fetch
クラスタの再起動などによるシャードの割り当てについて、非同期で実行されている、割り当て対象のシャードのコピーがあるか確認する処理の数。

### task_max_waiting_in_queue_millis
タスクの最大待ち時間（ミリ秒）

### active_shards_percent_as_number
active_shards の値を active_shards と unassigned_shards を足した値で割ったもの。

### 参考になった記事
[Cluster Health](https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-health.html)
[Cluster Health（The Definitive Guide）](https://www.elastic.co/guide/en/elasticsearch/guide/2.x/_cluster_health.html)
[Delaying allocation when a node leaves](https://www.elastic.co/guide/en/elasticsearch/reference/current/delayed-allocation.html)
[Pending cluster tasks](https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-pending.html)
[Elasticsearch 1.6.0 をリリース](https://www.elastic.co/jp/blog/elasticsearch-1-6-0-released)
[]()
textlintのdocker imageを作ってgitlab-ciでCIする

# はじめに
日本語が苦手なみなさんこんにちは。

開発ドキュメントもgithub/gitlabで管理されているひとも多いでしょう。うちのチームでもドキュメントレビューをgitlabのmerge requestで実施しています。

ただ、そういったレビューをしている中、隣の新人くんから「日本語の指摘が多い。。。」「自動検出したい。。。」という声が聞こえてきたので、textlintを導入してみました。

# textlintとは
nodejs製の文章校正ツールです。

[textlint/textlint](https://github.com/textlint/textlint)

# どうやって使うのか
Docker imageを作りました。

https://github.com/tk117/docker-textlint

referenceにあるように参考にさせていただき、ほぼ同じようなものを作りました。DockerHubを使う練習がてら作ってみました。しかし便利ですね、DockerHubは。。。Dockerあればどこでも同じことができる。

Docker環境がある方は以下の要領で簡単に使えます。

```
$ git clone <some repository>
$ cd <some repository>
$ docker run -v $(pwd):/data -w /data tk117/docker-textlint textlint <your file>
```

ただし、.textlintrcファイルがある場所で実行してください。このファイルがtextlintでどのルールを採用するかが書かれた設定ファイルです。後でciで使うためにもリポジトリにコミットしておくとよいでしょう。

```json:.textlintrc
{
    "rules": {
        "preset-ja-technical-writing": {
            "no-exclamation-question-mark": false,
        },
        "preset-jtf-style": true,
        "spellcheck-tech-word": true
    }
}
```

エラーがなければ何も表示されません。

# エラー例

```md:sample.md
この文章はsampleです。

確かに、sampleですが、サンプルなのですが、あえてミスをして、警告をもらうようにしています
```

上記の文章を実行すると、このような警告が行われます。

```shell
# docker run -v $(pwd):/data -w /data tk117/docker-textlint textlint sample.md 

/work/sample.md
  4:13  error    文中に逆接の接続助詞 "が" が二回以上使われています。  preset-ja-technical-writing/no-doubled-conjunctive-particle-ga
  4:24  error    一つの文で"、"を3つ以上使用しています                 preset-ja-technical-writing/max-ten
  4:47  ✓ error  文末が"。"で終わっていません。                        preset-ja-technical-writing/ja-no-mixed-period

✖ 3 problems (3 errors, 0 warnings)
✓ 1 fixable problem.
Try to run: $ textlint --fix [file]
```

ちゃんと怒ってくれる！

# 今回採用したルール
まずは少なくはじめようと思い、以下の2つですね。

* preset-jtf-style
    * https://github.com/textlint-ja/textlint-rule-preset-JTF-style
* spellcheck-tech-word
    * https://github.com/azu/textlint-rule-spellcheck-tech-word

--fixで自動修正してくれるのはとてもうれしいですね。

# CIに組み込む
うっかりルール違反したままpushしてしまったときのために、継続的にテストしたいですよね。

今回はgitlab-ciを使いました。

```yml:.gitlab-ci.yml
stages:
  - lint

textlint:
  image: tk117/docker-textlint
  stage: lint
  script:
    - textlint <target path>
  tags:
    - sample-project
```

runner登録時にtagをつけたらそのtagを指定してください。簡単ですね！

ディレクトリ構成がキモになりますね。全部がドキュメントのプロジェクトであれば全部対象で良さそうですが、開発向け設計書の他にいろいろまとめて格納している場合はどういった運用になるか考える必要がありそうです。

対象が増えるたび.gitlab-ci.ymlを更新しないといけないのはイヤですね。そうしなくて済むようなディレクトリ構成にすべきだと思います。

## エディタ
ローカルでdockerで簡単に実行できるとはいえ、dockerなんてしらなーい！ってひともいますよね。

Atom, sublime, vimにプラグインが用意されているようです。

参考：[textlint/textlint:Editors](https://github.com/textlint/textlint#editors)

# おわりに
CIに組み込むことで過去のドキュメントも再帰的にテストができます。lintを通っていない文章はmergeできないようにしてもいいでしょう。

まだ使い始めたばかりなので、今後もたくさん使ってプロジェクトに合ったルールを採用していこうと思います。contributionもできたらいいな。
Project Euler 42「符号化三角数」

久々にスゥガックのお力添えを賜りました。
[こちら](https://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E6%95%B0#%E4%B8%89%E8%A7%92%E6%95%B0%E3%81%AE%E5%88%A4%E5%AE%9A)によると与えられた自然数$N$が三角数であるには、以下の$n$が整数であることが必要十分とのこと。

```math
n=\frac{\sqrt{8N+1}-1}{2}
```

それさえ分かれば後は簡単ですな。

# Problem 42 「符号化三角数」
三角数のn項は tn = n(n+1)/2で与えられる. 最初の10項は
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
である.
単語中のアルファベットを数値に変換した後に和をとる. この和を「単語の値」と呼ぶことにする. 例えば SKY は 19 + 11 + 25 = 55 = t10である. 単語の値が三角数であるとき, その単語を三角語と呼ぶ.
16Kのテキストファイル [words.txt](https://projecteuler.net/project/resources/p042_words.txt) 中に約2000語の英単語が記されている. 三角語はいくつあるか?

```python
def hoge(path):
    def count():
        # 各アルファベットの数値を辞書化
        alph = { chr(i): i-64 for i in range(65, 65+26) }
        with open(path, 'r') as f:
            words = f.read().strip().replace('"', '').split(',')
        for w in words:
            score = ((8 * sum( alph[i] for i in w ) + 1) ** 0.5 - 1) / 2
            if score.is_integer(): yield 1
    return sum(count())

print(hoge('words.txt'))
```

ふふふ、なかなかスマートなんじゃないっすか？
マイコン開発いろいろ

自分がMac OS X(雪豹)の上で開発しているマイコンの一覧を書いてみました。

|ターゲット|Bit|ツール|書き込み|備考|
|:--|:--|:--|:--|:--|
|ATMega|8|Arduino 1.0.6|FT,CH ISP,USB(DFU)|Arduinoのアプリケーションにはいっているgccをcliで使う事もあり|
|ATTiny|8|Arduino 1.0.6|USBtinyISP,USBasp|アプリケーションにはいっているgccをcliで使う事もあり|
|MSP430|16|platformio 3.2.1(cli)|FT ISP,USB|[メモ](https://qiita.com/yamori813/items/25af074cc64a7f7cfcef)|
|PIC18|8|MPLAB X|Pickit2,3|ハードウエアでのUSBのサポートがあったのでいじり始めたが、MPLAB Xが使いにくかったり、ライブラリが新しいコンパイラに対応してなかったりで、あまり使っていない|
|PIC32MX|32|MPLAB X,Pinguino,platformio 3.2.1(cli)|Pickit3,USB(CDC),FT|PinguinoのIDEは使わずgccをcliで。[platformioは手動でパッケージをインストールして](https://qiita.com/yamori813/items/6c39955c660103671741)。USB HostになれたのとDIPで扱いやすいのでいじりはじめた。[pickle](https://qiita.com/yamori813/items/b71235b6588c1ee65810)という書き込みソフトも試しています。|
|LPC|32|platformio 3.2.1(cli),mbed|FT ISP,FT SWD,USB(MSC)|書き込みツールはlpc21ispか[swddude](https://qiita.com/yamori813/items/77a1789e91cd4bcba3b2)かUSBストレージにコピー。以前はyagartoを使っていたのですがplatformioに移行しました。あまりmbedは使わないのですがライブラリを使いたいときなどり利用します|
|STM32|32|platformio 3.2.1(cli),mbed|FT ISP,STLinkV2|[メモ](https://qiita.com/yamori813/items/e8ea2f7e73fd119d0c17)|
|ESP8266|32|platformio 3.2.1(cli)|FT,CH ISP|[メモ](https://qiita.com/yamori813/items/009355472035ec6397c5)|
|EZ-USB,FX2|8|sdcc3|USB|EZ-USBはFlashではなくてメモリに実行バイナリをUSBで書き込みます。Appleのサンプルコードをベースに[ツール作りました](https://github.com/yamori813/Ezloader_OSX)|

ツールをバージョンアップすると使えなくなる可能性が高いので、いじらないことにしています。微妙なバランスで成立していて、新しいMacで同じ状態にするのは難しいような気がして、雪豹からはなれられません。

ATMega,ATTinyはパッケージが用意されていないようでplatformioは使えません。ESP32はパッケージがありgccもあるのですが、雪豹で実行できないgccだったのであきらめました。platformioは環境によって使えないプラットフォームがあり、またコンパイルできたとしてもupload出来ない事もあるので、使える範囲でうまく使うのがこつです。

platformioはpython2.7以上となっていてpython2.7のパッケージはMac OS Xのかなり広い範囲に対応している。platformioもpythonと同じポリシーとするならば出来るだけ広い範囲で利用できるように、バイナリーツールのビルドは注意しておこなうべきではないかと思う。

書き込み用のモジュールはいろいろ自作しています。

![写真（2018-02-27 21.40）.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/7436c840-bb47-2b3d-0842-2be0dc45777b.jpeg)

中央のPICKit2はPIC32MXのpic32progでの書き込みでPICKit3をスクリプトモードにするのが面倒なので作ったのですが、PIC18は書き込みできるのですが、PIC32MXは認識できません。。。

左側のFT231をISPとして使う事が多いのですが、ichigojamのupdate用に治具をつくってみました。

![写真（2019-02-24 19.31）.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/43712ed5-0658-f67c-d86f-a12e2f5831a3.jpeg)

RTS#とDTR#をダイオードを入れてISPとRESETに接続しています。ダイオードはジャンクから適当に選んで試して動いたので使っています。ダイオードのジャンクは型番が分からないので、こういう用途が良いような気がします。

![FTISP.png](https://qiita-image-store.s3.amazonaws.com/0/104066/bab567cf-7fda-4503-872a-fa5b4241fde6.png)

RTS#とDTR#を接続する事で、lpc21ispコマンドのcontrolオプションが使えます。

[蟹さん](https://qiita.com/yamori813/items/c1d8111a3f45c5a74655)もマイコン的に使っていますが開発はFreeBSD上なので、ここには入れていません。
Googleカレンダーの招待に対する返信をいい感じに振り分ける

# はじめに
[Googleカレンダーの招待に対する返信をアーカイブする](http://yu-log.hatenablog.com/entry/2015/08/05/073000)

この記事を読んで、「探してたものはこれだー！！」ってなって1年くらい運用してたんですが、最近になって欠点に気付いたので備忘メモ的な感じで書いてます。

# 「え、コメント入れといたよ？見てないの？？」

と、同僚に言われてぽかーんとしてしまいました。
何の話かと思いGoogleカレンダーの会議通知を開くと、確かに「会議をリスケしてくれ」という旨のコメントを書いた上で会議通知に返信されておりました。
私は普段からメール等は割とまめにチェックする方でしたので、まさか見逃すはずがないと思い調べたんですが、、きれいに冒頭の記事の検索条件で受信箱をスキップしておりましたorz

# 結論

ちょっとダサいですが、以下の通りに変更しました。
これでコメント付きで会議通知に返信する人への対応ができました。

```
has:attachment invite.ics subject:{(参加予定:)or(承諾:)or(辞退:)} -メッセージ:
```
画像を文章化するプログラムと、文章を画像化するプログラム［Python] [tkinter］

画像を文章化するプログラムと、文章を画像化するプログラムを作りました。

画像にした文章はもとの文章に戻すことができ、文章にした画像はもとの画像に戻すことができます。暗号のような使い方もできます。ちなみに、文章に漢字や平仮名などが含まれているとエラーが発生します。

　

以下が画像を文章化するプログラムです。そのままコピーすると、おそらく使えると思います。

```py
from PIL import Image
import os, tkinter, tkinter.filedialog, tkinter.messagebox

root = tkinter.Tk()
root.withdraw()
fTyp = [("","*")]
iDir = os.path.abspath(os.path.dirname(__file__))
tkinter.messagebox.showinfo('　','文字にしたい画像を選んでください')
file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)

im = Image.open(file)
size =im.size
bun=[]

for y in range(size[1]):
    for x in range(size[0]):
        r, g, b = im.getpixel((x, y))
        if r>100:
            bun.append(chr(g))
        else:
            pass

print("".join(bun))

file = open('ango01.txt', 'w')
file.write("".join(bun))

tkinter.messagebox.showinfo('　',"文字にして保存しました")
```

　

そしてこの画像が、文章を画像化するプログラムです。

![ango01.png](https://qiita-image-store.s3.amazonaws.com/0/240301/1c625491-31c7-6395-dc21-4e383b656eb7.png)


以上が画像を文章化するプログラムと、文章を画像化するプログラムでした。
走れメロス”全文”を画像にするとこんなに小さくなる！（知らない人も多そうなので数行で報告）

走れメロスの全文（日本語で９８００文字程度）を画像として保存すると、こんなサイズになった。この画像はもとの文（走れメロス）にもどすこともできる。

![メロスは激怒した.png](https://qiita-image-store.s3.amazonaws.com/0/240301/c8a73313-e194-defd-972d-39dc77b9fb0b.png)

　


上の画像は３色を使ってデータを保存したけれど、下の画像のように１色だけで表現してもこのくらいコンパクトになった。また２色分空いているのでこのように他の画像（太宰治さんの顔）をすかすことができる。

![太宰治.png](https://qiita-image-store.s3.amazonaws.com/0/240301/dabdbf1e-6ab0-8687-5a01-92ba8b673f4d.png)


 　

 
ちなみに、以下のプログラムを使うと「走れメロス」に戻せる。
※試したい方は上の画像をコピーして試してみてください。

```py
from PIL import Image
import os, tkinter, tkinter.filedialog, tkinter.messagebox

root = tkinter.Tk()
root.withdraw()
fTyp = [("","*")]
iDir = os.path.abspath(os.path.dirname(__file__))
tkinter.messagebox.showinfo(' ','文字にしたい画像を選んでください')
file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)

im = Image.open(file)
size =im.size
bun=[]

for y in range(size[1]):
    for x in range(size[0]):
        r, g, b = im.getpixel((x, y))
        bun.append(chr(r))
        bun.append(chr(g))
        bun.append(chr(b))

print("".join(bun))

file = open('ango01.txt', 'w')
file.write("".join(bun))

tkinter.messagebox.showinfo(' ',"文字にして保存しました")

```

　　

![Python画像化プログラム.png](https://qiita-image-store.s3.amazonaws.com/0/240301/503ecb25-3e68-b49e-dacd-85e5ead7f587.png)　←この画像は文字化すると意味が分かります
Angularで作るER DIAGRAM TOOL - 第七回　モデル修正・削除機能の実装。およびER図エリアへの表示

左カラムに表示するmodel用のコンポーネントを作ります。

/src/app/model/model.component.ts
https://github.com/dog-ears/er-diagram-tool/commit/55c3448c6a49a1221bf5958905261fdf555e349f#diff-14ac3c6b037418c538e10e3c5571bbbe

・appComponentからmodelを受け継ぐため、Inputをimportしてます。
・メソッドeditModel()は、モデルモーダルを開くように記述
・メソッドdeleteModel()は、confirmウィンドウで確認ののち、dataServiceのdeleteModel()メソッドを呼び出しています。
※ちなみにdataService.editModel()が必要ないのは、双方向バインディングで、入力するそばから変更されるためです。



/src/app/service/data.service.ts
https://github.com/dog-ears/er-diagram-tool/commit/55c3448c6a49a1221bf5958905261fdf555e349f#diff-ae990bb302f27e60323deb45d6746b17

・deleteModel()メソッド追加。



model.component.htmlを修正する前に、modelクラスに２つのメソッドを追加します。

/src/app/class/model.ts
https://github.com/dog-ears/er-diagram-tool/commit/55c3448c6a49a1221bf5958905261fdf555e349f#diff-15a154169b0b6112f2adcdf51a565ee2

・getElementId()・・・「model1」のような文字列を返す。html上のmodelのid名に使います。
・getElementH2Id()・・・「model1-h2」のような文字列を返す。html上のmodelのH2のid名に使います。


/src/app/model/model.component.html
https://github.com/dog-ears/er-diagram-tool/commit/55c3448c6a49a1221bf5958905261fdf555e349f#diff-14ac3c6b037418c538e10e3c5571bbbe

・modelのis_pivotプロパティによって、class名を出しわけています。is_pivotを使うのは、だいぶ後なので、とりあえず気にしない。
[class.list-group-item-primary]="myModel.is_pivot === false" [class.list-group-item-secondary]="myModel.is_pivot === true"

※pivotとは、多対多リレーションシップを作る際、モデルとモデルの間にできる中間モデル（テーブル）のことです。



/src/app/model/model.component.css
https://github.com/dog-ears/er-diagram-tool/commit/55c3448c6a49a1221bf5958905261fdf555e349f#diff-695cbf9497ae15d1c0f19a8c53eee640

・とりあえず空



上記、準備完了したところで、moduleに読み込みます。

/src/app/app.module.ts
https://github.com/dog-ears/er-diagram-tool/commit/55c3448c6a49a1221bf5958905261fdf555e349f#diff-fc6b22833aeaf77f8440c4970ade705e

・ModelComponentをimport



/src/app/app.component.html
https://github.com/dog-ears/er-diagram-tool/commit/55c3448c6a49a1221bf5958905261fdf555e349f#diff-465e9f13ce23ec4a1e366935273fdbb6

・左カラムエリアにmodelコンポーネントを読み込みます。
<model *ngFor="let model of data.models" [myModel]="model"></model>
・*ngForの繰り返しは、書式を覚えてしまいましょう。
・[myModel]でデータを子コンポーネントに渡します。子コンポーネント側で@Input() myModel;するのを忘れずに



ここで、プレビュー確認。

![cap07_1.png](https://qiita-image-store.s3.amazonaws.com/0/103767/42bf849e-619f-d499-0420-8bb23bf5bc34.png)

文字が極端にでかいので、文字サイズを調整します。

/src/styles.css
https://github.com/dog-ears/er-diagram-tool/commit/55c3448c6a49a1221bf5958905261fdf555e349f#diff-0fd3637456511d89012d5274dd855970

・model以下すべて（のちほど追加するSchemaコンポーネント部分にも）に適用したいので、トップレベルのcssに記述してます。

![cap07_2.png](https://qiita-image-store.s3.amazonaws.com/0/103767/c1230336-7aec-a6a6-0a51-b4f5cb4bc1ab.png)

これでモデルの追加・変更・削除が実装されました。

次回は、Schemaの追加・編集・削除を実装します。
Tinkercad > Shape Generator > Icosahedron > vert()とtri()で形状定義

ブラウザ動作するAutoDeskのTinkercad。

### 関連

- [Tinkecad > Shape Generator > JavaScriptによる形状の生成](https://qiita.com/7of9/items/e3f6f0613157a6bbdcf1)

### Icosahedron

以下はShape Generatorで使うIcosahedronのmain.js。

```main.js
// Convenience Declarations For Dependencies.
// 'Core' Is Configured In Libraries Section.
// Some of these may not be used by this example.
var Conversions = Core.Conversions;
var Debug = Core.Debug;
var Path2D = Core.Path2D;
var Point2D = Core.Point2D;
var Point3D = Core.Point3D;
var Matrix2D = Core.Matrix2D;
var Matrix3D = Core.Matrix3D;
var Mesh3D = Core.Mesh3D;
var Plugin = Core.Plugin;
var Tess = Core.Tess;
var Sketch2D = Core.Sketch2D;
var Solid = Core.Solid;
var Vector2D = Core.Vector2D;
var Vector3D = Core.Vector3D;

// Template Code:
params = [
    {   "id": "radius", 
        "displayName": "Radius",
        "type": "length",
        "rangeMin": 1,
        "rangeMax": 50,
        "default": 20
    }
];

function process(params, data) {    
    var size = params.radius;
    var r = (size / 2) / Math.sin(Math.PI / 5);
    var h = Math.cos(Math.PI / 5) * r;
    var h1 = Math.sqrt(size*size - r*r);
    var hr = h+r;
    var h2 = Math.sqrt(hr*hr - h*h);
    var z2 = (h2 - h1) / 2;
    var z1 = z2 + h1;
    var cx = r * Math.cos(Math.PI / 10);
    var cy = r * Math.sin(Math.PI / 10);

    var mesh = new Mesh3D();
    var verts = [];
    function vert(x, y, z) { verts.push([x, y, z]); }
    function tri(a, b, c) { mesh.triangle(verts[a], verts[b], verts[c]); }

    vert(0, 0, z1);

    vert(0, r, z2);
    vert(cx, cy, z2);
    vert(size/2, -h, z2);
    vert(-size/2, -h, z2);
    vert(-cx, cy, z2);

    vert(0, -r, -z2);
    vert(-cx, -cy, -z2);
    vert(-size/2, h, -z2);
    vert(size/2, h , -z2);
    vert(cx, -cy, -z2);

    vert(0, 0, -z1);

    tri(0, 1, 5);
    tri(0, 2, 1);
    tri(0, 3, 2);
    tri(0, 4, 3);
    tri(0, 5, 4);

    tri(11, 10, 6);
    tri(11, 6, 7);
    tri(11, 7, 8);
    tri(11, 8, 9);
    tri(11, 9, 10);

    tri(1, 2, 9);
    tri(2, 10, 9);
    tri(2, 3, 10);
    tri(3, 6, 10);
    tri(3, 4, 6);
    tri(4, 7, 6);
    tri(4, 5, 7);
    tri(5, 8, 7);
    tri(5, 1, 8);
    tri(1, 9, 8);

    var solid = Solid.make(mesh);

    return solid;
}
```

- vert()で頂点座標を定義
    - vertices
- tri()で頂点のインデックスを3つもつ三角形を定義
    - triangulation

pySphereptsなどの座標データやDelaunay triangulationのデータからvert()とtri()の定義を生成すれば、Tinkercadのオブジェクトとして生成できそうだ。

- [pySpherepts > Jupyter > 結果の座標を球面上に表示する実装 v0.2 > 奥の点排除 > 同じものが得られた](https://qiita.com/7of9/items/af4827dc6c56366f6112)

pySphereptsのデータからは球上の点が生成されるだけなので、面白くはないかもしれない。
メモ：Swiftでテーブルを作る時のお作法

Swiftを勉強し始めたので自分用メモ。インデントの修正ははめんどくさいのでそのまま。

　table rowのサイズを宣言してあげる。

````
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return itemArray.count
    }
```

ellの値を決めてあげる

```
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "ToDoItemCell", for: indexPath)
        
        cell.textLabel?.text = itemArray[indexPath.row]
        return cell
    }
```

`tableView`はswiftのbuilt-in functionなのでoverrideが必用という認識。

選択したRowでイベントを発火させるとき。

```
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print(itemArray[indexPath.row])
    }
```
tap gesture使ってた・・

選択したrowにアクセサリーで飾りをつけてあげる
`tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark`
俺言語 その8

#概要

俺言語をやってみた。
avrにアセンブラで実装してみた。

#写真
![MVC-003F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/e2d070b0-1f8a-b2e4-e5d1-a7dfcf74fc69.jpeg)

#環境
avr studio 4
attiny85 1mhz
tera term
usb-serial

#サンプルコード
１から９９まで、表示。

```
10 a=1
20 ?=a
30 a=a+1
40 #=a<100*20
```

#結果

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/3148cba8-b495-8a0e-69b5-ab6df9458268.png)


以上。
Mint で Swift 製のコマンドラインツールを管理する

iOS アプリや macOS アプリの開発にあたって、開発を補助するためのコマンドラインツールを使うことがよくあります。その際に、それらのツールを開発環境やビルド環境にどうインストールしてどう管理するか、というのは注意を払っておくべきことのひとつです。

macOS にコマンドラインツールを入れる手段としては Homebrew が手軽でありメジャーです。ただ、実際の開発では、プロジェクトごとに使うツールのバージョンを指定したいことがあると思います。Homebrew はそういった細かい用途には向いていません。

そんな場合に [Mint](https://github.com/yonaskolb/Mint) が便利です。Mint は Swift Package Manager ベースで開発された Swift 製コマンドラインツールを管理するためのツールです。

例えば、[SwiftLint](https://github.com/realm/SwiftLint) や [Carthage](https://github.com/Carthage/Carthage) といったツールが管理できます。Mint を使うと、複数のバージョンをインストールしておき、バージョンを指定して実行することが可能になります。

## Mint のインストール

Mint 自体は Homebrew でインストールできます。

```
brew tap yonaskolb/Mint https://github.com/yonaskolb/Mint.git
brew install mint
```

## ツールのインストール＆実行

Mint でツールをインストールするには次のようにします。

```
mint install name/repo
```

引数には GitHub のリポジトリ名を指定します。あるいは git リポジトリの URL でも良いです。

例えば SwiftLint をインストールするには次のようにします。

```
mint install realm/swiftlint
```

これを実行すると、Mint 管理下のフォルダ（`/usr/local/lib/mint`）に対象のソースコードがダウンロードされて Swift PM でビルドされます。

その後、デフォルトでは、グローバル（`/usr/local/bin`）にコマンドがインストールされます。以後は mint を使わずにツールのコマンドを直接実行できます。

## グローバルにインストールしない場合

`mint install` のオプションとして `--global=false` を指定すると Mint 管理下にのみインストールされます。この場合、インストールしたツールを実行するには `mint run` を使います。

例えば Mint 管理下の SwiftLint を実行するには次のようにします。

```
mint run realm/swiftlint swiftlint
```

つまり、実行したいコマンドの前に `mint run realm/swiftlint` をつけるということになります。

コマンドに引数を渡す場合はさらに後ろに続けます。例えば `swiftlint version` を実行するなら次のようにします。

```
mint run realm/swiftlint swiftlint version
```

なお、実は `mint run` は、まだ `mint install` されていなかった場合はインストールもしてくれます（この際はグローバルへのインストールは行われません）。

## バージョンを指定してインストール＆実行

`mint install` のときに、リポジトリ名の後ろにバージョンを指定すると、指定したバージョンをインストールできます。

```
mint install realm/swiftlint@0.24.2
```

`mint run` のときに、リポジトリ名の後ろにバージョンを指定すると、指定したバージョンを実行できます。

```
mint run realm/swiftlint@0.24.2 swiftlint
```

この方法を使うことで、冒頭に書いたような「プロジェクトごとに使うツールのバージョンを指定したい」というニーズに対応可能です。

## インストールされているバージョンの確認

`mint list` コマンドでインストール済みのツールとバージョンが確認できます。

```
Installed mint packages:
  Carthage
    - 0.26.2
    - 0.28.0
  SwiftLint
    - 0.24.2
    - 0.25.0
```
Xdomain PHPサーバーで条件チェック型のBasic認証を行う方法

# Xdomain PHPサーバーで条件チェック型のBasic認証を行う方法

Xdomainでは、管理パネルGUIから操作できるBasic認証機能が提供されています。しかしながら、これはディレクトリ単位の認証のみとなっており、「こうこうこういう条件のときだけ同一のページにBasic認証をかけたりかけなかったりしたい」という時には使えません。

そんなときは、自前でBasic認証PHPを書くやり方が使えます。
[PHPでお手軽ベーシック認証 (Basic認証)](http://techblog.ecstudio.jp/tech-tips/basicauth.html)
ですが、Xdomain PHPサーバーはセーフモードで動作しているため、上記のようにPHP_AUTH系サーバー変数を設定できないようになっています。

そこで、代わりに`$_SERVER["REMOTE_USER"]`（外部で認証済みのユーザー）を使用します。

## やり方

### .htaccessを設定する

.htaccessに以下を設定し、ルートディレクトリに置いておきます。

```text:.htaccess
<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]
</IfModule>
```

### Basic認証PHP関数を書く

```php:basic_auth.php
function basic_auth(array $auth_list)
{
    $valid_passwords = $auth_list;
    $valid_users = array_keys($valid_passwords);

    $a = base64_decode(substr($_SERVER["REMOTE_USER"], 6));
    if ((strlen($a) == 0) || (strcasecmp($a, ":") == 0)) {
        header('WWW-Authenticate: Basic realm="Restricted Area"');
        http_response_code(401);
        die("認証に失敗しました");
    } else {
        list ($name, $password) = explode(':', $a);
    }

    $validated = (in_array($name, $valid_users)) && ($password == $valid_passwords[$name]);

    if (! $validated) {
        header('WWW-Authenticate: Basic realm="Restricted Area"');
        http_response_code(401);
        die("認証に失敗しました");
    }

    // 認証成功
}
```

#### やっていること

1. REMOTE_USERに"Basic xxxxx"(xxxxxは暗号化されたid:password)が入っているので、6文字目以降をデコード
2. 取り出したid:passwordを展開
3. 認証

### Basic認証をかけるページに関数設置

```php:restricted_page.php
if ($condition) {
    basic_auth(array(
        "your_id" => "your_password"
    ));
}
```

Basic認証をかけたいページに上記を書くと、`$condition = true`のときにID/Pass入力ポップアップが出ます。そこへ、上記のように書いた場合はIdに`your_id`、Passに`your_password`を入れることで認証を通せます。

```php:restricted_page.php
if ($condition) {
    basic_auth(array(
        "your_id1" => "your_password1",
        "your_id2" => "your_password2",
        "your_id3" => "your_password3"
    ));
}
```

複数もいけます。

## 参考

[PHP による HTTP 認証](http://php.net/manual/ja/features.http-auth.php#features.http-auth) コメント欄のところ

## 追記

よく考えたらPHP_AUTH系変数に代入する必要性がなかったので修正しました。