OmniAICreator/Qiita-1.07M huggingface dataset:
僕らはもっとGoogleChromeのHistoryで爆速検索すべきなんじゃないだろうか @yumainaura #ハック #閲覧履歴

chrome://history/

これをアドレスバーへ


#探しものはなんですか？見つけにくい「最近閉じたページ」ですか？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a196cc82-3279-da03-c3fe-e83fd2d5736e.png)

#Google検索のステップ数的な速度に満足していますか？爆速で目的のページにたどり着けますか？

#なんだかしょっちゅう「最近閉じたページ」や「Qiitaに最後に投稿したページ」なんかを探している気がする。

#そういえばChromeのHistoryって使ってないよな。

使おう。

#フラストレーションへの気付きisライフチェンジング

爆速解決が身についている人ならまだしも、気が付かなければ五年も六年も無意識下の迷いを繰り返していたりする。

#Command+Y!(Macなら)

#Command+Y!(Macなら)

#Command+Y!(Macなら)

#Command+Y!(Macなら)

#WindowsならControl+Y ?

あなたにライフチェンジングがありますように。

#小さなことだって？

Yes


[ハックyumainaura - Google Search](https://www.google.com/search?q=%E3%83%8F%E3%83%83%E3%82%AFyumainaura&oq=%E3%83%8F%E3%83%83%E3%82%AFyumainaura&aqs=chrome..69i57j69i65.6066j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
GAS利用時の落とし穴7選

#新卒エンジニア、闇(GAS)の炎(トラップ)に身を焼かれる

新卒エンジニアが初めてフロントエンド開発にチャレンジして、ことごとく落とし穴にハマったのでGASの闇仕様について説明します
※本記事はウェブアプリケーション利用の話です

##GASとは
*Google Apps Script*の略でスプレッドシートの操作、サーバサイドの処理、Botの作成等[いろいろ](https://tonari-it.com/google-apps-script-manual/)できます。ただし、[いろんな制約あり](https://qiita.com/mistolteen/items/c206d5970ae1a6c7813d)で**(ここ重要)**
##成果物
[成果物](https://kanchan-c7adc.firebaseapp.com) (※GoogleChrome対応)
[成果物の詳細](https://speakerdeck.com/kanchan_1996/gas-plus-supuretudositodejian-yi-dbwozuo-ru)
自分の歌える曲をリスト化したもの(カラオケやデュエットで使う個人用)
スプレッドシートのデータをGASでJSONP形式にして、jQueryで処理させています
正直、本記事のメインテーマではないので興味があれば詳細をどうぞ

ここからが本題で、GASの闇について説明します
##承認編
GASは初回実行時に承認を求められます(詳細は後述のリンク)
私の成果物は「GASでJSONPを取得する」という仕組みがあります。この「承認」がうまくいかない場合、GASは実行されず、JSONPが取得できずメインの機能(歌える曲の一覧)が**表示されなくて死にます**＼(^o^)／ｵﾜﾀ
###【トラップ①】[GASをウェブアプリケーションとして実行する場合、最初に承認が必要になる](https://tonari-it.com/gas-script-approval/)
全ての元凶はコイツです。この仕様は初見狩りの役割を果たします
###【トラップ②】[再承認を求められることがある](https://qiita.com/hatakkkk/items/c7f0848d0978d71f405e)
これは自分もありました。**再承認が求められる＝いつの間にかサイトが表示できなくなっている**という恐ろしさです。
なぜかGASの闇仕様について書いてる記事って多くないんですよね。まさかみんなGoogleに口封じされて……~~おっと、誰か来たようだ~~
###【トラップ③】対応させたい全ブラウザで承認が必要
例えばパソコン版GoogleChromeで承認したとします。**だが、スマホ版Chromeは表示できずに死んでいる**(承認したOS、ブラウザが違うとGASが実行されません)
つまり、対応させたい対象の全ブラウザで承認しないといけません
###【トラップ④】承認したブラウザでキャッシュを消したら死ぬ
例えばスマホ版Chromeで承認していたとします。**だが、キャッシュを消すだけで死ぬ**
なぜGoogleは承認した判定をキャッシュ消しただけで消える仕様にしたのでしょう
###【トラップ⑤】iPhoneを持っていないなら、スマホ版Safariの承認ができないので死ぬ
ブラウザ毎で承認が必要＝iPhoneがないとSafariの承認は不可能
成果物にGoogleChrome対応と書いた理由がここにあります
##バージョンアップ編
あなたはGASのソースコードを編集し、保存し、そして実行したとします
**だが、実行結果は編集前と変わらない**
###【トラップ⑥】[ソースコードを変更してもバージョンを変えないとデプロイされない](https://qiita.com/YutakaArai/items/dcb14c94de1dde330fbd)

※試していませんが[回避する方法](https://kakakakakku.hatenablog.com/entry/2017/02/26/034115)もあるようです


##G Suite編
###【トラップ⑦】[Google Driveと同じ範囲でしか公開できない](https://support.google.com/a/answer/60781?hl=ja)
GASやスプレッドシートはGoogle Drive上のデータです。組織用アカウント(学校や会社等)で管理者が公開範囲を組織内部のみに設定していた場合、ウェブアプリケーションとして導入しても社外の人間はアクセスできません



##【結論】GASにサーバサイドのような使い方をさせるべきではない
個人利用の開発や最初に挙げたような利用方法は除いて、自分のウェブアプリにGASの機能を活用するのは大変リスキーです。
意外とGAS利用時の注意事項をまとめている記事がないと思いました。ほかにもこういう落とし穴あるよってコメントも待っています！


##【追記】

直接GASを呼び出さない方法なら大丈夫です。今回ならサーバがcronでJSONをスクレイピングして保存したものを公開すれば問題ないわけですね！なんか頭悪い方法！
Objective-C or Swift?

![Objective-C vs Swift](https://d32myzxfxyl12w.cloudfront.net/images/ckeditor_assets/pictures/724/content_Objective-C-or-Swift.png)
These days, Objective-C has fewer updates, most of which are for compatibility with Swift (e.g. easy import to the Swift code). Swift was created as an interoperable language, so it is completely compatible with Objective-C. This means it is possible to combine these languages in a project.

Programming in Objective-C will not become obsolete any time soon because, thanks to its 20 years of existence, it has a large code base, number of apps maintained, and third-party framework with Objective-C at its core. These solutions and libraries are unlikely to be rebuilt from scratch with a new language. This is the only reason why Objective-C is better than Swift to some extent. Thus, Swift is not going to replace Objective-C, especially at this stage.

####Recommendation for When To Use Objective-C 

There are two options where it could be still preferable to use Objective-C:

1- If an app has already been written in Objective-C and has a huge code base (100,000+ code lines)

2- If you are developing a framework use Objective-C

3- If C or C++ third-party frameworks are used extensively

####Swift Use Cases
![swift use cases](https://d32myzxfxyl12w.cloudfront.net/images/ckeditor_assets/pictures/723/content_Swift-Use-Cases.png)
LinkedIn, a social network for professionals moved from Objective-C to Swift in their native app development. In 2016, there was a great speech presenting the reasoning behind this decision for the company. The bottom line was that Swift was the better choice for smaller and start-up projects, as was easier to work with.

Another company, Lyft, an on-demand transportation company, uses Swift for its native iOS app development.

Other well-known apps like Yahoo Weather, Clear, Hipmunk, WordPress and Firefox iOS apps are also using Swift.

Objective-C, when compared to Swift, is a more outdated language and lacks modern tools and properties. Swift has many updates and ongoing growth plans, and the language receives great support from Apple. It is an easy-to-learn, secure, modern, and interactive programming language. Swift has simplified coding patterns as well as coding interface vs Objective-C. 

Follow this article to find out full information with a detailed [Swift vs Objective-C comparison](https://mlsdev.com/blog/51-7-advantages-of-using-swift-over-objective-c).
GoogleDrive連携できる Stack Edit とは by  @yumainaura / 使ってみた感想 /  Markdownエディタ / Github 連携


https://stackedit.io/app#

Googleドメインではなく連携先の様子

# まとめ

- MarkDownでサクサク書ける
- どうやらこいつはその名の通りエディタで、外部連携用のサービスらしい
- GoogleDriveやGityhubやBloggerに公開できるっぽいが、そもそも公開のときの入力が面倒そう、やってられない
- Macで画像のコピペアップロードが出来ない


# チュートリアルのポップ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4d758cd9-59ed-60d2-4c1e-ca3633c777b8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e6bc2744-390f-26f5-75fb-05766e88d0cb.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9782a290-5263-c894-db93-0d8116cd8e05.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/82969db2-0e88-df98-a31b-d1bb3c2efb52.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/363bf959-3dd5-8d92-6cda-d9b91723be61.png)

# おためし

markdownでいろいろ書ける

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0728f411-422a-60e4-13cc-d7bbec9d4d88.png)

上の方のボタンは全部Markdown入力用

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e91bec5d-f1f7-2737-cede-2ca926116649.png)

#広くできる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c0a4db3b-dc67-501b-bbb9-d06e193f3099.png)

#縦横に一番広げた編集エリア

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e6bf3ac9-3f8f-fdf0-8688-34fd0000a1d3.png)

#ショートカットキー

Shift+?で出てこない
ストレス

#全画面プレビュー

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7c07c97a-dc35-8550-f7d1-d17b8512beb7.png)

#こんなところにタイトルが？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/581d9049-5408-dcf7-ded4-06f3159b5f5e.png)

入力欄が意外な場所に。

#Macでのペーストでの画像アップロード

できないぽい

#Web公開できる？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/39c18272-4a89-5490-3940-084b38b84fb0.png)

何やら面倒そう

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/cc7797dd-7bf1-0a69-238b-c0d728e6acc7.png)

ばりばりと書いて、外部サービスに送るようっぽい？

#Githubを選ぶと？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/80eb2c99-3a76-f3b3-b11c-c785d47d1e5e.png)

こちらも何やら面倒そう

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/cb390748-8165-9371-168a-3059e3d54321.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
NimでNimの実行結果をマークダウンに出力する


# 概要

Nimのプログラムとその実行結果をMarkdownに出力するツールです。
まったく俺得&Adventカレンダーの穴埋め用。

## いわゆるサンプルコードとその結果を表示するアレ

```nim:sample.nim
echo "hello"
```

```shell-session
hello
```

こういうコードと実行結果をいちいち貼り付けるのも面倒だなーと思い、サンプルコードを

- そのまま実行するタスク
- コードブロックごとにコンパイルして、実行結果（標準出力）を拾い、Markdownを作成するタスク

といった作業をVSCodeのタスクとして用意して、気軽にテストコードの実行＆Markdownを生成するツールを作ってみました。

https://github.com/6in/kotsukotsu

## サンプルコードの形式

サンプルコードは、３つのパートから構成されます。

- 概要部
- import/共通部
- コードブロック（複数）

import/共通部と、各コードブロックを結合し、テンポラリファイルへ出力後、```nim c -r```で実行しています。

以下サンプルコード

```nim
# =============================
# overview: NimのXXX処理をコツコツと
# 説明1
# 説明2
# 説明3

# =============================
# imports: インポートモジュール
import json,strutils
import os
const message = "hello"

# =============================
# title: XXXX1処理
block:
    echo "test1 " & message

# =============================
# title: XXXX2処理
block:
    echo "test2 " & message

# =============================
# title: XXXX3処理
block:
    echo "test3 " & message
```

このソースをMarkdownで出力するとこんなカンジになります。
ブロックの区切りは、```# =============================```になっていますｗ

```shell-session
# 概要
NimのXXX処理をコツコツと
説明1
説明2
説明3

## 以下メモ

### XXXX1処理

"""nim
import json,strutils
import os
const message = "hello"

block:
    echo "test1　　" & message
"""

"""shell-session
(stdout)
test1 hello
"""

### XXXX2処理

"""nim
import json,strutils
import os
const message = "hello"

block:
    echo "test2　" & message
"""

"""shell-session
(stdout)
test2 hello
"""

### XXXX3処理

"""nim
import json,strutils
import os
const message = "hello"

block:
    echo "test3　" & message
"""

"""shell-session
(stdout)
test3 hello
"""
```

## 以下、出力サンプル

どっかで見かけたことありますね。

# 概要
NimのXXX処理をコツコツと
説明1
説明2
説明3

## 以下メモ

### XXXX1処理

```nim
import json,strutils
import os
const message = "hello"

block:
    echo "test1" & message
```

```shell-session
(stdout)
test1 hello
```

### XXXX2処理

```nim
import json,strutils
import os
const message = "hello"

block:
    echo "test2" & message
```

```shell-session
(stdout)
test2 hello
```

### XXXX3処理

```nim
import json,strutils
import os
const message = "hello"

block:
    echo "test3" & message
```

```shell-session
(stdout)
test3 hello
```
cmakeでCMAKE_C_FLAGSに設定した値が無視される

CMakeLists.txtの中でコンパイルオプションを指定しているつもりなのに、設定が無視される問題に遭遇しました。
コンパイルオプションの指定と、``add_subdirectory``コマンドの記載順序の問題でした。

## 問題

```cmake:CMakeLists.txtの抜粋
cmake_minimum_required(VERSION 3.12)
project(cmake_01)
set(APP_NAME example)
add_subdirectory(src)

# これらが無視される。なぜ？
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -O0")

set(CMAKE_CXX_FLAGS ${CMAKE_C_FLAGS})
set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})

```

```bash:make実行（-gしか指定されていない。無視されている？）
/usr/bin/c++   -I../include  -g   -o main.cpp.o -c main.cpp
/usr/bin/cc  -I../include  -g   -o target.c.o   -c target.c

```

## 解決

``add_subdirectory``コマンドを呼ぶ前に``CMAKE_C_FLGAS``らをセットしておく必要があったみたい。

```cmake:CMakeLists.txtの抜粋
cmake_minimum_required(VERSION 3.12)
project(cmake_01)
set(APP_NAME example)

# これらが無視される。なぜ？
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -O0")

set(CMAKE_CXX_FLAGS ${CMAKE_C_FLAGS})
set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})

# add_subdirectoryコマンドの呼出場所が拙かった。
add_subdirectory(src)
```

```bash:make実行（思ったとおりのオプションになった）
/usr/bin/c++   -I../include    -Wall -g -g -O0   -o main.cpp.o -c main.cpp
/usr/bin/cc  -I../include    -Wall -g -g -O0   -o target.c.o   -c target.c

```
Emacs をワンコマンドで透過させる

Emacs を透過させたい時、ありますよね。例えば TweetDeck を見ながらコーディングしたい時、アニメを見ながら原稿を書きたい時などなど。

そんなときのために作ってみました。
本体は [GitHub/cycle-frame-transparency](https://github.com/blue0513/cycle-frame-transparency) に置いておきます。

## What's This

こんな感じにパッと切り替えできます。
画像は Emacs の後ろに Google Chrome（GitHub） がある状態です。

![emacs-cycle.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/ef34d79f-e6ed-603b-a82d-a46e3c06f45a.gif)

## Usage

`init.el` に以下を記述してください。

```elisp
(add-to-list 'load-path "YOUR PATH")
(require 'cycle-frame-transparency)

;; お好みでどうぞ！
(global-set-key (kbd "YOUR FAVORITE KEY") 'cycle-transparency)
```

`M-x cycle-transparency` または設定したキーで発火させてください！

## Customize

透明度を変更したいときは、以下を記述してください。

```elisp
;; デフォルトは 80
;; 数値が小さいほど、透明度が高いです
(setq cft--trasparent 20)
```
エラーを吐いてるscriptがどこにアタッチされているのか

https://qiita.com/k-kurikuri/items/9c9781c8ef4f4b6c4e2c

この記事を参考に対応。

エディター拡張しないと、けっこう使いそうな機能もないというのは、
なんともさみしい。
UnityでOculus Integrationをインポートすると表示される「VR: OpenVR Error!」の解消法

とりいそぎメモ。
UnityでOculus Integrationをインポートし、シーンを再生すると、以下のようなエラーが表示されることがある。

```
VR: OpenVR Error! OpenVR failed initialization with error code VRInitError_Init_PathRegistryNotFound: "Installation path could not be located (110)"!
```

このエラーが表示されていてもビルドは可能だが、気になるので調べてみた。
結論としては、「[VR Samples](https://assetstore.unity.com/packages/essentials/tutorial-projects/vr-samples-51519)」をプロジェクトにインポートすると、エラーが解消される。
Ubuntu 18.10  に Docker-ceを導入する

18.10はいろいろサードパーティーのものまで考えると用意されていないケースが非常に多い気がする。Dockerもやっぱり用意されてないので dockerのマニュアル通りに実行してしまうと

```
❯❯❯ sudo apt install -y docker-ce
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
パッケージ docker-ce は使用できませんが、別のパッケージから参照されます。
これは、パッケージが欠落しているか、廃止されたか、または別のソース
からのみ利用可能であることを意味します。

E: パッケージ 'docker-ce' にはインストール候補がありません
```

と寂しい感じになります。

# 修正点

* https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce-1

```
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```

の現在のUbuntuのバージョン確認しているところを `bionic` 固定で設定します。

# 導入方法

コマンド羅列すると以下のようになります。

```
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt update
sudo apt install docker-ce
```

以上


# おまけ

ローカルPCでの導入しているので一般ユーザでもdockerコマンドを利用できるように設定

```
sudo gpasswd -a $(whoami) docker
sudo chgrp docker /var/run/docker.sock
sudo service docker restart
```
* ログインしなおせば有効になる
CentOS7でtelnetを有効にする

# はじめに
telnetは汎用的な双方向通信である。サーバーとクライアントの間でテキストベースの通信を行うことができる。非常に単純な通信であり暗号化もされておらず、セキュリティ上問題があるため現在は非推奨となり、sshに置き換えられている。実際、macOSXにおいても、High Sierraからtelnetやftpはなくなり、使用する場合はhomebrewやmacportsでinetutilsをインストールしなければならない。しかし、製造業など現場によってはtelnetでないといけないようなケースもままあり、完全には駆逐されきっていないのが実際である。

今回、現場で利用しているtelnetサーバに対し、特定の条件が揃うとうまく接続できないケースがあった。今回、そのケースを再現および確認するためのメモを残す。

# telnetサーバを立てるまで
環境は、CentOS7系とする。

```text
# telnetクライアントおよびtelnetサーバの確認
[root@localhost ~]# yum list installed | grep telnet
# telnetクライアントおよびtelnetサーバのインストール
[root@localhost ~]# yum -y install telnet telnet-server
# 自動起動の有効化
[root@localhost ~]# systemctl enable telnet.socket
# 自動起動の確認
[root@localhost ~]# systemctl list-unit-files | grep telnet.socket
telnet.socket                               enabled
# telnet起動
[root@localhost ~]# systemctl start telnet.socket
# Firewall設定。アクセスを許可するサブネットは適宜環境に合わせて指定する。
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule "rule family="ipv4" source address="192.168.179.0/24" service name="telnet" log prefix="telnet" level="info" limit value="1/m" accept"
# Firewall設定反映
[root@localhost ~]# firewall-cmd --reload
```
これでtelnetによる接続が可能となる。
Rails・コントローラで使うインスタンス変数とローカル変数の違い

Railsチュートリアルの第8章で疑問が生じた。
それはなぜ、Sessionsコントローラにおける変数の定義を、インスタンス変数ではなくローカル変数で行うのか？というところだった。

以下のコードを見るt、「@user」ではなくローカル変数「user」に代入を行っている。

```sessions_controller.rb
class SessionsController < ApplicationController
  def new
  end

  def create
  	user = User.find_by(email: params[:session][:email].downcase)
  	if user && user.authenticate(params[:session][:password]) 
  		log_in user
  		# redirect_to user_url(user) と同じ意味
  		redirect_to user
  	else
  		flash.now[:danger] = 'Invalid email/password combination'
  		render 'new'
  	end
  end

  def destroy
  end
end
```
例えば、Usersコントローラーでは、インスタンス変数の@userに代入を行っている。

インスタンス変数とローカル変数を使うケースの違いはどこにあるのだろうか？


```users_controller.rb
class UsersController < ApplicationController

	def show
		@user = User.find(params[:id])
	end

  def new
  	@user = User.new
  end

  def create
  	@user = User.new(user_params)
  	if @user.save
      log_in @user
  		flash[:success] = "Welcome to the Sample App!"
  		redirect_to @user
  	else
  		render 'new'
  	end
  end

  private

  	def user_params
  		params.require(:user).permit(:name, :email, :password,
  																	:password_confirmation)
  	end
end
```

調べた結果、[こちら](https://teratail.com/questions/99281)に書いてありました。

曰く、

>Railsのコントローラでインスタンス変数を使用するのは、以下の場合です。
・メソッド間でのデータの受け渡し(典型的には、before_actionでデータをロードしておくとか)
・ビューへのデータの受け渡し

Sessionsコントローラの場合、「メソッド間でのデータの受け渡し」も「ビューへのデータの受け渡し」もないので、ローカル変数で十分、ということになる。
（なのでおそらく、インスタンス変数を使っても正常に動く）

[参考リンク](https://teratail.com/questions/99281)
c0ffee

joke for linux terminal.
辞書ファイルから、16進数で表せる単語を探します。
例えば、CAFE C0DE BEEF C0FFEE DEADBEEF等です。

私のC++の腕が未熟なため、Cと、C++の混交したプログラムになっています。
（因みに、CとC++の混交したコードは、Better Cと言うそうです。）

辞書ファイルは、英辞郎1446以下のバージョンのファイル、
シンプルな、英単語で始まって0x0aで終わる行の並びで成り立つファイルなどです。

See:
https://qiita.com/fygar256/items/7b4f090489eb1563238c

```c0ffee.cpp
/*
	16進数で表せる英単語を返す。
	Usage: c0ffee [-d=dicfile]
	to compile: c++ c0ffee.cpp -o c0ffee
*/
#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<ctype.h>
#include	<iostream>
#include	<algorithm>
#include	<vector>
#include	<string>

using namespace std;

char hdc[]="O*********ABCDEF";

char *getword(FILE *fp,char *w) {
	int idx;
	int c;

	idx=0;
	c=fgetc(fp);
	if (c==EOF) return(NULL);
	if (c==0x81) fgetc(fp);
		else ungetc(c,fp);

	while(1) {
		c=fgetc(fp);
		if (c==EOF) return(NULL);
		w[idx]=(unsigned char)c;

		if (c==' ') {
			int	c2;
			c2=fgetc(fp);
			if (c2==EOF) return(NULL);
			if (c2==' ') c='\t';
			else ungetc(c2,fp);
			}
		if (c=='(') {
			while(1) {
				c=fgetc(fp);
				if (c==EOF) return(NULL);
				if (c=='\n') break;
				if (c==')') continue;
				}
			}
		if (c=='\n'||c=='\t'||
			c==','||c==':'||c=='{') break;
		idx++;
		}
		w[idx]='\0';
		ungetc(c,fp);
		while(1) {
			c=fgetc(fp);
			if (c==EOF) return(NULL);
			if (c=='\n') break;
			}
		if (w[idx-1]==' ')
			w[idx-1]='\0';
		return(w);
}

int isnullstring(char *s) {
	while(*s!='\0') {
		if (isalpha(*s)) return(0);
		if (*s!=' ') return(1);
		s++;
		}
	return(1);
}
		
int ishdc(char c) {
	int	i;
	for(i=0;i<=0xf;i++)
		if (toupper(c)==hdc[i]) return(1);
	return(0);
}

int ishdw(char *s) {
	while(1) {
		if (*s=='\0') return(1);
		if (ishdc(*s)==0) return(0);
		s++;
		}
}

int	main(int argc,char *argv[])
{
	FILE	*fp;
	char	w[1000];
	char	defaultdic[]="EIJIRO-1446.TXT";
	char	*dicfile=defaultdic;
  vector<string> data;
	string	str;

	if (argc==2&&(strncmp(*(argv+1),"-d=",3)==0))
			dicfile=&((*(++argv))[3]);

	fp=fopen(dicfile,"r");
	if (fp==NULL) exit(1);
	data.clear();
	while((getword(fp,w))!=NULL) {
		if (ishdw(w)&&isnullstring(w)==0) {
			str=w;
			for(auto & c:str) c=toupper(c);
			data.push_back(str); 
			}
		}
	fclose(fp);

  sort(data.begin(), data.end());
  data.erase(unique(data.begin(), data.end()), data.end());

	for(auto i:data) {
		replace(i.begin(),i.end(),'O','0');
		cout << "0x" << i <<endl;
		}

	exit(0);
}
```
git-grepの使い方

## この記事なに？

- gitで管理されているソースだけgrepするのに使える`git-grep`コマンドを紹介する記事
- IDEのgrepも便利だけど、Githubのプルリクに貼るのには不便
- でも、`git-grep`コマンドであれば、プルリクに貼ることもできて便利！！

## 使い方

公式ドキュメントはこちら
https://git-scm.com/docs/git-grep

**行番号を表示する場合はこちらを実行しておく**

```bash:出力結果に行番号を表示する
$ git config --global grep.lineNumber true
```

### 正規表現を使いたい

**-E オプション**

```bash:例
$ git grep -E "regexp"
```

### 複数の単語が絡んだ文字を検索したい

**--and オプション**

```bash:例
$ git grep -e 'first word' --and -e 'second word'
```

### 単語でマッチングさせたい

**-wオプション**
単語違いを弾くことができる

```bash:例
$ git grep -w 'service'
```

```bash:input
service
services
service/hoge
service-hoge
```

```bash:output
service
service/hoge
service-hoge
```

### ファイル名のみ出力させたい

**-l オプション**
指定した単語を含むファイル名のみ出力できる

```bash:例
$ git grep -l 'hoge' 
```

### 大文字・小文字両方検索したい

**-i オプション**
大文字・小文字両方検索できる

```bash:例
$ git grep -i 'hoge'
```

### 特定のディレクトリのみ検索したい

**-- オプション**
特定のディレクトリのみ検索できる

```bash:例
$ git grep 'hoge' -- 'app/controllers/'
```

### 特定のディレクトリを除外したい

**-- オプション**でディレクトリの指定に `':!'` を付ける
特定のディレクトリだけ除外できる

```bash:例
$ git grep 'hoge' -- ':!app/assets/'
```
scraping


イメージ

1agentでベージをとる
2 searchで要素の塊をとる
3 eachの中で、atで目的の要素をとる

※.classNameを指定可能


```ruby

require 'mechanize'
agent = Mechanize.new
 # agentというインスタンスを作成すると getメソッドは使えるようになる
page = agent.get("https://www.health.com/")
elements = page.search('article')

list = []

elements.each do |el|

puts image = el.at('.media-img img').get_attribute('src')
puts "image"
 title = el.at('h3 a').inner_text

 list << [image,title]
end


puts list

```
Sparkのローカリティと設定値について

Sparkのパフォーマンスに影響を与えるローカリティについてまとめてみました。

# Sparkのローカリティ
Sparkではジョブがタスクに分解されて各executorで実行されますが、その際に入力されるデータがタスクに近い（ローカリティが高い）ほど転送コストが少なくなり素早く実行を開始することが出来ます。

ただ、一番近いexecutorのリソース（VCoreやメモリなど）が足りない時は、ローカリティが高い物から順番にリソースに余裕のあるexecutorを探して実行を行わせます。


# Sparkに登場する各ローカリティ
左の物ほどローカリティが高く転送コストが少なく済む傾向があります。

```
[PROCESS_LOCAL] > [NODE_LOCAL] > [RACK_LOCAL] > [ANY]
```

## PROCESS_LOCAL
Sparkアプリケーションを実行中のJVM上にデータが存在する状況です。

## NODE_LOCAL
データが同じノード（サーバ）上に存在する状況です。
JVMプロセス間で転送が行われます。

## RACK_LOCAL
データが同じラック上に存在する状況です。
ノードからノード間でネットワーク（スイッチ）を経由した転送が行われます。

## ANY
データがネットワークのどこかに存在する状況です。
ノードからノード間でネットワークを経由した転送が行われます。

## NO_PREF
上の比較に存在しないローカリティです。
ローカリティを特定出来ない状況です。
この場合Sparkはローカリティを考慮しないで実行を行います。

# ローカリティ関連の設定値
Sparkがタスクの実行の際にそのローカリティで実行を待機する時間をコンフィグから調整することが出来ます。
3秒たってもそのローカリティで実行出来ない場合は次の優先度のローカリティで実行を待機します。

デフォルトだと３秒に設定されているので`RACK_LOCAL`に移行するのに９秒かかることになります。
※ 実際には待機する時間＋転送時間がかかります

```
spark.locality.wait
spark.locality.wait.node
spark.locality.wait.process
spark.locality.wait.rack
```

# Spark Streamingでのローカリティ
ストリーム処理の場合、タスクが`PROCESS_LOCAL`以外のローカリティで実行される時は安定して処理を継続できなくなるできなくなる可能性があります。
アプリケーションや実行環境の調査を行ったほうが良いと思います。

# 参考資料
https://spark.apache.org/docs/latest/tuning.html#data-locality
https://stackoverflow.com/questions/36616897/task-data-locality-no-pref-when-is-it-used
https://spark.apache.org/docs/latest/configuration.html#scheduling
Ansibleインストール WSL Ubuntu18


Ansibleを試したいのでインストール
※ トラブルは特になし。

# 手順
本家のインストール手順に沿って実施
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt-get install ansible

# software-properties-common って？
add-apt-repositoryを含むパッケージ
add-apt-repositoryは非公式リポジトリを追加するために必要(※1)。

※1: 今回の例ではppa:ansible/ansibleを追加するために必要なコマンド

※2: 12.04の場合は、「python-software-properties」パッケージの中にあるため、add-apt-repositoryを利用したい場合には 12.04以前はsudo apt-get install python-software-propertiesが必要


# 環境
Ubuntu18.04.1 LTS on WSL on Windows10 Home

# 引用
https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#latest-releases-via-apt-ubuntu
YARN上で動くSparkからGCログを取得する方法

JavaのアプリケーションでGC関連の調査を行う際は、GCログを吐き出させてログをGC Viewerなどで分析すると思います。
ただ分散処理環境のyarnでは、実行環境が分散している関係上設定方法に少し癖があります。
今回はYARNで実行されるSparkから具体的なGCログの取得方法について説明します。

# SparkにGCログを出力させる
spark-submitを行う際に書きのオプションを渡すことでexecutorのJVMにGCログを出力させることができます。
driverの場合も似た感じで渡せます。

```bash
spark2-submit \
    --conf "spark.executor.extraJavaOptions=-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps" \
    --class ExampleSparkMain \
    ExampleSpark.jar
```

# Spark executorの標準出力を取得する

GCログはexecutorの標準出力に出力されます。
`yarn.log-aggregation-enable`が有効になっていれば
Sparkを実行しているノードのローカルに出力されます（Spark Web UI上からアクセスする事もできる）。

ローカルへの出力ディレクトリですがyarnの`yarn.nodemanager.log-dirs`という値で設定が行われているので下記の方法で確認を行います。

* `yarn-site.yml`を見る
* `hdfs getconf -confKey yarn.nodemanager.log-dirs`でパラメータを取得

自分が試した環境はCDH5だったのですが、`/etc/hadoop`配下の`yarn-site.yml`には記載がなく、CDHがインストールされているディレクトリの`yarn-site.yml`を読むことでディレクトリが判明しました。

ディレクトリ配下のstdoutというファイルにgcログが出力されているのでこれをgc viewerなどで読み込ませます。

<img width="1000" alt="gc viewer" src="https://qiita-image-store.s3.amazonaws.com/0/189239/af83d69e-5b9a-79fb-6252-e556ca5d33a9.png">
enebular developer Meetup で人生初LTをした話


※技術要素がほぼほぼ無い記事です……！

enebularに触ってみた感想と人生初LTをした時の感動を綴っています。

#気軽にIoT体験ができる「enebular」

[enebular（エネブラー）](https://enebular.com/ja/child/about.html)は、国内外の主要クラウドサービスを簡単に連携できるクラウド連携サービスです。

> エッジとクラウドにまたがるIoTアプリケーションを開発し、様々なデバイスへ迅速にデプロイ、膨大な量のデータを可視化やAIにより利活用することで、IoTアプリケーションの最適な運用を支援します。

「enebular」という言葉は、"nebular"（星雲＝星の数ほどたくさんある）と "enable"（可能にする）が組み合わさってできたそうです。おしゃれでなんだかエモいですね……！

#めっちゃ軽く触ってみた感想

![スクリーンショット 2018-12-25 23.30.38.png](https://qiita-image-store.s3.amazonaws.com/0/263775/edd3eed9-6f42-d24f-09c0-f3b6a551ab6e.png)

一番最初はTwitterと連携してみましたー！

カラフルなブロックを並べてAPI Keyやらなんやらを打ち込むとあっという間に様々なクラウドやマイコンなどをつなげることができるので、直感的で分かりやすくて取っつきやすいです...！

アドベントカレンダーはもちろん、Qiita上にたくさんのenebular記事があって、いつも読むのが楽しいです。

#enebular developer Meetup でLTしました

そんな中、11月にenebular developer Meetup で登壇することに。

LTイベントはたまに参加していて、こんなこともできるんだ！すごいー！と思いながら登壇者の方々の話を聞いたことはあるのですが、登壇するのは人生初で、正直何を話せばいいのか分からなくてめちゃくちゃ悩んで記憶があります（笑）

結果、発表したのは「enebluarとinstagramを使って誕生日プレゼントのおねだりをしたかったけど、できなかった話」。

インスタが大好きなのでなんらかの形で使いたい...！と思っていたのですが、まったく何もできずにありのままに「何もできなかったです...ううう」と報告するできなかった系LTになりました。

instgramのAPIはそもそも利用するのが厳しいみたいですね……。やり方が間違っているというよりは仕様的に難しいということを教えてもらいました！初心者の私としては、やり方が間違っているのか、そもそも難しいのかということ自体見極めるのが困難だったりするので、知ることができて嬉しかったです。

他の登壇者の方たちは、技術的にも内容的にも勉強になるものが多く、勉強になることばかり。

人生初LTで全然できなかった話しか言えなかったなぁと思っていたのですが、「できなかったLTは最近減ってきた気がするけど、頑張っている姿とかみていると応援したくなるし、発表することで分かる人が教えてくれるからすごくいいと思うよ！」と言ってもらい、なんだか胸がじーんとしました。

#学び合い精神と温かさにめっちゃ感動

今までは、しっかりしたものを作らないとLT発表しづらいなぁと思っていました。

でも、「さまざまなレベル感がある中で、分からない人は積極的に分からないところを聞き、分かる人は惜しげも無く知識やスキルを共有してくれる」ような「ものづくりできる人をみんなで増やそうよー！」って言い合える学び合いの精神のようなものを感じて、参加することができてすごく嬉しかったです。

私にとっての初LTはウフルの方々や、その場にいた参加者のみなさんのおかげですごく温かい経験になりました！ありがとうございました！

enebular、これからも使っていきたいです！
KafkaDirectStreamで正規表現を使う方法と注意点

KafkaDirectStream生成する際にはコンシュームするtopicの情報を渡すと思いますが、
トピック名には正規表現を設定することができます。

# コード例(KafkaDirectStream)
`log20181201`や`log20181202`などのトピックが存在する場合は下記のように設定します。

```scala
KafkaUtils.createDirectStream(
      sparkStreamingContext,
      PreferConsistent,
      SubscribePattern[String, String]("log.+".r.pattern, kafkaParams))
```

# 注意点

## 順序が重要な処理では使えない
上記の例で`log20181201`と`log20181202`に同時にデータが入った場合topicを区別せずにコンシュームするためtopic間で順序を考慮しなければならない場合はこの方法は使用することが出来ません。

## topicを削除するとオフセットのコミットで落ちる
KafkaDirectStreamでは取得済みオフセットの情報をKafkaにコミットしているのですが、その際には全く動きのなかったtopicの情報もコミットしています。
そのため、使用していない昔のtopicでも削除を行うと正規表現の対象になっているとコミット不能になり落ちる場合があります。

上記の様な問題に当たる場合Kafkaのauto.commitパラメーターをfalseに設定して
下記のようにオフセットに変化のあったもののみを明示的にコミットすると良いです。

```scala
val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
val commitOffsetRange = offsetRanges.filterNot(x => x.untilOffset == x.fromOffset)
kafkaDirectStream.asInstanceOf[CanCommitOffsets].commitAsync(commitOffsetRange)
```
UbuntuベースのDockerでタイムゾーンを設定する

Ubuntuイメージのタイムゾーンを日本に変更します。

```Dockerfile
FROM ubuntu:16.04

# Shift timezone to Asia/Tokyo.
RUN apt-get update && apt install -y tzdata && apt-get clean && rm -rf /var/lib/apt/lists/*
ENV TZ Asia/Tokyo
```

JSTに変更されました

```bash
$ docker build . -t ubuntu-tz
$ docker run -it ubuntu-tz /bin/bash
root@a73c2ad58201:/# date
Fri Dec 28 17:17:09 JST 2018
```

ついでにロケールも日本語(UTF-8)に設定すると日本語環境で問題の無いイメージになると思います。

```Dockerfile
FROM ubuntu:16.04

# Shift timezone to Asia/Tokyo.
RUN apt-get update && apt-get install -y tzdata && apt-get clean && rm -rf /var/lib/apt/lists/*
ENV TZ Asia/Tokyo

# Set local to jp.
RUN apt-get update && apt-get install -y language-pack-ja && \
    update-locale LANG=ja_JP.UTF-8 && rm -rf /var/lib/apt/lists/*
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
```

```bash
$ docker build . -t ubuntu-tz-locale
$ docker run -it ubuntu-tz-locale /bin/bash
root@77ee4d90670a:/# date
2018年 12月 28日 金曜日 17:22:46 JST
```
JavaとPythonで同じようにbytesを表示する方法

データストアに格納したバイナリをPythonとJava（Scala）で取得や加工を行う際に、
どちらもbytesの表示のされかたが異なり比較がめんどくさかったので同様に表示される方法を調査しました。

## Python

```Python
print(b"abcde".hex())
```

## Java
printlnではbyte[]の中身を表示させることが出来ずfor文で一要素づつ表示させるとPythonと異なり符号付きになるためなかなかめんどくさかったのですが下記で同じように表示できます。

```Java
import java.math.BigInteger;

byte[] bytes = "abcde".getBytes();
System.out.printf("%x%n", new BigInteger(1, bytes));
```

どちらも下記のように出力されます。

```
6162636465
```
Google Apps Script 指定したカラムの最終行の番号を返す関数を自作してみた


年末も年末とて業務で、Node.jsでJSON APIを作ったり、Google Apps Scriptでデータ取得を自動化したりとしていました。
その中で、頻繁に使っていた、指定したカラムの最終行の番号を返す関数を自作して、結構使えたので、こちらに共有しておきます。
Google Apps Script側で用意されている関数で、シート全体の最終行を取得する事はできるのですが、
指定したカラムの最終行を取得して、番号を返してくれる関数がなかったので、自作しています。

下記がその関数になります。

```js

function researchColumnsEmpty(str){ //A:Aのような形でカラムを指定したら、そのカラムの最終行を取得してくれる。
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetData = sheet.getSheetByName(`シート名`);
  var range = sheetData.getRange(str);
  var array = range.getValues();
  var count=0;
  array.forEach(function(arr){
    if(arr[0]) count++;
  })
  return count;
}
```

この関数では、指定したカラムにある全てのデータを取得後(配列で返ってくる)、イテレータで処理する事で、指定したカラムのデータの数を数えてくれるように処理しました。これにより、実質、最終行を取得する事ができます。

##使い方

```js
function setFinalValue(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetData = sheet.getSheetByName('シート名');
  var url = 'https://high-price-checker.herokuapp.com/finalvalue';
  var data = UrlFetchApp.fetch(url);
  var finalValueJson = data.getContentText('UTF-8');
  var finalValues = JSON.parse(finalValueJson);
  var Lastrow = researchColumnsEmpty('E:E'); //自作した関数の呼び出し
    var j = 0;
    for(i=Lastrow;j<finalValues.finalvalue.length;i++){
      var finalValue = finalValues.finalvalue[j];
      sheetData.getRange(i,5).setValue(finalValue);
      j++;
    }
}

```
最終行を'E:E'のように指定すると、そのカラムEの最終行を取得して、integerで返してくれます。for文と組み合わせる事で、新たに取得してきたデータを指定したカラムの最終行から自動で入力したりできます。
Pythonで競プロに挑む日誌 vol.27 ~正規表現~

# 現在の目標
* 2018年度内に緑色を取得する
 * [ABC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の A, B 問題を全部解く
 * [ABC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の C 問題を全部解く
 * [AGC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の A 問題を全部解く
* (水色になったら, [APG4b](https://beta.atcoder.jp/contests/apg4b) で C++ にも手を出す)

# 解いた問題
[ABC-B ： Postal Code](https://atcoder.jp/contests/abc084/tasks/abc084_b)

## 結論
正規表現で繰り返し回数を指定するときに, 変数を単純に使うことはできない. また, 正規表現を使いこなすにはもっと文字列操作の勉強が必要そう.

## 考え方
「(A 個の数字)(-)(B 個の数字)」というフォーマットになっているか確認すればよい, というシンプルな考え方です. 

```answer.py
# coding: utf-8
import re
A, B = map(int, input().split())
S = input()
 
p_regex = re.compile("\d"*A + "-" + "\d"*B)
mo = p_regex.search(S)
 
if mo:
    print("Yes")
else:
    print("No")
```
「r"\d{A}" + "-" + "\d{B}"」と書きたかったのですが, それでは繰り返し処理できないみたいです. そのため, * で繰り返すことにしました. 

ほかの方の気になる回答がコチラ

```another.py
# coding: utf-8
import re
A, B = map(int, input().split())
S = input()
 
pattern = r"\d{{{}}}-\d{{{}}}".format(A, B)
mo = re.search(pattern, S)
 
if mo:
    print("Yes")
else:
    print("No")
```
考え方は同じだと思うのですが, 「"\d{{{}}}-\d{{{}}}"」の意味がよくわからない...一番内側の {} は format の変数を指定するためのもので, 一番外側が繰り返しのための {} とすると, 真ん中の {} はナニモノ?

# むすび
文字列操作をもっと勉強しよう.
python manage.py migrateが効かない場合の対処法

Herokuで既存モデル定義済みの際に、以下のエラーが出でしまいました。

詳細：[python manage.py migrateが効かない場合の対処法](http://www.love-activities.com/article11/)

```コマンドプロンプト
django.db.utils.programmingerror
もしくは
django.db.utils.operationalerror
```

また、no migrations to applyとの警告もありました。

対策ですが、下記にまとめました。

[python manage.py migrateが効かない場合の対処法](http://www.love-activities.com/article11/)

以上。
プロデューサードリブンな環境で開発チームが疲弊しないためには

# これは何？
半年くらいかけて、プロデューサーの気持ちで案件が決まっていた状況から、
開発チームのプロダクトオーナーとしてKPIを見ながら意思決定できるように改善していった話。

# 前提
<img width="753" alt="スクリーンショット 2018-12-28 17.32.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/235232/4f24b5a0-03f0-6dae-35bc-85e139cfdc8d.png">

ビジネスサイドと開発サイドが組織としてしっかり分かれており、プロデューサーとプロダクトオーナーがコミュニケーションとりながら機能開発の優先度を決めている


# ある日のこと

プロデューサー　「ここのUIをこのアプリみたいな感じにしたいんだよね。こうしたほうが**ユーザー的にも使いやすいし、CVRも上がると思うんだよね**」

開発チーム　「確かにおっしゃる通りですね。バックログが詰まっているので、３スプリント後、３ヶ月後リリースならいけそうです」

プロデューサー「OK.それでいこう」

３ヶ月後

開発チーム　「リリースしました！」

プロデューサー　「お疲れ様。あれから他のアプリとかも見てみたんだけど、**やっぱり〜〜な機能もあったほうがユーザー的に便利じゃないかと思うんだよね。**ユーザーインタビューしていても手応えあるし。実際CVRも伸び悩んでるし、次は〜〜を作ろう」

開発チーム 「**今回作ったものの仕様を大きく変更することになりますが、、、**」

プロデューサー 「あの時の情報だとそれがベストだと思ったけど、３ヶ月間で色々ユーザーと話したり、色々な人の指摘とかも受けて、これをやるべきだと思うんだよね」

開発チーム 「はあ、、、（リリースしたばっかなのにな、、、）」

# 問題とアプローチ
事業サイドが強い組織だと、上記のようなことが結構あるかと思います。

エンジニアから見て、上記のような**プロデューサードリブン（要するにお気持ち）で案件が決まると、開発チームの納得感が醸成しにくく、「俺ら、やっていること社内外注じゃね？」と次第に疲弊していってしまいます。**

これを**「プロダクトのKPIを民主化する」**というアプローチで解決していきます。


# STEP1 プロデューサーに寄り添う
こういう現場に入るといきなり改革を始めてしまいがちですが、何より大事なのは**まずプロデューサーに寄り添うというところです。**

プロデューサーはエンジニアから見ると直感的に動いているように見えても、実際は細かく数字と向き合い、投資家や上司に対して資料を作成してレポートしています。
なのでプロデューサー単独だとデータを把握している場合が意外とあります。

ただ**プロデューサーは往々にしてKPIの数値はあくまでステークホルダーにレポートするためのもので、開発チームはそれほど関心がないという認識をしがちです。**

なので、まずはKPIに興味があるという姿勢を出し、Excelで頑張ってレポート用のデータを作っていたのを、BIツールなど（例　re:dash,Looker,Domo）などを駆使して手間なく、見やすくすることから始めていきましょう。
そうすることでプロデューサーのレポートのコストも減り、「あっ、エンジニアもKPIに関心あるんだ」ということが伝わり、同じ目線に立って会話することに一歩近づきます。

# STEP2 KPIを民主化し、息を吸うようにデータを見る

次にいよいよKPIを民主化していきます。

大きく２つ必要なことがあり

- データを誰でも低コストで見ることができる（ダッシュボードのデザインにはこだわるの大事）
- 誰でも議論を見れる、参加できる場を作る

が重要です。

個人的にアンチパターンだと思っているのが**SQL書いて、slackなどに日時でデータを流して、「ほら、これで毎日モニタリングできているでしょう。」ということ、大体の場合、１週間くらいは面白がって見ますが、結局皆読み飛ばすようになります。**

なぜかというと、そこには解釈がないから。**データを見て、それが何を表すのか考えることは主体者が思っている以上に他のメンバーにとって負荷が高いものです。**

なのでチームに広めていくときにはデータを見えるようにするだけではなく、**必ず主体者が解釈を添えてレポートする会議体を設定しましょう。**
最初は主体者の解釈を中心に議論していって、２〜３ヶ月くらいかけて生のデータから議論が生まれるように進めていきます。


# まとめ

何かの機能を開発するときに、「ここのデータってどうなってるんだっけ？」、「リリース後にモニタリングする指標何だっけ？」という話題が自然に出てくれば勝ちです。

この問題の本質は意思決定する時にメンバー間の情報の非対称性が大きいということで、それにより納得感が損なわれるというものです。

同じ目線に立って納得感を持って進めるためには

- 背景の共有（お互い、何をしていて、何に困っているかの共有）
- 事実の共有（同じデータを見る）
- 思考プロセスの共有（データから得られた解釈を共有する）

の順に積み上げていくことが重要です。

最終的にはプロダクトの価値やビジョンをプロデューサーと開発チームが高次元で共有して開発を進めていくのが望ましいのですが、いきなりは難しいので**まずはKPIというプロトコルを通して、同じ目標を見据えるところから始めるのがおすすめです。**

プロデューサードリブンな状況では、開発チームは「プロデューサーの気持ちでやることが変わる」と思っていますが、プロデューサー側は「エンジニアはユーザー、マーケットのことを何も分かっていない」と思っているものです。
まずはその状況を受け入れて、お互いに背景を共有して歩み寄り、同じ事実のもと、同じ目標を見ていくことで状況を改善していけると思います。
FlaskでCallback APIの作り方

# POST方式

```
@mod.route("/PATH/<param1>", methods=['POST'])
def func1(<param1>):
    XXXX = request.form.get('XXXX')
    ......

```

# GET方式

```
@mod.route("/PATH>", methods=['GET'])
def func2():
    XXXX = request.args.get('XXXX')
    ......
```
VirtualBoxにGuestAdditionsをインストールする

VirtualBoxにGuestAdditionsをインストールする
```
yum -y install epel-release
yum -y groupinstall "Development Tools"
yum -y install dkms bzip2 gcc make kernel-devel kernel-headers
```
ゲストOS(CentOS7)をシャットダウン

VirtualBoxマネージャーで「設定」の「ストレージ」を開き、VBoxGuestAddition.isoを選択。
右側のCDアイコンをクリックし、「仮想ドライブからディスクを除去」をクリック。

ゲストOS（CentOS7）を起動する

完全に起動しきってから、メニューバーの「デバイス」から「Guest Additions CD イメージの挿入」を選択。
選択できたら後は誘導に沿って実行する。

下記URLの「3.Guest Additionsをマウント」、「4.Guest Additionsをインストール」を実行する。
https://qiita.com/homines/items/946acbf7b0f043887e64

# 参考
VirtualBox ホストOSとゲストOS(仮想マシン)間でマウスを移動する。: 現役SEの電子録
http://clubsepc.seesaa.net/article/229489943.html

Virtualbox上のCentOSにGuest AdditionsをインストールしてWindowsとフォルダーを共有させる - Qiita
https://qiita.com/homines/items/946acbf7b0f043887e64

Guest Additions のインストールが開始できない 『仮想光学ディスク C:\xxx\VBoxGuestAdditions.iso をマシン XXXに挿入できません。このディスクを強制挿入してみますか？』: へっぽこSEのメモメモ
http://heppoen.seesaa.net/article/442542657.html
i18n-debug の基本的な使い方

i18n で参照しているパスを調べてくれる [i18n-debug](https://github.com/fphilipe/i18n-debug) の基本的な使い方が、
ググってもよく分からず、@takumiabe さんに聞いてようやく分かったので、
他の人が同じ調べ物をしなくても済むように上げてみます。

```
Ruby: 2.5.3
Rails: 5.2.2
```

## やりたいこと

```haml:_form.html.haml
= form_with url: user_sessions_path, local: true do |f|
  .field
    = f.label :auth_name
    %br/
    = f.text_field :auth_name
  .field
    = f.label :password
    %br/
    = f.password_field :password
  .actions
    = f.submit 'ログイン'
```

という、「model を指定しない」簡単なログインフォームを作ろうとしていたが、

```yml:config/locales/hoge_ja.yml
ja:
  auth_name: 名前またはメールアドレス
  password: パスワード
```

と書いても、`auth_name`が、
`名前またはメールアドレス`ではなく、
`Auth Name`で表示されたりしてしまう。

yml の翻訳のパスが違うために en が出てるんだろうとは思うものの、
どう書くべきかの情報が見つからなかった。

#### 安易な解決策

```haml:_form.html.haml
　= label_tag t(:auth_name)
```

と書けば出たけど、アホくささが拭えない。

## 参照されている翻訳のパスを調べる
### `i18n-debug`をインストール

`i18n-debug`で調べられるとのことなので、入れてみる。

```:Gemfile
group :development do
  ・・・
  gem 'i18n-debug'
end
```

を追加して`bundle install`。

### 翻訳参照ログ出力の設定

```ruby:config/environment/development.rb
I18n::Debug.logger = Logger.new(Rails.root.join('log', 'i18n-debug.log'))
```

を追加し、Railsサーバー を再起動すると、
`(Rails.root)/log/i18n-debug.log`に
i18n の参照ログが出力されるようになった。

### 翻訳参照ログを見てみる

ちなみに、こういう稼働中のログを監視する時は

```sh
tail -f -n300 log/i18n-debug.log
```

みたいなのを打つと便利。

```:log/i18n-debug.log
ja.helpers.label.auth_name => nil
ja.helpers.label.password => nil
```

と出ていたので、
`ja.helpers.label.auth_name`等が参照されていたことがわかる。

```yaml:config/locales/hoge_ja.yml
ja:
  helpers:
    label:
      auth_name: 名前またはメールアドレス
      password: パスワード
```

と変更したら、意図通りの翻訳が出てくれた。
3軸加速度センサモジュール(ADXL345)をマイコン(LPC812)にて動かす

## はじめに

LPC812に3軸加速度センサーを動作させてみました。このセンサーはx,y,z方向の速度の変化を計測するものです。結果はシリアル通信をへて認識したポートにて通信をし、データの結果をteratermにて表示させます。

![P_20181228_164231_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/313830/1e9b3336-7aa4-d457-fbcf-e43e0b629d34.jpeg)


## 3軸加速度センサーでの注意点
ピン配置について
・CSはI2Cを使うのでハイレベルにつないでください。
・SDOはアドレス0x1dを使用するのでハイレベルに接続します。
※LOレベルにするとアドレスは0x53になります。使用するソースが0x1dを使用しているので、HIレベルにします。

LPC812側ではI2Cを使うので以下のようにします。
・SDAはPIO10（9番ピン)を、SCLはPIO11(8番ピン)を使用します。

## プログラムは流用
こちらも、ラトルズの「ボクのlpc810工作ノート」の”LPC810のプログラムのrutles_lpc810_projects.zip”からalcProtoを使います。各自でインポートしてください。
http://www.rutles.net/download/433/
※インポートにlpc_chip_8xxなどもインポートが必要です。

main.cから
コメントアウトするのは49～50行あたりの2行です。

~~~
	Chip_SWM_MovablePinAssign(SWM_I2C_SDA_IO, 2);
	Chip_SWM_MovablePinAssign(SWM_I2C_SCL_IO, 3);
~~~

代わりに以下のコードに挿入します・

~~~
	Chip_SWM_MovablePinAssign(SWM_I2C_SDA_IO, 10);//LPC812
	Chip_SWM_MovablePinAssign(SWM_I2C_SCL_IO, 11);//LPC812
	Chip_SWM_DisableFixedPin(SWM_FIXED_ACMP_I1);
~~~

また、uart.cの20行目を以下のよう1から2にします。
※ボートレートを9600にする変更です。

~~~
	Chip_Clock_SetUARTClockDiv(2);
~~~

ソースの変更は以上です。


## 実行させる

実行させるにはちょっとコツがいるかもしれませんが、3軸加速度センサーのX,Y,Zが一定時間置きに表示されます。

![P_20181228_031520_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/313830/773c3f0d-4a87-1bb3-0075-2167ba14f4e3.jpeg)

![P_20181228_163953_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/313830/4e6549d8-1c39-3f52-177d-c65326612fbf.jpeg)

※AE-FX231Xの3.3Vを外してPCに接続することでCOMポートを認識させてからTraTermを起動して、例ではCOM4に接続してます。そして、外していた3.3Vの線（ジャンパーワイヤー）を差すことでLPC812を起動させるようにするタイミングで実行させました。

## 最後に

意外とブレッドボートに差す線（ジャンパーワイヤー）が不良で、はじめはLPC812にプログラムを書いてくれずに何日もなやみました。ところが、まさかと思い線（ジャンパーワイヤー）を変えたとたんに動作するということがありました。つまりは、ジャンパーワイヤーの初期不良が原因でした。

以上、簡単にですが3軸加速度センサーが動作したので報告します。
メモ：「３０日でできる！OS自作入門 」30日目

## 高度なアプリケーション

1) コマンドライン計算機

![スクリーンショット 2018-12-28 17.02.43.png](https://qiita-image-store.s3.amazonaws.com/0/109145/b6da7849-d2c2-01cd-8279-84e49968a6b4.png)

2) テキストビューア
- なかなかかっこいい

![スクリーンショット 2018-12-28 17.07.44.png](https://qiita-image-store.s3.amazonaws.com/0/109145/ae15c475-33fe-c5f8-59ff-ec1a21a84678.png)

3) MML プレイヤ
- gif なので音入っていないがいい感じで BEEP 音でる

![mml.gif](https://qiita-image-store.s3.amazonaws.com/0/109145/cb684ab7-fc4f-1a00-15d5-c98492b4bdda.gif)

4) 画像ビューア
- jpeg も表示できる。凄い！

![スクリーンショット 2018-12-28 17.14.18.png](https://qiita-image-store.s3.amazonaws.com/0/109145/0f9f97a3-9d1b-4ffa-4fe5-eda4fb026123.png)

5) IPL の改良
- 必要なシリンダだけ読む (9シリンダ、もともと２０）
- 複数セクタまとめて読む
- invaderでsprintf使わない事によって小さくｗｗ

![スクリーンショット 2018-12-28 17.26.37.png](https://qiita-image-store.s3.amazonaws.com/0/109145/10bbd9cf-e15f-2dc9-e686-d71b49d464ca.png)

6) CD-ROM起動
-　試していない。。。
-
【学習記録④】「PHPの説明」チームラボオンラインスキルアップ課題「PHPを書いてみる」

#はじめに
下記サイトの実践記です。第5回目PHP編

「チームラボオンラインスキルアップ課題」
https://team-lab.github.io/skillup

#今回学習すること
## STEP1-5.PHPを書いてみる
>HTMLやCSSはあらかじめ書かれた内容を表示しているだけのものでした。
PHPはサーバ側を生成するプログラムです。これによって、送信されたデータによってページの内容を変えることなどができるようになります。

>また、サーバで実行できるプログラムには他にもRuby、Perl、Python、Javaなど様々なものがあります。
>それでは実際にPHPを書いてみましょう。

##プログラムを書いてみる
```index.php
<?php echo `<p>Hello World</p>`; ?>
```

```index.php
//現在の日付を取得して表示する
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>PHPのサンプル</title>
    </head>
    <body>
        <?php
        $date = date("Y/m/d H:i:s");
        print($date);
        ?>
    </body>
</html>
```

>PHPはHTMLの中に組み込んで書きます。<?phpから?>までがPHPのプログラム本体です。
PHPでは変数は先頭に$を付ける決まりになっています。
dateは日付を文字列で返す関数、printは内容を表示する関数です。

##基本構文
>以下はPHPの基本的な構文とコード例です。もっと詳しく知りたい場合や、
分からないことがある場合は[PHPマニュアル](http://php.net/manual/ja/index.php)を見ると良いでしょう。

## if文
```php
<?php
$a = 5;
if($a == 3){
 print("$a is 3");
} else {
 print("$a is not 3");
}
?>
```

**出力**
`5 is not 3`

## for文
```php
<?php
//$iが0から10未満の間、1ずつ加算しながら繰り返し
for($i = 0; $i < 10; $i++){
  print("$i ");
}
?>
```

**出力**
`0 1 2 3 4 5 6 7 8 9`
>if,for以外の制御構造は[PHP: 制御構造](http://www.php.net/manual/ja/language.control-structures.php)を参照してください。

## 関数
```php
<?php
//引数の文字列を2回表示する関数
function double_print($text){
 print($text . $text);
}

double_print("a");
double_print("bc");
?>
```

**出力**
` aabcbc `
>文字列の結合は.(ドット)演算子で行います。+ではありません。

## 配列

```
<?php
//"one","twp","three"を要素とする配列を作成
$a1 = array("one","two","three");
//配列$a1の末尾に"four"という要素を追加
$a1[] = "four";
////配列$a1の0番目の要素を変更
$a1[0] = "one?";
//表示
print\r($a1);
?>
```
**出力**
`Array([0]=> one?[1] => two[2] => three [3] => four)`
>print_rは変数の構造と内容を全て書き出す関数です。

## 連想配列

```
<?php
//$hash["one"]が"いち",$hash["two"]が"に",$hash["three"]が"さん"となる連想配列を作成
$hash = array("one" => "いち","two" => "に","three"=>"さん");
$hash["four"] = "し";
print_r($hash);
//$hashの各要素を取り出して処理
 foreach($hash as $key => $val)
   print("$key is $val");
?>

```
**出力**
`Array ([one]=>いち [two] => に [three] => さん [four] => し) one is いち. two is に. three is さん. four is し.`

>PHPでは配列の添え字に文字列を使うことができ、これを連想配列と呼びます。
配列の詳しい使用は[PHP:配列](http://www.php.net/manual/ja/language.types.array.php)に記載されています。

## 正規表現
>正規表現とは文字列のパターンを表現する方法です。たとえば、パスワードの形式を「半角英数」というパターンに制御する際などに使用します。以下の例では「数学」というパターンを検索しています。

```
<?php
if(preg_match('/(-?)[0-9]+(\.[0-9]+)?/', 'q-6.83p', $m)){
  print("match: $m[0] ");
  if($m[1] == "-")
    print("minus! ");
  if(isset($m[2]))
    print("decimal!");
} else {
  print("not match");
}
?>
```

**出力**
`match: -6.83 minus! decimal!`

>•正規表現の書き方についての解説はしません。知りたい方は各自で調べてください。◦この資料自体は正規表現が書けなくても問題が無い構成になっています。

>•preg_matchは第1引数の正規表現に第2引数がマッチしたかどうかを返します。◦第3引数に配列を渡すと、0番目の要素はマッチした部分全体、1番目以降の要素はマッチした()内の部分が格納されます。

>•issetは変数がセットされており、かつNULLではないかチェックする関数です。
>•その他分からない関数はPHPマニュアルの右上から検索できます。
JavaScriptでfetchを使う方法

動くコード
出典： https://sbfl.net/blog/2017/01/29/fetch-api/

```javascript
fetch(url)
  .then((response) => response.text())
  .then((text) => console.log(text))
  .catch((error) => console.log(error));
```
動かないコード
出典： https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch

```javascript
fetch('http://example.com/movies.json')
  .then(function(response) {
    return response.json();
  })
  .then(function(myJson) {
    console.log(JSON.stringify(myJson));
  });
```
なぜ本家のmozillaのコードが動かないのか謎。。。
追記：response.json()がExceptionを出していた模様。text()に変えると動きました。
SQLのwhere句の数値項目の比較について

Oracleでチューニングを行っていた際に体感できたチューニングをメモしておきます。

2つの数値項目を、where句で比較して抽出する際に単純に比較するより、一旦引き算して0と比較する方が体感できるくらい検索速度が向上した。

例）
変更前

select *
 from employee
where salary > bonus

変更後

select *
  from employee
 where salary - bonus > 0

環境が整えば、実測値とかも載せていければと思っています。
WordPress:非同期処理でデバックをしたいとき

#非同期処理 is 何
ざっくり言うと画面が描画されるときじゃなくて裏でなんかやってるとき。
WordPressでいうとファイルアップロードのフックとかWP REST APIで処理するときなんかがそう。
`var_dump()`で出力できないよーってとき。

#使い方
非同期処理ではvar_dump()してもディスプレイ上に出力するには専用の処理を書いたりと
本来実装に必要がないのに手間がかかります。

それが一行差し込むだけでvar_dump()感覚で変数の中身を出力して確認できるので、
とっさの不具合対応なんかでもできるかなと。

また、遷移前の処理も場合によってはvar_dump()しようとしてもできない場合もあるので、
そういったときに。

##どうやるの
`error_log(print_r(array('hoge' => $hoge, 'fuga' => $fuga), true), "3", "C:/xampp/xxxx/wp-content/uploads/error.log");`

これ

##なにこれ
[error_log](http://php.net/manual/ja/function.error-log.php)っていうのがPHPにある。

`error_log($message, $message_type, $destination);`

$message
>ログに記録されるエラーメッセージ。

何を出力するかですね。
例で言うと
`print_r(array('hoge' => $hoge, 'fuga' => $fuga), true)`
この箇所

$messageは文字列（string）である必要があるので、print_r()の第2引数でtrueを指定して文字列を返すようにしています。

$message_type
>メッセージをどこに送るのかを指定します。以下の中から指定できます。
>>3
>>message は destination で指定されたファイルに追加されます。 明示的に指定しない限り、
>>message の 最後には改行文字は追加されません。 

つまり、ファイル出力します！という意思表示。
数値を変えることにより、出力タイプが変わり、
メールで送信するとかPHPのエラーログに出力するということもできますが、
純粋に必要な情報だけ拾いたいので、ファイル出力が無難かなと思います。

$destination
>メッセージの送信先。その設定は、上で説明している message_type パラメータの値によります。

今回は書き込み先ですね。
WordPressであれば上記例のとおり、パーミッションの関係でもuploads下に出力すればいいと思います。
余計なファイルも周りに少ないと思うので探しやすいと思います。

#実装
##実装例
```
$hoge = 'あけおめ';
$fuga = 'ことよろ';
error_log(print_r(array('hoge' => $hoge, 'fuga' => $fuga), true), "3", "C:/xampp/xxxx/wp-content/uploads/error.log");
```
##出力例
```
Array
(
    [hoge] => あけおめ
    [fuga] => ことよろ
)
```

#最後に
良いお年を

#おまけ(2019.02.26加筆)
WordPressの場合、アップロードディレクトリの絶対パスを取得できるタグがあるので、
下記のようにすれば横にそんなに長くなくスッキリするし、
環境毎に出力先を書き換える必要がなくなってコピペでいける。

```
$upload_dir = wp_upload_dir();
error_log(print_r(array('hoge' => $hoge, 'fuga' => $fuga), true), "3", $upload_dir['basedir'] . "/error.log");
```
参考：[関数リファレンス/wp_upload_dir](http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_upload_dir)
メモ：「３０日でできる！OS自作入門 」29日目

## 圧縮と簡単なアプリケーション

1) バグ修正
- 全角の表示にウィンドウ移動持半分再描画されなかったバグ修正

2) ファイル圧縮
- tek 形式 （著者自作）
- nihongo.fnt を圧縮など

3) 標準関数
- コンパイラーがやってくれるsprintfとかはそのまま
- putchar
- exit
- printfなど実装
- malloc
- free

4) 非矩形ウィンドウ
- 一部透明のウィンドウ

![スクリーンショット 2018-12-28 16.48.24.png](https://qiita-image-store.s3.amazonaws.com/0/109145/e312e653-2456-86b1-ab3b-963b0f35196a.png)

5) bball
- Beautiful ball

![スクリーンショット 2018-12-28 16.49.52.png](https://qiita-image-store.s3.amazonaws.com/0/109145/ccdb1689-fe4b-f5fe-2a76-556c975cd243.png)

6) インベーダゲーム
![invader.gif](https://qiita-image-store.s3.amazonaws.com/0/109145/e4a53df2-52cf-051d-08bd-f22558232055.gif)
macOSからUbuntu 18.04にVNCを用いて画面共有する

# はじめに

研究結果の解析などは、大学に置いてあるLinuxサーバー(Ubuntu 18.04)で行なっているが、普段手元にある計算機はMacなので、VNCを用いて繋げている。

# Ubuntu側でのturbo VNCのインストール

apt-getで簡単にインストールできるtiger VNCがあるが、たまに表示が変になることがあるので、turbo VNCを使っている。

[turbo VNCのウェブサイト](https://sourceforge.net/projects/turbovnc/files/)からdebファイルをダウンロード。ダウンロードしたディレクトリで

```
sudo dpkg -i turbovnc_*.deb
```
を実行。```/opt/TurboVNC```以下にインストールされる
```/opt/TurboVNC/bin```にパスを通す

# VNCサーバーを立ち上げる

```shell
vncserver -geometry 2560x1440 :1
```

初めてVNCを立ち上げる時はパスワードを聞かれるはず。
-geometry以下は画面の解像度
最後の:1は、ディスプレイ番号を表している。
ここは好きに選んでいいが、既にその番号が使われている場合は他の番号にしなければいけない

# Macからアクセス

sshを使ってトンネリングする

```shell-session
ssh -L 9999:localhost:5901 (VNCサーバー)
```

というようにする。9999はMac側で使うポートで自由に選んで良いが、これもまた
既に使われているものは選んではいけない
5901の方は、590(ディスプレイ番号)というようになっている。
ディスプレイ番号を覚えておくこと

# Mac標準のVNCで接続

Finderを選択した状態で、Cmd+kとすると
画面共有のウィンドウが立ち上がるので、上のバーに
```vnc://localhost:9999```と記入する。9999は上で入力したものと同じにする

うまく接続できるとパスワードを聞かれるので、先ほど入力したパスワードを入力して接続する。
Flutterでトップレベル変数が初期化されるタイミング

Dartではファイルの下にいきなり変数を置くことができる（トップレベル変数）。

```dart:some_file.dart
final channel = const MethodChannel('xxx');
```

さて、このように書いた時、いったいいつ`const MethodChannel('xxx');`が呼ばれるのでしょうか？

答えは**この変数に初めてアクセスしたとき**です。

なので、たとえば以下のように書いていたとしても、`channel`変数自体にアクセスするコードがどこにもなかったら`setMethodCallHandler`の中身は実行されません。

```dart:some_file.dart
final channel = const MethodChannel('xxx')
  ..setMethodCallHandler((methodCall) {
    // ...
  });

void main() {
  runApp(MyApp());
}
```

ちゃんと明示的にどこかで`channel`にアクセスするロジックになるようにしましょう。例えばこんな感じ。

```dart:some_file.dart
final channel = const MethodChannel('xxx');

void main() {
  channel.setMethodCallHandler((methodCall) {
    // ...
  });

  runApp(MyApp());
}
```

JavaScriptみたいにまずファイル全体が処理される、みたいなイメージでいると思わぬ落とし穴になりますね。
Android Studio でパッケージ名を最速で変更。

##なぜこの記事

自分が変更したいと思った際に、この方法を知らずに悪戦苦闘して変なエラーとかでてきた。
なのでもし知らない人がいたら、その人の助けになると嬉しいです。



##1.　java以下のファイル名の変更。

app
  -**java 以下のファイル**(例えば、com.--(ファイル名)---)
にカーソルを合わせ、右クリック

➡Refactor から Renameを選択、warningを無視して変更。

➡下のlogに元のファイル名が使われている箇所の一覧が出てくるので*Do Refactor*を押して完了。


##2.build.gradle(Module:app)の変更

こちらは簡単で、
android{
  defaultCofing{
     の*applicationId*を希望する名前に変更する。

➡*Sync Now*を押して完了。



##3.アプリ名も変更したい場合

string.xmlのファイル内の*app_name*を変更。
これは Translation Editor からも変更可能。