OmniAICreator/Qiita-1.07M huggingface dataset:
LINE@の友達追加ボタンをフッターに表示させる


<img width="757" alt="画像 2018-09-26 22.00.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/295459/aa743758-5764-e229-e5b6-57eaf6a57928.png">
こんにちは@toku168です。
ここで紹介するのは、GMOのミチルのような下部にLINE@の友達追加機能を持ったボタンを表示させる方法です。
マーケティングにおけるLINE@の有効性はここでは述べませんが、メディアに自社のLINE@ 友達追加ボタンを掲出することで効率的にLINE@フォロワーを増やすことができます。

![IMG_2758.jpg](https://qiita-image-store.s3.amazonaws.com/0/295459/1897fc6b-98ab-7815-3942-898272c8d90d.jpeg)
https://michill.jp/
(左下のようなUI)

ここでは簡易的なLINE@のアイコンを表示させるだけのUIを紹介します。（細かいデザイン調整は各自でよろしく）

<h2>HTML</h2>
アイコンはawesomefontのデザインを使うので、awesomefontのインストールをお願いします。
（fab fa-line　の部分）

```html:footer
<div id="to-line">
<a href="https://line.me/R/ti/p/%4XXX" title="LINE@へ"><i class="fab fa-line"></i></a>
</div>
```
<h2>CSS</h2>

```CSS:
#to-line {
	position: fixed;
	right: 20px;
	z-index: 99999;
	background:none;
	bottom: 30px;
}
```

```CSS:
.fa-line{　
color:green;
font-size:65px;
}
```

以上、不明点があれば@toku168までお気軽に聞いてください。
chromeOS ver.69 がstableに来たのでC101PAでpython開発環境セットアップ

# 環境
ASUS Chormebook C101PA
OS: Debian stretch

# 目標
Jupyter Notebookを起動させるところまで

## 準備
OSを69にアップデートすると、設定メニューにLinuxベータ版が出現するので、ONにします。
これはdevチャンネルの時と同じですね。
ただdevの時はここで成功していても失敗のメッセージ出ましたが、ちゃんとメッセージなく終了しました。

※小生はUSamazonで購入したマシンなのでそれが原因かわかりませんが、
ターミナルで英日の入力変換ができませんでした(泣)

git, python3は初期状態でインストール済

```
$ git --version
git version 2.11.0
```

```
$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
```


# やってみた
C101PAはCPUがARMなので何ができるかとりあえず試してみました。

## pyenv
失敗しました。
## Anaconda
失敗しました。
## pip
成功しました。

```
$ sudo apt-get install python3-pip
```

## jupyter notebook
成功しました。

```
$ sudo pip install jupyter

# インストール完了後
$ jupyter notebook
```

※自動で起動するURLでは表示tokenが異なり表示されません。
コンソールに表示されるURLにアクセスし直すと、正常に表示されました。

# 感想
パッケージのインストールにやや時間がかかるものの、環境構築に成功しました！
これはchromebookがさらに普及する第一歩になり得ると感じます。
特にこのC101PAは3万ほどで購入できるので、子ども向けにもいいですね。
PayPalの課金をJSのみで実装（SANDBOX)

##１．デベロッパーサイトにログイン（右上の「Log into Dashboard」ボタンをクリック）
https://developer.paypal.com/docs/api/overview/#create-a-paypal-app
##２．REST API Appを作成（「Create App」ボタンをクリック）
「App Name」にアプリケーション名を入力し、「Create App」ボタンをクリック。
##３．「Client ID」をコピーします。
「Client ID」の文字列をクリックすると、文字列全体が選択状態になるので、それをコピー。
##４．HTMLファイルサンプル（下記のHTMLをファイルとして保存）

```ｈｔｍｌ:sample.html
<div id="paypal-button-container"></div>
<script src="https://www.paypalobjects.com/api/checkout.js"></script>
<script>
// Render the PayPal button
paypal.Button.render({
// Set your environment
env: 'sandbox', // sandbox | production

// Specify the style of the button
style: {
  layout: 'vertical',  // horizontal | vertical
  size:   'medium',    // medium | large | responsive
  shape:  'rect',      // pill | rect
  color:  'gold'       // gold | blue | silver | white | black
},

// Specify allowed and disallowed funding sources
//
// Options:
// - paypal.FUNDING.CARD
// - paypal.FUNDING.CREDIT
// - paypal.FUNDING.ELV
funding: {
  allowed: [
    paypal.FUNDING.CARD,
    paypal.FUNDING.CREDIT
  ],
  disallowed: []
},

// PayPal Client IDs - replace with your own
// Create a PayPal app: https://developer.paypal.com/developer/applications/create
client: {
  sandbox: 'AbLeDdSZvTH5--yAV1-6JLnYLKwy1iMbPT1lwHKBJUdr0KWgITo-_FMgAiwAJGsfO9AKl-nTV5GX8lEe',
  production: '<insert production client id>'
},

payment: function (data, actions) {
  return actions.payment.create({
    payment: {
      transactions: [
        {
          amount: {
            total: '0.01',
            currency: 'USD'
          }
        }
      ]
    }
  });
},

onAuthorize: function (data, actions) {
  return actions.payment.execute()
    .then(function () {
      window.alert('Payment Complete!');
    });
}
}, '#paypal-button-container');
</script>
```
（https://developer.paypal.com/docs/checkout/quick-start/ を参照）

##５．HTMLファイルの「sandbox:」に、３でコピーした「Client ID」を設定
##６．PayPalアカウントを確認。（下記にログインし、左メニューのSANDBOXのAccountsを確認）
https://developer.paypal.com/
※パスワードの設定もできます。（メールアドレスを展開し、「Profile」をクリックし、「Change Password」をクリック）
##７．サンドボックスで支払いのテスト。
HTMLファイルをブラウザで見て、PayPalをクリックし、ログインする。
（６で確認したTypeがPERSONALのアカウントでログインする。）
支払い方法を選択し、支払いの確認をし続行。
##８．結果を確認。
SANDBOXのサイトにTypeがBUSINESSのアカウントでログイン。
https://www.sandbox.paypal.com/jp/webapps/mpp/merchant
画面上部の取引リンクをクリックし確認。（SANDBOX環境は反映までに時間がかかるそうです）
##９．本番で行うには
アカウントをPERSONALからBUSINESSにし、本番用として「Client ID」を取得し、HTMLファイルの
「production:」に設定する。
spring-data-jpaの@Queryでカスタムオブジェクトを返す

Spring Data JPAで```group by```の集計結果などをエンティティではない自前のオブジェクトとして返す。

```xml:pom.xml
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
	</parent>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
```

```java
import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    @Query("select u.userId as userId, count(*) as cnt from User u group by u.userId")//無意味なクエリだがそこは無視で…
    List<Result> list();

    @Query(value = "select user_id as userId, count(*) as cnt from users group by userId", nativeQuery = true)
    List<Result> list2();

    public static interface Result {
        public Long getUserId();

        public int getCnt();
    }
}
```

上記のように、結果を保持するための適当な```interface```を返す。JPQLでもネイティブクエリでもどっちでも使える。
クラウドサービスについて

最近よく聞くクラウドサービスやクラウドコンピューティングについてまとめてみました。
IaaS,PaaS,SaaSなんかについてもまとめてます。

とっても簡単に言うと
* 土地を借りること = IaaS
* 家を借りること　 = PaaS
* 部屋を借りること = SaaS

---

## クラウドコンピューティング
クラウドコンピューティング（英: cloud computing）は、インターネットなどのコンピュータネットワークを経由して、コンピュータ資源をサービスの形で提供する利用形態である。略してクラウドと呼ばれることも多く、cloud とは英語で「雲」を意味する。

対義語はオンプレミス
オンプレミスとは、企業などが情報システムの設備（ハードウェア）を自社で保有し、自社の設備において運用することである。システムの自社構築という意味を含む場合もある。


## SaaS
##### Software as a Service
システムレイヤの最上位であるソフトウェアだけをクラウドで提供するサービスモデル
一般利用者が一番近いサービスですね。
最も手軽に使える分OSやハードウェア/ミドルウェアが自由にできない分開発の自由度は制限されている

ex)
[DropBox](https://www.dropbox.com)
[Gmail](https://mail.google.com/mail)
[Youtube](https://www.youtube.com)

---

## PaaS
##### Platform as a Service
アプリケーションが動作するためのプラットフォームをクラウドで提供するサービスモデル
プラットフォームといってもあくまでもミドルウェアのお話。アプリケーションサーバやミドルウェアとかを提供されそのプラットフォーム上でアプリケーションを開発する

OSやDBソフトウェアのことを考えずに自分自身のプログラムをネットワーク上で実行したい時、PaaSは最良の選択肢と言えるでしょう。

ex)
[heroku](https://dashboard.heroku.com/apps)
[Google App Engine](https://cloud.google.com/appengine/)

---

## IaaS
##### Infrastructure as a Service

システム全体が動作する基盤をクラウドで提供するサービスモデルです。ハードウェアやOS、ネットワークなんかをユーザ自身で構築しアプリケーションの開発を行う。

PaaSやSaaSと比べ、OSやハードウェア、ネットワークの知識が必要になります。そして、更新やセキュリティ対策などもすべて自分の手で行わなければなりません。

ex)
[OpenStack](https://www.openstack.org/)
[Amazon Elastic Compute Cloud](https://aws.amazon.com/jp/ec2/)

---

## BaaS / mBaaS
##### Backend as a Service

BaaSとは，バックエンド機能を提供するサービスです。

BaaSは、「Backend as a Service」の略です。「ばーす」と呼びます。バックエンド側のサービスになります。mBaaSは、iOS、Androidなどに対応したモバイル（Mobile）用ということになります。

サーバーにおけるサーバーソフトのインストールやメンテナンスをBaaSに任せてフロントエンド側のみの開発作業を行いたいエンジニア向けのサービスです。

ex)
[NIFTY Cloud mobile backend](https://mbaas.nifcloud.com/)
jsdoでshadertoy sandbox その12

#概要

shadertoyのコードをjsdoでやってみた。
texture().rgbを使えるようにした。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/C/q/O/CqOJ.jpg?t=1537963137)

#成果物

http://jsdo.it/ohisama1/CqOJ


以上。
rustのcargoでarm64 linux向けにクロスビルドする

以前に、[rustをインストールしてhello world をARM用にクロスコンパイルするまでの手順](https://qiita.com/tetsu_koba/items/1ab400a3d4ec9725b044) という記事を書きました。
今回はrustcを直接実行するのでなくてcargoを使ってクロスビルドします。

# 準備

[rustをインストールしてhello world をARM用にクロスコンパイルするまでの手順](https://qiita.com/tetsu_koba/items/1ab400a3d4ec9725b044) の記事に従ってrust のtargetを追加します。今回はaarch64-unknown-linux-gnu。

```
rustup target add aarch64-unknown-linux-gnu
```

# cargoの設定

`~/.cargo/config` に`[target.aarch64-unknown-linux-gnu]` の項目を追加してlinkerを指定します。今回はbuildrootでrootfsを作ったのでそのツールチェインのgccを指定します。このコマンドが実行できるように、必要に応じて環境変数PATHも変更しておきます。

```toml:~/.cargo/config
#[build]
#target="aarch64-unknown-linux-gnu"

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-buildroot-linux-gnu-gcc"
```

なお、`[build]`の項目を書いておくとcargoのデフォルトのtargetを変更できます。
今回はデフォルトはネイティブのx86_64のままにしておいて、cargoコマンドの引数でtargetを指定するようにします。このほうがネイティブビルドとクロスビルドの使い分けが簡単なので。(なので、`[build]`の項目はコメントアウト)

# クロスのcargoコマンドを実行するshellスクリプト

[前回の記事](https://qiita.com/tetsu_koba/items/919337fd4ac4f173e56a)で作った`net_activity`コマンドをこのスクリプトでarm64向けにクロスビルドします。
リリース用にビルドしてシンボル情報をstripするようにしました。

```sh:build_arm64.sh
#!/bin/sh
TARGET=net_activity
STRIP=aarch64-buildroot-linux-gnu-strip
export PKG_CONFIG_ALLOW_CROSS=1
cargo build --target aarch64-unknown-linux-gnu --release
cd target/aarch64-unknown-linux-gnu/release/
cp $TARGET ${TARGET}_g
$STRIP $TARGET
```
これを実行してできたファイルが以下。シンボル情報がかなり大きいようで、stripすることでずっとサイズが小さくなります。

```
$ file target/aarch64-unknown-linux-gnu/release/net_activity{,_g}
target/aarch64-unknown-linux-gnu/release/net_activity:   ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 4.9.0, stripped
target/aarch64-unknown-linux-gnu/release/net_activity_g: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 4.9.0, with debug_info, not stripped
$ ls -lh target/aarch64-unknown-linux-gnu/release/net_activity{,_g}
-rwxr-xr-x 2 koba koba 323K  9月 25 13:43 target/aarch64-unknown-linux-gnu/release/net_activity
-rwxr-xr-x 1 koba koba 3.0M  9月 25 13:43 target/aarch64-unknown-linux-gnu/release/net_activity_g
```

このコマンドはarm64 linuxの上で問題なく動作しました。

なお、以下のように普通にcargoコマンドを実行すると、ネイティブ環境向けにビルドされますので、手元で動かしてみることができます。

```
$ cargo build
```

```
$ file target/debug/net_activity
target/debug/net_activity: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=cdb33e921d9fcd59ebc06a9997869fd30c0aa6d2, with debug_info, not stripped
$ ls -lh target/debug/net_activity
-rwxr-xr-x 2 koba koba 6.1M  9月 25 18:48 target/debug/net_activity
```
CakePHPのdebugkitを非表示にしたい。。

どうもこんにちわ！
CakeをBakeしたい年頃のMashikaです！

はい！そんなわけで本日はCakePHPのお勉強をしていて少しつまずいたお話を備忘録として残しておこうと思います！

まぁ題名の通りなんですけどね、、ってかそこかよ！みたいなツッコミが飛んできそうですが、、笑
<h1>つまずくまでの流れ</h1>
まず、ケーキのバージョンですがコマンドプロンプトから「bin\cake version」って打ってみたところ「3.6.11」って返ってきたので、多分これです。

開発環境としては、XAMPPを使ってローカルに環境を作って、勉強がてら開発を進めていたのですが、、

開発を進めていると画面の右下にずっと可愛いケーキがいるので、なんだこれって思って調べてみたところ、debugkitなるメッチャ便利な機能であることが分かりました。

ただし、可愛いケーキであろうと、画面の右下にずっと居座られるのは邪魔だなーって思って、Google先生に「CakePHP debugkit 非表示」とかで検索したんですよね。

そしたら、流石Google先生というか先人の皆様のおかげで、すぐにそれらしき答えが見つかり、以下の設定を行ってくださいとのことでした。

```config/bootstrap.php
/*
 * Only try to load DebugKit in development mode
 * Debug Kit should not be installed on a production system
 */
if (Configure::read('debug')) {
    //Plugin::load('DebugKit', ['bootstrap' => true]);
    Plugin::load('DebugKit', ['bootstrap' => false]);
}
```

解決やっほーやったね！ってことで早速「config/bootstrap.php」を開き、文字列検索で「debug」ってしたら以下の部分がヒットしてきました。

```config/bootstrap.php
/*
 * When debug = true the metadata cache should only last
 * for a short time.
 */
if (Configure::read('debug')) {
    Configure::write('Cache._cake_model_.duration', '+2 minutes');
    Configure::write('Cache._cake_core_.duration', '+2 minutes');
    // disable router cache during development
    Configure::write('Cache._cake_routes_.duration', '+2 seconds');
}
```

ん？

なんか違くねってか「Plugin::load('DebugKit', ['bootstrap' => true]);」っていう記述がないんだけど、、、

って思ったのですが、とりあえずこのif文の中に「Plugin::load('DebugKit', ['bootstrap' => false]);」を追記してオッケーって思って、ブラウザに戻って画面を更新してみたんですが、、、

ケーキが消えねぇ。。。

となり、食べ物のケーキ以外は嫌いになりかけたのが数時間前のハイライトです。

if文の外に書いてみたりもしたんですが、ダメでした。。
恐らくは単純に僕の知識不足なんだと思っておりますので、どなたかファイナルアンサーをご教示いただけると本当に有難いです。。
<h1>そこで、、</h1>
debugモードだから表示されてるんでしょ！debugモードやめればいいんでしょ！

ってことで、それらしきファイルを「debug」文字列で検索し続けた結果、configフォルダ配下の「.env.default」「app.default.php」「app.php」にてdebugをtrueにしているのを発見いたしました。

結果、以下の箇所のtrueをfalseに変えました。

```config/app.php
/**
 * Debug Level:
 *
 * Production Mode:
 * false: No error messages, errors, or warnings shown.
 *
 * Development Mode:
 * true: Errors and warnings shown.
 */
//'debug' => filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN),
'debug' => filter_var(env('DEBUG', false), FILTER_VALIDATE_BOOLEAN),
```

一応、これで目障りなケーキとはお別れすることに成功いたしました。
（もし、何してるんだい君は！という神のお告げを下さる方がいらっしゃいましたら、見過ごさずにお声かけいただけると有難いです。。）
<h1>おまけ</h1>
CakePHPにデフォルトで入っているCSSファイルのstyle.cssファイルにて以下の記述があるのですが、これってダレトクなんですか、、？

```webroot/css/style.css
/* Force equal height by overflowing */
.content,
#actions-sidebar {
    margin-bottom: -99999px;
    padding-bottom: 99999px;
}
```

最初コンテンツエリアを覆うdivタグのclassにcontentを指定してたら、中身は全然ないのに、常にサイドバーがマックススクロール可能で何事かと思いました。。

未熟なしがないエンジニアに幸あることを願います。

はい！ということで本日はここまでです！！
くだらない記事にお付き合いいただき、ありがとうございました。
VSCodeでインデントのスペース数を変更する

#はじめに
VSCodeのデフォルトのインデントは、半角スペース4つになっていますが、プロジェクトによっては半角スペース2つにしたい事もありますよね。今回私も設定変更しましたので、備忘録として残しておきます。

#設定
エディタの左下の歯車アイコン→設定
もしくは`Command+,`で設定が開きます。

中ほどに「Editor:Tab Size」という設定がありますので、こちらの値を2にセットしてあげます。
<img width="469" alt="スクリーンショット 2018-09-26 20.29.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/104983/fda19fce-ec49-f651-d3a4-99533bc5e5a4.png">
なおこのままだと、4つでインデントされたファイルを開くと、既存のコードに合わせる形となり、4つでインデントされてしまいます。強制的に2つでインデントさせたい場合は、設定内の「Editor:Detect Indentation」のリンクをクリックし、チェックボックスをオフにしてあげましょう。
<img width="563" alt="スクリーンショット 2018-09-26 20.43.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/104983/a2122ba8-8166-07cd-83ae-89810a47fb07.png">
HomebrewをXcodeのアプリなしで使う方法

# TL;DR

`xcode-select`さえあれば良かったー、という話。

# Xcodeの鎮座っぷりよ。

homebrewは好きです。
あいつはジョッキ片手によく働く、ファンキーなイイヤツです。

だがしかし、その後ろにでーんと構えるXcodeよ。
アイツには大して用もないのに、１０GBというサイズ。
アイツのせいで、ローカル環境を構築しようとしていた知人のWimaxが通信制限にかかってしまいました。
ちくしょう・・・、なんて罪深いやつだっ！

ってわけで、「これ、デスクトップアプリじゃなくてもいんじゃね？」と思って調べたら、やっぱりそうだったのでシェアします。

あ、事前にバックアップは取りましょうね。
自己責任でお願いいたしまする。

# Xcodeを削除

デスクトップアプリを削除します。
僕は基本的に[AppCleaner](https://freemacsoft.net/appcleaner/)（[リニューアル](https://itunes.apple.com/jp/app/app-cleaner-uninstaller/id1013897218?mt=12)したのかな？）で削除するようにしてますが、「ゴミ箱に入れる」でもOKです。

この状態ではbrewは動きませんね。

# xcode-selectに移行

xcode-selectというコマンドラインツールがあります。
Xcodeのアプリの一部でもあるものですが、homebrewが必要とするのはコレだけだったんです。

## 生存確認

デスクトップアプリを削除しても、生きてるんじゃないですかね？

```bash

$ xcode-select --version
```

バージョンが表示されなかったら、インストールしませう。

```bash

$ xcode-select --install
```

「インストールするかい？」って聞かれると思うので「YES」！

## パスを通す

--switchでパスを通すみたいです。へぇ。
このままコピペでOKです。

```bash

$ sudo xcode-select --switch /Library/Developer/CommandLineTools
```

# 復活！

```bash

$ brew --version
Homebrew 1.7.6
Homebrew/homebrew-core (git revision bcf5a; last commit 2018-09-26)
Homebrew/homebrew-cask (git revision b6a9f; last commit 2018-09-26)
```

ミニマルでいい感じです。

※ちなみに、このgitなんちゃらは気にしなくて良さそうです。

# ついでに

しばらく使ってる人はこれもしときましょ。
brewが持ってる不要なキャッシュを削除してくれます。
ちなみに僕のは１GBくらいキレイにしてくれました。すっきり。

```bash

$ brew cleanup
```
Sublime Text 3 でGolang環境を整える

# はじめに
突然、職場の上司の方がGolangはいいぞ！しか言わなくなったので、Golang環境を整えてみました。

# やること

* SublimeText3をインストール
* Golang公式サイトからGoをインストール
* PackageControlをインストール
* GoSublimeをインストール

# SublimeText3をインストール

[公式サイト](https://www.sublimetext.com/)
からインストールします。無料ですべての機能が使えますが、何回か保存すると購入してくれってポップアップが出るようになります。うーんどうしようかなぁ・・・って感じです。

# Golangをインストール

[公式サイト](https://golang.org/)
からインストーラーをダウンロードしてインストールします。インストール先を変えた場合、GOPATHを設定する必要があります。

# PackageControlをインストール

[ここのサイト](https://packagecontrol.io/installation)
からSUBLIME TEXT 3の項目のスクリプトをコピーして貼り付けます。

SublimeText3を起動し、ctrl+@(windows)を押すと出てくるこいつに張り付けてエンター

![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/276191/1a110dcb-4abb-5bb2-3f92-b487d55ec3fd.jpeg)

# GoSublimeをインストール

ctrl+shift+p(windows)を押すとコマンドパレットが出てきます。そこでinstallと入力して「PackageControl:Install Package」を起動。

![b.jpg](https://qiita-image-store.s3.amazonaws.com/0/276191/12202139-3ce9-71b7-52c2-c554cbe6358c.jpeg)


検索画面になるので、そこでGoSublimeを検索してクリック。インストールが始まります。

![c.jpg](https://qiita-image-store.s3.amazonaws.com/0/276191/032417ef-16d6-4e5b-d7c6-8579ce7506f6.jpeg)


# 最後に

Golangはいいぞ
Pythonで最新の日付文字列のフォルダを特定のフォルダにコピーする

20180926のような日付のフォルダーに対する、コピー操作を毎週毎週やっていませんか？
面倒なのでスクリプトを使って楽をしましょう。

```copy_latest_folder.py
import os
import shutil
import re

# コピー元のフォルダが含まれるパス
src_path = '/Users/butada/daily_meeting'

# コピー先のファイルパス（このフォルダは存在しないこと）
dst_path = '/Users/public/html/latest'


def get_latest_folder_name(path):

    # ファイル・フォルダ一覧を取得
    folders = os.listdir(path)
    sorted_folders = sorted(folders, reverse=True)
    print('ディレクトリ: ', path)
    print('ディレクトリ一覧: ', sorted_folders)

    # フォルダ一覧から最新の日付文字列のフォルダを選択する
    latest_folder = ''
    for folder in sorted_folders:
        if re.findall(r'^[0-9]', folder):
            latest_folder = folder
            break
        else:
            print(folder)
    if latest_folder == '':
        print('[ERROR] コピー対象のフォルダが見つかりませんでした')
        #exit()
        raise
        
    return latest_folder


src_folder = get_latest_folder_name(src_path)
#dst_folder = get_latest_folder_name(dst_path) # コピー先も最新の日付文字列フォルダにする場合
dst_folder = '' # 特定のフォルダにコピーする場合

src_full_path = '/'.join([src_path, src_folder])
dst_full_path = '/'.join([dst_path, dst_folder]) # コピー先にコピー元のフォルダ名を残さない場合
#dst_full_path = '/'.join([dst_path, dst_folder, src_folder]) # コピー先にコピー元のフォルダ名を残す場合

print('既存のフォルダを削除します: ', dst_full_path)
try:
  shutil.rmtree(dst_full_path)
except:
  print('--フォルダが存在しませんでした')

print('フォルダツリーをコピーします: ')
print('コピー元: ', src_full_path)
print('コピー先: ', dst_full_path)
shutil.copytree(src_full_path, dst_full_path)

print('完了')
```
CSV文字列の各フィールドをクォーテーションで囲うawkワンライナー

# 概要
表題の通りです。

最近、某サービスへテーブル的なデータを投入するために必要なCSVファイルを作ることがありまして。
その際、各フィールドをクォーテーションで囲むことで、テーブルのスキーマ情報に確実に文字列として認識されるようにしたかったため、こんな小細工をしてました。なんとなく汎用性がありそうなので、ここに記録しておきます。

# tl;dr（実行結果）

```bash
echo -e "abc,def,ghi\njkl,mno,pqr\nstu,vwx,yz"
#=> abc,def,ghi
#=> jkl,mno,pqr
#=> stu,vwx,yz

echo -e "abc,def,ghi\njkl,mno,pqr\nstu,vwx,yz" | awk -F"," '{ l = NULL; for (i = 1; i <= NF; i++) l = l ((i == 1) ? "" : ",") "\""$i"\""; print l}'
#=> "abc","def","ghi"
#=> "jkl","mno","pqr"
#=> "stu","vwx","yz"
```

# 設計（アプローチ
awk初心者なもので、勝手がわからずに、雑にforループでぶん回して各行の出力文字列をつくりました。

[これ](https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8D%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/awk%E3%81%AE%E5%87%BA%E5%8A%9B%E3%82%92%E3%82%AB%E3%83%B3%E3%83%9E%E5%8C%BA%E5%88%87%E3%82%8A%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)を参考に、`OFS=","`を指定したりしてみたんですが、変数に突っ込んだ時点でフィールドという概念がなくなって意味がなくなるし、「結局文字列連結する方が早いか...」と思って上記に至りました:thinking:

# おわりに
もうちょっとスマートなやり方があればコメントもらえると嬉しいです...:sob:

# 参考
- [実用 awk ワンライナー \- Qiita](https://qiita.com/b4b4r07/items/45d34a434f05aa896d69)
- [逆引きシェルスクリプト/awkの出力をカンマ区切りにする方法 \- Linuxと過ごす](https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8D%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/awk%E3%81%AE%E5%87%BA%E5%8A%9B%E3%82%92%E3%82%AB%E3%83%B3%E3%83%9E%E5%8C%BA%E5%88%87%E3%82%8A%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
- [echoコマンドで改行やタブを扱うには@Linux \(Debian Etch\) \| Mazn\.net](https://www.mazn.net/blog/2009/01/06/169.html)
PosgreSQLにsqlファイルを流しこむ

# はじめに
地理データを使って焼きなまし法を利用したかったため地理データを保有することができるPosgresqlを使っているが、その際に引っかかった点をメモとして残すためにこの記事を書いた。
地理データを取得する際に起こったエラーです。

# 動作環境
PostgreSQL
Ubuntu 16.04 LTS

# エラー
作成したテーブルにINSERT文でデータを流し込む時以下のコマンドを叩く
`postgres@username:~$ psql -f sample.sql sample`
するとコマンドライン上で次のエラーを吐く。
`sample.sql: そのようなファイルやディレクトリはありません。`

DBサーバとは、違う場所からデータを流し込もうとしていたからエラーが出ていた。
この時、sample.sqlファイルは/Desktop/sql/sample.sqlに入っている。

# 解決法
デスクトップ上のディレクトリ内に作成されたsample.sqlファイルをpostgresqlフォルダ内に移動させたら無事インポートできた。
1.まず下のコマンドを叩く(sqlファイルの移動)
`username@username:~/Desktop/sql$ sudo mv sample.sql /var/lib/postgresql/`

2.次にデフォルトのPostgresに接続
`username@username:~$ sudo su - postgres`

3.挿入したいテーブルにデータを流し込む
`postgres@username:~$ psql -f sample.sql sample`
これでsqlファイルのデータが追加された。

4.確認コマンドで見てみる。
`select * from sample;`
確認できたら成功！

# まとめ
この方法以外にもっといい方法があるかも。
知っている人いたら教えてください！

# 参考
プログラム の個人的なメモさんhttps://blogs.yahoo.co.jp/dk521123/33982442.html
Reactで高階関数の連続適用をcomposeでいい感じに書く

私は関数型が好きである。
といってもJavaScriptくらいしか関数型言語はかけないのだが。
それでも簡潔なインライン記法に出会ったときは感動した。
そんな関数型ラブな私でも関数型でイケてないと思う時がある。

##読めない高階関数の連続適用
例えばReactでコンテナにreduxをconnectし、lifecycleでコールバックを仕込み、
さらにmaterial-uiのwithStylesでstyleを適用してexportしたい時があるとする。
まず素直に書こう。

```javascript
import withStyles from '@material-ui/core/es/styles/withStyles';
import appStyle from '...'
import { connect } from 'react-redux';
import { lifecycle } from 'recompose';

// container
const App = () => ...

// redux接続用
const mapStateToProps = ...
const mapDispatchToProps = ...

export default connect(mapStateToProps, mapDispatchToProps)(lifecycle({...})(withStyles(appStyle)(App)));
```

うーん読めない。
ワンライナーじゃなく何行かで書くこともできるがそこまで変わらない気がする。
なによりエディタに今は助けてもらっているが、エディタなしで果たして書けるだろうか。


##recomposeのcomposeとかいう神関数

ここでrecomopseという高階関数系をちょちょいとしてくれるライブラリが持っているcomposeが活躍する。
composeは関数のネストなくし可読性を大幅に上げてくれる。

```javascript
import withStyles from '@material-ui/core/es/styles/withStyles';
import appStyle from '...'
import { connect } from 'react-redux';
import { lifecycle } from 'recompose';

// container
const App = () => ...

// redux接続用
const mapStateToProps = ...
const mapDispatchToProps = ...

export default compose(
  connect(mapStateToProps, mapDispatchToProps),
  lifecycle({...}),
  withStyles(appStyle),
)(App);
```

このようにcomposeの中に関数を並べるだけで順に適用してくれる。

##まとめ
composeによって関数型のsucksな部分が解決できた。
recomopseは他にも関数型をいい感じにしてくれる関数がいっぱいある。
興味がある人は是非しらべてね。

※追記2018/09/27
@ygknさんからの情報提供。
composeはrecomposeだけじゃなくreduxも持っているためそちらでも可。
ノートPCのHDDをSSDに変えるお話

# はじめに

大学に入るときに購入したノートPCがサブ機に使えればいいかなと思い、HDD -> SSD換装に挑戦してみたところ、少し苦戦してしまったので、メモとして残しておこうかなと思います。5年ほど前のノートPCです。

# ノートPC

TOSHIBA製のdynabookです。
型番はR734/E26KB。

![111.jpg](https://qiita-image-store.s3.amazonaws.com/0/276191/0ee11211-e15b-90cf-fd7d-59b14df32641.jpeg)


# 購入したものや準備したもの

* SSD

https://www.amazon.co.jp/gp/product/B07F1S49JF/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1


今回の記事の要であるSSDです。ケチって128GBのものにしました。最近のSSDは安いとAmazonで安いものをポチりました・・・。聞いたことのないメーカーですが、大丈夫なのでしょうか・・・。今のところ何の問題もなく使えています。

* SATA -> USB変換ケーブル

https://www.amazon.co.jp/gp/product/B07FWYMRDJ/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1

もともとつけていたHDDよりも新しいSSDの方が容量が小さいため、データ移行のために買いました。

* 精密ドライバー

https://www.amazon.co.jp/gp/product/B0016VA0BQ/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1

ノートPCをバラすのに一般的なものではネジの穴が全く合わず、買いました。

* 8GB以上のUSBメモリ

今回はその辺に転がっていたものを使いました。

# 事前準備

まずは、microsoftの公式サイトへ行き、windows10のインストーラーをダウンロードします。

![16.jpg](https://qiita-image-store.s3.amazonaws.com/0/276191/6d480366-89e3-66f0-3a98-0e1555f60bff.jpeg)


そのインストーラーを使って、USBへwindows10のインストーラーを入れます。容量は8GB以上必要とありますが、実際に使用されるのは5GB程度です。

# HDD -> SSD へ交換

まず精密ドライバーで裏のパネルを外します。

![77.jpg](https://qiita-image-store.s3.amazonaws.com/0/276191/810dab5b-6cb2-8aaf-d0a3-5764a0f4151f.jpeg)

HDDをSSDへ付け替えておわり！

![image2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/276191/bd3d35b2-9615-34bd-a534-02777249bf44.jpeg)

![image3.jpeg](https://qiita-image-store.s3.amazonaws.com/0/276191/66bae204-3ed2-9a51-8009-b070ad8b7311.jpeg)

とても簡単です。

# OSのインストール

BIOSの設定からUSB起動の優先度を上げておきます。
このノートPCのBIOS起動のやり方は「F2キーを押しながら電源ボタンを押す」でした。

![image4.jpeg](https://qiita-image-store.s3.amazonaws.com/0/276191/dafc2ba3-47e7-f27a-8a09-e260efbcb1da.jpeg)

すると、USBからインストーラーが起動します。
今回はまっさらなSSDにインストールをするので、下のカスタムインストールを選択します。

![image5.jpeg](https://qiita-image-store.s3.amazonaws.com/0/276191/f68797f4-634d-3b83-fcdb-3b6695947196.jpeg)

インストール場所を選ぶときにSSDをフォーマットします。今回買ったSSDは、MBRでブートします。MBRでフォーマットをするにはこの画面からではなく、コマンドプロンプトから設定します。

https://freesoft.tvbok.com/tips/efi_installation/diskpart_gpt_mbr.html

DISKPARTを使った対処方法の項目を参考に進めました。MBRの設定が終わったら、新規をクリックし、SSDを選択します。

大体下の画面のようになったのではないでしょうか？

![image6.jpeg](https://qiita-image-store.s3.amazonaws.com/0/276191/3340b2db-0539-dcf1-ece7-40c2346b4dd7.jpeg)

次へをポチポチして待ちます。途中で再起動しますが、その時にUSBを抜いておかないとまたUSBからブートされてしまい、同じ画面が出てきてしまいます。もし、そのまま起動してしまったら、USBを抜いて電源ボタンを押して手動で再起動します。

あとはただただ待つのみです。

# SSDの性能は？

ベンチマークで測ってみました。今までHDDを使っていた身からすると爆速・・・

![bench.jpg](https://qiita-image-store.s3.amazonaws.com/0/276191/7479c383-24d9-1766-2996-87df68510db6.jpeg)


# 参考にさせていただいたサイト

東芝Dynabook R734/MのHDDをSSDへ換装（Windows10 Pro 64bit)
https://ameblo.jp/sijukara-tama/entry-12360552828.html

SSDにOSをクリーンインストールすると必ず失敗するパターンにハマった結果
http://takurolu.hatenablog.com/entry/2016/06/19/000253

Windowsのインストールが出来ない場合の対処方法2 (UEFI/MBRの違い)
https://freesoft.tvbok.com/tips/efi_installation/diskpart_gpt_mbr.html
[Swift 4.2] Dictionayでプロパティアクセス


Swift 4.2 で Dynamic member look up というものが導入されました。

これを使うことで Key が String の Dictionary で下のコードのようにプロパティを使うように要素にアクセスできるようになります。


```swift
var hoge = ["hoge": "hoge"]

print(hoge.hoge)  // prints Optional("hoge")

print(hoge.piyo)  // prints nil
hoge.piyo = "piyo"
print(hoge.piyo)  // prints Optional("piyo")
```
まるでプロパティであるかのようですね！


以下ソース

```swift
@dynamicMemberLookup
protocol DynamicMemberLookupable {
  associatedtype ReturnValue
}

extension DynamicMemberLookupable  {
  subscript(dynamicMember member: String) -> ReturnValue {
    get { fatalError("oops!") }
    set { fatalError("oops!") }
  }
}

extension Dictionary: DynamicMemberLookupable where Key == String {
  typealias ReturnValue = Value?
  subscript(dynamicMember member: String) -> ReturnValue {
    get { return self[member] }
    set { self[member] = newValue }
  }
}
```

皆さんもこれを使ってtypoに苦しんでください。
メモ：Next.js

----
Next.js
-----
= 主な特徴
コンポーネントが自動でサーバーレンダリングされ、スクリプトはインライン化されるるので読み込み速度が早い(SEOフレンドリー)
Next.js内のすべてのルートは、React.Componentを継承したクラスや関数をエクスポートしたES6モジュールなので、システム全体でコンポーネントの組み合わせが容易で再利用性が高い(composable)。
例:コンポーネントを直接レンダリングしたり、読み込んで他のトップレベルのコンポーネントによってレンダリングすることが可能。

- デフォルトでサーバレンダリングする
- より早いページローディングを可能にする自動コード分割
- ページベースのシンプルなクライアントサイドルーティング
- HMR(Hot Module Replacement)をサポートする
- Expressを含むNode.js のHTTP serverの実装が可能
- 各開発者独自のBabel やWebpack のコンフィグ設定が可能

= Next.jsの６つの原則
- ファイルシステムをAPIで利用するので、セットアップを必要としない
- JavaScriptのみで記載する。全て関数とする。
- 自動化されたサーバレンダリングとコード分割
- データ取得は開発者に委ねる
- 効果的な事前結合とコンパイル予測(不必要なサーバー読み込みやデータ取得することなく、バックグラウンドでコンポーネントのJSONデータを事前取得する)
- デプロイがシンプル

= Next.jsの強み
- <Link />タグがServiceWorkerを経由して、バックグラウンドでコンポーネントのJSONデータを事前取得するので
ネットワークの状態にかかわらずユーザに即時アップデートが可能

- システム全体が組み立て可能(composable)でテスト可能(testable)であるので、様々な状況において組み込み可能な状態であり、それぞれのコンポーネントを組み合わせたり分解が容易。つまり、UIが構築しやすく改修しやすい。
コンポーネントを直接レンダリングしたり、読み込んで他のトップレベルのコンポーネントによってレンダリングすることが可能。

- アプリのビルドをより小さな結合ファイル(bundle)へ分割したサーバーレンダリングが可能

- componentが<Link prefetch /> もしくはrouterから直接ロードされる際に、スクリプトを含むJSONベースのページ表現を行う。
つまり、各々ページに固有のimportリストを記述することが可能なので、ページごとに異なるcomponentを利用する必要がある場合にも、特定のページが他のページのパフォーマンスに影響を与えることがない。

- 静的JSXのサーバサイドレンダリングが可能なのでローディングが早い。
クライアントサイドのルーティングにより、サーバサイドレンダリングとダイナミックレンダリングで異なるデータフェッチ(レンダリングの高速化)が可能。
またデータを専用のメソッド(getInitialProps)により取得する為()、不必要なサーバー読み込みやデータフェッチすることなく事前取得することが可能(レンダリングの高速化)。
サーバーとクライアント間のコード共有する方針をとることで、Nodeで実行する際やChromeやBraveで開発する際にパフォーマンスが良い。
トランスパイルする機能の選択はv8をターゲットとする。

Source: https://zeit.co/blog/next
Retrofit2でtext/plainレスポンスな定義を作る

# ナニコレ

`Retrofit`でまさかの`text/plain`なレスポンスのAPIを叩けと言われたのでその対処法をまとめます
自分のメモ用です。

# 使うの？

~~しっ~~

# GsonConverterFactory + RxJava2CallAdapterFactory

ココらへんは好みでいいと思いますが、今回JSONパーサーは `GsonConverterFactory`、
データのコールバックで Rxの`Single`を使いたかったので `RxJava2CallAdapterFactory` を利用しました。

```app/build.gradle
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit_version"
implementation 'com.squareup.retrofit2:converter-gson:$retrofit_version'
```

```ApiClientFactory.kt
val builder = Retrofit.Builder()
                .baseUrl("https://hogehoge/gefungefun/")
                .client(httpClient)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())

return builder.build().create(ApiClientInterface::class.java)
```

```ApiClientInterface.kt
interface ApiClientInterface {
    @POST("apiUrl")
    fun updateData(): Single<String>
}
```

```Repository.kt
fun update(): Single<String> = apiClient.updateData().subscribeOn(Schedulers.newThread())
```

こんな感じで定義しときましょう。

# ScalarsConverterFactory の追加

今回のミソ。 `ScalarsConverterFactory` さんです
この人を追加してあげると、単純なStringのデータとしてレスポンスを扱ってくれます。

```app/build.gradle
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit_version"
implementation 'com.squareup.retrofit2:converter-gson:$retrofit_version'
implementation "com.squareup.retrofit2:converter-scalars:$retrofit_version" // 追加
```

```ApiClientFactory.kt
val builder = Retrofit.Builder()
                .baseUrl("https://hogehoge/gefungefun/")
                .client(httpClient)
                .addConverterFactory(ScalarsConverterFactory.create())  // 追加
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())

        return builder.build().create(ApiClientInterface::class.java)
```

これだけで、Repository#update の subscribe:onNext ではただの `String` としてデータが扱えます。
javascriptのArray、スプレッド演算子、concatによる配列生成速度

Reactを書くとき毎回定数を追加していくような配列のstateをいじる機会があった。   
ここでふと疑問。   
このような配列は1から作るのが早いのか。   
それとももとのstateに追加のほうが早い？   
以下検証。   

##newによる作成
```javascript
console.time('処理時間');
Array(100000).fill;
console.timeEnd('処理時間');
// 処理時間: 1.115966796875ms
```

何回かやっても1ms前後。

##追加
長さが倍になる仮定。

1.  スプレッド演算子

```javascript
let prevState = Array(50000).fill(1);
console.time('処理時間');
[...prevState, ...Array(50000).fill(1)];
console.timeEnd('処理時間');
// 処理時間: 12.77783203125ms
```

配列初期化してから開いてるしそりゃそうか。

1. concat

```javascript
let prevState = Array(50000).fill(1);
console.time('処理時間');
prevState.concat(Array(50000).fill(1));
console.timeEnd('処理時間');
// 処理時間: 0.908935546875ms
```

普通にはええ。   

##まとめ
どうやらスプレッド演算子は遅いらしい。
Docker Ubuntu Ethereum採掘

# Ubuntuのイメージをダウンロード
まずは、dockerからubuntuのイメージをダウンロードします。

```
$ doncker pull ubuntu
```



```
$ docker run ubuntu
```

```
$ docker run -it -d --name ubuntu-ethereum ubuntu:16.04
```

```
$ docker exec -it ubuntu-ethereum /bin/sh
```

ここからはubuntuのターミナルの中で行う作業と同じです。

```
# apt-get install golang
# apt-get install software-properties-common
# add-apt-repository -y ppa:ethereum/ethereum
# apt-get update
# apt-get install ethereum
# apt-get update
# apt-get upgrade
```

ファイルを編集するvimをインストール

```
# apt-get install vim
```

```
# vim myGenesis.json 
```

以下のファイルを作成します。

```myGenesis.json
{
  "config": {
    "chainId": 15
  },
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "",
  "gasLimit": "0x8000000",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {}
}
```

ESCを押して、shift + zzで保存して終了。

ジェネシスブロックの作成

```
# geth --datadir eth_private_net init myGenesis.json
```

プライベートネットに接続

```
# geth --networkid "15" --nodiscover --datadir "eth_private_net" console 2>> ./geth_err.log
```

ここまできたら[こちらの記事を参考](https://qiita.com/kagami-r0927/items/6bfe493c49f713ca6331)に採掘をしてみてください。
[Ethereum [etherの採掘]](https://qiita.com/kagami-r0927/items/6bfe493c49f713ca6331)
「学びの発見」するふりかえりの仕方　ー　ひよこリーダーの気づき

今回のテーマは、エンジニア以外でも役に立つ内容かもしれません。

最近話題のManagement3.0ですが、そのプラクティスの一部を学ぶ機会があり、その学びと刺激を早速自分のチームに持ち込み実践してみました。
この記事は、実践（＝実験）の記録です。

## 「学んでいる！」実感をすれば、更に学びたくなるはず

前置きとして、どうして「学び」にそんなにこだわっているのかを説明します。
学びは、私たちの周りに仕事やプライベートに限らず常に存在しています。しかし、多くの人は成長していることに気付かずに成長していっています。そういう人は、当然その実感も楽しさもなく、周りからも「あの人成長しないな〜」と見られがちです。
逆に周りからも自らも「成長している〜！」と見られている人もいますが、その差はあくまでも「自分でも学びや成長に気がついているのか？」の差でしかないと私は思っています。「学び」を実感すれば、自己評価も周りからの評価も上がり以前より生き生きしている人生になるはずです。

今回は、「学びに気づかせる」ためにチームメンバーと試しに実施した自己ふりかえりのやり方を紹介します。

## Celebration Grid

日本語に訳すと「祝賀碁盤目（しゅくが・ごばんめ）」とちょっと硬くきこえる表現になってしまい元の表現と同じぐらい曖昧ですよね＾＾；
簡単に言うと「Celebration Grid」は学びと成功を整理してシェアできるためのツールです。見た目が碁盤目なので、Grid=碁盤目にしました。

Management 3.0関連の書籍ではこの画像がよくでてきます：

![celebration-grid-completed.jpg](https://qiita-image-store.s3.amazonaws.com/0/155732/d0578b1f-b846-cc77-be73-95c08c0c52ae.jpeg)

下には学びが一番多く存在している部分が示されています。英語版だと見出しが「失敗」「実験」「行動」になっていますが、私はチームに渡した表では「ココロをどこまで込めて本気でやったか」の度合いを軸にしました。
「適当にやった」「試しにやってみた」「真剣にやった」という3分類にしました。
縦軸は「失敗」「成功」のままです。失敗だったか成功だったかは、あくまでも本人の気持ちなので、この2つの定義はあえて示していません。失敗か成功かを決めにくいケースも多く想定されるので、決め切ってなくても構わないとしています。

メンバーにゆっくり考えて数ヶ月の期間をふりかえってほしかったので、付箋などを使わずにスプレッドシートで記載してもらうことにしました。
ちょうど期の終わりでもあり、自己評価の時期とも重なったのでふりかえった上で今期の学びを実感してもらい、来期の活動にもつなげてほしかったこともありいつでも参照できて残る形式を選びました。

一覧でまとめた「やった事」を元々の6分類＝6色で表現してもらうことにして、得られた学びも同じ表に書いてもらいました。凡例のイメージは以下の通りです。

![Image 029.png](https://qiita-image-store.s3.amazonaws.com/0/155732/23bfcdca-df20-94a5-6548-cd8f26ed1824.png)

## やって見てどうだったか？

まず、自分の体験（自分ももちろん書いてみました＾＾）から共有します。
成功・失敗の判断が難しいケースが多かったが、その理由としてはやる前にゴールが決まりきってないものが多かったからという気づきが得られました。最初から「目的は？」「達成したいゴールは？」「どうなったら満足いくのか？」と考えてそこから行動していれば、成功・失敗の判別がより明確になりそうな気がします。この気づきは次の目標設定にも活かせそうなので、自分としてはとても価値のあるものです。

書き始めると意外と「やったこと」が多い。最初はどのぐらいのサイズの内容を書けばいいか迷ったしそもそも「何やったっけ？」と完全に先週のランチが思い出せない状態でしたが、一個書いたら、その次も出てくるし、大小問わず書き始めると、大きなもの（例えば「初めてのリーダーを担う」の内容を徐々に自分でより細かく分解できるようになりました。第一歩が大事ですね。ここでの気づきは「大きいものから書く」の次に「分割していく」をやっていくとうまく書けそうな点です。エンジニアとしてタスク分割に慣れていると、それとちょっと似た感覚で大きなものを徐々にちゃんと結果のある単位に細かくしていけば効果的かもしれません。

チームメンバーにやってもらった結果の喧騒としてはやはり、失敗・成功の決めにくさ（もともとの目標設定に問題があったとここで通関）があがりましたが、よい点として「やったこともその結果も思い出せてふりかえりができた」という意見がありました。
これからもこのような振り返りをもう少し頻度を上げて、チームで導入しようと思っているOKRとうまい具合に連動していこうかなと考えていますので、次は可能な限り自分ならではの「How」と感想を共有していこうと思っています。
エンジニアチームとOKR（初心者の学び共有）

最近よく耳にする「マネジメント3.0」のツールの一つである「OKR」について勉強中でありつつも、自チームへどうしたらうまく導入できるか、どうしたらうまく運用できるかを模索した結果、他の人にも役に立ちそうな内容を見つけたので、共有しようかなと思います。

OKRは、一般的なチームの目標設定と目標達成までの流れを綺麗に整理する道具として大変有効なものですが、エンジニアリング現場では若干導入が難しい面があると言われています。
以下の記事から、エンジニアリング現場でもOKRの良い例をいくつかピックアップしましたので、紹介します。
あくまでも「例」なので、これらをそのまま使える現場はおそらくないですが、自チームのOKRを決めるときの参考になるかなと思います。

#### 「Engineering OKR Examples」
https://7geese.com/engineering-okr-examples/
#### 「What are some examples of good OKRs for software engineers? For engineering managers? For individual contributors?」
https://www.quora.com/What-are-some-examples-of-good-OKRs-for-software-engineers-For-engineering-managers-For-individual-contributors

## そもそもOKRって？おさらい

OKR = Objective & Key Results の頭文字から来ている略で、結果思考のゴール設定フレームワークです。ここでいう結果は、会社やチームのコアバリューに基づくものが基本だそうです。
今までよく使われていたKPIやMBOと違って、上層部が作るものがメンバーに伝達されるのではなく、評価にも使われないことが多いようです。そのため、半期またはクオーターでの見直しや従来の進捗管理なども行わないことが多いです。OKRを使っているチームのメンバーが「自ら背伸びをした目的を追うために必要な目標を設定する」ことを可能にするフレームワークだと言われています。
OKRは基本的に全てオープンで会社がどれだけ大きくても透明性が保たれている状態で運用されているのは普通です。

Objectiveは「目的」とも言えます。理想の「O」は：　期限があり、数値化されていない、野心的な、自らの目的・存在意義を問う時の答えになる、組織内部の協力を促しその力を与える、明確な主語と目的語及び主語が目的のために通る道すべを語る　ものが望ましいです。

Key Resultsは「絶対に必要な結果」として訳してもいいかなと思います。OKRの「KR」は：数字で計測可能で、変化をデータとして表現できる、複数のタスクの結果でありながらもタスクではない、目的の「O」を達成できたかどうかをどうしたらわかるのか？の答えになるように設定することがベストだそうです。
多くの場合、KRは3つまでと言われていますが、2つや4つを設定するケースもあるらしいです。
ただし、KRは「Oのためのカギとなる結果」なので、本当に必要なものだけにフォーカスして絞った方がよいとのことです。

これらは一般的な組織のビジネス側の場合はそれなりに自然に設定できそうなものです。売り上げや利益、直帰率やリピート率などの数字を多く元々扱っている職種の場合は「O」が難しくても、「KR」はそうでもない場合が多いようです。
では、エンジニアリング現場だったらどうなのかな？と調べた結果を共有します。

## エンジニアチームのOKRサンプル

### チームのパフォーマンスをターゲッタしたO: 効率の良いエンジニアチームを作る

KR:
1. チームの成績（パフォーマンス）を今より25％向上させる
　→　計測さえできていれば、明確な数字で達成を表現可能で、さらに途中経過もデータで裏付け可能な内容。
2. エンジニアチームの成績を計測できるためのメットリクスを開発・ドキュメント化する
　→　一つ目のKRを測るための指標を開発しただけでここがDoneになる。「目的を達成できたかどうかをどうしたらわかるのか？」の答えを出せるために必要不可欠な内容。
3. 前期に比べて最低2つのエンジニアリングカンファレンスに参加する

### 製品の品質をターゲットにしたO: リリース物の本質を向上させる

KR:
1. 開発途中の発見バグ数を20％削減する
2. コードのユニットテストのカバレッジを50％から70％のあげる
3. 各エンジニア個人が全スプリントに比べて20％多くのコードレビューをする
　→　最初から綺麗なコードを書けば手戻りが減り、品質は上がる。これに向けたタスクを洗い出すのも実践するのもエンジニアならやりがいがありそう。

### 製品のリリース速度をターゲットにしたO: 機能のリリースを早くする

KR:
1. ユーザーテスト前の品質保証テスト期間を2週間伸ばす
2. リリース予定の全週に報告されるバグを50％減らす
3. 開発プロセス途中の問題を25％減らす
　→　不具合発見のタイミングをなるべく手戻りが少ない状態の時に集中させる印象を受けました。自分ならここで要件定義のレベルアップを促すKRを入れたいところです。

### バックエンド向けのO: アプリケーションのパフォーマンスを向上させる

KR:
1. API応答時間を4秒にする
2. アプリケーションの応答時間を平均で450ミリ秒にする
3. コードレビューにかかる時間を半分にする
　→　この最後のKRがどうして必要なのかはちょっと疑問があるがレビュー時間を減らすにはコードを綺麗に書く・小さく書く必要がありその辺りで結局は早く動くコードを書くようになるとう意図が込められているのかな？

### ちょっと大きなチームのためのO: 上質なエンジニアリングを提供する

KR:
1. リードタイム（またはサイクルタイム）を現状より10％削減する
2. ユニットテストのカバレッジを現状より20%増やす
3. AWSの費用を25%減らす
4. 半期でユーザーに報告されたクリティカルな不具合を5またはそれ以下にする

## いくつかのベストプラクティス

- ORKは個人レベルではなく、必ずチームレベルで設定する。
- いくらいい例があってもそれがそのまま使えるOKRには絶対ならない。あなたの組織とそのOKRに適切なものを作る必要がある。
- エンジニアの場合、KRがよく大きめのタスクのように書かれがち。タスクらしい表現から「そのタスクが終わったらどうなるか？」を表す表現に書き換えると良いKRになる。例：「検索ワードのデータベースを早いスペックのインスタンスに移行する」→「ユーザーが使う検索機能の応答速度を25％あげる」

一旦今日はここまでにします。次の記事でまたマネジメント3.0とエンジニアリング現場について書こうと思います。
client-goを使ってkuberntesで使用しているNodePortの一覧を取得するプログラムを作ってみた

#Overview
[kubernetes](https://kubernetes.io/)をローカルで立ててるとちょっとしたServiceを公開する場合、NodePortって便利ですよね。
ただnamespaceを切って運用しているとどのport番号が今使用されているかわからなくなりませんか？
そこで今回、使用しているNodePortの一覧を取得するプログラムを作成してみました。
この記事では、プログラムの作成を通して、kubernetesのクライアントツールである[client-go](https://github.com/kubernetes/client-go)の使い方をお伝えできればと思います。

# 成果物
- サンプルの見た目

```
[root@server ~]# kube-nodeport-checker
30000: http (in nginx)
30010: no name (in wekan)
```

- Github
  - https://github.com/sh-miyoshi/kube-nodeport-checker

# client-goの使い方

基本的に[サンプル](https://github.com/kubernetes/client-go/tree/master/examples)が充実しているのでそれにそってやれば動かせます。

- インストール  
まずは必要なパッケージをダウンロードします  
※今回使用したのは以下のパッケージです(※自分のプログラムに合わせて`go get`してください)  

```text
go get k8s.io/apimachinery/pkg/apis/meta/v1
go get k8s.io/client-go/kubernetes
go get k8s.io/client-go/tools/clientcmd
```

- 自作goプログラムに使用  
プログラム全体の流れとしては、自身のkubeconfigファイルでインスタンスを初期化、それを使ってKubernetes Clusterから情報を取得するといった感じになります。  
※以下該当部分の抜粋(詳細はぜひ[GitHub](https://github.com/sh-miyoshi/kube-nodeport-checker)を参照してください。そしてStarをください(笑))
  - インスタンスの初期化  

```golang
func main(){
    // create kubernetes client
    // *KubeConfig: 引数で取得したkubeconfigのパス
    client, err := newClient(*KubeConfig)
    if err != nil {
        log.Fatal(err)
    }

    // 略
}

func newClient(kubeConfigPath string) (kubernetes.Interface, error) {
    if kubeConfigPath == "" {
        // use default path(.kube/config) when kubeconfig path is not set
        kubeConfigPath = clientcmd.RecommendedHomeFile
    }

    kubeConfig, err := clientcmd.BuildConfigFromFlags("", kubeConfigPath)
    if err != nil {
        return nil, err
    }

    // クライアントのインスタンスを作成
    return kubernetes.NewForConfig(kubeConfig)
}
```

  - 情報の取得  

```golang
    // 略

    // get all service in all namespace
    // 先ほどのclientを使ってServiceの一覧を取得
    // ※Services("")とやると全namespaceのdataを取得できる Services("default")みたいに指定可能
    services, err := client.CoreV1().Services("").List(meta_v1.ListOptions{})
    if err != nil {
        log.Fatal(err)
    }

    for _, service := range services.Items {
        if service.Spec.Type == "NodePort" {
            // a service may have multiple ports
            for _, port := range service.Spec.Ports {
                portName := "no name"
                if port.Name != "" {
                    portName = port.Name
                }
                fmt.Printf("%d: %s (in %s)\n", port.NodePort, portName, service.Name)
            }
        }
    }

    // 略
```

# おわりに
client-go自体はかなり使いやすいです
初心者の私でもサンプル([こちら](https://github.com/kubernetes/client-go/tree/master/examples))を見ながらやればなんとなーくできました
ただkubernetesのAPIを調べるのがちょっと大変でした
このあたりはIDEとか使ってかっこよくプログラミングしたい・・・(ソースを追っかけて関数とか調べてた人←)

全体としては、Go言語を触ったことのあるプログラマーの方なら特に問題なく使えるかなっていうのが私の感想です。
ただGo言語は環境がややこしいので(※個人的な感想)、GitHub上にDockerfileも置いてます。
参考になれば幸いです！
Go Web Examplesの和訳（Assets and Files）

[Go勉強会 Webアプリケーション編 #2](https://go-golang.connpass.com/event/102366/)で使おうと思っている[Go Web Examples](https://gowebexamples.com/templates/)の和訳です。ほぼGoogle翻訳ですが、リンク等も整理された状態であると便利だと思い作りました。

---

## Assets and Files
この例では、CSS、JavaScript、イメージなどの静的ファイルを特定のディレクトリから提供する方法を示します。

```go
// static-files.go
package main

import "net/http"

func main() {
	fs := http.FileServer(http.Dir("assets/"))
	http.Handle("/static/", http.StripPrefix("/static/", fs))

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

```bash
$ tree assets/
assets/
└── css
    └── styles.css
```

```bash
$ go run static-files.go

$ curl -s http://localhost:8080/static/css/styles.css
body {
    background-color: black;
}
```
プロパティを使いたい

#はじめに
初投稿なので、サクッと書いていきたいと思います。
とりあえず、プロパティを使えるようになりたい。それだけ。
ググっただけではすぐに忘れてしまうタイプなので、こうやって記事(?)を書いてみることにした。

#書き方
とりあえず、"get"と"set"という言葉を覚えておく。

```C#:test
private float number;
public float Number
{
    get
    {
        return number;
    }
    set
    {
        number = value;
    }
}
```

setは、valueという~~謎の~~変数で値を受け取る。
#さいごに
これだけだと、プロパティの良さが全くわかりませんね。
ちなみに自分もまだよくわかっていません。
気になったら調べてみよう！(結局そうなる)
【C++】char型ポインタの備忘録

C++のポインタについての備忘録


```cpp

char *p; // ポインタ
char str[] = "abcde";
```
charポインタとchar配列を用意しておく.

・ポインタに配列の先頭のアドレスを格納する．

```cpp
p = str;
// または
p = &str[0];
```
・配列の参照
char配列自体の呼び出しパターン

```cpp
std::cout << str <<endl; 
// abcde
std::cout << str[3] <<endl;
// d
std::cout << &str <<endl;
// 0x555d49680260
std::cout << &str[0] <<endl;
// 0x555d49680260
```

・ポインタの参照
charポインタの呼び出しパターン

```cpp
std::cout << *p <<endl; // 先頭のアドレスにある要素
// a
std::cout << p[3] <<endl; // 3番目のアドレスにある要素
// d
std::cout << p <<endl; // char配列全体
// abcde
std::cout << &p <<endl;  // 先頭のアドレス
// 0x555d49680260
std::cout << &p+1 <<endl; //先頭の次のアドレス
// 0x555d49680261
```

int配列などとは違い，
配列の名前自体（ここではstr）を呼び出すとアドレスが返ってこず要素全体が返ってくる．
覚えておこう！
Go Web Examplesの和訳（Forms）

[Go勉強会 Webアプリケーション編 #2](https://go-golang.connpass.com/event/102366/)で使おうと思っている[Go Web Examples](https://gowebexamples.com/templates/)の和訳です。ほぼGoogle翻訳ですが、リンク等も整理された状態であると便利だと思い作りました。[次回（Assets and Files）](https://qiita.com/miyamoto_ta/items/495d785c4e74eec2b2c0)

---

## Forms
この例ではコンタクトフォームのメッセージがどのように構造体に格納されるかをシミュレートします。

```go
// forms.go
package main

import (
	"html/template"
	"net/http"
)

type ContactDetails struct {
	Email   string
	Subject string
	Message string
}

func main() {
	tmpl := template.Must(template.ParseFiles("forms.html"))

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		if r.Method != http.MethodPost {
			tmpl.Execute(w, nil)
			return
		}

		details := ContactDetails{
			Email:   r.FormValue("email"),
			Subject: r.FormValue("subject"),
			Message: r.FormValue("message"),
		}

		// do something with details
		_ = details

		tmpl.Execute(w, struct{ Success bool }{true})
	})

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

```html
<!-- forms.html -->
{{if .Success}}
	<h1>Thanks for your message!</h1>
{{else}}
	<h1>Contact</h1>
	<form method="POST">
		<label>Email:</label><br />
		<input type="text" name="email"><br />
		<label>Subject:</label><br />
		<input type="text" name="subject"><br />
		<label>Message:</label><br />
		<textarea name="message"></textarea><br />
		<input type="submit">
	</form>
{{end}}
```

```bash
$ go run forms.go
```
【MacOS】root権限を使用するには？

#はじめに
パッケージなどをインストールする時に使う**root権限**について、Macでの使用方法を説明します。

##root権限の使用方法
root権限の使用方法は主に**２つ**。

    1. Terminalでsudo(SuperUserDO)を付けて命令を実行
    2. rootユーザとしてログイン

一般的には、rootユーザとしてログインすること自体セキュリティ上好ましくないため、rootユーザとしてログインするよりも**sudo**を付けて命令を実行するやり方が好まれている。

また、MacOSの初期設定では、ルートユーザが無効となっているため、設定を有効にしなければならないなど、それなりに手間がかかる。

##MacOSでrootユーザとしてログインするには？
ある程度の手間をかけてもrootユーザとしてログインしたい、そして権限を用いたい場合は、以下のApple公式サイトに設定方法がわかりやすく書いてあるため、参照すると良い。

[Apple｜Macでルートユーザを有効にする方法やルートパスワードを変更する方法](https://support.apple.com/ja-jp/HT204012#login)
Emacs でポイントの下の画像ファイル名をツールチップに表示 

# はじめに

この記事は「[なぜ我々はいまだに文字列でコメントを書いているのか](https://qiita.com/tkrkt/items/2fc9a9a59ce679aab728)」に触発されて、Emacs でも画像のポップアップが出来ないか試しに実装してみたものです。

# 使い方

Gist に [image-tooltip.el ](https://gist.github.com/chuntaro/b403e7d0f6d7c459136099759c281b6a) をアップしました。

```emacs-lisp
;;; -*- lexical-binding: t; -*-

(defun image-tooltip-at-point ()
  "ポイントやマウスカーソルの下の画像ファイルをツールチップ内に表示します。

使い方:
 (define-key c-mode-map \"\\C-co\" 'image-tooltip-at-point)
 (define-key c-mode-map [mouse-1] 'image-tooltip-at-point)

./very-sorry.png
./very-sorry.gif

上記のようなファイル名を`ffap'が認識出来れば C-c o やマウス左クリックでポップアップします。"
  (interactive)
  (unless (display-graphic-p)
    (error "Window system required."))
  (require 'ffap)
  (let ((file (ffap-file-at-point)))
    (when file
      (unless (and (stringp file)
                   (not (directory-name-p file))
                   (file-exists-p (setq file (expand-file-name file))))
        (error "File not found."))
      (when (image-type-from-file-name file)
        (let* ((x-y (window-absolute-pixel-position))
               (tooltip-frame-parameters `((left . ,(+ (car x-y) tooltip-x-offset))
                                           (top . ,(+ (cdr x-y) tooltip-y-offset))
                                           (internal-border-width . 0)
                                           (border-width . 0)))
               (image (create-image file))
               (x-gtk-use-system-tooltips nil)) ; Linux ではこれしないと表示されない…
          (image-animate image)
          (tooltip-show (propertize "a" 'display image)))))))
```

この関数を`init.el`等にコピーして、

```emacs-lisp
(define-key c-mode-map "\C-co" 'image-tooltip-at-point)
(define-key c-mode-map [mouse-1] 'image-tooltip-at-point)
```

のようにキーに割り当ててください。
その後、ソースコード等を開いてコメントに書いたファイル名の上で`C-c o`か左ボタンクリックすると画像がポップアップします。
ツールチップなので、ポイントやマウスを動かすか暫くすると自動的に消えます。

# 制限事項

GIF や PNG 等の画像サポートが有効な GUI 版 Emacs が必要です。
Windows 版と Linux 版で動作確認しました。

ファイル名の認識に`ffap`を使っているので、制限や癖などは全てそれに準じます。

# 実行画面

![popframe5.gif](https://qiita-image-store.s3.amazonaws.com/0/153538/e77b1c50-ca5a-e17d-4af1-cc262a4764c5.gif)

GIF アニメも再生されます。

![popframe6.gif](https://qiita-image-store.s3.amazonaws.com/0/153538/d37ad2fe-6253-2167-2fe7-89c164328e5e.gif)

すぐ動作確認出来るように PNG 画像の方は置いておきます。(GIF の方は著作権的に不明なので(汗…各々で用意してください。PNG の方はいらすとやから拝借)

![very-sorry.png](https://qiita-image-store.s3.amazonaws.com/0/153538/c52d9b8f-9e29-1954-453b-fea57fba4ea4.png)

# 最後に

取り敢えず、自分はこれで満足してます。
コードは非常に単純なので、皆さんの方で色々改良してみてください！
何か不具合などあった場合はコメントして頂ければ出来る限り直すつもりです。
それでは。

#### 編集履歴
2018/10/1 画像をフレームではなくツールチップに表示するバージョンに変更
Stripe Connectで明細表記を指定できない件について

## 問題
明細表記を今回記述したい「Tabete」にしたはずにもかかわらず、
実際に支払った側のクレジットカードの明細には
Stripeコネクトで送金した先の店名が表示されてしまうという問題があった


ちなみに、取引履歴には指定した「Tabete」が表示されていることがわかる

![ダッシュボード.png](https://qiita-image-store.s3.amazonaws.com/0/104622/4bf0388b-3c6c-7936-a996-cab21ffe884f.png)


## 解決方法

公式ドキュメントを見ると、 `statement_descriptor` を設定すればいいとかいてありましたが
日本は `alternate_statement_descriptors` 設定する必要があるようです。

https://stripe.com/docs/connect/statement-descriptors#payments


Rubyで記述すると以下になります。

```
# アメリカの場合
charge = Stripe::Charge.create({
  :amount => 1000,
  :currency => "jpy",
  :source => "tok_visa",
  :statement_descriptor => "Custom descriptor",
}, :stripe_account => "{CONNECTED_STRIPE_ACCOUNT_ID}")
```

```
# 日本の場合
charge = Stripe::Charge.create({
  :amount => 1000,
  :currency => "jpy",
  :source => "tok_visa",
  :alternate_statement_descriptors => {
    "kana":"ﾃｽﾄ",
    "kanji":"試験",
  }
  }, :stripe_account => "{CONNECTED_STRIPE_ACCOUNT_ID}")
```
[Mac]Mojaveにアップデートしたらすること

遂にMojaveがリリースされました。
※本記事は随時追記していきます

https://www.apple.com/jp/macos/mojave/

セキュリティソフトの関係で社内ではまだアップデートしていませんが、テストでMojaveインストールしてみました！

下記リンクからDownloadしてアップグレードします。
だいたい30分ぐらい。。。
https://itunes.apple.com/jp/app/macos-mojave/id1398502828?ls=1&mt=12&l=jp

#やったこと
##gitが動かない問題
gitでcloneしようとしたら下記のエラーが出力されました。
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

xcodeが入ってないだけなのでコマンドで入れます

```bash
$ xcode-select --install
```

UIが出てくるので、"インストール"→"同意する"でインストール完了します