OmniAICreator/Qiita-1.07M huggingface dataset:
意図していないブランチで作業を進めてしまった時はgit stashが便利

1. git stashとは
2. いつ使えるか
3. 使い方
4. おわりに

# 1. git stashとは
> DESCRIPTION
Use git stash when you want to record the current state of the working directory and the index, but want to go back to a clean working directory. The command saves your local modifications away and reverts the working directory to match the HEAD commit.

参考 [Git](https://git-scm.com/docs/git-stash)

簡単にまとめると
現状作業ディレクトリの変更箇所　→　退避(格納)　→　好きなタイミングで再度適用可能

`git stash`によって、現在の作業ディレクトリでの変更箇所(追跡しているファイルのうち変更されたもの、そしてステージされた変更)を退避させることができ(実行後は変更前の状態に戻る)、用途に合わせて好きなタイミングや別ブランチに移動したあとで、その変更記録をゴソッと再度適用することができます。


# 2. いつ使えるか
**・作業するブランチを間違ってしまったとき**
私はこのパターンで、本来ならば別ブランチでするべき実装を、意図していない作業ブランチでしてしまっておりました。

**・やむを得ず現在の作業ブランチから離れて、別ブランチで作業しなければならないとき**
作業の優先順位が変わってしまった時に使えそうです。

# 3.使い方
**基本**
`git stash` で実行。
`git stash list` でstashしたものの確認。`stash@{0}`←この数字が若いほど新しい。

```Ruby:git_stash_list.rb
stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
stash@{1}: On master: 9cc0589... Add git-stash

stash@{stashナンバー} <ブランチ名(stash時の)> <ハッシュ(stash時のHEADの)> <コミットメッセージ(stash時のHEADの)>
```

`git stash pop` 
最新のstashを適用。同時にそのstashの削除
上記で言う `stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation` が適用されて、listからなくなる。

`git stash apply`
最新のstashを適用。そのstashは残る。
上記で言う `stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation` が適用されるが、listに残ったまま。

`git stash apply stash@{2}`
のようにstash番号を指定して適用させることも可能。

`git stash show`
変更差異の確認。オプションなしで最新stash。`stash@{確認したい番号}`で指定可能。

```Ruby:git_stash_show.rb
app/views/posts/_post_contents.html.erb | 1 +
1 file changed, 1 insertion(+)
```

`git stash drop`
stashの削除。オプションなしで最新stash。`stash@{削除したい番号}`で指定可能。

```Ruby:git_stash_drop.rb
Dropped stash@{0} (575530adb53095ceb43a514fde80ab5c8003b65a)
```

`git stash clear`
stashの全削除。不要なstashは消していきましょう。

**その他オプション**
いろいろとオプションはあります。

```Ruby:other_options.rb
usage:
git stash drop [-q|--quiet] [<stash>]
git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
git stash branch <branchname> [<stash>]
git stash save 
[--patch] [-k|--[no-]keep-index] [-q|--quiet]
[-u|--include-untracked] [-a|--all] [<message>]
git stash 
[push [--patch] [-k|--[no-]keep-index]
[-q|--quiet][-u|--include-untracked] [-a|--all] [-m <message>][-- <pathspec>...]]
```
興味のある方は、こちらから詳細確認してください 

[Git のさまざまなツール - 作業の隠しかたと消しかた](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E4%BD%9C%E6%A5%AD%E3%81%AE%E9%9A%A0%E3%81%97%E3%81%8B%E3%81%9F%E3%81%A8%E6%B6%88%E3%81%97%E3%81%8B%E3%81%9F)

# 4.おわりに
ご指摘等ございましたら、ご一報いただけると幸いです。
Solr-7.6.0 で opennlp (英語) を使う


#前提

Solrのホームディレクトリは以下とする。
> solr-7.6.0

coreの名前とディレクトリは以下とする。
> solr-7.6.0/server/solr/**core_nlp**/conf

#JARの設定

JARは標準のインストールで用意されているのでコピーして使う。

##コピー元(contrib/analysis-extras)
> solr-7.6.0/contrib/analysis-extras/**lib**/opennlp-tools-1.9.0.jar
> solr-7.6.0/contrib/analysis-extras/**lucene-libs**/lucene-analyzers-opennlp-7.6.0.jar

##コピー先(dist)
＊後でわかりやすいように「opennlp」というフォルダにする。
> solr-7.6.0/**dist**/**opennlp**/lucene-analyzers-opennlp-7.6.0.jar
> solr-7.6.0/**dist**/**opennlp**/opennlp-tools-1.9.0.jar

###＊注意
JARのクラスパスを通すのに「solr-7.6.0/server/lib」や「solr-7.6.0/server/lib/ext」でもよさそうに見えるが、これはアウト。

##Coreのクラスパス設定

solrconfig.xml を編集することで core 単位でクラスパスを通す
>solr-7.6.0/server/solr/**core_nlp**/conf/**solrconfig.xml**

```xml
    <lib dir="${solr.install.dir:../../../..}/dist/opennlp" regex=".*\.jar"  />
```

#Modelのダウンロード
JARは同梱されているが、Modelはダウンロードが必要。
http://opennlp.sourceforge.net/models-1.5/

##Modelダウンロード元
> en-chunker.bin
> en-pos-maxent.bin
> en-sent.bin
> en-token.bin

##Modelダウンロード先
core のフォルダにダウンロードする。後でわかりやすいように「opennlp」のディレクトリを作成する
> solr-7.6.0/server/solr/core_nlp/conf/opennlp/en-chunker.bin
> solr-7.6.0/server/solr/core_nlp/conf/opennlp/en-pos-maxent.bin
> solr-7.6.0/server/solr/core_nlp/conf/opennlp/en-sent.bin
> solr-7.6.0/server/solr/core_nlp/conf/opennlp/en-token.bin


#CoreのSchema設定

やり方は本家サイトにも書いてある。
https://lucene.apache.org/solr/guide/7_4/language-analysis.html#opennlp-integration
（が、ちゃんと読まない人がこの記事を読むのでしょうね。私も含め。）

以下の設定ファイル(managed-schema)（中身はXML）を編集する。
Modelファイル名の指定は絶対パスでも相対パスでも可能とのこと。
ここでは「solr-7.6.0/server/solr/core_nlp/conf」からの相対パスになる。

> solr-7.6.0/server/solr/core_nlp/conf/managed-schema

```xml

    <fieldType name="text_opennlp" class="solr.TextField" positionIncrementGap="100" multiValued="true" >
      <analyzer>
        <tokenizer class="solr.OpenNLPTokenizerFactory"
                   sentenceModel="opennlp/en-sent.bin"
                   tokenizerModel="opennlp/en-token.bin"/>
        <filter class="solr.OpenNLPPOSFilterFactory" posTaggerModel="opennlp/en-pos-maxent.bin"/>
        <filter class="solr.OpenNLPChunkerFilterFactory" chunkerModel="opennlp/en-chunker.bin"/>
        <filter class="solr.TypeAsPayloadFilterFactory"/> 
      </analyzer>
    </fieldType>
```

# Solr の再起動

```
solr-7.6.0>bin\solr stop -all
Stopping Solr process 11004 running on port 8983

4 秒待っています。続行するには何かキーを押してください ...

solr-7.6.0>bin\solr start
INFO  - 2018-12-26 12:03:15.477; org.apache.solr.util.configuration.SSLCredentialProviderFactory; Processing SSL Credential Provider chain: env;sysprop
Waiting up to 30 to see Solr running on port 8983
Started Solr server on port 8983. Happy searching!
```

以上。
ruby2.3.0でDeployGateのCommandLineToolがインストールできない


Macの環境にDeployGateのインストールを行おうとして、失敗した。

公式でインストールのコマンド

```
$ curl -sSL https://deploygate.com/cli/install | bash
```
これをターミナルに入力したが、、、、
途中でエラーになる。


```
      __| | ___  ___ | | ___ _   ,____   ___ | |_ ___
     / _` |/ _ \' _ \| |/ _ \ \ / / _ \ / _ `| __/ _ \
    | (_| |  __/ |_) | | (_) \ v / (_| | (_| | |_' __/
     \___, \___| .__/|_|\___/ ` / \__, |\__,_|\__\___`
               |_|           /_/  |___/


Superuser access (sudo) required
Please type your login password to grant installing dg command to your system.

Password:

Installing dg with "sudo gem install deploygate --no-document".

This may take a while. It's a good time to grab some coffee ☕️

ERROR:  While executing gem ... (TypeError)
    no implicit conversion of nil into String
```

rubyのバージョンが合わないよくあることだと思ってバージョンを確認
2.3.0であることが判明そのため

rbenvで2.2.6をインストール

```
rbenv install 2.2.6
rbenv global 2.2.6
```

これにより同じく公式でインストールのコマンドを入力したらインストールできた

```
SuccessFully installed deploygate-0.6.7
76 gems installed
```
無事に入ったみたいである。
CookieとWebStorageとSessionについてのまとめ

#CookieとWebStorageの違いまとめ
アプリを作ってるとCookieとWeb Storageどっちがいいんだろうなんてことがあったりするので、良い機会なのでまとめておくことにします。
Web StorageにはSessionStorageとLoacalStorageの二種類があるので、全部対比してみます。


| 項目       | Cookie|Local Storage |Session Storage|
|:------------:|:------------:|:------------------:|:------------------:|
| 保存場所         | ブラウザ|ブラウザ|ブラウザ|
| データの型       |文字列のみ|文字列のみ|文字列のみ|
| 有効期限         |任意に設定|消さない限り半永久的|セッションやタブを閉じるまで|
| 保存容量         | 最大4KB|5MB～10MB|5MB～10MB|
| サーバにデータ送信 |自動送信する|しない|しない|
| 操作する人 |サーバー側の言語が多い(php等)|jsのみ|jsのみ|

ざっとこんな感じですかね？

WEBストレージは、保存容量が大きいですね。幅があるのはブラウザによって違うからです。あとはサーバー側にいちいちデータの通信をしないところがクッキーとの大きな違いですね。
ちなみに、ローカルストレージはオリジン単位（プロトコル://ドメイン名:ポート番号）でデータを保存するので、当然、別ウィンドウやブラウザを閉じてもデータは共有され続けます。一方、セッションストレージは同じドメインのサイトを別々のウィンドウで開いていても、それぞれが別のsessionStorageとなることに注意っす。

クッキーはWEBストレージより有効期限が自由に設定できますね。

クッキーはサーバー側からクライアントに対してクッキーをセットするようにレスポンスを返す必要があるので、サーバー側の言語で書かれることが多いです。一方、WEBストレージは完全にクライアント側の操作なので基本的に値の取得だろうとセットだろうとjsでしか操作しません。

#Sessionについて

SessionとCookieってどう違うんですかという質問がちょこちょこありますのでこっちも書いておこうかと。（Sessionは本来Cookieをもとに成り立っている仕組みだからそもそも質問自体がちょっと変だったりするのですが、かくいう僕も昔はちんぷんかんぷんだったので気持ちわかりまくります）

Sessionとは「ある一連の処理の始まりから終わりまで」を意味する概念で、（例えばログインしてもろもろの操作してログアウトするまで）一連の流れを管理できるように「クッキー」や「ファイル」などを使ってユーザ識別する仕組みのことっす。
本来HTTP通信はステートレスなのでHTTP通信単体では情報の維持ができません。オンラインショッピングとかログインしてあれこれだとかユーザに紐づいた処理をするには、こういう仕組みが必要になるわけです。

Sessionの管理方法は色々とあるらしいんですけど、一般的なのはCookieとファイルを用いた管理方法ですかね。
仕組みとしては、sessionIDという一意のIDをユーザのクッキーに保存し、さらにそのIDに紐づくセッションファイルをサーバーのハードディスク上に作成します。（PHPならsession_startという関数がこれをしてくれる）
その後の通信ではクッキーにsessionIDがあるかどうかを常に確認し、追加のセッション情報を保存するときはIDに紐づくセッションファイルにどんどん値を追加していくことになる感じですね。

ただ、もちろん方法はこれだけじゃないです。
例えば、クッキーを用いずにGetパラメタにSessionIDを仕込んだり、ファイルじゃなくてRedisなどのKVSに、SessionIDに紐づくデータを格納したりする場合もあります。

まあ要するに、「ユーザに対して一意のIDを割り振ってユーザ識別を可能にして、そのIDに紐づくデータを一定期間内サーバー上で保存する」ことが達成できればいいわけですね。

そんなわけで、Sessionとクッキーやウェブストレージは全然別物で、**Sessionはある一連の処理の流れをステートレスなHTTP通信の中で達成するための仕組み**で、**クッキーやウェブストレージは単にクライアント側に値を保存する機能**のことですね。

こんな感じになりますかね？
僕自身もそこまで詳しいわけではありませんので、ご指摘あったらお願い致します。

ではでは！！
新規ページ作成

# はじめに
[前回](https://qiita.com/ma33588/items/c946bc5da031ab90a46a "これ")の続き
/sampleに新規ページを作成する。

# ページ追加
## Controller
src/Eccube/Controller/UserDataController.phpなどをCustomizeにコピー
src/Eccube/Controller/UserDataController.php → app/Customize/Controller/SamplePageController.php

```php:app/Customize/Controller/SamplePageController.php
namespace Customize\Controller;

use Eccube\Controller\AbstractController;
use Eccube\Entity\BaseInfo;
use Eccube\Entity\Product;
use Eccube\Repository\BaseInfoRepository;
use Eccube\Repository\ProductRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

class SamplePageController extends AbstractController
{
    /** @var BaseInfo */
    protected $baseInfo;

    /** @var Product */
    protected $productRepository;

    /**
     * SamplePageController constructor.
     * @param BaseInfoRepository $baseInfoRepository
     * @param ProductRepository $productRepository
     */
    public function __construct(
        BaseInfoRepository $baseInfoRepository,
        ProductRepository $productRepository
    )
    {
        $this->baseInfo = $baseInfoRepository->get();
        $this->productRepository = $productRepository;
    }

    /**
     * @Route("/sample/{id}", name="sample_index")
     * @Template("Sample/index.twig")
     */
    public function index($id)
    {
        $product = $this->productRepository->find($id);

        return [
            'shop_name' => $this->baseInfo->getShopName(),
            'product_name' => $product->getName(),
        ];
    }
}
```

## Template

```twig:app/template/default/Sample/index.twig
{% extends 'default_frame.twig' %}

{% block main %}

店舗名は"{{ shop_name }}"です。<br/>
商品名は"{{ product_name }}"です。<br/>

{% endblock %}
```

## ブラウザよりアクセス
/sample/1 でページ表示できたが**ヘッダ部／フッタ部が表示されない**。

## dtb_page/dtb_page_layout
[前回](https://qiita.com/ma33588/items/c946bc5da031ab90a46a)調べたとき、ここにデータがないとページレイアウトが表示されない感じだったので...

```sql
INSERT INTO `dtb_page` (`id`, `master_page_id`, `page_name`, `url`, `file_name`, `edit_type`, `author`, `description`, `keyword`, `create_date`, `update_date`, `meta_robots`, `meta_tags`, `discriminator_type`) VALUES (NULL, NULL, 'サンプルインデックスページ', 'sample_index', 'Sample/index', 2, NULL, NULL, NULL, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'noindex', NULL, 'page');

-- PAGE_IDはdtb_pageのid
INSERT INTO `dtb_page_layout` (`page_id`, `layout_id`, `sort_no`, `discriminator_type`) VALUES (PAGE_ID, 2, 41, 'pagelayout');
```

## ブラウザよりアクセス
/sample/1 でページ表示できたし**ヘッダ部／フッタ部も表示された**

#まとめ
手動でdtb_page/dtb_page_layoutにデータをInsertしないといけないのかよく分からないけど、CotrollerとTemplateを作成し、dtb_page/dtb_page_layoutにデータを入れることで実現できた。

#参照
[EC-CUBE 開発コミュニティ - フォーラム](https://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=thread&topic_id=21079&forum=10&post_id=89327#forumpost89327)
#MBA #スキル の #ZOPA って何？ #学習 #まとめ RT @sue738 TAG #エンジニア #交渉力 #PM #マネージメント

Inspired [エンジニアにも役に立つ、MBAで学んだ基礎スキル 20選 - Qiita](https://qiita.com/sue738/items/97b602debf680183c4e7)


# 「交渉可能な範囲」の訳、頭文字らしい

>Zone Of Possible Agreement 

# エンジニア的には積集合っぽいイメージ

>お互いにどこまでなら妥協ができるのかという限界点を示します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c44e0827-6d31-dee2-892a-ab1af3c0a218.png)

# ヒアリングで見つけるらしい

話だいじ。

要件定義に使えそう？

コミュニケーションの技術らしい。

>積極的に交渉・ヒアリングをしましょう。

# ファクトとは？

今回分からなかったこと。

>意見にはファクトが隠れている ことが多いです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/88474768-6aa0-7907-f025-975963917a1e.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[Python3]SQLite3へUPDATEするときにループ(for)を使う方法

#やりたいこと
先にSELECTを用いて元となるデータを取得したのち、forを使ってUPDATEをループしそれぞれ更新する
##1回のみ実行されるプログラム
```Python3
import sqlite3
n = 1
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
data = cursor.execute("select * from task")
for i in data:
    title = i[0]
    status = i[1]
    cursor.execute("update task set status=? where title=?", (status, title))
    cursor.close()
    conn.commit()
    print(n)
    n += 1
```
本来は・・・
- `data = cursor.execute("select * from task")`によって取得することを定義
    - `for i in data`で実行される
- 取得したリストdataを`for i in data:`の部分で1文ずつ繰り返しながらUPDATE
- `print(n)`で処理回数を表示
するはずなのですが
**出力は「1」としか出てこない**
#解決策まとめ
##情報元
というわけで情報を検索して探していたところ見つけました。
[python sqlite3 for loop update](https://stackoverflow.com/questions/10404988/python-sqlite3-for-loop-update)
先人に感謝です
##解決策
`data = data.fetchall()`をループの前に追加するだけ
重要なのは`.fetchall()`の部分みたいです
##修正後のプログラム

```Python3
import sqlite3
n = 1
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
data = cursor.execute("select * from task")
#この後に追加する
data = data.fetchall()
for i in data:
    title = i[0]
    status = i[1]
    cursor.execute("update task set status=? where title=?", (status, title))
    cursor.close()
    conn.commit()
    print(n)
    n += 1
```
#まとめ
**SQLite3へUPDATEするときにループ(for)を使うには`.fetchall()`を、ループ前に入れる**

なんとか解決できてよかったです。
情報が少なく、同じようなことで困っているけれどわからないって方がいたらと思って書きました。

最後までご覧いただきありがとうございました。
Django でタグを使う

次のページの内容を Djanogo で実行してみます。
http://ekzemplaro.org/audio/
![tag_dec2601.png](https://qiita-image-store.s3.amazonaws.com/0/179446/e8c57ca7-3775-3ee8-a33d-e8fac2e5632b.png)

Django の開発サーバーで動かすと
![tag_dec2602.png](https://qiita-image-store.s3.amazonaws.com/0/179446/e10542c0-e57e-1941-db53-4e4b6eea039b.png)

Django のコードは GitHub にあります。
[ekzemplaro/tag_audio](https://github.com/ekzemplaro/tag_audio)

A) GitHub のコードを使う方法

A-1) コードをクローン

```bash
git clone https://github.com/ekzemplaro/tag_audio
```

A-2)  サーバーを動かす準備

```bash
cd proj01
python manage.py migrate
```

A-3) 開発サーバーを起動

```bash
python manage.py runserver
```

A-4) ブラウザーで http://127.0.0.1:8000/tag_audio/ にアクセス

B) プロジェクトを最初から作成する場合

B-1) プロジェクト　proj01
アプリ　tag_audio を作成

```bash
django-admin startproject proj01
cd proj01
python manage.py startapp tag_audio
```

B-2) proj01/settings.py を編集

B-3) proj01/urls.py を編集

B-4) テンプレートの作成
>tag_audio/templates/tag_audio/audio.html

B-4) 静的なファイルを作成
>tag_audio/static/tag_audio/ 以下のファイル

B-5) tag_audio/views.py の編集

B-6) tag_audio/urls.py の作成

B-7)   サーバーを動かす準備

```bash
python manage.py migrate
```

B-8) 開発サーバーを起動

```bash
python manage.py runserver
```
Golang - How to use Constructor?

1. practice used ***new*** and return ***pointer***
2. practice used ***make*** and ***will not*** return ***pointer***

If you want to use custom func as constructor, you can follow practice rules.

```go
func newFoo() *foo...

or

func makeBoo() Boo...
```

https://golang.org/doc/effective_go.html#allocation_new
https://stackoverflow.com/questions/18125625/constructors-in-go
ユーザーの「最後ポスト」まで何ステップですか？ #サービス #UI #UX #議論 #Qiita

#Qiitaは3ステップ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d08d8ed5-b184-72f1-1490-8de573b489b7.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/5a2e7cbb-9619-7c03-5ca8-f880c36a763a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/da73e523-eda2-9c35-0f7d-43260ad98c03.png)

#Twitterは1ステップ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7377458b-7f7f-17d7-50a2-8511789a157e.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9771de1f-0e42-f7b7-fdc9-da2c66897de7.png)


# なせ「最後」のポストが重要なの？

- ユーザーが自分のポストの中で、一番注意を向けているのは、最後のポスト、それが80%
- ポストが終わったばかりなので、編集やソーシャル共有をしたい最高のホットタイプ
- 最新ポストへの動線が悪いと、ユーザーは無限に二倍三倍のステップを、生涯かけて実行していくことになる、地理も積もればストレス爆発

# tiktokは1ステップ

の場合さえあったような。


[ui ux yumainaura - Google Search](https://www.google.com/search?ei=Nu0iXNHCMouj8AXporeICA&q=ui+ux+yumainaura&oq=ui+ux+yumainaura&gs_l=psy-ab.3..33i160.3269.4130..4236...0.0..0.308.1821.3j3j3j1......0....1..gws-wiz.......0j0i71j0i22i30.l7F81z7OTo4)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Prologの竹内関数

Prolog Advent calendar 2018 の25日が埋まっていません。
最後のみ投稿が無いのは残念ですので不束ながら埋め草の投稿をしたいと思います。

M.Hiroi's Home Pageを拝見しますと、よくベンチマークの一例として
たらいまわし関数（竹内関数）が出てきます。またその高速化の話も出てきます。
これに関しprologに関して知りたいと思い検索しましたが、見つけられませんでした。
そこで自分で考えてみました。Prologをされている多くの方には既知のことかもしれませんが、
超初心者（今時いれば）の方には多少は参考になるかもしれません。
まず、M.Hiroiさんのjuliaのコードです。

```Julia
function tarai(x, y, z)
  if x <= y
    y
  else
    tarai(tarai(x - 1, y, z), tarai(y - 1, z, x), tarai(z - 1, x, y))
  end
end
```
これをPrologに移すのですが、prologは結果の戻り方が他の言語と違いますので、ちと面倒です。

```Prolog
%tarai(12,6,0,R)     
%:-initialization(tarai(12,6,0,R)).   

tarai(X,Y,_,Y):-
     X=<Y,!.
tarai(X,Y,Z,R):-
     X1 is X-1,Y1 is Y-1,Z1 is Z-1,
     tarai(X1,Y,Z,R1),tarai(Y1,Z,X,R2),tarai(Z1,X,Y,R3),tarai(R1,R2,R3,R).
```
が考えられます。
しかし、これでは私の環境では、tarai(14,7,0,R)でも時間がかかります。
そこで高速化ですが、M.Hiroiさんは、Juliaの一例としてクロージャを使ったものを示されています。

```Julia
function tarai_lazy(x, y, z)
  if x <= y
    y
  else
    zz = z()
    tarai_lazy(tarai_lazy(x - 1, y, () -> zz),
               tarai_lazy(y - 1, zz, () -> x),
               () -> tarai_lazy(zz - 1, x, () -> y))
  end
end
```
これと同じ動作をするコードをprologで書きたいのです。
swi-PrologにFreeze/2やwhen/2という述語がありますが、この例での使い方はよくわかりません。
Goalを呼び出す述語にcall(Fn)やL=[H|T],apply(H,T)などがありますので、これを使ってみます。
call(Fn)では値が取り出せません（多分）ので実行後Fn=..L（ユニブ）でリストにします。

```Prolog
%SWI-Prolog version 7.4.2
%tarai(14,7,[self,0],R)     
%:-initialization(tarai(14,7,[self,0],R)).   

self(_).

tarai(X,Y,_,Y):-
     X=<Y,!.
tarai(X,Y,Z,R):-
     Z=[H|T],apply(H,T),last(T,Z0),X1 is X-1,Y1 is Y-1,Z1 is Z0-1,
     tarai(X1,Y,Z,R1),tarai(Y1,Z0,[self,X],R2),tarai(R1,R2,[tarai,Z1,X,[self,Y],_],R).  
```

```Prolog
%SWI-Prolog version 7.4.2
%tarai(14,7,self(0),R)     
%:-initialization(tarai(14,7,self(0),R)).     

self(_).

tarai(X,Y,_,Y):-
     X=<Y,!.
tarai(X,Y,Z,R):-
     Z,Z=..L,last(L,Z0),X1 is X-1,Y1 is Y-1,Z1 is Z0-1,
     tarai(X1,Y,Z,R1),tarai(Y1,Z0,self(X),R2),tarai(R1,R2,tarai(Z1,X,self(Y),_),R).
```
自分自身を返す関数が見つかりませんでしたのでself/1を定義しました。
4行目のZはcall(Z)と同じです。
両方とも適当に変数の値を表示させると、Juliaのコードと同じ結果が出ます。
しかし実は、

```prolog
self(_).

tarai(X,Y,_,Y):-
     X=<Y,!.
tarai(X,Y,Z,R):-
     Z,Z=..L,last(L,Z0),X1 is X-1,Y1 is Y-1,Z1 is Z0-1,
     tarai(X1,Y,Z,R1),tarai(Y1,Z0,self(X),R2),tarai(R1,R2,_,R).       
```
でも同じ結果が出ます。
つまり最後のtarai(Z1,X,self(Y),_)は評価されていないようです。
(wikipediaにもzの値は結局使っていないと書いてありました。)
ということで、M.HiroiさんのJuliaと同じ結果の出るコードは書けるけれど正しいかどうかわからない
という結果になってしまいました。

お粗末でした。

追加。
蛇足ですが、高速化すると、変数を表示させたときに元の関数と異なるのが不思議です。
Raspberry PiにLogicool Webcam C270 を接続してカメラ画像を取得してみる

# 概要
Raspberry Piに低価格で人気のWebカメラ「Logicool Webcam C270」を接続し、カメラ画像を取得するまでの流れを纏める。

# 使用するハードウェア
* [Logicool Webcam C270] (https://www.logicool.co.jp/ja-jp/product/hd-webcam-c270)

1000円程度で入手できるまともなブランドの格安Webカメラ。
720p/30fps(1280x720)、内臓マイクあり。

# カメラ画像取得までの手順

## Raspberry Piに接続して認識しているか確認

WebカメラをRaspberry Piに接続し、ターミナルでlsusbコマンドを実行。
C270の場合、"Logitech, Inc. Webcam C270"が含まれていれば認識されている。
![WS000034.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/479ff5c5-0559-a203-1bd8-7368470cf68f.jpeg)

## fswebcamインストール

引き続きターミナルでapt-get installを利用してfswebcamをインストールする。

```
sudo apt-get install fswebcam
```

![WS000035.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/a0b12354-7f69-f65e-ecf9-017d4801bb7e.jpeg)

## fswebcamでカメラ画像を取得
以下のコマンドを実行することで、カメラ画像を取得して現在のディレクトリに001.jpgというファイル名で保存する。

```
fswebcam 001.jpg
```

![WS000036.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/b470dcdf-12f0-d51b-fa9f-e8900259e38f.jpeg)

ファイルマネージャで現在のディレクトリを見てみると001.jpgというファイルが作られている。
![WS000038.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/84e12e50-7ddf-62da-ab2f-9b0518444efe.jpeg)

001.jpgを開いてみたところ。
特に何も指定しないと352x288という低解像度で保存されている。
![WS000039.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/a43cd166-51b3-86ee-8cce-1cc373dd141f.jpeg)

## 解像度を指定してカメラ画像を取得
C270は仕様上、解像度1280x720のカメラ画像を取得できるはず。
fswebcamは-rで解像度を指定できる。

```
fswebcam -r 1280x720 002.jpg
```

![WS000040.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/a360efe7-9968-b828-fa4c-c9a1a22e8fb1.jpeg)

確かに解像度1280x720で取得できているが、あまり写りが良くない。。。
できればホワイトボードの文字を識別できる程度には写ってくれると嬉しいのだが。
![WS000041.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/dadbe4b9-689f-5372-81e3-437569308ce0.jpeg)

## fawebcamで取得するカメラ画像の画質を改善できないか

fswebcamのオプション
http://manpages.ubuntu.com/manpages/cosmic/en/man1/fswebcam.1.html

露光に数フレーム必要という情報もある
https://www.raspberrypi.org/forums/viewtopic.php?t=140965

これらの情報から、-Sオプションと-Dオプションを試してみる。

```
fswebcam -r 1280x720 -S 3 -D 1 003.jpg
```

![WS000043.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/a9c8833e-3d79-ef2b-308d-8020569f38aa.jpeg)

ほとんど変わらん。。。C270だとこの程度の画質が限界なのかもしれない。
![WS000044.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/de6cefc8-739f-6e30-cef1-5ae1230a5ba8.jpeg)
#Slack は注意力管理ツールである #コツ #使い方 #TIPS #絵文字 #リアクション #コメント

# その絵文字リアクション、気づくの？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f8ef184e-70db-cf5e-25be-28ecb710a7aa.png)

# 気づいてほしい時はデカ絵文字コメント

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c62ccca5-4387-00ee-0528-1a2039f80c09.png)

# 最も大事なのは人と自分の注意力コントロール

「気づけるかどうか」「適切に気づくかどうか」「気づかせない方法」

すべてがとても大事。

[slack yumainaura - Google Search](https://www.google.com/search?ei=OOoiXOK9HMWt8QWo57uoCQ&q=slack+yumainaura&oq=slack+yumainaura&gs_l=psy-ab.3...3186.3186..3311...0.0..0.84.84.1......0....1..gws-wiz.dHHAl97ucS8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PHPって面白い

# はじめに
この記事は、[YYPHP アドベントカレンダー](https://qiita.com/advent-calendar/2018/yyphp)の最終日として書きました。
PHPをこれまで使っていた方も、これから使う方も、なんか面白そうな言語だなっていうのを再認識し、PHPという言語を使うモチベーションの1つになればいいなと思います。
自分的に面白いなっていう感じの実装をつらつらと書いてみましたので、実用的なものも黒魔術的なものもあります。
用法容量を守り正しく使ってください。

# メソッドチェーン
PHPでもメソッドチェーン使える。すごい。
そしてついでに戻り値を変数でとるようにしてみました。

```php:adder.php
<?php
class Adder{
    private $sum = 0;

    public static function instance(){
        return new self;
    }
    public function add($value){
        $this->sum += $value;
        return $this;
    }
    public function result(&$result){
        $result = $this->sum;
        return $this;
    }
}

Adder::instance()->add(1)->add(2)->result($val1)->add(3)->add(4)->result($val2);
echo "val1={$val1},val2={$val2}";
```

# マジックメソッド
ゲッタ・セッタ・そしてメソッドまでも特殊なマジックメソッドで管理することができます。
以下ではインスタンス変数をすべて `$properties` で管理したり、メソッドを実装したりしていますが、こんな感じでちょっと面白いトリッキーな実装ができそうですよね。

```php:trick.php
<?php
class TrickClass{
    private $properties = [];

    public function __call(string $name, array $args){
        if($name == 'add' && count($args) == 2){
            return $this->{$args[0]} + $this->{$args[1]};
        }
        trigger_error("メソッド[{$name}]は存在しないよ");
    }
    public function __get(string $name){
        if(!isset($this->properties[$name])){
            return null;
        }
        return $this->properties[$name];
    }
    public function __set(string $name, $val){
        $this->properties[$name] = $val;
    }
}

$hoge = new TrickClass;
$hoge->a = 2;
$hoge->b = 4;
echo $hoge->add('a', 'b');
```

# リファレンスを返すメソッド
参照渡しといえば変数を渡すという認識が強いと思いますが、以下のようにリファレンスを返すメソッドも作れます。
実際にこの実装されてるとちょっと事故りそうで怖いですね。

```php:ref.php
<?php
class RefVal{
	var $val = 'original';

    public function &ref(){
		return $this->val;
	}
}
$ref = new RefVal;
$val = &$ref->ref();
$val = 'modified';
echo $ref->val;
```

# アンダースコア
PHPはクラス名・メソッド名・変数名にアンダースコアを使えます。
こんな書き方もできるんですが、ちょっとカオスですよね。

```php:underline.php
<?
class _{
    public static function __(){ return "__"; }
    public static function ___(){ return "___"; }
}
function _(){ return "_"; }

$_ = _();
$__ = _::__();
$___ = _::___();

echo $_;
echo $__;
echo $___;
```

# まとめ
どれか1つでも **PHPﾁｮｯﾄｵﾓｼﾛｲ** ってなれました？
PHPにはその他にも面白い実装がたくさんありますので、年末年始に時間がある方は是非調べてみてください。
Windows環境でXCodeプロジェクトを見る方法

# Windows環境でXCodeプロジェクトを見る方法

Windows環境でXCodeの中身を見たい場合のメモ
※一時しのぎ的なものです

# 必須環境
・Windows10
・Microsoft Visual Studio Community 2017 
・Windows PowerShall
・Chocolatey
・winobjc-tools

## Visual Studio Community 2017 インストール
・ダウンロードリンク
https://imagine.microsoft.com/ja-jp/Catalog/Product/530

・カスタムで以下をインストール

|Nuget Package Manager|C# and Visual Basic Roslyn compilers|Static analysis tools|
|:-----------------:|:------------------:|:------------------:|
|Windows 10 SDK (10.0.14393.0)|Visual Studio C++ core features|VC++ 2017 v141 toolset (x86, x64)|
|Visual C++ compilers and libraries for ARM|Visual C++ runtime for UWP|Windows 10 SDK (10.0.10240.0)|
|Windows 10 SDK (10.0.10586.0)|MSBuild|Windows Universal CRT SDK|
|Standard Library Modules|VC++ 2015.3 v140 toolset (x86,x64)|Windows Universal C Runtime|
|Mobile development with .NET workflow option (Xamarin Tools) |


※GithubのReadMeから参照
※インストーラーに上記が無ければ、生成されたプロジェクトを開くと必要なパッケージのダウンロードリンクが開き、そこからインストールできるので無くても気にしなくてOK

## Chocolatey　インストール
ダウンロードリンク
https://chocolatey.org/

Install Chocolatey Nowからインストール
インストーラーの画面に従ってインストールすればOK

## winobjc-tools　インストール
Chocolateyのインストールが必須

### PowerShellを管理者として実行
Cortanaから検索を掛けてください。PowerShellはWindowsデフォルトでインストールされています。

管理者の実行は「Windows PowerShellの上で右クリック→管理者として実行」で出来る
### PowerShellで以下のコマンドを実行

```
choco upgrade winobjc-tools
```

# Xcode Projectのインポート
winobjc-toolsを使用して、XCodeのプロジェクトをインポートする

## PowerShellを管理者として実行
Cortanaから検索を掛けてPowerShellを起動

## cdコマンドを使用してXcodeプロジェクトディレクトリに移動
xcodeprojが格納されたフォルダにcdで移動させる
例）

```
cd C:\workspace\hogetest
```


##  vsimporterツールを実行
以下のコマンドを実行

```
vsimporter.exe
```

上記コマンドを実行することで、Visual Studioソリューションが生成される
例）

```
○○-WinStore10.sln
```

##  生成されたVisual StudioソリューションをPowerShellで開く
「プロジェクト名＋.sln」を入力してエンターキー

例）生成されたプロジェクトファイルが「hoge-WinStore10.sln」という名前の場合

```
hoge-WinStore10.sln
```

・管理者の要求をされた場合、頭に「.\」を付ける
例）

```
.\hoge-WinStore10.sln
```

ソリューションエクスプローラーでソースが表示されていれば生成成功です。


## 起動しない場合
・コマンドプロンプトでプロジェクトファイルを生成した場合
リンクが途切れているためソースが読めません。PowerShellでプロジェクトを生成してください。

・上記以外
winobjc-toolsが対応していない可能性が高いです。

あくまでもソースを追えるようにするための応急処置です。
→ビルドしてできるのがユニバーサルアプリ（UWP）のため、Xamarinへ移し替える作業が必須になります

# 参考資料
・WinObjC for Github
https://github.com/Microsoft/WinObjC

・Objective-Cで書かれたXcodeプロジェクトをWindows 10で動かす「WinObjC」のプレビュー版がでました
https://blog.ch3cooh.jp/entry/20150809/1439089269
Realizeを使ってGoでホットリロードを実現する

## 前置き
PHP や Ruby で開発をしていると普段あまり意識をすることがありませんが,  PHP などとは違い, Goでは当然のことながらビルドを行わないとソースの変更は反映されません.

`go run xxx.go` と都度コマンドを打つのも一つの手ですが, 都度行うと手間です. 

realize を使うことで, この面倒な問題を解決し, ホットリロードを実現してくれます.

## Quickstart

```
go get github.com/oxequa/realize
```

```
$ realize start
```

`ctl+C` で起動を停止してみます.

すると, プロジェクトルートに `.realize.yaml` という設定ファイル出来ています.
`.realize.yaml` を編集し `go run` コマンドを監視してみましょう.

### go run をウォッチしてみる

```.realize.yaml
settings:
  legacy:
    force: false
    interval: 0s
schema:
- name: realize
  path: .
  commands: 
    run:           # 追記
      status: true # 追記
  watcher:
    extensions:
    - go
    paths:
    - / 
    ignored_paths:
    - .git
    - .realize
    - vendor
```

## example

`Hello World!!` を表示する簡単なコードで試してみる

```
project
└── main.go
```
```main.go
package main

import (
	"fmt"
	"log"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "＼Hello World／")
}

func main() {
	log.Print("test print")

	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}
```

Watchする

```
$ realize start
```

```
% curl http://localhost:8080/
＼Hello World／
```

ソースを変更してみると...

```
[00:33:54][REALIZE] : GO changed /Users/xxx/go/src/github.com/xxx/realize/main.go
[00:33:54][REALIZE] : Install started
[00:33:55][REALIZE] : Install completed in 1.005 s
[00:33:55][REALIZE] : Running..
[00:33:55][REALIZE] : 2018/12/26 00:33:55 test print
```

再度, curlで確認してみると結果が反映されていることが分かります.

```
curl http://localhost:8080/
Hello World!!!
```

Realize を組み合わせることで, 開発時の煩わしいビルド作業を意識することなく開発することが出来そうです.　

あでゅ


※ 追記: 私のプロジェクトでは, まだ dep を使用しているので問題なく使えておりますが, 「[Realize が Go 1.11 の Modules で使えない」
](https://qiita.com/enta0701/items/0d0592abb18a333b3268) 
といった報告もあるようです:relaxed:
Windows10でJupyter Notebookを拡張してより使いやすく（初心者）

Jupyter Notebookでプログラムを書く際、今まで自分で見出しに番号をつけて整理していたが、拡張機能を有効にして見出しを付けたら自動的に番号をふってくれる機能があると知った。
また、調べてみるとその他にもいろんな拡張機能があったので、こちらにメモを残しておく。

#環境
   - Windows 10
       - python 3.7.0
       - Jupyter Notebook 5.6.0

# 拡張機能のインストール
anacondaプロンプトで以下のコードを入力

```
conda install -y -c conda-forge jupyter_contrib_nbextensions
```

インストール完了後Jupyter Notebookを起動させると、下のように**Nbextensions**というタブが新たに追加されているのが確認できる。
![jupyternotebook_拡張.png](https://qiita-image-store.s3.amazonaws.com/0/331975/3c752c40-7480-c6ef-55ed-413fda6161e1.png)



# お気に入りの拡張機能
##1. Table of Content(2)
![jupyternotebook_拡張.png](https://qiita-image-store.s3.amazonaws.com/0/331975/eaacab6c-d4fd-9387-2aaa-7bf3999171cc.png)
写真の赤丸のアイコンをクリックすると、画面左に**Contents**のポップアップが表示される。
「#」の個数を使い分けて、見出しの番号を自動的にふることができる。

##2. Collapsible Headings
見出し(Heading)の階層ごとに、セルを閉じることができるのでプログラム全体が見やすくなる。
下の写真の赤丸が閉じてある状態、青丸が開いている状態。
![jupyternotebook_拡張.png](https://qiita-image-store.s3.amazonaws.com/0/331975/03a293a6-59c3-8506-1d68-80d8ae1209d2.png)


##3. AutoSaveTime
一定の間隔（自分で時間間隔の設定可能）で自動保存される。
「NoMethodError」when calling helper method from controller

Sessions_Helper.rbの中に「log_in」というmethodを定義し、Sessions_Controller.rbで呼び出そうとするとエラーが出ちゃう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/305759/f764d22c-70ea-4f15-e9d1-2e52f9f2e3f2.png)
Railsでは天然的にHelper methodをそのまま呼び出せると思っていたが、そうじゃないかなと疑惑。
詳しくまだ分からないけど一応「include SessionsHelper」を追加で解決した。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/305759/8852dd77-b508-3991-8fb3-c688ff7f138e.png)
GCPのCloudIAMの基本概念のメモ


AWSの権限管理ははまぁ歴史があるのでそことなく調べれば落とし所が
つくのにGCPはまだカオスな感じでどうすれば良いかわからない皆さんこんにちは。

今回GCPの権限管理(役割)を整理をしてみてえ？？？どういう事謎だなーというところをまとめてみました。
半分自分用のメモでもあるのはご了承くださいませmm。

詳細を知りたい方は本家ドキュメントをお願いしまーす。



## 対象者

- GCPでCloudIAMで権限設定しようとしている人
- ノリでGCP使っていて権限とか真剣に整備していない人

## 事前に必要なもの

- GCPConsoleに入れる権限

## これを読んでわかること

- Cloud IAMの基本概念の斜め読み

## 色々入る前に基本的なCloudIAMの概念

> Google Cloud Platform（GCP）に備わっている Cloud IAM を使用すると、誰（ID）がどのリソースに対するどのようなアクセス権限（役割）を持つかを定義することで、アクセス制御を管理できます。

参考: [Cloud IAMの基本コンセプト](https://cloud.google.com/iam/docs/overview?hl=ja#top_of_page)

### 誰(ID)

- [Googleアカウント](https://cloud.google.com/iam/docs/overview?hl=ja#google_account)
- [サービスアカウント](https://cloud.google.com/iam/docs/service-accounts?hl=ja)
- [GoogleGroup](https://cloud.google.com/iam/docs/overview?hl=ja#google_group)
- [GSuiteドメイン](https://cloud.google.com/iam/docs/overview?hl=ja#g_suite_domain)
- [Cloud Identity ドメイン](https://cloud.google.com/iam/docs/overview?hl=ja#cloudid_name_domain)

### どのリソース

- [プロジェクト](https://cloud.google.com/resource-manager/docs/cloud-platform-resource-hierarchy?hl=ja#projects)
- [Compute Engine インスタンス](https://cloud.google.com/compute/docs/instances/?hl=ja)
- Cloud Storage
- 等など



## どのようなアクセス権限(役割)

- 基本の役割
  - Google Cloud Platform Console で従来使用されていた役割は継続して使用できます。**オーナー**、**編集者**、**閲覧者**の役割があります。
- 事前定義済みの役割
  - 基本の役割より詳細なアクセス制御が可能な Cloud IAM の役割です。たとえば、事前定義済みの役割 **Pub/Sub パブリッシャー**（roles/pubsub.publisher）では、単に Cloud Pub/Sub トピックにメッセージをパブリッシュするだけのアクセス権が提供されます。
- カスタムの役割
  - 事前定義済みの役割がニーズを満たしていない場合に、組織のニーズに応じて権限を調整するために作成する役割。

参考: [Cloud IAMの基本コンセプト#権限](https://cloud.google.com/iam/docs/overview?hl=ja#permissions)



です。

最初ピンと来なかったのが

- プロジェクトがリソース扱いなところ(Compute Engineとプロジェクトがリソースという固まりになっているところ)
- IDが複数のGoogleのサービスと連携しているところ(どのサービスから継承して現状の設定になっているか分かりづらい...)
  - Googleアカウント
  - GSuite



というのがありました。

またここにはないのですがFireBase経由でプロジェクトを作成するとGCPのIAMと連動して権限が設定されます。



## 最後に



次回はこれを踏まえた上でゆるい権限管理について書こうと思います
VSCode 用 SystemVerilogの拡張を作る（#8）

# コード補完
コード補完は、補完タイミングに合わせてLanguageServerにLSPリクエストが来るので、それに答える形で実現します。

補完タイミングはVSCodeのデフォルトとして

- [Ctrl+Space] を押す
- 単語を数文字打つ

があり、さらに onInitialize で返信した

```typescript
      completionProvider: {
        resolveProvider: true,
        triggerCharacters: ['.', ':']
      },
```

triggerCharactersが入力されたタイミングでも来ます。
これに対して connection.onCompletion で答えればOKです。

https://microsoft.github.io/language-server-protocol/specification#textDocument_completion

に、返信のデータ構造が示されています。
サーバー側での実装例です。

```typescript
connection.onCompletion((_textDocumentPosition) => {
  if (! init_done) return;
  serverlog('onCompletion.');

  let ctx   = _textDocumentPosition.context;
  let pos   = _textDocumentPosition.position;
  let uri   = _textDocumentPosition.textDocument.uri;
  let doc   = documents.get(uri);

  scanContent(doc.uri, doc.getText());
  let items = sva.getCompleteItems(uri, pos.line + 1, pos.character);

  return items;
});
```

scanContentがパーサーを起動しており、出来上がったデータベース（sva）からitemsを生成して返しています。
正しい構造でデータを返せれば、後はVSCodeのイケてるI/Fできれいに表示されるようになります。

データベースさえ作れれば、補完機能がこんなに簡単に実現できるので大変ありがたいです。


# パーサーの実行タイミング
VSCodeで編集が行われる際、いつパーサーを使ってソースコードの解析を行い、データベースを更新するのかは自分で決めます。
候補としては、

- connection.onCompletion
 - VSCodeがLanguageServerに補完を要求するタイミング
- documents.onDidChangeContent
 - バッファ（ファイルではない）の内容に変化があった時
- documents.onDidSave
 - ファイルの内容が変化した時（セーブした時）

などがあるでしょう。
documents.onDidChangeContent
はエディタのバッファが変化したときに反応しますので、1文字打つごとに実行されます。
このタイミングで解析すると一番リアルタイムな感じが出てカッコいい挙動を見せてくれます。

残念ながら、今回作ったSystemVerilogパーサーはかなり実行時間が長く、1000行前後から解析に数1000msを超え、レスポンスに難が出始めてしまいます。さらに悪いことに、onDidChangeContent イベントがキューされる挙動を見せるため、1つのリクエストに1000msもかかっていると、10文字打ち終わったら10秒かけて10回解析が走るという律儀な動作となり、最悪です。

onDidSaveだと適切なタイミングで補完が効かないため、結局、今回は補完タイミングでパーサーを走らせることにしました。
AndroidのHTTP通信を楽に実装しよう

最近Kotlin触り始めました。

モバイルアプリ開発ではもはや当たり前ですが、HTTP通信周りの実装って面倒ですよね。

JavaだとAsyncでHttpURLConnectionとか使って実装したりで結構コードも長くなりがちです。

そこでもっと楽に書けないかなーと探してたらやっぱりあるんですよ、Kotlinで。

それがfuel(https://github.com/kittinunf/Fuel)

実装例はこちら

```kotlin:HttpUtil.kt
package home.fuga
import com.github.kittinunf.fuel.httpGet
import com.github.kittinunf.result.Result

class HttpUtil {
    companion object {
 fun get(url: String, onSuccess:()-> Unit, onFailed: ()->Unit) {
            url.httpGet().response() { request, response, result ->
                when (result) {
                    is Result.Success -> {
                        onSuccess.invoke()
                    }
                    is Result.Failure -> {
                        onFailed.invoke()
                    }
                }
            }
        }
    }
}
```



```kotlin:呼び出し(通常)
HttpUtil.get(url, 
            fun() {
            //成功時にやりたいこと
            }, 
            fun() {
            //失敗時にやりたいこと
           }
        })
```
といった感じでコールバックもスッキリ書けます。

非同期なのでUIとかいじりたい時はこんな感じ

```kotlin:呼び出し(内部でトースト出すとかしたい時)
HttpUtil.get(url, 
            fun() {
               runOnUiThread{ /*成功時にやりたいこと*/ }
            }, 
            fun() {
               runOnUiThread{ /*失敗時にやりたいこと*/ }
           }
        })
```

試しに触ってみるのもいいのではないでしょうか
Xamarin.MacでStoryboard上のWindowをモーダルで出す

### 忘備録として

単なる忘備録です。
**今更感満載** です。

## Xanarin.Macでウインドウをモーダルで出す

出すにしても、Storyboard上にある、NSWindowControllerに結びついているウインドウを出したりします。
主に使いそうなのは、環境設定... 用です。

### StoryboardからNSWindowController（idつき）を引っ張り出す

`InstantiateControllerWithIdentifier` を使います。

```csharp
var wc = NSStoryboard.MainStoryboard.InstantiateControllerWithIdentifier("preference window") as NSWindowController;
```

### モーダルで出す

`RunModalForWindow` を使います。

```csharp
NSApplication.SharedApplication.RunModalForWindow(wc.Window);
```

### モーダルを閉じる

`StopModal` と `OrderOut` を使います。

```csharp
NSApplication.SharedApplication.StopModal();
wc.Window.OrderOut(wc);
```

### 一連の流れを関数にする

メニューに関連づけます。
こんな感じになります。

```csharp
partial void doPreferences(Foundation.NSObject sender)
{
    var wc = NSStoryboard.MainStoryboard.InstantiateControllerWithIdentifier("preference window") as NSWindowController;
    if (wc != null)
    {
        var closeButton = wc.Window.StandardWindowButton(NSWindowButton.CloseButton);
        closeButton.Activated += (object clickSender, System.EventArgs e) =>
        {
            NSApplication.SharedApplication.StopModal();
            (closeButton.AccessibilityParent as NSWindow).OrderOut(closeButton);
        };
        NSApplication.SharedApplication.RunModalForWindow(wc.Window);
    }
}
```

#### なんで書いておくのか

Windowのクローズボタンからの処理に悩んだからです…。
なので、一番書きたかったのは、 `StandardWindowButton` の部分だったりします。
Androidエミュレータがインターネットに繋がらない<AndroidStudio>

# 突然のERR_CONNECTION_REFUSED
ベータ環境のWebAPIを叩くアプリを作っていたら、昨日まで順調にいっていたはずが、ホストが解決できないときた。青天の霹靂である。

先輩に相談したところ、エミュレータでChromeへのアクセスを勧められる。問題の切り分けを教えてもらい、開発環境…エミュレータに問題がありそうだと
あたりをつけた。

<img width="819" alt="Screen Shot 2018-12-26 at 10.46.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/331522/f33f0dcf-8282-f4dc-ae0a-7774cdd8d95a.png">

解決方法を探っていると、諸先輩方も苦労したようである。


http://www.hnyssh.net/?p=793
https://stackoverflow.com/questions/20015883/connecting-localhost-via-android-connection-to-10-0-2-2-refused/22313837#22313837

自分の場合は画像の通り、
設定->Proxy->Use Android Studio HTTP proxy settingsのチェックを外し、
Manual Proxy ConfigurationでHost Nameを10.0.2.2に指定、
Portは8080で設定したところ、疎通ができるようになった。


全然手応えがないので明日以降も同じエラーに悩まされないか心配だ…



## 追記
AndroidManifest.xmlにはこんな記述が必要なのである。
どこに書くか、各項目の意味は自分で調べましょう🐕
```<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

## 上記についてご参考URL
https://www.wikihow.com/Execute-HTTP-POST-Requests-in-Android
```
【rails5】migrationについてのメモ

##【migrationについてのメモ】

マイグレーションとは。

**DB内にテーブルやカラムを追加、削除したり、既存のデータに修正を加えること。**

マイグレーションは次の２ステップで行う。

**①DBの構造（スキーマ）を変更するコードを記述した「マイグレーションファイル」を作成する。**

**②「マイグレーションファイル」を「rails db:migrate」コマンドを使って、DBに適用する。（migrateする）migrateは移動、移住等の意味。**

注意点
・マイグレーションファイルを作成しただけではDBに適用されない。
・マイグレーションファイルを削除しただけでもDBには適用されない。

**rails db:migrateコマンド**を実行して初めてDBに適用される。

マイグレーションファイルは、開発用・本番用・テスト用それぞれに適用させる必要がある。

デフォルトでは開発用に対してマイグレーションが実施される。

```
本番環境にマイグレーションする場合
rails db:migrate RAILS_ENV=production
```

```
テスト環境にマイグレーションする場合
rails db:migrate RAILS_ENV=test
```

マイグレーションは、１つのマイグレーションファイルが１つのバージョンとして扱われる。
１つのマイグレーションファイルを適用することで、DBのスキーマのバージョンを１つ上げることが出来る。
逆に、１つのマイグレーションファイルの適用を取り消すことで、バージョンを１つ下げることも出来る。

```
適用する（テーブルを追加する、バージョンを上げる）
rails db:migrate
```

```
適用を取り消す（テーブルを削除する、バージョンを下げる）
rails db:rollback
```

schema.rbについて

現在のテーブルやカラム等DBの構造を、視覚的に出力したものがdb/schema.rbファイル。

マイグレーションファイルを適用したり、適用を削除したりすると自動的に出力される。
nodejsでMarkdownファイルを署名入りでPDF化する

[markdown-pdf](https://github.com/alanshaw/markdown-pdf)を利用し、Markdown記法で書かれたREADMEを署名付きでPDF化したいと思います。
#### 1. markdown-pdfをインストール
グローバルインストールしておくと便利です

```
npm install -g markdown-pdf
```
#### 2. footerファイルを用意
```running.js ```というファイルを作りフッター情報を記載します。（header情報も記載できます）

```
exports.header = null;

exports.footer = {
        height: "1cm",
        contents: function(pageNum, numPages) {
          return "<p><span style='font-size:10px; float:right;'>copyright © 2018 HogeHoge All Right Reserved</span></p>"
        }
    };
```

#### 3.PDF化
```markdown-pdf -h running.js <markdown-file-path> ```でPDF化できます。（```markdown-pdf <markdown-file-path> ```で署名なしになります）
テスト技法を忘備録用にまとめる ～ブラックボックステスト～ その2

# ブラックボックステストとは

[その1に記載](https://qiita.com/shimomai@github/items/8e99ccdda35a676a8aac#%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88%E3%81%A8%E3%81%AF)

その1で基本的な技法である「同値分割」「境界値分析」をまとめたが、
その2ではそれ以外の技法についてまとめる。

# その他技法

### デシジョンテーブルテスト
* 様々な条件に対してどのように動作するのかを表形式で整理し、その表を元にテストをする技法

#### 例
* 映画館の割引
 * レディースデー（女性かつ水曜日）：1000円
 * レイトショー(20時以降)：1300円

→ デシジョンテーブルは以下の通り

|  |  |  | 1 | 2 | 3 | 4 | 5 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 条件1 | 性別 | 男性 |Y|Y|N|N|N|
|  |  | 女性 |N|N|Y|Y|Y|
| 条件2 | 曜日 | 水曜日 |-|-|Y|N|N|
|  |  | 水曜日以外 |-|-|N|Y|Y|
| 条件3 | 上映時間| ～20時 |Y|N|-|Y|N|
|  |  | 20時～ |N|Y|-|N|Y|
| 結果1 |料金|通常料金|Y|N|N|Y|N|
| 結果2 |料金|1000円|N|N|Y|N|N|
| 結果3 |料金|1300円|N|Y|N|N|Y|

### 状態遷移テスト
* 動作中に様々に変化する状態に着目し、発生しうる遷移をテストする技法

#### 例
* ショッピングサイトにて配送情報を登録する
 * 入力画面-確認画面-登録完了画面の3画面が存在する
 * 入力画面で「確認」を押すと確認画面に遷移
 * 確認画面で「戻る」を押すと入力画面に遷移
 * 確認画面で「登録」を押すと登録完了画面に遷移
 * 登録画面で「別の住所を登録」を押すと入力画面に遷移

→ 状態遷移の様子を図で表すと以下の通り
![キャプチャ.jpg](https://qiita-image-store.s3.amazonaws.com/0/19908/fb3acb1e-4b3f-00cb-18bc-b36689cbecd3.jpeg)



### モンキーテスト
* 実施者がテストの対象箇所や操作手順などを特に定めず思いつきでテストを行う技法
テスト技法を忘備録用にまとめる ～ブラックボックステスト～ その1

# ブラックボックステストとは

* 入力・出力にのみ着眼し、出力結果が仕様どおりの正しい値か確認する手法
（外部仕様のみのテスト）<br>
* つまり、プログラムの内部仕様に関しては考慮しない
 

# 主な技法

### 同値分割
#### 同値分割とは
* テスト結果をグループ分けし、それぞれの結果になるような代表値を選択しその値でテストを行う技法
* このグループのことを**同値クラス**と呼ぶ
 * 有効同値クラス
 * 無効同値クラス

#### 例
* 誕生日を入力すると星座が表示されるプログラム
 * 3/21～4/20：おひつじ座
<br>→ 3/21,3/22,...,4/19,4/20は同値
 * 4/21～5/20：おうし座
<br>→ 4/21,4/22,...,5/19,4/20は同値
<br>・
<br>・
<br>
→ 4/1～3/31はすべて有効同値クラス
 * -1月,0月,13月...
 * -1日,0日,32日...
<br>
→ これらは無効同値クラス

以上のことを踏まえテストを行うケースを考えると

| 入力 | 出力 | 正常/エラー |
|:-----------:|:------------:|:------------:|
| 4/1 | おひつじ座 | 正常 |
| 5/1 | おうし座 | 正常 |
| 6/1 | ふたご座 | 正常 |
| 7/1 | かに座 | 正常 |
| 8/1 | しし座 | 正常 |
| 9/1 | おとめ座 | 正常 |
| 10/1 | てんびん座 | 正常 |
| 11/1 | さそり座 | 正常 |
| 12/1 | いて座 | 正常 |
| 1/1 | やぎ座 | 正常 |
| 2/1 | みずがめ座 | 正常 |
| 3/1 | うお座 | 正常 |
| 100/1 | - | エラー |
| 4/-10 | - | エラー |

などが考えられる。

### 境界値分析

* 同値分割で得た同値クラスの境界、及びその前後の値でテストを行う技法
<br>（同値クラスの境界は＞と≧、>と<と言った条件式の書き間違いなどでバグが発生しやすい）

#### 例
* 誕生日を入力すると星座が表示されるプログラム
 * 3/21～4/20：おひつじ座
 * 4/21～5/20：おうし座 
 * 5/21～6/21：ふたご座
 <br>→ 4/20及び4/21、5/20及び5/21が境界値

→この境界値を上記「同値分割」に記載したテストケースの入力値に当てはめるとより不具合が見つかる可能性があがる
[Python] 自作のcsvファイル解析モジュールをwebアプリに組み込むためのシンプルなサンプル

## この記事について

Djangoのサンプルコードです。

機械学習等でcsvファイルを読み込んで解析を行うモジュールを作ることがあるかと思います。ちょっと作ったモジュールをwebアプリに組み込んでブラウザで試してみたい時に使ってください。

すぐ使えるのはこちら。

https://github.com/okoppe8/django-csv-upload-example

使い方はREAD.ME 参照。CSVのデータをデータベースに投入し、Django REST FrameworkとJavaScriptでグラフを描くなんてのも面白いので是非やってみてください。


**参考**

- [Qiita:Python + Django でCSVのダウンロード／アップロード](https://qiita.com/t-iguchi/items/d2862e7ef7ec7f1b07e5)
- [Qiita:Djangoでのグラフの作り方のサンプル](https://qiita.com/okoppe8/items/1c66a7f57d855f3f9b02)

## サンプルコード

```urls.py
from django.urls import path
from .views import UploadView


urlpatterns = [
    path('', UploadView.as_view(), name='index'),
]
```

```python:forms.py
from django import forms
from django.core.validators import FileExtensionValidator


class UploadForm(forms.Form):
    file = forms.FileField(
        validators=[FileExtensionValidator(['csv', ])])
```


```python:views.py
import csv
import io

from django.http import HttpResponse
from django.views.generic import FormView

from .forms import UploadForm


# Create your views here.
class UploadView(FormView):
    form_class = UploadForm
    template_name = 'app/UploadForm.html'

    def form_valid(self, form):
        csvfile = io.TextIOWrapper(form.cleaned_data['file'])

        # この部分をあなたのコードに差し替えます。
        reader = csv.reader(csvfile)
        count = sum(1 for row in reader)
        result = 'データ件数は{}件です'.format(count)

        # 結果をブラウザに表示させたいときはこちら
        return self.render_to_response(self.get_context_data(result=result))

        # 結果をテキストファイルでダウンロードさせたいときはこちら
        # response = HttpResponse(result, content_type='text/plain')
        # response['Content-Disposition'] = 'attachment; filename = "result.txt"'
        # return response
```

```html:UploadForm.html
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<div>
    <form action="{% url 'index' %}" method="POST" enctype="multipart/form-data">
        {% csrf_token %}
        <div>
            <div>
                {{ form.file }}
                <p>{{ form.file.errors }}</p>
            </div>
        </div>
        <input type="submit" value="アップロード">
    </form>
    <pre>{{ result }}</pre>
</div>
</div>
</body>
</html>

```
SourceTree for Windows の認証手順

# 概要
開発にはMacを使うことが多いですが、VisualStudioとなるとWindowsが手放せません。
SourceTreeをWindowsに設定していくと、手惑ってしまうことが多かったのでまとめます。

# 1. SourceTreeをインストール
次のURLからダウンロードして、インストールします。
https://ja.atlassian.com/software/sourcetree

# 2. 鍵を作成
- SourceTreeで[ツール]>[SSHキーの作成/インポート]を選択すると、PuTTY Key Generatorが起動します
- [Generate]を選択し、画面上でマウスカーソルを動かすと、鍵が完成します
- 鍵のパスワードを設定します
- [Save public key]を選択し、保存します
  - ファイル名はなんでもいいですが、`id_putty.pub`とします
- [Save private key]を選択し、保存します
  - ファイル名はなんでもいいですが、`id_putty.ppk`とします

# 3. SSHクライアントを設定
- SourceTreeで[ツール]>[オプション]を選択します
- 全般タブのSSHクライアントの設定を以下のように設定します
    - [SSHキー] : `id_putty.ppk`
    - [SSHクライアント] : `PuTTY / Plink`
- [OK]をクリックします

# 4. gitサーバに鍵を登録
-  `id_putty.pub`をgitサーバに登録します  
  githubやgitlabなどによって手順が異なりますので、割愛します

# 5. Pageantに鍵を登録
- SourceTreeで[ツール]>[SSHエージェントを起動]を選択すると、
    Pageantが起動します（システムトレイに格納されています）
- Pageantで[Add Key]を選択し、`id_putty.ppk`を選択します
- パスワードを入力します

# 6. 接続確認
- クローンやフェッチなどして、接続できることを確認します
[oVirt] Ubuntuでゲストエージェント ovirt-guest-agent が動かないときの解決策

# 前フリ

oVirtの管理画面から仮想マシンを見ると
「ゲストエージェントが古い！」
と警告が表示されていることがあります。

どれどれと仮想マシンにログインして見てみると

```terminal:
# systemctl status ovirt-guest-agent
* ovirt-guest-agent.service - oVirt Guest Agent
   Loaded: loaded (/lib/systemd/system/ovirt-guest-agent.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Wed 2018-12-26 09:16:35 JST; 42min ago
  Process: 16439 ExecStart=/usr/bin/python /usr/share/ovirt-guest-agent/ovirt-guest-agent.py (code=exited, status=1/FAILURE)
```

ゲストエージェントが動いてない！

# 環境

* oVirt 4.2.6
* Ubuntu 16.04
* oVirt Guest Agent 1.0.11.3-1.1


# 原因

ログを見てみます。

```text:/var/log/ovirt-guest-agent/ovirt-guest-agent.log
OSError: [Errno 13] Permission denied: '/dev/virtio-ports/ovirt-guest-agent.0'
```

デバイスファイルのパーミッションが悪いみたいです。

```terminal:
# ls -l /dev/virtio-ports/
lrwxrwxrwx 1 root root 11 Dec 26 09:55 com.redhat.spice.0 -> ../vport2p3
lrwxrwxrwx 1 root root 11 Dec 26 09:55 org.qemu.guest_agent.0 -> ../vport2p2
lrwxrwxrwx 1 root root 11 Dec 26 09:55 ovirt-guest-agent.0 -> ../vport2p1
```

シンボリックリンクになっていました。実体は

```terminal:
# ls -l /dev/vport2p*
crw------- 1 root root 248, 1 Dec 26 09:55 /dev/vport2p1
crw------- 1 root root 248, 2 Dec 26 09:55 /dev/vport2p2
crw------- 1 root root 248, 3 Dec 26 09:55 /dev/vport2p3
```

rootユーザしか読み書きできないです。

# 解決策

udevへ指示するファイルを作成します。
ファイル名は、拡張子が`.rules`であればなんでもよいです。

```text:/etc/udev/rules.d/80-virtio-ports.rules
SUBSYSTEM=="virtio-ports",GROUP="ovirtagent",MODE="0660"
```

ルールを適用するには、`udevadm`コマンドを使います。

```terminal
udevadm trigger --subsystem-match=virtio-ports
```

「デバイスが変わったよー」ということを通知しています。


無事パーミッションが設定されました。

```terminal:
# ls -l /dev/vport2p*
crw-rw---- 1 root ovirtagent 248, 1 Dec 26 09:55 /dev/vport2p1
crw-rw---- 1 root ovirtagent 248, 2 Dec 26 09:55 /dev/vport2p2
crw-rw---- 1 root ovirtagent 248, 3 Dec 26 09:55 /dev/vport2p3
```



# 落穂ひろい

## udevルールの読み方

`==`で結ばれているところは検索条件です。上では、SUBSYSTEMがvirtio-portsにマッチするデバイスを意味します。

`=`で結ばれているところはアクションです。上では、オーナーグループとモードを設定しています。

詳しくは udev(7) マニュアルを見てください。

## udevルールの作り方

検索条件として何を指定すればよいかは、`udevadm`コマンドで調べられます。

```terminal
# udevadm info --query=all --attribute-walk --name=vport2p1
(...省略...)
  looking at device '/devices/pci0000:00/0000:00:05.0/virtio2/virtio-ports/vport2p1':
    KERNEL=="vport2p1"
    SUBSYSTEM=="virtio-ports"
    DRIVER==""
    ATTR{name}=="ovirt-guest-agent.0"
(...省略...)
```

`udevadm`コマンドに調べたいデバイス名を渡してください。