OmniAICreator/Qiita-1.07M huggingface dataset:
LANケーブル作成

#LANケーブル作成
**ツイストペアケーブル** 
2本のケーブルを撚り合わせて１ぺアとしたケーブル。
ケーブルの心線の種類は、単線タイプと撚り線タイプがあります。
一般的に店頭で売られているLANケーブルの場合、大多数が撚り線のようです。
授業でも撚り線で作成しました。
シールド被覆の有無でそれぞれ、有りを「STP」、無しを「UTP」といい、「STP」のほうがノイズ耐性が「UTP」より高い。

 - 必要なもの
1. ツイストペアケーブル
2. モジュラープラグ（RJ-45）
3. 圧着工具
4. ケーブルテスタ
5. ニッパー
6. カッター

 - 手順
1.ケーブル両先の3㎝ほど被膜を取り除き、中の撚り線を出す。
2.ストレートケーブルの順で結線し1.5㎝に切る。
3.モジュラープラグに差し込み、再度順番を確認したら圧着工具でかしめる。
4.ケーブルテスターでチェックをする。  
**モジュラープラグに差し込むときは爪が下になるようにこの方向で入れる。**  
**圧着工具でかしめた後に、下まで貫通しているか確認する。**

**結線**

 - IA/EIA568Bの結線方法  

   + ストレートケーブル  
　 白　白　白　白  
　 橙橙緑青青緑茶茶  
　 １２３４５６７８

   + クロスケーブル  
   白　白　白　白  
   緑緑橙青青橙茶茶  
   １２３４５６７８  

---

参考元
Web
[感電自作マニュアル"LANケーブルの作り方"] (http://www.jsrc.jp/denshi/cable.html ) 
書籍
[平成30年度 栢木先生のITパスポート教室]
AWS CodeDeployのApplicationStopでやってるっぽいこと

メモレベルです。

CodeDeployにはhooksというセクションが複数あり、私はEC2/オンプレミスへデプロイをやってます。

ApplicationStopのセクションでは、どうやら一つ前のデプロイで配置したファイルを削除する作業が行われています。
この際、`/opt/codedeploy-agent/deployment-root/deployment-instructions/xxxxxxxxxxxxx-cleanup`というファイルに設置したファイルが定義されているようで、この情報をもとに配置したファイルを削除しているようでした。

ポイントとして、この掃除の時にCodeDeployサービス側の履歴から一つ前の成功したデプロイIDを見ていることです。
例えば、PHP5からPHP7でのアプデ作業を別々のサーバー、ブランチを用いてやっていて、ブランチを統合してデプロイ先サーバーに同じデプロイグループをデプロイすることになった時。

この際にはサービス側のデプロイIDをみて動かすファイルを探すので、デプロイグループに差し込まれる側はデプロイがうまくいくものの、デプロイグループに差し込む側は対象のサーバーにそのデプロイIDは存在しないのでApplicationStopはスキップされます。スキップされてしまうと、installされるときにはすでに前のものが設置されたままの状態なのですでにファイルが存在するよということでエラーになります。

この際は一度設置先を削除しておくことで問題なくデプロイ出来る。
LAN基礎1

#LAN基礎1

##ネットワーク規模
 - LAN(Local Area Network)  
ごく限られた地域で構築されたネットワーク。
利用者が自分で構築管理。
利用料金が発生しない。
 - WAN(Wide Area Network)  
地理的に離れた拠点を接続するネットワーク。
電気通信事業が提供するサービスを利用する。
利用料金を支払う。  

##ネットワーク利用形態
 - "C/S"("クライアント/サーバー型")  
サービスを提供する側(サーバ)と要求する側(クライアント)の役割が明確。
サーバー専用の"コンピュータ/OS"が必要。
 - P2P(ピアツーピア型)  
すべてのパソコンが対等な立場。
専用な"コンピュータ/OS"は不要。
 - スタンドアロン型  
ネットワークに接続せず単独で利用する形態。

##ネットワーク接続形態
 - バス型  
一本のケーブルに端末を接続分岐。
ケーブル(基幹線)が故障すると全体が利用停止になる
基幹線から分岐しているケーブルが故障しても全体に影響を与えない。
最近ではあまり使われていないらしい。
 - スター型(ハブアンドスポーク)  
集線装置(ハブ)を中心に放射上に端末を接続する。
1台の端末、またはケーブルが故障しても全体に影響を与えない。
集線装置が故障すると全体が使用不可になる。
ネットワーク管理で一番メジャーな形態らしい。  
 - リング型  
ケーブルをリング状にし、端末を接続する。
一台の端末が故障すると全体が使用不可になる。
ケーブルが故障すると全体が使用不可になる。

##LANケーブル

ルータとハブ、ハブとコンピュータなどを接続するケーブルです。
PoE(Power over Ethernet)対応だと、LANケーブルから給電できる。
LANの規格はIEEEが決めていて、有線はIEEE802.3として規格されている。　 

 - ツイストペアケーブル  
太さが細いので設置が容易なので一般家庭にも使われ、ネットワーク構築ではよくスター型で利用される。
4対8心で、内部同線を2つずつ撚り合わせたもの。
両端のコネクタは「RJ-45」（電話は「RJ-11」）。
性能によってカテゴリで分類され、カテゴリの値が大きくなるほど高速通信ができるが、ノイズの影響を受けやすくなる。
しかしそれにはノイズの影響を少なくする工夫が施されている。
モジュラープラグに金属シールドがあるものを「STP」、ないものを「UTP」。
シールドがあるとノイズ耐性が高い。  
 **ケーブルの略語**  
〇〇/〇TP
 - 〇〇
    + 全体シールド  
U = シールドなし  
F = フォイルシールド  
S = 編組シールド  
SF = 編組シールド及びフォイルシールド
 - 〇TP  //TP = 単線or撚り線
    + 要素シールド  
U = シールドなし  
F = 編組シールド  

参考資料
参照資料・引用元
WEB
[IT用語辞典 e-Words](http://e-words.jp/)
書籍
[平成30年度 栢木先生のITパスポート教室]
Macで開発環境を整える

「Mac初心者がPython3を使える環境を整えることを可能とする」ことを目標に
Macの基本的で便利な機能をいろいろ知りながら使いこなすための情報を記載した
社内用の資料として作った38枚のスライド:

[<img border="3" width="355" alt="macdevl17.png" src="https://qiita-image-store.s3.amazonaws.com/0/97315/3aecd4c7-1832-1d7b-b1b2-4f83b997070d.png">](https://www.slideshare.net/shimonotoshiyuki/mac170420/)
phpで二次元配列から普通の配列に直す方法！

もともとはこんな配列でした。
(本当はもっと多かったけど)

```php

array (size=4)
  0 => 
    array (size=2)
      'key' => string 'firstName' (length=9)
      'value' => string 'yamada' (length=6)
  1 => 
    array (size=2)
      'key' => string 'lastName' (length=8)
      'value' => string 'taro' (length=4)
  2 => 
    array (size=2)
      'key' => string 'gender' (length=6)
      'value' => string 'male' (length=4)
  3 => 
    array (size=2)
      'key' => string 'age' (length=3)
      'value' => int 4
```


```php
$keyValue = array_map ( function ($data) {
                    return array($data["key"] => $data["value"]);
                }, $array, $array);
```

まず、これをやると配列はこうなりました。

```php
array (size=9)
  0 => 
    array (size=1)
      'firstName' => string 'yamada' (length=6)
  1 => 
    array (size=1)
      'lastName' => string 'taro' (length=4)
  2 => 
    array (size=1)
      'gender' => string 'male' (length=4)
  3 => 
    array (size=1)
      'age' => int 4
```

そして次にこれをしました。

```php
$settings = array_reduce($settingsKeyValue, 'array_merge', array());
```

すると・・・



```php
array (size=9)
  'firstName' => string 'yamada' (length=6)
  'lastName' => string 'taro' (length=4)
  'gender' => string 'male' (length=4)
  'age' => int 4
```


できたぜ！！！！！



# 補足

コメントしてくださったやり方がめちゃくちゃ簡単でした・・・。

詳しくはコメントをご覧ください。
processing(androidmode)でフルスクリーンを解除する

まあ自分用

```

import android.view.*;
void setUI() {
  runOnUiThread(new Runnable() { 
    public void run() { 
  View v = getSurface().getRootView();
  v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
  }
  });
}

```

んで持ってsetupからsetUI();するだけ
Cloud9 + PostgreSQL + Rails db:migrate で 「FATAL: Ident authentication failed for user」エラーを解決する方法

# postgresql のインストールと初期化
```console:ec2-user$
sudo yum -y install postgresql96
sudo yum -y install postgresql96-devel
sudo yum -y install postgresql96-server

sudo /etc/init.d/postgresql96 initdb
```

# postgresユーザに切り替え、DBユーザーを作成
```console:ec2-user$
sudo -u postgres -i
```

```console:-bash-4.2$ 
psql
createuser -d -U postgres -P [USERNAME]
logout
```

# 【重要】pg_hba.conf を変更し、接続できるクライアントを設定する
`pg_hba.conf` については、[他ホストから接続するための設定](http://rina.jpn.ph/~rance/linux/postgresql/connect.html) が詳しいのでそちらを参照してください。

```console:ec2-user：~/environment/project
sudo vi /var/lib/pgsql96/data/pg_hba.conf
```
```diff:pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
- host    all             all             127.0.0.1/32            ident
+ host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            ident
#host    replication     postgres        ::1/128                 ident
```
最初、`local all all`を`trust` に変更しましたが、`Rails->PostgreSQL` はTCPを利用したアクセスになるため `host all all 127.0.0.1/32` を変更する必要があるようです。

[PostgreSQLデータベースにアクセスできないときの対処法 - のほほん徒然](http://d.hatena.ne.jp/uchiuchiyama/20070317/postgresql_ruby_interface_porblem)
> RailsがPostgreSQLにアクセスする際にUNIX socketではなくTCP socketを利用していて，TCPを利用したアクセスではpasswordによるユーザ認証がPostgreSQLの設定で許可されていないことが原因のようです．

# postgresqlの起動とDBセットアップまで
```
sudo /etc/init.d/postgresql96 start
```

```
rails db:setup
```

# 参考
- [AWS Cloud9でPostgreSQLを使ったrailsプロジェクトを立ち上げる - niki12260714の日記](http://niki12260714.hatenablog.com/entry/2018/05/17/105557)
- [AWS Cloud9でPostgreSQLに対しrake db:migrateが失敗する - niki12260714の日記](http://niki12260714.hatenablog.com/entry/2018/05/18/101322)

# 留意点
- [Cloud9のPostgresをアップデート。 - Qiita](https://qiita.com/Nimimal/items/a48023c2740ff2e42995) で説明されている `pg_hba.conf` のパスは、
```
sudo vi /etc/postgresql/9.6/main/pg_hba.conf
``` 

パッケージ管理も `apt-get` をつかっていました。公開時点（2017/09/16）から1年ほどしか経過していません。
今後のアップデートによって変更される可能性に注意しておく必要があります。

# サービス周りのコマンド集
```
DB初期化
sudo /etc/init.d/postgresql96 initdb
スタート
sudo /etc/init.d/postgresql96 start
再起動
sudo /etc/init.d/postgresql96 restart
```
AWSのみでサーバレスにURLリダイレクトする方法

# よくあるケース
あるサイト aaa.domain.com をとあるサーバで稼働しているが、bbb.domain.com というドメインに変更して、サーバも別インスタンスに移したい。
しかも、URL構造が変わっているので、単純にドメインごと転送、とかではダメだったりする。

## こんな時どうするか？
よくあるのは、aaa.domain.com が動いているサーバのApacheとかにリダイレクトの設定を書くとかですよね。
でも、インスタンスをずっと動かしつづけないといけない。

# AWSで全部できます
できます。
## route53でドメイン管理
まず、route53で、対象のドメインを管理するように設定します。
（もともと管理してあれば問題ないです。）
サブドメイン単位でもroute53で管理対象にできます。[こちら](http://developersnote.jp/aws/route53.html)参照。
最初は、既存のDNSレコード設定をそのままroute53でも作ってから、NSレコードをroute53に向けましょう。

## Certificate Managerで証明書を作る
aaa.domain.com のSSL証明書を作ります。
https転送が不要であれば省略できますが、なるべくやっておきましょう。

## S3バケットを作る
転送の主役となる、S3バケットを作りましょう。ただしファイルは一つも入れません。
バケット名は適当にして、設定はデフォルトでOK。
作成したら、プロパティで「Static website hosting」のオプションを開き、「このバケットを使用してウェブサイトをホストする」を選びます。
インデックスドキュメントは、index.htmlとか適当に書いておけばよいです。

また、この画面にでているエンドポイント（http://aaa-s3-backet.s3-website-ap-northeast-1.amazonaws.com みたいな形式）をメモっておきます。


## CloudFrontを設定する
Distributionを作ります。ほとんどデフォルト設定でいいです。下記のみ設定します。

- Origin Domain Nameに、S3を作ったときにメモった、エンドポイントを入れます。
- Alternate Domain Names(CNAMEs)に、リダイレクト元のドメイン aaa.domain.com を入れます。
- Custom SSL Certificate で、さっき作った証明書を指定します。うまくいけば、自動的に出てくるはずです。

作成完了すると、Distribution のエンドポイントが作られますので、メモっておきます。
Domain Name	xxxxxxxxxxxxx.cloudfront.net
みたいなやつです。

## S3で転送設定
S3に戻り、「リダイレクトルール」の欄にルールを入力します。[こちらの資料](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/how-to-page-redirect.html#advanced-conditional-redirects)が参考になるでしょう。
例えば下のようになります。

### 注意点
- Condition の中身はAND条件になります。OR条件をつくりたいときには、別の RoutingRule を書きます。
- Redirect には、 ReplaceKeyWith か ReplaceKeyPrefixWith のどちらかを必ず書きます。
    - ReplaceKeyWith は、そのパスそのものにリダイレクトします。つまりリダイレクト先は、"HostName/ReplaceKeyWith"になります。
    - ReplaceKeyPrefixWith は、KeyPrefixEquals を置き換えます。URLのKeyPrefixEquals 以降の文字列が保存されるイメージです。
    - ルールは上から実行されるようです。一番下には、Condition なし（すべてに合致）の RoutingRule を書くと良いでしょう。そうしないと、403になります。リダイレクト先のURL構造がリダイレクト元と正確に一致することはあんまりないと思いますので、この最後のruleでは ReplaceKeyWith でリダイレクト先を指定すると良いでしょう。そうするとリダイレクト先での404を防げます。
 
### RoutingRules のサンプル

```xml
<RoutingRules>    
    <RoutingRule> <!-- /ccc/〜 を /ddd/ccc/ にリダイレクト -->
        <Condition>
      		<KeyPrefixEquals>ccc/</KeyPrefixEquals>
    	</Condition>
        <Redirect> 
            <HostName>bbb.domain.com</HostName>
            <ReplaceKeyWith>ddd/ccc/</ReplaceKeyWith>
        </Redirect>
    </RoutingRule>
    
	<RoutingRule> <!-- /eee/〜 を /fff/〜 にリダイレクト -->
		<Condition>
      		<KeyPrefixEquals>eee/</KeyPrefixEquals>
    	</Condition>
        <Redirect> 
            <HostName>bbb.domain.com</HostName>
            <ReplaceKeyPrefixWith>fff/</ReplaceKeyPrefixWith>
        </Redirect>
    </RoutingRule>
    
    <RoutingRule>
        <Redirect> <!-- 上のRulesに当てはまらない場合は、とにかく bbb.domain.com にリダイレクト -->
            <HostName>bbb.domain.com</HostName>
            <ReplaceKeyWith></ReplaceKeyWith>
        </Redirect>
    </RoutingRule>
</RoutingRules>
```

## AレコードをCloudFrontへ向ける
route53で、aaa.domain.comのAレコードのエイリアスにCloudFrontのDistribution（xxxxxxxxxxxxx.cloudfront.net みたいなやつ）を指定します。

これで、完了です！
aaa.domain.com にアクセスして、301でbbb.domain.comにリダイレクトされることを確認しましょう。
macports2.5.3でiPythonをインストール（改）

以前と同じように（参考URL）インストールしても上手く行かなかった…ので、改めて上手く行った方法を書き留めておく。

##参考URL
macportsでiPythonをインストール - Qiita https://qiita.com/H1r0ak1Y0sh10ka/items/2a5391a9159f4e2c9812


##手順
###1.macportsでpy-jupyterをインストールする。
以前はpy-jupyterでインストールしたが、py37-jupyterとｐｙthonのバージョンを指定してインストールした。

```:terminal
$ sudo port install py37-jupyter
--->  Computing dependencies for py37-jupyter
The following dependencies will be installed: 
 ipython3_select
 py37-appnope
 py37-backcall
 py37-bleach
 py37-dateutil
 py37-decorator
 py37-entrypoints
 py37-html5lib
 py37-ipykernel
 py37-ipython
 py37-ipython_genutils
 py37-ipywidgets
 py37-jedi
 py37-jinja2
 py37-jsonschema
 py37-jupyter_client
 py37-jupyter_console
 py37-jupyter_core
 py37-markupsafe
 py37-mistune
 py37-nbconvert
 py37-nbformat
 py37-notebook
 py37-pandocfilters
 py37-parso
 py37-pexpect
 py37-pickleshare
 py37-prometheus_client
 py37-prompt_toolkit
 py37-ptyprocess
 py37-pygments
 py37-send2trash
 py37-setuptools
 py37-simplegeneric
 py37-six
 py37-terminado
 py37-testpath
 py37-tornado
 py37-traitlets
 py37-tz
 py37-wcwidth
 py37-webencodings
 py37-widgetsnbextension
 py37-zmq
Continue? [Y/n]: Y
--->  Fetching archive for ipython3_select
（中略）
--->  Installing py37-jupyter @1.0.0_1
--->  Activating py37-jupyter @1.0.0_1
--->  Cleaning py37-jupyter
--->  Updating database of binaries
--->  Updating database of C++ stdlib usage
--->  Scanning binaries for linking errors
--->  No broken files found.
--->  No broken ports found.
--->  Some of the ports you installed have notes:
  py37-ipython has the following notes:
    Please note that since version 4.0 IPython was refactored and splitted across several packages under new project named Jupyter.
    
    To make this the default IPython or IPython3 (i.e., the version run by the 'ipython' or 'ipython3' commands), run one or both of:
    
        sudo port select --set ipython py37-ipython
        sudo port select --set ipython3 py37-ipython
  py37-pygments has the following notes:
    To make the Python 3.7 version of Pygments the one that is run when you execute the commands without a version suffix, e.g.
    'pygmentize', run:
    
    port select --set pygments py37-pygments
```
とこんなコメントが出てくる。（python3.7の場合）

###2.コメント通りデフォルトの設定をする。

```:terminal
$ sudo port select --set ipython py37-ipython
Password:
Selecting 'py37-ipython' for 'ipython' succeeded. 'py37-ipython' is now active.
$ sudo port select --set ipython3 py37-ipython
Selecting 'py37-ipython' for 'ipython2' succeeded. 'py37-ipython' is now active.
$ sudo  port select --set pygments py37-pygments
Selecting 'py37-pygments' for 'pygments' succeeded. 'py37-pygments' is now active.
```

###3.Ipython notebookを動かす

```:terminal
$ ipython notebook
[TerminalIPythonApp] WARNING | Subcommand `ipython notebook` is deprecated and will be removed in future versions.
[TerminalIPythonApp] WARNING | You likely want to use `jupyter notebook` in the future
(後略)
```
動いた。良かった
TruffleでDeployするときの Contract Ownerについて

####Contract Ownerを変えようとしてちょっと調べました、
Ethereumのgeth nodeを経由して truffle migrate --network xxxx として ContractをDeployする際、truffleはデフォルトで eth.accounts[0]をそのContractのownerにします。

別のaccountをownerにしたい場合は、truffle.js に from: を設定します。

```truffle.js
module.exports = {
networks: {
       development: {
       host: "127.0.0.1",
       port: 8545,
       network_id: "*", 
       gas:  3000000,
       gasPrice: 4500000000,
       from: "0x25aa5a1b94dfef4af501b10e988f6f4d4a912000"
      }
   }
};
```
参考ページ
[https://truffleframework.com/docs/truffle/reference/configuration](https://truffleframework.com/docs/truffle/reference/configuration)
Doma Gen の Gradle タスクを Buildship で実行できない


環境
----------

* Eclipse Oxygen.3a (4.7.3a)
* Buildship 2.2.1

問題
----------

カスタムタスクが Gradle タスクのビューに表示されない。
tasks を実行しても表示されない。

原因
----------

どうやら、タスクの定義がイマイチらしい。

Doma Gen のタスクはドキュメントでは次のようになっている。

```gradle
task gen << {
    ant.taskdef(resource: 'domagentask.properties',
        classpath: configurations.domaGenRuntime.asPath)
    ant.gen(url: 'jdbc:postgresql://127.0.0.1/example', user: '', password: '',
        templatePrimaryDir: 'mytemplate') {

        entityConfig()
        daoConfig()
        sqlConfig()
    }
}
```

これは次のように定義するのがベター。

```gradle
task gen {
    group = 'doma'
    description = 'タスクの説明をここに書く'
    doLast {
        ant.taskdef(resource: 'domagentask.properties',
            classpath: configurations.domaGenRuntime.asPath)
        ant.gen(url: 'jdbc:postgresql://127.0.0.1/example', user: '', password: '',
            templatePrimaryDir: 'mytemplate') {

            entityConfig()
            daoConfig()
            sqlConfig()
        }
    }
}
```

まず << は現在推奨されていない（？）ので doLast で代替する。ポイントは group と description を定義すること。ちなみに、`<<` とか `doLast` はタスクの定義にはほぼ必須で、これがないと、build.gradle が読み込まれた時点で即実行されてしまい、任意のタイミングでタスクとして実行できない。


感想
----------

正直なところ、私は Gradle の体系的な知識に欠けているよなと自省。業務ではライブラリの jar ファイルがそのまんま Subversion に上がっているようなプロジェクトばっかりで、Gradle がライブラリの管理をしてくれるだけで、つまり、jar ファイル自体はバージョン管理外にできるという点だけで、Gradle は良い仕事をしてくれるようなぁと思ってしまうレベルです。そもそも SVN かよ。
python 久しぶりに　自分用めも

インターンが始まった。しばらくはpythonでデータを色々処理したりすることをやるみたい。いうて久しぶりすぎてやばいから復習せな。オライリーのデータ処理系の本を一冊買おうかと思う。

c++と結構こんがらがるな～～

内包表記とかいうのに久しぶりに触れた。
[expression for item in iterable]
条件式も追加できる
[expression for item in iterable if condition]

辞書包括表記
{key_item:value_item for item in iterable}

集合内包表記
{item for item in iterable}

ジェネレータ内包表記
(item for item in iterable)
ジェネレータ内包表記は一度だけしか実行できない

pandas

import sys
sys.path.append('~')
import pandas as pd
df = pd.read.csv("データ")
print(df.query("office_number>=100"))か、
print(df[df["office_number"]>=100])の形で、
条件指定してデータを抽出できる

行を取り出すには、DataFrame.locという関数を使っていく。

titanic_df.loc[0:2]のように

groupby関数を用いると、指定された列を値毎にグルーピングしてくれる。 帰ってきたgroupbyオブジェクトで集計関数を呼び出すと、 グループごとの平均や最大値、中央値などを調べることができる。

Survive列が0か1かで生存したかどうかを示している。
生存した人たちと、していない人たちで各値の平均をとってみる。
titanic_df.groupby(['Survived']).mean()

Python では lambda 式を使って無名関数を定義することができます。
lambda 式のフォーマットは lambda x: y です。 x が引数で、 y が戻り値です。
my_funk = lambda x:x**2
と
def my_funk(x):
    return x**2
は同じ

l1 = [1, 3, 5]

l2 = map(lambda x: x ** 2, l1)

print(l2)  [1, 9, 25]

  l2 = [x ** 2 for x in l1]  

pandas で行 / 列からデータ選択する方法をざっとまとめた。少し複雑なデータ選択をするときにやるべき流れは、
対象となる 行 / 列のデータと選択条件を確認する
API ガイドにやりたい処理に直接 対応するものがないか探す。
直接 対応するものがなければ、全体をいくつかの単純な処理に分解して、最終的に__getitem__ や ix に渡せる形にできるか考える。
自作関数を使ったほうが早そうだな、、、というときには Index.map or DataFrame.apply。
laravelのcollectionをフィルタリングしてkeyを振り直す

# 背景
既知の人も多いでしょうが、
なんか良いやり方がパッと思いつかなかったので備忘録に。

ちなみにlaravel5.5です

# 何がしたいのか
laravelのcollectionにて
集計したデータをフィルタリングして、
collectionのkeyを順番に振り直したい

# フィルタリング
```
$collection = Collection::make([
   ["id" => "1", "is_use" => true],
   ["id" => "2", "is_use" => true],
   ["id" => "3", "is_use" => false],
   ["id" => "4", "is_use" => true],
]);
```

例えばこういったコレクションがあるとして、
`is_use`がtrueのものだけを集計したいとする


```
$filtered = $collection->filter(
    function ($value) {
        return $value['is_use'];
    }
);

dd(filtered)
```
こういった感じでフィルタリングしてやると


```
Collection {
  [
    0 => [
      "id" => "1"
      "is_use" => true
    ]
    1 => [
      "id" => "2"
      "is_use" => true
    ]
    3 => [
      "id" => "4"
      "is_use" => true
    ]
  ]
}
```
キー「2」が抜け番になっちまった。。。



それだと使いにくいことがある（あった）ので、


```
$filtered = $collection->filter(
    function ($value) {
        return $value['is_use'];
    }
)->values();

dd($filtered)
```

valuesをチェーンしてやると

```
Collection {
  [
    0 => [
      "id" => "1"
      "is_use" => true
    ]
    1 => [
      "id" => "2"
      "is_use" => true
    ]
    2 => [
      "id" => "4"
      "is_use" => true
    ]
  ]
}
```

って感じで振り直してくれる。


### 追記
チェーンするvaluesは関数なので「()」をつけねばなりません。
@nunulkさん、ご指摘ありがとうございました。
visual studio 2012以降のプロジェクト変換時によく出るエラーの回避方法

# 事象
昔のプロジェクトを変換したとき、こんなエラーが出る

`C:\Program Files (x86)\Windows Kits\8.0\Include\um\objidlbase.h(6080): error C2061: 構文エラー : 識別子 '__RPC__out_xcount_part'
2>C:\Program Files (x86)\Windows Kits\8.0\Include\um\objidl.h(14288): error C2061: 構文エラー : 識別子 '__RPC__inout_xcount'`
# 対処
1. include
全部のプロジェクトに対して
プロジェクト＞プロパティ＞構成プロパティ＞VC++ディレクトリ＞インクルードディレクトリ　に
`　C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include`
を追加する
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/230884/95f0cae7-ca8d-66e0-9ada-7b13f3d276dd.jpeg)

2. プリプロセッサ
１でもまだコンパイル通らないときは、
プロジェクト＞プロパティ＞構成プロパティ＞C/C++>プリプロセッサ＞プリプロセッサの定義　に
`_USING_V110_SDK71_`
を追加する
 ![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/230884/1fe5a787-55ca-bc50-7f4f-681b87ab200a.jpeg)

プロジェクト＞プロパティ＞構成プロパティ＞全般＞プラットフォームツールセットを「Visual Studio 2013 – Windows XP (v120_xp)」にしても解決する（プリプロセッサの定義の継承値に上記定義が追加される）

仕組みや誤りはgoogle先生やコメント欄の賢人達が教えてくれるハズ…
MAMPの設定方法

* MAMPとは
* ダウンロード
* 設定

* * *


#MAMPとは

>
MAMP（無料版）は、WindowsとOS X上で動作するWEBデベロッパー向けのツールです。
>
MAMPをインストールするだけで、ローカルでWEB開発をするのに必要になってくる以下の環境が一通りインストールされます。
>
Apache
Nginx
MySQL
SQLite
PHP
Python
Perl
その他にインストールされるコンポーネントに関してはこちらを参照してください。
>
基本的にインストール作業を行うだけで、特に初期設定も必要なく、PHPなどを使用したWEB開発がすぐに使い始められるのは面倒くさくなくて良いです。

#ダウンロード
https://www.mamp.info/en/
StrongSwan で作る iOS 対応 IKEv2 VPN サーバー

iOS から接続できる IKEv2 VPN サーバーの作り方を紹介します。

# 準備

iOS デバイスにクライアント証明書をそれぞれ発行するのは面倒なので、クライアント側はユーザー名とパスワードで認証することにして、サーバー証明書だけ準備しておきます。

## サーバー証明書

OpenSSL 等を用いて適当に作成します。作成方法は簡単に検索で見つかるのでここでは書きませんが、 CN はサーバー名になるので気をつけましょう。既存のサーバー証明書があれば流用する事もできます。

秘密鍵を `/etc/ipsec.d/private/` に、証明書を `/etc/ipsec.d/certs/` にコピーしておきます。以降の説明では、それぞれのファイル名が `server.key` および `server.pem` であるものとします。

# StrongSwan 設定

StrongSwan をインストールしたら必要な設定を書き込みます。

## `/etc/ipsec.secrets`

サーバーの秘密鍵とユーザー認証のためのパスワードを以下のように設定します。 (実際には容易に推測できないパスワードを用います。)

```
: RSA server.key

vpnuser1 : EAP "open.sesami"
```

## `/etc/ipsec.conf`

以下のように設定します。 (詳細な項目は省略しています。)

```
conn %default
    leftsubnet = 198.51.100.0/24
    leftauth = pubkey
    leftid = vpn.example.com # サーバー証明書の CN
    leftcert = server.pem
    ike = aes-aes256-sha256-aesxcbc-sha1-modp2048-modp1024
    esp = aes-aes256-sha256-aesxcbc-sha1

conn roadwarrior
    leftsubnet = 0.0.0.0/0, ::/0
    leftsendcert = always
    rightsourceip = 198.51.100.192/26
    rightdns = 198.51.100.2, 198.51.100.3

conn roadwarrior-eap
    also = roadwarrior
    rightauth = eap-mschapv2
    eap_identity = %any
    auto = add
```

# iOS 設定

VPN 構成でタイプ「IKEv2」認証「ユーザ名」として、リモート ID にサーバー証明書の CN を間違えずに記入すれば接続できるようになると思いますが、サーバー証明書のルート CA 証明書をインストールする必要があるかもしれません。
技術的負債とは

#はじめに
先日、いっちょ前に勉強会に参加してきて、できる気なっているギノキンです。

「人間はインプットしても、１週間後は何も覚えていない。」という記事を何かで見たことがあるので、
一生懸命メモしたノートを見返して、足りない脳みそで勉強会の内容を自分なりにまとめてみることにしました。

今回、技術的負債についての勉強会に参加して来たので**「技術的負債」**について
また例え話ではRailsを書くと言うていで記事を書かせていただいており、２記事構成で書いております。

- 技術的負債とは ←（本記事）
- [技術的負債との付き合い方](https://qiita.com/ginokinh/items/80763d6caac8e80b10fa)

では、早速↓↓

#技術的負債とは
まず技術的負債とは、ウィキペディアだと
*「行き当たりばったりなソフトウェアアーキテクチャと、余裕のないソフトウェア開発が引き起こす結果のことを指す。比喩表現のこと。」*
と説明がなされています。

経験の乏しい僕にはこの説明ではわかりませんでした。なので簡単にまとめてみました。

###「技術的負債」を簡単にいうと、、、「（イメージは）技術的な借金のこと」
負債とは借金のことですが、システム開発においても借金があると言うことです。
身近な話だと、みなさんがいつも使用しているスマホでもアプリのアップデートが必要だと思います。
しかし、「面倒だ！」と後回しにするようなこと。それを**「技術的負債」**と言います。

後回しにしていると、そのアプリの古い使用で使用することになり、不具合を起こしたり、スマホに負担をかけてしまったりします。

また一度にアップデートしようとすると、時間が異常にかかったりなどです。（フリーズしたのかな？？ってくらいの時もありました）

このようなのものを「技術的な借金」＝＞**「技術的負債」**と言っています。

また、借金は利子を払い続けます。
それと同じように、「技術的負債」を抱えると、その利子というものを払い続けなければならなくなる。という比喩もしています。

例えば、、、
コードを書いた時に、コードを無駄に長く書いたり、実際は不要なメソッドが増えて行ったりして行くことも。**「技術的負債」**になります。
この不要なメソッドがあると「（開発の都度）そのメソッドと対応するコードを探したり」,「不要なんじゃないか?」と考えたりという。**「不要な時間（労力）」**をツケとして払い続けないといけません。

これが**「技術的負債」**です。

#終わりに
知識が少なく経験が浅いと、分からない用語が毎日のように出て来ます。
ですが、その分からない用語をそのままにしていると、、、
理解が遅くなったり他のエンジニアとのコミュニケーションがうまく取れなくなったり
自分自身の`「成長」`や`「時間」`を無駄にしていきます。

なので、これを読んでくれた方には是非ともこの`「知識的な負債（分からないもの）」`をそのままにせずに、理解してから次に進んで言って欲しいです。

また間違ったような表現などありましたら、ご教示いただけますと幸いです。
よろしくお願いいたします。
exeファイル作成【GeneXus】

GeneXusのプロシージャでexeファイルを作成します。

言語
C#

###プロパティ
プロシージャのプロパティを変更します。
Main program  -> True
Call protocol  -> Command Line
![exeファイルプロパティ.PNG](https://qiita-image-store.s3.amazonaws.com/0/270892/a32aea44-f121-7625-a460-27c90b8e226e.png)

###Rules
パラメータは以下のようにします。（&pTestはVarCharの40です。）

```:Rules
// パラメータ
Parm(In:&pTest);
```

※コマンドラインはパラメータのoutで返せないのでメッセージ関数を使用します。

###Source
パラメータで受け取ったものをそのままメッセージ関数で返してあげる簡単な処理です。
第二引数を入力しないと返ってきません。第二引数の詳細についてはwikiを参照してください。[Messageコマンド](http://wiki.genexus.jp/hwiki.aspx?Message+%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)

```:Source
msg(&pTest, status)
```

##実行
exeファイルは「～\Models\ナレッジ名\CSharpModel\web\bin\」直下に作成されます。

exeファイルの後に入力値を与えます。
コマンドで叩きます。「おねがいしまーす」


```:コマンドプロンプト（実行前）
C:\Models\ナレッジ名\CSharpModel\web\bin>プロシージャ名.exe てすと
```

すると入力した値をそのまま返してくれます。

```:コマンドプロンプト（実行後）
C:\Models\ナレッジ名\CSharpModel\web\bin>プロシージャ名.exe てすと
てすと
```

##注意事項
コマンドラインで実行するにあたって文字列の制限があります。私はこれでずっと「Process is terminated due to StackOverflowException.」が表示されて実行できませんでした。詳細は以下の通りです。
[コマンド プロンプト (cmd.exe) のコマンドライン文字列の制限](https://support.microsoft.com/ja-jp/help/830473/command-prompt-cmd-exe-command-line-string-limitation)
C＃Excelを作成する別の円グラフと別のリングチャート

分割された円グラフと分割リングチャートには共通点があり、複数のデータ系列を含むことができ、合計値に対する単一の値のサイズを示し、単一の値を強調します。 同時に、別々の円グラフには、積分分離と部分分離という2つの分離方法があります。 この記事では、Spire.Xls for .NETを使用して別々の円グラフと別のリングチャートを作成する方法を説明します。
1.[Spire.XLS for .NET](https://www.e-iceblue.com/Introduce/excel-for-net-introduce.html) をダウンロードしてインストールし、プロジェクトにSpire.Xls.dllを参照してください。
2.Visual Studioにコードを挿入する：
**全体的な分離円グラフ**
【C#】

```ruby:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Spire.Xls;

namespace Explode_PieChart3
{
    class Program
    {
        static void Main(string[] args)
        {  
            Workbook workbook = new Workbook();
            workbook.LoadFromFile("円グラフ.xlsx");

            Worksheet ws = workbook.Worksheets[0];
            Chart chart = ws.Charts[0];

            for (int i = 0; i < chart.Series.Count; i++)
            {
                chart.Series[i].DataFormat.Percent = 20;
            }

            workbook.SaveToFile("パイチャートの爆発.xlsx", FileFormat.Version2013);
        }
    }
}

```
デバッグしてコードを実行した後、次のようにドキュメントを生成します：
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/278784/21d873a1-75fa-84ab-918c-71c6f7b07190.jpeg)

**部分的に分けられた円グラフ**
【C#】

```ruby:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Spire.Xls;

namespace Explod_PieChart4
{
    class Program
    {
        static void Main(string[] args)
        {
            Workbook workbook = new Workbook();
            workbook.LoadFromFile("円グラフ.xlsx");

            Worksheet ws = workbook.Worksheets[0];
            Chart chart = ws.Charts[0];

            chart.Series[0].DataPoints[1].DataFormat.Percent = 20;

            workbook.SaveToFile("パイチャートの爆発2.xlsx", FileFormat.Version2013);
        }
    }
}

```
デバッグしてコードを実行した後、次のようにドキュメントを生成します：
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/278784/4531777e-5f58-419c-391f-cd657adada9c.jpeg)
**別のリングダイアグラム**
【C#】

```ruby:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Spire.Xls;

namespace ExplodedDoughnutChart5
{
    class Program
    {
        static void Main(string[] args)
        {
            
            Workbook workbook = new Workbook();
            workbook.LoadFromFile("ドーナツチャーツ.xlsx", ExcelVersion.Version2010);            
            Worksheet sheet = workbook.Worksheets[0];            
            Chart chart = sheet.Charts[0];           
            chart.ChartType = ExcelChartType.DoughnutExploded;
            workbook.SaveToFile("爆発したドーナツチャート.xlsx", ExcelVersion.Version2010);
        }
    }
}

```
デバッグしてコードを実行した後、次のようにドキュメントを生成します：
![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/278784/d051dbe7-db0b-581f-c845-c6ae6c1cfcb4.jpeg)
macのローカルでapacheが立ち上がらないときに確認するhttpd.confのsyntax check

今年、新調したmacbookのローカルでapacheが立ち上がらなかったため、いろいろ調べたがツイッターのある方に助けてもらったので確認方法を残す

# 前提
- macにapache、phpはインストールされている
- apache内にユーザー単位のファイルが既に作られている
    - ```/etc/apache2/users/ユーザ名.conf```
- sudo apachectl startをしてもlocalhostが起動しない
- プロセスが立ち上がっていない
    - ```ps aux | grep httpdで立ち上がっていないことを確認```

# 確認方法

```shell:apacheのsyntax的な問題を確認
sudo apachectl configtest
```

実行すると私の場合は以下のように表示される

```shell:診断結果
<Directory "Users/kamo/Sites/">
httpd: Syntax error on line 511 of /private/etc/apache2/httpd.conf: Syntax error on line 16 of /private/etc/apache2/extra/httpd-userdir.conf: Syntax error on line 4 of /private/etc/apache2/users/kamo.conf: Expected </Directory> but saw </Directiory>
```

どうやら```/private/etc/apache2/users/kamo.conf```で```<Directory>```の閉じタグの書き方が間違っていたみたいで、即修正

これで問題ないかと思うけど念のためにもう一度確認すると

```shell:診断結果
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using kamoui-MacBook-Pro.local. Set the 'ServerName' directive globally to suppress this message
Syntax OK
```

syntax的にはOKみたいだけど、「ServerNameを決めてくれ」と警告が出ていたのでこれを```httpd.conf```にて直す

```diff:#を取るかlocalhostで指定する
- #ServerName www.example.com:80
+ ServerName localhost
```

これで問題ないだろうと思うが念のために最終確認

```shell:診断結果
Syntax OK
```

やっと問題が出ないようになったので```sudo apachectl restart```をすると```localhost```のIt works!が表示されるようになった！
mod_perl2のカレントディレクトリ問題

mod_perl2でカレントディレクトリがスクリプトのディレクトリにchdir()しない場合は、

```conf:httpd-perl.conf
PerlModule ModPerl::RegistryPrefork
<FilesMatch "\.(cgi|pl)$">
    SetHandler perl-script
    PerlResponseHandler ModPerl::RegistryPrefork
    PerlOptions +ParseHeaders
    Options +ExecCGI
</FilesMatch>
```
npm intallしたときに脆弱性チェックでエラーが発生した

# npm intallしたときに脆弱性チェックでエラーが発生した

```
❯ npm install
audited 28991 packages in 10.578s
found 7 vulnerabilities (1 low, 1 moderate, 4 high, 1 critical)
  run `npm audit fix` to fix them, or `npm audit` for details
```


`npm audit`で詳細をチェックできる。

下記のように表示されるので、# Run以下のコマンドを実行して脆弱性に関わる問題を解消する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/199401/a144547b-29bb-2b19-b8e0-e08fdcc00724.png)


0になった。


```
❯  npm install --save-dev nightwatch@1.0.11
npm WARN url-loader@1.1.1 requires a peer of webpack@^4.0.0 but none is installed. You must install peer dependencies yourself.

+ nightwatch@1.0.11
added 18 packages from 440 contributors, removed 22 packages, updated 16 packages and audited 28985 packages in 12.468s
found 0 vulnerabilities
```


[脆弱性の警告を受けたnpmパッケージの依存関係を力技で直す](https://qiita.com/hibikikudo/items/0af352acac85fce28ec2)
Pythonのクラス変数を安全に書き換える

前置き
---

次のようなコードを書いて、予想しない挙動に困っている人をしばしば見る。

```Python
class MyClass:
    cls_var_int = 42
    cls_var_str = 'spam'

    def set_cls_vars(self, new_val_int, new_val_str):
        self.cls_var_int = new_val_int
        self.cls_var_str = new_val_str


inst1 = MyClass()
inst2 = MyClass()

inst1.set_cls_vars(6, 'ham')
assert inst1.cls_var_int is inst2.cls_var_int  # AssertionError! なんで!?
```

クラス変数としての`cls_var_int`と、
インスタンス変数としてのそれが共存してしまっているのが原因だ。

```pycon
>>> inst1.cls_var_int
6
>>> MyClass.cls_var_int
42
```

このような凡ミスを避ける一つの方法として、
常に**「クラス名.属性名」でのアクセスを徹底する**、というものがある。

```Python
class MyClass:
    cls_var_int = 42
    cls_var_str = 'spam'

    def set_cls_vars(self, new_val_int, new_val_str):
        MyClass.cls_var_int = new_val_int
        MyClass.cls_var_str = new_val_str
```

しかしこの場合、クラス名の変更に際して被影響範囲が広くなってしまう。

本題
---
この例に限ってはクラスメソッドを利用すれば解決するのだが、
都合上どうしてもインスタンスメソッド内でクラス変数を書き換えたい場合もある。

そのようなとき、個人的には次のように書いてしまうことが多い。

```Python
class MyClass:
    cls_var_int = 42
    cls_var_str = 'spam'

    def set_cls_vars(self, new_val_int, new_val_str):
        cls = type(self)

        cls.cls_var_int = new_val_int
        cls.cls_var_str = new_val_str


inst1 = MyClass()
inst2 = MyClass()

inst1.set_cls_vars(6, 'ham')
assert inst1.cls_var_int is inst2.cls_var_int  # AssertionErrorは起きない
```

`type(self)`の代わりに`self.__class__`を使うと、旧スタイルクラスにも対応できる。
ただ、逆に『2.7に対応**させない**』ことの方が大事な気もしてくる。

同様のポスト
---
[Qiita - クラス変数にはどうアクセスすべき?](https://qiita.com/FGtatsuro/items/be22c520e62a1d100e09)
paizaラーニングをHaskellで解く　山折り谷折り(paizaランク A 相当)

paizaの練習問題がhaskellに対応していたので練習に解いてみました。

山折り谷折り(paizaランク A 相当)
https://paiza.jp/learning/origami

健忘録です。
☆☆☆でテスト通りました。

プログラムはgitのレポジトリに置いてあります。
https://github.com/mamepon2580/portfolio/tree/master/Haskell/yamatani

↓↓↓ここからが内容↓↓↓

##main関数

入力は一行のみなのでgetLineを用いて受け取りputStrLnで文字列の値を返す。

intListToStringとfoldについては後で解説する。

```haskell
{-main関数-}
main = do
  x <- getLine
  putStrLn (intListToString (fold (read x :: Int)))
```

##IO関数

ここでは受け取ったIntのリストを文字に変換し、文字列として値を返す。

- `intListToString` はInt型のリストを文字列に変換する関数であり、リストの要素に対しshowを再帰的に適応し文字列に変えて値を返す。

```haskell
intListToString :: [Int] -> String
intListToString [] = []
intListToString (x:xs) = (show x) ++ (intListToString xs)
```

##その他の関数

ここからがプログラムの内容

実際に折ってみるとわかるが、一番始めに折り目をつけたところを中心に左右で山折りと谷折りが反転する。なので予め０と１を反転する関数を作り、あとは順序を逆にして連結させればよいので、左半分のみを考える。また左半分に着目すると、１つ前の状態と同じになる。

- `reverse01` は0と1からなる受け取ったIntの値に対し0ならば1を、1ならば0の値を返す関数である。

- `fold` は受け取った数が1のときは0を、そうでないときは引数がiであれば0を中心にして、左側にfoldにi - 1を代入した値を、右側にfoldにi - 1を代入し、1と０を反転させた値を順序を逆にして、Intのリストとして連結したものを返す関数である。


```haskell
reverse01 :: Int -> Int
reverse01 x | x == 0 = 1
            | x == 1 = 0

fold :: Int -> [Int]
fold 1 = [0]
fold i = fold (i - 1) ++ [0] ++ map reverse01 (reverse (fold (i - 1)))
```

他のAランクの練習問題と比べてめちゃめちゃ簡単だった。
セッションとキャッシュごっちゃになってない？

# タイトルのようなことを言われてしまったので、今一度まとめ直しました。
## セッション
### セッションって？

セッションは、ある一連の流れの始まりから終わりまでのこと!!
例えば、ログインからログアウトまでの一連の操作等。

セッションは、ブラウザ(クッキー※後述)でIDのみ管理されており、IDをサーバに渡すことで、
一時的保存されたデータを呼び起こすことができます。

### セッションを使う理由って何なの？
HTTPプロトコルには状態を管理する方法がためです。（ステートレス）
なので、どんな人が何回アクセスしたとかどういう経緯でアクセスしたか等の
情報を、HTTPプロトコルは保持できない...

### セッションっての内容はどこに保存されているの？
セッションに保存された内容は、Webサーバーにファイルとして保存されている。
しかし、商用利用するにあたっては、最低限DBで管理します。
インメモリDB(※1)、例えば、Redisにのせてしまう手法があります。
要は、保存して取り出せれば、どこでもよいですね。

(※1)メモリ上にデータを保存するタイプのデータベース
### そのユーザかどうかは、どうやって判別するの？
ブラウザにセッションIDがCookieに記録されます。
そのセッションIDとサーバ上のファイル(DB, Redisなど)が照合されてセッション内容を取り出す:point_up_tone1:

## キャッシュ
### キャッシュって？
一度アクセスしたサイトのデータを一時的に保管し、
次回より同じページにアクセスした際の表示を速くする仕組みのこと:football:

### キャッシュの扱いってむずくない？
キャッシュを使用するに当たって、大事なことは、
キャッシュ対象のものをどの時点でExpire(失効、有効期限)するかということ。
対象によっては、常に最新ではなくてよい、最新であってほしいということがあるので、
そこはキャッシュ対象となるものがどの時点でExpireするかを考える必要があります。

その時に、大事になることが、
「次回アクセス時の表示を速くし、無駄なリクエストを減らす」
↑に尽きるかと思います。:fist:
キャッシュを使用するに当たっては、これが大原則だと思うので、
これを念頭において、キャッシュ設計をします。

### Redisをキャッシュとして使う時に、気をつけること
あくまでキャッシュは、「一時的なデータの保存先」という位置づけなので、
データの永続化ができるからといって、ストレージ的な使い方をしてはいけない。←大事:raised_hand:
「いつ消えてもよいデータを管理する」という軸で設計すると、良き:clap:

## クッキー（おまけ)
### クッキーって？
クッキーは、ブラウザに保存されるWEBデータです。
ブラウザのクッキー情報を削除すると、ログイン仕直しになるのは、
ブラウザ上に保存されたデータが無く、ログインできなくなるため。

一言で言うと、
Webサーバからブラウザに送られる、ユーザのデータを保存しておくためのファイルのこと。

### デメリットってあるの？
共用パソコンで個人情報を流出してしまうこと。
借りてるPC等で、サイトにログインした場合は、クッキーは削除しておきましょう:umbrella2:

### クッキーっていつもらえんの？
ウェブサイトを提供するサーバからもらえます。

### クッキーもらっても送ってるつもりないんだけど。。。
サーバへアクセスするたびに毎回自動で送信しています。

### クッキーってずっと持ってるの？
指定期限があるので、それまで有効です。
Composerを使ってCakePHP3をインストール（Windows）

# PHPのパスを設定
環境変数にPHPのパスを登録していない場合はコマンドで設定

```
set PATH=<path>\PHP
```

環境変数が登録されているかの確認

```
echo %PATH%
```

# CakePHP3をインストール
Proxy認証が必要な場合はcomposer.batに設定を記入

```
set HTTP_PROXY=http://<user>:<pass>@<proxy>:<port>/
set HTTPS_PROXY=%HTTP_PROXY%
set HTTP_PROXY_REQUEST_FULLURI=0
set HTTPS_PROXY_REQUEST_FULLURI=%HTTP_PROXY_REQUEST_FULLURI%
```

プロジェクトを管理したいディレクトリへ移動してコマンドを実行

```
composer create-project --prefer-dist cakephp/app <project>
```

インストールの最後に"Set Folder Permissions ? (Default to Y) [Y,n]?"と聞かれるのでEnterでインストールが完了

Smartyを使いたいのでSmartyをインストール

```
cd <project>
composer require "smarty/smarty":"^3.1"
```
cssのプロパティに*を使う書き方

```css
* { 
	padding: 0;
	margin: 0;
}
```
これはわかる


改修中にこんなコードを見た

```css
.block{ 
	float: left;
	*display: inline;
}
```

書き間違えのゴミかと思って調べたらしっかりと意味があった

##IE7以下用のcss
初めて知った、、、

https://hail2u.net/blog/webdesign/asterisk-hack.html
Windows環境で複数バージョンのPHPをインストール

# Apacheのインストール
まずは、Windows用のApacheを[http://www.apachelounge.com/download/](http://www.apachelounge.com/download/)からダウンロードする。
そして、配置したいディレクトリにzipを解凍して`conf\httpd.conf`のServerRootやDocumentRootなどを設定する。

```config:httpd.conf
# D:\Server\Apache-2.4
ServerRoot "D:\Server\Apache-2.4"
```


# PHPのインストール
Windows用のPHPを[http://www.php.net/](http://www.php.net/)からダウンロードする。
そして、配置したいディレクトリにzipを解凍して`php.ini`のextension_dirやinclude_pathを設定する。

```config:php.ini
# D:\Server\PHP-7.2
include_path = ".;D:\Server\PHP-7.2\includes"
extension_dir = "D:\Server\PHP-7.2\ext"
```

# ApacheでPHPバージョンの切り分ける
バージョンごとにApacheの`httpd.conf`と`httpd-php.conf`を`D:\Server\Apache-2.4\conf\php-[version]\`に作成してインクルードでconfを読み込む。

```conf:httpd.conf
# D:\Server\Apache-2.4\conf\php-7.2
Include D:\Server\Apache-2.4\conf\httpd.conf
Include D:\Server\Apache-2.4\conf\ext\httpd-*.conf
Include D:\Server\Apache-2.4\conf\php-7.2/httpd-*.conf
Include D:\Server\Apache-2.4\conf\vhosts\*.conf
```

バーチャルホストの設定はディレクトリを分けておくとPHPバージョンが変わっても共通にできるので便利。

```conf:httpd-php.conf
# D:\Server\Apache-2.4\conf\php-7.2
LoadFile "D:\Server\PHP-7.2\php7ts.dll"
LoadModule php7_module "D:\Server\PHP-7.2\php7apache2_4.dll"
<IfModule mime_module>
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
    PHPIniDir "D:\Server\PHP-7.2\"
</IfModule>
```

# ApacheをWindowsのサービスに登録する

サービスを登録する場合

```
httpd.exe -k install -n "Apache24-php72" -f "D:\Server\Apache-2.4\conf\php-7.2\httpd.conf"
```

サービスを削除する場合

```
httpd.exe -k uninstall -n "Apache24-php72"
```
TypeScript で literal type を union している型をオブジェクトのキーに使用する

忘れがちなのでメモ

## やりたいこと

```typescript
type ALPHABET = "a" | "b" | "c" | "d";
```

がある時に

```typescript
{
  a: 1,
  b: 2,
  c: 3,
  d: 4
}
```

という `ALPHABET` をキーとして持つオブジェクトの型付をしたい。

## やりかた

```typescript
const obj: { [A in ALPHABET]: number; } = {
  a: 1,
  b: 2,
  c: 3,
  d: 4
};
```
GAE+GO+echoでpayjpを使う時にhttp.DefaultClient are not available in App Engineで怒られる時の対処

実際簡単すぎて特に書くことは無いのだが忘却録的に

エラー内容は以下

> ERROR: %!(EXTRA *url.Error=Post https://api.pay.jp/v1/charges: http.DefaultTransport and http.DefaultClient are not available in App Engine. See https://cloud.google.com/appengine/docs/go/urlfetch/)

エラーが出ていた時の初期化処理はこちら

```go
	// 初期化
	pay := payjp.New("秘密鍵", nil)
```

エラー解消後。

```go
	//通信にGAEのクライアントを使うためここで取得
	ac := appengine.NewContext(c.Request())
	client := urlfetch.Client(ac)

	// 初期化
	pay := payjp.New("秘密鍵", client)
```

なんのことはなく、GAEから外へ通信を行うにはGAE用のクライアントを使わなければならないということだった。

せっかくなので一通りのコード

```go
package middleware

import (
	"appengine"
	"appengine/urlfetch"
	"github.com/labstack/echo"
	"github.com/payjp/payjp-go/v1"
)

type PayResponse struct {
	Paid     bool
	Captured bool
	Amount   int64
}

func PayJpCharge(c echo.Context, Token string, Amount int, UserName string) (PayResponse, error) {

	//通信にGAEのクライアントを使うためここで取得
	ac := appengine.NewContext(c.Request())
	client := urlfetch.Client(ac)

	// 初期化
	pay := payjp.New("秘密鍵", client)

	// 支払い実行
	charge, err := pay.Charge.Create(Amount, payjp.Charge{
		Currency: "jpy",
		// Tokenを設定
		CardToken: Token,
		Capture:   true,
		// 概要のテキストを設定
		Description: UserName,
	})
	if err != nil {
		return PayResponse{}, err
	}

	// 支払った結果から、Response生成
	res := PayResponse{
		Paid:     charge.Paid,
		Captured: charge.Captured,
		Amount:   int64(charge.Amount),
	}

	return res, nil
}
```
leafletを鍛える。その2

#概要
leafletを鍛えてみる。
kmlを、読んでみた。



#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/O/u/i/Ouib.jpg?t=1536808953)

#サンプルコード


```
var map = L.map('map').setView([37.9, 140.1], 12);
var mapLink = '<a href="http://openstreetmap.org">OpenStreetMap</a>';
L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    attribution: '&copy; ' + mapLink + ' Contributors',
    maxZoom: 18,
}).addTo(map);


d3.xml('http://jsrun.it/assets/u/n/Z/1/unZ1R', function(kml) {
    var w = kml.documentElement.getElementsByTagName("Placemark");
    for (var i = 0; i < w.length; i++)
    {
        var coord = w[i].getElementsByTagName("coordinates");
        var lines = coord[0].childNodes[0].nodeValue;
        var latlon = lines.split(',');
        var marker = L.marker([latlon[1], latlon[0]]).addTo(map);
    }
});

```

#成果物

https://embed.plnkr.co/uVCnGiaRXvc2HRb8gDuH/
以上。
mariadb で、画像 を load_file で読み込む設定(備忘メモ)

mysql で、直接 load_file で画像取り込みができていました。同じことが、mariadb でもできるかを確認しました。自分用の備忘録なんで、はしりがきです。


- OS      : CentOS 7.5 (vagrant bento/centos-7)
- mariadb : 5.5.60-1.el7_5  
- /etc/my.cnf
  - [mysqld] に、secure_file_priv = ""
- user に、file_priv = Y を設定
  - 一括 grant では設定されません。mysql/user を直接 update
- ★★★パーミッションがポイント　格納しているディレクトリが、755
  - ファイルは、744 でオッケー
[Swift] Static function/var も DI する

クラス間結合を疎にして実装したい場合に、DI(Dependency Injection)の手法を使いますが、
static な関数/値をそのまま使うと結合してしまって入れ替えができなくなりますよね。

static でもDI するやり方を調べたのでメモ。

1.static な関数(変数)を宣言したプロトコルを定義します。

```Swift
protocol Animal {
    static func say()
}
```

2.プロトコルを実装します。

```Swift
class Cat: Animal {
    static func say() {
        print("nya-")
    }
}

class CatMock: Animal {
    static func say() {
        print("mock nya-")
    }
}
```

3.メタタイプ(`.Type`)のメンバ変数を定義して、初期化時に inject します。

```Swift
class Owner {
    private let animal: Animal.Type
    init(animal: Animal.Type = Cat.self) {
        self.animal = animal
    }
    
    func say() {
        animal.say()
    }
}
```

4.呼び出して使います。

```Swift
// 普通に使う時
let owner = Owner()
owner.say()

// テスト書く時
let ownerTest = Owner(animal: CatMock.self)
ownerTest.say()
```

あまり状態を持たない処理を作ることができればテストしやすくなります。
メンバ変数にアクセスしない処理などは積極的に static にしていってもいいかなと思いました。
leafletを鍛える。

# 概要
googlemapは、出禁なので、leafletを鍛えてみた。
クリックをやってみた。

# 写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/6f9cfc12-6b4c-ffe1-7cb0-3fda83c78147.png)


# サンプルコード

```
var map = L.map('map').setView([37.9, 140.1], 13);
mapLink = '<a href="http://openstreetmap.org">OpenStreetMap</a>';
L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    attribution: '&copy; ' + mapLink + ' Contributors',
    maxZoom: 18,
}).addTo(map);
map.options.singleClickTimeout = 250;
map.on('singleclick', function(e) {
	L.popup().setLatLng(e.latlng).setContent('map singleclick at ' + e.latlng).openOn(map);
});
```

# 成果物

https://embed.plnkr.co/15JIZFEPF2WeVFXDp2Ok/


以上。
C# > Json > JsonConvert.DeserializeObject エラーハンドリング


忘れるのでメモ


```csharp
var responseString = ".....json"

//Jsonコンバートする
var response = JsonConvert.DeserializeObject<ObjectClassA>(responseString, new JsonSerializerSettings
{
    Error = (sender, errorArgs) => {
        var currentError = errorArgs.ErrorContext.Error.Message;
        errorArgs.ErrorContext.Handled = true;
    }
});

        
```
突っ込む時はinterfaceで貰う時はstruct

# 困ったこと
こういうテストコードを書いていました。
テスト用にpng画像のデータをbase64でコード化しておいて使い回していました。

```go:test_image.go
package test_image

import (
	"bytes"
	"encoding/base64"
)

func GetTestAsset(key string) io.Reader {
	src := "iVBORw0KGgoAAAAN..." // png画像のbase64データ
	data, _ := base64.StdEncoding.DecodeString(src)
	r := bytes.NewReader(data)

	return r
}
```

そしてテスト本体はこんな感じです。

```
func Test(t *testing.T) {
	t.Run("Hoge hoge test", func(t *testing.T) {
		asset := test.GetTestAsset()

		resultBuffer := HogeReadAsset(asset)

		buf, _ := ioutil.ReadAll(asset)

		assert.Equal(t, buf, b) // Fail
	})
}
```

テスト対象メソッドの`HogeReadAsset()`で`asset.Read()`で最後までシークされる想定なので、
その後に`ioutil.ReadAll()`をしても空配列しか返ってこないのでテストが失敗するのです。

`io.Reader`のSeek位置を初期化できればいいのになあと思うのですが、
`io.Reader`には`Read()`しか実装されていません。

```go:io/io.go
type Reader interface {
	Read(p []byte) (n int, err error)
}
```

さあ困ったどうしよう。

# 最初からstructを返せば良い

というわけでこうしました。

```go:test_image.go
(省略)

func GetTestAsset(key string) *bytes.Reader {
	src, _ := "iVBORw0KGgoAAAAN..." // png画像のbase64データ
	data, _ := base64.StdEncoding.DecodeString(src)
	r := bytes.NewReader(data)

	return r
}
```

`bytes.Reader`は`Seek()`を持ってます。

```
func (r *Reader) Seek(offset int64, whence int) (int64, error) {
```

これでテストが通ります。

以上
JetsonTX2にTensorFlowをインストール

# JetsonTX2にTensorFlowをインストール

Jetson用のTensorFlowは通常とは別のパッケージとして提供されているので、通常のインストール方法で入れたTensorFlowはJetson上では動かない事に注意が必要です。

Bazelを用いてtensorflowをビルドする方法を解説している記事が多いのですが、手順を簡略化する為に本記事ではビルド済みのwhlファイルを落として使用していきます。 

本記事では、Jetpack3.3で動作確認が出来たtensorflow1.9.0の導入を進めていきます。


# 前提
JetsonTX2に[JetPack3.3をインストール](http://ai-coordinator.jp/ai-robot-jetson)しておく必要があります。

# 手順
## pipをインストール

python2

```shell
$ sudo apt install python-pip
```

python3

```shell
$ sudo apt install python3-pip
```

## .whlファイルをダウンロード
.whlとはwheelというpythonのパッケージ形式の拡張子です。
今回は[こちら](https://github.com/peterlee0127/tensorflow-nvJetson/releases)で配布されている.whlファイルをダウンロードします。



python2

```shell
$ wget https://github.com/peterlee0127/tensorflow-nvJetson/releases/download/binary/tensorflow-1.9.0-cp27-cp27mu-linux_aarch64.whl
```

python3

```shell
$ wget https://github.com/peterlee0127/tensorflow-nvJetson/releases/download/binary/tensorflow-1.9.0-cp35-cp35m-linux_aarch64.whl
```

もしJetpackのver3.3以外をインストールした場合は、cuDNNやCUDA等のツールと[tensorflowの当該バージョンとの適性](https://www.tensorflow.org/install/install_sources#tested_source_configurations)を確認し、ダウンロードするwhlファイルを適宜選択する必要があります。

## pip install
先ほど落としてきたパッケージをpipを用いてインストール

python2

```shell
$ sudo pip install tensorflow-1.9.0-cp27-cp27mu-linux_aarch64.whl
```

python3

```shell
$ sudo pip3 install tensorflow-1.9.0-cp35-cp35mu-linux_aarch64.whl
```

## 動作確認
無事にtensorflowのバージョンが表示されるとインストール成功、お疲れ様です！ :)

python2

```shell
$ python -c "import tensorflow as tf; print(tf.__version__)"
1.9.0
```
python3

```shell
$ python3 -c "import tensorflow as tf; print(tf.__version__)"
1.9.0
```
[rails]カラムの型変更

## 既存のテーブルのカラムの型を変更したい
既存のテーブルにあるカラムの型を間違えてstring型で作成してしまった。
型だけ変更したかった時に見つけたのでメモがわりに残しておく。

```terminal
$rails g migration change_data_title_to_article
```
空のmigrationファイルを作成したら、

```ruby
def change
  change_column :article, :title, :text
end
```

これでrails db:migrateで型が修正できる。
AAC Navigation備忘録

## 概要
AndroidArchitectureComponents Navigation備忘録その1
## 画面説明
### RootGraph選択時
<img width="1440" alt="スクリーンショット_2018-09-13_13_08_41.png" src="https://qiita-image-store.s3.amazonaws.com/0/290528/69300909-955d-f065-2f27-ce73eb3ec50d.png">

①Graph
Destination（行き先）一覧
ここに登録されたFragmentを遷移先としてActionを作ったりArgumentsを渡したりできる
ここにあるFragmentを親にしたNavigationがここから作れる？
※要検証
要は画面一覧
②Type
選択している要素のタイプ
主にRootGraph・Fragment・Actionがある
③ID
選択している要素のID
Actionを作る際に使われる（遷移先IDとして）
④Start Destination
このNavigationのエントリーポイント
最初に表示されるFragmentがセットされる
⑤Arguments
名前の通り渡す値
RootGraphにArgumentsをセットしたらどのFragmentからでも呼び出せる？（Navigationスコープ変数？）
※要検証
⑥Global Actions
〇〇Fragmentから〇〇Fragment、というActionではなく行き先のみのActionが作れる
どの画面からでも設定画面に行けるActionを作る等
⑦Deep Links
ここにトリガーのURLを入力してmanifestにnavigationをセットするだけでディープリンクできる（すごい）

### Fragment選択時
<img width="1440" alt="スクリーンショット_2018-09-13_13_14_15.png" src="https://qiita-image-store.s3.amazonaws.com/0/290528/4c9ca73c-0324-6c75-3143-039c3719c0fa.png">
RootGraph選択時とセットできるものはほぼ同じ、セットできるもののスコープが違うくらい
①Label
ラベルをつけれる

### Action選択時
<img width="1440" alt="スクリーンショット_2018-09-13_13_14_18.png" src="https://qiita-image-store.s3.amazonaws.com/0/290528/05251fc7-1311-03f3-8990-6d426537290b.png">
①ID
このIDを使ってコード(Java,Kotlin)からActionを呼び出して画面遷移ができる
初期設定だと〇〇Fragment_to_〇〇Fragment
②Destination
どの画面へ遷移するか、行き先
③Transitions
アニメーションの設定、いつもTransactionで設定していたみたいにanimリソースを使って設定可能
④Argument Default Values
遷移先Fragmentに渡したい値の型と名前を設定する（safeargsというプラグインを使用して安全に値を渡せる）
コードからnavigateを呼び出す時にBundleで渡せる
⑤Pop Behavior
Stackを設定バックボタンを押した時に遷移するFragmentを設定できる
Inclusiveにチェックを入れると戻る時に該当のFragmentをスキップできる
例：スプラッシュ画面からメイン画面に遷移した後バックボタンを押してスプラッシュ画面に戻れてしまうといけないのでInclusiveにチェックを入れて戻るではスプラッシュ画面を表示しないようにする
⑥Launch Options
遷移先のFragmentの振る舞いの設定
SingleTopは遷移先のFragmentをシングルトンにしてくれる？
参考URL:https://www.yudiz.com/a-trip-to-androids-future-navigation-architecture-component/
※要検証
Excelの表に行番号を編集する際、ROW()を使うのはもう古い？

Excelで表を作る機会が多くあると思う。
表には必ず**行番号**が付与されるべきだが、
けっこう**ROW()**を使っている人を見かける。

もちろん、数字を手入力、あるいはオートフィルを使うよりは使い勝手がいいのだが、
**=ROW()-2**のように行番号の表示をしている場合、表の上に行挿入すると
**=ROW()-3**への書き直しが発生する。

ありがちなのが、印刷する際に表タイトルや余白設定のために
1行目あたりに行を挿入し、そのままROW()の調整をせずに
上長に書類を提出して、

「これ、なんで2番から始まってんの？」

「ちゃんと確認したの？」

と指摘を受けるケース。

たかが行番号の間違いだけでドキュメントの信頼性が下がるのはもったいない。

#回答
```
=IF(OR(ISNUMBER(INDIRECT(ADDRESS(ROW()-1,COLUMN()))),ISBLANK(INDIRECT(ADDRESS(ROW()-1,COLUMN())))),MAX($A$1:INDIRECT(ADDRESS(ROW()-1,COLUMN())))+1,1)
```

自分の上のセルが番号または空白の場合は、\$A\$1から自分の上のセルまでの最大値に1加算する。
自分のセルがA1または、表として1行目の場合、「1」を表示する。

##メリット
・表の上に行挿入した場合でも番号は変わらない。
・どこかの行をコピーして表内に挿入すると、番号がちゃんと順番になる。
・表に空白行を入力した場合でも、ちゃんと考慮してくれる。
・表を作成する際にテーブルを使っている場合、対象列の関数がすべて同じとなるため、エラー表記を無くせる。
（気になる人は気になるはず）

##デメリット
・関数が長い
[C#]地名から緯度経度を取得する

##地名から緯度経度を取得する方法

地名を渡すと緯度経度を取得する方法@C# asp.netです。

今回用いるのはこちら　→　[GoogleLocationService](https://github.com/sethwebster/GoogleMaps.LocationServices/blob/master/GoogleMaps.LocationServices/GoogleLocationService.cs)

###開発環境
とりあえずの情報として
・VisualStudio 2015
・entiry framework 6.0

###手順
1.VisualStudioで適当なソリューションを準備します。
2.パッケージマネージャーコンソールから対象のソリューションに以下を流します。
>Install-Package GoogleMaps.LocationServices -Version 1.2.0.1

3.あとは適宜必要なusingを追加しながら用いていくだけ

以下参考コード
`
                            var locationService = new GoogleLocationService([YourGoogleAPIKey]);
                            var point = locationService.GetLatLongFromAddress([地名]);
`
`point`には`{緯度,経度}`の形式で取得結果が格納されます。

###注意点
・GoogleLocationServiceのInstanceを生成する際にGoogleAPIKeyを引数に渡さないと、時間当たりの使用回数に限度が生じます。
・条件は謎ですが、一部取得できない地名などが存在します。
　→「表参道」(「omotesandou」)で取得を試みた際になぜかnullが返ってきました…

地名から緯度経度を取得したい場合にはこんなんでできるよっていう
prodビルドはイベント名も節約

#事象
angularでページ遷移時に子画面にバインドしてるオブジェクトを更新し、描画を更新したい。
ところが、ローカル実行時や--aotビルドした時は問題なく動くが、--prodビルドした時だけ動かない。

#原因
処理の実行判定を、イベントオブジェクトのコンストラクタ名で行っていたため。
最適化によって、イベントオブジェクトの中身も削減されるようだ。

```ts

this.router.events.subscribe(event => {
  // ひとまずイベントが発生してるか確かめる
  console.log(event.constructor.name);
  
  if (event.constructor.name === 'NavigationEnd') {
    ... // 画面にバインドしてるオブジェクトを更新
    console.log('base navEnd');
  }
});
```
↓↓↓
##ng serve(local)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/270579/382a3f7c-fbbf-1433-fab5-083699d4cbb5.png)

##--prod
![image.png](https://qiita-image-store.s3.amazonaws.com/0/270579/59dd20fc-802a-583b-8243-abc35c379aa9.png)


えっ…省略されすぎじゃね…？
数を合計してみたところ、発生イベントそのものは変化してなさそう。
こんなところまで最適化してくれるんだね。すげー。

##対応

まあ、そもそもイベント名をハードコードしてる実装がイケてないわけでして。

```ts

this.router.events.subscribe(event => {
  // ひとまずイベントが発生してるか確かめる
  console.log(event.constructor.name);
  
  if (event instanceof NavigationEnd) {
    ... // 画面にバインドしてるオブジェクトを更新
    console.log('base navEnd');
  }
});
```

↓↓↓

![image.png](https://qiita-image-store.s3.amazonaws.com/0/270579/e7b30015-29e6-5053-e682-31148881330d.png)


やったー！直ったー！

このハードコード判定ロジック、あちこちのクラスに判子コピーされてるから
直すとこ他にもいっぱいあるんやけどね…:scream:

##おわりに
誰がこんな実装して、そんでコードレビュー通ったのかわからんけど
実装のやり方次第で、後から問題が発覚するケースもあるんだなぁ、と。

僕なら、共通クラス作ってまとめてると思う。