OmniAICreator/Qiita-1.07M huggingface dataset:
【FileMaker】既存のウィンドウは一つだけ表示したい、をもっと簡単に

[前回](https://qiita.com/tyuma/items/e1b6ffe33c1d1bae7053)は、FileMakerファイルの中で開いているウィンドウを検索して、既存ウィンドウの表示をコントロールしましたが、もっと簡単な方法が、今回の記事になります。

```
エラー処理 [ オン ]
変数を設定 [ $windowname ; 値: GetValue ( Get(スクリプト引数) ; 1 ) ] 
変数を設定 [ $windowlayout ; 値: GetValue ( Get(スクリプト引数) ; 2 ) ] 
ウインドウを選択 [ 名前: $windowname ; 現在のファイル ] 
If [ Get(最終エラー) = 112 or Get(レイアウト名) ≠ $windowlayout] 
	新規ウインドウ [ スタイル: ドキュメント ; 名前: $windowname ; 使用するレイアウト: $windowlayout ] 
End If
```

前回と違うところは、全てのウィンドウ情報を取得していないというところになります。

エラーを覚悟でウィンドウを選択してみたら、なかった（エラーが112で返ってきた）ので、新規ウィンドウで開いたよ、ということになります。

スッキリ書くなら今回のスクリプトでしょうか。
他にも書き方があるかもしれませんが、今回は簡単実装でお届けしましたー！

# 追記
指定されたウィンドウは開いていたけれど、レイアウトが違かった、、、ということもあるので、If文にレイアウトのチェックを入れました。
この現象が起こる原因は、新規ウィンドウを開いた時に、ウィンドウ名を新たに付け直していない、ということが挙げられます。
新規ウィンドウを開く際のウィンドウ名の設定、もしくは、後付けで「ウィンドウタイトルの設定」はセットで行うと、間違いがなくなると思います。
GPSカー　シュミレータ その10

#概要

GPSで自動走行する、コンテストがある。GPS・QZSSロボットカーコンテスト2018
実機を借りて、アプリから操作する部門がある。
実機は無いので、シュミレータを作ってみた。
raspberry piで、作って見た。
操作するandroidアプリを改良してみた。

#写真
改良前　161秒

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/5fc28bf3-0b7e-2ff1-bba2-37bb17f46c42.png)

改良後　140秒

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/c1fda204-ea06-4373-8833-4297fdba7d4a.png)


以上。
PhotoshopのJpeg品質とファイルサイズにご注意。Web向けなら50以下で十分説

PhotoshopからWeb用にJpegファイルを無造作に出力すると、**サイズが大きくなりすぎ表示が遅くなる一因になるので注意しましょう**という話です。

科学的に(SSIMで)画質を評価すると、**50以下でもよさそうだ**という結果がでました。

ただ、いろいろなデータを逆にヒューリスティックに見比べるということは出来ていないので、**「こういうケースもあるので50以下はさすがに厳しい」**といった反論もお待ちしています。

# PhotoshopのJpeg品質は45〜50でも十分？

多くのデザイナーさんは**80前後**を指定するのではないでしょうか？

まわりの数名に聞いたらそういう回答でしたし、自分もたまにしか使いませんが**「90は高すぎだけど、60まで下げるのは不安…」**という感覚でいました。

しかし先日、[Jpegエンコーダの画質とファイルサイズについて記事](https://qiita.com/miyanaga/items/edd874c7a0c3d964ea48)を書いたときに、**PhotoshopのJpeg品質がImageMagickなどのJpeg品質とずいぶん尺度が違う**ことに気づきました。

以下の写真画像をJpegを保存するときの品質とファイルサイズのグラフです。緑の線がPhotoshopです。**Photoshopは他のエンコーダに比べて2倍程度ファイルサイズが大きく推移**しています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/35178/ba4b614e-9493-6220-63db-6857a0ce80ed.png" width="240">

<img width="862" alt="Jpeg_Webpエンコーダ比較_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.amazonaws.com/0/35178/2cd62de9-2ab7-ae45-4b3d-a08255c7b132.png">

[Photoshopは品質50までサブサンプリング`4:2:0`、51から`4:4:4`になる](https://qiita.com/miyanaga/items/ef82e000dd7ef5cf26a0)という、まさにデザイナー向けの画質優先エンコーダなのですが、それを加味してもファイルサイズが大きい。

では画質はどうかというと、これも**Photoshop(緑の系列)は同じ品質に対して総じて高いSSIM**が出ます。

<img width="859" alt="Jpeg_Webpエンコーダ比較_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.amazonaws.com/0/35178/be868b55-14c7-d041-caed-5fd91ccf62d9.png">

## ImageMagickの品質85による画質はPhotoshopの品質45くらい

[Googleの表示高速化ガイドはJpegの品質は85で十分](https://developers.google.com/speed/docs/insights/OptimizeImages)としています。

これが代表的なImageMagickを指しているとすると、SSIM換算で品質を逆算したらPhotoshopでは45くらいになります。

![貼り付けた画像_2018_11_07_9_00.png](https://qiita-image-store.s3.amazonaws.com/0/35178/80c4eb1b-fe54-d2e9-3019-824a8bdff776.png)

# PhotoshopとImageMagickの品質対応表の例

もう少し細かく**Photoshopの品質とImageMagickの対応表**を作ってみます。SSIMの範囲を区切って、該当するサンプルの平均を出したものです。

**あくまで特定の写真1枚におけるデータに基づくデータです。法則を示すものではありません。**

|SSIM >|SSIM <=|Photoshop|サンプル数|ImageMagick|サンプル数|
|---:|---:|---:|---:|---:|---:|
|0.995|1.000|98.50|4|99.0|3|
|0.990|0.995|92.00|9|96.5|2|
|0.985|0.990|83.50|8|94.5|2|
|0.980|0.985|76.50|6|92.0|3|
|0.975|0.980|70.00|7|90.0|1|
|0.970|0.975|64.00|5|-|0|
|0.965|0.970|57.00|9|-|0|
|0.960|0.965|51.50|2|-|0|
|0.955|0.960|-|0|-|0|
|0.950|0.955|**49.50**|2|**89.0**|1|
|0.945|0.950|46.50|4|87.0|3|
|0.940|0.945|**41.50**|6|**84.0**|3|
|0.935|0.940|36.00|5|80.5|4|
|0.930|0.935|30.50|6|76.0|5|
|0.925|0.930|25.00|5|70.5|6|
|0.920|0.925|21.00|3|64.0|7|
|0.915|0.920|-|0|56.0|9|
|0.910|0.915|-|0|47.5|8|
|0.905|0.910|14.50|10|40.5|6|
|0.900|0.905|8.50|2|34.5|6|
|0.895|0.900|6.50|2|29.5|4|
|0.890|0.895|4.00|3|25.5|4|
|0.885|0.890|1.50|2|22.5|2|
|0.880|0.885|-|0|20.5|2|
|0.875|0.880|-|0|18.0|3|
|0.870|0.875|-|0|16.0|1|
|0.865|0.870|-|0|15.0|1|
|0.860|0.865|-|0|13.5|2|
|0.855|0.860|-|0|12.0|1|
|0.850|0.855|-|0|11.0|1|

諸説ありますが、SSIMは0.95までオリジナルとの区別が付きにくいと言われています。

SSIM`0.945〜0.950`に対しては、ImageMagick品質は`87`が該当します。Photoshopでは`46.5`です。

# まとめ

公開用のJpeg画像を品質50以下で出力するのはなかなか勇気が要りそうです。

また、出力した後にサムネイルなど自動リサイズが控えている場合はここまで品質とファイルサイズを攻める必要はないと思います。

PhotoshopからのJpeg出力でファイルサイズと品質を見直し、表示高速化に繋がるネタになれば幸いです。
Xamarin.FormsでiOS端末のBluetoothやイヤホンジャックの接続/切断を検知する方法

iOS端末（iPhone/iPad）の内蔵スピーカーと、Bluetoothやイヤホンジャックで接続されたスピーカーとの出しわけに悩んだのメモっときます。

# 解決したかったこと
- Bluetooth接続やイヤホンジャック接続（今更かよって感じですが）の接続を切ったとき、何故か通話用のスピーカーから音が出てしまう
- 外部のスピーカー接続がない場合は、内蔵スピーカーから出すようにしたかった

## 環境とか
- Visual Studio 2017 (15.8.9)
- Xamarin.Forms v3.3.0

# 解決策
`NSNotificationCenter`を使って検知できました。
記載場所は`AppDelegate.cs`の`FinishedLaunching`でもOK。

```cs
// Bluetoothを使う場合は AVAudioSessionCategoryOptions.AllowBluetooth が必須
AVAudioSession.SharedInstance().SetCategory(AVAudioSessionCategory.PlayAndRecord, AVAudioSessionCategoryOptions.AllowBluetooth);
AVAudioSession.SharedInstance().SetActive(true);

// 音声入出力のルート変更を検知する場合は、AVAudioSession.RouteChangeNotification を指定
NSNotificationCenter.DefaultCenter.AddObserver(AVAudioSession.RouteChangeNotification, (notification) =>
{
    // ルート変更理由の取得と判定
    if (notification.UserInfo["AVAudioSessionRouteChangeReasonKey"] is NSNumber key)
    {
        var error = new NSError();
        switch (key.Int32Value)
        {
            // 新しくデバイス（Bluetoothやイヤホンジャック）が接続された場合
            case (int)AVAudioSessionRouteChangeReason.NewDeviceAvailable:
                // 出力先を既定にする
                AVAudioSession.SharedInstance().OverrideOutputAudioPort(AVAudioSessionPortOverride.None, out error);
                AVAudioSession.SharedInstance().SetActive(true);
                break;
            // デバイスが使えなくなった場合（Bluetoothの切断やイヤホンジャックを抜いた場合）
            case (int)AVAudioSessionRouteChangeReason.OldDeviceUnavailable:
                // 出力先を内蔵スピーカーに強制する
                AVAudioSession.SharedInstance().OverrideOutputAudioPort(AVAudioSessionPortOverride.Speaker, out error);
                AVAudioSession.SharedInstance().SetActive(true);
                break;
        }
    }
});
```
Sencha Community Edition のライセンス

今日(2018/11/07) に Sencha が発表した、[Community Edition ライセンス](https://www.sencha.com/blog/announcing-sencha-ext-community-edition/) 。個人開発者に朗報だと思いますが、その内容が気になって、Sencha Community Edition のライセンス条項を読んでみました。

Community Edition に関する部分は、[ライセンス条項](https://www.sencha.com/legal/sencha-software-license-agreement/)の 

> 8. ADDITIONAL LICENSE TERMS APPLICABLE TO THE COMMUNITY EDITION

に書かれています。

事細かく書かれているので、詳しくは原文を当たって欲しいのですが、簡単に言うと次のような条件になるようです。

----

- Community Editionには、Sencha Ext JSに含まれるすべてのソフトウェアパッケージは含まれていません。
  - Ext JS Classic、Ext JS Charts、および多くのExt JSフォントとテーマは含まれていません。
- Community Editionライセンスは、累積年間収益（非営利団体、政府機関または個人開発者の場合）または寄付金（非営利団体の場合）がUSD $10,000 を超えない場合にのみ適用されます。
  - 個人の開発者の場合、あなたが1年間に行ったすべての契約作業の収益は、（Community Editionがすべてのプロジェクトに使用されているかどうかにかかわらず）しきい値を超えてはなりません。

----

Classic ツールキットは使えないということなので、利用できるのは Modern ツールキットのみ。Chart も使えませんよ、ということですね。

あと、収益が 1万ドル以下という条項は、Ext JS で作ったプロジェクトに限らず、すべての売上の合計が1万ドル以下ということだそうです。それで飯を食っている開発者は、対象から外れてしまいますね。

~~Community Edition を手に入れるにはどうしたらいいのですかね。次のページあたりがそれになるのかな？~~

~~https://www.sencha.com/products/extjs/evaluate/opentooling/~~

【追記】 ちゃんと本文中にリンクがありましたね。次のページからダウンロードできます

https://www.sencha.com/products/extjs/communityedition/

僕はライセンス持っているので、申し込もうとは思わないので、だれかチャレンジして入手できたら入手方法とか教えてください。

### 参照

- [Community Edition ライセンスの発表](https://www.sencha.com/blog/announcing-sencha-ext-community-edition/) 
- [ライセンス条項](https://www.sencha.com/legal/sencha-software-license-agreement/)

日本語版の公式記事も発表されました。

- [Sencha Ext Community Editionを発表](https://www.sencha.com/blog/announcing-sencha-ext-community-edition-ja/)
Uipath datatableで特定の列だけ抜き出す

プロジェクトのxamlに
\<AssemblyReference>System.Data.DataSetExtensions\</AssemblyReference>
を追加しCopyToDataTableメソッドを使えるようにする

![add.png](https://qiita-image-store.s3.amazonaws.com/0/310991/385983eb-a2cf-7aa9-8002-23ed9becbbf4.png)

write range なり　に以下のように書く

　　

ExtractDataTable.Select("").CopyToDataTable.DefaultView.ToTable(False,"Column1")




![column.png](https://qiita-image-store.s3.amazonaws.com/0/310991/e3e9898d-2723-3ddc-f629-0861db5f2e83.png)

するとColumn1のみ抽出される

![ad.png](https://qiita-image-store.s3.amazonaws.com/0/310991/3536d969-c3d7-fe57-2816-4bc6647a3c43.png)

使い方は以下のような感じ

ExtractDataTable.Select("抽出条件").CopyToDataTable.DefaultView.ToTable(False,"列名","列名")

抽出条件はExtractDataTableにデータが入っているという前提で、Column1の値がSampleAになっているものだけに絞り込みたい場合は、

ExtractDataTable＝ExtractDataTable.Select("Column1 = 'SampleA').CopyToDataTable()



Column2の値にBBというキーワードが含まれるものだけに絞り込みたい場合は、

ExtractDataTable = ExtractDataTable.Select("Column2 LIKE '*BB*'").CopyToDataTable()

Assignアクティビティでも使用可能

falseのところはTrue：重複した行を排除する　False：重複した行を排除しない　要は上書きするかしないかみたいです。

have a nice uipath
Amazon Linux - Node.js と npm をインストールする

Amazon Linux へ　Node.js と npm をインストールしてみた。

基本的には↓に剃ってインストールする。
[Installing Node.js via package manager](https://nodejs.org/en/download/package-manager/)
今回は、Amazon Linux を使うので、[Enterprise Linux and Fedora]の部分になる。

npmはnodejsをインストールすると一緒にインストールされます!
今回はバージョン10を入れてみた。

`curl -sL https://rpm.nodesource.com/setup_10.x | bash -`
![スクリーンショット 2018-11-04 19.03.56.png](https://qiita-image-store.s3.amazonaws.com/0/280929/d5c65df6-094e-c218-137a-b179de5d74d6.png)
![スクリーンショット 2018-11-04 19.04.52.png](https://qiita-image-store.s3.amazonaws.com/0/280929/15237e5a-7525-1d70-9b94-85d9e966f681.png)

gccコンパイラも入れておこう！

`yum install -y gcc-c++ make
yum install -y nodejs`
![スクリーンショット 2018-11-04 19.05.42.png](https://qiita-image-store.s3.amazonaws.com/0/280929/0f75ea2f-369f-04de-ccba-ba0323d3b976.png)
![スクリーンショット 2018-11-04 19.05.08.png](https://qiita-image-store.s3.amazonaws.com/0/280929/e9df526a-80c0-bd98-9111-d844b5e64a91.png)

インストールが完了したらバージョンも確認してみましょう。

`node -v
npm -v`
![スクリーンショット 2018-11-04 19.07.07.png](https://qiita-image-store.s3.amazonaws.com/0/280929/17331f7c-04d7-b89c-4bcc-4a40c2b6f172.png)
Microsoft Outlook 2016 for Macにてメールや連絡先の検索がうまくいかない時の対処法

# はじめに

最近、Microsoft Outlook 2016 for Macでメールや連絡先がきちんと検索できず困っていたのですが、いよいよ業務に支障が出てきたので対処法を調べてみました。
他にも困っている人がいるのではないかと思ったので、やったことをまとめます。

# OutlookSearchRepair

Microsoftさんが修復ツールを公開されているので、以下のURLからダウンロードします。

[Mac Outlook Support Utilities](https://blogs.technet.microsoft.com/office_for_mac_support_team_blog/2017/08/10/mac-outlook-support-utilities/)

ダウンロードしたら、ZIPファイルを解凍してOutlook Search Repairを起動します。

起動したら以下のような画面が表示されるので、「Reindex」ボタンを押ししばらく待ちます。

![スクリーンショット 2018-11-07 9.29.39.png](https://qiita-image-store.s3.amazonaws.com/0/114240/9b34a477-3859-4bc2-0b00-08a60fb2558e.png)

しばらく待つと、完了した旨のダイアログが表示されるので「OK」をクリックしてOutlookを起動。

検索フォームに文字列を入れると...

きちんと検索できるようになりました(^-^)/

さてさて、仕事、仕事。
pythonの引数付きデコレータをちょっと書きやすくする

### はじめに

pythonの特徴の一つにデコレータがあります。
主に関数のラッパ関数を作るときのシンタックスシュガーとして使われ、Flask等のライブラリを使うとその良さがわかります。
（より正確には関数を引数に取る関数を書く際のシンタックスシュガーであり、工夫次第でいろいろできます。マーキングとか。）

デコレータは使うとき便利なのですが、書くときがややこしいです。
特に引数をとるデコレータを書くとき。通常はこんな感じになります。

```python
def add_print(prefix): # デコレータの引数にprefixをとりたい
    def _add_print(func): # 引数付きデコレータが返す、引数なしデコレータ
        def wrapper(*args, **kwargs): # 引数なしデコレータが返す、ラッパ関数
            # prefix変数も使って、やりたかった処理をする
            print(f"{prefix}: {func.__name__} is invoked.")
            func(*args, **kwargs)
        return wrapper
    return _add_print
```

これ、ネストが深めで、デコレータに渡したい引数も場所がややこしくて、なんだか嫌ですよね。

### ちょっと書きやすくする

そこで、ちょっと書きやすくできるデコレータを作ってみました。

```python
def paramdeco(func):
    def param(*args, **kwargs):
        def wrapper(f):
            return func(f, *args, **kwargs)
        return wrapper
    return param
```

これを使って引数付きデコレータを書くと以下のようになります。

```python
@paramdeco # 作りたい引数付きデコレータに@paramdecoをつける
def add_print(func, prefix): # 引数付きデコレータは第一引数を関数とし、第二引数以降を取りたい引数にする
    def wrapper(*args, **kwargs): # 引数なしデコレータ同様にラッパ関数を定義する
        print(f"{prefix}: {func.__name__} is invoked.")
        func(*args, **kwargs)
    return wrapper

@add_print("inspect")
def greeting(v):
    print(f"hello {v}!")

greeting("param deco")
# >>> inspect: greeting is invoked.
# >>> hello param deco!
```

引数付きデコレータをdef一発で定義できるので、引数なしデコレータと同様の文法になりました。
これで"ちょっと"だけ書きやすくなりました。

### 参考記事
[Pythonのデコレータについて @mtb_beta](https://qiita.com/mtb_beta/items/d257519b018b8cd0cc2e)
[Python デコレータ再入門　 ~デコレータは種類別に覚えよう~ @macinjoke](https://qiita.com/macinjoke/items/1be6cf0f1f238b5ba01b)
APIを呼ぶためのKeyやSecretの置き方(for Python)

先日手元のコードで、こんなことやってみました。

```python:apikey.py
class API(object):
    class _Twitter(object):
        key = "架空のキー"
        secret = "架空のsecret"
    twitter = _Twitter()
 ```

こういうコードを作って、gitignoreあたりにも登録してコミットを抑止。

呼び出し側はこう。

```python:apicall.py
#擬似コード的架空の何か
client = TwitterClient(key=api.twitter.key, secret=api.twitter.secret)
```

手元でちょっと作業の自動化用に使うにはこれで良いと思うのですが、世の中に出すコード向けに何かもっと良いプラクティスがあったら教えてください。
誰もがやりそうな話なのでpypiあたりに何かモジュールあってもおかしくない気がするのですが。
【vSphereWebClient6.0】Chromeで「保護されていません」を表示させなくする方法

#概要
クローズドのwindows環境にて、スタンドアロンChromeを使ってvSphere Web Clientを開こうとすると、URLのところに警告マークと「保護されません」、ページ部分には「この接続ではプライバシーが保護されません」と表示される。
毎回警告が表示されるとめんどくさいので、スキップできる方法をまとめてみた。

#環境
- Windows Server 2012R2
- スタンドアロンChrome 32bit
- vSphere Web Client 6.0
- chromeバージョン 66.0.3359.139

#対処法
####詳細設定をクリックする
![pic](https://drive.google.com/uc?export=view&id=1pWoxTj7jWEQV1abdfNTp9GpPi9yi-XhJ)
####xxx.xxx.xxx.xxxにアクセスする（安全でありません）をクリックする
![pic](https://drive.google.com/uc?export=view&id=1UPu-Go5YobdBmCXdpWgq4Zeoz-tzSkkk)
####信頼されたルートCA証明書をダウンロード
ダウンロードファイルを解凍後、拡張子がr0のファイルを[crl]、0のファイルを[crt]を変更する
※拡張子がr0ではなくr1の場合もあるが、拡張子0以外はcrlに変更する
####mmcを開き証明書を追加する
※mmcとは？
Microsoft Management Consoleの略。Windowsの管理をするためのツール。

ファイル→スワップインの追加と削除を選択する
![pic](https://drive.google.com/uc?export=view&id=17uwyiQwKn-JY1djrzeIlGpSl1c4YxUCK)
左側の一覧から証明書を選択し追加をクリックする
![pic](https://drive.google.com/uc?export=view&id=1gTrJ4JxpZc8Zg9PS4LMAKOIDBNSq0SUz)
コンピュータアカウントにチェックを入れ、次へ
![pic](https://drive.google.com/uc?export=view&id=1eNiWwhyHEYZ5xQ1NFIxqxwZfiMQZDLC4)
ローカルコンピュータにチェックを入れ完了
![pic](https://drive.google.com/uc?export=view&id=13FCHL9AMaLv6ftuooilTLrBobzTJcIxo)
証明書が追加されているのを確認し完了をクリック
![pic](https://drive.google.com/uc?export=view&id=1YVkmNKIYQAQD18dBLCcvCmRmo-twcsgo)
追加された証明書をダブルクリックし、「信頼されたルート証明機関」を右クリック→「全てのタスク」→「インポート」
![pic](https://drive.google.com/uc?export=view&id=1-r9u6u218Yc_TvbC8yZlpG2kmeEN7cjE)
参照からダウンロードしたcrtファイルを追加
![pic](https://drive.google.com/uc?export=view&id=1XaL_1Mm001nkh7CCon1xiq7oGgpqEIWO)
####ブラウザを開きなおす
一旦ブラウザを閉じてChromeを開きなおすとエラーなく接続できれば完了。
vscodeの背景にカバー画像を表示できる拡張機能background-coverについて

前回、[vscode-backgroundの背景画像をフォルダから選択＆ランダム表示するカスタマイズ方法](https://qiita.com/hotsun/items/71613d09ca984f16acde)について書いたのですが、10月中旬に背景画像が表示できる別のvscode拡張機能が出たみたいなので紹介したいと思います。

今回紹介する[background-cover](https://marketplace.visualstudio.com/items?itemName=manasxx.background-cover)を使用すると
![背景画像](https://qiita-image-store.s3.amazonaws.com/0/293569/4c90669c-1d0d-c750-97cf-2803ba069392.png)
このように画面いっぱいに背景画像を置くことができる様になります。
このタイプの表示機能が欲しかったっていう人も多いんじゃないでしょうか。
画像の透過加工をしなくてもいいので気軽に変更しやすくなりました。  
<font color="DodgerBlue"><b>18/11/8</b>
プルリクで送った内容がアップデートされました。
画像フォルダのパスを設定すると、リスタートのコマンド実行時にランダムで背景画像を切り替える事が出来ます。
気に入った画像を一つのフォルダに収集し、パス指定をせずに気分転換が可能になりました。
</font>
<font color="Red"><b>19/06/10</b>
2系にアップデートされて、
**コマンドでのランダム背景**が使えなくなってしまいました。

→2.2で復活しました。
</font>


## background-coverの使い方

![start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293569/276ee83e-1369-23d5-e322-e9bac4b9eab1.png)

インストールしたら右下のアイコンをクリックすると、上のような設定画面が表示されるので自分の用途に合わせて設定していきます。各種設定はYESを設定すると反映されます。

| 機能  | 説明 |
|:----------------|:-----------------|
| Select Pictures    | エクスプローラーから選択<br>↓ Add Directory設定時は以下も可<br>ランダム選択<br>設定フォルダ内の画像リストから選択     |
| Add Directory   | 背景画像用のフォルダを設定        |
| Background opacity| 0.00～1.00で設定<br>デフォルト 0.2 |
| Input:path/https| 画像パスの直接入力。ローカルパス/URLの指定可。   |
| Closing background| 表示している画像をクリア   |
| On start replacement| 起動時に画像をランダムで切り替えるかどうか<br>Add Directory設定時のみ   |


### ・Select Pictures  
画像選択の便利コマンドでマニュアル選択のほかに、Add Directoryを設定されているとランダム選択やフォルダの画像リストが表示できます。
![コントロール02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293569/00734948-bbd1-468e-d45d-a155a8c1593f.gif)
**Manual Selection** → エクスプローラーから選択できます。
Add Directoryでフォルダを設定済みの場合、以下の二つも表示されます。
**Random Pictures** → Add Directoryで設定された中からランダムで切り替え
【ctrl + shift + f7】でも切り替え出来ます。

## 最初に設定しておくもの

とりあえず **Add Directory** で画像用のフォルダを設定をしましょう。
ランダムを使わないのであれば**Select Pictures > Manual Selection**で良いと思います。
**Background opacity**は初期だと暗めなので0.4位が良いかもです。
**On start replacement**は**On**にしておくと起動時に画像をランダム表示することが出来ます。


## vscode-backgroundと同時使用可能
二つの拡張機能を同時に使っても動作します。
[background-cover](https://marketplace.visualstudio.com/items?itemName=manasxx.background-cover)は透過して表示している分、全体が薄い表示になってしまうので
[vscode-background](https://marketplace.visualstudio.com/items?itemName=shalldie.background)を被せるとネタ的なことも色々出来そうです。

![neta01.jpg](https://qiita-image-store.s3.amazonaws.com/0/293569/9fff2a34-5c6d-5e82-aff2-bea5712391c2.jpeg)


[background-cover](https://marketplace.visualstudio.com/items?itemName=manasxx.background-cover)は[vscode-background](https://marketplace.visualstudio.com/items?itemName=shalldie.background)をベースで作成されているツールですが、被らない内容なので作者から許可をもらって今回公開したみたいです。
ランダム表示の機能は自分が書いたものそのままだったので、わからないこと等あればコメントしてもらえばサポートします。
※vscode-backgroundの事でもOK
小数点がドットじゃなくてカンマになってしまう場合の対応

2018/11/09更新 : 実行環境、タグを追記しました。

## 実行環境
- Mac OS X 10.13.6
- Visual Studio for Mac 7.6.7
- Xamarin.iOS 12.0.0.15
- Xcode 10.1

## きっかけ
普段Visual Studio for Mac(Xamarin.iOS)にてiOSアプリ開発を行なっているのですが、その時に発生した不具合についての備忘録です。
小数点の数値を文字列に変換する場合、小数点がドットではなく、カンマになってしまう場合がある。
URLのクエリに利用する文字列の場合、ドットにしないとエラーになって値を取得できないということがあったので調査。

## 原因
端末の言語設定が、ある地域の言語（ヨーロッパ圏言語等）の言語の場合、小数点をカンマで表現する様子

## 対応
小数点を含む数値を文字列に変換する時は、英語圏（en-US等）の書式を指定すると、小数点は常にドットで文字列化される。



実際の使用例は下記の通り

```c#

using System.Globalization;

/* 省略 */

// 文字列化したいdouble型
double val = 1.12345;
// 端末依存のCultureInfoで文字列出力した場合
// 文字列から数値に戻せるように書式指定子にR（ラウンドトリップ書式指定子）を指定
Debug.WriteLine ("Before: " + val.ToString("R"));

// CultureInfo.InvariantCultureでen-USの書式を取得
CultureInfo culture = CultureInfo.InvariantCulture;
// 数値文字列のフォーマットを取得
NumberFormatInfo format = culture.NumberFormat;

// CultureInfo.InvariantCultureのNumberFormatInfoを指定して出力
Debug.WriteLine ("After: " + val.ToString ("R", format));

```

このコードを、端末の言語設定がフランス語の場合で試した結果、コンソールでは下の画像のように出力されます。
（一部の出力は隠しています。）

![qiita_image_20181107.png](https://qiita-image-store.s3.amazonaws.com/0/212023/f9e32662-2963-f0ca-33b6-68d054c70157.png)


## 参考
- [CultureInfo.InvariantCulture Property (System.Globalization) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.globalization.cultureinfo.invariantculture?view=netframework-4.7.2)
- [標準の数値書式指定文字列 | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/standard-numeric-format-strings#the-round-trip-r-format-specifier)
jupyterのpythonコンソールでbashコマンドにpythonの変数を渡す.

`$`をつけて渡せば良い。

```python
t = "test"
!echo $t
# => test
```

pathlibで特定のディレクトリを捜査してループを回しながら、bashコマンドで処理するときなどに便利。

```python
import pathlib

path = pathlib.Path('pass/to/files')
for file in path.iterdir():
  !cp $file ~/ # ファイルをhomeディレクトリにコピーする
```
PythonでQiitaに予約投稿できるツールをさくっと作ってみた(使い方編)

## 概要

平日欠かさずQiitaに投稿するのがルーティンワークになって、下書きから公開投稿するのが面倒になったので、予約投稿できるツールを作ってみました。

仕様検討1h、実装2h、環境構築と検証に3hくらいでした。お手軽です^^

~~Qiitaの中の人！実装はよ！はよ！~~

## 使い方

**ツールの環境構築がすでに完了している前提**での使い方となります。
ツールの環境構築方法は別で記事にする予定です。(予定は未定

ソースはGitHubにアップしていますので、気になる方はご参考ください。
https://github.com/kai-kou/qiita-reservation-post


### 投稿したい記事をQiitaで限定共有投稿する

普段投稿しているとおりに、タイトル、タグ、本文を入力して、**限定共有投稿**します。ここでは**[Twitterで共有]しない**でおきます。

<img width="1269" alt="Qiitaで限定共有投稿する.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/7b3daa50-ea6f-ece2-d5c5-79a55191c374.png">
<img width="615" alt="スクリーンショット 2018-11-05 10.57.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/8161809f-743e-4881-b1f5-19bc1723cc51.png">


### 限定共有投稿した記事に投稿したい日時をコメントする

限定共有投稿した記事に予約投稿したい日時をコメントします。プレフィックスに「予約投稿:」が必須、分単位の指定は「00」のみ受け付けます。(設定で変更可能です
<img width="850" alt="スクリーンショット 2018-11-05 10.58.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/20e8557e-d3fc-ea7f-c31e-34b946a24c1e.png">
これで、コメントで指定した日時に記事が公開投稿されます。
お手軽ですね^^


## 要件と仕様

自分で利用するツールですが、実装前に要件と仕様をまとめていました。一部、未実装なものもありますが、またそのうちに。

### 要件

- 限定公開投稿(下書き)から自動で公開投稿したい
- 投稿日時は公開投稿したタイミングが良い
- 限定公開投稿した記事は公開投稿後はいらない
- 記事コメントで投稿日時を指定したい
- 公開投稿したらTwitterにツイートしたい
  - 記事コメントでツイート内容を指定したい
- 公開投稿したらSlackで通知したい
- 公開投稿前に記事本文の一部を指定どおりに置換したい
  - 公開したらまずい文字列があると困るから

### 仕様

- Cronなどを利用して、1時間に1度処理が実行される
- Qiita API v2を利用する
- Qiitaのアクセストークンを利用して記事を取得・投稿する
    - 下書きはAPIで取得できないので、限定共有投稿を利用する
- 限定共有投稿の記事コメントから予約投稿を指定した文字列を取得する
  - 「予約投稿:2018/11/01 10:00」
  - プレフィックスは環境変数で指定できる
- 記事コメント指定の日時と現在日時が一致したら記事を公開設定で投稿する
- 投稿前に、文字列の置換指定があれば置換する(未実装)
- 投稿後に、元の記事を削除する
- 投稿後に、Twitterのアクセストークンがあればツイートする
    - ツイート内容はQiitaでツイートされるのと同じ内容とする
    - 記事コメントにツイート指定があればそれを含めてツイートする(未実装)
      - 「tweet:ツイート内容」(未実装)
- 投稿後に、SlackのWebHookUrlがあればSlackに通知する


## 制限・前提

- 予約投稿は「年月日時」で指定する
  - 1時間ごとにチェックを走らせるため
- 実行環境はAWS LambdaかGoogle Cloud Functionsとする
    - 現時点(2018/11/05)でAWS Lambdaに対応
- 予約投稿のチェックタイミングは各クラウドサービスで指定する
- 各アクセストークンは環境変数で指定する
- 文字列置換は環境変数で指定する
- 利用者が自前で環境設定できる前提とする


## 環境構築に参考にした記事など

環境構築の詳細は別で記事にする予定です。(予定は未定

ソースをGitHubにアップしていますので、気になる方はご参考ください。
https://github.com/kai-kou/qiita-reservation-post


今回参考にさせてもらった記事などは以下となります。感謝！

### Qiita API

【まとめ】Qiita API ライブラリ/ラッパー
https://qiita.com/suin/items/857f839e894f5da787f8

Qiita API v2のPythonラッパー実装した
https://qiita.com/petitviolet/items/deda7b66852635264508

### Slack

Python3でslackに投稿する
https://qiita.com/shtnkgm/items/4f0e4dcbb9eb52fdf316

### Twitter

Python3で簡単にtwitterに投稿する
https://qiita.com/shtnkgm/items/cc55be0e09b484ce8e43

### AWS Lambda

Serverless FrameworkでAWS Lambda関数を作成する
https://qiita.com/Esfahan/items/736d09f732fa619d2410

Serverlessで任意のディレクトリ配下に、関数毎にディレクトリを切ってソースを配置する with webpack building
https://qiita.com/wara_be/items/f3ec38e5be6bdea7c79d

AWS Lambdaのタイムゾーン変更
https://qiita.com/nullian/items/39ecf1f6d0194b72e8e6


## まとめ

Qiita API v2のラッパーを実装されている方がおられたので、利用させてもらい、さくっと実装することができました。

個人的にはこれで、下書きの10記事制限を気にすることなく、ルーティンで記事公開していた手間がだいぶと省けるようになったのでだいぶ満足です^^


メリットとして、限定共有公開を公開投稿までに挟むので、記事内容の見直しができる点があります。
組織に所属していてレビューが必要な場合にもいいですよね。
それでも見逃すときには見逃すのでご注意ください(本記事でキャプチャした記事で1敗
jqueryメモ④　関数・無名関数

###関数
関数は、「繰り返し実行する処理」や「何度も利用する処理」を関数としてまとめておくことで、同じレコードを何度も記述する手間を省けます。保守性も上がる。

組み込み関数や、自分で関数を作ることもできます。

###関数の作り方

```js

function 関数(引数１, 引数２){
  実行する処理（引数１と引数２は関数内では変数のように使用できる）
  return 値;
}
```

・最初にfunctionをつける
・functionに続いて任意の引数をつける
・引数は複数指定することも省略することも可能
・()に続いて{}を記述し、その中に「実行する処理」を記述する。
・関数のお呼び出しに何らかの値を返す場合はreturn文を記述する
・return文は省略可能（何も値を返さない場合）

***関数の例***
２つの引数を受け取り、関数内で２つの引数を足し算し、その値を呼び出し元に戻します。
（この呼び出し元に戻される値のことを「返り値」または「戻り値」と呼ぶ）

```js
function add(num1, num2 ){
 return  num1 + num2 ;
}
```

###関数の呼び出し方

```
関数名（引数１、引数２）;
```



###無名関数
関数名を省略した関数を作成できる。

```js

function(引数１、引数２){
 実行する処理
 return　値;
}
```

***jQueryのメソッドの引数にはよく無名関数が使われる。***
以下例文

```js

 $(function(){
   $('h1').on('mouseover', function(){　←ここの第2引数が無名関数
     $(this).css('color', '#ebc000');
   });
 });
```

***処理を複数の箇所で使い回すためではなく、引数として一連の処理を直接渡す際などは無名関数を利用します。***



###スコープ
JSでは宣言、作成された箇所よりも内側でのみ利用できます。

種類は２つ
グローバルスコープ
ローカルスコープ

基本、スコープは関数の{}内によって区切られます。



###変数や関数の返り値を確認する方法
変数の中身や関数（メソッド）の返り値を確認する作業はかなり重要。

***変数の中身や関数（メソッド）の返り値は開発者ツールで確認できます。***
コード内にconsole.log()メソッドを記述すると、引数に指定した変数や関数の返り値がコンソール画面に表示されます。
クラウド開発環境素人がCodeanywhereを使ってみた

# はじめに
Codeanywhereはクラウド型統合開発環境の1つです。
クラウドサービスとして統合開発環境(IDE)を使用できるため、ローカルにプログラミング環境を整える必要がありません。例えばJavaを書きたい場合は、JDKやEclipseのインストールが必要ありません。

ネットワーク環境さえあれば、プログラムを書くことができます。
私はiPad mini4を持っていて外出した時の空き時間にプログラミングを勉強できればいいなと思いました。

使いはじめて3ヶ月ほど経ったのでCodeanywhereの使い方の概略や、感想などを書いていこうと思います。

# コンテナを立てる
はじめに、使用したい言語に応じてコンテナを立てる必要があります。
私はpython3のコンテナを1つ立てました。
Codeanywhereは課金しなくても使用できますが、その場合は
* 作成可能なコンテナ数：1つ
* コンテナの使用時間：2時間/日
となります。
iPadで使用していると、なかなかコンテナが起動しないことがあります。(PCで使用した場合は全く問題なく起動します)
よく聞く仮想マシンとコンテナの違いは以下の記事が個人的には分かりやすかったです。
[コレ1枚で分かる「仮想マシンとコンテナの違い」](http://www.itmedia.co.jp/enterprise/articles/1612/19/news041.html)
[Docker入門（第一回）～Dockerとは何か、何が良いのか～](https://knowledge.sakura.ad.jp/13265/)

# プログラム作成
コンテナの準備が完了したらいよいよプログラムを書くことができます。
コンテナはSSHで操作することができます。
例えば、hello worldをコンソールに表示するtest.pyを以下のように実行することができます。

```python:test.py
# test
print("hello world")
```
コンソールでは、`python test.py`と入力すると、次のようになると思います。

```
cabox@box-codeanywhere:~/workspace$ python test.py
hello world
cabox@box-codeanywhere:~/workspace$
```
# 感想
Codeanywhereについて、一言でいうと一長一短であると思います。
私は非課金ユーザーですので、コンテナの使用時間が2h/日、作成可能なコンテナ数が1つ、という制約があります。
しかし、タブレットやスマホでコーディングができますし、使い方も簡単です。
私のようにプライベートで使用する分にはメリットの方が大きいと思いました。


これからは、ライブラリを使ってもう少し高度なプログラムを書いてみたいです。
jQueryメモ③　メソッド・オブジェクト

###onメソッド
onメソッドは***特定の出来事が起こるタイミングに実行したい命令を設定するメソッド***ですが、複数指定することも可能。


・cssメソッドで.css('color', '') 　←こんな風に空白にすると、元に戻る。


###「メソッドチェーンとは」
メソッドを鎖のようにつなげて記述し実行する手法。
rubyでもできるし、jQueryでもできる。
以下の感じで。

```
$('セレクタ').メソッドA().メソッドB()
```

***メリットとしては、***
①$()関数の記述が1回になりコードがシンプルになる
②プログラムの処理速度が向上する。　←特に大事。

***$()関数***が実行されると、
ブラウザは指定したセレクタを手掛かりにしてHTMLから要素を集める処理を行うので、
この処理が繰り返されるとCPUに負荷がかかり処理に時間がかかる。
メソッドチェーンを実行すると、$()関数の記述を減らせるので、処理速度が向上する。


###animateメソッド

```js

.animate({
          'CSSプロパティ': '値'
  },
  アニメーション時間
);
```

一つ目の引数には「アニメーションの見た目を表現するCSSプロパティと値」を渡し、
2つ目の引数には、「どのくらい時間をかけてアニメーションをさせるか」を指定する。***1500なら、1,5秒ということである。***

animateメソッドは順番に実行されるので、一つのアニメーションが終わり次のアニメーションに移るまで時間かかる。

アニメーションを途中でキャンセルするメソッドは***stop()メソッド***で、「要素のアニメーションを停止するメソッド」。引数にはtrueかfalseを付ける。

##jQuery基本
・最初に$()関数を使用して「命令の対象」を決定する
・その命令の対象に対して、様々なメソッドを使用して処理をおこなう
・CSSのスタイル変更には.css()メソッド
・処理を実行するタイミングは、on()メソッド
・HTMLにアニメーションを付けたい場合はanimate()メソッド
・メソッドは「.」(ドット)で繋げて記述できる（メソッドチェーン）


###オブジェクト
「{}」で囲まれている部分がオブジェクト。
変数：変数にはオブジェクト(「{}」で囲まれている部分)を格納することも可能で、様々な箇所から利用できる。複数の箇所で同一のデータを使用したり、格納されている値を編集したりする場合は、変数にデータを格納することが必要です。

###変数に保存したデータの取得方法
変数に格納されたオブジェクト内のデータを取得する方法は2種類ある。
①変数名.データ名;

②変数名['データ名'];

```js

var obj = {a: 100, b: 200}
vat data;

data = obj.a + obj.b;          //変数dataには「300」が格納される
data = obj['a'] + obj['b'];   //変数dataには「300」が格納される
```

オブジェクト内に書くのされている各データのことを「プロパティ」と呼びます(a: 100とかのこと)。
PDFをツールを使わず比較する。

この記事は帳票出力などのプログラムで、開発の前後の出力したPDFファイルを比較してチェックしたいが、PDF比較ツールを使用できない状況で、ベストプラクティスを求めたメモです。

#やりたい事
帳票出力を行うプログラムにおいて、一部のグラフの形状を変更、一部の入力データの変更が、他の箇所に意図せぬ影響を及ぼしていないかのチェックを行う。
目視によるチェックでは、精度が保てない、時間がかかる、かつ　何より大変でストレスフルなので目視オンリーの手法から別の手法としたい。

#前提条件
- Windows環境　
- AdobeReader

PDF比較ソフトはなく、目視によるチェックが主流で、変更前と変更後のPDFを画面に並べて一つ一つ文章やグラフに意図しない変更が加えられてはないかの確認を実施する手法。
PDFは10p~30p １ページにはグラフ、テーブル、注釈が並ぶ。

#やった事
対象のPDFの文字列のコピー＆ペーストなどを通してデータの構成状況を検証し、文字データ（テーブル、注釈）と、画像データ（グラフ、グラフ判例など）の2要素によってのみ構成されていることが確認できた。そのため、文字データの比較はツールに任せ、画像データの比較
のみ目視で行う事とした。

- 文字データの比較
文字データ（テーブルと注釈のデータ）は完全にコピー可能であったため、diffなど、文字列比較を行えるツールで比較を行い、比較結果をチェックする。

- 画像データの比較
画像データ（グラフ、グラフ判例など）はグラフについては2つの帳票を並べての比較ではなく、2つの帳票を同じサイズ（拡大率）とし、重ねて、Ctrl+Tabキーで素早くPDFを何度も切り替えつつ、目視を行う。
グラフが重なった状態で繰り返し切り替わるので、2コマのアニメーションとなり、グラフ単位で変化が無いという判断がし易くなる。

#結果
データの比較をツールに任せた事で、チェックの精度が担保された。
また、目視によるチェックの対象から、データの中身を除外出来たので、目視のストレスが低減され、精度、スピードが格段に上がった（1pあたりの時間が3分〜1分）

また、文字の修飾（大きさ、色など）についても注視する場合も、画像データの比較の際に合わせて確認を行いやすい。
iTunesの重複した曲を一括削除する

![ 2018-11-07 17.28.52.png](https://qiita-image-store.s3.amazonaws.com/0/311704/1d866bf1-f2e9-ec8c-1624-25e146faa26b.png)

今日は。
先日、iPod Classicを手に入れました。鏡みたいな背面がカッコイイ。
160GBも入るらしいので、とにかく持ってる曲丸々入れてやろうとか思ってたんですが、問題点が2つ。

* Macが2台あるが、それぞれ曲が入ってたり入ってなかったりしたので、ライブラリを合わせたい（お互いのライブラリの和集合がほしい）

* 全く同じ曲が重複している（画像の通り）。iPhoneやWalkmanなら単体で削除できるが、Classicはそれができないらしく...

辛抱強く1曲1曲選んで移してもよかったんですが、今後のことも考えて、この際2ライブラリを合わせて、かつ整理してしまおうと思い立った次第です。

## 方針
Mac1のライブラリを丸ごとMac2に移して、曲の重複を解消してしまえば上の2つは同時に解決できそう。
ただ...

## iTunesの重複判定が緩すぎる
![ 2018-11-07 17.32.26.png](https://qiita-image-store.s3.amazonaws.com/0/311704/df0abc01-6598-4467-89f3-644efeee8bf5.png)

iTunesで、optionキーを押下しつつ(WindowsはAlt)メニューバーからファイル>ライブラリと動かすと、"完全に重複する項目を表示"と出ます。
確かに重複した項目がずらっと出るんですが、おそらく曲名しか見ていないのか、収録されているアルバムが違ったりしても表示されていたりしました(そもそもそういう機能なのだと思います)。
僕としては、完全に重複している曲を削除したいので、結局ここから選別していかないといけません。全体のライブラリから見れば数は絞れていますが、それでもかなりシンドイ...。

## プログラムを組む
今思えば、AnimatorやらAppleScriptやらでもっとうまいやり方があったのかもしれませんが、何とは無しにPythonで書きました。コードは以下。利用は自己責任でお願いします。
https://github.com/sora410/iTunes_dup_delete/blob/master/iTunes_dup_delete.py
iTunes Music Library.xmlをBeautifulSoupで解析して、重複をカウントしてファイルパスからrmするだけです。名前、録音時間、アーティスト名、アルバム名全部合致していないと重複と見なされないようにしてあるので、判定はかなり厳しくなっているとは思います。
ただ、シークレットトラックなんかの前にめちゃある[Blank]みたいなのも同時に検知してしまうので、Blacklistを作っておきました。argparseで指定してもいいかなとは思ったんですが、複数指定の時の区切り文字に悩んだのでやめました。

## あと少し...
重複した余分なファイルそのものは消すことができたのですが、iTunesにはまだ項目だけ残ってしまっています。
[こちら](https://anote.work/1633)のサイトを参考に、幽霊項目たちを一掃します。こんなうまいやり方があるんですね...。（終）
sshによる多段階接続のconfig

N番煎じだが、どこで見かけたか忘れるので自身の備忘録。

# 前提条件
* `Local -> Remote01 -> Remote02` こういう接続を`ssh Remote02`のコマンド一発でしたい。
* `Local -> Remote01`、`Remote01 -> Remote02`の接続が鍵認証で出来ること。
* 接続には鍵認証を利用し、秘密鍵はLocalに`secret_key01`、`secret_key02`として、`~/.ssh`下に保存されているとする。
 * `Local -> Remote01` が `secret_key01`
 * `Remote01 -> Remote02` が `secret_key02`


# configファイルの記述
`ProxyCommand`を組み合わせると実現できる。`.ssh/config`に次のように追記する。

```bash
Host Remote01
    HostName example01.com  # remote01 のIP/Host name
    IdentityFile ~/.ssh/secret_key01
    User user01

Host Remote02
    HostName example02.com  # remote02 のIP/Host name
    IdentityFile ~/.ssh/secret_key02
    User user02
    ProxyCommand ssh Remote01 -W %h:%p
```
今後必要にならないかもしれないプログラム言語

# お断り　
　この怪文書は個人的な趣味と偏見と宗教観を元に作成しています。必要になるかもしれないし必要にならないかもしれない、個人的に楽しい言語を羅列するなどしました。同様に興味深い言語などありましたら、コメント欄での議論を期待します。
　尚、賛否両論あることを鑑みてタグ付けは控えさせていただきます。
# 今後必要になるのかもしれない言語
　Java
　Ruby
　C++
　PL/SQL
## Java
　ライブラリが豊富ですね。Java AppletなんかはJava11で廃止されるらしい非推奨機能だったりしますが、見聞を広めるためには必要かもしれません。
　~~ところでSwingは今も現役なの？それともJavaFxに取って代わられたの？~~
　
　あと、Windowsに限らずMacOSやLinux、その他ほとんどのOSでも割とちゃんと(開発が頑張ってくれるおかげで)動くのは尊敬(~~但し下手にゲーム制作(LWJGL、君のことだよ)なんかに手を出すと火傷するらしい~~)

　Apache系のデータベースとか分散系をやるときはJava系の知識があると良いとか言われているけど、SparkならScalaを使うのかもしれない(Javaが要らないとは言っていない)。

　あ、あと最近はRubyの何かや、NodeJSやらDjangoなんか(ライトな)Webでは使われているらしいですね。
　
　JavaScript先輩は最近弟が増えて(ClojureScriptとかとか)いたり、便利なおもちゃを沢山抱えている(Reactとかとか)らしいけどNo知識で炎上する人は数知れずといったイメッジだったり。　

## Ruby
　これが書けるとモテるらしい。モテない先例を作りたくないので私は使いたくないです。
　JRubyはあんまり触れていないからパス。C++の代替をするならRusRusしたい気分なのでこれもパス。

　RubyOnRailsのテスト駆動開発はとても有名だし勉強したほうが開発を学ぶ上では良いと思いますね。
　Rubyが他の言語に比べて圧倒的に生産コストが低いかどうかは知らないけど、言語の深いところに行くと闇を見るらしいので上澄みでプカプカするには良い言語らしい。
　要するに下手なことをしない限りおとなしく優しい感じ…らしい。

## C++
　この言語のために何人の猛者が泥水をすすってきたのか。C++の課題を出されてバージョンを確認して白目を剥いてきた覚えがある人は少なくないのかもしれない。
　
　MSDNがC++に精通しているらしいという電波が飛んできているけどどのバージョンの話かな。
　あとメモリ管理ィイイイってなるのでガッツリしたものを書く前に丁寧に基礎を洗っておきたいところ。

　ライブラリの説明は全部が全部日本語、或いは自然言語になっているわけではないので、RailsからC++余裕だぜうぇーいって突っ込んでくると事故りそうな気持ち。

　会議は知らない。GitHubのソースコードコピペはちゃんと動くかわからないからしっかり検証してね、お兄さんとの約束。

　モバイルゲームにメインでC++ぶっ叩くって結構カロリー高いと思うけど実際主流はどうなんでしょうね。(Unityバンザイ感)

## PL/SQL
　NoSQLもいいけどやっぱりこの手のSQLは一通りやっておいたほうが良いんじゃない？というお気持ち。あと割と初期の頃からデータベースのお気持ちになっていないとよく燃える気がする。
　~~基本情報とか応用情報とかでも必要だし嫌でもちょっとはやっておきたいところ~~

# 今後必要にならないのかもしれない言語
 Python
 Swift Kotlin
 TypeScript
 C#

## Python
　最近Youtubeで推しのVtuberのアーカイブを見ているときによく出てくるアイツ。
　ライブラリが凄いのか言語が凄いのかイマイチよく掴みかねているけど簡単に書ける(一般人感)らしいのでちやほやされているいい子。

　型絶対必要マンからはあんまり印象が良くなかったりするし、括弧を主食とするパーソンからもあんまり好かれていないのかもしれない(~~そこでHylangですよ！~~)。

　ところでPythonが書ける == DeepLearning 完全に理解したおじさん == 某ジョブズではないのであんまり期待をしすぎないほうが良いイメッジ。

　とはいえWeb周りも便利だしマイコンも弄ることができるらしいし、だいたいこいつがあればどうにかなる感じはあったりなかったり(足りないのはJSラッパ位なのかな？)

## Swift Kotlin
　取り敢えず書けるとスマホ系の就職に有利そうなイメッジ。最近はWebの知識を流用してスマホアプリ開発することもあるらしいけど書けたほうが色々機能を柔軟に使えるとかなんとか。
 
　この辺りあんまり詳しくないから誰か書いて…

## TypeScript
　型のあるJavaScript先輩！安全！安心！Angularなんかを書くときには必要かもしれない。
　ただいずれにしろ闇の上に立てられた櫓なのでちょっと踏み込むと底のない闇が見えるらしい。

## C＃
　C#楽しい！何も考えずに書ける！今すぐVisual Studioをインストール！
　Unityでも使えるし、少なくとも書ければ日本の求人で困ることはなさそう。

# 今後必要にならないのかもしれないけど好きな言語
　Clojure/ClojureScript
　Rust

## Clojure/ClojureScript
　前者は、Javaのライブラリ資源を使えてLispっぽく書ける！楽しい！ってイメージ。あとストリーム処理なんかでお世話になるかもしれない Apache Storm を使うときには知っていると得できるかもしれない。あと最近は Clojure spec っていうテストツールが結構いい感じ。
　最新バージョンで長年の問題だったエラーメッセージが長すぎる問題がやや解消された模様。
　個人的にはWebアプリ作るとき場合、Ruby系やJS系、Python系などなどより早く作れると思うんだけど、多分これは慣れの問題。
　後者はJavaScript版Clojure。記法がほぼ一緒だからそれこそ Java の項目に JavaScript が入っていても不自然さを感じないルゥェベル。こいつはReactととても仲が良いのでReactから入って来るのも良いんじゃないかな？

## Rust
　最近界隈で賑わいがある言語。安全なC系。でもOcamlの息吹を感じるのと、面倒な概念がいくつも出てくるので履修は大変。書けるとWebだったりグラフィック系だったりできるらしい。個人的にはOpenGLの更に低いところにあるVulkanっていうグラフィック系のライブラリ周りからの利用が面白そうなイメージ。
~~良い感じのマルチプラットフォームビデオ再生ツール作れないかなあ…~~
OSS登録してJetBrainsエディタを無料で使わせていただく

#はじめに
実は私は 弘法筆を選ばずといえば聞こえはいいのだけど
プロのくせに道具を何にもこだわらない。。。
例えば　OSはWindowsでもMacでもLinuxでもいいし、Linuxはデストリビューション特にこだわりない
マウスもキーボードも こだわりがないし
テキストエディタも何もこだわりがないし
MegreツールもGrepツールも何もこだわりがない
毎年　こだわりを持とうとしているんだけどね・・

エディタ遍歴な長いので飛ばしてくれていいｗ

#エディタ遍歴
昔はMicrosoftの開発していたので　VisualStudioのIDEがメインで使っていた
ただ　マクロ等がないので、テキストエディタとして WZエディタを使っていた

その後 秀丸が周りで多かったので秀丸に切り替えた。WZに問題はなく同じに使えたのが変えた理由

その後 EM Editorにうつった。理由は UNICODE対応などがしやすかったからだ

そのころJavaの案件もおおく Eclipseを使う機会が増えた
またテキストエディタは さくらエディタになった。
正直さくらエディタはフリーのテキストエディタとして最強だと思う
ただし、コードをかくには　今までのエディタは向いてないと思う

時代はスマホ開発時代。MacとWindowsを両方使う必要が出たため Windowsにしかない さくらエディタを捨て
Sublimeエディタにした
開発は WindowsはVisualStudio、AndroidはEclipse、iPhoneはXCode を使った
このころ Eclipseの動作の遅さにたえきれず　はじめてJetBrainsを使った。感触はよかった。

しかし Eclipseが使いにくい＆NDKでC++で開発することが多かったので 
Android開発を VisualStudio＋vs android という組み合わせにした。めちゃ快適
JetBrainsは忘れた

その後 MacがメインになったがC++のサーバ案件をうけた
WindowsマシンであればVisualStudioでいいのだが　MacだとXCodeである
XCodeはすべての不具合が セグフォ11。デバッガも使いにくいし不安定のため　開発に困った
そんなとき試用した JetBrainsのCLionが素晴らしく良かった
VisualStudioの方が慣れてるし良いのだけど、機能的にはほとんど劣る事もなかったし
CMakeがデフォルトで使えるのが凄かった
そのため、プロジェクトファイルをExportすることなく サーバでそのまま動く　ヤバイ
初めてJetBrainsに課金した瞬間だった

そしてその後は 仕事がUNITYの仕事が多くなった。
MacだったためMonoを使ってたが いろいろ不具合で使いにくく
Sublimeエディタにプラグインを入れて使っていたが 日本語対応など怪しくなっていて不満
そのため、ちょうど出たばかりの VisualStudioCodeを試してみた
最初はSublimeエディタより機能が少なく nanoやatomに浮気したが　Microsoftの本気プロジェクトなので
気長にまったら
最強の統合環境になった
プラグインを入れれば　ほとんどすべての言語の統合環境になる
正直 ゴール！！

しかし　時々来るAndroidの案件がAndroidStudio推奨になっていて
Android開発には AndroidStudio
iOS開発はXCode
WindowsのC++はVisualStudio
その他は VisualStudioCode 
という使い分けをしていたが
AndroidStudioの使い心地が良く
Goの仕事をすることになったとき VSCodeでもいいけど、Golandを使いたいと思った

#Goland買う
課金しました Goland
VSCodeでもいいんだけど、いろんなプラグイン入れて環境を作らないと快適にならないし
プラグインによってはすごく重くて、問題のあるプラグインを探して外すのが面倒
その点 Golandは最初っから おすすめの環境が出来ていて　楽！
Golandにしたのは　本当にその一点だけともいえる

#OSSライセンス
他のエディタも使いたいけど　けっこうお高いのよね・・・
ってことで　OSSに貢献している人はJetBrainsのエディタをフリーで使えることがわかる
そういえば私は何個か適当なOSSやってた

#1度目の申請（テスト）
どういう申請が通るかのテストで C++でBoost.Asioを使って非同期通信を行うHTTPサーバのサンプルを
2週間ぐらいで作って申請した

残念ながら ライセンスはもらえず
少なくとも3か月 活動しているプロジェクトじゃないとダメと言われる


#2度目の申請
色んなOSSはやってるが
去年の夏から時々更新しているUNITYのサンプルプロジェクトを申請した
去年の夏とはいえ、しばらく停止し、2か月ほどまえから再開した
少なくとも3か月アクティブなプロジェクトであること　という条件に対して
ギリギリかもしれない

結果は OKで　ライセンスメールがとどいた

以下はライセンスのもらい方だ

#ライセンスをもらう

##申請する
https://qiita.com/yamamoto-febc/items/6b62c290593d178575a6
にまかせる

わたしは　このプロジェクトで申請した

https://github.com/YukiMiyatake/UnityLesson

##メールが届く
数日したら審査OKのメールが届く
License Certificate for JetBrains All Products Pack / Order xxx
といったメールが届いた

Certificateファイルがあるので、ライセンスを探したがない

SOFTWARE ACTIVATION
以下に登録アドレスが書いてあったので　そこにアクセスする必要がある

##登録
上記URLにアクセスすると 登録ページになる
私の場合はすでにJetBrains製品を2個かってるので ログインするのだが
初めての人はここで　メールアドレスと表示名を登録することになる

登録が終わると再びメールが来て
Confirm Your Accout
をクリックすると 次にいく

##ライセンス取得
Confirmしたらユーザーページになる
ここが少しだけややこしかった

このページは　アカウントの管理画面である
ここで　JetBrainsのアプリのダウンロード、購入が出来る
もちろん　Buy Nowで買うことができるが 今回はOSSライセンスで無料でもらいたい

左の方に 申請したプロジェクト名（私の場合は UnityLesson）というのがある
そこをクリックすると　ライセンスが1個あると出る
そのプロジェクトに　自分のメールアドレスを登録する

どうやら　プロジェクトに対して複数のユーザが結び付く形で、ライセンスはプロジェクトに紐づけるようだ

そして　メールが届き、そこに ライセンスが添付されている

そのライセンスを入力すれば、すべてのJetBrains製品を使うことが出来た！
XcodeからGitHubにpushしたのにコードが反映されてない場合...

せっかくアプリを作成したので[こちらの記事](https://qiita.com/january108/items/9a0456b5d74c3a6f803c)を参考にgithubにpushしてみました！、、、が。

main.storyboardもswiftファイルも真っ白。まったくコードが反映されてない。。。

#ファイルを変更した後commitする必要がある。

以前まっさらな状態でcommitしていたので変更後のファイルをcommitする必要がありました。
ファイルをみると右側に"M"のマークが。これはファイルに変更があったことを意味します。
<img width="271" alt="スクリーンショット 2018-11-07 1.14.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/302888/853fa2b2-8e74-155c-3b2e-13226c7594ab.png">

このMがついているファイルの編集内容をgitリポジトリに反映させたい場合はcommitをします。
やり方は「Source Control」-「Commit...」で更新したいファイルを選択してcommit。
この後上記の記事の通りpushすれば変更内容をgithubにアップすることができます！

#最後に
githubの使い方がよくわからない時にターミナルで変な風にcommitをしていたのでまっさらな状態でcommitされたままでした。。。ヘタにcommitするとよくわからなくなっちゃうので今後気をつけます！では！
BERTのmultilingual modelにおける日本語の扱い

2019/1/20 追記

日本語wikipediaで学習させたモデルを公開してくださった方がいます。
まだ手元では試していませんが、multilingual modelを使用するより良さそうです。
ありがたいですね！

https://yoheikikuta.github.io/bert-japanese/

---

102言語を１つのネットワークで学習したBERT multilingual modelが公開された。その対応言語リストにJapaneseが含まれているものの、単語区切りなどどのように学習されているのか疑問だったので調べてみた。

https://github.com/google-research/bert/blob/master/multilingual.md

>#####Tokenization
>For tokenization, we use a 110k shared WordPiece vocabulary. The word counts are weighted the same way as the data, so low-resource languages are upweighted by some factor. We intentionally do not use any marker to denote the input language (so that zero-shot training can work).
>Because Chinese does not have whitespace characters, we add spaces around every character in the CJK Unicode range before applying WordPiece.

ということなので、日本語の漢字も全て前後に区切り文字としてのスペースを加えた上でWordPieceの解析にかけられる。なお、unicode上ではChina, Japan, Koreaの漢字が分けられずに混ざって並んでいるので、CJK Unicode rangeでは全ての漢字が含まれることになる。

さて、'a 110k shared WordPiece vocabulary'の中に日本語のwordpieceがどのくらい含まれているのかを見る。multilingual modelのvocab.txtを確認すると、全ての漢字は１文字ずつ区切られていて、二文字以上のいわゆる熟語は存在しなかった。

二文字以上のwordpieceは約1000語であった。概ね２−３文字のものが多いが、なかには「なけれはならない」や「になっている」、「となっていた」などのやや長めのwordpieceも含まれていた。##つきのものと、##なしのものが半々くらい。

漢字一文字のwordpieceにも##が付いているのがやや解せないが、「になる」とか、「である」とか明らかにspace区切りの始まりにない語彙に##がついていないので、やはり先に漢字の回りにspaceを足して区切ってからwordpieceの解析にかけたのだろうか。。このwordpieceのvocabularyを作る部分はコードに載っていないのでよく分からない。


いずれにせよ、BERT multilingual modelを日本語に使うときは、上記のようなtokenizationが行われていることを認識しておいたほうがよさそう。
AWSはじめるときにやるアカウント設定まわりの話

## はじめに

AWSの概要と、提供されているサービスの特徴はある程度把握していて、作ろうとしているアプリケーションを、どのサービスを使って実装していくかまである程度決まっているが、実際AWS登録してみたらドキュメントが何言ってるのか全くわからなくて、何からやり始めればええねん。

というところで（というかアカウント作成してすぐに）詰まったので、手を動かしたことを備忘録的に残しておこうと思ったのでこの記事を書いてます。

## Identity and Access Management

アカウント作ってすぐに何で詰まったかというと、何からやったらいいかわからない状態になったんですね。なぜかというと、AWSの登場人物の全体像が把握できているか自信がないからです。

### 最初に作ったアカウントはルートアカウント

メールアドレスを使ってログインしましたよね？そのアカウントはルートアカウントと言います。  
サーバーでいうroot権限持ったやつみたいなものです。乗っ取られたら何されるかわかりません。

ですので、まずはルートアカウントのセキュリティ強化、あとは普段使うIAMユーザーというのを作成します。

## セキュリティの強化、多要素認証(MFA)

多要素認証（MFA, Multi-Factor Authentication）というのは、大雑把にいうと複数のパスワードで認証する仕組みです。  
今回説明するような、iPhoneでGoogleAuthenticatorを使った場合は2要素認証(2-Factor Authentication)といいます。

まずiPhoneの場合AppStoreからGoogleAuthenticatorをインストールしてください。（他にもAWSでMFAに使えるアプリならなんでもOKです）  
GoogleAuthenticator連携する時めちゃくちゃわからなかったのが、6桁の値を入力するフィールドが２つあるのに、GoogleAuthenticator側には6桁の数字が1つしか表示されていなくて、どうやって2つ表示すんねんって思っていたんですけど、時間が経つと次の6桁の数字が表示されるので、それを入力するといいだけみたいです。

この設定を済ませると、次回以降ルートアカウントでログインするときに、登録したパスワードに加えて、今回追加されたアプリに表示される6桁の数字が必要になります。

くれぐれも、この設定をルートアカウントから解除する前に、iPhoneを初期化したり、アプリを消去したり、追加した設定を削除したりしないでください。現実的にログインできなくなります。iPhoneの場合は意図しない故障に見舞われる可能性もなくはないので、バックアップを取っておいて、いつでも復元できるようにしておいたほうがよいかもしれません。

## IAMユーザーの作成

ルートアカウントは乗っ取られたらやばいので、普段使うのは別の個別に権限を設定したユーザーにしましょう、というのがベストプラクティスのようで、そのユーザーをIAMユーザーというみたいです。  
こちらもMFAの設定ができるので、面倒かもしれないですが一通り手順が終わったら設定しておきましょう。

## グループの作成

ユーザーの権限はグループ単位で管理するのがよいようなので、適切なアクセス権限を選択して、グループを作成したら、先ほど作成したユーザーをグループに追加します。  

## パスワードポリシーの変更

設定できるパスワードの条件を変更できます。初期設定ではかなり緩めの設定になっているので、厳重にしておきましょう。

## おわりに

ここまでで一旦アカウントの設定は完了で、ルートアカウントを保護するためにも、普段は今回作成したIAMユーザーでログインするようにしましょう。

ちなみに、AWSをみているとところどころ「ポリシー」という単語がいろんな意味で使われているところがあって、これはドキュメントを書く上では可能な限り避けたほうがいいなと思ったので、自分は気をつけようと思いました。

重複していたのは、グループのポリシー（アクセス権限）とパスワードのポリシー（条件）です。
これくらいの違いなら感覚で理解できるかもしれませんが、同じ文字を見たら、同じものだと認識してしまいそうです。  
なので冗長でも具体的な違う名前をつけないと誤解を招く障害点になるのではないでしょうか。。

ただ言葉の選定や使い方は非常に難しいので、僕が完璧な前提で書いてないです。気をつけていくしかないですね。
Gmailに届くメルマガを夜な夜な自動削除

# はじめに
新聞や雑誌と同じく、定期的に届くメルマガは、最新であることにアイデンティティを持っていますよね。
つまり、最新号以外のメルマガのメッセージなど不要ということになります。
しかし、プライベートのメールをすべてGmailにまとめている私の場合、「1つ前のメルマガ」は既に受信トレイの遥か彼方。ムダにGoogleアカウントの容量を食われてしまいますし、何よりも受信トレイがゴチャゴチャです。
というわけで、寝ている間に勝手に削除してくれるスクリプトを書いてみました。

### 参考にした記事
* [Gmailの受信トレイ内のメールを自動削除するやり方 - Qiita](https://qiita.com/kobaboy/items/bbdc6ceb1904947866d2)  
やろうとしている方向はこちらと同じ。

### ワンポイント
* 定期的に削除したいメルマガは増減がありそうなので、Googleスプレッドシートに対象のアドレスなどを入力、参照するようにした。
* 重要なアドレスは対象にしないが、たまに「こんなにも自動削除しているのかー」と眺めたいので処理結果をログとして残す。

# 実装

``` script.js
function mailMagazineDeleteBatch() {
  // アドレスなどを入力してあるスプレッドシートファイルを参照
  var spreadSheet = SpreadsheetApp.openById(/*ファイルID*/);
  var sourceSheet = spreadSheet.getSheets()[0];
  // 送信元アドレスと削除しない期間を配列として取得
  var fromList = sourceSheet.getRange(2, 1,sourceSheet.getLastRow(), 2).getValues();
  var deleteCount = 0; //ログ用削除件数カウンタ
  for (var i=0; i<fromList.length; i++){//アドレスの数だけ繰り返し
    //アドレス毎に指定日前かつスターが付いていない受信トレイ内のスレッドを検索
    var deleteThreads = GmailApp.search('from:'+fromList[i][0]+' older_than:'+fromList[i][1]+'d -is:starred in:inbox');
    for (var j=0; j<deleteThreads.length; j++) {//スレッドの数だけ繰り返し
      deleteThreads[j].moveToTrash(); //1件ずつ削除
      deleteCount++; //削除カウンタ加算
    }
  }
  //　2つめのシートにログ出力
  var logSheet = spreadSheet.getSheets()[1];
  var insertRow = logSheet.getLastRow()+1;
  logSheet.getRange(insertRow, 1).setValue(new Date()); //処理完了日時
  logSheet.getRange(insertRow, 2).setValue(deleteCount); //削除件数
}
```
*  基本的な文法はJavaScriptに従う[^1]
*  ロジックはコメントの通りですね。

### 用意したスプレッドシード
![image.png](https://qiita-image-store.s3.amazonaws.com/0/274284/9ded76c8-c58f-bc8d-83a7-5beb60d4daff.png)
### ログ出力結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/274284/14b94ef7-03c1-96fa-61f7-020e814aa678.png)

# おわりに
初めてQiitaに投稿してみました。
記事の編集画面がサクサクと書けて幸せだったのでたまに投稿できたらなと思います。


[^1]: シンタックスハイライト用に.jsとしたが実際には.gsである
Ansible の roles の dependencies に Galaxy Roles は書かないほうが良さそう

「`become` は tasks か roles に対して個別に設定すべき」というプラクティスがあると思っているのですが（これは別の記事で書きたいと思ってる）。[meta の dependencies](https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html#role-dependencies) に Galaxy Roles のものが書かれているものがあって、それは roles のなかで root 権限を要求されるタスクについても `become: true` がされていないことが多くて詰むので、やめましょうって話。

例えば [`geerlingguy.redis` の `package` モジュールを使っているタスク](https://github.com/geerlingguy/ansible-role-redis/blob/e27d88a5cc068c94ceb0f80a2ad85dcf53ee8db3/tasks/setup-RedHat.yml#L2-L6)は `become: true` がないので、以下のような使い方をする必要がある。

```yaml
# とある playbook で
- hosts: redis
  become: true
  roles:
    - role: geerlingguy.redis
```

```yaml
# とある playbook で
- hosts: redis
  roles:
    - role: geerlingguy.redis
      become: true
```

```yaml
# とある tasks で
- name: "Install Redis"
  become: true
  import_role:
    - name: geerlingguy.redis
```

しかし、**meta ファイルで次のような書き方はできない**。

```yaml
# とある meta で
- dependencies
  - role: geerlingguy.redis
    become: true # ← 無視される
```
オブジェクト初期化子で計算されたプロパティやキーを使用する

# オブジェクト初期化子で計算されたプロパティやキーを使用する
最近Vue.jsの学習をしていて `hoge[FOO](param);` のようなコードを見ることが多々あり、 ?となったので調べた。

オブジェクト初期化子自体の説明は[ここ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer)を参照。

## 計算されたプロパティやキーとは

### 計算されたプロパティ
> ECMAScript 2015 から、オブジェクト初期化子構文も計算されたプロパティ名をサポートします。括弧 []の中に式を記述でき、それが計算されてプロパティ名として使用されます。

引用元 : [オブジェクト初期化子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer)

[]に記述した式が計算された結果をプロパティ名にできる!!

#### サンプル

```js

const ADDRESS = 'ADDRESS';

const user = {
    id : 1,
    [ADDRESS] : 'hoge',
    ['MAIL_' + ADDRESS] : 'foo'
}

alert(`user : ${JSON.stringify(user)}`);
```

#### サンプルはこれと同じこと

```js

const user = {
    id : 1,
    ADDRESS : 'hoge',
    MAIL_ADDRESS : 'foo'
}

alert(`user : ${JSON.stringify(user)}`);
```

#### 実行結果

```
user : {"id":1,"ADDRESS":"hoge","MAIL_ADDRESS":"foo"}
```

### 計算されたキー

先ほどのオブジェクト初期化子のメソッド定義の際にもこの方法を使用することができる。

#### サンプル

```js

const SHOW = 'SHOW';

const hoge = {
    // メソッド名としてSHOWを使用している
    [SHOW](target) {
        alert(target);
    }
}

// hoge objectのSHOWメソッドを呼び出す。
hoge[SHOW]('JavaScript');
```

#### サンプルはこれと同じこと

```js
const SHOW = 'SHOW';

const hoge = {
    // メソッド名としてSHOWを使用している
    SHOW(target) {
        alert(target);
    }
}

// hoge objectのSHOWメソッドを呼び出す。
hoge.SHOW('JavaScript');
```

#### 実行結果

```
JavaScript
```

参考 : [メソッド定義 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions_and_function_scope/Method_definitions)

## 参考にさせていただいたサイト
[オブジェクト初期化子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer#%E8%A8%88%E7%AE%97%E3%81%95%E3%82%8C%E3%81%9F%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E5%90%8D)

[メソッド定義 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions_and_function_scope/Method_definitions)
progateのHTMLコース修了者向け　初学者が知らない7つ基礎知識

この記事ではHTML5とCSS3を使用しています。
progateでHTMLコースを修了したのでWEBサイトを作ってみました。添削はオンラインサロンの[shibajuku](https://shibajuku.net/)でして頂きました。指摘事項と合わせて自分で調べた内容をずらずら記述しております。progateでは学ばなかったけど、WEBサイトを作る上で必須となる知識も含まれてると思います。

###⑴タグ内のページ紹介方法
meta nameのdescriptionのcontentにページ紹介を記述します。
ちなみにdescriptionって説明って意味です。

```html
<head>
<meta name="descriotion" content="ページ紹介文">
</head>
```


###⑵ヘッダーにサイト名を入れる場合
```html
<header>
<h1>サイト名</h1>
</header>
```視覚的に必要がない場合はCSSで消す。
```

###⑶空欄の要素は控える
例えばCSSで調整したい時にclassやdiv要素を追加する場合がありますが、極力中身が空欄になることは避けましょう。

```html:NG例
HTML:<div class="menu-btn"></div>
CSS: .menu-btn {
padding: 10pc 0;
}
```
###⑷imgタグのalt属性には、その画像が何かユーザーに分かるように記述する
そもそもalt属性は目の不自由な方へ何の画像かを読み上げる為に用いられます。Google等の検索エンジンもalt属性を読み取り何の画像か判断します。また、画像が表示されない時にはテキストで何の画像か説明します。

```html:NG例
<img src="***." alt="keyvisual" class="***">
```

```html:OK例
<img src="***" alt="猫の画像" class="***">
```

###⑸\<ul>要素や\<ol>要素の中には\<li>要素しか入れられない
たまに\<p>要素や\<a>要素を入れているWEBサイトがありますが、ルール上は\<li>要素しか入れることは出来ません。
もちろん\<ul>や\<ol>を入れることも出来ません。**\<li>要素だけです。**


###⑹日付の表記方法
知ってる方からしたら今更何言ってんのレベルですが、私のように知らない人もいます。
例えば、2018年１１月７日と表示させたい場合は、
```2018-11-7```と記述すると自動で年、月、日が表示されます。


###⑺WEBサイトの著作権表記方法
よくWEBサイトの最下部にはCopy rightや©︎の表記があります。
©︎は&:copy; ***と記述すると　©︎***と表示されます。
また小さく表示させたい場合は\<small>\</small>タグで挟めば小さく表示されます。


今後も指摘を貰った内容はQiitaで公開していこうと思っています。
指摘されて初めて知る内容も多いのでHTMLをサラッとしか勉強していない方にちょっとでもへーって思ってもらえたら嬉しいです。
summernoteでfullscreenボタンを押すとtoolbarとeditorの間に空白が生まれる現象の解消

# はじめに
タイトルの通りですが、summernoteでfullscreenボタンを押すと、toolbarとエディタの間に空白が生まれるという気分がモヤモヤする現象が起こります。

何を言っているのかイマイチ伝わりませんね。百聞は一見に如かず。
下記のキャプチャはfullscreenボタンを押す前のエディタです。
![summernote_before.png](https://qiita-image-store.s3.amazonaws.com/0/186115/be080898-3c32-82ac-7bd7-aa5354f2645c.png)
そして下記のキャプチャがfullscreenボタンを押した後のエディタです。
![summernote_after.png](https://qiita-image-store.s3.amazonaws.com/0/186115/3d024342-5ba5-9f7c-ac24-351b8dfba4b4.png)

おわかりいただけただろうか？
toolbarの背景色が消え、toolbarとエディタに記述した文字との間に謎の空白が生まれています。

なお、summernoteのバージョンは0.8.9[^comments]、Bootstrapのバージョンは3.3.7で確認しています。

# 要因
summernoteはBootstrapとjQueryをベースとしたWYSIWYGエディタですので、きっと自分がオリジナルで用意したスタイルやスクリプトとのコンフリクトがあるのだろうと考えたのですが…実はコレ、公式サイトでも発生します。

[summernote](https://summernote.org)

下記のissueで上がっていましたが、fullscreenボタンがクリックされた際にtoolbar（note-toolbar-wrapper）の高さを取得しているのですが、fullscreenが解除された際に高さを元に戻す処理で不具合が起きている模様です。

https://github.com/summernote/summernote/issues/2996

# 解決方法

いろいろ探しましたが、下記のissueで上がっていました。
なるほど。toolbarの高さが変えられないようにスタイルで固定にしてやるのですね。

ついでにfullscreen後のtoolbarのスタイルも指定しました。（fullscreenが解除されるとdivタグなどの階層が変わっているのです！）

https://github.com/summernote/summernote/issues/2688

```css:summernote-custom.css
.note-toolbar-wrapper {
    height: auto !important;
}
.note-editor > .panel-heading {
    color: #333;
    background-color: #f5f5f5;
    border-color: #ddd;
}
```

# おわりに
summernote本体に要因があるとは思っていなかったので地味に苦しめられました。
しかし、summernote自体はMITライセンスで利用出来る良くできたWYSIWYGエディタでオススメですので、こういった事象にめげずに是非使ってみていただければと。


[^comments]: 投稿から1ヶ月も経たない間にsummernoteのアップデートがあり、バージョン0.8.11では解消されておりました:innocent:
rbenvイラストにして理解しました。~rbenvとRubyとRails~

記事を移転させました。
[【投稿】rbenvイラストにして理解しました。~rbenvとRubyとRails~](https://pick-up-tech.com/blog/rbenv%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E3%81%AB%E3%81%97%E3%81%A6%E7%90%86%E8%A7%A3%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82-rbenv%E3%81%A8-ruby%E3%81%A8-rails)

## 下記の図についても移転先の記事で詳しく記載しております。
![IMG_7907.jpg](https://qiita-image-store.s3.amazonaws.com/0/267720/548cb298-e0fb-7088-dbde-58060d0a1752.jpeg)

![IMG_7909.JPG](https://qiita-image-store.s3.amazonaws.com/0/267720/6ab5521a-9203-ad77-11b8-9af2e54590c5.jpeg)
サーマルプリンタで印刷する: 目次

![hello.jpg](https://qiita-image-store.s3.amazonaws.com/0/58479/58046e68-490f-10ad-4e51-101d01502459.jpeg)

## 概要

レジのレシートでなじみ深いサーマルプリンタ（感熱紙プリンタ）を活用し、様々な業務の改善を行いました。具体的には:

* カンバンに貼り出すストーリー、タスクの印刷
    * GitHub、GitLabともGoogle Chrome拡張を通じて連携
* ランダムに決定されるランチメンバーのリストの印刷
* 各種メモの印刷

などを行いました。

すべてを1つの記事として書き下すのは辛いので、何本かの記事に分けて投稿する予定です。

## 謝辞

本記事の内容は、[株式会社センスタイムジャパン](https://www.sensetime.jp/)様における業務改善活動に基づいて記述されています。記事としての公開を許諾して頂いた株式会社センスタイムジャパン様に感謝致します。

## 目次

* [サーマルプリンタで印刷する: セットアップ編](https://qiita.com/yuyakato/items/7d4db1c567d952a7ac91)
* [サーマルプリンタで印刷する: Raspberry Piからのテスト印刷編](https://qiita.com/yuyakato/items/3309b0ede886c2698526)
* [サーマルプリンタで印刷する: 印刷サービス編](https://qiita.com/yuyakato/items/24666dff3ea1a6a86672)
* [サーマルプリンタで印刷する: レンダリングサービス編](https://qiita.com/yuyakato/items/750364647bbb189016bb)
* [サーマルプリンタで印刷する: Webアプリ編](https://qiita.com/yuyakato/items/99f09875348539531da4)
* [サーマルプリンタで印刷する: Chrome拡張編](https://qiita.com/yuyakato/items/2d6cd811065be0e8ebec)
* [サーマルプリンタで印刷する: まとめ（再セットアップ＆自動起動編）](https://qiita.com/yuyakato/items/e2d55411e6d40deafc1c)

## ソースコード

ソースコードなどは https://github.com/nayutaya/thermal-printer にあります。