OmniAICreator/Qiita-1.07M huggingface dataset:
PIC32MXでI2S

以前から気になっていたのですがPIC32MXのI2S機能を試してみました。PIC32MXのI2SはSPIとの共用機能になっていて、SPIのレジスタのAUDENを1にするとI2Sとして使えます。I2Sをする場合には適当なクロックが必要なのですが、Microchipの[AN1422](http://ww1.microchip.com/downloads/jp/AppNotes/01422A_JP.pdf)には48Kのサンプリング周波数の場合USB PLLの96MHzを使ってREFCLKを12.288MHzにする方法が書かれてあります。USB PLLはPIC32MX1XXにはないので、この方法は使えません。REFCLKをSPIのクロックとして使う設定のMCLKSELを1にして、Baud Rate Generator(BRG)を適当な値にすると、正しいBCLK/LRCLKが出力されます。1フレームのビット数はMODE32=0,MODE16=1にすると片チャン32bitの64bitになり、実際のデータは16bitとなります。

![PIC32MX_I2S.png](https://qiita-image-store.s3.amazonaws.com/0/104066/f24e1413-faf1-c0f8-8764-72b11226c535.png)

デジタルオーディオのフォーマットはI2Sの他に左寄せ、右寄せ、PCMがあります。I2SのフォーマットはLRCLKから1fs空けて、MSBから出力します。

![写真（2018-06-02 19.22） #2.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/bf221e16-da7c-8dcd-9d67-c96a1fece0da.jpeg)

[AK4382A](https://qiita.com/yamori813/items/ebb8cf83871014e190db)で出力した波形

![20180604-141552.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/825603d7-690a-4ff4-45dc-e4f43d7d58f6.jpeg)

PIC32MX220F032B用のコードはここあります。

https://github.com/yamori813/pic32mx_i2s_sin

Pinguino gccとxc32のファイルを使っていて、再現性は低いですがmain.cの中にすべてあります。

DMAを二つ使ってダブルバッファで処理しています。空の割り込みでフラグを立てて、mainのループでつめ直しています。

こちらのURLからのページが大変参考になりました。この方のコードをちょっと修正してPinguinoのgccでビルドできるようにしました。

https://tutorial.cytron.io/2017/08/13/i2s-pic32mxmz-introduction/

修正したところはPPSで信号の出力先のピンを指定した事と、REFCLK周りです。オリジナルはMCLKが必要ないDACで試されたようです。

シンセ・アンプラグドさんは違う方法を試されているようですが、参考になりました。

http://d.hatena.ne.jp/pcm1723/20130103/1357200113

harmonyベースですが、microchipのページ。

https://microchipdeveloper.com/harmony:i2s-tutorial

当初Microchipのサンプルコードを追いかけていたのですが、うまくできずいろいろ探しました。MicrochipのサンプルコードはPIC18Fなどとも共通になっていて非常に見通しが悪いです。

しかしもって結構な黒魔術です。結構はまりました。

後日追記：おそらくDMAは1本でもできるのではないかと思われますが、いじると動かなくなりそうなので、そのままにしておくつもりです。
アラートダイアログ方法まとめ

#1.xmlを作成し、そのviewを使う。

fragment.java

~~~
 LayoutInflater factory = LayoutInflater.from(getActivity());
                final View inputView = factory.inflate(R.layout.row_sheet_listview, null);

                // アラートダイアログ を生成
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

                builder.setView(inputView);

~~~
inflaterでxmlを取得後、setviewメソッドでセット。


#2.アラートダイアログにリストをいれる
~~~

  // アラートダイアログ表示

                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

                builder.setTitle("取引処理選択");         //title設定

                CharSequence[] item = {Transaction+"\n"+Classification+"\n"+Pair+"\n"+Lot, "編集", "削除", "キャンセル"};        //Item設定


                builder.setItems(item, new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {

                        switch (which) {

                            case 0:
                               // Toast.makeText(getActivity(), "使い方が押された", Toast.LENGTH_LONG).show();
                                break;

                            case 1:
                                Toast.makeText(getActivity(), "編集が押された", Toast.LENGTH_LONG).show();
                                break;

                            case 2:
                                Toast.makeText(getActivity(), "削除が押された", Toast.LENGTH_LONG).show();
                                break;

                            case 3:
                                Toast.makeText(getActivity(), "キャンセルが押された", Toast.LENGTH_LONG).show();
                                break;

                            default:
                                break;

                        }
                    }
                });
                

~~~
配列に入れて、setItemメソッドを使えばよい。
[openFrameworks] 最近のmacosはProjectGeneratorを開くたびにパスを設定しなきゃいけない問題

全国20億人のPGを開くたびにパスを設定し直さなきゃいけない問題に悩まされてる皆さん

これはAppTranslocationというSierra以降の機能が悪さをしているらしい.

で, 色々解決策を探してたのですが

* 適当な場所にProjectGeneratorを移動させる
* PGを起動してみる
* パスを設定する
* 終了する
* 元の場所（of_path/projectGenerator-XXX）に戻す

で起きなくなったりします.

今の所実例が少ないので絶対に直る保証は無いですが一度試してみてください.
Chrome 67からExperimental canvas featuresはExperimental Web Platform featuresに統合されました

Chrome 66以前ではExperimental canvas featuresで有効化していた試験的なCanvas APIは、Chrome 67以降ではExperimental Web Platform featuresで有効化することができます。

以前にExperimental canvas featuresを有効化していた場合でも、自動的にExperimental Web Platform featuresが有効化されたりはしないようなので注意してください。

設定は以下のURLからどうぞ。

* [chrome://flags/#enable-experimental-web-platform-features](chrome://flags/#enable-experimental-web-platform-features)

関連するChromiumのdiscussionはこちら。

* [https://bugs.chromium.org/p/chromium/issues/detail?id=817381&desc=3](https://bugs.chromium.org/p/chromium/issues/detail?id=817381&desc=3)
Railsで404 (Not Found)をログに残さないようにする方法

config/routes.rbの末尾に以下を追加。

```config/routes.rb
    # Not Foundのときログにスタックトレースを残さないようにするため
    # https://stackoverflow.com/a/39289253/5209556
    match '*any' => 'pages#not_found', via: [:get, :post]
```

```app/controllers/pages_controller.rb
class PagesController < ApplicationController
  layout false

  # Not Foundだけ別ファイルにログを出す
  NotFoundLogger  = Logger.new(Rails.root.join("log/not_found.log"))

  # Not Foundのときログにスタックトレースを残さないようにするため
  # https://stackoverflow.com/a/39289253/5209556
  def not_found
    NotFoundLogger.error(request.fullpath)
    render file: 'public/404.html', status: :not_found, layout: nil
  end
```
SSHのパスフレーズを生成した後から空パスフレーズにしたい時

## manを打ってみる

```
man ssh-keygen

(中略)
     -P passphrase
             Provides the (old) passphrase.

     -p      Requests changing the passphrase of a private key file instead of creating a new private key.  The program will prompt for the file containing
             the private key, for the old passphrase, and twice for the new passphrase.
```

`-p` オプションで対象の秘密鍵を指定すると、新しい鍵を生成する代わりにパスフレーズを変更してくれる模様です。
既にgithubで利用している秘密鍵なので、再登録する手間を省きたい場合はこのオプションが有用です。


```
$ ssh-keygen -p -f ~/.ssh/github/id_rsa                                                                                                                        
Enter old passphrase: 
Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase.
```

## 変更前

```
% git push origin feature/markdown_editor                                                                                                    
Enter passphrase for key '*****/.ssh/github/id_rsa':
From github.com:himrock922/*****
 * branch            master     -> FETCH_HEAD
Already up to date.
```

## 変更後

```
% git pull origin master                                                                                                                                       
From github.com:himrock922/*****
 * branch            master     -> FETCH_HEAD
Already up to date.
```
firebase initをする際にMust select at least one feature. Use SPACEBAR to select features, or provide a feature with firebase init [feature_name]が出た

```
$ firebase init

     🔥🔥🔥🔥🔥🔥🔥🔥 🔥🔥🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥     🔥🔥🔥     🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥
     🔥🔥        🔥🔥  🔥🔥     🔥🔥 🔥🔥       🔥🔥     🔥🔥  🔥🔥   🔥🔥  🔥🔥       🔥🔥
     🔥🔥🔥🔥🔥🔥    🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥   🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥
     🔥🔥        🔥🔥  🔥🔥    🔥🔥  🔥🔥       🔥🔥     🔥🔥 🔥🔥     🔥🔥       🔥🔥 🔥🔥
     🔥🔥       🔥🔥🔥🔥 🔥🔥     🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥     🔥🔥  🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥

You're about to initialize a Firebase project in this directory:

  /vue-sample-project/sample_app

? Which Firebase CLI features do you want to setup for this folder? Press Space to select features, then Enter to confirm your choice
s. (Press <space> to select)
❯◯ Database: Deploy Firebase Realtime Database Rules

 ◯ Firestore: Deploy rules and create indexes for Firestore
 ◯ Functions: Configure and deploy Cloud Functions
 ◯ Hosting: Configure and deploy Firebase Hosting sites
 ◯ Storage: Deploy Cloud Storage security rules
```

ここで選んでEnterを押すとエラーになる！とあたふたしました

```
Error: Must select at least one feature. Use SPACEBAR to select features, or provide a feature with firebase init [feature_name]
```

これは選んで"スペースバーを押してから"Enterで次に進められます。
英語ちゃんと読まなきゃな…
lighthouseの使い方

# lighthouseとは
lighthouseというWebアプリケーション解析ツールについて調査したので整理します。なお、versionは2.9.4になります。

## lighthouseとは
lighthouseとは、Google製のWebアプリケーションを解析するツールで、以下の5つの指標でスコアが算出されます
* Performance
* Progressive Web App
* Accessibility
* Best Practices
* SEO
各項目のスコア値は、いくつかの計測項目の値を元に算出されています。
計測項目については下記を参照してください。
[Lighthouse v3 Score Weighting [MAKE YOUR OWN COPY] - Google Sheets](https://docs.google.com/spreadsheets/d/1Cxzhy5ecqJCucdf1M0iOzM8mIxNc7mmx107o5nj38Eo/edit?hl=ja#gid=0)
## インストール方法
２つのインストール方法があります。
* Google chromeをインストールする(Google Chromeに標準で入っています)
* npmかyarnを用いてインストールする

```shell-session
$ npm i -g lighthouse
```
## 使い方
ここではCLIでの使い方についてのみ明記します
インストールが完了したらターミナルなどを用いて、以下のコマンドを実行してみてください。
```$ lighthouse https://www.yahoo.co.jp/```
このコマンドを実行すると、ブラウザが立ち上がり自動でhttps://www.yahoo.co.jp/にアクセスされると思います。 また、アクセスと同時にYahoo! Japanのスマホ用のページが表示されると思います。なぜこのようになるかには後に説明します。ターミナルの最後に下のような出力とともに、レポートの結果がhtmlとして作られていると思います。
このファイルをブラウザなどで開いてみてください。

```shell-session
Printer html output written to /******/******/******/*****/******/m.yahoo.co.jp_2018-06-02_15-39-09.report.html +210ms
```

```shell-session:(macのchromeでファイルを開く簡単な例):
$ open -a "/Applications/Google Chrome.app" ./m.yahoo.co.jp_*.report.html
```
<img width="1121" alt="スクリーンショット 2018-06-02 15.46.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/4893/b84ca2cc-90a4-76e4-0f28-5456fb3942fe.png">
上の様な結果が見れると思います。このようにして、アプリケーションの品質チェックを行う事ができます。 
また、チェックと同時にブラウザで内容を確認したい場合は、下のようにviewオプションをつけると実行と共に結果を確認することができます。

```
$ lighthouse https://www.yahoo.co.jp/ --view
```
ここで、なぜかスマホ用のページが表示されたかについて確認していきたいと思います。 
まずは、ページ上部にRuntime settingsという文字があるのでこの文字をクリックしてみてください。 そうすると、下のようなRuntime environmentというものが表示されると思います。
<img width="738" alt="スクリーンショット 2018-06-02 15.52.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/4893/bc56ee6b-0893-5dc5-95c3-a452f604159d.png">
Runtime environmentの名の通り、実行時の環境がここで確認できます。
ここを見ると分かるのですが、lighthouseのコマンドはデフォルトでネットワーク帯域、cpuなどの制限やデバイスのエミュレーション(Nexus 5)が自動で入ります。先程、Yahoo! Japnに普通にアクセスをした際にスマホ用のページが表示されたのは、Nexus　5でのアクセスにエミュレートされていたのが原因でした。
この設定を無くしたい場合は、下のようにdisable~オプションを付与することによって無効化することができます。

```shell-session
$ lighthouse https://www.yahoo.co.jp/ --view --disable-network-throttling --disable-cpu-throttling --disable-device-emulation
```
この他にも色々と設定ができます。詳細はgithubかhelpオプションで確認できます。
(https://github.com/GoogleChrome/lighthouse#lighthouse-cli-options)

```shell-session
$ lighthouse --help
```  
[GoogleChrome/lighthouse: Auditing, performance metrics, and best practices for Progressive Web Apps]

このように、lighthouseを使えば簡単にウェブアプリケーションの品質をチェックすることができます。今回は、簡単な実行方法までを紹介させていただきました。

次回は、算出されたスコアについてより深く調査していきたいと思います。
powerlineとpipenvを同時に使ったときにプロンプト表示がおかしくなる問題


## powerlineを使った状態で`pipenv shell`すると表示がおかしくなる
こんな感じ
<img width="510" alt="app_py_—_live-scheduler.png" src="https://qiita-image-store.s3.amazonaws.com/0/127651/8ed1e1d8-ea0e-2aa4-4a4d-414447926578.png">

## 論点整理
- pipenvの内部ではvirtual-envを使っており、その表示部分なのでpipenvはこの問題に関係がない
- powerlineが気を利かせてvirtual-envの環境名を表示してくれているものと、virtual-envが自分で表示しているものがどちらも出てしまっているのが原因
- どちらかを消せば良い

## 解決策
- [virtual-envの設定](https://virtualenv.pypa.io/en/stable/userguide/#activate-script)でvirtual-env側のプロンプト表示を消す

```shell
# bash
export VIRTUAL_ENV_DISABLE_PROMPT=1
# fish
set -x VIRTUAL_ENV_DISABLE_PROMPT 1
```

<img width="391" alt="app_py_—_live-scheduler.png" src="https://qiita-image-store.s3.amazonaws.com/0/127651/d662f928-d653-f9f3-a811-eca4808f1700.png">

いい感じになった🎉

## 雑感
- 言われてみれば簡単なことなのですが、意外とググラビティが悪かったので、ググりやすそうなワードを入れて書いておきました。

## 参考
[Pythonのvenvのプロンプト表示をカスタマイズする - $shibayu36->blog;](http://blog.shibayu36.org/entry/2017/04/01/145758)
RaspberryPi3+Navio2でArdupilotのexampleを動かす

#はじめに
RaspberryPi3+Navio2でArducopterのexampleをubuntuでクロスコンパイルする方法の自分用メモ。半年くらい前もやったけど一瞬で忘れるので。PCの環境はubuntu16.04LTSです。

#環境構築
まず、Ardupilotをクローンして環境変数を設定する。

```
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
git submodule update --init --recursive
export PATH=/opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:$PATH
```
次にwafを使いやすいようにコマンドにして、ボードをNavio2に設定する。

```
alias waf="$PWD/modules/waf/waf-light"
waf configure --board=navio2
```
更に、適当な``/librares``内にあるexampleを指定してコンパイルする。

```
waf build --target examples/INS_generic
```
で``/build/navio2/example``内に実行ファイルができるのでこれをsshでraspberrypiに転送。

```
rsync -avz $ARDUPILOT/build/navio2/examples/INS_generic pi@192.168.13.6:/home/pi/
```

最後にraspberrypiにssh接続で入って実行する。


#参考
https://docs.emlid.com/navio2/common/ardupilot/building-from-sources/
http://ardupilot.org/dev/docs/learning-ardupilot-the-example-sketches.html
ImportError: No module named 'gensim' が出たのでインストール

jupyter 内でスクリプトをを実行したら `ImportError: No module named 'gensim'` がでました。

# gensim が無いというエラー

```py
---> 10 import gensim
     11 

ImportError: No module named 'gensim'
```

gensim が入ってないみたいです。

# conda install してみる
conda で install できるかやってみました。

```
conda install gensim
```
無事成功😃

# 確認
ちゃんと動くようになりました(☝ ՞ਊ ՞)
PHP で MongoDB のデータを削除 (Delete)

```php:mongo_delete.php
#! /usr/bin/php
<?php
// --------------------------------------------------------------------
/*
	mongo_delete.php

					Jun/08/2019

*/
// --------------------------------------------------------------------
fputs (STDERR,"*** 開始 ***\n");

$id_in = $argv[1];
print	$id_in . "\n";

require_once './vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

//
$user = $_ENV['user'];
$password = $_ENV['password'];

$str_connect = "mongodb://" . $user . ":" . $password . "@localhost:27017";

$manager = new MongoDB\Driver\Manager($str_connect);

$bulk = new MongoDB\Driver\BulkWrite;

$bulk->delete(['key' => $id_in]);

$result = $manager->executeBulkWrite('city.saitama', $bulk);

fputs (STDERR,"*** 終了 ***\n");

// --------------------------------------------------------------------
?>
```
 
```text:.env
user = '******'
password = '******'
```

実行コマンドの例

```bash
./mongo_delete.php t1164
```

次のバージョンで確認しました。

```text
$ php --version
PHP 8.0.8 (cli) (built: Oct 26 2021 11:42:42) ( NTS )
```
PHP で MongoDB のデータを更新 (Update)

```php:mongo_update.php
#! /usr/bin/php
<?php
// --------------------------------------------------------------------
/*
	mongo_update.php

					Jun/08/2019

*/
// --------------------------------------------------------------------
fputs (STDERR,"*** 開始 ***\n");

$id_in = $argv[1];
$population_in = $argv[2];
print	$id_in . "\t";
print	$population_in . "\n";

require_once './vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

//
$user = $_ENV['user'];
$password = $_ENV['password'];

$str_connect = "mongodb://" . $user . ":" . $password . "@localhost:27017";

$manager = new MongoDB\Driver\Manager($str_connect);

$bulk = new MongoDB\Driver\BulkWrite;

date_default_timezone_set('Asia/Tokyo');
$today = date ("Y-m-d");

$newdata = array('$set' => array("population" => $population_in,"date_mod" => $today));

$bulk->update(array("key" => $id_in), $newdata);

$manager->executeBulkWrite('city.saitama', $bulk);

fputs (STDERR,"*** 終了 ***\n");
// --------------------------------------------------------------------
```

```text:.env
user = '******'
password = '******'
```



実行コマンドの例

```bash
./mongo_update.php t1162 45723100
```

次のバージョンで確認しました。

```text
$ php --version
PHP 8.0.8 (cli) (built: Oct 26 2021 11:42:42) ( NTS )
```
UML（Unified Modeling Language）のどこが言語（Language）なのか？

#UMLは、日本人から見ると「図」
UMLって、言語だって知っていますか？
Unified Modeling Language で、**ラングエッジ** 、つまり**言語**です。

でも日本人からみると、言語じゃなくて**図**ですよね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/93680d64-e5bb-7d5e-1187-c82960e16ea8.png)
まあ、どう見たって、**図**。

これでも、日本人から見たら、やっぱり**図**ですよね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/9356de0b-6496-55b0-2cc3-c1a81a86a183.png)
**「図書館は、蔵書を所蔵する。」**

#UMLは、英語圏の人から見ると「言語」
でも、これを英語にしてみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/8b64455d-7a03-b0ee-a7ea-e4c55d0d3514.png)

**「A Library houses bibliothecas.」**
※house:所蔵する、bibliotheca：蔵書、owner：所有者

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/524b1680-ce81-e2d5-6df6-cf0b461dd243.png)

なんか、UMLのクラス図の並びって、英語の　SVO（主語・動詞・目的語）　と同じじゃないですか？

はい。

UMLのクラス図って、英語の　SVO　を絵で描いたものになってます。

つまり、英語圏の人は、普段使う言語を図に置き換えてモデリングできるんです。

英語圏の人から見たら、そのまま**言語**でしょ。
**Modeling Language、モデリング言語**。

#「言語」でプログラミングしたら、、、

普通の感覚で**言語**ならば、
クラス図描いたら、
それをクラスとして実装して、

```csharp:book.cs
// (日本人向けの説明)本について書きます
class book
{
    // (日本人向けの説明)本には、タイトルがあります
    public string Title:
}
```

```csharp:library.cs
// (日本人向けの説明)図書館について書きます
class library
{
    // (日本人向けの説明)図書館には、蔵書リストがあります。蔵書リストは、bookのリストです。
    List<book> Bibliothecas = new List<book>():

    // (日本人向けの説明)図書館には、蔵書を追加できます
    public void AddBibliotheca(book newBook)
    {
        // (日本人向けの説明) 蔵書リストに追加する、新しい本を
        Bibliothecas.Add(newBook);
    }

    // (日本人向けの説明)図書館では、タイトルから蔵書を検索できます
    public book SearchBook(string targetBookTitle)
    {
        // (日本人向けの説明)ある本、蔵書リストの中にある
        foreach( book bibliothea in this.Bibliothecas ){
            // (日本人向けの説明) その本のタイトルが同じ、探している本のタイトルと、
            if( bibliothea.Title.Equals(targetBookTitle){
                // (日本人向けの説明) 戻す、その本を
                return bibliothea;  // この辺は、Linqで書けばいいのかな.
            }
        }
        return null:  // null返すのが良いかどうかはさておき
    }
}
```

みたいに、日常の言語的な感覚で、実装することができる。
日本人向けにコメント入れたけれど、英語圏の人ならコメントいらない。

これならば、不具合が少なくなるよね。

どうして、不具合が少なくなるのか？

さぁ、考えてみよう！
PHP で MongoDB のデータを読む (Read)

ライブラリーのインストールはこちら
>[PHP で MongoDB のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/56144992914a90d9696e)


```php:mongo_read.php
#! /usr/bin/php
<?php
// --------------------------------------------------------------------
/*
	mongo_read.php

					Jun/08/2019

*/
// --------------------------------------------------------------------
function dict_display_proc ($dict_aa)
{
	ksort ($dict_aa);

	foreach ($dict_aa as $key => $value)
		{
		$name = $value["name"];
		$population = $value['population'];
		$date_mod = $value['date_mod'];

		print "$key\t";
		print "$name\t";
		print "$population\t";
		print "$date_mod\n";
		}
}

// --------------------------------------------------------------------
function dict_append_proc ($dict_aa,$id,$name,$population,$date_mod)
{
	$dict_unit = array ();
	$dict_unit['name'] = $name;
	$dict_unit['population'] = $population;
	$dict_unit['date_mod'] = $date_mod;
	$dict_aa[(string)$id]= $dict_unit;

	return	$dict_aa;
}

// --------------------------------------------------------------------
fputs (STDERR,"*** 開始 ***\n");

require_once './vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

//
$user = $_ENV['user'];
$password = $_ENV['password'];

$str_connect = "mongodb://" . $user . ":" . $password . "@localhost:27017";

$manager = new MongoDB\Driver\Manager($str_connect);

$filter = [];
$options = [
	'projection' => ['_id' => 0],
	'sort' => ['_id' => -1],
];

$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('city.saitama', $query);

$dict_aa = array ();

foreach ($cursor as $document) {
	$dict_aa = dict_append_proc
		($dict_aa,$document->key,$document->name,
		$document->population,$document->date_mod);
}

dict_display_proc ($dict_aa);

fputs (STDERR,"*** 終了 ***\n");

// --------------------------------------------------------------------
?>
```
 
```text:.env
user = '******'
password = '******'
```


実行コマンド

```bash
./mongo_read.php
```

次のバージョンで確認しました。

```text
$ php --version
PHP 8.0.8 (cli) (built: Oct 26 2021 11:42:42) ( NTS )
```
Bottle で CSSを使う

Bottle を触ってる途中
あれ？css使えん？
という事で、調べました。
これで静的ファイルがつかえます。

``` app.py
from bottle import get, static_file

# Static file
@get("/static/css/<filepath:re:.*\.css>")
def css(filepath):
    return static_file(filepath, root="static/css")

@get("/static/font/<filepath:re:.*\.(eot|otf|svg|ttf|woff|woff2?)>")
def font(filepath):
    return static_file(filepath, root="static/font")

@get("/static/img/<filepath:re:.*\.(jpg|png|gif|ico|svg)>")
def img(filepath):
    return static_file(filepath, root="static/img")

@get("/static/js/<filepath:re:.*\.js>")
def js(filepath):
    return static_file(filepath, root="static/js")
```
#参考リンク

https://stackoverflow.com/questions/10486224/bottle-static-files

 

これで、平気かな、、、

たぶん
PHP で MongoDB のデータを作成 (Create)

MongoDB の動作確認

```bash
sudo systemctl status mongod
```

ライブラリーのインストール
Ubuntu 20.04 の場合

```bash
sudo apt install pkg-config
sudo apt install php-dev
sudo pecl install mongodb
```

設定ファイルへ追加

```text:/etc/php/8.0/cli/php.ini
（省略）
extension=mongodb.so
（省略）
```

```bash
composer require vlucas/phpdotenv
composer require mongodb/mongodb
```

```php:mongo_create.php
#! /usr/bin/php
<?php
// --------------------------------------------------------------------
/*
	mongo_create.php

					Jun/08/2019

*/
// --------------------------------------------------------------------
function dict_append_proc ($dict_aa,$id,$name,$population,$date_mod)
{
	$dict_unit = array ();
	$dict_unit['name'] = $name;
	$dict_unit['population'] = $population;
	$dict_unit['date_mod'] = $date_mod;
	$dict_aa[(string)$id]= $dict_unit;

	return	$dict_aa;
}

// --------------------------------------------------------------------
function data_prepare_proc ()
{
$dict_aa = array ();

$dict_aa = dict_append_proc ($dict_aa,'t1161','さいたま',72136,'2002-5-18');
$dict_aa = dict_append_proc ($dict_aa,'t1162','所沢',41378,'2002-9-12');
$dict_aa = dict_append_proc ($dict_aa,'t1163','越谷',59213,'2002-4-1');
$dict_aa = dict_append_proc ($dict_aa,'t1164','久喜',96329,'2002-10-29');
$dict_aa = dict_append_proc ($dict_aa,'t1165','熊谷',35736,'2002-7-14');
$dict_aa = dict_append_proc ($dict_aa,'t1166','秩父',24683,'2002-6-12');
$dict_aa = dict_append_proc ($dict_aa,'t1167','川越',82197,'2002-2-17');
$dict_aa = dict_append_proc ($dict_aa,'t1168','和光',18572,'2002-3-24');
$dict_aa = dict_append_proc ($dict_aa,'t1169','新座',59461,'2002-7-8');

	return	$dict_aa;
}

// --------------------------------------------------------------------
fputs (STDERR,"*** 開始 ***\n");

$dict_aa = data_prepare_proc ();


require_once './vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

//
$user = $_ENV['user'];
$password = $_ENV['password'];

$str_connect = "mongodb://" . $user . ":" . $password . "@localhost:27017";

$manager = new MongoDB\Driver\Manager($str_connect);


$manager->executeCommand('city', new \MongoDB\Driver\Command(["drop" => "saitama"]));


$bulk = new MongoDB\Driver\BulkWrite;
foreach ($dict_aa as $key => $value)
	{
	$bulk->insert(['key' => $key, 'name' => $value["name"],
	'population' => $value['population'], 'date_mod' => $value['date_mod']]);
	}

$manager->executeBulkWrite('city.saitama', $bulk);

fputs (STDERR,"*** 終了 ***\n");

// --------------------------------------------------------------------
?>
```

```text:.env
user = '******'
password = '******'
```

実行コマンド

```bash
./mongo_create.php
```

次のバージョンで確認しました。

```text
$ php --version
PHP 8.0.8 (cli) (built: Oct 26 2021 11:42:42) ( NTS )
```

mongosh でデータの確認

```text
$ mongosh -u scott -p tiger123
（省略）
test> use city
switched to db city
city> db.saitama.find()
[
  {
    _id: ObjectId("61fcc4838ad033156d4d33c2"),
    key: 't1161',
    name: 'さいたま',
    population: 72136,
    date_mod: '2002-5-18'
  },
  {
    _id: ObjectId("61fcc4838ad033156d4d33c3"),
    key: 't1162',
    name: '所沢',
    population: 41378,
    date_mod: '2002-9-12'
  },
（省略）
city>exit
```
Google Apps Script（GAS）から LINE  notify API を利用して通知を送る

# はじめに
 
インターネットから隔絶された独自の生態系を営む LINE ですが [LINE notify](https://notify-bot.line.me/ja/)を利用すればHttp から通知を送ることは可能です。
あくまで通知なので自分のアカウントからのトークではなく LINE notifyからのアナウンスという形で通知となります。アイコンなどで発信者を判別できないので使い方には注意が必要です。また公開されている API は送信だけの一方通行となるのでタイムラインを追いかけるのは不可能です。

ちょっと制限された機能になっていて利用価値は少なそうに思えますが うまく使えばそこそこ便利ではないかと思います。例えばスマホは手元にない・PC はあるけど line アプリは入っていないような状況から LINE 送れたり LINE を使ってメモしたりできます。
# アクセストークンの準備
 [LINE notify](https://notify-bot.line.me/ja/)からログインして アクセストークンを発行してもらってください。
トークン名を記入するところは適当に記入しても構いませんが、うまく命名すれば発信者を区別する手がかりにもなりますのでわかりやすい名前を付けた方が良いでしょう。
トークルームの選択はテスト段階なので一対一を選ぶのが良いかもしれません。
トークンが表示されたらコピーしてどこかのファイルにでも貼り付けておいてください。
トークンは一度しか表示されませんが万が一忘れてしまったら削除してもう一度作成すれば良いかと思います。
# スクリプトの準備
Google ドライブからスプレッドシートを新規作成します。
メニューのツールからスクリプトエディタを開きます。
コードはこんな感じで良いのではないでしょうか。

```javascript:linenptify.gs
var TOKEN = PropertiesService.getScriptProperties().getProperty("LINE_API_TOKEN");

// メッセージを LINE する
function postUpdateStatus(message) {
  var res = null;
  var options = {
    "method": "post",
    "payload": "message=" + message,
    "headers": {"Authorization" : "Bearer "+ TOKEN}
   };
  res = UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
  return res;
}
```

アクセストークンをコードに直接記入するのは気持ち悪いのでスクリプトのプロパティに分離しました。
メニューのファイルからプロジェクトのプロパティ＞スクリプトのプロパティでトークンを設定してください。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/35607/7c056c6c-9ed1-18fc-eb13-7ee584d0444d.png)

postUpdateStatus関数のパラメータにメッセージを渡して実行すれば通知されるはずです。
メッセージをスプレッドシートから読み取りたい場合は以前に書いた[Google ホームからGoogle スプレッドシートを中継して ツイートする](https://qiita.com/yasushiito/items/d95466a9a90d1e6cc760)が参考になるかもしれません。と言うか私は積極的にあちらのコードを流用しています。Google Home から LINE notifyで通知することもできるのですが、やはり不穏な半角スペースが挟まれるのと認識ミスが怖いので 。
【codility】Lesson 2: Arrays CyclicRotation

#subject
Lesson 2:Arrays CyclicRotation
配列AをK回右方向に回転させた時の、最終的な配列の要素の順番を求める問題。
例）
`A = {3,8,9,7,6} K = 3`の場合の答えは、`A = {9,7,6,3,8}`となる。
右方向に回転と言う表現にしているが、要するに配列の一番後ろの数字を配列の一番前に持っていくと考えるとわかりやすい。
#submit
今回は、１回目のsubmitでscore87を出し、２回目でscore100。
配列が空の時の対応は、スコアに関連があるようで、 

```c++:
if(arrayLength == 0)
        return A;
```
ここのコードを付け加えてクリアしました。毎回、配列が空かどうかを確認するコードは入れようと思う。

<img width="949" alt="スクリーンショット 2018-06-02 15.03.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/237869/3afa60a6-330a-226c-ae2b-b4f9672ff68b.png">
#program
**Point:vectorのpush_backとeraceを使ったところ**
vectorの便利！！と心から思った。

```c++:cyclicRotation.cpp
#include<iostream>
#include<vector>
using namespace std;

vector<int> solution(vector<int> &A, int K) {
    int count  = 0; 
    int cyclic = 0;
    int arrayLength = A.size();

    if(arrayLength == 0)
        return A;
    else if (arrayLength < K)
        cyclic = arrayLength - (K % arrayLength);
    else
        cyclic = arrayLength - K;

    while (count < cyclic) {
        if (!A.empty()) {
            A.push_back(A[0]);
            A.erase(A.begin());
            count++;
        }
        else {
            break;
        }
    }
    return A;
}
```
Nuxt.js に FontAwesome 5 を導入する方法を雑に紹介する

CSSフレームワークに Bulma を使おうとしたところ、公式ドキュメントが FontAwesome 5 対応になってしました。
Nuxt.js 用の FontAwesome パッケージとして @nuxtjs/font-awesome がありますが、こちらはまだ FontAwesome 4 にしか対応していないため他の導入方法を探しました。

以下、導入手順です。

まずは FontAwesome 5 に対応したパッケージをインストールします。
「@fon...」ではなく「@for...」なのでお間違えなく。


```bash
$ yarn add @fortawesome/fontawesome-free-webfonts
```

nuxt.config.js のグローバルCSSに設定を追加します。

```diff:nuxt.config.js
  css: [
+    '@fortawesome/fontawesome-free-webfonts',
+    '@fortawesome/fontawesome-free-webfonts/css/fa-brands.css',
+    '@fortawesome/fontawesome-free-webfonts/css/fa-regular.css',
+    '@fortawesome/fontawesome-free-webfonts/css/fa-solid.css',
  ],
```

保存したら起動してみます。

```bash
$ yarn dev
```

![スクリーンショット 2018-06-02 14.59.32.png](https://qiita-image-store.s3.amazonaws.com/0/237863/2f018ab1-6701-4771-ff54-ab03c8e94381.png)

![スクリーンショット 2018-06-02 15.04.31.png](https://qiita-image-store.s3.amazonaws.com/0/237863/412411e3-83f0-532a-4297-0ecb6be0670e.png)

FontAwesome 5 を読み込むことができました。
Lipo Error!! can't open input file

# 問題

## Lipo Error!! can't open input file ではまる

Firebaseを使っているプロジェクトで、FirebaseをPods InstallしてBuildすると、Succeededになるが、エラーメッセージがぞろぞろ出る。

シミュレータでエラーが出るが、General iOS Deviceではエラーが出ない。

Succeededになるので、シミュレータ実行してみるが、Frameworkが見つからないという実行エラーで止まって実行できない。

# 解決策

## Build Phasesの調整

"[CP] Embed Pods Frameworks"をBuild Phasesの最後にもっていったら

CarthageとCocoaPodsを同時に使っているが、Carthageのスクリプトが影響していたかもしれない。
Reactで絞り込み機能付き検索を実装してみた

Reactで絞り込み検索はどのように実装すればいいのだろうかと悩んだので、調べて実装してみました。

## Demo

![99e9830a636686dde28de71098a9903e.gif](https://qiita-image-store.s3.amazonaws.com/0/179816/8307035d-9200-bd4c-a707-6470625d4573.gif)

## javascriptで絞り込みを実装

Javascriptでは配列の要素を絞り込むための`filter`というメソットが用意されています。

`filter`メソッドは、配列の各要素に対してcallback関数を一回ずつ実行し、callback関数がtrueの時、その要素分だけ新たに配列を作成します。

```javascript

let list = [1,2,3,4,5,6,7,8,9]
list.filter(item => item > 5); #[6, 7, 8, 9]
```

## Reactで絞り込み機能を実装

ES6で実装しています

```jsx
import React, { Component } from 'react';

class App extends Component {
  constructor() {
    super() 
    this.state = {
      initialItem: [
        "apple",
        "tree",
        "pen",
        "mike",
        "dog",
        "cat",
        "iphone",
        "book"
      ],
      items: []
    }
  }

  componentDidMount() {
    this.setState({items: this.state.initialItem})
  }

  filterList = (e) => {
    const updateList = this.state.initialItem.filter((item) => {
      return item.toLowerCase().search( e.target.value.toLowerCase()) !== -1;
    })
    this.setState({items: updateList})
  }

  render() {
    return (
      <div>
        <form action="">
          <input type="text" placeholder="search" onChange={this.filterList}/>
        </form>
        <div>
          {this.state.items.map((item, index) => {
            return (
              <li key={index}>{item}</li>
            )  
          })}
        </div>
      </div>
    );
  }
}

export default App;

```

こちらのGithubからclone可能です
https://github.com/yoshimoto8/searchFilter

##  参照

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
VS2017でangle(Microsoft版)のリンクに成功しなかった問題

Visual Studio 2017 Community(15.7.3)にてAngleをビルドしたかったので、
ソリューションファイルのあるMicrosoftのgithubから取得したものもlibEGLv2のリンクに成功しなかったのでメモを残しておく。
おそらく現在限定の問題。

_guard_dispatch_icall の未定義参照リンクエラー。
結論から言うとWindows10 SDKを10.0.16299.0ではなく10.0.17134.0にすると治った。
ネットを見て回るとVisualStudioのバージョンによって起きたり起きなかったりするらしい。

おわり。

（あと、ビルドにgitとpythonコマンドがパス通っている状態で必要なので事前に準備しておかないと私のように出鼻をくじかれるので注意）
Ruby のオープンクラスとは (メタプログラミングRuby)

Rubyでは定義済みのクラスでも、何度でも開いて、中身をいじることが出来る。
これをオープンクラスという。

# 例

## クラスを定義

クラスメソッドを1個作る。

```rb
class A
  def some_method
    p :some_method
  end
end
```

## また定義

メソッドをもう1個作る。

```rb
class A
  def new_method
    p :new_method
  end
end
```

すると‥

## どちらのメソッドも呼べるようになる

```rb
A.new.some_method # :some_method
A.new.new_method # :new_method
```

# なんでもアリ

Integer クラスなど、元から存在するクラスでもオープンして書き換えられる。

```rb
class Integer
  def some_method
    p :some_method
  end
end

1.some_method # :some_method
2.some_method # :some_method
```

# 参考

- メタプログラミングRuby








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
多次元配列の重複した要素をカウントするアルゴリズム

久々に、アルゴリズムの問題を解いてみました。
ソースは、とある大学の課題です。

## 問題

多次元配列にある要素のうち、重複がある要素数をカウントしなさい。

##### <b>例1:</b>

入力:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213435/f0caab46-bf61-ce5f-b288-bbe52f2e4523.png)

出力:2

##### <b>例2:</b>
入力:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213435/ac02900b-10ab-d9f3-ebef-d8fe5b89d950.png)


出力:1

##### <b>例3:</b>
入力:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213435/652f1e43-89e8-f350-c276-15bdd30bdbbf.png)

出力:5


## 前提条件

- C言語で解くこと。(めんどい。)
- 多次元配列には、-99999以外の数値を入力すること。
- 多次元配列のサイズは、ハードコーディングとして、多次元配列の要素をキーボード入力としている。


## 考えたアルゴリズムの流れ

1. 入力した多次元配列の全要素のうち、重複する要素を入れるリスト(以降、重複リスト)と重複しない要素を入れるリスト(以降、非重複リスト)をそれぞれ用意する。
2. 入力した多次元配列の全要素をループ参照して、重複リスト、非重複リストにそれぞれ以下の条件で格納する。
    1. 重複リストに参照した多次元配列の要素がマッチすれば、すでにカウント済みの要素のためSKIPする。
    2. 重複リストに、マッチする要素がなければ、非重複リストにマッチするか調べる。
    3. 非重複リストにマッチする要素があれば、重複カウンタを更新して、該当要素を重複リストに追加および、非重複リストから削除する。
    4. 非重複リストにマッチする要素なければ、非重複リストに該当要素を追加する。
3.重複したカウントを出力する。 

## 実装コード

```C
#include<stdio.h>

#define SUB 2
#define NUM 5

/*
 * 配列listにtargetNumが含まれてれば該当するindexを返却,
 * 含まれていなければ-1を返却
 */
int find(int targetNum, int search_size, int *list)
{
  for(int i=0;i<search_size;++i)
  {
    if(list[i] == targetNum)
    {
      return i;
    }
  }
  return -1;
}
int main(void)
{
  int test[SUB][NUM];
  int non_dxs[SUB*NUM]; // testのうち非重複値を格納した配列
  int dxs[SUB*NUM]; //testのうち重複値を格納した配列
  int i;
  int j;
  int sum=0;
  const int invalid = -99999;

  printf("五個の整数の組を二組入力して下さい\n");
  for(i=0;i<SUB;i++)
  {
    for (j = 0;  j< NUM; j++)
    {
      printf("test[%d][%d]:", i + 1, j + 1);
      //scanf_s("%d",&test[i][j]);
      scanf("%d",&test[i][j]); // macはこっちで動く
      //dxs, non_dxsの初期化
      dxs[i*NUM + j] = invalid;
      non_dxs[i*NUM + j] = invalid;
    }
  }

  int dxIdx = 0;
  int nonIdx = 0;
  int retIdx;
  for(i = 0; i < SUB; i++)
  {
    for(j = 0; j < NUM; j++)
    {
      //重複値を探索
      if(find(test[i][j], dxIdx, dxs) == -1)
      {
        //重複値がない場合、非重複値を検索
        retIdx = find(test[i][j], nonIdx, non_dxs);
        if(retIdx >= 0)
        {
          //非重複値での検索がtrueの場合は、非重複から要素を除去
          non_dxs[retIdx] = invalid;
          //重複リストにあらたな要素を格納
          dxs[dxIdx++] = test[i][j];
          //sumをインクリメント
          sum = sum + 1;
        }
        else
        {
          //非重複値に要素がない場合は、非重複値のリストを更新する。
          non_dxs[nonIdx++] = test[i][j];
        }
      }
    }
  }

  if (sum == 0)
  {
    printf("2つの組の整数で同じ整数はありません\n");
  }
  else
  {
    printf("2つの組の整数で同じ整数の個数は%d個です\n", sum);
  }
  getchar();
  getchar();
  return 0;
} //main
```

## 感想

- 久々に、純粋なアルゴリズムをC言語で解いた。
- 結構時間かかった。。。私の中で、Pythonのゆとり教育が相当進んでいるものと思われる。
- たまにはこういう問題を解いてみるのも悪くない。

## お願い

もっと効率の良い解き方があるなどご意見があれば、お願いします！
実機デバッグができない(Swift stdlib tool Error)

# エラー内容
実機デバッグしようとしたところ実機のみデバッグできなかった。

調べたところ以下と同じエラーの模様

https://teratail.com/questions/107689

どうやらXcodeのバグらしく、正しい証明書が読み込まれてなくて
選択したチームと違う証明書が読み込まれているっぽい。

## 解決策
keychainを開いて古い証明書を削除。
その後プロジェクトを開くと、次のような画面がでるため
Macbookのログオン時のパスワードを入力したところ解決した
*ただこのパスワードは他でも使っている可能性があるため、Macbookログオン時のパスワードかは不明
![857577908a4440c7c12daa106396eaec.png](https://qiita-image-store.s3.amazonaws.com/0/261386/8df4c04e-a691-f7ca-3986-a6c458fb443a.png)

## 引用：
・エラー内容に関して参照
https://teratail.com/questions/107689
・キーチェーン"access"へのアクセスパスに関して参照
https://www.eidesign.info/iphone/keychain/
Rubyのクラスメソッドはシングルトンメソッド=特異メソッドである (メタプログラミングRuby)



Rubyではクラス自体にメソッドを定義できる。

# 例

定義したクラスに

```rb
class A
end
```

メソッドを生やすと

```rb
def A.some_method
end
```

クラスがメソッドを実行できるようになる

```rb
A.some_method # nil
```

とてもシンプルな話だ。
これがクラスメソッドと呼ばれる。


# 一般的なクラスメソッドの定義

クラス定義の中では、 `self` はクラス自身を示す。
つまり次の書き方は、最初の例と同義だ。

```rb
class A
  def self.some_method # あとで def A.some_method と書くのと同じ
  end
end
```

# 余談

日本語ではシングルトンメソッドが「特異メソッド」と呼ばれているが、、なんだか混乱するような気もする。あまり特異な感じがしない。

元の英語では `Singleton Method` 。
こちらの呼び方の方がスッキリした理解ができそうだ。


# 参考

- [【Ruby】特異メソッドについて - Qiita](https://qiita.com/ta-chibana/items/7965d246ab67e14c175a)
- メタプログラミングRuby








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Javascriptで等価演算子を使う時の注意

JavaScriptの基本型と参照型の違いについてちょっと面白かったのでメモ。

#JavaScriptの主なデータ型
|分類|データ|
|-----------------|------------------|
|基本型|数値型(number)|
|基本型|文字列型(string)|
|基本型|真偽型(boolean)|
|基本型|シンボル型(symbol)|
|基本型|特殊型(null/undefined)|
|参照型|配列(array)|
|参照型|オブジェクト(object)|
|参照型|関数(function)|

#基本型と参照型の違い
両者の違いは、「値を変数に格納する方法」
基本型の変数には値そのものが直接格納される。
参照型の変数はその参照値(値を実際に格納しているメモリ上のアドレス)を格納する。

#等価演算子を使う時の注意
等価演算子は左辺と右辺の値が等しい場合はtrueを返す。
##基本型の比較を行う場合
左辺と右辺の型が同じで、文字列や数値、論理値の比較の場合は単純に双方の値が等しいかが比較される。

```js

console.log(1 == 1); // true
```

しかし、左辺と右辺の型が違う場合は型を数値に変換した上で判定を行う

```js
#文字列の'1'が数値の1に変換されてから比較されるのでtrue
console.log(1 == '1'); // true
```

```js
#論理値のtrueが数値の1に変換されてから比較されるのでtrue
console.log(1 == true); // true
```

##参照型の比較を行う場合
参照型の比較はその参照値(メモリ上のアドレス)が等しいかが比較される。

```js
#配列は参照型であり、data1の参照値とdata2の参照値は別(data1とdata2が指すメモリ上のアドレスが違う)なのでfalse
var data1 = ['apple', 'orange', 'banana'];
var data2 = ['apple', 'orange', 'banana']:
console.log(data1 == data2); // false
```
RSpecを使用したいいね機能（likes_controller）のテスト

## はじめに
userが特定のtweetにいいね出来る機能のテスト(likes_controllerのテスト)


factoryにlikes.rbを追加する

```spec/factories/likes.rb
FactoryBot.define do
  factory :like do
  end
end
```

以下はJSONを使用した場合のテストなので、そうでない場合は適時読み解いていただければ

```spec/controllers/likes_controller_spec.rb
require 'rails_helper'

RSpec.describe LikesController, type: :controller do
    let(:user) { create(:user) }
    let(:tweet) { create(:tweet) }
    let(:like) { create(:like, user_id: user.id, tweet_id: tweet.id) }

  describe "POST #create" do
    before do
      login_user user
    end


    it "responds with JSON formatted output" do
      post :create, format: :json,
      params: { tweet_id: tweet.id, id: like.id }
      expect(response.content_type).to eq "application/json"
    end

    it "add a new like to the tweet" do
      expect { post :create, format: :json, params: { tweet_id: tweet.id, id: like.id } }.to change{ Like.count }.by(1)
    end
  end

  describe "DELETE #destroy" do
    before do
      login_user user
    end

    it "responds with JSON formatted output" do
      delete :destroy, format: :json,
      params: { tweet_id: tweet.id, user_id: user.id, id: like.id }
      expect(response.content_type).to eq "application/json"
    end

    it "remove a like to the tweet" do
      like = create(:like, user_id: user.id, tweet_id: tweet.id)
      expect { delete :destroy, format: :json, params: { tweet_id: tweet.id, user_id: user.id, id: like.id } }.to change{ Like.count }.by(-1)
    end
  end
end
```
参考url
[RSpec初心者必読！「Everyday Rails - RSpecによるRailsテスト入門」を発売しました](http://blog.jnito.com/entry/2014/02/07/110505)
macOSでNaitiveScriptの環境構築！困ったとこ覚書

# 詰まったところの覚書

基本的には次のリンクのコードをコピペ
https://docs.nativescript.org/start/quick-setup#macos

コードは⬇️　　
```
ruby -e "$(curl -fsSL https://www.nativescript.org/setup/mac)"
```

いくつか質問に答えて、うまくいったようにみえるけど、
エミュレーターが起動しない。

Android Emulators (AVD)がうまくはいっていないらしい。

エラーコードはこんな感じ。
```
Warning: File /Users/homepc/.android/repositories.cfg could not be loaded.      
Warning: Failed to find package system-images;android-25;default;x86            
WARNING: There seem to be some problems with the Android configuration 
```

で、いろいろ調べたところ次の記事通りやればうまくいった。

[macOSでAndroidエミュレータを起動する](https://qiita.com/matyapiro31/items/290f17202a8c6fd0d251)

「必要なパッケージのインストール」から「エミュレータの起動」まで参考リンクどうりにやってエミュレータが起動すれば、、
```
tns run android 
```
でエミュレーターが動く！！！

@matyapiro31 さん　ありがとうございました。。。

これでエミュレータがtnsコマンドから起動することができました。

ただし、またアプリがインストールされません。
エラーコード
```
Unable to apply changes on device: emulator-5554. Error is: The package manager service found that the device didn't have enough storage space to install the app..
```

アプリをインストールするスペースがないようです。。。
NaitiveScriptはWebpack入れなとアプリサイズが１５０MBになるので、
大きいアプリをインストールさせる設定が別に必要のようです。

（ちなみに、Webpackを入れると簡単なアプリは１０MBくらいになった気がします）

[How to increase storage for Android Emulator? ](https://stackoverflow.com/questions/2239330/how-to-increase-storage-for-android-emulator-install-failed-insufficient-stora?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa)

私は真ん中あたりのOn Android Studiosの見出しがある、
Android Studiosをそのままやってうまくいきました。

いろいろ方法はあるようですが、
GUIで操作できるのでこれが一番楽でした。

ということで
できた環境でandroid,iosの二つとも開いて
試してみました。(用意されているサンプルの中で一番重そうなやつ)

荒いGIF、
コードを変えているところを写し忘れたのでわかりにくいですが、
結構反映するのは早いです。
![tns and ios twin.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/239115/e96f0427-5c4d-e125-2e62-b3701eefef21.gif)
英語力を諦めた人のためのブックマークレット(arXiv→Google翻訳)

# これは何？

arXivの論文を読むとき、[Arxiv Vanity](https://www.arxiv-vanity.com/)でHTML化してGoogle翻訳すると捗りますよね、ということでブックマークレットにしてみました。


# ブックマークレット

別ウィンドウを開くバージョン：

```javascript
javascript:(function(){window.open('https://translate.google.co.jp/translate?hl=ja&sl=en&u='+encodeURIComponent('https://www.arxiv-vanity.com/convert/?query='+encodeURIComponent(window.location)));})();
```

同じウィンドウで遷移するバージョン：

```javascript
javascript:(function(){window.location='https://translate.google.co.jp/translate?hl=ja&sl=en&u='+encodeURIComponent('https://www.arxiv-vanity.com/convert/?query='+encodeURIComponent(window.location));})();
```

# 使い方

1. 上記の `javascript:…` を適当な名前でブックマークに登録する。
1. arXivのページを開く。
1. 登録したブックマークをクリック。

レンダリング中になった場合は少し待ってからリロードするといいかもしれません。
Mixed Reality Toolkit - Unity で始めるHoloLensとImmersiveHMD ～ Navigationの違いを理解する。

# HoloLensとImmersiveHMDのイベントは共通（全てではない）
Mixed Reality Toolkit - Unity(以下MRTK)ではイベントはInputManagerで提供されています。この機能はHoloLensとImmersiveHMD両方で利用できます。また発生するイベントの種類もほぼ同じになります。それぞれの違いは過去整理していますので以下の記事も参考にしてください。

* [HoloLensで始めるMixed Reality Toolkit - Unity ～HoloLensで有効なイベントの種類について](https://qiita.com/miyaura/items/093e7732d1a05ae27083)
* [WinMRで始めるMixed Reality Toolkit - Unity ～モーションコントローラ操作で発生するイベントについて](https://qiita.com/miyaura/items/6419d554daeb4f366511)

今回はこの中でもNavigationについてのデバイスの違いを紹介します。
NavigationはHoloLensとImmersiveHMDで考え方が違うので注意が必要です。

## Navigationとは
いわゆるNavigation Gestureのことです。例えば、スマフォでのスワイプでページ遷移があります。特定のアクションでアプリケーションの操作を行うものです。
MRTKでもこのために使用できるINavigationHandlerインタフェースが提供されています。このイベントは操作に対して-1～1の範囲でジェスチャー操作を正規化してくれるので、この情報を用いてページ遷移等を行うことができます。

## HoloLensとImmersiveHMDでのNavigation

Navigationに関する操作方法はHoloLensとImmersiveHMDで異なります。
まず、Navigation操作に移行する操作は以下の通りです。

|ｇ|HoloLens|ImmersiveHMD|
|:-:|:--|:--|
|Navigationの開始|Tap & Hold|Selectボタンを押下|
|Navigationの更新|Hold状態で手を動かす(xyz軸)|Selectボタンを押下したまま<font color="red">モーションコントローラを動かさずに</font>上下左右（XY軸）方向に向ける。
|Navigationの終了|Holdの解除|Selectボタンを離す|

HoloLensの場合、手の移動そのものなので実質IManipulationHandlerイベントの正規化された情報になります。つまり左にある程度動かせば-1,右であれば1といった感じです。
一方、ImmersiveHMDは明らかに違います。モーションコントローラの場合はモーションコントローラを左に向けると-1,右に向けると1となります。なお、z軸は常に0になります。モーションコントローラを移動して同じ位置にカーソル移動したとしても正しい値を取得できないので注意してください。

![image](https://qiita-image-store.s3.amazonaws.com/0/152548/2aee5f6f-3b99-4c31-19e0-dd9d3d94b7da.png)
よくわからないままyumを使っていたのでyumについて調べた

とりあえず`yum install`でパッケージをインストールできるんでしょぐらいな認識で使ってたのですが、
教えてもらう機会があったので、追加で調べたりもしてまとめました。

## yumとは
Yellowdog Updater Modifiedの略で、RedHat系ディストリビューション（CentOSやFedoraなど）で利用されるパッケージ管理ツールのことです。

apt-getとかaptはDebian系ディストリビューション（Ubuntuなど）で利用されています。

## パッケージ/リポジトリとは
[yum / rpm / パッケージ / リポジトリ とは](http://xn--lcki7of.jp/857/)
> Linux/Unix における パッケージ とは、ある機能を持ったプログラムの集合です。 レポジトリ とは、パッケージが保存されている場所です。 サーバシステムにおけるレポジトリとは、公開されているネットワーク上のどこかにおかれていることを指す場合が多いです。

## 仕組み
`yum install` でパッケージを指定すると、なぜそのパッケージがインストールできるのか？どこから持ってきてんの？って感じだったのですが、下記のディレクトリにリポジトリがあります。
こちらのリポジトリを参照して、指定されたパッケージが存在するかを確認しています。

```
(amazon linux)
$ ll /etc/yum.repos.d/
合計 28
-rw-r--r-- 1 root root  676  2月 27  2016 amzn-main.repo
-rw-r--r-- 1 root root  328  2月 27  2016 amzn-nosrc.repo
-rw-r--r-- 1 root root  694  2月 27  2016 amzn-preview.repo
-rw-r--r-- 1 root root  694  2月 27  2016 amzn-updates.repo
-rw-r--r-- 1 root root 1056  3月  1  2013 epel-testing.repo
-rw-r--r-- 1 root root  957  3月  1  2013 epel.repo
```

以前、yumが入っていない環境にyumをinstallしたのですが、yumコマンドは実行できるものの、参照するリポジトリが空だったため、どのパッケージもinstallできませんでした。

```
(先ほどと違う環境です)
$ $ ll /etc/yum/repos.d
total 12
drwxr-xr-x 2 root root 4096 Jun  1 12:28 ./
drwxr-xr-x 5 root root 4096 Jun  1 12:11 ../
```

その場合は、下記のようにinstall時に参照されるリポジトリを追加する必要があります。(12,509個のパッケージがインストールできる状態)

```
$ wget http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-6

$ ll /etc/yum/repos.d
total 12
drwxr-xr-x 2 root root 4096 Jun  1 12:28 ./
drwxr-xr-x 5 root root 4096 Jun  1 12:11 ../
-rw-r--r-- 1 root root  141 Jun  1 12:28 epel.repo

$ vim /etc/yum/repos.d/epel.repo
[epel]
name=EPEL RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/fedora/epel/6/$basearch/
gpgcheck=1
# enabledを1に変更して、常時利用する
enabled=1

$ yum repolist all
repo id                                repo name                                                                        status
epel                                   EPEL RPM Repository for Red Hat Enterprise Linux                                 enabled: 12,509
repolist: 12,509
```


## rpmからdnfに移行してきている
wikipediaにまとまっているのが一番わかりやすいなと思いました。
[wikipedia DNF (ソフトウェア)](https://ja.wikipedia.org/wiki/DNF_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2))
yumはpython3には対応しておらず、python2でしか動かないらしいですね。
Goのパッケージのinit( )はいつどういう順番で呼ばれるか

spf13/cobra をソースリーディングしていてメモっておきたかったので、
自分用のメモです。

-------

## パッケージ構成

```
$GOPATH
└── src
    └── myapp
        ├── main.go
        └── mymodule
            ├── aaa.go
            ├── root.go
            └── zzz.go
```

* main.goは単純にmymoduleのExecute関数を実行しているだけ
* mymoduleには、myListというパッケージローカルな変数があり、それはroot.goで初期化されている
* パッケージには、aaa.go, root.go, zzz.go という３つのファイルがある。

## ソース

```main.go
package main

import (
  "fmt"
  "myapp/mymodule"
)

func main() {
  fmt.Println("main >")
  mymodule.Execute()
  fmt.Println("main <")
}
```

```mymodule/root.go
package mymodule

import "fmt"

var myList = makeList()

func makeList() []string {
  fmt.Println("root/makeList")
  return []string{}
}

func init() {
  fmt.Println("root/init >")
  myList = append(myList, "root/init")
  fmt.Println("root/init <")
}

func Execute() {
  myList = append(myList, "root/Execute")
  fmt.Println("root/Execute")
}
```

```mymodule/aaa.go
package mymodule

import "fmt"

func init() {
  fmt.Println("aaa/init >")
  myList = append(myList, "aaa/init")
  fmt.Println("aaa/init <")
}
```

```mymodule/zzz.go
package mymodule

import "fmt"

func init() {
  fmt.Println("zzz/init >")
  myList = append(myList, "zzz/init")
  fmt.Println("zzz/init <")
}
```

## Result ( ﾟдﾟ)

```
$ go run main.go 
root/makeList
aaa/init >
aaa/init <
root/init >
root/init <
zzz/init >
zzz/init <
main >
root/Execute
main <
```

パッケージのインポート
　　↓
　パッケージ中の各種変数の初期化　（ファイル名がAから順番、だけど処理系依存かもしれない）
　　　↓
　パッケージ中の各種init()関数の呼び出し　（ファイル名がAから順番、だけど処理系依存かもしれない）
　　↓
main関数の呼び出し


## [spf13/cobra](https://github.com/spf13/cobra) はどうやって「各コマンドは別ファイルで定義する」というスタイルを確立したか

* main関数からは、root.Execute()を叩いているだけ。
* root.Execute() は、それまでに作成されたコマンドパーサ(rootCmd変数に格納されている)のExecuteを叩くだけ。
* rootCmdは cmd/root.go で初期化される。
* 各種cmd/xxx.goのinit()で、rootCmdを拡張していく。
* cmd/root.goのinit()で OnInitializeで、cobraがパッケージローカルで持ってるinitializerを拡張する
* 各メソッド（cobra.Command#AddCommandやcobra#OnInitializeなど）は**どういう順番で叩かれても困らないように設計されている**と思われる
    * AddCommandとかOnInitializeは、単純に、いろいろなコマンドデータをリストにデータを突っ込んでいるだけ
    * Execute()やCommands()とか、いざ使われる際に、リストを整形（ソートとか）して使ったりしている

## まとめ

* パッケージ中の変数の初期化が一通り終わってから、パッケージ中のinit()が呼ばれるよ！
* 順番はファイル名とかに依存するかもしれないし、ランダムかもしれないので、どういう順番でinitされてもバグらないようにしようね！
静的型付け言語に慣れた開発者が AutoLISP でやったアレコレ

<dl><dt>(2018.06.02)</dt>
<dd>「静的型付け言語に慣れた開発者が貧弱なCAD用 Lispでやったアレコレ」からタイトル変更しました</dd></dl>


静的型付け言語になれた身としては、欲しい機能がいろいろなくて、つらたにえん。せめて、CommonLisp だったら、もうちょっと楽なんだろうなぁ（使ったことないけど）

(let) がない
============
ローカル変数は使えるが、宣言できる場所が `(defun)` の直後だけというのはつらい。もっと使う場所の近くで、狭い有効範囲をきって使いたい。普通は`(let)`を使うところだが、CAD系Lispには`(let)`がない。仕方ないので`((lambda (/ 変数リスト) … ))` で代用するようにした（というのが下記の記事）

* [let のない Lisp処理系で lambda を let のかわりにつかう - Qiita](https://qiita.com/zetamatta/items/578c1eb46c38ba4d2ded)

early-return がない
===================
他の言語だと、エラーの場合早々に return するのがよいとされているが、CAD用Lispには return 文的なものがない。結果、関数の頭で、エラーチェックをたくさんする時、以下のような問題がある。

* `(if)` でエラーチェックすると、正常系のコードが else句の奥底のすごく深いインデントになってしまう
* `(quit)` でアプリケーションを終了すると、finally 的処理が呼ばれない（エラートラップ等でひと工夫すればできなくもないが、仕組みが大層）

`(cond)` を使うようにすれば、エラーケースがたくさんあっても、あまりインデントは深くならない（ただ、エラー条件が複雑になると、うまく書けない時も多い）

```lisp
(cond
  ((エラー条件１)
   エラー処理１
  )
  ((エラー条件２)
    エラー処理２
  )
  ; 中略
  ((エラー条件Ｎ)
    エラー処理Ｎ)
  (T
     正常系処理
  )
```

グローバル変数をうっかり壊してしまう
================================

Perl でいうところの use strict が欲しい。なければ作ればよいのだ。

* [zetamatta/strict-lsp: strict.lsp - variables checker for CAD's Lisp](https://github.com/zetamatta/strict-lsp)

ソースファイルをS式として読み込んで、`(defun)`の中身を解析し、未使用の変数や、逆に宣言漏れがあったら、コマンドラインにリポートする。

名前空間がない
=============
いろいろ `(load)` していると関数名が被ることが懸念される。といっても名前空間がないので、

* グローバルな名前には接頭語をつける（ありがち）
    * foo.lsp ならば `(defun foo-xxxx …)`
* 関数内関数で済むなら、それですませる（その関数名はローカルで）

といった方向で誤魔化す。

以上