OmniAICreator/Qiita-1.07M huggingface dataset:
SAS Viyaで回帰分析モデルを試す

SAS Viyaでは様々なアクションセットが用意されており、データ分析を容易に行えるようになっています。今回はその一つ、回帰分析モデルを試す方法を紹介します。なお、この処理はSAS Viyaのデモアカウントでも行えますので、ぜひお試しください。

## データのアップロード

元のデータは以下のURLに用意してあります。ダウンロードしてください。

https://raw.githubusercontent.com/sassoftware/sas-viya-programming/master/data/cars.csv

そしてSAS ViyaのJupyter Notebookでアップロードします。

## SAS Viyaへの接続

まずSAS Viyaに接続します。認証情報はあなたのものに書き換えてください。

```python
cashost='localhost'
casport=5570
useremail='dev@sas.com'
userpassword='xxxxxxxxxxx'
casauth='~/.authinfo'
conn = CAS(cashost, casport, useremail, userpassword, caslib="casuser")
```

## データの読み込み

次に先ほどアップロードしたデータを読み込みます。

```python
cars = conn.upload('cars.csv').casTable
```

カラム情報は次のようになっています。

```python
print(cars.columninfo());
```

出力結果です。

```
[ColumnInfo]

          Column  ID     Type  RawLength  FormattedLength  NFL  NFD
 0          Make   1  varchar         13               13    0    0
 1         Model   2  varchar         39               39    0    0
 2          Type   3  varchar          6                6    0    0
 3        Origin   4  varchar          6                6    0    0
 4    DriveTrain   5  varchar          5                5    0    0
 5          MSRP   6   double          8               12    0    0
 6       Invoice   7   double          8               12    0    0
 7    EngineSize   8   double          8               12    0    0
 8     Cylinders   9   double          8               12    0    0
 9    Horsepower  10   double          8               12    0    0
 10     MPG_City  11   double          8               12    0    0
 11  MPG_Highway  12   double          8               12    0    0
 12       Weight  13   double          8               12    0    0
 13    Wheelbase  14   double          8               12    0    0
 14       Length  15   double          8               12    0    0

+ Elapsed: 0.0014s, user: 0.001s, mem: 0.7mb
```

## アクションセットを読み込む

回帰分析のアクションセットを読み込みます。

```python
conn.loadactionset('regression')
```

## モデルを作る

モデルを定義します。ターゲットと入力値を指定します。

```python
cars.glm(
    target = 'MSRP',
    inputs = ['MPG_City']
)
```

モデルを次のように定義して、プロパティをセットすることもできます。

```python
linear1 = cars.Glm()
linear1.target = 'MSRP';
linear1.inputs = ['MPG_City']
linear1()
```

## 分布をグラフ化する

ではデータを可視化してみます。まず取得するデータの定義です。

```py
result1 = conn.CASTable('cas.MSRPPrediction2', replace=True)
linear1.output.casout = result1
linear1.output.pred = 'Predicted_MSRP'
linear1.output.resid = 'Residual_MSRP'
linear1.output.lcl = 'LCL_MSRP'
linear1.output.ucl = 'UCL_MSRP'
linear1()
```

次に出力設定です。

```py
from bokeh.charts import Scatter, output_file, show
out1 = result1.to_frame()
p = Scatter(out1, x='Residual_MSRP', y='Predicted_MSRP', color='Origin', marker='Origin')
output_file('scatter.html')
show(p)
```

結果として、以下のようなグラフが得られるはずです。

![Screenshot_ 2019-03-20 14.56.42.png](https://qiita-image-store.s3.amazonaws.com/0/274479/c51d6d41-523f-6fb7-f4e2-aa0a9dddcd0e.png)

## まとめ

データの分析、可視化は大変そうに感じますがSAS Viyaを使うことでストレスなく素早く可視化まで行えます。[SAS for Developers | SAS](https://developer.sas.com/home.html)からデモアカウントを作れますので、ぜひお試しください。
PHPUnitのsetUp()を使ったら「must be compatible」とエラーが表示される

# 前提
* PHP 7.2.15-0ubuntu0.18.04.1 (cli) (built: Feb  8 2019 14:54:22) ( NTS )
* PHPUnit 8.0.5 by Sebastian Bergmann and contributors.
* Ubuntu 18.04.2 LTS

# 問題の記述
このエラーに遭遇した人は公式ドキュメントや他の方ブログなどを参考にして以下のような実装して、
エラーが出力されたのではないでしょうか？

```
class MovieTest extends TestCase {
    protected function setUp() {
        ・・・
    }
}
```

### エラー内容

```
PHP Fatal error:  Declaration of MovieTest::setUp() must be compatible with PHPUnit\Framework\TestCase::setUp(): void in /{途中省略}/MovieTest.php on line 5
```
エラーの内容を簡単に記述すると、`MovieTest::setUp()`で記述したものと`TestCase::setUp()`で定義されてるものが一致する必要があるみたいです。

もう少しPHP関連の動きも交えてお話するとPHP7.0から型宣言ができるようになり、PHP7.2から戻り値の型宣言もできるようになりました。その動きに合わせてPHPUnitでも8.xから型宣言をする形式に実装を修正されているみたいです。そのことを踏まえると呼び出し側でも後で記載しているような実装をする必要があります。実際に試していないで推測ですが、7.xを利用している人は上記のようなエラーは表示されないのではないかと思います。

# 解決方法
先に結論から言うと、`setUp()`に戻り値型の`: void`の宣言を記述すると上手くいきました。
(後述の`TestCase`クラスと同じ記述にする)

```
protected function setUp(): void {
   ・・・
}
```

# 参考
参考までに実際に`./vendor/phpunit/phpunit/src/Framework/TestCase.php`の`TestCase`クラスを見てみると以下の通りに記述されていますので、これと同じように記述すると良さそうです。(405行目あたりくらい)
関係ある部分だけ抜粋して記述しています。

```
abstract class TestCase extends Assert implements Test, SelfDescribing
{

     /**
     * This method is called before each test.
     */
    protected function setUp(): void
    {
    }
}
```

記述に誤字脱字や不適切な表現がありましたら、ご指摘いただけると幸いです。
vue.jsで初学者がハマったことメモ

# vue.jsで初学者がハマったことメモ
ハマったことをメモ。
初学者はこんなところでハマります。

## templateの書き方
templateの中は必ず階層構造にしないと最初の要素以外無視される。 

```vuejs:template
× ダメ絶対
<div id="hoge"></div>
<div id="foo"></div>

◯ OK.
<div id="hoge">
  <div id="foo"></div>
</div>
```
## v-bind:class
-(ハイフン)含みのclassは、'(シングルクォート)で囲まないとNG.
`- invalid expression: Unexpected token - in`がでるらしい。
（codepenでは沈黙のエラーだったのでハマった）
※`v-bind`は省略可

```vuejs:template
× ダメ絶対
<div v-bind:class="{class-A: isActiveA}"></div>

◯ OK.
<div v-bind:class="{'class-A': isActiveA}"></div>
```
aws configservice で --query したメモ

AWS Config 使い始めてNon Compliant な情報を定期的に自動チェックしたいと思い始めたのでメモ。
JAWS 2019 でもAWS CLI の --query 薦めてたしここは一つjq使わずawsコマンドだけで行く方向で。


#設定ルール全体での準拠状況を確認する

AWS Config ダッシュボードの "設定ルールのコンプライアンス" に相当するやつですね

```
$  aws configservice get-compliance-summary-by-config-rule
{
   "ComplianceSummary": {
       "NonCompliantResourceCount": {
           "CappedCount": 2, 
           "CapExceeded": false
       }, 
       "ComplianceSummaryTimestamp": 1553131869.997, 
       "CompliantResourceCount": {
           "CappedCount": 8, 
           "CapExceeded": false
　　 :
```

#リソース全体での準拠状況を確認する
同じくダッシュボードの "リソースのコンプライアンス" に相当するやつ

```
$  aws configservice get-compliance-summary-by-resource-type
{
   "ComplianceSummariesByResourceType": [
       {
           "ComplianceSummary": {
               "NonCompliantResourceCount": {
                   "CappedCount": 18, 
                   "CapExceeded": false
               }, 
               "ComplianceSummaryTimestamp": 1553131954.779, 
               "CompliantResourceCount": {
                   "CappedCount": 40, 
                   "CapExceeded": false
　　 :
```

#各ルール単位での準拠状況を確認する

get-compliance-details-by-config-rule はルール指定が必要ぽいので
ルール ec2-instance-managed-by-systems-manager の状況を確認してみます
ついでに --query でInstanceIDと準拠情報だけ抽出

```
$ aws configservice get-compliance-details-by-config-rule --config-rule-name ec2-instance-managed-by-systems-manager \
--query  'EvaluationResults[].{InstanceID:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' 
[
   {
       "InstanceID": "i-0103ccxxxxx", 
       "ComplianceType": "COMPLIANT"
   }, 
   {
       "InstanceID": "i-0facf2xxxxxx", 
       "ComplianceType": "NON_COMPLIANT"
               :
```
#各リソース単位での準拠状況を確認する

こちらは一覧で出せるようなのでずらっと

```
$ aws configservice describe-compliance-by-resource \
--query  'ComplianceByResources[].{ResourceID:ResourceId,ComplianceType:Compliance.ComplianceType}'
[
   {
       "ResourceID": "XXX_Audit", 
       "ComplianceType": "COMPLIANT"
   }, 
   {
       "ResourceID": "i-0facf2xxxxxx", 
       "ComplianceType": "NON_COMPLIANT"
   }, 
　　 :
```

#NON_COMPLIANTだけを抽出するならこんな感じ

ComplianceType を検索条件に入れて非準拠なResourceIDだけをリスト。
これを定期的にSlackに打ち上げれば確認の手間がだいぶ省けそうですね

```
$ aws configservice describe-compliance-by-resource --query \
'ComplianceByResources[?Compliance.ComplianceType==`NON_COMPLIANT`].{ResourceID:ResourceId,ComplianceType:Compliance.ComplianceType}' 
[
   {
       "ResourceID": "vol-0029b47xxxxx", 
       "ComplianceType": "NON_COMPLIANT"
   }, 
   {
       "ResourceID": "vol-00fff2xxxxx", 
       "ComplianceType": "NON_COMPLIANT"
　　:
```

みなさんのAWS Config 運用のお役に立てば幸いです。
FLASK 実行方法

ディレクトリmyapp.py を作成
その中にhello.pyファイルを作成

## コード
<img width="308" alt="スクリプトショット.png" src="https://qiita-image-store.s3.amazonaws.com/0/355304/ea3e96ef-579d-bb4c-de44-20e7ace91abf.png">


-Windows:powershellで実行
-Mac:ターミナルで実行する

>pip3 install flask
>cd myapp
>$env:FLASK_APP="hello.py"
>flask run
Swift MkMapViewで地図アプリ作成してみた（15）- watchOSからiOSにデータ送信を要求する

#記事一覧
[Swift MkMapViewで地図アプリ作成してみた（記事一覧）](https://qiita.com/rain_00_00_09/items/3151b3faf2303fe78312)

#watchOSからiOSにデータ送信を要求する
###sendMessageでiOSにデータ送信を要求する
watchOSのアプリが非アクティブであれば、iOSのアプリからのデータを受け取れない。
そのため、watchOSのアプリがアクティブになった時に、sendMessageでiOSのアプリにデータ送信を要求する。
    

```swift:InterfaceController.swift：
    override func willActivate() {
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()

        // 画面描画時(アクティブになった時)にiOSのアプリにデータ送信を要求する
        let contents =  ["GET":"LONLAT"]
        self.session.sendMessage(contents, replyHandler: { (replyMessage) -> Void in
            print (replyMessage);
        }) { (error) -> Void in
            print(error)
        }
    }
```

#iOSでメッセージを受信するとwatchOSにデータを送信する

###watchOSからのメッセージを受信する

sessionメソッドを定義すると、watchOSからsendMessageで送信したデータを受信できる。
以下の処理はiOSのアプリが起動していれば非アクティブの状態でも動作する。

```swift:ViewController.swift：watchOSからのメッセージを受信する
    // watchOSからMessage受信
    public func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void){
        print("receiveMessage::\(message)")
        replyHandler(["message" : "received message."])
    }
```

###watchOSにデータを送信する

sessionメソッドを実装する。
[Swift MkMapViewで地図アプリ作成してみた（14）- iOSから送信したデータをwatchOSで受信する](https://qiita.com/rain_00_00_09/items/59ff413b71caf4189656)で送信したデータを再送する。

```swift:ViewController.swift：watchOSにデータを送信する
    // watchOSからMessage受信
    public func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void){
        print("receiveMessage::\(message)")
        replyHandler(["message" : "received message."])

        // String型以外は処理しない
        guard let getType = message["GET"] as? String else {
            return
        }

        switch getType {
        case "LONLAT":
            // watchOSにロングタップしてピンを立てた地点の緯度経度を送信
            let contents =  ["lon":dlon, "lat":dlat]
            self.session.sendMessage(contents as [String : Any], replyHandler: { (replyMessage) -> Void in
                print ("receive from apple watch");
            }) { (error) -> Void in
                print(error)
            }
        default:
            print("not exist type.")
        }
    }
```

<img width="750" alt="image1.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/d3a00b06-32f4-1856-ae33-13eafdab01b8.png">


#参考文書
[WCSession - WatchConnectivity | Apple Developer Documentation](https://developer.apple.com/documentation/watchconnectivity/wcsession)
Kubernetesで使われる単語の概要

# Kubernetesとは
- 発音は「クベネチス」「クーバネティス」。K8sと書かれる事もある
- Dockerコンテナをクラスタ化した際の運用ツールの１つ
- 複数台のホストから構成される実行環境を、１台の実行環境のように扱うことができる

- 参考
   - [今さら人に聞けない Kubernetes とは？](https://qiita.com/MahoTakara/items/85096f8b2632c802ab22)
  
    - [3分で分かった気になる、Kubernetes とは？](https://qiita.com/r548/items/e6d1e4dcfdd9f8a7874d)

    - [Kubernetes の Pod / ReplicaSet / Deployment について、ようやく整理できた （入門k8s 読書メモ）](https://blog.a-know.me/entry/2018/08/14/185324#Deployment-%E3%81%A8%E3%81%AF)

    - [StatefulSetっていつ使うの？PersistentVolumesでいいんじゃないの？](https://scrapbox.io/blackawa/StatefulSet%E3%81%A3%E3%81%A6%E3%81%84%E3%81%A4%E4%BD%BF%E3%81%86%E3%81%AE%EF%BC%9FPersistentVolumes%E3%81%A7%E3%81%84%E3%81%84%E3%82%93%E3%81%98%E3%82%83%E3%81%AA%E3%81%84%E3%81%AE%EF%BC%9F)
    - [KubernetesでのService公開方法に関する検証 - Ingress Controllerの活用](https://developers.freee.co.jp/entry/kubernetes-ingress-controller)

# 使われる単語の概要
- Deployment(デプロイメント)
    - Kubernetesのデプロイメントは、デプロイ済みのアプリを(無停止で)バージョンアップさせる仕組み。動詞ではなく「Deploymentオブジェクト」が存在する。
- Pod
    - デプロイの単位。１つの環境。Podごと複製できる。コンテナ。
- ReplicaSets
    - Podが常に指定した数だけ起動しているようにする仕組み。Podがダウンした時に自動的に代わりのPodを起動させる。
- Service
    - Pod への安定的なアクセス手段。Podはどのノードにいるか分からないし、作り直されることもあるので、PodにアクセスするにはPodの識別が必要。そこで、Podに仮想のIPアドレス(cluster IP)を割り当て、cluster IPを使ってPodにアクセスできるようにする。また、外部から見られるようにプロキシも提供する。
- Ingress
    - インターネットからのアクセスを内部サービスにつなぐ仕組み。
- StatefulSet
    - 状態を保持する(ステートフルな)アプリケーションを管理するためのKubernetesオブジェクト。永続ボリュームと違って分かりやすい固定の名前を付けられる。
- DaemonSet
    - ノードにプログラムをインストールするための仕組み。他の使い方もある。
- Ingress Controller
    - 一つのポートで複数のサービス(Ingress)に処理を振り分ける仕組み。
- ConfigMap
    - 設定情報を扱うためのリソース。Secretと違って動的に反映できる。
- Secret
    - パスワードや証明書などの非公開情報をPodに入れるための仕組み。ファイルや環境変数を使って受け渡す。


# YouTube動画
- [【Kubernetesを学ぼう】イラスト付き子どもたちのためのKubernetesガイド](https://www.youtube.com/watch?v=2n1PgZ-2oS0)
- [【Kubernetesを学ぼう】フィッピー、動物園に行く](https://www.youtube.com/watch?v=QjE0cyPZQMc)
- [Docker & Kubernetes入門 – (1) 概要編](https://www.youtube.com/watch?v=sEU5w6Muvy4)
- [Next 東京：Kubernetes のコンテナ技術ですべてをシンプルに（Brian Dorsey）](https://www.youtube.com/watch?v=aMcLGD20kTY)
WindowsのC++ビルド環境を作る～Build Tools for Visual Studio 2017の導入

[fukuoka.ex](https://fukuokaex.connpass.com/)代表のpiacereです
ご覧いただいて、ありがとうございます :bow:

Windowsは、macやLinuxのように、C++ビルドツールが標準では入っていないため、ElixirのC++利用ライブラリ（Matrex、bcrypt_elixirなど）が、そのままでは、ビルドできません

そこで、C++利用ライブラリをWindowsでビルドするための第一歩として、C++ビルドツールである「Build Tools for Visual Studio 2017」をインストールする手順を解説します

内容が、面白かったり、気に入ったら、「いいね」よろしくお願いします :wink:

# 本コラムの検証環境

本コラムは、以下環境で検証しています

- Windows 10

# 「Build Tools for Visual Studio 2017」のダウンロード

「Build Tools for Visual Studio 2017」は、以下ページ下部にある、「すべてのダウンロード」の「Visual Studio 2017」の「＋」をクリックして開き、中にある、「Build Tools for Visual Studio 2017」の右側、「ダウンロード」ボタンをクリックして、ダウンロードします

https://visualstudio.microsoft.com/ja/downloads
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/48414381-03cf-4625-d47b-42117ec631d6.png)

# 「Build Tools for Visual Studio 2017」のインストール

ダウンロードが終わり、「vs_buildtools__xxxxxxxx.xxxxxxxxxx.exe」というファイルが入手できたら、実行すると、幾つかの確認ダイアログを挟み、以下のインストーラが動けば、インストール実行成功です（完了まで、けっこう時間がかかると思います）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/d94043b5-c257-a661-5190-7865ef3fb623.png)

手順はこれだけです

# bcrypt_elixirをビルドしたい場合は…

[こちらのコラム](https://qiita.com/piacere_ex/items/662f9d7657f8e043272b)を続けて実施してください

# 終わり

今回、C++利用ライブラリをWindowsでビルドするために、「Build Tools for Visual Studio 2017」をインストールする手順を解説しました

Windowsは、macやLinuxと異なり、C++ビルドツールが標準では入っていないため、C++利用ライブラリのビルドで躓きやすいのですが、今回の手順を見てお分かりの通り、わりかし簡単な手順です（ダウンロード元を見つけることが、最も難しいのかも…）

私のように、WindowsでElixirをやられている方でも、めげずに頑張ってみてください

ただし、時間的に厳しい方は、サクッとmac／Linuxに逃げる器用さは、頭の片隅に置いといてください

# p.s.「いいね」よろしくお願いします

ページ左上の ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/4d515047-cc48-382e-c2b1-3ad0cc50dbbf.png) や ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/a4e3da58-70a3-4197-95a2-6a6906650d01.png) のクリックを、どうぞよろしくお願いします:bow:
ここの数字が増えると、書き手としては「ウケている」という感覚が得られ、連載を更に進化させていくモチベーションになりますので、もっとElixirネタを見たいというあなた、私達と一緒に盛り上げてください！:tada:
Ruby on RailsをWindowsで開発したとき躓いたところメモ

#最初に
今、Ruby on Railsを勉強中なのでやりながら随時更新していこうと思います。

#使っているバージョン
ruby 2.4.5p335
Rails 5.2.2.1

#Rubyのバージョンが2.5.xだとsqliteをgemできない
https://qiita.com/yoru722/items/8a633d71148de0f0ae1f

上記の記事にもある通りsqliteをうまく導入できませんでした。
自分はおとなしくRuby2.4をインストールし直しました。
またsqlite3のバージョンを指定

```Gemfile
# Use sqlite3 as the database for Active Record
gem 'sqlite3', '~> 1.3.6'
```
今使っているバージョンでは問題なく導入できました。

#Bootstrap4を導入する際にエラーが発生
##以下の手順で導入しました。

1. Gemfileに追記

```Gemfile
# 以下を追加
gem 'bootstrap', '~> 4.1.1'
gem 'jquery-rails', '~> 4.3.1'
```

2. bundle install で追加
3. app/assets/stylesheets下のapplication.cssをapplication.scssに変更
4. application.scssの中身をすべて消して以下を追記

```application.scss
@import "bootstrap";
```
5. app/assets/javascripts/application.jsに以下を追記

```application.js
//= require jquery3
//= require popper
//= require bootstrap-sprockets
```

##ここでエラー
ActionView::Template::Error (undefined not callable)
<%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>

###解決するためにやったこと
https://github.com/twbs/bootstrap-rubygem/issues/157#issuecomment-397637547

**ここのコメントにあるようにGemfileのduktapeを消してnode.jsをinstallしました**

```Gemfile
# 削除
# See https://github.com/rails/execjs#readme for more supported runtimes
gem 'duktape'
```

もともとnode.jsをインストールしていたので、インストールしていなくても動くかもしれません。

#メール送信機能の実装
エラー内容

```
[ActiveJob] [ActionMailer::Parameterized::DeliveryJob]
[c8d10239-8465-4730-988a-2f0e46f67222] 
Error performing ActionMailer::Parameterized::DeliveryJob 
(Job ID: c8d10239-8465-4730-988a-2f0e46f67222) from Async(mailers) in 481.15ms: 
ActionView::Template::Error 
(Missing host to link to! Please provide the :host parameter,
 set default_url_options[:host], or set :only_path to true):
```

https://qiita.com/hirotakasasaki/items/ec2ca5c611ed69b5e85e

この記事を参考にメール送信を実装しようとしたのですが、うまく送れませんでした。
調べたところ、エラーログの通りhostが設定されていないのが原因のようです。

```development.rb
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.default_url_options = 
      { :host => 'localhost:3000' }
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    port:                 587,
    address:              'smtp.gmail.com',
    domain:               'gmail.com',
    user_name:            'gmailのメールアドレス',
    password:             'gmailのパスワード',
    authentication:       'login',
    enable_starttls_auto: true
  }
```
VScode初心者による背景模様替え



#前提

VScode全くの初心者が萌え背景を挿入した時の備忘録


#使用した拡張機能

1.background
[background](https://marketplace.visualstudio.com/items?itemName=shalldie.background)

2.background-cover
[background-cover](https://marketplace.visualstudio.com/items?itemName=manasxx.background-cover)


#Code例

実際に設定したsettings.jsonを以下に記します。
最初背景のカラーを青系に統一して、
後半の文で萌え背景を投入しました


```json
{
    "python.pythonPath": "C:\\Users\\ken\\Anaconda3\\pythonw.exe",
    "terminal.integrated.shell.windows": "C:\\WINDOWS\\System32\\cmd.exe",
    "workbench.colorCustomizations": {
        "editor.background": "#14065083",
        "editor.foreground": "#dadae0",
        "editorGroup.border": "#e8e8f0",
        "editorLineNumber.foreground": "#6e6a6a",
        "editor.selectionBackground": "#1809ec",
        "errorForeground": "#f7f1f1",
        "editorCursor.background":"#333333"
        "editor.wordHighlightBackground":"#3abdce33"
        "editor.lineHighlightBackground":"#3abdce33"

        "input.background": "#08487c",
        "input.foreground":"#e4d7d7"
        "input.border": "#1d1847",
        "input.placeholderForeground": "#e4d7d7",

        "scrollbarSlider.background": "#5c5858",
        "scrollbarSlider.hoverBackground": "#302727",
        "scrollbar.shadow":"#0f044183"
        "scrollbarSlider.activeBackground":"#333333"

        "activityBar.background":"#0f044183",
        "activityBar.foreground": "#56e1fa",
        "activityBar.border": "#352f2f",

        "sideBar.background": "#14065083",
        "sideBar.foreground": "#e4d7d7", 
        "sideBar.border": "#352f2f", 
        "sideBarTitle.foreground": "#a39c9c",

        "editorGroupHeader.tabsBackground": "#14065083",
        "tab.activeBackground": "#14065083",
        "tab.activeForeground": "#e4d7d7",
        "tab.border": "#352f2f", 
        "tab.activeBorder": "#352f2f",
        "tab.inactiveBackground": "#14065083", 
        "tab.inactiveForeground": "#e4d7d7",
    }
        
    
    "backgroundCover.enabled": true , //一時的に非表示したい場合にfalseにする
    "backgroundCover.opacity": 0.3, //デフォの0.5だと薄暗い
    "backgroundCover.randomImageFolder": "C:/Users/"ユーザ名"/Desktop/Pictures/Favorite/",
    
    "background.enabled": true,

    "background.style": {
        "background-position": "100% 100%",
        "background-repeat": "no-repeat"
    },
  
    "background.useDefault": true,
  
    "background.customImages":["C:/Users/"ユーザ名"/Desktop/Pictures/Favorite/Haruhi_s.jpg"] 
    

}
```

#結果

![background_VScode.png](https://qiita-image-store.s3.amazonaws.com/0/208060/ef33dd72-b57e-4f87-29b7-b472823bf839.png)


背景色を濃紺とし、background_coverで背景をハルヒにできました。
しかし、backgroundがデフォルトのままで変わっていません。
設定のExtensionにもうまく表示されていません。

![Extensions_vs.png](https://qiita-image-store.s3.amazonaws.com/0/208060/28d90a0b-bd9a-eed2-0635-4a7655269a54.png)

#今後

VScodeの初期設定はこの辺にしてPythonなど弄っていこうと思います。
NW屋なのでパブリッククラウドにも手を出したいですが。。
fts でファイル階層をたどる

fts を使用したファイル階層のたどり方のメモ。

# サンプル
引数で与えられたディレクトリを走査し、サイズとパス名を出力するサンプルプログラムを作成します。

```cpp:sample.cpp
#include <cstdio>
#include <fts.h>
#include <sys/stat.h>

int main(int argc, char** argv)
{
    if (argc != 2) {
        std::fprintf(stderr, "Usage: %s <dir>\n", argv[0]);
        return -1;
    }

    char* const paths[] = {argv[1], nullptr};

    FTS* fts = fts_open(paths, 0, nullptr);
    if (fts == nullptr) {
        std::fprintf(stderr, "open failed.\n");
        return -1;
    }

    FTSENT* ent = nullptr;
    while ((ent = fts_read(fts)) != nullptr) {
        std::printf("%-5lu %s\n", ent->fts_statp->st_size, ent->fts_path);
    }

    if (fts_close(fts) != 0) {
        std::fprintf(stderr, "close failed.\n");
        return -1;
    }

    return 0;
}
```

再帰的にディレクトリとファイルのサイズ・パスが出力できています。

```bash
$ g++ -std=c++14 sample.cpp -o sample
$ ./sample testdir
4096  testdir
4096  testdir/subdir
114   testdir/subdir/fff.txt
110   testdir/subdir/eee.txt
49    testdir/subdir/ddd.txt
4096  testdir/subdir
64    testdir/bbb.txt
48    testdir/aaa.txt
8     testdir/ccc.txt
4096  testdir
```

# ファイル階層走査順の変更
fts_open に関数ポインタを与えることで、ファイル階層を走査する順序の変更が可能なようです。

```
$ man fts
... 
       FTS *fts_open(char * const *path_argv, int options,
                     int (*compar)(const FTSENT **, const FTSENT **));
... 
       The argument compar() specifies a user-defined function which may be used to order the traversal of the hierarchy.  
       It takes two pointers to pointers to FTSENT structures as arguments and should return a negative value, zero, or a positive value to indicate if the file referenced by its first argument comes before, in any order with respect to, or after, the file referenced by its second argument.
...
```

ということで、サイズが昇順で出力されるように関数ポインタを与えるよう修正し、再度実行します。

``` cpp:sample2.cpp
#include <cstdio>
#include <fts.h>
#include <sys/stat.h>

static int compar(const FTSENT** rhs, const FTSENT** lhs)
{
    const FTSENT* r = *rhs;
    const FTSENT* l = *lhs;

    return (r->fts_statp->st_size - l->fts_statp->st_size);
}

int main(int argc, char** argv)
{
    if (argc != 2) {
        std::fprintf(stderr, "Usage: %s <dir>\n", argv[0]);
        return -1;
    }

    char* const paths[] = {argv[1], nullptr};

    FTS* fts = fts_open(paths, 0, compar);
    if (fts == nullptr) {
        std::fprintf(stderr, "open failed.\n");
        return -1;
    }

    FTSENT* ent = nullptr;
    while ((ent = fts_read(fts)) != nullptr) {
        std::printf("%-5lu %s\n", ent->fts_statp->st_size, ent->fts_path);
    }

    if (fts_close(fts) != 0) {
        std::fprintf(stderr, "close failed.\n");
        return -1;
    }

    return 0;
}
```

ディレクトリ内のファイルが、サイズの小さい順に出力されるようになりました。

```bash
$ g++ -std=c++14 sample2.cpp -o sample2
$ ./sample2 testdir/
4096  testdir/
8     testdir/ccc.txt
48    testdir/aaa.txt
64    testdir/bbb.txt
4096  testdir/subdir
49    testdir/subdir/ddd.txt
110   testdir/subdir/eee.txt
114   testdir/subdir/fff.txt
4096  testdir/subdir
4096  testdir/
```
メディアクエリとは

#メディアクエリ
デバイスにあわせて表示を変える。
2つの方法があって、
・htmlで指定する
・css で指定する
がある。

##htmlで指定すると、
それぞれの条件にあわせて、cssが必要。
![html_mediakueri.png](https://qiita-image-store.s3.amazonaws.com/0/380575/a3fac055-d2e7-9f25-5cb5-4181019f6899.png)


##cssで指定すると、
![css_mediakueri.png](https://qiita-image-store.s3.amazonaws.com/0/380575/e1551a3d-8ea2-c376-7330-e4acb34bd413.png)
python,django。関数でフォームを出力する。

今回は関数。
つまりpythonですと

```
def():
 フォームを作りたいよ～～～。
```

という形でフォームを作る方法を書こうと思います。
下の記事でclassを使った方法はすでに記載しました。
https://qiita.com/sr2460/items/a22770f357d8a24403ab



<br>
<br>
models.py、forms.py、htmlの書き方は上の記事を見てもらうとして、classですとこんな風に書いてフォームを作成していました。

```
class クラス名(CreateView):
    model = Post
    form_class = PostForm
    template_name = "使用したいテンプレート名"
    success_url = "リダイレクトするURL"  
```
<br>
これを関数で書くと、

```
from django.shortcuts import render, redirect

def form(request):
    form = PostForm(request.POST or None)
    if request.method == 'POST' and form.is_valid():
        form.save()
        return redirect(アプリケーション名:リダイレクトしたいurlのname)


    context = {
        'form' :form
    }
return render(request, 'アプリケーション名'/テンプレート名.html', context)
```
<br>
切り取ってみていきましょう。

POSTでurlにアクセスされた場合(フォームは送信された場合)PostFormにrequest(入力内容)が送信されるよ。
POSTじゃない場合はNone(フォーム内は空でhtmlに出力されるよ)というニュアンスです。(なんかうまく説明できない）

```
   form = PostForm(request.POST or None)
```
<br>
もしrequestがPostならバリデーションをして(想定されていない型で送信された場合弾いてくれます)、form.save()で入力内容が保存されます。


```
    if request.method == 'POST' and form.is_valid():
        form.save()
```
<br>
フォームを送信した後に飛ぶurlの設定。

```
return redirect(アプリケーション名:リダイレクトしたいurlのname)
```
<br>
フォームを使用するhtmlをrenderで指定してcontectリストを使ってformの情報をhtmlで使えるようにします。

```
    context = {
        'form' :form
    }
return render(request, 'アプリケーション名'/テンプレート名.html', context)
```
<br>
これで関数部分の話は終わり！


<br>
クラスの場合urls.pyは

```
path('使いたいURL', views.クラス名.asview(),name='使いたい名前'),
```

ですが関数の場合は

```
path('使いたいURL', views.関数名,name='使いたい名前'),
```
という風に書きます。views.クラス名.asview()とviews.関数名という違いがありますね。
今回はこれで終わり。
文字に影をつける！

#text-shadow
#html
![html_shadow.png](https://qiita-image-store.s3.amazonaws.com/0/380575/5a0b2827-0d23-f4cd-368d-c7866aa3cc84.png)

#css
![css_shadow.png](https://qiita-image-store.s3.amazonaws.com/0/380575/65b9181c-0df6-b350-7ee9-c4e5f41d5528.png)

#結果
![result_shadow.png](https://qiita-image-store.s3.amazonaws.com/0/380575/c8f0a35c-54d3-ef26-731b-fce03ee11aa2.png)
上手く使えばかっこよくなるかも。画像をつくらなくてもよくなる。つまり、SEOにつよくなる！:muscle_tone2:
text-transformを学ぶ

#text-transformとは
文を大文字に変える。
・none      :デフォルト
・capitalize:先頭の文字が大文字
・uppercase :すべてが大文字

#html
![html_transform.png](https://qiita-image-store.s3.amazonaws.com/0/380575/ab294631-ca56-9199-d98f-51f5f30d9b5c.png)

#css
![css_transform.png](https://qiita-image-store.s3.amazonaws.com/0/380575/b622fc9b-e971-a149-e8cc-1fd375d492db.png)

#結果
![result_transform.png](https://qiita-image-store.s3.amazonaws.com/0/380575/a7bf85b6-3db0-afb0-88f5-76c312676fe4.png)
海外のサイトでよく見る形やな。
フォルダ名と一致しているファイル名の一部をリネーム

フォルダ名にプロジェクト固有の名詞が入っているが、それらを丸ごとリネームしたい！
===

メーカーの印刷版下だと各メーカーごとにルールは異なるが、プロジェクトや製品名が入っていたり、図面の番号などが入っていることが多い。
また、納品時にはAI/PDF/PNG/TXTをセットで渡すなど、異なる形式のファイルに同じ名詞が入っていたりする。

```フォルダ階層の例.txt
C:.
│  
└─hoge
    │  hoge.1.ai
    │  hoge.2.png
    │  hoge.3.pdf
    │  hoge.txt
    │  
    └─fuga
            fuga.1.ai
            fuga.2.png
            fuga.3.pdf
            fuga.txt
```

このうち、サブフォルダはそのままでhogeフォルダ名とhogeフォルダ内に入っているファイル名だけ変更したい場合のBashスクリプトを作った。

```RenameScript.sh
#!/bin/sh

# 引数なしなら終了
if [ $# -lt 2 ]
then
  echo "引数が不適切です。例) $0 [元の名称] [変更された名称]"

else
  # フォルダリネーム
  mv $1 $2
  cd $2

  # ファイルリネーム
  for f in *$1*
  do
    mv $f ${f/$1/$2}
  done
  cd ../
fi
```

やっていることは単純で、
1. 引数で変更したい名称のbefore/afterを設定
2. フォルダ名をリネーム
3. リネームしたフォルダに移動
4. ファイル名のリネームをfor文で繰り返す
を行っている。


フォルダ階層の例で「hoge」⇒「hage」にしてみる。

```
$ ./RenameScript.sh hoge hage
```
結果はこちら

```フォルダ階層の例.txt
C:.
│  RenameScript.sh
│  
└─hage
    │  hage.1.ai
    │  hage.2.png
    │  hage.3.pdf
    │  hage.txt
    │  
    └─fuga
            fuga.1.ai
            fuga.2.png
            fuga.3.pdf
            fuga.txt
```

#####サブフォルダを検索してリネームしてないけど？
InDesignといったAdobe系ソフトの場合、パッケージという機能でリンク先のファイルを自動収集してまとめてくれる機能がある。
そういったファイルは元のファイルでファイル名を参照しているので、勝手にリネームすると再リンクさせる必要が出てくる。なので、サブフォルダ以降のフォルダは対象外としている。
C++ Builder XE4 > FastReport > 「次のエラーが発生しました: ': 宣言されていない識別子です: 'x' Memo1: 式にエラーがあります 'x」 > [x]を数式として解釈されることによるエラー > 対処

```txt:動作環境
C++ Builder XE4
秀丸エディタ Version 8.79
```

### 試していたこと

FastReportのTfrxMemoViewにテキストを送ろうとしていた。

下記のエラーが発生した。

![2019-03-21_08h59_43.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5923d84b-0719-feb1-c285-7a9734833652.png)

送ろうとしていたテキストは`[x]`を含むもの。

### 数式

FastReportには`[x]`を数式と認識する処理が含まれる。

### 対処

数式と認識する処理を回避する。

1. TfrxReportをダブルクリック => FastReportが開く
2. TfrxMemoViewのプロパティExpresisonDelimitersを`[[[,]]]`のようにする

`[[[`と`]]]`で囲われた部分はエラーになる。通常使う文字列でない定義にすると良い。

### 備考

ExpresisonDelimitersを空白にすると、デフォルトの`[`と`]`が数式として解釈されるため、`[x]`はやはりエラーとなる(はまった）。

### 関連

- Escape [ Square Brackets ] in Fast Report Strings
    - https://stackoverflow.com/questions/12636732/escape-square-brackets-in-fast-report-strings
    - ここに記載のBrackets プロパティはFastReport VCLで見つからず (10.2 Tokyoでも同じ)
- https://www.fast-report.com/en/documentation/frx3user/Creating%20reports/Displaying%20expressions%20with%20the%20help%20of%20the%20%27Text%27%20object.htm
    - ExpresisonDelimitersプロパティの記載あり

### コード

TfrxMemoViewのプロパティ変更のコード例。

OnBeforePrintイベントなどで指定する。

```cpp
if (Sender->Name == L"Memo1") {
    TfrxMemoView *memPtr = (TfrxMemoView *)Sender;
    // 数式解釈のためテキスト文字列に現れないであろうDelimitersにしておく
    memPtr->ExpressionDelimiters = L"[[[[[[[,]]]]]]]"; 
}
```
StretchにおけるLIRCの設定方法に関して(2019/03/21)

殴り書きなので要注意
## 背景
<p>
<a target="_blank"  href="https://www.amazon.co.jp/gp/product/B07BFH96M3/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B07BFH96M3&linkCode=as2&tag=minkmaguro-22&linkId=f71505f69fa22c5646eec4beeafb915e"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B07BFH96M3&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=minkmaguro-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=minkmaguro-22&l=am2&o=9&a=B07BFH96M3" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a target="_blank"  href="https://www.amazon.co.jp/gp/product/B00FR2UAXI/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B00FR2UAXI&linkCode=as2&tag=minkmaguro-22&linkId=1045be89fc7b2d9e0e5073dbf7d75b83"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B00FR2UAXI&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=minkmaguro-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=minkmaguro-22&l=am2&o=9&a=B00FR2UAXI" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
</p>
日立エアコンの赤外線解析して色々したい
→ Arduino UNO (and ESP32) + VS1838B + IRRemoteを使ってで試してみる
→ SRAMが小さくてBufferが足りない
→ 手持ちのRaspberry Pi 2B+で解析してみる
→ 『[LIRCでRPiTPH Monitor/RPZ-IR-Sensorの赤外線制御](http://indoor.lolipop.jp/IndoorCorgiElec/App-LIRC.php)』に従ってLIRCを導入してみる

```terminal
mode2 -d /dev/lirc0
```

###→  イケるやろ!!(謎の自信)
<img src="https://qiita-image-store.s3.amazonaws.com/0/202086/e7c7e5f7-12f6-591c-20ee-55d2942c29b9.png" width="50%" >
(出典:なんでも実況(ジュピター))
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
###→ cannot initiate device /dev/lirc0
###→ チ～ン(笑)
## 環境
- Raspberry Pi 2B+ (SSH接続)
    - Distributor ID: Raspbian
    - Description:    Raspbian GNU/Linux 9.8 (stretch)
    - Release:        9.8
    - Codename:       stretch
- LIRC 0.9.4c-9
- 赤外線受信モジュール VS1838B
- ジャンパワイヤ3本 メスメス

## 改善法
LIRCの設定において

```terminal:/boot/config.txt 
# Uncomment this to enable the lirc-rpi module
dtoverlay=lirc-rpi
dtparam=gpio_in_pin=18
```

とする部分を

```terminal:/boot/config.txt 
# Uncomment this to enable the lirc-rpi module
dtoverlay=gpio-ir, gpio_pin=18
```

と変更する.
おしり.
こんな感じで表示されれば成功です
(ちなみにPWMのところで851行ありました)

```terminal
mode2 -d /dev/lirc0 | tee SwitchCoolerOn27C
Trying device: /dev/lirc0
Using device: /dev/lirc0
Using driver default on device /dev/lirc0
space 16777215
pulse 29693
space 49443
pulse 3302
space 1737
pulse 341
space 1336
pulse 340...
```

## なんでこれで行けたんだろ??
適当にググって出てきたページから手当たり次第試したら出来ました
正直なところ**よくわかってないです**
LibreElecのWikiサイト中の[Infrared Remotes](https://wiki.libreelec.tv/infrared_remotes)のやり方見たら
『Change dtoverlay=lirc-rpi to dtoverlay=gpio-ir in /flash/config.txt to switch to the newer gpio-rc-recv driver which replaces lirc-rpi.』
て書いてあったもんで試したら行けちゃったんですよねー
よく調べれば原因もわかりそうなんですけど
Raspbianにも上の仕様適応されたんですかね...(適当)
ShellScriptでif-else文の否定のみの処理を短く書く

2019/03/21 指摘対応
これでいいみたいです

```sh
#!/usr/bin/env sh
if ! { command1 || command2; }; then
    # commandのExitCode != 0の場合の処理
fi
```

安直に書くとこうなる

```sh
if command1 || command2; then
    : 
else
    # commandのExitCode != 0の場合の処理
fi
```

---
※以下は古い内容

### 結論
```sh
#!/usr/bin/env sh
if command;then :;else
    # commandのExitCode != 0の場合の処理
fi
```

```sh
#!/usr/bin/env sh
if command;then :;else
    # commandのExitCode != 0の場合の処理
fi
```
---
### 経緯
* Shellのif文は終了コードによって分岐する

```sh
#!/usr/bin/env sh
if command;then
    # commandのExitCode == 0の場合の処理
else
    # commandのExitCode != 0の場合の処理
fi
```
---
* testコマンド(`[]`)を使用しない場合、if文のみで否定演算はできない(と思う)
* このため、`終了コード != 0`の場合のみ処理をしたい場合は冗長な書き方になる

```sh
#!/usr/bin/env sh
if command;then
    : # 「:」は何もしないコマンド
else
    # commandのExitCode != 0の場合の処理
fi
```

---
* 短く書きたい場合は以下のようにできそう
* `then`の後ろにホワイトスペースが必要なことに注意

```sh
#!/usr/bin/env sh
if command;then :;else
    # commandのExitCode != 0の場合の処理
fi
```

---
* 具体的には、OR条件で必要なコマンドが全て存在しない場合の条件分岐をしたかった

```sh
#!/usr/bin/env sh
if type curl &>/dev/null || type wget &>/dev/null;then :;else
    echo "required: curl or wget"
    exit 1
fi
```
[Rails5] deviseの日本語化について（devise.ja.ymlを入れても効かないとき）

# 問題

最近またオリジナルアプリを開発し始めた。

deviseでセッションまわりを実装していると
エラーメッセージが英語なのが気になったので、
日本語に治そうとdevise.ja.ymlを作成したが
うまく適用されない。


# 理由は単純

deviseのエラーメッセージを表示するためのテンプレート
views/devise/shared/error_messages.html.erbを見てみると、

```ruby:views/devise/shared/error_messages.html.erb
    <%= I18n.t("errors.messages.not_saved",
                count: resource.errors.count,
                resource: resource.class.model_name.human.downcase)
    %>
```

とある。

I18nのtranslateというメソッド（ここではt）を使っていることがわかるので、
<b>I18nを導入していなければならない。</b>


# 解決策

rails newをしただけでは<b>Gemfileに標準でi18nのgemが入っていない</b>ので、
インストールして設定する必要がある。
<br>
<b>1. 以下をGemfileに追記し、bundle installする</b>
Railsが5.0系バージョンのとき
`gem 'rails-i18n', '~> 5.1'`

Railsが4.0系バージョンのとき
`gem 'rails-i18n', '~> 4.0'`
<br>

<b>2. config/application.rb に以下を追加する。</b>

`config.i18n.default_locale = :ja`

私はこれだけで十分でしたが、以下も追加する必要があるらしい。

`config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]`

Rails.rootにconfig/localesディレクトリ配下のrbファイルもしくはymlファイルを登録し、
i18nで読み込むように設定するってことかな。。
<br>


```ruby:
module アプリ名
  class Application < Rails::Application
    config.i18n.default_locale = :ja
    # 以下必要に応じて
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
  end
end
```

<br>

これで解決〜
リスト内包表記でif文を先に書くか後に書くかの違い

[AtCoder](https://atcoder.jp "AtCoder")でコーディングの練習をしています。みなさんも一緒に精進しましょう。

さて, Pythonのリスト内包表記を使ってリストを新規作成したいとき，if文を噛ませることによって条件に応じてリストに追加する値に変化をつけることができます。

ただしif文の噛ませ方には主に2つの方法があり, 少し挙動が異なるため, その違いについて知っておく必要があります。


##0. 通常のリスト内包表記

```Python3
# 1の2乗から5の2乗まで順番に格納したリストをつくりたい

# 普通の書き方
mylist = [] 
for i in range(5):
    mylist.append(i**2) #[1, 4, 9, 16, 25]

# リスト内包表記
mylist = [ i**2 for i in range(5) ] #[1, 4, 9, 16, 25]
```

##1. リスト内包表記とifの併用

```Python3
# 1の2乗から5の2乗までのうち, 10より大きいものだけを順番に格納したリストをつくりたい

# 普通の書き方
mylist = [] 
for i in range(5):
    if i**2 > 10:
        mylist.append(i**2) #[16, 25]

# リスト内包表記
'''
    """for文の後ろに"""if文を書く
    リスト内包表記そのものに備わっている機能
    条件式が True となる i についてのみ要素が追加される
    それ以外の i については要素は追加されない
'''
mylist = [ i**2 for i in range(5) if i**2 > 10 ] #[16, 25]
```


##2. リスト内包表記とif-elseの併用
```Python3
# 1の2乗から5の2乗までを順番に格納したリストをつくりたい
# ただし, 10より大きいものはそのまま格納し, 10より小さいものは-1に変えて格納したい


# 普通の書き方
mylist = [] 
for i in range(5):
    if i**2 > 10:
        mylist.append(i**2)
    else:
        mylist.append(-1) #[-1, -1, -1, 16, 25]


# リスト内包表記
'''
    """for文の前に"""if-elseを記載する
    if-elseを1行で記載できる機能
        ((真の場合の値) if (条件式) else (偽の場合の値))
    を利用したもの
'''
mylist = [ i**2 if i**2 > 10 else -1 for i in range(5) ]   #[-1, -1, -1, 16, 25]
```



##3. エラーとなる場合
```Python3
# if-elseを"""for文の後ろ"""に置くとエラー
mylist = [ i**2 for i in range(5) if i**2 > 10 else -1]
  File "<string>", line 1
    mylist = [ i**2 for i in range(5) if i**2 > 10 else -1]
                                                      ^
SyntaxError: invalid syntax


# elseなしのif文を"""for文の前"""に置くとエラー
mylist = [ i**2 if i**2 > 10 for i in range(5) ]
  File "<string>", line 1
    mylist = [ i**2 if i**2 > 10 for i in range(5) ]
                                   ^
SyntaxError: invalid syntax

```
JRuby のオプションメモ（debug.parser）

jrubyの下記オプションを設定するとTomcat9で起動時エラーが発生する。というメモ。

```
# disables JRuby impl script loads and prints parse exceptions
# Options: [true, false], Default: false.

debug.parser=true
```

```
org.jruby.rack.RackInitializationException: java.lang.NullPointerException
	at org.jruby.rack.RackInitializationException.wrap(RackInitializationException.java:31)
	at org.jruby.rack.RackApplicationFactoryDecorator.init(RackApplicationFactoryDecorator.java:104)
	at org.jruby.rack.RackServletContextListener.contextInitialized(RackServletContextListener.java:50)
```

全然デバッグ用オプションじゃないっていうね。
ML-Kit For Firebase でTensorFlow Lite使用リアルタイムオブジェクト認識サンプルを動かす

# 概要
ML-Kit For Firebase のTensorFlow Lite使用のサンプルです
「ML-Kit For Firebase でTensorFlow Lite使用サンプルを動かす」で扱ったサンプルアプリは
Sampleとなる画像しか認識処理をためせませんでしたが、こちらのサンプルは、実際にスマホで撮影している画像に対しリアルタイムで認識処理ができるため、こちらも手順をまとめておくことにしました。

実行環境は以下のとおり
Windows10 Pro
Android Studio Version3.2.2
AndroidアプリVersion9.0

# サンプルアプリ動作手順

**１．開発環境準備**
Android Studio未導入の場合は以下URLからダウンロードしインストール
https://developer.android.com/studio/?hl=ja

**２．サンプルアプリを取得**
ML-Kitサンプルアプリを用意
以下URLから「Clone or Download」をクリックし「quickstart-android.zip」をダウンロード
https://github.com/firebase/quickstart-android

上記を解凍すると「quickstart-android-master」フォルダができるので、任意の場所に配置

Android Studioから「File>Open」で上記で配置した「quickstart-android-master」フォルダ配下の「mlkit」フォルダをプロジェクトとして選択

**３．Firebase登録**
ML-Kitを使用するには「google-services.json」ファイルをプロジェクトに設定する必要があるため
以下のURLからFirebaseの登録を実施し、Jsonファイルを生成、プロジェクトに配置する必要あり
※Googleアカウント登録の必要あり

以下でプロジェクトを生成

・プロジェクトの追加
以下情報を設定
プロジェクト名：任意の名称
アナリティクスの地域：日本
「次へ」ボタンを押下

・AndroidアプリにFirebaseを追加
Androidパッケージ名に「com.google.firebase.codelab.mlkit」を設定し「アプリを登録」ボタンを押下
「google-services.json」ボタンを押下しJSONファイルをダウンロード

上記で生成したJSON「google-services.json」をプロジェクトの「app」フォルダ配下に配置

**４．サンプルアプリを実行**
「Android Studio」から「Run」>「Run’app’」を押下しアプリを実行

アプリが立ち上がったら
「Java」カテゴリの「OPEN」を選択
「LivePreviewActivity」を選択
「Classification(quantized)」または「Classification(quantized)」を選択
画像のオブジェクトの種類と認識確度が高いもの上位3つが表示

![rtDetectImg.png](https://qiita-image-store.s3.amazonaws.com/0/172093/19721f3a-054a-4d2f-9d6d-0b33d0262270.png)
GoMintサーバーをセットアップする

# はじめに

　試しに作ってみたGoMintのプラグインをいざ実行してみようとサーバーを建てたらかなりハマったので、簡単に方法をまとめてみました。


#TL;DR

* Jenkinsがダウンしているので自分でビルド
* 環境をそろえるのが大変
* 初心者にはちょっと厳しい


# 環境

* Windows 10 Home
* JDK 11(11.0.2)
* GoMint 1.0.0-SNAPSHOT


# セットアップ

　現在Jenkinsのサーバーが502でダウンしているので、諦めて自分でビルドしましょう。


## 大まかな手順

1. [GitHub](https://github.com/GoMint/GoMint)からソースコードをクローンまたはダウンロード
1. `mvn clean install` でビルド


## つまづきポイント

* GoMintをビルドするためにはJDK11以上が必要
* 執筆時(2019/3/21)でMavenリポジトリのSSLサーバー証明書が切れているのでpom.xmlの編集が必要


## ビルド

### 前提

　JDK11は[こちら](https://qiita.com/ko2a/items/69fa8a5366d7449500ca)の手順に従ってインストールしてください。
　ビルドする際はMavenも必要になります。[こちら](https://qiita.com/tarosa0001/items/e5667cfa857529900216)の手順に従ってインストールしてください。


### ビルド手順

　まず、適当なディレクトリにソースコードをクローンします。SSLサーバー証明書の期限が切れていた場合はクローンされたフォルダを開いたところにあるpom.xmlを以下のように変更します。

``` xml
    <repositories>
        <repository>
            <id>gomint-repo</id>
            <name>GoMint Public Repository</name>
            <!-- ↓ここ -->
            <url>https://repo.gomint.io/content/groups/public/</url>
        </repository>
    </repositories>

    <distributionManagement>
        <repository>
            <id>gomint-releases</id>
            <!-- ↓ここ -->
            <url>https://repo.gomint.io/content/repositories/releases/</url>
        </repository>
        <snapshotRepository>
            <id>gomint-snapshots</id>
            <!-- ↓ここ -->
            <url>https://repo.gomint.io/content/repositories/snapshots/</url>
        </snapshotRepository>
    </distributionManagement>
```

　を

``` xml
    <repositories>
        <repository>
            <id>gomint-repo</id>
            <name>GoMint Public Repository</name>
            <url>http://repo.gomint.io/content/groups/public/</url>
        </repository>
    </repositories>

    <distributionManagement>
        <repository>
            <id>gomint-releases</id>
            <url>http://repo.gomint.io/content/repositories/releases/</url>
        </repository>
        <snapshotRepository>
            <id>gomint-snapshots</id>
            <url>http://repo.gomint.io/content/repositories/snapshots/</url>
        </snapshotRepository>
    </distributionManagement>
```

　という風に、該当の部分のURIスキームをhttps://からhttp://に変えてください。

　次に、pom.xmlがあるディレクトリでコマンドプロンプトから`mvn clean install` を実行してビルドを開始してください。完了までに数分かかるかもしれないので気長に待ちます。

　ビルドが完了したら、pom.xmlがあるディレクトリからgomint-server/targetに移り、そこにあるGoMint.jarをわかりやすいディレクトリに移動させましょう。移動先と同じディレクトリにstart.cmdを作成し、中身を

``` cmd
java -jar GoMint.jar
```

と書けば一通り終了です。お疲れさまでした。


# 起動

　start.cmdを叩いてあげればGoMintが起動します。


# さいごに

　GoMintは今までのサーバーソフトより質が高く、プラグインもかなり楽に書けるのでとてもおすすめです。僕もプラグインをちょくちょく配布していくので、興味がある方はプラグインをのぞいてみたりサーバーを建ててみたりしてみてはいかがでしょうか。


# スペシャルサンクス

### WhiteGrouseさん

　夜遅くまで丁寧にわかりやすくご指導していただきありがとうございます！　めちゃくちゃ助かりました！
【勝手に毎日投稿祭り】これは覚えとこう!rootのパスワードを忘れても解決策はあります！   

※1週間限定で、「勝手に毎日投稿祭り」と題して毎日投稿しています。
ぜひぜひ、皆さんも便乗して下さい。

##rootのパスワードを忘れてしまったことありませんか？
![1402550.jpg](https://qiita-image-store.s3.amazonaws.com/0/235933/6ce93f12-1e26-9ddc-9f4a-5ad9be3cb785.jpeg)

業務では、パスワードを資料にまとめて管理していると思いますので、なかなかこういったことが起こることは、ありませんが、テスト用に一台キッティングしてほしいとか言われて管理台帳に載せていないもので、その後忘れてしまったとか、自学自習で使っていた仮想サーバを久しぶりに使ってみたら忘れてた等々。

パスワードを忘れてしまったら、再インストールするしかないのか……
###否！解決策はあります。

答えは、シングルユーザモードを使用して、パスワードの変更をするのです。
※VMWareでCentOS7を使用した例で行っています。
手順は、以下のようにします。

１．起動時に```Esc```か```Tab```キーを押下し、以下の画面を表示させる。

[![Image from Gyazo](https://i.gyazo.com/5b5254d22d600d5ef4f074651b14a80a.png)](https://gyazo.com/5b5254d22d600d5ef4f074651b14a80a)

２．普段使っているカーネルを方向キーで選択し、```e```キーで編集モードに入る。
※下記のような画面が出ます。
[![Image from Gyazo](https://i.gyazo.com/18ca0f7b7539f4659b94ca9cd7c781d5.png)](https://gyazo.com/18ca0f7b7539f4659b94ca9cd7c781d5)

３．下にスライドしていき、linux16の箇所の```rhgb```と```LANG=ja_JP.UTF-8```を削除し、```rw init=/bin/sh```を加えて、Ctrl-xを押下して起動する。

[![Image from Gyazo](https://i.gyazo.com/10fbfe817c9b31e19be36e293062e386.png)](https://gyazo.com/10fbfe817c9b31e19be36e293062e386)

ちなみに物理サーバでは、以下のように、quistの後に"single"とか"1"とか末尾に入れるだけの単純な設定でできる場合もある。
![DSC_0414.JPG](https://qiita-image-store.s3.amazonaws.com/0/235933/52237cc8-074d-35b2-1f99-8120304cdd41.jpeg)


４．下記のような画面が表示されるので、```passwd```コマンドで、新しいパスワードを設定すれば完了。
[![Image from Gyazo](https://i.gyazo.com/ed033aaa9bdecb6459cb1d0d5b6978a2.png)](https://gyazo.com/ed033aaa9bdecb6459cb1d0d5b6978a2)

[![Image from Gyazo](https://i.gyazo.com/f8223e644e7b5c6863909b64929c2cab.png)](https://gyazo.com/f8223e644e7b5c6863909b64929c2cab)

以上。
とあるエンジニアの問題意識 2019-03-20



# 心から嫌いな物事を、もっと嫌いだと、自己認識しておきたい。

たとえば、Macでアプリケーションのウィンドウを切り替えて、眼が泳ぎ、意識のコストを支払っている瞬間とか。たとえばスターバックスカードの裏のベタベタを剥がして、わずらわされている瞬間とか。たとえばプログラミングで、わからない物事を前にして、呼吸を止めている、頭が雑然とした瞬間とか。自分が思うよりも、想像以上に、自分が、苦手で、嫌いなことがらが、たくさんある。認識さえすれば、対処できる。静けさのある呼吸に、何度でも戻り、戦争から平和へと、そうだ。

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/837








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Tree構造を表現したクラス

# お題
+ ["親id","子id","孫id","ひ孫id",...] という可変長のidの組み合わせが複数インプットされる。
+ 親のidに子のidが結びつくようにする。同じ親idの子が複数あれば、子は同じ親に結びつくようにする。

例えば、入力が、 [1,2,3] [1,4] [5,6] [1,2,7] である場合、以下のツリー構造となるように。

```
1--2--3
 |  `-7
 `-4
5--6
```

#解答例
https://github.com/tsuyuzaki/cpp/tree/master/tree

```CNode.h
class CNode {
public:
    /**
     * 指定された id の Node を作る。
     */
    CNode(
        const char *id);

    virtual ~CNode();

    /**
     * Node の id を返す。
     */
    ::std::string getID();

    /**
     * 指定した childID の子Nodeが存在しなければ、子Nodeを作成し子Nodeを返す。
     * 指定した childID の子Nodeが存在していれば、既に存在する子Nodeを返す。
     */
    CNode *createChildIfNotExist(
        const char *childID);

    /**
     * 子Node の一覧を返す。
     */
    const ::std::vector<CNode *> &getChildren();

private:
    ::std::string fID;
    ::std::vector<CNode *> fChildren;
};
```

```main.cpp
    CNode *root = new CNode("root");
    for (int i = 0; i < kNumOfIDs; i++) {
        ::std::vector< ::std::string > ids = split(kIDs[i]); // idsの要素はid "1" とか "2" とか。
        CNode *cur = root;
        for (::std::vector< ::std::string >::const_iterator itr = ids.begin(); itr != ids.end(); itr++) {
            cur = cur->createChildIfNotExist(itr->c_str());
        }
    }
```

入力と結果

```入力
static const char *const kIDs[] = 
{"4,3,6"
,"2,7"
,"0,1"
,"2,5"
,"0,8"
};
```

```結果
 $ ./a.out 
 root
   4
      3
         6
   2
      7
      5
   0
      1
      8
```
Firebaseへのdeployで"An unexpected error has occurred."と弾かれた時の対処法

2時間近くハマって解決したので喜びのあまり投稿します。:smile: ただ自分の場合、レアな原因だったと思うのでどこまで役に立つか……。

#FIREBASE-DEBUG.LOGを読もう
流石に表題のエラー表示だけでは曖昧すぎます。しかしエラーと同時にFIREBASE-DEBUG.LOGが同じ階層に生成されているはずなので読んでみましょう。

#Error: write EIO
今回ログに”Error: write EIO"という気になる一文が混じっており調べた所、WindowsのコマンドプロンプトでUnicode対応のため文字コード変更してる時に起きるエラーだとか。……というわけで文字コード戻してdeployしたら成功しました:muscle: 
Electronのメインプロセスのデバッグで日本語が文字化けして不便だったので、起動ショートカットに文字コード変更オプション(chcp 65001)を突っ込んでたんですが、見事に徒となりましたね:sweat_smile:

#参考
[Why this error happend? nodejs Error: write EIO](https://stackoverflow.com/questions/17035399/why-this-error-happend-nodejs-error-write-eio)
Windowsショートカットによる ショートカットキー登録を削除する

Windowsではショートカットのプロパティからショートカットキーを登録する事ができるが、一括で管理する仕組みは無い模様。
Kindleアプリに`Ctrl + Alt + K`が登録されていたが、犯人のショートカットファイルを特定できず手間取ったので、方法を書き残しておく。

# はじめに
ショートカットファイルによるショートカットキーの登録には以下の特徴がある模様。

- あくまで`ショートカットキー`->`ショートカット`->`実行ファイル`といった起動方法
- なのでどこかのパスが切れると動作しない（ショートカットを移動する等）
- 登録時のパスからショートカットを除去した後、元に戻してもショートカットキー登録は復旧しない
- 登録には管理者権限が必要

以上の振舞いを使って、犯人が特定できないショートカット登録を殺す。
スタートメニュー（名前を指定して実行`shell:programs`及び`shell:common programs`）を確認しても犯人が分からない際に、以下の手順を実行の事。

# 1. 起動対象のファイルパスを変更
ショートカットキーで立ち上がってくるアプリの実行ファイルのファイルパスを変更して、ショートカットファイルからのリンクを切断する。

- `C:\Program Files\`や`%LocalAppData%`などを探す
- スタートメニューに登録されているなら、そこから追跡する
- ディレクトリの名前を変更するか、一度ゴミ箱送りにする


# 2. リンクの切れたショートカットを実行＆削除
ショートカットキーを押下して、リンクの切断されたショートカットを実行する。
リンクの切れたショートカットを起動すると、そのショートカットを削除するか聞いてくる動作になっているので、「はい」で削除する。

# 3. 変更したファイルパスを復旧
手順1で変更したファイルパスを元に戻す。
Microsoft Flowをコードに組み込む

# TL;DR
Microsoft FlowのトリガをHTTPリクエストに設定すると、AWS LambdaみたいなFaaSっぽい使い方ができる。~~(戻り値を使うとかはできないけど・・・)~~  2019/3/30追記: 戻り値を使うパターンは[応答]アクションを使えば実現できるそうです。r-wakatsukiさん、ありがとうございます！  
また、デフォルトで登録されていない、任意のサービスに対応することができる。
# Microsoft Flowって？
ノードベースプログラミングで簡単に操作のフローを自動化できる。
Slackやメール、Twitter等のアプリと連携が可能。
フリープランが存在し、月ごと750回まで実行可能 (2019/3/21現在)
https://japan.flow.microsoft.com/ja-jp/pricing

# 簡単な例 ( Hello World )
1. トリガに`[HTTP要求の受信時]`を設定します。
2. トリガに好きなフローを繋げる。ここではSlackにHello Worldを投稿させます。
![スクリーンショット (24).png](https://qiita-image-store.s3.amazonaws.com/0/275289/bf9d7c7f-18ca-cdbc-e783-a2f941a34644.png)
3. 生成されたURLにHTTPリクエストします。メソッドはデフォルトでPOSTです。powershellだと以下のようなコードで発火できます。

```powershell:helloworld.ps1
Invoke-RestMethod -Uri "https://prod-27.japaneast.logic.azure.com:443/XXXXXXXXXXXXXXXXXXXXXX" -Method POST
```

# 引数を渡す例 ( Slackに任意の内容を投稿 )
トリガに`[HTTP要求の受信時]`を設定する際、JSONスキーマを指定すると、受け取ったJSONのデータをフロー内で扱うことができます。(ペイロードをアップロードすると、自動でスキーマ生成してくれます。)

1. 以下の`sample_payload.json`から`[HTTP要求の受信時]`にスキーマを生成します。
2. Slackのチャネル名で`[カスタム値の入力]`を選択し、`channel`を選択します。メッセージテキストも同様にし、`message`を選択します。
![スクリーンショット (25).png](https://qiita-image-store.s3.amazonaws.com/0/275289/b68fb5e0-a638-fbbe-c36b-c2db5267eedb.png)

3. 生成されたURLにHTTPリクエストします。powershellだと`helloworld2.ps1`のようなコードで発火できます。今度はrandomにhello worldを投稿します。


```json:sample_payload.json
{
	"channel":"general",
	"message":"hello world"
}
```

```powershell:helloworld2.ps1
Invoke-RestMethod -Uri "https://prod-27.japaneast.logic.azure.com:443/XXXXXXXXXX" -Method POST -Body ( @{"channel"="random";"message"="hello world"} | ConvertTo-Json) -ContentType 'application/json'
```

# サービス連携 ( GitHub : forced push通知 )
Microsoft Flowはアプリケーション連携が豊富で便利だけど、GitHubにforced pushされたとき用のトリガは存在しないので、自分で作っていくしかありません。

1. github webhookのサンプルペイロード( https://gist.github.com/gjtorikian/5171861 )から`[HTTP要求の受信時]`にスキーマを生成します
2. 条件フローを作成し、`[forced]`が`true`に等しいとき、という設定にします。
3. `[はいの場合]`にSlackを繋げてメッセージの投稿を設定します。
![スクリーンショット (26).png](https://qiita-image-store.s3.amazonaws.com/0/275289/4064d93a-3f21-8657-b950-9d7171e0b7f4.png)
4. 最後に、GitHubのWebhookに`[HTTP要求の受信時]`から生成されたURLを設定します。

これでforced pushされたときに、Slackに通知が飛びます。